Version 1.16.0-dev.5.0
Merge commit 'c0096e6f0c6c9aa9e2ce79df25debf5c91f95caa' into dev
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 11e8853..5497a37 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,10 +2,15 @@
### Core library changes
+* `dart:convert`
+ * Added `BASE64URL` codec and corresponding `Base64Codec.urlSafe` constructor.
* `dart:io`
* Added `SecurityContext.alpnSupported`, which is true if a platform
supports ALPN, and false otherwise.
+* `dart:convert`
+ * Introduce `ChunkedConverter` and deprecate chunked methods on `Converter`.
+
### Analyzer
* Static checking of `for in` statements. These will now produce static
diff --git a/DEPS b/DEPS
index 3888a04..9ae0509 100644
--- a/DEPS
+++ b/DEPS
@@ -56,7 +56,7 @@
"intl_rev": "@a8b480b9c436f6c0ec16730804c914bdb4e30d53",
"jinja2_rev": "@2222b31554f03e62600cd7e383376a7c187967a1",
"json_rpc_2_tag": "@2.0.0",
- "linter_rev": "@ca7c6b3f1085cf302c4726598704d36cf240695f",
+ "linter_rev": "@bcd4cf615665a80edf3f9a924388e59644a667cd",
"logging_rev": "@85d83e002670545e9039ad3985f0018ab640e597",
"markdown_rev": "@4aaadf3d940bb172e1f6285af4d2b1710d309982",
"matcher_tag": "@0.12.0",
@@ -71,6 +71,7 @@
"ply_rev": "@604b32590ffad5cbb82e4afef1d305512d06ae93",
"plugin_tag": "@0.1.0",
"pool_tag": "@1.2.1",
+ "protobuf_tag": "@0.5.0+1",
"pub_rev": "@c1405b945c6d818c8cfe78334e8d4b11fd913103",
"pub_cache_tag": "@v0.1.0",
"pub_semver_tag": "@1.2.1",
@@ -225,6 +226,8 @@
(Var("github_mirror") % "plugin") + Var("plugin_tag"),
Var("dart_root") + "/third_party/pkg/pool":
(Var("github_mirror") % "pool") + Var("pool_tag"),
+ Var("dart_root") + "/third_party/pkg/protobuf":
+ (Var("github_dartlang") % "dart-protobuf") + Var("protobuf_tag"),
Var("dart_root") + "/third_party/pkg/pub_semver":
(Var("github_mirror") % "pub_semver") + Var("pub_semver_tag"),
Var("dart_root") + "/third_party/pkg/pub":
diff --git a/pkg/analysis_server/benchmark/integration/input_converter.dart b/pkg/analysis_server/benchmark/integration/input_converter.dart
index f619845..d743d6c 100644
--- a/pkg/analysis_server/benchmark/integration/input_converter.dart
+++ b/pkg/analysis_server/benchmark/integration/input_converter.dart
@@ -271,7 +271,9 @@
* into a series of operations to be sent to the analysis server.
* The input stream can be either an instrumenation or log file.
*/
-class InputConverter extends Converter<String, Operation> {
+class InputConverter
+ extends ChunkedConverter<String, Operation, String, Operation> {
+
final Logger logger = new Logger('InputConverter');
/**
diff --git a/pkg/analysis_server/lib/src/channel/channel.dart b/pkg/analysis_server/lib/src/channel/channel.dart
index f3e473d..bee6f35 100644
--- a/pkg/analysis_server/lib/src/channel/channel.dart
+++ b/pkg/analysis_server/lib/src/channel/channel.dart
@@ -85,12 +85,13 @@
* Instances of the class [JsonStreamDecoder] convert JSON strings to JSON
* maps.
*/
-class JsonStreamDecoder extends Converter<String, Map> {
+class JsonStreamDecoder extends
+ ChunkedConverter<String, Map, String, Map> {
@override
Map convert(String text) => JSON.decode(text);
@override
- ChunkedConversionSink startChunkedConversion(Sink sink) =>
+ ChunkedConversionSink<String> startChunkedConversion(Sink<Map> sink) =>
new ChannelChunkSink<String, Map>(this, sink);
}
@@ -98,24 +99,26 @@
* Instances of the class [NotificationConverter] convert JSON maps to
* [Notification]s.
*/
-class NotificationConverter extends Converter<Map, Notification> {
+class NotificationConverter extends
+ ChunkedConverter<Map, Notification, Map, Notification> {
@override
Notification convert(Map json) => new Notification.fromJson(json);
@override
- ChunkedConversionSink startChunkedConversion(Sink sink) =>
+ ChunkedConversionSink<Map> startChunkedConversion(Sink<Notification> sink) =>
new ChannelChunkSink<Map, Notification>(this, sink);
}
/**
* Instances of the class [ResponseConverter] convert JSON maps to [Response]s.
*/
-class ResponseConverter extends Converter<Map, Response> {
+class ResponseConverter extends
+ ChunkedConverter<Map, Response, Map, Response> {
@override
Response convert(Map json) => new Response.fromJson(json);
@override
- ChunkedConversionSink startChunkedConversion(Sink sink) =>
+ ChunkedConversionSink<Map> startChunkedConversion(Sink<Response> sink) =>
new ChannelChunkSink<Map, Response>(this, sink);
}
diff --git a/pkg/analysis_server/lib/src/context_manager.dart b/pkg/analysis_server/lib/src/context_manager.dart
index 13f2052..3afe0f2 100644
--- a/pkg/analysis_server/lib/src/context_manager.dart
+++ b/pkg/analysis_server/lib/src/context_manager.dart
@@ -46,11 +46,6 @@
*/
class ContextInfo {
/**
- * The [ContextManager] which is tracking this information.
- */
- final ContextManagerImpl contextManager;
-
- /**
* The [Folder] for which this information object is created.
*/
final Folder folder;
@@ -102,8 +97,7 @@
ContextInfo(ContextManagerImpl contextManager, this.parent, Folder folder,
File packagespecFile, this.packageRoot)
- : contextManager = contextManager,
- folder = folder,
+ : folder = folder,
pathFilter = new PathFilter(
folder.path, null, contextManager.resourceProvider.pathContext) {
packageDescriptionPath = packagespecFile.path;
@@ -115,8 +109,7 @@
* [ContextInfo]s.
*/
ContextInfo._root()
- : contextManager = null,
- folder = null,
+ : folder = null,
pathFilter = null;
/**
diff --git a/pkg/analysis_server/lib/src/protocol_server.dart b/pkg/analysis_server/lib/src/protocol_server.dart
index 138c20f..5c86115 100644
--- a/pkg/analysis_server/lib/src/protocol_server.dart
+++ b/pkg/analysis_server/lib/src/protocol_server.dart
@@ -43,7 +43,14 @@
.add(newAnalysisError_fromEngine(lineInfo, error, severity));
}
} else {
- serverErrors.add(newAnalysisError_fromEngine(lineInfo, error));
+ AnalysisError error2 = newAnalysisError_fromEngine(lineInfo, error);
+ bool isStrongMode = context.analysisOptions.strongMode;
+ if (isStrongMode &&
+ error is engine.StaticWarningCode &&
+ (error as engine.StaticWarningCode).isStrongModeError) {
+ error2.severity = AnalysisErrorSeverity.ERROR;
+ }
+ serverErrors.add(error2);
}
}
return serverErrors;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
index e3a8f0b..54529b8 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/arglist_contributor.dart
@@ -262,14 +262,14 @@
Iterable<String> namedArgs = _namedArgs(request);
for (ParameterElement param in parameters) {
if (param.parameterKind == ParameterKind.NAMED) {
- _addNamedParameterSuggestion(
- request, namedArgs, param.name, appendComma);
+ _addNamedParameterSuggestion(request, namedArgs, param.name,
+ param.type?.displayName, appendComma);
}
}
}
void _addNamedParameterSuggestion(DartCompletionRequest request,
- List<String> namedArgs, String name, bool appendComma) {
+ List<String> namedArgs, String name, String paramType, bool appendComma) {
if (name != null && name.length > 0 && !namedArgs.contains(name)) {
String completion = '$name: ';
if (appendComma) {
@@ -282,7 +282,9 @@
completion.length,
0,
false,
- false));
+ false,
+ parameterName: name,
+ parameterType: paramType));
}
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
index 6a8c367..4651491 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/imported_reference_contributor.dart
@@ -10,6 +10,7 @@
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
import 'package:analysis_server/src/services/completion/dart/local_library_contributor.dart';
import 'package:analysis_server/src/services/completion/dart/optype.dart';
+import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/resolver.dart';
@@ -53,6 +54,20 @@
return EMPTY_LIST;
}
+ // If the target is in an expression
+ // then resolve the outermost/entire expression
+ AstNode node = request.target.containingNode;
+ if (node is Expression) {
+ while (node.parent is Expression) {
+ node = node.parent;
+ }
+ await request.resolveExpression(node);
+
+ // Discard any cached target information
+ // because it may have changed as a result of the resolution
+ node = request.target.containingNode;
+ }
+
this.request = request;
this.optype = (request as DartCompletionRequestImpl).opType;
List<CompletionSuggestion> suggestions = <CompletionSuggestion>[];
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 2867beb..5ba7fa1 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -13,6 +13,8 @@
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
+import 'package:analysis_server/src/services/completion/dart/optype.dart';
const ASYNC = 'async';
const ASYNC_STAR = 'async*';
@@ -50,6 +52,13 @@
@override
visitArgumentList(ArgumentList node) {
+ if (request is DartCompletionRequestImpl) {
+ //TODO(danrubel) consider adding opType to the API then remove this cast
+ OpType opType = (request as DartCompletionRequestImpl).opType;
+ if (opType.includeOnlyNamedArgumentSuggestions) {
+ return;
+ }
+ }
if (entity == node.rightParenthesis) {
_addExpressionKeywords(node);
Token previous = (entity as Token).previous;
@@ -149,8 +158,12 @@
!node.directives.any((d) => d is LibraryDirective)) {
_addSuggestions([Keyword.LIBRARY], DART_RELEVANCE_HIGH);
}
- _addSuggestions(
- [Keyword.IMPORT, Keyword.EXPORT, Keyword.PART], DART_RELEVANCE_HIGH);
+ _addSuggestion2('${Keyword.IMPORT.syntax} \'\';',
+ offset: 8, relevance: DART_RELEVANCE_HIGH);
+ _addSuggestion2('${Keyword.EXPORT.syntax} \'\';',
+ offset: 8, relevance: DART_RELEVANCE_HIGH);
+ _addSuggestion2('${Keyword.PART.syntax} \'\';',
+ offset: 6, relevance: DART_RELEVANCE_HIGH);
}
if (entity == null || entity is Declaration) {
if (previousMember is FunctionDeclaration &&
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
index 7f04c6b..68beb6a 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_library_contributor.dart
@@ -44,7 +44,11 @@
@override
void visitClassElement(ClassElement element) {
if (optype.includeTypeNameSuggestions) {
- addSuggestion(element, prefix: prefix, relevance: DART_RELEVANCE_DEFAULT);
+ // if includeTypeNameSuggestions, then use the filter
+ if (optype.typeNameSuggestionsFilter(element.type)) {
+ addSuggestion(element,
+ prefix: prefix, relevance: DART_RELEVANCE_DEFAULT);
+ }
}
if (optype.includeConstructorSuggestions) {
_addConstructorSuggestions(element, DART_RELEVANCE_DEFAULT);
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
index 6c20b0b9..8d613ce 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/local_reference_contributor.dart
@@ -17,6 +17,8 @@
import 'package:analysis_server/src/services/correction/strings.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/token.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/utilities_dart.dart' show ParameterKind;
@@ -155,9 +157,19 @@
if (optype.includeReturnValueSuggestions ||
optype.includeTypeNameSuggestions ||
optype.includeVoidReturnSuggestions) {
- _LocalVisitor visitor =
- new _LocalVisitor(request, request.offset, optype);
+ // If the target is in an expression
+ // then resolve the outermost/entire expression
AstNode node = request.target.containingNode;
+ if (node is Expression) {
+ while (node.parent is Expression) {
+ node = node.parent;
+ }
+ await request.resolveExpression(node);
+
+ // Discard any cached target information
+ // because it may have changed as a result of the resolution
+ node = request.target.containingNode;
+ }
// Do not suggest local vars within the current expression
while (node is Expression) {
@@ -170,6 +182,8 @@
node = node.parent;
}
+ _LocalVisitor visitor =
+ new _LocalVisitor(request, request.offset, optype);
visitor.visit(node);
return visitor.suggestions;
}
@@ -388,7 +402,14 @@
suggestion.completion.startsWith('_')) {
suggestion.relevance = privateMemberRelevance;
}
- suggestionMap.putIfAbsent(suggestion.completion, () => suggestion);
+ // if includeTypeNameSuggestions, then use the filter
+ if (optype.includeTypeNameSuggestions) {
+ if (optype.typeNameSuggestionsFilter(_staticTypeOfIdentifier(id))) {
+ suggestionMap.putIfAbsent(suggestion.completion, () => suggestion);
+ }
+ } else {
+ suggestionMap.putIfAbsent(suggestion.completion, () => suggestion);
+ }
suggestion.element = _createLocalElement(request.source, elemKind, id,
isAbstract: isAbstract,
isDeprecated: isDeprecated,
@@ -448,4 +469,12 @@
}
return false;
}
+
+ DartType _staticTypeOfIdentifier(Identifier id) {
+ if (id.staticElement is ClassElement) {
+ return (id.staticElement as ClassElement).type;
+ } else {
+ return id.staticType;
+ }
+ }
}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/optype.dart b/pkg/analysis_server/lib/src/services/completion/dart/optype.dart
index e61845e..d5f206c 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/optype.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/optype.dart
@@ -4,12 +4,15 @@
library services.completion.dart.optype;
-import 'package:analysis_server/src/protocol_server.dart';
+import 'package:analysis_server/src/protocol_server.dart' hide Element;
import 'package:analysis_server/src/provisional/completion/dart/completion_target.dart';
import 'package:analyzer/dart/ast/ast.dart';
import 'package:analyzer/dart/ast/token.dart';
import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/dart/element/element.dart';
+import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/generated/utilities_dart.dart';
/**
* An [AstVisitor] for determining whether top level suggestions or invocation
@@ -28,6 +31,13 @@
bool includeTypeNameSuggestions = false;
/**
+ * If [includeTypeNameSuggestions] is set to true, then this function may be
+ * set to the non-default function to filter out potential suggestions based
+ * on their static [DartType].
+ */
+ Function typeNameSuggestionsFilter = (DartType _) => true;
+
+ /**
* Indicates whether setters along with methods and functions that
* have a [void] return type should be suggested.
*/
@@ -40,6 +50,11 @@
bool includeReturnValueSuggestions = false;
/**
+ * Indicates whether named arguments should be suggested.
+ */
+ bool includeNamedArgumentSuggestions = false;
+
+ /**
* Indicates whether statement labels should be suggested.
*/
bool includeStatementLabelSuggestions = false;
@@ -86,6 +101,16 @@
*/
bool get includeOnlyTypeNameSuggestions =>
includeTypeNameSuggestions &&
+ !includeNamedArgumentSuggestions &&
+ !includeReturnValueSuggestions &&
+ !includeVoidReturnSuggestions;
+
+ /**
+ * Indicate whether only type names should be suggested
+ */
+ bool get includeOnlyNamedArgumentSuggestions =>
+ includeNamedArgumentSuggestions &&
+ !includeTypeNameSuggestions &&
!includeReturnValueSuggestions &&
!includeVoidReturnSuggestions;
}
@@ -123,6 +148,31 @@
@override
void visitArgumentList(ArgumentList node) {
+ AstNode parent = node.parent;
+ if (parent is InvocationExpression) {
+ Expression function = parent.function;
+ if (function is SimpleIdentifier) {
+ var elem = function.bestElement;
+ if (elem is FunctionTypedElement) {
+ List<ParameterElement> parameters = elem.parameters;
+ if (parameters != null) {
+ int index =
+ node.arguments.isEmpty ? 0 : node.arguments.indexOf(entity);
+ if (0 <= index && index < parameters.length) {
+ ParameterElement param = parameters[index];
+ if (param?.parameterKind == ParameterKind.NAMED) {
+ optype.includeNamedArgumentSuggestions = true;
+ return;
+ }
+ }
+ }
+ } else if (elem == null) {
+ // If unresolved, then include named arguments
+ optype.includeNamedArgumentSuggestions = true;
+ // fall through to include others as well
+ }
+ }
+ }
optype.includeReturnValueSuggestions = true;
optype.includeTypeNameSuggestions = true;
}
@@ -131,10 +181,11 @@
void visitAsExpression(AsExpression node) {
if (identical(entity, node.type)) {
optype.includeTypeNameSuggestions = true;
- // TODO (danrubel) Possible future improvement:
- // on the RHS of an "is" or "as" expression, don't suggest types that are
- // guaranteed to pass or guaranteed to fail the cast.
- // See dartbug.com/18860
+ optype.typeNameSuggestionsFilter = (DartType dartType) {
+ DartType staticType = node.expression.staticType;
+ return staticType.isDynamic ||
+ (dartType.isSubtypeOf(staticType) && dartType != staticType);
+ };
}
}
@@ -452,10 +503,11 @@
void visitIsExpression(IsExpression node) {
if (identical(entity, node.type)) {
optype.includeTypeNameSuggestions = true;
- // TODO (danrubel) Possible future improvement:
- // on the RHS of an "is" or "as" expression, don't suggest types that are
- // guaranteed to pass or guaranteed to fail the cast.
- // See dartbug.com/18860
+ optype.typeNameSuggestionsFilter = (DartType dartType) {
+ DartType staticType = node.expression.staticType;
+ return staticType.isDynamic ||
+ (dartType.isSubtypeOf(staticType) && dartType != staticType);
+ };
}
}
diff --git a/pkg/analysis_server/test/completion_test.dart b/pkg/analysis_server/test/completion_test.dart
index f2cd236..2a453eb 100644
--- a/pkg/analysis_server/test/completion_test.dart
+++ b/pkg/analysis_server/test/completion_test.dart
@@ -2655,19 +2655,20 @@
!4part 'x';''',
<String>[
"1+library",
- "2+import",
- "3+export",
- "4+part",
+ "2+import \'\';",
+ "3+export \'\';",
+ "4+part \'\';",
"5+as",
"6+hide",
"7+show",
"8-null"
],
- failingTests: '567');
+ failingTests: '234567'); //TODO(jwren) 234 failing as correct selection
+ // offset assertions can't be passed into buildTests(..)
// keywords
buildTests('test018', '''!1part !2of foo;''', <String>["1+part", "2+of"],
- failingTests: '2');
+ failingTests: '12');
buildTests(
'test019',
@@ -2905,7 +2906,7 @@
// test analysis of untyped fields and top-level vars
buildTests('test039', '''class X{}var x = null as !1X;''',
- <String>["1+X", "1-void"]);
+ <String>["1-void"]);
// test arg lists with named params
buildTests('test040', '''m(){f(a, b, {x1, x2, y}) {};f(1, 2, !1)!2;}''',
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
index edce0d5..ec7c520 100644
--- a/pkg/analysis_server/test/domain_completion_test.dart
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -28,6 +28,55 @@
@reflectiveTest
class CompletionDomainHandlerTest extends AbstractCompletionDomainTest {
+ test_ArgumentList_imported_function_named_param() async {
+ addTestFile('main() { int.parse("16", ^);}');
+ await getSuggestions();
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'radix: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'onError: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ expect(suggestions, hasLength(2));
+ }
+
+ test_ArgumentList_imported_function_named_param1() async {
+ addTestFile('main() { foo(o^);} foo({one, two}) {}');
+ await getSuggestions();
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'one: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'two: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ expect(suggestions, hasLength(2));
+ }
+
+ test_ArgumentList_imported_function_named_param_label1() async {
+ addTestFile('main() { int.parse("16", r^: 16);}');
+ await getSuggestions();
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'radix: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'onError: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ expect(suggestions, hasLength(2));
+ }
+
+ test_ArgumentList_imported_function_named_param_label3() async {
+ addTestFile('main() { int.parse("16", ^: 16);}');
+ await getSuggestions();
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'radix: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'onError: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ expect(suggestions, hasLength(2));
+ }
+
+ test_ArgumentList_imported_function_named_param2() async {
+ addTestFile('mainx() {A a = new A(); a.foo(one: 7, ^);}'
+ 'class A { foo({one, two}) {} }');
+ await getSuggestions();
+ assertHasResult(CompletionSuggestionKind.NAMED_ARGUMENT, 'two: ',
+ relevance: DART_RELEVANCE_NAMED_PARAMETER);
+ expect(suggestions, hasLength(1));
+ }
+
test_html() {
testFile = '/project/web/test.html';
addTestFile('''
@@ -140,10 +189,10 @@
await getSuggestions();
expect(replacementOffset, completionOffset - 3);
expect(replacementLength, 3);
- assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
- relevance: DART_RELEVANCE_HIGH);
- assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
- relevance: DART_RELEVANCE_HIGH);
+ assertHasResult(CompletionSuggestionKind.KEYWORD, 'export \'\';',
+ selectionOffset: 8, relevance: DART_RELEVANCE_HIGH);
+ assertHasResult(CompletionSuggestionKind.KEYWORD, 'import \'\';',
+ selectionOffset: 8, relevance: DART_RELEVANCE_HIGH);
assertNoResult('extends');
assertNoResult('library');
}
@@ -174,12 +223,12 @@
expect(replacementLength, 1);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'library',
relevance: DART_RELEVANCE_HIGH);
- assertHasResult(CompletionSuggestionKind.KEYWORD, 'import',
- relevance: DART_RELEVANCE_HIGH);
- assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
- relevance: DART_RELEVANCE_HIGH);
- assertHasResult(CompletionSuggestionKind.KEYWORD, 'part',
- relevance: DART_RELEVANCE_HIGH);
+ assertHasResult(CompletionSuggestionKind.KEYWORD, 'import \'\';',
+ selectionOffset: 8, relevance: DART_RELEVANCE_HIGH);
+ assertHasResult(CompletionSuggestionKind.KEYWORD, 'export \'\';',
+ selectionOffset: 8, relevance: DART_RELEVANCE_HIGH);
+ assertHasResult(CompletionSuggestionKind.KEYWORD, 'part \'\';',
+ selectionOffset: 6, relevance: DART_RELEVANCE_HIGH);
assertNoResult('extends');
}
@@ -353,8 +402,8 @@
return getSuggestions().then((_) {
expect(replacementOffset, equals(completionOffset - 2));
expect(replacementLength, equals(2));
- assertHasResult(CompletionSuggestionKind.KEYWORD, 'export',
- relevance: DART_RELEVANCE_HIGH);
+ assertHasResult(CompletionSuggestionKind.KEYWORD, 'export \'\';',
+ selectionOffset: 8, relevance: DART_RELEVANCE_HIGH);
assertHasResult(CompletionSuggestionKind.KEYWORD, 'class',
relevance: DART_RELEVANCE_HIGH);
});
diff --git a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
index c435848..db17859 100644
--- a/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/arglist_contributor_test.dart
@@ -77,16 +77,19 @@
}
/**
- * Assert that the specified named argument suggestions are the only
- * suggestions.
+ * Assert that the specified named argument suggestions with their types are
+ * the only suggestions.
*/
- void assertSuggestArguments({List<String> namedArguments}) {
+ void assertSuggestArgumentsAndTypes(
+ {Map<String, String> namedArgumentsWithTypes}) {
List<CompletionSuggestion> expected = new List<CompletionSuggestion>();
- for (String name in namedArguments) {
+ namedArgumentsWithTypes.forEach((String name, String type) {
expected.add(assertSuggest('$name: ',
csKind: CompletionSuggestionKind.NAMED_ARGUMENT,
- relevance: DART_RELEVANCE_NAMED_PARAMETER));
- }
+ relevance: DART_RELEVANCE_NAMED_PARAMETER,
+ paramName: name,
+ paramType: type));
+ });
assertNoOtherSuggestions(expected);
}
@@ -131,7 +134,8 @@
library libA; class A { const A({int one, String two: 'defaultValue'}); }''');
addTestSource('import "/libA.dart"; @A(^) main() { }');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one', 'two']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
}
test_Annotation_local_constructor_named_param() async {
@@ -139,7 +143,8 @@
class A { const A({int one, String two: 'defaultValue'}); }
@A(^) main() { }''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one', 'two']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
}
test_Annotation_local_constructor_named_param_11() async {
@@ -147,7 +152,7 @@
class A { const A({int one, String two: 'defaultValue'}); }
@A(two: '2', ^) main() { }''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one']);
+ assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
}
test_Annotation_local_constructor_named_param_2() async {
@@ -171,7 +176,7 @@
class A { const A({int one, String two: 'defaultValue'}); }
@A(^, two: '2') main() { }''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one']);
+ assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
}
test_Annotation_local_constructor_named_param_5() async {
@@ -179,7 +184,7 @@
class A { const A({int one, String two: 'defaultValue'}); }
@A(^ , two: '2') main() { }''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one']);
+ assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
}
test_Annotation_local_constructor_named_param_6() async {
@@ -187,7 +192,7 @@
class A { const A(int zero, {int one, String two: 'defaultValue'}); }
@A(0, ^, two: '2') main() { }''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one']);
+ assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
}
test_Annotation_local_constructor_named_param_7() async {
@@ -226,7 +231,7 @@
addSource('/libA.dart', 'library libA; class A{A({int one}); }');
addTestSource('import "/libA.dart"; main() { new A(^);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one']);
+ assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
}
test_ArgumentList_imported_constructor_named_param2() async {
@@ -234,7 +239,17 @@
addSource('/libA.dart', 'library libA; class A{A.foo({int one}); }');
addTestSource('import "/libA.dart"; main() { new A.foo(^);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one']);
+ assertSuggestArgumentsAndTypes(namedArgumentsWithTypes: {'one': 'int'});
+ }
+
+ test_ArgumentList_imported_constructor_named_typed_param() async {
+ //
+ addSource(
+ '/libA.dart', 'library libA; class A { A({int i, String s, d}) {} }}');
+ addTestSource('import "/libA.dart"; main() { var a = new A(^);}');
+ await computeSuggestions();
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'i': 'int', 's': 'String', 'd': 'dynamic'});
}
test_ArgumentList_imported_function_0() async {
@@ -385,21 +400,24 @@
//
addTestSource('main() { int.parse("16", ^);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['radix', 'onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'radix': 'int', 'onError': '(String) → int'});
}
test_ArgumentList_imported_function_named_param1() async {
//
addTestSource('main() { int.parse("16", r^);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['radix', 'onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'radix': 'int', 'onError': '(String) → int'});
}
test_ArgumentList_imported_function_named_param2() async {
//
addTestSource('main() { int.parse("16", radix: 7, ^);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'onError': '(String) → int'});
}
test_ArgumentList_imported_function_named_param2a() async {
@@ -413,7 +431,8 @@
//
addTestSource('main() { int.parse("16", r^: 16);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['radix', 'onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'radix': 'int', 'onError': '(String) → int'});
}
test_ArgumentList_imported_function_named_param_label2() async {
@@ -427,7 +446,8 @@
//
addTestSource('main() { int.parse("16", ^: 16);}');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['radix', 'onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'radix': 'int', 'onError': '(String) → int'});
}
test_ArgumentList_local_constructor_named_param() async {
@@ -436,7 +456,8 @@
class A { A({int one, String two: 'defaultValue'}) { } }
main() { new A(^);}''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one', 'two']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
}
test_ArgumentList_local_constructor_named_param2() async {
@@ -445,7 +466,8 @@
class A { A.foo({int one, String two: 'defaultValue'}) { } }
main() { new A.foo(^);}''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['one', 'two']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'one': 'int', 'two': 'String'});
}
test_ArgumentList_local_function_1() async {
@@ -538,7 +560,8 @@
f(v,{int radix, int onError(String s)}){}
main() { f("16", ^);}''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['radix', 'onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'radix': 'int', 'onError': '(String) → int'});
}
test_ArgumentList_local_function_named_param1() async {
@@ -547,7 +570,8 @@
f(v,{int radix, int onError(String s)}){}
main() { f("16", r^);}''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['radix', 'onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'radix': 'int', 'onError': '(String) → int'});
}
test_ArgumentList_local_function_named_param2() async {
@@ -556,7 +580,8 @@
f(v,{int radix, int onError(String s)}){}
main() { f("16", radix: 7, ^);}''');
await computeSuggestions();
- assertSuggestArguments(namedArguments: ['onError']);
+ assertSuggestArgumentsAndTypes(
+ namedArgumentsWithTypes: {'onError': '(String) → int'});
}
test_ArgumentList_local_function_named_param2a() async {
diff --git a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
index 9589874..72a57c7 100644
--- a/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
+++ b/pkg/analysis_server/test/services/completion/dart/completion_contributor_util.dart
@@ -110,7 +110,9 @@
bool isDeprecated: false,
bool isPotential: false,
String elemFile,
- int elemOffset}) {
+ int elemOffset,
+ String paramName,
+ String paramType}) {
CompletionSuggestion cs =
getSuggest(completion: completion, csKind: csKind, elemKind: elemKind);
if (cs == null) {
@@ -141,6 +143,12 @@
if (elemOffset != null) {
expect(cs.element.location.offset, elemOffset);
}
+ if(paramName != null) {
+ expect(cs.parameterName, paramName);
+ }
+ if(paramType != null) {
+ expect(cs.parameterType, paramType);
+ }
return cs;
}
diff --git a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
index ff07c34..6b63ce0 100644
--- a/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/imported_reference_contributor_test.dart
@@ -310,7 +310,10 @@
assertNotSuggested('bar');
// An unresolved imported library will produce suggestions
// with a null returnType
- assertSuggestFunction('hasLength', null);
+ // The current DartCompletionRequest#resolveExpression resolves
+ // the world (which it should not) and causes the imported library
+ // to be resolved.
+ assertSuggestFunction('hasLength', /* null */ 'bool');
assertNotSuggested('main');
}
@@ -329,6 +332,54 @@
assertNotSuggested('==');
}
+ test_AsExpression_type_subtype_extends_filter() async {
+ // SimpleIdentifier TypeName AsExpression IfStatement
+ addSource(
+ '/testB.dart',
+ '''
+ foo() { }
+ class A {} class B extends A {} class C extends B {}
+ class X {X.c(); X._d(); z() {}}''');
+ addTestSource('''
+ import "/testB.dart";
+ main(){A a; if (a as ^)}''');
+
+ await computeSuggestions();
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('X');
+ assertNotSuggested('Object');
+ assertNotSuggested('a');
+ assertNotSuggested('main');
+ }
+
+ test_AsExpression_type_subtype_implements_filter() async {
+ // SimpleIdentifier TypeName AsExpression IfStatement
+ addSource(
+ '/testB.dart',
+ '''
+ foo() { }
+ class A {} class B implements A {} class C implements B {}
+ class X {X.c(); X._d(); z() {}}''');
+ addTestSource('''
+ import "/testB.dart";
+ main(){A a; if (a as ^)}''');
+
+ await computeSuggestions();
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('X');
+ assertNotSuggested('Object');
+ assertNotSuggested('a');
+ assertNotSuggested('main');
+ }
+
test_AssignmentExpression_name() async {
// SimpleIdentifier VariableDeclaration VariableDeclarationList
// VariableDeclarationStatement Block
@@ -2588,7 +2639,12 @@
assertNotSuggested('foo');
assertNotSuggested('F1');
assertNotSuggested('F2');
- assertSuggestTopLevelVar('T1', null);
+ // An unresolved imported library will produce suggestions
+ // with a null returnType
+ // The current DartCompletionRequest#resolveExpression resolves
+ // the world (which it should not) and causes the imported library
+ // to be resolved.
+ assertSuggestTopLevelVar('T1', /* null */ 'int');
assertNotSuggested('T2');
}
@@ -2796,6 +2852,54 @@
assertSuggestClass('Object');
}
+ test_IsExpression_type_subtype_extends_filter() async {
+ // SimpleIdentifier TypeName IsExpression IfStatement
+ addSource(
+ '/testB.dart',
+ '''
+ foo() { }
+ class A {} class B extends A {} class C extends B {}
+ class X {X.c(); X._d(); z() {}}''');
+ addTestSource('''
+ import "/testB.dart";
+ main(){A a; if (a is ^)}''');
+
+ await computeSuggestions();
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('X');
+ assertNotSuggested('Object');
+ assertNotSuggested('a');
+ assertNotSuggested('main');
+ }
+
+ test_IsExpression_type_subtype_implements_filter() async {
+ // SimpleIdentifier TypeName IsExpression IfStatement
+ addSource(
+ '/testB.dart',
+ '''
+ foo() { }
+ class A {} class B implements A {} class C implements B {}
+ class X {X.c(); X._d(); z() {}}''');
+ addTestSource('''
+ import "/testB.dart";
+ main(){A a; if (a is ^)}''');
+
+ await computeSuggestions();
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('X');
+ assertNotSuggested('Object');
+ assertNotSuggested('a');
+ assertNotSuggested('main');
+ }
+
test_keyword() async {
resolveSource(
'/testB.dart',
@@ -2879,9 +2983,14 @@
expect(replacementOffset, completionOffset);
expect(replacementLength, 0);
assertSuggestClass('Object');
- assertSuggestTopLevelVar('T1', null);
- assertSuggestFunction('F1', null);
- assertSuggestFunctionTypeAlias('D1', 'null');
+ // Simulate unresolved imported library,
+ // in which case suggestions will have null return types (unresolved)
+ // The current DartCompletionRequest#resolveExpression resolves
+ // the world (which it should not) and causes the imported library
+ // to be resolved.
+ assertSuggestTopLevelVar('T1', /* null */ 'int');
+ assertSuggestFunction('F1', /* null */ 'dynamic');
+ assertSuggestFunctionTypeAlias('D1', /* null */ 'dynamic');
assertSuggestClass('C1');
assertNotSuggested('T2');
assertNotSuggested('F2');
@@ -2911,7 +3020,10 @@
expect(replacementLength, 1);
// Simulate unresolved imported library,
// in which case suggestions will have null return types (unresolved)
- assertSuggestTopLevelVar('T1', null);
+ // The current DartCompletionRequest#resolveExpression resolves
+ // the world (which it should not) and causes the imported library
+ // to be resolved.
+ assertSuggestTopLevelVar('T1', /* null */ 'int');
assertNotSuggested('T2');
}
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 73642ea..2e7e48b 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -220,6 +220,13 @@
Map<String, int> expectedOffsets = <String, int>{};
Set<String> actualCompletions = new Set<String>();
expectedCompletions.addAll(expectedKeywords.map((k) => k.syntax));
+ ['import', 'export', 'part'].forEach((s) {
+ if (expectedCompletions.contains(s)) {
+ expectedCompletions.remove(s);
+ expectedCompletions.add('$s \'\';');
+ }
+ });
+
expectedCompletions.addAll(pseudoKeywords);
for (CompletionSuggestion s in suggestions) {
if (s.kind == CompletionSuggestionKind.KEYWORD) {
@@ -245,10 +252,6 @@
if (s.kind == CompletionSuggestionKind.KEYWORD) {
if (s.completion.startsWith(Keyword.IMPORT.syntax)) {
int importRelevance = relevance;
- if (importRelevance == DART_RELEVANCE_HIGH &&
- s.completion == "import '';") {
- ++importRelevance;
- }
expect(s.relevance, equals(importRelevance), reason: s.completion);
} else {
if (s.completion == Keyword.RETHROW.syntax) {
@@ -261,7 +264,11 @@
if (expectedOffset == null) {
expectedOffset = s.completion.length;
}
- expect(s.selectionOffset, equals(expectedOffset));
+ expect(
+ s.selectionOffset,
+ equals(s.completion.endsWith('\'\';')
+ ? expectedOffset - 2
+ : expectedOffset));
expect(s.selectionLength, equals(0));
expect(s.isDeprecated, equals(false));
expect(s.isPotential, equals(false));
diff --git a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
index a9389c0..e617931 100644
--- a/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/local_reference_contributor_test.dart
@@ -331,7 +331,7 @@
assertNotSuggested('main');
}
- test_AsExpression() async {
+ test_AsExpression_type() async {
// SimpleIdentifier TypeName AsExpression
addTestSource('''
class A {var b; X _c; foo() {var a; (a as ^).foo();}''');
@@ -346,6 +346,38 @@
assertNotSuggested('==');
}
+ test_AsExpression_type_filter_extends() async {
+ // SimpleIdentifier TypeName AsExpression
+ addTestSource('''
+class A {} class B extends A {} class C extends A {} class D {}
+f(A a){ (a as ^) }''');
+ await computeSuggestions();
+
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('D');
+ assertNotSuggested('Object');
+ }
+
+ test_IsExpression_type_filter_implements() async {
+ // SimpleIdentifier TypeName AsExpression
+ addTestSource('''
+class A {} class B implements A {} class C implements A {} class D {}
+f(A a){ (a as ^) }''');
+ await computeSuggestions();
+
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('D');
+ assertNotSuggested('Object');
+ }
+
test_AssignmentExpression_name() async {
// SimpleIdentifier VariableDeclaration VariableDeclarationList
// VariableDeclarationStatement Block
@@ -2750,6 +2782,38 @@
assertNotSuggested('Object');
}
+ test_IsExpression_type_filter_extends() async {
+ // SimpleIdentifier TypeName IsExpression IfStatement
+ addTestSource('''
+class A {} class B extends A {} class C extends A {} class D {}
+f(A a){ if (a is ^) {}}''');
+ await computeSuggestions();
+
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('D');
+ assertNotSuggested('Object');
+ }
+
+ test_IsExpression_type_subtype_implements_filter() async {
+ // SimpleIdentifier TypeName IsExpression IfStatement
+ addTestSource('''
+class A {} class B extends A {} class C implements A {} class D {}
+f(A a){ if (a is ^) {}}''');
+ await computeSuggestions();
+
+ expect(replacementOffset, completionOffset);
+ expect(replacementLength, 0);
+ assertSuggestClass('B');
+ assertSuggestClass('C');
+ assertNotSuggested('A');
+ assertNotSuggested('D');
+ assertNotSuggested('Object');
+ }
+
test_keyword() async {
addSource(
'/testB.dart',
diff --git a/pkg/analysis_server/test/services/completion/dart/optype_test.dart b/pkg/analysis_server/test/services/completion/dart/optype_test.dart
index 14cc3a8..455495c 100644
--- a/pkg/analysis_server/test/services/completion/dart/optype_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/optype_test.dart
@@ -48,6 +48,7 @@
void assertOpType(
{bool caseLabel: false,
bool constructors: false,
+ bool namedArgs: false,
bool prefixed: false,
bool returnValue: false,
bool statementLabel: false,
@@ -58,6 +59,8 @@
expect(visitor.includeCaseLabelSuggestions, caseLabel, reason: 'caseLabel');
expect(visitor.includeConstructorSuggestions, constructors,
reason: 'constructors');
+ expect(visitor.includeNamedArgumentSuggestions, namedArgs,
+ reason: 'namedArgs');
expect(visitor.includeReturnValueSuggestions, returnValue,
reason: 'returnValue');
expect(visitor.includeStatementLabelSuggestions, statementLabel,
@@ -88,10 +91,36 @@
test_ArgumentList() {
// ArgumentList MethodInvocation ExpressionStatement Block
- addTestSource('void main() {expect(^)}');
+ addTestSource('void main() {expect(^)}', resolved: false);
+ // If "expect()" were resolved, then either namedArgs would be true
+ // or returnValue and typeNames would be true.
+ assertOpType(namedArgs: true, returnValue: true, typeNames: true);
+ }
+
+ test_ArgumentList_resolved() {
+ // ArgumentList MethodInvocation ExpressionStatement Block
+ addTestSource('void main() {int.parse(^)}', resolved: true);
assertOpType(returnValue: true, typeNames: true);
}
+ test_ArgumentList_resolved_1_0() {
+ // ArgumentList MethodInvocation ExpressionStatement Block
+ addTestSource('main() { foo(^);} foo({one, two}) {}', resolved: true);
+ assertOpType(namedArgs: true);
+ }
+
+ test_ArgumentList_resolved_1_1() {
+ // ArgumentList MethodInvocation ExpressionStatement Block
+ addTestSource('main() { foo(o^);} foo({one, two}) {}', resolved: true);
+ assertOpType(namedArgs: true);
+ }
+
+ test_ArgumentList_resolved_2_0() {
+ // ArgumentList MethodInvocation ExpressionStatement Block
+ addTestSource('void main() {int.parse("16", ^)}', resolved: true);
+ assertOpType(namedArgs: true);
+ }
+
test_ArgumentList_namedParam() {
// SimpleIdentifier NamedExpression ArgumentList MethodInvocation
// ExpressionStatement
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 0a4a883..994f5ef 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -7,6 +7,7 @@
import 'analysis/test_all.dart' as analysis_all;
import 'analysis_server_test.dart' as analysis_server_test;
import 'channel/test_all.dart' as channel_test;
+import 'completion_test.dart' as completion_test;
import 'context_manager_test.dart' as context_manager_test;
import 'domain_analysis_test.dart' as domain_analysis_test;
import 'domain_completion_test.dart' as domain_completion_test;
@@ -35,6 +36,7 @@
analysis_all.main();
analysis_server_test.main();
channel_test.main();
+ completion_test.main();
context_manager_test.main();
domain_analysis_test.main();
domain_completion_test.main();
diff --git a/pkg/analyzer/doc/support/dart.js b/pkg/analyzer/doc/support/dart.js
new file mode 100644
index 0000000..f8d686e
--- /dev/null
+++ b/pkg/analyzer/doc/support/dart.js
@@ -0,0 +1,32 @@
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+(function() {
+// Bootstrap support for Dart scripts on the page as this script.
+if (navigator.userAgent.indexOf('(Dart)') === -1) {
+ // TODO:
+ // - Support in-browser compilation.
+ // - Handle inline Dart scripts.
+
+ // Fall back to compiled JS. Run through all the scripts and
+ // replace them if they have a type that indicate that they source
+ // in Dart code (type="application/dart").
+ var scripts = document.getElementsByTagName("script");
+ var length = scripts.length;
+ for (var i = 0; i < length; ++i) {
+ if (scripts[i].type == "application/dart") {
+ // Remap foo.dart to foo.dart.js.
+ if (scripts[i].src && scripts[i].src != '') {
+ var script = document.createElement('script');
+ script.src = scripts[i].src.replace(/\.dart(?=\?|$)/, '.dart.js');
+ var parent = scripts[i].parentNode;
+ // TODO(vsm): Find a solution for issue 8455 that works with more
+ // than one script.
+ document.currentScript = script;
+ parent.replaceChild(script, scripts[i]);
+ }
+ }
+ }
+}
+})();
diff --git a/pkg/analyzer/doc/support/style.css b/pkg/analyzer/doc/support/style.css
new file mode 100644
index 0000000..0964121
--- /dev/null
+++ b/pkg/analyzer/doc/support/style.css
@@ -0,0 +1,29 @@
+*, *:before, *:after {
+ -moz-box-sizing: border-box; -webkit-box-sizing: border-box; box-sizing: border-box;
+}
+button {
+ position: fixed;
+ padding: 10px;
+ top: 5px;
+ left: 5px;
+ opacity: 0.8;
+ display: none;
+}
+g > * {
+ transition-property: stroke, stroke-width, transform, fill, font-size;
+ transition-duration: .2s;
+}
+g.active > text {
+ fill: blue;
+ font-size: 100%;
+}
+g.active > polygon, g.active > ellipse, g.active > path {
+ stroke: blue;
+ stroke-width: 3px !important;
+}
+g.active.edge > polygon {
+ fill: blue;
+}
+html, body { margin:10px; padding:0; }
+svg { height:100%; width:100%; }
+svg.zoom {height: inherit; width: inherit;}
diff --git a/pkg/analyzer/doc/support/viz.js b/pkg/analyzer/doc/support/viz.js
new file mode 100644
index 0000000..488db0c
--- /dev/null
+++ b/pkg/analyzer/doc/support/viz.js
@@ -0,0 +1,1302 @@
+function k($a){throw $a;}var p=void 0,q=!0,r=null,G=!1;function M(){return function(){}}
+window.Viz=function($a,ec,ab){function ob(a){eval.call(r,a)}function J(a,b){a||aa("Assertion failed: "+b)}function pb(a){try{var b=e["_"+a];b||(b=eval("_"+a))}catch(c){}J(b,"Cannot call unknown function "+a+" (perhaps LLVM optimizations or closure removed it?)");return b}function qb(a,b,c,f){function d(a,b){if("string"==b){if(a===r||a===p||0===a)return 0;a=V(a);b="array"}if("array"==b){i||(i=l.kd());var c=l.hd(a.length);rb(a,c);return c}return a}var i=0,e=0,f=f?f.map(function(a){return d(a,c[e++])}):
+[];a=a.apply(r,f);"string"==b?b=R(a):(J("array"!=b),b=a);i&&l.jd(i);return b}function ta(a,b,c){c=c||"i8";"*"===c.charAt(c.length-1)&&(c="i32");switch(c){case "i1":v[a]=b;break;case "i8":v[a]=b;break;case "i16":ea[a>>1]=b;break;case "i32":t[a>>2]=b;break;case "i64":na=[b>>>0,(N=b,1<=+ua(N)?0<N?(va(+Ia(N/4294967296),4294967295)|0)>>>0:~~+Ja((N-+(~~N>>>0))/4294967296)>>>0:0)];t[a>>2]=na[0];t[a+4>>2]=na[1];break;case "float":wa[a>>2]=b;break;case "double":oa[a>>3]=b;break;default:aa("invalid type for setValue: "+
+c)}}function pa(a,b){b=b||"i8";"*"===b.charAt(b.length-1)&&(b="i32");switch(b){case "i1":return v[a];case "i8":return v[a];case "i16":return ea[a>>1];case "i32":return t[a>>2];case "i64":return t[a>>2];case "float":return wa[a>>2];case "double":return oa[a>>3];default:aa("invalid type for setValue: "+b)}return r}function D(a,b,c,f){var d,i;"number"===typeof a?(d=q,i=a):(d=G,i=a.length);var e="string"===typeof b?b:r,c=c==L?f:[ia,l.hd,l.md,l.Ub][c===p?S:c](Math.max(i,e?1:b.length));if(d){f=c;J(0==(c&
+3));for(a=c+(i&-4);f<a;f+=4)t[f>>2]=0;for(a=c+i;f<a;)v[f++|0]=0;return c}if("i8"===e)return a.subarray||a.slice?T.set(a,c):T.set(new Uint8Array(a),c),c;for(var f=0,j,g;f<i;){var x=a[f];"function"===typeof x&&(x=l.Ni(x));d=e||b[f];0===d?f++:("i64"==d&&(d="i32"),ta(c+f,x,d),g!==d&&(j=l.Lc(d),g=d),f+=j)}return c}function R(a,b){for(var c=G,f,d=0;;){f=T[a+d|0];if(128<=f)c=q;else if(0==f&&!b)break;d++;if(b&&d==b)break}b||(b=d);var i="";if(!c){for(;0<b;)f=String.fromCharCode.apply(String,T.subarray(a,a+
+Math.min(b,1024))),i=i?i+f:f,a+=1024,b-=1024;return i}c=new l.pb;for(d=0;d<b;d++)f=T[a+d|0],i+=c.ic(f);return i}function fc(a){try{if("Object._main"==a||"_main"==a)return"main()";"number"===typeof a&&(a=R(a));if("_"!==a[0]||"_"!==a[1]||"Z"!==a[2])return a;switch(a[3]){case "n":return"operator new()";case "d":return"operator delete()"}var b=3,c={v:"void",b:"bool",c:"char",s:"short",i:"int",l:"long",f:"float",d:"double",w:"wchar_t",a:"signed char",h:"unsigned char",t:"unsigned short",j:"unsigned int",
+m:"unsigned long",x:"long long",y:"unsigned long long",z:"..."},f=[],d=q,i=function(e,h,g){var h=h||Infinity,m="",s=[],y;if("N"===a[b]){b++;"K"===a[b]&&b++;for(y=[];"E"!==a[b];)if("S"===a[b]){b++;var A=a.indexOf("_",b);y.push(f[a.substring(b,A)||0]||"?");b=A+1}else if("C"===a[b])y.push(y[y.length-1]),b+=2;else{var A=parseInt(a.substr(b)),F=A.toString().length;if(!A||!F){b--;break}var P=a.substr(b+F,A);y.push(P);f.push(P);b+=F+A}b++;y=y.join("::");h--;if(0===h)return e?[y]:y}else if(("K"===a[b]||d&&
+"L"===a[b])&&b++,A=parseInt(a.substr(b)))F=A.toString().length,y=a.substr(b+F,A),b+=F+A;d=G;"I"===a[b]?(b++,A=i(q),F=i(q,1,q),m+=F[0]+" "+y+"<"+A.join(", ")+">"):m=y;a:for(;b<a.length&&0<h--;)if(y=a[b++],y in c)s.push(c[y]);else switch(y){case "P":s.push(i(q,1,q)[0]+"*");break;case "R":s.push(i(q,1,q)[0]+"&");break;case "L":b++;A=a.indexOf("E",b)-b;s.push(a.substr(b,A));b+=A+2;break;case "A":A=parseInt(a.substr(b));b+=A.toString().length;"_"!==a[b]&&k("?");b++;s.push(i(q,1,q)[0]+" ["+A+"]");break;
+case "E":break a;default:m+="?"+y;break a}!g&&(1===s.length&&"void"===s[0])&&(s=[]);return e?s:m+("("+s.join(", ")+")")};return i()}catch(e){return a}}function bb(){var a=Error().stack;return a?a.replace(/__Z[\w\d_]+/g,function(a){var c=fc(a);return a===c?a:a+" ["+c+"]"}):"(no stack trace available)"}function qa(a){for(;0<a.length;){var b=a.shift();if("function"==typeof b)b();else{var c=b.Ka;"number"===typeof c?b.uc===p?l.Dc("v",c):l.Dc("vi",c,[b.uc]):c(b.uc===p?r:b.uc)}}}function sb(a){cb.unshift(a)}
+function tb(a){ub.unshift(a)}function V(a,b,c){a=(new l.pb).re(a);c&&(a.length=c);b||a.push(0);return a}function rb(a,b){for(var c=0;c<a.length;c++)v[b+c|0]=a[c]}function Ka(a,b,c){for(var f=0;f<a.length;f++)v[b+f|0]=a.charCodeAt(f);c||(v[b+a.length|0]=0)}function La(a,b){return 0<=a?a:32>=b?2*Math.abs(1<<b-1)+a:Math.pow(2,b)+a}function vb(a,b){if(0>=a)return a;var c=32>=b?Math.abs(1<<b-1):Math.pow(2,b-1);if(a>=c&&(32>=b||a>c))a=-2*c+a;return a}function db(){fa++;e.monitorRunDependencies&&e.monitorRunDependencies(fa)}
+function Ma(){fa--;e.monitorRunDependencies&&e.monitorRunDependencies(fa);if(0==fa&&(eb!==r&&(clearInterval(eb),eb=r),xa)){var a=xa;xa=r;a()}}function H(a){return t[Na>>2]=a}function fb(a,b,c){a=d.D(a);if(!a)return H(g.H),-1;try{return d.P(a,v,b,c)}catch(f){return d.sa(f),-1}}function wb(a,b,c){if(a in Oa){if(Oa[a].length>c-1)return H(g.qc);Ka(Oa[a],b);return 0}return H(g.B)}function ya(a){ya.buffer||(ya.buffer=ia(256));wb(a,ya.buffer,256);return ya.buffer}function Pa(a){return 0>a||0===a&&-Infinity===
+1/a}function gb(a,b){function c(a){var c;"double"===a?c=oa[b+d>>3]:"i64"==a?(c=[t[b+d>>2],t[b+(d+8)>>2]],d+=8):(a="i32",c=t[b+d>>2]);d+=Math.max(l.$d(a),l.Aa(a,r,q));return c}for(var f=a,d=0,e=[],h,j;;){var g=f;h=v[f];if(0===h)break;j=v[f+1|0];if(37==h){var x=G,m=G,s=G,y=G,A=G;a:for(;;){switch(j){case 43:x=q;break;case 45:m=q;break;case 35:s=q;break;case 48:if(y)break a;else{y=q;break}case 32:A=q;break;default:break a}f++;j=v[f+1|0]}var F=0;if(42==j)F=c("i32"),f++,j=v[f+1|0];else for(;48<=j&&57>=
+j;)F=10*F+(j-48),f++,j=v[f+1|0];var P=G,E=-1;if(46==j){E=0;P=q;f++;j=v[f+1|0];if(42==j)E=c("i32"),f++;else for(;;){j=v[f+1|0];if(48>j||57<j)break;E=10*E+(j-48);f++}j=v[f+1|0]}-1===E&&(E=6,P=G);var C;switch(String.fromCharCode(j)){case "h":j=v[f+2|0];104==j?(f++,C=1):C=2;break;case "l":j=v[f+2|0];108==j?(f++,C=8):C=4;break;case "L":case "q":case "j":C=8;break;case "z":case "t":case "I":C=4;break;default:C=r}C&&f++;j=v[f+1|0];switch(String.fromCharCode(j)){case "d":case "i":case "u":case "o":case "x":case "X":case "p":g=
+100==j||105==j;C=C||4;var n=h=c("i"+8*C),w;8==C&&(h=l.Mf(h[0],h[1],117==j));4>=C&&(h=(g?vb:La)(h&Math.pow(256,C)-1,8*C));var u=Math.abs(h),g="";if(100==j||105==j)w=8==C&&za?za.stringify(n[0],n[1],r):vb(h,8*C).toString(10);else if(117==j)w=8==C&&za?za.stringify(n[0],n[1],q):La(h,8*C).toString(10),h=Math.abs(h);else if(111==j)w=(s?"0":"")+u.toString(8);else if(120==j||88==j){g=s&&0!=h?"0x":"";if(8==C&&za)if(n[1]){w=(n[1]>>>0).toString(16);for(s=(n[0]>>>0).toString(16);8>s.length;)s="0"+s;w+=s}else w=
+(n[0]>>>0).toString(16);else if(0>h){h=-h;w=(u-1).toString(16);n=[];for(s=0;s<w.length;s++)n.push((15-parseInt(w[s],16)).toString(16));for(w=n.join("");w.length<2*C;)w="f"+w}else w=u.toString(16);88==j&&(g=g.toUpperCase(),w=w.toUpperCase())}else 112==j&&(0===u?w="(nil)":(g="0x",w=u.toString(16)));if(P)for(;w.length<E;)w="0"+w;0<=h&&(x?g="+"+g:A&&(g=" "+g));"-"==w.charAt(0)&&(g="-"+g,w=w.substr(1));for(;g.length+w.length<F;)m?w+=" ":y?w="0"+w:g=" "+g;w=g+w;w.split("").forEach(function(a){e.push(a.charCodeAt(0))});
+break;case "f":case "F":case "e":case "E":case "g":case "G":h=c("double");if(isNaN(h))w="nan",y=G;else if(isFinite(h)){P=G;C=Math.min(E,20);if(103==j||71==j)P=q,E=E||1,C=parseInt(h.toExponential(C).split("e")[1],10),E>C&&-4<=C?(j=(103==j?"f":"F").charCodeAt(0),E-=C+1):(j=(103==j?"e":"E").charCodeAt(0),E--),C=Math.min(E,20);if(101==j||69==j)w=h.toExponential(C),/[eE][-+]\d$/.test(w)&&(w=w.slice(0,-1)+"0"+w.slice(-1));else if(102==j||70==j)w=h.toFixed(C),0===h&&Pa(h)&&(w="-"+w);g=w.split("e");if(P&&
+!s)for(;1<g[0].length&&-1!=g[0].indexOf(".")&&("0"==g[0].slice(-1)||"."==g[0].slice(-1));)g[0]=g[0].slice(0,-1);else for(s&&-1==w.indexOf(".")&&(g[0]+=".");E>C++;)g[0]+="0";w=g[0]+(1<g.length?"e"+g[1]:"");69==j&&(w=w.toUpperCase());0<=h&&(x?w="+"+w:A&&(w=" "+w))}else w=(0>h?"-":"")+"inf",y=G;for(;w.length<F;)w=m?w+" ":y&&("-"==w[0]||"+"==w[0])?w[0]+"0"+w.slice(1):(y?"0":" ")+w;97>j&&(w=w.toUpperCase());w.split("").forEach(function(a){e.push(a.charCodeAt(0))});break;case "s":y=(x=c("i8*"))?Aa(x):6;
+P&&(y=Math.min(y,E));if(!m)for(;y<F--;)e.push(32);if(x)for(s=0;s<y;s++)e.push(T[x++|0]);else e=e.concat(V("(null)".substr(0,y),q));if(m)for(;y<F--;)e.push(32);break;case "c":for(m&&e.push(c("i8"));0<--F;)e.push(32);m||e.push(c("i8"));break;case "n":m=c("i32*");t[m>>2]=e.length;break;case "%":e.push(h);break;default:for(s=g;s<f+2;s++)e.push(v[s])}f+=2}else e.push(h),f+=1}return e}function hb(a,b,c,f){c=gb(c,f);f=b===p?c.length:Math.min(c.length,Math.max(b-1,0));if(0>a)var a=-a,d=ia(f+1),a=t[a>>2]=
+d;for(d=0;d<f;d++)v[a+d|0]=c[d];if(f<b||b===p)v[a+d|0]=0;return c.length}function xb(a,b,c){for(var f=0;f<c;){var d=T[a+f|0],e=T[b+f|0];if(d==e&&0==d)break;if(0==d)return-1;if(0==e)return 1;if(d==e)f++;else return d>e?1:-1}return 0}function yb(a){return 32==a||9<=a&&13>=a}function zb(a,b,c,f,d,e,h){for(;yb(v[a]);)a++;var j=1;45==v[a]?(j=-1,a++):43==v[a]&&a++;if(c){if(16==c&&48==v[a]&&(120==v[a+1|0]||88==v[a+1|0]))a+=2}else 48==v[a]&&(120==v[a+1|0]||88==v[a+1|0]?(c=16,a+=2):(c=8,a++));c||(c=10);for(var l,
+x=0;0!=(l=v[a])&&!(l=parseInt(String.fromCharCode(l),c),isNaN(l));)x=x*c+l,a++;x*=j;b&&(t[b>>2]=a);h&&(Math.abs(x)>d?(x=d,H(g.qc)):x=La(x,e));if(x>d||x<f)x=x>d?d:f,H(g.qc);return 64==e?(u.setTempRet0((N=x,1<=+ua(N)?0<N?(va(+Ia(N/4294967296),4294967295)|0)>>>0:~~+Ja((N-+(~~N>>>0))/4294967296)>>>0:0)),x>>>0)|0:x}function Ab(a,b,c){return zb(a,b,c,-2147483648,2147483647,32)}function Bb(a){return/^[+-]?[0-9]*\.?[0-9]+([eE][+-]?[0-9]+)?/.exec(a)}function Q(a,b,c,f){Q.whiteSpace||(Q.whiteSpace={},Q.whiteSpace[32]=
+1,Q.whiteSpace[9]=1,Q.whiteSpace[10]=1,Q.whiteSpace[11]=1,Q.whiteSpace[12]=1,Q.whiteSpace[13]=1);var a=R(a),d=0;if(0<=a.indexOf("%n"))var e=b,b=function(){d++;return e()},h=c,c=function(){d--;return h()};var j=0,g=0,x=0,m,j=0;a:for(;j<a.length;)if("%"===a[j]&&"n"==a[j+1]){var s=t[f+x>>2],x=x+l.Aa("void*",r,q);t[s>>2]=d;j+=2}else{if("%"===a[j]){var y=a.indexOf("c",j+1);if(0<y){var A=1;y>j+1&&(m=a.substring(j+1,y),A=parseInt(m),A!=m&&(A=0));if(A){s=t[f+x>>2];x+=l.Aa("void*",r,q);g++;for(var F=0;F<A;F++)m=
+b(),v[s++|0]=m;j+=y-j+1;continue}}}if("%"===a[j]&&0<a.indexOf("[",j+1)&&(y=/\%([0-9]*)\[(\^)?(\]?[^\]]*)\]/.exec(a.substring(j)))){for(var A=parseInt(y[1])||Infinity,P="^"===y[2],E=y[3];m=/([^\-])\-([^\-])/.exec(E);){for(var s=m[1].charCodeAt(0),F=m[2].charCodeAt(0),C="";s<=F;C+=String.fromCharCode(s++));E=E.replace(m[1]+"-"+m[2],C)}s=t[f+x>>2];x+=l.Aa("void*",r,q);g++;for(F=0;F<A;F++)if(m=b(),P)if(0>E.indexOf(String.fromCharCode(m)))v[s++|0]=m;else{c();break}else if(0<=E.indexOf(String.fromCharCode(m)))v[s++|
+0]=m;else{c();break}v[s++|0]=0;j+=y[0].length;continue}for(;;){m=b();if(0==m)return g;if(!(m in Q.whiteSpace))break}c();if("%"===a[j]){j++;s=G;"*"==a[j]&&(s=q,j++);for(m=j;48<=a[j].charCodeAt(0)&&57>=a[j].charCodeAt(0);)j++;var n;j!=m&&(n=parseInt(a.slice(m,j),10));P=A=y=G;"l"==a[j]?(y=q,j++,"l"==a[j]&&(P=q,j++)):"h"==a[j]&&(A=q,j++);E=a[j];j++;F=0;C=[];if("f"==E||"e"==E||"g"==E||"F"==E||"E"==E||"G"==E){for(m=b();0<m&&!(m in Q.whiteSpace);)C.push(String.fromCharCode(m)),m=b();m=(m=Bb(C.join("")))?
+m[0].length:0;for(F=0;F<C.length-m+1;F++)c();C.length=m}else{m=b();var w=q;if(("x"==E||"X"==E)&&48==m){var u=b();120==u||88==u?m=b():c()}for(;(F<n||isNaN(n))&&0<m;)if(!(m in Q.whiteSpace)&&("s"==E||("d"===E||"u"==E||"i"==E)&&(48<=m&&57>=m||w&&45==m)||("x"===E||"X"===E)&&(48<=m&&57>=m||97<=m&&102>=m||65<=m&&70>=m))&&(j>=a.length||m!==a[j].charCodeAt(0)))C.push(String.fromCharCode(m)),m=b(),F++,w=G;else break;c()}if(0===C.length)return 0;if(!s){m=C.join("");s=t[f+x>>2];x+=l.Aa("void*",r,q);switch(E){case "d":case "u":case "i":A?
+ea[s>>1]=parseInt(m,10):P?(na=[parseInt(m,10)>>>0,(N=parseInt(m,10),1<=+ua(N)?0<N?(va(+Ia(N/4294967296),4294967295)|0)>>>0:~~+Ja((N-+(~~N>>>0))/4294967296)>>>0:0)],t[s>>2]=na[0],t[s+4>>2]=na[1]):t[s>>2]=parseInt(m,10);break;case "X":case "x":t[s>>2]=parseInt(m,16);break;case "F":case "f":case "E":case "e":case "G":case "g":case "E":y?oa[s>>3]=parseFloat(m):wa[s>>2]=parseFloat(m);break;case "s":m=V(m);for(F=0;F<m.length;F++)v[s+F|0]=m[F]}g++}}else{if(a[j].charCodeAt(0)in Q.whiteSpace){for(m=b();m in
+Q.whiteSpace;){if(0>=m)break a;m=b()}c(m)}else if(m=b(),a[j].charCodeAt(0)!==m){c(m);break a}j++}}return g}function Cb(a,b,c){return hb(a,p,b,c)}function Qa(){Qa.$||(Qa.$=D([0],"i8",ja));return Qa.$}function Ba(a,b,c){a=d.D(a);if(!a)return H(g.H),-1;try{return d.write(a,v,b,c)}catch(f){return d.sa(f),-1}}function Db(a,b,c,f){c*=b;if(0==c)return 0;a=Ba(f,a,c);if(-1==a){if(b=d.D(f))b.error=q;return 0}return Math.floor(a/b)}function Eb(a,b,c){c=gb(b,c);b=l.kd();a=Db(D(c,"i8",ib),1,c.length,a);l.jd(b);
+return a}function Fb(a,b,c){var f,d,e,h;if(0==a&&0==(a=pa(c,"i8*")))return 0;a:for(;;){d=pa(a++,"i8");for(f=b;0!=(e=pa(f++,"i8"));)if(d==e)continue a;break}if(0==d)return ta(c,0,"i8*"),0;for(h=a-1;;){d=pa(a++,"i8");f=b;do if((e=pa(f++,"i8"))==d)return 0==d?a=0:ta(a-1,0,"i8"),ta(c,a,"i8*"),h;while(0!=e)}aa("strtok_r error!")}function Gb(a){e.exit(a)}function Ca(a){var b,c;Ca.xc?(c=t[Hb>>2],b=t[c>>2]):(Ca.xc=q,U.USER="root",U.PATH="/",U.PWD="/",U.HOME="/home/emscripten",U.LANG="en_US.UTF-8",U._="./this.program",
+b=D(1024,"i8",S),c=D(256,"i8*",S),t[c>>2]=b,t[Hb>>2]=c);var f=[],d=0,e;for(e in a)if("string"===typeof a[e]){var h=e+"="+a[e];f.push(h);d+=h.length}1024<d&&k(Error("Environment size exceeded TOTAL_ENV_SIZE!"));for(a=0;a<f.length;a++)h=f[a],Ka(h,b),t[c+4*a>>2]=b,b+=h.length+1;t[c+4*f.length>>2]=0}function Da(a){if(0===a)return 0;a=R(a);if(!U.hasOwnProperty(a))return 0;Da.$&&Ib(Da.$);Da.$=D(V(U[a]),"i8",ja);return Da.$}function Jb(a,b,c){c=t[c>>2];a=R(a);try{return d.open(a,b,c).da}catch(f){return d.sa(f),
+-1}}function Kb(a,b){var c,b=R(b);if("r"==b[0])c=-1!=b.indexOf("+")?2:0;else if("w"==b[0])c=-1!=b.indexOf("+")?2:1,c|=576;else if("a"==b[0])c=-1!=b.indexOf("+")?2:1,c|=64,c|=1024;else return H(g.B),0;c=Jb(a,c,D([511,0,0,0],"i32",ib));return-1==c?0:c}function Lb(a){a=d.D(a);if(!a)return H(g.H),-1;try{return d.close(a),0}catch(b){return d.sa(b),-1}}function Mb(a){if(d.D(a))return 0;H(g.H);return-1}function ra(a,b){var c=La(a&255);v[ra.$|0]=c;if(-1==Ba(b,ra.$,1)){if(c=d.D(b))c.error=q;return-1}return c}
+function Nb(a,b,c,f){c*=b;if(0==c)return 0;var e=0,i=d.D(f);if(!i)return H(g.H),0;for(;i.pd.length&&0<c;)v[a++|0]=i.pd.pop(),c--,e++;a=fb(f,a,c);if(-1==a)return i&&(i.error=q),0;e+=a;e<c&&(i.Ua=q);return Math.floor(e/b)}function Ea(a){var b=d.D(a);if(!b||b.Ua||b.error)return-1;a=Nb(Ea.$,1,1,a);return 0==a?-1:-1==a?(b.error=q,-1):T[Ea.$|0]}function Ob(a,b,c){a="string"!==typeof a?R(a):a;try{var f=c?d.Kf(a):d.ld(a);t[b>>2]=f.Cc;t[b+4>>2]=0;t[b+8>>2]=f.ac;t[b+12>>2]=f.mode;t[b+16>>2]=f.Wc;t[b+20>>2]=
+f.uid;t[b+24>>2]=f.Mc;t[b+28>>2]=f.Pa;t[b+32>>2]=0;t[b+36>>2]=f.size;t[b+40>>2]=4096;t[b+44>>2]=f.sb;t[b+48>>2]=Math.floor(f.wc.getTime()/1E3);t[b+52>>2]=0;t[b+56>>2]=Math.floor(f.Uc.getTime()/1E3);t[b+60>>2]=0;t[b+64>>2]=Math.floor(f.Ac.getTime()/1E3);t[b+68>>2]=0;t[b+72>>2]=f.ac;return 0}catch(e){return d.sa(e),-1}}function Pb(a,b,c){a=d.D(a);if(!a)return H(g.H),-1;try{return d.ga(a,b,c)}catch(f){return d.sa(f),-1}}function Qb(a,b){return Ba(b,a,Aa(a))}function Fa(a,b,c){var f=d.Ud(b||"/tmp");if(!f||
+!f.Pc)if(b="/tmp",f=d.Ud(b),!f||!f.Pc)return 0;c=c||"file";do c+=String.fromCharCode(65+Math.floor(25*Math.random()));while(c in f.u);b=b+"/"+c;Fa.buffer||(Fa.buffer=ia(256));a||(a=Fa.buffer);Ka(b,a);return a}function Ra(){Ra.mode&&(Ra.mode=D(V("w+"),"i8",ja));return Kb(Fa(0),Ra.mode)}function Rb(a){var b=Rb;b.xc||(Z=Z+4095&-4096,b.xc=q,J(l.Ub),b.We=l.Ub,l.Ub=function(){aa("cannot dynamically allocate, sbrk now has control")});var c=Z;0!=a&&b.We(a);return c}function jb(a){this.name="ExitStatus";this.message=
+"Program terminated with exit("+a+")";this.status=a}function kb(a){function b(){if(!e.calledRun){e.calledRun=q;Sa||(Sa=q,qa(ka));qa(lb);e._main&&mb&&e.callMain(a);if(e.postRun)for("function"==typeof e.postRun&&(e.postRun=[e.postRun]);e.postRun.length;)tb(e.postRun.shift());qa(ub)}}a=a||e.arguments;Ta===r&&(Ta=Date.now());if(0<fa)e.ab("run() called, but dependencies remain, so not running");else{if(e.preRun)for("function"==typeof e.preRun&&(e.preRun=[e.preRun]);e.preRun.length;)sb(e.preRun.shift());
+qa(cb);!(0<fa)&&!e.calledRun&&(e.setStatus?(e.setStatus("Running..."),setTimeout(function(){setTimeout(function(){e.setStatus("")},1);ba||b()},1)):b())}}function Sb(a){ba=q;X=Tb;qa(Ua);k(new jb(a))}function aa(a){a&&(e.print(a),e.ab(a));ba=q;k("abort() at "+bb())}"undefined"===typeof ab&&(ab="dot");var e={"return":"",print:function(a){e["return"]+=a+"\n"}},Va={},ga;for(ga in e)e.hasOwnProperty(ga)&&(Va[ga]=e[ga]);var ca="object"===typeof process&&"function"===typeof require,Wa="object"===typeof window,
+Xa="function"===typeof importScripts,gc=!Wa&&!ca&&!Xa;if(ca){e.print||(e.print=function(a){process.stdout.write(a+"\n")});e.printErr||(e.printErr=function(a){process.stderr.write(a+"\n")});var Ub=require("fs"),Vb=require("path");e.read=function(a,b){var a=Vb.normalize(a),c=Ub.readFileSync(a);!c&&a!=Vb.resolve(a)&&(a=path.join(__dirname,"..","src",a),c=Ub.readFileSync(a));c&&!b&&(c=c.toString());return c};e.readBinary=function(a){return e.read(a,q)};e.load=function(a){ob(read(a))};e.arguments=process.argv.slice(2);
+module.exports=e}else gc?(e.print||(e.print=print),"undefined"!=typeof printErr&&(e.printErr=printErr),e.read="undefined"!=typeof read?read:function(){k("no read() available (jsc?)")},e.readBinary=function(a){return read(a,"binary")},"undefined"!=typeof scriptArgs?e.arguments=scriptArgs:"undefined"!=typeof arguments&&(e.arguments=arguments),this.Module=e,eval("if (typeof gc === 'function' && gc.toString().indexOf('[native code]') > 0) var gc = undefined")):Wa||Xa?(e.read=function(a){var b=new XMLHttpRequest;
+b.open("GET",a,G);b.send(r);return b.responseText},"undefined"!=typeof arguments&&(e.arguments=arguments),"undefined"!==typeof console?(e.print||(e.print=function(a){console.log(a)}),e.printErr||(e.printErr=function(a){console.log(a)})):e.print||(e.print=M()),Wa?this.Module=e:e.load=importScripts):k("Unknown runtime environment. Where are we?");"undefined"==!e.load&&e.read&&(e.load=function(a){ob(e.read(a))});e.print||(e.print=M());e.printErr||(e.printErr=e.print);e.arguments||(e.arguments=[]);e.print=
+e.print;e.ab=e.printErr;e.preRun=[];e.postRun=[];for(ga in Va)Va.hasOwnProperty(ga)&&(e[ga]=Va[ga]);var l={kd:function(){return X},jd:function(a){X=a},Ii:function(a,b){b=b||4;return 1==b?a:isNumber(a)&&isNumber(b)?Math.ceil(a/b)*b:isNumber(b)&&isPowerOfTwo(b)?"((("+a+")+"+(b-1)+")&"+-b+")":"Math.ceil(("+a+")/"+b+")*"+b},Ff:function(a){return a in l.Re||a in l.Pe},Gf:function(a){return"*"==a[a.length-1]},If:function(a){return isPointerType(a)?G:isArrayType(a)||/<?{ ?[^}]* ?}>?/.test(a)?q:"%"==a[0]},
+Re:{i1:0,i8:0,i16:0,i32:0,i64:0},Pe:{"float":0,"double":0},cj:function(a,b){return(a|0|b|0)+4294967296*(Math.round(a/4294967296)|Math.round(b/4294967296))},ti:function(a,b){return((a|0)&(b|0))+4294967296*(Math.round(a/4294967296)&Math.round(b/4294967296))},Ij:function(a,b){return((a|0)^(b|0))+4294967296*(Math.round(a/4294967296)^Math.round(b/4294967296))},Lc:function(a){switch(a){case "i1":case "i8":return 1;case "i16":return 2;case "i32":return 4;case "i64":return 8;case "float":return 4;case "double":return 8;
+default:return"*"===a[a.length-1]?l.Fa:"i"===a[0]?(a=parseInt(a.substr(1)),J(0===a%8),a/8):0}},$d:function(a){return Math.max(l.Lc(a),l.Fa)},lf:function(a,b){var c={};return b?a.filter(function(a){return c[a[b]]?G:c[a[b]]=q}):a.filter(function(a){return c[a]?G:c[a]=q})},set:function(){for(var a="object"===typeof arguments[0]?arguments[0]:arguments,b={},c=0;c<a.length;c++)b[a[c]]=0;return b},fi:8,Aa:function(a,b,c){return c||!c&&("i64"==a||"double"==a)?8:!a?Math.min(b,8):Math.min(b||(a?l.$d(a):0),
+l.Fa)},Ye:function(a){a.ja=0;a.Ta=0;var b=[],c=-1,f=0;a.Xd=a.Gc.map(function(d){f++;var e,h;l.Ff(d)||l.Gf(d)?(e=l.Lc(d),h=l.Aa(d,e)):l.If(d)?"0"===d[1]?(e=0,h=Types.types[d]?l.Aa(r,Types.types[d].Ta):a.Ta||QUANTUM_SIZE):(e=Types.types[d].ja,h=l.Aa(r,Types.types[d].Ta)):"b"==d[0]?(e=d.substr(1)|0,h=1):"<"===d[0]?e=h=Types.types[d].ja:"i"===d[0]?(e=h=parseInt(d.substr(1))/8,J(0===e%1,"cannot handle non-byte-size field "+d)):J(G,"invalid type for calculateStructAlignment");a.dj&&(h=1);a.Ta=Math.max(a.Ta,
+h);d=l.qb(a.ja,h);a.ja=d+e;0<=c&&b.push(d-c);return c=d});a.ne&&"["===a.ne[0]&&(a.ja=parseInt(a.ne.substr(1))*a.ja/2);a.ja=l.qb(a.ja,a.Ta);0==b.length?a.Wd=a.ja:1==l.lf(b).length&&(a.Wd=b[0]);a.$i=1!=a.Wd;return a.Xd},sf:function(a,b,c){var f,d;if(b){c=c||0;f=("undefined"===typeof Types?l.zj:Types.types)[b];if(!f)return r;if(f.Gc.length!=a.length)return printErr("Number of named fields must match the type for "+b+": possibly duplicate struct names. Cannot return structInfo"),r;d=f.Xd}else f={Gc:a.map(function(a){return a[0]})},
+d=l.Ye(f);var e={ki:f.ja};b?a.forEach(function(a,b){if("string"===typeof a)e[a]=d[b]+c;else{var g,x;for(x in a)g=x;e[g]=l.sf(a[g],f.Gc[b],d[b])}}):a.forEach(function(a,b){e[a[1]]=d[b]});return e},Dc:function(a,b,c){return c&&c.length?(c.splice||(c=Array.prototype.slice.call(c)),c.splice(0,0,b),e["dynCall_"+a].apply(r,c)):e["dynCall_"+a].call(r,b)},Wb:[],mi:function(a){for(var b=0;b<l.Wb.length;b++)if(!l.Wb[b])return l.Wb[b]=a,2*(1+b);k("Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.")},
+lj:function(a){l.Wb[(a-2)/2]=r},Li:function(a,b){l.vc||(l.vc={});var c=l.vc[a];if(c)return c;for(var c=[],f=0;f<b;f++)c.push(String.fromCharCode(36)+f);a=R(a);'"'===a[0]&&(a.indexOf('"',1)===a.length-1?a=a.substr(1,a.length-2):aa("invalid EM_ASM input |"+a+"|. Please use EM_ASM(..code..) (no quotes) or EM_ASM({ ..code($0).. }, input) (to input values)"));return l.vc[a]=eval("(function("+c.join(",")+"){ "+a+" })")},Fb:function(a){l.Fb.fd||(l.Fb.fd={});l.Fb.fd[a]||(l.Fb.fd[a]=1,e.ab(a))},Ic:{},Mi:function(a,
+b){J(b);l.Ic[a]||(l.Ic[a]=function(){return l.Dc(b,a,arguments)});return l.Ic[a]},pb:function(){var a=[],b=0;this.ic=function(c){c&=255;if(0==a.length){if(0==(c&128))return String.fromCharCode(c);a.push(c);b=192==(c&224)?1:224==(c&240)?2:3;return""}if(b&&(a.push(c),b--,0<b))return"";var c=a[0],f=a[1],d=a[2],e=a[3];2==a.length?c=String.fromCharCode((c&31)<<6|f&63):3==a.length?c=String.fromCharCode((c&15)<<12|(f&63)<<6|d&63):(c=(c&7)<<18|(f&63)<<12|(d&63)<<6|e&63,c=String.fromCharCode(Math.floor((c-
+65536)/1024)+55296,(c-65536)%1024+56320));a.length=0;return c};this.re=function(a){for(var a=unescape(encodeURIComponent(a)),b=[],d=0;d<a.length;d++)b.push(a.charCodeAt(d));return b}},hd:function(a){var b=X;X=X+a|0;X=X+7&-8;return b},md:function(a){var b=la;la=la+a|0;la=la+7&-8;return b},Ub:function(a){var b=Z;Z=Z+a|0;Z=Z+7&-8;Z>=ha&&aa("Cannot enlarge memory arrays in asm.js. Either (1) compile with -s TOTAL_MEMORY=X with X higher than the current value "+ha+", or (2) set Module.TOTAL_MEMORY before the program runs.");
+return b},qb:function(a,b){return Math.ceil(a/(b?b:8))*(b?b:8)},Mf:function(a,b,c){return c?+(a>>>0)+4294967296*+(b>>>0):+(a>>>0)+4294967296*+(b|0)},J:8,Fa:4,ji:0};e.Runtime=l;var ba=G,N,na;e.ccall=function(a,b,c,f){return qb(pb(a),b,c,f)};e.cwrap=function(a,b,c){var f=pb(a);return function(){return qb(f,b,c,Array.prototype.slice.call(arguments))}};e.setValue=ta;e.getValue=pa;var ja=0,ib=1,S=2,L=4;e.ALLOC_NORMAL=ja;e.ALLOC_STACK=ib;e.ALLOC_STATIC=S;e.ALLOC_DYNAMIC=3;e.ALLOC_NONE=L;e.allocate=D;e.Pointer_stringify=
+R;e.UTF16ToString=function(a){for(var b=0,c="";;){var f=ea[a+2*b>>1];if(0==f)return c;++b;c+=String.fromCharCode(f)}};e.stringToUTF16=function(a,b){for(var c=0;c<a.length;++c)ea[b+2*c>>1]=a.charCodeAt(c);ea[b+2*a.length>>1]=0};e.UTF32ToString=function(a){for(var b=0,c="";;){var f=t[a+4*b>>2];if(0==f)return c;++b;65536<=f?(f-=65536,c+=String.fromCharCode(55296|f>>10,56320|f&1023)):c+=String.fromCharCode(f)}};e.stringToUTF32=function(a,b){for(var c=0,f=0;f<a.length;++f){var d=a.charCodeAt(f);if(55296<=
+d&&57343>=d)var e=a.charCodeAt(++f),d=65536+((d&1023)<<10)|e&1023;t[b+4*c>>2]=d;++c}t[b+4*c>>2]=0};for(var v,T,ea,Wb,t,Ya,wa,oa,Xb=0,la=0,Zb=0,X=0,nb=0,$b=0,Z=0,hc=e.TOTAL_STACK||5242880,ha=e.TOTAL_MEMORY||16777216,da=4096;da<ha||da<2*hc;)da=16777216>da?2*da:da+16777216;da!==ha&&(e.ab("increasing TOTAL_MEMORY to "+da+" to be more reasonable"),ha=da);J("undefined"!==typeof Int32Array&&"undefined"!==typeof Float64Array&&!!(new Int32Array(1)).subarray&&!!(new Int32Array(1)).set,"Cannot fallback to non-typed array case: Code is too specialized");
+var $=new ArrayBuffer(ha);v=new Int8Array($);ea=new Int16Array($);t=new Int32Array($);T=new Uint8Array($);Wb=new Uint16Array($);Ya=new Uint32Array($);wa=new Float32Array($);oa=new Float64Array($);t[0]=255;J(255===T[0]&&0===T[3],"Typed arrays 2 must be run on a little-endian system");e.HEAP=p;e.HEAP8=v;e.HEAP16=ea;e.HEAP32=t;e.HEAPU8=T;e.HEAPU16=Wb;e.HEAPU32=Ya;e.HEAPF32=wa;e.HEAPF64=oa;var cb=[],ka=[],lb=[],Ua=[],ub=[],Sa=G;e.addOnPreRun=e.ri=sb;e.addOnInit=e.oi=function(a){ka.unshift(a)};e.addOnPreMain=
+e.qi=function(a){lb.unshift(a)};e.addOnExit=e.ni=function(a){Ua.unshift(a)};e.addOnPostRun=e.pi=tb;e.intArrayFromString=V;e.intArrayToString=function(a){for(var b=[],c=0;c<a.length;c++){var f=a[c];255<f&&(f&=255);b.push(String.fromCharCode(f))}return b.join("")};e.writeStringToMemory=function(a,b,c){a=V(a,c);for(c=0;c<a.length;)v[b+c|0]=a[c],c+=1};e.writeArrayToMemory=rb;e.writeAsciiToMemory=Ka;if(!Math.imul||-5!==Math.imul(4294967295,5))Math.imul=function(a,b){var c=a&65535,f=b&65535;return c*f+
+((a>>>16)*f+c*(b>>>16)<<16)|0};Math.Pi=Math.imul;var ua=Math.abs,ic=Math.cos,jc=Math.sin,kc=Math.tan,lc=Math.acos,mc=Math.asin,nc=Math.atan2,oc=Math.exp,ac=Math.sqrt,Ja=Math.ceil,Ia=Math.floor,pc=Math.pow,va=Math.min,fa=0,eb=r,xa=r;e.addRunDependency=db;e.removeRunDependency=Ma;e.preloadedImages={};e.preloadedAudios={};Xb=8;la=Xb+215424;ka.push({Ka:function(){qc()}});var ma;ma=ma=D([0,0,0,0,0,0,0,0],"i8",S);var Ga;Ga=Ga=D([0,0,0,0,0,0,0,0],"i8",S);var Ha;Ha=Ha=D([0,0,0,0,0,0,0,0],"i8",S);D([31,139,
+8,0,0,0,0,0,0,3,0,0,0,0,0,0,56,98,1,0,128,40,2,0,152,65,3,0,32,181,1,0,168,155,1,0,72,133,1,0,144,111,1,0,88,90,1,0,16,71,1,0,152,65,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,88,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,0,0,0,0,54,0,0,0,36,0,0,0,6,0,0,0,72,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,128,169,2,0,144,169,2,0,160,169,2,0,176,169,2,0,192,169,2,0,208,169,2,0,224,169,2,0,240,169,2,0,144,169,2,0,144,169,2,0,208,169,2,0,208,169,2,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,51,51,211,63,0,0,0,0,0,0,248,63,0,0,0,0,0,0,0,0,97,108,110,117,109,0,97,108,112,104,97,0,98,108,97,110,107,0,99,110,116,114,108,0,100,105,103,105,116,0,103,114,97,112,104,0,108,111,119,101,114,0,112,114,105,110,116,0,112,117,110,99,116,0,115,112,97,99,101,0,117,112,112,101,114,0,120,100,105,103,105,
+116,0,0,0,0,0,0,0,0,216,122,2,0,192,107,2,0,232,87,2,0,248,75,2,0,168,64,2,0,104,52,2,0,144,40,2,0,160,28,2,0,152,18,2,0,136,8,2,0,232,255,1,0,56,246,1,0,248,233,1,0,176,224,1,0,192,218,1,0,128,215,1,0,48,0,0,0,0,0,0,0,116,0,0,0,62,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,30,0,0,0,122,0,0,0,0,0,0,0,0,0,0,0,42,0,0,0,0,0,0,0,8,0,0,0,46,0,0,0,14,0,0,0,48,0,0,0,42,0,0,0,0,0,0,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,
+0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,20,0,0,0,32,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
+8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,188,0,0,0,186,0,0,0,84,0,0,0,12,0,0,0,14,0,0,0,84,0,0,0,70,0,0,0,72,0,0,0,74,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100,0,0,0,52,0,0,0,116,0,0,0,88,132,1,0,110,0,0,0,224,59,2,0,114,0,0,0,176,217,1,0,102,0,0,0,208,189,1,0,97,0,0,0,216,162,1,0,101,0,0,0,112,140,1,0,119,0,0,0,
+224,118,1,0,87,0,0,0,96,98,1,0,115,0,0,0,224,77,1,0,83,0,0,0,192,59,1,0,100,0,0,0,144,140,2,0,68,0,0,0,64,124,2,0,0,0,0,0,0,0,0,0,104,0,0,0,0,0,0,0,126,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,0,0,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,60,0,0,0,38,0,0,0,8,0,0,0,16,0,0,0,36,0,0,0,0,0,0,0,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,
+0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,
+208,63,88,168,53,205,59,78,213,63,37,117,2,154,8,27,218,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,44,212,154,230,29,167,234,63,106,222,113,138,142,228,232,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,93,220,70,3,120,11,226,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,
+0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,93,220,70,3,120,11,226,63,13,113,172,139,219,104,220,63,100,93,220,70,3,120,237,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,88,168,53,205,59,78,213,
+63,136,133,90,211,188,227,216,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,196,66,173,105,222,113,236,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,181,21,251,203,238,201,225,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,134,56,214,197,109,52,238,63,210,111,95,7,206,25,231,63,210,111,95,7,206,25,231,63,120,11,36,40,126,140,227,63,88,168,53,205,59,78,213,
+63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,166,10,70,37,117,2,222,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,
+0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,13,113,172,139,219,104,220,63,244,108,86,125,174,182,222,63,17,54,60,189,82,150,201,63,244,108,86,125,174,182,222,63,59,1,77,132,13,79,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,
+0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,
+0,208,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,62,232,217,172,250,92,197,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,130,115,70,148,246,6,199,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,7,240,22,72,80,252,
+220,63,162,180,55,248,194,100,214,63,88,168,53,205,59,78,213,63,13,113,172,139,219,104,220,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,13,113,172,139,219,104,220,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,
+78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,208,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,196,66,173,105,222,113,236,63,0,0,0,0,0,0,
+208,63,127,217,61,121,88,168,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,196,66,173,105,222,113,236,63,19,242,65,207,102,213,211,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,16,122,54,171,62,87,229,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,211,188,227,20,29,201,209,63,
+0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,0,0,0,0,0,0,208,63,72,210,1,0,64,0,0,0,144,164,1,0,144,0,0,0,232,161,1,0,76,0,0,0,72,66,1,0,174,0,0,0,56,160,1,0,196,0,0,0,128,158,1,0,10,0,0,0,96,188,1,0,102,0,0,0,16,64,1,0,92,0,0,0,248,154,1,0,130,0,0,0,88,153,1,0,190,0,0,0,104,151,1,0,78,0,0,0,8,149,1,0,36,0,0,0,128,146,1,0,116,0,0,0,208,142,1,0,54,0,0,0,72,61,1,0,158,0,0,0,80,138,1,0,32,0,0,0,136,136,1,0,38,0,0,0,120,134,
+1,0,58,0,0,0,208,132,1,0,58,0,0,0,80,131,1,0,128,0,0,0,152,129,1,0,136,0,0,0,18,17,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,17,34,35,36,17,37,38,39,40,41,42,43,44,17,45,46,47,16,16,48,16,16,16,16,16,16,16,49,50,51,16,52,53,16,16,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,54,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,
+17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,55,17,17,17,17,56,17,57,58,59,60,61,62,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,63,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,64,65,17,66,67,68,69,70,71,72,73,16,16,16,74,75,76,77,78,16,16,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,17,17,17,82,83,16,16,16,16,16,16,16,16,16,16,16,17,17,17,17,84,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,85,16,16,16,16,86,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,87,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,88,89,90,91,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,92,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,254,255,255,7,254,255,255,7,0,0,0,0,0,4,32,4,255,255,127,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,195,255,3,0,
+31,80,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,223,60,64,215,255,255,251,255,255,255,255,255,255,255,255,255,191,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,3,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,254,255,255,255,127,2,254,255,255,255,255,0,0,0,0,0,255,191,182,0,255,255,255,7,7,0,0,0,255,7,255,255,255,255,255,255,255,254,255,195,255,255,255,255,255,255,255,255,255,255,255,255,239,31,254,225,255,159,0,0,255,255,255,255,255,255,0,224,255,255,
+255,255,255,255,255,255,255,255,255,255,3,0,255,255,255,255,255,7,48,4,255,255,255,252,255,31,0,0,255,255,255,1,0,0,0,0,0,0,0,0,253,31,0,0,0,0,0,0,240,3,255,127,255,255,255,255,255,255,255,239,255,223,225,255,207,255,254,254,238,159,249,255,255,253,197,227,159,89,128,176,207,255,3,0,238,135,249,255,255,253,109,195,135,25,2,94,192,255,63,0,238,191,251,255,255,253,237,227,191,27,1,0,207,255,0,0,238,159,249,255,255,253,237,227,159,25,192,176,207,255,2,0,236,199,61,214,24,199,255,195,199,29,129,0,192,
+255,0,0,238,223,253,255,255,253,239,227,223,29,96,3,207,255,0,0,236,223,253,255,255,253,239,227,223,29,96,64,207,255,6,0,236,223,253,255,255,255,255,231,223,93,128,0,207,255,0,252,236,255,127,252,255,255,251,47,127,128,95,255,0,0,12,0,254,255,255,255,255,127,255,7,63,32,255,3,0,0,0,0,150,37,240,254,174,236,255,59,95,32,255,243,0,0,0,0,1,0,0,0,255,3,0,0,255,254,255,255,255,31,254,255,3,255,255,254,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,249,255,3,255,255,231,193,255,255,127,64,255,
+51,255,255,255,255,191,32,255,255,255,255,255,247,255,255,255,255,255,255,255,255,255,61,127,61,255,255,255,255,255,61,255,255,255,255,61,127,61,255,127,255,255,255,255,255,255,255,61,255,255,255,255,255,255,255,255,135,0,0,0,0,255,255,0,0,255,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,159,255,255,254,255,255,7,255,255,255,
+255,255,255,255,255,255,199,1,0,255,223,15,0,255,255,15,0,255,255,15,0,255,223,13,0,255,255,255,255,255,255,207,255,255,1,128,16,255,3,0,0,0,0,255,3,255,255,255,255,255,255,255,255,255,255,255,0,255,255,255,255,255,7,255,255,255,255,255,255,255,255,63,0,255,255,255,31,255,15,255,1,192,255,255,255,255,63,31,0,255,255,255,255,255,15,255,255,255,3,255,3,0,0,0,0,255,255,255,15,255,255,255,255,255,255,255,127,254,255,31,0,255,3,255,3,128,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,239,255,239,15,255,
+3,0,0,0,0,255,255,255,255,255,243,255,255,255,255,255,255,191,255,3,0,255,255,255,255,255,255,63,0,255,227,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,222,111,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255,255,63,63,255,255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,128,0,0,255,31,0,0,0,0,0,0,0,0,0,0,0,0,132,252,47,62,80,189,255,243,224,67,
+0,0,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,255,255,255,255,255,255,3,0,0,255,255,255,255,255,127,255,255,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,120,12,0,255,255,255,255,191,32,255,255,255,255,255,255,255,128,0,0,255,255,127,0,127,127,127,127,127,127,127,127,255,255,255,255,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,254,3,62,31,254,255,255,255,255,255,255,255,255,
+255,127,224,254,255,255,255,255,255,255,255,255,255,255,247,224,255,255,255,255,63,254,255,255,255,255,255,255,255,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,255,255,255,255,255,63,
+255,31,255,255,255,15,0,0,255,255,255,255,255,127,240,143,255,255,255,128,255,255,255,255,255,255,255,255,255,255,0,0,0,0,128,255,252,255,255,255,255,255,255,255,255,255,255,255,255,121,15,0,255,7,0,0,0,0,0,0,0,0,0,255,187,247,255,255,255,0,0,0,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,15,0,255,3,0,0,252,8,255,255,255,255,255,7,255,255,255,255,7,0,255,255,255,31,255,255,255,255,255,255,247,255,0,128,255,3,0,0,0,0,255,255,255,255,255,255,127,0,255,63,255,3,255,255,127,4,255,255,
+255,255,255,255,255,127,5,0,0,56,255,255,60,0,126,126,126,0,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,7,255,3,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,127,248,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,0,127,0,248,224,255,253,127,95,219,255,255,255,255,255,255,255,255,255,255,255,255,255,3,0,0,0,248,255,255,255,255,255,255,255,255,
+255,255,255,255,63,0,0,255,255,255,255,255,255,255,255,252,255,255,255,255,255,255,0,0,0,0,0,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,223,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,0,0,255,3,254,255,255,7,254,255,255,7,192,255,255,255,255,255,255,255,255,255,255,127,252,252,252,28,0,0,0,0,255,239,255,255,127,255,255,183,255,63,255,63,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,255,255,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,31,255,255,255,255,255,255,1,0,0,0,0,0,255,255,255,127,0,0,255,255,255,7,0,0,0,0,0,0,255,255,255,63,255,255,255,255,15,255,62,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,3,0,0,0,0,0,0,0,0,0,0,63,253,255,255,255,255,191,145,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,63,0,255,255,255,3,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,192,0,0,0,0,0,0,0,0,111,240,239,254,255,255,15,0,0,0,0,0,255,
+255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,255,63,0,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,192,255,0,0,252,255,255,255,255,255,255,1,0,0,255,255,255,1,255,3,255,255,255,255,255,255,199,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,30,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,63,0,255,3,0,0,0,0,0,0,255,255,
+255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,31,0,255,255,255,255,255,127,0,0,248,255,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,
+255,255,255,255,255,255,223,255,255,255,255,255,255,255,255,223,100,222,255,235,239,255,255,255,255,255,255,255,191,231,223,223,255,255,255,123,95,252,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,255,255,255,253,255,255,247,255,255,255,247,255,255,223,255,255,255,223,255,255,127,255,255,255,127,255,255,255,253,255,255,255,253,255,255,247,207,255,255,255,255,255,255,239,255,
+255,255,150,254,247,10,132,234,150,170,150,247,247,94,255,251,255,15,238,251,255,15,0,0,0,0,0,0,0,0,18,16,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,16,16,34,35,16,36,37,38,39,40,41,42,43,16,44,45,46,17,47,48,17,17,49,17,17,17,50,51,52,53,54,55,56,57,17,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,59,16,60,61,62,63,64,65,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,66,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,67,16,16,68,16,69,70,71,16,72,16,73,16,16,16,16,74,75,76,77,16,16,78,16,79,80,16,16,16,16,81,16,16,16,16,16,16,16,16,16,16,16,16,16,82,16,16,16,16,16,16,16,16,
+16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,83,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,84,85,86,87,
+16,16,88,89,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,90,16,91,92,93,94,95,96,97,98,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,254,255,0,252,1,0,0,248,1,0,0,120,0,0,0,0,255,251,223,251,0,0,128,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,60,0,252,255,224,175,255,255,255,255,255,255,
+255,255,255,255,223,255,255,255,255,255,32,64,176,0,0,0,0,0,0,0,0,0,0,0,0,0,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,134,254,255,255,255,0,64,73,0,0,0,0,0,24,0,223,255,0,200,0,0,0,0,0,0,0,1,0,60,0,0,0,0,0,0,0,0,0,0,0,0,16,224,1,30,0,96,255,191,0,0,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,207,3,0,0,0,3,0,32,255,127,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,0,0,0,16,0,32,30,0,48,0,1,0,0,0,0,0,0,0,0,16,
+0,32,0,0,0,0,252,15,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,3,0,0,0,0,0,0,0,0,16,0,32,0,0,0,0,253,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,255,7,0,0,0,0,0,0,0,0,0,32,0,0,0,0,0,255,0,0,0,0,0,0,0,16,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,0,63,2,0,0,0,0,0,0,0,0,0,4,0,0,0,0,16,0,0,0,0,0,0,128,0,128,192,223,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,31,0,0,0,0,0,0,254,255,255,255,0,252,255,255,0,0,0,0,0,0,0,0,252,0,0,0,0,0,0,192,255,223,255,7,0,0,0,0,0,0,0,0,0,0,128,6,0,252,0,0,24,62,0,0,128,191,
+0,204,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,96,255,255,255,31,0,0,255,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,0,0,1,0,0,24,0,0,0,0,0,0,0,0,0,56,0,0,0,0,16,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,0,0,254,127,47,0,0,255,3,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,49,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,196,255,255,255,255,0,0,0,192,0,0,0,0,0,0,0,0,1,0,224,159,0,0,0,0,127,
+63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,16,0,0,252,255,255,255,31,0,0,0,0,0,12,0,0,0,0,0,0,64,0,12,240,0,0,0,0,0,0,192,248,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,255,0,255,255,255,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,160,3,224,0,224,0,224,0,96,128,248,255,255,255,252,255,255,255,255,255,127,31,252,241,127,255,127,0,0,255,255,255,3,0,0,255,255,255,255,1,0,123,3,208,193,175,66,0,12,31,188,255,255,0,0,0,0,0,2,255,
+255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,127,0,0,0,255,7,0,0,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,252,255,255,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,31,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,135,3,254,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,127,255,15,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255,255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15,30,255,255,255,1,252,193,224,0,0,0,0,0,0,0,0,0,0,0,30,1,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,
+15,0,0,0,255,255,255,127,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,127,0,0,0,0,0,0,192,0,224,0,0,0,0,0,0,0,0,0,0,0,128,15,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,127,0,3,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,68,8,0,0,0,15,255,3,0,0,0,0,0,0,240,0,0,0,0,0,0,0,0,0,16,192,
+0,0,255,255,3,7,0,0,0,0,0,248,0,0,0,0,8,128,0,0,0,0,0,0,0,0,0,0,8,0,255,63,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,0,0,128,11,0,0,0,0,0,0,0,128,2,0,0,192,0,0,67,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,252,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,255,255,
+255,3,127,0,255,255,255,255,247,255,127,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,254,255,0,252,1,0,0,248,1,0,0,248,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,0,48,135,255,255,255,255,255,143,255,0,0,0,0,0,0,224,255,255,7,255,15,0,0,0,0,0,0,255,255,255,255,255,63,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,143,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,255,0,255,1,0,0,0,
+224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,63,252,255,63,0,0,0,3,0,0,0,0,0,0,254,3,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,225,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,7,0,0,0,0,0,
+0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,127,0,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,8,0,0,0,8,0,0,32,
+0,0,0,32,0,0,128,0,0,0,128,0,0,0,2,0,0,0,2,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255,127,254,127,254,255,254,255,0,0,0,0,255,7,255,255,255,127,255,255,255,255,255,255,255,15,255,255,255,255,255,7,0,0,0,0,0,0,0,0,192,255,255,255,7,0,255,255,255,255,255,7,255,1,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,191,255,255,255,255,255,255,255,255,31,255,255,15,0,255,
+255,255,255,223,7,0,0,255,255,1,0,255,255,255,255,255,255,255,127,253,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,30,255,255,255,255,255,255,255,63,15,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,255,255,255,255,255,255,255,255,225,255,0,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,1,0,0,0,2,
+0,0,0,4,0,0,0,0,0,0,0,80,197,1,0,248,168,1,0,160,146,1,0,200,124,1,0,72,103,1,0,168,82,1,0,32,64,1,0,232,144,2,0,160,128,2,0,128,112,2,0,48,93,2,0,224,79,2,0,168,68,2,0,32,56,2,0,144,44,2,0,160,32,2,0,96,22,2,0,248,10,2,0,0,3,2,0,64,250,1,0,96,237,1,0,152,227,1,0,248,219,1,0,240,216,1,0,168,213,1,0,136,210,1,0,200,207,1,0,64,204,1,0,176,200,1,0,32,197,1,0,240,191,1,0,168,188,1,0,104,186,1,0,96,184,1,0,152,182,1,0,16,180,1,0,136,177,1,0,200,174,1,0,216,171,1,0,152,168,1,0,168,164,1,0,32,162,1,0,88,
+160,1,0,192,158,1,0,176,156,1,0,24,155,1,0,152,153,1,0,160,151,1,0,32,149,1,0,136,146,1,0,216,142,1,0,240,139,1,0,88,138,1,0,144,136,1,0,128,134,1,0,216,132,1,0,88,131,1,0,160,129,1,0,88,127,1,0,168,124,1,0,88,120,1,0,64,118,1,0,32,116,1,0,160,114,1,0,192,112,1,0,56,111,1,0,88,109,1,0,128,107,1,0,176,105,1,0,40,103,1,0,216,99,1,0,216,97,1,0,144,95,1,0,96,93,1,0,224,91,1,0,16,90,1,0,72,88,1,0,152,86,1,0,152,84,1,0,128,82,1,0,32,79,1,0,72,77,1,0,136,75,1,0,24,74,1,0,88,72,1,0,208,70,1,0,56,69,1,0,152,
+67,1,0,24,66,1,0,224,63,1,0,24,61,1,0,0,59,1,0,40,57,1,0,200,55,1,0,64,54,1,0,8,53,1,0,240,51,1,0,136,147,2,0,0,146,2,0,168,144,2,0,184,141,2,0,24,140,2,0,88,138,2,0,0,137,2,0,120,135,2,0,64,134,2,0,232,132,2,0,120,131,2,0,200,129,2,0,80,128,2,0,64,125,2,0,168,123,2,0,72,122,2,0,240,120,2,0,152,119,2,0,56,118,2,0,248,116,2,0,200,115,2,0,80,114,2,0,96,112,2,0,120,109,2,0,56,108,2,0,248,106,2,0,232,105,2,0,136,104,2,0,88,102,2,0,240,100,2,0,168,99,2,0,216,94,2,0,232,92,2,0,48,90,2,0,184,88,2,0,104,
+87,2,0,96,86,2,0,64,85,2,0,64,84,2,0,56,83,2,0,56,82,2,0,216,80,2,0,208,79,2,0,176,77,2,0,128,76,2,0,128,75,2,0,168,74,2,0,168,73,2,0,216,72,2,0,232,71,2,0,0,0,0,0,8,0,0,0,0,0,0,0,160,0,0,0,170,0,0,0,32,0,0,0,58,0,0,0,70,0,0,0,12,0,0,0,34,0,0,0,36],"i8",L,l.J);D([64,0,0,0,174,0,0,0,66,0,0,0,140,0,0,0,34,0,0,0,178,0,0,0,0,0,0,0,0,0,0,0,106,0,0,0,0,0,0,0,62,0,0,0,44,0,0,0,12,0,0,0,66,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,104,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,
+0,0,255,255,255,255,0,0,0,0,0,0,0,0,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,105,108,108,45,99,111,110,100,105,116,105,111,110,101,100,0,12,0,8,0,140,0,8,0,76,0,8,0,204,0,8,0,44,0,8,0,172,0,8,0,108,0,8,0,236,0,8,0,28,0,8,0,156,0,8,0,92,0,8,0,220,0,8,0,60,0,8,0,188,0,8,0,124,0,8,0,252,0,8,0,2,0,8,0,130,0,8,0,66,0,8,0,194,0,8,0,34,0,8,0,162,0,8,0,98,0,8,0,226,0,8,0,18,0,8,0,146,0,8,0,82,0,8,0,210,0,8,0,50,0,8,0,178,0,8,0,114,0,8,0,242,0,8,0,10,0,8,0,138,0,8,0,74,0,8,0,202,0,8,0,42,0,8,0,170,
+0,8,0,106,0,8,0,234,0,8,0,26,0,8,0,154,0,8,0,90,0,8,0,218,0,8,0,58,0,8,0,186,0,8,0,122,0,8,0,250,0,8,0,6,0,8,0,134,0,8,0,70,0,8,0,198,0,8,0,38,0,8,0,166,0,8,0,102,0,8,0,230,0,8,0,22,0,8,0,150,0,8,0,86,0,8,0,214,0,8,0,54,0,8,0,182,0,8,0,118,0,8,0,246,0,8,0,14,0,8,0,142,0,8,0,78,0,8,0,206,0,8,0,46,0,8,0,174,0,8,0,110,0,8,0,238,0,8,0,30,0,8,0,158,0,8,0,94,0,8,0,222,0,8,0,62,0,8,0,190,0,8,0,126,0,8,0,254,0,8,0,1,0,8,0,129,0,8,0,65,0,8,0,193,0,8,0,33,0,8,0,161,0,8,0,97,0,8,0,225,0,8,0,17,0,8,0,145,0,8,
+0,81,0,8,0,209,0,8,0,49,0,8,0,177,0,8,0,113,0,8,0,241,0,8,0,9,0,8,0,137,0,8,0,73,0,8,0,201,0,8,0,41,0,8,0,169,0,8,0,105,0,8,0,233,0,8,0,25,0,8,0,153,0,8,0,89,0,8,0,217,0,8,0,57,0,8,0,185,0,8,0,121,0,8,0,249,0,8,0,5,0,8,0,133,0,8,0,69,0,8,0,197,0,8,0,37,0,8,0,165,0,8,0,101,0,8,0,229,0,8,0,21,0,8,0,149,0,8,0,85,0,8,0,213,0,8,0,53,0,8,0,181,0,8,0,117,0,8,0,245,0,8,0,13,0,8,0,141,0,8,0,77,0,8,0,205,0,8,0,45,0,8,0,173,0,8,0,109,0,8,0,237,0,8,0,29,0,8,0,157,0,8,0,93,0,8,0,221,0,8,0,61,0,8,0,189,0,8,0,125,
+0,8,0,253,0,8,0,19,0,9,0,19,1,9,0,147,0,9,0,147,1,9,0,83,0,9,0,83,1,9,0,211,0,9,0,211,1,9,0,51,0,9,0,51,1,9,0,179,0,9,0,179,1,9,0,115,0,9,0,115,1,9,0,243,0,9,0,243,1,9,0,11,0,9,0,11,1,9,0,139,0,9,0,139,1,9,0,75,0,9,0,75,1,9,0,203,0,9,0,203,1,9,0,43,0,9,0,43,1,9,0,171,0,9,0,171,1,9,0,107,0,9,0,107,1,9,0,235,0,9,0,235,1,9,0,27,0,9,0,27,1,9,0,155,0,9,0,155,1,9,0,91,0,9,0,91,1,9,0,219,0,9,0,219,1,9,0,59,0,9,0,59,1,9,0,187,0,9,0,187,1,9,0,123,0,9,0,123,1,9,0,251,0,9,0,251,1,9,0,7,0,9,0,7,1,9,0,135,0,9,
+0,135,1,9,0,71,0,9,0,71,1,9,0,199,0,9,0,199,1,9,0,39,0,9,0,39,1,9,0,167,0,9,0,167,1,9,0,103,0,9,0,103,1,9,0,231,0,9,0,231,1,9,0,23,0,9,0,23,1,9,0,151,0,9,0,151,1,9,0,87,0,9,0,87,1,9,0,215,0,9,0,215,1,9,0,55,0,9,0,55,1,9,0,183,0,9,0,183,1,9,0,119,0,9,0,119,1,9,0,247,0,9,0,247,1,9,0,15,0,9,0,15,1,9,0,143,0,9,0,143,1,9,0,79,0,9,0,79,1,9,0,207,0,9,0,207,1,9,0,47,0,9,0,47,1,9,0,175,0,9,0,175,1,9,0,111,0,9,0,111,1,9,0,239,0,9,0,239,1,9,0,31,0,9,0,31,1,9,0,159,0,9,0,159,1,9,0,95,0,9,0,95,1,9,0,223,0,9,0,
+223,1,9,0,63,0,9,0,63,1,9,0,191,0,9,0,191,1,9,0,127,0,9,0,127,1,9,0,255,0,9,0,255,1,9,0,0,0,7,0,64,0,7,0,32,0,7,0,96,0,7,0,16,0,7,0,80,0,7,0,48,0,7,0,112,0,7,0,8,0,7,0,72,0,7,0,40,0,7,0,104,0,7,0,24,0,7,0,88,0,7,0,56,0,7,0,120,0,7,0,4,0,7,0,68,0,7,0,36,0,7,0,100,0,7,0,20,0,7,0,84,0,7,0,52,0,7,0,116,0,7,0,3,0,8,0,131,0,8,0,67,0,8,0,195,0,8,0,35,0,8,0,163,0,8,0,99,0,8,0,227,0,8,0,184,40,0,0,88,102,0,0,1,1,0,0,30,1,0,0,15,0,0,0,0,0,0,0,0,0,5,0,16,0,5,0,8,0,5,0,24,0,5,0,4,0,5,0,20,0,5,0,12,0,5,0,28,0,
+5,0,2,0,5,0,18,0,5,0,10,0,5,0,26,0,5,0,6,0,5,0,22,0,5,0,14,0,5,0,30,0,5,0,1,0,5,0,17,0,5,0,9,0,5,0,25,0,5,0,5,0,5,0,21,0,5,0,13,0,5,0,29,0,5,0,3,0,5,0,19,0,5,0,11,0,5,0,27,0,5,0,7,0,5,0,23,0,5,0,80,45,0,0,208,102,0,0,0,0,0,0,30,0,0,0,15,0,0,0,0,0,0,0,0,0,0,0,72,103,0,0,0,0,0,0,19,0,0,0,7,0,0,0,0,0,0,0,46,0,0,0,6,0,0,0,80,0,0,0,18,0,0,0,34,0,0,0,82,0,0,0,22,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,28,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,52,0,0,0,46,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,193,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,176,193,0,0,0,0,0,0,0,0,0,0,0,0,0,160,1,0,0,16,0,0,0,1,0,0,0,0,0,0,0,0,16,0,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,176,193,0,0,0,0,0,0,0,0,0,0,0,16,64,144,37,0,0,147,0,0,0,1,0,0,0,0,0,0,0,0,32,3,2,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,144,195,0,0,0,0,0,0,0,0,0,0,0,16,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,16,0,0,0,0,0,0,0,0,0,0,0,0,16,64,128,101,0,0,8,0,0,0,1,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,56,0,0,0,32,0,0,0,8,0,0,0,90,0,0,0,86,0,0,0,32,0,0,0,232,22,2,0,96,69,2,0,248,56,2,0,64,45,2,0,64,33,2,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,124,0,0,0,
+112,0,0,0,2,0,0,0,0,0,0,0,50,0,0,0,0,0,0,0,118,0,0,0,108,0,0,0,166,0,0,0,82,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,102,0,0,0,110,0,0,0,14,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,0,0,0,0,0,0,0,14,0,0,0,2,0,0,0,2,0,0,0,50,0,0,0,28,0,0,0,14,0,0,0,8,124,1,0,232,119,1,0,248,117,1,0,104,65,3,0,88,114,1,0,136,112,1,0,240,110,1,0,16,109,1,0,104,65,3,0,32,107,1,0,72,105,1,0,104,65,3,0,128,102,1,0,112,99,1,0,128,97,1,0,40,95,1,0,24,93,1,0,136,91,1,0,184,89,1,0,24,88,1,0,56,86,1,0,80,84,1,0,32,82,
+1,0,208,78,1,0,24,77,1,0,80,75,1,0,120,74,1,0,32,72,1,0,168,70,1,0,8,69,1,0,104,67,1,0,192,65,1,0,112,63,1,0,200,60,1,0,104,65,3,0,144,58,1,0,240,56,1,0,136,55,1,0,232,53,1,0,104,65,3,0,224,52,1,0,208,51,1,0,72,147,2,0,216,145,2,0,200,60,1,0,104,65,3,0,96,144,2,0,128,141,2,0,160,139,2,0,240,137,2,0,112,136,2,0,72,135,2,0,32,134,2,0,200,132,2,0,88,131,2,0,168,129,2,0,48,128,2,0,104,65,3,0,8,125,2,0,120,123,2,0,24,122,2,0,184,120,2,0,104,119,2,0,104,65,3,0,16,118,2,0,216,116,2,0,176,115,2,0,56,114,
+2,0,64,112,2,0,96,109,2,0,40,108,2,0,216,106,2,0,184,105,2,0,200,104,2,0,8,103,2,0,224,100,2,0,200,60,1,0,104,65,3,0,144,99,2,0,192,94,2,0,200,92,2,0,24,88,1,0,104,65,3,0,248,89,2,0,144,88,2,0,80,87,2,0,48,86,2,0,56,85,2,0,48,84,2,0,40,83,2,0,240,81,2,0,208,80,2,0,192,79,2,0,24,88,1,0,104,65,3,0,128,77,2,0,112,76,2,0,112,75,2,0,144,74,2,0,232,73,2,0,192,72,2,0,208,71,2,0,216,70,2,0,200,60,1,0,104,65,3,0,168,69,2,0,128,68,2,0,88,66,2,0,32,65,2,0,24,64,2,0,240,62,2,0,216,61,2,0,8,61,2,0,0,60,2,0,176,
+58,2,0,128,57,2,0,200,60,1,0,104,65,3,0,240,55,2,0,8,54,2,0,104,65,3,0,0,53,2,0,208,51,2,0,224,50,2,0,208,49,2,0,0,49,2,0,24,48,2,0,24,47,2,0,176,45,2,0,96,44,2,0,104,65,3,0,144,42,2,0,104,65,3,0,88,41,2,0,232,39,2,0,224,38,2,0,224,37,2,0,0,37,2,0,8,36,2,0,200,60,1,0,104,65,3,0,240,34,2,0,104,65,3,0,184,33,2,0,128,32,2,0,80,30,2,0,56,29,2,0,80,28,2,0,168,27,2,0,240,26,2,0,24,88,1,0,104,65,3,0,24,26,2,0,104,65,3,0,80,25,2,0,56,24,2,0,72,23,2,0,56,22,2,0,64,20,2,0,48,19,2,0,32,18,2,0,104,65,3,0,0,17,
+2,0,128,15,2,0,112,14,2,0,184,13,2,0,232,12,2,0,240,11,2,0,208,10,2,0,168,9,2,0,104,65,3,0,240,8,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,125,2,0,136,109,2,0,64,90,2,0,0,0,0,0,0,0,0,0,4,0,0,0,224,77,2,0,0,0,0,0,0,0,0,0,128,66,2,0,136,109,2,0,64,90,2,0,0,0,0,0,40,54,2,0,5,0,0,0,224,77,2,0,0,0,0,0,192,42,2,0,112,30,2,0,136,109,2,0,88,20,2,0,0,0,0,0,0,0,0,0,6,0,0,0,224,77,2,0,184,9,2,0,0,0,0,0,96,1,2,0,136,109,2,0,88,20,2,0,0,0,0,0,40,54,2,0,7,0,0,0,224,77,2,0,184,9,2,0,192,42,2,0,104,248,1,0,216,235,
+1,0,88,20,2,0,0,0,0,0,0,0,0,0,10,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,56,219,1,0,216,235,1,0,88,20,2,0,0,0,0,0,192,42,2,0,11,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,240,215,1,0,216,235,1,0,240,212,1,0,0,0,0,0,0,0,0,0,8,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,208,209,1,0,216,235,1,0,240,212,1,0,0,0,0,0,192,42,2,0,9,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,56,207,1,0,56,207,1,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,128,203,1,0,0,0,0,0,0,0,0,0,224,199,1,0,56,207,1,0,184,9,2,0,0,0,0,0,0,0,0,0,14,0,0,0,128,203,1,0,184,
+9,2,0,0,0,0,0,56,196,1,0,56,207,1,0,184,9,2,0,0,0,0,0,40,54,2,0,15,0,0,0,128,203,1,0,184,9,2,0,192,42,2,0,224,190,1,0,56,207,1,0,0,0,0,0,0,0,0,0,40,54,2,0,13,0,0,0,128,203,1,0,0,0,0,0,192,42,2,0,248,187,1,0,248,187,1,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,224,77,2,0,0,0,0,0,0,0,0,0,248,185,1,0,248,187,1,0,184,9,2,0,0,0,0,0,0,0,0,0,18,0,0,0,224,77,2,0,184,9,2,0,0,0,0,0,200,183,1,0,248,187,1,0,184,9,2,0,0,0,0,0,40,54,2,0,19,0,0,0,224,77,2,0,184,9,2,0,192,42,2,0,200,181,1,0,248,187,1,0,0,0,0,0,112,179,1,
+0,0,0,0,0,20,0,0,0,224,77,2,0,0,0,0,0,0,0,0,0,216,176,1,0,248,187,1,0,184,9,2,0,112,179,1,0,0,0,0,0,22,0,0,0,224,77,2,0,184,9,2,0,0,0,0,0,0,174,1,0,248,187,1,0,184,9,2,0,112,179,1,0,40,54,2,0,23,0,0,0,224,77,2,0,184,9,2,0,192,42,2,0,80,171,1,0,248,187,1,0,0,0,0,0,112,179,1,0,40,54,2,0,21,0,0,0,224,77,2,0,0,0,0,0,192,42,2,0,32,168,1,0,248,187,1,0,0,0,0,0,0,0,0,0,40,54,2,0,17,0,0,0,224,77,2,0,0,0,0,0,192,42,2,0,16,164,1,0,144,161,1,0,184,9,2,0,0,0,0,0,0,0,0,0,26,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,
+232,159,1,0,144,161,1,0,184,9,2,0,0,0,0,0,192,42,2,0,27,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,64,158,1,0,144,161,1,0,0,0,0,0,0,0,0,0,192,42,2,0,25,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,96,156,1,0,144,161,1,0,184,154,1,0,0,0,0,0,0,0,0,0,24,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,16,153,1,0,48,151,1,0,184,9,2,0,0,0,0,0,0,0,0,0,30,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,200,148,1,0,48,151,1,0,184,9,2,0,0,0,0,0,192,42,2,0,31,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,24,146,1,0,48,151,1,0,0,0,0,0,0,0,0,0,192,42,2,
+0,29,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,112,142,1,0,48,151,1,0,184,154,1,0,0,0,0,0,0,0,0,0,28,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,144,139,1,0,144,139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,0,0,216,137,1,0,0,0,0,0,0,0,0,0,48,136,1,0,16,134,1,0,184,9,2,0,0,0,0,0,0,0,0,0,2,0,0,0,112,226,1,0,184,9,2,0,0,0,0,0,136,132,1,0,16,134,1,0,184,9,2,0,0,0,0,0,192,42,2,0,3,0,0,0,112,226,1,0,184,9,2,0,192,42,2,0,224,130,1,0,16,134,1,0,0,0,0,0,0,0,0,0,192,42,2,0,1,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,48,129,1,0,16,134,
+1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,226,1,0,0,0,0,0,0,0,0,0,0,127,1,0,32,124,1,0,8,120,1,0,0,0,0,0,192,42,2,0,33,0,0,0,112,226,1,0,0,0,0,0,192,42,2,0,16,118,1,0,224,115,1,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,216,137,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,18,0,0,0,34,0,0,0,184,0,0,0,22,0,0,0,48,0,0,0,32,57,1,0,184,55,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,18,0,0,0,34,0,0,0,52,0,0,0,0,0,0,0,38,0,0,0,
+100,111,116,32,112,105,99,32,112,108,117,103,105,110,58,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,134,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,0,96,0,0,0,24,0,0,0,10,0,0,0,68,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,
+0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,180,0,0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,73,0,49,1,83,0,127,1,48,1,105,0,120,1,255,0,129,1,83,2,130,1,131,1,132,1,133,1,134,1,84,2,135,1,136,1,137,1,86,2,138,1,87,2,139,1,140,1,142,1,221,1,143,1,89,2,144,1,91,2,145,1,146,1,147,1,96,2,148,1,99,2,150,1,105,2,151,1,104,2,152,1,153,1,156,1,111,2,157,1,114,2,159,1,117,2,166,1,128,2,167,1,168,1,169,1,131,2,172,1,173,1,174,1,136,2,175,1,176,1,177,1,138,2,178,1,139,2,183,1,146,
+2,184,1,185,1,188,1,189,1,196,1,198,1,196,1,197,1,197,1,198,1,199,1,201,1,199,1,200,1,200,1,201,1,202,1,204,1,202,1,203,1,203,1,204,1,241,1,243,1,241,1,242,1,242,1,243,1,244,1,245,1,246,1,149,1,247,1,191,1,32,2,158,1,134,3,172,3,136,3,173,3,137,3,174,3,138,3,175,3,140,3,204,3,142,3,205,3,143,3,206,3,153,3,69,3,153,3,190,31,163,3,194,3,247,3,248,3,250,3,251,3,96,30,155,30,223,0,223,0,158,30,223,0,89,31,81,31,91,31,83,31,93,31,85,31,95,31,87,31,188,31,179,31,204,31,195,31,236,31,229,31,252,31,243,31,
+58,2,101,44,59,2,60,2,61,2,154,1,62,2,102,44,65,2,66,2,67,2,128,1,68,2,137,2,69,2,140,2,244,3,184,3,249,3,242,3,253,3,123,3,254,3,124,3,255,3,125,3,192,4,207,4,38,33,201,3,42,33,107,0,43,33,229,0,50,33,78,33,131,33,132,33,96,44,97,44,98,44,107,2,99,44,125,29,100,44,125,2,109,44,81,2,110,44,113,2,111,44,80,2,112,44,82,2,114,44,115,44,117,44,118,44,126,44,63,2,127,44,64,2,242,44,243,44,125,167,121,29,139,167,140,167,141,167,101,2,170,167,102,2,199,16,39,45,205,16,45,45,118,3,119,3,156,3,181,0,146,3,
+208,3,152,3,209,3,166,3,213,3,160,3,214,3,154,3,240,3,161,3,241,3,149,3,245,3,207,3,215,3,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,3,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,
+0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,1,0,0,0,10,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,45,0,0,1,0,0,0,1,0,
+0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,1,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,19,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,23,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,
+51,51,51,51,51,227,63,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,25,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,24,0,0,0,0,0,0,0,0,1,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,154,153,153,153,153,153,217,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,128,102,64,123,20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,0,0,0,0,0,0,0,1,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,123,
+20,174,71,225,122,228,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,51,51,51,51,
+51,51,211,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,1,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,
+0,0,0,0,0,0,0,0,1,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,128,70,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,158,0,0,0,28,0,0,0,0,0,0,0,0,0,0,0,67,68,65,84,65,91,0,0,96,0,0,0,144,0,0,0,128,0,0,0,144,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,56,0,0,0,52,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,120,249,1,0,240,236,1,0,32,227,1,0,200,219,1,0,72,216,1,0,112,213,1,0,56,210,1,0,152,207,1,0,0,204,1,0,104,200,1,0,176,
+196,1,0,176,191,1,0,88,188,1,0,64,186,1,0,8,184,1,0,24,182,1,0,208,179,1,0,40,177,1,0,72,174,1,0,168,171,1,0,120,168,1,0,0,0,0,0,2,3,4,5,6,7,8,0,0,9,10,11,12,13,14,15,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,0,0,0,144,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,4,254,255,255,135,254,255,255,7,0,0,0,0,0,0,0,0,255,255,127,255,255,255,127,255,255,255,255,255,255,255,243,127,254,253,255,
+255,255,255,255,127,255,255,255,255,255,255,255,255,15,224,255,255,255,255,49,252,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,3,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,255,255,255,127,2,254,255,255,255,127,0,0,0,0,0,0,0,0,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,254,
+7,0,0,0,0,254,255,255,255,255,255,255,255,255,124,255,127,47,0,96,0,0,0,224,255,255,255,255,255,255,35,0,0,0,255,3,0,0,0,224,159,249,255,255,253,197,3,0,0,0,176,3,0,3,0,224,135,249,255,255,253,109,3,0,0,0,94,0,0,28,0,224,175,251,255,255,253,237,35,0,0,0,0,1,0,0,0,224,159,249,255,255,253,205,35,0,0,0,176,3,0,0,0,224,199,61,214,24,199,191,3,0,0,0,0,0,0,0,0,224,223,253,255,255,253,239,3,0,0,0,0,3,0,0,0,224,223,253,255,255,253,239,3,0,0,0,64,3,0,0,0,224,223,253,255,255,253,255,3,0,0,0,0,3,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,13,0,63,0,0,0,0,0,0,0,150,37,240,254,174,108,13,32,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,254,255,255,255,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,63,0,255,255,255,255,127,0,237,218,7,0,0,0,0,80,1,80,49,130,171,98,44,0,0,0,0,64,0,201,128,245,7,0,0,0,0,8,1,2,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,255,255,255,255,255,255,255,255,255,255,255,3,255,255,63,63,255,
+255,255,255,63,63,255,170,255,255,255,63,255,255,255,255,255,255,223,95,220,31,207,15,255,31,220,31,0,0,0,0,64,76,0,0,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,254,3,0,0,254,255,255,255,255,255,255,255,255,255,31,0,254,255,255,255,255,255,255,255,255,255,255,7,224,255,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,
+255,255,255,255,255,255,255,255,255,15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,255,7,254,255,255,135,254,255,255,7,0,0,0,0,0,0,128,0,255,255,127,255,255,255,127,255,255,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255,1,0,248,3,0,3,0,0,0,0,0,255,255,255,255,255,255,255,255,63,0,0,0,3,0,0,0,192,215,255,255,251,255,255,255,255,127,127,84,253,255,15,0,254,223,255,255,255,255,255,255,255,255,254,223,255,255,255,255,123,0,255,255,255,255,255,255,159,25,255,255,255,207,63,3,0,0,0,0,0,0,254,
+255,255,255,127,2,254,255,255,255,127,0,254,255,251,255,255,187,22,0,255,255,255,7,7,0,0,0,0,0,254,255,255,7,255,255,7,0,255,3,255,255,255,255,255,255,255,255,255,124,255,127,239,255,255,61,255,3,238,255,255,255,255,255,255,243,255,63,30,255,207,255,0,0,238,159,249,255,255,253,197,211,159,57,128,176,207,255,3,0,228,135,249,255,255,253,109,211,135,57,0,94,192,255,31,0,238,175,251,255,255,253,237,243,191,59,0,0,193,255,0,0,238,159,249,255,255,253,205,243,143,57,192,176,195,255,0,0,236,199,61,214,24,
+199,191,195,199,61,128,0,128,255,0,0,238,223,253,255,255,253,239,195,223,61,96,0,195,255,0,0,236,223,253,255,255,253,239,195,223,61,96,64,195,255,0,0,236,223,253,255,255,253,255,195,207,61,128,0,195,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,127,255,7,255,127,255,3,0,0,0,0,150,37,240,254,174,108,255,59,95,63,255,3,0,0,0,0,0,0,0,3,255,3,160,194,255,254,255,255,255,3,254,255,223,15,191,254,255,63,254,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,31,2,0,0,
+0,160,0,0,0,254,255,62,0,254,255,255,255,255,255,255,255,255,255,31,102,254,255,255,255,255,255,255,255,255,255,255,119,25,3,26,27,28,29,30,0,0,31,32,33,34,35,36,37,16,17,0,0,0,0,0,0,0,0,0,0,0,0,18,19,38,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,39,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,23,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,102,0,0,0,0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,45,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,46,57,57,0,0,0,0,0,154,153,153,153,153,153,169,63,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,98,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,28,0,0,0,114,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,58,0,0,0,30,0,0,0,76,0,0,0,88,0,0,0,68,0,0,0,20,0,0,0,24,0,0,0,126,0,0,0,146,0,0,0,32,0,0,0,96,0,0,0,24,0,0,0,26,0,0,0,16,0,0,0,4,0,0,0,22,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,
+3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
+22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,10,0,0,0,24,0,0,0,1],"i8",L,l.J+10256);D([21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,
+27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
+22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,208,1,0,8,0,0,0,3,0,0,0,144,204,1,0,200,201,1,0,11,0,0,0,6,0,0,0,96,197,1,0,64,192,1,0,2,0,0,0,1,0,0,0,0,189,1,0,144,186,1,0,4,0,0,0,2,0,0,0,136,184,1,0,192,182,1,0,4,0,0,0,4,0,0,0,80,180,1,0,216,177,1,0,5,0,0,0,5,0,0,0,56,175,1,0,80,172,1,0,4,0,0,0,7,0,0,0,24,169,1,0,72,165,1,0,5,0,0,0,9,
+0,0,0,96,162,1,0,224,159,1,0,4,0,0,0,10,0,0,0,240,158,1,0,88,156,1,0,4,0,0,0,12,0,0,0,80,155,1,0,1,208,209,210,211,212,213,214,215,216,217,0,0,0,0,0,32,0,0,0,9,0,0,0,10,0,0,0,13,0,0,0,11,0,0,0,12,0,0,0,133,0,0,0,0,32,0,0,1,32,0,0,2,32,0,0,3,32,0,0,4,32,0,0,5,32,0,0,6,32,0,0,8,32,0,0,9,32,0,0,10,32,0,0,40,32,0,0,41,32,0,0,95,32,0,0,0,48,0,0,0,0,0,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,20,0,0,0,32,0,0,0,1,0,
+0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,5,5,5,5,5,
+5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,7,7,7,7,0,0,0,0,0,0,0,0,0,1,1,188,0,0,0,186,0,0,0,84,0,0,0,12,0,0,0,14,0,0,0,84,0,0,0,70,0,0,0,72,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,4,0,0,0,4,0,0,0,42,0,0,0,4,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,0,0,0,0,40,0,0,0,108,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,1,0,0,48,
+1,0,0,176,0,0,0,0,0,0,0,120,109,108,61,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,0,0,0,0,0,0,0,56,227,1,0,18,0,0,0,208,219,1,0,66,0,0,0,1,0,0,0,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,0,0,25,17,18,19,21,32,49,78,29,30,96,31,1,50,86,25,25,25,2,25,52,51,49,198,214,4,104,58,32,55,32,71,32,63,32,32,93,32,32,5,6,87,88,52,4,7,8,9,10,11,
+12,13,80,94,95,4,85,98,5,6,101,80,103,89,7,8,9,10,11,12,13,105,4,83,55,106,107,54,25,17,18,19,21,57,60,4,5,6,58,84,65,0,7,8,9,10,11,12,13,5,6,0,90,0,0,7,8,9,10,11,12,13,4,39,41,43,0,46,0,61,0,0,0,0,0,4,5,6,0,63,0,0,7,8,9,10,11,12,13,5,6,0,0,0,0,7,8,9,10,11,12,13,4,0,71,0,0,66,75,0,0,0,0,0,0,4,5,6,0,76,77,68,7,8,9,10,11,12,13,5,6,4,0,0,0,7,8,9,10,11,12,13,0,0,0,5,6,0,0,0,0,7,8,9,10,11,12,13,38,40,42,44,45,47,48,0,0,0,0,0,0,0,0,0,38,40,42,45,0,0,0,0,0,2,3,3,1,1,2,1,1,1,3,3,3,3,3,3,3,1,1,1,1,1,1,1,1,
+1,1,1,1,1,1,2,1,1,2,0,6,1,3,3,3,3,1,0,1,2,3,0,4,1,2,3,0,4,0,4,0,4,0,3,2,1,2,1,2,1,0,0,0,0,0,0,0,39,40,40,40,41,42,42,43,43,43,43,43,43,43,43,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,58,59,59,61,60,62,62,62,62,62,63,63,64,64,64,66,65,67,67,67,69,68,70,68,71,68,72,68,73,73,74,74,75,75,0,0,0,0,0,0,184,255,184,255,239,255,191,0,246,255,255,255,38,0,0,0,42,0,1,0,41,0,184,255,184,255,2,0,44,0,184,255,184,255,184,255,184,255,184,255,254,255,96,0,184,255,22,0,14,0,184,255,191,255,184,255,184,255,185,
+255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,0,0,0,0,0,0,11,0,184,255,169,0,8,0,184,255,184,255,6,0,184,255,184,255,184,255,184,255,184,255,184,255,184,255,3,0,169,0,184,255,169,0,169,0,169,0,169,0,169,0,169,0,169,0,184,255,250,255,184,255,5,0,247,255,184,255,184,255,184,255,184,255,169,0,169,0,169,0,169,0,10,0,32,0,9,0,60,0,15,0,73,0,12,0,100,0,113,0,17,0,140,0,153,0,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,255,184,
+255,184,255,184,255,184,255,184,255,184,255,184,255,26,0,184,255,149,0,184,255,21,0,43,0,184,255,34,0,184,255,26,0,13,0,30,0,184,255,10,0,184,255,184,255,184,255,184,255,53,0,184,255,184,255,50,0,184,255,184,255,184,255,37,0,184,255,21,0,184,255,61,0,65,0,184,255,66,0,184,255,184,255,184,255,184,255,184,255,255,3,14,15,16,33,53,34,56,35,59,20,62,36,64,22,67,23,69,24,37,26,70,27,28,72,73,74,81,82,100,99,102,91,92,79,97,0,0,0,0,4,43,0,33,32,0,17,19,21,25,27,29,23,0,5,7,43,43,43,0,43,0,0,9,8,37,0,0,
+1,31,2,6,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,34,3,35,18,10,38,20,11,39,22,13,41,24,16,26,12,40,28,14,30,15,0,47,0,44,0,43,63,0,45,0,43,0,49,42,36,62,46,61,0,54,52,0,56,48,65,0,50,0,60,0,0,59,0,64,51,55,53,57,0,0,0,0,2,2,2,2,2,15,12,72,0,3,81,8,1,8,79,17,18,19,7,21,11,30,12,10,30,12,97,15,38,14,40,5,42,16,44,45,6,47,48,26,27,28,29,11,12,32,33,34,35,36,37,38,31,23,24,12,22,4,26,27,10,31,25,80,32,33,34,35,36,37,38,10,12,75,14,10,10,39,80,80,80,80,80,41,43,12,26,27,15,75,46,255,32,33,34,35,36,37,38,26,27,
+255,80,255,255,32,33,34,35,36,37,38,12,17,18,19,255,21,255,19,255,255,255,255,255,12,26,27,255,16,255,255,32,33,34,35,36,37,38,26,27,255,255,255,255,32,33,34,35,36,37,38,12,255,5,255,255,17,9,255,255,255,255,255,255,12,26,27,255,20,21,18,32,33,34,35,36,37,38,26,27,12,255,255,255,32,33,34,35,36,37,38,255,255,255,26,27,255,255,255,255,32,33,34,35,36,37,38,17,18,19,20,21,22,23,255,255,255,255,255,255,255,255,255,33,34,35,36,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,136,76,1,0,1,0,0,0,224,1,0,0,192,46,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,64,166,1,0,1,0,0,0,72,4,0,0,224,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,2,2,0,1,0,0,0,224,39,0,0,0,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,102,2,0,1,0,0,0,40,48,0,0,32,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,56,125,1,0,255,255,255,255,232,56,0,0,64,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,192,73,1,0,1,0,0,0,176,77,0,0,96,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,161,1,0,1,
+0,0,0,160,101,0,0,128,47,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,233,1,0,1,0,0,0,48,112,0,0,160,47,0,0,4,0,0,0,88,190,1,0,1,0,0,0,96,0,0,0,160,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,208,59,1,0,168,34,1,0,0,0,0,0,0,0,0,0,56,179,1,0,184,34,1,0,184,185,1,0,200,34,1,0,15,0,0,0,88,71,1,0,1,0,0,0,176,111,0,0,0,0,0,0,16,0,0,0,96,26,2,0,1,0,0,0,176,111,0,0,0,0,0,0,17,0,0,0,208,208,1,0,1,0,0,0,176,111,0,0,0,0,0,0,17,0,0,0,176,178,1,0,1,0,0,0,176,111,0,0,0,0,0,0,17,0,0,0,32,
+154,1,0,1,0,0,0,176,111,0,0,0,0,0,0,19,0,0,0,192,131,1,0,1,0,0,0,208,111,0,0,0,0,0,0,20,0,0,0,16,110,1,0,1,0,0,0,208,111,0,0,0,0,0,0,21,0,0,0,24,89,1,0,1,0,0,0,208,111,0,0,0,0,0,0,21,0,0,0,232,69,1,0,1,0,0,0,208,111,0,0,0,0,0,0,21,0,0,0,120,52,1,0,1,0,0,0,208,111,0,0,0,0,0,0,22,0,0,0,136,133,2,0,1,0,0,0,152,111,0,0,0,0,0,0,23,0,0,0,144,117,2,0,1,0,0,0,152,111,0,0,0,0,0,0,24,0,0,0,136,101,2,0,1,0,0,0,152,111,0,0,0,0,0,0,24,0,0,0,152,83,2,0,1,0,0,0,152,111,0,0,0,0,0,0,24,0,0,0,80,72,2,0,1,0,0,0,152,
+111,0,0,0,0,0,0,25,0,0,0,128,60,2,0,1,0,0,0,192,111,0,0,0,0,0,0,25,0,0,0,128,48,2,0,1,0,0,0,192,111,0,0,0,0,0,0,26,0,0,0,128,36,2,0,1,0,0,0,184,111,0,0,0,0,0,0,10,0,0,0,144,25,2,0,1,0,0,0,200,111,0,0,0,0,0,0,11,0,0,0,40,14,2,0,1,0,0,0,200,111,0,0,0,0,0,0,12,0,0,0,40,6,2,0,1,0,0,0,200,111,0,0,0,0,0,0,12,0,0,0,120,253,1,0,1,0,0,0,200,111,0,0,0,0,0,0,12,0,0,0,144,241,1,0,1,0,0,0,200,111,0,0,0,0,0,0,14,0,0,0,32,231,1,0,1,0,0,0,200,111,0,0,0,0,0,0,14,0,0,0,216,221,1,0,1,0,0,0,200,111,0,0,0,0,0,0,13,0,
+0,0,32,218,1,0,1,0,0,0,200,111,0,0,0,0,0,0,5,0,0,0,136,214,1,0,1,0,0,0,200,111,0,0,0,0,0,0,6,0,0,0,0,212,1,0,1,0,0,0,200,111,0,0,0,0,0,0,7,0,0,0,168,208,1,0,1,0,0,0,200,111,0,0,0,0,0,0,7,0,0,0,88,205,1,0,1,0,0,0,200,111,0,0,0,0,0,0,7,0,0,0,96,202,1,0,1,0,0,0,200,111,0,0,0,0,0,0,9,0,0,0,56,198,1,0,1,0,0,0,200,111,0,0,0,0,0,0,9,0,0,0,0,194,1,0,1,0,0,0,200,111,0,0,0,0,0,0,8,0,0,0,184,189,1,0,1,0,0,0,200,111,0,0,0,0,0,0,0,0,0,0,32,187,1,0,1,0,0,0,144,111,0,0,0,0,0,0,1,0,0,0,232,184,1,0,1,0,0,0,144,111,
+0,0,0,0,0,0,2,0,0,0,8,183,1,0,1,0,0,0,144,111,0,0,0,0,0,0,2,0,0,0,208,180,1,0,1,0,0,0,144,111,0,0,0,0,0,0,2,0,0,0,144,178,1,0,1,0,0,0,144,111,0,0,0,0,0,0,4,0,0,0,216,175,1,0,1,0,0,0,144,111,0,0,0,0,0,0,4,0,0,0,72,173,1,0,1,0,0,0,144,111,0,0,0,0,0,0,3,0,0,0,168,169,1,0,1,0,0,0,144,111,0,0,0,0,0,0,18,0,0,0,128,166,1,0,1,0,0,0,176,111,0,0,0,0,0,0,27,0,0,0,192,162,1,0,1,0,0,0,160,111,0,0,0,0,0,0,28,0,0,0,200,160,1,0,1,0,0,0,160,111,0,0,0,0,0,0,29,0,0,0,40,159,1,0,1,0,0,0,160,111,0,0,0,0,0,0,29,0,0,0,
+120,157,1,0,1,0,0,0,160,111,0,0,0,0,0,0,29,0,0,0,128,155,1,0,1,0,0,0,160,111,0,0,0,0,0,0,30,0,0,0,8,154,1,0,1,0,0,0,168,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,179,1,0,0,0,0,0,48,71,0,0,240,179,2,0,1,0,0,0,0,84,2,0,0,0,0,0,24,102,0,0,240,179,2,0,3,0,0,0,104,231,1,0,0,0,0,0,216,3,0,0,240,179,2,0,4,0,0,0,216,189,1,0,0,0,0,0,200,20,1,0,240,179,2,0,5,0,0,0,224,162,1,0,0,0,0,0,192,57,0,0,240,179,2,0,6,0,0,0,120,140,1,0,0,0,0,0,136,69,0,0,240,179,2,0,7,0,0,0,240,118,1,0,0,0,0,
+0,168,69,0,0,240,179,2,0,7,0,0,0,112,98,1,0,0,0,0,0,168,69,0,0,240,179,2,0,7,0,0,0,240,77,1,0,0,0,0,0,160,69,0,0,240,179,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,24,84,2,0,0,0,0,0,40,112,0,0,32,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,240,176,1,0,50,0,0,0,72,82,2,0,44,0,0,0,8,229,1,0,44,0,0,0,184,188,1,0,22,0,0,0,168,161,1,0,22,0,0,0,88,139,1,0,40,0,0,0,192,117,1,0,40,0,0,0,40,97,1,0,16,0,0,0,160,76,1,0,16,0,0,0,24,58,1,0,4,0,0,0,240,138,2,0,4,0,0,0,160,122,2,0,
+26,0,0,0,56,107,2,0,26,0,0,0,152,87,2,0,32,0,0,0,0,0,0,0,16,58,1,0,1,0,0,0,0,0,0,0,88,113,0,0,1,0,0,0,8,139,2,0,1,0,0,0,0,0,0,0,32,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,200,77,2,0,1,0,0,0,0,0,0,0,144,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,114,2,0,1,0,0,0,0,0,0,0,0,114,0,0,1,0,0,0,32,251,1,0,1,0,0,0,0,0,0,0,200,113,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,80,126,2,0,1,0,0,0,0,0,0,0,56,114,0,0,1,0,0,0,136,1,2,0,1,0,0,0,0,0,0,0,56,114,0,
+0,2,0,0,0,8,200,1,0,1,0,0,0,0,0,0,0,80,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,72,56,2,0,255,255,255,255,0,0,0,0,112,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,32,25,2,0,1,0,0,0,0,0,0,0,168,114,0,0,2,0,0,0,80,208,1,0,1,0,0,0,0,0,0,0,224,114,0,0,0,0,0,0,0,178,1,0,1,0,0,0,0,0,0,0,224,114,0,0,3,0,0,0,176,153,1,0,1,0,0,0,0,0,0,0,224,114,0,0,0,0,0,0,240,130,1,0,1,0,0,0,0,0,0,0,168,114,0,0,3,0,0,0,240,108,1,0,1,0,0,0,0,0,0,0,168,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,184,73,2,0,1,0,0,0,0,0,0,0,24,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,48,163,1,0,1,0,0,0,0,0,0,0,136,115,0,0,0,0,0,0,96,141,1,0,1,0,0,0,0,0,0,0,136,115,0,0,1,0,0,0,96,119,1,0,1,0,0,0,0,0,0,0,192,115,0,0,2,0,0,0,32,99,1,0,1,0,0,0,0,0,0,0,136,115,0,0,3,0,0,0,120,78,1,0,1,0,0,0,0,0,0,0,136,115,0,0,4,0,0,0,80,60,1,0,1,0,0,0,0,0,0,0,136,115,0,0,5,0,0,0,48,141,2,0,1,0,0,0,0,0,0,0,136,115,0,0,6,0,0,0,176,124,2,0,1,0,0,0,0,0,0,0,136,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,148,0,0,0,12,0,0,0,116,0,0,0,22,0,0,0,86,0,0,0,162,0,0,0,88,0,0,0,14,0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,12,0,0,0,32,0,0,0,0,0,0,0,78,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,203,1,0,96,200,1,0,168,196,1,0,0,0,0,0,100,0,0,0,101,0,0,0,102,0,0,0,100,0,0,0,104,191,1,0,80,188,1,0,56,186,1,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,255,255,255,255,168,163,2,0,64,163,2,0,16,163,2,0,56,163,2,0,40,163,2,0,24,163,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,66,0,0,192,38,2,0,65,73,0,0,120,27,2,0,65,82,0,0,208,16,2,0,65,88,0,0,128,7,2,0,66,32,0,0,248,254,1,0,66,73,0,0,152,244,1,0,67,66,0,0,136,232,1,0,67,79,0,0,160,223,1,0,67,88,0,0,120,218,1,0,72,32,0,0,56,215,1,0,72,66,0,0,88,212,1,0,72,73,0,0,24,209,1,0,72,88,0,0,248,205,1,0,72,98,0,0,168,202,1,0,72,105,0,0,136,198,1,0,72,114,0,0,216,194,1,0,72,120,0,0,40,190,1,0,73,32,0,0,96,187,1,0,75,66,0,0,88,185,1,0,75,73,
+0,0,88,183,1,0,75,82,0,0,48,181,1,0,75,88,0,0,216,178,1,0,78,66,0,0,16,176,1,0,78,73,0,0,136,173,1,0,78,82,0,0,32,170,1,0,78,88,0,0,72,167,1,0,80,65,0,0,16,163,1,0,80,66,0,0,8,161,1,0,80,73,0,0,112,159,1,0,80,88,0,0,200,157,1,0,82,32,0,0,200,155,1,0,83,32,0,0,72,154,1,0,90,68,0,0,136,152,1,0,0,0,0,0,0,0,0,0,96,188,1,0,46,0,0,0,72,186,1,0,6,0,0,0,16,184,1,0,192,0,0,0,248,220,1,0,168,186,1,0,208,137,1,0,120,160,1,0,0,95,1,0,192,115,1,0,160,56,1,0,8,75,1,0,0,0,0,0,0,0,0,0,248,220,1,0,168,186,1,0,120,
+160,1,0,208,137,1,0,192,115,1,0,0,95,1,0,8,75,1,0,160,56,1,0,0,0,0,0,0,0,0,0,84,0,0,0,30,0,0,0,0,0,0,0,0,0,0,0,74,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,94,0,0,0,72,0,0,0,22,0,0,0,164,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,0,0,0,30,0,0,0,120,0,0,0,22,0,0,0,4,0,0,0,28,0,0,0,44,0,0,0,0,0,0,0,176,0,0,0,142,0,0,0,40,102,0,0,0,0,0,0,1,0,0,0,1,0,0,0,255,255,255,255,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,191,0,0,0,0,0,0,240,191,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,3,0,0,0,3,0,0,0,4,0,0,0,4,0,0,0,5,0,0,0,5,0,0,0,6,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,8,0,0,0,8,0,0,0,9,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,11,0,0,0,11,0,0,0,12,0,0,0,12,0,0,0,13,0,0,0,13,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,3,0,0,0,7,0,0,0,0,0,0,0,76,0,0,0,152,0,0,0,34,0,0,0,114,0,0,0,0,0,0,0,2,0,0,0,72,171,1,0,198,0,0,0,24,168,1,0,193,0,0,0,8,164,1,0,194,0,0,0,136,161,1,0,192,0,0,0,216,159,1,0,145,3,0,0,56,158,1,0,197,0,0,0,72,156,1,0,195,0,0,0,176,154,1,0,196,0,0,0,0,153,1,0,146,3,0,0,32,151,1,0,199,0,0,0,176,148,1,0,167,3,0,0,8,146,1,0,33,32,0,0,88,142,1,0,148,3,0,0,136,139,1,0,208,0,0,0,200,137,1,0,201,0,0,0,40,136,1,0,202,
+0,0,0,8,134,1,0,200,0,0,0,128,132,1,0,149,3,0,0,216,130,1,0,151,3,0,0,40,129,1,0,203,0,0,0,248,126,1,0,147,3,0,0,24,124,1,0,205,0,0,0,0,120,1,0,206,0,0,0,8,118,1,0,204,0,0,0,216,115,1,0,153,3,0,0,104,114,1,0,207,0,0,0,144,112,1,0,154,3,0,0,16,111,1,0,155,3,0,0,40,109,1,0,156,3,0,0,80,107,1,0,209,0,0,0,104,105,1,0,157,3,0,0,168,102,1,0,82,1,0,0,128,99,1,0,211,0,0,0,176,97,1,0,212,0,0,0,96,95,1,0,210,0,0,0,48,93,1,0,169,3,0,0,176,91,1,0,159,3,0,0,224,89,1,0,216,0,0,0,32,88,1,0,213,0,0,0,88,86,1,0,214,
+0,0,0,112,84,1,0,166,3,0,0,96,82,1,0,160,3,0,0,248,78,1,0,51,32,0,0,56,77,1,0,168,3,0,0,120,75,1,0,161,3,0,0,200,73,1,0,96,1,0,0,72,72,1,0,163,3,0,0,192,70,1,0,222,0,0,0,40,69,1,0,164,3,0,0,136,67,1,0,152,3,0,0,232,65,1,0,218,0,0,0,152,63,1,0,219,0,0,0,216,60,1,0,217,0,0,0,184,58,1,0,165,3,0,0,24,57,1,0,220,0,0,0,176,55,1,0,158,3,0,0,32,54,1,0,221,0,0,0,248,52,1,0,120,1,0,0,224,51,1,0,150,3,0,0,120,147,2,0,225,0,0,0,232,145,2,0,226,0,0,0,112,144,2,0,180,0,0,0,168,141,2,0,230,0,0,0,224,139,2,0,224,
+0,0,0,64,138,2,0,53,33,0,0,200,136,2,0,177,3,0,0,112,135,2,0,38,0,0,0,56,134,2,0,39,34,0,0,224,132,2,0,32,34,0,0,112,131,2,0,229,0,0,0,192,129,2,0,72,34,0,0,72,128,2,0,227,0,0,0,56,125,2,0,228,0,0,0,160,123,2,0,30,32,0,0,64,122,2,0,178,3,0,0,224,120,2,0,166,0,0,0,144,119,2,0,34,32,0,0,48,118,2,0,41,34,0,0,240,116,2,0,231,0,0,0,192,115,2,0,184,0,0,0,72,114,2,0,162,0,0,0,88,112,2,0,199,3,0,0,112,109,2,0,198,2,0,0,48,108,2,0,99,38,0,0,240,106,2,0,69,34,0,0,200,105,2,0,169,0,0,0,128,104,2,0,181,33,0,
+0,80,102,2,0,42,34,0,0,232,100,2,0,164,0,0,0,160,99,2,0,211,33,0,0,208,94,2,0,32,32,0,0,224,92,2,0,147,33,0,0,40,90,2,0,176,0,0,0,176,88,2,0,180,3,0,0,96,87,2,0,102,38,0,0,104,86,2,0,247,0,0,0,80,85,2,0,233,0,0,0,80,84,2,0,234,0,0,0,64,83,2,0,232,0,0,0,64,82,2,0,5,34,0,0,224,80,2,0,3,32,0,0,216,79,2,0,2,32,0,0,192,77,2,0,181,3,0,0,136,76,2,0,97,34,0,0,136,75,2,0,183,3,0,0,176,74,2,0,240,0,0,0,192,73,2,0,235,0,0,0,224,72,2,0,172,32,0,0,248,71,2,0,3,34,0,0,240,70,2,0,146,1,0,0,192,69,2,0,0,34,0,0,160,
+68,2,0,189,0,0,0,120,66,2,0,188,0,0,0,56,65,2,0,190,0,0,0,48,64,2,0,68,32,0,0,16,63,2,0,179,3,0,0,248,61,2,0,101,34,0,0,24,61,2,0,62,0,0,0,16,60,2,0,212,33,0,0,200,58,2,0,148,33,0,0,144,57,2,0,101,38,0,0,16,56,2,0,38,32,0,0,32,54,2,0,237,0,0,0,16,53,2,0,238,0,0,0,0,52,2,0,161,0,0,0,240,50,2,0,236,0,0,0,224,49,2,0,17,33,0,0,16,49,2,0,30,34,0,0,40,48,2,0,43,34,0,0,40,47,2,0,185,3,0,0,232,45,2,0,191,0,0,0,104,44,2,0,8,34,0,0,184,42,2,0,239,0,0,0,144,41,2,0,186,3,0,0,24,40,2,0,208,33,0,0,248,38,2,0,187,
+3,0,0,0,38,2,0,41,35,0,0,32,37,2,0,171,0,0,0,40,36,2,0,144,33,0,0,24,35,2,0,8,35,0,0,200,33,2,0,28,32,0,0,152,32,2,0,100,34,0,0,104,30,2,0,10,35,0,0,80,29,2,0,23,34,0,0,104,28,2,0,202,37,0,0,176,27,2,0,14,32,0,0,0,27,2,0,57,32,0,0,40,26,2,0,24,32,0,0,48,25,2,0,60,0,0,0,72,24,2,0,175,0,0,0,88,23,2,0,20,32,0,0,88,22,2,0,181,0,0,0,80,20,2,0,183,0,0,0,72,19,2,0,18,34,0,0,56,18,2,0,188,3,0,0,80,17,2,0,7,34,0,0,200,15,2,0,160,0,0,0,160,14,2,0,19,32,0,0,240,13,2,0,96,34,0,0,240,12,2,0,11,34,0,0,32,12,2,
+0,172,0,0,0,8,11,2,0,9,34,0,0,176,9,2,0,132,34,0,0,0,9,2,0,241,0,0,0,80,8,2,0,189,3,0,0,192,7,2,0,243,0,0,0,8,7,2,0,244,0,0,0,128,6,2,0,83,1,0,0,232,5,2,0,242,0,0,0,72,5,2,0,62,32,0,0,112,4,2,0,201,3,0,0,16,3,2,0,191,3,0,0,88,1,2,0,149,34,0,0,72,0,2,0,40,34,0,0,176,255,1,0,170,0,0,0,32,255,1,0,186,0,0,0,144,254,1,0,248,0,0,0,216,253,1,0,245,0,0,0,8,253,1,0,151,34,0,0,32,252,1,0,246,0,0,0,112,251,1,0,182,0,0,0,88,250,1,0,2,34,0,0,96,248,1,0,48,32,0,0,232,246,1,0,165,34,0,0,200,245,1,0,198,3,0,0,200,
+244,1,0,192,3,0,0,104,243,1,0,214,3,0,0,8,242,1,0,177,0,0,0,48,241,1,0,163,0,0,0,24,240,1,0,50,32,0,0,200,238,1,0,15,34,0,0,120,237,1,0,29,34,0,0,208,235,1,0,200,3,0,0,168,234,1,0,34,0,0,0,192,233,1,0,210,33,0,0,192,232,1,0,26,34,0,0,0,232,1,0,42,35,0,0,136,231,1,0,187,0,0,0,216,230,1,0,146,33,0,0,240,229,1,0,9,35,0,0,0,229,1,0,29,32,0,0,216,227,1,0,28,33,0,0,104,226,1,0,174,0,0,0,120,225,1,0,11,35,0,0,128,224,1,0,193,3,0,0,192,223,1,0,15,32,0,0,248,222,1,0,58,32,0,0,72,222,1,0,25,32,0,0,160,221,
+1,0,26,32,0,0,240,220,1,0,97,1,0,0,144,220,1,0,197,34,0,0,24,220,1,0,167,0,0,0,48,219,1,0,173,0,0,0,0,219,1,0,195,3,0,0,184,218,1,0,194,3,0,0,144,218,1,0,60,34,0,0,80,218,1,0,96,38,0,0,56,218,1,0,130,34,0,0,8,218,1,0,134,34,0,0,184,217,1,0,17,34,0,0,104,217,1,0,131,34,0,0,0,217,1,0,185,0,0,0,232,215,1,0,178,0,0,0,192,215,1,0,179,0,0,0,120,215,1,0,135,34,0,0,72,215,1,0,223,0,0,0,224,214,1,0,196,3,0,0,160,214,1,0,52,34,0,0,128,214,1,0,184,3,0,0,48,214,1,0,209,3,0,0,0,214,1,0,9,32,0,0,184,213,1,0,254,
+0,0,0,232,212,1,0,220,2,0,0,192,212,1,0,215,0,0,0,136,212,1,0,34,33,0,0,104,212,1,0,209,33,0,0,64,212,1,0,250,0,0,0,24,212,1,0,145,33,0,0,248,211,1,0,251,0,0,0,152,211,1,0,249,0,0,0,40,211,1,0,168,0,0,0,152,210,1,0,210,3,0,0,200,209,1,0,197,3,0,0,120,209,1,0,252,0,0,0,80,209,1,0,24,33,0,0,48,209,1,0,190,3,0,0,0,209,1,0,253,0,0,0,200,208,1,0,165,0,0,0,160,208,1,0,255,0,0,0,72,208,1,0,182,3,0,0,40,208,1,0,13,32,0,0,216,207,1,0,12,32,0,0,42,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,18,0,0,0,0,
+0,0,0,20,0,0,0,0,0,0,0,30,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,200,79,0,0,56,25,1,0,88,2,0,0,184,22,1,0,184,22,1,0,80,78,0,0,88,2,0,0,0,0,0,0,8,0,0,0,48,0,0,0,0,0,0,0,60,0,0,0,32,0,0,0,50,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,146,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,38,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,78,79,84,65,84,73,79,78,40,0,0,0,0,0,0,0,40,0,0,0,0,0,0,0,124,0,0,0,0,0,0,0,78,77,84,79,75,69,78,83,0,0,0,0,0,0,0,0,78,77,84,79,75,69,78,0,73,68,82,69,70,83,0,0,73,68,82,69,70,0,0,0,73,68,0,0,0,0,0,0,69,78,84,73,84,89,0,0,69,78,84,73,84,73,69,83,0,0,0,0,0,0,0,0,67,68,65,84,65,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,64,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,96,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,
+0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,88,64,0,0,0,0,0,0,88,64,2,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,150,64,0,0,0,0,0,128,
+150,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,66,64,0,0,0,0,0,0,66,64,0,0,0,0,0,32,131,64,0,0,0,0,0,192,136,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,82,64,0,0,0,0,0,0,82,64,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,184,114,1,0,216,112,1,0,0,0,0,0,0,0,0,0,95,112,137,0,255,9,47,15,10,0,0,0,100,0,0,0,232,3,0,0,16,39,0,
+0,160,134,1,0,64,66,15,0,128,150,152,0,0,225,245,5,0,0,0,0,150,48,7,119,44,97,14,238,186,81,9,153,25,196,109,7,143,244,106,112,53,165,99,233,163,149,100,158,50,136,219,14,164,184,220,121,30,233,213,224,136,217,210,151,43,76,182,9,189,124,177,126,7,45,184,231,145,29,191,144,100,16,183,29,242,32,176,106,72,113,185,243,222,65,190,132,125,212,218,26,235,228,221,109,81,181,212,244,199,133,211,131,86,152,108,19,192,168,107,100,122,249,98,253,236,201,101,138,79,92,1,20,217,108,6,99,99,61,15,250,245,13,8,
+141,200,32,110,59,94,16,105,76,228,65,96,213,114,113,103,162,209,228,3,60,71,212,4,75,253,133,13,210,107,181,10,165,250,168,181,53,108,152,178,66,214,201,187,219,64,249,188,172,227,108,216,50,117,92,223,69,207,13,214,220,89,61,209,171,172,48,217,38,58,0,222,81,128,81,215,200,22,97,208,191,181,244,180,33,35,196,179,86,153,149,186,207,15,165,189,184,158,184,2,40,8,136,5,95,178,217,12,198,36,233,11,177,135,124,111,47,17,76,104,88,171,29,97,193,61,45,102,182,144,65,220,118,6,113,219,1,188,32,210,152,
+42,16,213,239,137,133,177,113,31,181,182,6,165,228,191,159,51,212,184,232,162,201,7,120,52,249,0,15,142,168,9,150,24,152,14,225,187,13,106,127,45,61,109,8,151,108,100,145,1,92,99,230,244,81,107,107,98,97,108,28,216,48,101,133,78,0,98,242,237,149,6,108,123,165,1,27,193,244,8,130,87,196,15,245,198,217,176,101,80,233,183,18,234,184,190,139,124,136,185,252,223,29,221,98,73,45,218,21,243,124,211,140,101,76,212,251,88,97,178,77,206,81,181,58,116,0,188,163,226,48,187,212,65,165,223,74,215,149,216,61,109,
+196,209,164,251,244,214,211,106,233,105,67,252,217,110,52,70,136,103,173,208,184,96,218,115,45,4,68,229,29,3,51,95,76,10,170,201,124,13,221,60,113,5,80,170,65,2,39,16,16,11,190,134,32,12,201,37,181,104,87,179,133,111,32,9,212,102,185,159,228,97,206,14,249,222,94,152,201,217,41,34,152,208,176,180,168,215,199,23,61,179,89,129,13,180,46,59,92,189,183,173,108,186,192,32,131,184,237,182,179,191,154,12,226,182,3,154,210,177,116,57,71,213,234,175,119,210,157,21,38,219,4,131,22,220,115,18,11,99,227,132,59,
+100,148,62,106,109,13,168,90,106,122,11,207,14,228,157,255,9,147,39,174,0,10,177,158,7,125,68,147,15,240,210,163,8,135,104,242,1,30,254,194,6,105,93,87,98,247,203,103,101,128,113,54,108,25,231,6,107,110,118,27,212,254,224,43,211,137,90,122,218,16,204,74,221,103,111,223,185,249,249,239,190,142,67,190,183,23,213,142,176,96,232,163,214,214,126,147,209,161,196,194,216,56,82,242,223,79,241,103,187,209,103,87,188,166,221,6,181,63,75,54,178,72,218,43,13,216,76,27,10,175,246,74,3,54,96,122,4,65,195,239,96,
+223,85,223,103,168,239,142,110,49,121,190,105,70,140,179,97,203,26,131,102,188,160,210,111,37,54,226,104,82,149,119,12,204,3,71,11,187,185,22,2,34,47,38,5,85,190,59,186,197,40,11,189,178,146,90,180,43,4,106,179,92,167,255,215,194,49,207,208,181,139,158,217,44,29,174,222,91,176,194,100,155,38,242,99,236,156,163,106,117,10,147,109,2,169,6,9,156,63,54,14,235,133,103,7,114,19,87,0,5,130,74,191,149,20,122,184,226,174,43,177,123,56,27,182,12,155,142,210,146,13,190,213,229,183,239,220,124,33,223,219,11,
+212,210,211,134,66,226,212,241,248,179,221,104,110,131,218,31,205,22,190,129,91,38,185,246,225,119,176,111,119,71,183,24,230,90,8,136,112,106,15,255,202,59,6,102,92,11,1,17,255,158,101,143,105,174,98,248,211,255,107,97,69,207,108,22,120,226,10,160,238,210,13,215,84,131,4,78,194,179,3,57,97,38,103,167,247,22,96,208,77,71,105,73,219,119,110,62,74,106,209,174,220,90,214,217,102,11,223,64,240,59,216,55,83,174,188,169,197,158,187,222,127,207,178,71,233,255,181,48,28,242,189,189,138,194,186,202,48,147,
+179,83,166,163,180,36,5,54,208,186,147,6,215,205,41],"i8",L,l.J+20497);D([87,222,84,191,103,217,35,46,122,102,179,184,74,97,196,2,27,104,93,148,43,111,42,55,190,11,180,161,142,12,195,27,223,5,90,141,239,2,45,0,0,0,0,65,49,27,25,130,98,54,50,195,83,45,43,4,197,108,100,69,244,119,125,134,167,90,86,199,150,65,79,8,138,217,200,73,187,194,209,138,232,239,250,203,217,244,227,12,79,181,172,77,126,174,181,142,45,131,158,207,28,152,135,81,18,194,74,16,35,217,83,211,112,244,120,146,65,239,97,85,215,174,46,
+20,230,181,55,215,181,152,28,150,132,131,5,89,152,27,130,24,169,0,155,219,250,45,176,154,203,54,169,93,93,119,230,28,108,108,255,223,63,65,212,158,14,90,205,162,36,132,149,227,21,159,140,32,70,178,167,97,119,169,190,166,225,232,241,231,208,243,232,36,131,222,195,101,178,197,218,170,174,93,93,235,159,70,68,40,204,107,111,105,253,112,118,174,107,49,57,239,90,42,32,44,9,7,11,109,56,28,18,243,54,70,223,178,7,93,198,113,84,112,237,48,101,107,244,247,243,42,187,182,194,49,162,117,145,28,137,52,160,7,144,
+251,188,159,23,186,141,132,14,121,222,169,37,56,239,178,60,255,121,243,115,190,72,232,106,125,27,197,65,60,42,222,88,5,79,121,240,68,126,98,233,135,45,79,194,198,28,84,219,1,138,21,148,64,187,14,141,131,232,35,166,194,217,56,191,13,197,160,56,76,244,187,33,143,167,150,10,206,150,141,19,9,0,204,92,72,49,215,69,139,98,250,110,202,83,225,119,84,93,187,186,21,108,160,163,214,63,141,136,151,14,150,145,80,152,215,222,17,169,204,199,210,250,225,236,147,203,250,245,92,215,98,114,29,230,121,107,222,181,84,
+64,159,132,79,89,88,18,14,22,25,35,21,15,218,112,56,36,155,65,35,61,167,107,253,101,230,90,230,124,37,9,203,87,100,56,208,78,163,174,145,1,226,159,138,24,33,204,167,51,96,253,188,42,175,225,36,173,238,208,63,180,45,131,18,159,108,178,9,134,171,36,72,201,234,21,83,208,41,70,126,251,104,119,101,226,246,121,63,47,183,72,36,54,116,27,9,29,53,42,18,4,242,188,83,75,179,141,72,82,112,222,101,121,49,239,126,96,254,243,230,231,191,194,253,254,124,145,208,213,61,160,203,204,250,54,138,131,187,7,145,154,120,
+84,188,177,57,101,167,168,75,152,131,59,10,169,152,34,201,250,181,9,136,203,174,16,79,93,239,95,14,108,244,70,205,63,217,109,140,14,194,116,67,18,90,243,2,35,65,234,193,112,108,193,128,65,119,216,71,215,54,151,6,230,45,142,197,181,0,165,132,132,27,188,26,138,65,113,91,187,90,104,152,232,119,67,217,217,108,90,30,79,45,21,95,126,54,12,156,45,27,39,221,28,0,62,18,0,152,185,83,49,131,160,144,98,174,139,209,83,181,146,22,197,244,221,87,244,239,196,148,167,194,239,213,150,217,246,233,188,7,174,168,141,
+28,183,107,222,49,156,42,239,42,133,237,121,107,202,172,72,112,211,111,27,93,248,46,42,70,225,225,54,222,102,160,7,197,127,99,84,232,84,34,101,243,77,229,243,178,2,164,194,169,27,103,145,132,48,38,160,159,41,184,174,197,228,249,159,222,253,58,204,243,214,123,253,232,207,188,107,169,128,253,90,178,153,62,9,159,178,127,56,132,171,176,36,28,44,241,21,7,53,50,70,42,30,115,119,49,7,180,225,112,72,245,208,107,81,54,131,70,122,119,178,93,99,78,215,250,203,15,230,225,210,204,181,204,249,141,132,215,224,74,
+18,150,175,11,35,141,182,200,112,160,157,137,65,187,132,70,93,35,3,7,108,56,26,196,63,21,49,133,14,14,40,66,152,79,103,3,169,84,126,192,250,121,85,129,203,98,76,31,197,56,129,94,244,35,152,157,167,14,179,220,150,21,170,27,0,84,229,90,49,79,252,153,98,98,215,216,83,121,206,23,79,225,73,86,126,250,80,149,45,215,123,212,28,204,98,19,138,141,45,82,187,150,52,145,232,187,31,208,217,160,6,236,243,126,94,173,194,101,71,110,145,72,108,47,160,83,117,232,54,18,58,169,7,9,35,106,84,36,8,43,101,63,17,228,121,
+167,150,165,72,188,143,102,27,145,164,39,42,138,189,224,188,203,242,161,141,208,235,98,222,253,192,35,239,230,217,189,225,188,20,252,208,167,13,63,131,138,38,126,178,145,63,185,36,208,112,248,21,203,105,59,70,230,66,122,119,253,91,181,107,101,220,244,90,126,197,55,9,83,238,118,56,72,247,177,174,9,184,240,159,18,161,51,204,63,138,114,253,36,147,0,0,0,0,55,106,194,1,110,212,132,3,89,190,70,2,220,168,9,7,235,194,203,6,178,124,141,4,133,22,79,5,184,81,19,14,143,59,209,15,214,133,151,13,225,239,85,12,
+100,249,26,9,83,147,216,8,10,45,158,10,61,71,92,11,112,163,38,28,71,201,228,29,30,119,162,31,41,29,96,30,172,11,47,27,155,97,237,26,194,223,171,24,245,181,105,25,200,242,53,18,255,152,247,19,166,38,177,17,145,76,115,16,20,90,60,21,35,48,254,20,122,142,184,22,77,228,122,23,224,70,77,56,215,44,143,57,142,146,201,59,185,248,11,58,60,238,68,63,11,132,134,62,82,58,192,60,101,80,2,61,88,23,94,54,111,125,156,55,54,195,218,53,1,169,24,52,132,191,87,49,179,213,149,48,234,107,211,50,221,1,17,51,144,229,107,
+36,167,143,169,37,254,49,239,39,201,91,45,38,76,77,98,35,123,39,160,34,34,153,230,32,21,243,36,33,40,180,120,42,31,222,186,43,70,96,252,41,113,10,62,40,244,28,113,45,195,118,179,44,154,200,245,46,173,162,55,47,192,141,154,112,247,231,88,113,174,89,30,115,153,51,220,114,28,37,147,119,43,79,81,118,114,241,23,116,69,155,213,117,120,220,137,126,79,182,75,127,22,8,13,125,33,98,207,124,164,116,128,121,147,30,66,120,202,160,4,122,253,202,198,123,176,46,188,108,135,68,126,109,222,250,56,111,233,144,250,110,
+108,134,181,107,91,236,119,106,2,82,49,104,53,56,243,105,8,127,175,98,63,21,109,99,102,171,43,97,81,193,233,96,212,215,166,101,227,189,100,100,186,3,34,102,141,105,224,103,32,203,215,72,23,161,21,73,78,31,83,75,121,117,145,74,252,99,222,79,203,9,28,78,146,183,90,76,165,221,152,77,152,154,196,70,175,240,6,71,246,78,64,69,193,36,130,68,68,50,205,65,115,88,15,64,42,230,73,66,29,140,139,67,80,104,241,84,103,2,51,85,62,188,117,87,9,214,183,86,140,192,248,83,187,170,58,82,226,20,124,80,213,126,190,81,232,
+57,226,90,223,83,32,91,134,237,102,89,177,135,164,88,52,145,235,93,3,251,41,92,90,69,111,94,109,47,173,95,128,27,53,225,183,113,247,224,238,207,177,226,217,165,115,227,92,179,60,230,107,217,254,231,50,103,184,229,5,13,122,228,56,74,38,239,15,32,228,238,86,158,162,236,97,244,96,237,228,226,47,232,211,136,237,233,138,54,171,235,189,92,105,234,240,184,19,253,199,210,209,252,158,108,151,254,169,6,85,255,44,16,26,250,27,122,216,251,66,196,158,249,117,174,92,248,72,233,0,243,127,131,194,242,38,61,132,240,
+17,87,70,241,148,65,9,244,163,43,203,245,250,149,141,247,205,255,79,246,96,93,120,217,87,55,186,216,14,137,252,218,57,227,62,219,188,245,113,222,139,159,179,223,210,33,245,221,229,75,55,220,216,12,107,215,239,102,169,214,182,216,239,212,129,178,45,213,4,164,98,208,51,206,160,209,106,112,230,211,93,26,36,210,16,254,94,197,39,148,156,196,126,42,218,198,73,64,24,199,204,86,87,194,251,60,149,195,162,130,211,193,149,232,17,192,168,175,77,203,159,197,143,202,198,123,201,200,241,17,11,201,116,7,68,204,67,
+109,134,205,26,211,192,207,45,185,2,206,64,150,175,145,119,252,109,144,46,66,43,146,25,40,233,147,156,62,166,150,171,84,100,151,242,234,34,149,197,128,224,148,248,199,188,159,207,173,126,158,150,19,56,156,161,121,250,157,36,111,181,152,19,5,119,153,74,187,49,155,125,209,243,154,48,53,137,141,7,95,75,140,94,225,13,142,105,139,207,143,236,157,128,138,219,247,66,139,130,73,4,137,181,35,198,136,136,100,154,131,191,14,88,130,230,176,30,128,209,218,220,129,84,204,147,132,99,166,81,133,58,24,23,135,13,114,
+213,134,160,208,226,169,151,186,32,168,206,4,102,170,249,110,164,171,124,120,235,174,75,18,41,175,18,172,111,173,37,198,173,172,24,129,241,167,47,235,51,166,118,85,117,164,65,63,183,165,196,41,248,160,243,67,58,161,170,253,124,163,157,151,190,162,208,115,196,181,231,25,6,180,190,167,64,182,137,205,130,183,12,219,205,178,59,177,15,179,98,15,73,177,85,101,139,176,104,34,215,187,95,72,21,186,6,246,83,184,49,156,145,185,180,138,222,188,131,224,28,189,218,94,90,191,237,52,152,190,0,0,0,0,101,103,188,184,
+139,200,9,170,238,175,181,18,87,151,98,143,50,240,222,55,220,95,107,37,185,56,215,157,239,40,180,197,138,79,8,125,100,224,189,111,1,135,1,215,184,191,214,74,221,216,106,242,51,119,223,224,86,16,99,88,159,87,25,80,250,48,165,232,20,159,16,250,113,248,172,66,200,192,123,223,173,167,199,103,67,8,114,117,38,111,206,205,112,127,173,149,21,24,17,45,251,183,164,63,158,208,24,135,39,232,207,26,66,143,115,162,172,32,198,176,201,71,122,8,62,175,50,160,91,200,142,24,181,103,59,10,208,0,135,178,105,56,80,47,
+12,95,236,151,226,240,89,133,135,151,229,61,209,135,134,101,180,224,58,221,90,79,143,207,63,40,51,119,134,16,228,234,227,119,88,82,13,216,237,64,104,191,81,248,161,248,43,240,196,159,151,72,42,48,34,90,79,87,158,226,246,111,73,127,147,8,245,199,125,167,64,213,24,192,252,109,78,208,159,53,43,183,35,141,197,24,150,159,160,127,42,39,25,71,253,186,124,32,65,2,146,143,244,16,247,232,72,168,61,88,20,155,88,63,168,35,182,144,29,49,211,247,161,137,106,207,118,20,15,168,202,172,225,7,127,190,132,96,195,6,
+210,112,160,94,183,23,28,230,89,184,169,244,60,223,21,76,133,231,194,209,224,128,126,105,14,47,203,123,107,72,119,195,162,15,13,203,199,104,177,115,41,199,4,97,76,160,184,217,245,152,111,68,144,255,211,252,126,80,102,238,27,55,218,86,77,39,185,14,40,64,5,182,198,239,176,164,163,136,12,28,26,176,219,129,127,215,103,57,145,120,210,43,244,31,110,147,3,247,38,59,102,144,154,131,136,63,47,145,237,88,147,41,84,96,68,180,49,7,248,12,223,168,77,30,186,207,241,166,236,223,146,254,137,184,46,70,103,23,155,
+84,2,112,39,236,187,72,240,113,222,47,76,201,48,128,249,219,85,231,69,99,156,160,63,107,249,199,131,211,23,104,54,193,114,15,138,121,203,55,93,228,174,80,225,92,64,255,84,78,37,152,232,246,115,136,139,174,22,239,55,22,248,64,130,4,157,39,62,188,36,31,233,33,65,120,85,153,175,215,224,139,202,176,92,51,59,182,89,237,94,209,229,85,176,126,80,71,213,25,236,255,108,33,59,98,9,70,135,218,231,233,50,200,130,142,142,112,212,158,237,40,177,249,81,144,95,86,228,130,58,49,88,58,131,9,143,167,230,110,51,31,8,
+193,134,13,109,166,58,181,164,225,64,189,193,134,252,5,47,41,73,23,74,78,245,175,243,118,34,50,150,17,158,138,120,190,43,152,29,217,151,32,75,201,244,120,46,174,72,192,192,1,253,210,165,102,65,106,28,94,150,247,121,57,42,79,151,150,159,93,242,241,35,229,5,25,107,77,96,126,215,245,142,209,98,231,235,182,222,95,82,142,9,194,55,233,181,122,217,70,0,104,188,33,188,208,234,49,223,136,143,86,99,48,97,249,214,34,4,158,106,154,189,166,189,7,216,193,1,191,54,110,180,173,83,9,8,21,154,78,114,29,255,41,206,
+165,17,134,123,183,116,225,199,15,205,217,16,146,168,190,172,42,70,17,25,56,35,118,165,128,117,102,198,216,16,1,122,96,254,174,207,114,155,201,115,202,34,241,164,87,71,150,24,239,169,57,173,253,204,94,17,69,6,238,77,118,99,137,241,206,141,38,68,220,232,65,248,100,81,121,47,249,52,30,147,65,218,177,38,83,191,214,154,235,233,198,249,179,140,161,69,11,98,14,240,25,7,105,76,161,190,81,155,60,219,54,39,132,53,153,146,150,80,254,46,46,153,185,84,38,252,222,232,158,18,113,93,140,119,22,225,52,206,46,54,
+169,171,73,138,17,69,230,63,3,32,129,131,187,118,145,224,227,19,246,92,91,253,89,233,73,152,62,85,241,33,6,130,108,68,97,62,212,170,206,139,198,207,169,55,126,56,65,127,214,93,38,195,110,179,137,118,124,214,238,202,196,111,214,29,89,10,177,161,225,228,30,20,243,129,121,168,75,215,105,203,19,178,14,119,171,92,161,194,185,57,198,126,1,128,254,169,156,229,153,21,36,11,54,160,54,110,81,28,142,167,22,102,134,194,113,218,62,44,222,111,44,73,185,211,148,240,129,4,9,149,230,184,177,123,73,13,163,30,46,177,
+27,72,62,210,67,45,89,110,251,195,246,219,233,166,145,103,81,31,169,176,204,122,206,12,116,148,97,185,102,241,6,5,222,0,0,0,0,119,7,48,150,238,14,97,44,153,9,81,186,7,109,196,25,112,106,244,143,233,99,165,53,158,100,149,163,14,219,136,50,121,220,184,164,224,213,233,30,151,210,217,136,9,182,76,43,126,177,124,189,231,184,45,7,144,191,29,145,29,183,16,100,106,176,32,242,243,185,113,72,132,190,65,222,26,218,212,125,109,221,228,235,244,212,181,81,131,211,133,199,19,108,152,86,100,107,168,192,253,98,249,
+122,138,101,201,236,20,1,92,79,99,6,108,217,250,15,61,99,141,8,13,245,59,110,32,200,76,105,16,94,213,96,65,228,162,103,113,114,60,3,228,209,75,4,212,71,210,13,133,253,165,10,181,107,53,181,168,250,66,178,152,108,219,187,201,214,172,188,249,64,50,216,108,227,69,223,92,117,220,214,13,207,171,209,61,89,38,217,48,172,81,222,0,58,200,215,81,128,191,208,97,22,33,180,244,181,86,179,196,35,207,186,149,153,184,189,165,15,40,2,184,158,95,5,136,8,198,12,217,178,177,11,233,36,47,111,124,135,88,104,76,17,193,
+97,29,171,182,102,45,61,118,220,65,144,1,219,113,6,152,210,32,188,239,213,16,42,113,177,133,137,6,182,181,31,159,191,228,165,232,184,212,51,120,7,201,162,15,0,249,52,150,9,168,142,225,14,152,24,127,106,13,187,8,109,61,45,145,100,108,151,230,99,92,1,107,107,81,244,28,108,97,98,133,101,48,216,242,98,0,78,108,6,149,237,27,1,165,123,130,8,244,193,245,15,196,87,101,176,217,198,18,183,233,80,139,190,184,234,252,185,136,124,98,221,29,223,21,218,45,73,140,211,124,243,251,212,76,101,77,178,97,88,58,181,81,
+206,163,188,0,116,212,187,48,226,74,223,165,65,61,216,149,215,164,209,196,109,211,214,244,251,67,105,233,106,52,110,217,252,173,103,136,70,218,96,184,208,68,4,45,115,51,3,29,229,170,10,76,95,221,13,124,201,80,5,113,60,39,2,65,170,190,11,16,16,201,12,32,134,87,104,181,37,32,111,133,179,185,102,212,9,206,97,228,159,94,222,249,14,41,217,201,152,176,208,152,34,199,215,168,180,89,179,61,23,46,180,13,129,183,189,92,59,192,186,108,173,237,184,131,32,154,191,179,182,3,182,226,12,116,177,210,154,234,213,71,
+57,157,210,119,175,4,219,38,21,115,220,22,131,227,99,11,18,148,100,59,132,13,109,106,62,122,106,90,168,228,14,207,11,147,9,255,157,10,0,174,39,125,7,158,177,240,15,147,68,135,8,163,210,30,1,242,104,105,6,194,254,247,98,87,93,128,101,103,203,25,108,54,113,110,107,6,231,254,212,27,118,137,211,43,224,16,218,122,90,103,221,74,204,249,185,223,111,142,190,239,249,23,183,190,67,96,176,142,213,214,214,163,232,161,209,147,126,56,216,194,196,79,223,242,82,209,187,103,241,166,188,87,103,63,181,6,221,72,178,
+54,75,216,13,43,218,175,10,27,76,54,3,74,246,65,4,122,96,223,96,239,195,168,103,223,85,49,110,142,239,70,105,190,121,203,97,179,140,188,102,131,26,37,111,210,160,82,104,226,54,204,12,119,149,187,11,71,3,34,2,22,185,85,5,38,47,197,186,59,190,178,189,11,40,43,180,90,146,92,179,106,4,194,215,255,167,181,208,207,49,44,217,158,139,91,222,174,29,155,100,194,176,236,99,242,38,117,106,163,156,2,109,147,10,156,9,6,169,235,14,54,63,114,7,103,133,5,0,87,19,149,191,74,130,226,184,122,20,123,177,43,174,12,182,
+27,56,146,210,142,155,229,213,190,13,124,220,239,183,11,219,223,33,134,211,210,212,241,212,226,66,104,221,179,248,31,218,131,110,129,190,22,205,246,185,38,91,111,176,119,225,24,183,71,119,136,8,90,230,255,15,106,112,102,6,59,202,17,1,11,92,143,101,158,255,248,98,174,105,97,107,255,211,22,108,207,69,160,10,226,120,215,13,210,238,78,4,131,84,57,3,179,194,167,103,38,97,208,96,22,247,73,105,71,77,62,110,119,219,174,209,106,74,217,214,90,220,64,223,11,102,55,216,59,240,169,188,174,83,222,187,158,197,71,
+178,207,127,48,181,255,233,189,189,242,28,202,186,194,138,83,179,147,48,36,180,163,166,186,208,54,5,205,215,6,147,84,222,87,41,35,217,103,191,179,102,122,46,196,97,74,184,93,104,27,2,42,111,43,148,180,11,190,55,195,12,142,161,90,5,223,27,45,2,239,141,0,0,0,0,25,27,49,65,50,54,98,130,43,45,83,195,100,108,197,4,125,119,244,69,86,90,167,134,79,65,150,199,200,217,138,8,209,194,187,73,250,239,232,138,227,244,217,203,172,181,79,12,181,174,126,77,158,131,45,142,135,152,28,207,74,194,18,81,83,217,35,16,120,
+244,112,211,97,239,65,146,46,174,215,85,55,181,230,20,28,152,181,215,5,131,132,150,130,27,152,89,155,0,169,24,176,45,250,219,169,54,203,154,230,119,93,93,255,108,108,28,212,65,63,223,205,90,14,158,149,132,36,162,140,159,21,227,167,178,70,32,190,169,119,97,241,232,225,166,232,243,208,231,195,222,131,36,218,197,178,101,93,93,174,170,68,70,159,235,111,107,204,40,118,112,253,105,57,49,107,174,32,42,90,239,11,7,9,44,18,28,56,109,223,70,54,243,198,93,7,178,237,112,84,113,244,107,101,48,187,42,243,247,162,
+49,194,182,137,28,145,117,144,7,160,52,23,159,188,251,14,132,141,186,37,169,222,121,60,178,239,56,115,243,121,255,106,232,72,190,65,197,27,125,88,222,42,60,240,121,79,5,233,98,126,68,194,79,45,135,219,84,28,198,148,21,138,1,141,14,187,64,166,35,232,131,191,56,217,194,56,160,197,13,33,187,244,76,10,150,167,143,19,141,150,206,92,204,0,9,69,215,49,72,110,250,98,139,119,225,83,202,186,187,93,84,163,160,108,21,136,141,63,214,145,150,14,151,222,215,152,80,199,204,169,17,236,225,250,210,245,250,203,147,
+114,98,215,92,107,121,230,29,64,84,181,222,89,79,132,159,22,14,18,88,15,21,35,25,36,56,112,218,61,35,65,155,101,253,107,167,124,230,90,230,87,203,9,37,78,208,56,100,1,145,174,163,24,138,159,226,51,167,204,33,42,188,253,96,173,36,225,175,180,63,208,238,159,18,131,45,134,9,178,108,201,72,36,171,208,83,21,234,251,126,70,41,226,101,119,104,47,63,121,246,54,36,72,183,29,9,27,116,4,18,42,53,75,83,188,242,82,72,141,179,121,101,222,112,96,126,239,49,231,230,243,254,254,253,194,191,213,208,145,124,204,203,
+160,61,131,138,54,250,154,145,7,187,177,188,84,120,168,167,101,57,59,131,152,75,34,152,169,10,9,181,250,201,16,174,203,136,95,239,93,79,70,244,108,14,109,217,63,205,116,194,14,140,243,90,18,67,234,65,35,2,193,108,112,193,216,119,65,128,151,54,215,71,142,45,230,6,165,0,181,197,188,27,132,132,113,65,138,26,104,90,187,91,67,119,232,152,90,108,217,217,21,45,79,30,12,54,126,95,39,27,45,156,62,0,28,221,185,152,0,18,160,131,49,83,139,174,98,144,146,181,83,209,221,244,197,22,196,239,244,87,239,194,167,148,
+246,217,150,213,174,7,188,233,183,28,141,168,156,49,222,107,133,42,239,42,202,107,121,237,211,112,72,172,248,93,27,111,225,70,42,46,102,222,54,225,127,197,7,160,84,232,84,99,77,243,101,34,2,178,243,229,27,169,194,164,48,132,145,103,41,159,160,38,228,197,174,184,253,222,159,249,214,243,204,58,207,232,253,123,128,169,107,188,153,178,90,253,178,159,9,62,171,132,56,127,44,28,36,176,53,7,21,241,30,42,70,50,7,49,119,115,72,112,225,180,81,107,208,245,122,70,131,54,99,93,178,119,203,250,215,78,210,225,230,
+15,249,204,181,204,224,215,132,141,175,150,18,74,182,141,35,11,157,160,112,200,132,187,65,137,3,35,93,70,26,56,108,7,49,21,63,196,40,14,14,133,103,79,152,66,126,84,169,3,85,121,250,192,76,98,203,129,129,56,197,31,152,35,244,94,179,14,167,157,170,21,150,220,229,84,0,27,252,79,49,90,215,98,98,153,206,121,83,216,73,225,79,23,80,250,126,86,123,215,45,149,98,204,28,212,45,141,138,19,52,150,187,82,31,187,232,145,6,160,217,208,94,126,243,236,71,101,194,173,108,72,145,110,117,83,160,47,58,18,54,232,35,9,
+7,169,8,36,84,106,17,63,101,43,150,167,121,228,143,188,72,165,164,145,27,102,189,138,42,39,242,203,188,224,235,208,141,161,192,253,222,98,217,230,239,35,20,188,225,189,13,167,208,252,38,138,131,63,63,145,178,126,112,208,36,185,105,203,21,248,66,230,70,59,91,253,119,122,220,101,107,181,197,126,90,244,238,83,9,55,247,72,56,118,184,9,174,177,161,18,159,240,138,63,204,51,147,36,253,114,0,0,0,0,1,194,106,55,3,132,212,110,2,70,190,89,7,9,168,220,6,203,194,235,4,141,124,178,5,79,22,133,14,19,81,184,15,209,
+59,143,13,151,133,214,12,85,239,225,9,26,249,100,8,216,147,83,10,158,45,10,11,92,71,61,28,38,163,112,29,228,201,71,31,162,119,30,30,96,29,41,27,47,11,172,26,237,97,155,24,171,223,194,25,105,181,245,18,53,242,200,19,247,152,255,17,177,38,166,16,115,76,145,21,60,90,20,20,254,48,35,22,184,142,122,23,122,228,77,56,77,70,224,57,143,44,215,59,201,146,142,58,11,248,185,63,68,238,60,62,134,132,11,60,192,58,82,61,2,80,101,54,94,23,88,55,156,125,111,53,218,195,54,52,24,169,1,49,87,191,132,48,149,213,179,50,
+211,107,234,51,17,1,221,36,107,229,144,37,169,143,167,39,239,49,254,38,45,91,201,35,98,77,76,34,160,39,123,32,230,153,34,33,36,243,21,42,120,180,40,43,186,222,31,41,252,96,70,40,62,10,113,45,113,28,244,44,179,118,195,46,245,200,154,47,55,162,173,112,154,141,192,113,88,231,247,115,30,89,174,114,220,51,153,119,147,37,28,118,81,79,43,116,23,241,114,117,213,155,69,126,137,220,120,127,75,182,79,125,13,8,22,124,207,98,33,121,128,116,164,120,66,30,147,122,4,160,202,123,198,202,253,108,188,46,176,109,126,
+68,135,111,56,250,222,110,250,144,233,107,181,134,108,106,119,236,91,104,49,82,2,105,243,56,53,98,175,127,8,99,109,21,63,97,43,171,102,96,233,193,81,101,166,215,212,100,100,189,227,102,34,3,186,103,224,105,141,72,215,203,32,73,21,161,23,75,83,31,78,74,145,117,121,79,222,99,252,78,28,9,203,76,90,183,146,77,152,221,165,70,196,154,152,71,6,240,175,69,64,78,246,68,130,36,193,65,205,50,68,64,15,88,115,66,73,230,42,67,139,140,29,84,241,104,80,85,51,2,103,87,117,188,62,86,183,214,9,83,248,192,140,82,58,
+170,187,80,124,20,226,81,190,126,213,90,226,57,232,91,32,83,223,89,102,237,134,88,164,135,177,93,235,145,52,92,41,251,3,94,111,69,90,95,173,47,109,225,53,27,128,224,247,113,183,226,177,207,238,227,115,165,217,230,60,179,92,231,254,217,107,229,184,103,50,228,122,13,5,239,38,74,56,238,228,32,15,236,162,158,86,237,96,244,97,232,47,226,228,233,237,136,211,235,171,54,138,234,105,92,189,253,19,184,240,252,209,210,199,254,151,108,158,255,85,6,169,250,26,16,44,251,216,122,27,249,158,196,66,248,92,174,117,
+243,0,233,72,242,194,131,127,240,132,61,38,241,70,87,17,244,9,65,148,245,203,43,163,247,141,149,250,246,79,255,205,217,120,93,96,216,186,55,87,218,252,137,14,219,62,227,57,222,113,245,188,223,179,159,139,221,245,33,210,220,55,75,229,215,107,12,216,214,169,102,239,212,239,216,182,213,45,178,129,208,98,164,4,209,160,206,51,211,230,112,106,210,36,26,93,197,94,254,16,196,156,148,39,198,218,42,126,199,24,64,73,194,87,86,204,195,149,60,251,193,211,130,162,192,17,232,149,203,77,175,168,202,143,197,159,200,
+201,123,198,201,11,17,241,204,68,7,116,205,134,109,67,207,192,211,26,206,2,185,45,145,175,150,64,144,109,252,119,146,43,66,46,147,233,40,25,150,166,62,156,151,100,84,171,149,34,234,242,148,224,128,197,159,188,199,248,158,126,173,207,156,56,19,150,157,250,121,161,152,181,111,36,153,119,5,19,155,49,187,74,154,243,209,125,141,137,53,48,140,75,95,7,142,13,225,94,143,207,139,105,138,128,157,236,139,66,247,219,137,4,73,130,136,198,35,181,131,154,100,136,130,88,14,191,128,30,176,230,129,220,218,209,132,
+147,204,84,133,81,166,99,135,23,24,58,134,213,114,13,169,226,208,160,168,32,186,151,170,102,4,206,171,164,110,249,174,235,120,124,175,41,18,75,173,111,172,18,172,173,198,37,167,241,129,24,166,51,235,47,164,117,85,118,165,183,63,65,160,248,41,196,161,58,67,243,163,124,253,170,162,190,151,157,181,196,115,208,180,6,25,231,182,64,167,190,183,130,205,137,178,205,219,12,179,15,177,59,177,73,15,98,176,139,101,85,187,215,34,104,186,21,72,95,184,83,246,6,185,145,156,49,188,222,138,180,189,28,224,131,191,90,
+94,218,190,152,52,237,0,0,0,0,184,188,103,101,170,9,200,139,18,181,175,238,143,98,151,87,55,222,240,50,37,107,95,220,157,215,56,185,197,180,40,239,125,8,79,138,111,189,224,100,215,1,135,1,74,214,191,184,242,106,216,221,224,223,119,51,88,99,16,86,80,25,87,159,232,165,48,250,250,16,159,20,66,172,248,113,223,123,192,200,103,199,167,173,117,114,8,67,205,206,111,38,149,173,127,112,45,17,24,21,63,164,183,251,135,24,208,158,26,207,232,39,162,115,143,66,176,198,32,172,8,122,71,201,160,50,175,62,24,142,200,
+91,10,59,103,181,178,135,0,208,47,80,56,105,151,236,95,12,133,89,240,226,61,229,151,135,101,134,135,209,221,58,224,180,207,143,79,90,119,51,40,63,234,228,16,134,82,88,119,227,64,237,216,13,248,81,191,104,240,43,248,161,72,151,159,196,90,34,48,42,226,158,87,79,127,73,111,246,199,245,8,147,213,64,167,125,109,252,192,24,53,159,208,78,141,35,183,43,159,150,24,197,39,42,127,160,186,253,71,25,2,65,32,124,16,244,143,146,168,72,232,247,155,20,88,61,35,168,63,88,49,29,144,182,137,161,247,211,20,118,207,106,
+172,202,168,15,190,127,7,225,6,195,96,132,94,160,112,210,230,28,23,183,244,169,184,89,76,21,223,60,209,194,231,133,105,126,128,224,123,203,47,14,195,119,72,107,203,13,15,162,115,177,104,199,97,4,199,41,217,184,160,76,68,111,152,245,252,211,255,144,238,102,80,126,86,218,55,27,14,185,39,77,182,5,64,40,164,176,239,198,28,12,136,163,129,219,176,26,57,103,215,127,43,210,120,145,147,110,31,244,59,38,247,3,131,154,144,102,145,47,63,136,41,147,88,237,180,68,96,84,12,248,7,49,30,77,168,223,166,241,207,186,
+254,146,223,236,70,46,184,137,84,155,23,103,236,39,112,2,113,240,72,187,201,76,47,222,219,249,128,48,99,69,231,85,107,63,160,156,211,131,199,249,193,54,104,23,121,138,15,114,228,93,55,203,92,225,80,174,78,84,255,64,246,232,152,37,174,139,136,115,22,55,239,22,4,130,64,248,188,62,39,157,33,233,31,36,153,85,120,65,139,224,215,175,51,92,176,202,237,89,182,59,85,229,209,94,71,80,126,176,255,236,25,213,98,59,33,108,218,135,70,9,200,50,233,231,112,142,142,130,40,237,158,212,144,81,249,177,130,228,86,95,
+58,88,49,58,167,143,9,131,31,51,110,230,13,134,193,8,181,58,166,109,189,64,225,164,5,252,134,193,23,73,41,47,175,245,78,74,50,34,118,243,138,158,17,150,152,43,190,120,32,151,217,29,120,244,201,75,192,72,174,46,210,253,1,192,106,65,102,165,247,150,94,28,79,42,57,121,93,159,150,151,229,35,241,242,77,107,25,5,245,215,126,96,231,98,209,142,95,222,182,235,194,9,142,82,122,181,233,55,104,0,70,217,208,188,33,188,136,223,49,234,48,99,86,143,34,214,249,97,154,106,158,4,7,189,166,189,191,1,193,216,173,180,
+110,54,21,8,9,83,29,114,78,154,165,206,41,255,183,123,134,17,15,199,225,116,146,16,217,205,42,172,190,168,56,25,17,70,128,165,118,35,216,198,102,117,96,122,1,16,114,207,174,254,202,115,201,155,87,164,241,34,239,24,150,71,253,173,57,169,69,17,94,204,118,77,238,6,206,241,137,99,220,68,38,141,100,248,65,232,249,47,121,81,65,147,30,52,83,38,177,218,235,154,214,191,179,249,198,233,11,69,161,140,25,240,14,98,161,76,105,7,60,155,81,190,132,39,54,219,150,146,153,53,46,46,254,80,38,84,185,153,158,232,222,
+252,140,93,113,18,52,225,22,119,169,54,46,206,17,138,73,171,3,63,230,69,187,131,129,32,227,224,145,118,91,92,246,19,73,233,89,253,241,85,62,152,108,130,6,33,212,62,97,68,198,139,206,170,126,55,169,207,214,127,65,56,110,195,38,93,124,118,137,179,196,202,238,214,89,29,214,111,225,161,177,10,243,20,30,228,75,168,121,129,19,203,105,215,171,119,14,178,185,194,161,92,1,126,198,57,156,169,254,128,36,21,153,229,54,160,54,11,142,28,81,110,134,102,22,167,62,218,113,194,44,111,222,44,148,211,185,73,9,4,129,
+240,177,184,230,149,163,13,73,123,27,177,46,30,67,210,62,72,251,110,89,45,233,219,246,195,81,103,145,166,204,176,169,31,116,12,206,122,102,185,97,148,222,5,6,241,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,
+50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,
+27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,
+63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,
+97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,
+218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,
+227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,
+124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,
+81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,
+50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,
+27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,
+63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,
+97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,
+218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,227,63,81,218,27,124,97,50,
+227,63,81,218,27,124,97,50,227,63,12,0,0,0,4,0,0,0,6,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,9,0,0,0,8,0,0,0,11,0,0,0,12,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,21,0,0,0,22,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,41,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,46,0,0,0,47,0,0,0,48,0,0,0,51,0,0,0,52,0,0,0,53,0,0,0,54,0,0,0,55,0,0,0,56,0,0,0,57,0,0,0,58,0,0,0,61,0,0,0,62,0,0,0,63,0,0,0,64,0,0,0,65,0,0,
+0,66,0,0,0,67,0,0,0,68,0,0,0,71,0,0,0,72,0,0,0,73,0,0,0,74,0,0,0,75,0,0,0,76,0,0,0,77,0,0,0,78,0,0,0,81,0,0,0,82,0,0,0,83,0,0,0,84,0,0,0,85,0,0,0,86,0,0,0,87,0,0,0,88,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,86,0,0,0,4,0,4,0,8,0,4,0,106,0,0,0,4,0,5,0,16,0,8,0,106,0,0,0,4,0,6,0,32,0,32,0,106,0,0,0,4,0,4,0,16,0,16,0,132,0,0,0,8,0,16,0,32,0,32,0,132,0,0,0,8,0,16,0,128,0,128,0,132,0,0,0,8,0,32,0,128,0,0,1,132,0,0,0,32,0,128,0,2,1,0,4,132,
+0,0,0,32,0,2,1,2,1,0,16,132,0,0,0,88,247,1,0,85,93,201,127,201,127,255,0,0,196,1,0,187,45,212,190,174,212,255,0,144,167,1,0,20,119,253,253,192,134,255,0,80,145,1,0,85,93,201,127,201,127,255,0,248,122,1,0,187,45,212,190,174,212,255,0,72,101,1,0,20,119,253,253,192,134,255,0,168,80,1,0,42,102,255,255,255,153,255,0,216,61,1,0,85,93,201,127,201,127,255,0,40,142,2,0,187,45,212,190,174,212,255,0,104,125,2,0,20,119,253,253,192,134,255,0,72,109,2,0,42,102,255,255,255,153,255,0,192,89,2,0,151,173,176,56,108,
+176,255,0,32,77,2,0,85,93,201,127,201,127,255,0,216,65,2,0,187,45,212,190,174,212,255,0,136,53,2,0,20,119,253,253,192,134,255,0,0,42,2,0,42,102,255,255,255,153,255,0,152,29,2,0,151,173,176,56,108,176,255,0,128,19,2,0,232,252,240,240,2,127,255,0,24,9,2,0,85,93,201,127,201,127,255,0,88,0,2,0,187,45,212,190,174,212,255,0,200,246,1,0,20,119,253,253,192,134,255,0,16,231,1,0,42,102,255,255,255,153,255,0,192,221,1,0,151,173,176,56,108,176,255,0,16,218,1,0,232,252,240,240,2,127,255,0,176,215,1,0,17,224,191,
+191,91,23,255,0,232,211,1,0,85,93,201,127,201,127,255,0,144,208,1,0,187,45,212,190,174,212,255,0,24,205,1,0,20,119,253,253,192,134,255,0,80,202,1,0,42,102,255,255,255,153,255,0,232,197,1,0,151,173,176,56,108,176,255,0,168,193,1,0,232,252,240,240,2,127,255,0,248,192,1,0,17,224,191,191,91,23,255,0,112,189,1,0,0,0,102,102,102,102,255,0,192,186,1,0,147,25,247,222,235,247,255,0,168,184,1,0,142,75,225,158,202,225,255,0,120,181,1,0,145,188,189,49,130,189,255,0,112,180,1,0,159,16,255,239,243,255,255,0,16,
+178,1,0,143,46,231,189,215,231,255,0,80,175,1,0,143,127,214,107,174,214,255,0,120,172,1,0,147,208,181,33,113,181,255,0,72,169,1,0,159,16,255,239,243,255,255,0,8,166,1,0,143,46,231,189,215,231,255,0,136,162,1,0,143,127,214,107,174,214,255,0,152,160,1,0,145,188,189,49,130,189,255,0,24,159,1,0,149,241,156,8,81],"i8",L,l.J+30737);D([156,255,0,104,157,1,0,159,16,255,239,243,255,255,0,120,154,1,0,148,43,239,198,219,239,255,0,248,153,1,0,142,75,225,158,202,225,255,0,248,151,1,0,143,127,214,107,174,214,255,
+0,56,150,1,0,145,188,189,49,130,189,255,0,216,146,1,0,149,241,156,8,81,156,255,0,72,144,1,0,159,16,255,239,243,255,255,0,72,140,1,0,148,43,239,198,219,239,255,0,168,138,1,0,142,75,225,158,202,225,255,0,208,136,1,0,143,127,214,107,174,214,255,0,32,135,1,0,144,169,198,66,146,198,255,0,32,133,1,0,147,208,181,33,113,181,255,0,152,131,1,0,151,241,148,8,69,148,255,0,232,129,1,0,148,8,255,247,251,255,255,0,80,128,1,0,147,25,247,222,235,247,255,0,8,125,1,0,148,43,239,198,219,239,255,0,8,122,1,0,142,75,225,
+158,202,225,255,0,160,118,1,0,143,127,214,107,174,214,255,0,144,116,1,0,144,169,198,66,146,198,255,0,208,114,1,0,147,208,181,33,113,181,255,0,48,113,1,0,151,241,148,8,69,148,255,0,168,111,1,0,148,8,255,247,251,255,255,0,208,109,1,0,147,25,247,222,235,247,255,0,224,107,1,0,148,43,239,198,219,239,255,0,56,106,1,0,142,75,225,158,202,225,255,0,128,103,1,0,143,127,214,107,174,214,255,0,104,100,1,0,144,169,198,66,146,198,255,0,24,98,1,0,147,208,181,33,113,181,255,0,224,95,1,0,149,241,156,8,81,156,255,0,
+248,93,1,0,152,235,107,8,48,107,255,0,80,92,1,0,23,239,84,84,48,5,255,0,120,90,1,0,119,255,60,0,60,48,255,0,168,88,1,0,23,236,140,140,81,10,255,0,248,86,1,0,24,194,191,191,129,45,255,0,64,85,1,0,29,112,223,223,194,125,255,0,16,83,1,0,30,52,246,246,232,195,255,0,184,80,1,0,121,38,234,199,234,229,255,0,192,77,1,0,120,95,205,128,205,193,255,0,240,75,1,0,124,165,151,53,151,143,255,0,184,74,1,0,124,252,102,1,102,94,255,0,232,72,1,0,23,239,84,84,48,5,255,0,72,71,1,0,124,252,102,1,102,94,255,0,200,69,1,
+0,119,255,60,0,60,48,255,0,16,68,1,0,23,236,140,140,81,10,255,0,176,66,1,0,24,194,191,191,129,45,255,0,88,64,1,0,29,112,223,223,194,125,255,0,48,62,1,0,30,52,246,246,232,195,255,0,160,59,1,0,0,0,245,245,245,245,255,0,232,57,1,0,121,38,234,199,234,229,255,0,112,56,1,0,120,95,205,128,205,193,255,0,208,54,1,0,124,165,151,53,151,143,255,0,104,53,1,0,28,135,216,216,179,101,255,0,88,52,1,0,0,0,245,245,245,245,255,0,248,147,2,0,123,127,180,90,180,172,255,0,176,146,2,0,21,215,166,166,97,26,255,0,32,145,2,
+0,29,112,223,223,194,125,255,0,24,143,2,0,120,95,205,128,205,193,255,0,112,140,2,0,121,253,133,1,133,113,255,0,224,138,2,0,21,215,166,166,97,26,255,0,96,137,2,0,29,112,223,223,194,125,255,0,232,135,2,0,0,0,245,245,245,245,255,0,160,134,2,0,120,95,205,128,205,193,255,0,104,133,2,0,121,253,133,1,133,113,255,0,224,131,2,0,23,236,140,140,81,10,255,0,152,130,2,0,28,135,216,216,179,101,255,0,248,128,2,0,30,52,246,246,232,195,255,0,248,126,2,0,121,38,234,199,234,229,255,0,16,124,2,0,123,127,180,90,180,172,
+255,0,184,122,2,0,124,252,102,1,102,94,255,0,80,121,2,0,23,236,140,140,81,10,255,0,248,119,2,0,28,135,216,216,179,101,255,0,208,118,2,0,30,52,246,246,232,195,255,0,128,117,2,0,0,0,245,245,245,245,255,0,48,116,2,0,121,38,234,199,234,229,255,0,8,115,2,0,123,127,180,90,180,172,255,0,248,112,2,0,124,252,102,1,102,94,255,0,40,109,2,0,23,236,140,140,81,10,255,0,152,108,2,0,24,194,191,191,129,45,255,0,104,107,2,0,29,112,223,223,194,125,255,0,80,106,2,0,30,52,246,246,232,195,255,0,48,105,2,0,121,38,234,199,
+234,229,255,0,168,103,2,0,120,95,205,128,205,193,255,0,120,101,2,0,124,165,151,53,151,143,255,0,32,100,2,0,124,252,102,1,102,94,255,0,144,98,2,0,23,236,140,140,81,10,255,0,128,93,2,0,24,194,191,191,129,45,255,0,104,91,2,0,29,112,223,223,194,125,255,0,16,89,2,0,30,52,246,246,232,195,255,0,176,87,2,0,0,0,245,245,245,245,255,0,184,86,2,0,121,38,234,199,234,229,255,0,152,85,2,0,120,95,205,128,205,193,255,0,192,84,2,0,124,165,151,53,151,143,255,0,136,83,2,0,124,252,102,1,102,94,255,0,144,82,2,0,135,20,
+249,229,245,249,255,0,120,81,2,0,117,74,216,153,216,201,255,0,40,80,2,0,103,185,162,44,162,95,255,0,216,78,2,0,136,14,251,237,248,251,255,0,208,76,2,0,127,54,226,178,226,226,255,0,232,75,2,0,113,120,194,102,194,164,255,0,0,75,2,0,98,190,139,35,139,69,255,0,0,74,2,0,136,14,251,237,248,251,255,0,48,73,2,0,127,54,226,178,226,226,255,0,64,72,2,0,113,120,194,102,194,164,255,0,56,71,2,0,103,185,162,44,162,95,255,0,104,70,2,0,102,255,109,0,109,44,255,0,16,69,2,0,136,14,251,237,248,251,255,0,80,67,2,0,119,
+34,236,204,236,230,255,0,152,65,2,0,117,74,216,153,216,201,255,0,152,64,2,0,113,120,194,102,194,164,255,0,128,63,2,0,103,185,162,44,162,95,255,0,80,62,2,0,102,255,109,0,109,44,255,0,96,61,2,0,136,14,251,237,248,251,255,0,192,59,2,0,119,34,236,204,236,230,255,0,48,59,2,0,117,74,216,153,216,201,255,0,48,58,2,0,113,120,194,102,194,164,255,0,128,56,2,0,105,159,174,65,174,118,255,0,8,55,2,0,98,190,139,35,139,69,255,0,88,53,2,0,102,255,88,0,88,36,255,0,88,52,2,0,134,6,253,247,252,253,255,0,64,51,2,0,135,
+20,249,229,245,249,255,0,8,50,2,0,119,34,236,204,236,230,255,0,88,49,2,0,117,74,216,153,216,201,255,0,112,48,2,0,113,120,194,102,194,164,255,0,112,47,2,0,105,159,174,65,174,118,255,0,144,46,2,0,98,190,139,35,139,69,255,0,224,44,2,0,102,255,88,0,88,36,255,0,96,43,2,0,134,6,253,247,252,253,255,0,216,41,2,0,135,20,249,229,245,249,255,0,80,40,2,0,119,34,236,204,236,230,255,0,80,39,2,0,117,74,216,153,216,201,255,0,72,38,2,0,113,120,194,102,194,164,255,0,104,37,2,0,105,159,174,65,174,118,255,0,112,36,2,
+0,98,190,139,35,139,69,255,0,96,35,2,0,102,255,109,0,109,44,255,0,88,34,2,0,101,255,68,0,68,27,255,0,240,32,2,0,144,20,244,224,236,244,255,0,96,31,2,0,148,70,218,158,188,218,255,0,168,29,2,0,196,123,167,136,86,167,255,0,144,28,2,0,136,14,251,237,248,251,255,0,224,27,2,0,146,53,227,179,205,227,255,0,48,27,2,0,162,74,198,140,150,198,255,0,120,26,2,0,202,149,157,136,65,157,255,0,128,25,2,0,136,14,251,237,248,251,255,0,160,24,2,0,146,53,227,179,205,227,255,0,224,23,2,0,162,74,198,140,150,198,255,0,168,
+22,2,0,196,123,167,136,86,167,255,0,112,21,2,0,214,225,129,129,15,124,255,0,160,19,2,0,136,14,251,237,248,251,255,0,136,18,2,0,148,43,230,191,211,230,255,0,152,17,2,0,148,70,218,158,188,218,255,0,40,16,2,0,162,74,198,140,150,198,255,0,24,15,2,0,196,123,167,136,86,167,255,0,24,14,2,0,214,225,129,129,15,124,255,0,24,13,2,0,136,14,251,237,248,251,255,0,144,12,2,0,148,43,230,191,211,230,255,0,48,11,2,0,148,70,218,158,188,218,255,0,64,10,2,0,162,74,198,140,150,198,255,0,56,9,2,0,190,100,177,140,107,177,
+255,0,120,8,2,0,202,149,157,136,65,157,255,0,232,7,2,0,213,252,110,110,1,107,255,0,48,7,2,0,134,6,253,247,252,253,255,0,168,6,2,0,144,20,244,224,236,244,255,0,24,6,2,0,148,43,230,191,211,230,255,0,112,5,2,0,148,70,218,158,188,218,255,0,224,4,2,0,162,74,198,140,150,198,255,0,112,3,2,0,190,100,177,140,107,177,255,0,0,2,2,0,202,149,157,136,65,157,255,0,224,0,2,0,213,252,110,110,1,107,255,0,216,255,1,0,134,6,253,247,252,253,255,0,72,255,1,0,144,20,244,224,236,244,255,0,184,254,1,0,148,43,230,191,211,
+230,255,0,32,254,1,0,148,70,218,158,188,218,255,0,136,253,1,0,162,74,198,140,150,198,255,0,104,252,1,0,190,100,177,140,107,177,255,0,184,251,1,0,202,149,157,136,65,157,255,0,160,250,1,0,214,225,129,129,15,124,255,0,208,248,1,0,213,255,77,77,0,75,255,0,152,246,1,0,114,211,158,27,158,119,255,0,40,246,1,0,18,252,217,217,95,2,255,0,16,245,1,0,173,95,179,117,112,179,255,0,40,244,1,0,114,211,158,27,158,119,255,0,208,242,1,0,18,252,217,217,95,2,255,0,168,241,1,0,173,95,179,117,112,179,255,0,136,240,1,0,
+233,209,231,231,41,138,255,0,128,239,1,0,114,211,158,27,158,119,255,0,152,237,1,0,18,252,217,217,95,2,255,0,152,236,1,0,173,95,179,117,112,179,255,0,216,234,1,0,233,209,231,231,41,138,255,0,16,234,1,0,62,208,166,102,166,30,255,0,232,232,1,0,114,211,158,27,158,119,255,0,56,232,1,0,18,252,217,217,95,2,255,0,176,231,1,0,173,95,179,117,112,179,255,0,56,231,1,0,233,209,231,231,41,138,255,0,32,230,1,0,62,208,166,102,166,30,255,0,128,229,1,0,31,252,230,230,171,2,255,0,24,228,1,0,114,211,158,27,158,119,255,
+0,232,226,1,0,18,252,217,217,95,2,255,0,176,225,1,0,173,95,179,117,112,179,255,0,200,224,1,0,233,209,231,231,41,138,255,0,0,224,1,0,62,208,166,102,166,30,255,0,88,223,1,0,31,252,230,230,171,2,255,0,96,222,1,0,27,210,166,166,118,29,255,0,232,221,1,0,114,211,158,27,158,119,255,0,0,221,1,0,18,252,217,217,95,2,255,0,168,220,1,0,173,95,179,117,112,179,255,0,48,220,1,0,233,209,231,231,41,138,255,0,144,219,1,0,62,208,166,102,166,30,255,0,8,219,1,0,31,252,230,230,171,2,255,0,200,218,1,0,27,210,166,166,118,
+29,255,0,168,218,1,0,0,0,102,102,102,102,255,0,104,218,1,0,76,25,243,224,243,219,255,0,64,218,1,0,95,61,221,168,221,181,255,0,40,218,1,0,140,170,202,67,162,202,255,0,192,217,1,0,65,17,249,240,249,232,255,0,160,217,1,0,87,46,228,186,228,188,255,0,24,217,1,0,123,101,204,123,204,196,255,0,40,216,1,0,141,197,190,43,140,190,255,0,200,215,1,0,65,17,249,240,249,232,255,0,152,215,1,0,87,46,228,186,228,188,255,0,96,215,1,0,123,101,204,123,204,196,255,0,40,215,1,0,140,170,202,67,162,202,255,0,168,214,1,0,145,
+243,172,8,104,172,255,0,144,214,1,0,65,17,249,240,249,232,255,0,64,214,1,0,77,41,235,204,235,197,255,0,16,214,1,0,95,61,221,168,221,181,255,0,208,213,1,0,123,101,204,123,204,196,255,0,64,213,1,0,140,170,202,67,162,202,255,0,200,212,1,0,145,243,172,8,104,172,255,0,160,212,1,0,65,17,249,240,249,232,255,0,112,212,1,0,77,41,235,204,235,197,255,0,72,212,1,0,95,61,221,168,221,181,255,0,32,212,1,0,123,101,204,123,204,196,255,0,8,212,1,0,137,160,211,78,179,211,255,0,184,211,1,0,141,197,190,43,140,190,255,
+0,64,211,1,0,147,242,158,8,88,158,255,0,248,210,1,0,60,12,252,247,252,240,255,0,16,210,1,0,76,25,243,224,243,219,255,0,128,209,1,0,77,41,235,204,235,197,255,0,96,209,1,0,95,61,221,168,221,181,255,0,56,209,1,0,123,101,204,123,204,196,255,0,8,209,1,0,137,160,211,78,179,211,255,0,224,208,1,0,141,197,190,43,140,190,255,0,184,208,1,0,147,242,158,8,88,158,255,0,96,208,1,0,60,12,252,247,252,240,255,0,56,208,1,0,76,25,243,224,243,219,255,0,248,207,1,0,77,41,235,204,235,197,255,0,120,207,1,0,95,61,221,168,
+221,181,255,0,16,207,1,0,123,101,204,123,204,196,255,0,208,206,1,0,137,160,211,78,179,211,255,0,80,206,1,0,141,197,190,43,140,190,255,0,232,205,1,0,145,243,172,8,104,172,255,0,160,205,1,0,150,239,129,8,64,129,255,0,96,205,1,0,74,21,245,229,245,224,255,0,208,204,1,0,80,72,217,161,217,155,255,0,184,204,1,0,98,178,163,49,163,84,255,0,104,204,1,0,73,15,248,237,248,233,255,0,192,203,1,0,78,54,228,186,228,179,255,0,88,203,1,0,86,104,196,116,196,118,255,0,48,203,1,0,98,190,139,35,139,69,255,0,224,202,1,
+0,73,15,248,237,248,233,255,0,152,202,1,0,78,54,228,186,228,179,255,0,120,202,1,0,86,104,196,116,196,118,255,0,104,202,1,0,98,178,163,49,163,84,255,0,32,202,1,0,102,255,109,0,109,44,255,0,0,202,1,0,73,15,248,237,248,233,255,0,224,200,1,0,77,44,233,199,233,192,255,0,48,200,1,0,80,72,217,161,217,155,255,0,184,199,1,0,86,104,196,116,196,118,255,0,8,199,1,0,98,178,163,49,163,84,255,0,192,198,1,0,102,255,109,0,109,44,255,0,104,198,1,0,73,15,248,237,248,233,255,0,64,198,1,0,77,44,233,199,233,192,255,0,
+40,198,1,0,80,72,217,161,217,155,255,0,176,197,1,0,86,104,196,116,196,118,255,0,136,197,1,0,96,158,171,65,171,93,255,0,64,197,1,0,98,190,139,35,139,69,255,0,136,196,1,0,108,255,90,0,90,50,255,0,24,196,1,0,72,7,252,247,252,245,255,0,112,195,1,0,74,21,245,229,245,224,255,0,0,195,1,0,77,44,233,199,233,192,255,0,200,194,1,0,80,72,217,161,217,155,255,0,168,194,1,0,86,104,196,116,196,118,255,0,8,194,1,0,96,158,171,65,171,93,255,0,112,193,1,0,98,190,139,35,139,69,255,0,8,193,1,0,108,255,90,0,90,50,255,0,
+32,192,1,0,72,7,252,247,252,245,255,0,56,191,1,0,74,21,245,229,245,224,255,0,168,190,1,0,77,44,233,199,233,192,255,0,112,190,1,0,80,72,217,161,217,155,255,0,72,190,1,0,86,104,196,116,196,118,255,0,24,190,1,0,96,158,171,65,171,93,255,0,248,189,1,0,98,190,139,35,139,69,255,0,192,189,1,0,102,255,109,0,109,44,255,0,144,189,1,0,101,255,68,0,68,27,255,0,128,189,1,0,0,0,240,240,240,240,255,0,240,188,1,0,0,0,189,189,189,189,255,0,32,188,1,0,0,0,99,99,99,99,255,0,208,187,1,0,0,0,247,247,247,247,255,0,176,
+187,1,0,0,0,204,204,204,204,255,0,112,187,1,0,0,0,150,150,150,150,255,0,80,187,1,0,0,0,82,82,82,82,255,0,56,187,1,0,0,0,247,247,247,247,255,0,16,187,1,0,0,0,204,204,204,204,255,0,224,186,1,0,0,0,150,150,150,150,255,0,208,186,1,0,0,0,99,99,99,99,255,0,128,186,1,0,0,0,37,37,37,37,255,0,40,186,1,0,0,0,247,247,247,247,255,0,168,185,1,0,0,0,217,217,217,217,255,0,128,185,1,0,0,0,189,189,189,189,255,0,104,185,1,0,0,0,150,150,150,150,255,0,72,185,1,0,0,0,99,99,99,99,255,0,16,185,1,0,0,0,37,37,37,37,255,0,
+248,184,1,0,0,0,247,247,247,247,255,0,200,184,1,0,0,0,217,217,217,217,255,0,184,184,1,0,0,0,189,189,189,189,255,0,120,184,1,0,0,0,150,150,150,150,255,0,232,183,1,0,0,0,115,115,115,115,255,0,168,183,1,0,0,0,82,82,82,82,255,0,136,183,1,0,0,0,37,37,37,37,255,0,112,183,1,0,0,0,255,255,255,255,255,0,72,183,1,0,0,0,240,240,240,240,255,0,48,183,1,0,0,0,217,217,217,217,255,0,24,183,1,0,0,0,189,189,189,189,255,0,224,182,1,0,0,0,150,150,150,150,255,0,208,182,1,0,0,0,115,115,115,115,255,0,176,182,1,0,0,0,82,
+82,82,82,255,0,240,181,1,0,0,0,37,37,37,37,255,0,160,181,1,0,0,0,255,255,255,255,255,0,96,181,1,0,0,0,240,240,240,240,255,0,64,181,1,0,0,0,217,217,217,217,255,0,16,181,1,0,0,0,189,189,189,189,255,0,248,180,1,0,0,0,150,150,150,150,255,0,224,180,1,0,0,0,115,115,115,115,255,0,144,180,1,0,0,0,82,82,82,82,255,0,128,180,1,0,0,0,37,37,37,37,255,0,64,180,1,0,0,0,0,0,0,0,255,0,176,179,1,0,21,48,254,254,230,206,255,0,72,179,1,0,19,147,253,253,174,107,255,0,24,179,1,0,14,240,230,230,85,13,255,0,240,178,1,0,
+19,32,254,254,237,222,255,0,200,178,1,0,20,120,253,253,190,133,255,0,184,178,1,0,17,194,253,253,141,60,255,0,160,178,1,0,13,253,217,217,71,1,255,0,48,178,1,0,19,32,254,254,237,222,255,0,32,178,1,0,20,120,253,253,190,133,255,0,200,177,1,0,17,194,253,253,141,60,255,0,8,177,1,0,14,240,230,230,85,13,255,0,96,176,1,0,13,250,166,166,54,3,255,0,80,176,1,0,19,32,254,254,237,222,255,0,40,176,1,0,21,91,253,253,208,162,255,0,0,176,1,0,19,147,253,253,174,107,255,0,240,175,1,0,17,194,253,253,141,60,255,0,224,
+175,1,0,14,240,230,230,85,13,255,0,112,175,1,0,13,250,166,166,54,3,255,0,96,175,1,0,19,32,254,254,237,222,255,0,40,175,1,0,21,91,253,253,208,162,255,0,48,174,1,0,19,147,253,253,174,107,255,0,216,173,1,0,17,194,253,253,141,60,255,0,200,173,1,0,16,234,241,241,105,19,255,0,160,173,1,0,13,253,217,217,72,1,255,0,120,173,1,0,12,247,140,140,45,4,255,0,104,173,1,0,21,20,255,255,245,235,255,0,88,173,1,0,21,48,254,254,230,206,255,0,248,172,1,0,21,91,253,253,208,162,255,0,136,172,1,0,19,147,253,253,174,107,
+255,0,64,172,1,0,17,194,253,253,141,60,255,0,144,171,1,0,16,234,241,241,105,19,255,0,8,171,1,0,13,253,217,217,72,1,255,0,200,170,1,0,12,247,140,140,45,4,255,0,128,170,1,0,21,20,255,255,245,235,255,0,16,170,1,0,21,48,254,254,230,206,255,0,208,169,1,0,21,91,253,253,208,162,255,0,184,169,1,0,19,147,253,253,174,107,255,0,152,169,1,0,17,194,253,253,141,60,255,0,88,169,1,0,16,234,241,241,105,19,255,0,8,169,1,0,13,253,217,217,72,1,255,0,96,168,1,0,13,250,166,166,54,3,255,0,232,167,1,0,12,246,127,127,39,
+4,255,0,208,167,1,0,25,54,254,254,232,200,255,0,120,167,1,0,19,121,253,253,187,132,255,0,48,167,1,0,5,197,227,227,74,51,255,0,240,166,1,0,26,37,254,254,240,217,255,0,136,166,1,0,24,115,253,253,204,138,255,0,80,166,1,0,13,164,252,252,141,89,255,0,24,166,1,0,3,218,215,215,48,31,255,0,56,165,1,0,26,37,254,254,240,217,255,0,104,164,1,0,24,115,253,253,204,138,255,0,112,163,1,0,13,164,252,252,141,89,255,0,96,163,1,0,5,197,227,227,74,51,255,0,32,163,1,0,0,255,179,179,0,0,255,0,0,163,1,0,26,37,254,254,240,
+217,255,0,240,162,1,0,24,95,253,253,212,158,255,0,200,162,1,0,19,121,253,253,187,132,255,0,168,162,1,0,13,164,252,252,141,89,255,0,152,162,1,0,5,197,227,227,74,51,255,0,80,162,1,0,0,255,179,179,0,0,255,0,200,161,1,0,26,37,254,254,240,217,255,0,96,161,1,0,24,95,253,253,212,158,255,0,64,161,1,0,19,121,253,253,187,132,255,0,32,161,1,0,13,164,252,252,141,89,255,0,248,160,1,0,7,178,239,239,101,72,255,0,224,160,1,0,3,218,215,215,48,31,255,0,208,160,1,0,0,255,153,153,0,0,255,0,184,160,1,0,24,18,255,255,
+247,236,255,0,168,160,1,0,25,54,254,254,232,200,255,0,136,160,1,0,24,95,253,253,212,158,255,0,16,160,1,0,19,121,253,253,187,132,255,0,184,159,1,0,13,164,252,252,141,89,255,0,168,159,1,0,7,178,239,239,101,72,255,0,128,159,1,0,3,218,215,215,48,31,255,0,96,159,1,0,0,255,153,153,0,0,255,0,80,159,1,0,24,18,255,255,247,236,255,0,56,159,1,0,25,54,254,254,232,200,255,0,8,159,1,0,24,95,253,253,212,158,255,0,248,158,1,0,19,121,253,253,187,132,255,0,224,158,1,0,13,164,252,252,141,89,255,0,96,158,1,0,7,178,239,
+239,101,72,255,0,24,158,1,0,3,218,215,215,48,31,255,0,8,158,1,0,0,255,179,179,0,0,255,0,224,157,1,0,0,255,127,127,0,0,255,0,184,157,1,0,142,68,227,166,206,227,255,0,168,157,1,0,190,153,154,106,61,154,255,0,128,157,1,0,144,211,180,31,120,180,255,0,48,157,1,0,65,97,223,178,223,138,255,0,32,157,1,0,82,184,160,51,160,44,255,0,16,157,1,0,0,99,251,251,154,153,255,0,136,156,1,0,254,225,227,227,26,28,255,0,16,156,1,0,23,143,253,253,191,111,255,0,0,156,1,0,21,255,255,255,127,0,255,0,216,155,1,0,198,42,214,
+202,178,214,255,0,184,155,1,0,142,68,227,166,206,227,255,0,152,155,1,0,190,153,154,106,61,154,255,0,136,155,1,0,42,102,255,255,255,153,255,0,104,155,1,0,144,211,180,31,120,180,255,0,88,155,1,0,65,97,223,178,223,138,255,0,64,155,1,0,82,184,160,51,160,44,255,0,200,154,1,0,0,99,251,251,154,153,255,0,136,154,1,0,254,225,227,227,26,28,255,0,104,154,1,0,23,143,253,253,191,111,255,0,80,154,1,0,21,255,255,255,127,0,255,0,56,154,1,0,198,42,214,202,178,214,255,0,40,154,1,0,142,68,227,166,206,227,255,0,16,154,
+1,0,190,153,154,106,61,154,255,0,232,153,1,0,42,102,255,255,255,153,255,0,216,153,1,0,15,197,177,177,89,40,255,0,200,153,1,0,144,211,180,31,120,180,255,0,56,153,1,0,65,97,223,178,223,138,255,0,200,152,1,0,82,184,160,51,160,44,255,0,184,152,1,0,0,99,251,251,154,153,255,0,152,152,1,0,254,225,227,227,26,28,255,0,120,152,1,0,23,143,253,253,191,111,255,0,104,152,1,0,21,255,255,255,127,0,255,0,88,152,1,0,198,42,214,202,178,214,255,0,232,151,1,0,142,68,227,166,206,227,255,0,216,151,1,0,144,211,180,31,120,
+180,255,0,200,151,1,0,65,97,223,178,223,138,255,0,80,151,1,0,142,68,227,166,206,227,255,0,224,150,1,0,144,211,180,31,120,180,255,0,208,150,1,0,65,97,223,178,223,138,255,0,176,150,1,0,82,184,160,51,160,44,255,0,152,150,1,0,142,68,227,166,206,227,255,0,136,150,1,0,144,211,180,31,120,180,255,0,120,150,1,0,65,97,223,178,223,138,255,0,40,150,1,0,82,184,160,51,160,44,255,0,192,149,1,0,0,99,251,251,154,153,255,0,152,149,1,0,142,68,227,166,206,227,255,0,240,148,1,0,144,211,180,31,120,180,255,0,248,147,1,
+0,65,97,223,178,223,138,255,0,208,147,1,0,82,184,160,51,160,44,255,0,184,147,1,0,0,99,251,251,154,153,255,0,136,147,1,0,254,225,227,227,26,28,255,0,104,147,1,0,142,68,227,166,206,227,255,0,72,147,1,0,144,211,180,31,120,180,255,0,200,146,1,0,65,97,223,178,223,138,255,0,184,146,1,0,82,184,160,51,160,44,255,0,168,146,1,0,0,99,251,251,154,153,255,0,88,146,1,0,254,225,227,227,26,28,255,0,200,145,1,0,23,143,253,253,191,111,255,0,184,145,1,0,142,68,227,166,206,227,255,0,128,145,1,0,144,211,180,31,120,180,
+255,0,40,145,1,0,65,97,223,178,223,138,255,0,16,145,1,0,82,184,160,51,160,44,255,0,144,144,1,0,0,99,251,251,154,153,255,0,56,144,1,0,254,225,227,227,26,28,255,0,208,143,1,0,23,143,253,253,191,111,255,0,48,143,1,0,21,255,255,255,127,0,255,0,168,142,1,0,142,68,227,166,206,227,255,0,152,141,1,0,144,211,180,31,120,180,255,0,136,141,1,0,65,97,223,178,223,138,255,0,80,141,1,0,82,184,160,51,160,44,255,0,144,140,1,0,0,99,251,251,154,153,255,0,128,140,1,0,254,225,227,227,26,28,255,0,96,140,1,0,23,143,253,
+253,191,111,255,0,56,140,1,0,21,255,255,255,127,0,255,0,16,140,1,0,198,42,214,202,178,214,255,0,0,140,1,0,3,78,251,251,180,174,255,0,184,139,1,0,146,53,227,179,205,227,255,0,96,139,1,0,77,41,235,204,235,197,255,0,72,139,1,0,3,78,251,251,180,174,255,0,48,139,1,0,146,53,227,179,205,227,255,0,248,138,1,0,77,41,235,204,235,197,255,0,224,138,1,0,202,27,228,222,203,228,255,0,208,138,1,0,3,78,251,251,180,174,255,0,152,138,1,0,146,53,227,179,205,227,255,0,136,138,1,0,77,41,235,204,235,197,255,0,120,138,1,
+0,202,27,228,222,203,228,255,0,240,137,1,0,24,88,254,254,217,166,255,0,160,137,1,0,3,78,251,251,180,174,255,0,144,137,1,0,146,53,227,179,205,227,255,0,120,137,1,0,77,41,235,204,235,197,255,0,24,137,1,0,202,27,228,222,203,228,255,0,8,137,1,0,24,88,254,254,217,166,255,0,248,136,1,0,42,50,255,255,255,204,255,0,192,136,1,0,3,78,251,251,180,174,255,0,176,136,1,0,146,53,227,179,205,227,255,0,160,136,1,0,77,41,235,204,235,197,255,0,80,136,1,0,202,27,228,222,203,228,255,0,8,136,1,0,24,88,254,254,217,166,
+255,0,248,135,1,0,42,50,255,255,255,204,255,0,200,135,1,0,28,44,229,229,216,189,255,0,120,135,1,0,3,78,251,251,180,174,255,0,104,135,1,0,146,53,227,179,205,227,255,0,88,135,1,0,77,41,235,204,235,197,255,0,16,135,1,0,202,27,228,222,203,228,255,0,0,135,1,0,24,88,254,254,217,166,255,0,240,134,1,0,42,50,255,255,255,204,255,0,40,134,1,0,28,44,229,229,216,189,255,0,216,133,1,0,233,35,253,253,218,236,255,0,200,133,1,0,3,78,251,251,180,174,255,0,176,133,1,0,146,53,227,179,205,227,255,0,104,133,1,0,77,41,
+235,204,235,197,255,0,88,133,1,0,202,27,228,222,203,228,255,0,56,133,1,0,24,88,254,254,217,166,255,0,16,133,1,0,42,50,255,255,255,204,255,0,0,133,1,0,28,44,229,229,216,189,255,0,240,132,1,0,233,35,253,253,218,236,255,0,176,132,1,0,0,0,242,242,242,242,255,0,72,132,1,0,108,53,226,179,226,205,255,0,56,132,1,0,17,81,253,253,205,172,255,0,16,132,1,0,155,31,232,203,213,232,255,0,216,131,1,0,108,53,226,179,226,205,255,0,200,131,1,0,17,81,253,253,205,172,255,0,176,131,1,0,155,31,232,203,213,232,255,0,136,
+131,1,0,228,43,244,244,202,228,255,0,120,131,1,0,108,53,226,179,226,205,255,0,104,131,1,0,17,81,253,253,205,172,255,0,16,131,1,0,155,31,232,203,213,232,255,0,176,130,1,0,228,43,244,244,202,228,255,0,160,130,1,0,56,45,245,230,245,201,255,0,128,130,1,0,108,53,226,179,226,205,255,0,56,130,1,0,17,81,253,253,205,172,255,0,40,130,1,0,155,31,232,203,213,232,255,0,24,130,1,0,228,43,244,244,202,228,255,0,216,129,1,0,56,45,245,230,245,201,255,0,200,129,1,0,35,81,255,255,242,174,255,0,184,129,1,0,108,53,226,
+179,226,205,255,0,112,129,1,0,17,81,253,253,205,172,255,0,8,129,1,0,155,31,232,203,213,232,255,0,248,128,1,0,228,43,244,244,202,228,255,0,224,128,1,0,56,45,245,230,245,201,255,0,144,128,1,0,35,81,255,255,242,174,255,0,128,128,1,0,25,39,241,241,226,204,255,0,112,128,1,0,108,53,226,179,226,205,255,0,64,128,1,0,17,81,253,253,205,172,255,0,176,127,1,0,155,31,232,203,213,232,255,0,152,127,1,0,228,43,244,244,202,228,255,0,56,127,1,0,56,45,245,230,245,201,255,0,160,126,1,0,35,81,255,255,242,174,255,0,80,
+126,1,0,25,39,241,241,226,204,255,0,24,126,1,0,0,0,204,204,204,204,255,0,136,125,1,0,230,253,142,142,1,82,255,0,104,125,1,0,77,191,100,39,100,25,255,0,64,125,1,0,230,220,197,197,27,125,255,0,248,124,1,0,232,118,222,222,119,174,255,0,232,124,1,0,229,62,241,241,182,218,255,0,216,124,1,0,233,29,253,253,224,239,255,0,144,124,1,0,59,38,245,230,245,208,255,0,248,123,1,0,61,103,225,184,225,134,255,0,232,123,1,0,63,166,188,127,188,65,255,0,152,123,1,0,68,197,146,77,146,33,255,0,8,123,1,0,230,253,142,142,
+1,82,255,0,112,122,1,0,68,197,146,77,146,33,255,0,80,122,1,0,77,191,100,39,100,25,255,0,248,121,1,0,230,220,197,197,27,125,255,0,104,121,1,0,232,118,222,222,119,174,255,0,168,120,1,0,229,62,241,241,182,218,255,0,64,120,1,0,233,29,253,253,224,239,255,0,208,119,1,0,0,0,247,247,247,247,255,0,160,119,1,0,59,38,245,230,245,208,255,0,80,119,1,0,61,103,225,184,225,134,255,0,8,119,1,0,63,166,188,127,188,65,255,0,248,118,1,0,231,76,233,233,163,201,255,0,208,118,1,0,0,0,247,247,247,247,255,0,144,118,1,0,63,
+129,215,161,215,106,255,0,128,118,1,0,228,220,208,208,28,139,255,0,112,118,1,0,229,62,241,241,182,218,255,0,40,118,1,0,61,103,225,184,225,134,255,0,232,117,1,0,72,198,172,77,172,38,255,0,200,117,1,0,228,220,208,208,28,139,255,0,144,117,1,0,229,62,241,241,182,218,255,0,48,117,1,0,0,0,247,247,247,247,255,0,184,116,1,0,61,103,225,184,225,134,255,0,168,116,1,0,72,198,172,77,172,38,255,0,128,116,1,0,230,220,197,197,27,125,255,0,112,116,1,0,231,76,233,233,163,201,255,0,96,116,1,0,233,29,253,253,224,239,
+255,0,8,116,1,0,59,38,245,230,245,208,255,0,200,115,1,0,63,129,215,161,215,106,255,0,176,115,1,0,68,197,146,77,146,33,255,0,144,115,1,0,230,220,197,197,27,125,255,0,88,115,1,0,231,76,233,233,163,201,255,0,56,115,1,0,233,29,253,253,224,239,255,0,40,115,1,0,0,0,247,247,247,247,255,0,16,115,1,0,59,38,245,230,245,208,255,0,224,114,1,0,63,129,215,161,215,106,255,0,192,114,1,0,68,197,146,77,146,33,255,0,128,114,1,0,230,220,197,197,27,125,255,0,72,114,1,0,232,118,222,222,119,174,255,0,56,114,1,0,229,62,
+241,241,182,218,255,0,0,114,1,0,233,29,253,253,224,239,255,0,112,113,1,0,59,38,245,230,245,208,255,0,96,113,1,0,61,103,225,184,225,134,255,0,80,113,1,0,63,166,188,127,188,65,255,0,32,113,1,0,68,197,146,77,146,33,255,0,248,112,1,0,230,220,197,197,27,125,255,0,232,112,1,0,232,118,222,222,119,174,255,0,160,112,1,0,229,62,241,241,182,218,255,0,120,112,1,0,233,29,253,253,224,239,255,0,96,112,1,0,0,0,247,247,247,247,255,0,40,112,1,0,59,38,245,230,245,208,255,0,248,111,1,0,61,103,225,184,225,134,255,0,232,
+111,1,0,63,166,188,127,188,65,255,0,216,111,1,0,68,197,146,77,146,33,255,0,128,111,1,0,206,255,75,64,0,75,255,0,112,111,1,0,101,255,68,0,68,27,255,0,96,111,1,0,206,173,131,118,42,131,255,0,32,111,1,0,199,87,171,153,112,171,255,0,224,110,1,0,199,51,207,194,165,207,255,0,208,110,1,0,210,21,232,231,212,232,255,0,96,110,1,0,76,30,240,217,240,211,255,0,40,110,1,0,80,68,219,166,219,160,255,0,24,110,1,0,88,123,174,90,174,97,255,0,0,110,1,0,97,197,120,27,120,55,255,0,192,109,1,0,206,255,75,64,0,75,255,0,
+176,109,1,0,97,197,120,27,120,55,255,0,160,109,1,0,101,255,68,0,68,27,255,0,56,109,1,0,206,173,131,118,42,131,255,0,0,109,1,0,199,87,171,153,112,171,255,0,224,108,1,0,199,51,207,194,165,207,255,0,184,108,1,0,210,21,232,231,212,232,255,0,72,108,1,0,0,0,247,247,247,247,255,0,56,108,1,0,76,30,240,217,240,211,255,0,40,108,1,0,80,68,219,166,219,160,255,0,208,107,1,0,88,123,174,90,174,97,255,0,192,107,1,0,196,70,195,175,141,195,255,0,176,107,1,0,0,0,247,247,247,247,255,0,96,107,1,0,82,90,191,127,191,123,
+255,0,16,107,1,0,201,168,148,123,50,148,255,0,0,107,1,0,199,51,207,194,165,207,255,0,216,106,1,0,80,68,219,166,219,160,255,0,136,106,1,0,102,255,136,0,136,55,255,0,120,106,1,0,201,168,148,123,50,148,255,0,104,106,1,0,199,51,207,194,165,207,255,0,40,106,1,0,0,0,247,247,247,247,255,0,8,106,1,0,80,68,219,166,219,160,255,0,216,105,1,0,102,255,136,0,136,55,255,0,144,105,1,0,206,173,131,118,42,131,255,0,32,105,1,0,196,70,195,175,141,195,255,0,152,104,1,0,210,21,232,231,212,232,255,0,112,104,1,0,76,30,240,
+217,240,211,255,0,208,103,1,0,82,90,191,127,191,123,255,0,192,103,1,0,97,197,120,27,120,55,255,0,168,103,1,0,206,173,131,118,42,131,255,0,112,103,1,0,196,70,195,175,141,195,255,0,96,103,1,0,210,21,232,231,212,232,255,0,80,103,1,0,0,0,247,247,247,247,255,0,16,103,1,0,76,30,240,217,240,211,255,0,112,102,1,0,82,90,191,127,191,123,255,0,96,102,1,0,97,197,120,27,120,55,255,0,40,102,1,0,206,173,131,118,42,131,255,0,176,101,1,0,199,87,171,153,112,171,255,0,144,101,1,0,199,51,207,194,165,207,255,0,8,101,
+1,0,210,21,232,231,212,232,255,0,232,100,1,0,76,30,240,217,240,211,255,0,120,100,1,0,80,68,219,166,219,160,255,0,0,100,1,0,88,123,174,90,174,97,255,0,184,99,1,0,97,197,120,27,120,55,255,0,88,99,1,0,206,173,131,118,42,131,255,0,72,99,1,0,199,87,171,153,112,171,255,0,248,98,1,0,199,51,207,194,165,207,255,0,136,98,1,0,210,21,232,231,212,232,255,0,120,98,1,0,0,0,247,247,247,247,255,0,80,98,1,0,76,30,240,217,240,211,255,0,40,98,1,0,80,68,219,166,219,160,255,0,8,98,1,0,88,123,174,90,174,97,255,0,248,97,
+1,0,97,197,120,27,120,55,255,0,192,97,1,0,189,11,242,236,231,242,255,0,112,97,1,0,151,61,219,166,189,219,255,0,80,97,1,0,141,197,190,43,140,190,255,0,48,97,1,0,185,8,246,241,238,246,255,0,168,96,1,0,155,40,225,189,201,225,255,0,144,96,1,0,145,112,207,116,169,207,255,0,248,95,1,0,143,247,176,5,112,176,255,0,208,95,1,0,185,8,246,241,238,246,255,0,192,95,1,0,155,40,225,189,201,225,255,0,176,95,1,0,145,112,207,116,169,207,255,0,112,95,1,0,141,197,190,43,140,190,255,0,24,95,1,0,143,247,141,4,90,141,255,
+0,8,95,1,0,185,8,246,241,238,246,255,0,216,94,1,0,168,24,230,208,209,230,255,0,120,94,1,0,151,61,219,166,189,219,255,0,104,94,1,0,145,112,207,116,169,207,255,0,72,94,1,0,141,197,190,43,140,190,255,0,232,93,1,0,143,247,141,4,90,141,255,0,216,93,1,0,185,8,246,241,238,246,255,0,168,93,1,0,168,24,230,208,209,230,255,0,72,93,1,0,151,61,219,166,189,219,255,0,8,93,1,0,145,112,207,116,169,207,255,0,248,92,1,0,142,183,192,54,144,192,255,0,216,92,1,0,143,247,176,5,112,176,255,0,160,92,1,0,143,248,123,3,78,
+123,255,0,144,92,1,0,233,8,255,255,247,251,255,0,128,92,1,0,189,11,242,236,231,242,255,0,64,92,1,0,168,24,230,208,209,230,255,0,48,92,1,0,151,61,219,166,189,219,255,0,8,92,1,0,145,112,207,116,169,207,255,0,192,91,1,0,142,183,192,54,144,192,255,0,120,91,1,0,143,247,176,5,112,176,255,0,104,91,1,0,143,248,123,3,78,123,255,0,56,91,1,0,233,8,255,255,247,251,255,0,40,91,1,0,189,11,242,236,231,242,255,0,176,90,1,0,168,24,230,208,209,230,255,0,160,90,1,0,151,61,219,166,189,219,255,0,104,90,1,0,145,112,207,
+116,169,207,255,0,72,90,1,0,142,183,192,54,144,192,255,0,56,90,1,0,143,247,176,5,112,176,255,0,240,89,1,0,143,247,141,4,90,141,255,0,168,89,1,0,143,249,88,2,56,88,255,0,152,89,1,0,200,14,240,236,226,240,255,0,120,89,1,0,151,61,219,166,189,219,255,0,104,89,1,0,130,208,153,28,144,153,255,0,40,89,1,0,207,8,247,246,239,247,255,0,8,89,1,0,155,40,225,189,201,225,255,0,152,88,1,0,143,128,207,103,169,207,255,0,136,88,1,0,130,251,138,2,129,138,255,0,120,88,1,0,207,8,247,246,239,247,255,0,56,88,1,0,155,40,
+225,189,201,225,255,0,8,88,1,0,143,128,207,103,169,207,255,0,248,87,1,0,130,208,153,28,144,153,255,0,224,87,1,0,119,252,108,1,108,89,255,0,208,87,1,0,207,8,247,246,239,247,255,0,72,87,1,0,168,24,230,208,209,230,255,0,56,87,1,0,151,61,219,166,189,219,255,0,232,86,1,0,143,128,207,103,169,207,255,0,216,86,1,0,130,208,153,28,144,153,255,0,200,86,1,0,119,252,108,1,108,89,255,0,136,86,1,0,207,8,247,246,239,247,255,0,40,86,1,0,168,24,230,208,209,230,255,0,24,86,1,0,151,61,219,166,189,219,255,0,0,86,1,0,
+143,128,207,103,169,207,255,0,240,85,1,0,142,183,192,54,144,192,255,0,176,85,1,0,130,251,138,2,129,138,255,0,160,85,1,0,118,252,100,1,100,80,255,0,48,85,1,0,233,8,255,255,247,251,255,0,0,85,1,0,200,14,240,236,226,240,255,0,232,84,1,0,168,24,230,208,209,230,255,0,136,84,1,0,151,61,219,166,189,219,255,0,64,84,1,0,143,128,207,103,169,207,255,0,16,84,1,0,142,183,192,54,144,192,255,0,240,83,1,0,130,251,138,2,129,138,255,0,216,83,1,0,118,252,100,1,100,80,255,0,72,83,1,0,233,8,255,255,247,251,255,0,40,83,
+1,0,200,14,240,236,226,240,255,0,0,83,1,0,168,24,230,208,209,230,255,0,240,82,1,0,151,61,219,166,189,219,255,0,176,82,1,0,143,128,207,103,169,207,255,0,112,82,1,0,142,183,192,54,144,192,255,0,16,82,1,0,130,251,138,2,129,138,255,0,0,82,1,0,119,252,108,1,108,89,255,0,160,81,1,0,117,251,70,1,70,54,255,0,136,81,1,0,18,238,127,127,59,8,255,0,8,81,1,0,195,255,75,45,0,75,255,0,208,80,1,0,20,246,179,179,88,6,255,0,128,80,1,0,22,232,224,224,130,20,255,0,56,80,1,0,23,155,253,253,184,99,255,0,104,79,1,0,24,
+72,254,254,224,182,255,0,16,79,1,0,165,20,235,216,218,235,255,0,184,78,1,0,177,47,210,178,171,210,255,0,168,78,1,0,179,84,172,128,115,172,255,0,88,78,1,0,189,181,136,84,39,136,255,0,72,78,1,0,18,238,127,127,59,8,255,0,248,77,1,0,189,181,136,84,39,136,255,0,208,77,1,0,195,255,75,45,0,75,255,0,176,77,1,0,20,246,179,179,88,6,255,0,160,77,1,0,22,232,224,224,130,20,255,0,144,77,1,0,23,155,253,253,184,99,255,0,88,77,1,0,24,72,254,254,224,182,255,0,8,77,1,0,0,0,247,247,247,247,255,0,240,76,1,0,165,20,235,
+216,218,235,255,0,216,76,1,0,177,47,210,178,171,210,255,0,200,76,1,0,179,84,172,128,115,172,255,0,144,76,1,0,23,187,241,241,163,64,255,0,104,76,1,0,0,0,247,247,247,247,255,0,224,75,1,0,178,69,195,153,142,195,255,0,208,75,1,0,17,253,230,230,97,1,255,0,192,75,1,0,23,155,253,253,184,99,255,0,144,75,1,0,177,47,210,178,171,210,255,0,64,75,1,0,185,155,153,94,60,153,255,0,48,75,1,0,17,253,230,230,97,1,255,0,16,75,1,0,23,155,253,253,184,99,255,0,248,74,1,0,0,0,247,247,247,247,255,0,224,74,1,0,177,47,210,
+178,171,210,255,0,208,74,1,0,185,155,153,94,60,153,255,0,168,74,1,0,20,246,179,179,88,6,255,0,152,74,1,0,23,187,241,241,163,64,255,0,104,74,1,0,24,72,254,254,224,182,255,0,40,74,1,0,165,20,235,216,218,235,255,0,176,73,1,0,178,69,195,153,142,195,255,0,160,73,1,0,189,181,136,84,39,136,255,0,136,73,1,0,20,246,179,179,88,6,255,0,120,73,1,0,23,187,241,241,163,64,255,0,8,73,1,0,24,72,254,254,224,182,255,0,248,72,1,0,0,0,247,247,247,247,255,0,216,72,1,0,165,20,235,216,218,235,255,0,200,72,1,0,178,69,195,
+153,142,195,255,0,184,72,1,0,189,181,136,84,39,136,255,0,96,72,1,0,20,246,179,179,88,6,255,0,16,72,1,0,22,232,224,224,130,20,255,0,0,72,1,0,23,155,253,253,184,99,255,0,176,71,1,0,24,72,254,254,224,182,255,0,128,71,1,0,165,20,235,216,218,235,255,0,112,71,1,0,177,47,210,178,171,210,255,0,96,71,1,0,179,84,172,128,115,172,255,0,56,71,1,0,189,181,136,84,39,136,255,0,40,71,1,0,20,246,179,179,88,6,255,0,0,71,1,0,22,232,224,224,130,20,255,0,216,70,1,0,23,155,253,253,184,99,255,0,152,70,1,0,24,72,254,254,
+224,182,255,0,136,70,1,0,0,0,247,247,247,247,255,0,72,70,1,0,165,20,235,216,218,235,255,0,56,70,1,0,177,47,210,178,171,210,255,0,240,69,1,0,179,84,172,128,115,172,255,0,216,69,1,0,189,181,136,84,39,136,255,0,184,69,1,0,188,14,239,231,225,239,255,0,168,69,1,0,214,67,201,201,148,199,255,0,152,69,1,0,234,222,221,221,28,119,255,0,64,69,1,0,185,8,246,241,238,246,255,0,248,68,1,0,211,41,216,215,181,216,255,0,232,68,1,0,228,139,223,223,101,176,255,0,160,68,1,0,239,232,206,206,18,86,255,0,144,68,1,0,185,
+8,246,241,238,246,255,0,96,68,1,0,211,41,216,215,181,216,255,0,56,68,1,0,228,139,223,223,101,176,255],"i8",L,l.J+40977);D([68,1,0,234,222,221,221,28,119,255,0,240,67,1,0,236,255,152,152,0,67,255,0,224,67,1,0,185,8,246,241,238,246,255,0,176,67,1,0,204,38,218,212,185,218,255,0,88,67,1,0,214,67,201,201,148,199,255,0,72,67,1,0,228,139,223,223,101,176,255,0,0,67,1,0,234,222,221,221,28,119,255,0,240,66,1,0,236,255,152,152,0,67,255,0,208,66,1,0,185,8,246,241,238,246,255,0,192,66,1,0,204,38,218,212,185,218,
+255,0,160,66,1,0,214,67,201,201,148,199,255,0,136,66,1,0,228,139,223,223,101,176,255,0,104,66,1,0,233,209,231,231,41,138,255,0,40,66,1,0,239,232,206,206,18,86,255,0,176,65,1,0,236,255,145,145,0,63,255,0,128,65,1,0,195,5,249,247,244,249,255,0,8,65,1,0,188,14,239,231,225,239,255,0,240,64,1,0,204,38,218,212,185,218,255,0,168,64,1,0,214,67,201,201,148,199,255,0,104,64,1,0,228,139,223,223,101,176,255,0,72,64,1,0,233,209,231,231,41,138,255,0,56,64,1,0,239,232,206,206,18,86,255,0,40,64,1,0,236,255,145,145,
+0,63,255,0,240,63,1,0,195,5,249,247,244,249,255,0,96,63,1,0,188,14,239,231,225,239,255,0,80,63,1,0,204,38,218,212,185,218,255,0,208,62,1,0,214,67,201,201,148,199,255,0,184,62,1,0,228,139,223,223,101,176,255,0,160,62,1,0,233,209,231,231,41,138,255,0,80,62,1,0,239,232,206,206,18,86,255,0,32,62,1,0,236,255,152,152,0,67,255,0,192,61,1,0,242,255,103,103,0,31,255,0,104,61,1,0,180,8,245,239,237,245,255,0,40,61,1,0,168,37,220,188,189,220,255,0,176,60,1,0,176,100,177,117,107,177,255,0,160,60,1,0,182,7,247,
+242,240,247,255,0,8,60,1,0,173,28,226,203,201,226,255,0,240,59,1,0,173,58,200,158,154,200,255,0,224,59,1,0,182,128,163,106,81,163,255,0,176,59,1,0,182,7,247,242,240,247,255,0,144,59,1,0,173,28,226,203,201,226,255,0,128,59,1,0,173,58,200,158,154,200,255,0,112,59,1,0,176,100,177,117,107,177,255,0,240,58,1,0,188,185,143,84,39,143,255,0,128,58,1,0,182,7,247,242,240,247,255,0,104,58,1,0,170,18,235,218,218,235,255,0,64,58,1,0,168,37,220,188,189,220,255,0,48,58,1,0,173,58,200,158,154,200,255,0,32,58,1,0,
+176,100,177,117,107,177,255,0,0,58,1,0,188,185,143,84,39,143,255,0,216,57,1,0,182,7,247,242,240,247,255,0,160,57,1,0,170,18,235,218,218,235,255,0,144,57,1,0,168,37,220,188,189,220,255,0,56,57,1,0,173,58,200,158,154,200,255,0,224,56,1,0,172,83,186,128,125,186,255,0,208,56,1,0,182,128,163,106,81,163,255,0,184,56,1,0,190,216,134,74,20,134,255,0,168,56,1,0,191,2,253,252,251,253,255,0,144,56,1,0,180,8,245,239,237,245,255,0,128,56,1,0,170,18,235,218,218,235,255,0,96,56,1,0,168,37,220,188,189,220,255,0,
+80,56,1,0,173,58,200,158,154,200,255,0,64,56,1,0,172,83,186,128,125,186,255,0,8,56,1,0,182,128,163,106,81,163,255,0,120,55,1,0,190,216,134,74,20,134,255,0,104,55,1,0,191,2,253,252,251,253,255,0,16,55,1,0,180,8,245,239,237,245,255,0,0,55,1,0,170,18,235,218,218,235,255,0,240,54,1,0,168,37,220,188,189,220,255,0,224,54,1,0,173,58,200,158,154,200,255,0,192,54,1,0,172,83,186,128,125,186,255,0,176,54,1,0,182,128,163,106,81,163,255,0,160,54,1,0,188,185,143,84,39,143,255,0,80,54,1,0,191,255,125,63,0,125,255,
+0,216,53,1,0,242,255,103,103,0,31,255,0,200,53,1,0,150,241,97,5,48,97,255,0,176,53,1,0,249,220,178,178,24,43,255,0,160,53,1,0,5,163,214,214,96,77,255,0,136,53,1,0,13,119,244,244,165,130,255,0,120,53,1,0,15,54,253,253,219,199,255,0,88,53,1,0,142,32,240,209,229,240,255,0,72,53,1,0,141,87,222,146,197,222,255,0,56,53,1,0,143,167,195,67,147,195,255,0,24,53,1,0,148,206,172,33,102,172,255,0,208,52,1,0,242,255,103,103,0,31,255,0,192,52,1,0,148,206,172,33,102,172,255,0,160,52,1,0,150,241,97,5,48,97,255,0,
+144,52,1,0,249,220,178,178,24,43,255,0,128,52,1,0,5,163,214,214,96,77,255,0,104,52,1,0,13,119,244,244,165,130,255,0,72,52,1,0,15,54,253,253,219,199,255,0,56,52,1,0,0,0,247,247,247,247,255,0,40,52,1,0,142,32,240,209,229,240,255,0,0,52,1,0,141,87,222,146,197,222,255,0,192,51,1,0,143,167,195,67,147,195,255,0,176,51,1,0,12,150,239,239,138,98,255,0,136,51,1,0,0,0,247,247,247,247,255,0,120,51,1,0,143,128,207,103,169,207,255,0,104,51,1,0,248,255,202,202,0,32,255,0,88,51,1,0,13,119,244,244,165,130,255,0,
+232,147,2,0,141,87,222,146,197,222,255,0,216,147,2,0,143,247,176,5,113,176,255,0,200,147,2,0,248,255,202,202,0,32,255,0,152,147,2,0,13,119,244,244,165,130,255,0,56,147,2,0,0,0,247,247,247,247,255,0,40,147,2,0,141,87,222,146,197,222,255,0,240,146,2,0,143,247,176,5,113,176,255,0,224,146,2,0,249,220,178,178,24,43,255,0,208,146,2,0,12,150,239,239,138,98,255,0,192,146,2,0,15,54,253,253,219,199,255,0,160,146,2,0,142,32,240,209,229,240,255,0,128,146,2,0,143,128,207,103,169,207,255,0,104,146,2,0,148,206,
+172,33,102,172,255,0,56,146,2,0,249,220,178,178,24,43,255,0,200,145,2,0,12,150,239,239,138,98,255,0,168,145,2,0,15,54,253,253,219,199,255,0,120,145,2,0,0,0,247,247,247,247,255,0,96,145,2,0,142,32,240,209,229,240,255,0,80,145,2,0,143,128,207,103,169,207,255,0,48,145,2,0,148,206,172,33,102,172,255,0,16,145,2,0,249,220,178,178,24,43,255,0,0,145,2,0,5,163,214,214,96,77,255,0,240,144,2,0,13,119,244,244,165,130,255,0,184,144,2,0,15,54,253,253,219,199,255,0,72,144,2,0,142,32,240,209,229,240,255,0,56,144,
+2,0,141,87,222,146,197,222,255,0,224,143,2,0,143,167,195,67,147,195,255,0,168,143,2,0,148,206,172,33,102,172,255,0,144,143,2,0,249,220,178,178,24,43,255,0,112,143,2,0,5,163,214,214,96,77,255,0,8,143,2,0,13,119,244,244,165,130,255,0,192,142,2,0,15,54,253,253,219,199,255,0,24,142,2,0,0,0,247,247,247,247,255,0,224,141,2,0,142,32,240,209,229,240,255,0,104,141,2,0,141,87,222,146,197,222,255,0,88,141,2,0,143,167,195,67,147,195,255,0,240,140,2,0,148,206,172,33,102,172,255,0,192,140,2,0,242,255,103,103,0,
+31,255,0,160,140,2,0,0,0,26,26,26,26,255,0,128,140,2,0,249,220,178,178,24,43,255,0,96,140,2,0,5,163,214,214,96,77,255,0,80,140,2,0,13,119,244,244,165,130,255,0,64,140,2,0,15,54,253,253,219,199,255,0,32,140,2,0,0,0,224,224,224,224,255,0,144,139,2,0,0,0,186,186,186,186,255,0,120,139,2,0,0,0,135,135,135,135,255,0,56,139,2,0,0,0,77,77,77,77,255,0,40,139,2,0,242,255,103,103,0,31,255,0,24,139,2,0,0,0,77,77,77,77,255,0,248,138,2,0,0,0,26,26,26,26,255,0,208,138,2,0,249,220,178,178,24,43,255,0,184,138,2,0,
+5,163,214,214,96,77,255,0,144,138,2,0,13,119,244,244,165,130,255,0,96,138,2,0,15,54,253,253,219,199,255,0,224,137,2,0,0,0,255,255,255,255,255,0,208,137,2,0,0,0,224,224,224,224,255,0,168,137,2,0,0,0,186,186,186,186,255,0,152,137,2,0,0,0,135,135,135,135,255,0,136,137,2,0,12,150,239,239,138,98,255,0,112,137,2,0,0,0,255,255,255,255,255,0,80,137,2,0,0,0,153,153,153,153,255,0,64,137,2,0,248,255,202,202,0,32,255,0,48,137,2,0,13,119,244,244,165,130,255,0,8,137,2,0,0,0,186,186,186,186,255,0,96,136,2,0,0,0,
+64,64,64,64,255,0,80,136,2,0,248,255,202,202,0,32,255,0,40,136,2,0,13,119,244,244,165,130,255,0,24,136,2,0,0,0,255,255,255,255,255,0,8,136,2,0,0,0,186,186,186,186,255,0,248,135,2,0,0,0,64,64,64,64,255,0,216,135,2,0,249,220,178,178,24,43,255,0,200,135,2,0,12,150,239,239,138,98,255,0,184,135,2,0,15,54,253,253,219,199,255,0,136,135,2,0,0,0,224,224,224,224,255,0,56,135,2,0,0,0,153,153,153,153,255,0,40,135,2,0,0,0,77,77,77,77,255,0,232,134,2,0,249,220,178,178,24,43,255,0,216,134,2,0,12,150,239,239,138,
+98,255,0,200,134,2,0,15,54,253,253,219,199,255,0,176,134,2,0,0,0,255,255,255,255,255,0,144,134,2,0,0,0,224,224,224,224,255,0,128,134,2,0,0,0,153,153,153,153,255,0,112,134,2,0,0,0,77,77,77,77,255,0,72,134,2,0,249,220,178,178,24,43,255,0,16,134,2,0,5,163,214,214,96,77,255,0,0,134,2,0,13,119,244,244,165,130,255,0,184,133,2,0,15,54,253,253,219,199,255,0,168,133,2,0,0,0,224,224,224,224,255,0,152,133,2,0,0,0,186,186,186,186,255,0,120,133,2,0,0,0,135,135,135,135,255,0,88,133,2,0,0,0,77,77,77,77,255,0,72,
+133,2,0,249,220,178,178,24,43,255,0,56,133,2,0,5,163,214,214,96,77,255,0,248,132,2,0,13,119,244,244,165,130,255,0,184,132,2,0,15,54,253,253,219,199,255,0,168,132,2,0,0,0,255,255,255,255,255,0,72,132,2,0,0,0,224,224,224,224,255,0,56,132,2,0,0,0,186,186,186,186,255,0,40,132,2,0,0,0,135,135,135,135,255,0,24,132,2,0,0,0,77,77,77,77,255,0,208,131,2,0,3,32,253,253,224,221,255,0,192,131,2,0,244,92,250,250,159,181,255,0,176,131,2,0,227,220,197,197,27,138,255,0,136,131,2,0,13,28,254,254,235,226,255,0,72,131,
+2,0,252,72,251,251,180,185,255,0,56,131,2,0,238,147,247,247,104,161,255,0,216,130,2,0,224,253,174,174,1,126,255,0,200,130,2,0,13,28,254,254,235,226,255,0,184,130,2,0,252,72,251,251,180,185,255,0,168,130,2,0,238,147,247,247,104,161,255,0,136,130,2,0,227,220,197,197,27,138,255,0,72,130,2,0,213,252,122,122,1,119,255,0,56,130,2,0,13,28,254,254,235,226,255,0,224,129,2,0,3,60,252,252,197,192,255,0,152,129,2,0,244,92,250,250,159,181,255,0,120,129,2,0,238,147,247,247,104,161,255,0,88,129,2,0,227,220,197,
+197,27,138,255,0,56,129,2,0,213,252,122,122,1,119,255,0,40,129,2,0,13,28,254,254,235,226,255,0,8,129,2,0,3,60,252,252,197,192,255,0,232,128,2,0,244,92,250,250,159,181,255,0,200,128,2,0,238,147,247,247,104,161,255,0,184,128,2,0,230,195,221,221,52,151,255,0,128,128,2,0,224,253,174,174,1,126,255,0,16,128,2,0,213,252,122,122,1,119,255,0,0,128,2,0,14,12,255,255,247,243,255,0,144,127,2,0,3,32,253,253,224,221,255,0,88,127,2,0,3,60,252,252,197,192,255,0,64,127,2,0,244,92,250,250,159,181,255,0,32,127,2,0,
+238,147,247,247,104,161,255,0,232,126,2,0,230,195,221,221,52,151,255,0,136,126,2,0,224,253,174,174,1,126,255,0,216,125,2,0,213,252,122,122,1,119,255,0,40,125,2,0,14,12,255,255,247,243,255,0,248,124,2,0,3,32,253,253,224,221,255,0,232,124,2,0,3,60,252,252,197,192,255,0,128,124,2,0,244,92,250,250,159,181,255,0,112,124,2,0,238,147,247,247,104,161,255,0,96,124,2,0,230,195,221,221,52,151,255,0,48,124,2,0,224,253,174,174,1,126,255,0,0,124,2,0,213,252,122,122,1,119,255,0,240,123,2,0,199,255,106,73,0,106,
+255,0,224,123,2,0,245,255,165,165,0,38,255,0,184,123,2,0,167,171,149,49,54,149,255,0,104,123,2,0,2,208,215,215,48,39,255,0,72,123,2,0,10,184,244,244,109,67,255,0,0,123,2,0,20,157,253,253,174,97,255,0,240,122,2,0,30,110,254,254,224,144,255,0,224,122,2,0,136,24,248,224,243,248,255,0,200,122,2,0,138,67,233,171,217,233,255,0,168,122,2,0,143,113,209,116,173,209,255,0,144,122,2,0,151,157,180,69,117,180,255,0,120,122,2,0,245,255,165,165,0,38,255,0,88,122,2,0,151,157,180,69,117,180,255,0,8,122,2,0,167,171,
+149,49,54,149,255,0,248,121,2,0,2,208,215,215,48,39,255,0,200,121,2,0,10,184,244,244,109,67,255,0,184,121,2,0,20,157,253,253,174,97,255,0,168,121,2,0,30,110,254,254,224,144,255,0,152,121,2,0,42,64,255,255,255,191,255,0,64,121,2,0,136,24,248,224,243,248,255,0,48,121,2,0,138,67,233,171,217,233,255,0,32,121,2,0,143,113,209,116,173,209,255,0,0,121,2,0,13,164,252,252,141,89,255,0,168,120,2,0,42,64,255,255,255,191,255,0,152,120,2,0,143,86,219,145,191,219,255,0,88,120,2,0,254,225,215,215,25,28,255,0,72,
+120,2,0,20,157,253,253,174,97,255,0,56,120,2,0,138,67,233,171,217,233,255,0,40,120,2,0,145,193,182,44,123,182,255,0,24,120,2,0,254,225,215,215,25,28,255,0,8,120,2,0,20,157,253,253,174,97,255,0,232,119,2,0,42,64,255,255,255,191,255,0,160,119,2,0,138,67,233,171,217,233,255,0,88,119,2,0,145,193,182,44,123,182,255,0,72,119,2,0,2,208,215,215,48,39,255,0,40,119,2,0,13,164,252,252,141,89,255,0,8,119,2,0,30,110,254,254,224,144,255,0,240,118,2,0,136,24,248,224,243,248,255,0,224,118,2,0,143,86,219,145,191,
+219,255,0,184,118,2,0,151,157,180,69,117,180,255,0,168,118,2,0,2,208,215,215,48,39,255,0,152,118,2,0,13,164,252,252,141,89,255,0,64,118,2,0,30,110,254,254,224,144,255,0,0,118,2,0,42,64,255,255,255,191,255,0,240,117,2,0,136,24,248,224,243,248,255,0,208,117,2,0,143,86,219,145,191,219,255,0,192,117,2,0,151,157,180,69,117,180,255,0,176,117,2,0,2,208,215,215,48,39,255,0,160,117,2,0,10,184,244,244,109,67,255,0,112,117,2,0,20,157,253,253,174,97,255,0,96,117,2,0,30,110,254,254,224,144,255,0,64,117,2,0,136,
+24,248,224,243,248,255,0,0,117,2,0,138,67,233,171,217,233,255,0,200,116,2,0,143,113,209,116,173,209,255,0,184,116,2,0,151,157,180,69,117,180,255,0,136,116,2,0,2,208,215,215,48,39,255,0,120,116,2,0,10,184,244,244,109,67,255,0,104,116,2,0,20,157,253,253,174,97,255,0,88,116,2,0,30,110,254,254,224,144,255,0,32,116,2,0,42,64,255,255,255,191,255,0,16,116,2,0,136,24,248,224,243,248,255,0,0,116,2,0,138,67,233,171,217,233,255,0,216,115,2,0,143,113,209,116,173,209,255,0,160,115,2,0,151,157,180,69,117,180,255,
+0,144,115,2,0,245,255,165,165,0,38,255,0,72,115,2,0,107,255,104,0,104,55,255,0,56,115,2,0,2,208,215,215,48,39,255,0,40,115,2,0,10,184,244,244,109,67,255,0,24,115,2,0,20,157,253,253,174,97,255,0,248,114,2,0,31,115,254,254,224,139,255,0,176,114,2,0,51,106,239,217,239,139,255,0,160,114,2,0,62,130,217,166,217,106,255,0,88,114,2,0,83,121,189,102,189,99,255,0,40,114,2,0,103,211,152,26,152,80,255,0,8,114,2,0,245,255,165,165,0,38,255,0,192,113,2,0,103,211,152,26,152,80,255,0,96,113,2,0,107,255,104,0,104,
+55,255,0,80,113,2,0,2,208,215,215,48,39,255,0,40,113,2,0,10,184,244,244,109,67,255,0,24,113,2,0,20,157,253,253,174,97,255,0,8,113,2,0,31,115,254,254,224,139,255,0,216,112,2,0,42,64,255,255,255,191,255,0,104,112,2,0,51,106,239,217,239,139,255,0,32,112,2,0,62,130,217,166,217,106,255,0,16,112,2,0,83,121,189,102,189,99,255,0,216,111,2,0,13,164,252,252,141,89,255,0,176,111,2,0,42,64,255,255,255,191,255,0,152,111,2,0,66,136,207,145,207,96,255,0,32,111,2,0,254,225,215,215,25,28,255,0,240,110,2,0,20,157,
+253,253,174,97,255,0,152,110,2,0,62,130,217,166,217,106,255,0,56,110,2,0,98,210,150,26,150,65,255,0,152,109,2,0,254,225,215,215,25,28,255,0,56,109,2,0,20,157,253,253,174,97,255,0,24,109,2,0,42,64,255,255,255,191,255,0,240,108,2,0,62,130,217,166,217,106,255,0,216,108,2,0,98,210,150,26,150,65,255,0,200,108,2,0,2,208,215,215,48,39,255,0,184,108,2,0,13,164,252,252,141,89,255,0,136,108,2,0,31,115,254,254,224,139,255,0,120,108,2,0,51,106,239,217,239,139,255,0,104,108,2,0,66,136,207,145,207,96,255,0,80,
+108,2,0,103,211,152,26,152,80,255,0,24,108,2,0,2,208,215,215,48,39,255,0,0,108,2,0,13,164,252,252,141,89,255,0,240,107,2,0,31,115,254,254,224,139,255,0,216,107,2,0,42,64,255,255,255,191,255,0,200,107,2,0,51,106,239,217,239,139,255,0,176,107,2,0,66,136,207,145,207,96,255,0,88,107,2,0,103,211,152,26,152,80,255,0,72,107,2,0,2,208,215,215,48,39,255,0,40,107,2,0,10,184,244,244,109,67,255,0,16,107,2,0,20,157,253,253,174,97,255,0,200,106,2,0,31,115,254,254,224,139,255,0,184,106,2,0,51,106,239,217,239,139,
+255,0,160,106,2,0,62,130,217,166,217,106,255,0,128,106,2,0,83,121,189,102,189,99,255,0,112,106,2,0,103,211,152,26,152,80,255,0,96,106,2,0,2,208,215,215,48,39,255,0,64,106,2,0,10,184,244,244,109,67,255,0,40,106,2,0,20,157,253,253,174,97,255,0,24,106,2,0,31,115,254,254,224,139,255,0,248,105,2,0,42,64,255,255,255,191,255,0,168,105,2,0,51,106,239,217,239,139,255,0,152,105,2,0,62,130,217,166,217,106,255,0,120,105,2,0,83,121,189,102,189,99,255,0,96,105,2,0,103,211,152,26,152,80,255,0,80,105,2,0,13,44,254,
+254,224,210,255,0,64,105,2,0,9,139,252,252,146,114,255,0,32,105,2,0,1,211,222,222,45,38,255,0,8,105,2,0,13,37,254,254,229,217,255,0,184,104,2,0,11,108,252,252,174,145,255,0,152,104,2,0,7,179,251,251,106,74,255,0,104,104,2,0,253,224,203,203,24,29,255,0,88,104,2,0,13,37,254,254,229,217,255,0,72,104,2,0,11,108,252,252,174,145,255,0,16,104,2,0,7,179,251,251,106,74,255,0,0,104,2,0,1,211,222,222,45,38,255,0,240,103,2,0,253,231,165,165,15,21,255,0,152,103,2,0,13,37,254,254,229,217,255,0,56,103,2,0,12,92,
+252,252,187,161,255,0,248,102,2,0,9,139,252,252,146,114,255,0,104,102,2,0,7,179,251,251,106,74,255,0,56,102,2,0,1,211,222,222,45,38,255,0,40,102,2,0,253,231,165,165,15,21,255,0,24,102,2,0,13,37,254,254,229,217,255,0,184,101,2,0,12,92,252,252,187,161,255,0,168,101,2,0,9,139,252,252,146,114,255,0,152,101,2,0,7,179,251,251,106,74,255,0,104,101,2,0,3,208,239,239,59,44,255,0,88,101,2,0,253,224,203,203,24,29,255,0,72,101,2,0,251,255,153,153,0,13,255,0,40,101,2,0,14,15,255,255,245,240,255,0,208,100,2,0,
+13,44,254,254,224,210,255,0,192,100,2,0,12,92,252,252,187,161,255,0,176,100,2,0,9,139,252,252,146,114,255,0,120,100,2,0,7,179,251,251,106,74,255,0,104,100,2,0,3,208,239,239,59,44,255,0,80,100,2,0,253,224,203,203,24,29,255,0,16,100,2,0,251,255,153,153,0,13,255,0,0,100,2,0,14,15,255,255,245,240,255,0,216,99,2,0,13,44,254,254,224,210,255,0,192,99,2,0,12,92,252,252,187,161,255,0,128,99,2,0,9,139,252,252,146,114,255,0,112,99,2,0,7,179,251,251,106,74,255,0,96,99,2,0,3,208,239,239,59,44,255,0,16,99,2,0,
+253,224,203,203,24,29,255,0,248,98,2,0,253,231,165,165,15,21,255,0,232,98,2,0,249,255,103,103,0,13,255,0,216,98,2,0,254,225,228,228,26,28,255,0,176,98,2,0,146,178,184,55,126,184,255,0,96,95,2,0,83,147,175,77,175,74,255,0,64,95,2,0,254,225,228,228,26,28,255,0,176,94,2,0,146,178,184,55,126,184,255,0,96,94,2,0,83,147,175,77,175,74,255,0,24,94,2,0,207,132,163,152,78,163,255,0,200,93,2,0,254,225,228,228,26,28,255,0,168,93,2,0,146,178,184,55,126,184,255,0,144,93,2,0,83,147,175,77,175,74,255,0,112,93,2,
+0,207,132,163,152,78,163,255,0,88,93,2,0,21,255,255,255,127,0,255,0,72,93,2,0,254,225,228,228,26,28,255,0,240,92,2,0,146,178,184,55,126,184,255,0,184,92,2,0,83,147,175,77,175,74,255,0,152,92,2,0,207,132,163,152,78,163,255,0,96,92,2,0,21,255,255,255,127,0,255,0,32,92,2,0,42,204,255,255,255,51,255,0,8,92,2,0,254,225,228,228,26,28,255,0,176,91,2,0,146,178,184,55,126,184,255,0,88,91,2,0,83,147,175,77,175,74,255,0,200,90,2,0,207,132,163,152,78,163,255,0,104,90,2,0,21,255,255,255,127,0,255,0,72,90,2,0,
+42,204,255,255,255,51,255,0,216,89,2,0,15,193,166,166,86,40,255,0,168,89,2,0,254,225,228,228,26,28,255,0,152,89,2,0,146,178,184,55,126,184,255,0,64,89,2,0,83,147,175,77,175,74,255,0,48,89,2,0,207,132,163,152,78,163,255,0,32,89,2,0,21,255,255,255,127,0,255,0,0,89,2,0,42,204,255,255,255,51,255,0,240,88,2,0,15,193,166,166,86,40,255,0,224,88,2,0,232,121,247,247,129,191,255,0,208,88,2,0,254,225,228,228,26,28,255,0,128,88,2,0,146,178,184,55,126,184,255,0,88,88,2,0,83,147,175,77,175,74,255,0,72,88,2,0,207,
+132,163,152,78,163,255,0,16,88,2,0,21,255,255,255,127,0,255,0,0,88,2,0,42,204,255,255,255,51,255,0,240,87,2,0,15,193,166,166,86,40,255,0,208,87,2,0,232,121,247,247,129,191,255,0,192,87,2,0,0,0,153,153,153,153,255,0,160,87,2,0,114,120,194,102,194,165,255,0,136,87,2,0,11,155,252,252,141,98,255,0,64,87,2,0,156,77,203,141,160,203,255,0,40,87,2,0,114,120,194,102,194,165,255,0,24,87,2,0,11,155,252,252,141,98,255,0,232,86,2,0,156,77,203,141,160,203,255,0,216,86,2,0,228,102,231,231,138,195,255,0,200,86,2,
+0,114,120,194,102,194,165,255,0,168,86,2,0,11,155,252,252,141,98,255,0,152,86,2,0,156,77,203,141,160,203,255,0,128,86,2,0,228,102,231,231,138,195,255,0,112,86,2,0,58,155,216,166,216,84,255,0,32,86,2,0,114,120,194,102,194,165,255,0,16,86,2,0,11,155,252,252,141,98,255,0,0,86,2,0,156,77,203,141,160,203,255,0,200,85,2,0,228,102,231,231,138,195,255,0,184,85,2,0,58,155,216,166,216,84,255,0,168,85,2,0,34,208,255,255,217,47,255,0,136,85,2,0,114,120,194,102,194,165,255,0,120,85,2,0,11,155,252,252,141,98,255,
+0,104,85,2,0,156,77,203,141,160,203,255,0,88,85,2,0,228,102,231,231,138,195,255,0,40,85,2,0,58,155,216,166,216,84,255,0,24,85,2,0,34,208,255,255,217,47,255,0,8,85,2,0,25,90,229,229,196,148,255,0,240,84,2,0,114,120,194,102,194,165,255,0,224,84,2,0,11,155,252,252,141,98,255,0,208,84,2,0,156,77,203,141,160,203,255,0,176,84,2,0,228,102,231,231,138,195,255,0,160,84,2,0,58,155,216,166,216,84,255,0,136,84,2,0,34,208,255,255,217,47,255,0,88,84,2,0,25,90,229,229,196,148,255,0,32,84,2,0,0,0,179,179,179,179,
+255,0,8,84,2,0,120,84,211,141,211,199,255,0,240,83,2,0,211,82,189,188,128,189,255,0,200,83,2,0,42,76,255,255,255,179,255,0,184,83,2,0,175,37,218,190,186,218,255,0,168,83,2,0,4,139,251,251,128,114,255,0,120,83,2,0,144,100,211,128,177,211,255,0,104,83,2,0,22,156,253,253,180,98,255,0,88,83,2,0,58,134,222,179,222,105,255,0,72,83,2,0,233,47,252,252,205,229,255,0,24,83,2,0,0,0,217,217,217,217,255,0,8,83,2,0,120,84,211,141,211,199,255,0,248,82,2,0,211,82,189,188,128,189,255,0,216,82,2,0,77,41,235,204,235,
+197,255,0,200,82,2,0,42,76,255,255,255,179,255,0,184,82,2,0,175,37,218,190,186,218,255,0,128,82,2,0,4,139,251,251,128,114,255,0,112,82,2,0,144,100,211,128,177,211,255,0,96,82,2,0,22,156,253,253,180,98,255,0,80,82,2,0,58,134,222,179,222,105,255,0,224,81,2,0,233,47,252,252,205,229,255,0,208,81,2,0,0,0,217,217,217,217,255,0,192,81,2,0,120,84,211,141,211,199,255,0,168,81,2,0,211,82,189,188,128,189,255,0,152,81,2,0,77,41,235,204,235,197,255,0,136,81,2,0,37,144,255,255,237,111,255,0,104,81,2,0,42,76,255,
+255,255,179,255,0,48,81,2,0,175,37,218,190,186,218,255,0,16,81,2,0,4,139,251,251,128,114,255,0,232,80,2,0,144,100,211,128,177,211,255,0,192,80,2,0,22,156,253,253,180,98,255,0,152,80,2,0,58,134,222,179,222,105,255,0,136,80,2,0,233,47,252,252,205,229,255,0,104,80,2,0,0,0,217,217,217,217,255,0,88,80,2,0,120,84,211,141,211,199,255,0,64,80,2,0,42,76,255,255,255,179,255,0,24,80,2,0,175,37,218,190,186,218,255,0,8,80,2,0,120,84,211,141,211,199,255,0,248,79,2,0,42,76,255,255,255,179,255,0,232,79,2,0,175,37,
+218,190,186,218,255,0,176,79,2,0,4,139,251,251,128,114,255,0,152,79,2,0,120,84,211,141,211,199,255,0,136,79,2,0,42,76,255,255,255,179,255,0,72,79,2,0,175,37,218,190,186,218,255,0,48,79,2,0,4,139,251,251,128,114,255,0,248,78,2,0,144,100,211,128,177,211,255,0,200,78,2,0,120,84,211,141,211,199,255,0,176,78,2,0,42,76,255,255,255,179,255,0,16,78,2,0,175,37,218,190,186,218,255,0,240,77,2,0,4,139,251,251,128,114,255,0,104,77,2,0,144,100,211,128,177,211,255,0,88,77,2,0,22,156,253,253,180,98,255,0,16,77,2,
+0,120,84,211,141,211,199,255,0,0,77,2,0,42,76,255,255,255,179,255,0,240,76,2,0,175,37,218,190,186,218,255,0,224,76,2,0,4,139,251,251,128,114,255,0,192,76,2,0,144,100,211,128,177,211,255,0,176,76,2,0,22,156,253,253,180,98,255,0,160,76,2,0,58,134,222,179,222,105,255,0,144,76,2,0,120,84,211,141,211,199,255,0,96,76,2,0,42,76,255,255,255,179,255,0,64,76,2,0,175,37,218,190,186,218,255,0,48,76,2,0,4,139,251,251,128,114,255,0,32,76,2,0,144,100,211,128,177,211,255,0,16,76,2,0,22,156,253,253,180,98,255,0,0,
+76,2,0,58,134,222,179,222,105,255,0,216,75,2,0,233,47,252,252,205,229,255,0,200,75,2,0,120,84,211,141,211,199,255,0,184,75,2,0,42,76,255,255,255,179,255,0,152,75,2,0,175,37,218,190,186,218,255,0,96,75,2,0,4,139,251,251,128,114,255,0,80,75,2,0,144,100,211,128,177,211,255,0,64,75,2,0,22,156,253,253,180,98,255,0,48,75,2,0,58,134,222,179,222,105,255,0,32,75,2,0,233,47,252,252,205,229,255,0,16,75,2,0,0,0,217,217,217,217,255,0,240,74,2,0,237,253,158,158,1,66,255,0,224,74,2,0,177,130,162,94,79,162,255,0,
+208,74,2,0,250,180,213,213,62,79,255,0,184,74,2,0,10,184,244,244,109,67,255,0,128,74,2,0,20,157,253,253,174,97,255,0,112,74,2,0,31,115,254,254,224,139,255,0,96,74,2,0,49,96,245,230,245,152,255,0,80,74,2,0,79,65,221,171,221,164,255,0,64,74,2,0,114,120,194,102,194,165,255,0,48,74,2,0,143,187,189,50,136,189,255,0,32,74,2,0,237,253,158,158,1,66,255,0,16,74,2,0,143,187,189,50,136,189,255,0,216,73,2,0,177,130,162,94,79,162,255,0,200,73,2,0,250,180,213,213,62,79,255,0,152,73,2,0,10,184,244,244,109,67,255,
+0,128,73,2,0,20,157,253,253,174,97,255,0,112,73,2,0,31,115,254,254,224,139,255,0,96,73,2,0,42,64,255,255,255,191,255,0,80,73,2,0,49,96,245,230,245,152,255,0,64,73,2,0,79,65,221,171,221,164,255,0,32,73,2,0,114,120,194,102,194,165,255,0,16,73,2,0,13,164,252,252,141,89,255,0,0,73,2,0,42,64,255,255,255,191,255,0,232,72,2,0,81,77,213,153,213,148,255,0,176,72,2,0,254,225,215,215,25,28,255,0,160,72,2,0,20,157,253,253,174,97,255,0,144,72,2,0,79,65,221,171,221,164,255,0,128,72,2,0,143,196,186,43,131,186,255,
+0,112,72,2,0,254,225,215,215,25,28,255,0,96,72,2,0,20,157,253,253,174,97,255,0,48,72,2,0,42,64,255,255,255,191,255,0,32,72,2,0,79,65,221,171,221,164,255,0,16,72,2,0,143,196,186,43,131,186,255,0,0,72,2,0,250,180,213,213,62,79,255,0,192,71,2,0,13,164,252,252,141,89,255,0,176,71,2,0,31,115,254,254,224,139,255,0,160,71,2,0,49,96,245,230,245,152,255,0,144,71,2,0,81,77,213,153,213,148,255,0,128,71,2,0,143,187,189,50,136,189,255,0,112,71,2,0,250,180,213,213,62,79,255,0,40,71,2,0,13,164,252,252,141,89,255,
+0,24,71,2,0,31,115,254,254,224,139,255,0,8,71,2,0,42,64,255,255,255,191,255,0,248,70,2,0,49,96,245,230,245,152,255,0,200,70,2,0,81,77,213,153,213,148,255,0,184,70,2,0,143,187,189,50,136,189,255,0,168,70,2,0,250,180,213,213,62,79,255,0,152,70,2,0,10,184,244,244,109,67,255,0,136,70,2,0,20,157,253,253,174,97,255,0,120,70,2,0,31,115,254,254,224,139,255,0,88,70,2,0,49,96,245,230,245,152,255,0,48,70,2,0,79,65,221,171,221,164,255,0,24,70,2,0,114,120,194,102,194,165,255,0,248,69,2,0,143,187,189,50,136,189,
+255,0,152,69,2,0,250,180,213,213,62,79,255,0,120,69,2,0,10,184,244,244,109,67,255,0,104,69,2,0,20,157,253,253,174,97,255,0,80,69,2,0,31,115,254,254,224,139,255,0,64,69,2,0,42,64,255,255,255,191,255,0,48,69,2,0,49,96,245,230,245,152,255,0,0,69,2,0,79,65,221,171,221,164,255,0,240,68,2,0,114,120,194,102,194,165,255,0,224,68,2,0,143,187,189,50,136,189,255,0,184,68,2,0,147,15,255,240,248,255,255,0,104,68,2,0,24,35,250,250,235,215,255,0,88,68,2,0,127,255,255,0,255,255,255,0,40,68,2,0,113,128,255,127,255,
+212,255,0,0,68,2,0,127,15,255,240,255,255,255,0,232,67,2,0,42,26,245,245,245,220,255,0,120,67,2,0,23,58,255,255,228,196,255,0,64,67,2,0,0,0,0,0,0,0,255,0,24,67,2,0,25,49,255,255,235,205,255,0,176,66,2,0,170,255,255,0,0,255,255,0,160,66,2,0,192,206,226,138,43,226,255,0,56,66,2,0,0,190,165,165,42,42,255,0,40,66,2,0,23,99,222,222,184,135,255,0,232,65,2,0,128,103,160,95,158,160,255,0,200,65,2,0,63,255,255,127,255,0,255,0,184,65,2,0,17,218,210,210,105,30,255,0,168,65,2,0,11,175,255,255,127,80,255,0,128,
+65,2,0,154,147,237,100,149,237,255,0,112,65,2,0,33,34,255,255,248,220,255,0,96,65,2,0,246,231,220,220,20,60,255,0,64,65,2,0,127,255,255,0,255,255,255,0,16,65,2,0,170,255,139,0,0,139,255,0,248,64,2,0,127,255,139,0,139,139,255,0,224,64,2,0,30,239,184,184,134,11,255,0,208,64,2,0,0,0,169,169,169,169,255,0,192,64,2,0,85,255,100,0,100,0,255,0,176,64,2,0,0,0,169,169,169,169,255,0,136,64,2,0,39,110,189,189,183,107,255,0,112,64,2,0,212,255,139,139,0,139,255,0,88,64,2,0,58,142,107,85,107,47,255,0,72,64,2,0,
+23,255,255,255,140,0,255,0,8,64,2,0,198,192,204,153,50,204,255,0,232,63,2,0,0,255,139,139,0,0,255,0,216,63,2,0,10,121,233,233,150,122,255,0,192,63,2,0,85,61,188,143,188,143,255,0,168,63,2,0,175,143,139,72,61,139,255,0,144,63,2,0,127,103,79,47,79,79,255,0,104,63,2,0,127,103,79,47,79,79,255,0,80,63,2,0,128,255,209,0,206,209,255,0,64,63,2,0,199,255,211,148,0,211,255,0,48,63,2,0,232,235,255,255,20,147,255,0,184,62,2,0,138,255,255,0,191,255,255,0,168,62,2,0,0,0,105,105,105,105,255,0,152,62,2,0,0,0,105,
+105,105,105,255,0,136,62,2,0,148,225,255,30,144,255,255,0,120,62,2,0,0,206,178,178,34,34,255,0,96,62,2,0,28,15,255,255,250,240,255,0,56,62,2,0,85,192,139,34,139,34,255,0,32,62,2,0,212,255,255,255,0,255,255,0,16,62,2,0,0,0,220,220,220,220,255,0,0,62,2,0,170,7,255,248,248,255,255,0,200,61,2,0,35,255,255,255,215,0,255,0,184,61,2,0,30,217,218,218,165,32,255,0,168,61,2,0,0,0,128,128,128,128,255,0,152,61,2,0,85,255,128,0,128,0,255,0,128,61,2,0,59,208,255,173,255,47,255,0,112,61,2,0,0,0,128,128,128,128,
+255,0,80,61,2,0,85,15,255,240,255,240,255,0,64,61,2,0,233,150,255,255,105,180,255,0,48,61,2,0,0,140,205,205,92,92,255,0,32,61,2,0,194,255,130,75,0,130,255,0,232,60,2,0,42,15,255,255,255,240,255,0,216,60,2,0,38,106,240,240,230,140,255,0,200,60,2,0,170,20,250,230,230,250,255,0,176,60,2,0,240,15,255,255,240,245,255,0,160,60,2,0,64,255,252,124,252,0,255,0,136,60,2,0,38,49,255,255,250,205,255,0,104,60,2,0,137,63,230,173,216,230,255,0,88,60,2,0,0,119,240,240,128,128,255,0,72,60,2,0,127,31,255,224,255,255,
+255,0,24,60,2,0,42,40,250,250,250,210,255,0,208,59,2,0,0,0,211,211,211,211,255,0,176,59,2,0,85,100,238,144,238,144,255,0,160,59,2,0,0,0,211,211,211,211,255,0,144,59,2,0,248,73,255,255,182,193,255,0,120,59,2,0,12,132,255,255,160,122,255,0,96,59,2,0,125,209,178,32,178,170,255,0,24,59,2,0,143,117,250,135,206,250,255,0,0,59,2,0,148,56,153,119,136,153,255,0,232,58,2,0,148,56,153,119,136,153,255,0,208,58,2,0,151,52,222,176,196,222,255,0,144,58,2,0,42,31,255,255,255,224,255,0,128,58,2,0,85,255,255,0,255,
+0,255,0,112,58,2,0,85,192,205,50,205,50,255,0,96,58,2,0,21,20,250,250,240,230,255,0,80,58,2,0,212,255,255,255,0,255,255,0,64,58,2,0,0,255,128,128,0,0,255,0,24,58,2,0,113,128,205,102,205,170,255,0,240,57,2,0,170,255,205,0,0,205,255,0,208,57,2,0,204,152,211,186,85,211,255,0,152,57,2,0,183,124,219,147,112,219,255,0,88,57,2,0,103,169,179,60,179,113,255,0,56,57,2,0,176,143,238,123,104,238,255,0,24,57,2,0,111,255,250,0,250,154,255,0,0,57,2,0,125,167,209,72,209,204,255,0,224,56,2,0,228,228,199,199,21,133,
+255,0,200,56,2,0,170,198,112,25,25,112,255,0,112,56,2,0,106,9,255,245,255,250,255,0,96,56,2,0,4,30,255,255,228,225,255,0,80,56,2,0,26,73,255,255,228,181,255,0,48,56,2,0,25,81,255,255,222,173,255,0,200,55,2,0,170,255,128,0,0,128,255,0,184,55,2,0,27,23,253,253,245,230,255,0,152,55,2,0,42,255,128,128,128,0,255,0,104,55,2,0,56,192,142,107,142,35,255,0,80,55,2,0,27,255,255,255,165,0,255,0,32,55,2,0,11,255,255,255,69,0,255,0,248,54,2,0,214,123,218,218,112,214,255,0,200,54,2,0,38,72,238,238,232,170,255,
+0,80,54,2,0,85,100,251,152,251,152,255,0,56,54,2,0,127,67,238,175,238,238,255,0,216,53,2,0,241,124,219,219,112,147,255,0,200,53,2,0,26,41,255,255,239,213,255,0,168,53,2,0,20,70,255,255,218,185,255,0,152,53,2,0,20,176,205,205,133,63,255,0,120,53,2,0,247,63,255,255,192,203,255,0,104,53,2,0,212,70,221,221,160,221,255,0,72,53,2,0,132,59,230,176,224,230,255,0,56,53,2,0,212,255,128,128,0,128,255,0,40,53,2,0,0,255,255,255,0,0,255,0,24,53,2,0,0,61,188,188,143,143,255,0,216,52,2,0,159,181,225,65,105,225,255,
+0,192,52,2,0,17,220,139,139,69,19,255,0,160,52,2,0,4,138,250,250,128,114,255,0,144,52,2,0,19,154,244,244,164,96,255,0,128,52,2,0,103,170,139,46,139,87,255,0,112,52,2,0,17,16,255,255,245,238,255,0,72,52,2,0,13,183,160,160,82,45,255,0,56,52,2,0,0,0,192,192,192,192,255,0,40,52,2,0,139,108,235,135,206,235,255,0,8,52,2,0,175,143,205,106,90,205,255,0,184,51,2,0,148,56,144,112,128,144,255,0,168,51,2,0,148,56,144,112,128,144,255,0,136,51,2,0,0,5,255,255,250,250,255,0,112,51,2,0,106,255,255,0,255,127,255,
+0,96,51,2,0,146,155,180,70,130,180,255,0,80,51,2,0,24,84,210,210,180,140,255,0,48,51,2,0,127,255,128,0,128,128,255,0,32,51,2,0,212,29,216,216,191,216,255,0,16,51,2,0,6,184,255,255,99,71,255,0,0,51,2,0,123,182,224,64,224,208,255,0,192,50,2,0,212,115,238,238,130,238,255,0,128,50,2,0,27,68,245,245,222,179,255,0,112,50,2,0,0,0,255,255,255,255,255,0,96,50,2,0,0,0,245,245,245,245,255,0,80,50,2,0,42,255,255,255,255,0,255,0,56,50,2,0,56,192,205,154,205,50,255,0,40,50,2,0,45,67,252,247,252,185,255,0,24,50,
+2,0,68,91,221,173,221,142,255,0,248,49,2,0,98,178,163,49,163,84,255,0,232,49,2,0,42,50,255,255,255,204,255,0,184,49,2,0,62,85,230,194,230,153,255,0,168,49,2,0,85,100,198,120,198,121,255,0,152,49,2,0,99,187,132,35,132,67,255,0,136,49,2,0,42,50,255,255,255,204,255,0,120,49,2,0,62,85,230,194,230,153,255,0,104,49,2,0,85,100,198,120,198,121,255,0,72,49,2,0,98,178,163,49,163,84,255,0,56,49,2,0,107,255,104,0,104,55,255,0,40,49,2,0,42,50,255,255,255,204,255,0,24,49,2,0,55,81,240,217,240,163,255,0,216,48,
+2,0,68,91,221,173,221,142,255,0,200,48,2,0,85,100,198,120,198,121,255,0,184,48,2,0,98,178,163,49,163,84,255,0,168,48,2,0,107,255,104,0,104,55,255,0,152,48,2,0,42,50,255,255,255,204,255,0,136,48,2,0,55,81,240,217,240,163,255,0,96,48,2,0,68,91,221,173,221,142,255,0,80,48,2,0,85,100,198,120,198,121,255,0,64,48,2,0,96,158,171,65,171,93,255,0,48,48,2,0,99,187,132,35,132,67,255,0,0,48,2,0,108,255,90,0,90,50,255,0,240,47,2,0,42,25,255,255,255,229,255,0,224,47,2,0,45,67,252,247,252,185,255,0,208,47,2,0,55,
+81,240,217,240,163,255,0,192,47,2,0,68,91,221,173,221,142,255,0,176,47,2,0,85,100,198,120,198,121,255,0,96,47,2,0,96,158,171,65,171,93,255,0,80,47,2,0,99,187,132,35,132,67,255,0,64,47,2,0,108,255,90,0,90,50,255,0,48,47,2,0,42,25,255,255,255,229,255,0,240,46,2,0,45,67,252,247,252,185,255,0,224,46,2,0,55,81,240,217,240,163,255,0,208,46,2,0,68,91,221,173,221,142,255,0,192,46,2,0,85,100,198,120,198,121,255,0,176,46,2,0,96,158,171,65,171,93,255,0,160,46,2,0,99,187,132,35,132,67,255,0,128,46,2,0,107,255,
+104,0,104,55,255,0,88,46,2,0,110,255,69,0,69,41,255,0,24,46,2,0,49,73,248,237,248,177,255,0,240,45,2,0,117,97,205,127,205,187,255,0,152,45,2,0,144,194,184,44,127,184,255,0,112,45,2,0,42,50,255,255,255,204,255,0,88,45,2,0,99,66,218,161,218,180,255,0,72,45,2,0,132,170,196,65,182,196,255,0,48,45,2,0,150,203,168,34,94,168,255,0,32,45,2,0,42,50,255,255,255,204,255,0,208,44,2,0,99,66,218,161,218,180,255,0,192,44,2,0,132,170,196,65,182,196,255,0,176,44,2,0,144,194,184,44,127,184,255,0,160,44,2,0,164,191,
+148,37,52,148,255,0,72,44,2,0,42,50,255,255,255,204,255,0,56,44,2,0,69,58,233,199,233,180,255,0,32,44,2,0,117,97,205,127,205,187,255,0,208,43,2,0,132,170,196,65,182,196,255,0,184,43,2,0,144,194,184,44,127,184,255,0,144,43,2,0,164,191,148,37,52,148,255,0,80,43,2,0,42,50,255,255,255,204,255,0,48,43,2,0,69,58,233,199,233,180,255,0,232,42,2,0,117,97,205,127,205,187,255,0,216,42,2,0,132,170,196,65,182,196,255,0,104,42,2,0,139,216,192,29,145,192,255,0,88,42,2,0,150,203,168,34,94,168,255,0,48,42,2,0,158,
+231,132,12,44,132,255,0,32,42,2,0,42,38,255,255,255,217,255,0,16,42,2,0,49,73,248,237,248,177,255,0,232,41,2,0,69,58,233,199,233,180,255,0,200,41,2,0,117,97,205,127,205,187,255,0,184,41,2,0,132,170,196,65,182,196,255,0,168,41,2,0,139,216,192,29,145,192,255,0,152,41,2,0,150,203,168,34,94,168,255,0,240,40,2,0,158,231,132,12,44,132,255,0,224,40,2,0,42,38,255,255,255,217,255,0,200,40,2,0,49,73,248,237,248,177,255,0,184,40,2,0,69,58,233,199,233,180,255,0,168,40,2,0,117,97,205,127,205,187,255,0,152,40,
+2,0,132,170,196,65,182,196,255,0,112,40,2,0,139,216,192,29,145,192,255,0,96,40,2,0,150,203,168,34,94,168,255,0,64,40,2,0,164,191,148,37,52,148,255,0,32,40,2,0,158],"i8",L,l.J+51217);D([231,88,8,29,88,255,0,176,39,2,0,37,66,255,255,247,188,255,0,160,39,2,0,28,175,254,254,196,79,255,0,144,39,2,0,16,238,217,217,95,14,255,0,128,39,2,0,42,42,255,255,255,212,255,0,112,39,2,0,28,112,254,254,217,142,255,0,96,39,2,0,22,213,254,254,153,41,255,0,64,39,2,0,15,252,204,204,76,2,255,0,48,39,2,0,42,42,255,255,255,
+212,255,0,32,39,2,0,28,112,254,254,217,142,255,0,16,39,2,0,22,213,254,254,153,41,255,0,176,38,2,0,16,238,217,217,95,14,255,0,160,38,2,0,13,248,153,153,52,4,255,0,136,38,2,0,42,42,255,255,255,212,255,0,120,38,2,0,31,109,254,254,227,145,255,0,104,38,2,0,28,175,254,254,196,79,255,0,88,38,2,0,22,213,254,254,153,41,255,0,56,38,2,0,16,238,217,217,95,14,255,0,40,38,2,0,13,248,153,153,52,4,255,0,24,38,2,0,42,42,255,255,255,212,255,0,8,38,2,0,31,109,254,254,227,145,255,0,200,37,2,0,28,175,254,254,196,79,255,
+0,184,37,2,0,22,213,254,254,153,41,255,0,168,37,2,0,18,233,236,236,112,20,255,0,152,37,2,0,15,252,204,204,76,2,255,0,136,37,2,0,12,247,140,140,45,4,255,0,120,37,2,0,42,25,255,255,255,229,255,0,88,37,2,0,37,66,255,255,247,188,255,0,72,37,2,0,31,109,254,254,227,145,255,0,56,37,2,0,28,175,254,254,196,79,255,0,40,37,2,0,22,213,254,254,153,41,255,0,232,36,2,0,18,233,236,236,112,20,255,0,208,36,2,0,15,252,204,204,76,2,255,0,192,36,2,0,12,247,140,140,45,4,255,0,176,36,2,0,42,25,255,255,255,229,255,0,160,
+36,2,0,37,66,255,255,247,188,255,0,144,36,2,0,31,109,254,254,227,145,255,0,96,36,2,0,28,175,254,254,196,79,255,0,80,36,2,0,22,213,254,254,153,41,255,0,64,36,2,0,18,233,236,236,112,20,255,0,48,36,2,0,15,252,204,204,76,2,255,0,240,35,2,0,13,248,153,153,52,4,255,0,224,35,2,0,13,240,102,102,37,6,255,0,208,35,2,0,34,95,255,255,237,160,255,0,192,35,2,0,24,178,254,254,178,76,255,0,176,35,2,0,5,221,240,240,59,32,255,0,160,35,2,0,42,77,255,255,255,178,255,0,80,35,2,0,29,162,254,254,204,92,255,0,64,35,2,0,
+17,194,253,253,141,60,255,0,48,35,2,0,254,225,227,227,26,28,255,0,32,35,2,0,42,77,255,255,255,178,255,0,184,34,2,0,29,162,254,254,204,92,255,0,168,34,2,0,17,194,253,253,141,60,255,0,152,34,2,0,5,221,240,240,59,32,255,0,136,34,2,0,246,255,189,189,0,38,255,0,120,34,2,0,42,77,255,255,255,178,255,0,104,34,2,0,30,136,254,254,217,118,255,0,72,34,2,0,24,178,254,254,178,76,255,0,48,34,2,0,17,194,253,253,141,60,255,0,248,33,2,0,5,221,240,240,59,32,255,0,232,33,2,0,246,255,189,189,0,38,255,0,136,33,2,0,42,
+77,255,255,255,178,255,0,120,33,2,0,30,136,254,254,217,118,255,0,88,33,2,0,24,178,254,254,178,76,255,0,72,33,2,0,17,194,253,253,141,60,255,0,48,33,2,0,7,212,252,252,78,42,255,0,32,33,2,0,254,225,227,227,26,28,255,0,224,32,2,0,245,255,177,177,0,38,255,0,208,32,2,0,42,50,255,255,255,204,255,0,192,32,2,0,34,95,255,255,237,160,255,0,176,32,2,0,30,136,254,254,217,118,255,0,40,32,2,0,24,178,254,254,178,76,255,0,24,32,2,0,17,194,253,253,141,60,255,0,0,32,2,0,7,212,252,252,78,42,255,0,176,31,2,0,254,225,
+227,227,26,28,255,0,152,31,2,0,245,255,177,177,0,38,255,0,128,31,2,0,42,50,255,255,255,204,255,0,80,31,2,0,34,95,255,255,237,160,255,0,24,31,2,0,30,136,254,254,217,118,255,0,160,30,2,0,24,178,254,254,178,76,255,0,128,30,2,0,17,194,253,253,141,60,255,0,16,30,2,0,7,212,252,252,78,42,255,0,0,30,2,0,254,225,227,227,26,28,255,0,232,29,2,0,246,255,189,189,0,38,255,0,216,29,2,0,242,255,128,128,0,38,255,0,200,29,2,0,147,15,255,240,248,255,255,0,184,29,2,0,24,35,250,250,235,215,255,0,136,29,2,0,23,36,255,
+255,239,219,255,0,120,29,2,0,23,36,238,238,223,204,255,0,104,29,2,0,23,36,205,205,192,176,255,0,88,29,2,0,24,34,139,139,131,120,255,0,40,29,2,0,113,128,255,127,255,212,255,0,240,28,2,0,113,128,255,127,255,212,255,0,208,28,2,0,113,128,238,118,238,198,255,0,192,28,2,0,113,128,205,102,205,170,255,0,176,28,2,0,113,128,139,69,139,116,255,0,168,28,2,0,127,15,255,240,255,255,255,0,136,28,2,0,127,15,255,240,255,255,255,0,128,28,2,0,127,15,238,224,238,238,255,0,120,28,2,0,127,14,205,193,205,205,255,0,112,
+28,2,0,127,14,139,131,139,139,255,0,72,28,2,0,42,26,245,245,245,220,255,0,16,28,2,0,23,58,255,255,228,196,255,0,8,28,2,0,23,58,255,255,228,196,255,0,0,28,2,0,23,58,238,238,213,183,255,0,248,27,2,0,22,58,205,205,183,158,255,0,240,27,2,0,23,58,139,139,125,107,255,0,216,27,2,0,0,0,0,0,0,0,255,0,200,27,2,0,25,49,255,255,235,205,255,0,192,27,2,0,170,255,255,0,0,255,255,0,184,27,2,0,170,255,255,0,0,255,255,0,160,27,2,0,170,255,238,0,0,238,255,0,112,27,2,0,170,255,205,0,0,205,255,0,104,27,2,0,170,255,139,
+0,0,139,255,0,80,27,2,0,192,206,226,138,43,226,255,0,72,27,2,0,0,190,165,165,42,42,255,0,64,27,2,0,0,191,255,255,64,64,255,0,40,27,2,0,0,191,238,238,59,59,255,0,32,27,2,0,0,191,205,205,51,51,255,0,24,27,2,0,0,190,139,139,35,35,255,0,8,27,2,0,23,99,222,222,184,135,255,0,224,26,2,0,23,100,255,255,211,155,255,0,200,26,2,0,23,99,238,238,197,145,255,0,184,26,2,0,23,99,205,205,170,125,255,0,168,26,2,0,23,99,139,139,115,85,255,0,152,26,2,0,128,103,160,95,158,160,255,0,136,26,2,0,131,103,255,152,245,255,
+255,0,104,26,2,0,131,102,238,142,229,238,255,0,80,26,2,0,131,103,205,122,197,205,255,0,64,26,2,0,131,102,139,83,134,139,255,0,48,26,2,0,63,255,255,127,255,0,255,0,8,26,2,0,63,255,255,127,255,0,255,0,232,25,2,0,63,255,238,118,238,0,255,0,200,25,2,0,63,255,205,102,205,0,255,0,184,25,2,0,63,255,139,69,139,0,255,0,168,25,2,0,17,218,210,210,105,30,255,0,152,25,2,0,17,219,255,255,127,36,255,0,112,25,2,0,17,219,238,238,118,33,255,0,96,25,2,0,17,218,205,205,102,29,255,0,64,25,2,0,17,220,139,139,69,19,255,
+0,56,25,2,0,11,175,255,255,127,80,255,0,24,25,2,0,7,169,255,255,114,86,255,0,248,24,2,0,6,169,238,238,106,80,255,0,240,24,2,0,6,169,205,205,91,69,255,0,232,24,2,0,6,168,139,139,62,47,255,0,216,24,2,0,154,147,237,100,149,237,255,0,200,24,2,0,33,34,255,255,248,220,255,0,144,24,2,0,33,34,255,255,248,220,255,0,128,24,2,0,34,35,238,238,232,205,255,0,112,24,2,0,34,34,205,205,200,177,255,0,80,24,2,0,35,34,139,139,136,120,255,0,48,24,2,0,246,231,220,220,20,60,255,0,16,24,2,0,127,255,255,0,255,255,255,0,8,
+24,2,0,127,255,255,0,255,255,255,0,0,24,2,0,127,255,238,0,238,238,255,0,248,23,2,0,127,255,205,0,205,205,255,0,240,23,2,0,127,255,139,0,139,139,255,0,208,23,2,0,30,239,184,184,134,11,255,0,184,23,2,0,30,240,255,255,185,15,255,0,112,23,2,0,30,240,238,238,173,14,255,0,96,23,2,0,30,240,205,205,149,12,255,0,56,23,2,0,30,240,139,139,101,8,255,0,32,23,2,0,85,255,100,0,100,0,255,0,0,23,2,0,39,110,189,189,183,107,255,0,240,22,2,0,58,142,107,85,107,47,255,0,216,22,2,0,58,143,255,202,255,112,255,0,200,22,2,
+0,58,143,238,188,238,104,255,0,152,22,2,0,58,143,205,162,205,90,255,0,136,22,2,0,58,143,139,110,139,61,255,0,120,22,2,0,23,255,255,255,140,0,255,0,104,22,2,0,21,255,255,255,127,0,255,0,40,22,2,0,21,255,238,238,118,0,255,0,16,22,2,0,21,255,205,205,102,0,255,0,216,21,2,0,21,255,139,139,69,0,255,0,192,21,2,0,198,192,204,153,50,204,255,0,168,21,2,0,198,193,255,191,62,255,255,0,144,21,2,0,198,192,238,178,58,238,255,0,96,21,2,0,198,192,205,154,50,205,255,0,32,21,2,0,198,192,139,104,34,139,255,0,128,20,
+2,0,10,121,233,233,150,122,255,0,112,20,2,0,85,61,188,143,188,143,255,0,32,20,2,0,85,62,255,193,255,193,255,0,248,19,2,0,85,62,238,180,238,180,255,0,224,19,2,0,85,62,205,155,205,155,255,0,208,19,2,0,85,62,139,105,139,105,255,0,192,19,2,0,175,143,139,72,61,139,255,0,176,19,2,0,127,103,79,47,79,79,255,0,144,19,2,0,127,104,255,151,255,255,255,0,112,19,2,0,127,103,238,141,238,238,255,0,96,19,2,0,127,104,205,121,205,205,255,0,80,19,2,0,127,104,139,82,139,139,255,0,32,19,2,0,127,103,79,47,79,79,255,0,248,
+18,2,0,128,255,209,0,206,209,255,0,208,18,2,0,199,255,211,148,0,211,255,0,192,18,2,0,232,235,255,255,20,147,255,0,176,18,2,0,232,235,255,255,20,147,255,0,160,18,2,0,232,235,238,238,18,137,255,0,120,18,2,0,232,235,205,205,16,118,255,0,104,18,2,0,231,236,139,139,10,80,255,0,88,18,2,0,138,255,255,0,191,255,255,0,64,18,2,0,138,255,255,0,191,255,255,0,16,18,2,0,138,255,238,0,178,238,255,0,232,17,2,0,138,255,205,0,154,205,255,0,216,17,2,0,138,255,139,0,104,139,255,0,192,17,2,0,0,0,105,105,105,105,255,0,
+184,17,2,0,0,0,105,105,105,105,255,0,168,17,2,0,148,225,255,30,144,255,255,0,136,17,2,0,148,225,255,30,144,255,255,0,120,17,2,0,148,225,238,28,134,238,255,0,104,17,2,0,148,225,205,24,116,205,255,0,88,17,2,0,148,225,139,16,78,139,255,0,240,16,2,0,0,206,178,178,34,34,255,0,192,16,2,0,0,207,255,255,48,48,255,0,176,16,2,0,0,207,238,238,44,44,255,0,160,16,2,0,0,207,205,205,38,38,255,0,72,16,2,0,0,207,139,139,26,26,255,0,56,16,2,0,28,15,255,255,250,240,255,0,24,16,2,0,85,192,139,34,139,34,255,0,8,16,2,
+0,0,0,220,220,220,220,255,0,248,15,2,0,170,7,255,248,248,255,255,0,240,15,2,0,35,255,255,255,215,0,255,0,120,15,2,0,35,255,255,255,215,0,255,0,88,15,2,0,35,255,238,238,201,0,255,0,80,15,2,0,35,255,205,205,173,0,255,0,72,15,2,0,35,255,139,139,117,0,255,0,56,15,2,0,30,217,218,218,165,32,255,0,40,15,2,0,30,218,255,255,193,37,255,0,8,15,2,0,30,218,238,238,180,34,255,0,248,14,2,0,30,218,205,205,155,29,255,0,232,14,2,0,30,218,139,139,105,20,255,0,168,14,2,0,0,0,192,192,192,192,255,0,104,14,2,0,0,0,0,0,
+0,0,255,0,88,14,2,0,0,0,3,3,3,3,255,0,80,14,2,0,0,0,26,26,26,26,255,0,64,14,2,0,0,0,255,255,255,255,255,0,56,14,2,0,0,0,28,28,28,28,255,0,48,14,2,0,0,0,31,31,31,31,255,0,16,14,2,0,0,0,33,33,33,33,255,0,8,14,2,0,0,0,36,36,36,36,255,0,0,14,2,0,0,0,38,38,38,38,255,0,248,13,2,0,0,0,41,41,41,41,255,0,176,13,2,0,0,0,43,43,43,43,255,0,144,13,2,0,0,0,46,46,46,46,255,0,136,13,2,0,0,0,48,48,48,48,255,0,128,13,2,0,0,0,5,5,5,5,255,0,120,13,2,0,0,0,51,51,51,51,255,0,112,13,2,0,0,0,54,54,54,54,255,0,16,13,2,0,
+0,0,56,56,56,56,255,0,8,13,2,0,0,0,59,59,59,59,255,0,0,13,2,0,0,0,61,61,61,61,255,0,248,12,2,0,0,0,64,64,64,64,255,0,224,12,2,0,0,0,66,66,66,66,255,0,192,12,2,0,0,0,69,69,69,69,255,0,184,12,2,0,0,0,71,71,71,71,255,0,176,12,2,0,0,0,74,74,74,74,255,0,168,12,2,0,0,0,8,8,8,8,255,0,160,12,2,0,0,0,77,77,77,77,255,0,136,12,2,0,0,0,79,79,79,79,255,0,128,12,2,0,0,0,82,82,82,82,255,0,48,12,2,0,0,0,84,84,84,84,255,0,40,12,2,0,0,0,87,87,87,87,255,0,232,11,2,0,0,0,89,89,89,89,255,0,200,11,2,0,0,0,92,92,92,92,
+255,0,168,11,2,0,0,0,94,94,94,94,255,0,160,11,2,0,0,0,97,97,97,97,255,0,136,11,2,0,0,0,99,99,99,99,255,0,128,11,2,0,0,0,10,10,10,10,255,0,40,11,2,0,0,0,102,102,102,102,255,0,32,11,2,0,0,0,105,105,105,105,255,0,24,11,2,0,0,0,107,107,107,107,255,0,16,11,2,0,0,0,110,110,110,110,255,0,200,10,2,0,0,0,112,112,112,112,255,0,168,10,2,0,0,0,115,115,115,115,255,0,152,10,2,0,0,0,117,117,117,117,255,0,112,10,2,0,0,0,120,120,120,120,255,0,96,10,2,0,0,0,122,122,122,122,255,0,80,10,2,0,0,0,125,125,125,125,255,0,
+56,10,2,0,0,0,13,13,13,13,255,0,32,10,2,0,0,0,127,127,127,127,255,0,208,9,2,0,0,0,130,130,130,130,255,0,200,9,2,0,0,0,133,133,133,133,255,0,144,9,2,0,0,0,135,135,135,135,255,0,112,9,2,0,0,0,138,138,138,138,255,0,96,9,2,0,0,0,140,140,140,140,255,0,88,9,2,0,0,0,143,143,143,143,255,0,80,9,2,0,0,0,145,145,145,145,255,0,72,9,2,0,0,0,148,148,148,148,255,0,48,9,2,0,0,0,150,150,150,150,255,0,40,9,2,0,0,0,15,15,15,15,255,0,16,9,2,0,0,0,153,153,153,153,255,0,8,9,2,0,0,0,156,156,156,156,255,0,232,8,2,0,0,0,
+158,158,158,158,255,0,200,8,2,0,0,0,161,161,161,161,255,0,168,8,2,0,0,0,163,163,163,163,255,0,160,8,2,0,0,0,166,166,166,166,255,0,152,8,2,0,0,0,168,168,168,168,255,0,144,8,2,0,0,0,171,171,171,171,255,0,112,8,2,0,0,0,173,173,173,173,255,0,104,8,2,0,0,0,176,176,176,176,255,0,96,8,2,0,0,0,18,18,18,18,255,0,88,8,2,0,0,0,179,179,179,179,255,0,56,8,2,0,0,0,181,181,181,181,255,0,24,8,2,0,0,0,184,184,184,184,255,0,16,8,2,0,0,0,186,186,186,186,255,0,8,8,2,0,0,0,189,189,189,189,255,0,0,8,2,0,0,0,191,191,191,
+191,255,0,248,7,2,0,0,0,194,194,194,194,255,0,224,7,2,0,0,0,196,196,196,196,255,0,216,7,2,0,0,0,199,199,199,199,255,0,208,7,2,0,0,0,201,201,201,201,255,0,200,7,2,0,0,0,20,20,20,20,255,0,168,7,2,0,0,0,204,204,204,204,255,0,120,7,2,0,0,0,207,207,207,207,255,0,112,7,2,0,0,0,209,209,209,209,255,0,104,7,2,0,0,0,212,212,212,212,255,0,96,7,2,0,0,0,214,214,214,214,255,0,64,7,2,0,0,0,217,217,217,217,255,0,40,7,2,0,0,0,219,219,219,219,255,0,32,7,2,0,0,0,222,222,222,222,255,0,24,7,2,0,0,0,224,224,224,224,255,
+0,16,7,2,0,0,0,227,227,227,227,255,0,240,6,2,0,0,0,23,23,23,23,255,0,216,6,2,0,0,0,229,229,229,229,255,0,208,6,2,0,0,0,232,232,232,232,255,0,200,6,2,0,0,0,235,235,235,235,255,0,192,6,2,0,0,0,237,237,237,237,255,0,184,6,2,0,0,0,240,240,240,240,255,0,160,6,2,0,0,0,242,242,242,242,255,0,152,6,2,0,0,0,245,245,245,245,255,0,144,6,2,0,0,0,247,247,247,247,255,0,136,6,2,0,0,0,250,250,250,250,255,0,112,6,2,0,0,0,252,252,252,252,255,0,96,6,2,0,85,255,255,0,255,0,255,0,88,6,2,0,85,255,255,0,255,0,255,0,80,6,
+2,0,85,255,238,0,238,0,255,0,64,6,2,0,85,255,205,0,205,0,255,0,56,6,2,0,85,255,139,0,139,0,255,0,8,6,2,0,59,208,255,173,255,47,255,0,0,6,2,0,0,0,192,192,192,192,255,0,248,5,2,0,0,0,0,0,0,0,255,0,240,5,2,0,0,0,3,3,3,3,255,0,208,5,2,0,0,0,26,26,26,26,255,0,200,5,2,0,0,0,255,255,255,255,255,0,192,5,2,0,0,0,28,28,28,28,255,0,184,5,2,0,0,0,31,31,31,31,255,0,176,5,2,0,0,0,33,33,33,33,255,0,168,5,2,0,0,0,36,36,36,36,255,0,136,5,2,0,0,0,38,38,38,38,255,0,128,5,2,0,0,0,41,41,41,41,255,0,104,5,2,0,0,0,43,43,
+43,43,255,0,80,5,2,0,0,0,46,46,46,46,255,0,48,5,2,0,0,0,48,48,48,48,255,0,16,5,2,0,0,0,5,5,5,5,255,0,8,5,2,0,0,0,51,51,51,51,255,0,0,5,2,0,0,0,54,54,54,54,255,0,248,4,2,0,0,0,56,56,56,56,255,0,240,4,2,0,0,0,59,59,59,59,255,0,216,4,2,0,0,0,61,61,61,61,255,0,208,4,2,0,0,0,64,64,64,64,255,0,136,4,2,0,0,0,66,66,66,66,255,0,128,4,2,0,0,0,69,69,69,69,255,0,64,4,2,0,0,0,71,71,71,71,255,0,32,4,2,0,0,0,74,74,74,74,255,0,232,3,2,0,0,0,8,8,8,8,255,0,224,3,2,0,0,0,77,77,77,77,255,0,200,3,2,0,0,0,79,79,79,79,
+255,0,192,3,2,0,0,0,82,82,82,82,255,0,104,3,2,0,0,0,84,84,84,84,255,0,96,3,2,0,0,0,87,87,87,87,255,0,88,3,2,0,0,0,89,89,89,89,255,0,80,3,2,0,0,0,92,92,92,92,255,0,240,2,2,0,0,0,94,94,94,94,255,0,168,2,2,0,0,0,97,97,97,97,255,0,152,2,2,0,0,0,99,99,99,99,255,0,72,2,2,0,0,0,10,10,10,10,255,0,56,2,2,0,0,0,102,102,102,102,255,0,32,2,2,0,0,0,105,105,105,105,255,0,248,1,2,0,0,0,107,107,107,107,255,0,216,1,2,0,0,0,110,110,110,110,255,0,144,1,2,0,0,0,112,112,112,112,255,0,128,1,2,0,0,0,115,115,115,115,255,
+0,56,1,2,0,0,0,117,117,117,117,255,0,48,1,2,0,0,0,120,120,120,120,255,0,24,1,2,0,0,0,122,122,122,122,255,0,0,1,2,0,0,0,125,125,125,125,255,0,248,0,2,0,0,0,13,13,13,13,255,0,240,0,2,0,0,0,127,127,127,127,255,0,216,0,2,0,0,0,130,130,130,130,255,0,176,0,2,0,0,0,133,133,133,133,255,0,168,0,2,0,0,0,135,135,135,135,255,0,64,0,2,0,0,0,138,138,138,138,255,0,32,0,2,0,0,0,140,140,140,140,255,0,24,0,2,0,0,0,143,143,143,143,255,0,8,0,2,0,0,0,145,145,145,145,255,0,0,0,2,0,0,0,148,148,148,148,255,0,248,255,1,0,
+0,0,150,150,150,150,255,0,240,255,1,0,0,0,15,15,15,15,255,0,208,255,1,0,0,0,153,153,153,153,255,0,200,255,1,0,0,0,156,156,156,156,255,0,192,255,1,0,0,0,158,158,158,158,255,0,184,255,1,0,0,0,161,161,161,161,255,0,160,255,1,0,0,0,163,163,163,163,255,0,152,255,1,0,0,0,166,166,166,166,255,0,144,255,1,0,0,0,168,168,168,168,255,0,104,255,1,0,0,0,171,171,171,171,255,0,96,255,1,0,0,0,173,173,173,173,255,0,88,255,1,0,0,0,176,176,176,176,255,0,64,255,1,0,0,0,18,18,18,18,255,0,56,255,1,0,0,0,179,179,179,179,
+255,0,48,255,1,0,0,0,181,181,181,181,255,0,40,255,1,0,0,0,184,184,184,184,255,0,8,255,1,0,0,0,186,186,186,186,255,0,240,254,1,0,0,0,189,189,189,189,255,0,232,254,1,0,0,0,191,191,191,191,255,0,224,254,1,0,0,0,194,194,194,194,255,0,216,254,1,0,0,0,196,196,196,196,255,0,208,254,1,0,0,0,199,199,199,199,255,0,176,254,1,0,0,0,201,201,201,201,255,0,168,254,1,0,0,0,20,20,20,20,255,0,160,254,1,0,0,0,204,204,204,204,255,0,152,254,1,0,0,0,207,207,207,207,255,0,128,254,1,0,0,0,209,209,209,209,255,0,120,254,1,
+0,0,0,212,212,212,212,255,0,112,254,1,0,0,0,214,214,214,214,255,0,104,254,1,0,0,0,217,217,217,217,255,0,80,254,1,0,0,0,219,219,219,219,255,0,64,254,1,0,0,0,222,222,222,222,255,0,56,254,1,0,0,0,224,224,224,224,255,0,48,254,1,0,0,0,227,227,227,227,255,0,24,254,1,0,0,0,23,23,23,23,255,0,224,253,1,0,0,0,229,229,229,229,255,0,200,253,1,0,0,0,232,232,232,232,255,0,192,253,1,0,0,0,235,235,235,235,255,0,184,253,1,0,0,0,237,237,237,237,255,0,176,253,1,0,0,0,240,240,240,240,255,0,168,253,1,0,0,0,242,242,242,
+242,255,0,152,253,1,0,0,0,245,245,245,245,255,0,128,253,1,0,0,0,247,247,247,247,255,0,112,253,1,0,0,0,250,250,250,250,255,0,104,253,1,0,0,0,252,252,252,252,255,0,16,253,1,0,85,15,255,240,255,240,255,0,240,252,1,0,85,15,255,240,255,240,255,0,224,252,1,0,85,15,238,224,238,224,255,0,208,252,1,0,85,14,205,193,205,193,255,0,192,252,1,0,85,14,139,131,139,131,255,0,184,252,1,0,233,150,255,255,105,180,255,0,168,252,1,0,234,145,255,255,110,180,255,0,88,252,1,0,235,141,238,238,106,167,255,0,72,252,1,0,236,
+135,205,205,96,144,255,0,56,252,1,0,234,148,139,139,58,98,255,0,40,252,1,0,0,140,205,205,92,92,255,0,8,252,1,0,0,148,255,255,106,106,255,0,248,251,1,0,0,148,238,238,99,99,255,0,232,251,1,0,0,149,205,205,85,85,255,0,216,251,1,0,0,148,139,139,58,58,255,0,208,251,1,0,194,255,130,75,0,130,255,0,200,251,1,0,42,0,255,255,255,254,0,0,176,251,1,0,42,15,255,255,255,240,255,0,168,251,1,0,42,15,255,255,255,240,255,0,128,251,1,0,42,15,238,238,238,224,255,0,120,251,1,0,42,14,205,205,205,193,255,0,96,251,1,0,42,
+14,139,139,139,131,255,0,88,251,1,0,38,106,240,240,230,140,255,0,48,251,1,0,39,112,255,255,246,143,255,0,24,251,1,0,39,112,238,238,230,133,255,0,0,251,1,0,39,111,205,205,198,115,255,0,248,250,1,0,39,111,139,139,134,78,255,0,144,250,1,0,170,20,250,230,230,250,255,0,128,250,1,0,240,15,255,255,240,245,255,0,112,250,1,0,240,15,255,255,240,245,255,0,96,250,1,0,239,15,238,238,224,229,255,0,48,250,1,0,240,14,205,205,193,197,255,0,32,250,1,0,239,14,139,139,131,134,255,0,216,249,1,0,64,255,252,124,252,0,255,
+0,192,249,1,0,38,49,255,255,250,205,255,0,128,249,1,0,38,49,255,255,250,205,255,0,104,249,1,0,37,50,238,238,233,191,255,0,8,249,1,0,38,49,205,205,201,165,255,0,224,248,1,0,39,49,139,139,137,112,255,0,144,248,1,0,137,63,230,173,216,230,255,0,128,248,1,0,138,64,255,191,239,255,255,0,192,247,1,0,138,64,238,178,223,238,255,0,176,247,1,0,138,63,205,154,192,205,255,0,152,247,1,0,137,64,139,104,131,139,255,0,136,247,1,0,0,119,240,240,128,128,255,0,120,247,1,0,127,31,255,224,255,255,255,0,104,247,1,0,127,
+31,255,224,255,255,255,0,72,247,1,0,127,31,238,209,238,238,255,0,56,247,1,0,127,31,205,180,205,205,255,0,40,247,1,0,127,31,139,122,139,139,255,0,240,246,1,0,35,115,238,238,221,130,255,0,184,246,1,0,35,116,255,255,236,139,255,0,168,246,1,0,35,115,238,238,220,130,255,0,120,246,1,0,35,115,205,205,190,112,255,0,104,246,1,0,35,115,139,139,129,76,255,0,80,246,1,0,42,40,250,250,250,210,255,0,64,246,1,0,0,0,211,211,211,211,255,0,24,246,1,0,0,0,211,211,211,211,255,0,0,246,1,0,248,73,255,255,182,193,255,0,
+240,245,1,0,249,81,255,255,174,185,255,0,224,245,1,0,248,81,238,238,162,173,255,0,176,245,1,0,249,80,205,205,140,149,255,0,120,245,1,0,249,80,139,139,95,101,255,0,96,245,1,0,12,132,255,255,160,122,255,0,80,245,1,0,12,132,255,255,160,122,255,0,48,245,1,0,11,132,238,238,149,114,255,0,32,245,1,0,12,133,205,205,129,98,255,0,0,245,1,0,12,133,139,139,87,66,255,0,240,244,1,0,125,209,178,32,178,170,255,0,224,244,1,0,143,117,250,135,206,250,255,0,208,244,1,0,143,79,255,176,226,255,255,0,176,244,1,0,143,79,
+238,164,211,238,255,0,136,244,1,0,142,79,205,141,182,205,255,0,104,244,1,0,143,78,139,96,123,139,255,0,88,244,1,0,175,143,255,132,112,255,255,0,72,244,1,0,148,56,153,119,136,153,255,0,56,244,1,0,148,56,153,119,136,153,255,0,24,244,1,0,151,52,222,176,196,222,255,0,200,243,1,0,151,53,255,202,225,255,255,0,184,243,1,0,151,53,238,188,210,238,255,0,120,243,1,0,151,53,205,162,181,205,255,0,72,243,1,0,150,53,139,110,123,139,255,0,56,243,1,0,42,31,255,255,255,224,255,0,40,243,1,0,42,31,255,255,255,224,255,
+0,24,243,1,0,42,31,238,238,238,209,255,0,8,243,1,0,42,31,205,205,205,180,255,0,248,242,1,0,42,31,139,139,139,122,255,0,192,242,1,0,85,192,205,50,205,50,255,0,168,242,1,0,21,20,250,250,240,230,255,0,112,242,1,0,212,255,255,255,0,255,255,0,16,242,1,0,212,255,255,255,0,255,255,0,240,241,1,0,212,255,238,238,0,238,255,0,224,241,1,0,212,255,205,205,0,205,255,0,208,241,1,0,212,255,139,139,0,139,255,0,200,241,1,0,239,185,176,176,48,96,255,0,192,241,1,0,228,203,255,255,52,179,255,0,184,241,1,0,228,203,238,
+238,48,167,255,0,136,241,1,0,228,204,205,205,41,144,255,0,128,241,1,0,228,203,139,139,28,98,255,0,104,241,1,0,113,128,205,102,205,170,255,0,56,241,1,0,170,255,205,0,0,205,255,0,24,241,1,0,204,152,211,186,85,211,255,0,8,241,1,0,203,153,255,224,102,255,255,0,248,240,1,0,203,153,238,209,95,238,255,0,232,240,1,0,203,153,205,180,82,205,255,0,208,240,1,0,203,154,139,122,55,139,255,0,184,240,1,0,183,124,219,147,112,219,255,0,120,240,1,0,183,125,255,171,130,255,255,0,104,240,1,0,183,125,238,159,121,238,255,
+0,88,240,1,0,183,125,205,137,104,205,255,0,40,240,1,0,183,124,139,93,71,139,255,0,248,239,1,0,103,169,179,60,179,113,255,0,232,239,1,0,176,143,238,123,104,238,255,0,208,239,1,0,111,255,250,0,250,154,255,0,184,239,1,0,125,167,209,72,209,204,255,0,160,239,1,0,228,228,199,199,21,133,255,0,144,239,1,0,170,198,112,25,25,112,255,0,112,239,1,0,106,9,255,245,255,250,255,0,96,239,1,0,4,30,255,255,228,225,255,0,48,239,1,0,4,30,255,255,228,225,255,0,0,239,1,0,4,30,238,238,213,210,255,0,176,238,1,0,3,29,205,
+205,183,181,255,0,160,238,1,0,5,29,139,139,125,123,255,0,72,238,1,0,26,73,255,255,228,181,255,0,56,238,1,0,25,81,255,255,222,173,255,0,16,238,1,0,25,81,255,255,222,173,255,0,0,238,1,0,25,82,238,238,207,161,255,0,200,237,1,0,25,82,205,205,179,139,255,0,168,237,1,0,25,82,139,139,121,94,255,0,144,237,1,0,170,255,128,0,0,128,255,0,128,237,1,0,170,255,128,0,0,128,255,0,88,237,1,0,42,0,255,255,255,254,0,0,80,237,1,0,27,23,253,253,245,230,255,0,56,237,1,0,56,192,142,107,142,35,255,0,24,237,1,0,56,193,255,
+192,255,62,255,0,248,236,1,0,56,192,238,179,238,58,255,0,200,236,1,0,56,192,205,154,205,50,255,0,136,236,1,0,56,192,139,105,139,34,255,0,96,236,1,0,27,255,255,255,165,0,255,0,0,236,1,0,27,255,255,255,165,0,255,0,232,235,1,0,27,255,238,238,154,0,255,0,64,235,1,0,27,255,205,205,133,0,255,0,56,235,1,0,27,255,139,139,90,0,255,0,32,235,1,0,11,255,255,255,69,0,255,0,16,235,1,0,11,255,255,255,69,0,255,0,248,234,1,0,11,255,238,238,64,0,255,0,232,234,1,0,11,255,205,205,55,0,255,0,200,234,1,0,11,255,139,139,
+37,0,255,0,192,234,1,0,214,123,218,218,112,214,255,0,184,234,1,0,214,124,255,255,131,250,255,0,176,234,1,0,214,124,238,238,122,233,255,0,144,234,1,0,214,124,205,205,105,201,255,0,136,234,1,0,213,124,139,139,71,137,255,0,104,234,1,0,38,72,238,238,232,170,255,0,88,234,1,0,85,100,251,152,251,152,255,0,72,234,1,0,85,101,255,154,255,154,255,0,56,234,1,0,85,100,238,144,238,144,255,0,0,234,1,0,85,100,205,124,205,124,255,0,232,233,1,0,85,100,139,84,139,84,255,0,216,233,1,0,127,67,238,175,238,238,255,0,200,
+233,1,0,127,68,255,187,255,255,255,0,120,233,1,0,127,68,238,174,238,238,255,0,96,233,1,0,127,68,205,150,205,205,255,0,72,233,1,0,127,67,139,102,139,139,255,0,56,233,1,0,241,124,219,219,112,147,255,0,40,233,1,0,241,125,255,255,130,171,255,0,24,233,1,0,241,125,238,238,121,159,255,0,8,233,1,0,241,125,205,205,104,137,255,0,248,232,1,0,241,124,139,139,71,93,255,0,216,232,1,0,26,41,255,255,239,213,255,0,200,232,1,0,20,70,255,255,218,185,255,0,152,232,1,0,20,70,255,255,218,185,255,0,120,232,1,0,19,69,238,
+238,203,173,255,0,104,232,1,0,19,69,205,205,175,149,255,0,88,232,1,0,20,69,139,139,119,101,255,0,80,232,1,0,20,176,205,205,133,63,255,0,72,232,1,0,247,63,255,255,192,203,255,0,48,232,1,0,245,73,255,255,181,197,255,0,40,232,1,0,245,73,238,238,169,184,255,0,24,232,1,0,245,74,205,205,145,158,255,0,16,232,1,0,245,73,139,139,99,108,255,0,240,231,1,0,212,70,221,221,160,221,255,0,232,231,1,0,212,68,255,255,187,255,255,0,224,231,1,0,212,68,238,238,174,238,255,0,216,231,1,0,212,68,205,205,150,205,255,0,208,
+231,1,0,212,67,139,139,102,139,255,0,192,231,1,0,132,59,230,176,224,230,255,0,168,231,1,0,196,221,240,160,32,240,255,0,160,231,1,0,191,207,255,155,48,255,255,0,152,231,1,0,192,207,238,145,44,238,255,0,144,231,1,0,192,207,205,125,38,205,255,0,120,231,1,0,192,207,139,85,26,139,255,0,112,231,1,0,0,255,255,255,0,0,255,0,96,231,1,0,0,255,255,255,0,0,255,0,88,231,1,0,0,255,238,238,0,0,255,0,80,231,1,0,0,255,205,205,0,0,255,0,72,231,1,0,0,255,139,139,0,0,255,0,40,231,1,0,0,61,188,188,143,143,255,0,0,231,
+1,0,0,62,255,255,193,193,255,0,240,230,1,0,0,62,238,238,180,180,255,0,224,230,1,0,0,62,205,205,155,155,255,0,184,230,1,0,0,62,139,139,105,105,255,0,168,230,1,0,159,181,225,65,105,225,255,0,152,230,1,0,159,183,255,72,118,255,255,0,136,230,1,0,159,183,238,67,110,238,255,0,120,230,1,0,159,182,205,58,95,205,255,0,104,230,1,0,159,183,139,39,64,139,255,0,16,230,1,0,17,220,139,139,69,19,255,0,8,230,1,0,4,138,250,250,128,114,255,0,0,230,1,0,9,150,255,255,140,105,255,0,248,229,1,0,9,150,238,238,130,98,255,
+0,216,229,1,0,9,150,205,205,112,84,255,0,208,229,1,0,9,150,139,139,76,57,255,0,192,229,1,0,19,154,244,244,164,96,255,0,176,229,1,0,103,170,139,46,139,87,255,0,160,229,1,0,103,171,255,84,255,159,255,0,144,229,1,0,103,171,238,78,238,148,255,0,112,229,1,0,103,171,205,67,205,128,255,0,96,229,1,0,103,170,139,46,139,87,255,0,64,229,1,0,17,16,255,255,245,238,255,0,16,229,1,0,17,16,255,255,245,238,255,0,200,228,1,0,18,17,238,238,229,222,255,0,184,228,1,0,18,17,205,205,197,191,255,0,144,228,1,0,18,16,139,
+139,134,130,255,0,136,228,1,0,13,183,160,160,82,45,255,0,88,228,1,0,13,184,255,255,130,71,255,0,80,228,1,0,13,184,238,238,121,66,255,0,16,228,1,0,13,184,205,205,104,57,255,0,8,228,1,0,13,185,139,139,71,38,255,0,0,228,1,0,139,108,235,135,206,235,255,0,224,227,1,0,144,120,255,135,206,255,255,0,168,227,1,0,144,120,238,126,192,238,255,0,128,227,1,0,144,120,205,108,166,205,255,0,104,227,1,0,145,119,139,74,112,139,255,0,72,227,1,0,175,143,205,106,90,205,255,0,40,227,1,0,175,144,255,131,111,255,255,0,8,
+227,1,0,175,144,238,122,103,238,255,0,216,226,1,0,175,144,205,105,89,205,255,0,176,226,1,0,175,144,139,71,60,139,255,0,144,226,1,0,148,56,144,112,128,144,255,0,128,226,1,0,149,56,255,198,226,255,255,0,40,226,1,0,149,56,238,185,211,238,255,0,0,226,1,0,148,57,205,159,182,205,255,0,232,225,1,0,149,56,139,108,123,139,255,0,208,225,1,0,148,56,144,112,128,144,255,0,200,225,1,0,0,5,255,255,250,250,255,0,192,225,1,0,0,5,255,255,250,250,255,0,168,225,1,0,0,5,238,238,233,233,255,0,160,225,1,0,0,4,205,205,201,
+201,255,0,152,225,1,0,0,3,139,139,137,137,255,0,136,225,1,0,106,255,255,0,255,127,255,0,56,225,1,0,106,255,255,0,255,127,255,0,40,225,1,0,106,255,238,0,238,118,255,0,8,225,1,0,106,255,205,0,205,102,255,0,248,224,1,0,106,255,139,0,139,69,255,0,232,224,1,0,146,155,180,70,130,180,255,0,216,224,1,0,146,156,255,99,184,255,255,0,184,224,1,0,146,156,238,92,172,238,255,0,160,224,1,0,146,156,205,79,148,205,255,0,144,224,1,0,147,155,139,54,100,139,255,0,136,224,1,0,24,84,210,210,180,140,255,0,64,224,1,0,20,
+176,255,255,165,79,255,0,56,224,1,0,20,176,238,238,154,73,255,0,48,224,1,0,20,176,205,205,133,63,255,0,40,224,1,0,20,176,139,139,90,43,255,0,32,224,1,0,212,29,216,216,191,216,255,0,16,224,1,0,212,30,255,255,225,255,255,0,240,223,1,0,212,30,238,238,210,238,255,0,224,223,1,0,212,29,205,205,181,205,255,0,208,223,1,0,212,29,139,139,123,139,255,0,200,223,1,0,6,184,255,255,99,71,255,0,168,223,1,0,6,184,255,255,99,71,255,0,152,223,1,0,6,184,238,238,92,66,255,0,144,223,1,0,6,184,205,205,79,57,255,0,136,223,
+1,0,6,185,139,139,54,38,255,0,120,223,1,0,42,0,255,255,255,254,0,0,104,223,1,0,123,182,224,64,224,208,255,0,72,223,1,0,129,255,255,0,245,255,255,0,56,223,1,0,129,255,238,0,229,238,255,0,40,223,1,0,129,255,205,0,197,205,255,0,0,223,1,0,129,255,139,0,134,139,255,0,216,222,1,0,212,115,238,238,130,238,255,0,200,222,1,0,227,215,208,208,32,144,255,0,176,222,1,0,235,193,255,255,62,150,255,0,160,222,1,0,235,192,238,238,58,140,255,0,144,222,1,0,235,192,205,205,50,120,255,0,128,222,1,0,235,192,139,139,34,82,
+255,0,120,222,1,0,27,68,245,245,222,179,255,0,112,222,1,0,27,69,255,255,231,186,255,0,88,222,1,0,27,68,238,238,216,174,255,0,80,222,1,0,27,68,205,205,186,150,255,0,40,222,1,0,27,67,139,139,126,102,255,0,32,222,1,0,0,0,255,255,255,255,255,0,16,222,1,0,0,0,245,245,245,245,255,0,8,222,1,0,42,255,255,255,255,0,255,0,0,222,1,0,42,255,255,255,255,0,255,0,248,221,1,0,42,255,238,238,238,0,255,0,224,221,1,0,42,255,205,205,205,0,255,0,208,221,1,0,42,255,139,139,139,0,255,0,176,221,1,0,56,192,205,154,205,50,
+255,0,0,0,0,0,81,160,79,228,73,210,14,64,180,200,118,190,159,58,53,192,58,34,223,165,212,37,213,191,243,130,62,71,154,46,138,63,159,229,121,112,119,214,249,191,126,253,16,27,44,156,230,63,150,236,216,8,196,235,204,63,205,206,162,119,42,224,208,63,176,227,191,64,16,32,237,191,173,161,212,94,68,219,216,63,59,161,124,230,81,150,118,63,211,110,112,249,122,132,123,63,129,204,206,162,119,42,228,191,209,173,215,244,160,160,200,63,106,223,55,25,176,63,132,63,190,202,144,25,94,255,132,63,28,150,6,126,84,195,
+196,191,165,73,41,232,246,226,35,64,169,217,3,173,192,144,193,63,8,196,144,65,147,105,137,63,250,68,158,36,93,51,208,191,1,240,153,54,45,194,94,63,13,156,125,47,207,148,151,63,137,181,248,20,0,227,137,63,229,169,88,70,52,203,177,191,143,0,201,207,161,103,166,191,92,181,198,251,204,180,136,63,77,164,143,84,58,179,144,63,230,199,4,161,97,214,160,191,199,105,103,28,19,247,130,191,42,127,107,229,45,112,92,191,228,87,98,84,8,154,117,63,209,241,135,85,114,4,183,63,149,212,9,104,34,60,51,192,100,35,16,175,
+235,119,16,192,167,33,170,240,103,120,199,63,218,255,0,107,213,174,193,63,78,40,68,192,33,84,247,191,170,72,133,177,133,32,245,63,157,104,87,33,229,39,246,63,77,46,198,192,58,142,205,63,89,107,40,181,23,209,220,191,3,63,170,97,191,39,204,63,166,71,83,61,153,127,218,63,182,129,59,80,167,60,174,63,81,76,222,0,51,223,185,191,245,118,149,255,218,11,166,63,212,165,53,188,15,246,148,63,31,173,32,188,44,220,144,63,40,44,241,128,178,201,35,64,35,90,225,76,2,138,183,63,72,163,101,81,150,41,127,63,187,180,
+134,247,193,158,147,63,23,168,123,83,71,125,160,191,33,43,174,224,109,148,139,63,51,115,220,132,214,30,181,191,160,120,132,137,245,252,143,63,105,53,36,238,177,244,145,191,184,205,51,122,94,191,106,63,146,62,173,162,63,52,205,191,126,176,231,198,79,62,152,191,7,35,155,80,45,199,164,63,62,24,194,123,88,185,145,191,45,124,125,173,75,141,198,63,46,0,0,0,154,0,0,0,72,210,1,0,110,0,0,0,128,168,1,0,40,0,0,0,144,164,1,0,144,0,0,0,232,161,1,0,76,0,0,0,56,160,1,0,196,0,0,0,128,158,1,0,10,0,0,0,96,188,1,0,
+102,0,0,0,160,156,1,0,134,0,0,0,248,154,1,0,130,0,0,0,88,153,1,0,190,0,0,0,104,151,1,0,78,0,0,0,8,149,1,0,36,0,0,0,128,146,1,0,116,0,0,0,208,142,1,0,54,0,0,0,232,139,1,0,164,0,0,0,80,138,1,0,32,0,0,0,136,136,1,0,38,0,0,0,120,134,1,0,58,0,0,0,208,132,1,0,58,0,0,0,80,131,1,0,128,0,0,0,152,129,1,0,136,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,90,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,65,0,32,26,192,0,32,31,0,1,1,47,50,1,1,5,57,1,1,15,74,1,1,45,121,1,1,5,112,3,1,3,145,3,32,17,163,3,32,9,0,4,80,16,
+16,4,32,32,96,4,1,33,138,4,1,53,193,4,1,13,208,4,1,63,20,5,1,19,49,5,48,38,160,1,1,5,179,1,1,3,205,1,1,15,222,1,1,17,248,1,1,39,34,2,1,17,216,3,1,23,0,30,1,149,160,30,1,95,8,31,248,8,24,31,248,6,40,31,248,8,56,31,248,8,72,31,248,6,104,31,248,8,136,31,248,8,152,31,248,8,168,31,248,8,184,31,248,2,186,31,182,2,200,31,170,4,216,31,248,2,218,31,156,2,232,31,248,2,234,31,144,2,248,31,128,2,250,31,130,2,70,2,1,9,16,5,1,3,96,33,16,16,0,44,48,47,103,44,1,5,128,44,1,99,235,44,1,3,64,166,1,45,128,166,1,23,34,
+167,1,13,50,167,1,61,121,167,1,3,126,167,1,9,144,167,1,3,160,167,1,9,33,255,32,26,0,0,0,0,72,210,1,0,68,0,0,0,16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,0,0,0,0,0,116,0,0,0,18,0,0,0,34,0,0,0,66,0,0,0,104,0,0,0,52,0,0,0,94,0,0,0,62,0,0,0,94,0,0,0,10,0,0,0,154,0,0,0,50,0,0,0,48,0,0,0,20,0,0,0,2,0,0,0,36,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,18,2,14,11,15,28,24,24,24,
+24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,22,28,28,28,28,28,28,28,28,28,28,22,28,26,28,28,22,28,28,28,28,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,
+22,22,22,22,22,22,22,22,22,22,22,28,22,22,22,22,22,22,22,22],"i8",L,l.J+61457);D([1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,5,0,0,0,6,0,0,0,7,0,0,0,8,0,0,0,10,0,0,0,12,0,0,0,14,0,0,0,16,0,0,0,20,0,0,0,24,0,0,0,28,0,0,0,32,0,0,0,40,0,0,0,48,0,0,0,56,0,0,0,64,0,0,0,80,0,0,0,96,0,0,0,112,0,0,0,128,0,0,0,160,0,0,0,192,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,6,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,24,0,0,0,32,0,0,0,48,0,0,0,64,0,0,0,96,0,0,0,128,0,0,0,192,0,0,0,0,1,0,0,128,1,0,0,0,2,0,
+0,0,3,0,0,0,4,0,0,0,6,0,0,0,8,0,0,0,12,0,0,0,16,0,0,0,24,0,0,0,32,0,0,0,48,0,0,0,64,0,0,0,96,0,0,16,164,2,0,208,163,2,0,200,163,2,0,192,163,2,0,224,163,2,0,232,163,2,0,152,163,2,0,136,163,2,0,38,0,0,0,96,0,0,0,36,0,0,0,100,0,0,0,70,0,0,0,26,0,0,0,4,0,0,0,156,0,0,0,42,0,0,0,106,0,0,0,112,0,0,0,54,0,0,0,28,0,0,0,74,0,0,0,12,0,0,0,24,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,21,10,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,21,16,12,19,28,30,3,13,31,32,33,34,35,27,26,17,25,25,25,25,25,25,25,25,25,25,22,
+18,2,14,11,15,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,28,4,28,22,28,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,28,36,28,28,28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,
+63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,
+227,20,29,201,209,63,244,108,86,125,174,182,214,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,196,66,173,105,222,113,236,63,16,122,54,171,62,87,229,63,245,219,215,129,115,70,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,136,133,90,211,188,227,216,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,
+201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,1,77,132,13,79,175,226,63,181,21,251,203,238,201,225,63,204,93,75,200,7,61,240,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,210,111,95,7,206,25,231,63,210,111,
+95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,224,63,16,122,54,171,62,87,229,63,181,21,251,203,238,201,225,63,44,212,154,230,29,167,234,63,210,111,95,7,206,25,231,63,106,222,113,138,142,228,232,63,16,122,54,171,62,87,229,63,106,222,113,138,142,228,232,63,210,111,95,7,206,25,231,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,210,111,95,7,206,25,231,63,16,122,54,
+171,62,87,229,63,134,56,214,197,109,52,238,63,16,122,54,171,62,87,229,63,16,122,54,171,62,87,229,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,166,10,70,37,117,2,222,63,181,21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,181,
+21,251,203,238,201,225,63,72,191,125,29,56,103,204,63,72,191,125,29,56,103,204,63,0,0,0,0,0,0,224,63,72,191,125,29,56,103,204,63,44,212,154,230,29,167,234,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,224,63,210,111,95,7,206,25,231,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,2,154,8,27,158,
+94,213,63,224,190,14,156,51,162,208,63,2,154,8,27,158,94,213,63,1,77,132,13,79,175,226,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,
+227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,
+201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,62,232,217,172,250,92,197,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,29,56,103,68,105,111,200,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,224,63,0,0,0,0,0,0,224,63,211,188,227,20,29,201,
+209,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,181,21,251,203,238,201,225,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,231,29,167,232,72,46,225,63,162,180,55,248,194,100,214,63,72,191,125,29,56,103,204,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,181,21,251,203,238,201,225,63,0,0,0,0,0,0,240,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,
+88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,211,188,227,20,29,201,209,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,88,168,53,205,59,78,213,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,
+20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,0,0,0,0,0,0,240,63,211,188,227,20,29,201,209,63,234,149,178,12,113,172,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,
+211,188,227,20,29,201,209,63,181,21,251,203,238,201,225,63,106,222,113,138,142,228,232,63,0,0,0,0,0,0,240,63,152,221,147,135,133,90,215,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,196,66,173,105,222,113,236,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,72,191,125,29,
+56,103,204,63,120,11,36,40,126,140,227,63,134,56,214,197,109,52,238,63,120,11,36,40,126,140,227,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,211,188,227,20,29,201,209,63,1,0,0,0,64,95,0,0,0,0,0,0,0,0,0,0,1,0,0,0,8,96,0,0,0,0,0,0,0,0,0,0,3,0,0,0,128,98,0,0,3,0,0,0,88,98,0,0,3,0,0,0,200,97,0,0,3,0,0,0,80,97,0,0,3,0,0,0,16,97,0,0,3,0,0,0,232,96,0,0,3,0,0,0,168,96,0,0,3,0,0,0,160,97,0,0,3,0,0,0,224,186,2,0,0,0,0,0,248,90,0,0,0,0,0,0,208,90,0,0,0,0,0,0,168,
+90,0,0,0,0,0,0,88,90,0,0,0,0,0,0,48,90,0,0,0,0,0,0,8,90,0,0,0,0,0,0,224,89,0,0,0,0,0,0,128,90,0,0,0,0,0,0,160,186,2,0,4,0,0,0,88,91,0,0,0,0,0,0,0,0,0,0,8,153,1,0,40,151,1,0,184,148,1,0,16,146,1,0,96,142,1,0,0,0,0,0,0,0,0,0,128,65,3,0,0,0,0,0,80,2,2,0,1,0,0,0,184,249,1,0,7,0,0,0,16,237,1,0,3,0,0,0,64,227,1,0,5,0,0,0,216,219,1,0,15,0,0,0,168,216,1,0,8,0,0,0,168,216,1,0,16,0,0,0,128,213,1,0,4,0,0,0,128,213,1,0,17,0,0,0,80,210,1,0,5,0,0,0,80,210,1,0,2,0,0,0,168,207,1,0,6,0,0,0,16,204,1,0,4,0,0,0,120,
+200,1,0,7,0,0,0,224,196,1,0,7,0,0,0,192,191,1,0,5,0,0,0,104,188,1,0,8,0,0,0,80,186,1,0,8,0,0,0,104,188,1,0,9,0,0,0,32,184,1,0,7,0,0,0,56,182,1,0,10,0,0,0,248,179,1,0,7,0,0,0,104,177,1,0,11,0,0,0,120,174,1,0,6,0,0,0,184,171,1,0,12,0,0,0,136,168,1,0,9,0,0,0,184,171,1,0,13,0,0,0,152,164,1,0,8,0,0,0,240,161,1,0,14,0,0,0,72,160,1,0,8,0,0,0,144,158,1,0,18,0,0,0,168,156,1,0,5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,110,114,0,0,0,0,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,
+47,50,48,48,48,47,120,109,108,110,115,47,0,0,0,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,88,77,76,47,49,57,57,56,47,110,97,109,101,115,112,97,99,101,0,0,0,0,0,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,23,17,2,2,2,2,2,2,2,2,2,2,2,2,2,18,16,2,19,2,2,22,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,20,2,21,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,14,2,15,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,1,2,3,4,5,6,7,8,9,10,11,12,13,0,0,0,34,12,13,14,35,15,9,16,17,10,16,17,201,16,17,45,69,70,252,1,6,246,15,7,246,36,2,16,17,47,48,54,77,78,40,38,59,60,42,54,49,57,61,63,47,58,64,216,68,48,62,37,55,67,53,75,43,56,73,76,0,0,0,0,0,2,2,1,0,3,3,1,0,1,0,1,1,1,0,2,1,1,0,2,2,3,1,1,0,0,5,0,1,3,1,3,5,3,1,1,1,1,2,
+0,1,0,4,2,0,2,1,1,3,2,1,0,3,2,1,0,1,1,0,1,1,1,3,0,0,24,25,25,25,26,27,28,28,29,29,30,30,31,31,32,32,33,33,34,34,35,36,36,38,39,37,37,40,40,41,41,41,42,42,43,43,43,44,44,45,45,46,47,47,48,49,49,50,51,52,54,53,55,55,55,56,56,56,57,57,58,58,0,238,238,255,238,238,238,238,238,238,31,32,238,0,239,238,238,238,12,238,238,238,8,13,238,238,238,248,238,238,238,238,238,238,245,238,0,0,0,0,0,18,238,238,20,9,3,238,254,238,238,238,1,238,238,238,1,238,238,10,254,238,19,25,21,238,19,1,238,238,238,238,11,17,238,238,
+238,238,238,238,238,238,238,1,238,238,22,9,1,1,29,15,23,238,238,26,23,27,238,238,28,238,238,238,238,1,25,251,238,238,238,1,238,16,238,238,30,238,238,238,238,255,3,8,4,33,5,11,18,19,39,20,21,22,41,50,65,23,24,25,26,44,51,52,66,71,72,27,74,28,29,46,30,79,31,32,0,0,0,0,0,0,3,9,0,0,0,1,14,2,11,12,8,35,36,37,54,59,61,0,13,16,18,27,22,28,18,39,50,34,23,51,30,60,6,7,53,5,15,17,20,24,41,0,19,41,0,0,0,0,0,55,21,40,29,30,0,33,38,52,31,48,62,25,44,0,27,0,32,26,42,0,43,58,46,47,0,49,56,57,45,11,3,4,5,15,7,3,
+12,13,6,12,13,14,12,13,26,21,22,0,1,0,3,7,14,6,15,8,12,13,18,19,42,16,17,9,16,47,48,17,50,23,19,13,20,18,46,18,20,65,19,50,19,44,64,42,66,25,44,66,70,0,0,0,0,0,0,10,0,11,0,12,0,13,0,14,0,10,0,15,0,16,0,17,0,18,0,19,0,10,0,20,0,21,0,21,0,21,0,22,0,23,0,21,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,10,0,21,0,21,0,21,0,22,0,23,0,24,0,21,0,21,0,25,0,21,0,21,0,21,0,26,0,21,0,21,0,12,0,12,0,35,0,29,0,29,0,31,0,32,0,31,0,32,0,35,0,36,0,37,0,44,0,49,0,46,0,45,0,41,0,36,0,37,0,39,0,40,0,50,0,41,0,
+51,0,42,0,52,0,53,0,54,0,58,0,49,0,48,0,59,0,33,0,66,0,33,0,61,0,62,0,67,0,50,0,51,0,68,0,52,0,53,0,54,0,46,0,88,0,41,0,43,0,88,0,66,0,65,0,69,0,71,0,67,0,70,0,88,0,58,0,68,0,88,0,59,0,88,0,72,0,65,0,73,0,43,0,74,0,75,0,78,0,69,0,71,0,70,0,76,0,77,0,79,0,80,0,43,0,81,0,72,0,82,0,83,0,73,0,74,0,84,0,75,0,78,0,85,0,86,0,76,0,77,0,79,0,87,0,80,0,81,0,88,0,82,0,83,0,27,0,88,0,88,0,84,0,88,0,85,0,86,0,88,0,88,0,88,0,87,0,28,0,28,0,28,0,28,0,28,0,28,0,28,0,30,0,30,0,30,0,30,0,30,0,30,0,30,0,34,0,34,0,34,
+0,34,0,34,0,34,0,34,0,38,0,88,0,38,0,38,0,38,0,38,0,38,0,47,0,47,0,55,0,88,0,55,0,55,0,55,0,55,0,55,0,56,0,88,0,56,0,88,0,56,0,56,0,56,0,57,0,88,0,57,0,57,0,57,0,57,0,57,0,60,0,60,0,88,0,60,0,60,0,60,0,60,0,63,0,88,0,63,0,63,0,63,0,63,0,64,0,88,0,64,0,64,0,64,0,64,0,64,0,9,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,
+0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,4,0,0,0,1,0,0,0,5,0,0,0,1,0,0,0,6,0,0,0,7,0,0,0,7,0,0,0,1,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,3,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,1,0,0,0,1,0,0,0,2,0,0,
+0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,2,0,0,0,1,0,0,0,4,0,0,0,5,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,6,0,0,0,1,0,0,0,1,0,0,0,7,0,0,0,8,0,0,0,9,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,10,0,0,0,1,0,0,0,1,0,0,0,11,0,0,0,1,0,0,0,12,0,0,0,1,0,0,0,13,0,0,0,14,0,0,0,15,0,0,0,16,0,0,0,17,0,0,0,18,0,0,0,19,0,0,0,20,0,0,0,21,0,0,0,22,0,0,
+0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,23,0,0,0,24,0,0,0,25,0,0,0,19,0,0,0,26,0,0,0,27,0,0,0,28,0,0,0,29,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,30,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,1,0,0,0,31,0,0,0,32,0,0,0,33,0,0,0,34,0,0,0,35,0,0,0,19,0,0,0,36,0,0,0,37,0,0,0,38,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,39,0,0,0,40,0,0,0,41,0,0,0,19,0,0,0,42,0,0,0,43,0,0,0,44,0,0,0,45,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,19,0,0,0,19,0,0,0,19,0,
+0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,
+0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,
+19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,19,0,0,0,0,0,0,0,0,0,0,0,0,0,88,0,1,0,89,0,89,0,90,0,90,0,91,0,91,0,88,0,88,0,88,0,88,0,88,0,92,0,88,0,88,0,88,0,93,0,88,0,88,0,94,0,94,0,94,0,94,0,94,0,94,0,95,0,96,0,97,0,98,0,98,0,88,0,88,0,99,0,88,0,88,0,88,0,92,0,88,0,88,0,93,0,88,0,93,0,88,0,100,0,93,0,88,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,95,0,96,0,97,0,97,0,88,0,98,0,88,0,88,0,99,0,100,0,93,0,94,0,94,0,94,0,94,0,94,0,94,0,
+94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,94,0,0,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,3,0,4,0,7,0,3,0,4,0,5,0,5,0,6,0,6,0,8,0,7,0,7,0,17,0,22,0,18,0,17,0,18,0,8,0,8,0,15,0,15,0,23,0,15,0,24,0,15,0,25,0,26,0,26,0,29,0,22,0,94,0,29,0,5,0,49,0,6,0,33,
+0,33,0,50,0,23,0,24,0,51,0,25,0,26,0,26,0,41,0,43,0,41,0,43,0,46,0,49,0,46,0,52,0,54,0,50,0,53,0,57,0,58,0,51,0,57,0,58,0,65,0,66,0,65,0,67,0,40,0,68,0,69,0,72,0,52,0,54,0,53,0,70,0,71,0,74,0,76,0,16,0,77,0,66,0,78,0,80,0,67,0,68,0,81,0,69,0,72,0,82,0,84,0,70,0,71,0,74,0,86,0,76,0,77,0,9,0,78,0,80,0,2,0,0,0,0,0,81,0,0,0,82,0,84,0,0,0,0,0,0,0,86,0,89,0,89,0,89,0,89,0,89,0,89,0,89,0,90,0,90,0,90,0,90,0,90,0,90,0,90,0,91,0,91,0,91,0,91,0,91,0,91,0,91,0,92,0,0,0,92,0,92,0,92,0,92,0,92,0,93,0,93,0,95,
+0,0,0,95,0,95,0,95,0,95,0,95,0,96,0,0,0,96,0,0,0,96,0,96,0,96,0,97,0,0,0,97,0,97,0,97,0,97,0,97,0,98,0,98,0,0,0,98,0,98,0,98,0,98,0,99,0,0,0,99,0,99,0,99,0,99,0,100,0,0,0,100,0,100,0,100,0,100,0,100,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,88,0,0,0,0,0,0,0,0,0,137,0,43,0,44,0,48,0,50,0,45,0,52,0,139,0,224,0,224,0,
+224,0,224,0,0,0,58,0,111,0,52,0,52,0,224,0,224,0,0,0,37,0,50,0,43,0,47,0,44,0,0,0,0,0,68,0,0,0,0,0,224,0,78,0,0,0,224,0,224,0,224,0,0,0,224,0,100,0,82,0,224,0,83,0,224,0,0,0,86,0,224,0,0,0,59,0,63,0,72,0,80,0,74,0,83,0,0,0,0,0,95,0,96,0,224,0,0,0,224,0,224,0,0,0,0,0,98,0,81,0,91,0,86,0,94,0,95,0,98,0,99,0,0,0,98,0,0,0,104,0,96,0,99,0,0,0,97,0,114,0,110,0,0,0,107,0,0,0,115,0,0,0,224,0,152,0,159,0,166,0,173,0,176,0,70,0,182,0,189,0,196,0,203,0,210,0,216,0,0,0,0,0,0,0,0,0,0,0,0,0,4,0,4,0,25,0,25,0,30,
+0,30,0,33,0,31,0,10,0,2,0,21,0,9,0,31,0,31,0,31,0,20,0,26,0,1,0,19,0,19,0,19,0,19,0,19,0,19,0,8,0,4,0,5,0,25,0,2,0,22,0,25,0,30,0,29,0,28,0,27,0,9,0,18,0,0,0,20,0,17,0,20,0,3,0,7,0,20,0,20,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,8,0,4,0,5,0,5,0,6,0,25,0,24,0,23,0,30,0,7,0,20,0,19,0,19,0,19,0,19,0,19,0,19,0,19,0,12,0,19,0,11,0,19,0,19,0,19,0,13,0,19,0,19,0,19,0,15,0,19,0,14,0,19,0,16,0,0,0,0,0,0,0,0,0,112,111,108,121,32,37,115,0,47,114,100,98,117,52,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,52,47,49,0,
+0,0,0,0,0,0,0,47,114,100,98,117,51,47,51,0,0,0,0,0,0,0,0,47,114,100,98,117,51,47,50,0,0,0,0,0,0,0,0,60,33,45,45,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,0,0,0,0,47,114,100,98,117,51,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,57,0,0,0,0,0,0,0,47,115,101,116,95,115,99,97,108,101,32,123,0,0,0,0,90,101,116,97,0,0,0,0,109,97,114,103,105,110,0,0,109,105,100,110,105,103,104,116,98,108,117,101,0,0,0,0,47,114,100,98,117,49,49,47,56,0,0,0,0,0,0,0,100,101,99,111,114,97,116,101,0,0,0,0,0,0,0,
+0,116,97,114,103,101,116,0,0,47,114,100,98,117,49,49,47,55,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,54,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,53,0,0,0,0,0,0,0,47,98,114,98,103,51,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,52,0,0,0,0,0,0,0,106,112,103,58,102,105,103,0,47,114,100,98,117,49,49,47,51,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,50,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,49,49,0,0,0,0,0,0,60,47,84,73,84,76,69,62,0,0,0,0,0,0,0,0,47,114,100,98,117,49,49,47,49,48,0,0,0,0,0,0,47,114,
+100,98,117,49,49,47,49,0,0,0,0,0,0,0,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,49,46,48,32,100,101,102,0,89,117,109,108,0,0,0,0,92,78,0,0,0,0,0,0,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,47,114,100,98,117,49,48,47,57,0,0,0,0,0,0,0,109,105,110,108,101,110,0,0,104,101,97,100,85,82,76,0,47,114,100,98,117,49,48,47,56,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,55,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,54,0,0,0,0,0,0,0,47,98,114,98,103,51,47,49,0,0,0,0,0,0,0,0,47,114,100,
+98,117,49,48,47,53,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,52,0,0,0,0,0,0,0,118,101,101,0,0,0,0,0,47,114,100,98,117,49,48,47,51,0,0,0,0,0,0,0,47,114,100,98,117,49,48,47,50,0,0,0,0,0,0,0,60,84,73,84,76,69,62,0,47,114,100,98,117,49,48,47,49,48,0,0,0,0,0,0,47,114,100,98,117,49,48,47,49,0,0,0,0,0,0,0,47,99,111,111,114,100,102,111,110,116,32,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,102,105,110,100,102,111,110,116,32,56,32,115,99,97,108,101,102,111,110,116,32,100,101,102,0,0,
+0,89,97,99,117,116,101,0,0,98,97,100,32,108,97,98,101,108,32,102,111,114,109,97,116,32,37,115,10,0,0,0,0,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,47,112,117,114,112,108,101,115,57,47,57,0,0,0,0,0,108,97,98,101,108,97,110,103,108,101,0,0,0,0,0,0,46,46,46,32,37,115,32,46,46,46,10,0,0,0,0,0,114,101,109,105,110,99,114,111,115,115,0,0,0,0,0,0,104,101,97,100,104,114,101,102,0,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,56,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,55,0,0,
+0,0,0,47,112,117,114,112,108,101,115,57,47,54,0,0,0,0,0,47,98,114,98,103,49,49,47,57,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,53,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,51,0,0,0,0,0,47,112,117,114,112,108,101,115,57,47,50,0,0,0,0,0,60,77,69,84,65,32,104,116,116,112,45,101,113,117,105,118,61,34,67,111,110,116,101,110,116,45,84,121,112,101,34,32,99,111,110,116,101,110,116,61,34,116,101,120,116,47,104,116,109,108,59,32,99,104,97,114,
+115,101,116,61,85,84,70,45,56,34,62,10,0,0,0,0,47,112,117,114,112,108,101,115,57,47,49,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,56,0,0,0,0,0,47,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,0,0,88,105,0,0,0,0,0,0,102,105,108,108,101,100,0,0,102,105,108,108,32,0,0,0,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,0,0,97,103,114,101,99,111,114,100,95,99,97,108,108,98,97,99,107,
+32,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,55,0,0,0,0,0,108,97,98,101,108,100,105,115,116,97,110,99,101,0,0,0,67,69,76,76,83,66,79,82,68,69,82,0,0,0,0,0,116,97,105,108,85,82,76,0,47,112,117,114,112,108,101,115,56,47,54,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,53,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,52,0,0,0,0,0,47,98,114,98,103,49,49,47,56,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,56,47,51,0,0,0,0,0,47,112,117,114,112,
+108,101,115,56,47,50,0,0,0,0,0,121,101,108,108,111,119,0,0,47,112,117,114,112,108,101,115,56,47,49,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,55,0,0,0,0,0,60,72,69,65,68,62,0,0,47,112,117,114,112,108,101,115,55,47,54,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,53,0,0,0,0,0,47,99,111,111,114,100,45,102,111,110,116,45,102,97,109,105,108,121,32,47,84,105,109,101,115,45,82,111,109,97,110,32,100,101,102,0,0,0,0,0,85,117,109,108,0,0,0,0,105,110,118,105,115,0,0,0,109,101,100,105,117,109,115,108,97,
+116,101,98,108,117,101,0,47,112,117,114,112,108,101,115,55,47,52,0,0,0,0,0,108,97,98,101,108,102,111,110,116,99,111,108,111,114,0,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,67,79,76,85,77,78,83,32,45,32,105,103,110,111,114,101,100,10,0,116,97,105,108,104,114,101,102,0,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,51,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,50,0,0,0,0,0,33,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,
+91,48,93,46,116,97,107,101,110,91,105,93,0,0,0,0,0,0,47,112,117,114,112,108,101,115,55,47,49,0,0,0,0,0,47,98,114,98,103,49,49,47,55,0,0,0,0,0,0,0,123,37,115,125,0,0,0,0,47,112,117,114,112,108,101,115,54,47,54,0,0,0,0,0,118,109,108,58,118,109,108,0,112,108,117,115,0,0,0,0,47,112,117,114,112,108,101,115,54,47,53,0,0,0,0,0,47,112,117,114,112,108,101,115,54,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,54,47,51,0,0,0,0,0,60,47,66,79,68,89,62,10,60,47,72,84,77,76,62,10,0,0,0,0,0,0,0,0,47,112,117,114,
+112,108,101,115,54,47,50,0,0,0,0,0,101,100,103,101,0,0,0,0,47,112,117,114,112,108,101,115,54,47,49,0,0,0,0,0,37,37,66,101,103,105,110,82,101,115,111,117,114,99,101,58,32,112,114,111,99,115,101,116,32,103,114,97,112,104,118,105,122,32,48,32,48,0,0,0,85,112,115,105,108,111,110,0,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,32,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,53,0,0,0,0,0,109,101,100,
+105,117,109,115,101,97,103,114,101,101,110,0,0,108,97,98,101,108,102,111,110,116,110,97,109,101,0,0,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,82,79,87,83,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,78,68,95,111,117,116,40,118,41,46,115,105,122,101,32,61,61,32,50,0,0,0,0,0,108,97,98,101,108,85,82,76,0,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,51,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,50,0,0,
+0,0,0,47,98,114,98,103,49,49,47,54,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,53,47,49,0,0,0,0,0,91,94,91,58,115,112,97,99,101,58,93,93,0,0,0,0,110,101,97,116,111,95,108,97,121,111,117,116,0,0,0,0,47,112,117,114,112,108,101,115,52,47,52,0,0,0,0,0,47,112,117,114,112,108,101,115,52,47,51,0,0,0,0,0,37,100,0,0,0,0,0,0,47,112,117,114,112,108,101,115,52,47,50,0,0,0,0,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,78,79,78,45,73,69,32,104,116,109,108,32,99,111,110,116,
+101,110,116,32,104,101,114,101,32,45,45,62,10,0,0,0,0,0,120,100,111,116,58,120,100,111,116,0,0,0,0,0,0,0,100,101,102,108,97,116,105,111,110,32,102,105,110,105,115,104,32,112,114,111,98,108,101,109,32,37,100,32,99,110,116,61,37,100,10,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,115,0,0,0,0,0,0,47,112,117,114,112,108,101,115,52,47,49,0,0,0,0,0,47,112,117,114,112,108,101,115,51,47,51,0,0,0,0,0,116,114,117,101,0,0,0,0,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,85,103,
+114,97,118,101,0,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,32,117,110,114,101,99,111,103,110,105,122,101,100,10,0,0,91,105,110,116,101,114,110,97,108,32,97,114,105,97,108,93,0,0,0,0,0,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,0,0,0,0,47,112,117,114,112,108,101,115,51,47,50,0,0,0,0,0,108,97,98,101,108,102,111,110,116,115,105,122,101,0,0,0,114,111,119,115,0,0,0,0,108,97,98,101,108,104,114,101,102,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,47,112,117,114,112,108,101,115,51,47,49,0,
+0,0,0,0,119,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,48,32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,0,0,0,47,112,117,114,100,57,47,57,0,0,0,0,0,0,0,0,84,82,65,73,76,69,82,0,47,97,99,99,101,110,116,53,47,49,0,0,0,0,0,0,101,100,103,101,0,0,0,0,116,114,111,117,98,108,101,32,105,110,32,105,110,105,116,95,114,97,110,107,10,0,0,0,10,102,105,110,97,108,32,101,32,61,32,37,
+102,0,0,0,38,103,116,59,0,0,0,0,47,112,117,114,100,57,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,53,0,0,0,0,0,0,0,37,115,58,37,115,0,0,0,110,111,100,101,0,0,0,0,47,112,117,114,100,57,47,55,0,0,0,0,0,0,0,0,83,101,116,116,105,110,103,32,117,112,32,115,116,114,101,115,115,32,102,117,110,99,116,105,111,110,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,100,101,108,120,32,62,61,32,48,0,0,0,0,0,0,0,47,112,117,114,100,57,47,54,0,0,0,0,0,0,0,0,84,68,0,0,0,0,0,0,47,112,117,114,100,
+57,47,53,0,0,0,0,0,0,0,0,101,115,101,112,0,0,0,0,47,112,117,114,100,57,47,52,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,0,0,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,105,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,0,0,0,110,111,100,101,0,0,0,0,47,112,117,114,100,57,47,51,0,0,0,0,0,0,
+0,0,47,112,117,114,100,57,47,50,0,0,0,0,0,0,0,0,99,108,101,97,114,116,111,109,97,114,107,0,0,0,0,0,111,114,116,104,111,103,111,110,97,108,32,108,105,110,101,115,0,0,0,0,0,0,0,0,85,99,105,114,99,0,0,0,110,111,100,101,32,37,115,44,32,112,111,114,116,32,37,115,44,32,117,110,114,101,99,111,103,110,105,122,101,100,32,99,111,109,112,97,115,115,32,112,111,105,110,116,32,39,37,115,39,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,0,0,0,0,47,112,117,114,100,
+57,47,49,0,0,0,0,0,0,0,0,116,97,105,108,108,97,98,101,108,0,0,0,0,0,0,0,99,111,108,117,109,110,115,0,101,100,103,101,85,82,76,0,98,105,115,113,117,101,0,0,47,112,117,114],"i8",L,l.J+71716);D([100,56,47,56,0,0,0,0,0,0,0,0,47,112,117,114,100,56,47,55,0,0,0,0,0,0,0,0,47,112,117,114,100,56,47,54,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,52,0,0,0,0,0,0,0,47,112,117,114,100,56,47,53,0,0,0,0,0,0,0,0,44,10,0,0,0,0,0,0,110,111,100,101,32,37,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,115,32,110,
+111,32,112,111,115,105,116,105,111,110,10,0,0,0,0,47,112,117,114,100,56,47,52,0,0,0,0,0,0,0,0,37,115,32,115,97,118,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,110,114,32,46,83,32,92,110,40,46,115,10,46,110,114,32,68,70,32,92,110,40,46,102,10,0,0,47,112,117,114,100,56,47,51,0,0,0,0,0,0,0,0,127,98,111,116,0,0,0,0,47,112,117,114,100,56,47,50,0,0,0,0,0,0,0,0,60,72,50,62,83,111,114,114,121,44,32,116,104,105,115,32,100,105,97,103,114,97,109,32,119,105,108,108,32,
+111,110,108,121,32,100,105,115,112,108,97,121,32,99,111,114,114,101,99,116,108,121,32,111,110,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,32,53,32,40,97,110,100,32,117,112,41,32,98,114,111,119,115,101,114,115,46,60,47,72,50,62,10,0,0,0,0,0,47,112,117,114,100,56,47,49,0,0,0,0,0,0,0,0,104,112,0,0,0,0,0,0,37,108,102,37,50,115,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,0,0,0,47,112,117,114,100,55,47,55,0,0,0,0,0,0,0,0,47,67,111,117,114,105,101,114,45,66,111,108,100,
+79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,85,97,99,117,116,101,0,0,102,108,101,120,32,115,99,97,110,110,101,114,32,112,117,115,104,45,98,97,99,107,32,111,118,101,114,102,108,111,119,0,95,0,0,0,0,0,0,0,109,101,100,105,117,109,98,108,117,101,0,0,0,0,0,0,47,112,117,114,100,55,47,54,0,0,0,0,0,0,0,0,104,101,97,100,108,97,98,101,108,0,0,0,0,0,0,0,99,101,108,108,98,111,114,100,101,114,0,0,0,0,0,0,101,100,103,101,104,114,101,102,0,0,0,0,0,0,0,0,47,112,117,114,
+100,55,47,53,0,0,0,0,0,0,0,0,117,110,102,105,108,108,101,100,0,0,0,0,0,0,0,0,47,112,117,114,100,55,47,52,0,0,0,0,0,0,0,0,111,117,116,0,0,0,0,0,47,112,117,114,100,55,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,51,0,0,0,0,0,0,0,47,112,117,114,100,55,47,50,0,0,0,0,0,0,0,0,47,112,117,114,100,55,47,49,0,0,0,0,0,0,0,0,37,115,32,84,105,116,108,101,58,32,37,115,10,0,0,0,47,112,117,114,100,54,47,54,0,0,0,0,0,0,0,0,47,112,117,114,100,54,47,53,0,0,0,0,0,0,0,0,60,33,45,45,32,116,104,105,115,32,115,104,111,
+117,108,100,32,111,110,108,121,32,100,105,115,112,108,97,121,32,111,110,32,78,79,78,45,73,69,32,98,114,111,119,115,101,114,115,32,45,45,62,10,0,0,0,47,112,117,114,100,54,47,52,0,0,0,0,0,0,0,0,47,112,117,114,100,54,47,51,0,0,0,0,0,0,0,0,47,67,111,117,114,105,101,114,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,84,104,101,116,97,0,0,0,119,101,100,103,101,100,0,0,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,0,0,47,112,117,114,100,54,47,50,
+0,0,0,0,0,0,0,0,97,114,114,111,119,116,97,105,108,0,0,0,0,0,0,0,60,84,65,66,76,69,62,0,85,82,76,0,0,0,0,0,47,112,117,114,100,54,47,49,0,0,0,0,0,0,0,0,47,112,117,114,100,53,47,53,0,0,0,0,0,0,0,0,47,112,117,114,100,53,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,50,0,0,0,0,0,0,0,100,117,112,108,105,99,97,116,101,32,97,116,116,114,105,98,117,116,101,0,0,0,0,0,47,112,117,114,100,53,47,51,0,0,0,0,0,0,0,0,99,105,114,99,108,101,32,37,115,32,37,100,44,37,100,44,37,100,10,0,0,0,0,0,47,112,117,114,100,53,
+47,50,0,0,0,0,0,0,0,0,37,115,32,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,47,112,117,114,100,53,47,49,0,0,0,0,0,0,0,0,47,112,117,114,100,52,47,52,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,110,111,116,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,34,62,10,0,0,0,0,0,0,0,0,47,112,117,114,100,52,47,51,0,0,0,0,0,0,0,0,47,112,117,114,100,52,47,50,0,0,0,0,0,0,0,0,47,67,111,
+117,114,105,101,114,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,84,97,117,0,0,0,0,0,115,116,114,105,112,101,100,0,109,97,114,111,111,110,0,0,47,112,117,114,100,52,47,49,0,0,0,0,0,0,0,0,97,114,114,111,119,104,101,97,100,0,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,104,114,101,102,0,0,0,0,47,112,117,114,100,51,47,51,0,0,0,0,0,0,0,
+0,47,112,117,114,100,51,47,50,0,0,0,0,0,0,0,0,47,112,117,114,100,51,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,49,49,0,0,0,0,0,0,47,112,117,111,114,57,47,57,0,0,0,0,0,0,0,0,106,112,101,58,102,105,103,0,47,112,117,111,114,57,47,56,0,0,0,0,0,0,0,0,37,115,32,114,101,115,116,111,114,101,32,112,111,105,110,116,32,115,105,122,101,32,97,110,100,32,102,111,110,116,10,46,112,115,32,92,110,40,46,83,10,46,102,116,32,92,110,40,68,70,10,0,0,0,0,0,47,112,117,111,114,57,47,55,0,0,0,0,0,0,0,0,47,112,117,111,
+114,57,47,54,0,0,0,0,0,0,0,0,60,33,45,45,32,105,110,115,101,114,116,32,97,110,121,32,111,116,104,101,114,32,104,116,109,108,32,99,111,110,116,101,110,116,32,104,101,114,101,32,45,45,62,10,0,0,0,0,47,112,117,111,114,57,47,53,0,0,0,0,0,0,0,0,47,112,117,111,114,57,47,52,0,0,0,0,0,0,0,0,47,67,111,117,114,105,101,114,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,84,72,79,82,78,0,0,0,114,97,100,105,97,108,0,0,109,97,103,101,110,116,97,0,47,112,117,111,114,57,47,51,0,0,0,0,0,0,0,0,100,105,114,
+0,0,0,0,0,69,88,84,0,0,0,0,0,32,45,45,32,0,0,0,0,47,112,117,111,114,57,47,50,0,0,0,0,0,0,0,0,105,110,99,111,109,112,97,116,105,98,108,101,32,118,101,114,115,105,111,110,0,0,0,0,47,112,117,111,114,57,47,49,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,49,48,0,0,0,0,0,0,112,110,103,58,115,118,103,0,47,112,117,111,114,56,47,55,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,54,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,53,0,0,0,0,0,0,0,0,37,115,37,115,32,117,110,115,117,
+112,112,111,114,116,101,100,10,0,0,0,0,0,0,0,105,110,118,0,0,0,0,0,47,112,117,111,114,56,47,52,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,86,77,76,50,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,34,62,10,0,0,47,112,117,111,114,56,47,51,0,0,0,0,0,0,0,0,47,112,117,111,114,56,47,50,0,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,
+101,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,83,105,103,109,97,0,0,0,105,110,118,105,115,0,0,0,108,105,110,101,110,0,0,0,47,112,117,111,114,56,47,49,0,0,0,0,0,0,0,0,108,97,98,101,108,102,108,111,97,116,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,66,65,76,73,71,78,32,105,110,32,84,68,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,32,45,62,32,0,0,0,0,47,112,117,111,114,55,47,55,0,0,0,0,0,0,0,0,47,112,117,111,114,55,47,54,0,0,0,0,0,0,0,
+0,47,112,117,111,114,55,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,49,49,47,49,0,0,0,0,0,0,0,47,112,117,111,114,55,47,52,0,0,0,0,0,0,0,0,47,112,117,111,114,55,47,51,0,0,0,0,0,0,0,0,100,101,102,105,110,101,32,97,116,116,114,115,48,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,117,110,102,105,108,108,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,114,111,117,110,100,101,100,32,37,37,32,37,37,59,32,100,101,102,105,110,101,32,100,105,97,103,111,110,97,108,115,32,37,37,32,37,37,10,0,0,0,0,
+0,0,0,47,112,117,111,114,55,47,50,0,0,0,0,0,0,0,0,47,112,117,111,114,55,47,49,0,0,0,0,0,0,0,0,60,47,68,73,86,62,10,0,47,112,117,111,114,54,47,54,0,0,0,0,0,0,0,0,47,112,117,111,114,54,47,53,0,0,0,0,0,0,0,0,109,97,112,0,0,0,0,0,83,99,97,114,111,110,0,0,100,105,97,103,111,110,97,108,115,0,0,0,0,0,0,0,101,108,108,105,112,115,101,32,97,116,116,114,115,37,100,32,37,115,119,105,100,32,37,46,53,102,32,104,116,32,37,46,53,102,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,0,0,0,0,108,105,109,101,
+103,114,101,101,110,0,0,0,0,0,0,0,47,112,117,111,114,54,47,52,0,0,0,0,0,0,0,0,119,101,105,103,104,116,0,0,66,79,82,68,69,82,0,0,105,110,32,101,100,103,101,32,37,115,37,115,37,115,10,0,111,117,116,32,111,102,32,109,101,109,111,114,121,10,0,0,47,112,117,111,114,54,47,51,0,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,47,112,117,111,114,54,47,50,0,0,0,0,0,0,0,0,47,112,117,111,114,54,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,
+49,48,47,57,0,0,0,0,0,0,0,118,103,0,0,0,0,0,0,47,112,117,111,114,53,47,53,0,0,0,0,0,0,0,0,47,112,117,111,114,53,47,52,0,0,0,0,0,0,0,0,68,111,116,58,32,91,10,0,47,112,117,111,114,53,47,51,0,0,0,0,0,0,0,0,119,104,105,116,101,0,0,0,47,112,117,111,114,53,47,50,0,0,0,0,0,0,0,0,60,47,118,58,103,114,111,117,112,62,10,0,0,0,0,0,47,112,117,111,114,53,47,49,0,0,0,0,0,0,0,0,47,112,117,111,114,52,47,52,0,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,32,115,116,97,114,110,101,
+116,73,83,79,32,100,101,102,0,0,0,0,0,0,0,82,104,111,0,0,0,0,0,114,111,117,110,100,101,100,0,108,105,109,101,0,0,0,0,47,112,117,111,114,52,47,51,0,0,0,0,0,0,0,0,122,0,0,0,0,0,0,0,67,69,76,76,80,65,68,68,73,78,71,0,0,0,0,0,110,111,110,101,0,0,0,0,47,112,117,111,114,52,47,50,0,0,0,0,0,0,0,0,47,112,117,111,114,52,47,49,0,0,0,0,0,0,0,0,47,112,117,111,114,51,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,49,48,47,56,0,0,0,0,0,0,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,
+48,93,46,99,111,117,110,116,91,48,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,32,38,38,32,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,62,61,32,114,116,112,45,62,77,105,110,70,105,108,108,0,0,47,112,117,111,114,51,47,50,0,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,118,109,108,0,0,0,0,0,47,112,117,111,114,51,47,49,0,0,0,0,0,0,0,0,75,80,95,68,111,119,110,0,109,97,120,112,115,104,116,
+32,61,32,37,102,10,109,97,120,112,115,119,105,100,32,61,32,37,102,10,0,0,0,0,0,47,112,117,111,114,49,49,47,57,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,56,0,0,0,0,0,0,0,62,10,0,0,0,0,0,0,47,112,117,111,114,49,49,47,55,0,0,0,0,0,0,0,110,111,100,101,0,0,0,0,47,112,117,111,114,49,49,47,54,0,0,0,0,0,0,0,47,72,101,108,118,101,116,105,99,97,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,0,0,80,115,105,0,0,0,0,0,102,105,108,108,101,100,0,0,108,105,103,104,116,121,101,108,108,111,119,0,0,
+0,0,0,47,112,117,111,114,49,49,47,53,0,0,0,0,0,0,0,118,101,114,116,105,99,101,115,0,0,0,0,0,0,0,0,67,69,76,76,83,80,65,67,73,78,71,0,0,0,0,0,98,111,116,104,0,0,0,0,47,112,117,111,114,49,49,47,52,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,51,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,50,0,0,0,0,0,0,0,47,98,114,98,103,49,48,47,55,0,0,0,0,0,0,0,47,112,117,111,114,49,49,47,49,49,0,0,0,0,0,0,91,91,58,115,112,97,99,101,58,93,93,0,0,0,0,0,110,111,112,50,0,0,0,0,47,112,117,111,114,49,49,47,49,48,0,0,0,0,0,
+0,37,115,32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,97,114,101,32,112,114,101,100,101,102,105,110,101,100,32,116,111,32,49,49,46,48,32,97,110,100,32,56,46,53,32,105,110,32,103,112,105,99,10,0,47,112,117,111,114,49,49,47,49,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,57,0,0,0,0,0,0,0,32,116,97,114,103,101,116,61,34,37,115,34,0,0,0,0,112,108,97,105,110,45,101,120,116,58,100,111,116,0,0,0,111,114,100,101,114,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,
+32,100,113,46,112,110,108,115,0,0,47,112,117,111,114,49,48,47,56,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,55,0,0,0,0,0,0,0,110,111,0,0,0,0,0,0,47,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,0,0,0,80,114,105,109,101,0,0,0,104,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,54,0,0,0,0,0,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,0,99,111,109,109,101,110,116,0,67,79,76,83,80,65,78,
+32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,98,97,99,107,0,0,0,0,47,112,117,111,114,49,48,47,53,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,85,110,97,98,108,101,32,116,111,32,114,101,99,108,97,105,109,32,98,111,120,32,115,112,97,99,101,32,105,110,32,115,112,108,105,110,101,32,114,111,117,116,105,110,103,32,102,111,114,32,101,100,103,101,32,34,37,115,34,32,45,62,32,34,37,115,34,46,32,83,111,
+109,101,116,104,105,110,103,32,105,115,32,112,114,111,98,97,98,108,121,32,115,101,114,105,111,117,115,108,121,32,119,114,111,110,103,46,10,0,0,0,0,69,78,68,0,0,0,0,0,32,91,37,100,93,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,112,32,34,37,115,34,10,0,0,0,0,0,0,47,112,117,111,114,49,48,47,52,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,105,110,101,100,103,
+101,32,108,105,115,116,10,0,0,0,0,0,0,0,47,112,117,111,114,49,48,47,51,0,0,0,0,0,0,0,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,0,38,108,116,59,0,0,0,0,47,97,99,99,101,110,116,52,47,52,0,0,0,0,0,0,47,98,114,98,103,49,48,47,54,0,0,0,0,0,0,0,103,114,97,112,104,0,0,0,47,112,117,111,114,49,48,47,50,0,0,0,0,0,0,0,58,32,37,46,50,102,32,115,101,99,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,60,84,65,66,76,69,62,0,47,112,117,111,114,49,48,47,49,48,0,0,0,0,0,0,84,72,0,0,0,0,0,0,37,115,
+32,109,97,120,112,115,104,116,32,97,110,100,32,109,97,120,112,115,119,105,100,32,104,97,118,101,32,110,111,32,109,101,97,110,105,110,103,32,105,110,32,68,87,66,32,50,46,48,44,32,115,101,116,32,112,97,103,101,32,98,111,117,110,100,97,114,105,101,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,0,0,0,47,112,117,111,114,49,48,47,49,0,0,0,0,0,0,0,115,101,112,0,0,0,0,0,47,112,117,98,117,103,110,57,47,57,0,0,0,0,0,0,32,116,105,116,108,101,61,
+34,37,115,34,0,0,0,0,0,37,115,32,119,97,115,32,97,108,114,101,97,100,121,32,105,110,32,97,32,114,97,110,107,115,101,116,44,32,100,101,108,101,116,101,100,32,102,114,111,109,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,99,108,117,115,116,0,0,0,47,112,117,98,117,103,110,57,47,56,0,0,0,0,0,0,47,112,117,98,117,103,110,57,47,55,0,0,0,0,0,0,47,84,105,109,101,115,45,66,111,108,100,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,0,67,114,101,97,116,105,110,103,32,101,100,103,101,115,32,
+117,115,105,110,103,32,37,115,10,0,0,0,0,0,0,0,0,80,105,0,0,0,0,0,0,102,97,108,115,101,0,0,0,47,112,117,98,117,103,110,57,47,54,0,0,0,0,0,0,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,0,103,114,111,117,112,0,0,0,67,79,76,83,80,65,78,0,102,111,114,119,97,114,100,0,98,101,105,103,101,0,0,0,47,112,117,98,117,103,110,57,47,53,0,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,110,111,116,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,
+0,0,0,0,0,47,112,117,98,117,103,110,57,47,52,0,0,0,0,0,0,47,112,117,98,117,103,110,57,47,51,0,0,0,0,0,0,47,98,114,98,103,49,48,47,53,0,0,0,0,0,0,0,47,62,10,0,0,0,0,0,47,112,117,98,117,103,110,57,47,50,0,0,0,0,0,0,32,91,0,0,0,0,0,0,99,108,117,115,116,101,114,0,47,112,117,98,117,103,110,57,47,49,0,0,0,0,0,0,102,97,105,108,117,114,101,32,109,97,108,108,111,99,39,105,110,103,32,102,111,114,32,114,101,115,117,108,116,32,115,116,114,105,110,103,0,0,0,0,37,115,32,46,80,83,32,119,47,111,32,97,114,103,115,
+32,99,97,117,115,101,115,32,71,78,85,32,112,105,99,32,116,111,32,115,99,97,108,101,32,100,114,97,119,105,110,103,32,116,111,32,102,105,116,32,56,46,53,120,49,49,32,112,97,112,101,114,59,32,68,87,66,32,100,111,101,115,32,110,111,116,10,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,56,0,0,0,0,0,0,127,116,111,112,0,0,0,0,47,112,117,98,117,103,110,56,47,55,0,0,0,0,0,0,32,104,114,101,102,61,34,37,115,34,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,54,0,0,0,0,0,0,110,115,108,105,109,105,116,0,119,105,100,
+116,104,0,0,0,32,115,101,116,108,105,110,101,119,105,100,116,104,10,0,0,47,112,117,98,117,103,110,56,47,53,0,0,0,0,0,0,47,84,105,109,101,115,45,73,116,97,108,105,99,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,80,104,105,0,0,0,0,0,105,109,97,103,101,0,0,0,39,10,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,52,0,0,0,0,0,0,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,0,108,97,121,101,114,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,70,73,
+88,69,68,83,73,90,69,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,51,0,0,0,0,0,0,102,105,108,108,101,100,0,0,47,112,117,98,117,103,110,56,47,50,0,0,0,0,0,0,78,68,95,111,114,100,101,114,40,118,41,32,60,32,78,68,95,111,114,100,101,114,40,119,41,0,0,0,0,0,0,0,47,112,117,98,117,103,110,56,47,49,0,0,0,0,0,0,47,98,114,98,103,49,48,47,52,0,0,0,0,0,0,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,
+34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,110,89,77,105,110,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,0,47,112,117,98,117,103,110,55,47,55,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,54,0,0,0,0,0,0,108,105,110,101,116,104,105,99,107,32,61,32,48,59,32,111,108,100,108,105,110,101,116,104,105,99,107,32,61,32,108,105,110,101,116,104,105,99,107,10,0,0,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,53,0,0,0,0,0,0,47,112,117,98,
+117,103,110,55,47,52,0,0,0,0,0,0,60,97,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,51,0,0,0,0,0,0,47,112,117,98,117,103,110,55,47,50,0,0,0,0,0,0,47,84,105,109,101,115,45,82,111,109,97,110,32,115,116,97,114,110,101,116,73,83,79,32,100,101,102,0,0,0,0,0,79,117,109,108,0,0,0,0,105,110,32,110,111,100,101,32,37,115,10,0,0,0,0,0,97,103,100,101,108,101,116,101,32,111,110,32,119,114,111,110,103,32,103,114,97,112,104,0,47,112,117,98,117,103,110,55,47,49,0,0,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,
+101,0,0,0,0,110,111,106,117,115,116,105,102,121,0,0,0,0,0,0,0,65,76,83,69,0,0,0,0,116,97,112,101,114,101,100,0,47,112,117,98,117,103,110,54,47,54,0,0,0,0,0,0,47,112,117,98,117,103,110,54,47,53,0,0,0,0,0,0,47,112,117,98,117,103,110,54,47,52,0,0,0,0,0,0,47,98,114,98,103,49,48,47,51,0,0,0,0,0,0,0,109,105,115,109,97,116,99,104,101,100,32,116,97,103,0,0,32,116,114,97,110,115,102,111,114,109,61,34,114,111,116,97,116,101,40,37,100,32,37,103,32,37,103,41,34,0,0,0,47,112,117,98,117,103,110,54,47,51,0,0,0,
+0,0,0,47,112,117,98,117,103,110,54,47,50,0,0,0,0,0,0,114,101,99,116,32,37,115,32,37,100,44,37,100,32,37,100,44,37,100,10,0,0,0,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,108,105,110,101,116,104,105,99,107,32,118,97,114,105,97,98,108,101,32,116,111,32,115,101,116,32,108,105,110,101,32,116,104,105,99,107,110,101,115,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,0,0,0,0,0,0,0,47,112,117,98,117,103,110,54,47,49,0,0,0,
+0,0,0,47,112,117,98,117,103,110,53,47,53,0,0,0,0,0,0,60,47,97,62,10,0,0,0,47,112,117,98,117,103,110,53,47,52,0,0,0,0,0,0,47,112,117,98,117,103,110,53,47,51,0,0,0,0,0,0,125,32,100,101,102,0,0,0,79,116,105,108,100,101,0,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,47,112,117,98,117,103,110,53,47,50,0,0,0,0,0,0,108,105,103,104,116,115,101,97,103,114,101,101,110,0,0,0,105,109,97,103,101,115,99,97,108,101,0,0,0,0,0,0,82,85,69,0,0,0,0,0,37,115,45,37,115,0,0,0,47,112,117,98,117,103,110,53,47,49,
+0,0,0,0,0,0,47,112,117,98,117,103,110,52,47,52,0,0,0,0,0,0,47,112,117,98,117,103,110,52,47,51,0,0,0,0,0,0,47,98,114,98,103,49,48,47,50,0,0,0,0,0,0,0,34,32,119,105,100,116,104,61,34,37,103,112,120,34,32,104,101,105,103,104,116,61,34,37,103,112,120,34,32,112,114,101,115,101,114,118,101,65,115,112,101,99,116,82,97,116,105,111,61,34,120,77,105,100,89,77,105,100,32,109,101,101,116,34,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,0,47,112,117,98,117,103,110,52,47,50,0,0,0,0,0,0,106,112,101,103,58,102,
+105,103,0,0,0,0,0,0,0,0,47,112,117,98,117,103,110,52,47,49,0,0,0,0,0,0,98,111,120,114,97,100,32,61,32,48,32,37,115,32,110,111,32,114,111,117,110,100,101,100,32,99,111,114,110,101,114,115,32,105,110,32,103,114,97,112,104,118,105,122,10,0,0,0,47,112,117,98,117,103,110,51,47,51,0,0,0,0,0,0,47,112,117,98,117,103,110,51,47,50,0,0,0,0,0,0,60,47,118,58,114,101,99,116,62,10,0,0,0,0,0,0,47,112,117,98,117,103,110,51,47,49,0,0,0,0,0,0,47,112,117,98,117,57,47,57,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,99,117,
+114,114,101,110,116,100,105,99,116,32,101,110,100,32,100,101,102,105,110,101,102,111,110,116,0,0,0,0,0,0,79,115,108,97,115,104,0,0,98,108,97,99,107,0,0,0,47,112,117,98,117,57,47,56,0,0,0,0,0,0,0,0,102,105,120,101,100,115,105,122,101,0,0,0,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,0,0,0,0,0,71,82,65,68,73,69,78,84,65,78,71,76,69,0,0,0,48,0,0,0,0,0,0,0,47,112,117,98,117,57,47,55,0,0,0,0,0,0,0,0,47,112,117,98,117,57,47,54,0,0,0,0,0,0,0,0,98,117,102,102,101,114,32,101,114,114,111,114,0,0,0,0,
+47,112,117,98,117,57,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,49,48,47,49,48,0,0,0,0,0,0,60,105,109,97,103,101,32,120,108,105,110,107,58,104,114,101,102,61,34,0,0,0,0,0,47,112,117,98,117,57,47,52,0,0,0,0,0,0,0,0,47,112,117,98,117,57,47,51,0,0,0,0,0,0,0,0,37,115,32,71,78,85,32,112,105,99,32,115,117,112,112,111,114,116,115,32,97,32,98,111,120,114,97,100,32,118,97,114,105,97,98,108,101,32,116,111,32,100,114,97,119,32,98,111,120,101,115,32,119,105,116,104,32,114,111,117,110,100,101,100,32,99,111,114,110,
+101,114,115,59,32,68,87,66,32,97,110,100,32,49,48,116,104,32,69,100,46,32,100,111,32,110,111,116,10,0,0,0,0,0,0,47,112,117,98,117,57,47,50,0,0,0,0,0,0,0,0,47,112,117,98,117,57,47,49,0,0,0,0,0,0,0,0,110,111,110,101,0,0,0,0,60,47,99,101,110,116,101,114,62,60,47,118,58,116,101,120,116,98,111,120,62,10,0,0,47,112,117,98,117,56,47,56,0,0,0,0,0,0,0,0,47,112,117,98,117,56,47,55,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,47,69,110,99,111,100,105,110,103,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,
+32,100,101,102,0,0,0,0,79,109,105,99,114,111,110,0,35,102,56,102,56,102,56,0,47,112,117,98,117,56,47,54,0,0,0,0,0,0,0,0,100,105,115,116,111,114,116,105,111,110,0,0,0,0,0,0,108,105,103,104,116,112,105,110,107,0,0,0,0,0,0,0,72,69,73,71,72,84,0,0,116,97,105,108,108,97,98,101,108,0,0,0,0,0,0,0,47,112,117,98,117,56,47,53,0,0,0,0,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,101,41,32,61,61,32,78,85,76,76,0,0,0,47,112,117,98,117,56,47,52,0,0,0,0,0,0,0,0,47,112,117,98,117,56,47,51,0,0,0,0,0,0,0,0,47,98,
+114,98,103,49,48,47,49,0,0,0,0,0,0,0,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,47,112,117,98,117,56,47,50,0,0,0,0,0,0,0,0,47,112,117,98,117,56,47,49,0,0,0,0,0,0,0,0,47,112,117,98,117,55,47,55,0,0,0,0,0,0,0,0,97,114,114,111,119,104,101,97,100,32,61,32,55,32,37,115,32,110,111,116,32,117,115,101,100,32,98,121,32,103,114,97,112,104,118,105,122,10,0,0,47,112,117,98,117,55,47,54,0,0,0,0,0,0,0,0,34,62,60,99,101,110,116,101,114,62,0,0,0,0,0,0,
+47,112,117,98,117,55,47,53,0,0,0,0,0,0,0,0,47,112,117,98,117,55,47,52,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,125,32,102,111,114,97,108,108,0,0,0,0,0,0,0,0,79,109,101,103,97,0,0,0,35,49,48,49,48,49,48,0,32,37,100,0,0,0,0,0,47,112,117,98,117,55,47,51,0,0,0,0,0,0,0,0,115,107,101,119,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,82,79,87,83,80,65,78,32,118,97,108,117,101,32,99,97,110,110,111,116,32,98,101,32,48,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,104,101,97,100,108,97,98,101,
+108,0,0,0,0,0,0,0,47,112,117,98,117,55,47,50,0,0,0,0,0,0,0,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,51,93,32,60,32,73,78,84,95,77,65,88,0,0,0,0,0,0,47,112,117,98,117,55,47,49,0,0,0,0,0,0,0,0,47,112,117,98,117,54,47,54,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,57,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,32,37,100,32,37,115,10,0,0,0,0,0,0,0,47,112,
+117,98,117,54,47,53,0,0,0,0,0,0,0,0,100,101,108,116,97,32,60,61,32,48,120,70,70,70,70,0,47,112,117,98,117,54,47,52,0,0,0,0,0,0,0,0,47,112,117,98,117,54,47,51,0,0,0,0,0,0,0,0,37,115,32,97,114,114,111,119,104,101,97,100,32,105,115,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,44,32,105,110,105,116,105,97,108,108,121,32,49,32,105,110,32,103,112,105,99,44,32,50,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,0,0,0,0,47,112,117,98,117,54,47,50,0,0,0,0,0,0,0,0,99,111,
+108,111,114,58,35,37,48,50,120,37,48,50,120,37,48,50,120,59,0,0,0,0,114,101,100,0,0,0,0,0,47,112,117,98,117,54,47,49,0,0,0,0,0,0,0,0,47,112,117,98,117,53,47,53,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,123,32,49,32,105,110,100,101,120,32,47,70,73,68,32,110,101,32,123,32,100,101,102,32,125,123,32,112,111,112,32,112,111,112,32,125,32,105,102,101,108,115,101,0,0,0,0,0,79,103,114,97,118,101,0,0,35,102,48,102,48,102,48,0,47,112,117,98,117,53,47,52,0,0,0,0,0,0,0,0,112,101,114,105,112,104,101,114,105,101,
+115,0,0,0,0,0,108,105,103,104,116,103,114,101,101,110,0,0,0,0,0,0,82,79,87,83,80,65,78,0,108,97,98,101,108,0,0,0,47,112,117,98,117,53,47,51,0,0,0,0,0,0,0,0,47,112,117,98,117,53,47,50,0,0,0,0,0,0,0,0,47,112,117,98,117,53,47,49,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,56,0,0,0,0,0,0,0,125,10,0,0,0,0,0,0,47,112,117,98,117,52,47,52,0,0,0,0,0,0,0,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,48,93,32,43,32,114,116,112,45,62,115,112,
+108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,99,111,117,110,116,91,49,93,32,61,61,32,78,79,68,69,67,65,82,68,32,43,32,49,0,0,0,69,114,114,111,114,32,100,117,114,105,110,103,32,99,111,110,118,101,114,115,105,111,110,32,116,111,32,34,85,84,70,45,56,34,46,32,32,81,117,105,116,105,110,103,46,10,0,0,47,112,117,98,117,52,47,51,0,0,0,0,0,0,0,0,49,48,48,48,48,0,0,0,47,112,117,98,117,52,47,50,0,0,0,0,0,0,0,0,37,115,32,97,114,114,111,119,104,101,97,100,32,104,97,115,32,110,111,32,109,101,
+97,110,105,110,103,32,105,110,32,68,87,66,32,50,44,32,97,114,114,111,119,104,101,97,100,32,61,32,55,32,109,97,107,101,115,32,102,105,108,108,101,100,32,97,114,114,111,119,104,101,97,100,115,32,105,110,32,103,112,105,99,32,97,110,100,32,105,110,32,49,48,116,104,32,69,100,105,116,105,111,110,10,0,0,0,0,0,0,0,0,68,111,119,110,0,0,0,0,47,112,117,98,117,52,47,49,0,0,0,0,0,0,0,0,99,111,108,111,114,58,37,115,59,0,0,0,0,0,0,0,47,112,117,98,117,51,47,51,0,0,0,0,0,0,0,0,32,45,100,97,115,104,32,50,0,0,0,0,0,
+0,0,0,47,112,117,98,117,51,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,100,117,112,32,100,117,112,32,102,105,110,100,102,111,110,116,32,100,117,112,32,108,101,110,103,116,104,32,100,105,99,116,32,98,101,103,105,110,0,0,79,99,105,114,99,0,0,0,35,101,48,101,48,101,48,0,47,112,117,98,117,51,47,49,0,0,0,0,0,0,0,0,115,105,100,101,115,0,0,0,108,105,103,104,116,103,114,97,121,0,0,0,0,0,0,0,68,65,83,72,69,68,0,0,102,97,108,115,101,0,0,0,47,112,114,103,110,57,47,57,0,0,0,0,0,0,0,0,47,112,114,103,110,57,
+47,56,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,55,0,0,0,0,0,0,0,47,112,114,103,110,57,47,55,0,0,0,0,0,0,0,0,110,101,101,100,32,100,105,99,116,105,111,110,97,114,121,0,32,32,125,10,0,0,0,0,47,112,114,103,110,57,47,54,0,0,0,0,0,0,0,0,91,94,91,58,97,108,110,117,109,58,93,95,93,0,0,0,110,111,112,49,0,0,0,0,47,112,114,103,110,57,47,53,0,0,0,0,0,0,0,0,47,112,114,103,110,57,47,52,0,0,0,0,0,0,0,0,88,32,101,108,115,101,32,90,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,
+102,105,108,108,118,97,108,32,61,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,102,105,108,108,101,100,32,89,32,102,105,108,108,32,89,59,10,90,10,0,0,0,0,0,0,0,0,47,112,114,103,110,57,47,51,0,0,0,0,0,0,0,0,32,102,111,110,116,45,115,105,122,101,58,32,37,46,50,102,112,116,59,0,0,0,0,0,112,108,97,105,110,58,100,111,116,0,0,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,100,113,46,112,110,108,115,0,0,0,47,112,114,103,110,57,47,50,0,
+0,0,0,0,0,0,0,47,112,114,103,110,57,47,49,0,0,0,0,0,0,0,0,102,97,108,115,101,0,0,0,47,115,116,97,114,110,101,116,73,83,79,32,123,0,0,0,79,97,99,117,116,101,0,0,100,121,110,97,109,105,99,32,108,111,97,100,105,110,103,32,110,111,116,32,97,118,97,105,108,97,98,108,101,10,0,0,35,101,56,101,56,101,56,0,97,114,105,97,108,0,0,0,47,112,114,103,110,56,47,56,0,0,0,0,0,0,0,0,112,101,110,119,105,100,116,104,0,0,0,0,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,0,0,
+0,68,79,84,84,69,68,0,0,105,110,118,105,115,0,0,0,47,112,114,103,110,56,47,55,0,0,0,0,0,0,0,0,101,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,114,111,117,116,101,115,112,108,105,110,101,32,102,97,105,108,101,100,10,0,0,0,66,69,71,73,78,0,0,0,111,98,106,101,99,116,115,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,54,0,0,0,0,0,0,0,47,112,114,103,110,56,47,54,0,0,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,
+0,0,0,0,0,0,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,101,109,112,116,121,32,111,117,116,101,100,103,101,32,108,105,115,116,10,0,0,0,0,0,0,38,97,109,112,59,0,0,0,83,101,116,116,105,110,103,32,117,112,32,115,112,114,105,110,103,32,109,111,100,101,108,58,32,0,0,0,0,0,0,0,47,112,114,103,110,56,47,53,0,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,47,112,114,103,110,56,47,52,0,0,0,0,0,0,0,0,32,32,32,32,116,101,120,116,117,114,101,32,73,109,97,103,101,84,101,120,116,117,114,
+101,32,123,32,117,114,108,32,34,37,115,34,32,125,10,0,0,99,108,117,115,116,101,114,0,47,97,99,99,101,110,116,52,47,51,0,0,0,0,0,0,83,101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105,116,105,111,110,115,0,0,0,0,0,0,0,99,108,117,115,116,101,114,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,112,114,103,110,56,47,51,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,84,82,0,0,0,0,0,0,47,112,114,103,110,56,47,50,0,0,0,0,0,0,0,0,9,37,115,9,115,111,114,114,121,44,32,116,104,101,32,103,
+114,111,102,102,32,102,111,108,107,115,32,99,104,97,110,103,101,100,32,103,112,105,99,59,32,115,101,110,100,32,97,110,121,32,99,111,109,112,108,97,105,110,116,32,116,111,32,116,104,101,109,59,10,0,0,0,85,110,104,97,110,100,108,101,100,32,97,100,106,117,115,116,32,111,112,116,105,111,110,32,37,115,10,0,0,0,0,0,47,112,114,103,110,56,47,49,0,0,0,0,0,0,0,0,98,101,122,45,62,101,102,108,97,103,0,0,0,0,0,0,102,111,110,116,45,115,116,121,108,101,58,32,37,115,59,0,103,114,97,112,104,0,0,0,47,112,114,103,110,
+55,47,55,0,0,0,0,0,0,0,0,47,112,114,103,110,55,47,54,0,0,0,0,0,0,0,0,37,32,83,101,116,32,117,112,32,73,83,79,32,76,97,116,105,110,32,49,32,99,104,97,114,97,99,116,101,114,32,101,110,99,111,100,105,110,103,0,79,69,108,105,103,0,0,0,115,111,109,101,32,110,111,100,101,115,32,119,105,116,104,32,109,97,114,103,105,110,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,
+100,103,101,115,10,0,0,0,0,0,0,0,35,51,48,51,48,51,48,0,47,112,114,103,110,55,47,53,0,0,0,0,0,0,0,0,120,108,97,98,101,108,0,0,108,105,103,104,116,99,121,97,110,0,0,0,0,0,0,0,73,78,86,73,83,0,0,0,45,45,0,0,0,0,0,0,97,122,117,114,101,0,0,0,47,112,114,103,110,55,47,52,0,0,0,0,0,0,0,0,47,112,114,103,110,55,47,51,0,0,0,0,0,0,0,0,47,112,114,103,110,55,47,50,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,53,0,0,0,0,0,0,0,32,32,32,32,125,10,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,112,114,
+103,110,55,47,49,0,0,0,0,0,0,0,0,93,0,0,0,0,0,0,0,47,112,114,103,110,54,47,54,0,0,0,0,0,0,0,0,47,112,114,103,110,54,47,53,0,0,0,0,0,0,0,0,9,37,115,9,105,110,115,116,97,108,108,32,97,32,109,111,114,101,32,114,101,99,101,110,116,32,118,101,114,115,105,111,110,32,111,102,32,103,112,105,99,32,111,114,32,115,119,105,116,99,104,32,116,111,32,68,87,66,32,111,114,32,49,48,116,104,32,69,100,105,116,105,111,110,32,112],"i8",L,l.J+81956);D([105,99,59,10,0,0,0,0,0,0,0,0,76,97,121,111,117,116,32,119,97,115,32,
+110,111,116,32,100,111,110,101,10,0,0,0,0,110,45,62,98,114,97,110,99,104,91,105,93,46,99,104,105,108,100,0,0,0,0,0,0,127,114,111,111,116,0,0,0,47,112,114,103,110,54,47,52,0,0,0,0,0,0,0,0,102,111,110,116,45,115,116,114,101,116,99,104,58,32,37,115,59,0,0,0,0,0,0,0,47,112,114,103,110,54,47,51,0,0,0,0,0,0,0,0,69,100,103,101,32,108,101,110,103,116,104,32,37,102,32,108,97,114,103,101,114,32,116,104,97,110,32,109,97,120,105,109,117,109,32,37,117,32,97,108,108,111,119,101,100,46,10,67,104,101,99,107,32,102,
+111,114,32,111,118,101,114,119,105,100,101,32,110,111,100,101,40,115,41,46,10,0,0,0,0,0,99,97,110,110,111,116,32,99,111,109,112,105,108,101,32,114,101,103,117,108,97,114,32,101,120,112,114,101,115,115,105,111,110,32,37,115,0,0,0,0,47,112,114,103,110,54,47,50,0,0,0,0,0,0,0,0,32,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,0,0,0,0,0,0,0,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,52,53,32,47,104,121,112,104,101,110,32,112,117,116,0,0,0,78,117,0,0,0,0,0,0,35,102,99,102,99,102,99,0,
+32,105,110,32,108,105,110,101,32,37,100,32,110,101,97,114,32,39,0,0,0,0,0,0,47,112,114,103,110,54,47,49,0,0,0,0,0,0,0,0,102,111,110,116,99,111,108,111,114,0,0,0,0,0,0,0,108,105,103,104,116,99,111,114,97,108,0,0,0,0,0,0,73,78,86,73,83,73,66,76,69,0,0,0,0,0,0,0,45,62,0,0,0,0,0,0,47,112,114,103,110,53,47,53,0,0,0,0,0,0,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,47,112,114,103,110,53,47,52,0,0,0,0,0,0,0,0,115,117,114,112,114,105,115,
+101,10,0,0,0,0,0,0,0,47,112,114,103,110,53,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,52,0,0,0,0,0,0,0,32,32,32,32,32,32,32,32,100,105,102,102,117,115,101,67,111,108,111,114,32,49,32,49,32,49,10,0,0,0,0,0,47,112,114,103,110,53,47,50,0,0,0,0,0,0,0,0,47,112,114,103,110,53,47,49,0,0,0,0,0,0,0,0,47,112,114,103,110,52,47,52,0,0,0,0,0,0,0,0,9,37,115,32,105,102,32,121,111,117,32,117,115,101,32,103,112,105,99,32,97,110,100,32,105,116,32,98,97,114,102,115,32,111,110,32,101,110,99,111,117,110,116,101,
+114,105,110,103,32,34,115,111,108,105,100,34,44,10,0,0,0,0,0,0,47,112,114,103,110,52,47,51,0,0,0,0,0,0,0,0,102,111,110,116,45,119,101,105,103,104,116,58,32,37,115,59,0,0,0,0,0,0,0,0,47,112,114,103,110,52,47,50,0,0,0,0,0,0,0,0,47,112,114,103,110,52,47,49,0,0,0,0,0,0,0,0,73,83,79,76,97,116,105,110,49,69,110,99,111,100,105,110,103,32,48,32,50,53,53,32,103,101,116,105,110,116,101,114,118,97,108,32,112,117,116,105,110,116,101,114,118,97,108,0,78,116,105,108,100,101,0,0,35,56,48,56,48,56,48,0,47,112,114,
+103,110,51,47,51,0,0,0,0,0,0,0,0,102,111,110,116,110,97,109,101,0,0,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,0,0,0,0,0,0,0,83,79,76,73,68,0,0,0,98,122,46,115,105,122,101,32,37,32,51,32,61,61,32,49,0,0,0,0,0,0,0,0,47,112,114,103,110,51,47,50,0,0,0,0,0,0,0,0,47,112,114,103,110,51,47,49,0,0,0,0,0,0,0,0,47,112,114,103,110,49,49,47,57,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,51,0,0,0,0,0,0,0,112,97,114,116,105,97,108,32,99,104,97,114,97,99,116,101,114,0,0,0,0,0,0,0,32,32,32,32,32,32,97,109,98,105,
+101,110,116,73,110,116,101,110,115,105,116,121,32,48,46,51,51,10,0,0,0,0,47,112,114,103,110,49,49,47,56,0,0,0,0,0,0,0,47,112,114,103,110,49,49,47,55,0,0,0,0,0,0,0,47,112,114,103,110,49,49,47,54,0,0,0,0,0,0,0,105,102,32,102,105,108,108,118,97,108,32,62,32,48,46,52,32,116,104,101,110,32,88,10,9,100,101,102,105,110,101,32,115,101,116,102,105,108,108,118,97,108,32,89,32,102,105,108,108,118,97,108,32,61,32,49,32,45,32,89,59,10,9,100,101,102,105,110,101,32,98,111,108,100,32,89,32,116,104,105,99,107,110,
+101,115,115,32,50,32,89,59,10,0,0,0,0,47,112,114,103,110,49,49,47,53,0,0,0,0,0,0,0,102,111,110,116,45,102,97,109,105,108,121,58,32,39,37,115,39,59,0,0,0,0,0,0,47,112,114,103,110,49,49,47,52,0,0,0,0,0,0,0,99,109,97,112,120,95,110,112,58,109,97,112,0,0,0,0,47,112,114,103,110,49,49,47,51,0,0,0,0,0,0,0,32,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,48,0,0,0,0,0,0,0,77,117,0,0,0,0,0,0,115,116,97,114,0,0,0,0,47,112,114,103,110,49,49,47,50,0,0,0,0,0,0,0,102,111,110,116,115,105,122,101,0,0,0,0,
+0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,83,84,89,76,69,32,45,32,105,103,110,111,114,101,100,10,0,0,0,98,122,46,115,105,122,101,32,62,32,48,0,0,0,0,0,47,112,114,103,110,49,49,47,49,49,0,0,0,0,0,0,47,112,114,103,110,49,49,47,49,48,0,0,0,0,0,0,47,112,114,103,110,49,49,47,49,0,0,0,0,0,0,0,47,98,108,117,101,115,57,47,50,0,0,0,0,0,0,0,32,32,32,32,109,97,116,101,114,105,97,108,32,77,97,116,101,114,105,97,108,
+32,123,10,0,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,57,0,0,0,0,0,0,0,103,105,102,58,102,105,103,0,47,112,114,103,110,49,48,47,56,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,55,0,0,0,0,0,0,0,37,115,32,71,78,85,32,112,105,99,32,118,115,46,32,49,48,116,104,32,69,100,105,116,105,111,110,32,100,92,40,101,39,116,101,110,116,101,10,0,47,112,114,103,110,49,48,47,54,0,0,0,0,0,0,0,60,118,58,116,101,120,116,98,111,120,32,105,110,115,101,116,61,34,48,44,48,44,48,44,48,34,32,115,116,121,108,101,61,34,112,111,
+115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,118,45,116,101,120,116,45,119,114,97,112,112,105,110,103,58,39,102,97,108,115,101,39,59,112,97,100,100,105,110,103,58,39,48,39,59,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,53,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,52,0,0,0,0,0,0,0,47,69,110,99,111,100,105,110,103,86,101,99,116,111,114,32,50,53,54,32,97,114,114,97,121,32,100,101,102,0,0,0,76,97,109,98,100,97,0,0,77,114,101,99,111,114,100,0,47,112,114,103,110,49,48,47,51,0,0,0,0,0,0,
+0,115,116,121,108,101,0,0,0,108,97,119,110,103,114,101,101,110,0,0,0,0,0,0,0,65,68,73,65,76,0,0,0,115,112,108,45,62,115,105,122,101,32,62,32,48,0,0,0,47,112,114,103,110,49,48,47,50,0,0,0,0,0,0,0,47,112,114,103,110,49,48,47,49,48,0,0,0,0,0,0,47,112,114,103,110,49,48,47,49,0,0,0,0,0,0,0,105,110,115,117,102,102,105,99,105,101,110,116,32,109,101,109,111,114,121,0,0,0,0,0,47,98,108,117,101,115,57,47,49,0,0,0,0,0,0,0,32,32,97,112,112,101,97,114,97,110,99,101,32,65,112,112,101,97,114,97,110,99,101,32,123,
+10,0,0,0,0,0,0,47,112,105,121,103,57,47,57,0,0,0,0,0,0,0,0,47,112,105,121,103,57,47,56,0,0,0,0,0,0,0,0,47,112,105,121,103,57,47,55,0,0,0,0,0,0,0,0,114,101,115,101,116,32,37,115,32,115,101,116,32,116,111,32,107,110,111,119,110,32,115,116,97,116,101,10,0,0,0,0,47,112,105,121,103,57,47,54,0,0,0,0,0,0,0,0,32,115,116,114,111,107,101,100,61,34,102,97,108,115,101,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,10,0,0,0,0,0,0,0,47,112,105,121,103,57,47,53,0,0,0,0,0,0,0,0,100,111,116,0,0,0,0,
+0,47,112,105,121,103,57,47,52,0,0,0,0,0,0,0,0,109,97,114,107,0,0,0,0,75,97,112,112,97,0,0,0,114,101,99,111,114,100,0,0,47,112,105,121,103,57,47,51,0,0,0,0,0,0,0,0,102,105,108,108,99,111,108,111,114,0,0,0,0,0,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,0,0,0,79,85,78,68,69,68,0,0,115,101,116,108,105,110,101,119,105,100,116,104,0,49,0,0,47,112,105,121,103,57,47,50,0,0,0,0,0,0,0,0,47,112,105,121,103,57,47,49,0,0,0,0,0,0,0,0,109,101,114,103,101,95,111,110,101,119,97,121,32,103,108,105,116,99,
+104,10,0,0,0,0,47,112,105,121,103,56,47,56,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,56,0,0,0,0,0,0,0,83,104,97,112,101,32,123,10,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,55,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,54,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,53,0,0,0,0,0,0,0,0,105,102,32,98,111,120,114,97,100,32,62,32,49,46,48,32,38,38,32,100,97,115,104,119,105,100,32,60,32,48,46,48,55,53,32,116,104,101,110,32,88,10,9,102,105,108,108,118,97,108,32,61,32,49,59,10,9,100,101,102,105,110,101,32,102,
+105,108,108,32,89,32,89,59,10,9,100,101,102,105,110,101,32,115,111,108,105,100,32,89,32,89,59,10,9,100,101,102,105,110,101,32,114,101,115,101,116,32,89,32,115,99,97,108,101,61,49,46,48,32,89,59,10,88,10,0,0,0,0,47,112,105,121,103,56,47,52,0,0,0,0,0,0,0,0,60,118,58,114,101,99,116,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,0,0,0,0,0,0,47,112,105,121,103,56,47,51,0,0,0,0,0,0,0,0,47,112,105,121,103,56,47,50,0,0,0,0,0,0,0,0,47,115,101,116,117,112,
+76,97,116,105,110,49,32,123,0,0,73,117,109,108,0,0,0,0,108,112,114,111,109,111,116,101,114,0,0,0,0,0,0,0,47,112,105,121,103,56,47,49,0,0,0,0,0,0,0,0,99,111,108,111,114,0,0,0,32,37,115,10,0,0,0,0,108,97,118,101,110,100,101,114,0,0,0,0,0,0,0,0,32,44,0,0,0,0,0,0,115,111,108,105,100,0,0,0,47,112,105,121,103,55,47,55,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,55,0,0,0,0,0,0,0,47,112,105,121,103,55,47,54,0,0,0,0,0,0,0,0,114,101,99,116,46,98,111,117,110,100,97,114,121,91,50,93,32,60,32,73,78,84,95,77,65,
+88,0,0,0,0,0,0,47,112,105,121,103,55,47,53,0,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,47,112,105,121,103,55,47,52,0,0,0,0,0,0,0,0,47,112,105,121,103,55,47,51,0,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,47,112,105,121,103,55,47,50,0,0,0,0,0,0,0,0,37,115,32,68,87,66,32,50,32,99,111,109,112,97,116,105,98,105,108,105,116,121,32,100,101,102,105,110,105,116,105,111,110,115,10,0,0,0,0,0,47,112,105,121,103,55,47,49,0,0,0,0,0,0,0,0,60,47,118,58,111,118,97,108,62,10,0,0,0,0,0,0,47,112,105,
+121,103,54,47,54,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,0,47,112,105,121,103,54,47,53,0,0,0,0,0,0,0,0,73,111,116,97,0,0,0,0,68,105,110,103,98,97,116,115,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,114,97,114,114,111,119,0,0,47,112,105,121,103,54,47,52,0,0,0,0,0,0,0,0,115,104,97,112,101,0,0,0,107,104,97,107,105,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,86,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,0,84,105,109,101,115,
+45,82,111,109,97,110,0,0,0,0,0,47,112,105,121,103,54,47,51,0,0,0,0,0,0,0,0,47,112,105,121,103,54,47,50,0,0,0,0,0,0,0,0,47,112,105,121,103,54,47,49,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,54,0,0,0,0,0,0,0,111,98,106,0,0,0,0,0,47,112,105,121,103,53,47,53,0,0,0,0,0,0,0,0,47,112,105,121,103,53,47,52,0,0,0,0,0,0,0,0,38,35,51,57,59,0,0,0,114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,48,32,124,124,32,
+114,116,112,45,62,115,112,108,105,116,46,80,97,114,116,105,116,105,111,110,115,91,48,93,46,112,97,114,116,105,116,105,111,110,91,105,93,32,61,61,32,49,0,0,0,0,0,0,0,0,47,112,105,121,103,53,47,51,0,0,0,0,0,0,0,0,37,115,32,114,101,115,101,116,32,119,111,114,107,115,32,105,110,32,103,112,105,99,32,97,110,100,32,49,48,116,104,32,101,100,105,116,105,111,110,44,32,98,117,116,32,105,115,110,39,116,32,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,0,0,0,115,111,117,114,99,101,0,0,47,112,105,
+121,103,53,47,50,0,0,0,0,0,0,0,0,32,119,105,100,116,104,58,32,37,46,50,102,59,32,104,101,105,103,104,116,58,32,37,46,50,102,34,0,0,0,0,0,75,80,95,85,112,0,0,0,47,112,105,121,103,53,47,49,0,0,0,0,0,0,0,0,32,45,100,97,115,104,32,53,0,0,0,0,0,0,0,0,47,112,105,121,103,52,47,52,0,0,0,0,0,0,0,0,68,111,116,68,105,99,116,32,98,101,103,105,110,0,0,0,73,103,114,97,118,101,0,0,90,97,112,102,68,105,110,103,98,97,116,115,0,0,0,0,108,97,114,114,111,119,0,0,47,112,105,121,103,52,47,51,0,0,0,0,0,0,0,0,119,105,100,
+116,104,0,0,0,105,118,111,114,121,0,0,0,73,68,68,76,69,0,0,0,101,32,33,61,32,78,85,76,76,0,0,0,0,0,0,0,112,101,110,119,105,100,116,104,0,0,0,0,0,0,0,0,47,112,105,121,103,52,47,50,0,0,0,0,0,0,0,0,47,112,105,121,103,52,47,49,0,0,0,0,0,0,0,0,47,112,105,121,103,51,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,53,0,0,0,0,0,0,0,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,105,110,102,105,110,105,116,121,0,0,0,0,0,0,0,0,47,112,105,121,103,51,47,50,0,0,0,0,0,0,0,0,91,91,58,97,108,110,117,109,58,93,
+95,93,0,0,0,0,110,111,112,0,0,0,0,0,47,112,105,121,103,51,47,49,0,0,0,0,0,0,0,0,47,112,105,121,103,49,49,47,57,0,0,0,0,0,0,0,37,115,32,68,87,66,32,50,32,100,111,101,115,110,39,116,32,117,115,101,32,102,105,108,108,32,97,110,100,32,100,111,101,115,110,39,116,32,100,101,102,105,110,101,32,102,105,108,108,118,97,108,10,0,0,0,47,112,105,121,103,49,49,47,56,0,0,0,0,0,0,0,99,97,110,111,110,58,100,111,116,0,0,0,0,0,0,0,32,108,101,102,116,58,32,37,46,50,102,59,32,116,111,112,58,32,37,46,50,102,59,0,108,105,
+98,112,97,116,104,47,37,115,58,37,100,58,32,37,115,10,0,0,0,0,0,0,47,112,105,121,103,49,49,47,55,0,0,0,0,0,0,0,103,118,119,114,105,116,101,95,110,111,95,122,32,112,114,111,98,108,101,109,32,37,100,10,0,0,0,0,0,0,0,0,47,112,105,121,103,49,49,47,54,0,0,0,0,0,0,0,47,0,0,0,0,0,0,0,47,68,111,116,68,105,99,116,32,50,48,48,32,100,105,99,116,32,100,101,102,0,0,0,73,99,105,114,99,0,0,0,109,101,100,105,117,109,0,0,114,97,110,107,0,0,0,0,114,112,114,111,109,111,116,101,114,0,0,0,0,0,0,0,91,105,110,116,101,114,
+110,97,108,32,99,111,117,114,105,101,114,93,0,0,0,0,0,0,47,112,105,121,103,49,49,47,53,0,0,0,0,0,0,0,104,101,105,103,104,116,0,0,105,110,100,105,103,111,0,0,79,80,0,0,0,0,0,0,112,101,114,105,112,104,101,114,105,101,115,0,0,0,0,0,114,45,62,98,111,117,110,100,97,114,121,91,105,93,32,60,61,32,114,45,62,98,111,117,110,100,97,114,121,91,78,85,77,68,73,77,83,32,43,32,105,93,0,0,0,0,0,0,47,112,105,121,103,49,49,47,52,0,0,0,0,0,0,0,115,0,0,0,0,0,0,0,87,97,114,110,105,110,103,58,32,110,111,100,101,32,37,115,
+44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,102,108,111,97,116,115,10,0,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,80,115,104,111,114,116,101,115,116,112,97,116,104,32,102,97,105,108,101,100,10,0,0,69,79,70,0,0,0,0,0,37,100,32,111,98,106,115,32,37,100,32,120,108,97,98,101,108,115,32,102,111,114,99,101,61,37,100,32,98,98,61,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,10,
+0,0,0,0,0,47,112,105,121,103,49,49,47,51,0,0,0,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,97,100,100,95,116,114,101,101,95,101,100,103,101,58,32,109,105,115,115,105,110,103,32,116,114,101,101,32,101,100,103,101,10,0,0,0,0,0,0,0,108,97,98,101,108,115,46,99,0,0,0,0,0,0,0,0,115,116,97,114,116,61,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,119,105,116,104,32,109,111,100,101,61,115,101,108,102,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,0,47,112,105,121,103,
+49,49,47,50,0,0,0,0,0,0,0,47,98,108,117,101,115,56,47,52,0,0,0,0,0,0,0,97,103,100,105,99,116,111,102,58,32,117,110,107,110,111,119,110,32,107,105,110,100,32,37,100,10,0,0,0,0,0,0,117,115,101,114,95,115,104,97,112,101,95,37,100,10,0,0,37,102,0,0,0,0,0,0,47,112,105,121,103,49,49,47,49,49,0,0,0,0,0,0,58,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,47,112,105,121,103,49,49,47,49,48,0,0,0,0,0,0,71,114,97,112,104,32,37,115,32,104,97,115,32,97,114,114,97,121,32,112,97,99,107,105,110,103,32,119,105,116,104,
+32,117,115,101,114,32,118,97,108,117,101,115,32,98,117,116,32,110,111,32,34,115,111,114,116,118,34,32,97,116,116,114,105,98,117,116,101,115,32,97,114,101,32,100,101,102,105,110,101,100,46,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,99,111,108,103,0,0,0,0,119,101,105,103,104,116,0,0,47,97,99,99,101,110,116,52,47,50,0,0,0,0,0,0,47,112,105,121,103,49,49,47,49,0,0,0,0,0,0,0,84,65,66,76,69,0,0,0,37,115,32,102,105,108,108,32,104,97,115,32,110,111,32,109,101,97,110,105,110,103,32,105,
+110,32,68,87,66,32,50,44,32,103,112,105,99,32,99,97,110,32,117,115,101,32,102,105,108,108,32,111,114,32,102,105,108,108,101,100,44,32,49,48,116,104,32,69,100,105,116,105,111,110,32,117,115,101,115,32,102,105,108,108,32,111,110,108,121,10,0,0,0,0,0,0,65,100,106,117,115,116,105,110,103,32,37,115,32,117,115,105,110,103,32,37,115,10,0,0,47,112,105,121,103,49,48,47,57,0,0,0,0,0,0,0,99,111,109,112,111,117,110,100,46,99,0,0,0,0,0,0,32,32,60,118,58,111,118,97,108,32,115,116,121,108,101,61,34,112,111,115,
+105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,0,0,0,0,0,105,100,0,0,0,0,0,0,47,112,105,121,103,49,48,47,56,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,55,0,0,0,0,0,0,0,37,37,66,101,103,105,110,80,114,111,108,111,103,0,0,0,73,97,99,117,116,101,0,0,85,82,87,32,67,104,97,110,99,101,114,121,32,76,0,0,116,104,101,32,98,111,117,110,100,105,110,103,32,98,111,120,101,115,32,111,102,32,115,111,109,101,32,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,
+32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,0,0,115,105,103,110,97,116,117,114,101,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,54,0,0,0,0,0,0,0,109,97,114,103,105,110,0,0,105,110,100,105,97,110,114,101,100,0,0,0,0,0,0,0,79,84,84,79,77,0,0,0,112,97,103,101,100,105,114,0,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,47,112,105,121,103,49,48,47,53,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,52,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,51,0,0,0,0,0,0,0,47,
+98,108,117,101,115,56,47,51,0,0,0,0,0,0,0,103,115,97,118,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,32,110,101,119,112,97,116,104,10,0,0,112,105,99,0,0,0,0,0,47,112,105,121,103,49,48,47,50,0,0,0,0,0,0,0,101,110,100,32,37,115,10,0,32,91,107,101,121,61,0,0,98,98,0,0,0,0,0,0,47,112,105,121,103,49,48,47,49,48,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,47,112,105,121,103,49,48,47,49,0,0,0,0,0,0,0,37,115,32,102,105,108,108,118,97,108,32,105,115,32,48,46,51,32,105,110,32,
+49,48,116,104,32,69,100,105,116,105,111,110,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,98,108,97,99,107,41,44,32,48,46,53,32,105,110,32,103,112,105,99,32,40,102,105,108,108,32,48,32,109,101,97,110,115,32,119,104,105,116,101,41,44,32,117,110,100,101,102,105,110,101,100,32,105,110,32,68,87,66,32,50,10,0,0,0,115,101,97,114,99,104,115,105,122,101,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,56,0,0,0,0,0,120,32,101,32,34,47,62,0,110,32,38,38,32,105,32,62,61,32,48,32,38,38,32,105,32,60,32,78,
+79,68,69,67,65,82,68,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,55,0,0,0,0,0,99,111,110,116,97,105,110,95,110,111,100,101,115,32,99,108,117,115,116,32,37,115,32,114,97,110,107,32,37,100,32,109,105,115,115,105,110,103,32,110,111,100,101,10,0,0,0,0,47,77,101,100,105,97,66,111,120,0,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,54,0,0,0,0,0,32,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,91,32,123,67,97,116,97,108,111,103,125,32,60,60,32,47,85,82,73,32,60,60,32,47,66,97,115,101,32,40,37,115,
+41,32,62,62,32,62,62,10,47,80,85,84,32,112,100,102,109,97,114,107,10,0,0,0,71,97,109,109,97,0,0,0,90,97,112,102,67,104,97,110,99,101,114,121,45,77,101,100,105,117,109,73,116,97,108,105,99,0,0,0,0,0,0,0,97,115,115,101,109,98,108,121,0,0,0,0,0,0,0,0,58,32,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,53,0,0,0,0,0,103,114,97,100,105,101,110,116,97,110,103,108,101,0,0,0,104,111,116,112,105,110,107,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,87,73,68,84,72,0,0,0,66,76,0,0,0,0,0,0,99,97,110,
+110,111,116,32,114,101,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,47,112,97,115,116,101,108,50,56,47,52,0,0,0,0,0,98,111,108,100,0,0,0,0,47,112,97,115,116,101,108,50,56,47,51,0,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,118,32,43,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,103,41,91,37,100,93,46,97,118,32,43,32,71,68,95,114,97,110,107,
+40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,112,97,115,116,101,108,50,56,47,50,0,0,0,0,0,47,98,108,117,101,115,56,47,50,0,0,0,0,0,0,0,93,32,32,37,100,32,102,97,108,115,101,32,37,115,10,0,47,112,97,115,116,101,108,50,56,47,49,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,55,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,54,0,0,0,0,0,37,115,32,100,97,115,104,119,105,100,32,105,115,32,48,46,49,32,105,110,32,49,48,116,104,32,69,
+100,105,116,105,111,110,44,32,48,46,48,53,32,105,110,32,68,87,66,32,50,32,97,110,100,32,105,110,32,103,112,105,99,10,0,0,0,47,112,97,115,116,101,108,50,55,47,53,0,0,0,0,0,108,32,0,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,52,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,51,0,0,0,0,0,115,101,116,117,112,76,97,116,105,110,49,10,0,0,0,0,69,117,109,108,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,110,111,118,101,114,104,97,110,103,0,0,0,0,0,0,0,109,101,109,111,114,121,32,97,108,108,111,
+99,97,116,105,111,110,32,102,97,105,108,117,114,101,0,0,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,50,0,0,0,0,0,111,114,100,101,114,105,110,103,0,0,0,0,0,0,0,0,37,108,102,44,37,108,102,0,119,105,100,116,104,0,0,0,104,111,110,101,121,100,101,119,0,0,0,0,0,0,0,0,112,97,100,0,0,0,0,0,47,112,97,115,116,101,108,50,55,47,49,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,54,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,53,0,0,0,0,0,47,98,108,117,101,115,56,47,49,0,0,0,0,0,0,0,117,110,99,108,111,115,101,100,
+32,116,111,107,101,110,0,0,93,32,32,37,100,32,116,114,117,101,32,37,115,10,0,0,47,112,97,115,116,101,108,50,54,47,52,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,51,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,50,0,0,0,0,0,37,115,32,98,111,120,114,97,100,32,105,115,32,110,111,119,32,48,46,48,32,105,110,32,103,112,105,99,44,32,101,108,115,101,32,105,116,32,114,101,109,97,105,110,115,32,50,46,48,10,0,0,0,0,0,0,47,112,97,115,116,101,108,50,54,47,49,0,0,0,0,0,37,46,48,102,32,37,46,48,102,32,0,0,0,0,0,
+0,47,112,97,115,116,101,108,50,53,47,53,0,0,0,0,0,47,112,97,115,116,101,108,50,53,47,52,0,0,0,0,0,37,37,69,110,100,67,111,109,109,101,110,116,115,10,115,97,118,101,10,0,0,0,0,0,69,116,97,0,0,0,0,0,84,105,109,101,115,45,73,116,97,108,105,99,0,0,0,0,105,109,97,112,95,110,112,58,109,97,112,0,0,0,0,0,116,104,114,101,101,112,111,118,101,114,104,97,110,103,0,0,47,112,97,115,116,101,108,50,53,47,51,0,0,0,0,0,114,101,115,111,108,117,116,105,111,110,0,0,0,0,0,0,115,99,97,108,101,32,61,32,40,37,102,44,37,102,
+41,10,0,0,0,0,0,0,0,0,116,97,105,108,95,108,112,0,118,97,108,105,103,110,0,0,103,114,101,121,0,0,0,0,37,108,102,44,37,108,102,0,47,112,97,115,116,101,108,50,53,47,50,0,0,0,0,0,47,112,97,115,116,101,108,50,53,47,49,0,0,0,0,0,47,112,97,115,116,101,108,50,52,47,52,0,0,0,0,0,47,98,108,117,101,115,55,47,55,0,0,0,0,0,0,0,37,103,32,37,103,32,0,0,47,112,97,115,116,101,108,50,52,47,51,0,0,0,0,0,112,110,103,58,102,105,103,0,47,112,97,115,116,101,108,50,52,47,50,0,0,0,0,0,47,112,97,115,116,101,108,50,52,47,
+49,0,0,0,0,0,115,99,97,108,101,61,49,46,48,32,37,115,32,114,101,113,117,105,114,101,100,32,102,111,114,32,99,111,109,112,97,114,105,115,111,110,115,10,0,0,47,112,97,115,116,101,108,50,51,47,51,0,0,0,0,0,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,32,0,0,0,0,0,0,0,0,47,112,97,115,116,101,108,50,51,47,50,0,0,0,0,0,47,112,97,115,116,101,108,50,51,47,49,0,0,0,0,0,9,0,0,0,0,0,0,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,69,112,
+115,105,108,111,110,0,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,0,0,0,102,105,118,101,112,111,118,101,114,104,97,110,103,0,0,0,47,112,97,115,116,101,108,49,57,47,57,0,0,0,0,0,100,112,105,0,0,0,0,0,104,101,97,100,95,108,112,0,116,111,111,108,116,105,112,0,103,114,101,101,110,121,101,108,108,111,119,0,0,0,0,0,109,97,114,103,105,110,0,0,47,112,97,115,116,101,108,49,57,47,56,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,55,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,54,0,0,0,
+0,0,47,98,108,117,101,115,55,47,54,0,0,0,0,0,0,0,91,32,0,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,53,0,0,0,0,0,100,97,116,97,32,101,114,114,111,114,0,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,52,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,51,0,0,0,0,0,98,111,120,114,97,100,61,50,46,48,32,37,115,32,119,105,108,108,32,98,101,32,114,101,115,101,116,32,116,111,32,48,46,48,32,98,121,32,103,112,105,99,32,111,110,108,121,10,0,0,0,0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,50,0,0,0,0,0,34,32,0,
+0,0,0,0,0,47,112,97,115,116,101,108,49,57,47,49,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,56,0,0,0,0,0,100,105,97,109,111,110,100,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,40,97,116,101,110,100,41,10,0,69,103,114,97,118,101,0,0,84,105,109,101,115,0,0,0,114,101,115,116,114,105,99,116,105,111,110,115,105,116,101,0,47,112,97,115,116,101,108,49,56,47,55,0,0,0,0,0,99,111,110,99,101,110,116,114,97,116,101,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,32,105,110,32,112,111,115,
+32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,116,105,116,108,101,0,0,0,103,114,101,101,110,0,0,0,84,104,101,32,99,104,97,114,97,99,116,101,114,32,39,37,99,39,32,97,112,112,101,97,114,115,32,105,110,32,98,111,116,104,32,116,104,101,32,108,97,121,101,114,115,101,112,32,97,110,100,32,108,97,121,101,114,108,105,115,116,115,101,112,32,97,116,116,114,105,98,117,116,101,115,32,45,32,108,97,121,101,114,108,105,115,116,115,101,112,32,105,103,110,111,
+114,101,100,46,10,0,0,0,0,47,112,97,115,116,101,108,49,56,47,54,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,53,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,52,0,0,0,0,0,47,98,108,117,101,115,55,47,53,0,0,0,0,0,0,0,117,115,45,62,110,97,109,101,0,0,0,0,0,0,0,0,102,105,110,100,95,102,97,115,116,95,110,111,100,101,40,103,44,32,110,41,0,0,0,0,47,112,97,115,116,101,108,49,56,47,51,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,50,0,0,0,0,0,47,112,97,115,116,101,108,49,56,47,49,0,0,0,0,0,37,115,32,110,111,
+110,45,102,97,116,97,108,32,114,117,110,45,116,105,109,101,32,112,105,99,32,118,101,114,115,105,111,110,32,100,101,116,101,114,109,105,110,97,116,105,111,110,44,32,118,101,114,115,105,111,110,32,50,10,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,55,0,0,0,0,0,32,102,105,108,108,101,100,61,34,116,114,117,101,34,32,102,105,108,108,99,111,108,111,114,61,34,0,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,54,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,53,0,0,0,0,0,37,37,80,97,103,101,115,58,32,49,10,0,
+0,0,0,0,69,99,105,114,99,0,0,0,84,105,109,101,115,45,66,111,108,100,0,0,0,0,0,0,112,114,105,109,101,114,115,105,116,101,0,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,52,0,0,0,0,0,99,108,117,115,116,101,114,114,97,110,107,0,0,0,0,0,10,0,0,0,0,0,0,0,37,108,102,44,37,108,102,37,110,0,0,0,0,0,0,0,116,97,114,103,101,116,0,0,103,114,97,121,0,0,0,0,44,0,0,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,51,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,50,0,0,0,0,0,47,112,97,115,116,101,108,49,55,47,49,0,0,0,
+0,0,47,98,108,117,101,115,55,47,52,0,0,0,0,0,0,0,117,115,0,0,0,0,0,0,115,105,122,101,61,61,102,114,101,101,100,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,54,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,53,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,52,0,0,0,0,0,37,115,32,100,111,110,39,116,32,99,104,97,110,103,101,32,97,110,121,116,104,105,110,103,32,98,101,108,111,119,32,116,104,105,115,32,108,105,110,101,32,105,110,32,116,104,105,115,32,100,114,97,119,105,110,103,10,0,0,0,0,0,0,0,65,103,110,
+111,100,101,105,110,102,111,95,116,0,0,0,0,47,112,97,115,116,101,108,49,54,47,51,0,0,0,0,0,34,0,0,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,50,0,0,0,0,0,47,112,97,115,116,101,108,49,54,47,49,0,0,0,0,0,37,37,80,97,103,101,115,58,32,40,97,116,101,110,100,41,10,0,0,0,0,0,0,0,69,97,99,117,116,101,0,0,103,114,101,101,110,0,0,0,102,97,110,116,97,115,121,0,112,114,111,116,101,105,110,115,116,97,98,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,53,0,0,0,0,0,108,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,
+112,111,115,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,32,100,111,101,115,110,39,116,32,104,97,118,101,32,51,110,43,49,32,112,111,105,110,116,115,10,0,0,0,0,0,0,0,0,115,116,121,108,101,0,0,0,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,0,108,97,121,101,114,108,105,115,116,115,101,112,0,0,0,0,47,112,97,115,116,101,108,49,53,47,52,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,51,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,50,0,0,0,0,0,47,98,108,
+117,101,115,55,47,51,0,0,0,0,0,0,0,103,118,108,111,97,100,105,109,97,103,101,95,99,111,114,101,46,99,0,0,0,0,0,0,47,112,97,115,116,101,108,49,53,47,49,0,0,0,0,0,47,112,97,115,116,101,108,49,52,47,52,0,0,0,0,0,38,113,117,111,116,59,0,0,47,112,97,115,116,101,108,49,52,47,51,0,0,0,0,0,46,110,114,32,83,70,32,37,46,48,102,10,115,99,97,108,101,116,104,105,99,107,110,101,115,115,32,61,32,37,46,48,102,10,0,0,0,0,0,0,47,112,97,115,116,101,108,49,52,47,50,0,0,0,0,0,114,97,110,107,0,0,0,0,47,112,97,115,116,
+101,108,49,52,47,49,0,0,0,0,0,85,112,0,0,0,0,0,0,47,112,97,115,116,101,108,49,51,47,51,0,0,0,0,0,32,45,102,105,108,108,32,0,37,37,37,37,84,105,116,108,101,58,32,37,115,10,0,0,69,84,72,0,0,0,0,0,83,121,109,98,111,108,0,0,111,98,106,112,45,62,108,98,108,0,0,0,0,0,0,0,112,114,111,116,101,97,115,101,115,105,116,101,0,0,0,0,47,112,97,115,116,101,108,49,51,47,50,0,0,0,0,0,111,114,105,101,110,116,97,116,105,111,110,0,0,0,0,0,32,101,44,37,108,102,44,37,108,102,37,110,0,0,0,0,114,111,119,115,112,97,110,0,
+103,111,108,100,0,0,0,0,58,9,32,0,0,0,0,0,47,112,97,115,116,101,108,49,51,47,49,0,0,0,0,0,47,112,97,105,114,101,100,57,47,57,0,0,0,0,0,0,116,114,105,101,115,32,61,32,37,100,44,32,109,111,100,101,32,61,32,37,115,10,0,0,47,112,97,105,114,101,100,57,47,56,0,0,0,0,0,0,47,98,108,117,101,115,55,47,50,0,0,0,0,0,0,0,106,111,98,0,0,0,0,0,47,112,97,105,114,101,100,57,47,55,0,0,0,0,0,0,27,0,0,0,0,0,0,0,111,115,97,103,101,0,0,0,47,112,97,105,114,101,100,57,47,54,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,53,
+0,0,0,0,0,0,37,115,32,116,111,32,99,104,97,110,103,101,32,100,114,97,119,105,110,103,32,115,105,122,101,44,32,109,117,108,116,105,112,108,121,32,116,104,101,32,119,105,100,116,104,32,97,110,100,32,104,101,105,103,104,116,32,111,110,32,116,104,101,32,46,80,83,32,108,105,110,101,32,97,98,111,118,101,32,97,110,100,32,116,104,101,32,110,117,109,98,101,114,32,111,110,32,116,104,101,32,116,119,111,32,108,105,110,101,115,32,98,101,108,111,119,32,40,114,111,117,110,100,101,100,32,116,111,32,116,104,101,32,
+110,101,97,114,101,115,116,32,105,110,116,101,103,101,114,41,32,98,121,32,97,32,115,99,97,108,101,32,102,97,99,116,111,114,10,0,0,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,52,0,0,0,0,0,0,103,118,58,100,111,116,0,0,99,32,0,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,57,47,50,0,0,0,0,0,0,80,97,116,104,32,112,114,111,118,105,100,101,100,32,116,111,32,102,105,108,101,58,32,34,37,115,34,
+32,104,97,115,32,98,101,101,110,32,105,103,110,111,114,101,100,32,98,101,99,97,117,115,101,32,102,105,108,101,115,32,97,114,101,32,111,110,108,121,32,112,101,114,109,105,116,116,101,100,32,116,111,32,98,101,32,108,111,97,100,101,100,32,102,114,111,109,32,116,104,101,32,100,105,114,101,99,116,111,114,105,101,115,32,105,110,32,34,37,115,34,32,119,104,101,110,32,114,117,110,110,105,110,103,32,105,110,32,97,110,32,104,116,116,112,32,115,101,114,118,101,114,46,10,0,0,0,0,0,0,0,0,37,100,32,37,100,32,115,
+101,116,108,97,121,101,114,10,0,68,101,108,116,97,0,0,0,108,111,97,100,105,109,97,103,101,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,82,111,109,97,110,0,0,100,101,102,108,97,116,105,111,110,32,112,114,111,98,108,101,109,32,37,100,10,0,0,0,114,110,97,115,116,97,98,0,99,111,117,114,0,0,0,0,47,112,97,105,114,101,100,57,47,49,0,0,0,0,0,0,114,111,116,97,116,101,0,0,115,44,37,108,102,44,37,108,102,37,110,0,0,0,0,0,112,111,114,116,0,0,0,0,103,104,111,115,116,119,104,105,116,101,0,0,0,0,0,0,108,97,121,
+101,114,115,101,112,0,0,0,0,0,0,0,0,100,111,116,105,110,105,116,46,99,0,0,0,0,0,0,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,40,42,110,41,45,62,108,101,118,101,108,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,56,0,0,0,0,0,0,99,117,115,116,111,109,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,101,100,103,101,32,105,115,32,97,32,108,111,111,112,32,97,116,32,37,115,10,0,0,99,97,110,39,116,
+32,111,112,101,110,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,0,0,0,0,37,100,32,111,117,116,32,111,102,32,37,100,32,101,120,116,101,114,105,111,114,32,108,97,98,101,108,115,32,112,111,115,105,116,105,111,110,101,100,46,10,0,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,55,0,0,0,0,0,0,117,112,100,97,116,101,58,32,109,105,115,109,97,116,99,104,101,100,32,108,99,97,32,105,110,32,116,114,101,101,117,112,100,97,116,101,115,10,0,0,107,105,110,100,32,61,61,32,76,84,95,78,79,78,69,0,83,
+101,116,116,105,110,103,32,105,110,105,116,105,97,108,32,112,111,115,105],"i8",L,l.J+92196);D([116,105,111,110,115,10,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,54,0,0,0,0,0,0,47,98,108,117,101,115,55,47,49,0,0,0,0,0,0,0,97,103,97,112,112,108,121,58,32,117,110,107,110,111,119,110,32,111,98,106,101,99,116,32,116,121,112,101,32,37,100,10,0,0,0,0,0,0,0,0,32,47,62,10,0,0,0,0,97,115,112,101,99,116,0,0,47,112,97,105,114,101,100,56,47,53,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,
+114,116,101,115,116,32,112,97,116,104,115,0,0,0,0,0,0,115,111,114,116,118,0,0,0,37,102,32,45,32,37,102,32,37,102,32,37,102,32,37,102,32,61,32,37,102,32,40,37,102,32,37,102,32,37,102,32,37,102,41,10,0,0,0,0,114,111,119,103,0,0,0,0,109,101,109,111,114,121,32,101,120,104,97,117,115,116,101,100,0,0,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,52,0,0,0,0,0,0,114,97,110,107,115,101,112,0,47,112,97,105,114,101,100,56,47,51,0,0,0,0,0,0,85,110,99,108,111,115,101,100,32,99,111,109,109,101,110,116,10,0,0,0,0,
+0,0,0,47,97,99,99,101,110,116,52,47,49,0,0,0,0,0,0,46,80,83,32,37,46,53,102,32,37,46,53,102,10,0,0,114,111,111,116,32,61,32,37,115,10,0,0,0,0,0,0,47,112,97,105,114,101,100,56,47,50,0,0,0,0,0,0,98,101,122,45,62,115,102,108,97,103,0,0,0,0,0,0,37,115,37,46,48,102,44,37,46,48,102,32,0,0,0,0,101,109,105,116,46,99,0,0,47,112,97,105,114,101,100,56,47,49,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,55,0,0,0,0,0,0,91,32,47,67,114,111,112,66,111,120,32,91,37,100,32,37,100,32,37,100,32,37,100,93,32,47,80,65,
+71,69,83,32,112,100,102,109,97,114,107,10,0,0,0,0,0,0,0,0,68,97,103,103,101,114,0,0,100,101,118,105,99,101,0,0,80,97,108,97,116,105,110,111,45,73,116,97,108,105,99,0,114,105,98,111,115,105,116,101,0,0,0,0,0,0,0,0,82,79,85,78,68,40,71,68,95,98,98,40,103,41,46,76,76,46,121,41,32,61,61,32,48,0,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,54,0,0,0,0,0,0,99,101,110,116,101,114,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,105,100,0,0,0,0,0,0,103,97,105,110,115,98,111,114,111,0,0,0,0,0,0,0,97,
+108,108,0,0,0,0,0,97,113,117,97,0,0,0,0,47,112,97,105,114,101,100,55,47,53,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,52,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,51,0,0,0,0,0,0,47,98,108,117,101,115,54,47,54,0,0,0,0,0,0,0,60,118,58,105,109,97,103,101,32,115,114,99,61,34,37,115,34,32,115,116,121,108,101,61,34,32,112,111,115,105,116,105,111,110,58,97,98,115,111,108,117,116,101,59,32,119,105,100,116,104,58,37,46,50,102,59,32,104,101,105,103,104,116,58,37,46,50,102,59,32,108,101,102,116,58,37,46,
+50,102,32,59,32,116,111,112,58,37,46,50,102,34,0,0,0,0,0,47,112,97,105,114,101,100,55,47,50,0,0,0,0,0,0,59,10,0,0,0,0,0,0,108,112,0,0,0,0,0,0,47,112,97,105,114,101,100,55,47,49,0,0,0,0,0,0,108,97,121,111,117,116,32,37,115,10,0,0,0,0,0,0,47,112,97,105,114,101,100,54,47,54,0,0,0,0,0,0,114,111,116,97,116,105,111,110,0,0,0,0,0,0,0,0,108,101,118,101,108,32,103,114,97,112,104,32,114,101,99,0,47,112,97,105,114,101,100,54,47,53,0,0,0,0,0,0,109,32,0,0,0,0,0,0,47,112,97,105,114,101,100,54,47,52,0,0,0,0,0,0,
+110,101,119,0,0,0,0,0,110,101,120,116,35,105,116,101,114,61,37,100,10,0,0,0,47,112,97,105,114,101,100,54,47,51,0,0,0,0,0,0,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,32,97,115,32,97,32,102,105,108,101,32,111,114,32,97,115,32,97,32,115,104,97,112,101,32,108,105,98,114,97,114,121,32,109,101,109,98,101,114,10,0,0,0,0,0,0,32,0,0,0,0,0,0,0,99,97,110,118,97,115,32,115,105,122,101,32,40,37,100,44,37,100,41,32,101,120,99,101,101,100,115,32,80,68,70,32,108,105,109,105,116,32,40,37,100,
+41,10,9,40,115,117,103,103,101,115,116,32,115,101,116,116,105,110,103,32,97,32,98,111,117,110,100,105,110,103,32,98,111,120,32,115,105,122,101,44,32,115,101,101,32,100,111,116,40,49,41,41,10,0,0,67,104,105,0,0,0,0,0,116,101,120,116,108,97,121,111,117,116,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,105,110,115,117,108,97,116,111,114,0,0,0,0,0,0,0,47,112,97,105,114,101,100,54,47,50,0,0,0,0,0,0,112,97,103,101,0,0,0,0,104,114,101,102,0,0,0,0,99,111,109,112,
+114,101,115,115,32,37,103,32,10,0,0,0,102,117,99,104,115,105,97,0,84,104,101,32,108,97,121,101,114,115,101,108,101,99,116,32,97,116,116,114,105,98,117,116,101,32,34,37,115,34,32,100,111,101,115,32,110,111,116,32,109,97,116,99,104,32,97,110,121,32,108,97,121,101,114,32,115,112,101,99,105,102,101,100,32,98,121,32,116,104,101,32,108,97,121,101,114,115,32,97,116,116,114,105,98,117,116,101,32,45,32,105,103,110,111,114,101,100,46,10,0,0,0,0,112,105,110,0,0,0,0,0,47,112,97,105,114,101,100,54,47,49,0,0,0,
+0,0,0,105,110,118,105,115,105,98,108,101,0,0,0,0,0,0,0,99,108,117,115,116,101,114,0,47,112,97,105,114,101,100,53,47,53,0,0,0,0,0,0,37,108,102,44,37,108,102,37,99,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,37,100,58,32,114,97,110,107,32,37,100,32,110,111,116,32,105,110,32,114,97,110,107,32,114,97,110,103,101,32,91,37,100,44,37,100,93,10,0,0,0,0,47,112,97,105,114,101,100,53,47,52,0,0,0,0,0,0,47,98,108,117,101,115,54,47,53,0,0,0,0,
+0,0,0,36,99,32,99,114,101,97,116,101,32,105,109,97,103,101,32,37,46,50,102,32,37,46,50,102,32,45,105,109,97,103,101,32,34,112,104,111,116,111,95,37,115,34,10,0,0,0,0,47,112,97,105,114,101,100,53,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,53,47,50,0,0,0,0,0,0,47,112,97,105,114,101,100,53,47,49,0,0,0,0,0,0,93,10,46,80,69,10,0,0,47,112,97,105,114,101,100,52,47,52,0,0,0,0,0,0,47,62,60,47,118,58,115,104,97,112,101,62,10,0,0,0,47,112,97,105,114,101,100,52,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,52,
+47,50,0,0,0,0,0,0,37,103,32,37,103,32,115,101,116,95,115,99,97,108,101,32,37,100,32,114,111,116,97,116,101,32,37,103,32,37,103,32,116,114,97,110,115,108,97,116,101,10,0,0,0,0,0,0,67,99,101,100,105,108,0,0,108,97,121,111,117,116,0,0,80,97,108,97,116,105,110,111,32,76,105,110,111,116,121,112,101,0,0,0,0,0,0,0,117,116,114,0,0,0,0,0,47,112,97,105,114,101,100,52,47,49,0,0,0,0,0,0,115,105,122,101,0,0,0,0,104,101,105,103,104,116,0,0,99,111,110,106,117,103,97,116,101,95,103,114,97,100,105,101,110,116,58,
+32,117,110,101,120,112,101,99,116,101,100,32,108,101,110,103,116,104,32,48,32,118,101,99,116,111,114,10,0,102,111,114,101,115,116,103,114,101,101,110,0,0,0,0,0,108,97,121,101,114,115,101,108,101,99,116,0,0,0,0,0,112,111,115,0,0,0,0,0,47,112,97,105,114,101,100,51,47,51,0,0,0,0,0,0,47,112,97,105,114,101,100,51,47,50,0,0,0,0,0,0,47,112,97,105,114,101,100,51,47,49,0,0,0,0,0,0,47,98,108,117,101,115,54,47,52,0,0,0,0,0,0,0,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,32,40,105,110,118,97,108,
+105,100,32,116,111,107,101,110,41,0,105,109,97,103,101,32,99,114,101,97,116,101,32,112,104,111,116,111,32,34,112,104,111,116,111,95,37,115,34,32,45,102,105,108,101,32,34,37,115,34,10,0,0,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,57,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,56,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,55,0,0,0,0,0,90,97,112,102,68,105,110,103,98,97,116,115,0,0,0,0,47,112,97,105,114,101,100,49,50,47,54,0,0,0,0,0,60,118,58,112,97,116,104,32,32,118,61,34,0,0,0,0,47,112,97,105,
+114,101,100,49,50,47,53,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,52,0,0,0,0,0,103,115,97,118,101,10,37,100,32,37,100,32,37,100,32,37,100,32,98,111,120,112,114,105,109,32,99,108,105,112,32,110,101,119,112,97,116,104,10,0,66,101,116,97,0,0,0,0,114,101,110,100,101,114,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,0,0,0,116,101,114,109,105,110,97,116,111,114,0,0,0,0,0,0,112,105,110,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,51,0,0,0,0,0,102,111,110,116,110,97,109,101,115,0,0,0,0,0,0,0,103,
+114,97,100,105,101,110,116,97,110,103,108,101,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,99,105,114,99,117,105,116,32,109,111,100,101,108,0,0,0,0,0,0,0,98,108,111,99,107,116,114,101,101,46,99,0,0,0,0,0,102,108,111,114,97,108,119,104,105,116,101,0,0,0,0,0,108,97,121,101,114,115,0,0,99,109,97,112,120,58,109,97,112,0,0,0,0,0,0,0,100,105,109,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,50,0,0,0,0,0,47,112,97,105,114,101,100,49,50,47,49,50,0,0,0,0,47,112,97,105,114,101,100,49,50,47,49,49,0,0,0,0,
+47,98,108,117,101,115,54,47,51,0,0,0,0,0,0,0,103,105,102,58,116,107,0,0,47,112,97,105,114,101,100,49,50,47,49,48,0,0,0,0,106,112,103,58,115,118,103,0,47,112,97,105,114,101,100,49,50,47,49,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,57,0,0,0,0,0,83,121,109,98,111,108,0,0,47,112,97,105,114,101,100,49,49,47,56,0,0,0,0,0,32,62,0,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,55,0,0,0,0,0,47,98,108,117,101,115,54,47,50,0,0,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,54,0,0,0,0,0,37,100,32,37,100,32,37,
+100,32,98,101,103,105,110,112,97,103,101,10,0,0,0,0,0,65,117,109,108,0,0,0,0,114,111,109,97,110,0,0,0,99,100,115,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,53,0,0,0,0,0,97,114,114,97,121,0,0,0,115,104,111,119,98,111,120,101,115,0,0,0,0,0,0,0,37,108,102,44,37,108,102,0,102,105,120,101,100,115,105,122,101,0,0,0,0,0,0,0,110,111,114,109,97,108,105,122,101,0,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,0,0,0,0,0,0,0,100,103,101,115,102,105,114,115,116,0,0,0,0,0,0,0,100,105,109,101,110,0,0,0,47,112,
+97,105,114,101,100,49,49,47,52,0,0,0,0,0,105,99,111,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,51,0,0,0,0,0,47,112,97,105,114,101,100,49,49,47,50,0,0,0,0,0,98,111,120,0,0,0,0,0,106,112,103,58,118,109,108,0,47,112,97,105,114,101,100,49,49,47,49,49,0,0,0,0,47,112,97,105,114,101,100,49,49,47,49,48,0,0,0,0,115,116,114,101,97,109,32,101,114,114,111,114,0,0,0,0,47,112,97,105,114,101,100,49,49,47,49,0,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,57,0,0,0,
+0,0,32,119,105,100,116,104,58,32,37,100,59,32,104,101,105,103,104,116,58,32,37,100,34,0,47,112,97,105,114,101,100,49,48,47,56,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,55,0,0,0,0,0,60,60,32,47,80,97,103,101,83,105,122,101,32,91,37,100,32,37,100,93,32,62,62,32,115,101,116,112,97,103,101,100,101,118,105,99,101,10,0,0,65,116,105,108,100,101,0,0,38,97,109,112,59,0,0,0,0,0,1,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,82,111,109,97,110,0,0,112,114,111,109,111,116,101,114,
+0,0,0,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,54,0,0,0,0,0,101,113,117,97,108,108,121,0,99,111,108,115,112,97,110,0,112,114,105,115,109,0,0,0,100,111,100,103,101,114,98,108,117,101,0,0,0,0,0,0,111,100,101,115,102,105,114,115,116,0,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,47,112,97,105,114,101,100,49,
+48,47,53,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,52,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,51,0,0,0,0,0,65,114,114,111,119,32,116,121,112,101,32,34,37,115,34,32,117,110,107,110,111,119,110,32,45,32,105,103,110,111,114,105,110,103,10,0,0,0,0,0,47,98,108,117,101,115,54,47,49,0,0,0,0,0,0,0,106,112,101,58,118,109,108,0,47,112,97,105,114,101,100,49,48,47,50,0,0,0,0,0,78,68,95,110,101,120,116,40,118,41,32,61,61,32,78,85,76,76,0,0,0,0,0,0,47,112,97,105,114,101,100,49,48,47,49,48,0,0,0,0,47,112,
+97,105,114,101,100,49,48,47,49,0,0,0,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,47,111,114,114,100,57,47,57,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,118,109,108,46,99,0,0,0,0,0,47,111,114,114,100,57,47,56,0,0,0,0,0,0,0,0,47,111,114,114,100,57,47,55,0,0,0,0,0,0,0,0,80,111,114,116,114,97,105,116,0,0,0,0,0,0,0,0,65,114,105,110,103,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,73,116,97,108,105,99,0,77,99,105,114,
+99,108,101,0,47,111,114,114,100,57,47,54,0,0,0,0,0,0,0,0,114,97,110,107,115,101,112,0,95,37,100,0,0,0,0,0,99,101,108,108,115,112,97,99,105,110,103,0,0,0,0,0,121,120,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,32,37,100,32,37,100,0,0,100,105,109,103,114,101,121,0,111,117,116,112,117,116,111,114,100,101,114,0,0,0,0,0,109,97,106,111,114,0,0,0,47,111,114,114,100,57,47,53,0,0,0,0,0,0,0,0,114,105,102,102,0,0,0,0,47,111,
+114,114,100,57,47,52,0,0,0,0,0,0,0,0,47,111,114,114,100,57,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,53,0,0,0,0,0,0,0,106,112,101,103,58,118,109,108,0,0,0,0,0,0,0,0,47,111,114,114,100,57,47,50,0,0,0,0,0,0,0,0,118,112,0,0,0,0,0,0,47,111,114,114,100,57,47,49,0,0,0,0,0,0,0,0,47,111,114,114,100,56,47,56,0,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,73,116,97,108,105,99,0,47,111,114,114,100,56,47,55,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,48,0,0,0,0,0,0,0,47,111,
+114,114,100,56,47,54,0,0,0,0,0,0,0,0,47,111,114,114,100,56,47,53,0,0,0,0,0,0,0,0,76,97,110,100,115,99,97,112,101,0,0,0,0,0,0,0,65,108,112,104,97,0,0,0,82,73,70,70,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,77,115,113,117,97,114,101,0,47,111,114,114,100,56,47,52,0,0,0,0,0,0,0,0,110,111,100,101,115,101,112,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,99,101,108,108,112,97,100,100,105,110,103,0,0,0,0,0,112,111,114,116,
+104,111,121,120,0,0,0,0,0,0,0,0,100,105,109,103,114,97,121,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,0,0,0,0,0,99,121,97,110,0,0,0,0,75,75,0,0,0,0,0,0,47,111,114,114,100,56,47,51,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,52,0,0,0,0,0,0,0,47,111,114,114,100,56,47,50,0,0,0,0,0,0,0,0,47,111,114,114,100,56,47,49,0,0,0,0,0,0,0,0,103,105,102,58,118,109,108,0,47,111,114,114,100,55,47,55,0,0,0,0,0,0,0,0,47,111,114,114,100,55,47,54,0,0,0,0,0,0,0,0,38,35,49,54,48,59,0,0,47,111,
+114,114,100,55,47,53,0,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,66,111,108,100,0,0,0,113,0,0,0,0,0,0,0,47,111,114,114,100,55,47,52,0,0,0,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,47,111,114,114,100,55,47,51,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,111,114,114,100,55,47,50,0,0,0,0,0,0,0,0,32,99,114,101,97,116,101,32,108,105,110,101,32,0,0,0,102,105,103,0,0,0,0,0,65,103,114,97,118,101,0,0,67,101,110,116,117,114,121,32,83,99,104,111,111,108,98,111,
+111,107,32,76,0,0,0,0,75,80,95,82,105,103,104,116,0,0,0,0,0,0,0,0,77,100,105,97,109,111,110,100,0,0,0,0,0,0,0,0,47,111,114,114,100,55,47,49,0,0,0,0,0,0,0,0,82,76,0,0,0,0,0,0,100,111,116,116,101,100,0,0,98,111,114,100,101,114,0,0,120,121,32,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,0,97,99,116,117,97,108,0,0,100,101,101,112,115,107,121,98,108,117,101,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,44,37,91,94,44,93,
+37,115,0,0,0,0,0,109,111,100,101,0,0,0,0,47,111,114,114,100,54,47,54,0,0,0,0,0,0,0,0,120,109,108,0,0,0,0,0,37,37,37,37,80,97,103,101,79,114,105,101,110,116,97,116,105,111,110,58,32,37,115,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,51,0,0,0,0,0,0,0,47,111,114,114,100,54,47,53,0,0,0,0,0,0,0,0,47,111,114,114,100,54,47,52,0,0,0,0,0,0,0,0,57,58,112,114,105,115,109,0,112,110,103,58,118,109,108,0,47,111,114,114,100,54,47,51,0,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,112,97,116,99,104,119,111,114,107,0,0,0,0,0,
+0,0,47,111,114,114,100,54,47,50,0,0,0,0,0,0,0,0,47,111,114,114,100,54,47,49,0,0,0,0,0,0,0,0,80,97,108,97,116,105,110,111,45,82,111,109,97,110,0,0,47,111,114,114,100,53,47,53,0,0,0,0,0,0,0,0,100,111,116,58,100,111,116,0,110,111,110,101,0,0,0,0,99,97,110,110,111,116,32,102,105,110,100,32,116,114,105,97,110,103,108,101,32,112,97,116,104,0,0,0,0,0,0,0,47,111,114,114,100,53,47,52,0,0,0,0,0,0,0,0,47,111,114,114,100,53,47,51,0,0,0,0,0,0,0,0,102,105,108,101,32,108,111,97,100,105,110,103,32,105,115,32,100,
+105,115,97,98,108,101,100,32,98,101,99,97,117,115,101,32,116,104,101,32,101,110,118,105,114,111,110,109,101,110,116,32,99,111,110,116,97,105,110,115,32,83,69,82,86,69,82,95,78,65,77,69,61,34,37,115,34,10,97,110,100,32,116,104,101,32,71,86,95,70,73,76,69,95,80,65,84,72,32,118,97,114,105,97,98,108,101,32,105,115,32,117,110,115,101,116,32,111,114,32,101,109,112,116,121,46,10,0,0,0,0,37,46,48,50,102,0,0,0,65,99,105,114,99,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,
+100,0,0,0,114,32,38,38,32,115,0,0,117,110,100,101,114,108,105,110,101,0,0,0,0,0,0,0,102,111,110,116,110,97,109,101,58,32,117,110,97,98,108,101,32,116,111,32,114,101,115,111,108,118,101,32,34,37,115,34,10,0,0,0,0,0,0,0,47,111,114,114,100,53,47,50,0,0,0,0,0,0,0,0,66,84,0,0,0,0,0,0,70,65,76,83,69,0,0,0,100,97,115,104,101,100,0,0,98,103,99,111,108,111,114,0,112,111,114,116,104,111,120,121,0,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,0,0,0,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,44,39,37,91,
+94,39,93,39,0,0,0,0,0,109,101,109,111,114,121,32,97,108,108,111,99,97,116,105,111,110,32,102,97,105,108,117,114,101,10,0,0,0,0,0,0,85,110,107,110,111,119,110,32,118,97,108,117,101,32,37,115,32,102,111,114,32,97,116,116,114,105,98,117,116,101,32,34,109,111,100,101,108,34,32,105,110,32,103,114,97,112,104,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,0,0,114,32,38,38,32,110,0,0,47,111,114,114,100,53,47,49,0,0,0,0,0,0,0,0,60,63,120,109,108,0,0,0,37,37,37,37,80,97,103,101,66,111,117,110,100,105,
+110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,0,0,101,112,115,102,0,0,0,0,99,111,109,112,46,99,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,105,108,108,101,103,97,108,32,118,97,108,117,101,115,32,111,102,32,112,114,101,118,32,37,100,32,97,110,100,32,110,101,120,116,32,37,100,44,32,108,105,110,101,32,37,100,10,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,118,32,61,61,32,110,0,0,37,100,32,111,117,116,32,111,102,32,37,100,32,108,97,98,101,108,115,32,112,111,
+115,105,116,105,111,110,101,100,46,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,53,47,50,0,0,0,0,0,0,0,47,111,114,114,100,52,47,52,0,0,0,0,0,0,0,0,98,108,97,99,107,0,0,0,115,101,97,114,99,104,115,105,122,101,0,0,0,0,0,0,116,107,0,0,0,0,0,0,45,45,0,0,0,0,0,0,47,111,114,114,100,52,47,51,0,0,0,0,0,0,0,0,100,101,102,97,117,108,116,100,105,115,116,0,0,0,0,0,58,32,0,0,0,0,0,0,115,111,114,116,118,0,0,0,115,118,103,58,115,118,103,0,47,111,114,114,100,52,47,50,0,0,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,
+103,32,77,68,83,32,109,111,100,101,108,0,0,0,108,97,121,111,117,116,32,37,115,10,0,0,0,0,0,0,114,101,99,32,37,102,32,37,102,32,37,102,32,37,102,10,0,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,114,111,111,116,0,0,0,0,47,111,114,114,100,52,47,49,0,0,0,0,0,0,0,0,76,97,98,101,108,32,99,108,111,115,101,100,32,98,101,102,111,114,101,32,101,110,100,32,111,102,32,72,84,77,76,32,101,108,101,109,101,110,116,10,0,0,0,0,0,0,0,0,47,111,114,114,100,51,47,51,0,0,0,0,0,0,0,0,111,118,101,
+114,108,97,112,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,111,114,114,100,51,47,50,0,0,0,0,0,0,0,0,99,111,110,99,46,99,0,0,47,97,99,99,101,110,116,51,47,51,0,0,0,0,0,0,115,97,109,112,108,101,112,111,105,110,116,115,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,101,41,32,61,61,32,78,85,76,76,0,0,0,34,32,47,62,0,0,0,0,47,111,114,114,100,51,47,49,0,0,0,0,0,0,0,0,111,98,106,0,0,
+0,0,0,47,111,114,97,110,103,101,115,57,47,57,0,0,0,0,0,120,100,111,116,32,118,101,114,115,105,111,110,32,34,37,115,34,32,116,111,111,32,108,111,110,103,0,0,0,0,0,0,65,97,99,117,116,101,0,0,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,110,0,0,0,0,0,0,0,105,110,118,104,111,117,115,101,0,0,0,0,0,0,0,0,110,101,97,116,111,115,112,108,105,110,101,115,46,99,0,0,47,111,114,97,110,103,101,115,57,47,56,0,0,0,0,0,76,82,0,0,0,0,0,0,50,48,0,0,0,0,0,0,98,97,108,105,103,110,0,0,112,
+111,114,116,104,111,95,121,120,0,0,0,0,0,0,0,100,97,114,107,118,105,111,108,101,116,0,0,0,0,0,0,118,105,101,119,112,111,114,116,0,0,0,0,0,0,0,0,105,115,32,105,110,97,112,112,114,111,112,114,105,97,116,101,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,0,0,0,0,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,47,111,114,97,110,103,101,115,57,47,55,0,0,0,0,0,101,112,115,0,0,0,0,0,37,37,
+37,37,80,97,103,101,58,32,37,100,32,37,100,10,0,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,98,108,117,101,115,53,47,49,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,54,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,116,97,105,108,32,105,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,53,0,0,0,0,0,115,118,103,58,120,100,111,116,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,
+52,0,0,0,0,0,32,45,45,32,0,0,0,0,47,111,114,97,110,103,101,115,57,47,51,0,0,0,0,0,110,111,100,101,32,37,115,44,32,112,111,115,105,116,105,111,110,32,37,115,44,32,101,120,112,101,99,116,101,100,32,116,119,111,32,100,111,117,98,108,101,115,10,0,0,0,0,0,47,111,114,97,110,103,101,115,57,47,50,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,82,111,109,97,110,0,0,115,112,108,105,110,101,115,32,97,110,100,32,99,108,117,115,116,101,114,32,101,100,103,101,115,32,110,111,116,32,115,
+117,112,112,111,114,116,101,100,32,45,32,117,115,105,110,103,32,108,105,110,101,32,115,101,103,109,101,110,116,115,10,0,0,114,111,111,116,0,0,0,0,47,111,114,97,110,103,101,115,57,47,49,0,0,0,0,0,108,101,118,101,108,32,97,115,115,105,103,110,109,101,110,116,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,111,116,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,56,0,0,0,0,0,98,98,0,0,0,0,0,0,71,111,105,110,103,32,116,111,32,97,112,112,108,121,
+32,97,110,111,116,104,101,114,32,101,120,112,97,110,115,105,111,110,46,10,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,55,0,0,0,0,0,37,115,32,119,104,105,108,101,32,111,112,101,110,105,110,103,32,37,115,10,0,0,0,0,91,32,0,0,0,0,0,0,95,116,108,100,114,97,119,95,0,0,0,0,0,0,0,0,65,69,108,105,103,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,0,105,32,60,32,78,79,68,69,67,65,82,68,0,0,0,0,105,110,118,116,114,97,112,101,122,105,117,109,0,
+0,0,0,47,111,114,97,110,103,101,115,56,47,54,0,0,0,0,0,114,97,110,107,100,105,114,0,49,57,0,0,0,0,0,0,60,84,68,62,0,0,0,0,112,115,101,117,100,111,45,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,100,97,114,107,116,117,114,113,117,111,105,115,101,0,0,0,112,97,103,101,100,105,114,61,37,115,32,105,103,110,111,114,101,100,10,0,0,0,0,0,101,100,103,101,115,32,105,110,32,103,114,97,112,104,32,37,115,32,104,97,118,101,32,110,111,32,108,101,110,32,97,116,116,114,
+105,98,117,116,101,46,32,72,101,110,99,101,44,32,116,104,101,32,109,100,115,32,109,111,100,101,108,10,0,0,47,111,114,97,110,103,101,115,56,47,53,0,0,0,0,0,197,208,211,198,0,0,0,0,37,37,37,37,69,110,100,80,97,103,101,58,32,37,100,10,0,0,0,0,0,0,0,0,105,110,118,105,115,0,0,0,47,98,108,117,101,115,52,47,52,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,52,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,32,108,105,110,101,32,
+37,100,58,32,78,68,95,111,114,100,101,114,40,37,115,41,32,91,37,100,93,32,62,32,71,68,95,114,97,110,107,40,82,111,111,116,41,91,37,100,93,46,97,110,32,91,37,100,93,10,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,51,0,0,0,0,0,112,114,101,102,105,120,32,109,117,115,116,32,110,111,116,32,98,101,32,98,111,117,110,100,32,116,111,32,111,110,101,32,111,102,32,116,104,101,32,114,101,115,101,114,118,101,100,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,115,0,101,112,115,58,120,100,111,116,0,
+0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,50,0,0,0,0,0,47,111,114,97,110,103,101,115,56,47,49,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,55,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,73,116,97,108,105,99,0,47,111,114,97,110,103,101,115,55,47,54,0,0,0,0,0,34,32,100,97,115,104,115,116,121,108,101,61,34,100,97,115,104,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,53,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,52,0,0,0,0,0,95,104,108,100,114,97,119,95,0,0,
+0,0,0,0,0,0,98,122,46,115,105,122,101,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,105,110,118,116,114,105,97,110,103,108,101,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,51,0,0,0,0,0,113,117,97,110,116,117,109,0,49,56,0,0,0,0,0,0,37,115,32,118,97,108,117,101,32,37,115,32,60,32,37,100,32,45,32,116,111,111,32,115,109,97,108,108,32,45,32,105,103,110,111,114,101,100,0,0,112,111,114,116,104,111,0,0,101,100,103,101,32,108,97,98,101,108,
+115,32,119,105,116,104,32,115,112,108,105,110,101,115,61,99,117,114,118,101,100,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,100,111,116,32,45,32,117,115,101,32,120,108,97,98,101,108,115,10,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,101,121,0,0,0,77,111,114,101,32,116,104,97,110,32,50,32,99,111,108,111,114,115,32,115,112,101,99,105,102,105,101,100,32,102,111,114,32,97,32,103,114,97,100,105,101,110,116,32,45,32,105,103,110,111,114,105,110,103,32,114,101,109,97,105,110,
+105,110,103,10,0,0,0,0,0,0,0,109,100,115,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,50,0,0,0,0,0,112,100,102,0,0,0,0,0,37,37,80,97,103,101,84,114,97,105,108,101,114,10,0,0,47,98,108,117,101,115,52,47,51,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,55,47,49,0,0,0,0,0,47,111,114,97,110,103,101,115,54,47,54,0,0,0,0,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,110,115,41,32,109,117,115,116,32,110,111,116,32,98,101,32,100,101,99,108,97,114,101,100,32,111,114,32,117,
+110,100,101,99,108,97,114,101,100,0,0,0,0,0,0,110,111,32,101,108,101,109,101,110,116,32,102,111,117,110,100,0,0,0,0,0,0,0,0,112,115,58,120,100,111,116,0,47,111,114,97,110,103,101,115,54,47,53,0,0,0,0,0,47,111,114,97,110,103,101,115,54,47,52,0,0,0,0,0,47,111,114,97,110,103,101,115,54,47,51,0,0,0,0,0,78,101,119,67,101,110,116,117,114,121,83,99,104,108,98,107,45,66,111,108,100,0,0,0,47,111,114,97,110,103,101,115,54,47,50,0,0,0,0,0,34,32,119,101,105,103,104,116,61,34,37,46,48,102,112,116,0,0,0,0,0,0,
+0,0,47,111,114,97,110,103,101,115,54,47,49,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,53,0,0,0,0,0,95,116,100,114,97,119,95,0,100,101,115,116,105,110,97,116,105,111,110,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,0,0,84,119,111,32,99,108,117,115,116,101,114,115,32,110,97,109,101,100,32,37,115,32,45,32,116,104,101,32,115,101,99,111,110,100,32,119,105,108,108,32,98,101,32,105,103,110,111,114,101,100,10,0,0,0,0,0,72,101,108,118,101,116,105,99,
+97,45,78,97,114,114,111,119,45,66,111,108,100,0,0,0,81,0,0,0,0,0,0,0,116,114,105,112,108,101,111,99,116,97,103,111,110,0,0,0,47,111,114,97,110,103,101,115,53,47,52,0,0,0,0,0,105,109,97,103,101,112,97,116,104,0,0,0,0,0,0,0,49,55,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,37,115,32,118,97,108,117,101,32,37,115,32,62,32,37,100,32,45,32,116,111,111,32,108,97,114,103,101,32,45,32,105,103,110,111,114,101,100,0,0,121,120,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,
+116,114,97,105,110,116,115,0,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,0,0,0,114,101,110,100,101,114,101,114,32,102,111,114,32,37,115,32,105,115,32,117,110,97,118,97,105,108,97,98,108,101,10,0,115,104,111,114,116,112,97,116,104,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,51,0,0,0,0,0,37,80,68,70,45,0,0,0,101,110,100,112,97,103,101,10,115,104,111,119,112,97,103,101,10,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,105,109,97,112,58,109,97,112,0,0,0,0,0,0,0,0,47,98,108,117,
+101,115,52,47,50,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,50,0,0,0,0,0,47,111,114,97,110,103,101,115,53,47,49,0,0,0,0,0,114,101,115,101,114,118,101,100,32,112,114,101,102,105,120,32,40,120,109,108,41,32,109,117,115,116,32,110,111,116,32,98,101,32,117,110,100,101,99,108,97,114,101,100,32,111,114,32,98,111,117,110,100,32,116,111,32,97,110,111,116,104,101,114,32,110,97,109,101,115,112,97,99,101,32,110,97,109,101,0,106,112,103,58,120,100,111,116,0,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,
+52,47,52,0,0,0,0,0,106,112,101,58,115,118,103,0,47,111,114,97,110,103,101,115,52,47,51,0,0,0,0,0,47,111,114,97,110,103,101,115,52,47,50,0,0,0,0,0,66,111,111,107,109,97,110,45,68,101,109,105,73,116,97,108,105,99,0,0,0,0,0,0,47,111,114,97,110,103,101,115,52,47,49,0,0,0,0,0,60,118,58,115,116,114,111,107,101,32,99,111,108,111,114,61,34,0,0,0,0,0,0,0,47,111,114,97,110,103,101,115,51,47,51,0,0,0,0,0,110,101,97,116,111,0,0,0,41,10,0,0,0,0,0,0,100,111,116,95,108,97,121,111,117,116,0,0,0,0,0,0,47,111,114,
+97,110,103,101,115,51,47,50,0,0,0,0,0,95,104,100,114,97,119,95,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,99,111,110,100,101,110,115,101,100,0,0,0,0,0,0,0,97,103,114,97,112,104,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,0,100,111,117,98,108,101,111,99,116,97,103,111,110,0,0,0,112,111,115,0,0,0,0,0,47,111,114,97,110,103,101,115,51,47,49,0,0,0,0,0,71,68,70,79,78,84,80,65,84,72,61,0,0,0,0,0,49,54,0,0,0,0,0,0,73,109,112,114,111,112,101,114,32,37,115,32,118,97,108,117,101,32,
+37,115,32,45,32,105,103,110,111,114,101,100,0,0,111,114,116,104,111,121,120,0,115,45,62,115,122,32,62,32,48,0,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,98,108,117,101,0,0,0,108,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,10,0,0,0,0,115,117,98,115,101,116,0,0,47,103,114,101,121,115,57,47,57,0,0,0,0,0,0,0,106,112,101,103,0,0,0,0,48,32,48,32,48,32,101,100,103,101,99,111,108,111,114,10,0,0,0,0,0,0,0,0,47,98,108,117,101,115,52,47,49,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,
+56,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,55,0,0,0,0,0,0,0,99,97,110,110,111,116,32,115,117,115,112,101,110,100,32,105,110,32,101,120,116,101,114,110,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,0,0,0,0,106,112,101,58,120,100,111,116,0,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,54,0,0,0,0,0,0,0,32,50,10,0,0,0,0,0,47,103,114,101,121,115,57,47,53,0,0,0,0,0,0,0,116,101,101,0,0,0,0,0,47,103,114,101,121,115,57,47,52,0,0,0,0,0,0,0,102,105,108,101,32,101,114,114,111,114,0,
+0,0,0,0,0,66,111,111,107,109,97,110,45,76,105,103,104,116,0,0,0,47,103,114,101,121,115,57,47,51,0,0,0,0,0,0,0,60,47,118,58,115,104,97,112,101,62,10,0,0,0,0,0,47,103,114,101,121,115,57,47,50,0,0,0,0,0,0,0,32,40,0,0,0,0,0,0,47,98,108,117,101,115,51,47,51,0,0,0,0,0,0,0,85,115,105,110,103,32,37,115,58,32,37,115,58,37,115,10,0,0,0,0,0,0,0,0,47,103,114,101,121,115,57,47,49,0,0,0,0,0,0,0,95,108,100,114,97,119,95,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,72,101,108,118,101,116,105,99,97,45,
+78,97,114,114,111,119,0,0,0,0,0,0,0,0,100,111,117,98,108,101,99,105,114,99,108,101,0,0,0,0,47,103,114,101,121,115,56,47,56,0,0,0,0,0,0,0,112,97,99,107,46,99,0,0,68,79,84,70,79,78,84,80,65,84,72,0,0,0,0,0,49,53,0,0,0,0,0,0,115,99,97,108,101,0,0,0,80,79,73,78,84,45,83,73,90,69,0,0,0,0,0,0,120,121,32,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,0,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,33,61,32,78,85,76,76,0,0,0,0,0,0,0,0,103,118,
+82,101,110,100,101,114,74,111,98,115,32,37,115,58,32,37,46,50,102,32,115,101,99,115,46,10,0,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,0,0,0,0,99,105,114,99,117,105,116,0,47,103,114,101,121,115,56,47,55,0,0,0,0,0,0,0,255,216,255,224,0,0,0,0,37,37,32,37,115,10,0,0,47,103,114,101,121,115,56,47,54,0,0,0,0,0,0,0,47,103,114,101,121,115,56,47,53,0,0,0,0,0,0,0,112,97,114,115,105,110,103,32,102,105,110,105,115,104,101,100,0,0,0,0,0,0,0,0,106,112,101,103,58,120,100,111,116,0,0,0,0,0,0,0,47,103,114,
+101,121,115,56,47,52,0,0,0,0,0,0,0,49,50,48,48,0,0,0,0,47,103,114,101,121,115,56,47,51,0,0,0,0,0,0,0,117,32,33,61,32,118,0,0,47,103,114,101,121,115,56,47,50,0,0,0,0,0,0,0,66,111,111,107,109,97,110,45,76,105,103,104,116,73,116,97,108,105,99,0,0,0,0,0,47,103,114,101,121,115,56,47,49,0,0,0,0,0,0,0,34,47,62,0,0,0,0,0,47,103,114,101,121,115,55,47,55,0,0,0,0,0,0,0,32,118,101,114,115,105,111,110,32,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,54,0,0,0,0,0,0,0,49,46,54,0,0,0,0,0,115,112,108,105,110,101,115,
+0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,115,113,117,97,114,101,0,0,47,103,114,101,121,115,55,47,53,0,0,0,0,0,0,0,102,111,110,116,112,97,116,104,0,0,0,0,0,0,0,0,49,52,0,0,0,0,0,0,112,111,105,110,116,45,115,105,122,101,0,0,0,0,0,0,111,114,116,104,111,120,121,0,46,92,34,32],"i8",L,l.J+102436);D([0,0,0,0,76,97,121,111,117,116,32,119,97,115,32,110,111,116,32,100,111,110,101,46,32,32,77,105,115,115,105,110,103,32,108,97,121,111,117,116,32,112,108,117,103,105,
+110,115,63,32,10,0,100,97,114,107,115,97,108,109,111,110,0,0,0,0,0,0,109,111,100,101,108,0,0,0,47,103,114,101,121,115,55,47,52,0,0,0,0,0,0,0,103,105,102,0,0,0,0,0,103,115,97,118,101,10,0,0,34,32,110,97,109,101,61,34,0,0,0,0,0,0,0,0,47,98,108,117,101,115,51,47,50,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,51,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,50,0,0,0,0,0,0,0,112,97,114,115,105,110,103,32,97,98,111,114,116,101,100,0,103,105,102,58,120,100,111,116,0,0,0,0,0,0,0,0,47,103,114,101,121,115,55,47,
+49,0,0,0,0,0,0,0,45,50,10,0,0,0,0,0,47,103,114,101,121,115,54,47,54,0,0,0,0,0,0,0,111,98,106,112,49,45,62,115,122,46,120,32,61,61,32,48,32,38,38,32,111,98,106,112,49,45,62,115,122,46,121,32,61,61,32,48,0,0,0,0,47,103,114,101,121,115,54,47,53,0,0,0,0,0,0,0,66,111,111,107,109,97,110,45,68,101,109,105,0,0,0,0,47,103,114,101,121,115,54,47,52,0,0,0,0,0,0,0,32,101,32,0,0,0,0,0,47,103,114,101,121,115,54,47,51,0,0,0,0,0,0,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,99,103,0,0,0,0,0,0,47,103,
+114,101,121,115,54,47,50,0,0,0,0,0,0,0,99,111,114,101,0,0,0,0,49,46,50,0,0,0,0,0,85,110,107,110,111,119,110,32,34,115,112,108,105,110,101,115,34,32,118,97,108,117,101,58,32,34,37,115,34,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,0,0,114,101,99,116,97,110,103,108,101,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,37,99,37,108,100,0,0,0,47,103,114,101,121,115,54,47,49,0,0,0,0,0,0,0,115,118,103,0,0,0,0,0,49,51,0,0,0,0,0,0,102,97,99,101,0,0,0,0,111,114,
+116,104,111,95,121,120,0,0,0,0,0,0,0,0,67,0,0,0,0,0,0,0,100,97,114,107,114,101,100,0,95,110,101,97,116,111,95,99,99,0,0,0,0,0,0,0,47,103,114,101,121,115,53,47,53,0,0,0,0,0,0,0,71,73,70,56,0,0,0,0,103,114,101,115,116,111,114,101,10,0,0,0,0,0,0,0,98,108,117,101,0,0,0,0,60,109,97,112,32,105,100,61,34,0,0,0,0,0,0,0,47,98,108,117,101,115,51,47,49,0,0,0,0,0,0,0,47,103,114,101,121,115,53,47,52,0,0,0,0,0,0,0,47,103,114,101,121,115,53,47,51,0,0,0,0,0,0,0,112,97,114,115,101,114,32,110,111,116,32,115,117,115,
+112,101,110,100,101,100,0,0,0,0,106,32,61,61,32,48,0,0,47,103,114,101,121,115,53,47,50,0,0,0,0,0,0,0,112,110,103,58,120,100,111,116,0,0,0,0,0,0,0,0,83,105,110,103,108,101,10,0,47,103,114,101,121,115,53,47,49,0,0,0,0,0,0,0,38,35,52,53,59,0,0,0,47,103,114,101,121,115,52,47,52,0,0,0,0,0,0,0,84,105,109,101,115,45,73,116,97,108,105,99,0,0,0,0,47,103,114,101,121,115,52,47,51,0,0,0,0,0,0,0,110,45,62,99,111,117,110,116,32,43,32,40,42,110,110,41,45,62,99,111,117,110,116,32,61,61,32,78,79,68,69,67,65,82,68,
+32,43,32,49,0,32,108,32,0,0,0,0,0,47,103,114,101,121,115,52,47,50,0,0,0,0,0,0,0,32,80,97,103,101,115,58,32,37,100,10,0,0,0,0,0,47,103,114,101,121,115,52,47,49,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,49,46,52,0,0,0,0,0,101,115,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,120,120,120,0,0,0,0,0,114,101,99,116,0,0,0,0,37,100,0,0,0,0,0,0,47,103,114,101,121,115,51,47,51,0,0,0,0,0,0,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,32,40,37,100,44,37,100,41,10,0,0,0,0,0,0,0,112,115,0,0,0,0,0,
+0,49,50,0,0,0,0,0,0,99,111,108,111,114,0,0,0,111,114,116,104,111,103,111,110,97,108,32,99,111,110,115,116,114,97,105,110,116,115,0,0,102,105,120,101,100,0,0,0,117,110,109,97,116,99,104,101,100,32,39,40,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,0,0,0,0,0,0,82,105,103,104,116,0,0,0,37,115,32,97,116,116,114,105,98,117,116,101,32,118,97,108,117,101,32,109,117,115,116,32,98,101,32,49,32,111,114,32,50,32,45,32,105,103,110,111,114,105,110,103,10,
+0,0,0,47,103,114,101,121,115,51,47,50,0,0,0,0,0,0,0,98,109,112,0,0,0,0,0,32,32,47,66,111,114,100,101,114,32,91,32,48,32,48,32,48,32,93,10,32,32,47,65,99,116,105,111,110,32,60,60,32,47,83,117,98,116,121,112,101,32,47,85,82,73,32,47,85,82,73,32,37,115,32,62,62,10,32,32,47,83,117,98,116,121,112,101,32,47,76,105,110,107,10,47,65,78,78,32,112,100,102,109,97,114,107,10,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,56,0,0,0,0,0,0,47,103,114,101,121,115,51,47,49,0,0,0,0,0,0,0,47,103,114,
+101,101,110,115,57,47,57,0,0,0,0,0,0,112,97,114,115,101,114,32,115,117,115,112,101,110,100,101,100,0,0,0,0,0,0,0,0,115,118,103,58,100,111,116,0,47,103,114,101,101,110,115,57,47,56,0,0,0,0,0,0,12,0,0,0,0,0,0,0,99,105,114,99,111,0,0,0,120,76,97,121,111,117,116,32,0,0,0,0,0,0,0,0,49,48,48,46,48,48,10,0,47,103,114,101,101,110,115,57,47,55,0,0,0,0,0,0,105,110,112,117,116,115,99,97,108,101,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,54,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,
+119,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,47,103,114,101,101,110,115,57,47,53,0,0,0,0,0,0,120,100,111,116,0,0,0,0,37,46,48,102,44,37,46,48,102,32,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,52,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,32,84,105,116,108,101,58,32,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,51,0,0,0,0,0,0,117,32,61,61,32,85,70,95,102,105,110,100,40,117,41,0,120,100,111,116,118,101,114,115,105,111,110,0,0,0,0,0,114,
+117,101,0,0,0,0,0,67,111,117,114,105,101,114,45,79,98,108,105,113,117,101,0,99,111,109,112,111,110,101,110,116,0,0,0,0,0,0,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,32,0,0,0,0,102,111,110,116,110,97,109,101,58,32,34,37,115,34,32,114,101,115,111,108,118,101,100,32,116,111,58,32,37,115,10,0,47,103,114,101,101,110,115,57,47,50,0,0,0,0,0,0,98,98,91,37,115,93,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,46,53,103,10,0,0,0,0,0,103,100,0,0,0,0,0,0,103,101,116,115,112,108,105,
+110,101,112,111,105,110,116,115,58,32,110,111,32,115,112,108,105,110,101,32,112,111,105,110,116,115,32,97,118,97,105,108,97,98,108,101,32,102,111,114,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,0,0,49,49,0,0,0,0,0,0,60,70,79,78,84,62,0,0,111,114,116,104,111,0,0,0,100,105,115,116,111,114,116,105,111,110,0,0,0,0,0,0,116,114,117,110,99,97,116,105,110,103,32,115,116,121,108,101,32,39,37,115,39,10,0,0,100,97,114,107,111,114,97,110,103,101,0,0,0,0,0,0,114,32,38,38,32,114,114,0,114,0,0,0,0,0,0,0,115,
+116,114,101,115,115,119,116,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,57,47,49,0,0,0,0,0,0,115,104,97,112,101,102,105,108,101,0,0,0,0,0,0,0,66,77,0,0,0,0,0,0,32,93,10,0,0,0,0,0,99,95,99,110,116,32,61,61,32,48,0,0,0,0,0,0,105,110,32,114,111,117,116,101,115,112,108,105,110,101,115,44,32,99,97,110,110,111,116,32,102,105,110,100,32,78,79,82,77,65,76,32,101,100,103,101,10,0,0,0,0,0,0,0,69,114,114,111,114,32,105,110,105,116,105,97,108,105,122,105,110,103,32,102,111,114,32,100,101,102,108,97,116,105,111,
+110,10,0,0,0,0,0,0,0,99,97,110,39,116,32,102,105,110,100,32,108,105,98,114,97,114,121,32,102,105,108,101,32,37,115,10,0,0,0,0,0,100,101,102,97,117,108,116,32,0,0,0,0,0,0,0,0,102,111,114,99,101,108,97,98,101,108,115,0,0,0,0,0,47,97,99,99,101,110,116,56,47,55,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,56,0,0,0,0,0,0,115,111,108,105,100,0,0,0,37,115,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,37,100,32,105,116,101,114,32,37,46,50,102,32,115,101,99,10,0,0,0,115,112,97,110,45,62,
+102,111,110,116,0,0,0,0,0,0,95,110,101,119,95,114,97,110,107,0,0,0,0,0,0,0,45,62,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,55,0,0,0,0,0,0,105,108,108,101,103,97,108,32,99,104,97,114,97,99,116,101,114,40,115,41,32,105,110,32,112,117,98,108,105,99,32,105,100,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,54,0,0,0,0,0,0,117,115,101,114,111,117,116,58,32,99,111,117,108,100,32,110,111,116,32,97,108,108,111,99,97,116,101,32,109,101,109,111,114,121,10,0,0,0,0,0,68,97,109,112,105,110,103,0,103,99,58,32,79,
+117,116,32,111,102,32,109,101,109,111,114,121,10,0,0,0,0,0,0,101,112,115,58,100,111,116,0,47,103,114,101,101,110,115,56,47,54,0,0,0,0,0,0,102,100,112,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,115,116,97,114,116,61,115,101,108,102,32,45,32,105,103,110,111,114,105,110,103,10,0,0,0,0,0,105,115,32,117,110,100,101,102,105,110,101,100,46,32,82,101,118,101,114,116,105,110,103,32,116,111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,
+10,0,0,0,0,32,32,0,0,0,0,0,0,48,0,0,0,0,0,0,0,37,46,48,51,102,0,0,0,37,100,0,0,0,0,0,0,76,101,116,116,101,114,10,0,47,103,114,101,101,110,115,56,47,53,0,0,0,0,0,0,37,46,48,51,108,102,32,0,45,45,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,52,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,0,0,0,0,0,0,0,0,95,99,108,111,110,101,95,37,100,0,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,51,0,0,0,0,0,0,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,104,
+97,115,32,98,101,101,110,32,100,105,115,97,98,108,101,100,32,100,117,101,32,116,111,32,105,109,112,108,101,109,101,110,116,97,116,105,111,110,32,102,108,97,119,115,32,45,32,97,116,116,114,105,98,117,116,101,32,105,103,110,111,114,101,100,46,10,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,50,0,0,0,0,0,0,109,97,107,101,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,0,0,0,0,0,0,0,78,68,95,105,110,40,114,105,103,104,116,41,46,115,105,122,101,
+32,43,32,78,68,95,111,117,116,40,114,105,103,104,116,41,46,115,105,122,101,32,61,61,32,48,0,0,0,0,0,32,109,32,0,0,0,0,0,110,111,32,109,101,109,111,114,121,32,102,114,111,109,32,122,109,97,108,108,111,99,40,41,10,0,0,0,0,0,0,0,47,97,99,99,101,110,116,51,47,50,0,0,0,0,0,0,35,0,0,0,0,0,0,0,47,103,114,101,101,110,115,56,47,49,0,0,0,0,0,0,95,100,114,97,119,95,0,0,112,108,105,110,101,0,0,0,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,0,100,105,103,114,97,112,104,0,98,111,
+120,51,100,0,0,0,37,46,50,102,0,0,0,0,82,79,85,78,68,40,71,68,95,98,98,40,103,41,46,76,76,46,120,41,32,61,61,32,48,0,0,0,0,0,0,0,47,103,114,101,101,110,115,55,47,55,0,0,0,0,0,0,99,111,108,117,109,110,32,109,97,106,111,114,0,0,0,0,110,111,110,101,0,0,0,0,49,48,0,0,0,0,0,0,73,108,108,101,103,97,108,32,118,97,108,117,101,32,37,115,32,102,111,114,32,65,76,73,71,78,32,45,32,105,103,110,111,114,101,100,10,0,0,0,120,32,97,110,100,32,121,32,115,99,97,108,105,110,103,0,111,114,105,101,110,116,97,116,105,111,
+110,0,0,0,0,0,117,110,109,97,116,99,104,101,100,32,39,41,39,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,0,0,0,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,0,108,97,121,111,117,116,32,97,98,111,114,116,101,100,10,0,47,103,114,101,101,110,115,55,47,54,0,0,0,0,0,0,97,108,105,99,101,98,108,117,101,0,0,0,0,0,0,0,112,115,0,0,0,0,0,0,91,32,47,82,101,99,116,32,91,32,0,0,0,0,0,0,98,97,115,101,32,114,101,102,101,114,101,114,10,0,0,0,47,103,114,101,101,110,115,55,47,53,0,0,0,0,0,0,110,
+0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,103,114,101,101,110,115,55,47,52,0,0,0,0,0,0,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,53,0,0,0,0,0,0,37,115,32,45,62,32,37,115,58,32,104,101,97,100,32,110,111,116,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,0,0,47,103,114,101,101,110,115,55,47,51,0,0,0,
+0,0,0,112,115,58,100,111,116,0,0,47,103,114,101,101,110,115,55,47,50,0,0,0,0,0,0,73,110,99,104,101,115,10,0,32,45,62,32,0,0,0,0,37,108,102,0,0,0,0,0,47,103,114,101,101,110,115,55,47,49,0,0,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,0,109,101,109,111,114,121,32,101,120,104,97,117,115,116,101,100,0,0,0,0,0,0,0,0,47,103,114,101,101,110,115,54,47,54,0,0,0,0,0,0,99,108,117,115,116,101,114,
+0,100,105,109,0,0,0,0,0,97,114,116,105,99,117,108,97,116,105,111,110,95,112,111,115,0,0,0,0,0,0,0,0,60,118,58,112,97,116,104,32,118,61,34,0,0,0,0,0,47,103,114,101,101,110,115,54,47,53,0,0,0,0,0,0,99,111,109,112,111,117,110,100,69,100,103,101,115,58,32,99,111,117,108,100,32,110,111,116,32,99,111,110,115,116,114,117,99,116,32,111,98,115,116,97,99,108,101,115,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,
+0,0,0,0,0,114,111,117,116,101,115,112,108,105,110,101,115,105,110,105,116,58,32,99,97,110,110,111,116,32,97,108,108,111,99,97,116,101,32,112,115,10,0,0,0,32,45,97,110,99,104,111,114,32,101,0,0,0,0,0,0,68,117,109,109,121,61,37,100,10,0,0,0,0,0,0,0,47,103,114,101,101,110,115,54,47,52,0,0,0,0,0,0,114,0,0,0,0,0,0,0,37,100,32,0,0,0,0,0,111,108,121,108,105,110,101,0,67,111,117,114,105,101,114,45,66,111,108,100,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,0,0,0,0,0,103,114,97,112,104,0,0,0,101,112,115,58,
+112,115,0,0,102,111,108,100,101,114,0,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,0,0,0,0,47,103,114,101,101,110,115,54,47,51,0,0,0,0,0,0,114,111,119,32,109,97,106,111,114,0,0,0,0,0,0,0,115,104,97,112,101,102,105,108,101,0,0,0,0,0,0,0,103,108,111,98,97,108,0,0,57,0,0,0,0,0,0,0,69,78,84,69,82,0,0,0,115,99,97,108,101,120,121,0,115,107,101,119,0,0,0,0,110,101,115,116,105,110,103,32,110,111,116,32,97,108,108,111,119,101,100,32,105,110,32,115,116,121,108,101,58,32,37,115,10,0,0,0,
+0,0,0,0,100,97,114,107,109,97,103,101,110,116,97,0,0,0,0,0,98,0,0,0,0,0,0,0,37,100,32,110,111,100,101,115,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,47,103,114,101,101,110,115,54,47,50,0,0,0,0,0,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,88,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,110,101,103,32,37,46,53,103,32,115,117,98,
+32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,125,32,100,101,102,10,0,0,37,33,80,83,45,65,100,111,98,101,45,0,0,0,0,0,32,37,115,32,
+97,108,105,103,110,101,100,116,101,120,116,10,0,0,0,0,0,0,0,0,60,47,109,97,112,62,10,0,100,111,116,116,101,100,0,0,47,103,114,101,101,110,115,54,47,49,0,0,0,0,0,0,109,105,110,99,114,111,115,115,46,99,0,0,0,0,0,0,47,103,114,101,101,110,115,53,47,53,0,0,0,0,0,0,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,119,101,108,108,45,102,111,114,109,101,100,0,47,97,99,99,101,110,116,56,47,52,0,0,0,0,0,0,106,112,103,58,100,111,116,0,47,103,114,101,101,110,115,53,47,52,0,0,0,0,0,0,47,
+103,114,101,101,110,115,53,47,51,0,0,0,0,0,0,67,101,110,116,101,114,10,0,103,114,97,112,104,32,0,0,47,103,114,101,101,110,115,53,47,50,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,78,97,114,114,111,119,45,66,111,108,100,0,0,0,58,0,0,0,0,0,0,0,110,101,116,119,111,114,107,32,115,105,109,112,108,101,120,58,32,0,0,0,0,0,0,0,47,103,114,101,101,110,115,53,47,49,0,0,0,0,0,0,37,115,37,115,37,115,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,10,0,0,32,119,105,100,116,104,58,32,37,100,59,32,104,
+101,105,103,104,116,58,32,37,100,34,32,102,105,108,108,101,100,61,34,102,97,108,115,101,34,62,0,47,103,114,101,101,110,115,52,47,52,0,0,0,0,0,0,32,45,97,110,99,104,111,114,32,119,0,0,0,0,0,0,98,111,120,0,0,0,0,0,47,103,114,101,101,110,115,52,47,51,0,0,0,0,0,0,84,32,0,0,0,0,0,0,114,116,104,111,0,0,0,0,115,104,97,112,101,0,0,0,109,111,110,111,115,112,97,99,101,0,0,0,0,0,0,0,115,117,98,103,114,97,112,104,0,0,0,0,0,0,0,0,116,97,98,0,0,0,0,0,101,44,37,46,53,103,44,37,46,53,103,32,0,0,0,0,34,34,0,0,0,0,
+0,0,47,103,114,101,101,110,115,52,47,50,0,0,0,0,0,0,97,114,114,97,121,32,112,97,99,107,105,110,103,58,32,37,115,32,37,100,32,114,111,119,115,32,37,100,32,99,111,108,117,109,110,115,10,0,0,0,108,111,99,97,108,0,0,0,56,0,0,0,0,0,0,0,69,70,84,0,0,0,0,0,111,108,100,32,115,99,97,108,105,110,103,0,0,0,0,0,112,101,114,105,112,104,101,114,105,101,115,0,0,0,0,0,105,110,32,99,108,117,115,116,101,114,32,37,115,10,0,0,100,97,114,107,107,104,97,107,105,0,0,0,0,0,0,0,105,110,118,105,115,0,0,0,109,97,106,111,114,
+105,122,97,116,105,111,110,10,0,0,0,47,103,114,101,101,110,115,52,47,49,0,0,0,0,0,0,105,110,32,108,97,98,101,108,32,111,102,32,103,114,97,112,104,32,37,115,10,0,0,0,112,110,103,0,0,0,0,0,32,109,111,118,101,116,111,32,0,0,0,0,0,0,0,0,115,116,121,108,101,0,0,0,34,62,10,0,0,0,0,0,47,103,114,101,101,110,115,51,47,51,0,0,0,0,0,0,108,97,98,101,108,0,0,0,47,103,114,101,101,110,115,51,47,50,0,0,0,0,0,0,105,110,99,111,109,112,108,101,116,101,32,109,97,114,107,117,112,32,105,110,32,112,97,114,97,109,101,116,
+101,114,32,101,110,116,105,116,121,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,47,97,99,99,101,110,116,56,47,51,0,0,0,0,0,0,95,95,0,0,0,0,0,0,71,68,95,114,97,110,107,40,103,41,91,114,93,46,110,32,60,61,32,71,68,95,114,97,110,107,40,103,41,91,114,93,46,97,110,0,0,0,0,0,106,112,101,58,100,111,116,0,47,103,114,101,101,110,115,51,47,49,0,0,0,0,0,0,104,101,97,100,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,
+37,115,58,32,0,0,0,0,47,103,110,98,117,57,47,57,0,0,0,0,0,0,0,0,80,111,114,116,114,97,105,116,10,0,0,0,0,0,0,0,116,97,105,108,32,110,111,100,101,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,0,0,0,47,103,110,98,117,57,47,56,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,116,97,105,108,32,99,108,117,115,116,101,
+114,32,37,115,10,0,71,68,95,109,105,110,114,97,110,107,40,103,41,32,61,61,32,48,0,0,0,0,0,0,47,103,110,98,117,57,47,55,0,0,0,0,0,0,0,0,116,97,105,108,32,99,108,117,115,116,101,114,32,37,115,32,105,110,115,105,100,101,32,104,101,97,100,32,99,108,117,115,116,101,114,32,37,115,10,0,83,99,97,110,110,105,110,103,32,103,114,97,112,104,32,37,115,44,32,37,100,32,110,111,100,101,115,10,0,0,0,0,32,60,118,58,115,104,97,112,101,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,97,98,115,111,108,
+117,116,101,59,32,0,0,0,0,47,103,110,98,117,57,47,54,0,0,0,0,0,0,0,0,32,37,100,125,0,0,0,0,99,108,117,115,116,101,114,32,99,121,99,108,101,32,37,115,32,45,45,32,37,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,0,0,47,103,110,98,117,57,47,53,0,0,0,0,0,0,0,0,116,32,37,100,32,0,0,0,111,0,0,0,0,0,0,0,110,97,109,101,0,0,0,0,67,111,117,114,105,101,114,0,110,111,100,101,0,0,0,0,114,0,0,0,0,0,0,0,110,111,116,101,0,0,0,0,115,44,37,46,53,103,44,37,46,53,103,32,0,0,0,0,115,117,98,103,114,97,
+112,104,0,0,0,0,0,0,0,0,47,103,110,98,117,57,47,52,0,0,0,0,0,0,0,0,32,114,49,32,37,102,32,114,50,32,37,102,10,0,0,0,55,0,0,0,0,0,0,0,73,71,72,84,0,0,0,0,111,115,99,97,108,101,0,0,115,105,100,101,115,0,0,0,116,114,97,110,115,112,97,114,101,110,116,0,0,0,0,0,100,97,114,107,103,114,101,121,0,0,0,0,0,0,0,0,122,119,110,106,0,0,0,0,95,99,99,95,0,0,0,0,99,111,110,118,101,114,116,32,103,114,97,112,104,58,32,0,47,103,110,98,117,57,47,51,0,0,0,0,0,0,0,0,137,80,78,71,13,10,26,10,0,0,0,0,0,0,0,0,32,47,37,115,
+32,115,101,116,95,102,111,110,116,10,0,0,122,119,106,0,0,0,0,0,34,47,62,10,0,0,0,0,47,103,110,98,117,57,47,50,0,0,0,0,0,0,0,0,122,101,116,97,0,0,0,0,99,109,97,112,58,109,97,112,0,0,0,0,0,0,0,0,47,103,110,98,117,57,47,49,0,0,0,0,0,0,0,0,109,117,115,116,32,110,111,116,32,117,110,100,101,99,108,97,114,101,32,112,114,101,102,105,120,0,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,50,0,0,0,0,0,0,121,117,109,108,0,0,0,0,106,112,101,103,58,100,111,116,0,0,0,0,0,0,0,0,47,103,110,98,117,56,47,56,0,0,0,0,0,0,0,
+0,121,101,110,0,0,0,0,0,106,112,101,103,58,115,118,103,0,0,0,0,0,0,0,0,47,103,110,98,117,56,47,55,0,0,0,0,0,0,0,0,35,32,80,97,103,101,115,58,32,37,100,10,0,0,0,0,121,97,99,117,116,101,0,0,47,103,110,98,117,56,47,54,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,79,98,108,105,113,117,101,0,0,0,0,0,0,0,120,105,0,0,0,0,0,0,47,103,110,98,117,56,47,53,0,0,0,0,0,0,0,0,101,100,103,101,0,0,0,0,119,101,105,101,114,112,0,0,32,45,45,62,10,0,0,0,47,103,110,98,117,56,47,52,0,0,0,0,0,0,0,0,34,0,0,0,0,0,0,
+0,117,117,109,108,0,0,0,0,47,103,110,98,117,56,47,51,0,0,0,0,0,0,0,0,70,32,0,0,0,0,0,0,115,111,117,114,99,101,32,112,111,105,110,116,32,110,111,116,32,105,110,32,97,110,121,32,116,114,105,97,110,103,108,101,0,0,0,0,0,0,0,0,111,110,101,0,0,0,0,0,117,112,115,105,108,111,110,0,66,111,111,107,109,97,110,45,76,105,103,104,116,73,116,97,108,105,99,0,0,0,0,0,119,0,0,0,0,0,0,0,111,99,116,97,103,111,110,0,37,46,53,103,32,37,46,53,103,0,0,0,0,0,0,0,100,105,103,114,97,112,104,0,47,103,110,98,117,56,47,50,0,
+0,0,0,0,0,0,0,114,111,111,116,32,37,100,32,40,37,102,41,32,37,100,32,40,37,102,41,10,0,0,0,54,0,0,0,0,0,0,0,98,111,120,0,0,0,0,0,97,108,105,103,110,0,0,0,105,112,115,101,112,0,0,0,111,114,100,101,114,105,110,103,0,0,0,0,0,0,0,0,108,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,114,101,112,111,115,105,116,105,111,110,32,37,115,10,0,0,100,97,114,107,103,114,101,101,110,0,0,0,0,0,0,0,117,112,115,105,104,0,0,0,97,103,114,111,111,116,32,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,109,111,100,
+101,108,32,37,100,32,115,109,97,114,116,95,105,110,105,116,32,37,100,32,115,116,114,101,115,115,119,116,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,0,0,0,0,0,0,0,47,103,110,98,117,56,47,49,0,0,0,0,0,0,0,0,40,108,105,98,41,0,0,0,32,101,108,108,105,112,115,101,95,112,97,116,104,32,115,116,114,111,107,101,10,0,0,0,117,109,108,0,0,0,0,0,44,37,100,44,37,100,0,0,97,114,101,97,0,0,0,0,47,103,110,98,117,55,47,55,0,0,0,0,0,0,0,0,105,109,97,103,101,115,99,97,
+108,101,0,0,0,0,0,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,98,101,102,111,114,101,32,60,84,65,66,76,69,62,0,0,0,0,0,0,117,103,114,97,118,101,0,0,109,100,115,77,111,100,101,108,58,32,100,101,108,116,97,32,61,32,37,102,10,0,0,0,47,103,110,98,117,55,47,54,0,0,0,0,0,0,0,0,117,110,98,111,117,110,100,32,112,114,101,102,105,120,0,0,114,111,111,116,32,61,32,37,115,10,0,0,0,0,0,0,47,97,99,99,101,110,116,56,47,49,
+0,0,0,0,0,0,117,99,105,114,99,0,0,0,103,105,102,58,100,111,116,0,47,103,110,98,117,55,47,53,0,0,0,0,0,0,0,0,117,97,114,114,0,0,0,0,47,103,110,98,117,55,47,52,0,0,0,0,0,0,0,0,35,32,84,105,116,108,101,58,32,37,115,10,0,0,0,0,117,97,99,117,116,101,0,0,47,103,110,98,117,55,47,51,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,45,66,111,108,100,0,0,117,65,114,114,0,0,0,0,47,103,110,98,117,55,47,50,0,0,0,0,0,0,0,0,115,104,97,112,101,0,0,0,116,114,97,100,101,0,0,0,32,32,32,32,32,32,60,33,45,45,32,0,0,0,
+0,0,47,103,110,98,117,55,47,49,0,0,0,0,0,0,0,0,32,45,102,111,110,116,32,123,0,0,0,0,0,0,0,0,116,105,109,101,115,0,0,0,47,103,110,98,117,54,47,54,0,0,0,0,0,0,0,0,101,32,0,0,0,0,0,0,105,110,101,0,0,0,0,0,116,105,108,100,101,0,0,0,108,105,103,104,116,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,115,101,112,116,97,103,111,110,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,115,97,109,112,108,101,112,111,105,110,116,115,0,0,0,0,115,116,114,105,99,116,0,0,47,103,110,98,117,
+54,47,53,0,0,0,0,0,0,0,0,97,32,37,102,32,98,32,37,102,32,99,32,37,102,32,100,32,37,102,32,114,32,37,102,10,0,0,0,0,0,0,0,53,0,0,0,0,0,0,0,60,66,82,62,0,0,0,0,118,112,115,99,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,112,104,97,115,101,0,0,0,98,103,99,111,108,111,114,0,100,97,114,107,103,114,97,121,0,0,0,0,0,0,0,0,116,104,111,114,110,0,0,0,110,101,97,116,111,105,110,105,116,46,99,0,0,0,0,0,47,103,110,98,117,54,47,52,0,0,0,0,0,0,0,0,119,101,98,112,0,0,0,0,32,101,108,108,105,112,115,
+101,95,112,97,116,104,32,102,105,108,108,10,0,0,0,0,0,116,104,105,110,115,112,0,0,37,100,44,37,100,0,0,0,47,103,110,98,117,54,47,51,0,0,0,0,0,0,0,0,37,115,32,105,110,32,108,105,110,101,32,37,100,32,10,0,116,104,101,116,97,115,121,109,0,0,0,0,0,0,0,0,47,103,110,98,117,54,47,50,0,0,0,0,0,0,0,0,99,97,110,110,111,116,32,99,104,97,110,103,101,32,115,101,116,116,105,110,103,32,111,110,99,101,32,112,97,114,115,105,110,103,32,104,97,115,32,98,101,103,117,110,0,0,0,0,116,104,101,116,97,0,0,0,112,110,103,58,
+100,111,116,0,47,103,110,98,117,54,47,49,0,0,0,0,0,0,0,0,116,104,101,114,101,52,0,0,47,103,110,98,117,53,47,53,0,0,0,0,0,0,0,0,35,32,71,101,110,101,114,97,116,101,100,32,98,121,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,0,0,0,0,0,116,97,117,0,0,0,0,0,76,97,121,111,117,116,32,116,121,112,101,58,32,34,37,115,34,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,32,85,115,101,32,111,110,101,32,111,102,58,37,115,10,0,0,0,0,0,0,0,0,99,114,111,119,0,0,0,0,47,103,110,
+98,117,53,47,52,0,0,0,0,0,0,0,0,72,101,108,118,101,116,105,99,97,0,0,0,0,0,0,0,115,122,108,105,103,0,0,0,110,32,33,61,32,78,68,95,110,101,120,116,40,110,41,0,47,103,110,98,117,53,47,51,0,0,0,0,0,0,0,0,119,105,100,116,104,0,0,0,115,117,112,101,0,0,0,0,121,101,108,108,111,119,0,0,95,115,112,97,110,95,37,100,0,0,0,0,0,0,0,0,47,103,110,98,117,53,47,50,0,0,0,0,0,0,0,0,125,0,0,0,0,0,0,0,47,97,99,99,101,110,116,55,47,55,0,0,0,0,0,0,115,117,112,51,0,0,0,0,47,103,110,98,117,53,47,49,0,0,0,0,0,0,0,0,69,32,
+0,0,0,0,0,0,97,108,115,101,0,0,0,0,115,117,112,50,0,0,0,0,66,111,111,107,109,97,110,45,76,105,103,104,116,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,104,101,120,97,103,111,110,0,114,101,99,111,114,100,0,0,93,59,10,0,0,0,0,0,47,103,110,98,117,52,47,52,0,0,0,0,0,0,0,0,112,105,110,102,111,0,0,0,37,108,102,0,0,0,0,0,52,0,0,0,0,0,0,0,85,115,105,110,103,32,100,101,102,97,117,108,116,32,99,97,108,99,117,108,97,116,105,111,110,32,102,111,114,32,114,111,111,116,32,110,111,100,101,10,0,0,0,0,0,0,
+0,0,73,108,108,101,103,97,108,32,97,116,116,114,105,98,117,116,101,32,37,115,32,105,110,32,37,115,32,45,32,105,103,110,111,114,101,100,10,0,0,0,99,111,109,112,114,101,115,115,0,0,0,0,0,0,0,0,69,68,95,116,111,95,118,105,114,116,40,111,114,105,103,41,32,61,61,32,78,85,76,76,0,0,0,0,0,0,0,0,102,105,108,108,99,111,108,111,114,0,0,0,0,0,0,0,37,115,32,37,115,10,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,0,0,0,115,117,112,49,0,0,0,0,78,68,95,105,100,40,110,112,41,32,61,61,32,105,0,0,47,103,110,
+98,117,52,47,51,0,0,0,0,0,0,0,0,97,103,116,97,105,108,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,116,97,105,108,40,101,41,41,0,87,69,66,80,0,0,0,0,99,108,111,115,101,112,97,116,104,32,115,116,114,111,107,101,10,0,0,0,0,0,0,0,115,117,112,0,0,0,0,0,37,100,44,37,100,44,37,100,44,37,100,0,0,0,0,0,80,97,99,107,105,110,103,58,32,99,111,109,112,117,116,101,32,103,114,105,100,32,115,105,122,101,10,0,0,0,0,0,47,103,110,98,117,52,47,50,0,0,0,0,0,0,0,0,13,0,0,0,0,0,0,0,115,117,109,0,0,0,0,0,47,
+103,110,98,117,52,47,49,0,0,0,0,0,0,0,0,114,101,113,117,101,115,116,101,100,32,102,101,97,116,117,114,101,32,114,101,113,117,105,114,101,115,32,88,77,76,95,68,84,68,32,115,117,112,112,111,114,116,32,105,110,32,69,120,112,97,116,0,0,0,0,0,115,117,98,101,0,0,0,0,47,97,99,99,101,110,116,55,47,54,0,0,0,0,0,0,115,118,103,58,109,97,112,0,47,103,110,98,117,51,47,51,0,0,0,0,0,0,0,0,115,117,98,0,0,0,0,0,47,103,110,98,117,51,47,50,0,0,0,0,0,0,0,0,115,112,97,100,101,115,0,0,35,70,73,71,32,51,46,50,10,0,0,0,
+0,0,0,0,47,103,110,98,117,51,47,49,0,0,0,0,0,0,0,0,67,111,117,114,105,101,114,45,66,111,108,100,79,98,108,105,113,117,101,0,0,0,0,0,115,105,109,0,0,0,0,0,108,112,32,33,61,32,99,108,112,0,0,0,0,0,0,0,47,100,97,114,107,50,56,47,56,0,0,0,0,0,0,0,115,105,103,109,97,102,0,0,119,104,105,116,101,0,0,0,47,100,97,114,107,50,56,47,55,0,0,0,0,0,0,0,99,111,109,98,105,65,82,32,61,32,37,108,102,10,0,0,32,45,116,101,120,116,32,123,0,0,0,0,0,0,0,0,41,10,0,0,0,0,0,0,115,105,103,109,97,0,0,0,47,100,97,114,107,50,56,
+47,54,0,0,0,0,0,0,0,37,115,37,100,32,45,0,0,111,109,112,111,117,110,100,0,32,40,0,0,0,0,0,0,115,104,121,0,0,0,0,0,66,111,111,107,109,97,110,45,68,101,109,105,73,116,97,108,105,99,0,0,0,0,0,0,107,101,121,0,0,0,0,0,99,111,110,115,116,114,97,105,110,116,46,99,0,0,0,0,112,101,110,116,97,103,111,110,0,0,0,0,0,0,0,0,109,97,120,105,116,101,114,0,37,46,53,103,0,0,0,0,10,0,0,0,0,0,0,0,47,100,97,114,107,50,56,47,53,0,0,0,0,0,0,0,108,105,98,112,97,99,107,58,32,100,105,115,99,32,61,32,37,102,32,40,32,60,32,48,
+41,10,0,0,0,0,0,0,92,78,0,0,0,0,0,0,51,0,0,0,0,0,0,0,115,114,99,0,0,0,0,0,115,99,97,108,105,110,103,0,104,101,105,103,104,116,0,0,112,101,110,99,111,108,111,114,0,0,0,0,0,0,0,0,100,97,114,107,99,121,97,110,0,0,0,0,0,0,0,0,32,118,101,114,115,105,111,110,32,0,0,0,0,0,0,0,115,101,99,116,0,0,0,0,98,111,120,0,0,0,0,0,108,101,110,0,0,0,0,0,47,100,97,114,107,50,56,47,52,0,0,0,0,0,0,0,97,103,104,101,97,100,40,101,41,32,61,61,32,85,70,95,102,105,110,100,40,97,103,104,101,97,100,40,101,41,41,0,115,118,103,
+0,0,0,0,0,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,0,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,0,0,0,0,0,115,100,111,116,0,0,0,0,37,100,44,37,100,44,37,100,0,0,0,0,0,0,0,0,47,100,97,114,107,50,56,47,51,0,0,0,0,0,0,0,32,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,71,114,97,112,104,105,99,115,47,83,86,71,47,49,46,49,47,68,84,68,47,115,118,103,49,49,46,100,116,100,34,62,10,0,0,0,115,99,97,114,111,110,0,0,98,108,97,99,107,0,0,0,47,100,97,114,
+107,50,56,47,50,0,0,0,0,0,0,0,101,110,116,105,116,121,32,100,101,99,108,97,114,101,100,32,105,110,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,0,0,0,0,0,95,98,97,99,107,103,114,111,117,110,100,0,0,0,0,0,47,37,115,47,37,115,0,0,88,49,49,47,0,0,0,0,105,103,104,116,103,114,101,121,0,0,0,0,0,0,0,0,104,105,116,101,0,0,0,0,60,33,68,79,67,84,89,80,69,32,115,118,103,32,80,85,66,76,73,67,32,34,45,47,47,87,51,67,47,47,68,84,68,32,83,86,71,32,49,46,49,47,47,69,78,34,10,0,115,98,113,117,111,
+0,0,0,108,97,99,107,0,0,0,0,121,101,108,108,111,119,103,114,101,101,110,0,0,0,0,0,47,97,99,99,101,110,116,55,47,53,0,0,0,0,0,0,121,101,108,108,111,119,52,0,101,112,115,58,109,97,112,0,121,101,108,108,111,119,51,0,47,100,97,114,107,50,56,47,49,0,0,0,0,0,0,0,121,101,108,108,111,119,50,0,121,101,108,108,111,119,49,0,121,101,108,108,111,119,0,0,119,104,105,116,101,115,109,111,107,101,0,0,0,0,0,0,119,104,105,116,101,0,0,0,119,104,101,97,116,52,0,0,34,32,116,121,112,101,61,34,116,101,120,116,47,99,115,
+115,34,63,62,10,0,0,0,0,114,115,113,117,111,0,0,0,119,104,101,97,116,51,0,0,119,104,101,97,116,50,0,0,47,100,97,114,107,50,55,47,55,0,0,0,0,0,0,0,119,104,101,97,116,49,0,0,119,104,101,97,116,0,0,0,118,105,111,108,101,116,114,101,100,52,0,0,0,0,0,0,118,105,111,108,101,116,114,101,100,51,0,0,0,0,0,0,118,105,111,108,101,116,114,101,100,50,0,0,0,0,0,0,118,105,111,108,101,116,114,101,100,49,0,0,0,0,0,0,38,103,116,59,0,0,0,0,118,105,111,108,101,116,114,101,100,0,0,0,0,0,0,0,118,105,111,108,101,116,0,0,
+60,63,120,109,108,45,115,116,121,108,101,115,104,101,101,116,32,104,114,101,102,61,34,0,114,115,97,113,117,111,0,0,116,117,114,113,117,111,105,115,101,52,0,0,0,0,0,0,35,32,101,110,100,32,111,102,32,70,73,71,32,102,105,108,101,10,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,51,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,50,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,49,0,0,0,0,0,0,47,100,97,114,107,50,55,47,54,0,0,0,0,0,0,0,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,0,116,114,97,110,
+115,112,97,114,101,110,116,0,0,0,0,0,116,111,109,97,116,111,52,0,116,111,109,97,116,111,51,0,116,111,109,97,116,111,50,0,67,111,117,114,105,101,114,0,116,111,109,97,116,111,49,0,115,116,121,108,101,115,104,101,101,116,0,0,0,0,0,0,114,108,109,0,0,0,0,0,116,111,109,97,116,111,0,0,116,104,105,115,116,108,101,52,0,0,0,0,0,0,0,0,116,104,105,115,116,108,101,51,0,0,0,0,0,0,0,0,116,104,105,115,116,108,101,50,0,0,0,0,0,0,0,0,47,100,97,114,107,50,55,47,53,0,0,0,0,0,0,0,116,104,105,115,116,108,101,49,0,0,0,
+0,0,0,0,0,116,104,105,115,116,108,101,0,116,97,110,52],"i8",L,l.J+112676);D([0,0,0,0,116,97,110,51,0,0,0,0,116,97,110,50,0,0,0,0,116,97,110,49,0,0,0,0,60,63,120,109,108,32,118,101,114,115,105,111,110,61,34,49,46,48,34,32,101,110,99,111,100,105,110,103,61,34,85,84,70,45,56,34,32,115,116,97,110,100,97,108,111,110,101,61,34,110,111,34,63,62,10,0,114,104,111,0,0,0,0,0,116,97,110,0,0,0,0,0,115,116,101,101,108,98,108,117,101,52,0,0,0,0,0,0,115,116,101,101,108,98,108,117,101,51,0,0,0,0,0,0,116,101,97,108,
+0,0,0,0,115,116,101,101,108,98,108,117,101,50,0,0,0,0,0,0,47,100,97,114,107,50,55,47,52,0,0,0,0,0,0,0,115,116,101,101,108,98,108,117,101,49,0,0,0,0,0,0,115,116,101,101,108,98,108,117,101,0,0,0,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,52,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,51,0,0,0,0,32,99,114,101,97,116,101,32,116,101,120,116,32,0,0,0,115,112,114,105,110,103,103,114,101,101,110,50,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,49,0,0,0,0,32,120,109,108,110,115,58,120,
+108,105,110,107,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,49,57,57,57,47,120,108,105,110,107,34,0,0,0,0,0,114,102,108,111,111,114,0,0,98,0,0,0,0,0,0,0,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,115,110,111,119,52,0,0,0,115,110,111,119,51,0,0,0,115,110,111,119,50,0,0,0,47,100,97,114,107,50,55,47,51,0,0,0,0,0,0,0,115,110,111,119,49,0,0,0,115,110,111,119,0,0,0,0,115,108,97,116,101,103,114,101,121,0,0,0,0,0,0,0,35,32,0,0,0,0,0,0,115,108,97,116,101,103,114,97,121,
+52,0,0,0,0,0,0,37,46,48,51,102,0,0,0,115,108,97,116,101,103,114,97,121,51,0,0,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,111,112,115,0,0,0,0,0,0,0,115,108,97,116,101,103,114,97,121,50,0,0,0,0,0,0,117,114,118,101,100,0,0,0,32,120,109,108,110,115,61,34,104,116,116,112,58,47,47,119,119,119,46,119,51,46,111,114,103,47,50,48,48,48,47,115,118,103,34,0,0,0,0,0,114,101,103,0,0,0,0,0,115,101,114,105,102,0,0,0,104,114,101,102,0,0,0,0,115,108,97,116,101,103,114,97,121,49,0,0,0,0,0,0,115,108,97,
+116,101,103,114,97,121,0,0,0,0,0,0,0,104,111,117,115,101,0,0,0,99,99,37,115,43,37,100,0,115,108,97,116,101,98,108,117,101,52,0,0,0,0,0,0,37,46,53,103,44,37,46,53,103,0,0,0,0,0,0,0,101,100,103,101,0,0,0,0,115,108,97,116,101,98,108,117,101,51,0,0,0,0,0,0,47,100,97,114,107,50,55,47,50,0,0,0,0,0,0,0,32,32,37,100,32,37,100,32,99,101,108,108,10,0,0,0,115,108,97,116,101,98,108,117,101,50,0,0,0,0,0,0,108,97,98,101,108,0,0,0,50,0,0,0,0,0,0,0,115,108,97,116,101,98,108,117,101,49,0,0,0,0,0,0,115,99,97,108,101,
+0,0,0,115,99,97,108,101,0,0,0,115,108,97,116,101,98,108,117,101,0,0,0,0,0,0,0,116,97,105,108,99,108,105,112,0,0,0,0,0,0,0,0,115,107,121,98,108,117,101,52,0,0,0,0,0,0,0,0,99,111,108,111,114,0,0,0,115,107,121,98,108,117,101,51,0,0,0,0,0,0,0,0,99,108,117,115,116,101,114,0,100,97,114,107,98,108,117,101,0,0,0,0,0,0,0,0,115,107,121,98,108,117,101,50,0,0,0,0,0,0,0,0,32,118,105,101,119,66,111,120,61,34,37,46,50,102,32,37,46,50,102,32,37,46,50,102,32,37,46,50,102,34,0,0,114,101,97,108,0,0,0,0,115,107,121,
+98,108,117,101,49,0,0,0,0,0,0,0,0,100,111,116,115,112,108,105,110,101,115,46,99,0,0,0,0,115,107,121,98,108,117,101,0,115,105,101,110,110,97,52,0,115,105,101,110,110,97,51,0,47,100,97,114,107,50,55,47,49,0,0,0,0,0,0,0,83,111,108,118,105,110,103,32,109,111,100,101,108,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,100,32,116,111,108,32,37,102,10,0,0,115,105,101,110,110,97,50,0,115,105,101,110,110,97,49,0,40,78,68,95,85,70,95,115,105,122,101,40,110,41,32,60,61,32,49,41,32,124,124,32,40,110,
+32,61,61,32,108,101,97,100,101,114,41,0,0,0,115,105,101,110,110,97,0,0,115,101,97,115,104,101,108,108,52,0,0,0,0,0,0,0,60,115,118,103,0,0,0,0,32,99,117,114,118,101,116,111,10,0,0,0,0,0,0,0,115,101,97,115,104,101,108,108,51,0,0,0,0,0,0,0,115,101,97,115,104,101,108,108,50,0,0,0,0,0,0,0,60,115,118,103,32,119,105,100,116,104,61,34,37,100,112,116,34,32,104,101,105,103,104,116,61,34,37,100,112,116,34,10,0,0,0,0,0,0,0,0,114,100,113,117,111,0,0,0,75,80,95,76,101,102,116,0,115,101,97,115,104,101,108,108,49,
+0,0,0,0,0,0,0,102,108,97,116,105,110,100,101,120,40,97,103,116,97,105,108,40,101,41,41,32,60,32,77,45,62,110,99,111,108,115,0,115,101,97,115,104,101,108,108,0,0,0,0,0,0,0,0,32,99,111,111,114,100,115,61,34,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,52,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,51,0,0,0,0,0,0,0,47,100,97,114,107,50,54,47,54,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,50,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,49,0,0,0,0,0,0,0,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,0,
+115,97,110,100,121,98,114,111,119,110,0,0,0,0,0,0,115,97,108,109,111,110,52,0,115,97,108,109,111,110,51,0,32,80,97,103,101,115,58,32,37,100,32,45,45,62,10,0,114,99,101,105,108,0,0,0,115,97,108,109,111,110,50,0,115,97,108,109,111,110,49,0,115,97,108,109,111,110,0,0,115,97,100,100,108,101,98,114,111,119,110,0,0,0,0,0,47,100,97,114,107,50,54,47,53,0,0,0,0,0,0,0,117,110,101,120,112,101,99,116,101,100,32,112,97,114,115,101,114,32,115,116,97,116,101,32,45,32,112,108,101,97,115,101,32,115,101,110,100,32,
+97,32,98,117,103,32,114,101,112,111,114,116,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,52,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,51,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,50,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,49,0,0,0,0,0,0,114,111,121,97,108,98,108,117,101,0,0,0,0,0,0,0,114,111,115,121,98,114,111,119,110,52,0,0,0,0,0,0,32,84,105,116,108,101,58,32,0,0,0,0,0,0,0,0,114,97,114,114,0,0,0,0,114,111,115,121,98,114,111,119,110,51,0,0,0,0,0,0,114,111,115,121,98,114,111,119,110,
+50,0,0,0,0,0,0,114,111,115,121,98,114,111,119,110,49,0,0,0,0,0,0,47,97,99,99,101,110,116,55,47,52,0,0,0,0,0,0,112,115,58,109,97,112,0,0,114,111,115,121,98,114,111,119,110,0,0,0,0,0,0,0,47,100,97,114,107,50,54,47,52,0,0,0,0,0,0,0,114,101,100,52,0,0,0,0,114,101,100,51,0,0,0,0,114,101,100,50,0,0,0,0,114,101,100,49,0,0,0,0,116,119,111,112,105,0,0,0,114,101,100,0,0,0,0,0,112,117,114,112,108,101,52,0,60,33,45,45,0,0,0,0,114,97,113,117,111,0,0,0,112,117,114,112,108,101,51,0,112,117,114,112,108,101,50,0,
+112,117,114,112,108,101,49,0,112,117,114,112,108,101,0,0,47,100,97,114,107,50,54,47,51,0,0,0,0,0,0,0,112,111,119,100,101,114,98,108,117,101,0,0,0,0,0,0,112,108,117,109,52,0,0,0,112,108,117,109,51,0,0,0,112,108,117,109,50,0,0,0,112,108,117,109,49,0,0,0,112,108,117,109,0,0,0,0,60,47,115,118,103,62,10,0,114,97,110,103,0,0,0,0,111,118,101,114,108,97,112,0,112,105,110,107,52,0,0,0,112,105,110,107,51,0,0,0,37,48,51,111,0,0,0,0,112,105,110,107,50,0,0,0,112,105,110,107,49,0,0,0,47,100,97,114,107,50,54,47,
+50,0,0,0,0,0,0,0,112,105,110,107,0,0,0,0,112,101,114,117,0,0,0,0,112,101,97,99,104,112,117,102,102,52,0,0,0,0,0,0,112,101,97,99,104,112,117,102,102,51,0,0,0,0,0,0,112,101,97,99,104,112,117,102,102,50,0,0,0,0,0,0,67,111,117,114,105,101,114,45,66,111,108,100,0,0,0,0,112,101,97,99,104,112,117,102,102,49,0,0,0,0,0,0,34,32,99,108,97,115,115,61,34,108,97,121,101,114,34,62,10,0,0,0,0,0,0,0,114,97,100,105,99,0,0,0,112,101,97,99,104,112,117,102,102,0,0,0,0,0,0,0,112,97,112,97,121,97,119,104,105,112,0,0,0,
+0,0,0,47,100,97,114,107,50,54,47,49,0,0,0,0,0,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,52,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,51,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,50,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,49,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,52,0,0,85,82,76,0,0,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,51,0,0,100,111,116,0,0,0,0,0,112,97,
+108,101,116,117,114,113,117,111,105,115,101,50,0,0,32,116,114,97,110,115,102,111,114,109,61,34,115,99,97,108,101,40,37,103,32,37,103,41,32,114,111,116,97,116,101,40,37,100,41,32,116,114,97,110,115,108,97,116,101,40,37,103,32,37,103,41,34,62,10,0,114,65,114,114,0,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,49,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,0,0,0,112,97,108,101,103,114,101,101,110,52,0,0,0,0,0,0,115,105,108,118,101,114,0,0,112,97,108,101,103,114,101,101,110,51,0,
+0,0,0,0,0,47,100,97,114,107,50,53,47,53,0,0,0,0,0,0,0,108,105,98,112,97,116,104,47,37,115,58,37,100,58,32,37,115,10,0,0,0,0,0,0,112,97,108,101,103,114,101,101,110,50,0,0,0,0,0,0,112,97,108,101,103,114,101,101,110,49,0,0,0,0,0,0,112,97,108,101,103,114,101,101,110,0,0,0,0,0,0,0,112,97,108,101,103,111,108,100,101,110,114,111,100,0,0,0,32,99,114,101,97,116,101,32,111,118,97,108,32,0,0,0,111,114,99,104,105,100,52,0,111,114,99,104,105,100,51,0,34,32,99,108,97,115,115,61,34,103,114,97,112,104,34,0,113,117,
+111,116,0,0,0,0,111,114,99,104,105,100,50,0,111,114,99,104,105,100,49,0,111,114,99,104,105,100,0,0,111,114,97,110,103,101,114,101,100,52,0,0,0,0,0,0,47,100,97,114,107,50,53,47,52,0,0,0,0,0,0,0,111,114,97,110,103,101,114,101,100,51,0,0,0,0,0,0,111,114,97,110,103,101,114,101,100,50,0,0,0,0,0,0,117,116,105,108,115,46,99,0,111,114,97,110,103,101,114,101,100,49,0,0,0,0,0,0,111,114,97,110,103,101,114,101,100,0,0,0,0,0,0,0,50,32,0,0,0,0,0,0,111,114,97,110,103,101,52,0,111,114,97,110,103,101,51,0,73,110,
+118,97,108,105,100,32,37,100,45,98,121,116,101,32,85,84,70,56,32,102,111,117,110,100,32,105,110,32,105,110,112,117,116,32,111,102,32,103,114,97,112,104,32,37,115,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,0,0,0,34,32,99,108,97,115,115,61,34,99,108,117,115,116,101,114,34,62,0,0,0,0,0,0,112,115,105,0,0,0,0,0,85,82,87,32,66,111,
+111,107,109,97,110,32,76,0,0,0,111,114,97,110,103,101,50,0,103,114,97,112,104,118,105,122,0,0,0,0,0,0,0,0,111,114,97,110,103,101,49,0,112,97,114,97,108,108,101,108,111,103,114,97,109,0,0,0,103,114,97,112,104,32,37,115,44,32,99,111,111,114,100,32,37,115,44,32,101,120,112,101,99,116,101,100,32,102,111,117,114,32,100,111,117,98,108,101,115,10,0,0,0,0,0,0,98,97,100,32,101,100,103,101,32,108,101,110,32,34,37,115,34,0,0,0,0,0,0,0,111,114,97,110,103,101,0,0,44,37,46,53,103,0,0,0,102,111,110,116,45,62,110,
+97,109,101,0,0,0,0,0,0,110,111,100,101,0,0,0,0,111,108,105,118,101,100,114,97,98,52,0,0,0,0,0,0,47,100,97,114,107,50,53,47,51,0,0,0,0,0,0,0,37,115,32,110,111,46,32,99,101,108,108,115,32,37,100,32,87,32,37,100,32,72,32,37,100,10,0,0,0,0,0,0,111,108,105,118,101,100,114,97,98,51,0,0,0,0,0,0,80,45,62,101,110,100,46,116,104,101,116,97,32,60,32,50,32,42,32,77,95,80,73,0,49,0,0,0,0,0,0,0,111,108,105,118,101,100,114,97,98,50,0,0,0,0,0,0,60,73,77,71,62,0,0,0,86,111,114,111,110,111,105,0,111,108,105,118,101,
+100,114,97,98,49,0,0,0,0,0,0,108,97,98,101,108,102,111,110,116,115,105,122,101,0,0,0,111,108,105,118,101,100,114,97,98,0,0,0,0,0,0,0,35,102,56,102,56,102,56,0,111,108,100,108,97,99,101,0,110,111,110,101,0,0,0,0,99,121,97,110,0,0,0,0,34,32,99,108,97,115,115,61,34,110,111,100,101,34,62,0,112,114,111,112,0,0,0,0,110,97,118,121,98,108,117,101,0,0,0,0,0,0,0,0,110,97,118,121,0,0,0,0,47,100,97,114,107,50,53,47,50,0,0,0,0,0,0,0,110,97,118,97,106,111,119,104,105,116,101,52,0,0,0,0,110,45,62,108,101,118,101,
+108,32,62,61,32,48,0,0,0,110,97,118,97,106,111,119,104,105,116,101,51,0,0,0,0,116,104,101,32,103,114,97,112,104,32,105,110,116,111,32,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,115,46,10,0,0,0,110,97,118,97,106,111,119,104,105,116,101,50,0,0,0,0,110,97,118,97,106,111,119,104,105,116,101,49,0,0,0,0,114,97,110,107,46,99,0,0,115,104,97,112,101,115,46,99,0,0,0,0,0,0,0,0,110,97,118,97,106,111,119,104,105,116,101,0,0,0,0,0,109,111,99,99,97,115,105,110,0,0,0,0,0,0,0,0,37,37,
+37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,0,0,0,0,115,116,114,111,107,101,10,0,99,99,37,115,95,37,100,0,99,97,110,110,111,116,32,114,101,45,97,108,108,111,99,97,116,101,32,112,115,10,0,0,109,105,115,116,121,114,111,115,101,52,0,0,0,0,0,0,109,105,115,116,121,114,111,115,101,51,0,0,0,0,0,0,95,37,115,0,0,0,0,0,112,114,111,100,0,0,0,0,108,97,98,101,108,58,32,97,114,101,97,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,114,116,114,101,101,10,0,0,
+0,0,0,0,0,0,10,0,0,0,0,0,0,0,109,105,115,116,121,114,111,115,101,50,0,0,0,0,0,0,102,108,97,116,105,110,100,101,120,40,97,103,104,101,97,100,40,101,41,41,32,60,32,77,45,62,110,114,111,119,115,0,109,105,115,116,121,114,111,115,101,49,0,0,0,0,0,0,108,111,115,116,32,37,115,32,37,115,32,101,100,103,101,10,0,0,0,0,0,0,0,0,32,97,108,116,61,34,34,0,109,105,115,116,121,114,111,115,101,0,0,0,0,0,0,0,109,105,110,116,99,114,101,97,109,0,0,0,0,0,0,0,47,100,97,114,107,50,53,47,49,0,0,0,0,0,0,0,109,105,100,110,
+105,103,104,116,98,108,117,101,0,0,0,0,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,110,111,100,101,32,0,0,0,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,37,100,32,0,0,0,0,0,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,0,0,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,109,101,100,105,117,109,115,101,97,103,114,101,101,110,0,0,60,47,116,105,116,108,101,62,10,0,0,0,0,0,0,0,112,114,105,109,101,0,0,0,49,46,50,46,53,0,0,0,
+109,101,100,105,117,109,112,117,114,112,108,101,52,0,0,0,105,110,32,108,97,98,101,108,32,111,102,32,101,100,103,101,32,37,115,32,37,115,32,37,115,10,0,0,0,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,51,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,50,0,0,0,109,101,100,105,117,109,112,117,114,112,108,101,49,0,0,0,47,100,97,114,107,50,52,47,52,0,0,0,0,0,0,0,100,111,99,117,109,101,110,116,32,105,115,32,110,111,116,32,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,109,101,100,105,
+117,109,112,117,114,112,108,101,0,0,0,0,87,97,114,110,105,110,103,0,109,101,100,105,117,109,111,114,99,104,105,100,52,0,0,0,101,112,115,105,108,111,110,0,109,101,100,105,117,109,111,114,99,104,105,100,51,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,50,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,49,0,0,0,109,101,100,105,117,109,111,114,99,104,105,100,0,0,0,0,92,69,0,0,0,0,0,0,112,111,117,110,100,0,0,0,109,101,100,105,117,109,98,108,117,101,0,0,0,0,0,0,65,103,114,97,112,104,105,110,
+102,111,95,116,0,0,0,0,99,111,109,112,111,117,110,100,0,0,0,0,0,0,0,0,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,0,0,109,97,114,111,111,110,52,0,109,97,114,111,111,110,51,0,106,112,103,58,109,97,112,0,35,37,50,120,37,50,120,37,50,120,37,50,120,0,0,0,47,100,97,114,107,50,52,47,51,0,0,0,0,0,0,0,109,97,114,111,111,110,50,0,109,97,114,111,111,110,49,0,109,97,114,111,111,110,0,0,109,97,103,101,110,116,97,52,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,51,0,0,0,0,0,0,0,0,109,
+97,103,101,110,116,97,50,0,0,0,0,0,0,0,0,60,116,105,116,108,101,62,0,112,108,117,115,109,110,0,0,109,97,103,101,110,116,97,49,0,0,0,0,0,0,0,0,37,115,32,58,32,37,102,32,37,102,32,37,102,32,37,102,10,0,0,0,0,0,0,0,103,114,97,112,104,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,0,0,0,0,0,0,0,109,97,103,101,110,116,97,0,37,115,32,99,111,111,114,100,32,37,46,53,103,32,37,46,53,103,32,104,116,
+32,37,102,32,119,105,100,116,104,32,37,102,10,0,0,0,0,0,0,98,108,97,99,107,0,0,0,108,105,110,101,110,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,108,105,109,101,103,114,101,101,110,0,0,0,0,0,0,0,47,100,97,114,107,50,52,47,50,0,0,0,0,0,0,0,82,97,110,107,32,115,101,112,97,114,97,116,105,111,110,32,61,32,0,0,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,52,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,51,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,50,0,0,0,0,108,105,
+103,104,116,121,101,108,108,111,119,49,0,0,0,0,108,105,103,104,116,121,101,108,108,111,119,0,0,0,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,52,0,34,32,99,108,97,115,115,61,34,101,100,103,101,34,62,0,112,105,118,0,0,0,0,0,84,48,0,0,0,0,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,51,0,109,97,107,101,83,112,108,105,110,101,58,32,102,97,105,108,101,100,32,116,111,32,109,97,107,101,32,115,112,108,105,110,101,32,101,100,103,101,32,40,37,115,44,37,115,41,10,0,108,105,103,104,
+116,115,116,101,101,108,98,108,117,101,50,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,49,0,60,47,72,84,77,76,62,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,46,52,102,32,37,100,32,37,46,49,102,32,37,46,49,102,32,37,100,32,37,100,32,37,115,92,48,48,49,10,0,0,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,0,47,100,97,114,107,50,52,47,49,0,0,0,0,0,0,0,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,0,108,105,103,104,116,115,108,97,116,
+101,103,114,97,121,0,0,108,105,103,104,116,115,108,97,116,101,98,108,117,101,0,0,108,105,103,104,116,115,107,121,98,108,117,101,52,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,101,51,0,0,0,84,105,109,101,115,45,66,111,108,100,73,116,97,108,105,99,0,0,0,0,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,101,50,0,0,0,60,103,32,105,100,61,34,0,112,105,0,0,0,0,0,0,108,105,103,104,116,115,107,121,98,108,117,101,49,0,0,0,108,105,103,104,116,115,
+107,121,98,108,117,101,0,0,0,0,108,105,103,104,116,115,101,97,103,114,101,101,110,0,0,0,108,105,103,104,116,115,97,108,109,111,110,52,0,0,0,0,47,100,97,114,107,50,51,47,51,0,0,0,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,51,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,50,0,0,0,0,108,97,98,101,108,102,111,110,116,110,97,109,101,0,0,0,108,105,103,104,116,115,97,108,109,111,110,49,0,0,0,0,108,105,103,104,116,115,97,108,109,111,110,0,0,0,0,0,37,108,102,44,37,100,0,0,108,105,103,104,116,
+112,105,110,107,52,0,0,0,0,0,0,109,97,107,101,65,100,100,80,111,108,121,58,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,116,121,112,101,32,37,115,10,0,0,0,0,0,108,105,103,104,116,112,105,110,107,51,0,0,0,0,0,0,62,10,0,0,0,0,0,0,112,104,105,0,0,0,0,0,50,48,49,52,48,49,49,49,46,50,51,49,53,0,0,0,108,105,103,104,116,112,105,110,107,50,0,0,0,0,0,0,108,105,103,104,116,112,105,110,107,49,0,0,0,0,0,0,108,105,103,104,116,112,105,110,107,0,0,0,0,0,0,0,32,32,34,37,115,34,10,0,108,105,103,104,116,
+103,114,101,121,0,0,0,0,0,0,0,47,100,97,114,107,50,51,47,50,0,0,0,0,0,0,0,114,101,100,0,0,0,0,0,108,105,103,104,116,103,114,97,121,0,0,0,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,52,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,51,0,32,45,111,117,116,108,105,110,101,32,0,0,0,0,0,0,47,100,97,114,107,50,51,47,49,0,0,0,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,
+50,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,49,0,47,97,99,99,101,110,116,55,47,51,0,0,0,0,0,0,32,116,97,114,103,101,116,61,34,0,0,0,0,0,0,0,112,101,114,112,0,0,0,0,108,105,103,104,116,103,111,108,100,101,110,114,111,100,0,0,100,101,103,101,110,101,114,97,116,101,32,99,111,110,99,101,110,116,114,97,116,101,100,32,114,97,110,107,32,37,115,44,37,100,10,0,0,0,0,0,108,105,103,104,116,99,121,97,110,52,0,0,0,0,0,0,108,105,103,104,116,99,121,97,110,51,0,0,0,0,0,0,108,105,103,104,116,99,121,
+97,110,50,0,0,0,0,0,0,47,97,99,99,101,110,116,51,47,49,0,0,0,0,0,0,108,105,103,104,116,99,121,97,110,49,0,0,0,0,0,0,108,105,103,104,116,99,121,97,110,0,0,0,0,0,0,0,108,105,103,104,116,99,111,114,97,108,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,52,0,0,0,0,0,0,67,32,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,51,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,50,0,0,0,0,0,0,85,84,70,56,32,99,111,100,101,115,32,62,32,52,32,98,121,116,101,115,32,97,114,101,32,110,111,116,32,99,117,114,114,101,
+110,116,108,121,32,115,117,112,112,111,114,116,101,100,32,40,103,114,97,112,104,32,37,115,41,32,45,32,116,114,101,97,116,101,100,32,97,115,32,76,97,116,105,110,45,49,46,32,80,101,114,104,97,112,115,32,34,45,71,99,104,97,114,115,101,116,61,108,97,116,105,110,49,34,32,105,115,32,110,101,101,100,101,100,63,10,0,0,0,0,0,0,0,0,32,120,108,105,110,107,58,116,105,116,108,101,61,34,0,0,112,101,114,109,105,108,0,0,66,111,111,107,109,97,110,45,68,101,109,105,0,0,0,0,45,45,0,0,0,0,0,0,108,105,103,104,116,98,
+108,117,101,49,0,0,0,0,0,0,108,105,103,104,116,98,108,117,101,0,0,0,0,0,0,0,116,114,97,112,101,122,105,117,109,0,0,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,44,37,108,102,37,99,0,0,0,0,0,0,0,37,108,102,0,0,0,0,0,47,98,117,112,117,57,47,57,0,0,0,0,0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,52,0,0,0,37,46,53,103,44,37,46,53,103,44,37,46,53,103,0,0,103,114,97,112,104,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,51,0,0,0,99,99,32,40,37,100,32,99,101,108,108,115,41,32,97,116,
+32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,10,0,0,0,0,0,0,0,79,114,116,104,111,103,111,110,97,108,32,101,100,103,101,115,32,110,111,116,32,121,101,116,32,115,117,112,112,111,114,116,101,100,10,0,0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,50,0,0,0,48,0,0,0,0,0,0,0,108,101,109,111,110,99,104,105,102,102,111,110,49,0,0,0,85,110,107,110,111,119,110,32,72,84,77,76,32,101,108,101,109,101,110,116,32,60,37,115,62,32,111,110,32,108,105,110,101,32,37,100,32,10,0,0,118,111,114,111,110,111,
+105,0,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,105,112,0,0,0,0,0,0,108,97,119,110,103,114,101,101,110,0,0,0,0,0,0,0,99,111,110,99,101,110,116,114,97,116,101,61,116,114,117,101,32,109,97,121,32,110,111,116,32,119,111,114,107,32,99,111,114,114,101,99,116,108,121,46,10,0,0,0,0,0,0,0,35,49,48,49,48,49,48,0,108,97,118,101,110,100,101,114,98,108,117,115,104,52,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,51,0,0,99,114,105,109,115,111,110,0,32,120,108,105,110,107,58,104,114,101,102,
+61,34,0,0,0,112,97,114,116,0,0,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,50,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,49,0,0,108,97,118,101,110,100,101,114,98,108,117,115,104,0,0,0,108,97,118,101,110,100,101,114,0,0,0,0,0,0,0,0,47,98,117,112,117,57,47,56,0,0,0,0,0,0,0,0,65,108,116,101,114,110,97,116,105,118,101,108,121,44,32,99,111,110,115,105,100,101,114,32,114,117,110,110,105,110,103,32,110,101,97,116,111,32,117,115,105,110,103,32,45,71,112,97,99,107,61,116,114,117,101,32,
+111,114,32,100,101,99,111,109,112,111,115,105,110,103,10,0,107,104,97,107,105,52,0,0,107,104,97,107,105,51,0,0,108,101,97,100,101,114,32,33,61,32,78,85,76,76,0,0,107,104,97,107,105,50,0,0,115,118,103,122,58,115,118,103,0,0,0,0,0,0,0,0,107,104,97,107,105,49,0,0,37,37,66,111,117,110,100,105,110,103,66,111,120,58,0,0,32,108,105,110,101,116,111,10,0,0,0,0,0,0,0,0,107,104,97,107,105,0,0,0,105,118,111,114,121,52,0,0,60,97,0,0,0,0,0,0,112,97,114,97,0,0,0,0,105,118,111,114,121,51,0,0,105,118,111,114,121,
+50,0,0,78,68,95,114,97,110,107,40,118,41,32,61,61,32,114,0,32,116,105,116,108,101,61,34,0,0,0,0,0,0,0,0,105,118,111,114,121,49,0,0,105,118,111,114,121,0,0,0,47,98,117,112,117,57,47,55,0,0,0,0,0,0,0,0,105,110,118,105,115,0,0,0,105,110,100,105,103,111,0,0,105,110,100,105,97,110,114,101,100,52,0,0,0,0,0,0,105,110,100,105,97,110,114,101,100,51,0,0,0,0,0,0,105,110,100,105,97,110,114,101,100,50,0,0,0,0,0,0,105,110,100,105,97,110,114,101,100,49,0,0,0,0,0,0,32,105,100,61,34,97,95,0,111,117,109,108,0,0,0,
+0,105,110,100,105,97,110,114,101,100,0,0,0,0,0,0,0,104,111,116,112,105,110,107,52,0,0,0,0,0,0,0,0,104,111,116,112,105,110,107,51,0,0,0,0,0,0,0,0,104,111,116,112,105,110,107,50,0,0,0,0,0,0,0,0,47,98,117,112,117,57,47,54,0,0,0,0,0,0,0,0,101,114,114,111,114,32,105,110,32,112,114,111,99,101,115,115,105,110,103,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,0,0,104,111,116,112,105,110,107,49,0,0,0,0,0,0,0,0,104,111,116,112,105,110,107,0,104,111,110,
+101,121,100,101,119,52,0,0,0,0,0,0,0,104,111,110,101,121,100,101,119,51,0,0,0,0,0,0,0,104,111,110,101,121,100,101,119,50,0,0,0,0,0,0,0,104,111,110,101,121,100,101,119,49,0,0,0,0,0,0,0,60,103,0,0,0,0,0,0,111,116,105,109,101,115,0,0,104,111,110,101,121,100,101,119,0,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,116,111,111,32,109,97,110,121,32,40,62,32,37,100,41,32,115,97,109,101,123,104,101,97,100,44,116,97,105,108,125,32,103,114,111,117,112,115,32,102,111,114,32,110,111,100,
+101,32,37,115,10,0,0,0,0,0,103,114,101,121,57,57,0,0,103,114,101,121,57,56,0,0,106,112,101,58,109,97,112,0,103,114,101,121,57,55,0,0,47,98,117,112,117,57,47,53,0,0,0,0,0,0,0,0,103,114,101,121,57,54,0,0,98,111,116,104,0,0,0,0,103,114,101,121,57,53,0,0,103,114,101,121,57,52,0,0,103,114,101,121,57,51,0,0,103,114,101,121,57,50,0,0,103,114,101,121,57,49,0,0,60,47,103,62,10,0,0,0,111,116,105,108,100,101,0,0,103,114,101,121,57,48,0,0,37,115,32,45,62,32,37,115,58,32,115,112,108,105,110,101,32,115,105,122,
+101,32,62,32,49,32,110,111,116,32,115,117,112,112,111,114,116,101,100,10,0,0,0,0,0,0,0,0,103,114,101,121,57,0,0,0,47,98,117,112,117,57,47,52,0,0,0,0,0,0,0,0,103,114,101,121,56,57,0,0,103,114,101,121,56,56,0,0,103,114,101,121,56,55,0,0,9,0,0,0,0,0,0,0,103,114,101,121,56,54,0,0,37,108,102,44,37,108,102,37,99,0,0,0,0,0,0,0,103,114,101,121,56,53,0,0,103,114,101,121,56,52,0,0,103,114,101,121,56,51,0,0,103,114,101,121,56,50,0,0,60,47,97,62,10,0,0,0,111,115,108,97,115,104,0,0,103,114,101,121,56,49,0,0,103,
+114,101,121,56,48,0,0,103,114,101,121,56,0,0,0,103,114,101,121,55,57,0,0,47,98,117,112,117,57,47,51,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,103,114,101,121,55,56,0,0,103,114,101,121,55,55,0,0,103,114,101,121,55,54,0,0,103,114,101,121,55,53,0,0,103,114,101,121,55,52,0,0,84,105,109,101,115,45,66,111,108,100,0,0,0,0,0,0,103,114,101,121,55,51,0,0,60,47,116,101,120,116,62,10,0,0,0,0,0,0,0,0,111,114,100,109,0,0,0,0,103,114,101,121,55,50,0,0,103,114,101,121,55,49,0,0,103,114,101,121,55,48,0,0,103,114,101,121,55,
+0,0,0,47,98,117,112,117,57,47,50,0,0,0,0,0,0,0,0,103,114,101,121,54,57,0,0,103,114,101,121,54,56,0,0,103,114,101,121,54,55,0,0,77,97,120,114,97,110,107,32,61,32,37,100,44,32,109,105,110,114,97,110,107,32,61,32,37,100,10,0,0,0,0,0,103,114,101,121,54,54,0,0,103,114,101,121,54,53,0,0,103,114,101,121,54,52,0,0,62,0,0,0,0,0,0,0,111,114,100,102,0,0,0,0,103,114,101,121,54,51,0,0,103,114,101,121,54,50,0,0,103,114,101,121,54,49,0,0,103,114,101,121,54,48,0,0,47,98,117,112,117,57,47,49,0,0,0,0,0,0,0,0,112,117,
+114,112,108,101,0,0,103,114,101,121,54,0,0,0,103,114,101,121,53,57,0,0,103,114,101,121,53,56,0,0,103,114,101,121,53,55,0,0,119,104,105,116,101,0,0,0,103,114,101,121,53,54,0,0,103,114,101,121,53,53,0,0,32,102,105,108,108,61,34,35,37,48,50,120,37,48,50,120,37,48,50,120,34,0,0,0,103,114,101,121,53,52,0,0,111,114,0,0,0,0,0,0,104,101,105,103,104,116,0,0,47,97,99,99,101,110,116,55,47,50,0,0,0,0,0,0,97,100,100,105,110,103,32,37,100,32,105,116,101,109,115,44,32,116,111,116,97,108,32,97,114,101,97,32,61,32,
+37,102,44,32,119,32,61,32,37,102,44,32,97,114,101,97,47,119,61,37,102,10,0,0,0,0,109,105,110,100,105,115,116,0,103,114,101,121,53,51,0,0,103,114,101,121,53,50,0,0,65,82,61,37,48,46,52,108,102,9,32,65,114,101,97,61,32,37,48,46,52,108,102,9,0,0,0,0,0,0,0,0,103,114,101,121,53,49,0,0,47,98,117,112,117,56,47,56,0,0,0,0,0,0,0,0,103,114,101,121,53,48,0,0,103,114,101,121,53,0,0,0,103,114,101,121,52,57,0,0,117,115,45,62,110,97,109,101,0,0,0,0,0,0,0,0,103,114,101,121,52,56,0,0,115,101,116,108,105,110,101,119,
+105,100,116,104,0,0,0,0,103,114,101,121,52,55,0,0,103,114,101,121,52,54,0,0,37,100,0,0,0,0,0,0,32,102,105,108,108,61,34,37,115,34,0,0,0,0,0,0,111,112,108,117,115,0,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,79,98,108,105,113,117,101,0,0,45,62,0,0,0,0,0,0,103,114,101,121,52,53,0,0,112,115,50,58,112,115,0,0,103,114,101,121,52,52,0,0,100,105,97,109,111,110,100,0,95,112,111,114,116,95,37,115,95,40,37,100,41,95,40,37,100,41,95,37,108,100,0,0,32,105,110,32,37,115,32,45,32,115,101,116,116,
+105,110,103,32,116,111,32,37,46,48,50,102,10,0,0,0,0,0,0,103,114,101,121,52,51,0,0,98,98,0,0,0,0,0,0,37,100,32,37,49,91,34,93,37,110,0,0,0,0,0,0,103,114,101,121,52,50,0,0,47,98,117,112,117,56,47,55,0,0,0,0,0,0,0,0,112,111,115,91,37,100,93,32,37,100,32,37,100,10,0,0,103,114,101,121,52,49,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,103,114,101,121,52,48,0,0,73,77,71,0,0,0,0,0,103,114,101,121,52,0,0,0,110,111,110,101,0,0,0,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,
+109,111,114,121,32,105,110,32,97,97,103,95,99,114,101,97,116,101,95,98,117,102,102,101,114,40,41,0,0,0,0,108,97,98,101,108,95,102,108,111,97,116,0,0,0,0,0,103,114,101,121,51,57,0,0,35,102,48,102,48,102,48,0,103,114,101,121,51,56,0,0,32,102,111,110,116,45,115,105,122,101,61,34,37,46,50,102,34,0,0,0,0,0,0,0,115,101,103,35,37,100,32,58,32,40,37,46,51,102,44,32,37,46,51,102,41,32,40,37,46,51,102,44,32,37,46,51,102,41,10,0,0,0,0,0,103,114,101,121,51,55,0,0,115,118,103,0,0,0,0,0,99,111,114,110,115,105,
+108,107,0,0,0,0,0,0,0,0,111,109,105,99,114,111,110,0,76,97,121,111,117,116,32,116,121,112,101,58,32,34,37,115,34,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,32,85,115,101,32,111,110,101,32,111,102,58,37,115,10,0,0,0,0,0,0,0,0,103,114,101,121,51,54,0,0,103,114,101,121,51,53,0,0,103,114,101,121,51,52,0,0,103,114,101,121,51,51,0,0,47,98,117,112,117,56,47,54,0,0,0,0,0,0,0,0,123,10,0,0,0,0,0,0,105,115,32,117,110,100,101,102,105,110,101,100,46,32,82,101,118,101,114,116,105,110,103,32,116,
+111,32,116,104,101,32,115,104,111,114,116,101,115,116,32,112,97,116,104,32,109,111,100,101,108,46,10,0,0,0,0,103,114,101,121,51,50,0,0,103,114,101,121,51,49,0,0,108,101,118,101,108,32,110,111,100,101,32,114,101,99,0,0,103,114,101,121,51,48,0,0,103,114,101,121,51,0,0,0,40,91,97,45,122,93,91,97,45,122,65,45,90,93,42,41,61,34,40,91,94,34,93,42,41,34,0,0,0,0,0,0,32,109,111,118,101,116,111,10,0,0,0,0,0,0,0,0,103,114,101,121,50,57,0,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,
+98,34,0,0,0,103,114,101,121,50,56,0,0,37,37,37,37,67,114,101,97,116,111,114,58,32,37,115,32,118,101,114,115,105,111,110,32,37,115,32,40,37,115,41,10,0,0,0,0,0,0,0,0,111,109,101,103,97,0,0,0,114,32,38,38,32,110,0,0,103,114,101,121,50,55,0,0,103,114,101,121,50,54,0,0,99,111,110,115,116,114,97,105,110,105,110,103,95,102,108,97,116,95,101,100,103,101,40,103,44,118,44,101,41,32,61,61,32,70,65,76,83,69,0,0,100,97,115,104,101,100,0,0,32,116,97,114,103,101,116,61,34,0,0,0,0,0,0,0,103,114,101,121,50,53,0,
+0,103,114,101,121,50,52,0,0,47,98,117,112,117,56,47,53,0,0,0,0,0,0,0,0,103,114,101,121,50,51,0,0,103,114,101,121,50,50,0,0,103,114,101,121,50,49,0,0,103,114,101,121,50,48,0,0,103,114,101,121,50,0,0,0,32,98,97,115,101,108,105,110,101,45,115,104,105,102,116,61,34,115,117,112,101,114,34,0,103,114,101,121,49,57,0,0,32,69,80,83,70,45,51,46,48,10,0,0,0,0,0,0,111,108,105,110,101,0,0,0,103,114,101,121,49,56,0,0,99,108,117,115,116,101,114,46,99,0,0,0,0,0,0,0,103,114,101,121,49,55,0,0,47,98,117,112,117,56,
+47,52,0,0,0,0,0,0,0,0,103,114,101,121,49,54,0,0,103,114,101,121,49,53,0,0,117,110,99,108,111,115,101,100,32,67,68,65,84,65,32,115,101,99,116,105,111,110,0,0,103,114,101,121,49,52,0,0,103,114,101,121,49,51,0,0,103,114,101,121,49,50,0,0,103,114,101,121,49,49,0,0,103,114,101,121,49,48,48,0,103,114,101,121,49,48,0,0,37,33,80,83,45,65,100,111,98,101,45,51,46,48,0,0,111,103,114,97,118,101,0,0,103,114,101,121,49,0,0,0,103,114,101,121,48,0,0,0,103,114,101,121,0,0,0,0,103,114,101,101,110,121,101,108,108,111,
+119,0,0,0,0,0,47,98,117,112,117,56,47,51,0,0,0,0,0,0,0,0,106,112,101,103,58,109,97,112,0,0,0,0,0,0,0,0,103,114,101,101,110,52,0,0,103,114,101,101,110,51,0,0,98,97,99,107,0,0,0,0,103,114,101,101,110,50,0,0,103,114,101,101,110,49,0,0,103,114,101,101,110,0,0,0,44,0,0,0,0,0,0,0,103,114,97,121,57,57,0,0,37,37,69,79,70,10,0,0,111,101,108,105,103,0,0,0,103,114,97,121,57,56,0,0,103,114,97,121,57,55,0,0,103,114,97,121,57,54,0,0,103,114,97,121,57,53,0,0,47,98,117,112,117,56,47,50,0,0,0,0,0,0,0,0,103,114,97,
+121,57,52,0,0,103,114,97,121,57,51,0,0,103,114,97,121,57,50,0,0,103,114,97,121,57,49,0,0,103,114,97,121,57,48,0,0,37,115,108,105,110,101,45,116,104,114,111,117,103,104,0,0,103,114,97,121,57,0,0,0,101,110,100,10,114,101,115,116,111,114,101,10,0,0,0,0,111,99,105,114,99,0,0,0,103,114,97,121,56,57,0,0,103,114,97,121,56,56,0,0,103,114,97,121,56,55,0,0,103,114,97,121,56,54,0,0,47,98,117,112,117,56,47,49,0,0,0,0,0,0,0,0,103,114,97,121,56,53,0,0,37,100,32,37,100,32,35,37,48,50,120,37,48,50,120,37,48,50,120,
+10,0,0,0,0,103,114,97,121,56,52,0,0,103,114,97,121,56,51,0,0,103,114,97,121,56,50,0,0,103,114,97,121,56,49,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,79,98,108,105,113,117,101,0,0,117,110,100,101,114,108,105,110,101,0,0,0,0,0,0,0,103,114,97,121,56,48,0,0,37,37,37,37,80,97,103,101,115,58,32,37,100,10,0,0,111,97,99,117,116,101,0,0,103,114,97,121,56,0,0,0,103,114,97,121,55,57,0,0,103,114,97,121,55,56,0,0,103,114,97,121,55,55,0,0,47,98,117,112,117,55,47,55,0,0,0,0,0,0,0,0,103,114,97,121,
+55,54,0,0,103,114,97,121,55,53,0,0,103,114,97,121,55,52,0,0,103,114,97,121,55,51,0,0,103,114,97,121,55,50,0,0,32,116,101,120,116,45,100,101,99,111,114,97],"i8",L,l.J+122916);D([116,105,111,110,61,34,0,0,0,0,0,0,103,114,97,121,55,49,0,0,37,37,84,114,97,105,108,101,114,10,0,0,0,0,0,0,110,117,0,0,0,0,0,0,103,114,97,121,55,48,0,0,103,114,97,121,55,0,0,0,103,114,97,121,54,57,0,0,103,114,97,121,54,56,0,0,47,98,117,112,117,55,47,54,0,0,0,0,0,0,0,0,111,108,105,118,101,0,0,0,103,114,97,121,54,55,0,0,103,114,
+97,121,54,54,0,0,103,114,97,121,54,53,0,0,103,114,97,121,54,52,0,0,32,99,114,101,97,116,101,32,112,111,108,121,103,111,110,32,0,0,0,0,0,0,0,0,103,114,97,121,54,51,0,0,32,102,111,110,116,45,115,116,121,108,101,61,34,105,116,97,108,105,99,34,0,0,0,0,103,114,97,121,54,50,0,0,37,37,69,110,100,83,101,116,117,112,0,0,0,0,0,0,110,116,105,108,100,101,0,0,103,114,97,121,54,49,0,0,103,114,97,121,54,48,0,0,47,97,99,99,101,110,116,55,47,49,0,0,0,0,0,0,103,114,97,121,54,0,0,0,103,114,97,121,53,57,0,0,47,98,117,
+112,117,55,47,53,0,0,0,0,0,0,0,0,103,114,97,121,53,56,0,0,103,114,97,121,53,55,0,0,103,114,97,121,53,54,0,0,103,114,97,121,53,53,0,0,98,111,108,100,0,0,0,0,103,114,97,121,53,52,0,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,98,111,108,100,34,0,0,0,0,0,103,114,97,121,53,51,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,125,32,105,102,0,0,0,0,110,115,117,98,0,0,0,0,98,111,108,100,0,0,0,0,116,111,111,108,116,105,112,0,103,114,97,121,53,50,0,0,103,114,97,121,53,49,0,0,112,108,97,105,
+110,116,101,120,116,0,0,0,0,0,0,0,95,112,111,114,116,95,37,115,95,37,115,95,37,115,95,37,108,100,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,115,104,111,114,116,101,115,116,32,112,97,116,104,115,58,32,0,0,0,0,103,114,97,121,53,48,0,0,108,104,101,105,103,104,116,0,92,76,0,0,0,0,0,0,103,114,97,121,53,0,0,0,47,98,117,112,117,55,47,52,0,0,0,0,0,0,0,0,103,114,97,121,52,57,0,0,45,45,0,0,0,0,0,0,103,114,97,121,52,56,0,0,86,82,0,0,0,0,0,0,103,114,97,121,52,55,0,0,111,118,101,114,108,97,112,95,
+115,99,97,108,105,110,103,0,104,101,97,100,99,108,105,112,0,0,0,0,0,0,0,0,103,114,97,121,52,54,0,0,35,101,48,101,48,101,48,0,103,114,97,121,52,53,0,0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,34,0,0,0,0,0,0,0,103,114,97,121,52,52,0,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,62,62,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,0,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,0,110,111,116,105,110,0,0,0,103,114,97,121,52,51,0,0,103,114,
+97,121,52,50,0,0,103,114,97,121,52,49,0,0,103,114,97,121,52,48,0,0,47,98,117,112,117,55,47,51,0,0,0,0,0,0,0,0,103,114,97,112,104,32,0,0,103,114,97,112,104,32,37,115,32,105,115,32,100,105,115,99,111,110,110,101,99,116,101,100,46,32,72,101,110,99,101,44,32,116,104,101,32,99,105,114,99,117,105,116,32,109,111,100,101,108,10,0,0,0,0,0,103,114,97,121,52,0,0,0,103,114,97,121,51,57,0,0,108,101,118,101,108,32,101,100,103,101,32,114,101,99,0,0,103,114,97,121,51,56,0,0,103,114,97,121,51,55,0,0,109,109,0,0,0,
+0,0,0,110,101,119,112,97,116,104,32,0,0,0,0,0,0,0,0,103,114,97,121,51,54,0,0,32,102,111,110,116,45,115,116,121,108,101,61,34,37,115,34,0,0,0,0,0,0,0,0,103,114,97,121,51,53,0,0,32,32,32,32,117,115,101,114,100,105,99,116,32,40,60,60,41,32,99,118,110,32,40,91,41,32,99,118,110,32,108,111,97,100,32,112,117,116,0,0,108,105,110,101,0,0,0,0,110,111,116,0,0,0,0,0,103,114,97,121,51,52,0,0,103,114,97,121,51,51,0,0,109,105,110,99,114,111,115,115,58,32,112,97,115,115,32,37,100,32,105,116,101,114,32,37,100,32,
+116,114,121,105,110,103,32,37,100,32,99,117,114,95,99,114,111,115,115,32,37,100,32,98,101,115,116,95,99,114,111,115,115,32,37,100,10,0,32,104,114,101,102,61,34,0,103,114,97,121,51,50,0,0,103,114,97,121,51,49,0,0,47,98,117,112,117,55,47,50,0,0,0,0,0,0,0,0,103,114,97,121,51,48,0,0,103,114,97,121,51,0,0,0,103,114,97,121,50,57,0,0,103,114,97,121,50,56,0,0,103,114,97,121,50,55,0,0,32,102,111,110,116,45,115,116,114,101,116,99,104,61,34,37,115,34,0,0,0,0,0,0,103,114,97,121,50,54,0,0,50,32,108,116,32,123,
+0,0,110,105,0,0,0,0,0,0,103,114,97,121,50,53,0,0,103,114,97,121,50,52,0,0,103,114,97,121,50,51,0,0,103,114,97,121,50,50,0,0,47,98,117,112,117,55,47,49,0,0,0,0,0,0,0,0,101,110,99,111,100,105,110,103,32,115,112,101,99,105,102,105,101,100,32,105,110,32,88,77,76,32,100,101,99,108,97,114,97,116,105,111,110,32,105,115,32,105,110,99,111,114,114,101,99,116,0,0,0,0,0,0,111,117,116,32,111,102,32,109,101,109,111,114,121,0,0,0,103,114,97,121,50,49,0,0,103,114,97,121,50,48,0,0,103,114,97,121,50,0,0,0,103,114,
+97,121,49,57,0,0,103,114,97,121,49,56,0,0,32,102,111,110,116,45,119,101,105,103,104,116,61,34,37,115,34,0,0,0,0,0,0,0,103,114,97,121,49,55,0,0,47,108,97,110,103,117,97,103,101,108,101,118,101,108,32,119,104,101,114,101,32,123,112,111,112,32,108,97,110,103,117,97,103,101,108,101,118,101,108,125,123,49,125,32,105,102,101,108,115,101,0,0,0,0,0,0,110,101,0,0,0,0,0,0,103,114,97,121,49,54,0,0,103,114,97,121,49,53,0,0,103,114,97,121,49,52,0,0,103,114,97,121,49,51,0,0,47,98,117,112,117,54,47,54,0,0,0,0,0,
+0,0,0,103,105,102,58,109,97,112,0,103,114,97,121,49,50,0,0,103,114,97,121,49,49,0,0,103,114,97,121,49,48,48,0,102,111,114,119,97,114,100,0,103,114,97,121,49,48,0,0,103,114,97,121,49,0,0,0,44,37,115,0,0,0,0,0,103,114,97,121,48,0,0,0,37,32,109,97,107,101,32,39,60,60,39,32,97,110,100,32,39,62,62,39,32,115,97,102,101,32,111,110,32,80,83,32,76,101,118,101,108,32,49,32,100,101,118,105,99,101,115,0,110,100,97,115,104,0,0,0,103,114,97,121,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,44,
+32,108,105,110,101,32,37,100,58,32,37,115,32,37,115,32,114,97,110,107,32,37,100,32,105,32,61,32,37,100,32,97,110,32,61,32,48,10,0,0,103,111,108,100,101,110,114,111,100,52,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,51,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,50,0,0,0,0,0,0,47,98,117,112,117,54,47,53,0,0,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,49,0,0,0,0,0,0,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,0,103,111,108,100,52,0,0,0,103,111,108,100,51,0,0,0,103,111,108,100,50,0,0,
+0,32,102,111,110,116,45,102,97,109,105,108,121,61,34,37,115,0,0,0,0,0,0,0,0,103,111,108,100,49,0,0,0,47,112,100,102,109,97,114,107,32,119,104,101,114,101,32,123,112,111,112,125,32,123,117,115,101,114,100,105,99,116,32,47,112,100,102,109,97,114,107,32,47,99,108,101,97,114,116,111,109,97,114,107,32,108,111,97,100,32,112,117,116,125,32,105,102,101,108,115,101,0,0,0,110,98,115,112,0,0,0,0,112,101,110,100,32,100,105,99,116,111,102,32,97,32,98,97,100,32,111,98,106,101,99,116,0,0,0,0,0,0,0,0,103,111,108,
+100,0,0,0,0,103,104,111,115,116,119,104,105,116,101,0,0,0,0,0,0,103,97,105,110,115,98,111,114,111,0,0,0,0,0,0,0,102,111,114,101,115,116,103,114,101,101,110,0,0,0,0,0,47,98,117,112,117,54,47,52,0,0,0,0,0,0,0,0,102,108,111,114,97,108,119,104,105,116,101,0,0,0,0,0,102,105,114,101,98,114,105,99,107,52,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,51,102,32,37,100,32,37,46,52,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,
+37,100,32,37,100,10,0,0,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,51,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,50,0,0,0,0,0,0,102,105,114,101,98,114,105,99,107,49,0,0,0,0,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,0,32,120,61,34,37,103,34,32,121,61,34,37,103,34,0,0,102,105,114,101,98,114,105,99,107,0,0,0,0,0,0,0,37,32,109,97,107,101,32,115,117,114,101,32,112,100,102,109,97,114,107,32,105,115,32,104,97,114,109,108,101,115,115,32,102,111,114,32,80,83,45,105,110,116,101,114,112,
+114,101,116,101,114,115,32,111,116,104,101,114,32,116,104,97,110,32,68,105,115,116,105,108,108,101,114,0,0,0,0,0,0,0,0,110,97,98,108,97,0,0,0,100,111,100,103,101,114,98,108,117,101,52,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,51,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,50,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,49,0,0,0,0,0,47,98,117,112,117,54,47,51,0,0,0,0,0,0,0,0,100,111,100,103,101,114,98,108,117,101,0,0,0,0,0,0,100,105,109,103,114,101,121,0,100,105,109,103,114,97,121,
+0,102,111,110,116,115,105,122,101,0,0,0,0,0,0,0,0,100,101,101,112,115,107,121,98,108,117,101,52,0,0,0,0,100,101,101,112,115,107,121,98,108,117,101,51,0,0,0,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,109,105,100,100,108,101,34,0,0,0,100,101,101,112,115,107,121,98,108,117,101,50,0,0,0,0,37,32,47,97,114,114,111,119,119,105,100,116,104,32,53,32,100,101,102,0,0,0,0,0,109,117,0,0,0,0,0,0,100,101,101,112,115,107,121,98,108,117,101,49,0,0,0,0,102,108,97,116,46,99,0,0,100,101,101,112,115,107,121,
+98,108,117,101,0,0,0,0,0,100,101,101,112,112,105,110,107,52,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,51,0,0,0,0,0,0,0,47,98,117,112,117,54,47,50,0,0,0,0,0,0,0,0,110,97,118,121,0,0,0,0,100,101,101,112,112,105,110,107,50,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,49,0,0,0,0,0,0,0,100,101,101,112,112,105,110,107,0,0,0,0,0,0,0,0,100,97,114,107,118,105,111,108,101,116,0,0,0,0,0,0,32,45,115,109,111,111,116,104,32,98,101,122,105,101,114,32,0,0,0,0,0,0,0,0,100,97,114,107,116,117,114,113,117,111,105,
+115,101,0,0,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,101,110,100,34,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,101,121,0,0,0,37,32,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,0,0,0,109,105,110,117,115,0,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,52,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,51,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,50,0,0,47,97,99,99,101,110,116,54,47,54,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,
+103,114,97,121,49,0,0,47,98,117,112,117,54,47,49,0,0,0,0,0,0,0,0,100,97,114,107,115,108,97,116,101,103,114,97,121,0,0,0,100,97,114,107,115,108,97,116,101,98,108,117,101,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,52,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,51,0,0,0,102,105,108,108,101,100,0,0,100,97,114,107,115,101,97,103,114,101,101,110,50,0,0,0,32,116,101,120,116,45,97,110,99,104,111,114,61,34,115,116,97,114,116,34,0,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,49,0,0,
+0,95,95,99,108,117,115,116,101,114,110,111,100,101,115,0,0,49,32,115,101,116,109,105,116,101,114,108,105,109,105,116,0,109,105,100,100,111,116,0,0,100,101,109,105,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,100,97,114,107,115,101,97,103,114,101,101,110,0,0,0,0,100,97,114,107,115,97,108,109,111,110,0,0,0,0,0,0,110,111,110,101,0,0,0,0,110,111,100,101,32,34,37,115,34,32,105,115,32,99,111,110,116,97,105,110,101,100,32,105,110,32,116,119,111,32,110,111,110,45,99,111,109,112,97,114,97,
+98,108,101,32,99,108,117,115,116,101,114,115,32,34,37,115,34,32,97,110,100,32,34,37,115,34,10,0,0,0,0,101,110,100,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,0,0,0,0,0,0,0,115,116,117,102,102,46,99,0,100,97,114,107,111,114,99,104,105,100,52,0,0,0,0,0,108,119,105,100,116,104,0,0,92,84,0,0,0,0,0,0,32,115,112,108,105,116,115,32,105,110,116,111,32,116,119,111,32,116,111,107,101,110,115,10,0,
+0,0,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,51,0,0,0,0,0,47,98,117,112,117,53,47,53,0,0,0,0,0,0,0,0,115,116,101,112,32,115,105,122,101,32,61,32,37,100,10,0,100,97,114,107,111,114,99,104,105,100,50,0,0,0,0,0,45,62,0,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,49,0,0,0,0,0,72,82,0,0,0,0,0,0,100,97,114,107,111,114,99,104,105,100,0,0,0,0,0,0,37,100,0,0,0,0,0,0,100,97,114,107,111,114,97,110,103,101,52,0,0,0,0,0,78,68,95,114,97,110,107,40,102,114,111,109,41,32,60,32,78,68,95,114,97,110,107,
+40,116,111,41,0,0,0,0,0,35,101,56,101,56,101,56,0,100,97,114,107,111,114,97,110,103,101,51,0,0,0,0,0,60,116,101,120,116,0,0,0,100,97,114,107,111,114,97,110,103,101,50,0,0,0,0,0,49,52,32,100,101,102,97,117,108,116,45,102,111,110,116,45,102,97,109,105,108,121,32,115,101,116,95,102,111,110,116,0,109,105,99,114,111,0,0,0,99,111,114,97,108,0,0,0,100,97,114,107,111,114,97,110,103,101,49,0,0,0,0,0,100,97,114,107,111,114,97,110,103,101,0,0,0,0,0,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,52,
+0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,51,0,47,98,117,112,117,53,47,52,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,109,97,120,105,116,101,114,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,50,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,49,0,115,97,109,101,0,0,0,0,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,0,100,97,114,107,107,104,97,107,105,0,0,0,0,0,0,0,99,109,0,0,0,0,0,0,10,0,0,0,0,0,0,0,100,97,114,107,103,114,101,101,110,0,0,0,0,0,0,0,47,62,10,0,0,0,
+0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,52,0,0,37,37,66,101,103,105,110,83,101,116,117,112,0,0,0,0,109,100,97,115,104,0,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,51,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,50,0,0,109,101,114,103,101,50,58,32,103,114,97,112,104,32,37,115,44,32,114,97,110,107,32,37,100,32,104,97,115,32,111,110,108,121,32,37,100,32,60,32,37,100,32,110,111,100,101,115,10,0,0,0,0,0,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,49,0,0,
+34,0,0,0,0,0,0,0,100,97,114,107,103,111,108,100,101,110,114,111,100,0,0,0,47,98,117,112,117,53,47,51,0,0,0,0,0,0,0,0,99,121,97,110,52,0,0,0,99,121,97,110,51,0,0,0,99,121,97,110,50,0,0,0,99,121,97,110,49,0,0,0,99,121,97,110,0,0,0,0,32,114,120,61,34,37,103,34,32,114,121,61,34,37,103,34,0,0,0,0,0,0,0,0,99,114,105,109,115,111,110,0,37,37,69,110,100,80,114,111,108,111,103,0,0,0,0,0,109,97,99,114,0,0,0,0,99,111,114,110,115,105,108,107,52,0,0,0,0,0,0,0,115,97,109,101,104,101,97,100,0,0,0,0,0,0,0,0,99,111,
+114,110,115,105,108,107,51,0,0,0,0,0,0,0,99,111,114,110,115,105,108,107,50,0,0,0,0,0,0,0,99,111,114,110,115,105,108,107,49,0,0,0,0,0,0,0,47,98,117,112,117,53,47,50,0,0,0,0,0,0,0,0,117,110,107,110,111,119,110,32,101,110,99,111,100,105,110,103,0,0,0,0,0,0,0,0,99,111,114,110,115,105,108,107,0,0,0,0,0,0,0,0,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,0,99,111,114,97,108,52,0,0,99,111,114,97,108,51,0,0,99,111,114,97,108,50,0,0,32,99,120,61,34,37,103,34,32,99,121,61,34,37,103,34,0,0,0,0,0,0,
+0,0,99,111,114,97,108,49,0,0,105,115,109,97,112,58,109,97,112,0,0,0,0,0,0,0,108,116,0,0,0,0,0,0,99,111,114,97,108,0,0,0,99,104,111,99,111,108,97,116,101,52,0,0,0,0,0,0,37,37,69,110,100,82,101,115,111,117,114,99,101,0,0,0,99,104,111,99,111,108,97,116,101,51,0,0,0,0,0,0,99,104,111,99,111,108,97,116,101,50,0,0,0,0,0,0,47,98,117,112,117,53,47,49,0,0,0,0,0,0,0,0,112,110,103,58,109,97,112,0,99,104,111,99,111,108,97,116,101,49,0,0,0,0,0,0,99,104,111,99,111,108,97,116,101,0,0,0,0,0,0,0,99,104,97,114,116,
+114,101,117,115,101,52,0,0,0,0,0,99,104,97,114,116,114,101,117,115,101,51,0,0,0,0,0,105,110,118,101,109,112,116,121,0,0,0,0,0,0,0,0,99,104,97,114,116,114,101,117,115,101,50,0,0,0,0,0,60,101,108,108,105,112,115,101,0,0,0,0,0,0,0,0,99,104,97,114,116,114,101,117,115,101,49,0,0,0,0,0,47,99,117,114,108,97,121,101,114,32,48,32,100,101,102,0,108,115,113,117,111,0,0,0,99,104,97,114,116,114,101,117,115,101,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,52,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,51,0,0,
+0,0,0,0,103,105,102,58,115,118,103,0,99,97,100,101,116,98,108,117,101,50,0,0,0,0,0,0,47,98,117,112,117,52,47,52,0,0,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,49,0,0,0,0,0,0,99,97,100,101,116,98,108,117,101,0,0,0,0,0,0,0,98,117,114,108,121,119,111,111,100,52,0,0,0,0,0,0,98,117,114,108,121,119,111,111,100,51,0,0,0,0,0,0,98,117,114,108,121,119,111,111,100,50,0,0,0,0,0,0,37,103,44,37,103,0,0,0,98,117,114,108,121,119,111,111,100,49,0,0,0,0,0,0,9,123,105,110,118,105,115,125,32,105,102,0,0,0,0,0,108,
+115,97,113,117,111,0,0,98,117,114,108,121,119,111,111,100,0,0,0,0,0,0,0,98,114,111,119,110,52,0,0,98,114,111,119,110,51,0,0,98,114,111,119,110,50,0,0,47,98,117,112,117,52,47,51,0,0,0,0,0,0,0,0,98,114,111,119,110,49,0,0,98,114,111,119,110,0,0,0,98,108,117,101,118,105,111,108,101,116,0,0,0,0,0,0,32,37,100,0,0,0,0,0,98,108,117,101,52,0,0,0,98,108,117,101,51,0,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,79,98,108,105,113,117,101,0,0,60,112,111,108,121,103,111,110,0,0,0,0,0,0,0,0,98,108,
+117,101,50,0,0,0,9,111,114,0,0,0,0,0,108,114,109,0,0,0,0,0,98,108,117,101,49,0,0,0,98,108,117,101,0,0,0,0,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,0,98,108,97,99,107,0,0,0,47,98,117,112,117,52,47,50,0,0,0,0,0,0,0,0,98,105,115,113,117,101,52,0,98,105,115,113,117,101,51,0,98,105,115,113,117,101,50,0,98,105,115,113,117,101,49,0,98,105,115,113,117,101,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,59,34,47,62,10,60,47,108,105,110,101,97,114,71,114,97,100,105,101,110,116,62,10,
+60,47,100,101,102,115,62,10,0,98,101,105,103,101,0,0,0,9,99,117,114,108,97,121,101,114,32,109,121,117,112,112,101,114,32,103,116,0,0,0,0,108,111,122,0,0,0,0,0,97,122,117,114,101,52,0,0,97,122,117,114,101,51,0,0,97,122,117,114,101,50,0,0,97,122,117,114,101,49,0,0,47,98,117,112,117,52,47,49,0,0,0,0,0,0,0,0,109,97,114,111,111,110,0,0,97,122,117,114,101,0,0,0,97,113,117,97,109,97,114,105,110,101,52,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,51,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,50,0,0,
+0,0,0,32,45,119,105,100,116,104,32,0,0,0,0,0,0,0,0,97,113,117,97,109,97,114,105,110,101,49,0,0,0,0,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,37,46,48,51,102,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,97,113,117,97,109,97,114,105,110,101,0,0,0,0,0,0,9,99,117,114,108,97,121,101,114,32,109,121,108,111,119,101,114,32,108,116,0,0,0,0,108,111,119,97,115,116,0,0,97,110,116,105,113,117,101,119,104,105,116,101,52,0,0,0,97,110,116,105,113,117,101,119,104,105,116,
+101,51,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,50,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,49,0,0,0,47,97,99,99,101,110,116,54,47,53,0,0,0,0,0,0,47,98,117,112,117,51,47,51,0,0,0,0,0,0,0,0,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,97,108,105,99,101,98,108,117,101,0,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,57,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,56,0,0,0,0,0,0,83,32,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,55,0,0,0,0,0,0,47,121,108,111,114,114,100,
+57,47,54,0,0,0,0,0,0,120,49,61,34,37,103,34,32,121,49,61,34,37,103,34,32,120,50,61,34,37,103,34,32,121,50,61,34,37,103,34,32,62,10,0,0,0,0,0,0,99,108,117,115,116,101,114,0,9,47,109,121,108,111,119,101,114,32,101,120,99,104,32,100,101,102,0,0,0,0,0,0,108,102,108,111,111,114,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,0,47,121,108,111,114,114,100,57,47,53,0,0,0,0,0,0,95,76,84,88,95,108,105,98,114,97,114,121,0,0,0,0,47,121,108,111,114,114,100,57,47,52,0,0,0,0,0,0,116,114,105,97,110,103,
+108,101,0,0,0,0,0,0,0,0,75,0,0,0,0,0,0,0,110,111,116,32,99,111,110,115,116,114,97,105,110,101,100,0,66,111,117,110,100,105,110,103,66,111,120,32,110,111,116,32,102,111,117,110,100,32,105,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,0,78,68,95,104,101,97,112,105,110,100,101,120,40,118,41,32,60,32,48,0,0,0,0,0,47,121,108,111,114,114,100,57,47,51,0,0,0,0,0,0,116,97,105,108,95,108,112,0,92,72,0,0,0,0,0,0,39,32,105,110,32,108,105,110,101,32,37,100,32,111,102,32,0,0,0,0,0,0,0,0,47,121,108,111,
+114,114,100,57,47,50,0,0,0,0,0,0,47,98,117,112,117,51,47,50,0,0,0,0,0,0,0,0,117,110,100,101,102,105,110,101,100,0,0,0,0,0,0,0,47,121,108,111,114,114,100,57,47,49,0,0,0,0,0,0,99,111,108,111,114,0,0,0,47,121,108,111,114,114,100,56,47,56,0,0,0,0,0,0,66,82,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,55,0,0,0,0,0,0,85,110,114,101,99,111,103,110,105,122,101,100,32,111,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,45,32,117,115,105,110,103,32,102,97,108,115,101,10,0,0,102,111,110,116,
+110,97,109,101,0,0,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,54,0,0,0,0,0,0,35,51,48,51,48,51,48,0,47,121,108,111,114,114,100,56,47,53,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,52,0,0,0,0,0,0,60,100,101,102,115,62,10,60,108,105,110,101,97,114,71,114,97,100,105,101,110,116,32,105,100,61,34,108,95,37,100,34,32,103,114,97,100,105,101,110,116,85,110,105,116,115,61,34,117,115,101,114,83,112,97,99,101,79,110,85,115,101,34,32,0,0,0,0,0,0,0,0,9,47,109,121,117,112,112,101,114,32,101,120,99,104,32,100,
+101,102,0,0,0,0,0,0,108,101,0,0,0,0,0,0,99,104,111,99,111,108,97,116,101,0,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,50,0,0,0,0,0,0,47,121,108,111,114,114,100,56,47,49,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,55,0,0,0,0,0,0,47,98,117,112,117,51,47,49,0,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,121,108,111,114,114,100,55,47,54,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,
+53,0,0,0,0,0,0,115,105,110,107,0,0,0,0,47,121,108,111,114,114,100,55,47,52,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,51,0,0,0,0,0,0,34,0,0,0,0,0,0,0,37,32,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,50,0,0,0,0,0,0,47,121,108,111,114,114,100,55,47,49,0,0,0,0,0,0,59,34,47,62,10,60,47,114,97,100,105,97,108,71,114,97,100,105,101,110,116,62,10,60,47,100,101,102,115,62,10,0,47,111,110,108,97,121,101,114,115,32,123,0,0,0,0,0,108,100,113,117,111,0,0,0,97,103,100,101,108,101,116,101,32,111,110,32,98,97,
+100,32,111,98,106,101,99,116,0,0,47,121,108,111,114,114,100,54,47,54,0,0,0,0,0,0,47,121,108,111,114,114,100,54,47,53,0,0,0,0,0,0,109,105,110,99,114,111,115,115,32,37,115,58,32,37,100,32,99,114,111,115,115,105,110,103,115,44,32,37,46,50,102,32,115,101,99,115,46,10,0,0,47,121,108,111,114,114,100,54,47,52,0,0,0,0,0,0,32,105,100,61,34,0,0,0,47,121,108,111,114,114,100,54,47,51,0,0,0,0,0,0,47,98,117,103,110,57,47,57,0,0,0,0,0,0,0,0,47,121,108,111,114,114,100,54,47,50,0,0,0,0,0,0,47,121,108,111,114,114,
+100,54,47,49,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,53,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,52,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,53,47,50,0,0,0,0,0,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,49,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,0,0,0,0,47,111,110,108,97,121,101,114,32,123,32,99,117,114,108,97,121,101,114,32,110,101,32,123,105,110,118,105,115,125,32,105,102,32,125,32,100,101,102,0,
+108,99,101,105,108,0,0,0,47,121,108,111,114,114,100,53,47,49,0,0,0,0,0,0,47,121,108,111,114,114,100,52,47,52,0,0,0,0,0,0,47,121,108,111,114,114,100,52,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,52,47,50,0,0,0,0,0,0,47,98,117,103,110,57,47,56,0,0,0,0,0,0,0,0,88,77,76,32,111,114,32,116,101,120,116,32,100,101,99,108,97,114,97,116,105,111,110,32,110,111,116,32,97,116,32,115,116,97,114,116,32,111,102,32,101,110,116,105,116,121,0,0,47,121,108,111,114,114,100,52,47,49,0,0,0,0,0,0,47,121,108,111,114,114,
+100,51,47,51,0,0,0,0,0,0,47,121,108,111,114,114,100,51,47,50,0,0,0,0,0,0,47,121,108,111,114,114,100,51,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,57,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,56,0,0,0,0,0,0,59,34,47,62,10,0,0,0,9,47,103,114,97,112,104,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,0,0,0,0,108,97,114,114,0,0,0,0,47,121,108,111,114,98,114,57,47,55,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,54,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,53,0,0,
+0,0,0,0,47,121,108,111,114,98,114,57,47,52,0,0,0,0,0,0,47,98,117,103,110,57,47,55,0,0,0,0,0,0,0,0,40,108,105,98,41,58,112,115,0,0,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,57,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,56,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,55,0,0,0,0,0,0,104,97,108,102,0,0,0,0,47,121,108,111,114,98,114,56,47,54,0,0,0,0,0,0,49,46,0,0,0,0,0,0,9,47,101,100,103,101,99,111,108,111,
+114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,0,0,0,0,0,108,97,113,117,111,0,0,0,47,121,108,111,114,98,114,56,47,53,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,52,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,50,0,0,0,0,0,0,47,98,117,103,110,57,47,54,0,0,0,0,0,0,0,0,47,121,108,111,114,98,114,56,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,55,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,54,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,
+53,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,52,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,51,0,0,0,0,0,0,37,102,0,0,0,0,0,0,9,47,110,111,100,101,99,111,108,111,114,32,123,110,111,112,99,111,108,111,114,125,32,100,101,102,0,0,0,0,0,0,108,97,110,103,0,0,0,0,47,121,108,111,114,98,114,55,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,55,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,54,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,53,0,0,0,0,0,0,47,98,117,103,110,57,47,53,0,0,0,0,0,0,0,0,47,121,108,
+111,114,98,114,54,47,52,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,54,47,49,0,0,0,0,0,0,32,37,115,10,0,0,0,0,47,121,108,111,114,98,114,53,47,53,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,52,0,0,0,0,0,0,65,118,97,110,116,71,97,114,100,101,45,68,101,109,105,0,59,115,116,111,112,45,111,112,97,99,105,116,121,58,0,0,9,97,108,111,97,100,32,112,111,112,32,115,101,116,104,115,98,99,111,108,111,114,0,0,108,97,109,98,
+100,97,0,0,108,105,110,101,108,101,110,103,116,104,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,53,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,52,0,0,0,0,0,0,47,98,117,103,110,57,47,52,0,0,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,51,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,52,47,49,0,0,0,0,0,0,47,121,108,111,114,98,114,51,47,51,0,0,0,0,0,0,47,121,108,111,114,
+98,114,51,47,50,0,0,0,0,0,0,47,121,108,111,114,98,114,51,47,49,0,0,0,0,0,0,60,115,116,111,112,32,111,102,102,115,101,116,61,34,48,34,32,115,116,121,108,101,61,34,115,116,111,112,45,99,111,108,111,114,58,0,0,0,0,0,9,108,97,121,101,114,99,111,108,111,114,115,101,113,32,99,117,114,108,97,121,101,114,32,49,32,115,117,98,32,108,97,121,101,114,108,101,110,32,109,111,100,32,103,101,116,0,0,108,65,114,114,0,0,0,0,47,121,108,103,110,98,117,57,47,57,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,
+0,0,0,0,47,121,108,103,110,98,117,57,47,56,0,0,0,0,0,0,47,98,117,103,110,57,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,55,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,54,0,0,0,0,0,0,115,116,114,101,97,109,32,101,110,100,0,0,0,0,0,0,108,105,109,101,0,0,0,0,47,121,108,103,110,98,117,57,47,53,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,52,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,51,0,0,0,0,0,0,47,121,108,103,110,98,117,57,47,50,0,0,0,0,0,0,36,99,0,0,0,0,0,0,47,121,108,103,110,98,117,57,
+47,49,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,56,0,0,0,0,0,0,60,100,101,102,115,62,10,60,114,97,100,105,97,108,71,114,97,100,105,101,110,116,32,105,100,61,34,114,95,37,100,34,32,99,120,61,34,53,48,37,37,34,32,99,121,61,34,53,48,37,37,34,32,114,61,34,55,53,37,37,34,32,102,120,61,34,37,100,37,37,34,32,102,121,61,34,37,100,37,37,34,62,10,0,0,0,0,0,47,115,101,116,108,97,121,101,114,32,123,47,109,97,120,108,97,121,101,114,32,101,120,99,104,32,100,101,102,32,47,99,117,114,108,97,121,101,114,32,101,
+120,99,104,32,100,101,102,0,0,0,0,0,0,0,0,107,97,112,112,97,0,0,0,47,121,108,103,110,98,117,56,47,55,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,54,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,53,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,52,0,0,0,0,0,0,47,98,117,103,110,57,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,51,0,0,0,0,0,0,110,97,110,0,0,0,0,0,47,97,99,99,101,110,116,54,47,52,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,50,0,0,0,0,0,0,47,121,108,103,110,98,117,56,47,49,0,0,0,0,0,
+0,47,121,108,103,110,98,117,55,47,55,0,0,0,0,0,0,37,46,51,102,0,0,0,0,115,104,111,114,116,101,115,116,46,99,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,54,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,53,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,37,99,37,103,44,37,103,0,47,108,97,121,101,114,108,101,110,32,108,97,121,101,114,99,111,108,111,114,115,101,113,32,108,101,110,103,116,104,32,100,101,102,0,0,0,0,0,0,105,117,109,108,0,0,0,0,105,116,97,108,105,99,0,0,65,103,114,97,112,104,105,
+110,102,111,95,116,0,0,0,0,47,121,108,103,110,98,117,55,47,52,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,51,0,0,0,0,0,0,101,103,103,0,0,0,0,0,115,101,112,0,0,0,0,0,99,111,110,115,116,114,97,105,110,101,100,0,0,0,0,0,114,101,97,100,0,0,0,0,37,115,32,37,46,51,102,10,0,0,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,50,0,0,0,0,0,0,104,101,97,100,95,108,112,0,92,69,0,0,0,0,0,0,47,121,108,103,110,98,117,55,47,49,0,0,0,0,0,0,47,98,117,103,110,57,47,49,0,0,0,0,0,0,0,0,95,65,71,95,115,116,114,100,97,116,97,
+0,0,0,0,0,32,32,109,97,114,103,105,110,32,37,100,10,0,0,0,0,47,121,108,103,110,98,117,54,47,54,0,0,0,0,0,0,112,101,110,99,111,108,111,114,0,0,0,0,0,0,0,0,115,104,97,112,101,0,0,0,47,121,108,103,110,98,117,54,47,53,0,0,0,0,0,0,83,0,0,0,0,0,0,0,47,121,108,103,110,98,117,54,47,52,0,0,0,0,0,0,79,118,101,114,108,97,112,32,118,97,108,117,101,32,34,37,115,34,32,117,110,115,117,112,112,111,114,116,101,100,32,45,32,105,103,110,111,114,101,100,10,0,0,0,0,0,0,0,100,101,114,105,118,101,100,0,119,101,105,103,
+104,116,0,0,47,121,108,103,110,98,117,54,47,51,0,0,0,0,0,0,35,102,99,102,99,102,99,0,47,121,108,103,110,98,117,54,47,50,0,0,0,0,0,0,47,121,108,103,110,98,117,54,47,49,0,0,0,0,0,0,32,100,61,34,0,0,0,0,100,101,102,0,0,0,0,0,105,115,105,110,0,0,0,0,78,111,32,108,111,97,100,105,109,97,103,101,32,112,108,117,103,105,110,32,102,111,114,32,34,37,115,34,10,0,0,0,99,104,97,114,116,114,101,117,115,101,0,0,0,0,0,0,47,121,108,103,110,98,117,53,47,53,0,0,0,0,0,0,47,121,108,103,110,98,117,53,47,52,0,0,0,0,0,0,
+47,121,108,103,110,98,117,53,47,51,0,0,0,0,0,0,47,121,108,103,110,98,117,53,47,50,0,0,0,0,0,0,47,98,117,103,110,56,47,56,0,0,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,97,115,32,114,101,113,117,105,114,101,100,32,98,121,32,116,104,101,32,45,110,32,102,108,97,103,10,0,0,0,0,0,47,121,108,103,110,98,117,53,47,49,0,0,0,0,0,0,47,121,108,103,110,98,117,52,47,52,0,0,0,0,0,0,109,97,120,0,0,0,0,0,47,121,108,103,110,98,117,52,47,51,0,0,0,0,0,0,47,121,108,103,110,98,117,52,47,50,0,0,0,0,0,0,
+112,99,0,0,0,0,0,0,47,121,108,103,110,98,117,52,47,49,0,0,0,0,0,0,37,46,53,103,32,37,46,53,103,32,37,46,53,103,32,37,115,99,111,108,111,114,10,0,47,121,108,103,110,98,117,51,47,51,0,0,0,0,0,0,60,112,97,116,104,0,0,0,9,93,0,0,0,0,0,0,115,121,110,116,97,120,32,97,109,98,105,103,117,105,116,121,32,45,32,98,97,100,108,121,32,100,101,108,105,109,105,116,101,100,32,110,117,109,98,101,114,32,39,0,0,0,0,0,105,113,117,101,115,116,0,0,47,121,108,103,110,98,117,51,47,50,0,0,0,0,0,0,101,114,114,111,114,32,105,
+110,32,99,111,108,120,108,97,116,101,40,41,10,0,0,0,0,47,121,108,103,110,98,117,51,47,49,0,0,0,0,0,0,40,114,118,32,61,61,32,48,41,32,124,124,32,40,78,68,95,111,114,100,101,114,40,114,118,41,45,78,68,95,111,114,100,101,114,40,118,41,41,42,100,105,114,32,62,32,48,0,47,121,108,103,110,57,47,57,0,0,0,0,0,0,0,0,60,97,114,101,97,32,115,104,97,112,101,61,34,112,111,108,121,34,0,0,0,0,0,0,47,121,108,103,110,57,47,56,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,55,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,55,0,
+0,0,0,0,0,0,0,47,121,108,103,110,57,47,54,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,57,47,50,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,115,118,103,46,99,0,0,0,0,0,9,9,91,46,56,32,46,56,32,46,56,93,0,0,0,0,105,111,116,97,0,0,0,0,47,121,108,103,110,57,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,56,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,55,0,0,0,
+0,0,0,0,0,47,121,108,103,110,56,47,54,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,54,0,0,0,0,0,0,0,0,114,101,102,101,114,101,110,99,101,32,116,111,32,101,120,116,101,114,110,97,108,32,101,110,116,105,116,121,32,105,110,32,97,116,116,114,105,98,117,116,101,0,0,0,0,0,0,0,47,121,108,103,110,56,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,56,47,49,0,0,0,0,0,0,0,0,47,121,108,103,
+110,55,47,55,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,9,9,91,46,54,32,46,56,32,46,56,93,0,0,0,0,105,110,116],"i8",L,l.J+133156);D([47,121,108,103,110,55,47,54,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,51,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,53,0,0,0,0,0,0,0,0,112,115,58,112,115,0,0,0,47,121,108,103,110,55,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,55,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,54,0,0,0,0,0,0,0,0,47,
+121,108,103,110,54,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,51,0,0,0,0,0,0,0,0,101,0,0,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,9,9,91,46,52,32,46,56,32,46,56,93,0,0,0,0,105,110,102,105,110,0,0,0,47,121,108,103,110,54,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,54,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,53,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,52,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,
+53,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,50,0,0,0,0,0,0,0,0,47,121,108,103,110,53,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,52,47,52,0,0,0,0,0,0,0,0,47,121,108,103,110,52,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,52,47,50,0,0,0,0,0,0,0,0,53,44,50,0,0,0,0,0,9,9,91,46,50,32,46,56,32,46,56,93,0,0,0,0,105,109,97,103,101,0,0,0,47,121,108,103,110,52,47,49,0,0,0,0,0,0,0,0,47,121,108,103,110,51,47,51,0,0,0,0,0,0,0,0,47,98,117,103,110,56,47,51,0,0,0,0,0,0,0,0,47,121,108,103,110,51,47,50,0,0,0,0,0,0,
+0,0,47,121,108,103,110,51,47,49,0,0,0,0,0,0,0,0,47,115,118,103,47,121,101,108,108,111,119,103,114,101,101,110,0,0,0,0,0,0,0,0,47,115,118,103,47,121,101,108,108,111,119,0,0,0,0,0,47,115,118,103,47,119,104,105,116,101,115,109,111,107,101,0,47,115,118,103,47,119,104,105,116,101,0,0,0,0,0,0,47,115,118,103,47,119,104,101,97,116,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,47,115,118,
+103,47,118,105,111,108,101,116,0,0,0,0,0,82,0,0,0,0,0,0,0,49,44,53,0,0,0,0,0,9,9,91,48,32,48,32,48,93,0,0,0,0,0,0,0,105,103,114,97,118,101,0,0,108,97,121,111,117,116,0,0,47,115,118,103,47,116,117,114,113,117,111,105,115,101,0,0,47,115,118,103,47,116,111,109,97,116,111,0,0,0,0,0,47,115,118,103,47,116,104,105,115,116,108,101,0,0,0,0,47,115,118,103,47,116,101,97,108,0,0,0,0,0,0,0,47,98,117,103,110,56,47,50,0,0,0,0,0,0,0,0,47,115,118,103,47,116,97,110,0,0,0,0,0,0,0,0,47,115,118,103,47,115,116,101,101,
+108,98,108,117,101,0,0,47,115,118,103,47,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,0,0,0,47,115,118,103,47,115,110,111,119,0,0,0,0,0,0,0,115,97,109,101,116,97,105,108,0,0,0,0,0,0,0,0,47,115,118,103,47,115,108,97,116,101,103,114,101,121,0,0,47,115,118,103,47,115,108,97,116,101,103,114,97,121,0,0,34,0,0,0,0,0,0,0,9,91,9,37,32,108,97,121,101,114,32,99,111,108,111,114,32,115,101,113,117,101,110,99,101,32,45,32,100,97,114,107,101,115,116,32,116,111,32,108,105,103,104,116,101,115,116,0,105,
+101,120,99,108,0,0,0,47,115,118,103,47,115,108,97,116,101,98,108,117,101,0,0,102,97,115,116,103,114,46,99,0,0,0,0,0,0,0,0,47,115,118,103,47,115,107,121,98,108,117,101,0,0,0,0,47,115,118,103,47,115,105,108,118,101,114,0,0,0,0,0,47,115,118,103,47,115,105,101,110,110,97,0,0,0,0,0,47,98,117,103,110,56,47,49,0,0,0,0,0,0,0,0,103,114,101,101,110,0,0,0,47,115,118,103,47,115,101,97,115,104,101,108,108,0,0,0,47,115,118,103,47,115,101,97,103,114,101,101,110,0,0,0,47,115,118,103,47,115,97,110,100,121,98,114,
+111,119,110,0,47,115,118,103,47,115,97,108,109,111,110,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,47,115,118,103,47,115,97,100,100,108,101,98,114,111,119,110,0,0,0,0,0,0,0,0,47,115,118,103,47,114,111,121,97,108,98,108,117,101,0,0,34,32,115,116,114,111,107,101,45,111,112,97,99,105,116,121,61,34,37,102,0,0,0,0,47,108,97,121,101,114,99,111,108,111,114,115,101,113,0,0,105,99,105,114,99,0,0,0,47,115,118,103,47,114,111,115,121,98,114,111,119,110,0,0,47,115,118,103,47,114,101,100,0,0,0,0,
+0,0,0,0,47,115,118,103,47,112,117,114,112,108,101,0,0,0,0,0,47,115,118,103,47,112,111,119,100,101,114,98,108,117,101,0,47,98,117,103,110,55,47,55,0,0,0,0,0,0,0,0,47,115,118,103,47,112,108,117,109,0,0,0,0,0,0,0,47,115,118,103,47,112,105,110,107,0,0,0,0,0,0,0,47,97,99,99,101,110,116,54,47,51,0,0,0,0,0,0,47,115,118,103,47,112,101,114,117,0,0,0,0,0,0,0,47,115,118,103,47,112,101,97,99,104,112,117,102,102,0,0,115,101,116,108,105,110,101,119,105,100,116,104,40,0,0,0,47,115,118,103,47,112,97,112,97,121,97,
+119,104,105,112,0,47,115,118,103,47,112,97,108,101,118,105,111,108,101,116,114,101,100,0,0,0,0,0,0,34,32,115,116,114,111,107,101,45,100,97,115,104,97,114,114,97,121,61,34,37,115,0,0,47,115,104,111,119,112,97,103,101,32,123,32,125,32,100,101,102,0,0,0,0,0,0,0,105,97,99,117,116,101,0,0,111,98,108,105,113,117,101,0,114,0,0,0,0,0,0,0,47,115,118,103,47,112,97,108,101,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,47,115,118,103,47,112,97,108,101,103,114,101,101,110,0,0,112,111,105,110,116,0,0,0,115,116,
+97,114,116,32,112,111,114,116,58,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,116,97,110,103,101,110,116,32,97,110,103,108,101,58,32,37,46,53,103,44,32,37,115,10,0,0,0,0,0,0,108,101,110,0,0,0,0,0,37,37,37,37,66,111,117,110,100,105,110,103,66,111,120,58,32,37,100,32,37,100,32,37,100,32,37,100,0,0,0,0,47,115,118,103,47,112,97,108,101,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,108,112,0,0,0,0,0,0,92,78,0,0,0,0,0,0,105,110,112,117,116,0,0,0,47,115,118,103,47,111,114,99,104,105,100,0,0,0,0,0,47,
+98,117,103,110,55,47,54,0,0,0,0,0,0,0,0,112,97,99,107,0,0,0,0,47,115,118,103,47,111,114,97,110,103,101,114,101,100,0,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,105,109,97,103,101,32,102,105,108,101,61,34,37,115,34,10,0,47,115,118,103,47,111,114,97,110,103,101,0,0,0,0,0,83,85,66,0,0,0,0,0,47,115,118,103,47,111,108,105,118,101,100,114,97,98,0,0,118,111,114,111,95,109,97,114,103,105,110,0,0,0,0,0,95,98,108,111,99,107,95,37,100,0,0,0,0,0,0,0,47,115,118,103,47,111,108,105,118,101,0,0,0,
+0,0,0,108,104,101,97,100,0,0,0,35,56,48,56,48,56,48,0,47,115,118,103,47,111,108,100,108,97,99,101,0,0,0,0,47,115,118,103,47,110,97,118,121,0,0,0,0,0,0,0,34,32,115,116,114,111,107,101,45,119,105,100,116,104,61,34,37,103,0,0,0,0,0,0,47,101,110,100,112,97,103,101,32,123,32,115,104,111,119,112,97,103,101,32,125,32,98,105,110,100,32,100,101,102,0,0,104,101,108,108,105,112,0,0,111,118,101,114,108,97,112,0,99,97,100,101,116,98,108,117,101,0,0,0,0,0,0,0,47,115,118,103,47,110,97,118,97,106,111,119,104,105,
+116,101,0,0,0,0,0,0,0,0,112,105,99,58,112,105,99,0,47,115,118,103,47,109,111,99,99,97,115,105,110,0,0,0,47,115,118,103,47,109,105,115,116,121,114,111,115,101,0,0,47,115,118,103,47,109,105,110,116,99,114,101,97,109,0,0,47,98,117,103,110,55,47,53,0,0,0,0,0,0,0,0,115,116,114,105,99,116,32,0,110,111,100,101,32,112,111,115,105,116,105,111,110,115,32,97,114,101,32,105,103,110,111,114,101,100,32,117,110,108,101,115,115,32,115,116,97,114,116,61,114,97,110,100,111,109,10,0,47,115,118,103,47,109,105,100,110,
+105,103,104,116,98,108,117,101,0,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,118,105,111,108,101,116,114,101,100,0,0,0,0,115,111,117,114,99,101,0,0,47,115,118,103,47,109,101,100,105,117,109,116,117,114,113,117,111,105,115,101,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,115,112,114,105,110,103,103,114,101,101,110,0,0,112,120,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,115,108,97,116,101,98,108,117,101,0,0,0,0,115,101,116,104,115,98,0,0,47,115,118,103,47,109,101,100,105,117,
+109,115,101,97,103,114,101,101,110,0,0,0,0,0,34,32,115,116,114,111,107,101,61,34,0,0,0,0,0,0,9,115,101,116,109,97,116,114,105,120,0,0,0,0,0,0,104,101,97,114,116,115,0,0,47,115,118,103,47,109,101,100,105,117,109,112,117,114,112,108,101,0,0,0,0,0,0,0,37,115,32,105,115,32,110,111,116,32,97,32,107,110,111,119,110,32,99,111,108,111,114,46,10,0,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,111,114,99,104,105,100,0,0,0,0,0,0,0,118,0,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,98,108,117,
+101,0,60,97,114,101,97,32,115,104,97,112,101,61,34,114,101,99,116,34,0,0,0,0,0,0,47,115,118,103,47,109,101,100,105,117,109,97,113,117,97,109,97,114,105,110,101,0,0,0,47,98,117,103,110,55,47,52,0,0,0,0,0,0,0,0,47,115,118,103,47,109,97,114,111,111,110,0,0,0,0,0,47,115,118,103,47,109,97,103,101,110,116,97,0,0,0,0,47,115,118,103,47,108,105,110,101,110,0,0,0,0,0,0,47,115,118,103,47,108,105,109,101,103,114,101,101,110,0,0,47,115,118,103,47,108,105,109,101,0,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,
+116,121,101,108,108,111,119,0,0,0,0,0,0,0,0,110,111,110,101,0,0,0,0,9,48,32,48,32,49,32,48,32,51,54,48,32,97,114,99,0,0,0,0,0,0,0,0,104,97,114,114,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,116,101,101,108,98,108,117,101,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,101,121,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,108,97,116,101,103,114,97,121,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,107,121,98,108,117,101,0,0,0,0,0,0,0,47,98,117,103,110,55,
+47,51,0,0,0,0,0,0,0,0,114,101,102,101,114,101,110,99,101,32,116,111,32,98,105,110,97,114,121,32,101,110,116,105,116,121,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,101,97,103,114,101,101,110,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,115,97,108,109,111,110,0,0,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,112,105,110,107,0,0,47,115,118,103,47,108,105,103,104,116,103,114,101,121,0,0,47,115,118,103,47,108,105,103,104,116,103,114,101,101,110,0,47,98,117,103,110,55,47,50,0,0,0,0,
+0,0,0,0,47,115,118,103,47,108,105,103,104,116,103,114,97,121,0,0,10,0,0,0,0,0,0,0,34,32,102,105,108,108,45,111,112,97,99,105,116,121,61,34,37,102,0,0,0,0,0,0,9,114,120,32,114,121,32,115,99,97,108,101,0,0,0,0,104,65,114,114,0,0,0,0,47,115,118,103,47,108,105,103,104,116,103,111,108,100,101,110,114,111,100,121,101,108,108,111,119,0,0,0,0,0,0,0,112,97,99,107,109,111,100,101,0,0,0,0,0,0,0,0,47,115,118,103,47,108,105,103,104,116,99,121,97,110,0,0,47,115,118,103,47,108,105,103,104,116,99,111,114,97,108,
+0,47,115,118,103,47,108,105,103,104,116,98,108,117,101,0,0,108,0,0,0,0,0,0,0,101,112,115,58,112,115,0,0,47,115,118,103,47,108,101,109,111,110,99,104,105,102,102,111,110,0,0,0,0,0,0,0,47,115,118,103,47,108,97,119,110,103,114,101,101,110,0,0,47,115,118,103,47,108,97,118,101,110,100,101,114,98,108,117,115,104,0,0,0,0,0,0,47,115,118,103,47,108,97,118,101,110,100,101,114,0,0,0,47,115,118,103,47,107,104,97,107,105,0,0,0,0,0,0,47,115,118,103,47,105,118,111,114,121,0,0,0,0,0,0,117,114,108,40,35,114,95,37,
+100,41,0,0,0,0,0,0,9,120,32,121,32,116,114,97,110,115,108,97,116,101,0,0,103,116,0,0,0,0,0,0,47,115,118,103,47,105,110,100,105,103,111,0,0,0,0,0,47,115,118,103,47,105,110,100,105,97,110,114,101,100,0,0,47,115,118,103,47,104,111,116,112,105,110,107,0,0,0,0,47,115,118,103,47,104,111,110,101,121,100,101,119,0,0,0,47,98,117,103,110,55,47,49,0,0,0,0,0,0,0,0,47,115,118,103,47,103,114,101,121,0,0,0,0,0,0,0,47,115,118,103,47,103,114,101,101,110,121,101,108,108,111,119,0,0,0,0,0,0,0,0,47,115,118,103,47,103,
+114,101,101,110,0,0,0,0,0,0,47,115,118,103,47,103,114,97,121,0,0,0,0,0,0,0,47,115,118,103,47,103,111,108,100,101,110,114,111,100,0,0,47,115,118,103,47,103,111,108,100,0,0,0,0,0,0,0,9,110,101,119,112,97,116,104,0,0,0,0,0,0,0,0,117,114,108,40,35,108,95,37,100,41,0,0,0,0,0,0,103,101,0,0,0,0,0,0,47,115,118,103,47,103,104,111,115,116,119,104,105,116,101,0,47,115,118,103,47,103,97,105,110,115,98,111,114,111,0,0,47,115,118,103,47,102,117,99,104,115,105,97,0,0,0,0,110,111,114,109,97,108,0,0,47,115,118,103,
+47,102,111,114,101,115,116,103,114,101,101,110,0,0,0,0,0,0,0,0,47,98,117,103,110,54,47,54,0,0,0,0,0,0,0,0,47,115,118,103,47,102,108,111,114,97,108,119,104,105,116,101,0,0,0,0,0,0,0,0,47,115,118,103,47,102,105,114,101,98,114,105,99,107,0,0,47,115,118,103,47,100,111,100,103,101,114,98,108,117,101,0,47,115,118,103,47,100,105,109,103,114,101,121,0,0,0,0,47,115,118,103,47,100,105,109,103,114,97,121,0,0,0,0,47,115,118,103,47,100,101,101,112,115,107,121,98,108,117,101,0,0,0,0,0,0,0,0,37,115,37,115,32,105,
+115,32,110,111,116,32,97,32,116,114,111,102,102,32,102,111,110,116,10,0,0,0,0,0,0,0,9,109,97,116,114,105,120,32,99,117,114,114,101,110,116,109,97,116,114,105,120,0,0,0,32,102,105,108,108,61,34,0,103,97,109,109,97,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,102,105,103,46,99,0,0,0,0,0,47,115,118,103,47,100,101,101,112,112,105,110,107,0,0,0,47,115,118,103,47,100,97,114,107,118,105,111,108,101,116,0,47,115,118,103,47,100,97,114,107,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,47,115,
+118,103,47,100,97,114,107,115,108,97,116,101,103,114,101,121,0,0,0,0,0,0,47,98,117,103,110,54,47,53,0,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,103,114,97,121,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,108,97,116,101,98,108,117,101,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,115,97,108,109,111,110,0,47,115,118,103,47,100,97,114,107,114,101,100,0,0,0,0,115,97,109,101,104,101,97,100,0,0,0,0,
+0,0,0,0,47,115,118,103,47,100,97,114,107,111,114,99,104,105,100,0,9,47,120,32,101,120,99,104,32,100,101,102,0,0,0,0,34,47,62,10,0,0,0,0,102,114,97,115,108,0,0,0,120,108,97,98,101,108,115,46,99,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,111,114,97,110,103,101,0,47,115,118,103,47,100,97,114,107,111,108,105,118,101,103,114,101,101,110,0,0,0,0,0,47,115,118,103,47,100,97,114,107,109,97,103,101,110,116,97,0,0,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,107,104,97,107,105,0,0,47,98,117,103,110,54,47,
+52,0,0,0,0,0,0,0,0,103,114,97,121,0,0,0,0,47,115,118,103,47,100,97,114,107,103,114,101,121,0,0,0,47,115,118,103,47,100,97,114,107,103,114,101,101,110,0,0,47,115,118,103,47,100,97,114,107,103,114,97,121,0,0,0,47,115,118,103,47,100,97,114,107,103,111,108,100,101,110,114,111,100,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,99,121,97,110,0,0,0,34,34,0,0,0,0,0,0,47,115,118,103,47,100,97,114,107,98,108,117,101,0,0,0,9,47,121,32,101,120,99,104,32,100,101,102,0,0,0,0,37,103,44,37,103,32,0,0,102,114,97,99,
+51,52,0,0,47,115,118,103,47,99,121,97,110,0,0,0,0,0,0,0,110,115,108,105,109,105,116,49,0,0,0,0,0,0,0,0,47,115,118,103,47,99,114,105,109,115,111,110,0,0,0,0,47,115,118,103,47,99,111,114,110,115,105,108,107,0,0,0,47,115,118,103,47,99,111,114,110,102,108,111,119,101,114,98,108,117,101,0,0,0,0,0,47,98,117,103,110,54,47,51,0,0,0,0,0,0,0,0,47,115,118,103,47,99,111,114,97,108,0,0,0,0,0,0,47,115,118,103,47,99,104,111,99,111,108,97,116,101,0,0,47,115,118,103,47,99,104,97,114,116,114,101,117,115,101,0,47,97,
+99,99,101,110,116,54,47,50,0,0,0,0,0,0,47,115,118,103,47,99,97,100,101,116,98,108,117,101,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,116,114,105,115,0,0,0,0,0,47,115,118,103,47,98,117,114,108,121,119,111,111,100,0,0,47,115,118,103,47,98,114,111,119,110,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,9,47,114,120,32,101,120,99,104,32,100,101,102,0,0,0,32,112,111,105,110,116,115,61,34,0,0,0,0,0,0,0,102,114,
+97,99,49,52,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,79,98,108,105,113,117,101,0,0,110,101,119,46,103,118,0,0,47,115,118,103,47,98,108,117,101,118,105,111,108,101,116,0,47,115,118,103,47,98,108,117,101,0,0,0,0,0,0,0,99,105,114,99,108,101,0,0,100,101,114,105,118,101,100,0,37,100,32,40,37,46,53,103,44,32,37,46,53,103,41,44,32,40,37,46,53,103,44,32,37,46,53,103,41,10,0,0,99,111,117,108,100,110,39,116,32,111,112,101,110,32,101,112,115,102,32,102,105,108,101,32,37,115,10,0,0,0,0,0,37,
+46,51,102,32,0,0,0,47,115,118,103,47,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,0,0,0,0,120,108,112,0,0,0,0,0,92,71,0,0,0,0,0,0,47,115,118,103,47,98,108,97,99,107,0,0,0,0,0,0,47,98,117,103,110,54,47,50,0,0,0,0,0,0,0,0,115,121,110,116,97,120,32,101,114,114,111,114,0,0,0,0,37,100,0,0,0,0,0,0,47,115,118,103,47,98,105,115,113,117,101,0,0,0,0,0,102,105,120,101,100,32,99,101,108,108,32,115,105,122,101,32,119,105,116,104,32,117,110,115,112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,
+111,114,32,104,101,105,103,104,116,10,0,0,0,0,0,0,0,115,112,101,99,105,102,105,101,100,32,114,111,111,116,32,110,111,100,101,32,34,37,115,34,32,119,97,115,32,110,111,116,32,102,111,117,110,100,46,0,47,115,118,103,47,98,101,105,103,101,0,0,0,0,0,0,83,85,80,0,0,0,0,0,47,115,118,103,47,97,122,117,114,101,0,0,0,0,0,0,111,118,101,114,108,97,112,32,91,37,100,93,32,58,32,37,100,10,0,0,0,0,0,0,47,115,118,103,47,97,113,117,97,109,97,114,105,110,101,0,99,108,97,115,115,50,46,99,0,0,0,0,0,0,0,0,99,111,108,111,
+114,115,99,104,101,109,101,0,0,0,0,0,47,115,118,103,47,97,113,117,97,0,0,0,0,0,0,0,47,115,118,103,47,97,110,116,105,113,117,101,119,104,105,116,101,0,0,0,0,0,0,0,9,47,114,121,32,101,120,99,104,32,100,101,102,0,0,0,60,112,111,108,121,108,105,110,101,0,0,0,0,0,0,0,102,114,97,99,49,50,0,0,98,117,114,108,121,119,111,111,100,0,0,0,0,0,0,0,47,115,118,103,47,97,108,105,99,101,98,108,117,101,0,0,98,101,115,116,99,111,115,116,32,60,32,72,85,71,69,95,86,65,76,0,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,
+57,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,56,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,55,0,0,0,0,47,98,117,103,110,54,47,49,0,0,0,0,0,0,0,0,100,105,0,0,0,0,0,0,37,108,100,0,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,54,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,52,0,0,0,0,109,105,110,0,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,50,0,0,0,0,105,110,0,0,0,0,0,0,101,100,103,101,
+0,0,0,0,47,115,112,101,99,116,114,97,108,57,47,49,0,0,0,0,47,101,108,108,105,112,115,101,95,112,97,116,104,32,123,0,32,45,45,62,10,0,0,0,102,111,114,97,108,108,0,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,95,103,101,116,95,110,101,120,116,95,98,117,102,102,101,114,40,41,0,0,47,115,112,101,99,116,114,97,108,56,47,56,0,0,0,0,99,111,108,111,114,32,37,115,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,55,0,0,0,0,109,99,108,105,109,
+105,116,0,47,115,112,101,99,116,114,97,108,56,47,54,0,0,0,0,60,97,114,101,97,32,115,104,97,112,101,61,34,99,105,114,99,108,101,34,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,53,0,0,0,0,47,98,117,103,110,53,47,53,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,50,0,0,0,0,47,115,112,101,99,116,114,97,108,56,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,55,0,0,0,0,47,115,112,101,99,116,
+114,97,108,55,47,54,0,0,0,0,9,9,99,108,111,115,101,112,97,116,104,0,0,0,0,0,60,33,45,45,32,0,0,0,102,110,111,102,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,55,47,50,0,0,0,0,47,98,117,103,110,53,47,52,0,0,0,0,0,0,0,0,114,101,102,101,114,101,110,99,101,32,116,111,32,105,110,118,97,108,105,100,32,99,104,97,114,97,99,116,101,114,32,110,117,109,98,101,114,
+0,0,0,47,115,112,101,99,116,114,97,108,55,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,54,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,54,47,50,0,0,0,0,9,9,112,111,112,32,110,101,103,32,48,32,114,108,105,110,101,116,111,0,0,0,0,0,121,101,108,108,111,119,103,114,101,101,110,0,0,0,0,0,101,120,105,115,116,0,0,0,47,115,112,101,99,116,114,97,108,54,47,
+49,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,53,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,51,0,0,0,0,47,98,117,103,110,53,47,51,0,0,0,0,0,0,0,0,106,112,103,58,118,114,109,108,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,50,0,0,0,0,47,115,112,101,99,116,114,97,108,53,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,52,47,52,0,0,0,0,47,115,112,101,99,116,114,97,108,52,47,51,0,0,0,0,47,115,112,101,99,116,114,97,108,52,47,50,0,0,0,0,
+47,115,112,101,99,116,114,97,108,52,47,49,0,0,0,0,9,9,48,32,101,120,99,104,32,114,108,105,110,101,116,111,0,0,0,0,0,0,0,0,121,101,108,108,111,119,0,0,101,117,114,111,0,0,0,0,47,115,112,101,99,116,114,97,108,51,47,51,0,0,0,0,114,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,51,47,50,0,0,0,0,47,115,112,101,99,116,114,97,108,51,47,49,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,57,0,0,0,47,98,117,103,110,53,47,50,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,56,0,0,0,47,115,112,101,
+99,116,114,97,108,49,49,47,55,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,54,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,53,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,52,0,0,0,38,108,116,59,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,51,0,0,0,119,104,105,116,101,115,109,111,107,101,0,0,0,0,0,0,102,105,103,58,102,105,103,0,101,117,109,108,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,50,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,49,49,0,0,9,9,101,120,99,104,32,48,32,114,
+108,105,110,101,116,111,0,0,0,0,0,0,0,0,47,98,117,103,110,53,47,49,0,0,0,0,0,0,0,0,47,115,112,101,99,116,114,97,108,49,49,47,49,48,0,0,47,115,112,101,99,116,114,97,108,49,49,47,49,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,57,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,56,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,55,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,54,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,53,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,52,0,0,0,9,9,50,32,
+99,111,112,121,0,0,0,0,0,0,0,0,37,48,51,111,0,0,0,0,119,104,105,116,101,0,0,0,101,116,104,0,0,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,51,0,0,0,110,32,62,61,32,52,0,0,47,115,112,101,99,116,114,97,108,49,48,47,50,0,0,0,47,115,112,101,99,116,114,97,108,49,48,47,49,48,0,0,47,115,112,101,99,116,114,97,108,49,48,47,49,0,0,0,47,98,117,103,110,52,47,52,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,57,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,56,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,55,0,0,0,0,0,0,0,0,47,
+115,101,116,51,57,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,53,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,52,0,0,0,0,0,0,0,0,9,9,109,111,118,101,116,111,0,0,0,0,0,0,0,0,119,104,101,97,116,0,0,0,101,116,97,0,0,0,0,0,71,0,0,0,0,0,0,0,47,115,101,116,51,57,47,51,0,0,0,0,0,0,0,0,110,111,100,101,108,105,115,116,46,99,0,0,0,0,0,0,47,115,101,116,51,57,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,57,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,56,0,0,0,0,0,0,0,0,47,98,117,103,110,52,47,51,0,0,0,0,0,0,0,0,102,
+117,99,104,115,105,97,0,47,115,101,116,51,56,47,55,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,53,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,52,0,0,0,0,0,0,0,0,47,115,101,116,51,56,47,51,0,0,0,0,0,0,0,0,32,45,116,97,103,115,32,123,37,100,37,115,37,100,125,0,47,115,101,116,51,56,47,50,0,0,0,0,0,0,0,0,9,9,52,32,50,32,114,111,108,108,0,0,0,0,0,0,118,105,111,108,101,116,0,0,101,113,117,105,118,0,0,0,47,115,101,116,51,56,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,
+55,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,53,0,0,0,0,0,0,0,0,47,98,117,103,110,52,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,52,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,51,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,55,47,49,0,0,0,0,0,0,0,0,47,97,99,99,101,110,116,54,47,49,0,0,0,0,0,0,35,37,48,50,120,37,48,50,120,37,48,50,120,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,116,114,105,115,0,0,0,0,0,0,47,115,101,
+116,51,54,47,54,0,0,0,0,0,0,0,0,47,115,101,116,51,54,47,53,0,0,0,0,0,0,0,0,98,108,97,99,107,0,0,0,47,98,111,120,112,114,105,109,32,123,9,9,9,9,37,32,120,99,111,114,110,101,114,32,121,99,111,114,110,101,114,32,120,115,105,122,101,32,121,115,105,122,101,0,0,0,0,0,116,117,114,113,117,111,105,115,101,0,0,0,0,0,0,0,101,112,115,105,108,111,110,0,116,107,58,116,107,0,0,0,115,112,108,105,116,46,113,46,99,0,0,0,0,0,0,0,115,97,110,115,45,83,101,114,105,102,0,0,0,0,0,0,47,115,101,116,51,54,47,52,0,0,0,0,0,0,
+0,0,110,111,110,97,109,101,46,103,118,0,0,0,0,0,0,0,47,115,101,116,51,54,47,51,0,0,0,0,0,0,0,0,111,118,97,108,0,0,0,0,100,101,114,105,118,101,32,103,114,97,112,104,32,37,115,32,111,102,32,37,115,10,0,0,37,100,32,98,111,120,101,115,58,10,0,0,0,0,0,0,85,84,70,45,56,32,105,110,112,117,116,32,117,115,101,115,32,110,111,110,45,76,97,116,105,110,49,32,99,104,97,114,97,99,116,101,114,115,32,119,104,105,99,104,32,99,97,110,110,111,116,32,98,101,32,104,97,110,100,108,101,100,32,98,121,32,116,104,105,115,32,
+80,111,115,116,83,99,114,105,112,116,32,100,114,105,118,101,114,10,0,0,0,0,0,0,0,47,115,101,116,51,54,47,50,0,0,0,0,0,0,0,0,104,101,105,103,104,116,0,0,47,115,101,116,51,54,47,49,0,0,0,0,0,0,0,0,47,98,117,103,110,52,47,49,0,0,0,0,0,0,0,0,32,32,102,108,97,103,115,32,32,37,100,10,0,0,0,0,47,115,101,116,51,53,47,53,0,0,0,0,0,0,0,0,99,101,108,108,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,0,0,0,0,0,0,0,47,115,101,116,51,53,47,52,0,0,0,0,0,
+0,0,0,73,0,0,0,0,0,0,0,47,115,101,116,51,53,47,51,0,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,105,110,99,114,101,97,115,101,115,32,61,32,37,100,10,0,0,0,0,0,0,0,116,97,105,108,112,111,114,116,0,0,0,0,0,0,0,0,47,115,101,116,51,53,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,53,47,49,0,0,0,0,0,0,0,0,98,32,61,61,32,110,0,0,47,115,101,116,51,52,47,52,0,0,0,0,0,0,0,0,9,103,114,101,115,116,111,114,101,0,0,0,0,0,0,0,116,111,109,97,116,111,0,0,101,110,115,112,0,0,0,0,98,114,111,119,110,0,0,0,47,115,101,
+116,51,52,47,51,0,0,0,0,0,0,0,0,47,115,101,116,51,52,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,52,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,51,47,51,0,0,0,0,0,0,0,0,47,98,117,103,110,51,47,51,0,0,0,0,0,0,0,0,115,117,98,0,0,0,0,0,47,115,101,116,51,51,47,50,0,0,0,0,0,0,0,0,114,97,110,100,111,109,0,0,47,115,101,116,51,51,47,49,0,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,57,0,0,0,0,0,0,0,114,97,110,107,0,0,0,0,41,10,45,45,62,10,0,0,47,115,101,116,51,49,50,47,56,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,55,
+0,0,0,0,0,0,0,37,108,102,32,37,108,102,32,37,108,102,32,37,108,102,0,110,111,100,101,0,0,0,0,47,115,101,116,51,49,50,47,54,0,0,0,0,0,0,0,9,9,125,32,105,102,0,0,116,104,105,115,116,108,101,0,101,109,115,112,0,0,0,0,47,115,101,116,51,49,50,47,53,0,0,0,0,0,0,0,69,68,95,108,97,98,101,108,40,102,101,41,0,0,0,0,98,111,116,104,0,0,0,0,47,115,101,116,51,49,50,47,52,0,0,0,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,115,101,116,51,49,50,47,51,0,0,0,0,0,0,0,114,101,99,116,97,110,103,108,
+101,32,40,37,100,44,37,100,41,32,40,37,100,44,37,100,41,32,37,115,32,37,115,10,0,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,50,0,0,0,0,0,0,0,47,98,117,103,110,51,47,50,0,0,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,50,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,49,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,48,0,0,0,0,0,0,32,40,0,0,0,0,0,0,47,115,101,116,51,49,50,47,49,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,57,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,56,0,0,0,0,0,0,0,9,9,9,116,101,120,116,32,115,116,114,
+105,110,103,119,105,100,116,104,32,112,111,112,32,119,105,100,116,104,32,101,120,99,104,32,115,117,98,32,116,101,120,116,32,108,101,110,103,116,104,32,100,105,118,32,48,32,116,101,120,116,32,97,115,104,111,119,0,0,0,0,0,116,101,97,108,0,0,0,0,101,109,112,116,121,0,0,0,76,101,102,116,0,0,0,0,47,115,101,116,51,49,49,47,55,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,54,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,53,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,52,0,0,0,0,0,0,0,47,98,117,103,110,51,47,49,0,0,0,
+0,0,0,0,0,97,115,121,110,99,104,114,111,110,111,117,115,32,101,110,116,105,116,121,0,0,0,0,0,47,115,101,116,51,49,49,47,51,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,50,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,49,49,0,0,0,0,0,0,32,118,101,114,115,105,111,110,32,0,0,0,0,0,0,0,47,115,101,116,51,49,49,47,49,48,0,0,0,0,0,0,47,115,101,116,51,49,49,47,49,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,57,0,0,0,0,0,0,0,9,9,9,91,93,32,48,32,115,101,116,100,97,115,104,0,116,97,110,0,0,0,0,0,101,103,114,97,118,101,
+0,0,47,115,101,116,51,49,48,47,56,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,55,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,54,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,53,0,0,0,0,0,0,0,47,98,114,98,103,57,47,57,0,0,0,0,0,0,0,0,106,112,101,58,118,114,109,108,0,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,52,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,51,0,0,0,0,0,0,0,47,115,101,116,51,49,48,47,50,0,0,0,0,0,0,0,10,60,33,45,45,32,71,101,110,101,114,97,116,101,100,32,98,121,32,0,0,0,0,0,47,115,101,116,51,49,48,47,
+49,48,0,0,0,0,0,0,102,100,112,0,0,0,0,0,47,115,101,116,51,49,48,47,49,0,0,0,0,0,0,0,100,111,116,0,0,0,0,0,47,115,101,116,50,56,47,56,0,0,0,0,0,0,0,0,9,9,119,105,100,116,104,32,48,32,103,116,32,123,0,0,115,116,101,101,108,98,108,117,101,0,0,0,0,0,0,0,101,99,105,114,99,0,0,0,47,115,101,116,50,56,47,55,0,0,0,0,0,0,0,0,114,97,110,107,40,103,44,32,50,44,32,110,115,105,116,101,114,50,40,103,41,41,32,61,61,32,48,0,0,0,0,0,47,115,101,116,50,56,47,54,0,0,0,0,0,0,0,0,111,0,0,0,0,0,0,0,47,115,101,116,50,56,
+47,53,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,56,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,51,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,56,47,49,0,0,0,0,0,0,0,0,60,72,84,77,76,62,10,0,47,115,101,116,50,55,47,55,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,54,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,53,0,0,0,0,0,0,0,0,9,103,115,97,118,101,0,0,115,112,114,105,110,103,103,114,101,101,110,0,0,0,0,0,101,97,99,117,116,101,0,0,47,115,101,
+116,50,55,47,52,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,51,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,55,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,55,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,54,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,53,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,52,0,0,0,0,0,0,0,0,32,99,111,111,114,100,111,114,105,103,105,110,61,34,48,44,48,34,32,99,111,111,114,100,115,105,122,101,61,34,37,100,44,37,100,34,32,62,0,0,47,115,101,116,50,54,47,51,0,0,
+0,0,0,0,0,0,47,115,101,116,50,54,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,54,47,49,0,0,0,0,0,0,0,0,9,47,119,105,100,116,104,32,101,120,99,104,32,100,101,102,0,0,0,0,0,0,0,0,34,37,115,34,32,97,116,32,40,37,46,53,102,44,37,46,53,102,41,59,10,0,0,0,115,110,111,119,0,0,0,0,100,105,118,105,100,101,0,0,47,115,101,116,50,53,47,53,0,0,0,0,0,0,0,0,47,115,101,116,50,53,47,52,0,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,47,115,101,116,50,53,47,51,0,0,0,0,0,0,0,0,47,115,101,116,50,53,47,50,0,0,0,0,0,0,0,0,47,98,114,98,103,
+57,47,54,0,0,0,0,0,0,0,0,47,115,101,116,50,53,47,49,0,0,0,0,0,0,0,0,47,115,101,116,50,52,47,52,0,0,0,0,0,0,0,0,47,115,101,116,50,52,47,51,0,0,0,0,0,0,0,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,0,0,0,0,0,47,115,101,116,50,52,47,50,0,0,0,0,0,0,0,0,47,115,101,116,50,52,47,49,0,0,0,0,0,0,0,0,73,32,0,0,0,0,0,0,47,115,101,116,50,51,47,51,0,0,0,0,0,0,0,0,9,47,116,101,120,116,32,101,120,99,104,32,100,101,102,0,100,105,97,109,115,0,0,0,115,108,97,
+116,101,103,114,101,121,0,0,0,0,0,0,0,104,101,97,100,112,111,114,116,0,0,0,0,0,0,0,0,47,115,101,116,50,51,47,50,0,0,0,0,0,0,0,0,70,0,0,0,0,0,0,0,47,115,101,116,50,51,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,53,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,57,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,56,0,0,0,0,0,0,0,0,99,118,116,46,99,0,0,0,98,108,117,101,0,0,0,0,47,115,101,116,49,57,47,55,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,54,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,53,0,0,0,0,0,0,0,0,32,60,118,
+58,103,114,111,117,112,32,115,116,121,108,101,61],"i8",L,l.J+143400);D([34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,0,0,0,0,47,115,101,116,49,57,47,52,0,0,0,0,0,0,0,0,47,115,101,116,49,57,47,51,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,116,107,46,99,0,0,0,0,0,0,47,115,101,116,49,57,47,50,0,0,0,0,0,0,0,0,47,97,108,105,103,110,101,100,116,101,120,116,32,123,9,9,9,37,32,119,105,100,116,104,32,116,101,120,116,0,0,0,100,101,108,116,97,0,0,0,115,
+108,97,116,101,103,114,97,121,0,0,0,0,0,0,0,117,115,0,0,0,0,0,0,47,115,101,116,49,57,47,49,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,56,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,55,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,54,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,52,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,53,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,52,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,51,0,0,0,0,0,0,0,0,60,120,109,108,58,110,97,109,101,115,112,97,99,101,32,110,115,61,34,117,114,110,58,115,99,104,
+101,109,97,115,45,109,105,99,114,111,115,111,102,116,45,99,111,109,58,118,109,108,34,32,112,114,101,102,105,120,61,34,118,34,32,47,62,10,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,50,0,0,0,0,0,0,0,0,47,115,101,116,49,56,47,49,0,0,0,0,0,0,0,0,99,32,0,0,0,0,0,0,47,97,99,99,101,110,116,53,47,53,0,0,0,0,0,0,114,111,117,116,101,46,99,0,47,115,101,116,49,55,47,55,0,0,0,0,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,37,32,100,114,97,119,32,116,101,120,116,32,102,105,116,116,101,100,32,116,111,
+32,105,116,115,32,101,120,112,101,99,116,101,100,32,119,105,100,116,104,0,0,0,0,0,0,0,0,100,101,103,0,0,0,0,0,115,108,97,116,101,98,108,117,101,0,0,0,0,0,0,0,98,111,111,107,0,0,0,0,47,115,101,116,49,55,47,54,0,0,0,0,0,0,0,0,46,37,100,0,0,0,0,0,70,65,76,83,69,0,0,0,47,115,101,116,49,55,47,53,0,0,0,0,0,0,0,0,101,108,108,105,112,115,101,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,101,110,100,32,112,111,114,116,32,110,111,116,32,105,110,32,108,97,115,116,32,98,111,120,10,0,65,103,114,97,112,104,
+105,110,102,111,95,116,0,0,0,0,125,32,98,105,110,100,32,100,101,102,10,0,0,0,0,0,47,115,101,116,49,55,47,52,0,0,0,0,0,0,0,0,119,105,100,116,104,0,0,0,77,97,120,46,32,105,116,101,114,97,116,105,111,110,115,32,40,37,100,41,32,114,101,97,99,104,101,100,32,111,110,32,103,114,97,112,104,32,37,115,10,0,0,0,0,0,0,0,116,101,120,116,115,112,97,110,46,99,0,0,0,0,0,0,38,35,51,57,59,0,0,0,102,97,116,97,108,32,101,114,114,111,114,32,45,32,115,99,97,110,110,101,114,32,105,110,112,117,116,32,98,117,102,102,101,
+114,32,111,118,101,114,102,108,111,119,0,0,0,0,0,47,115,101,116,49,55,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,51,0,0,0,0,0,0,0,0,32,32,115,105,122,101,32,32,32,37,100,10,0,0,0,0,10,102,105,110,97,108,32,101,32,61,32,37,102,32,37,100,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,0,0,47,115,101,116,49,55,47,50,0,0,0,0,0,0,0,0,115,112,108,105,110,101,115,46,99,0,0,0,0,0,0,0,102,105,120,101,100,32,116,97,98,108,101,32,115,105,122,101,32,119,105,116,104,32,117,110,115,
+112,101,99,105,102,105,101,100,32,119,105,100,116,104,32,111,114,32,104,101,105,103,104,116,10,0,0,0,0,0,0,47,115,101,116,49,55,47,49,0,0,0,0,0,0,0,0,85,0,0,0,0,0,0,0,47,115,101,116,49,54,47,54,0,0,0,0,0,0,0,0,78,117,109,98,101,114,32,111,102,32,105,116,101,114,97,116,105,111,110,115,32,61,32,37,100,10,0,0,0,0,0,0,60,47,83,84,89,76,69,62,10,0,0,0,0,0,0,0,47,115,101,116,49,54,47,53,0,0,0,0,0,0,0,0,99,108,117,115,116,101,114,32,110,97,109,101,100,32,37,115,32,110,111,116,32,102,111,117,110,100,10,0,
+0,0,0,0,99,111,109,109,101,110,116,0,47,115,101,116,49,54,47,52,0,0,0,0,0,0,0,0,112,111,108,121,108,105,110,101,32,37,115,32,37,115,10,0,47,115,101,116,49,54,47,51,0,0,0,0,0,0,0,0,9,115,99,97,108,101,102,111,110,116,32,115,101,116,102,111,110,116,0,0,0,0,0,0,100,97,114,114,0,0,0,0,115,107,121,98,108,117,101,0,47,115,101,116,49,54,47,50,0,0,0,0,0,0,0,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,34,37,115,34,32,45,32,97,115,115,117,109,105,110,103,32,117,116,102,45,56,
+10,0,0,0,0,0,0,98,108,117,101,118,105,111,108,101,116,0,0,0,0,0,0,95,100,103,95,37,100,0,0,47,115,101,116,49,54,47,49,0,0,0,0,0,0,0,0,47,115,101,116,49,53,47,53,0,0,0,0,0,0,0,0,105,110,100,101,120,46,99,0,47,115,101,116,49,53,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,57,47,50,0,0,0,0,0,0,0,0,47,115,101,116,49,53,47,51,0,0,0,0,0,0,0,0,114,101,103,117,108,97,114,0,47,115,101,116,49,53,47,50,0,0,0,0,0,0,0,0,115,105,100,101,115,32,61,61,32,52,0,0,0,0,0,0,47,115,101,116,49,53,47,49,0,0,0,0,0,0,0,0,118,92,
+58,42,32,123,32,98,101,104,97,118,105,111,114,58,32,117,114,108,40,35,100,101,102,97,117,108,116,35,86,77,76,41,59,100,105,115,112,108,97,121,58,105,110,108,105,110,101,45,98,108,111,99,107,125,10,0,0,0,0,0,0,0,47,115,101,116,49,52,47,52,0,0,0,0,0,0,0,0,110,111,100,101,115,32,116,111,117,99,104,32,45,32,102,97,108,108,105,110,103,32,98,97,99,107,32,116,111,32,115,116,114,97,105,103,104,116,32,108,105,110,101,32,101,100,103,101,115,10,0,0,0,0,0,0,47,115,101,116,49,52,47,51,0,0,0,0,0,0,0,0,114,111,
+117,116,101,115,112,108,105,110,101,115,58,32,37,100,32,101,100,103,101,115,44,32,37,100,32,98,111,120,101,115,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,118,105,101,119,66,111,120,0,103,114,97,112,104,0,0,0,47,115,101,116,49,52,47,50,0,0,0,0,0,0,0,0,9,102,105,110,100,102,111,110,116,32,101,120,99,104,0,0,100,97,103,103,101,114,0,0,115,105,108,118,101,114,0,0,116,101,120,116,108,97,121,111,117,116,0,0,0,0,0,0,116,114,105,97,110,103,117,108,97,116,105,111,110,32,102,97,105,108,101,100,0,0,0,0,115,
+104,97,112,101,102,105,108,101,32,110,111,116,32,115,101,116,32,111,114,32,110,111,116,32,102,111,117,110,100,32,102,111,114,32,101,112,115,102,32,110,111,100,101,32,37,115,10,0,0,0,0,0,0,0,0,47,115,101,116,49,52,47,49,0,0,0,0,0,0,0,0,117,116,102,56,0,0,0,0,104,101,105,103,104,116,0,0,47,115,101,116,49,51,47,51,0,0,0,0,0,0,0,0,47,112,97,116,104,98,111,120,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,37,46,53,103,
+32,115,117,98,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,37,46,53,103,32,115,117,98,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,121,32,108,105,110,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,10,32,32,32,32,120,32,89,32,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,115,116,114,
+111,107,101,10,32,125,32,100,101,102,10,47,100,98,103,115,116,97,114,116,32,123,32,103,115,97,118,101,32,37,46,53,103,32,37,46,53,103,32,116,114,97,110,115,108,97,116,101,32,125,32,100,101,102,10,47,97,114,114,111,119,108,101,110,103,116,104,32,49,48,32,100,101,102,10,47,97,114,114,111,119,119,105,100,116,104,32,97,114,114,111,119,108,101,110,103,116,104,32,50,32,100,105,118,32,100,101,102,10,47,97,114,114,111,119,104,101,97,100,32,123,10,32,32,32,32,103,115,97,118,101,10,32,32,32,32,114,111,116,
+97,116,101,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,10,32,32,32,32,110,101,119,112,97,116,104,10,32,32,32,32,109,111,118,101,116,111,10,32,32,32,32,97,114,114,111,119,108,101,110,103,116,104,32,97,114,114,111,119,119,105,100,116,104,32,50,32,100,105,118,32,114,108,105,110,101,116,111,10,32,32,32,32,48,32,97,114,114,111,119,119,105,100,116,104,32,110,101,103,32,114,108,105,110,101,116,111,10,32,32,32,32,99,108,111,115,101,112,97,116,104,32,102,105,108,108,10,32,32,32,32,103,114,
+101,115,116,111,114,101,10,125,32,98,105,110,100,32,100,101,102,10,47,109,97,107,101,97,114,114,111,119,32,123,10,32,32,32,32,99,117,114,114,101,110,116,112,111,105,110,116,32,101,120,99,104,32,112,111,112,32,115,117,98,32,101,120,99,104,32,99,117,114,114,101,110,116,112,111,105,110,116,32,112,111,112,32,115,117,98,32,97,116,97,110,10,32,32,32,32,97,114,114,111,119,104,101,97,100,10,125,32,98,105,110,100,32,100,101,102,10,47,112,111,105,110,116,32,123,32,32,32,32,110,101,119,112,97,116,104,32,32,
+32,32,50,32,48,32,51,54,48,32,97,114,99,32,102,105,108,108,125,32,100,101,102,47,109,97,107,101,118,101,99,32,123,10,32,32,32,32,47,89,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,88,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,121,32,101,120,99,104,32,100,101,102,10,32,32,32,32,47,120,32,101,120,99,104,32,100,101,102,10,32,32,32,32,110,101,119,112,97,116,104,32,120,32,121,32,109,111,118,101,116,111,10,32,32,32,32,88,32,89,32,108,105,110,101,116,111,32,115,116,114,111,107,101,10,32,32,
+32,32,88,32,89,32,109,111,118,101,116,111,10,32,32,32,32,120,32,121,32,109,97,107,101,97,114,114,111,119,10,125,32,100,101,102,10,0,0,0,0,0,0,47,98,114,98,103,57,47,49,0,0,0,0,0,0,0,0,95,110,101,119,95,114,97,110,107,0,0,0,0,0,0,0,47,115,101,116,49,51,47,50,0,0,0,0,0,0,0,0,103,118,114,101,110,100,101,114,95,99,111,114,101,95,109,97,112,46,99,0,0,0,0,0,47,115,101,116,49,51,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,57,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,56,0,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,
+47,114,101,100,115,57,47,55,0,0,0,0,0,0,0,0,37,115,32,37,100,32,110,111,100,101,115,32,37,100,32,101,100,103,101,115,32,109,97,120,105,116,101,114,61,37,100,32,98,97,108,97,110,99,101,61,37,100,10,0,0,0,0,0,60,83,84,89,76,69,62,10,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,53,0,0,0,0,0,0,0,0,47,114,101,100,115,57,47,52,0,0,0,0,0,0,0,0,47,115,101,116,95,102,111,110,116,32,123,0,0,0,0,0,100,65,114,114,0,0,0,0,115,105,101,110,110,97,0,0,114,101,99,116,97,110,
+103,108,101,46,99,0,0,0,0,0,47,114,101,100,115,57,47,51,0,0,0,0,0,0,0,0,98,105,103,53,0,0,0,0,47,114,101,100,115,57,47,50,0,0,0,0,0,0,0,0,105,110,32,108,97,98,101,108,32,111,102,32,110,111,100,101,32,37,115,10,0,0,0,0,47,114,101,100,115,57,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,56,0,0,0,0,0,0,0,0,114,101,99,117,114,115,105,118,101,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,0,0,0,0,0,47,114,101,100,115,56,47,55,0,0,0,0,0,0,0,
+0,69,114,114,111,114,0,0,0,47,114,101,100,115,56,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,53,0,0,0,0,0,0,0,0,108,101,110,0,0,0,0,0,32,119,105,100,116,104,58,32,37,100,112,116,59,32,104,101,105,103,104,116,58,32,37,100,112,116,34,62,10,0,0,0,47,114,101,100,115,56,47,52,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,51,0,0,0,0,0,0,0,0,47,114,101,100,115,56,47,50,0,0,0,0,0,0,0,0,9,125,32,105,102,0,0,0,99,117,114,114,101,110,0,0,115,101,97,115,104,101,108,108,0,0,0,0,0,0,0,0,67,111,117,108,100,32,110,
+111,116,32,111,112,101,110,32,34,37,115,34,32,102,111,114,32,119,114,105,116,105,110,103,32,58,32,37,115,10,0,0,0,47,114,101,100,115,56,47,49,0,0,0,0,0,0,0,0,98,105,103,45,53,0,0,0,37,100,0,0,0,0,0,0,47,114,101,100,115,55,47,55,0,0,0,0,0,0,0,0,47,114,101,100,115,55,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,55,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,55,0,0,0,0,0,0,0,0,106,112,101,103,58,118,114,109,108,0,0,0,0,0,0,0,47,114,101,100,115,55,47,52,0,0,0,0,0,0,0,0,47,114,101,100,115,55,47,51,0,0,0,
+0,0,0,0,0,47,114,101,100,115,55,47,50,0,0,0,0,0,0,0,0,60,68,73,86,32,105,100,61,39,95,86,77,76,49,95,39,32,115,116,121,108,101,61,34,112,111,115,105,116,105,111,110,58,114,101,108,97,116,105,118,101,59,32,100,105,115,112,108,97,121,58,105,110,108,105,110,101,59,32,118,105,115,105,98,105,108,105,116,121,58,104,105,100,100,101,110,0,0,0,0,47,114,101,100,115,55,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,54,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,53,0,0,0,0,0,0,0,0,112,115,0,0,0,0,0,0,99,117,112,
+0,0,0,0,0,115,101,97,103,114,101,101,110,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,52,0,0,0,0,0,0,0,0,73,83,79,45,73,82,45,49,48,48,0,0,0,0,0,0,37,115,32,58,32,37,102,32,37,102,10,0,0,0,0,0,100,111,116,32,100,111,101,115,32,110,111,116,32,115,117,112,112,111,114,116,32,116,104,101,32,97,115,112,101,99,116,32,97,116,116,114,105,98,117,116,101,32,102,111,114,32,100,105,115,99,111,110,110,101,99,116,101,100,32,103,114,97,112,104,115,32,111,114,32,103,114,97,112,104,115,32,119,105,116,104,32,99,108,117,
+115,116,101,114,115,10,0,0,0,0,0,0,47,114,101,100,115,54,47,51,0,0,0,0,0,0,0,0,9,9,103,114,101,115,116,111,114,101,0,0,0,0,0,0,67,97,108,99,117,108,97,116,105,110,103,32,115,117,98,115,101,116,32,109,111,100,101,108,0,0,0,0,0,0,0,0,47,114,101,100,115,54,47,50,0,0,0,0,0,0,0,0,105,110,115,101,116,0,0,0,102,97,108,115,101,0,0,0,99,117,114,118,101,0,0,0,83,121,110,116,97,120,32,101,114,114,111,114,58,32,110,111,110,45,115,112,97,99,101,32,115,116,114,105,110,103,32,117,115,101,100,32,97,102,116,101,114,
+32,60,47,84,65,66,76,69,62,0,0,0,0,0,0,47,114,101,100,115,54,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,54,0,0,0,0,0,0,0,0,116,119,111,112,105,58,32,117,115,101,32,111,102,32,119,101,105,103,104,116,61,48,32,99,114,101,97,116,101,115,32,100,105,115,99,111,110,110,101,99,116,101,100,32,99,111,109,112,111,110,101,110,116,46,10,0,47,114,101,100,115,53,47,53,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,52,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,51,0,0,0,0,0,0,0,0,60,66,79,68,89,32,111,110,108,111,97,100,
+61,39,98,114,111,119,115,101,114,99,104,101,99,107,40,41,59,39,62,10,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,50,0,0,0,0,0,0,0,0,47,114,101,100,115,53,47,49,0,0,0,0,0,0,0,0,47,114,101,100,115,52,47,52,0,0,0,0,0,0,0,0,32,37,100,32,0,0,0,0,99,114,97,114,114,0,0,0,115,97,110,100,121,98,114,111,119,110,0,0,0,0,0,0,47,114,101,100,115,52,47,51,0,0,0,0,0,0,0,0,73,83,79,56,56,53,57,45,49,0,0,0,0,0,0,0,47,114,101,100,115,52,47,50,0,0,0,0,0,0,0,0,9,9,9,40,92,40,41,32,115,104,111,119,32,105,32,115,116,114,32,
+99,118,115,32,115,104,111,119,32,40,44,41,32,115,104,111,119,32,106,32,115,116,114,32,99,118,115,32,115,104,111,119,32,40,92,41,41,32,115,104,111,119,0,0,0,47,114,101,100,115,52,47,49,0,0,0,0,0,0,0,0,60,72,84,77,76,62,0,0,47,114,101,100,115,51,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,56,47,53,0,0,0,0,0,0,0,0,47,114,101,100,115,51,47,50,0,0,0,0,0,0,0,0,47,114,101,100,115,51,47,49,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,57,0,0,0,0,0,0,60,47,72,69,65,68,62,0,47,114,100,121,108,103,110,57,47,56,
+0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,114,100,121,108,103,110,57,47,55,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,54,0,0,0,0,0,0,9,9,9,48,32,48,32,109,111,118,101,116,111,0,0,0,99,111,112,121,0,0,0,0,46,112,115,32,37,100,42,92,110,40,83,70,117,47,37,46,48,102,117,10,0,0,0,0,115,97,108,109,111,110,0,0,75,0,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,53,0,0,0,0,0,0,73,83,79,95,56,56,53,57,45,49,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,52,0,0,0,0,0,0,47,114,100,121,
+108,103,110,57,47,51,0,0,0,0,0,0,32,37,100,32,37,100,0,0,47,114,100,121,108,103,110,57,47,50,0,0,0,0,0,0,47,98,114,98,103,56,47,52,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,57,47,49,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,56,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,55,0,0,0,0,0,0,32,32,32,60,47,83,67,82,73,80,84,62,10,0,0,0,47,114,100,121,108,103,110,56,47,54,0,0,0,0,0,0,97,115,112,101,99,116,0,0,47,114,100,121,108,103,110,56,47,53,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,52,0,0,0,0,
+0,0,9,9,9,99,111,111,114,100,102,111,110,116,32,115,101,116,102,111,110,116,0,0,0,0,99,111,110,103,0,0,0,0,115,97,100,100,108,101,98,114,111,119,110,0,0,0,0,0,112,111,108,121,103,111,110,0,47,114,100,121,108,103,110,56,47,51,0,0,0,0,0,0,108,49,0,0,0,0,0,0,47,114,100,121,108,103,110,56,47,50,0,0,0,0,0,0,75,80,95,83,117,98,116,114,97,99,116,0,0,0,0,0,47,114,100,121,108,103,110,56,47,49,0,0,0,0,0,0,47,114,100,121,108,103,110,55,47,55,0,0,0,0,0,0,47,98,114,98,103,56,47,51,0,0,0,0,0,0,0,0,67,111,117,108,
+100,32,110,111,116,32,112,97,114,115,101,32,34,95,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,32,105,110,32,103,114,97,112,104,32,37,115,10,0,0,0,0,47,114,100,121,108,103,110,55,47,54,0,0,0,0,0,0,98,108,97,99,107,0,0,0,47,114,100,121,108,103,110,55,47,53,0,0,0,0,0,0,47,114,100,121,108,103,110,55,47,52,0,0,0,0,0,0,32,32,32,125,10,0,0,0,47,114,100,121,108,103,110,55,47,51,0,0,0,0,0,0,47,114,100,121,108,103,110,55,47,50,0,0,0,0,0,0,48,0,0,0,0,0,0,0,47,114,100,121,108,
+103,110,55,47,49,0,0,0,0,0,0,9,9,103,115,97,118,101,0,99,108,117,98,115,0,0,0,114,111,121,97,108,98,108,117,101,0,0,0,0,0,0,0,50,46,50,56,46,48,0,0,47,114,100,121,108,103,110,54,47,54,0,0,0,0,0,0,108,97,116,105,110,49,0,0,47,114,100,121,108,103,110,54,47,53,0,0,0,0,0,0,47,114,100,121,108,103,110,54,47,52,0,0,0,0,0,0,47,114,100,121,108,103,110,54,47,51,0,0,0,0,0,0,47,98,114,98,103,56,47,50,0,0,0,0,0,0,0,0,65,103,101,100,103,101,105,110,102,111,95,116,0,0,0,0,47,114,100,121,108,103,110,54,47,50,0,0,
+0,0,0,0,47,114,100,121,108,103,110,54,47,49,0,0,0,0,0,0,47,114,100,121,108,103,110,53,47,53,0,0,0,0,0,0,32,32,32,32,32,125,10,0,47,114,100,121,108,103,110,53,47,52,0,0,0,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,112,115,0,0,0,0,47,114,100,121,108,103,110,53,47,51,0,0,0,0,0,0,47,98,114,98,103,56,47,49,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,53,47,50,0,0,0,0,0,0,47,97,99,99,101,110,116,53,47,52,0,0,0,0,0,0,101,108,108,105,112,115,101,0,9,110,112,97,103,101,115,32,49,
+32,103,116,32,123,0,0,99,105,114,99,0,0,0,0,114,111,115,121,98,114,111,119,110,0,0,0,0,0,0,0,85,82,87,32,71,111,116,104,105,99,32,76,0,0,0,0,47,114,100,121,108,103,110,53,47,49,0,0,0,0,0,0,108,97,116,105,110,45,49,0,48,0,0,0,0,0,0,0,100,101,103,108,105,115,116,46,99,0,0,0,0,0,0,0,112,97,103,101,37,100,44,37,100,95,0,0,0,0,0,0,114,101,98,117,105,108,116,100,95,118,108,105,115,116,115,58,32,114,97,110,107,32,108,101,97,100,32,37,115,32,110,111,116,32,105,110,32,111,114,100,101,114,32,37,100,32,111,
+102,32,114,97,110,107,32,37,100,10,0,0,0,0,0,0,0,108,101,118,101,108,32,62,61,32,48,32,38,38,32,108,101,118,101,108,32,60,61,32,110,45,62,108,101,118,101,108,0,47,114,100,121,108,103,110,52,47,52,0,0,0,0,0,0,112,111,108,121,103,111,110,0,99,111,111,114,100,115,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,115,116,97,114,116,32,112,111,114,116,32,110,111,116,32,105,110,32,102,105,114,115,116,32,98,111,120,10,0,0,0,0,0,0,37,37,69,110,100,68,111,99,117,109,101,110,116,10,0,0,47,114,100,121,108,
+103,110,52,47,51,0,0,0,0,0,0,114,101,99,116,115,0,0,0,38,113,117,111,116,59,0,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,101,110,100,32,111,102,32,98,117,102,102,101,114,32,109,105,115,115,101,100,0,47,114,100,121,108,103,110,52,47,50,0,0,0,0,0,0,37,108,102,37,108,102,37,108,102,0,0,0,0,0,0,0,32,32,97,115,112,101,99,116,32,37,102,10,0,0,0,0,47,114,100,121,108,103,110,52,47,49,0,0,0,0,0,0,115,112,108,105,110,101,
+32,37,115,32,37,115,10,0,0,0,116,114,121,105,110,103,32,116,111,32,97,100,100,32,116,111,32,114,101,99,116,32,123,37,102,32,43,47,45,32,37,102,44,32,37,102,32,43,47,45,32,37,102,125,10,0,0,0,116,97,98,108,101,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,99,111,110,116,101,110,116,10,0,0,0,0,0,0,0,47,114,100,121,108,103,110,51,47,51,0,0,0,0,0,0,66,0,0,0,0,0,0,0,47,114,100,121,108,103,110,51,47,50,0,0,0,0,0,0,37,102,44,37,102,0,0,0,111,110,101,98,108,111,99,107,0,0,0,0,
+0,0,0,0,47,114,100,121,108,103,110,51,47,49,0,0,0,0,0,0,32,32,32,32,32,125,101,108,115,101,123,10,0,0,0,0,40,37,46,53,103,44,37,46,53,103,41,0,0,0,0,0,98,108,97,99,107,0,0,0,47,114,100,121,108,103,110,49,49,47,57,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,56,0,0,0,0,0,108,105,110,101,32,115,101,103,109,101,110,116,115,0,0,0,9,47,115,116,114,32,49,48,32,115,116,114,105,110,103,32,100,101,102,0,0,0,0,0,99,104,105,0,0,0,0,0,114,101,100,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,55,0,0,0,0,0,117,
+116,102,45,56,0,0,0,98,108,117,101,0,0,0,0,116,114,121,105,110,103,32,116,111,32,100,101,108,101,116,101,32,97,32,110,111,110,45,108,105,110,101,10,0,0,0,0,73,108,108,101,103,97,108,32,108,101,110,103,116,104,32,118,97,108,117,101,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,97,116,116,114,105,98,117,116,101,32,0,0,0,47,114,100,121,108,103,110,49,49,47,54,0,0,0,0,0,105,32,61,61,32,100,101,103,0,0,0,0,0,0,0,0,47,98,114,98,103,55,47,55,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,53,0,
+0,0,0,0,47,114,100,121,108,103,110,49,49,47,52,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,51,0,0,0,0,0,95,37,108,100,95,83,85,83,80,69,67,84,0,0,0,0,115,101,108,102,0,0,0,0,47,114,100,121,108,103,110,49,49,47,50,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,49,49,0,0,0,0,114,97,110,107,105,110,103,58,32,102,97,105,108,117,114,101,32,116,111,32,99,114,101,97,116,101,32,115,116,114,111,110,103,32,99,111,110,115,116,114,97,105,110,116,32,101,100,103,101,32,98,101,116,119,101,101,110,32,110,111,100,
+101,115,32,37,115,32,97,110,100,32,37,115,10,0,0,0,0,0,0,47,114,100,121,108,103,110,49,49,47,49,48,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,104,105,100,100,101,110,39,59,10,0,0,0,0,0,115,118,103,58,115,118,103,0,47,114,100,121,108,103,110,49,49,47,49,0,0,0,0,0,104,101,105,103,104,116,0,0,37,115,10,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,57,0,0,0,0,0,9,47,105,32,101,120,99,104,32,100,101,102,0,0,0,0,99,101,
+110,116,0,0,0,0,112,117,114,112,108,101,0,0,47,114,100,121,108,103,110,49,48,47,56,0,0,0,0,0,99,104,97,114,115,101,116,0,84,111,116,97,108,32,115,105,122,101,32,62,32,49,32,105,110,32,34,37,115,34,32,99,111,108,111,114,32,115,112,101,99,32,0,0,0,0,0,0,119,105,100,116,104,0,0,0,47,114,100,121,108,103,110,49,48,47,55,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,54,0,0,0,0,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,32,102,111,114,32,110,
+111,100,101,32,39,37,115,39,46,10,0,0,0,0,48,0,0,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,53,0,0,0,0,0,47,98,114,98,103,55,47,54,0,0,0,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,52,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,51,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,50,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,49,48,0,0,0,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,110,116,66,121,73,100,40,86,77,76,110,
+111,91,120,93,41,59,10,0,0,0,0,0,47,114,100,121,108,103,110,49,48,47,49,0,0,0,0,0,47,114,100,121,108,98,117,57,47,57,0,0,0,0,0,0,9,47,106,32,101,120,99,104,32,100,101,102,0,0,0,0,99,101,100,105,108,0,0,0,112,111,119,100,101,114,98,108,117,101,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,56,0,0,0,0,0,0,102,105,108,108,0,0,0,0,102,111,110,116,99,111,108,111,114,0,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,55,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,54,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,
+53,0,0,0,0,0,0,47,98,114,98,103,55,47,53,0,0,0,0,0,0,0,0,117,110,100,101,102,105,110,101,100,32,101,110,116,105,116,121,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,52,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,51,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,57,47,49,0,0,0,0,0,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,110,111,41,123,10,0,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,56,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,
+55,0,0,0,0,0,0,9,47,110,112,97,103,101,115,32,101,120,99,104,32,100,101,102,0,0,0,0,0,0,0,99,99,101,100,105,108,0,0,112,108,117,109,0,0,0,0,47,114,100,121,108,98,117,56,47,54,0,0,0,0,0,0,101,120,112,97,110,100,0,0,108,97,121,101,114,115,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,105,110,32,37,115,32,111,117,116,112,117,116,10,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,53,0,0,0,0,0,0,115,97,109,101,116,97,105,108,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,52,0,0,0,0,0,0,47,114,
+100,121,108,98,117,56,47,51,0,0,0,0,0,0,47,98,114,98,103,55,47,52,0,0,0,0,0,0,0,0,103,105,102,58,118,114,109,108,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,56,47,49,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,55,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,54,0,0,0,0,0,0,32,32,32,32,32,32,32,125,10,0,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,53,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,52,0,0,0,0,0,0,47,98,101,103,105,110,112,97,103,101,32,123,9,37,
+32,105,32,106,32,110,112,97,103,101,115,0,0,0,0,0,0,0,99,97,112,0,0,0,0,0,112,105,110,107,0,0,0,0,47,114,100,121,108,98,117,55,47,51,0,0,0,0,0,0,99,111,109,112,114,101,115,115,0,0,0,0,0,0,0,0,105,110,102,111,0,0,0,0,73,109,97,103,101,115,32,117,110,115,117,112,112,111,114,116,101,100,32,105,110,32,34,98,97,99,107,103,114,111,117,110,100,34,32,97,116,116,114,105,98,117,116,101,10,0,0,0,47,114,100,121,108,98,117,55,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,55,47,49,0,0,0,0,0,0,47,114,100,121,108,
+98,117,54,47,54,0,0,0,0,0,0,109,112,116,121,0,0,0,0,47,98,114,98,103,55,47,51,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,54,47,53,0,0,0,0,0,0,47,114,100,121,108,98,117,54,47,52,0,0,0,0,0,0,125,10,0,0,0,0,0,0,47,114,100,121,108,98,117,54,47,51,0,0,0,0,0,0,37,108,102,44,37,108,102,44,37,108,102,37,99,0,0,0,47,114,100,121,108,98,117,54,47,50,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,125,10,0,0,0,0,0,47,114,100,121,108,98,117,54,47,49,0,0,0,0,0,0,47,114,100,121,108,98,117,53,47,53,0,0,0,0,0,0,47,110,111,
+112,99,111,108,111,114,32,123,112,111,112,32,112,111,112,32,112,111,112,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,0,0,98,117,108,108,0,0,0,0,112,101,114,117,0,0,0,0,47,114,100,121,108,98,117,53,47,52,0,0,0,0,0,0,97,117,116,111,0,0,0,0,103,114,97,100,105,101,110,116,32,112,101,110,32,99,111,108,111,114,115,32,110,111,116,32,121,101,116,32,115,117,112,112,111,114,116,101,100,46,10,0,108,116,97,105,108,0,0,0,47,114,100,121,108,98,117,53,47,51,0,0,0,0,0,0,47,98,114,98,103,55,47,50,0,0,0,0,0,0,
+0,0,47,114,100,121,108,98,117,53,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,53,47,49,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,52,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,51,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,50,0,0,0,0,0,0,47,114,100,121,108,98,117,52,47,49,0,0,0,0,0,0,32,32,32,32,32,32,32,32,32,32,32,105,116,101,109,46,115,116,121,108,101,46,118,105,115,105,98,105,108,105,116,121,61,39,118,105,115,105,98,108,101,39,59,10,0,0,0,0,47,114,100,121,108,98,117,51,47,51,0,0,0,0,0,0,47,114,
+100,121,108,98,117,51,47,50,0,0,0,0,0,0,47,103,114,97,112,104,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,98,114,118,98,97,114,0,0,46,102,116,32,37,115,10,0,112,101,97,99,104,112,117,102,102,0,0,0,0,0,0,0,47,114,100,121,108,98,117,51,47,49,0,0,0,0,0,0,114,97,116,105,111,0,0,0,119,104,105,116,101,0,0,0,47,114,100,121,108,98,117,49,49,47,57,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,56,0,0,0,0,0,47,114,100,121,108,98,117,49,
+49,47,55,0,0,0,0,0,47,98,114,98,103,55,47,49,0,0,0,0,0,0,0,0,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,46,49,102,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,32,37,100,10,0,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,54,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,53,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,52,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,51,0,0,0,0,0,32,32,32,32,32,32,32,32,32,105,102,32,40,105,116,101,109,41,32,123,10,
+0,0,0,110,101,119,114,97,110,107,0,47,114,100,121,108,98,117,49,49,47,50,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,49,49,0,0,0,0,47,101,100,103,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,98,101,116,97,0,0,0,0,112,97,112,97,121,97,119,104,105,112,0,0,0,0,0,0,47,114,100,121,108,98,117,49,49,47,49,48,0,0,0,0,37,108,102,37,99,0,0,0,108,97,121,101,114,0,0,0,47,114,100,121,108,98,117,49,49,47,49,0,0,0,0,0,97,117,120,103,
+0,0,0,0,47,114,100,121,108,98,117,49,48,47,57,0,0,0,0,0,109,105,110,117,115,0,0,0,47,114,100,121,108,98,117,49,48,47,56,0,0,0,0,0,47,98,114,98,103,54,47,54,0,0,0,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,55,0,0,0,0,0,97,113,117,97,0,0,0,0,47,114,100,121,108,98,117,49,48,47,54,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,53,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,52,0,0,0,0,0,32,32,32,32,32,32,32,32,32,105,116,101,109,32,61,32,100,111,99,117,109,101,110,116,46,103,101,116,69,108,101,109,101,
+110,116,66,121,73,100,40,86,77,76,121,101,115,91,120,93,41,59,10,0,0,0,0,47,114,100,121,108,98,117,49,48,47,51,0,0,0,0,0,103,114,97,112,104,32,108,97,98,101,108,0,0,0,0,0,47,114,100,121,108,98,117,49,48,47,50,0,0,0,0,0,47,110,111,100,101,99,111,108,111,114,32,123,32,115,101,116,104,115,98,99,111,108,111,114,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,98,100,113,117,111,0,0,0,112,97,108,101,118,105,111,108,101,116,114,101,100,0,0,0,47,114,100,121,108,98,117,49,48,47,49,48,0,0,0,0,37,108,102,
+44,37,108,102,37,99,0,0,0,0,0,0,0,114,111,117,110,100,101,100,0,47,114,100,121,108,98,117,49,48,47,49,0,0,0,0,0,47,114,100,112,117,57,47,57,0,0,0,0,0,0,0,0,47,114,100,112,117,57,47,56,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,53,0,0,0,0,0,0,0,0,112,111,115,105,116,105,111,110,46,99,0,0,0,0,0,0,47,114,100,112,117,57,47,55,0,0,0,0,0,0,0,0,91,94,91,58,100,105,103,105,116,58,93,93,0,0,0,0,65,103,110,111,100,101,105,110,102,111,95,116,0,0,0,0,47,114,100,112,117,57,47,54,0,0,0,0,0,0,0,0,47,114,100,112,117,
+57,47,53,0,0,0,0,0,0,0,0,47,114,100,112,117,57,47,52,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,102,111,114,32,40,120,32,105,110,32,86,77,76,121,101,115,41,123,10,0,0,0,0,0,0,120,100,111,116,49,46,52,58,120,100,111,116,0,0,0,0,103,118,117,115,101,114,115,104,97,112,101,46,99,0,0,0,99,97,110,110,111,116,32,114,101,97,108,108,111,99,32,112,110,108,115,0,0,0,0,0,47,114,100,112,117,57,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,57,47,50,0,0,0,0,0,0,0,0,37,32,104,111,111,107,115,32,102,111,114,32,115,101,116,116,
+105,110,103,32,99,111,108,111,114,32,0,0,0,0,0,0,47,114,100,112,117,57,47,49,0,0,0,0,0,0,0,0,97,117,109,108,0,0,0,0,112,97,108,101,116,117,114,113,117,111,105,115,101,0,0,0,119,105,100,116,104,0,0,0,65,118,97,110,116,71,97,114,100,101,45,66,111,111,107,0,47,97,99,99,101,110,116,53,47,51,0,0,0,0,0,0,108,97,98,101,108,106,117,115,116,0,0,0,0,0,0,0,32,0,0,0,0,0,0,0,116,111,116,97,108,32,97,100,100,101,100,32,115,111,32,102,97,114,32,61,32,37,100,10,0,0,0,0,0,0,0,0,95,98,108,111,99,107,95,37,100,0,0,
+0,0,0,0,0,115,116,114,105,112,101,100,0,114,32,38,38,32,110,32,38,38,32,110,101,119,0,0,0,47,114,100,112,117,56,47,56,0,0,0,0,0,0,0,0,98,111,120,0,0,0,0,0,103,114,105,100,40,37,100,44,37,100,41,58,32,37,115,10,0,0,0,0,0,0,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,101,115,32,37,100,32,97,110,100,32,37,100,32,100,111,110,39,116,32,116,111,117,99,104,10,0,0,0,0,0,0,37,37,66,101,103,105,110,68,111,99,117,109,101,110,116,58,10,0,0,0,0,0,0,0,112,115,58,112,115,0,0,0,32,91,37,100,
+93,32,37,112,32,115,101,116,32,37,100,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,40,37,46,48,50,102,44,37,46,48,50,102,41,32,37,115,10,0,47,114,100,112,117,56,47,55,0,0,0,0,0,0,0,0,112,111,115,0,0,0,0,0,33,0,0,0,0,0,0,0,38,35,49,54,48,59,0,0,111,117,116,32,111,102,32,100,121,110,97,109,105,99,32,109,101,109,111,114,121,32,105,110,32,97,97,103,101,110,115,117,114,101,95,98,117,102,102,101,114,95,115,116,97,99,107,40,41,0,0,0,0,0,0,0,47,114,100,112,117,56,47,54,0,0,0,0,0,0,0,0,47,98,114,98,103,
+54,47,52,0,0,0,0,0,0,0,0,32,32,109,111,100,101,32,32,32,37,115,10,0,0,0,0,37,46,51,102,32,0,0,0,47,114,100,112,117,56,47,53,0,0,0,0,0,0,0,0,100,101,108,121,32,62,61,32,48,0,0,0,0,0,0,0,47,114,100,112,117,56,47,52,0,0,0,0,0,0,0,0,70,79,78,84,0,0,0,0,47,114,100,112,117,56,47,51,0,0,0,0,0,0,0,0,69,100,103,101,32,115,101,112,97,114,97,116,105,111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,0,0,0,0,0,0,0,47,114,100,112,117,56,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,105,102,32,40,105,
+101,118,101,114,115,62,61,53,41,123,10,0,0,48,0,0,0,0,0,0,0,102,97,116,97,108,32,102,108,101,120,32,115,99,97,110,110,101,114,32,105,110,116,101,114,110,97,108,32,101,114,114,111,114,45,45,110,111,32,97,99,116,105,111,110,32,102,111,117,110,100,0,0,0,0,0,0,37,108,100,0,0,0,0,0,47,114,100,112,117,56,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,55,47,55,0,0,0,0,0,0,0,0,112,111,108,121,108,105,110,101,115],"i8",L,l.J+153640);D([47,116,97,112,101,114,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,
+0,0,0,97,116,105,108,100,101,0,0,112,97,108,101,103,114,101,101,110,0,0,0,0,0,0,0,10,105,110,116,101,114,115,101,99,116,105,111,110,32,97,116,32,37,46,51,102,32,37,46,51,102,10,0,0,0,0,0,47,114,100,112,117,55,47,54,0,0,0,0,0,0,0,0,108,97,98,101,108,108,111,99,0,0,0,0,0,0,0,0,98,108,97,110,99,104,101,100,97,108,109,111,110,100,0,0,114,97,100,105,97,108,0,0,47,114,100,112,117,55,47,53,0,0,0,0,0,0,0,0,47,114,100,112,117,55,47,52,0,0,0,0,0,0,0,0,108,97,121,111,117,116,46,99,0,0,0,0,0,0,0,0,47,114,100,
+112,117,55,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,55,47,50,0,0,0,0,0,0,0,0,58,0,0,0,0,0,0,0,115,116,97,114,116,0,0,0,47,114,100,112,117,55,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,54,47,54,0,0,0,0,0,0,0,0,95,119,101,97,107,95,37,100,0,0,0,0,0,0,0,0,47,114,100,112,117,54,47,53,0,0,0,0,0,0,0,0,32,32,32,32,32,32,125,10,0,0,0,0,0,0,0,0,47,114,100,112,117,54,47,52,0,0,0,0,0,0,0,0,112,116,0,0,0,0,0,0,105,110,118,105,115,0,0,0,47,114,100,112,117,54,47,51,0,0,0,
+0,0,0,0,0,47,100,105,97,103,111,110,97,108,115,32,123,32,125,32,98,105,110,100,32,100,101,102,0,97,115,121,109,112,0,0,0,112,97,108,101,103,111,108,100,101,110,114,111,100,0,0,0,92,78,0,0,0,0,0,0,47,114,100,112,117,54,47,50,0,0,0,0,0,0,0,0,98,108,97,99,107,0,0,0,115,116,121,108,101,0,0,0,103,118,114,101,110,100,101,114,95,115,101,116,95,115,116,121,108,101,58,32,117,110,115,117,112,112,111,114,116,101,100,32,115,116,121,108,101,32,37,115,32,45,32,105,103,110,111,114,105,110,103,10,0,0,0,0,47,114,
+100,112,117,54,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,53,0,0,0,0,0,0,0,0,111,114,100,101,114,105,110,103,32,39,37,115,39,32,110,111,116,32,114,101,99,111,103,110,105,122,101,100,46,10,0,0,115,111,108,105,100,0,0,0,10,0,0,0,0,0,0,0,47,114,100,112,117,53,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,50,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,50,0,0,0,0,0,0,0,0,47,114,100,112,117,53,47,49,0,0,0,0,0,0,0,0,47,114,100,112,117,52,47,52,0,0,0,0,0,0,0,0,
+32,32,32,32,32,32,32,32,32,105,101,118,101,114,115,61,32,112,97,114,115,101,73,110,116,32,40,117,97,46,115,117,98,115,116,114,105,110,103,32,40,109,115,105,101,43,53,44,32,117,97,46,105,110,100,101,120,79,102,32,40,39,46,39,44,32,109,115,105,101,32,41,41,41,10,0,0,0,0,0,47,114,100,112,117,52,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,52,47,50,0,0,0,0,0,0,0,0,47,114,111,117,110,100,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,0,0,97,114,105,110,103,0,0,0,111,114,99,104,105,100,0,0,110,111,
+100,101,46,99,0,0,47,114,100,112,117,52,47,49,0,0,0,0,0,0,0,0,84,105,109,101,115,45,82,111,109,97,110,0,0,0,0,0,102,105,108,108,101,100,0,0,47,114,100,112,117,51,47,51,0,0,0,0,0,0,0,0,47,114,100,112,117,51,47,50,0,0,0,0,0,0,0,0,47,114,100,112,117,51,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,54,47,49,0,0,0,0,0,0,0,0,105,108,108,101,103,97,108,32,112,97,114,97,109,101,116,101,114,32,101,110,116,105,116,121,32,114,101,102,101,114,101,110,99,101,0,0,0,0,0,0,47,114,100,103,121,57,47,57,0,0,0,0,0,0,0,0,47,
+114,100,103,121,57,47,56,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,55,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,54,0,0,0,0,0,0,0,0,32,32,32,32,32,32,105,102,32,40,32,109,115,105,101,32,62,32,48,32,41,123,32,32,32,32,32,32,47,47,32,73,102,32,73,110,116,101,114,110,101,116,32,69,120,112,108,111,114,101,114,44,32,114,101,116,117,114,110,32,118,101,114,115,105,111,110,32,110,117,109,98,101,114,10,0,0,0,0,0,47,114,100,103,121,57,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,52,0,0,0,0,0,0,0,0,47,117,110,
+102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,0,97,110,103,0,0,0,0,0,111,114,97,110,103,101,114,101,100,0,0,0,0,0,0,0,47,114,100,103,121,57,47,51,0,0,0,0,0,0,0,0,85,110,115,117,112,112,111,114,116,101,100,32,99,104,97,114,115,101,116,32,118,97,108,117,101,32,37,100,10,0,0,0,115,97,109,112,108,101,112,111,105,110,116,115,0,0,0,0,47,114,100,103,121,57,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,57,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,56,0,0,0,0,0,0,0,0,47,98,114,98,
+103,53,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,55,0,0,0,0,0,0,0,0,112,110,103,58,118,114,109,108,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,54,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,52,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,86,77,76,110,111,61,110,101,119,32,65,114,114,97,121,40,39,95,110,111,116,86,77,76,49,95,39,44,39,95,110,111,116,86,77,76,50,95,39,41,59,10,0,0,0,0,47,114,100,103,121,56,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,56,47,
+50,0,0,0,0,0,0,0,0,47,102,105,108,108,101,100,32,123,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,97,110,100,0,0,0,0,0,111,114,97,110,103,101,0,0,47,114,100,103,121,56,47,49,0,0,0,0,0,0,0,0,66,73,71,45,53,0,0,0,104,101,97,100,116,111,111,108,116,105,112,0,0,0,0,0,47,114,100,103,121,55,47,55,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,54,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,53,0,0,0,0,0,0,0,0,47,98,114,98,103,53,47,52,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,52,0,0,0,0,0,0,0,0,112,101,110,0,0,
+0,0,0,47,114,100,103,121,55,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,55,47,49,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,86,77,76,121,101,115,61,110,101,119,32,65,114,114,97,121,40,39,95,86,77,76,49,95,39,44,39,95,86,77,76,50,95,39,41,59,10,0,47,114,100,103,121,54,47,54,0,0,0,0,0,0,0,0,47,114,100,103,121,54,47,53,0,0,0,0,0,0,0,0,47,98,111,108,100,32,123,32,50,32,115,101,116,108,105,110,101,119,105,100,116,104,32,125,32,98,105,110,100,32,100,101,102,
+0,0,0,0,0,0,0,97,109,112,0,0,0,0,0,111,108,105,118,101,100,114,97,98,0,0,0,0,0,0,0,47,114,100,103,121,54,47,52,0,0,0,0,0,0,0,0,73,83,79,45,56,56,53,57,45,49,0,0,0,0,0,0,116,97,105,108,116,111,111,108,116,105,112,0,0,0,0,0,47,114,100,103,121,54,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,54,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,54,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,53,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,53,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,52,0,0,0,0,0,0,0,0,47,114,100,103,121,
+53,47,51,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,105,116,101,109,59,10,0,0,0,0,0,0,0,0,47,114,100,103,121,53,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,52,47,52,0,0,0,0,0,0,0,0,47,105,110,118,105,115,32,123,47,102,105,108,108,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,116,114,111,107,101,32,123,110,101,119,112,97,116,104,125,32,100,101,102,32,47,115,104,111,119,32,123,112,111,112,32,110,101,119,112,97,116,104,125,32,100,101,102,
+125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,97,108,112,104,97,0,0,0,110,111,100,101,32,39,37,115,39,44,32,103,114,97,112,104,32,39,37,115,39,32,115,105,122,101,32,116,111,111,32,115,109,97,108,108,32,102,111,114,32,108,97,98,101,108,10,0,111,108,105,118,101,0,0,0,47,114,100,103,121,52,47,51,0,0,0,0,0,0,0,0,85,84,70,45,56,0,0,0,108,97,98,101,108,116,111,111,108,116,105,112,0,0,0,0,47,114,100,103,121,52,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,52,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,51,47,51,
+0,0,0,0,0,0,0,0,47,98,114,98,103,53,47,50,0,0,0,0,0,0,0,0,47,114,100,103,121,51,47,50,0,0,0,0,0,0,0,0,35,32,37,115,10,0,0,0,47,114,100,103,121,51,47,49,0,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,57,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,56,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,105,101,118,101,114,115,59,10,0,0,0,0,0,0,47,114,100,103,121,49,49,47,55,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,54,0,0,0,0,0,0,0,47,100,111,116,116,101,100,32,123,32,91,49,32,73,110,118,83,99,97,108,101,70,97,
+99,116,111,114,32,109,117,108,32,54,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,97,108,101,102,115,121,109,0,108,97,98,101,108,108,111,99,0,0,0,0,0,0,0,0,111,108,100,108,97,99,101,0,47,114,100,103,121,49,49,47,53,0,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,101,100,103,101,116,111,111,108,116,105,112,0,0,0,0,0,47,114,100,103,121,49,49,47,52,0,0,0,0,0,0,0,110,45,62,
+98,114,97,110,99,104,91,105,93,46,99,104,105,108,100,0,0,0,0,0,0,47,114,100,103,121,49,49,47,51,0,0,0,0,0,0,0,108,97,98,101,108,0,0,0,47,114,100,103,121,49,49,47,50,0,0,0,0,0,0,0,47,98,114,98,103,53,47,49,0,0,0,0,0,0,0,0,75,80,95,65,100,100,0,0,47,114,100,103,121,49,49,47,49,49,0,0,0,0,0,0,118,109,108,122,58,118,109,108,0,0,0,0,0,0,0,0,47,114,100,103,121,49,49,47,49,48,0,0,0,0,0,0,47,114,100,103,121,49,49,47,49,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,57,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,
+32,109,115,105,101,32,61,32,117,97,46,105,110,100,101,120,79,102,32,40,32,39,77,83,73,69,32,39,32,41,10,0,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,56,0,0,0,0,0,0,0,103,114,97,112,104,0,0,0,47,114,100,103,121,49,48,47,55,0,0,0,0,0,0,0,47,100,97,115,104,101,100,32,123,32,91,57,32,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,109,117,108,32,100,117,112,32,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,97,103,114,97,118,101,0,0,78,111,32,111,114,32,105,
+109,112,114,111,112,101,114,32,105,109,97,103,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,0,0,0,0,0,0,0,110,97,118,121,0,0,0,0,47,114,100,103,121,49,48,47,54,0,0,0,0,0,0,0,105,100,0,0,0,0,0,0,116,111,111,108,116,105,112,0,47,114,100,103,121,49,48,47,53,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,52,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,51,0,0,0,0,0,0,0,47,98,114,98,103,52,47,52,0,0,0,0,0,0,0,0,47,114,100,103,121,49,48,47,50,0,0,0,0,0,0,0,91,91,58,100,105,103,105,116,
+58,93,93,0,0,0,0,0,47,114,100,103,121,49,48,47,49,48,0,0,0,0,0,0,65,103,114,97,112,104,105,110,102,111,95,116,0,0,0,0,47,114,100,103,121,49,48,47,49,0,0,0,0,0,0,0,100,101,102,108,97,116,105,111,110,32,101,110,100,32,112,114,111,98,108,101,109,32,37,100,10,0,0,0,0,0,0,0,47,114,100,98,117,57,47,57,0,0,0,0,0,0,0,0,32,32,32,32,32,32,118,97,114,32,117,97,32,61,32,119,105,110,100,111,119,46,110,97,118,105,103,97,116,111,114,46,117,115,101,114,65,103,101,110,116,10,0,0,0,0,0,0,120,100,111,116,49,46,50,58,
+120,100,111,116,0,0,0,0,99,97,110,110,111,116,32,109,97,108,108,111,99,32,112,110,108,112,115,0,0,0,0,0,47,114,100,98,117,57,47,56,0,0,0,0,0,0,0,0,47,114,100,98,117,57,47,55,0,0,0,0,0,0,0,0,121,101,115,0,0,0,0,0,47,115,111,108,105,100,32,123,32,91,93,32,48,32,115,101,116,100,97,115,104,32,125,32,98,105,110,100,32,100,101,102,0,0,0,0,0,0,0,0,97,101,108,105,103,0,0,0,60,110,105,108,62,0,0,0,110,97,118,97,106,111,119,104,105,116,101,0,0,0,0,0,91,105,110,116,101,114,110,97,108,32,116,105,109,101,115,
+93,0,0,0,0,0,0,0,0,47,114,100,98,117,57,47,54,0,0,0,0,0,0,0,0,104,101,97,100,99,108,105,112,0,0,0,0,0,0,0,0,108,97,98,101,108,0,0,0,104,101,97,100,116,97,114,103,101,116,0,0,0,0,0,0,47,114,100,98,117,57,47,53,0,0,0,0,0,0,0,0,47,97,99,99,101,110,116,53,47,50,0,0,0,0,0,0,117,115,105,110,103,32,37,115,32,102,111,114,32,117,110,107,110,111,119,110,32,115,104,97,112,101,32,37,115,10,0,0,105,100,120,32,61,61,32,115,122,0,0,0,0,0,0,0,105,110,32,99,104,101,99,107,112,97,116,104,44,32,98,111,120,32,37,100,
+32,104,97,115,32,76,76,32,99,111,111,114,100,32,62,32,85,82,32,99,111,111,114,100,10,0,0,0,47,117,115,101,114,95,115,104,97,112,101,95,37,100,32,123,10,0,0,0,0,0,0,0,120,108,97,98,101,108,115,10,0,0,0,0,0,0,0,0,47,114,100,98,117,57,47,52,0,0,0,0,0,0,0,0,115,116,111,112,10,0,0,0,9,37,115,32,37,100,10,0,32,37,100,37,115,32,105,116,101,114,97,116,105,111,110,115,32,37,46,50,102,32,115,101,99,10,0,0,0,0,0,0,38,35,52,53,59,0,0,0,47,114,100,98,117,57,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,52,47,51,0,0,
+0,0,0,0,0,0,97,116,116,114,105,98,117,116,101,32,109,97,99,114,111,115,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,0,0,0,0,0,0,0,112,97,99,107,32,105,110,102,111,58,10,0,0,0,0,0,83,111,108,118,105,110,103,32,109,111,100,101,108,58,32,0,47,114,100,98,117,57,47,50,0,0,0,0,0,0,0,0,104,116,109,108,116,97,98,108,101,46,99,0,0,0,0,0,47,114,100,98,117,57,47,49,0,0,0,0,0,0,0,0,72,84,77,76,0,0,0,0,47,114,100,98,117,56,47,56,0,0,0,0,0,0,0,0,78,111,100,101,32,115,101,112,97,114,97,116,105,
+111,110,58,32,97,100,100,61,37,100,32,40,37,102,44,37,102,41,10,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,55,0,0,0,0,0,0,0,0,32,32,32,123,10,0,0,0,115,101,103,109,101,110,116,32,91,37,115,44,37,115,93,32,100,111,101,115,32,110,111,116,32,105,110,116,101,114,115,101,99,116,32,98,111,120,32,108,108,61,37,115,44,117,114,61,37,115,10,0,0,0,0,0,101,100,103,101,0,0,0,0,47,114,100,98,117,56,47,54,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,53,0,0,0,0,0,0,0,0,115,112,108,105,110,101,115,0,37,32,115,116,121,108,
+101,115,0,0,0,0,0,0,0,0,97,99,117,116,101,0,0,0,78,111,32,111,114,32,105,109,112,114,111,112,101,114,32,115,104,97,112,101,102,105,108,101,61,34,37,115,34,32,102,111,114,32,110,111,100,101,32,34,37,115,34,10,0,0,0,0,109,111,99,99,97,115,105,110,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,52,0,0,0,0,0,0,0,0,116,97,105,108,99,108,105,112,0,0,0,0,0,0,0,0,116,97,105,108,116,97,114,103,101,116,0,0,0,0,0,0,98,108,97,99,107,0,0,0,47,114,100,98,117,56,47,51,0,0,0,0,0,0,0,0,47,114,100,98,117,56,47,50,0,0,0,0,
+0,0,0,0,47,114,100,98,117,56,47,49,0,0,0,0,0,0,0,0,47,98,114,98,103,52,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,55,47,55,0,0,0,0,0,0,0,0,61,0,0,0,0,0,0,0,120,108,112,0,0,0,0,0,47,114,100,98,117,55,47,54,0,0,0,0,0,0,0,0,47,114,100,98,117,55,47,53,0,0,0,0,0,0,0,0,99,111,109,112,97,99,116,0,47,114,100,98,117,55,47,52,0,0,0,0,0,0,0,0,32,32,32,102,117,110,99,116,105,111,110,32,98,114,111,119,115,101,114,99,104,101,99,107,40,41,10,0,0,0,0,0,47,114,100,98,117,55,47,51,0,0,0,0,0,0,0,0,37,108,102,0,0,0,0,0,
+37,115,32,0,0,0,0,0,47,114,100,98,117,55,47,50,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,115,99,97,108,101,0,0,0,0,97,99,105,114,99,0,0,0,37,115,10,0,0,0,0,0,114,101,103,117,108,97,114,0,109,105,115,116,121,114,111,115,101,0,0,0,0,0,0,0,109,111,118,101,32,116,111,32,102,114,111,110,116,32,108,111,99,107,32,105,110,99,111,110,115,105,115,116,101,110,99,121,0,0,0,0,0,0,0,0,47,114,100,98,117,55,47,49,0,0,0,0,0,0,0,0,99,111,110,115,116,114,97,105,110,116,0,0,0,0,0,0,108,97,98,101,108,116,97,114,103,101,116,
+0,0,0,0,0,47,114,100,98,117,54,47,54,0,0,0,0,0,0,0,0,116,97,112,101,114,101,100,0,47,114,100,98,117,54,47,53,0,0,0,0,0,0,0,0,105,110,0,0,0,0,0,0,32,37,100,44,37,100,0,0,47,114,100,98,117,54,47,52,0,0,0,0,0,0,0,0,47,98,114,98,103,52,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,54,47,51,0,0,0,0,0,0,0,0,47,114,100,98,117,54,47,50,0,0,0,0,0,0,0,0,47,114,100,98,117,54,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,53,47,53,0,0,0,0,0,0,0,0,32,32,32,60,83,67,82,73,80,84,32,76,65,78,71,85,65,71,69,61,39,74,97,118,97,
+115,99,114,105,112,116,39,62,10,0,0,0,0,0,0,47,114,100,98,117,53,47,52,0,0,0,0,0,0,0,0,47,114,100,98,117,53,47,51,0,0,0,0,0,0,0,0,32,32,32,32,32,32,32,100,117,112,32,49,32,101,120,99,104,32,100,105,118,32,47,73,110,118,83,99,97,108,101,70,97,99,116,111,114,32,101,120,99,104,32,100,101,102,0,0,97,97,99,117,116,101,0,0,37,108,102,44,37,108,102,0,109,105,110,116,99,114,101,97,109,0,0,0,0,0,0,0,47,114,100,98,117,53,47,50,0,0,0,0,0,0,0,0,97,114,114,111,119,115,105,122,101,0,0,0,0,0,0,0,101,100,103,101,
+116,97,114,103,101,116,0,0,0,0,0,0,47,114,100,98,117,53,47,49,0,0,0,0,0,0,0,0,47,114,100,98,117,52,47,52,0,0,0,0,0,0,0,0,47,114,100,98,117,52,47,51,0,0,0,0,0,0,0,0,47,98,114,98,103,51,47,51,0,0,0,0,0,0,0,0,106,117,110,107,32,97,102,116,101,114,32,100,111,99,117,109,101,110,116,32,101,108,101,109,101,110,116,0,0,0,0,0,0,1,2,3,4,5,6,7,8,8,9,9,10,10,11,11,12,12,12,12,13,13,13,13,14,14,14,14,15,15,15,15,16,16,16,16,16,16,16,16,17,17,17,17,17,17,17,17,18,18,18,18,18,18,18,18,19,19,19,19,19,19,19,19,20,
+20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,21,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,
+27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,0,1,2,3,4,4,5,5,6,6,6,6,7,7,7,7,8,8,8,8,8,8,8,8,9,9,9,9,9,9,9,9,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,13,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,
+14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,15,0,0,16,17,18,18,19,19,20,20,20,20,21,21,21,21,22,22,22,22,22,22,22,22,23,23,23,23,23,23,23,23,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,25,26,26,
+26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,26,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,27,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,
+29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,29,128,236,1,0,208,226,1,0,56,213,1,0,0,249,1,0,8,210,1,0,104,207,1,0,0,0,0,0,0,0,0,0,120,108,105,110,116,101,114,115,101,99,116,105,111,110,115,0,120,108,104,100,120,117,110,108,111,97,100,0,0,0,0,0,118,109,108,95,116,101,120,116,115,112,97,110,0,0,0,0,118,109,108,95,112,114,105,110,116,95,99,111,108,111,114,0,116,114,97,110,115,112,111,115,101,95,115,116,101,112,0,0,116,107,103,101,110,95,112,114,105,110,116,95,116,97,103,115,0,0,
+0,0,0,0,0,0,116,107,103,101,110,95,112,114,105,110,116,95,99,111,108,111,114,0,0,0,0,0,0,0,116,101,120,116,115,112,97,110,95,115,105,122,101,0,0,0,115,118,103,95,116,101,120,116,115,112,97,110,0,0,0,0,115,118,103,95,112,114,105,110,116,95,99,111,108,111,114,0,115,101,116,98,111,117,110,100,115,0,0,0,0,0,0,0,114,111,117,110,100,95,99,111,114,110,101,114,115,0,0,0,114,101,109,111,118,101,95,102,114,111,109,95,114,97,110,107,0,0,0,0,0,0,0,0,114,101,109,111,118,101,68,101,103,108,105,115,116,0,0,0,112,
+111,115,116,111,114,100,101,114,0,0,0,0,0,0,0,112,111,115,95,104,116,109,108,95,116,98,108,0,0,0,0,112,111,112,95,111,98,106,95,115,116,97,116,101,0,0,0,112,111,112,0,0,0,0,0,112,111,108,121,108,105,110,101,77,105,100,112,111,105,110,116,0,0,0,0,0,0,0,0,112,97,114,115,101,80,97,99,107,77,111,100,101,73,110,102,111,0,0,0,0,0,0,0,111,118,101,114,108,97,112,95,98,101,122,105,101,114,0,0,111,98,106,112,108,112,109,107,115,0,0,0,0,0,0,0,110,101,105,103,104,98,111,114,0,0,0,0,0,0,0,0,110,101,97,116,111,
+95,101,110,113,117,101,117,101,0,0,0,109,107,78,67,111,110,115,116,114,97,105,110,116,71,0,0,109,105,110,109,97,120,95,101,100,103,101,115,0,0,0,0,109,101,114,103,101,118,105,114,116,117,97,108,0,0,0,0,109,101,114,103,101,95,111,110,101,119,97,121,0,0,0,0,109,101,114,103,101,95,99,104,97,105,110,0,0,0,0,0,109,97,112,95,112,97,116,104,0,0,0,0,0,0,0,0,109,97,112,95,111,117,116,112,117,116,95,115,104,97,112,101,0,0,0,0,0,0,0,0,109,97,112,78,0,0,0,0,109,97,107,101,95,108,97,98,101,108,0,0,0,0,0,0,109,
+97,107,101,95,99,104,97,105,110,0,0,0,0,0,0,109,97,107,101,95,98,97,114,114,105,101,114,115,0,0,0,109,97,107,101,83,101,108,102,69,100,103,101,0,0,0,0,109,97,107,101,71,114,97,112,104,68,97,116,97,0,0,0,109,97,107,101,67,111,109,112,111,117,110,100,69,100,103,101,0,0,0,0,0,0,0,0,108,98,108,101,110,99,108,111,115,105,110,103,0,0,0,0,105,110,115,116,97,108,108,95,105,110,95,114,97,110,107,0,105,110,115,101,114,116,78,111,100,101,108,105,115,116,0,0,105,110,105,116,95,115,112,108,105,110,101,115,95,
+98,98,0,103,118,117,115,101,114,115,104,97,112,101,95,102,105,108,101,95,97,99,99,101,115,115,0,103,101,116,105,110,116,114,115,120,105,0,0,0,0,0,0,103,101,116,80,97,99,107,73,110,102,111,0,0,0,0,0,103,101,116,69,100,103,101,76,105,115,116,0,0,0,0,0,102,108,97,116,95,115,101,97,114,99,104,0,0,0,0,0,102,108,97,116,95,114,101,111,114,100,101,114,0,0,0,0,102,105,110,100,67,67,111,109,112,0,0,0,0,0,0,0,102,105,103,95,114,101,115,111,108,118,101,95,99,111,108,111,114,0,0,0,0,0,0,0,102,105,103,95,98,101,
+122,105,101,114,0,0,0,0,0,0,102,97,115,116,95,110,111,100,101,97,112,112,0,0,0,0,102,97,115,116,95,110,111,100,101,0,0,0,0,0,0,0,101,120,112,97,110,100,67,108,117,115,116,101,114,0,0,0,101,110,100,112,97,116,104,0,101,109,105,116,95,101,100,103,101,95,108,97,98,101,108,0,100,111,116,95,112,111,115,105,116,105,111,110,0,0,0,0,100,101,108,101,116,101,95,102,108,97,116,95,101,100,103,101,0,0,0,0,0,0,0,0,100,101,108,101,116,101,95,102,97,115,116,95,110,111,100,101,0,0,0,0,0,0,0,0,100,101,108,101,116,
+101,95,102,97,115,116,95,101,100,103,101,0,0,0,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,118,114,109,108,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,115,118,103,0,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,108,105,98,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,112,115,0,0,0,0,0,0,0,99,111,114,101,95,108,111,97,100,105,109,97,103,101,95,102,105,103,0,0,0,0,0,0,99,111,110,110,101,99,116,71,114,97,112,104,0,
+0,0,0,99,111,109,112,117,116,101,83,99,97,108,101,88,89,0,0,99,108,117,115,116,101,114,95,108,101,97,100,101,114,0,0,98,111,120,73,110,116,101,114,115,101,99,116,102,0,0,0,98,101,122,105,101,114,95,98,98,0,0,0,0,0,0,0,98,101,103,105,110,112,97,116,104,0,0,0,0,0,0,0,98,97,108,97,110,99,101,0,97,98,111,109,105,110,97,116,105,111,110,0,0,0,0,0,95,110,101,97,116,111,95,115,101,116,95,97,115,112,101,99,116,0,0,0,0,0,0,0,95,100,111,116,95,115,112,108,105,110,101,115,0,0,0,0,85,70,95,115,101,116,110,97,
+109,101,0,0,0,0,0,0,83,112,108,105,116,78,111,100,101,0,0,0,0,0,0,0,82,101,99,116,65,114,101,97,0,0,0,0,0,0,0,0,82,84,114,101,101,83,101,97,114,99,104,0,0,0,0,0,82,84,114,101,101,73,110,115,101,114,116,50,0,0,0,0,82,84,114,101,101,73,110,115,101,114,116,0,0,0,0,0,80,111,98,115,112,97,116,104,0,0,0,0,0,0,0,0,80,105,99,107,66,114,97,110,99,104,0,0,0,0,0,0,79,118,101,114,108,97,112,0,78,111,100,101,67,111,118,101,114,0,0,0,0,0,0,0,77,101,116,104,111,100,90,101,114,111,0,0,0,0,0,0,76,111,97,100,78,111,
+100,101,115,0,0,0,0,0,0,0,71,101,116,66,114,97,110,99,104,101,115,0,0,0,0,0,68,105,115,99,111,110,66,114,97,110,99,104,0,0,0,0,67,111,109,98,105,110,101,82,101,99,116,0,0,0,0,0,67,108,97,115,115,105,102,121,0,0,0,0,0,0,0,0,65,100,100,66,114,97,110,99,104,0,0,0,0,0,0,0,46,0,0,0,4,0,0,0,2,0,0,0,64,0,0,0,46,0,0,0,4,0,0,0,46,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,96,13,2,0,8,205,1,0,192,175,1,0,8,152,1,0,248,129,1,0,240,107,1,0,8,87,1,0,32,68,1,0,8,148,2,
+0,240,131,2,0,64,116,2,0,48,100,2,0,160,82,2,0,72,71,2,0,64,59,2,0,128,47,2,0,112,35,2,0,176,24,2,0,40,13,2,0,144,5,2,0,120,252,1,0,152,240,1,0,48,230,1,0,16,221,1,0,208,217,1,0,80,214,1,0,200,211,1,0,112,208,1,0,224,204,1,0,48,202,1,0,192,197,1,0,128,193,1,0,160,189,1,0,240,186,1,0,216,184,1,0,240,182,1,0,160,180,1,0,64,178,1,0,128,175,1,0,8,173,1,0,0,0,0,0,232,125,2,0,128,56,0,0,152,68,0,0,0,0,0,0,72,110,2,0,128,56,0,0,184,63,0,0,0,0,0,0,120,90,2,0,128,56,0,0,232,66,0,0,0,0,0,0,32,78,2,0,128,56,
+0,0,232,66,0,0,0,0,0,0,192,66,2,0,128,56,0,0,8,68,0,0,0,0,0,0,96,54,2,0,176,56,0,0,8,68,0,0,0,0,0,0,248,42,2,0,128,56,0,0,24,67,0,0,0,0,0,0,176,30,2,0,128,56,0,0,88,60,0,0,0,0,0,0,144,20,2,0,128,56,0,0,232,63,0,0,0,0,0,0,216,9,2,0,128,56,0,0,232,63,0,0,0,0,0,0,152,1,2,0,128,56,0,0,168,67,0,0,0,0,0,0,160,248,1,0,128,56,0,0,136,60,0,0,0,0,0,0,8,236,1,0,128,56,0,0,72,64,0,0,0,0,0,0,160,226,1,0,128,56,0,0,40,66,0,0,0,0,0,0,104,219,1,0,128,56,0,0,24,64,0,0,0,0,0,0,16,216,1,0,128,56,0,0,88,66,0,0,0,0,0,
+0,8,213,1,0,128,56,0,0,216,61,0,0,0,0,0,0,240,209,1,0,128,56,0,0,120,64,0,0,0,0,0,0,80,207,1,0,128,56,0,0,216,64,0,0,0,0,0,0,160,203,1,0,128,56,0,0,24,61,0,0,0,0,0,0,16,200,1,0,128,56,0,0,136,66,0,0,0,0,0,0,88,196,1,0,128,56,0,0,104,68,0,0,0,0,0,0,240,190,1,0,128,56,0,0,216,67,0,0,0,0,0,0,16,188,1,0,128,56,0,0,152,68,0,0,0,0,0,0,8,186,1,0,128,56,0,0,152,68,0,0,0,0,0,0,224,183,1,0,128,56,0,0,120,61,0,0,0,0,0,0,224,181,1,0,128,56,0,0,120,67,0,0,0,0,0,0,152,179,1,0,128,56,0,0,72,67,0,0,0,0,0,0,248,176,
+1,0,128,56,0,0,40,60,0,0,0,0,0,0,32,174,1,0,128,56,0,0,104,65,0,0,0,0,0,0,128,171,1,0,128,56,0,0,152,65,0,0,0,0,0,0,64,168,1,0,128,56,0,0,200,65,0,0,0,0,0,0,48,164,1,0,128,56,0,0,248,59,0,0,0,0,0,0,184,161,1,0,128,56,0,0,40,69,0,0,0,0,0,0,8,160,1,0,128,56,0,0,248,68,0,0,0,0,0,0,88,158,1,0,128,56,0,0,88,69,0,0,0,0,0,0,120,156,1,0,128,56,0,0,88,63,0,0,0,0,0,0,192,154,1,0,128,56,0,0,56,68,0,0,0,0,0,0,32,153,1,0,128,56,0,0,232,60,0,0,0,0,0,0,72,151,1,0,128,56,0,0,200,59,0,0,0,0,0,0,224,148,1,0,128,56,
+0,0,248,65,0,0,0,0,0,0,40,146,1,0,128,56,0,0,104,62,0,0,0,0,0,0,152,142,1,0,128,56,0,0,56,62,0,0,0,0,0,0,168,139,1,0,128,56,0,0,40,63,0,0,0,0,0,0,224,137,1,0,128,56,0,0,248,62,0,0,0,0,0,0,64,136,1,0,128,56,0,0,136,63,0,0,0,0,0,0,24,134,1,0,128,56,0,0,152,62,0,0,0,0,0,0,160,132,1,0,128,56,0,0,184,66,0,0,0,0,0,0,0,131,1,0,128,56,0,0,184,60,0,0,0,0,0,0,64,129,1,0,128,56,0,0,168,64,0,0,0,0,0,0,32,127,1,0,128,56,0,0,200,68,0,0,0,0,0,0,128,124,1,0,128,56,0,0,168,61,0,0,0,0,0,0,24,120,1,0,128,56,0,0,8,62,
+0,0,0,0,0,0,32,118,1,0,128,56,0,0,56,65,0,0,0,0,0,0,0,116,1,0,128,56,0,0,200,62,0,0,0,0,0,0,112,114,1,0,128,56,0,0,8,65,0,0,0,0,0,0,152,112,1,0,192,47,0,0,0,0,0,0,0,0,0,0,24,111,1,0,192,47,0,0,0,0,0,0,0,0,0,0,120,165,1,0,152,103,0,0,0,0,0,0,0,0,0,0,48,109,1,0,0,46,0,0,72,61,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,53,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,44,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,62,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,240,235,1,0,72,108,2,0,208,245,1,0,0,0,0,0,107,101,121,0,0,0,0,0,121,101,115,0,0,0,0,0,118,101,114,115,105,111,110,0,115,116,97,110,100,97,108,111,110,101,0,0,0,0,0,0,110,111,0,0,0,0,0,0,101,110,99,111,100,105,110,103,0,0,0,0,0,0,0,0,85,84,70,45,56,0,0,0,85,84,70,45,49,54,76,69,0,0,0,0,0,0,0,0,85,84,70,45,49,54,66,69,0,0,0,0,0,0,0,0,85,84,70,45,49,54,0,0,85,
+83,45,65,83,67,73,73,0,0,0,0,0,0,0,0,83,89,83,84,69,77,0,0,82,69,81,85,73,82,69,68,0,0,0,0,0,0,0,0,80,85,66,76,73,67,0,0,80,67,68,65,84,65,0,0,78,79,84,65,84,73,79,78,0,0,0,0,0,0,0,0,78,77,84,79,75,69,78,83,0,0,0,0,0,0,0,0,78,77,84,79,75,69,78,0,78,68,65,84,65,0,0,0,73,83,79,45,56,56,53,57,45,49,0,0,0,0,0,0,73,77,80,76,73,69,68,0,73,68,82,69,70,83,0,0,73,68,82,69,70,0,0,0,73,68,0,0,0,0,0,0,70,73,88,69,68,0,0,0,69,78,84,73,84,89,0,0,69,78,84,73,84,73,69,83,0,0,0,0,0,0,0,0,69,77,80,84,89,0,0,0,69,76,
+69,77,69,78,84,0,68,79,67,84,89,80,69,0,67,68,65,84,65,0,0,0,65,84,84,76,73,83,84,0,65,78,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,24,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,48,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,14,0,0,0,118,
+0,0,0,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,157,2,0,0,0,0,0,120,157,2,0,0,0,0,0,128,157,2,0,0,0,0,0,136,157,2,0,0,0,0,0,8,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,95,65,71,95,100,97,116,97,100,105,99,116,0,0,0,0,0,0,0,0,0,0,0,0,95,65,71,95,112,101,110,100,105,110,103,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,240,191,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,10,0,0,0,0,0,0,0,2,0,0,0,0,
+0,0,0,0,0,0,0,0,0,240,63,14,0,0,0,0,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,16,0,0,0,0,0,0,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,2,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,51,51,51,51,51,51,243,63,6,0,0,0,0,0,0,0,6,0,0,0,0,0,0,0,154,153,153,153,153,153,233,63,4,0,0,0,0,0,0,0,7,0,0,0,0,0,0,0,0,0,0,0,0,0,240,63,8,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,0,0,224,63,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,216,25,2,0,49,0,0,0,0,0,0,0,0,0,0,0,48,62,2,0,1,0,0,0,32,215,1,0,2,0,0,0,8,181,1,0,3,
+0,0,0,120,155,1,0,4,0,0,0,232,133,1,0,5,0,0,0,112,112,1,0,6,0,0,0,72,91,1,0,8,0,0,0,168,71,1,0,33,0,0,0,152,53,1,0,34,0,0,0,192,134,2,0,34,0,0,0,200,118,2,0,1,0,0,0,88,103,2,0,7,0,0,0,0,0,0,0,0,0,0,0,152,84,2,0,16,0,0,0,248,72,2,0,128,0,0,0,120,60,2,0,64,0,0,0,232,48,2,0,16,0,0,0,224,36,2,0,64,0,0,0,0,0,0,0,0,0,0,0,72,14,2,0,0,0,0,0,1,0,0,0,72,6,2,0,1,0,0,0,0,0,0,0,160,253,1,0,1,0,0,0,1,0,0,0,72,91,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,10,0,0,0,0,0,0,0,11,0,0,0,0,0,0,
+0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,98,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,0,0,0,0,0,0,0,0,0,0,0,26,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,80,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,22,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255],"i8",L,l.J+163880);D([54,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,20,0,0,0,0,0,0,0,0,0,0,0,22,
+0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,54,0,0,0,0,0,0,0,114,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,118,0,0,0,28,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,108,0,0,0,48,0,0,0,0,0,0,0,150,0,0,0,92,0,0,0,22,0,0,0,122,0,0,0,48,0,0,0,114,0,0,0,84,0,0,0,0,0,0,0,152,168,2,0,192,168,2,0,176,168,2,0,0,0,0,0,112,43,2,0,0,0,0,0,8,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,46,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"i8",L,l.J+174124);var sa=l.qb(D(12,"i8",S),8);J(0==sa%8);e._memcpy=
+Za;e._memmove=bc;e._memset=cc;e._memcmp=rc;e._strlen=Aa;var g={ba:1,Ib:2,Uh:3,Ug:4,Ea:5,wd:6,rg:7,rh:8,H:9,Eg:10,lb:11,di:11,Ne:12,mc:13,Pg:14,Dh:15,mb:16,ud:17,Oe:18,Hb:19,oc:20,Sa:21,B:22,mh:23,Me:24,vd:25,ai:26,Qg:27,zh:28,nb:29,Rh:30,fh:31,Lh:32,Mg:33,qc:34,vh:42,Sg:43,Fg:44,Wg:45,Xg:46,Yg:47,eh:48,bi:49,ph:50,Vg:51,Kg:35,sh:37,wg:52,zg:53,ei:54,nh:55,Ag:56,Bg:57,Lg:35,Cg:59,Bh:60,qh:61,Yh:62,Ah:63,wh:64,xh:65,Qh:66,th:67,ug:68,Vh:69,Gg:70,Mh:71,hh:72,Ng:73,yg:74,Hh:76,xg:77,Ph:78,Zg:79,$g:80,
+dh:81,bh:82,ah:83,Ch:38,pc:39,ih:36,nc:40,Kb:95,Kh:96,Jg:104,oh:105,vg:97,Oh:91,Fh:88,yh:92,Sh:108,Ig:111,sg:98,Hg:103,lh:101,jh:100,Zh:110,Rg:112,Je:113,Ke:115,He:114,Ie:89,gh:90,Nh:93,Th:94,tg:99,kh:102,Le:106,Jb:107,$h:109,ci:87,Og:122,Wh:116,Gh:95,uh:123,Tg:84,Ih:75,Dg:125,Eh:131,Jh:130,Xh:86},Oa={"0":"Success",1:"Not super-user",2:"No such file or directory",3:"No such process",4:"Interrupted system call",5:"I/O error",6:"No such device or address",7:"Arg list too long",8:"Exec format error",
+9:"Bad file number",10:"No children",11:"No more processes",12:"Not enough core",13:"Permission denied",14:"Bad address",15:"Block device required",16:"Mount device busy",17:"File exists",18:"Cross-device link",19:"No such device",20:"Not a directory",21:"Is a directory",22:"Invalid argument",23:"Too many open files in system",24:"Too many open files",25:"Not a typewriter",26:"Text file busy",27:"File too large",28:"No space left on device",29:"Illegal seek",30:"Read only file system",31:"Too many links",
+32:"Broken pipe",33:"Math arg out of domain of func",34:"Math result not representable",35:"File locking deadlock error",36:"File or path name too long",37:"No record locks available",38:"Function not implemented",39:"Directory not empty",40:"Too many symbolic links",42:"No message of desired type",43:"Identifier removed",44:"Channel number out of range",45:"Level 2 not synchronized",46:"Level 3 halted",47:"Level 3 reset",48:"Link number out of range",49:"Protocol driver not attached",50:"No CSI structure available",
+51:"Level 2 halted",52:"Invalid exchange",53:"Invalid request descriptor",54:"Exchange full",55:"No anode",56:"Invalid request code",57:"Invalid slot",59:"Bad font file fmt",60:"Device not a stream",61:"No data (for no delay io)",62:"Timer expired",63:"Out of streams resources",64:"Machine is not on the network",65:"Package not installed",66:"The object is remote",67:"The link has been severed",68:"Advertise error",69:"Srmount error",70:"Communication error on send",71:"Protocol error",72:"Multihop attempted",
+73:"Cross mount point (not really error)",74:"Trying to read unreadable message",75:"Value too large for defined data type",76:"Given log. name not unique",77:"f.d. invalid for this operation",78:"Remote address changed",79:"Can access a needed shared lib",80:"Accessing a corrupted shared lib",81:".lib section in a.out corrupted",82:"Attempting to link in too many libs",83:"Attempting to exec a shared library",84:"Illegal byte sequence",86:"Streams pipe error",87:"Too many users",88:"Socket operation on non-socket",
+89:"Destination address required",90:"Message too long",91:"Protocol wrong type for socket",92:"Protocol not available",93:"Unknown protocol",94:"Socket type not supported",95:"Not supported",96:"Protocol family not supported",97:"Address family not supported by protocol family",98:"Address already in use",99:"Address not available",100:"Network interface is not configured",101:"Network is unreachable",102:"Connection reset by network",103:"Connection aborted",104:"Connection reset by peer",105:"No buffer space available",
+106:"Socket is already connected",107:"Socket is not connected",108:"Can't send after socket shutdown",109:"Too many references",110:"Connection timed out",111:"Connection refused",112:"Host is down",113:"Host is unreachable",114:"Socket already connected",115:"Connection already in progress",116:"Stale file handle",122:"Quota exceeded",123:"No medium (in tape drive)",125:"Operation canceled",130:"Previous owner died",131:"State not recoverable"},Na=0,B={xe:function(a){return/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/.exec(a).slice(1)},
+Xc:function(a,b){for(var c=0,f=a.length-1;0<=f;f--){var d=a[f];"."===d?a.splice(f,1):".."===d?(a.splice(f,1),c++):c&&(a.splice(f,1),c--)}if(b)for(;c--;c)a.unshift("..");return a},normalize:function(a){var b="/"===a.charAt(0),c="/"===a.substr(-1),a=B.Xc(a.split("/").filter(function(a){return!!a}),!b).join("/");!a&&!b&&(a=".");a&&c&&(a+="/");return(b?"/":"")+a},dirname:function(a){var b=B.xe(a),a=b[0],b=b[1];if(!a&&!b)return".";b&&(b=b.substr(0,b.length-1));return a+b},wa:function(a){if("/"===a)return"/";
+var b=a.lastIndexOf("/");return-1===b?a:a.substr(b+1)},Fi:function(a){return B.xe(a)[3]},join:function(){var a=Array.prototype.slice.call(arguments,0);return B.normalize(a.join("/"))},V:function(a,b){return B.normalize(a+"/"+b)},eb:function(){for(var a="",b=G,c=arguments.length-1;-1<=c&&!b;c--){var f=0<=c?arguments[c]:d.Bc();"string"!==typeof f&&k(new TypeError("Arguments to path.resolve must be strings"));f&&(a=f+"/"+a,b="/"===f.charAt(0))}a=B.Xc(a.split("/").filter(function(a){return!!a}),!b).join("/");
+return(b?"/":"")+a||"."},te:function(a,b){function c(a){for(var b=0;b<a.length&&""===a[b];b++);for(var c=a.length-1;0<=c&&""===a[c];c--);return b>c?[]:a.slice(b,c-b+1)}for(var a=B.eb(a).substr(1),b=B.eb(b).substr(1),f=c(a.split("/")),d=c(b.split("/")),e=Math.min(f.length,d.length),h=e,j=0;j<e;j++)if(f[j]!==d[j]){h=j;break}e=[];for(j=h;j<f.length;j++)e.push("..");e=e.concat(d.slice(h));return e.join("/")}},Y={Be:[],ka:M(),tj:M(),se:function(a,b){Y.Be[a]={input:[],Oa:[],Bb:b};d.bd(a,Y.o)},o:{open:function(a){var b=
+Y.Be[a.k.Pa];b||k(new d.e(g.Hb));a.aa=b;a.seekable=G},close:function(a){a.aa.Oa.length&&a.aa.Bb.jc(a.aa,10)},P:function(a,b,c,f){(!a.aa||!a.aa.Bb.be)&&k(new d.e(g.wd));for(var e=0,i=0;i<f;i++){var h;try{h=a.aa.Bb.be(a.aa)}catch(j){k(new d.e(g.Ea))}h===p&&0===e&&k(new d.e(g.lb));if(h===r||h===p)break;e++;b[c+i]=h}e&&(a.k.timestamp=Date.now());return e},write:function(a,b,c,f){(!a.aa||!a.aa.Bb.jc)&&k(new d.e(g.wd));for(var e=0;e<f;e++)try{a.aa.Bb.jc(a.aa,b[c+e])}catch(i){k(new d.e(g.Ea))}f&&(a.k.timestamp=
+Date.now());return e}},nf:{be:function(a){if(!a.input.length){var b=r;if(ca){if(b=process.stdin.read(),!b){if(process.stdin._readableState&&process.stdin._readableState.ended)return r;return}}else"undefined"!=typeof window&&"function"==typeof window.prompt?(b=window.prompt("Input: "),b!==r&&(b+="\n")):"function"==typeof readline&&(b=readline(),b!==r&&(b+="\n"));if(!b)return r;a.input=V(b,q)}return a.input.shift()},jc:function(a,b){b===r||10===b?(e.print(a.Oa.join("")),a.Oa=[]):a.Oa.push(Y.De.ic(b))}},
+mf:{jc:function(a,b){b===r||10===b?(e.printErr(a.Oa.join("")),a.Oa=[]):a.Oa.push(Y.De.ic(b))}}},z={la:r,Ge:1,lc:2,rd:3,L:function(){return z.createNode(r,"/",16895,0)},createNode:function(a,b,c,f){(d.Df(c)||d.Ef(c))&&k(new d.e(g.ba));z.la||(z.la={dir:{k:{fa:z.n.fa,N:z.n.N,Wa:z.n.Wa,Y:z.n.Y,Y:z.n.Y,rename:z.n.rename,Ra:z.n.Ra,fb:z.n.fb,bb:z.n.bb,na:z.n.na},ma:{ga:z.o.ga}},file:{k:{fa:z.n.fa,N:z.n.N},ma:{ga:z.o.ga,P:z.o.P,write:z.o.write,rb:z.o.rb,xb:z.o.xb}},link:{k:{fa:z.n.fa,N:z.n.N,Qa:z.n.Qa},ma:{}},
+Hd:{k:{fa:z.n.fa,N:z.n.N},ma:d.Ze}});c=d.createNode(a,b,c,f);d.O(c.mode)?(c.n=z.la.dir.k,c.o=z.la.dir.ma,c.u={}):d.isFile(c.mode)?(c.n=z.la.file.k,c.o=z.la.file.ma,c.u=[],c.Qb=z.lc):d.Va(c.mode)?(c.n=z.la.link.k,c.o=z.la.link.ma):d.vb(c.mode)&&(c.n=z.la.Hd.k,c.o=z.la.Hd.ma);c.timestamp=Date.now();a&&(a.u[b]=c);return c},Ec:function(a){a.Qb!==z.lc&&(a.u=Array.prototype.slice.call(a.u),a.Qb=z.lc)},n:{fa:function(a){var b={};b.Cc=d.vb(a.mode)?a.id:1;b.ac=a.id;b.mode=a.mode;b.Wc=1;b.uid=0;b.Mc=0;b.Pa=
+a.Pa;b.size=d.O(a.mode)?4096:d.isFile(a.mode)?a.u.length:d.Va(a.mode)?a.link.length:0;b.wc=new Date(a.timestamp);b.Uc=new Date(a.timestamp);b.Ac=new Date(a.timestamp);b.Ha=4096;b.sb=Math.ceil(b.size/b.Ha);return b},N:function(a,b){b.mode!==p&&(a.mode=b.mode);b.timestamp!==p&&(a.timestamp=b.timestamp);if(b.size!==p){z.Ec(a);var c=a.u;if(b.size<c.length)c.length=b.size;else for(;b.size>c.length;)c.push(0)}},Wa:function(){k(d.Jc[g.Ib])},Y:function(a,b,c,d){return z.createNode(a,b,c,d)},rename:function(a,
+b,c){if(d.O(a.mode)){var f;try{f=d.ta(b,c)}catch(e){}if(f)for(var i in f.u)k(new d.e(g.pc))}delete a.parent.u[a.name];a.name=c;b.u[c]=a;a.parent=b},Ra:function(a,b){delete a.u[b]},fb:function(a,b){var c=d.ta(a,b),f;for(f in c.u)k(new d.e(g.pc));delete a.u[b]},bb:function(a){var b=[".",".."],c;for(c in a.u)a.u.hasOwnProperty(c)&&b.push(c);return b},na:function(a,b,c){a=z.createNode(a,b,41471,0);a.link=c;return a},Qa:function(a){d.Va(a.mode)||k(new d.e(g.B));return a.link}},o:{P:function(a,b,c,d,e){a=
+a.k.u;if(e>=a.length)return 0;d=Math.min(a.length-e,d);J(0<=d);if(8<d&&a.subarray)b.set(a.subarray(e,e+d),c);else for(var i=0;i<d;i++)b[c+i]=a[e+i];return d},write:function(a,b,c,d,e,i){var h=a.k;h.timestamp=Date.now();a=h.u;if(d&&0===a.length&&0===e&&b.subarray)return i&&0===c?(h.u=b,h.Qb=b.buffer===v.buffer?z.Ge:z.rd):(h.u=new Uint8Array(b.subarray(c,c+d)),h.Qb=z.rd),d;z.Ec(h);for(a=h.u;a.length<e;)a.push(0);for(i=0;i<d;i++)a[e+i]=b[c+i];return d},ga:function(a,b,c){1===c?b+=a.position:2===c&&d.isFile(a.k.mode)&&
+(b+=a.k.u.length);0>b&&k(new d.e(g.B));a.pd=[];return a.position=b},rb:function(a,b,c){z.Ec(a.k);a=a.k.u;for(b+=c;b>a.length;)a.push(0)},xb:function(a,b,c,f,e,i,h){d.isFile(a.k.mode)||k(new d.e(g.Hb));a=a.k.u;if(!(h&2)&&(a.buffer===b||a.buffer===b.buffer))e=G,f=a.byteOffset;else{if(0<e||e+f<a.length)a=a.subarray?a.subarray(e,e+f):Array.prototype.slice.call(a,e,e+f);e=q;(f=ia(f))||k(new d.e(g.Ne));b.set(a,f)}return{ej:f,si:e}}}},I={cc:G,nd:function(){I.cc=!!process.platform.match(/^win/)},L:function(a){J(ca);
+return I.createNode(r,"/",I.La(a.pe.root),0)},createNode:function(a,b,c){!d.O(c)&&(!d.isFile(c)&&!d.Va(c))&&k(new d.e(g.B));a=d.createNode(a,b,c);a.n=I.n;a.o=I.o;return a},La:function(a){var b;try{b=O.Lf(a),I.cc&&(b.mode|=(b.mode&146)>>1)}catch(c){c.code||k(c),k(new d.e(g[c.code]))}return b.mode},Z:function(a){for(var b=[];a.parent!==a;)b.push(a.name),a=a.parent;b.push(a.L.pe.root);b.reverse();return B.join.apply(r,b)},Vd:{"0":"r",1:"r+",2:"r+",64:"r",65:"r+",66:"r+",129:"rx+",193:"rx+",514:"w+",
+577:"w",578:"w+",705:"wx",706:"wx+",1024:"a",1025:"a",1026:"a+",1089:"a",1090:"a+",1153:"ax",1154:"ax+",1217:"ax",1218:"ax+",4096:"rs",4098:"rs+"},Hc:function(a){return a in I.Vd?I.Vd[a]:a},n:{fa:function(a){var a=I.Z(a),b;try{b=O.Lf(a)}catch(c){c.code||k(c),k(new d.e(g[c.code]))}I.cc&&!b.Ha&&(b.Ha=4096);I.cc&&!b.sb&&(b.sb=(b.size+b.Ha-1)/b.Ha|0);return{Cc:b.Cc,ac:b.ac,mode:b.mode,Wc:b.Wc,uid:b.uid,Mc:b.Mc,Pa:b.Pa,size:b.size,wc:b.wc,Uc:b.Uc,Ac:b.Ac,Ha:b.Ha,sb:b.sb}},N:function(a,b){var c=I.Z(a);
+try{b.mode!==p&&(O.xi(c,b.mode),a.mode=b.mode);if(b.timestamp!==p){var f=new Date(b.timestamp);O.Dj(c,f,f)}b.size!==p&&O.yj(c,b.size)}catch(e){e.code||k(e),k(new d.e(g[e.code]))}},Wa:function(a,b){var c=B.V(I.Z(a),b),c=I.La(c);return I.createNode(a,b,c)},Y:function(a,b,c,f){a=I.createNode(a,b,c,f);b=I.Z(a);try{d.O(a.mode)?O.Zi(b,a.mode):O.Gj(b,"",{mode:a.mode})}catch(e){e.code||k(e),k(new d.e(g[e.code]))}return a},rename:function(a,b,c){a=I.Z(a);b=B.V(I.Z(b),c);try{O.mj(a,b)}catch(f){f.code||k(f),
+k(new d.e(g[f.code]))}},Ra:function(a,b){var c=B.V(I.Z(a),b);try{O.Aj(c)}catch(f){f.code||k(f),k(new d.e(g[f.code]))}},fb:function(a,b){var c=B.V(I.Z(a),b);try{O.nj(c)}catch(f){f.code||k(f),k(new d.e(g[f.code]))}},bb:function(a){a=I.Z(a);try{return O.ij(a)}catch(b){b.code||k(b),k(new d.e(g[b.code]))}},na:function(a,b,c){a=B.V(I.Z(a),b);try{O.vj(c,a)}catch(f){f.code||k(f),k(new d.e(g[f.code]))}},Qa:function(a){a=I.Z(a);try{return O.jj(a)}catch(b){b.code||k(b),k(new d.e(g[b.code]))}}},o:{open:function(a){var b=
+I.Z(a.k);try{d.isFile(a.k.mode)&&(a.Ab=O.bj(b,I.Hc(a.I)))}catch(c){c.code||k(c),k(new d.e(g[c.code]))}},close:function(a){try{d.isFile(a.k.mode)&&a.Ab&&O.yi(a.Ab)}catch(b){b.code||k(b),k(new d.e(g[b.code]))}},P:function(a,b,c,f,e){var i=new Buffer(f),h;try{h=O.hj(a.Ab,i,0,f,e)}catch(j){k(new d.e(g[j.code]))}if(0<h)for(a=0;a<h;a++)b[c+a]=i[a];return h},write:function(a,b,c,f,e){var b=new Buffer(b.subarray(c,c+f)),i;try{i=O.Hj(a.Ab,b,0,f,e)}catch(h){k(new d.e(g[h.code]))}return i},ga:function(a,b,c){if(1===
+c)b+=a.position;else if(2===c&&d.isFile(a.k.mode))try{var f=O.Ji(a.Ab),b=b+f.size}catch(e){k(new d.e(g[e.code]))}0>b&&k(new d.e(g.B));return a.position=b}}};Ga=D(1,"i32*",S);ma=D(1,"i32*",S);Ha=D(1,"i32*",S);var d={root:r,gc:[],Pd:[r],jb:[r],Vf:1,Ca:r,Ld:"/",$b:G,ee:q,e:r,Jc:{},sa:function(a){a instanceof d.e||k(a+" : "+bb());return H(a.Vb)},F:function(a,b){a=B.eb(d.Bc(),a);b=b||{ad:0};8<b.ad&&k(new d.e(g.nc));for(var c=B.Xc(a.split("/").filter(function(a){return!!a}),G),f=d.root,e="/",i=0;i<c.length;i++){var h=
+i===c.length-1;if(h&&b.parent)break;f=d.ta(f,c[i]);e=B.V(e,c[i]);d.wb(f)&&(f=f.L.root);if(!h||b.T)for(h=0;d.Va(f.mode);)f=d.Qa(e),e=B.eb(B.dirname(e),f),f=d.F(e,{ad:b.ad}).k,40<h++&&k(new d.e(g.nc))}return{path:e,k:f}},Ba:function(a){for(var b;;){if(d.bc(a))return a=a.L.Sf,!b?a:"/"!==a[a.length-1]?a+"/"+b:a+b;b=b?a.name+"/"+b:a.name;a=a.parent}},Nc:function(a,b){for(var c=0,f=0;f<b.length;f++)c=(c<<5)-c+b.charCodeAt(f)|0;return(a+c>>>0)%d.Ca.length},ce:function(a){var b=d.Nc(a.parent.id,a.name);a.$a=
+d.Ca[b];d.Ca[b]=a},de:function(a){var b=d.Nc(a.parent.id,a.name);if(d.Ca[b]===a)d.Ca[b]=a.$a;else for(b=d.Ca[b];b;){if(b.$a===a){b.$a=a.$a;break}b=b.$a}},ta:function(a,b){var c=d.Nf(a);c&&k(new d.e(c));for(c=d.Ca[d.Nc(a.id,b)];c;c=c.$a){var f=c.name;if(c.parent.id===a.id&&f===b)return c}return d.Wa(a,b)},createNode:function(a,b,c,f){d.Lb||(d.Lb=function(a,b,c,f){this.id=d.Vf++;this.name=b;this.mode=c;this.n={};this.o={};this.Pa=f;this.L=this.parent=r;a||(a=this);this.parent=a;this.L=a.L;d.ce(this)},
+d.Lb.prototype={},Object.defineProperties(d.Lb.prototype,{P:{get:function(){return 365===(this.mode&365)},set:function(a){a?this.mode|=365:this.mode&=-366}},write:{get:function(){return 146===(this.mode&146)},set:function(a){a?this.mode|=146:this.mode&=-147}},Pc:{get:function(){return d.O(this.mode)}},Oc:{get:function(){return d.vb(this.mode)}}}));return new d.Lb(a,b,c,f)},Od:function(a){d.de(a)},bc:function(a){return a===a.parent},wb:function(a){return a.Rf},isFile:function(a){return 32768===(a&
+61440)},O:function(a){return 16384===(a&61440)},Va:function(a){return 40960===(a&61440)},vb:function(a){return 8192===(a&61440)},Df:function(a){return 24576===(a&61440)},Ef:function(a){return 4096===(a&61440)},Hf:function(a){return 49152===(a&49152)},qf:{r:0,rs:1052672,"r+":2,w:577,wx:705,xw:705,"w+":578,"wx+":706,"xw+":706,a:1089,ax:1217,xa:1217,"a+":1090,"ax+":1218,"xa+":1218},je:function(a){var b=d.qf[a];"undefined"===typeof b&&k(Error("Unknown file open mode: "+a));return b},Hc:function(a){var b=
+["r","w","rw"][a&2097155];a&512&&(b+="w");return b},Da:function(a,b){return d.ee?0:-1!==b.indexOf("r")&&!(a.mode&292)||-1!==b.indexOf("w")&&!(a.mode&146)||-1!==b.indexOf("x")&&!(a.mode&73)?g.mc:0},Nf:function(a){return d.Da(a,"x")},Tc:function(a,b){try{return d.ta(a,b),g.ud}catch(c){}return d.Da(a,"wx")},ec:function(a,b,c){var f;try{f=d.ta(a,b)}catch(e){return e.Vb}if(a=d.Da(a,"wx"))return a;if(c){if(!d.O(f.mode))return g.oc;if(d.bc(f)||d.Ba(f)===d.Bc())return g.mb}else if(d.O(f.mode))return g.Sa;
+return 0},Of:function(a,b){return!a?g.Ib:d.Va(a.mode)?g.nc:d.O(a.mode)&&(0!==(b&2097155)||b&512)?g.Sa:d.Da(a,d.Hc(b))},Se:4096,Wf:function(a,b){for(var b=b||d.Se,c=a||1;c<=b;c++)if(!d.jb[c])return c;k(new d.e(g.Me))},D:function(a){return d.jb[a]},Jd:function(a,b,c){d.ob||(d.ob=M(),d.ob.prototype={},Object.defineProperties(d.ob.prototype,{object:{get:function(){return this.k},set:function(a){this.k=a}},Ri:{get:function(){return 1!==(this.I&2097155)}},Si:{get:function(){return 0!==(this.I&2097155)}},
+Qi:{get:function(){return this.I&1024}}}));if(a.__proto__)a.__proto__=d.ob.prototype;else{var f=new d.ob,e;for(e in a)f[e]=a[e];a=f}b=d.Wf(b,c);a.da=b;return d.jb[b]=a},$e:function(a){d.jb[a]=r},Ze:{open:function(a){a.o=d.tf(a.k.Pa).o;a.o.open&&a.o.open(a)},ga:function(){k(new d.e(g.nb))}},Sc:function(a){return a>>8},Yi:function(a){return a&255},Na:function(a,b){return a<<8|b},bd:function(a,b){d.Pd[a]={o:b}},tf:function(a){return d.Pd[a]},Ae:function(a,b){function c(a){if(a)return b(a);++f>=e&&b(r)}
+"function"===typeof a&&(b=a,a=G);for(var f=0,e=d.gc.length,i=0;i<d.gc.length;i++){var h=d.gc[i];h.type.Ae?h.type.Ae(h,a,c):c(r)}},L:function(a,b,c){var f;c&&(f=d.F(c,{T:G}),c=f.path);b={type:a,pe:b,Sf:c,root:r};a=a.L(b);a.L=b;b.root=a;f&&(f.k.L=b,f.k.Rf=q,"/"===c&&(d.root=b.root));d.gc.push(b);return a},Wa:function(a,b){return a.n.Wa(a,b)},Y:function(a,b,c){var f=d.F(a,{parent:q}).k,a=B.wa(a),e=d.Tc(f,a);e&&k(new d.e(e));f.n.Y||k(new d.e(g.ba));return f.n.Y(f,a,b,c)},create:function(a,b){b=(b!==p?
+b:438)&4095;b|=32768;return d.Y(a,b,0)},Xa:function(a,b){b=(b!==p?b:511)&1023;b|=16384;return d.Y(a,b,0)},fc:function(a,b,c){"undefined"===typeof c&&(c=b,b=438);return d.Y(a,b|8192,c)},na:function(a,b){var c=d.F(b,{parent:q}).k,f=B.wa(b),e=d.Tc(c,f);e&&k(new d.e(e));c.n.na||k(new d.e(g.ba));return c.n.na(c,f,a)},rename:function(a,b){var c=B.dirname(a),f=B.dirname(b),e=B.wa(a),i=B.wa(b),h,j,l;try{h=d.F(a,{parent:q}),j=h.k,h=d.F(b,{parent:q}),l=h.k}catch(x){k(new d.e(g.mb))}j.L!==l.L&&k(new d.e(g.Oe));
+h=d.ta(j,e);f=B.te(a,f);"."!==f.charAt(0)&&k(new d.e(g.B));f=B.te(b,c);"."!==f.charAt(0)&&k(new d.e(g.pc));var m;try{m=d.ta(l,i)}catch(s){}if(h!==m){c=d.O(h.mode);(e=d.ec(j,e,c))&&k(new d.e(e));(e=m?d.ec(l,i,c):d.Tc(l,i))&&k(new d.e(e));j.n.rename||k(new d.e(g.ba));(d.wb(h)||m&&d.wb(m))&&k(new d.e(g.mb));l!==j&&(e=d.Da(j,"w"))&&k(new d.e(e));d.de(h);try{j.n.rename(h,l,i)}catch(y){k(y)}finally{d.ce(h)}}},fb:function(a){var b=d.F(a,{parent:q}).k,a=B.wa(a),c=d.ta(b,a),f=d.ec(b,a,q);f&&k(new d.e(f));
+b.n.fb||k(new d.e(g.ba));d.wb(c)&&k(new d.e(g.mb));b.n.fb(b,a);d.Od(c)},bb:function(a){a=d.F(a,{T:q}).k;a.n.bb||k(new d.e(g.oc));return a.n.bb(a)},Ra:function(a){var b=d.F(a,{parent:q}).k,a=B.wa(a),c=d.ta(b,a),f=d.ec(b,a,G);f&&(f===g.Sa&&(f=g.ba),k(new d.e(f)));b.n.Ra||k(new d.e(g.ba));d.wb(c)&&k(new d.e(g.mb));b.n.Ra(b,a);d.Od(c)},Qa:function(a){a=d.F(a,{T:G}).k;a.n.Qa||k(new d.e(g.B));return a.n.Qa(a)},ld:function(a,b){var c=d.F(a,{T:!b}).k;c.n.fa||k(new d.e(g.ba));return c.n.fa(c)},Kf:function(a){return d.ld(a,
+q)},Nb:function(a,b,c){a="string"===typeof a?d.F(a,{T:!c}).k:a;a.n.N||k(new d.e(g.ba));a.n.N(a,{mode:b&4095|a.mode&-4096,timestamp:Date.now()})},Ui:function(a,b){d.Nb(a,b,q)},Gi:function(a,b){var c=d.D(a);c||k(new d.e(g.H));d.Nb(c.k,b)},Gd:function(a,b,c,f){a="string"===typeof a?d.F(a,{T:!f}).k:a;a.n.N||k(new d.e(g.ba));a.n.N(a,{timestamp:Date.now()})},Vi:function(a,b,c){d.Gd(a,b,c,q)},Hi:function(a,b,c){(a=d.D(a))||k(new d.e(g.H));d.Gd(a.k,b,c)},truncate:function(a,b){0>b&&k(new d.e(g.B));var c;
+c="string"===typeof a?d.F(a,{T:q}).k:a;c.n.N||k(new d.e(g.ba));d.O(c.mode)&&k(new d.e(g.Sa));d.isFile(c.mode)||k(new d.e(g.B));var f=d.Da(c,"w");f&&k(new d.e(f));c.n.N(c,{size:b,timestamp:Date.now()})},Ki:function(a,b){var c=d.D(a);c||k(new d.e(g.H));0===(c.I&2097155)&&k(new d.e(g.B));d.truncate(c.k,b)},Cj:function(a,b,c){a=d.F(a,{T:q}).k;a.n.N(a,{timestamp:Math.max(b,c)})},open:function(a,b,c,f,W){var b="string"===typeof b?d.je(b):b,c=b&64?("undefined"===typeof c?438:c)&4095|32768:0,i;if("object"===
+typeof a)i=a;else{a=B.normalize(a);try{i=d.F(a,{T:!(b&131072)}).k}catch(h){}}b&64&&(i?b&128&&k(new d.e(g.ud)):i=d.Y(a,c,0));i||k(new d.e(g.Ib));d.vb(i.mode)&&(b&=-513);(c=d.Of(i,b))&&k(new d.e(c));b&512&&d.truncate(i,0);b&=-641;f=d.Jd({k:i,path:d.Ba(i),I:b,seekable:q,position:0,o:i.o,pd:[],error:G},f,W);f.o.open&&f.o.open(f);e.logReadFiles&&!(b&1)&&(d.$c||(d.$c={}),a in d.$c||(d.$c[a]=1,e.printErr("read file: "+a)));return f},close:function(a){try{a.o.close&&a.o.close(a)}catch(b){k(b)}finally{d.$e(a.da)}},
+ga:function(a,b,c){(!a.seekable||!a.o.ga)&&k(new d.e(g.nb));return a.o.ga(a,b,c)},P:function(a,b,c,f,e){(0>f||0>e)&&k(new d.e(g.B));1===(a.I&2097155)&&k(new d.e(g.H));d.O(a.k.mode)&&k(new d.e(g.Sa));a.o.P||k(new d.e(g.B));var i=q;"undefined"===typeof e?(e=a.position,i=G):a.seekable||k(new d.e(g.nb));b=a.o.P(a,b,c,f,e);i||(a.position+=b);return b},write:function(a,b,c,f,e,i){(0>f||0>e)&&k(new d.e(g.B));0===(a.I&2097155)&&k(new d.e(g.H));d.O(a.k.mode)&&k(new d.e(g.Sa));a.o.write||k(new d.e(g.B));var h=
+q;"undefined"===typeof e?(e=a.position,h=G):a.seekable||k(new d.e(g.nb));a.I&1024&&d.ga(a,0,2);b=a.o.write(a,b,c,f,e,i);h||(a.position+=b);return b},rb:function(a,b,c){(0>b||0>=c)&&k(new d.e(g.B));0===(a.I&2097155)&&k(new d.e(g.H));!d.isFile(a.k.mode)&&!d.O(node.mode)&&k(new d.e(g.Hb));a.o.rb||k(new d.e(g.Kb));a.o.rb(a,b,c)},xb:function(a,b,c,f,e,i,h){1===(a.I&2097155)&&k(new d.e(g.mc));a.o.xb||k(new d.e(g.Hb));return a.o.xb(a,b,c,f,e,i,h)},ub:function(a,b,c){a.o.ub||k(new d.e(g.vd));return a.o.ub(a,
+b,c)},gj:function(a,b){b=b||{};b.I=b.I||"r";b.encoding=b.encoding||"binary";var c,f=d.open(a,b.I),e=d.ld(a).size,i=new Uint8Array(e);d.P(f,i,0,e,0);if("utf8"===b.encoding){c="";for(var h=new l.pb,g=0;g<e;g++)c+=h.ic(i[g])}else"binary"===b.encoding?c=i:k(Error('Invalid encoding type "'+b.encoding+'"'));d.close(f);return c},Fj:function(a,b,c){c=c||{};c.I=c.I||"w";c.encoding=c.encoding||"utf8";a=d.open(a,c.I,c.mode);"utf8"===c.encoding?(b=new Uint8Array((new l.pb).re(b)),d.write(a,b,0,b.length,0)):"binary"===
+c.encoding?d.write(a,b,0,b.length,0):k(Error('Invalid encoding type "'+c.encoding+'"'));d.close(a)},Bc:function(){return d.Ld},wi:function(a){a=d.F(a,{T:q});d.O(a.k.mode)||k(new d.e(g.oc));var b=d.Da(a.k,"x");b&&k(new d.e(b));d.Ld=a.path},bf:function(){d.Xa("/tmp")},af:function(){d.Xa("/dev");d.bd(d.Na(1,3),{P:function(){return 0},write:function(){return 0}});d.fc("/dev/null",d.Na(1,3));Y.se(d.Na(5,0),Y.nf);Y.se(d.Na(6,0),Y.mf);d.fc("/dev/tty",d.Na(5,0));d.fc("/dev/tty1",d.Na(6,0));d.Xa("/dev/shm");
+d.Xa("/dev/shm/tmp")},kf:function(){e.stdin?d.Ia("/dev","stdin",e.stdin):d.na("/dev/tty","/dev/stdin");e.stdout?d.Ia("/dev","stdout",r,e.stdout):d.na("/dev/tty","/dev/stdout");e.stderr?d.Ia("/dev","stderr",r,e.stderr):d.na("/dev/tty1","/dev/stderr");var a=d.open("/dev/stdin","r");t[Ga>>2]=a.da;J(1===a.da,"invalid handle for stdin ("+a.da+")");a=d.open("/dev/stdout","w");t[ma>>2]=a.da;J(2===a.da,"invalid handle for stdout ("+a.da+")");a=d.open("/dev/stderr","w");t[Ha>>2]=a.da;J(3===a.da,"invalid handle for stderr ("+
+a.da+")")},Rd:function(){d.e||(d.e=function(a){this.Vb=a;for(var b in g)if(g[b]===a){this.code=b;break}this.message=Oa[a]},d.e.prototype=Error(),[g.Ib].forEach(function(a){d.Jc[a]=new d.e(a);d.Jc[a].stack="<generic error, no stack>"}))},nd:function(){d.Rd();d.Ca=Array(4096);d.root=d.createNode(r,"/",16895,0);d.L(z,{},"/");d.bf();d.af()},ka:function(a,b,c){J(!d.ka.$b,"FS.init was previously called. If you want to initialize later with custom parameters, remove any earlier calls (note that one is automatically added to the generated code)");
+d.ka.$b=q;d.Rd();e.stdin=a||e.stdin;e.stdout=b||e.stdout;e.stderr=c||e.stderr;d.kf()},bg:function(){d.ka.$b=G;for(var a=0;a<d.jb.length;a++){var b=d.jb[a];b&&d.close(b)}},La:function(a,b){var c=0;a&&(c|=365);b&&(c|=146);return c},Ti:function(a,b){var c=B.join.apply(r,a);b&&"/"==c[0]&&(c=c.substr(1));return c},li:function(a,b){return B.eb(b,a)},uj:function(a){return B.normalize(a)},Ud:function(a,b){var c=d.tc(a,b);if(c.Fc)return c.object;H(c.error);return r},tc:function(a,b){try{var c=d.F(a,{T:!b}),
+a=c.path}catch(f){}var e={bc:G,Fc:G,error:0,name:r,path:r,object:r,Zf:G,ag:r,$f:r};try{c=d.F(a,{parent:q}),e.Zf=q,e.ag=c.path,e.$f=c.k,e.name=B.wa(a),c=d.F(a,{T:!b}),e.Fc=q,e.path=c.path,e.object=c.k,e.name=c.k.name,e.bc="/"===c.path}catch(i){e.error=i.Vb}return e},df:function(a,b,c,f){a=B.V("string"===typeof a?a:d.Ba(a),b);c=d.La(c,f);return d.Xa(a,c)},gf:function(a,b){for(var a="string"===typeof a?a:d.Ba(a),c=b.split("/").reverse();c.length;){var f=c.pop();if(f){var e=B.V(a,f);try{d.Xa(e)}catch(i){}a=
+e}}return e},cf:function(a,b,c,f,e){a=B.V("string"===typeof a?a:d.Ba(a),b);f=d.La(f,e);return d.create(a,f)},zc:function(a,b,c,f,e,i){a=b?B.V("string"===typeof a?a:d.Ba(a),b):a;f=d.La(f,e);e=d.create(a,f);if(c){if("string"===typeof c){for(var a=Array(c.length),b=0,h=c.length;b<h;++b)a[b]=c.charCodeAt(b);c=a}d.Nb(e,f|146);a=d.open(e,"w");d.write(a,c,0,c.length,0,i);d.close(a);d.Nb(e,f)}return e},Ia:function(a,b,c,f){a=B.V("string"===typeof a?a:d.Ba(a),b);b=d.La(!!c,!!f);d.Ia.Sc||(d.Ia.Sc=64);var e=
+d.Na(d.Ia.Sc++,0);d.bd(e,{open:function(a){a.seekable=G},close:function(){f&&(f.buffer&&f.buffer.length)&&f(10)},P:function(a,b,f,e){for(var W=0,m=0;m<e;m++){var s;try{s=c()}catch(y){k(new d.e(g.Ea))}s===p&&0===W&&k(new d.e(g.lb));if(s===r||s===p)break;W++;b[f+m]=s}W&&(a.k.timestamp=Date.now());return W},write:function(a,b,c,e){for(var W=0;W<e;W++)try{f(b[c+W])}catch(m){k(new d.e(g.Ea))}e&&(a.k.timestamp=Date.now());return W}});return d.fc(a,b,e)},ff:function(a,b,c){a=B.V("string"===typeof a?a:d.Ba(a),
+b);return d.na(c,a)},Yd:function(a){if(a.Oc||a.Pc||a.link||a.u)return q;var b=q;"undefined"!==typeof XMLHttpRequest&&k(Error("Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread."));if(e.read)try{a.u=V(e.read(a.url),q)}catch(c){b=G}else k(Error("Cannot load without read() or XMLHttpRequest."));b||H(g.Ea);return b},ef:function(a,b,c,f,e){if("undefined"!==typeof XMLHttpRequest){Xa||
+k("Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc");var i=function(){this.Rc=G;this.Pb=[]};i.prototype.get=function(a){if(!(a>this.length-1||0>a)){var b=a%this.Ob;return this.xf(Math.floor(a/this.Ob))[b]}};i.prototype.kg=function(a){this.xf=a};i.prototype.Ed=function(){var a=new XMLHttpRequest;a.open("HEAD",c,G);a.send(r);200<=a.status&&300>a.status||304===a.status||k(Error("Couldn't load "+c+". Status: "+a.status));var b=Number(a.getResponseHeader("Content-length")),
+d,f=1048576;if(!((d=a.getResponseHeader("Accept-Ranges"))&&"bytes"===d))f=b;var e=this;e.kg(function(a){var d=a*f,i=(a+1)*f-1,i=Math.min(i,b-1);if("undefined"===typeof e.Pb[a]){var h=e.Pb;d>i&&k(Error("invalid range ("+d+", "+i+") or no bytes requested!"));i>b-1&&k(Error("only "+b+" bytes available! programmer error!"));var g=new XMLHttpRequest;g.open("GET",c,G);b!==f&&g.setRequestHeader("Range","bytes="+d+"-"+i);"undefined"!=typeof Uint8Array&&(g.responseType="arraybuffer");g.overrideMimeType&&g.overrideMimeType("text/plain; charset=x-user-defined");
+g.send(r);200<=g.status&&300>g.status||304===g.status||k(Error("Couldn't load "+c+". Status: "+g.status));d=g.response!==p?new Uint8Array(g.response||[]):V(g.responseText||"",q);h[a]=d}"undefined"===typeof e.Pb[a]&&k(Error("doXHR failed!"));return e.Pb[a]});this.Ve=b;this.Ue=f;this.Rc=q};i=new i;Object.defineProperty(i,"length",{get:function(){this.Rc||this.Ed();return this.Ve}});Object.defineProperty(i,"chunkSize",{get:function(){this.Rc||this.Ed();return this.Ue}});i={Oc:G,u:i}}else i={Oc:G,url:c};
+var h=d.cf(a,b,i,f,e);i.u?h.u=i.u:i.url&&(h.u=r,h.url=i.url);var j={};Object.keys(h.o).forEach(function(a){var b=h.o[a];j[a]=function(){d.Yd(h)||k(new d.e(g.Ea));return b.apply(r,arguments)}});j.P=function(a,b,c,f,e){d.Yd(h)||k(new d.e(g.Ea));a=a.k.u;if(e>=a.length)return 0;f=Math.min(a.length-e,f);J(0<=f);if(a.slice)for(var A=0;A<f;A++)b[c+A]=a[e+A];else for(A=0;A<f;A++)b[c+A]=a.get(e+A);return f};h.o=j;return h},hf:function(a,b,c,f,g,i,h,j,l){function x(c){function y(c){j||d.zc(a,b,c,f,g,l);i&&
+i();Ma()}var A=G;e.preloadPlugins.forEach(function(a){!A&&a.canHandle(m)&&(a.handle(c,m,y,function(){h&&h();Ma()}),A=q)});A||y(c)}n.ka();var m=b?B.eb(B.V(a,b)):a;db();"string"==typeof c?n.Xe(c,function(a){x(a)},h):x(c)},indexedDB:function(){return window.indexedDB||window.mozIndexedDB||window.webkitIndexedDB||window.msIndexedDB},sd:function(){return"EM_FS_"+window.location.pathname},td:20,kb:"FILE_DATA",sj:function(a,b,c){var b=b||M(),c=c||M(),f=d.indexedDB();try{var e=f.open(d.sd(),d.td)}catch(i){return c(i)}e.Yf=
+function(){console.log("creating db");e.result.createObjectStore(d.kb)};e.onsuccess=function(){var f=e.result.transaction([d.kb],"readwrite"),i=f.objectStore(d.kb),g=0,l=0,m=a.length;a.forEach(function(a){a=i.put(d.tc(a).object.u,a);a.onsuccess=function(){g++;g+l==m&&(0==l?b():c())};a.onerror=function(){l++;g+l==m&&(0==l?b():c())}});f.onerror=c};e.onerror=c},Xi:function(a,b,c){var b=b||M(),c=c||M(),f=d.indexedDB();try{var e=f.open(d.sd(),d.td)}catch(i){return c(i)}e.Yf=c;e.onsuccess=function(){var f=
+e.result;try{var i=f.transaction([d.kb],"readonly")}catch(g){c(g);return}var l=i.objectStore(d.kb),m=0,n=0,y=a.length;a.forEach(function(a){var f=l.get(a);f.onsuccess=function(){d.tc(a).Fc&&d.Ra(a);d.zc(B.dirname(a),B.wa(a),f.result,q,q,q);m++;m+n==y&&(0==n?b():c())};f.onerror=function(){n++;m+n==y&&(0==n?b():c())}});i.onerror=c};e.onerror=c}},K={L:function(){return d.createNode(r,"/",16895,0)},jf:function(a,b,c){c&&J(1==b==(6==c));a={pf:a,type:b,protocol:c,M:r,Cb:{},Yc:[],cb:[],hb:K.S};b=K.hc();
+c=d.createNode(K.root,b,49152,0);c.gb=a;b=d.Jd({path:b,k:c,I:d.je("r+"),seekable:G,o:K.o});a.ma=b;return a},ae:function(a){a=d.D(a);return!a||!d.Hf(a.k.mode)?r:a.k.gb},o:{qe:function(a){a=a.k.gb;return a.hb.qe(a)},ub:function(a,b,c){a=a.k.gb;return a.hb.ub(a,b,c)},P:function(a,b,c,d){a=a.k.gb;d=a.hb.dg(a,d);if(!d)return 0;b.set(d.buffer,c);return d.buffer.length},write:function(a,b,c,d){a=a.k.gb;return a.hb.ig(a,b,c,d)},close:function(a){a=a.k.gb;a.hb.close(a)}},hc:function(){K.hc.Kd||(K.hc.Kd=0);
+return"socket["+K.hc.Kd++ +"]"},S:{Rb:function(a,b,c){var f;"object"===typeof b&&(f=b,c=b=r);if(f)f._socket?(b=f._socket.remoteAddress,c=f._socket.remotePort):((c=/ws[s]?:\/\/([^:]+):(\d+)/.exec(f.url))||k(Error("WebSocket URL must be in the format ws(s)://address:port")),b=c[1],c=parseInt(c[2],10));else try{var e=ca?{headers:{"websocket-protocol":["binary"]}}:["binary"];f=new (ca?require("ws"):window.WebSocket)("ws://"+b+":"+c,e);f.binaryType="arraybuffer"}catch(i){k(new d.e(g.Je))}b={oa:b,port:c,
+q:f,Sb:[]};K.S.Dd(a,b);K.S.Af(a,b);2===a.type&&"undefined"!==typeof a.ib&&b.Sb.push(new Uint8Array([255,255,255,255,112,111,114,116,(a.ib&65280)>>8,a.ib&255]));return b},Xb:function(a,b,c){return a.Cb[b+":"+c]},Dd:function(a,b){a.Cb[b.oa+":"+b.port]=b},ue:function(a,b){delete a.Cb[b.oa+":"+b.port]},Af:function(a,b){function c(){try{for(var a=b.Sb.shift();a;)b.q.send(a),a=b.Sb.shift()}catch(c){b.q.close()}}function d(c){J("string"!==typeof c&&c.byteLength!==p);var c=new Uint8Array(c),f=e;e=G;f&&10===
+c.length&&255===c[0]&&255===c[1]&&255===c[2]&&255===c[3]&&112===c[4]&&111===c[5]&&114===c[6]&&116===c[7]?(c=c[8]<<8|c[9],K.S.ue(a,b),b.port=c,K.S.Dd(a,b)):a.cb.push({oa:b.oa,port:b.port,data:c})}var e=q;ca?(b.q.on("open",c),b.q.on("message",function(a,b){b.binary&&d((new Uint8Array(a)).buffer)}),b.q.on("error",M())):(b.q.onopen=c,b.q.onmessage=function(a){d(a.data)})},qe:function(a){if(1===a.type&&a.M)return a.Yc.length?65:0;var b=0,c=1===a.type?K.S.Xb(a,a.pa,a.qa):r;if(a.cb.length||!c||c&&c.q.readyState===
+c.q.Gb||c&&c.q.readyState===c.q.CLOSED)b|=65;if(!c||c&&c.q.readyState===c.q.OPEN)b|=4;if(c&&c.q.readyState===c.q.Gb||c&&c.q.readyState===c.q.CLOSED)b|=16;return b},ub:function(a,b,c){switch(b){case 21531:return b=0,a.cb.length&&(b=a.cb[0].data.length),t[c>>2]=b,0;default:return g.B}},close:function(a){if(a.M){try{a.M.close()}catch(b){}a.M=r}for(var c=Object.keys(a.Cb),d=0;d<c.length;d++){var e=a.Cb[c[d]];try{e.q.close()}catch(g){}K.S.ue(a,e)}return 0},bind:function(a,b,c){("undefined"!==typeof a.ed||
+"undefined"!==typeof a.ib)&&k(new d.e(g.B));a.ed=b;a.ib=c||p();if(2===a.type){a.M&&(a.M.close(),a.M=r);try{a.hb.Jf(a,0)}catch(f){f instanceof d.e||k(f),f.Vb!==g.Kb&&k(f)}}},zi:function(a,b,c){a.M&&k(new d.e(ERRNO_CODS.Kb));if("undefined"!==typeof a.pa&&"undefined"!==typeof a.qa){var f=K.S.Xb(a,a.pa,a.qa);f&&(f.q.readyState===f.q.CONNECTING&&k(new d.e(g.He)),k(new d.e(g.Le)))}b=K.S.Rb(a,b,c);a.pa=b.oa;a.qa=b.port;k(new d.e(g.Ke))},Jf:function(a){ca||k(new d.e(g.Kb));a.M&&k(new d.e(g.B));var b=require("ws").Server;
+a.M=new b({host:a.ed,port:a.ib});a.M.on("connection",function(b){if(1===a.type){var d=K.jf(a.pf,a.type,a.protocol),b=K.S.Rb(d,b);d.pa=b.oa;d.qa=b.port;a.Yc.push(d)}else K.S.Rb(a,b)});a.M.on("closed",function(){a.M=r});a.M.on("error",M())},accept:function(a){a.M||k(new d.e(g.B));var b=a.Yc.shift();b.ma.I=a.ma.I;return b},Oi:function(a,b){var c,f;b?((a.pa===p||a.qa===p)&&k(new d.e(g.Jb)),c=a.pa,f=a.qa):(c=a.ed||0,f=a.ib||0);return{oa:c,port:f}},ig:function(a,b,c,f,e,i){if(2===a.type){if(e===p||i===
+p)e=a.pa,i=a.qa;(e===p||i===p)&&k(new d.e(g.Ie))}else e=a.pa,i=a.qa;var h=K.S.Xb(a,e,i);1===a.type&&((!h||h.q.readyState===h.q.Gb||h.q.readyState===h.q.CLOSED)&&k(new d.e(g.Jb)),h.q.readyState===h.q.CONNECTING&&k(new d.e(g.lb)));b=b instanceof Array||b instanceof ArrayBuffer?b.slice(c,c+f):b.buffer.slice(b.byteOffset+c,b.byteOffset+c+f);if(2===a.type&&(!h||h.q.readyState!==h.q.OPEN)){if(!h||h.q.readyState===h.q.Gb||h.q.readyState===h.q.CLOSED)h=K.S.Rb(a,e,i);h.Sb.push(b);return f}try{return h.q.send(b),
+f}catch(j){k(new d.e(g.B))}},dg:function(a,b){1===a.type&&a.M&&k(new d.e(g.Jb));var c=a.cb.shift();if(!c){if(1===a.type){var f=K.S.Xb(a,a.pa,a.qa);if(f){if(f.q.readyState===f.q.Gb||f.q.readyState===f.q.CLOSED)return r;k(new d.e(g.lb))}k(new d.e(g.Jb))}k(new d.e(g.lb))}var f=c.data.byteLength||c.data.length,e=c.data.byteOffset||0,i=c.data.buffer||c.data,h=Math.min(b,f),j={buffer:new Uint8Array(i,e,h),oa:c.oa,port:c.port};1===a.type&&h<f&&(c.data=new Uint8Array(i,e+h,f-h),a.cb.unshift(c));return j}}},
+sc=ac;e._tolower=tc;var uc=ic,vc=jc,wc=kc,xc=oc,yc=nc,zc=Ia;e._strcpy=Ac;var dc=0;e._strcat=Bc;var Cc=lc,Dc=ua,Hb=D(1,"i32*",S),U={};e._saveSetjmp=Ec;e._testSetjmp=Fc;e._strncpy=Gc;var Hc=Ja,Ic=mc,Jc=ua,Kc=ac,Lc=pc,n={ua:{hg:r,we:G,paused:G,fj:[],pause:function(){n.ua.we=q},fg:function(){n.ua.paused&&(n.ua.paused=G,n.ua.hg());n.ua.we=G},updateStatus:function(){if(e.setStatus){var a=e.statusMessage||"Please wait...",b=n.ua.kj,c=n.ua.Ei;b?b<c?e.setStatus(a+" ("+(c-b)+"/"+c+")"):e.setStatus(a):e.setStatus("")}}},
+Qc:G,Zc:G,Qf:[],Ej:[],ka:function(){function a(){n.Zc=document.pointerLockElement===c||document.mozPointerLockElement===c||document.webkitPointerLockElement===c}e.preloadPlugins||(e.preloadPlugins=[]);if(!n.Bf&&!Xa){n.Bf=q;try{new Blob,n.Zb=q}catch(b){n.Zb=G,console.log("warning: no blob constructor, cannot create blobs with mimetypes")}n.BlobBuilder="undefined"!=typeof MozBlobBuilder?MozBlobBuilder:"undefined"!=typeof WebKitBlobBuilder?WebKitBlobBuilder:!n.Zb?console.log("warning: no BlobBuilder"):
+r;n.Mb="undefined"!=typeof window?window.URL?window.URL:window.webkitURL:p;!e.oe&&"undefined"===typeof n.Mb&&(console.log("warning: Browser does not support creating object URLs. Built-in browser image decoding will not be available."),e.oe=q);e.preloadPlugins.push({canHandle:function(a){return!e.oe&&/\.(jpg|jpeg|png|bmp)$/i.test(a)},handle:function(a,b,c,d){var g=r;if(n.Zb)try{g=new Blob([a],{type:n.Kc(b)}),g.size!==a.length&&(g=new Blob([(new Uint8Array(a)).buffer],{type:n.Kc(b)}))}catch(u){l.Fb("Blob constructor present but fails: "+
+u+"; falling back to blob builder")}g||(g=new n.BlobBuilder,g.append((new Uint8Array(a)).buffer),g=g.getBlob());var x=n.Mb.createObjectURL(g),m=new Image;m.onload=function(){J(m.complete,"Image "+b+" could not be decoded");var d=document.createElement("canvas");d.width=m.width;d.height=m.height;d.getContext("2d").drawImage(m,0,0);e.preloadedImages[b]=d;n.Mb.revokeObjectURL(x);c&&c(a)};m.onerror=function(){console.log("Image "+x+" could not be decoded");d&&d()};m.src=x}});e.preloadPlugins.push({canHandle:function(a){return!e.aj&&
+a.substr(-4)in{".ogg":1,".wav":1,".mp3":1}},handle:function(a,b,c,d){function g(d){x||(x=q,e.preloadedAudios[b]=d,c&&c(a))}function l(){x||(x=q,e.preloadedAudios[b]=new Audio,d&&d())}var x=G;if(n.Zb){try{var m=new Blob([a],{type:n.Kc(b)})}catch(s){return l()}var m=n.Mb.createObjectURL(m),y=new Audio;y.addEventListener("canplaythrough",function(){g(y)},G);y.onerror=function(){if(!x){console.log("warning: browser could not fully decode audio "+b+", trying slower base64 approach");for(var c="",d=0,e=
+0,i=0;i<a.length;i++){d=d<<8|a[i];for(e+=8;6<=e;)var h=d>>e-6&63,e=e-6,c=c+"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[h]}2==e?(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&3)<<4],c+="=="):4==e&&(c+="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"[(d&15)<<2],c+="=");y.src="data:audio/x-"+b.substr(-3)+";base64,"+c;g(y)}};y.src=m;n.gg(function(){g(y)},1E4)}else return l()}});var c=e.canvas;c.dd=c.requestPointerLock||c.mozRequestPointerLock||
+c.webkitRequestPointerLock;c.Td=document.exitPointerLock||document.mozExitPointerLock||document.webkitExitPointerLock||M();c.Td=c.Td.bind(document);document.addEventListener("pointerlockchange",a,G);document.addEventListener("mozpointerlockchange",a,G);document.addEventListener("webkitpointerlockchange",a,G);e.elementPointerLock&&c.addEventListener("click",function(a){!n.Zc&&c.dd&&(c.dd(),a.preventDefault())},G)}},Ai:function(a,b,c,d){var g;try{if(b){var i={antialias:G,alpha:G};if(d)for(var h in d)i[h]=
+d[h];var j="?",d=function(a){j=a.statusMessage||j};a.addEventListener("webglcontextcreationerror",d,G);try{["experimental-webgl","webgl"].some(function(b){return g=a.getContext(b,i)})}finally{a.removeEventListener("webglcontextcreationerror",d,G)}}else g=a.getContext("2d");g||k(":(")}catch(l){return e.print("Could not create canvas: "+[j,l]),r}b&&(a.style.backgroundColor="black",a.addEventListener("webglcontextlost",function(){alert("WebGL context lost. You will need to reload the page.")},G));c&&
+(GLctx=e.Bi=g,e.Bj=b,n.Qf.forEach(function(a){a()}),n.ka());return g},Ci:M(),Zd:G,dc:p,Db:p,cd:function(a,b){function c(){n.Qc=G;(document.webkitFullScreenElement||document.webkitFullscreenElement||document.mozFullScreenElement||document.mozFullscreenElement||document.fullScreenElement||document.fullscreenElement)===d?(d.Fd=document.cancelFullScreen||document.mozCancelFullScreen||document.webkitCancelFullScreen,d.Fd=d.Fd.bind(document),n.dc&&d.dd(),n.Qc=q,n.Db&&n.lg()):n.Db&&n.mg();if(e.onFullScreen)e.onFullScreen(n.Qc)}
+n.dc=a;n.Db=b;"undefined"===typeof n.dc&&(n.dc=q);"undefined"===typeof n.Db&&(n.Db=G);var d=e.canvas;n.Zd||(n.Zd=q,document.addEventListener("fullscreenchange",c,G),document.addEventListener("mozfullscreenchange",c,G),document.addEventListener("webkitfullscreenchange",c,G));d.cd=d.requestFullScreen||d.mozRequestFullScreen||(d.webkitRequestFullScreen?function(){d.webkitRequestFullScreen(Element.ALLOW_KEYBOARD_INPUT)}:r);d.cd()},requestAnimationFrame:function(a){"undefined"===typeof window?setTimeout(a,
+1E3/60):(window.requestAnimationFrame||(window.requestAnimationFrame=window.requestAnimationFrame||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.msRequestAnimationFrame||window.oRequestAnimationFrame||window.setTimeout),window.requestAnimationFrame(a))},pj:function(a){return function(){if(!ba)return a.apply(r,arguments)}},qj:function(a){return n.requestAnimationFrame(function(){ba||a()})},gg:function(a,b){return setTimeout(function(){ba||a()},b)},rj:function(a,b){return setInterval(function(){ba||
+a()},b)},Kc:function(a){return{jpg:"image/jpeg",jpeg:"image/jpeg",png:"image/png",bmp:"image/bmp",ogg:"audio/ogg",wav:"audio/wav",mp3:"audio/mpeg"}[a.substr(a.lastIndexOf(".")+1)]},Yb:function(a){window.Yb||(window.Yb=navigator.getUserMedia||navigator.mozGetUserMedia);window.Yb(a)},vf:function(a){return a.movementX||a.mozMovementX||a.webkitMovementX||0},wf:function(a){return a.movementY||a.mozMovementY||a.webkitMovementY||0},Ya:0,Za:0,yb:0,zb:0,ui:function(a){if(n.Zc)"mousemove"!=a.type&&"mozMovementX"in
+a?n.yb=n.zb=0:(n.yb=n.vf(a),n.zb=n.wf(a)),"undefined"!=typeof SDL?(n.Ya=SDL.Ya+n.yb,n.Za=SDL.Za+n.zb):(n.Ya+=n.yb,n.Za+=n.zb);else{var b=e.canvas.getBoundingClientRect(),c,d;c="undefined"!==typeof window.scrollX?window.scrollX:window.pageXOffset;d="undefined"!==typeof window.scrollY?window.scrollY:window.pageYOffset;if("touchstart"==a.type||"touchend"==a.type||"touchmove"==a.type)if(a=a.touches.item(0))c=a.pageX-(c+b.left),d=a.pageY-(d+b.top);else return;else c=a.pageX-(c+b.left),d=a.pageY-(d+b.top);
+a=e.canvas.height;c*=e.canvas.width/b.width;d*=a/b.height;n.yb=c-n.Ya;n.zb=d-n.Za;n.Ya=c;n.Za=d}},qg:function(a,b,c){var d=new XMLHttpRequest;d.open("GET",a,q);d.responseType="arraybuffer";d.onload=function(){200==d.status||0==d.status&&d.response?b(d.response):c()};d.onerror=c;d.send(r)},Xe:function(a,b,c,d){n.qg(a,function(c){J(c,'Loading data file "'+a+'" failed (no arrayBuffer).');b(new Uint8Array(c));d||Ma()},function(){c?c():k('Loading data file "'+a+'" failed.')});d||db()},eg:[],qd:function(){var a=
+e.canvas;n.eg.forEach(function(b){b(a.width,a.height)})},jg:function(a,b,c){var d=e.canvas;d.width=a;d.height=b;c||n.qd()},Fe:0,Ee:0,lg:function(){var a=e.canvas;this.Fe=a.width;this.Ee=a.height;a.width=screen.width;a.height=screen.height;"undefined"!=typeof SDL&&(a=Ya[SDL.screen+0*l.Fa>>2],t[SDL.screen+0*l.Fa>>2]=a|8388608);n.qd()},mg:function(){var a=e.canvas;a.width=this.Fe;a.height=this.Ee;"undefined"!=typeof SDL&&(a=Ya[SDL.screen+0*l.Fa>>2],t[SDL.screen+0*l.Fa>>2]=a&-8388609);n.qd()}};d.nd();
+ka.unshift({Ka:function(){!e.noFSInit&&!d.ka.$b&&d.ka()}});lb.push({Ka:function(){d.ee=G}});Ua.push({Ka:function(){d.bg()}});e.FS_createFolder=d.df;e.FS_createPath=d.gf;e.FS_createDataFile=d.zc;e.FS_createPreloadedFile=d.hf;e.FS_createLazyFile=d.ef;e.FS_createLink=d.ff;e.FS_createDevice=d.Ia;Na=l.md(4);t[Na>>2]=0;ka.unshift({Ka:function(){Y.ka()}});Ua.push({Ka:M()});Y.De=new l.pb;if(ca){var O=require("fs");I.nd()}ka.push({Ka:function(){K.root=d.L(K,{},r)}});dc=l.md(4);Ca(U);ra.$=D([0],"i8",S);Ea.$=
+D([0],"i8",S);e.requestFullScreen=function(a,b){n.cd(a,b)};e.requestAnimationFrame=function(a){n.requestAnimationFrame(a)};e.setCanvasSize=function(a,b,c){n.jg(a,b,c)};e.pauseMainLoop=function(){n.ua.pause()};e.resumeMainLoop=function(){n.ua.fg()};e.getUserMedia=function(){n.Yb()};Zb=X=l.qb(la);nb=Zb+5242880;$b=Z=l.qb(nb);J($b<ha,"TOTAL_MEMORY not big enough for stack");var Mc=D([8,7,6,6,5,5,5,5,4,4,4,4,4,4,4,4,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,
+2,2,2,2,2,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],"i8",3),Nc=D([8,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,
+1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0],"i8",3),va=Math.min;var u=(function(global,env,buffer) {
+// EMSCRIPTEN_START_ASM
+"use asm";var a=new global.Int8Array(buffer);var b=new global.Int16Array(buffer);var c=new global.Int32Array(buffer);var d=new global.Uint8Array(buffer);var e=new global.Uint16Array(buffer);var f=new global.Uint32Array(buffer);var g=new global.Float32Array(buffer);var h=new global.Float64Array(buffer);var i=env.STACKTOP|0;var j=env.STACK_MAX|0;var k=env.tempDoublePtr|0;var l=env.ABORT|0;var m=env.cttz_i8|0;var n=env.ctlz_i8|0;var o=env._stderr|0;var p=env._stdout|0;var q=env._stdin|0;var r=env.___fsmu8|0;var s=+env.NaN;var t=+env.Infinity;var u=0;var v=0;var w=0;var x=0;var y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0.0;var H=0;var I=0;var J=0;var K=0;var L=0;var M=0;var N=0;var O=0;var P=0;var Q=0;var R=global.Math.floor;var S=global.Math.abs;var T=global.Math.sqrt;var U=global.Math.pow;var V=global.Math.cos;var W=global.Math.sin;var X=global.Math.tan;var Y=global.Math.acos;var Z=global.Math.asin;var _=global.Math.atan;var $=global.Math.atan2;var aa=global.Math.exp;var ba=global.Math.log;var ca=global.Math.ceil;var da=global.Math.imul;var ea=env.abort;var fa=env.assert;var ga=env.asmPrintInt;var ha=env.asmPrintFloat;var ia=env.min;var ja=env.invoke_viiiii;var ka=env.invoke_vi;var la=env.invoke_vii;var ma=env.invoke_ii;var na=env.invoke_iiiff;var oa=env.invoke_iiiiii;var pa=env.invoke_iiii;var qa=env.invoke_viiiiii;var ra=env.invoke_iiiiidddd;var sa=env.invoke_di;var ta=env.invoke_dd;var ua=env.invoke_dddd;var va=env.invoke_viiiiiiiii;var wa=env.invoke_iii;var xa=env.invoke_d;var ya=env.invoke_i;var za=env.invoke_viiiddi;var Aa=env.invoke_iiiii;var Ba=env.invoke_viii;var Ca=env.invoke_v;var Da=env.invoke_viiii;var Ea=env._llvm_lifetime_end;var Fa=env._lseek;var Ga=env.__scanString;var Ha=env._fclose;var Ia=env._fflush;var Ja=env._strtol;var Ka=env._fputc;var La=env._strtok;var Ma=env._fwrite;var Na=env._send;var Oa=env._fputs;var Pa=env._tmpnam;var Qa=env._isspace;var Ra=env._read;var Sa=env._ceil;var Ta=env._fileno;var Ua=env._strstr;var Va=env._fsync;var Wa=env._isblank;var Xa=env._fmod;var Ya=env._strcmp;var Za=env._strncmp;var _a=env._tmpfile;var $a=env._snprintf;var ab=env._fgetc;var bb=env.__getFloat;var cb=env._hypot;var db=env._fgets;var eb=env._close;var fb=env._getgid;var gb=env._strchr;var hb=env._asin;var ib=env._puts;var jb=env.___setErrNo;var kb=env._access;var lb=env._ftell;var mb=env._exit;var nb=env._sprintf;var ob=env._strrchr;var pb=env._copysign;var qb=env._recv;var rb=env._cos;var sb=env._putchar;var tb=env._isalnum;var ub=env._times;var vb=env._bsearch;var wb=env.__exit;var xb=env._isupper;var yb=env._rand;var zb=env._fabsf;var Ab=env._setlocale;var Bb=env._bcopy;var Cb=env._toupper;var Db=env._pread;var Eb=env._fopen;var Fb=env._open;var Gb=env._sqrtf;var Hb=env._sysconf;var Ib=env._putenv;var Jb=env._qsort;var Kb=env._isalpha;var Lb=env._strdup;var Mb=env._log10;var Nb=env._fread;var Ob=env._isatty;var Pb=env.__formatString;var Qb=env._getenv;var Rb=env._atoi;var Sb=env._vfprintf;var Tb=env._llvm_pow_f64;var Ub=env._sbrk;var Vb=env.___errno_location;var Wb=env._strerror;var Xb=env._fstat;var Yb=env._llvm_lifetime_start;var Zb=env.__parseInt;var _b=env._vsprintf;var $b=env._vsnprintf;var ac=env._sscanf;var bc=env._feof;var cc=env.___assert_fail;var dc=env._srand;var ec=env._strtok_r;var fc=env._abort;var gc=env._fprintf;var hc=env._tan;var ic=env.___buildEnvironment;var jc=env._fabs;var kc=env._floor;var lc=env.__reallyNegative;var mc=env._fseek;var nc=env._sqrt;var oc=env._write;var pc=env._sin;var qc=env._stat;var rc=env._longjmp;var sc=env._strpbrk;var tc=env._llvm_va_end;var uc=env._acos;var vc=env._pwrite;var wc=env._strerror_r;var xc=env._atan2;var yc=env._exp;var zc=env._time;var Ac=0.0;
+// EMSCRIPTEN_START_FUNCS
+function gj(){var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;i=i+1200|0;f=e|0;g=e+400|0;c[44690]=0;c[44694]=-2;h=0;j=0;k=f;l=f;m=200;n=g;o=g;a:while(1){b[l>>1]=h;if((k+(m-1<<1)|0)>>>0>l>>>0){p=k;q=l;r=m;s=n;t=o}else{g=l-k>>1;u=g+1|0;if(m>>>0>9999>>>0){v=109;break}w=m<<1;x=w>>>0>1e4>>>0?1e4:w;w=dF(x*6|0|3)|0;if((w|0)==0){v=109;break}y=w;z=k;tF(w|0,z|0,u<<1)|0;A=w+((x>>>1&1073741823)<<2)|0;tF(A|0,o|0,u<<2)|0;if((k|0)!=(f|0)){eF(z)}if((x-1|0)>(g|0)){p=y;q=y+(g<<1)|0;r=x;s=A+(g<<2)|0;t=A}else{B=y;C=1;break}}if((h|0)==29){B=p;C=0;break}y=b[22400+(h<<1)>>1]|0;A=y<<16>>16;do{if(y<<16>>16==-72){v=22}else{g=c[44694]|0;if((g|0)==-2){x=Ci()|0;c[44694]=x;D=x}else{D=g}do{if((D|0)<1){c[44694]=0;E=0}else{if(D>>>0>=294>>>0){E=2;break}E=d[21648+D|0]|0}}while(0);g=E+A|0;if(g>>>0>227>>>0){v=22;break}if((a[22768+g|0]|0)!=(E|0)){v=22;break}x=a[21944+g|0]|0;g=x<<24>>24;if(x<<24>>24<1){F=-g|0;v=23;break}else{c[44694]=-2;x=s+4|0;c[x>>2]=c[44692];G=g;H=(j|0)==0?0:j-1|0;I=q;J=x;break}}}while(0);do{if((v|0)==22){v=0;A=a[22656+h|0]|0;if(A<<24>>24!=0){F=A&255;v=23;break}A=c[44694]|0;do{if((j|0)==0){c[44690]=(c[44690]|0)+1;vi(127664);K=q;L=s;M=y}else if((j|0)==3){if((A|0)<1){if((A|0)==0){B=p;C=1;break a}else{K=q;L=s;M=y;break}}else{c[44694]=-2;K=q;L=s;M=y;break}}else{K=q;L=s;M=y}}while(0);while(1){if(M<<16>>16!=-72){A=(M<<16>>16)+1|0;if(M<<16>>16>-2&(A|0)<228&(A|0)==12){break}}if((K|0)==(p|0)){B=p;C=1;break a}A=K-2|0;K=A;L=L-4|0;M=b[22400+(b[A>>1]<<1)>>1]|0}A=L+4|0;c[A>>2]=c[44692];G=1;H=3;I=K;J=A}}while(0);b:do{if((v|0)==23){v=0;y=d[22176+F|0]|0;A=1-y|0;x=s+(A<<2)|0;g=c[x>>2]|0;switch(F|0){case 22:{z=c[53690]|0;u=c[z+4>>2]|0;eF(z);c[53690]=u;N=g;break};case 23:{kj(c[s>>2]|0);N=g;break};case 41:{N=c[s-4>>2]|0;break};case 18:{u=c[53690]|0;z=c[u+4>>2]|0;eF(u);c[53690]=z;N=g;break};case 5:{N=ij()|0;break};case 52:{z=c[s-4>>2]|0;u=c[s>>2]|0;w=jk(16)|0;O=c[53698]|0;P=c[O+84>>2]|0;Q=c[(Hc[c[P>>2]&63](P,0,256)|0)+8>>2]|0;c[w+8>>2]=z;Hc[c[Q>>2]&63](Q,w,1)|0;a[z+92|0]=1;if((a[O+112|0]&1)!=0){a[z+100|0]=1}c[z+88>>2]=u;N=g;break};case 38:{N=c[s-4>>2]|0;break};case 32:{N=c[s>>2]|0;break};case 57:{N=c[s-12>>2]|0;break};case 58:{u=c[s>>2]|0;z=ij()|0;O=jk(16)|0;w=c[53698]|0;Q=c[w+84>>2]|0;P=c[(Hc[c[Q>>2]&63](Q,0,256)|0)+8>>2]|0;c[O+8>>2]=u;Hc[c[P>>2]&63](P,O,1)|0;a[u+92|0]=2;if((a[w+112|0]&1)!=0){a[u+100|0]=1}c[u+88>>2]=z;N=g;break};case 46:{a[(c[s-8>>2]|0)+12|0]=1;N=c[s>>2]|0;break};case 47:{z=$g(71032,c[43328]|0)|0;u=c[53698]|0;w=jk(16)|0;c[w+8>>2]=z;if((a[u+112|0]&2)!=0){a[w+12|0]=1}z=c[u+84>>2]|0;Hc[c[z>>2]&63](z,w,1)|0;N=g;break};case 44:{N=c[s>>2]|0;break};case 45:{N=c[s>>2]|0;break};case 39:{N=c[s-4>>2]|0;break};case 21:{kj(c[s>>2]|0);N=g;break};case 17:{kj(c[s>>2]|0);N=g;break};case 9:{jj(c[s>>2]|0);N=g;break};case 24:{w=c[53690]|0;z=c[w+4>>2]|0;eF(w);c[53690]=z;N=g;break};case 25:{kj(c[s>>2]|0);N=g;break};case 40:{N=c[s-4>>2]|0;break};case 37:{N=c[s>>2]|0;break};case 19:{kj(c[s>>2]|0);N=g;break};case 55:{N=c[s-12>>2]|0;break};case 56:{z=c[s-4>>2]|0;w=c[s>>2]|0;u=jk(16)|0;O=c[53698]|0;P=c[O+84>>2]|0;Q=c[(Hc[c[P>>2]&63](P,0,256)|0)+8>>2]|0;c[u+8>>2]=z;Hc[c[Q>>2]&63](Q,u,1)|0;a[z+92|0]=3;if((a[O+112|0]&1)!=0){a[z+100|0]=1}c[z+88>>2]=w;N=g;break};case 53:{N=c[s-12>>2]|0;break};case 49:{N=c[s>>2]|0;break};case 50:{N=c[s>>2]|0;break};case 51:{w=(c[s-8>>2]|0)+100|0;a[w]=a[w]|1;N=c[s>>2]|0;break};case 54:{w=c[s-4>>2]|0;z=c[s>>2]|0;O=jk(16)|0;u=c[53698]|0;Q=c[u+84>>2]|0;P=c[(Hc[c[Q>>2]&63](Q,0,256)|0)+8>>2]|0;c[O+8>>2]=w;Hc[c[P>>2]&63](P,O,1)|0;a[w+92|0]=2;if((a[u+112|0]&1)!=0){a[w+100|0]=1}c[w+88>>2]=z;N=g;break};case 4:{v=26;break a;break};case 8:{z=c[53692]|0;w=jk(64)|0;u=z+4|0;O=c[u>>2]|0;if(O>>>0<(c[z+8>>2]|0)>>>0){R=O}else{Jv(z,1)|0;R=c[u>>2]|0}a[R]=0;O=c[z>>2]|0;c[u>>2]=O;c[w+8>>2]=Lb(O|0)|0;c[w+12>>2]=c[c[53690]>>2];O=c[53696]|0;Hc[c[O>>2]&63](O,w,1)|0;N=g;break};case 3:{w=c[s-4>>2]|0;O=jk(8)|0;a[O+4|0]=1;c[O>>2]=w;c[53700]=O;N=g;break};case 48:{O=c[(c[53698]|0)+84>>2]|0;N=Hc[c[O>>2]&63](O,0,256)|0;break};case 59:{N=c[s-8>>2]|0;break};case 20:{O=c[53690]|0;w=c[O+4>>2]|0;eF(O);c[53690]=w;N=g;break};case 29:{kj(c[s>>2]|0);N=g;break};case 30:{w=c[53690]|0;O=c[w+4>>2]|0;eF(w);c[53690]=O;N=g;break};case 31:{N=c[s-4>>2]|0;break};case 60:{N=c[s-4>>2]|0;break};case 61:{N=c[s>>2]|0;break};case 35:{O=c[53692]|0;w=c[O+4>>2]|0;if(w>>>0<(c[O+8>>2]|0)>>>0){S=O;T=w}else{Jv(O,1)|0;O=c[53692]|0;S=O;T=c[O+4>>2]|0}c[S+4>>2]=T+1;a[T]=0;O=c[53692]|0;w=c[O>>2]|0;c[O+4>>2]=w;O=w;while(1){w=a[O]|0;if(w<<24>>24==0){break}if(w<<24>>24==32){O=O+1|0}else{v=53;break a}}O=s;c[(c[O>>2]|0)+80>>2]=c[53698];w=$g(11880,c[43328]|0)|0;c[(c[O>>2]|0)+84>>2]=w;c[53698]=c[O>>2];c[(c[O>>2]|0)+108>>2]=c[c[53690]>>2];N=c[O>>2]|0;break};case 36:{O=c[53692]|0;w=c[O+4>>2]|0;if(w>>>0<(c[O+8>>2]|0)>>>0){U=O;V=w}else{Jv(O,1)|0;O=c[53692]|0;U=O;V=c[O+4>>2]|0}c[U+4>>2]=V+1;a[V]=0;O=c[53692]|0;w=c[O>>2]|0;c[O+4>>2]=w;O=w;while(1){w=a[O]|0;if(w<<24>>24==0){break}if(w<<24>>24==32){O=O+1|0}else{v=60;break a}}O=c[53698]|0;c[53698]=c[O+80>>2];N=O;break};case 26:{O=c[53690]|0;w=c[O+4>>2]|0;eF(O);c[53690]=w;N=g;break};case 27:{kj(c[s>>2]|0);N=g;break};case 28:{w=c[53690]|0;O=c[w+4>>2]|0;eF(w);c[53690]=O;N=g;break};case 2:{O=c[s-4>>2]|0;w=jk(8)|0;a[w+4|0]=2;c[w>>2]=O;c[53700]=w;N=g;break};default:{N=g}}w=q+(-y<<1)|0;O=s+(A<<2)|0;c[x>>2]=N;u=(d[22248+F|0]|0)-39|0;z=b[w>>1]|0;P=z+(b[22320+(u<<1)>>1]|0)|0;do{if(P>>>0<228>>>0){if((a[22768+P|0]|0)!=(z|0)){break}G=a[21944+P|0]|0;H=j;I=w;J=O;break b}}while(0);G=a[22616+u|0]|0;H=j;I=w;J=O}}while(0);h=G;j=H;k=p;l=I+2|0;m=r;n=J;o=t}if((v|0)==26){hj();B=p;C=1}else if((v|0)==53){vi(119648);hj();B=p;C=1}else if((v|0)==60){vi(157536);hj();B=p;C=1}else if((v|0)==109){vi(102648);B=k;C=2}if((B|0)==(f|0)){i=e;return C|0}eF(B);i=e;return C|0}function hj(){var a=0,b=0,d=0,e=0;a=c[53698]|0;b=c[53700]|0;if((b|0)!=0){wj(b,1);c[53700]=0}c[17762]=78;if((a|0)!=0){b=a;while(1){a=c[b+80>>2]|0;Vg(c[b+84>>2]|0)|0;uj(b|0);eF(b);if((a|0)==0){break}else{b=a}}}c[17762]=90;c[6396]=94;b=c[53696]|0;Hc[c[b>>2]&63](b,0,64)|0;c[6396]=90;c[6406]=30;b=c[53694]|0;Hc[c[b>>2]&63](b,0,64)|0;c[6406]=90;b=c[53690]|0;a=c[b+4>>2]|0;if((a|0)==0){return}else{d=b;e=a}while(1){eF(d);a=c[e+4>>2]|0;if((a|0)==0){break}else{d=e;e=a}}return}function ij(){var a=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;a=c[53694]|0;d=jk(40)|0;e=d;if((bh(c[53696]|0)|0)!=0){jj(0)}f=bh(a)|0;b[d+4>>1]=f;if((f|0)==0){g=a|0;h=c[g>>2]|0;i=Hc[h&63](a,0,64)|0;return e|0}j=d;c[j>>2]=jk(f*24|0)|0;f=a|0;d=Hc[c[f>>2]&63](a,0,128)|0;if((d|0)==0){g=f;h=c[g>>2]|0;i=Hc[h&63](a,0,64)|0;return e|0}else{k=d;l=0}while(1){d=k+8|0;m=(c[j>>2]|0)+(l*24|0)|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];c[m+16>>2]=c[d+16>>2];c[m+20>>2]=c[d+20>>2];d=Hc[c[f>>2]&63](a,k,8)|0;if((d|0)==0){g=f;break}else{k=d;l=l+1|0}}h=c[g>>2]|0;i=Hc[h&63](a,0,64)|0;return e|0}function jj(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=jk(32)|0;f=c[53696]|0;g=bh(f)|0;h=e+8|0;a[e+14|0]=d;do{if((g|0)==0){d=h;c[d>>2]=jk(56)|0;b[e+12>>1]=1;i=Lb(213312)|0;c[c[d>>2]>>2]=i;c[(c[d>>2]|0)+4>>2]=c[c[53690]>>2]}else{b[e+12>>1]=g;d=h;c[d>>2]=jk(g*56|0)|0;i=Zg(f)|0;if((i|0)==0){break}else{j=i;k=0}while(1){i=(c[d>>2]|0)+(k*56|0)|0;l=j+8|0;c[i>>2]=c[l>>2];c[i+4>>2]=c[l+4>>2];c[i+8>>2]=c[l+8>>2];c[i+12>>2]=c[l+12>>2];c[i+16>>2]=c[l+16>>2];c[i+20>>2]=c[l+20>>2];c[i+24>>2]=c[l+24>>2];c[i+28>>2]=c[l+28>>2];c[i+32>>2]=c[l+32>>2];c[i+36>>2]=c[l+36>>2];c[i+40>>2]=c[l+40>>2];c[i+44>>2]=c[l+44>>2];c[i+48>>2]=c[l+48>>2];c[i+52>>2]=c[l+52>>2];l=c[j>>2]|0;if((l|0)==0){break}else{j=l;k=k+1|0}}}}while(0);Hc[c[f>>2]&63](f,0,64)|0;f=c[53694]|0;Hc[c[f>>2]&63](f,e,1)|0;return}function kj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0.0;b=i;i=i+32|0;d=b|0;e=jk(8)|0;f=e;g=c[c[53690]>>2]|0;j=d;k=a;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];c[j+16>>2]=c[k+16>>2];c[j+20>>2]=c[k+20>>2];c[j+24>>2]=c[k+24>>2];c[j+28>>2]=c[k+28>>2];do{if((g|0)!=0){k=d+4|0;do{if((c[k>>2]|0)==0){a=c[g+4>>2]|0;if((a|0)==0){break}c[k>>2]=a}}while(0);k=d+16|0;do{if(+h[k>>3]<0.0){l=+h[g+16>>3];if(l<0.0){break}h[k>>3]=l}}while(0);k=d|0;do{if((c[k>>2]|0)==0){a=c[g>>2]|0;if((a|0)==0){break}c[k>>2]=a}}while(0);k=c[g+24>>2]&127;if((k|0)==0){break}a=d+24|0;c[a>>2]=c[a>>2]|k}}while(0);d=c[(c[53688]|0)+144>>2]|0;c[e>>2]=Hc[c[d>>2]&63](d,j,1)|0;c[e+4>>2]=c[53690];c[53690]=f;i=b;return}function lj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+152|0;f=e+128|0;g=e+144|0;c[g>>2]=0;c[g+4>>2]=0;c[53690]=g;c[53698]=0;c[53700]=0;c[53688]=c[(c[(c[d+52>>2]|0)+8>>2]|0)+136>>2];c[53696]=$g(25568,c[43328]|0)|0;c[53694]=$g(25608,c[43328]|0)|0;Iv(f,128,e|0);c[53692]=f;if((xi(a,f,d)|0)==0){gj()|0;c[b>>2]=Bi()|0;h=c[53700]|0}else{c[b>>2]=2;h=0}Vg(c[53696]|0)|0;Vg(c[53694]|0)|0;c[53696]=0;c[53694]=0;c[53690]=0;Mv(f);i=e;return h|0}function mj(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function nj(a,b,d){a=a|0;b=b|0;d=d|0;Vg(c[b+8>>2]|0)|0;eF(b);return}function oj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;e=c[d+8>>2]|0;b=e+88|0;f=a[e+92|0]|0;if((f<<24>>24|0)==2){vj(c[b>>2]|0)}else if((f<<24>>24|0)==1){f=c[b>>2]|0;Vg(c[f+84>>2]|0)|0;uj(f|0);eF(f)}uj(e|0);eF(e);eF(d);return}function pj(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b+8>>2]|0;if((d|0)!=0){eF(d)}eF(b);return}function qj(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;e=d+12|0;a=b[e>>1]|0;if(a<<16>>16==0){f=d;eF(f);return}g=d+8|0;if(a<<16>>16>0){h=c[g>>2]|0;i=0;j=a;while(1){a=c[h>>2]|0;if((a|0)==0){k=j}else{eF(a);k=b[e>>1]|0}a=i+1|0;if((a|0)<(k<<16>>16|0)){h=h+56|0;i=a;j=k}else{break}}}eF(c[g>>2]|0);f=d;eF(f);return}function rj(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;i=i+72|0;j=g|0;k=Fh(d)|0;l=c[k>>2]|0;m=c[l+4>>2]|0;c[k+4>>2]=m;c[k+12>>2]=c[l+12>>2];if((m|0)==1){c[k+8>>2]=c[l+8>>2]}else if((m|0)==0){c[k+8>>2]=c[l+8>>2]}else if((m|0)==2){c[k+8>>2]=c[l+8>>2]}else if((m|0)==3){c[k+8>>2]=c[l+8>>2]}c[k+208>>2]=c[l+208>>2];c[k+228>>2]=c[l+228>>2];c[k+244>>2]=c[l+244>>2];m=k+260|0;b[m>>1]=b[m>>1]&-2|b[l+260>>1]&1;n=+h[f+56>>3];o=+h[f+64>>3];l=a[f+80|0]|0;if((l|0)==98){p=+h[f+48>>3];m=a[e+4|0]|0;if((m|0)==3){k=c[e>>2]|0;q=+h[k+24>>3]- +h[k+8>>3]}else if((m|0)==1){k=c[e>>2]|0;q=+h[k+72>>3]- +h[k+56>>3]}else if((m|0)==2){m=c[e>>2]|0;q=+h[m+32>>3]- +h[m+16>>3]}else{q=0.0}r=o-(p-q)*.5+-1.0}else if((l|0)==116){q=+h[f+48>>3];l=a[e+4|0]|0;if((l|0)==1){m=c[e>>2]|0;s=+h[m+72>>3]- +h[m+56>>3]}else if((l|0)==3){m=c[e>>2]|0;s=+h[m+24>>3]- +h[m+8>>3]}else if((l|0)==2){l=c[e>>2]|0;s=+h[l+32>>3]- +h[l+16>>3]}else{s=0.0}r=o+(q-s)*.5+-1.0}else{r=o}h[j>>3]=n;h[j+8>>3]=r;c[j+20>>2]=c[f+8>>2];c[j+16>>2]=c[f+4>>2];h[j+32>>3]=+h[f+16>>3];f=d+16|0;l=ew(c[(c[f>>2]|0)+8>>2]|0,119632)|0;m=j+56|0;c[m>>2]=l;k=j+60|0;c[k>>2]=c[(c[f>>2]|0)+212>>2];t=j+64|0;a[t]=0;if((l|0)==0){u=19}else{if((a[l]|0)==0){u=19}}if((u|0)==19){c[m>>2]=157520}if((a[e+4|0]|0)==1){m=c[e>>2]|0;pB(d,c[(c[d>>2]|0)+336>>2]|0);u=c[m+24>>2]|0;if((u|0)==0){lB(d,127648)}else{lB(d,u)}sj(d,m,j)}else{tj(d,c[e>>2]|0,j)}if((a[t]|0)==0){v=c[f>>2]|0;w=v+208|0;c[w>>2]=0;x=v+228|0;c[x>>2]=0;y=v+244|0;c[y>>2]=0;z=v+212|0;c[z>>2]=0;Gh(d);i=g;return}eF(c[k>>2]|0);v=c[f>>2]|0;w=v+208|0;c[w>>2]=0;x=v+228|0;c[x>>2]=0;y=v+244|0;c[y>>2]=0;z=v+212|0;c[z>>2]=0;Gh(d);i=g;return}function sj(f,g,j){f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0,O=0,P=0,Q=0,R=0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0,Ia=0,Ja=0.0,Ka=0,La=0,Ma=0.0,Na=0,Oa=0,Pa=0.0,Qa=0;k=i;i=i+480|0;l=k|0;m=k+64|0;n=k+96|0;o=k+136|0;p=k+168|0;q=k+232|0;r=k+240|0;s=k+272|0;t=k+304|0;u=k+336|0;v=k+368|0;w=k+408|0;x=k+472|0;y=g|0;z=u;A=g+48|0;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];c[z+16>>2]=c[A+16>>2];c[z+20>>2]=c[A+20>>2];c[z+24>>2]=c[A+24>>2];c[z+28>>2]=c[A+28>>2];A=j|0;B=+h[A>>3];C=j+8|0;D=+h[C>>3];E=g+84|0;F=c[E>>2]|0;if((c[g>>2]|0)==0){G=(c[g+8>>2]|0)!=0}else{G=1}H=g+108|0;I=c[H>>2]|0;do{if((I|0)!=0){J=j+16|0;K=c[J>>2]|0;do{if((K|0)!=0){L=I|0;if((c[L>>2]|0)==0){c[45156]=0;break}else{c[45156]=K;c[J>>2]=c[L>>2];break}}}while(0);J=j+20|0;K=c[J>>2]|0;do{if((K|0)!=0){L=I+4|0;if((c[L>>2]|0)==0){c[45157]=0;break}else{c[45157]=K;c[J>>2]=c[L>>2];break}}}while(0);J=j+32|0;M=+h[J>>3];if(M<0.0){break}K=I+16|0;if(+h[K>>3]<0.0){h[22580]=-1.0;break}else{h[22580]=M;h[J>>3]=+h[K>>3];break}}}while(0);I=u|0;h[I>>3]=B+ +h[I>>3];I=u+16|0;h[I>>3]=B+ +h[I>>3];I=u+8|0;h[I>>3]=D+ +h[I>>3];I=u+24|0;h[I>>3]=D+ +h[I>>3];do{if(G){if((c[f+152>>2]&4|0)!=0){N=0;break}N=Kj(f,j,y,u,v,1)|0}else{N=0}}while(0);I=g+42|0;K=e[I>>1]|0;do{if((K&32|0)==0){J=c[g+20>>2]|0;if((J|0)!=0){L=x|0;O=Lj(f,J,c[g+28>>2]|0,K,L)|0;if((b[I>>1]&4)==0){sB(f,u,O)}else{J=a[g+33|0]|0;P=t;c[P>>2]=c[z>>2];c[P+4>>2]=c[z+4>>2];c[P+8>>2]=c[z+8>>2];c[P+12>>2]=c[z+12>>2];c[P+16>>2]=c[z+16>>2];c[P+20>>2]=c[z+20>>2];c[P+24>>2]=c[z+24>>2];c[P+28>>2]=c[z+28>>2];P=w;c[P>>2]=c[z>>2];c[P+4>>2]=c[z+4>>2];c[P+8>>2]=c[z+8>>2];c[P+12>>2]=c[z+12>>2];P=w+32|0;Q=P;R=t+16|0;c[Q>>2]=c[R>>2];c[Q+4>>2]=c[R+4>>2];c[Q+8>>2]=c[R+8>>2];c[Q+12>>2]=c[R+12>>2];if((J&255)>>>0>1>>>0){D=+(J&255|0)*.5;J=w|0;B=D+ +h[J>>3];h[J>>3]=B;J=w+8|0;M=D+ +h[J>>3];h[J>>3]=M;J=P|0;S=+h[J>>3]-D;h[J>>3]=S;J=w+40|0;T=+h[J>>3]-D;h[J>>3]=T;U=S;V=M;W=B;X=T}else{U=+h[P>>3];V=+h[w+8>>3];W=+h[w>>3];X=+h[w+40>>3]}h[w+16>>3]=U;h[w+24>>3]=V;h[w+48>>3]=W;h[w+56>>3]=X;ol(f,w|0,4,4,O)}eF(c[L>>2]|0)}L=c[F>>2]|0;if((L|0)!=0){O=m;P=o;J=p;R=o|0;Q=o+16|0;Y=o+8|0;Z=o+24|0;_=f+152|0;$=l|0;aa=l+8|0;ba=l+32|0;ca=l+40|0;da=l+16|0;ea=l|0;fa=l+24|0;ga=l+48|0;ha=l+56|0;ia=j+56|0;ja=q|0;ka=p|0;la=p+32|0;ma=la;na=m+16|0;oa=p|0;pa=p+8|0;qa=la|0;la=p+40|0;ra=p+16|0;sa=p+24|0;ta=p+48|0;ua=p+56|0;va=F;wa=L;do{L=wa|0;xa=wa+48|0;c[P>>2]=c[xa>>2];c[P+4>>2]=c[xa+4>>2];c[P+8>>2]=c[xa+8>>2];c[P+12>>2]=c[xa+12>>2];c[P+16>>2]=c[xa+16>>2];c[P+20>>2]=c[xa+20>>2];c[P+24>>2]=c[xa+24>>2];c[P+28>>2]=c[xa+28>>2];T=+h[A>>3];B=+h[C>>3];if((c[wa>>2]|0)==0){ya=(c[wa+8>>2]|0)!=0}else{ya=1}h[R>>3]=T+ +h[R>>3];h[Q>>3]=T+ +h[Q>>3];h[Y>>3]=B+ +h[Y>>3];h[Z>>3]=B+ +h[Z>>3];do{if(ya){if((c[_>>2]&4|0)!=0){za=0;break}za=Kj(f,j,L,o,n,1)|0}else{za=0}}while(0);xa=wa+42|0;Aa=e[xa>>1]|0;do{if((Aa&32|0)==0){Ba=c[wa+20>>2]|0;if((Ba|0)!=0){Ca=Lj(f,Ba,c[wa+28>>2]|0,Aa,ja)|0;if((b[xa>>1]&4)==0){sB(f,o,Ca)}else{Ba=a[wa+33|0]|0;c[O>>2]=c[P>>2];c[O+4>>2]=c[P+4>>2];c[O+8>>2]=c[P+8>>2];c[O+12>>2]=c[P+12>>2];c[O+16>>2]=c[P+16>>2];c[O+20>>2]=c[P+20>>2];c[O+24>>2]=c[P+24>>2];c[O+28>>2]=c[P+28>>2];c[J>>2]=c[P>>2];c[J+4>>2]=c[P+4>>2];c[J+8>>2]=c[P+8>>2];c[J+12>>2]=c[P+12>>2];c[ma>>2]=c[na>>2];c[ma+4>>2]=c[na+4>>2];c[ma+8>>2]=c[na+8>>2];c[ma+12>>2]=c[na+12>>2];if((Ba&255)>>>0>1>>>0){B=+(Ba&255|0)*.5;T=B+ +h[oa>>3];h[oa>>3]=T;M=B+ +h[pa>>3];h[pa>>3]=M;S=+h[qa>>3]-B;h[qa>>3]=S;D=+h[la>>3]-B;h[la>>3]=D;Da=S;Ea=M;Fa=T;Ga=D}else{Da=+h[qa>>3];Ea=+h[pa>>3];Fa=+h[oa>>3];Ga=+h[la>>3]}h[ra>>3]=Da;h[sa>>3]=Ea;h[ta>>3]=Fa;h[ua>>3]=Ga;ol(f,ka,4,4,Ca)}eF(c[ja>>2]|0)}if((a[wa+33|0]|0)!=0){Mj(f,L,o)}Ca=wa+88|0;Ba=a[wa+92|0]|0;if((Ba<<24>>24|0)==1){sj(f,c[Ca>>2]|0,j);break}else if((Ba<<24>>24|0)==3){Ba=c[Ca>>2]|0;D=+h[A>>3];T=+h[Ba>>3]+D;M=+h[C>>3];S=+h[Ba+8>>3]+M;B=+h[Ba+16>>3]+D;D=+h[Ba+24>>3]+M;h[$>>3]=B;h[aa>>3]=D;h[ba>>3]=T;h[ca>>3]=S;h[da>>3]=T;h[fa>>3]=D;h[ga>>3]=B;h[ha>>3]=S;Ha=c[Ba+36>>2]|0;if((Ha|0)==0){Ia=c[ia>>2]|0}else{Ia=Ha}wB(f,c[Ba+32>>2]|0,ea,4,1,Ia);break}else{tj(f,c[Ca>>2]|0,j);break}}}while(0);if((za|0)!=0){Nj(f,n,1)}do{if(ya){if((c[_>>2]&4|0)==0){break}if((Kj(f,j,L,o,n,0)|0)==0){break}Nj(f,n,0)}}while(0);va=va+4|0;wa=c[va>>2]|0;}while((wa|0)!=0)}wa=c[E>>2]|0;xB(f,1.0);va=c[wa>>2]|0;if((va|0)!=0){_=g+24|0;ea=r|0;ia=r+8|0;ha=r+16|0;ga=r+24|0;fa=s|0;da=s+8|0;ca=s+16|0;ba=s+24|0;aa=wa;wa=va;do{aa=aa+4|0;va=wa+100|0;do{if((a[va]|0)!=0){$=c[_>>2]|0;ja=c[aa>>2]|0;S=+h[A>>3];B=+h[C>>3];ka=($|0)==0?127648:$;nB(f,ka);lB(f,ka);D=S+ +h[wa+48>>3];T=S+ +h[wa+64>>3];M=B+ +h[wa+56>>3];Ja=B+ +h[wa+72>>3];ka=a[va]|0;do{if((ka&1)==0){Ka=ka}else{$=c[wa+96>>2]|0;if(((e[wa+80>>1]|0)+(e[wa+84>>1]|0)|0)>=(c[$+104>>2]|0)){Ka=ka;break}ua=b[wa+86>>1]|0;do{if(ua<<16>>16==0){ta=a[$+32|0]|0;sa=(ta<<24>>24|0)/2|0;La=sa+(d[$+33|0]|0)&255;Ma=M- +(sa|0);Na=ta}else{if(((e[wa+82>>1]|0)+(ua&65535)|0)==(c[$+100>>2]|0)){ta=a[$+32|0]|0;sa=(ta<<24>>24|0)/2|0;ra=sa+(d[$+33|0]|0)|0;La=ra&255;Ma=M- +(sa|0)- +(ra&255|0);Na=ta;break}else{ta=a[$+32|0]|0;La=0;Ma=M- +((ta<<24>>24|0)/2|0|0);Na=ta;break}}}while(0);B=T+ +((Na<<24>>24|0)/2|0|0);h[fa>>3]=B;h[da>>3]=Ma;h[ca>>3]=B+0.0;h[ba>>3]=Ma+(+(Na<<24>>24|0)+(Ja+ +(La&255|0)-M));sB(f,s,1);Ka=a[va]|0}}while(0);if((Ka&2)==0){break}ka=b[wa+86>>1]|0;$=c[wa+96>>2]|0;if(((e[wa+82>>1]|0)+(ka&65535)|0)>=(c[$+100>>2]|0)){break}ua=b[wa+84>>1]|0;do{if(ua<<16>>16==0){ta=a[$+32|0]|0;ra=(ta<<24>>24|0)/2|0;sa=ra+(d[$+33|0]|0)|0;la=sa&255;oa=sa&255;Ja=+(ra|0);B=D- +(oa|0)-Ja;if((e[wa+80>>1]|0)==(c[$+104>>2]|0)){Oa=oa<<1&255;Pa=B;Qa=ta;break}if((ja|0)==0){Oa=la;Pa=B;Qa=ta;break}if((b[ja+86>>1]|0)==ka<<16>>16){Oa=la;Pa=B;Qa=ta;break}Oa=~~(+((la&255)>>>0)+(S+ +h[$+64>>3]-(T+Ja)));Pa=B;Qa=ta}else{if(((e[wa+80>>1]|0)+(ua&65535)|0)==(c[$+104>>2]|0)){ta=a[$+32|0]|0;la=(ta<<24>>24|0)/2|0;Oa=la+(d[$+33|0]|0)&255;Pa=D- +(la|0);Qa=ta;break}ta=a[$+32|0]|0;B=+((ta<<24>>24|0)/2|0|0);Ja=D-B;if((ja|0)==0){Oa=0;Pa=Ja;Qa=ta;break}if((b[ja+86>>1]|0)==ka<<16>>16){Oa=0;Pa=Ja;Qa=ta;break}Oa=~~(S+ +h[$+64>>3]-(T+B)+0.0);Pa=Ja;Qa=ta}}while(0);S=M- +((Qa<<24>>24|0)/2|0|0);h[ea>>3]=Pa;h[ia>>3]=S;h[ha>>3]=Pa+(+(Qa<<24>>24|0)+(T+ +(Oa&255|0)-D));h[ga>>3]=S+0.0;sB(f,r,1);}}while(0);wa=c[aa>>2]|0;}while((wa|0)!=0)}if((a[g+33|0]|0)==0){break}Mj(f,y,u)}}while(0);if((N|0)!=0){Nj(f,v,1)}do{if(G){if((c[f+152>>2]&4|0)==0){break}if((Kj(f,j,y,u,v,0)|0)==0){break}Nj(f,v,0)}}while(0);if((c[H>>2]|0)==0){i=k;return}H=c[45156]|0;if((H|0)!=0){c[j+16>>2]=H}H=c[45157]|0;if((H|0)!=0){c[j+20>>2]=H}Pa=+h[22580];if(Pa<0.0){i=k;return}h[j+32>>3]=Pa;i=k;return}function tj(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0,_=0,$=0,aa=0,ba=0.0,ca=0,da=0,ea=0,fa=0;j=i;i=i+104|0;l=j|0;m=j+56|0;n=j+88|0;o=b[f+4>>1]|0;if(o<<16>>16<1){i=j;return}p=+h[f+24>>3];q=+h[f+8>>3];r=(p-q)*.5;s=+h[g>>3]+(p+q)*.5;q=+h[f+32>>3];p=+h[f+16>>3];t=+h[g+8>>3]+(q+p)*.5;u=o<<16>>16;o=c[f>>2]|0;v=a[f+6|0]|0;f=g+16|0;w=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=g+20|0;x=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=g+32|0;y=(c[k>>2]=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24,c[k+4>>2]=d[f+4|0]|d[f+5|0]<<8|d[f+6|0]<<16|d[f+7|0]<<24,+h[k>>3]);f=n;c[f>>2]=0;c[f+4>>2]=0;z=s-r;A=r+s;f=n+8|0;h[f>>3]=t+(q-p)*.5;iB(e,1);g=m+16|0;B=m|0;C=m+4|0;D=m+24|0;E=l|0;F=l+4|0;G=l+16|0;H=v<<24>>24==0;v=l+24|0;I=l+8|0;J=l+32|0;K=l+40|0;L=l+48|0;M=n|0;N=m+8|0;O=0;do{P=a[o+(O*24|0)+6|0]|0;if((P|0)==114){Q=A- +h[o+(O*24|0)+8>>3]}else if((P|0)==108){Q=z}else{Q=s- +h[o+(O*24|0)+8>>3]*.5}P=o+(O*24|0)+16|0;h[f>>3]=+h[f>>3]- +h[P>>3];R=c[o+(O*24|0)>>2]|0;S=o+(O*24|0)+4|0;if((b[S>>1]|0)>0){if(H){p=Q;T=0;U=R;while(1){V=U+4|0;W=c[V>>2]|0;if((W|0)==0){X=10}else{q=+h[W+16>>3];if(q>0.0){Y=q}else{X=10}}if((X|0)==10){X=0;Y=y}h[g>>3]=Y;W=c[V>>2]|0;if((W|0)==0){X=13}else{Z=c[W>>2]|0;if((Z|0)==0){X=13}else{_=Z}}if((X|0)==13){X=0;_=w}c[B>>2]=_;Z=c[V>>2]|0;if((Z|0)==0){X=16}else{W=c[Z+4>>2]|0;if((W|0)==0){X=16}else{$=W}}if((X|0)==16){X=0;$=x}c[C>>2]=$;W=c[V>>2]|0;do{if((W|0)==0){X=20}else{Z=c[W+24>>2]<<25>>25;if((Z|0)==0){X=20;break}aa=c[D>>2]&-128|Z&127}}while(0);if((X|0)==20){X=0;aa=c[D>>2]&-128}c[D>>2]=aa;lB(e,$);c[E>>2]=c[U>>2];c[F>>2]=m;h[G>>3]=+h[U+16>>3];h[v>>3]=1.0;c[N>>2]=c[(c[V>>2]|0)+8>>2];c[I>>2]=c[U+8>>2];W=U+32|0;h[J>>3]=+h[W>>3];h[K>>3]=+h[P>>3];a[L]=108;h[M>>3]=p;kB(e,n,l);Z=T+1|0;if((Z|0)<(b[S>>1]|0)){p=p+ +h[W>>3];T=Z;U=U+56|0}else{break}}}else{p=Q;U=0;T=R;while(1){Z=T+4|0;W=c[Z>>2]|0;if((W|0)==0){X=24}else{q=+h[W+16>>3];if(q>0.0){ba=q}else{X=24}}if((X|0)==24){X=0;ba=y}h[g>>3]=ba;W=c[Z>>2]|0;if((W|0)==0){X=27}else{ca=c[W>>2]|0;if((ca|0)==0){X=27}else{da=ca}}if((X|0)==27){X=0;da=w}c[B>>2]=da;ca=c[Z>>2]|0;if((ca|0)==0){X=30}else{W=c[ca+4>>2]|0;if((W|0)==0){X=30}else{ea=W}}if((X|0)==30){X=0;ea=x}c[C>>2]=ea;W=c[Z>>2]|0;do{if((W|0)==0){X=34}else{ca=c[W+24>>2]<<25>>25;if((ca|0)==0){X=34;break}fa=c[D>>2]&-128|ca&127}}while(0);if((X|0)==34){X=0;fa=c[D>>2]&-128}c[D>>2]=fa;lB(e,ea);c[E>>2]=c[T>>2];c[F>>2]=m;h[G>>3]=+h[T+16>>3];h[v>>3]=+h[T+24>>3];c[N>>2]=c[(c[Z>>2]|0)+8>>2];c[I>>2]=c[T+8>>2];W=T+32|0;h[J>>3]=+h[W>>3];h[K>>3]=+h[P>>3];a[L]=108;h[M>>3]=p;kB(e,n,l);V=U+1|0;if((V|0)<(b[S>>1]|0)){p=p+ +h[W>>3];U=V;T=T+56|0}else{break}}}}O=O+1|0;}while((O|0)<(u|0));jB(e);i=j;return}function uj(a){a=a|0;eF(c[a>>2]|0);eF(c[a+4>>2]|0);eF(c[a+8>>2]|0);eF(c[a+16>>2]|0);eF(c[a+12>>2]|0);eF(c[a+20>>2]|0);eF(c[a+24>>2]|0);return}function vj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((a|0)==0){return}d=a|0;e=a+4|0;f=b[e>>1]|0;if(f<<16>>16>0){g=c[d>>2]|0;h=0;i=f;while(1){f=g+4|0;if((b[f>>1]|0)>0){j=c[g>>2]|0;k=0;while(1){l=c[j>>2]|0;if((l|0)!=0){eF(l)}l=c[j+8>>2]|0;do{if((l|0)!=0){m=c[j+12>>2]|0;if((m|0)==0){break}Cc[m&255](l)}}while(0);l=k+1|0;if((l|0)<(b[f>>1]|0)){j=j+56|0;k=l}else{break}}n=b[e>>1]|0}else{n=i}k=h+1|0;if((k|0)<(n<<16>>16|0)){g=g+24|0;h=k;i=n}else{break}}}n=c[d>>2]|0;if((n|0)!=0){eF(n)}eF(a);return}function wj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=a[b+4|0]|0;if((e<<24>>24|0)==1){f=c[b>>2]|0;g=f+84|0;h=c[g>>2]|0;if((c[f+100>>2]|0)==-1){Vg(h)|0}else{eF(c[f+92>>2]|0);eF(c[f+96>>2]|0);i=c[h>>2]|0;if((i|0)!=0){j=h;h=i;do{wj(h+88|0,0);eF(c[h>>2]|0);eF(c[h+4>>2]|0);eF(c[h+8>>2]|0);eF(c[h+16>>2]|0);eF(c[h+12>>2]|0);eF(c[h+20>>2]|0);eF(c[h+24>>2]|0);eF(h);j=j+4|0;h=c[j>>2]|0;}while((h|0)!=0)}eF(c[g>>2]|0)}eF(c[f>>2]|0);eF(c[f+4>>2]|0);eF(c[f+8>>2]|0);eF(c[f+16>>2]|0);eF(c[f+12>>2]|0);eF(c[f+20>>2]|0);eF(c[f+24>>2]|0);eF(f)}else if((e<<24>>24|0)==3){e=c[b>>2]|0;eF(c[e+32>>2]|0);eF(e)}else{vj(c[b>>2]|0)}if((d|0)==0){return}eF(b);return}function xj(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0;g=c[(c[(c[b+8>>2]|0)+104>>2]|0)+72>>2]|0;if((a[g+4|0]|0)==2){h=0;return h|0}b=yj(c[g>>2]|0,e)|0;if((b|0)==0){h=0;return h|0}c[f>>2]=d[b+35|0]|0;h=b+48|0;return h|0}function yj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+4>>2]|0;do{if((e|0)!=0){if((pm(e,d)|0)==0){f=b|0}else{break}return f|0}}while(0);e=c[b+84>>2]|0;b=c[e>>2]|0;if((b|0)==0){f=0;return f|0}else{g=e;h=b}while(1){b=g+4|0;e=c[h+4>>2]|0;if((e|0)==0){i=6}else{if((pm(e,d)|0)==0){j=h|0;i=8}else{i=6}}do{if((i|0)==6){i=0;if((a[h+92|0]|0)!=1){break}j=yj(c[h+88>>2]|0,d)|0;i=8}}while(0);if((i|0)==8){i=0;if((j|0)!=0){f=j;i=10;break}}e=c[b>>2]|0;if((e|0)==0){f=0;i=10;break}else{g=b;h=e}}if((i|0)==10){return f|0}return 0}function zj(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function Aj(d){d=d|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0;f=d+92|0;c[f>>2]=jk((c[d+100>>2]<<2)+4|0)|0;g=d+96|0;c[g>>2]=jk((c[d+104>>2]<<2)+4|0)|0;i=c[d+84>>2]|0;j=c[i>>2]|0;if((j|0)==0){return}k=d+32|0;d=i;i=j;do{j=i+82|0;l=b[j>>1]|0;m=l&65535;n=+h[i+72>>3];if(l<<16>>16==1){o=~~n}else{p=~~((n- +(da((a[k]|0)-1|0,m-1|0)|0))/+(m|0));o=(p|0)>1?p:1}p=i+80|0;m=b[p>>1]|0;q=m&65535;n=+h[i+64>>3];if(m<<16>>16==1){r=~~n}else{s=~~((n- +(da((a[k]|0)-1|0,q-1|0)|0))/+(q|0));r=(s|0)>1?s:1}s=i+86|0;if(l<<16>>16==0){t=m}else{m=e[s>>1]|0;do{l=(c[f>>2]|0)+(m<<2)|0;q=c[l>>2]|0;c[l>>2]=(q|0)>(o|0)?q:o;m=m+1|0;}while((m|0)<((e[j>>1]|0)+(e[s>>1]|0)|0));t=b[p>>1]|0}s=i+84|0;if(t<<16>>16!=0){j=e[s>>1]|0;do{m=(c[g>>2]|0)+(j<<2)|0;q=c[m>>2]|0;c[m>>2]=(q|0)>(r|0)?q:r;j=j+1|0;}while((j|0)<((e[p>>1]|0)+(e[s>>1]|0)|0))}d=d+4|0;i=c[d>>2]|0;}while((i|0)!=0);return}function Bj(a,d,f){a=a|0;d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=i;j=a+104|0;k=a+100|0;if((c[j>>2]|0)>=0){l=f+8|0;m=0;n=0;while(1){if(n>>>0<21>>>0){o=c[17880+(n<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=n,p)|0)|0;i=p;o=177168}q=Ax(f,o,1)|0;Wx(q|0,108248,304,1)|0;r=q+8|0;c[(c[r>>2]|0)+176>>2]=0;s=jk((c[k>>2]<<2)+4|0)|0;c[(c[r>>2]|0)+172>>2]=s;c[(c[r>>2]|0)+184>>2]=0;s=jk((c[k>>2]<<2)+4|0)|0;c[(c[r>>2]|0)+180>>2]=s;if((m|0)==0){c[(c[l>>2]|0)+180>>2]=q}else{c[(c[m+8>>2]|0)+164>>2]=q}if((n|0)<(c[j>>2]|0)){m=q;n=n+1|0}else{break}}}if((c[k>>2]|0)>=0){n=d+8|0;m=0;l=0;while(1){if(l>>>0<21>>>0){t=c[17880+(l<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=l,p)|0)|0;i=p;t=177168}o=Ax(d,t,1)|0;Wx(o|0,108248,304,1)|0;q=o+8|0;c[(c[q>>2]|0)+176>>2]=0;s=jk((c[j>>2]<<2)+4|0)|0;c[(c[q>>2]|0)+172>>2]=s;c[(c[q>>2]|0)+184>>2]=0;s=jk((c[j>>2]<<2)+4|0)|0;c[(c[q>>2]|0)+180>>2]=s;if((m|0)==0){c[(c[n>>2]|0)+180>>2]=o}else{c[(c[m+8>>2]|0)+164>>2]=o}if((l|0)<(c[k>>2]|0)){m=o;l=l+1|0}else{break}}}l=c[a+84>>2]|0;a=c[l>>2]|0;if((a|0)==0){Dj(f);Dj(d);i=g;return}else{u=l;v=a}do{a=v+84|0;l=b[a>>1]|0;m=l&65535;if((l&65535)>>>0<21>>>0){w=c[17880+(m<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=m,p)|0)|0;i=p;w=177168}m=Ax(f,w,0)|0;l=(e[v+80>>1]|0)+(e[a>>1]|0)|0;if(l>>>0<21>>>0){x=c[17880+(l<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=l,p)|0)|0;i=p;x=177168}l=Ax(f,x,0)|0;Cj(f,m,l,~~+h[v+64>>3]);l=v+86|0;m=b[l>>1]|0;a=m&65535;if((m&65535)>>>0<21>>>0){y=c[17880+(a<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=a,p)|0)|0;i=p;y=177168}a=Ax(d,y,0)|0;m=(e[v+82>>1]|0)+(e[l>>1]|0)|0;if(m>>>0<21>>>0){z=c[17880+(m<<2)>>2]|0}else{nb(177168,115352,(p=i,i=i+8|0,c[p>>2]=m,p)|0)|0;i=p;z=177168}m=Ax(d,z,0)|0;Cj(d,a,m,~~+h[v+72>>3]);u=u+4|0;v=c[u>>2]|0;}while((v|0)!=0);Dj(f);Dj(d);i=g;return}function Cj(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;g=uw(a,d,e,0,0)|0;if((g|0)!=0){h=(c[g+8>>2]|0)+170|0;g=b[h>>1]|0;b[h>>1]=(g&65535|0)>(f|0)?g:f&65535;return}g=uw(a,d,e,0,1)|0;Wx(g|0,131624,176,1)|0;b[(c[g+8>>2]|0)+170>>1]=f;f=d+8|0;d=(c[f>>2]|0)+180|0;a=c[d>>2]|0;if((a|0)==0){i=kk((c[d+4>>2]<<2)+8|0)|0}else{i=mk(a,(c[d+4>>2]<<2)+8|0)|0}c[(c[f>>2]|0)+180>>2]=i;i=(c[f>>2]|0)+184|0;d=c[i>>2]|0;c[i>>2]=d+1;c[(c[(c[f>>2]|0)+180>>2]|0)+(d<<2)>>2]=g;d=(c[f>>2]|0)+180|0;c[(c[d>>2]|0)+(c[d+4>>2]<<2)>>2]=0;d=e+8|0;e=(c[d>>2]|0)+172|0;f=c[e>>2]|0;if((f|0)==0){j=kk((c[e+4>>2]<<2)+8|0)|0}else{j=mk(f,(c[e+4>>2]<<2)+8|0)|0}c[(c[d>>2]|0)+172>>2]=j;j=(c[d>>2]|0)+176|0;e=c[j>>2]|0;c[j>>2]=e+1;c[(c[(c[d>>2]|0)+172>>2]|0)+(e<<2)>>2]=g;g=(c[d>>2]|0)+172|0;c[(c[g>>2]|0)+(c[g+4>>2]<<2)>>2]=0;return}function Dj(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=c[(c[a+8>>2]|0)+180>>2]|0;e=c[(c[d+8>>2]|0)+164>>2]|0;if((e|0)==0){return}f=d;d=e;while(1){e=d;if((uw(a,f,e,0,0)|0)==0){g=uw(a,f,e,0,1)|0;Wx(g|0,131624,176,1)|0;b[(c[g+8>>2]|0)+170>>1]=0;h=f+8|0;i=(c[h>>2]|0)+180|0;j=c[i>>2]|0;if((j|0)==0){k=kk((c[i+4>>2]<<2)+8|0)|0}else{k=mk(j,(c[i+4>>2]<<2)+8|0)|0}c[(c[h>>2]|0)+180>>2]=k;i=(c[h>>2]|0)+184|0;j=c[i>>2]|0;c[i>>2]=j+1;c[(c[(c[h>>2]|0)+180>>2]|0)+(j<<2)>>2]=g;j=(c[h>>2]|0)+180|0;c[(c[j>>2]|0)+(c[j+4>>2]<<2)>>2]=0;j=d+8|0;h=(c[j>>2]|0)+172|0;i=c[h>>2]|0;if((i|0)==0){l=kk((c[h+4>>2]<<2)+8|0)|0}else{l=mk(i,(c[h+4>>2]<<2)+8|0)|0}c[(c[j>>2]|0)+172>>2]=l;h=(c[j>>2]|0)+176|0;i=c[h>>2]|0;c[h>>2]=i+1;c[(c[(c[j>>2]|0)+172>>2]|0)+(i<<2)>>2]=g;g=(c[j>>2]|0)+172|0;c[(c[g>>2]|0)+(c[g+4>>2]<<2)>>2]=0;m=j}else{m=d+8|0}j=c[(c[m>>2]|0)+164>>2]|0;if((j|0)==0){break}else{f=e;d=j}}return}function Ej(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;i=i+8|0;d=b|0;e=d;c[d>>2]=c[43484];d=c[a+100>>2]|0;do{if((d|0)!=1){f=a+104|0;if((c[f>>2]|0)==1){break}g=a+92|0;c[g>>2]=jk((d<<2)+4|0)|0;h=a+96|0;c[h>>2]=jk((c[f>>2]<<2)+4|0)|0;f=Hw(102640,e,0)|0;j=Hw(97e3,e,0)|0;Wx(f|0,91520,272,1)|0;Wx(j|0,91520,272,1)|0;Bj(a,f,j);ok(f,2,2147483647)|0;ok(j,2,2147483647)|0;k=c[(c[(c[(c[f+8>>2]|0)+180>>2]|0)+8>>2]|0)+164>>2]|0;if((k|0)!=0){l=0;m=0;n=k;while(1){k=n+8|0;c[(c[g>>2]|0)+(l<<2)>>2]=(c[(c[k>>2]|0)+232>>2]|0)-m;o=c[k>>2]|0;k=c[o+164>>2]|0;if((k|0)==0){break}else{l=l+1|0;m=c[o+232>>2]|0;n=k}}}n=j+8|0;m=c[(c[n>>2]|0)+180>>2]|0;l=c[(c[m+8>>2]|0)+164>>2]|0;if((l|0)==0){p=m}else{m=0;g=0;k=l;while(1){l=k+8|0;c[(c[h>>2]|0)+(m<<2)>>2]=(c[(c[l>>2]|0)+232>>2]|0)-g;o=c[l>>2]|0;l=c[o+164>>2]|0;if((l|0)==0){break}else{m=m+1|0;g=c[o+232>>2]|0;k=l}}p=c[(c[n>>2]|0)+180>>2]|0}if((p|0)!=0){k=p;do{g=k+8|0;m=c[g>>2]|0;h=c[m+172>>2]|0;if((h|0)==0){q=m}else{eF(h);q=c[g>>2]|0}h=c[q+180>>2]|0;if((h|0)==0){r=q}else{eF(h);r=c[g>>2]|0}k=c[r+164>>2]|0;}while((k|0)!=0)}Kw(f)|0;Kw(j)|0;i=b;return}}while(0);Aj(a);i=b;return}function Fj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0;e=i;i=i+256|0;f=e|0;g=e+8|0;j=e+40|0;k=e+112|0;l=e+128|0;c[j+48>>2]=b;m=Sx(b)|0;if((m|0)==0){n=c[b+48>>2]|0;c[j+52>>2]=n;o=n}else if((m|0)==2){n=Hx(c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;c[j+52>>2]=n;o=n}else if((m|0)==1){m=Hx(b)|0;c[j+52>>2]=m;o=m}else{o=c[j+52>>2]|0}m=j+52|0;n=c[o+48>>2]|0;h[j+32>>3]=+h[d+16>>3];c[j+16>>2]=c[d+4>>2];c[j+20>>2]=c[d+8>>2];o=j+40|0;c[o>>2]=c[o>>2]&-128;o=d|0;p=lj(c[o>>2]|0,f,j)|0;if((p|0)==0){Iv(k,128,l|0);a[d+82|0]=0;l=Sx(b)|0;do{if((l|0)==0){Lv(k,$w(b)|0)|0}else if((l|0)==1){Lv(k,$w(b)|0)|0}else if((l|0)==2){q=b;r=b;Lv(k,$w(c[((c[r>>2]&3|0)==3?q:b+32|0)+28>>2]|0)|0)|0;s=b-32|0;Lv(k,$w(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)|0)|0;if((Nw(Hx(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)|0)|0)==0){Lv(k,133720)|0;break}else{Lv(k,136608)|0;break}}}while(0);l=k+4|0;s=c[l>>2]|0;if(s>>>0<(c[k+8>>2]|0)>>>0){t=s}else{Jv(k,1)|0;t=c[l>>2]|0}a[t]=0;t=c[k>>2]|0;c[l>>2]=t;l=Lb(t|0)|0;c[o>>2]=l;if((c[d+12>>2]|0)==1){u=kn(l)|0}else{u=hn(l,c[m>>2]|0)|0}eF(c[o>>2]|0);c[o>>2]=u;_j(c[(c[n+8>>2]|0)+136>>2]|0,d);Mv(k);v=c[f>>2]|0;i=e;return v|0}k=p+4|0;if((a[k]|0)==1){u=p|0;do{if((c[(c[u>>2]|0)+24>>2]|0)==0){m=ew(b,142240)|0;if((m|0)==0){w=23}else{if((a[m]|0)==0){w=23}}if((w|0)==23){m=ew(b,139152)|0;if((m|0)==0){break}if((a[m]|0)==0){break}}m=ew(b,142240)|0;if((m|0)==0){w=27}else{if((a[m]|0)==0){w=27}else{x=m}}do{if((w|0)==27){m=ew(b,139152)|0;if((m|0)!=0){if((a[m]|0)!=0){x=m;break}}x=0}}while(0);m=Lb(x|0)|0;c[(c[u>>2]|0)+24>>2]=m}}while(0);x=Gj(n,c[u>>2]|0,0,j)|0;c[f>>2]=c[f>>2]|x;x=c[u>>2]|0;y=(+h[x+64>>3]+1.0)*.5;z=(+h[x+72>>3]+1.0)*.5;u=g|0;h[u>>3]=-0.0-y;b=g+8|0;h[b>>3]=-0.0-z;w=g+16|0;h[w>>3]=y;m=g+24|0;h[m>>3]=z;Hj(x,g,15);h[d+24>>3]=+h[w>>3]- +h[u>>3];h[d+32>>3]=+h[m>>3]- +h[b>>3]}else{b=p;Ij(c[(c[n+8>>2]|0)+136>>2]|0,c[b>>2]|0,j);j=c[b>>2]|0;z=+h[j+24>>3]*.5;y=+h[j+32>>3]*.5;b=g;h[g>>3]=-0.0-z;h[g+8>>3]=-0.0-y;h[g+16>>3]=z;h[g+24>>3]=y;g=j+8|0;c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];c[g+16>>2]=c[b+16>>2];c[g+20>>2]=c[b+20>>2];c[g+24>>2]=c[b+24>>2];c[g+28>>2]=c[b+28>>2];h[d+24>>3]=z+z;h[d+32>>3]=y+y}c[d+72>>2]=p;if((a[k]|0)!=1){v=c[f>>2]|0;i=e;return v|0}eF(c[o>>2]|0);c[o>>2]=Lb(86272)|0;v=c[f>>2]|0;i=e;return v|0}function Gj(f,g,j,k){f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;l=i;m=g+108|0;n=c[m>>2]|0;do{if((n|0)!=0){o=k+16|0;p=c[o>>2]|0;do{if((p|0)!=0){q=n|0;if((c[q>>2]|0)==0){c[43752]=0;break}else{c[43752]=p;c[o>>2]=c[q>>2];break}}}while(0);o=k+20|0;p=c[o>>2]|0;do{if((p|0)!=0){q=n+4|0;if((c[q>>2]|0)==0){c[43753]=0;break}else{c[43753]=p;c[o>>2]=c[q>>2];break}}}while(0);o=k+32|0;r=+h[o>>3];if(r<0.0){break}p=n+16|0;if(+h[p>>3]<0.0){h[21878]=-1.0;break}else{h[21878]=r;h[o>>3]=+h[p>>3];break}}}while(0);c[g+80>>2]=j;j=g+84|0;n=c[j>>2]|0;p=Dk()|0;o=Uj()|0;q=Zg(n)|0;if((q|0)==0){s=0}else{t=1;u=0;v=q;while(1){q=Zg(c[v+8>>2]|0)|0;if((q|0)==0){w=u}else{x=u;y=q;while(1){q=x+1|0;z=c[y>>2]|0;if((z|0)==0){w=q;break}else{x=q;y=z}}}if((a[v+12|0]|0)!=0){Vj(o,t)}y=c[v>>2]|0;if((y|0)==0){s=w;break}else{t=t+1|0;u=w;v=y}}}v=jk((s<<2)+4|0)|0;c[j>>2]=v;j=Zg(n)|0;if((j|0)==0){A=0;B=0;C=0}else{s=0;w=v;v=0;u=0;t=0;y=j;while(1){j=Zg(c[y+8>>2]|0)|0;if((j|0)==0){D=w;E=v;F=u;G=t}else{x=s&65535;z=0;q=w;H=v;I=u;J=t;K=j;while(1){j=c[K+8>>2]|0;L=q+4|0;c[q>>2]=j;M=Jj(f,j,g,k)|0|H;N=j+80|0;O=b[N>>1]|0;P=(O&65535)-1|0;do{if(O<<16>>16==0){Q=z;R=25}else{S=z;a:while(1){T=P+S|0;while(1){if((Ik(p,T,s)|0)!=0){break}if((T|0)>(S|0)){T=T-1|0}else{break a}}S=T+1|0}U=b[N>>1]|0;if(U<<16>>16==0){Q=S;R=25;break}V=j+82|0;W=b[V>>1]|0;X=S;Y=W;Z=U;U=W;while(1){if(Y<<16>>16==0){_=0;$=Z;aa=U}else{W=s;do{Gk(p,X,W);W=W+1|0;ba=b[V>>1]|0;}while((W|0)<((ba&65535)+s|0));_=ba;$=b[N>>1]|0;aa=ba}W=X+1|0;if((W|0)<(($&65535)+S|0)){X=W;Y=_;Z=$;U=aa}else{ca=$;ea=aa;fa=S;break}}}}while(0);if((R|0)==25){R=0;ca=0;ea=b[j+82>>1]|0;fa=Q}b[j+86>>1]=x;b[j+84>>1]=fa;N=(ca&65535)+fa|0;P=(N|0)>(J|0)?N:J;O=(ea&65535)+s|0;S=(O|0)>(I|0)?O:I;if((Wj(o,O)|0)!=0){O=j+100|0;a[O]=a[O]|2}O=c[K>>2]|0;if((O|0)==0){D=L;E=M;F=S;G=P;break}else{z=N;q=L;H=M;I=S;J=P;K=O}}}K=c[y>>2]|0;if((K|0)==0){A=E;B=F;C=G;break}else{s=s+1|0;w=D;v=E;u=F;t=G;y=K}}}y=g+100|0;c[y>>2]=B;B=g+104|0;c[B>>2]=C;Vg(n)|0;Vg(o)|0;Ek(p);p=g+36|0;o=b[p>>1]|0;if((o&128)==0){a[g+32|0]=2}n=g+33|0;if((o&32)==0){a[n]=1}Ej(g);o=c[B>>2]|0;B=a[g+32|0]|0;C=da(B,o+1|0)|0;G=d[n]<<1;n=G+C|0;C=c[y>>2]|0;y=(da(C+1|0,B)|0)+G|0;if((o|0)>0){G=c[g+96>>2]|0;B=0;t=n;while(1){F=(c[G+(B<<2)>>2]|0)+t|0;u=B+1|0;if((u|0)<(o|0)){B=u;t=F}else{ga=F;break}}}else{ga=n}if((C|0)>0){n=c[g+92>>2]|0;t=0;B=y;while(1){o=(c[n+(t<<2)>>2]|0)+B|0;G=t+1|0;if((G|0)<(C|0)){t=G;B=o}else{ha=o;break}}}else{ha=y}y=g+38|0;b:do{if((b[p>>1]&1)==0){ia=A;ja=ha;ka=ga}else{B=b[y>>1]|0;t=B&65535;do{if(B<<16>>16!=0){C=b[g+40>>1]|0;if(C<<16>>16==0){break}if(!((t|0)<(ga|0)|(C&65535|0)<(ha|0))){ia=A;ja=0;ka=0;break b}Fv(0,159600,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;ia=1;ja=0;ka=0;break b}}while(0);Fv(0,154576,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;ia=1;ja=ha;ka=ga}}while(0);ga=e[y>>1]|0;h[g+64>>3]=+(((ka|0)>(ga|0)?ka:ga)|0);ga=e[g+40>>1]|0;h[g+72>>3]=+(((ja|0)>(ga|0)?ja:ga)|0);if((c[m>>2]|0)==0){i=l;return ia|0}m=c[43752]|0;if((m|0)!=0){c[k+16>>2]=m}m=c[43753]|0;if((m|0)!=0){c[k+20>>2]=m}r=+h[21878];if(r<0.0){i=l;return ia|0}h[k+32>>3]=r;i=l;return ia|0}function Hj(f,g,j){f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0;k=i;i=i+32|0;l=g;g=i;i=i+32|0;tF(g,l,32)|0;l=k|0;m=c[f+84>>2]|0;n=c[f+80>>2]|0;do{if((n|0)!=0){o=c[n+24>>2]|0;if((o|0)==0){break}p=f+24|0;if((c[p>>2]|0)!=0){break}c[p>>2]=Lb(o|0)|0}}while(0);n=f+48|0;o=g+16|0;q=+h[o>>3];p=g|0;r=+h[p>>3];s=~~(q-r- +(~~+h[f+64>>3]|0));if((s|0)<=-1){cc(81552,167808,1708,170064)}t=g+24|0;u=+h[t>>3];v=g+8|0;w=+h[v>>3];x=+(~~+h[f+72>>3]|0);y=~~(u-w-x);if((y|0)<=-1){cc(163632,167808,1711,170064)}z=e[f+36>>1]|0;do{if((z&1|0)==0){A=y;B=s;C=r;D=u}else{do{if((s|0)>0){E=z&6;if((E|0)==4){h[o>>3]=r+x;F=0;G=r;break}else if((E|0)==2){H=+(s|0);h[o>>3]=q+H;I=H+r;h[p>>3]=I;F=0;G=I;break}else{I=+((s|0)/2|0|0);H=r+I;h[p>>3]=H;h[o>>3]=q-I;F=0;G=H;break}}else{F=s;G=r}}while(0);if((y|0)<=0){A=y;B=F;C=G;D=u;break}E=z&24;if((E|0)==8){H=+(y|0);I=H+u;h[t>>3]=I;h[v>>3]=H+w;A=0;B=F;C=G;D=I;break}else if((E|0)==16){I=x+w;h[t>>3]=I;A=0;B=F;C=G;D=I;break}else{I=+((y|0)/2|0|0);h[v>>3]=w+I;H=u-I;h[t>>3]=H;A=0;B=F;C=G;D=H;break}}}while(0);F=f+33|0;t=a[F]|0;v=f+32|0;y=a[v]|0;z=f+104|0;s=c[z>>2]|0;o=(B|0)/(s|0)|0;p=B-(da(o,s)|0)|0;G=+(p|0);if((p|0)>-1){J=G+.5}else{J=G+-.5}p=~~J;if((s|0)<0){K=t;L=y}else{s=f+96|0;B=0;E=~~(+(y<<24>>24|0)+(C+ +(t&255|0)));while(1){t=(c[s>>2]|0)+(B<<2)|0;y=c[t>>2]|0;c[t>>2]=E;M=a[v]|0;t=E+o+((B|0)<(p|0))+y+(M<<24>>24)|0;if((B|0)<(c[z>>2]|0)){B=B+1|0;E=t}else{break}}K=a[F]|0;L=M}M=f+100|0;F=c[M>>2]|0;E=(A|0)/(F|0)|0;B=A-(da(E,F)|0)|0;C=+(B|0);if((B|0)>-1){N=C+.5}else{N=C+-.5}B=~~N;if((F|0)>=0){F=f+92|0;A=~~(D- +(K&255|0)- +(L<<24>>24|0));L=0;while(1){K=(c[F>>2]|0)+(L<<2)|0;p=c[K>>2]|0;c[K>>2]=A;if((L|0)<(c[M>>2]|0)){A=A-E+(((L|0)<(B|0))<<31>>31)-p-(a[v]|0)|0;L=L+1|0}else{break}}}L=c[m>>2]|0;if((L|0)==0){O=j&255;P=f+35|0;a[P]=O;Q=n;R=g;c[Q>>2]=c[R>>2];c[Q+4>>2]=c[R+4>>2];c[Q+8>>2]=c[R+8>>2];c[Q+12>>2]=c[R+12>>2];c[Q+16>>2]=c[R+16>>2];c[Q+20>>2]=c[R+20>>2];c[Q+24>>2]=c[R+24>>2];c[Q+28>>2]=c[R+28>>2];i=k;return}B=(j|0)==0;E=f+96|0;A=f+92|0;F=l;p=l|0;K=l+8|0;o=l+16|0;s=l+24|0;t=m;m=L;do{t=t+4|0;L=b[m+84>>1]|0;if(B){S=0;T=b[m+80>>1]|0;U=b[m+86>>1]|0;V=b[m+82>>1]|0}else{y=L<<16>>16==0?8:0;W=b[m+86>>1]|0;X=W<<16>>16==0?y|4:y;y=b[m+80>>1]|0;Y=b[m+82>>1]|0;S=((Y&65535)+(W&65535)|0)==(c[M>>2]|0)|(((y&65535)+(L&65535)|0)==(c[z>>2]|0)?X|2:X);T=y;U=W;V=Y}Y=L&65535;L=c[E>>2]|0;D=+(c[L+(Y<<2)>>2]|0);W=a[v]|0;N=+((c[L+((T&65535)+Y<<2)>>2]|0)-W|0);Y=U&65535;L=c[A>>2]|0;C=+(c[L+(Y<<2)>>2]|0);J=+((c[L+((V&65535)+Y<<2)>>2]|0)+W|0);W=S&j;Y=m+24|0;do{if((c[Y>>2]|0)==0){L=c[(c[m+96>>2]|0)+24>>2]|0;if((L|0)==0){break}c[Y>>2]=Lb(L|0)|0}}while(0);Y=m+36|0;L=e[Y>>1]|0;y=m+64|0;do{if((L&1|0)==0){Z=D;_=J;$=N;aa=C;ba=m+72|0}else{G=+h[y>>3];X=m+72|0;u=+h[X>>3];w=N-D-G;do{if(w>0.0){ca=L&6;if((ca|0)==2){ea=D+w;fa=N+w;break}else if((ca|0)==4){ea=D;fa=D+G;break}else{x=w*.5;ea=D+x;fa=N-x;break}}else{ea=D;fa=N}}while(0);w=C-J-u;if(w<=0.0){Z=ea;_=J;$=fa;aa=C;ba=X;break}ca=L&24;if((ca|0)==16){Z=ea;_=J;$=fa;aa=J+u;ba=X;break}else if((ca|0)==8){Z=ea;_=J+w;$=fa;aa=C+w;ba=X;break}else{G=w*.5;Z=ea;_=J+G;$=fa;aa=C-G;ba=X;break}}}while(0);h[m+48>>3]=Z;h[m+56>>3]=_;h[y>>3]=$;h[ba>>3]=aa;a[m+35|0]=W;C=+(d[m+33|0]|0);J=+(d[m+34|0]|0);N=Z+C+J;h[p>>3]=N;D=_+C+J;h[K>>3]=D;G=$-C-J;h[o>>3]=G;w=aa-C-J;h[s>>3]=w;ca=m+88|0;ga=a[m+92|0]|0;do{if((ga<<24>>24|0)==1){Hj(c[ca>>2]|0,l,W)}else if((ga<<24>>24|0)==3){ha=c[ca>>2]|0;J=+h[ha+24>>3];C=G-N- +h[ha+16>>3];do{if(C>0.0){ia=L&6;if((ia|0)==2){h[p>>3]=N+C;break}else if((ia|0)==4){h[o>>3]=G-C;break}else{break}}}while(0);C=w-D-J;do{if(C>0.0){X=L&24;if((X|0)==16){h[s>>3]=w-C;break}else if((X|0)==8){h[K>>3]=D+C;break}else{break}}}while(0);X=ha;c[X>>2]=c[F>>2];c[X+4>>2]=c[F+4>>2];c[X+8>>2]=c[F+8>>2];c[X+12>>2]=c[F+12>>2];c[X+16>>2]=c[F+16>>2];c[X+20>>2]=c[F+20>>2];c[X+24>>2]=c[F+24>>2];c[X+28>>2]=c[F+28>>2]}else{X=ca;ia=c[X>>2]|0;C=+h[ia+32>>3];J=G-N- +h[ia+24>>3];do{if(J>0.0){ja=L&6;if((ja|0)==2){h[p>>3]=N+J;break}else if((ja|0)==4){h[o>>3]=G-J;break}else if((ja|0)==6){break}else{u=J*.5;h[p>>3]=N+u;h[o>>3]=G-u;break}}}while(0);J=w-D-C;do{if(J>0.0){ha=L&24;if((ha|0)==8){h[K>>3]=D+J;break}else if((ha|0)==16){h[s>>3]=w-J;break}else{u=J*.5;h[K>>3]=D+u;h[s>>3]=w-u;break}}}while(0);ha=ia+8|0;c[ha>>2]=c[F>>2];c[ha+4>>2]=c[F+4>>2];c[ha+8>>2]=c[F+8>>2];c[ha+12>>2]=c[F+12>>2];c[ha+16>>2]=c[F+16>>2];c[ha+20>>2]=c[F+20>>2];c[ha+24>>2]=c[F+24>>2];c[ha+28>>2]=c[F+28>>2];ha=b[Y>>1]&768;if((ha|0)==256){ka=114}else if((ha|0)==512){ka=108}else{ka=110}ha=c[X>>2]|0;ja=ha+4|0;la=b[ja>>1]|0;if(la<<16>>16<=0){break}ma=ha|0;ha=0;na=la;while(1){la=(c[ma>>2]|0)+(ha*24|0)+6|0;if((a[la]|0)==0){a[la]=ka;oa=b[ja>>1]|0}else{oa=na}la=ha+1|0;if((la|0)<(oa<<16>>16|0)){ha=la;na=oa}else{break}}}}while(0);m=c[t>>2]|0;}while((m|0)!=0);O=j&255;P=f+35|0;a[P]=O;Q=n;R=g;c[Q>>2]=c[R>>2];c[Q+4>>2]=c[R+4>>2];c[Q+8>>2]=c[R+8>>2];c[Q+12>>2]=c[R+12>>2];c[Q+16>>2]=c[R+16>>2];c[Q+20>>2]=c[R+20>>2];c[Q+24>>2]=c[R+24>>2];c[Q+28>>2]=c[R+28>>2];i=k;return}function Ij(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0.0,ca=0.0,da=0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0,na=0.0;g=i;i=i+104|0;j=g|0;k=g+56|0;l=g+88|0;m=k;c[m>>2]=c[2950];c[m+4>>2]=c[2951];c[m+8>>2]=c[2952];c[m+12>>2]=c[2953];c[m+16>>2]=c[2954];c[m+20>>2]=c[2955];c[m+24>>2]=c[2956];c[m+28>>2]=c[2957];n=e|0;o=e+4|0;p=b[o>>1]|0;q=p<<16>>16>0;if(!q){a[e+6|0]=1;r=0.0;s=0.0;t=0.0;u=p;v=e+24|0;h[v>>3]=s;w=u<<16>>16==1;x=e+32|0;y=w?t:r;h[x>>3]=y;i=g;return}z=f+32|0;A=k+16|0;B=f+16|0;C=k|0;D=c[n>>2]|0;E=0;F=-1.0;G=0;a:while(1){if((b[D+(E*24|0)+4>>1]|0)>1){H=0;break}I=D+(E*24|0)|0;J=c[(c[I>>2]|0)+4>>2]|0;do{if((J|0)==0){K=+h[z>>3];h[A>>3]=K;L=c[B>>2]|0;c[C>>2]=L;M=K;N=L}else{if((c[J+24>>2]&127|0)!=0){H=0;break a}K=+h[J+16>>3];if(K>0.0){O=K}else{O=+h[z>>3]}h[A>>3]=O;L=c[c[(c[I>>2]|0)+4>>2]>>2]|0;if((L|0)==0){P=c[B>>2]|0;c[C>>2]=P;M=O;N=P;break}else{c[C>>2]=L;M=O;N=L;break}}}while(0);if(F==-1.0){Q=M}else{if(M!=F){H=0;break}else{Q=F}}if((G|0)==0){R=N}else{if((Ya(N|0,G|0)|0)==0){R=G}else{H=0;break}}I=E+1|0;if((I|0)<(p<<16>>16|0)){E=I;F=Q;G=R}else{H=1;break}}a[e+6|0]=H;if(!q){r=0.0;s=0.0;t=0.0;u=p;v=e+24|0;h[v>>3]=s;w=u<<16>>16==1;x=e+32|0;y=w?t:r;h[x>>3]=y;i=g;return}p=(H|0)==0;H=f+48|0;q=j|0;R=f+32|0;G=k+16|0;E=f+16|0;N=k|0;C=f+20|0;B=k+4|0;A=f+40|0;f=k+24|0;k=d+144|0;z=j+4|0;D=l|0;I=l+8|0;J=j+16|0;L=j+24|0;P=j+8|0;S=j+12|0;Q=0.0;F=0.0;M=0.0;T=0;U=c[n>>2]|0;while(1){if((b[U+(T*24|0)+4>>1]|0)>0){O=0.0;V=0;K=0.0;W=0.0;X=0.0;Y=U;while(1){c[q>>2]=fk(c[(c[Y+(T*24|0)>>2]|0)+(V*56|0)>>2]|0,c[H>>2]|0)|0;Z=(c[n>>2]|0)+(T*24|0)|0;_=c[(c[Z>>2]|0)+(V*56|0)+4>>2]|0;do{if((_|0)==0){h[G>>3]=+h[R>>3];c[N>>2]=c[E>>2];c[B>>2]=c[C>>2];c[f>>2]=c[f>>2]&-128|c[A>>2]&127}else{$=c[_+24>>2]<<25>>25;do{if(($|0)==0){aa=c[A>>2]|0;if((aa<<25>>25|0)>0<<25>>25&127){c[f>>2]=c[f>>2]&-128|aa&127;break}else{c[f>>2]=c[f>>2]&-128;break}}else{c[f>>2]=c[f>>2]&-128|$&127}}while(0);ba=+h[(c[(c[Z>>2]|0)+(V*56|0)+4>>2]|0)+16>>3];if(ba>0.0){ca=ba}else{ca=+h[R>>3]}h[G>>3]=ca;$=c[c[(c[Z>>2]|0)+(V*56|0)+4>>2]>>2]|0;if(($|0)==0){da=c[E>>2]|0}else{da=$}c[N>>2]=da;$=c[(c[(c[Z>>2]|0)+(V*56|0)+4>>2]|0)+4>>2]|0;if(($|0)==0){c[B>>2]=c[C>>2];break}else{c[B>>2]=$;break}}}while(0);Z=c[k>>2]|0;c[z>>2]=Hc[c[Z>>2]&63](Z,m,1)|0;sm(l,d,j);ba=+h[D>>3];ea=+h[I>>3];eF(c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)>>2]|0);c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)>>2]=c[q>>2];h[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+32>>3]=ba;h[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+16>>3]=+h[J>>3];h[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+24>>3]=+h[L>>3];c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+4>>2]=c[z>>2];c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+8>>2]=c[P>>2];c[(c[(c[n>>2]|0)+(T*24|0)>>2]|0)+(V*56|0)+12>>2]=c[S>>2];fa=K+ba;ba=+h[G>>3];ga=ba>O?ba:O;ba=ea>X?ea:X;ea=+h[L>>3];ha=ea>W?ea:W;Z=V+1|0;_=c[n>>2]|0;if((Z|0)<(b[_+(T*24|0)+4>>1]|0)){O=ga;V=Z;K=fa;W=ha;X=ba;Y=_}else{ia=ga;ja=fa;ka=ha;la=ba;ma=_;break}}}else{ia=0.0;ja=0.0;ka=0.0;la=0.0;ma=U}h[ma+(T*24|0)+8>>3]=ja;Y=(T|0)==0;do{if(p){if(Y){h[(c[n>>2]|0)+16>>3]=ia-ka;na=ia;break}else{h[(c[n>>2]|0)+(T*24|0)+16>>3]=F+ia-Q-ka;na=ia;break}}else{V=(c[n>>2]|0)+(T*24|0)+16|0;if(Y){h[V>>3]=ia;na=la;break}else{h[V>>3]=la;na=la;break}}}while(0);Y=c[n>>2]|0;X=ja>M?ja:M;W=F+na;V=T+1|0;_=b[o>>1]|0;if((V|0)<(_<<16>>16|0)){Q=Q+ +h[Y+(T*24|0)+16>>3];F=W;M=X;T=V;U=Y}else{r=W;s=X;t=la;u=_;break}}v=e+24|0;h[v>>3]=s;w=u<<16>>16==1;x=e+32|0;y=w?t:r;h[x>>3]=y;i=g;return}function Jj(f,g,j,k){f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0.0;l=i;i=i+8|0;m=l|0;c[g+96>>2]=j;n=g+36|0;o=b[n>>1]|0;do{if((o&64)==0){if((b[j+36>>1]&64)==0){a[g+34|0]=2;break}else{a[g+34|0]=a[j+34|0]|0;break}}}while(0);do{if((o&32)==0){p=a[j+88|0]|0;if(p<<24>>24>-1){a[g+33|0]=p;break}if((b[j+36>>1]&32)==0){a[g+33|0]=1;break}else{a[g+33|0]=a[j+33|0]|0;break}}}while(0);j=g+88|0;o=g+92|0;p=a[o]|0;if((p<<24>>24|0)==1){q=j|0;r=Gj(f,c[q>>2]|0,g,k)|0;s=c[q>>2]|0;t=r;u=s+64|0;v=s+72|0}else if((p<<24>>24|0)==3){p=j;s=c[p>>2]|0;r=k+52|0;q=s+32|0;FB(m,c[r>>2]|0,c[q>>2]|0);w=c[m>>2]|0;x=c[m+4>>2]|0;if((w|0)==-1&(x|0)==-1){Fv(1,145200,(y=i,i=i+8|0,c[y>>2]=c[q>>2],y)|0)|0;i=y;z=1;A=0.0;B=0.0}else{a[(c[(c[r>>2]|0)+8>>2]|0)+114|0]=1;z=0;A=+(x|0);B=+(w|0)}vF(s|0,0,16)|0;h[s+16>>3]=B;h[s+24>>3]=A;s=c[p>>2]|0;t=z;u=s+16|0;v=s+24|0}else{s=j;Ij(c[(c[f+8>>2]|0)+136>>2]|0,c[s>>2]|0,k);k=c[s>>2]|0;t=0;u=k+24|0;v=k+32|0}A=+((d[g+33|0]|0)+(d[g+34|0]|0)<<1|0);B=+h[u>>3]+A;C=+h[v>>3]+A;v=g+38|0;a:do{if((b[n>>1]&1)==0){D=t;E=B;F=C}else{u=b[v>>1]|0;k=u&65535;do{if(u<<16>>16!=0){s=b[g+40>>1]|0;if(s<<16>>16==0){break}if(+(k|0)>=B){if(+(s&65535|0)>=C){D=t;E=0.0;F=0.0;break a}}if((a[o]|0)==3){D=t;E=0.0;F=0.0;break a}Fv(0,151304,(y=i,i=i+1|0,i=i+7&-8,c[y>>2]=0,y)|0)|0;i=y;D=1;E=0.0;F=0.0;break a}}while(0);Fv(0,148360,(y=i,i=i+1|0,i=i+7&-8,c[y>>2]=0,y)|0)|0;i=y;D=1;E=B;F=C}}while(0);C=+(e[v>>1]|0);h[g+64>>3]=E>C?E:C;C=+(e[g+40>>1]|0);h[g+72>>3]=F>C?F:C;i=l;return D|0}function Kj(d,e,f,g,h,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;k=i;i=i+176|0;l=g;g=i;i=i+32|0;tF(g,l,32)|0;l=k|0;m=k+16|0;n=k+48|0;o=c[d+16>>2]|0;p=o+208|0;q=h|0;c[q>>2]=c[p>>2];r=o+228|0;c[h+4>>2]=c[r>>2];s=o+244|0;c[h+8>>2]=c[s>>2];t=o+212|0;c[h+12>>2]=c[t>>2];u=o+260|0;v=h+16|0;a[v]=b[u>>1]<<15<<16>>16>>15;h=c[f+16>>2]|0;if((h|0)==0){w=3}else{if((a[h]|0)==0){w=3}else{x=0;y=h}}if((w|0)==3){Iv(l,128,n|0);n=e+60|0;w=c[n>>2]|0;if((w|0)==0){h=Lb(Ih(d,c[o+8>>2]|0,l)|0)|0;c[n>>2]=h;a[e+64|0]=1;z=h}else{z=w}Lv(l,z)|0;z=m|0;m=c[44688]|0;c[44688]=m+1;nb(z|0,106104,(w=i,i=i+8|0,c[w>>2]=m,w)|0)|0;i=w;Lv(l,z)|0;z=l+4|0;w=c[z>>2]|0;if(w>>>0<(c[l+8>>2]|0)>>>0){A=w}else{Jv(l,1)|0;A=c[z>>2]|0}a[A]=0;A=c[l>>2]|0;c[z>>2]=A;x=1;y=A}A=Hh(d,0,c[f>>2]|0,c[f+12>>2]|0,c[f+8>>2]|0,y,c[o+8>>2]|0)|0;if(x){Mv(l)}if((A|0)==0){i=k;return A|0}do{if((j|0)!=0){if((c[q>>2]|0)==0){if((a[v]|0)==0){break}}hB(d)}}while(0);do{if((c[p>>2]|0)==0){if((b[u>>1]&1)!=0){break}i=k;return A|0}}while(0);Nh(d,g);gB(d,c[p>>2]|0,c[r>>2]|0,c[s>>2]|0,c[t>>2]|0);i=k;return A|0}function Lj(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,j=0,k=0,l=0.0;h=i;i=i+8|0;j=h|0;if((Vh(b,f,j)|0)<<24>>24==0){nB(a,b);k=1;lB(a,106536);i=h;return k|0}nB(a,c[f>>2]|0);b=c[f+4>>2]|0;l=+g[j>>2];if((b|0)==0){oB(a,127648,d,l)}else{oB(a,b,d,l)}k=e>>>1&1|2;lB(a,106536);i=h;return k|0}function Mj(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0;j=i;i=i+104|0;k=g;g=i;i=i+32|0;tF(g,k,32)|0;k=j|0;l=j+32|0;m=j+96|0;n=c[f+24>>2]|0;lB(e,(n|0)==0?127648:n);n=f+42|0;o=b[n>>1]|0;if((o&384)==0){pB(e,c[(c[e>>2]|0)+336>>2]|0)}else{c[m+4>>2]=0;p=m|0;c[p>>2]=0;m=o&65535;do{if((m&256|0)==0){if((m&128|0)==0){break}c[p>>2]=106976}else{c[p>>2]=107656}}while(0);pB(e,p)}p=f+33|0;xB(e,+((d[p]|0)>>>0));if((b[n>>1]&4)==0){n=a[p]|0;if((n&255)>>>0>1>>>0){q=+((n&255)>>>0)*.5;n=g|0;h[n>>3]=q+ +h[n>>3];n=g+8|0;h[n>>3]=q+ +h[n>>3];n=g+16|0;h[n>>3]=+h[n>>3]-q;n=g+24|0;h[n>>3]=+h[n>>3]-q}sB(e,g,0);i=j;return}n=a[p]|0;p=g;tF(k|0,p|0,32)|0;tF(l|0,p|0,16)|0;p=l+32|0;g=p;f=k+16|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];if((n&255)>>>0>1>>>0){q=+(n&255|0)*.5;n=l|0;r=q+ +h[n>>3];h[n>>3]=r;n=l+8|0;s=q+ +h[n>>3];h[n>>3]=s;n=p|0;t=+h[n>>3]-q;h[n>>3]=t;n=l+40|0;u=+h[n>>3]-q;h[n>>3]=u;v=t;w=s;x=r;y=u}else{v=+h[p>>3];w=+h[l+8>>3];x=+h[l>>3];y=+h[l+40>>3]}h[l+16>>3]=v;h[l+24>>3]=w;h[l+48>>3]=x;h[l+56>>3]=y;ol(e,l|0,4,4,0);i=j;return}function Nj(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;g=c[d+16>>2]|0;h=g+208|0;if((c[h>>2]|0)==0){if((b[g+260>>1]&1)==0){i=0}else{j=3}}else{j=3}if((j|0)==3){hB(d);i=c[h>>2]|0}j=e|0;if((i|0)!=(c[j>>2]|0)){eF(i);c[h>>2]=c[j>>2]}j=g+228|0;i=c[j>>2]|0;k=e+4|0;if((i|0)!=(c[k>>2]|0)){eF(i);c[j>>2]=c[k>>2]}k=g+244|0;i=c[k>>2]|0;l=e+8|0;if((i|0)!=(c[l>>2]|0)){eF(i);c[k>>2]=c[l>>2]}l=g+212|0;i=c[l>>2]|0;m=e+12|0;if((i|0)==(c[m>>2]|0)){n=i}else{eF(i);i=c[m>>2]|0;c[l>>2]=i;n=i}i=g+260|0;g=a[e+16|0]&1;b[i>>1]=b[i>>1]&-2|g;if((f|0)==0){return}f=c[h>>2]|0;if((f|0)==0&g<<16>>16==0){return}gB(d,f,c[j>>2]|0,c[k>>2]|0,n);return}function Oj(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+8|0;f=e|0;g=ew(a|0,b)|0;if((g|0)==0){i=e;return}b=ac(g|0,120896,(g=i,i=i+8|0,c[g>>2]=f,g)|0)|0;i=g;if((b|0)<=0){i=e;return}h[d>>3]=+h[f>>3];i=e;return}function Pj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0;e=i;i=i+8|0;f=e|0;g=jk(96)|0;j=b+8|0;c[(c[j>>2]|0)+8>>2]=g;g=b|0;k=ew(g,112632)|0;if((k|0)==0){l=Qb(112136)|0;if((l|0)!=0){m=l;n=3}}else{m=k;n=3}if((n|0)==3){k=c[44740]|0;l=mk(k,(xF(m|0)|0)+12|0)|0;c[44740]=l;tF(l|0,111552,12)|0;AF(l|0,m|0)|0;Ib(c[44740]|0)|0}m=Im(g,Wv(b,0,160360,0)|0,159864)|0;do{if((pm(m,159144)|0)==0){o=1}else{if((pm(m,158816)|0)==0){o=1;break}if((pm(m,158496)|0)==0){o=1;break}if((pm(m,165784)|0)==0){o=1;break}if((pm(m,158216)|0)==0){o=1;break}if((pm(m,157864)|0)==0){o=1;break}if((pm(m,157304)|0)==0){o=1;break}if((pm(m,156984)|0)==0){o=2;break}if((pm(m,156624)|0)==0){o=2;break}if((pm(m,159864)|0)==0){o=0;break}if((pm(m,155472)|0)==0){o=0;break}Fv(0,154880,(p=i,i=i+8|0,c[p>>2]=m,p)|0)|0;i=p;o=0}}while(0);a[(c[j>>2]|0)+115|0]=o;do{if((c[53686]|0)==0){o=ew(g,110872)|0;c[53702]=o;if((o|0)!=0){break}c[53702]=c[53704]}}while(0);q=+Fm(g,Wv(b,0,110144,0)|0,0.0,0.0);h[c[(c[j>>2]|0)+8>>2]>>3]=q;o=ew(g,109472)|0;do{if((o|0)==0){r=0}else{m=a[o]|0;if((m<<24>>24|0)==76){if((Ya(o|0,108656)|0)==0){r=1;break}}else if((m<<24>>24|0)==66){if((Ya(o|0,107640)|0)==0){r=2;break}}else if((m<<24>>24|0)==82){m=(Ya(o|0,106968)|0)==0;r=m?3:0;break}else{r=0;break}r=0}}while(0);o=r<<2;if(d<<24>>24==0){c[(c[j>>2]|0)+116>>2]=o}else{c[(c[j>>2]|0)+116>>2]=o|r}q=+Fm(g,Wv(b,0,106528,0)|0,.25,.02);h[f>>3]=q;s=q*72.0;if(s<0.0){t=s+-.5}else{t=s+.5}c[(c[j>>2]|0)+236>>2]=~~t;r=Hm(g,Wv(b,0,106096,0)|0,0)|0;do{if((r|0)==0){h[f>>3]=.5;u=.5}else{o=ac(r|0,120896,(p=i,i=i+8|0,c[p>>2]=f,p)|0)|0;i=p;do{if((o|0)==0){h[f>>3]=.5;v=.5}else{t=+h[f>>3];if(t>=.02){v=t;break}h[f>>3]=.02;v=.02}}while(0);if((Ua(r|0,105624)|0)==0){u=v;break}a[(c[j>>2]|0)+264|0]=1;u=+h[f>>3]}}while(0);v=u*72.0;if(v<0.0){w=v+-.5}else{w=v+.5}c[(c[j>>2]|0)+240>>2]=~~w;f=(Em(g,Wv(b,0,105184,0)|0,0,0)|0)&255;a[(c[j>>2]|0)+231|0]=f;f=Um(Hm(g,Wv(b,0,104776,0)|0,0)|0,25512,25528)|0;c[(c[j>>2]|0)+232>>2]=f;f=ew(g,162064)|0;do{if((f|0)!=0){r=a[f]|0;if(r<<24>>24==0){break}p=r<<24>>24;if((p|0)==97){if(r<<24>>24!=97){break}if((Ya(f|0,161712)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=4;break}else if((p|0)==99){if(r<<24>>24!=99){break}if((Ya(f|0,161360)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=3;break}else if((p|0)==101){if(r<<24>>24!=101){break}if((Ya(f|0,161040)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=5;break}else if((p|0)==102){if(r<<24>>24!=102){break}if((Ya(f|0,160744)|0)!=0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=2;break}else{w=+rF(f);if(w<=0.0){break}c[(c[(c[j>>2]|0)+8>>2]|0)+84>>2]=1;h[(c[(c[j>>2]|0)+8>>2]|0)+16>>3]=w;break}}}while(0);f=Qj(b,104288,(c[(c[j>>2]|0)+8>>2]|0)+64|0)|0;a[(c[(c[j>>2]|0)+8>>2]|0)+80|0]=f;Qj(b,103680,(c[(c[j>>2]|0)+8>>2]|0)+48|0)|0;f=Km(ew(g,103016)|0)|0;a[(c[(c[j>>2]|0)+8>>2]|0)+82|0]=f;f=ew(g,102072)|0;do{if((f|0)==0){r=ew(g,101320)|0;if((r|0)==0){p=ew(g,100864)|0;if((p|0)==0){break}o=Km(p)|0;a[(c[(c[j>>2]|0)+8>>2]|0)+81|0]=o;break}o=a[r]|0;if(o<<24>>24==108){x=1}else{x=o<<24>>24==76|0}a[(c[(c[j>>2]|0)+8>>2]|0)+81|0]=x}else{o=(Rb(f|0)|0)==90|0;a[(c[(c[j>>2]|0)+8>>2]|0)+81|0]=o}}while(0);c[53850]=Um(ew(g,100448)|0,25480,25496)|0;a[215376]=Km(ew(g,99896)|0)|0;c[53522]=0;c[53746]=0;h[(c[(c[j>>2]|0)+8>>2]|0)+24>>3]=0.0;f=ew(g,99520)|0;if((f|0)==0){n=69}else{if((a[f]|0)==0){n=69}else{y=f;n=71}}do{if((n|0)==69){f=ew(g,99104)|0;if((f|0)==0){break}if((a[f]|0)!=0){y=f;n=71}}}while(0);if((n|0)==71){w=+rF(y);h[(c[(c[j>>2]|0)+8>>2]|0)+24>>3]=w}Rj(b);h[21638]=1.0e+37;c[53718]=Wv(b,0,98688,0)|0;c[53722]=Wv(b,0,98120,0)|0;c[53720]=Wv(b,0,97440,0)|0;c[53618]=Wv(b,1,96336,0)|0;c[53574]=Wv(b,1,95800,0)|0;c[53590]=Wv(b,1,95256,0)|0;c[53644]=Wv(b,1,94864,0)|0;c[53632]=Wv(b,1,94384,0)|0;c[53582]=Wv(b,1,94e3,0)|0;c[53624]=Wv(b,1,93512,0)|0;c[53626]=Wv(b,1,93040,0)|0;c[53628]=Wv(b,1,92576,0)|0;y=Wv(b,1,123672,0)|0;c[53614]=y;if((y|0)==0){c[53614]=Wv(b,1,123672,121792)|0}c[53572]=Wv(b,1,91936,0)|0;c[53588]=Wv(b,1,105184,0)|0;c[53600]=Wv(b,1,91080,0)|0;c[53604]=Wv(b,1,98688,0)|0;c[53610]=Wv(b,1,97440,0)|0;c[53586]=Wv(b,1,90576,0)|0;c[53598]=Wv(b,1,89984,0)|0;c[53584]=Wv(b,1,89432,0)|0;c[53602]=Wv(b,1,101320,0)|0;c[53636]=Wv(b,1,89040,0)|0;c[53630]=Wv(b,1,88576,0)|0;c[53616]=Wv(b,1,88152,0)|0;c[53606]=Wv(b,1,87720,0)|0;c[53612]=Wv(b,1,87208,0)|0;c[53620]=Wv(b,1,86672,0)|0;c[53642]=Wv(b,1,85808,0)|0;c[53580]=Wv(b,1,85352,0)|0;c[53570]=Wv(b,1,84896,0)|0;c[53622]=Wv(b,1,98120,0)|0;c[53750]=Wv(b,2,84536,0)|0;c[53816]=Wv(b,2,94864,0)|0;c[53802]=Wv(b,2,94384,0)|0;c[53796]=Wv(b,2,93512,0)|0;c[53798]=Wv(b,2,93040,0)|0;c[53800]=Wv(b,2,92576,0)|0;c[53790]=Wv(b,2,123672,0)|0;c[53748]=Wv(b,2,91936,0)|0;c[53788]=Wv(b,2,84080,0)|0;c[53804]=Wv(b,2,83688,0)|0;c[53822]=Wv(b,2,83280,0)|0;c[53818]=Wv(b,2,82880,0)|0;c[53792]=Wv(b,2,82488,0)|0;c[53756]=Wv(b,2,81920,0)|0;c[53778]=Wv(b,2,81208,0)|0;c[53780]=Wv(b,2,80656,0)|0;c[53782]=Wv(b,2,80200,0)|0;c[53784]=Wv(b,2,79896,0)|0;c[53786]=Wv(b,2,79456,0)|0;c[53774]=Wv(b,2,79144,0)|0;c[53762]=Wv(b,2,105184,0)|0;c[53760]=Wv(b,2,94e3,0)|0;c[53810]=Wv(b,2,78864,0)|0;c[53820]=Wv(b,2,168872,0)|0;c[53812]=Wv(b,2,168520,0)|0;c[53776]=Wv(b,2,87208,0)|0;c[53814]=Wv(b,2,85808,0)|0;c[53758]=Wv(b,2,168136,0)|0;c[53794]=Wv(b,2,167408,0)|0;c[53772]=Wv(b,2,91080,0)|0;y=Eh(b)|0;c[(c[(c[j>>2]|0)+8>>2]|0)+88>>2]=y;y=ew(g,166960)|0;if((y|0)==0){i=e;return}if((a[y]|0)==0){i=e;return}b=fk(y,g)|0;c[(c[(c[j>>2]|0)+8>>2]|0)+92>>2]=b;i=e;return}function Qj(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;a[k]=0;l=ew(b|0,d)|0;if((l|0)==0){m=0;i=f;return m|0}d=ac(l|0,162760,(b=i,i=i+24|0,c[b>>2]=g,c[b+8>>2]=j,c[b+16>>2]=k,b)|0)|0;i=b;do{if((d|0)>1){n=+h[g>>3];if(n<=0.0){break}o=+h[j>>3];if(o<=0.0){break}p=n*72.0;if(p<0.0){q=p+-.5}else{q=p+.5}h[e>>3]=+(~~q|0);p=o*72.0;if(p<0.0){r=p+-.5}else{r=p+.5}h[e+8>>3]=+(~~r|0);m=(a[k]|0)==33|0;i=f;return m|0}}while(0);a[k]=0;j=ac(l|0,162408,(b=i,i=i+16|0,c[b>>2]=g,c[b+8>>2]=k,b)|0)|0;i=b;if((j|0)<=0){m=0;i=f;return m|0}r=+h[g>>3];if(r<=0.0){m=0;i=f;return m|0}q=r*72.0;if(q<0.0){s=q+-.5;t=~~s;u=+(t|0);v=e|0;h[v>>3]=u;w=e+8|0;h[w>>3]=u;x=a[k]|0;y=x<<24>>24==33;z=y&1;i=f;return z|0}else{s=q+.5;t=~~s;u=+(t|0);v=e|0;h[v>>3]=u;w=e+8|0;h[w>>3]=u;x=a[k]|0;y=x<<24>>24==33;z=y&1;i=f;return z|0}return 0}function Rj(b){b=b|0;var d=0,e=0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0.0;d=b|0;e=ew(d,123672)|0;if((e|0)==0){return}if((a[e]|0)==0){return}f=(c[(c[b+48>>2]|0)+8>>2]|0)+113|0;a[f]=a[f]|8;f=(gy(e)|0)!=0;g=+Fm(d,Wv(b,0,93512,0)|0,14.0,1.0);i=Im(d,Wv(b,0,93040,0)|0,164760)|0;j=ak(d,e,f?2:0,g,i,Im(d,Wv(b,0,92576,0)|0,164336)|0)|0;i=b+8|0;c[(c[i>>2]|0)+12>>2]=j;j=ew(d,163984)|0;f=(j|0)!=0;do{if((Ix(d)|0)==(b|0)){if(f){if((a[j]|0)==116){k=1;break}}k=0}else{if(f){if((a[j]|0)==98){k=0;break}}k=1}}while(0);j=ew(d,163192)|0;do{if((j|0)==0){l=k}else{f=a[j]|0;if((f<<24>>24|0)==108){l=k|2;break}else if((f<<24>>24|0)==114){l=k|4;break}else{l=k;break}}}while(0);a[(c[i>>2]|0)+263|0]=l;if((Ix(d)|0)==(b|0)){return}b=c[(c[i>>2]|0)+12>>2]|0;g=+h[b+24>>3]+16.0;m=+h[b+32>>3]+8.0;b=(c[(c[(Ix(d)|0)+8>>2]|0)+116>>2]&1|0)==0;d=c[i>>2]|0;l=(a[d+263|0]&1)!=0;if(b){b=l?2:0;k=d+48|0;h[k+(b<<4)>>3]=g;h[k+(b<<4)+8>>3]=m;return}else{b=l?1:3;h[d+48+(b<<4)>>3]=m;h[(c[i>>2]|0)+48+(b<<4)+8>>3]=g;return}}function Sj(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+8|0;d=c[(c[b>>2]|0)+8>>2]|0;do{if((d|0)==0){e=0}else{f=c[d+88>>2]|0;if((f|0)==0){g=d}else{Hn(f);f=c[(c[b>>2]|0)+8>>2]|0;if((f|0)==0){e=0;break}else{g=f}}f=c[g+92>>2]|0;if((f|0)==0){e=g;break}eF(f);e=c[(c[b>>2]|0)+8>>2]|0}}while(0);eF(e);c[(c[b>>2]|0)+8>>2]=0;dk(c[(c[b>>2]|0)+12>>2]|0);_x(a,0,166512);return}function Tj(a){a=a|0;var b=0,d=0,e=0;b=i;if((a|0)==1){d=165784}else if((a|0)==2){d=165464}else if((a|0)==0){d=166168}else{Fv(1,165128,(e=i,i=i+8|0,c[e>>2]=a,e)|0)|0;i=e;d=166168}i=b;return d|0}function Uj(){return $g(21424,c[43330]|0)|0}function Vj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d|0;c[e>>2]=b;Hc[c[a>>2]&63](a,e,1)|0;i=d;return}function Wj(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+8|0;e=d|0;c[e>>2]=b;b=(Hc[c[a>>2]&63](a,e,512)|0)!=0|0;i=d;return b|0}function Xj(a,b,d){a=a|0;b=b|0;d=d|0;d=jk(12)|0;c[d>>2]=c[b>>2];return d|0}function Yj(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Zj(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;b=c[d>>2]|0;if((e|0)>(b|0)){f=1;return f|0}f=((e|0)<(b|0))<<31>>31;return f|0}function _j(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;e=c[d>>2]|0;f=d+24|0;vF(f|0,0,16)|0;if((a[e]|0)==0){return}g=kk((xF(e|0)|0)+1|0)|0;a[g]=0;h=a[e]|0;do{if(h<<24>>24!=0){i=d+12|0;j=g;k=g;l=e;m=h;a:while(1){n=k;o=l;p=m;while(1){q=o+1|0;if((p&255)>>>0<161>>>0|(c[i>>2]|0)!=2|p<<24>>24==-1){if((p<<24>>24|0)==92){r=8;break}else if((p<<24>>24|0)==10){r=12;break}a[n]=p;s=n+1|0;t=q}else{a[n]=p;u=a[q]|0;v=n+2|0;a[n+1|0]=u;if(u<<24>>24==0){w=v;x=j;break a}else{s=v;t=o+2|0}}v=a[t]|0;if(v<<24>>24==0){w=s;x=j;break a}else{n=s;o=t;p=v}}if((r|0)==8){r=0;p=a[q]|0;v=p<<24>>24;if((v|0)==110|(v|0)==108|(v|0)==114){v=n+1|0;a[n]=0;$j(b,d,j,a[q]|0);y=v;z=v}else{a[n]=p;y=n+1|0;z=j}A=y;B=z;C=(a[q]|0)==0?q:o+2|0}else if((r|0)==12){r=0;p=n+1|0;a[n]=0;$j(b,d,j,110);A=p;B=p;C=q}p=a[C]|0;if(p<<24>>24==0){w=A;x=B;break}else{j=B;k=A;l=C;m=p}}if((x|0)==(w|0)){break}a[w]=0;$j(b,d,x,110)}}while(0);x=d+40|0;d=f;c[x>>2]=c[d>>2];c[x+4>>2]=c[d+4>>2];c[x+8>>2]=c[d+8>>2];c[x+12>>2]=c[d+12>>2];return}function $j(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0.0,w=0,x=0.0,y=0,z=0.0,A=0.0,B=0.0;j=i;i=i+16|0;k=j|0;l=e+76|0;m=b[l>>1]|0;n=e+72|0;o=c[n>>2]|0;if((o|0)==0){p=jk((m*56|0)+112|0)|0}else{p=lk(o,m+2|0,56,m+1|0)|0}m=p;c[n>>2]=m;n=b[l>>1]|0;p=m+(n*56|0)|0;c[p>>2]=f;a[m+(n*56|0)+48|0]=g;do{if((f|0)!=0){if((a[f]|0)==0){break}c[43704]=c[e+4>>2];h[21854]=+h[e+16>>3];g=c[d+144>>2]|0;c[m+(n*56|0)+4>>2]=Hc[c[g>>2]&63](g,174816,1)|0;sm(k,d,p);q=+h[k+8>>3];r=+h[k>>3];s=b[l>>1]|0;t=s+1&65535;b[l>>1]=t;u=e+24|0;v=+h[u>>3];w=v>r;x=w?v:r;h[u>>3]=x;y=e+32|0;z=+h[y>>3];A=q+z;h[y>>3]=A;i=j;return}}while(0);B=+(~~(+h[e+16>>3]*1.2)|0);h[m+(n*56|0)+40>>3]=B;q=B;r=0.0;s=b[l>>1]|0;t=s+1&65535;b[l>>1]=t;u=e+24|0;v=+h[u>>3];w=v>r;x=w?v:r;h[u>>3]=x;y=e+32|0;z=+h[y>>3];A=q+z;h[y>>3]=A;i=j;return}function ak(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=+g;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;l=i;m=jk(88)|0;n=m;o=Sx(b)|0;if((o|0)==0){p=0;q=0;r=b;s=c[b+48>>2]|0}else if((o|0)==1){p=0;q=b;r=0;s=Ix(Hx(b)|0)|0}else if((o|0)==2){o=b;p=o;q=0;r=0;s=Ix(Hx(c[((c[b>>2]&3|0)==2?o:b-32|0)+28>>2]|0)|0)|0}else{p=0;q=0;r=0;s=0}c[m+4>>2]=j;c[m+8>>2]=k;h[m+16>>3]=g;k=s+8|0;j=m+12|0;c[j>>2]=d[(c[k>>2]|0)+115|0]|0;if((f&4|0)!=0){c[m>>2]=Lb(e|0)|0;if((f&2|0)==0){i=l;return n|0}a[m+82|0]=1;i=l;return n|0}if((f|0)==2){c[m>>2]=Lb(e|0)|0;a[m+82|0]=1;if((Fj(b,n)|0)==0){i=l;return n|0}o=Sx(b)|0;if((o|0)==0){t=$w(r|0)|0;Fv(3,117880,(u=i,i=i+8|0,c[u>>2]=t,u)|0)|0;i=u;i=l;return n|0}else if((o|0)==1){t=$w(q|0)|0;Fv(3,156648,(u=i,i=i+8|0,c[u>>2]=t,u)|0)|0;i=u;i=l;return n|0}else if((o|0)==2){o=p;t=$w(c[((c[o>>2]&3|0)==3?p:p+32|0)+28>>2]|0)|0;q=(Nw(s)|0)!=0;r=$w(c[((c[o>>2]&3|0)==2?p:p-32|0)+28>>2]|0)|0;Fv(3,127032,(u=i,i=i+24|0,c[u>>2]=t,c[u+8>>2]=q?115048:108104,c[u+16>>2]=r,u)|0)|0;i=u;i=l;return n|0}else{i=l;return n|0}}else if((f|0)==0){f=bk(e,b,0)|0;b=m;c[b>>2]=f;if((c[j>>2]|0)==1){v=kn(f)|0}else{v=hn(f,s)|0}eF(c[b>>2]|0);c[b>>2]=v;_j(c[(c[k>>2]|0)+136>>2]|0,n);i=l;return n|0}else{cc(102408,96688,166,170344);return 0}return 0}function bk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;f=Sx(d)|0;do{if((f|0)==0){g=$w(d)|0;h=xF(g|0)|0;i=c[(c[d+8>>2]|0)+12>>2]|0;if((i|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=2;r=h;s=133680;t=136504;u=139056;v=142152;w=145128;x=g;y=213432;z=213432;break}A=c[i>>2]|0;if((b|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=2;r=h;s=A;t=136504;u=139056;v=142152;w=145128;x=g;y=213432;z=213432;break}j=0;k=0;l=0;m=xF(A|0)|0;n=2;o=2;p=2;q=2;r=h;s=A;t=136504;u=139056;v=142152;w=145128;x=g;y=213432;z=213432}else if((f|0)==1){g=$w(Hx(d)|0)|0;A=xF(g|0)|0;h=$w(d)|0;i=xF(h|0)|0;B=c[(c[d+8>>2]|0)+104>>2]|0;if((B|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=i;r=A;s=133680;t=136504;u=139056;v=142152;w=h;x=g;y=213432;z=213432;break}C=c[B>>2]|0;if((b|0)==0){j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=i;r=A;s=C;t=136504;u=139056;v=142152;w=h;x=g;y=213432;z=213432;break}j=0;k=0;l=0;m=xF(C|0)|0;n=2;o=2;p=2;q=i;r=A;s=C;t=136504;u=139056;v=142152;w=h;x=g;y=213432;z=213432}else if((f|0)==2){g=d;h=d;C=d+32|0;A=$w(Ix(Hx(c[((c[h>>2]&3|0)==3?g:C)+28>>2]|0)|0)|0)|0;i=xF(A|0)|0;B=$w(c[((c[h>>2]&3|0)==3?g:C)+28>>2]|0)|0;D=xF(B|0)|0;E=d+8|0;F=c[(c[E>>2]|0)+52>>2]|0;G=F;if((F|0)==0){H=0}else{H=xF(G|0)|0}F=$w(c[((c[h>>2]&3|0)==2?g:d-32|0)+28>>2]|0)|0;I=c[E>>2]|0;E=c[I+92>>2]|0;J=E;if((E|0)==0){K=0}else{K=xF(J|0)|0}E=xF(F|0)|0;L=c[I+96>>2]|0;do{if((L|0)==0){M=2;N=133680}else{I=c[L>>2]|0;if((b|0)==0){M=2;N=I;break}M=xF(I|0)|0;N=I}}while(0);L=(Nw(Ix(Hx(c[((c[h>>2]&3|0)==3?g:C)+28>>2]|0)|0)|0)|0)==0;j=1;k=K;l=H;m=M;n=D;o=E;p=D+2+((H|0)==0?0:H+1|0)+E+((K|0)==0?0:K+1|0)|0;q=2;r=i;s=N;t=B;u=F;v=L?108104:115048;w=145128;x=A;y=J;z=G}else{j=0;k=0;l=0;m=2;n=2;o=2;p=2;q=2;r=2;s=133680;t=136504;u=139056;v=142152;w=145128;x=148280;y=213432;z=213432}}while(0);N=(e|0)==0;a:do{if(N){e=0;K=b;b:while(1){H=K+1|0;M=a[K]|0;if((M<<24>>24|0)==0){O=e;break a}else if((M<<24>>24|0)!=92){e=e+1|0;K=H;continue}M=K+2|0;switch(a[H]|0){case 76:{e=e+m|0;K=M;continue b;break};case 78:{e=e+q|0;K=M;continue b;break};case 71:{e=e+r|0;K=M;continue b;break};case 84:{e=e+n|0;K=M;continue b;break};case 72:{e=e+o|0;K=M;continue b;break};case 69:{e=e+p|0;K=M;continue b;break};default:{e=e+2|0;K=M;continue b}}}}else{K=0;e=b;c:while(1){G=e+1|0;J=a[e]|0;if((J<<24>>24|0)==0){O=K;break a}else if((J<<24>>24|0)!=92){K=K+1|0;e=G;continue}J=e+2|0;switch(a[G]|0){case 71:{K=K+r|0;e=J;continue c;break};case 78:{K=K+q|0;e=J;continue c;break};case 69:{K=K+p|0;e=J;continue c;break};case 72:{K=K+o|0;e=J;continue c;break};case 84:{K=K+n|0;e=J;continue c;break};case 76:{K=K+m|0;e=J;continue c;break};case 92:{K=K+1|0;e=J;continue c;break};default:{K=K+2|0;e=J;continue c}}}}}while(0);m=kk(O+1|0)|0;O=(j|0)==0;j=(l|0)==0;l=(k|0)==0;k=m;n=b;d:while(1){b=n+1|0;o=a[n]|0;if((o<<24>>24|0)==0){break}else if((o<<24>>24|0)!=92){a[k]=o;k=k+1|0;n=b;continue}o=n+2|0;p=a[b]|0;e:do{switch(p<<24>>24|0){case 92:{if(N){break e}a[k]=92;k=k+1|0;n=o;continue d;break};case 71:{b=a[x]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{P=k;Q=x}while(1){b=Q+1|0;q=P+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{P=q;Q=b}}break};case 78:{b=a[w]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{R=k;S=w}while(1){b=S+1|0;q=R+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{R=q;S=b}}break};case 84:{b=a[t]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{T=k;U=t}while(1){b=U+1|0;q=T+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{T=q;U=b}}break};case 72:{b=a[u]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{V=k;W=u}while(1){b=W+1|0;q=V+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{V=q;W=b}}break};case 76:{b=a[s]|0;a[k]=b;if(b<<24>>24==0){k=k;n=o;continue d}else{X=k;Y=s}while(1){b=Y+1|0;q=X+1|0;r=a[b]|0;a[q]=r;if(r<<24>>24==0){k=q;n=o;continue d}else{X=q;Y=b}}break};case 69:{if(O){k=k;n=o;continue d}b=a[t]|0;a[k]=b;if(b<<24>>24==0){Z=k}else{b=k;q=t;while(1){r=q+1|0;e=b+1|0;K=a[r]|0;a[e]=K;if(K<<24>>24==0){Z=e;break}else{b=e;q=r}}}if(j){_=Z}else{a[Z]=58;q=z;b=Z;while(1){r=b+1|0;e=a[q]|0;a[r]=e;if(e<<24>>24==0){_=r;break}else{q=q+1|0;b=r}}}b=a[v]|0;a[_]=b;if(b<<24>>24==0){$=_}else{b=_;q=v;while(1){r=q+1|0;e=b+1|0;K=a[r]|0;a[e]=K;if(K<<24>>24==0){$=e;break}else{b=e;q=r}}}q=a[u]|0;a[$]=q;if(q<<24>>24==0){aa=$}else{q=$;b=u;while(1){r=b+1|0;e=q+1|0;K=a[r]|0;a[e]=K;if(K<<24>>24==0){aa=e;break}else{q=e;b=r}}}if(l){k=aa;n=o;continue d}a[aa]=58;b=y;q=aa;while(1){r=q+1|0;e=a[b]|0;a[r]=e;if(e<<24>>24==0){k=r;n=o;continue d}else{b=b+1|0;q=r}}break};default:{}}}while(0);a[k]=92;a[k+1|0]=p;k=k+2|0;n=o}a[k]=0;return m|0}function ck(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((a|0)==0){return}if((b|0)>0){d=0;e=a;while(1){do{if((d|0)==0){f=c[e>>2]|0;if((f|0)==0){break}eF(f)}}while(0);f=c[e+8>>2]|0;do{if((f|0)!=0){g=c[e+12>>2]|0;if((g|0)==0){break}Cc[g&255](f)}}while(0);f=d+1|0;if((f|0)<(b|0)){d=f;e=e+56|0}else{break}}}eF(a);return}function dk(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;if((d|0)==0){return}eF(c[d>>2]|0);e=d+72|0;do{if((a[d+82|0]|0)==0){f=c[e>>2]|0;g=b[d+76>>1]|0;h=g<<16>>16;if((f|0)==0){break}if(g<<16>>16>0){g=0;i=f;while(1){do{if((g|0)==0){j=c[i>>2]|0;if((j|0)==0){break}eF(j)}}while(0);j=c[i+8>>2]|0;do{if((j|0)!=0){k=c[i+12>>2]|0;if((k|0)==0){break}Cc[k&255](j)}}while(0);j=g+1|0;if((j|0)<(h|0)){g=j;i=i+56|0}else{break}}}eF(f)}else{i=c[e>>2]|0;if((i|0)==0){break}wj(i,1)}}while(0);eF(d);return}function ek(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=i;i=i+16|0;j=g|0;k=(c[d+16>>2]|0)+12|0;l=c[k>>2]|0;c[k>>2]=e;if((a[f+82|0]|0)!=0){rj(d,c[f+72>>2]|0,f);c[k>>2]=l;i=g;return}e=f+76|0;if((b[e>>1]|0)<1){i=g;return}iB(d,0);lB(d,c[f+8>>2]|0);m=a[f+80|0]|0;if((m|0)==116){h[j+8>>3]=+h[f+64>>3]+ +h[f+48>>3]*.5- +h[f+16>>3]}else if((m|0)==98){h[j+8>>3]=+h[f+32>>3]+(+h[f+64>>3]- +h[f+48>>3]*.5)- +h[f+16>>3]}else{h[j+8>>3]=+h[f+64>>3]+ +h[f+32>>3]*.5- +h[f+16>>3]}if((b[e>>1]|0)>0){m=f+72|0;n=f+56|0;o=j|0;p=j+8|0;q=f+40|0;f=0;r=c[m>>2]|0;do{s=a[r+(f*56|0)+48|0]|0;if((s|0)==108){h[o>>3]=+h[n>>3]- +h[q>>3]*.5}else if((s|0)==114){h[o>>3]=+h[n>>3]+ +h[q>>3]*.5}else{h[o>>3]=+h[n>>3]}kB(d,j,r+(f*56|0)|0);r=c[m>>2]|0;h[p>>3]=+h[p>>3]- +h[r+(f*56|0)+40>>3];f=f+1|0;}while((f|0)<(b[e>>1]|0))}jB(d);c[k>>2]=l;i=g;return}function fk(a,b){a=a|0;b=b|0;return bk(a,b,1)|0}function gk(a){a=a|0;return hk(a,0)|0}function hk(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;e=c[43612]|0;if((e|0)==0){c[43610]=64;f=kk(64)|0;c[43612]=f;g=f}else{g=e}if((b|0)==0){h=g;a[h]=0;i=c[43612]|0;return i|0}e=d<<24>>24==0;d=b;b=g;g=0;f=0;while(1){j=a[d]|0;if(j<<24>>24==0){h=b;break}k=c[43610]|0;if((f|0)>(k-8|0)){l=k<<1;c[43610]=l;k=mk(c[43612]|0,l)|0;c[43612]=k;m=k+f|0;n=a[d]|0}else{m=b;n=j}a:do{switch(n<<24>>24){case 60:{o=4;p=86176;break};case 45:{q=23;break};case 32:{q=24;break};case 38:{if(!e){o=5;p=91328;break a}j=a[d+1|0]|0;b:do{if(j<<24>>24==35){k=a[d+2|0]|0;if((k<<24>>24|0)==120|(k<<24>>24|0)==88){l=d+3|0;while(1){r=a[l]|0;if((r-48&255)>>>0<10>>>0|(r-97&255)>>>0<6>>>0|(r-65&255)>>>0<6>>>0){l=l+1|0}else{s=r;break b}}}if((k-48&255)>>>0>=10>>>0){s=k;break}l=d+3|0;while(1){r=a[l]|0;if((r-48&255)>>>0<10>>>0){l=l+1|0}else{s=r;break}}}else{if(!((j-97&255)>>>0<26>>>0|(j-65&255)>>>0<26>>>0)){s=j;break}l=d+2|0;while(1){k=a[l]|0;if((k-97&255)>>>0<26>>>0|(k-65&255)>>>0<26>>>0){l=l+1|0}else{s=k;break}}}}while(0);if(s<<24>>24!=59){o=5;p=91328;break a}if((n<<24>>24|0)==60){o=4;p=86176}else if((n<<24>>24|0)==45){q=23}else if((n<<24>>24|0)==32){q=24}else if((n<<24>>24|0)==62){q=22}else{q=26}break};case 62:{q=22;break};default:{q=26}}}while(0);do{if((q|0)==22){q=0;o=4;p=81432}else if((q|0)==23){q=0;o=5;p=167680}else if((q|0)==24){q=0;if((g|0)==0){q=28;break}if((a[g]|0)==32){o=6;p=163496}else{q=28}}else if((q|0)==26){q=0;if((n<<24>>24|0)==34){o=6;p=159408;break}else if((n<<24>>24|0)!=39){q=28;break}o=5;p=154400}}while(0);if((q|0)==28){q=0;o=1;p=d}j=o+f|0;l=m;k=p;r=o;while(1){t=r-1|0;a[l]=a[k]|0;if((t|0)==0){break}else{l=l+1|0;k=k+1|0;r=t}}g=d;d=d+1|0;b=m+o|0;f=j}a[h]=0;i=c[43612]|0;return i|0}function ik(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=c[43608]|0;if((d|0)==0){c[43606]=64;e=kk(64)|0;c[43608]=e;f=e}else{f=d}if((b|0)==0){g=f;a[g]=0;h=c[43608]|0;return h|0}else{i=b;j=f;k=0}while(1){f=a[i]|0;if(f<<24>>24==0){g=j;break}b=c[43606]|0;if((k|0)>(b-8|0)){d=b<<1;c[43606]=d;b=mk(c[43608]|0,d)|0;c[43608]=b;l=b+k|0;m=a[i]|0}else{l=j;m=f}a:do{switch(m<<24>>24){case 39:{n=22;break};case 60:{o=4;p=86176;break};case 38:{f=a[i+1|0]|0;b:do{if(f<<24>>24==35){b=a[i+2|0]|0;if((b<<24>>24|0)==120|(b<<24>>24|0)==88){d=i+3|0;while(1){e=a[d]|0;if((e-48&255)>>>0<10>>>0|(e-97&255)>>>0<6>>>0|(e-65&255)>>>0<6>>>0){d=d+1|0}else{q=e;break b}}}if((b-48&255)>>>0>=10>>>0){q=b;break}d=i+3|0;while(1){e=a[d]|0;if((e-48&255)>>>0<10>>>0){d=d+1|0}else{q=e;break}}}else{if(!((f-97&255)>>>0<26>>>0|(f-65&255)>>>0<26>>>0)){q=f;break}d=i+2|0;while(1){b=a[d]|0;if((b-97&255)>>>0<26>>>0|(b-65&255)>>>0<26>>>0){d=d+1|0}else{q=b;break}}}}while(0);if(q<<24>>24!=59){o=5;p=91328;break a}if((m<<24>>24|0)==39){n=22}else if((m<<24>>24|0)==60){o=4;p=86176}else if((m<<24>>24|0)==62){n=20}else if((m<<24>>24|0)==34){n=21}else{n=23}break};case 62:{n=20;break};case 34:{n=21;break};default:{n=23}}}while(0);if((n|0)==20){n=0;o=4;p=81432}else if((n|0)==21){n=0;o=6;p=159408}else if((n|0)==22){n=0;o=5;p=154400}else if((n|0)==23){n=0;o=1;p=i}f=o+k|0;d=l;b=p;e=o;while(1){r=e-1|0;a[d]=a[b]|0;if((r|0)==0){break}else{d=d+1|0;b=b+1|0;e=r}}i=i+1|0;j=l+o|0;k=f}a[g]=0;h=c[43608]|0;return h|0}function jk(a){a=a|0;var b=0,d=0,e=0;if((a|0)==0){b=0;return b|0}d=dF(a)|0;if((d|0)==0){Ma(117496,14,1,c[o>>2]|0)|0;e=0}else{e=d}vF(e|0,0,a|0)|0;b=e;return b|0}function kk(a){a=a|0;var b=0,d=0;do{if((a|0)==0){b=0}else{d=dF(a)|0;if((d|0)!=0){b=d;break}Ma(117496,14,1,c[o>>2]|0)|0;b=0}}while(0);return b|0}function lk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;f=gF(a,da(d,b)|0)|0;if(!((f|0)!=0|(b|0)==0)){Ma(117496,14,1,c[o>>2]|0)|0;return f|0}if(e>>>0>=b>>>0){return f|0}vF(f+(da(e,d)|0)|0,0,da(b-e|0,d)|0)|0;return f|0}function mk(a,b){a=a|0;b=b|0;var d=0;d=gF(a,b)|0;if((d|0)!=0|(b|0)==0){return d|0}Ma(117496,14,1,c[o>>2]|0)|0;return d|0}function nk(b,d,f,g){b=b|0;d=d|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,ya=0,za=0,Ba=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0,Gd=0,Hd=0,Id=0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0,Od=0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0,oe=0,pe=0,qe=0,re=0,se=0,te=0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0.0;j=i;k=1;l=0;m=i;i=i+168|0;c[m>>2]=0;while(1)switch(k|0){case 1:n=b+8|0;if((a[213992]|0)==0){k=7;break}else{k=2;break};case 2:p=c[(c[n>>2]|0)+180>>2]|0;if((p|0)==0){q=0;r=0;k=6;break}else{s=0;t=0;w=p;k=3;break};case 3:x=s+1|0;y=c[w+8>>2]|0;z=c[y+180>>2]|0;if((c[z>>2]|0)==0){A=t;k=5;break}else{B=t;C=0;k=4;break};case 4:p=B+1|0;D=C+1|0;if((c[z+(D<<2)>>2]|0)==0){A=p;k=5;break}else{B=p;C=D;k=4;break};case 5:D=c[y+164>>2]|0;if((D|0)==0){q=x;r=A;k=6;break}else{s=x;t=A;w=D;k=3;break};case 6:pa(30,c[o>>2]|0,156448,(E=i,i=i+40|0,c[E>>2]=117448,c[E+8>>2]=q,c[E+16>>2]=r,c[E+24>>2]=f,c[E+32>>2]=d,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;Ca(2);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=7;break;case 7:c[53736]=b;c[53538]=0;c[53634]=0;c[53608]=0;D=c[(c[n>>2]|0)+180>>2]|0;if((D|0)==0){F=0;k=13;break}else{G=D;k=8;break};case 8:H=G+8|0;a[(c[H>>2]|0)+157|0]=0;I=(c[53608]|0)+1|0;c[53608]=I;D=c[H>>2]|0;if((c[c[D+180>>2]>>2]|0)==0){J=D;k=11;break}else{k=9;break};case 9:K=0;L=c[53634]|0;k=10;break;case 10:D=L+1|0;c[53634]=D;p=K+1|0;M=c[H>>2]|0;if((c[(c[M+180>>2]|0)+(p<<2)>>2]|0)==0){J=M;k=11;break}else{K=p;L=D;k=10;break};case 11:D=c[J+164>>2]|0;if((D|0)==0){k=12;break}else{G=D;k=8;break};case 12:F=I<<2;k=13;break;case 13:N=c[53504]|0;if((N|0)==0){k=15;break}else{k=14;break};case 14:D=wa(206,N|0,F|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;O=D;k=16;break;case 15:D=ma(54,F|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;O=D;k=16;break;case 16:c[53504]=O;c[53502]=0;P=c[53508]|0;if((P|0)==0){k=18;break}else{k=17;break};case 17:D=wa(206,P|0,c[53608]<<2|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Q=D;k=19;break;case 18:D=ma(54,c[53608]<<2|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Q=D;k=19;break;case 19:c[53508]=Q;c[53506]=0;D=c[(c[n>>2]|0)+180>>2]|0;if((D|0)==0){k=47;break}else{R=1;S=D;k=20;break};case 20:T=S+8|0;c[(c[T>>2]|0)+288>>2]=0;D=c[T>>2]|0;p=c[c[D+172>>2]>>2]|0;if((p|0)==0){U=4;V=R;k=25;break}else{W=0;X=R;Y=D;Z=p;k=21;break};case 21:p=Y+288|0;c[p>>2]=(c[p>>2]|0)+1;_=Z+8|0;c[(c[_>>2]|0)+160>>2]=0;c[(c[_>>2]|0)+164>>2]=-1;if((X|0)==0){$=0;k=23;break}else{k=22;break};case 22:p=c[Z>>2]&3;$=((c[(c[(c[((p|0)==2?Z:Z-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((p|0)==3?Z:Z+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)<(e[(c[_>>2]|0)+170>>1]|0)?0:X;k=23;break;case 23:aa=W+1|0;p=c[T>>2]|0;D=c[(c[p+172>>2]|0)+(aa<<2)>>2]|0;if((D|0)==0){k=24;break}else{W=aa;X=$;Y=p;Z=D;k=21;break};case 24:U=(aa<<2)+4|0;V=$;k=25;break;case 25:D=ma(12,U|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;c[(c[T>>2]|0)+260>>2]=D;c[(c[T>>2]|0)+264>>2]=0;ba=c[(c[T>>2]|0)+180>>2]|0;ca=0;k=26;break;case 26:da=ca+1|0;if((c[ba+(ca<<2)>>2]|0)==0){k=27;break}else{ca=da;k=26;break};case 27:D=ma(12,da<<2|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;c[(c[T>>2]|0)+268>>2]=D;c[(c[T>>2]|0)+272>>2]=0;D=c[(c[T>>2]|0)+164>>2]|0;if((D|0)==0){k=28;break}else{R=V;S=D;k=20;break};case 28:if((V|0)==0){k=29;break}else{k=47;break};case 29:ea=ma(10,c[53608]|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;D=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((D|0)==0){k=30;break}else{fa=D;k=31;break};case 30:D=ma(30,ea|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;if((D|0)==0){ga=0;k=41;break}else{ha=0;ia=D;k=35;break};case 31:ja=fa+8|0;D=c[ja>>2]|0;if((c[D+288>>2]|0)==0){k=32;break}else{na=D;k=33;break};case 32:la(18,ea|0,fa|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;na=c[ja>>2]|0;k=33;break;case 33:D=c[na+164>>2]|0;if((D|0)==0){k=30;break}else{fa=D;k=31;break};case 34:D=ma(30,ea|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;if((D|0)==0){ga=oa;k=41;break}else{ha=oa;ia=D;k=35;break};case 35:qa=ia+8|0;c[(c[qa>>2]|0)+232>>2]=0;oa=ha+1|0;D=c[qa>>2]|0;p=c[c[D+172>>2]>>2]|0;if((p|0)==0){ra=D;k=37;break}else{sa=0;ta=D;ua=p;k=36;break};case 36:p=c[ta+232>>2]|0;D=(e[(c[ua+8>>2]|0)+170>>1]|0)+(c[(c[(c[((c[ua>>2]&3|0)==3?ua:ua+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0;c[ta+232>>2]=(p|0)>(D|0)?p:D;D=sa+1|0;p=c[qa>>2]|0;M=c[(c[p+172>>2]|0)+(D<<2)>>2]|0;if((M|0)==0){ra=p;k=37;break}else{sa=D;ta=p;ua=M;k=36;break};case 37:M=c[c[ra+180>>2]>>2]|0;if((M|0)==0){k=34;break}else{va=0;ya=M;k=38;break};case 38:za=ya;Ba=ya-32|0;M=(c[(c[((c[za>>2]&3|0)==2?ya:Ba)+28>>2]|0)+8>>2]|0)+288|0;p=c[M>>2]|0;c[M>>2]=p-1;if((p|0)<2){k=39;break}else{k=40;break};case 39:la(18,ea|0,c[((c[za>>2]&3|0)==2?ya:Ba)+28>>2]|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=40;break;case 40:p=va+1|0;M=c[(c[(c[qa>>2]|0)+180>>2]|0)+(p<<2)>>2]|0;if((M|0)==0){k=34;break}else{va=p;ya=M;k=38;break};case 41:if((ga|0)==(c[53608]|0)){k=46;break}else{k=42;break};case 42:pa(16,1,81392,(E=i,i=i+1|0,i=i+7&-8,c[E>>2]=0,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;M=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((M|0)==0){k=46;break}else{Da=M;k=43;break};case 43:Ea=Da+8|0;M=c[Ea>>2]|0;if((c[M+288>>2]|0)==0){Fa=M;k=45;break}else{k=44;break};case 44:M=ma(56,Da|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;p=c[(c[Ea>>2]|0)+288>>2]|0;pa(16,3,167640,(E=i,i=i+16|0,c[E>>2]=M,c[E+8>>2]=p,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;Fa=c[Ea>>2]|0;k=45;break;case 45:p=c[Fa+164>>2]|0;if((p|0)==0){k=46;break}else{Da=p;k=43;break};case 46:ka(120,ea|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=47;break;case 47:if((f|0)<1){k=48;break}else{k=54;break};case 48:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){Ga=0;k=216;break}else{Ha=p;k=49;break};case 49:Ia=Ha+8|0;p=c[Ia>>2]|0;Ja=c[p+260>>2]|0;if((Ja|0)==0){Ka=p;k=51;break}else{k=50;break};case 50:ka(150,Ja|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ka=c[Ia>>2]|0;k=51;break;case 51:La=c[Ka+268>>2]|0;if((La|0)==0){Ma=Ka;k=53;break}else{k=52;break};case 52:ka(150,La|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ma=c[Ia>>2]|0;k=53;break;case 53:a[Ma+157|0]=0;p=c[(c[Ia>>2]|0)+164>>2]|0;if((p|0)==0){Ga=0;k=216;break}else{Ha=p;k=49;break};case 54:c[53534]=(g|0)>-1?g:30;Na=BF(178552,k,m)|0;k=217;break;case 217:if((Na|0)==0){k=55;break}else{Ga=2;k=216;break};case 55:if((c[53608]|0)<2){k=56;break}else{k=57;break};case 56:Oa=c[o>>2]|0;Pa=0;k=92;break;case 57:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){k=58;break}else{Qa=p;k=59;break};case 58:if((c[53506]|0)>0){Ra=0;k=60;break}else{k=61;break};case 59:p=Qa+8|0;a[(c[p>>2]|0)+157|0]=0;c[c[(c[p>>2]|0)+268>>2]>>2]=0;c[c[(c[p>>2]|0)+260>>2]>>2]=0;c[(c[p>>2]|0)+272>>2]=0;c[(c[p>>2]|0)+264>>2]=0;M=c[(c[p>>2]|0)+164>>2]|0;if((M|0)==0){k=58;break}else{Qa=M;k=59;break};case 60:c[(c[(c[(c[53508]|0)+(Ra<<2)>>2]|0)+8>>2]|0)+164>>2]=-1;M=Ra+1|0;if((M|0)<(c[53506]|0)){Ra=M;k=60;break}else{k=61;break};case 61:c[53506]=0;c[53502]=0;M=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((M|0)==0){Sa=0;Ta=0;k=64;break}else{Ua=M;k=62;break};case 62:ma(36,Ua|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;M=c[(c[Ua+8>>2]|0)+164>>2]|0;if((M|0)!=0&(c[53506]|0)==0){Ua=M;k=62;break}else{k=63;break};case 63:Sa=c[53502]|0;Ta=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;k=64;break;case 64:if((Sa|0)<(c[53608]|0)){k=65;break}else{k=85;break};case 65:Va=(Ta|0)==0;if(Va){Ga=1;k=216;break}else{Wa=0;Xa=Ta;k=66;break};case 66:Ya=c[Xa+8>>2]|0;Za=c[Ya+180>>2]|0;M=c[Za>>2]|0;if((M|0)==0){_a=Wa;k=76;break}else{$a=0;ab=Wa;bb=M;k=67;break};case 67:cb=c[bb+8>>2]|0;if((c[cb+164>>2]|0)<0){k=68;break}else{db=ab;k=75;break};case 68:M=c[bb>>2]&3;eb=c[((M|0)==3?bb:bb+32|0)+28>>2]|0;fb=c[eb+8>>2]|0;gb=c[((M|0)==2?bb:bb-32|0)+28>>2]|0;hb=c[gb+8>>2]|0;ib=(a[hb+157|0]|0)==0;if((a[fb+157|0]|0)==0){k=70;break}else{k=69;break};case 69:if(ib){jb=eb;k=71;break}else{db=ab;k=75;break};case 70:if(ib){db=ab;k=75;break}else{jb=gb;k=71;break};case 71:if((jb|0)==0){db=ab;k=75;break}else{k=72;break};case 72:if((ab|0)==0){k=74;break}else{k=73;break};case 73:M=c[ab>>2]&3;if(((c[hb+232>>2]|0)-(c[fb+232>>2]|0)-(e[cb+170>>1]|0)|0)<((c[(c[(c[((M|0)==2?ab:ab-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((M|0)==3?ab:ab+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[(c[ab+8>>2]|0)+170>>1]|0)|0)){k=74;break}else{db=ab;k=75;break};case 74:db=bb;k=75;break;case 75:M=$a+1|0;p=c[Za+(M<<2)>>2]|0;if((p|0)==0){_a=db;k=76;break}else{$a=M;ab=db;bb=p;k=67;break};case 76:p=c[Ya+164>>2]|0;if((p|0)==0){k=77;break}else{Wa=_a;Xa=p;k=66;break};case 77:if((_a|0)==0){k=86;break}else{k=78;break};case 78:p=c[_a>>2]&3;kb=c[((p|0)==2?_a:_a-32|0)+28>>2]|0;lb=c[kb+8>>2]|0;mb=c[((p|0)==3?_a:_a+32|0)+28>>2]|0;nb=c[mb+8>>2]|0;p=(c[lb+232>>2]|0)-(c[nb+232>>2]|0)|0;M=e[(c[_a+8>>2]|0)+170>>1]|0;ob=p-M|0;if((p|0)==(M|0)){k=57;break}else{k=79;break};case 79:pb=(a[lb+157|0]|0)==0;if((a[nb+157|0]|0)==0){k=81;break}else{k=80;break};case 80:if(pb){qb=mb;k=83;break}else{k=82;break};case 81:if(pb){k=82;break}else{qb=kb;k=83;break};case 82:qb=0;k=83;break;case 83:rb=(qb|0)==(kb|0)?-ob|0:ob;if((Sa|0)>0){sb=0;k=84;break}else{k=57;break};case 84:M=(c[(c[(c[53504]|0)+(sb<<2)>>2]|0)+8>>2]|0)+232|0;c[M>>2]=(c[M>>2]|0)+rb;M=sb+1|0;if((M|0)<(c[53502]|0)){sb=M;k=84;break}else{k=57;break};case 85:pa(34,Ta|0,0,1)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;la(34,c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0,0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=56;break;case 86:if(Va){Ga=1;k=216;break}else{tb=Ta;k=87;break};case 87:ub=tb+8|0;M=c[ub>>2]|0;vb=c[M+260>>2]|0;if((vb|0)==0){wb=M;k=89;break}else{k=88;break};case 88:ka(150,vb|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;wb=c[ub>>2]|0;k=89;break;case 89:xb=c[wb+268>>2]|0;if((xb|0)==0){yb=wb;k=91;break}else{k=90;break};case 90:ka(150,xb|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;yb=c[ub>>2]|0;k=91;break;case 91:a[yb+157|0]=0;M=c[(c[ub>>2]|0)+164>>2]|0;if((M|0)==0){Ga=1;k=216;break}else{tb=M;k=87;break};case 92:zb=c[53538]|0;Ab=c[53506]|0;if((zb|0)<(Ab|0)){k=93;break}else{Bb=0;Cb=0;k=99;break};case 93:Db=c[53508]|0;Eb=0;Fb=0;Gb=zb;k=94;break;case 94:Hb=c[Db+(Gb<<2)>>2]|0;Ib=c[(c[Hb+8>>2]|0)+160>>2]|0;if((Ib|0)<0){k=95;break}else{Jb=Fb;Kb=Eb;k=98;break};case 95:if((Eb|0)==0){Lb=Hb;k=97;break}else{k=96;break};case 96:Lb=(c[(c[Eb+8>>2]|0)+160>>2]|0)>(Ib|0)?Hb:Eb;k=97;break;case 97:M=Fb+1|0;if((M|0)<(c[53534]|0)){Jb=M;Kb=Lb;k=98;break}else{Mb=Lb;k=106;break};case 98:M=Gb+1|0;c[53538]=M;if((M|0)<(Ab|0)){Eb=Kb;Fb=Jb;Gb=M;k=94;break}else{Bb=Kb;Cb=Jb;k=99;break};case 99:if((zb|0)>0){k=100;break}else{Mb=Bb;k=106;break};case 100:c[53538]=0;Nb=c[53508]|0;Ob=0;Pb=Bb;Qb=Cb;k=101;break;case 101:Rb=c[Nb+(Ob<<2)>>2]|0;Sb=c[(c[Rb+8>>2]|0)+160>>2]|0;if((Sb|0)<0){k=102;break}else{Tb=Qb;Ub=Pb;k=105;break};case 102:if((Pb|0)==0){Vb=Rb;k=104;break}else{k=103;break};case 103:Vb=(c[(c[Pb+8>>2]|0)+160>>2]|0)>(Sb|0)?Rb:Pb;k=104;break;case 104:M=Qb+1|0;if((M|0)<(c[53534]|0)){Tb=M;Ub=Vb;k=105;break}else{Mb=Vb;k=106;break};case 105:M=Ob+1|0;c[53538]=M;if((M|0)<(zb|0)){Ob=M;Pb=Ub;Qb=Tb;k=101;break}else{Mb=Ub;k=106;break};case 106:if((Mb|0)==0){Wb=Pa;k=147;break}else{k=107;break};case 107:Xb=Mb;M=c[Xb>>2]&3;Yb=Mb+32|0;p=c[((M|0)==3?Mb:Yb)+28>>2]|0;Zb=Mb-32|0;D=c[((M|0)==2?Mb:Zb)+28>>2]|0;M=(c[(c[p+8>>2]|0)+284>>2]|0)<(c[(c[D+8>>2]|0)+284>>2]|0);_b=M?p:D;c[53744]=0;c[53528]=2147483647;D=_b+8|0;c[53662]=c[(c[D>>2]|0)+280>>2];c[53664]=c[(c[D>>2]|0)+284>>2];if(M){k=109;break}else{k=108;break};case 108:ka(172,_b|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=110;break;case 109:ka(138,_b|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=110;break;case 110:$b=c[53744]|0;ac=$b;M=c[ac>>2]&3;bc=$b-32|0;cc=$b+32|0;dc=$b+8|0;ec=(c[(c[(c[((M|0)==2?$b:bc)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((M|0)==3?$b:cc)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[(c[dc>>2]|0)+170>>1]|0)|0;if((ec|0)>0){k=111;break}else{k=118;break};case 111:fc=c[Xb>>2]&3;gc=c[((fc|0)==3?Mb:Yb)+28>>2]|0;hc=c[gc+8>>2]|0;if(((c[hc+272>>2]|0)+(c[hc+264>>2]|0)|0)==1){k=112;break}else{k=113;break};case 112:la(10,gc|0,ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 113:ic=c[((fc|0)==2?Mb:Zb)+28>>2]|0;jc=c[ic+8>>2]|0;if(((c[jc+272>>2]|0)+(c[jc+264>>2]|0)|0)==1){k=114;break}else{k=115;break};case 114:la(10,ic|0,-ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 115:if((c[hc+284>>2]|0)<(c[jc+284>>2]|0)){k=116;break}else{k=117;break};case 116:la(10,gc|0,ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 117:la(10,ic|0,-ec|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=118;break;case 118:kc=Mb+8|0;lc=c[(c[kc>>2]|0)+160>>2]|0;M=c[ac>>2]&3;mc=(c[((M|0)==2?$b:bc)+28>>2]|0)+8|0;nc=c[((M|0)==3?$b:cc)+28>>2]|0;k=119;break;case 119:oc=nc+8|0;pc=c[oc>>2]|0;qc=c[(c[mc>>2]|0)+284>>2]|0;if((c[pc+280>>2]|0)>(qc|0)){k=121;break}else{k=120;break};case 120:if((qc|0)>(c[pc+284>>2]|0)){k=121;break}else{k=125;break};case 121:rc=c[pc+276>>2]|0;sc=rc;tc=rc;uc=rc+32|0;vc=(c[rc+8>>2]|0)+160|0;wc=c[vc>>2]|0;if((nc|0)==(c[((c[tc>>2]&3|0)==3?sc:uc)+28>>2]|0)){k=122;break}else{k=123;break};case 122:c[vc>>2]=wc+lc;k=124;break;case 123:c[vc>>2]=wc-lc;k=124;break;case 124:M=c[tc>>2]&3;D=c[((M|0)==3?sc:uc)+28>>2]|0;p=c[((M|0)==2?sc:rc-32|0)+28>>2]|0;nc=(c[(c[D+8>>2]|0)+284>>2]|0)>(c[(c[p+8>>2]|0)+284>>2]|0)?D:p;k=119;break;case 125:p=c[ac>>2]&3;xc=(c[((p|0)==3?$b:cc)+28>>2]|0)+8|0;yc=c[((p|0)==2?$b:bc)+28>>2]|0;k=126;break;case 126:zc=c[yc+8>>2]|0;Ac=c[(c[xc>>2]|0)+284>>2]|0;if((c[zc+280>>2]|0)>(Ac|0)){k=128;break}else{k=127;break};case 127:if((Ac|0)>(c[zc+284>>2]|0)){k=128;break}else{k=132;break};case 128:Bc=c[zc+276>>2]|0;Cc=Bc;Dc=Bc;Ec=Bc+32|0;Fc=(c[Bc+8>>2]|0)+160|0;Gc=c[Fc>>2]|0;if((yc|0)==(c[((c[Dc>>2]&3|0)==3?Cc:Ec)+28>>2]|0)){k=130;break}else{k=129;break};case 129:c[Fc>>2]=Gc+lc;k=131;break;case 130:c[Fc>>2]=Gc-lc;k=131;break;case 131:p=c[Dc>>2]&3;D=c[((p|0)==3?Cc:Ec)+28>>2]|0;M=c[((p|0)==2?Cc:Bc-32|0)+28>>2]|0;yc=(c[(c[D+8>>2]|0)+284>>2]|0)>(c[(c[M+8>>2]|0)+284>>2]|0)?D:M;k=126;break;case 132:if((yc|0)==(nc|0)){k=134;break}else{k=133;break};case 133:pa(16,1,102368,(E=i,i=i+1|0,i=i+7&-8,c[E>>2]=0,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;la(40,178552,1);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;return 0;case 134:c[(c[dc>>2]|0)+160>>2]=-lc;c[(c[kc>>2]|0)+160>>2]=0;c[(c[dc>>2]|0)+164>>2]=c[(c[kc>>2]|0)+164>>2];c[(c[53508]|0)+(c[(c[kc>>2]|0)+164>>2]<<2)>>2]=$b;c[(c[kc>>2]|0)+164>>2]=-1;Hc=(c[((c[Xb>>2]&3|0)==3?Mb:Yb)+28>>2]|0)+8|0;M=(c[Hc>>2]|0)+272|0;D=c[M>>2]|0;Ic=D-1|0;c[M>>2]=Ic;Jc=c[(c[Hc>>2]|0)+268>>2]|0;if((D|0)<1){Kc=0;k=137;break}else{Lc=0;k=136;break};case 135:if((Lc|0)<(Ic|0)){Lc=Mc;k=136;break}else{Kc=Mc;k=137;break};case 136:Mc=Lc+1|0;if((c[Jc+(Lc<<2)>>2]|0)==(Mb|0)){Kc=Lc;k=137;break}else{k=135;break};case 137:c[Jc+(Kc<<2)>>2]=c[Jc+(Ic<<2)>>2];c[(c[(c[Hc>>2]|0)+268>>2]|0)+(Ic<<2)>>2]=0;Nc=(c[((c[Xb>>2]&3|0)==2?Mb:Zb)+28>>2]|0)+8|0;D=(c[Nc>>2]|0)+264|0;M=c[D>>2]|0;Oc=M-1|0;c[D>>2]=Oc;Pc=c[(c[Nc>>2]|0)+260>>2]|0;if((M|0)<1){Qc=0;k=140;break}else{Rc=0;k=139;break};case 138:if((Rc|0)<(Oc|0)){Rc=Sc;k=139;break}else{Qc=Sc;k=140;break};case 139:Sc=Rc+1|0;if((c[Pc+(Rc<<2)>>2]|0)==(Mb|0)){Qc=Rc;k=140;break}else{k=138;break};case 140:c[Pc+(Qc<<2)>>2]=c[Pc+(Oc<<2)>>2];c[(c[(c[Nc>>2]|0)+260>>2]|0)+(Oc<<2)>>2]=0;M=(c[((c[ac>>2]&3|0)==3?$b:cc)+28>>2]|0)+8|0;D=(c[M>>2]|0)+272|0;p=c[D>>2]|0;c[D>>2]=p+1;c[(c[(c[M>>2]|0)+268>>2]|0)+(p<<2)>>2]=$b;p=(c[M>>2]|0)+268|0;c[(c[p>>2]|0)+(c[p+4>>2]<<2)>>2]=0;p=(c[((c[ac>>2]&3|0)==2?$b:bc)+28>>2]|0)+8|0;M=(c[p>>2]|0)+264|0;D=c[M>>2]|0;c[M>>2]=D+1;c[(c[(c[p>>2]|0)+260>>2]|0)+(D<<2)>>2]=$b;D=(c[p>>2]|0)+260|0;c[(c[D>>2]|0)+(c[D+4>>2]<<2)>>2]=0;D=c[oc>>2]|0;pa(34,nc|0,c[D+276>>2]|0,c[D+280>>2]|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Tc=Pa+1|0;if((a[213992]|0)==0){k=146;break}else{k=141;break};case 141:if(((Tc|0)%100|0|0)==0){k=142;break}else{k=146;break};case 142:Uc=(Tc|0)%1e3|0;if((Uc|0)==100){k=143;break}else{k=144;break};case 143:Aa(42,117448,17,1,Oa|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;pa(30,Oa|0,126920,(E=i,i=i+8|0,c[E>>2]=Tc,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;k=146;break;case 144:pa(30,Oa|0,126920,(E=i,i=i+8|0,c[E>>2]=Tc,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;if((Uc|0)==0){k=145;break}else{k=146;break};case 145:wa(100,10,Oa|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=146;break;case 146:if((Tc|0)<(f|0)){Pa=Tc;k=92;break}else{Wb=Tc;k=147;break};case 147:if((d|0)==1){k=148;break}else if((d|0)==2){k=180;break}else{k=197;break};case 148:c[53654]=2147483647;c[53658]=-2147483647;Vc=(c[53736]|0)+8|0;D=c[(c[Vc>>2]|0)+180>>2]|0;if((D|0)==0){Wc=2147483647;Xc=-2147483647;k=156;break}else{Yc=D;Zc=2147483647;_c=-2147483647;k=149;break};case 149:$c=Yc+8|0;ad=c[$c>>2]|0;if((a[ad+156|0]|0)==0){k=150;break}else{bd=Zc;cd=_c;dd=ad;k=151;break};case 150:D=c[ad+232>>2]|0;p=(Zc|0)<(D|0)?Zc:D;c[53654]=p;D=c[(c[$c>>2]|0)+232>>2]|0;M=(_c|0)>(D|0)?_c:D;c[53658]=M;bd=p;cd=M;dd=c[$c>>2]|0;k=151;break;case 151:M=c[dd+164>>2]|0;if((M|0)==0){k=152;break}else{Yc=M;Zc=bd;_c=cd;k=149;break};case 152:if((bd|0)==0){ed=cd;k=157;break}else{k=153;break};case 153:M=c[(c[Vc>>2]|0)+180>>2]|0;if((M|0)==0){Wc=bd;Xc=cd;k=156;break}else{fd=M;gd=bd;k=154;break};case 154:M=fd+8|0;p=(c[M>>2]|0)+232|0;c[p>>2]=(c[p>>2]|0)-gd;p=c[(c[M>>2]|0)+164>>2]|0;hd=c[53654]|0;if((p|0)==0){k=155;break}else{fd=p;gd=hd;k=154;break};case 155:Wc=hd;Xc=c[53658]|0;k=156;break;case 156:p=Xc-Wc|0;c[53658]=p;c[53654]=0;ed=p;k=157;break;case 157:id=ma(12,(ed<<2)+4|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;jd=id;if((c[53658]|0)<0){k=159;break}else{kd=0;k=158;break};case 158:c[jd+(kd<<2)>>2]=0;if((kd|0)<(c[53658]|0)){kd=kd+1|0;k=158;break}else{k=159;break};case 159:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){k=179;break}else{ld=p;k=160;break};case 160:md=ld+8|0;nd=c[md>>2]|0;if((a[nd+156|0]|0)==0){k=161;break}else{od=nd;k=162;break};case 161:p=jd+(c[nd+232>>2]<<2)|0;c[p>>2]=(c[p>>2]|0)+1;od=c[md>>2]|0;k=162;break;case 162:p=c[od+164>>2]|0;if((p|0)==0){k=163;break}else{ld=p;k=160;break};case 163:p=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((p|0)==0){k=179;break}else{pd=p;k=164;break};case 164:qd=pd+8|0;rd=c[qd>>2]|0;if((a[rd+156|0]|0)==0){k=165;break}else{sd=rd;k=178;break};case 165:td=c[53658]|0;ud=c[rd+172>>2]|0;p=c[ud>>2]|0;if((p|0)==0){vd=0;wd=0;k=167;break}else{xd=0;yd=0;zd=0;Ad=p;k=166;break};case 166:p=c[Ad+8>>2]|0;M=(c[p+156>>2]|0)+zd|0;D=(e[p+170>>1]|0)+(c[(c[(c[((c[Ad>>2]&3|0)==3?Ad:Ad+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0;p=(yd|0)>(D|0)?yd:D;D=xd+1|0;Bd=c[ud+(D<<2)>>2]|0;if((Bd|0)==0){vd=p;wd=M;k=167;break}else{xd=D;yd=p;zd=M;Ad=Bd;k=166;break};case 167:Cd=c[rd+180>>2]|0;Bd=c[Cd>>2]|0;if((Bd|0)==0){Dd=td;Ed=0;k=169;break}else{Fd=0;Gd=td;Hd=0;Id=Bd;k=168;break};case 168:Bd=c[Id+8>>2]|0;M=(c[Bd+156>>2]|0)+Hd|0;p=(c[(c[(c[((c[Id>>2]&3|0)==2?Id:Id-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[Bd+170>>1]|0)|0;Bd=(Gd|0)<(p|0)?Gd:p;p=Fd+1|0;D=c[Cd+(p<<2)>>2]|0;if((D|0)==0){Dd=Bd;Ed=M;k=169;break}else{Fd=p;Gd=Bd;Hd=M;Id=D;k=168;break};case 169:Jd=(vd|0)<0?0:vd;if((wd|0)==(Ed|0)){k=170;break}else{Kd=rd;k=173;break};case 170:if((Jd|0)<(Dd|0)){Ld=Jd;Md=Jd;k=171;break}else{Nd=Jd;k=172;break};case 171:D=Md+1|0;M=(c[jd+(D<<2)>>2]|0)<(c[jd+(Ld<<2)>>2]|0)?D:Ld;if((D|0)<(Dd|0)){Ld=M;Md=D;k=171;break}else{Nd=M;k=172;break};case 172:M=jd+(c[rd+232>>2]<<2)|0;c[M>>2]=(c[M>>2]|0)-1;M=jd+(Nd<<2)|0;c[M>>2]=(c[M>>2]|0)+1;c[(c[qd>>2]|0)+232>>2]=Nd;Kd=c[qd>>2]|0;k=173;break;case 173:Od=c[Kd+260>>2]|0;if((Od|0)==0){Pd=Kd;k=175;break}else{k=174;break};case 174:ka(150,Od|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Pd=c[qd>>2]|0;k=175;break;case 175:Qd=c[Pd+268>>2]|0;if((Qd|0)==0){Rd=Pd;k=177;break}else{k=176;break};case 176:ka(150,Qd|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Rd=c[qd>>2]|0;k=177;break;case 177:a[Rd+157|0]=0;sd=c[qd>>2]|0;k=178;break;case 178:M=c[sd+164>>2]|0;if((M|0)==0){k=179;break}else{pd=M;k=164;break};case 179:ka(150,id|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=212;break;case 180:if((c[53506]|0)>0){Sd=0;k=181;break}else{k=191;break};case 181:Td=c[(c[53508]|0)+(Sd<<2)>>2]|0;if((c[(c[Td+8>>2]|0)+160>>2]|0)==0){k=182;break}else{k=190;break};case 182:Ud=Td;M=c[Ud>>2]&3;Vd=Td+32|0;D=c[((M|0)==3?Td:Vd)+28>>2]|0;Wd=Td-32|0;Bd=c[((M|0)==2?Td:Wd)+28>>2]|0;M=(c[(c[D+8>>2]|0)+284>>2]|0)<(c[(c[Bd+8>>2]|0)+284>>2]|0);Xd=M?D:Bd;c[53744]=0;c[53528]=2147483647;Bd=Xd+8|0;c[53662]=c[(c[Bd>>2]|0)+280>>2];c[53664]=c[(c[Bd>>2]|0)+284>>2];if(M){k=184;break}else{k=183;break};case 183:ka(172,Xd|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=185;break;case 184:ka(138,Xd|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=185;break;case 185:Yd=c[53744]|0;if((Yd|0)==0){k=190;break}else{k=186;break};case 186:M=c[Yd>>2]&3;Zd=(c[(c[(c[((M|0)==2?Yd:Yd-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((M|0)==3?Yd:Yd+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[(c[Yd+8>>2]|0)+170>>1]|0)|0;if((Zd|0)<2){k=190;break}else{k=187;break};case 187:M=c[Ud>>2]&3;_d=c[((M|0)==3?Td:Vd)+28>>2]|0;$d=c[((M|0)==2?Td:Wd)+28>>2]|0;if((c[(c[_d+8>>2]|0)+284>>2]|0)<(c[(c[$d+8>>2]|0)+284>>2]|0)){k=188;break}else{k=189;break};case 188:la(10,_d|0,(Zd|0)/2|0|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=190;break;case 189:la(10,$d|0,(Zd|0)/-2|0|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=190;break;case 190:M=Sd+1|0;if((M|0)<(c[53506]|0)){Sd=M;k=181;break}else{k=191;break};case 191:M=c[(c[(c[53736]|0)+8>>2]|0)+180>>2]|0;if((M|0)==0){k=212;break}else{ae=M;k=192;break};case 192:be=ae+8|0;M=c[be>>2]|0;ce=c[M+260>>2]|0;if((ce|0)==0){de=M;k=194;break}else{k=193;break};case 193:ka(150,ce|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;de=c[be>>2]|0;k=194;break;case 194:ee=c[de+268>>2]|0;if((ee|0)==0){fe=de;k=196;break}else{k=195;break};case 195:ka(150,ee|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;fe=c[be>>2]|0;k=196;break;case 196:a[fe+157|0]=0;M=c[(c[be>>2]|0)+164>>2]|0;if((M|0)==0){k=212;break}else{ae=M;k=192;break};case 197:c[53654]=2147483647;c[53658]=-2147483647;ge=c[53736]|0;he=ge+8|0;M=c[(c[he>>2]|0)+180>>2]|0;if((M|0)==0){ie=2147483647;je=-2147483647;ke=ge;k=205;break}else{le=M;me=2147483647;ne=-2147483647;k=198;break};case 198:oe=le+8|0;pe=c[oe>>2]|0;if((a[pe+156|0]|0)==0){k=199;break}else{qe=me;re=ne;se=pe;k=200;break};case 199:M=c[pe+232>>2]|0;Bd=(me|0)<(M|0)?me:M;c[53654]=Bd;M=c[(c[oe>>2]|0)+232>>2]|0;D=(ne|0)>(M|0)?ne:M;c[53658]=D;qe=Bd;re=D;se=c[oe>>2]|0;k=200;break;case 200:D=c[se+164>>2]|0;if((D|0)==0){k=201;break}else{le=D;me=qe;ne=re;k=198;break};case 201:if((qe|0)==0){te=ge;k=206;break}else{k=202;break};case 202:D=c[(c[he>>2]|0)+180>>2]|0;if((D|0)==0){ie=qe;je=re;ke=ge;k=205;break}else{ue=D;ve=qe;k=203;break};case 203:D=ue+8|0;Bd=(c[D>>2]|0)+232|0;c[Bd>>2]=(c[Bd>>2]|0)-ve;Bd=c[(c[D>>2]|0)+164>>2]|0;we=c[53654]|0;if((Bd|0)==0){k=204;break}else{ue=Bd;ve=we;k=203;break};case 204:ie=we;je=c[53658]|0;ke=c[53736]|0;k=205;break;case 205:c[53658]=je-ie;c[53654]=0;te=ke;k=206;break;case 206:Bd=c[(c[te+8>>2]|0)+180>>2]|0;if((Bd|0)==0){k=212;break}else{xe=Bd;k=207;break};case 207:ye=xe+8|0;Bd=c[ye>>2]|0;ze=c[Bd+260>>2]|0;if((ze|0)==0){Ae=Bd;k=209;break}else{k=208;break};case 208:ka(150,ze|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ae=c[ye>>2]|0;k=209;break;case 209:Be=c[Ae+268>>2]|0;if((Be|0)==0){Ce=Ae;k=211;break}else{k=210;break};case 210:ka(150,Be|0);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;Ce=c[ye>>2]|0;k=211;break;case 211:a[Ce+157|0]=0;Bd=c[(c[ye>>2]|0)+164>>2]|0;if((Bd|0)==0){k=212;break}else{xe=Bd;k=207;break};case 212:if((a[213992]|0)==0){Ga=0;k=216;break}else{k=213;break};case 213:if((Wb|0)>99){k=214;break}else{k=215;break};case 214:wa(100,10,Oa|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;k=215;break;case 215:Bd=c[53608]|0;D=c[53634]|0;De=+xa(2);if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;pa(30,Oa|0,114976,(E=i,i=i+40|0,c[E>>2]=117448,c[E+8>>2]=Bd,c[E+16>>2]=D,c[E+24>>2]=Wb,h[E+32>>3]=De,E)|0)|0;if((u|0)!=0&(v|0)!=0){l=CF(c[u>>2]|0,m)|0;if((l|0)>0){k=-1;break}else return 0}u=v=0;i=E;Ga=0;k=216;break;case 216:i=j;return Ga|0;case-1:if((l|0)==54){Na=v;k=217}u=v=0;break}return 0}function ok(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ew(a|0,108080)|0;if((d|0)==0){e=30}else{e=Rb(d|0)|0}return nk(a,b,c,e)|0}function pk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=a+8|0;a=(c[d>>2]|0)+232|0;c[a>>2]=(c[a>>2]|0)-b;a=c[d>>2]|0;e=c[c[a+268>>2]>>2]|0;if((e|0)==0){f=a}else{g=0;h=a;a=e;while(1){if((a|0)==(c[h+276>>2]|0)){i=h}else{pk(c[((c[a>>2]&3|0)==2?a:a-32|0)+28>>2]|0,b);i=c[d>>2]|0}e=g+1|0;j=c[(c[i+268>>2]|0)+(e<<2)>>2]|0;if((j|0)==0){f=i;break}else{g=e;h=i;a=j}}}a=c[c[f+260>>2]>>2]|0;if((a|0)==0){return}else{k=0;l=f;m=a}while(1){if((m|0)==(c[l+276>>2]|0)){n=l}else{pk(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0,b);n=c[d>>2]|0}a=k+1|0;f=c[(c[n+260>>2]|0)+(a<<2)>>2]|0;if((f|0)==0){break}else{k=a;l=n;m=f}}return}function qk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=a+8|0;c[(c[e>>2]|0)+276>>2]=b;c[(c[e>>2]|0)+280>>2]=d;a=c[e>>2]|0;f=c[c[a+268>>2]>>2]|0;if((f|0)==0){g=d;h=a}else{i=0;j=d;d=f;f=a;while(1){if((d|0)==(b|0)){k=j;l=f}else{a=qk(c[((c[d>>2]&3|0)==2?d:d-32|0)+28>>2]|0,d,j)|0;k=a;l=c[e>>2]|0}a=i+1|0;m=c[(c[l+268>>2]|0)+(a<<2)>>2]|0;if((m|0)==0){g=k;h=l;break}else{i=a;j=k;d=m;f=l}}}l=c[c[h+260>>2]>>2]|0;if((l|0)==0){n=g;o=h;p=o+284|0;q=n;c[p>>2]=q;r=n+1|0;return r|0}else{s=0;t=g;u=l;v=h}while(1){if((u|0)==(b|0)){w=t;x=v}else{h=qk(c[((c[u>>2]&3|0)==3?u:u+32|0)+28>>2]|0,u,t)|0;w=h;x=c[e>>2]|0}h=s+1|0;l=c[(c[x+260>>2]|0)+(h<<2)>>2]|0;if((l|0)==0){n=w;o=x;break}else{s=h;t=w;u=l;v=x}}p=o+284|0;q=n;c[p>>2]=q;r=n+1|0;return r|0}function rk(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+8|0;a=c[b>>2]|0;d=c[c[a+180>>2]>>2]|0;if((d|0)==0){f=a}else{g=0;h=a;a=d;while(1){d=c[a+8>>2]|0;do{if((c[d+164>>2]|0)<0){i=c[a>>2]&3;j=c[(c[((i|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0;k=c[j+284>>2]|0;if(!((c[53662]|0)>(k|0)|(k|0)>(c[53664]|0))){break}k=(c[j+232>>2]|0)-(c[(c[(c[((i|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(e[d+170>>1]|0)|0;if(!((k|0)<(c[53528]|0)|(c[53744]|0)==0)){break}c[53744]=a;c[53528]=k}else{k=c[((c[a>>2]&3|0)==2?a:a-32|0)+28>>2]|0;if((c[(c[k+8>>2]|0)+284>>2]|0)>=(c[h+284>>2]|0)){break}rk(k)}}while(0);d=g+1|0;k=c[b>>2]|0;i=c[(c[k+180>>2]|0)+(d<<2)>>2]|0;if((i|0)==0){f=k;break}else{g=d;h=k;a=i}}}a=c[c[f+260>>2]>>2]|0;h=c[53528]|0;if((a|0)!=0&(h|0)>0){l=0;m=f;n=a;o=h}else{return}while(1){h=c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0;if((c[(c[h+8>>2]|0)+284>>2]|0)<(c[m+284>>2]|0)){rk(h);p=c[b>>2]|0;q=c[53528]|0}else{p=m;q=o}h=l+1|0;a=c[(c[p+260>>2]|0)+(h<<2)>>2]|0;if((a|0)!=0&(q|0)>0){l=h;m=p;n=a;o=q}else{break}}return}function sk(a){a=a|0;var b=0,d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a+8|0;a=c[b>>2]|0;d=c[c[a+172>>2]>>2]|0;if((d|0)==0){f=a}else{g=0;h=a;a=d;while(1){d=c[a+8>>2]|0;do{if((c[d+164>>2]|0)<0){i=c[a>>2]&3;j=c[(c[((i|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0;k=c[j+284>>2]|0;if(!((c[53662]|0)>(k|0)|(k|0)>(c[53664]|0))){break}k=(c[(c[(c[((i|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[j+232>>2]|0)-(e[d+170>>1]|0)|0;if(!((k|0)<(c[53528]|0)|(c[53744]|0)==0)){break}c[53744]=a;c[53528]=k}else{k=c[((c[a>>2]&3|0)==3?a:a+32|0)+28>>2]|0;if((c[(c[k+8>>2]|0)+284>>2]|0)>=(c[h+284>>2]|0)){break}sk(k)}}while(0);d=g+1|0;k=c[b>>2]|0;j=c[(c[k+172>>2]|0)+(d<<2)>>2]|0;if((j|0)==0){f=k;break}else{g=d;h=k;a=j}}}a=c[c[f+268>>2]>>2]|0;h=c[53528]|0;if((a|0)!=0&(h|0)>0){l=0;m=f;n=a;o=h}else{return}while(1){h=c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0;if((c[(c[h+8>>2]|0)+284>>2]|0)<(c[m+284>>2]|0)){sk(h);p=c[b>>2]|0;q=c[53528]|0}else{p=m;q=o}h=l+1|0;a=c[(c[p+268>>2]|0)+(h<<2)>>2]|0;if((a|0)!=0&(q|0)>0){l=h;m=p;n=a;o=q}else{break}}return}function tk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;d=a+8|0;a=c[d>>2]|0;e=c[c[a+268>>2]>>2]|0;if((e|0)==0){f=a}else{g=0;h=e;e=a;while(1){if((h|0)==(b|0)){i=e}else{tk(c[((c[h>>2]&3|0)==2?h:h-32|0)+28>>2]|0,h);i=c[d>>2]|0}a=g+1|0;j=c[(c[i+268>>2]|0)+(a<<2)>>2]|0;if((j|0)==0){f=i;break}else{g=a;h=j;e=i}}}i=c[c[f+260>>2]>>2]|0;if((i|0)!=0){e=0;h=i;i=f;while(1){if((h|0)==(b|0)){k=i}else{tk(c[((c[h>>2]&3|0)==3?h:h+32|0)+28>>2]|0,h);k=c[d>>2]|0}f=e+1|0;g=c[(c[k+260>>2]|0)+(f<<2)>>2]|0;if((g|0)==0){break}else{e=f;h=g;i=k}}}if((b|0)==0){return}k=c[b>>2]&3;i=c[((k|0)==3?b:b+32|0)+28>>2]|0;h=c[i+8>>2]|0;if((c[h+276>>2]|0)==(b|0)){l=1;m=i;n=h}else{h=c[((k|0)==2?b:b-32|0)+28>>2]|0;l=-1;m=h;n=c[h+8>>2]|0}h=c[n+180>>2]|0;k=c[h>>2]|0;if((k|0)==0){o=0}else{i=c[n+280>>2]|0;e=n+284|0;if((l|0)>0){d=0;g=0;f=k;while(1){j=c[f>>2]&3;a=c[((j|0)==3?f:f+32|0)+28>>2]|0;if((a|0)==(m|0)){p=c[((j|0)==2?f:f-32|0)+28>>2]|0}else{p=a}a=c[(c[p+8>>2]|0)+284>>2]|0;do{if((i|0)>(a|0)){q=21}else{if((a|0)>(c[e>>2]|0)){q=21;break}r=c[f+8>>2]|0;if((c[r+164>>2]|0)>-1){s=c[r+160>>2]|0}else{s=0}t=1;u=s-(c[r+156>>2]|0)|0}}while(0);if((q|0)==21){q=0;t=0;u=c[(c[f+8>>2]|0)+156>>2]|0}a=(c[((j|0)==2?f:f-32|0)+28>>2]|0)==(m|0)?1:-1;r=(((t?a:-a|0)|0)<0?-u|0:u)+g|0;a=d+1|0;v=c[h+(a<<2)>>2]|0;if((v|0)==0){o=r;break}else{d=a;g=r;f=v}}}else{f=0;g=0;d=k;while(1){k=c[d>>2]&3;u=c[((k|0)==3?d:d+32|0)+28>>2]|0;t=(u|0)==(m|0);if(t){w=c[((k|0)==2?d:d-32|0)+28>>2]|0}else{w=u}u=c[(c[w+8>>2]|0)+284>>2]|0;do{if((i|0)>(u|0)){q=38}else{if((u|0)>(c[e>>2]|0)){q=38;break}k=c[d+8>>2]|0;if((c[k+164>>2]|0)>-1){x=c[k+160>>2]|0}else{x=0}y=1;z=x-(c[k+156>>2]|0)|0}}while(0);if((q|0)==38){q=0;y=0;z=c[(c[d+8>>2]|0)+156>>2]|0}u=t?1:-1;j=(((y?u:-u|0)|0)<0?-z|0:z)+g|0;u=f+1|0;k=c[h+(u<<2)>>2]|0;if((k|0)==0){o=j;break}else{f=u;g=j;d=k}}}}d=c[n+172>>2]|0;g=c[d>>2]|0;if((g|0)==0){A=o}else{f=c[n+280>>2]|0;h=n+284|0;if((l|0)>0){l=0;n=o;z=g;while(1){y=c[z>>2]&3;x=c[((y|0)==3?z:z+32|0)+28>>2]|0;if((x|0)==(m|0)){B=c[((y|0)==2?z:z-32|0)+28>>2]|0}else{B=x}x=c[(c[B+8>>2]|0)+284>>2]|0;do{if((f|0)>(x|0)){q=32}else{if((x|0)>(c[h>>2]|0)){q=32;break}e=c[z+8>>2]|0;if((c[e+164>>2]|0)>-1){C=c[e+160>>2]|0}else{C=0}D=1;E=C-(c[e+156>>2]|0)|0}}while(0);if((q|0)==32){q=0;D=0;E=c[(c[z+8>>2]|0)+156>>2]|0}x=(c[((y|0)==2?z:z-32|0)+28>>2]|0)==(m|0)?1:-1;t=(((D?x:-x|0)|0)<0?-E|0:E)+n|0;x=l+1|0;e=c[d+(x<<2)>>2]|0;if((e|0)==0){A=t;break}else{l=x;n=t;z=e}}}else{z=0;n=o;o=g;while(1){g=c[o>>2]&3;l=c[((g|0)==3?o:o+32|0)+28>>2]|0;E=(l|0)==(m|0);if(E){F=c[((g|0)==2?o:o-32|0)+28>>2]|0}else{F=l}l=c[(c[F+8>>2]|0)+284>>2]|0;do{if((f|0)>(l|0)){q=47}else{if((l|0)>(c[h>>2]|0)){q=47;break}g=c[o+8>>2]|0;if((c[g+164>>2]|0)>-1){G=c[g+160>>2]|0}else{G=0}H=1;I=G-(c[g+156>>2]|0)|0}}while(0);if((q|0)==47){q=0;H=0;I=c[(c[o+8>>2]|0)+156>>2]|0}l=E?1:-1;y=(((H?l:-l|0)|0)<0?-I|0:I)+n|0;l=z+1|0;g=c[d+(l<<2)>>2]|0;if((g|0)==0){A=y;break}else{z=l;n=y;o=g}}}}c[(c[b+8>>2]|0)+160>>2]=A;return}function uk(b){b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=b+8|0;b=c[d>>2]|0;f=c[c[b+180>>2]>>2]|0;a:do{if((f|0)==0){g=b}else{h=0;i=f;j=b;b:while(1){k=i;l=c[k>>2]&3;m=i-32|0;n=c[(c[((l|0)==2?i:m)+28>>2]|0)+8>>2]|0;do{if((a[n+157|0]|0)==0){if(((c[n+232>>2]|0)-(c[(c[(c[((l|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)!=(e[(c[i+8>>2]|0)+170>>1]|0)){o=j;break}vk(i);if((c[53506]|0)==((c[53608]|0)-1|0)){p=1;q=15;break b}if((uk(c[((c[k>>2]&3|0)==2?i:m)+28>>2]|0)|0)!=0){p=1;q=15;break b}o=c[d>>2]|0}else{o=j}}while(0);m=h+1|0;k=c[(c[o+180>>2]|0)+(m<<2)>>2]|0;if((k|0)==0){g=o;break a}else{h=m;i=k;j=o}}if((q|0)==15){return p|0}}}while(0);o=c[c[g+172>>2]>>2]|0;if((o|0)==0){p=0;return p|0}else{r=0;s=o;t=g}c:while(1){g=s;o=c[g>>2]&3;b=s+32|0;f=c[(c[((o|0)==3?s:b)+28>>2]|0)+8>>2]|0;do{if((a[f+157|0]|0)==0){if(((c[(c[(c[((o|0)==2?s:s-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[f+232>>2]|0)|0)!=(e[(c[s+8>>2]|0)+170>>1]|0)){u=t;break}vk(s);if((c[53506]|0)==((c[53608]|0)-1|0)){p=1;q=15;break c}if((uk(c[((c[g>>2]&3|0)==3?s:b)+28>>2]|0)|0)!=0){p=1;q=15;break c}u=c[d>>2]|0}else{u=t}}while(0);b=r+1|0;g=c[(c[u+172>>2]|0)+(b<<2)>>2]|0;if((g|0)==0){p=0;q=15;break}else{r=b;s=g;t=u}}if((q|0)==15){return p|0}return 0}function vk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=(c[b+8>>2]|0)+164|0;if((c[e>>2]|0)>-1){Fv(1,96648,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;rc(178552,1)}c[e>>2]=c[53506];e=c[53506]|0;c[53506]=e+1;c[(c[53508]|0)+(e<<2)>>2]=b;e=b;g=c[e>>2]|0;h=b+32|0;j=c[((g&3|0)==3?b:h)+28>>2]|0;if((a[(c[j+8>>2]|0)+157|0]|0)==0){k=c[53502]|0;c[53502]=k+1;c[(c[53504]|0)+(k<<2)>>2]=j;l=c[e>>2]|0}else{l=g}g=b-32|0;j=c[((l&3|0)==2?b:g)+28>>2]|0;if((a[(c[j+8>>2]|0)+157|0]|0)==0){k=c[53502]|0;c[53502]=k+1;c[(c[53504]|0)+(k<<2)>>2]=j;m=c[e>>2]|0}else{m=l}l=(c[((m&3|0)==3?b:h)+28>>2]|0)+8|0;a[(c[l>>2]|0)+157|0]=1;h=(c[l>>2]|0)+272|0;m=c[h>>2]|0;c[h>>2]=m+1;c[(c[(c[l>>2]|0)+268>>2]|0)+(m<<2)>>2]=b;m=(c[l>>2]|0)+268|0;c[(c[m>>2]|0)+(c[m+4>>2]<<2)>>2]=0;m=c[l>>2]|0;if((c[(c[m+180>>2]|0)+((c[m+272>>2]|0)-1<<2)>>2]|0)==0){Fv(1,91288,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;rc(178552,1)}m=(c[((c[e>>2]&3|0)==2?b:g)+28>>2]|0)+8|0;a[(c[m>>2]|0)+157|0]=1;g=(c[m>>2]|0)+264|0;e=c[g>>2]|0;c[g>>2]=e+1;c[(c[(c[m>>2]|0)+260>>2]|0)+(e<<2)>>2]=b;b=(c[m>>2]|0)+260|0;c[(c[b>>2]|0)+(c[b+4>>2]<<2)>>2]=0;b=c[m>>2]|0;if((c[(c[b+172>>2]|0)+((c[b+264>>2]|0)-1<<2)>>2]|0)==0){Fv(1,86104,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;rc(178552,1)}else{i=d;return}}function wk(a){a=+a;var b=0.0;if((c[53492]|0)==0){b=a;return+b}b=+h[21426]-a;return+b}function xk(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0,L=0.0;g=i;i=i+1024|0;j=c[(c[(c[d+52>>2]|0)+8>>2]|0)+4>>2]|0;c[43802]=j;k=d+8|0;if((c[53492]|0)!=0){l=c[k>>2]|0;m=+h[l+40>>3]+ +h[l+24>>3];h[21426]=m;h[21427]=m/72.0}l=c[k>>2]|0;m=+h[l+32>>3];n=+h[l+40>>3];o=+h[b+352>>3];b=g|0;l=e;Oc[j&255](l,117392)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=o,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=m/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;a[212960]=10;Oc[c[43802]&255](l,212960)|0;k=ux(d)|0;if((k|0)!=0){p=k;do{k=p+8|0;if((a[(c[k>>2]|0)+118|0]|0)==0){q=p|0;r=Dy($w(q)|0)|0;Oc[c[43802]&255](l,126896)|0;Oc[c[43802]&255](l,r)|0;r=c[k>>2]|0;n=+h[r+24>>3];m=+h[r+16>>3]/72.0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=m,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((c[53492]|0)==0){s=n}else{s=+h[21426]-n}Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=s/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((a[(c[(c[k>>2]|0)+104>>2]|0)+82|0]|0)==0){r=Hx(q)|0;t=dy(r,c[c[(c[k>>2]|0)+104>>2]>>2]|0)|0;u=Dy(t)|0;fy(r,t)|0;v=u}else{v=Dy(fw(q,c[53614]|0)|0)|0}n=+h[(c[k>>2]|0)+32>>3];Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;n=+h[(c[k>>2]|0)+40>>3];Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,v)|0;u=Im(q,c[53582]|0,114968)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,u)|0;u=c[c[(c[k>>2]|0)+8>>2]>>2]|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,u)|0;u=Im(q,c[53644]|0,108072)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,u)|0;u=Im(q,c[53632]|0,213368)|0;if((a[u]|0)==0){w=Im(q,c[53644]|0,96632)|0}else{w=u}Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,w)|0;a[212960]=10;Oc[c[43802]&255](l,212960)|0}p=vx(d,p)|0;}while((p|0)!=0)}p=ux(d)|0;if((p|0)==0){x=c[43802]|0;y=Oc[x&255](l,167632)|0;i=g;return}w=f<<24>>24==0;f=p;do{p=mw(d,f)|0;if((p|0)!=0){v=p;do{if(w){z=213368;A=213368}else{p=v|0;u=ew(p,91272)|0;q=ew(p,86088)|0;z=(q|0)!=0?q:213368;A=(u|0)!=0?u:213368}u=v+8|0;q=c[u>>2]|0;p=c[q+8>>2]|0;do{if((p|0)==0){B=q}else{k=c[p+4>>2]|0;if((k|0)>0){t=c[p>>2]|0;r=0;C=0;while(1){D=(c[t+(C*48|0)+4>>2]|0)+r|0;E=C+1|0;if((E|0)<(k|0)){r=D;C=E}else{F=D;break}}}else{F=0}Oc[c[43802]&255](l,81384)|0;C=v;yk(e,c[((c[C>>2]&3|0)==3?v:v+32|0)+28>>2]|0,A);yk(e,c[((c[C>>2]&3|0)==2?v:v-32|0)+28>>2]|0,z);Oc[c[43802]&255](l,156424)|0;nb(b|0,113688,(j=i,i=i+8|0,c[j>>2]=F,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;C=c[u>>2]|0;r=c[C+8>>2]|0;if((c[r+4>>2]|0)>0){G=0;H=r;I=C}else{B=C;break}while(1){C=c[H>>2]|0;r=c[C+(G*48|0)>>2]|0;k=c[C+(G*48|0)+4>>2]|0;if((k|0)>0){C=0;do{s=+h[r+(C<<4)+8>>3];n=+h[r+(C<<4)>>3]/72.0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((c[53492]|0)==0){J=s}else{J=+h[21426]-s}Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=J/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;C=C+1|0;}while((C|0)<(k|0));K=c[u>>2]|0}else{K=I}k=G+1|0;C=c[K+8>>2]|0;if((k|0)<(c[C+4>>2]|0)){G=k;H=C;I=K}else{B=K;break}}}}while(0);if((c[B+96>>2]|0)!=0){p=Hx(c[((c[v>>2]&3|0)==3?v:v+32|0)+28>>2]|0)|0;q=dy(p,c[c[(c[u>>2]|0)+96>>2]>>2]|0)|0;C=Dy(q)|0;fy(p,q)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,C)|0;C=c[(c[u>>2]|0)+96>>2]|0;s=+h[C+64>>3];n=+h[C+56>>3]/72.0;Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=n,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;if((c[53492]|0)==0){L=s}else{L=+h[21426]-s}Oc[c[43802]&255](l,156424)|0;nb(b|0,121728,(j=i,i=i+8|0,h[j>>3]=L/72.0,j)|0)|0;i=j;Oc[c[43802]&255](l,b)|0;}C=v|0;q=Im(C,c[53760]|0,114968)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,q)|0;q=Im(C,c[53816]|0,108072)|0;Oc[c[43802]&255](l,156424)|0;Oc[c[43802]&255](l,q)|0;a[212960]=10;Oc[c[43802]&255](l,212960)|0;v=ow(d,v)|0;}while((v|0)!=0)}f=vx(d,f)|0;}while((f|0)!=0);x=c[43802]|0;y=Oc[x&255](l,167632)|0;i=g;return}function yk(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=d|0;if((a[(c[d+8>>2]|0)+118|0]|0)==0){g=Dy($w(f)|0)|0}else{d=Hx(f)|0;h=dy(d,(gb($w(f)|0,58)|0)+1|0)|0;f=Dy(h)|0;fy(d,h)|0;g=f}f=b;Oc[c[43802]&255](f,156424)|0;Oc[c[43802]&255](f,g)|0;if((e|0)==0){return}if((a[e]|0)==0){return}g=Dy(e)|0;Oc[c[43802]&255](f,113176)|0;Oc[c[43802]&255](f,g)|0;return}function zk(d,f,g){d=d|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0.0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0,ta=0,ua=0,va=0.0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0.0,Fa=0,Ga=0.0,Ha=0,Ia=0.0,Ja=0.0;j=i;i=i+2064|0;k=j+2048|0;l=d+8|0;m=(e[(c[l>>2]|0)+170>>1]|0)>>>0>2>>>0;Zh(1);if((c[53492]|0)!=0){n=c[l>>2]|0;o=+h[n+40>>3]+ +h[n+24>>3];h[21426]=o;h[21427]=o/72.0}Iv(k,1024,j+1024|0);en(d,1,163480,213368)|0;en(d,1,159400,213368)|0;c[53574]=en(d,1,154328,213368)|0;c[53618]=en(d,1,151232,213368)|0;en(d,2,163480,213368)|0;n=a[(c[l>>2]|0)+113|0]|0;if((n&16)==0){p=n}else{en(d,1,148272,213368)|0;p=a[(c[l>>2]|0)+113|0]|0}if((p&1)==0){q=p}else{en(d,2,145120,213368)|0;q=a[(c[l>>2]|0)+113|0]|0}if((q&32)==0){r=q}else{en(d,2,148272,213368)|0;r=a[(c[l>>2]|0)+113|0]|0}if((r&2)==0){s=r}else{en(d,2,142144,213368)|0;s=a[(c[l>>2]|0)+113|0]|0}if((s&4)==0){t=s}else{en(d,2,139048,213368)|0;t=a[(c[l>>2]|0)+113|0]|0}if((t&8)==0){u=0;v=0;w=0}else{t=en(d,0,145120,213368)|0;s=en(d,0,136496,213368)|0;u=en(d,0,133672,213368)|0;v=s;w=t}t=en(d,0,131552,213368)|0;s=ux(d)|0;if((s|0)==0){x=0;y=0}else{r=j|0;q=k+4|0;p=k+8|0;n=k|0;z=s;s=0;A=0;while(1){B=z+8|0;C=c[B>>2]|0;o=+h[C+16>>3];D=(c[53492]|0)!=0;if(m){if(D){E=+h[21426]- +h[C+24>>3]}else{E=+h[C+24>>3]}F=+h[(c[C+132>>2]|0)+16>>3]*72.0;nb(r|0,129264,(G=i,i=i+24|0,h[G>>3]=o,h[G+8>>3]=E,h[G+16>>3]=F,G)|0)|0;i=G;Lv(k,r)|0;if((e[(c[l>>2]|0)+170>>1]|0)>>>0>3>>>0){H=3;do{nb(r|0,126056,(G=i,i=i+8|0,h[G>>3]=+h[(c[(c[B>>2]|0)+132>>2]|0)+(H<<3)>>3]*72.0,G)|0)|0;i=G;Lv(k,r)|0;H=H+1|0;}while((H|0)<(e[(c[l>>2]|0)+170>>1]|0))}H=c[q>>2]|0;if(H>>>0<(c[p>>2]|0)>>>0){I=H}else{Jv(k,1)|0;I=c[q>>2]|0}a[I]=0;H=c[n>>2]|0;c[q>>2]=H;gw(z|0,163480,H)|0}else{if(D){J=+h[21426]- +h[C+24>>3]}else{J=+h[C+24>>3]}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=o,h[G+8>>3]=J,G)|0)|0;i=G;gw(z|0,163480,r)|0}nb(r|0,121728,(G=i,i=i+8|0,h[G>>3]=+h[(c[B>>2]|0)+80>>3]/72.0,G)|0)|0;i=G;H=z|0;hw(H,c[53618]|0,r)|0;K=c[B>>2]|0;nb(r|0,121728,(G=i,i=i+8|0,h[G>>3]=(+h[K+88>>3]+ +h[K+96>>3])/72.0,G)|0)|0;i=G;hw(H,c[53574]|0,r)|0;K=c[B>>2]|0;L=c[K+108>>2]|0;do{if((L|0)==0){M=K}else{if((a[L+81|0]|0)==0){M=K;break}F=+h[L+64>>3];if((c[53492]|0)==0){N=F}else{N=+h[21426]-F}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=N,G)|0)|0;i=G;gw(H,148272,r)|0;M=c[B>>2]|0}}while(0);do{if((Ya(c[c[M+8>>2]>>2]|0,120856)|0)==0){Ak(z,c[M+12>>2]|0,k);Nv(k)|0;L=c[q>>2]|0;if(L>>>0<(c[p>>2]|0)>>>0){O=L}else{Jv(k,1)|0;O=c[q>>2]|0}a[O]=0;L=c[n>>2]|0;c[q>>2]=L;gw(H,159400,L)|0}else{if((c[53580]|0)==0){break}if((tl(z)|0)<<24>>24==0){break}L=c[(c[B>>2]|0)+12>>2]|0;K=L+8|0;C=c[K>>2]|0;if((C|0)<3){D=ew(H,120104)|0;if((D|0)==0){P=8}else{P=Rb(D|0)|0}D=(P|0)<3?8:P;if((D|0)>0){Q=D;R=45}}else{Q=C;R=45}if((R|0)==45){R=0;C=L+44|0;o=+(Q|0);L=0;do{if((L|0)>0){D=c[q>>2]|0;if(D>>>0<(c[p>>2]|0)>>>0){S=D}else{Jv(k,1)|0;S=c[q>>2]|0}c[q>>2]=S+1;a[S]=32}if((c[K>>2]|0)>2){D=c[C>>2]|0;if((c[53492]|0)==0){T=+h[D+(L<<4)+8>>3]/72.0}else{T=+h[21427]- +h[D+(L<<4)+8>>3]/72.0}nb(r|0,119288,(G=i,i=i+16|0,h[G>>3]=+h[D+(L<<4)>>3]/72.0,h[G+8>>3]=T,G)|0)|0;i=G}else{D=c[B>>2]|0;F=+(L|0)/o*3.141592653589793*2.0;U=+h[D+32>>3]*.5*+V(F);if((c[53492]|0)==0){X=+h[D+40>>3]*.5*+W(F)}else{X=+h[21427]- +h[D+40>>3]*.5*+W(F)}nb(r|0,119288,(G=i,i=i+16|0,h[G>>3]=U,h[G+8>>3]=X,G)|0)|0;i=G}Lv(k,r)|0;L=L+1|0;}while((L|0)<(Q|0))}L=c[53580]|0;C=c[q>>2]|0;if(C>>>0<(c[p>>2]|0)>>>0){Y=C}else{Jv(k,1)|0;Y=c[q>>2]|0}a[Y]=0;C=c[n>>2]|0;c[q>>2]=C;hw(H,L,C)|0}}while(0);do{if((c[53522]|0)>0){H=mw(d,z)|0;if((H|0)==0){Z=A;_=s;break}else{$=H;aa=s;ba=A}while(1){H=$+8|0;B=c[H>>2]|0;do{if((a[B+112|0]|0)==6){ca=ba;da=aa}else{C=c[B+8>>2]|0;if((C|0)==0){ca=ba;da=aa;break}if((c[C+4>>2]|0)>0){C=0;L=aa;K=ba;D=B;while(1){if((C|0)>0){ea=c[q>>2]|0;if(ea>>>0<(c[p>>2]|0)>>>0){fa=ea}else{Jv(k,1)|0;fa=c[q>>2]|0}c[q>>2]=fa+1;a[fa]=59;ga=c[H>>2]|0}else{ga=D}ea=c[ga+8>>2]|0;ha=c[ea>>2]|0;if((c[ha+(C*48|0)+8>>2]|0)==0){ia=L;ja=ga;ka=ea;la=ha}else{if((c[53492]|0)==0){ma=+h[ha+(C*48|0)+24>>3]}else{ma=+h[21426]- +h[ha+(C*48|0)+24>>3]}nb(r|0,118616,(G=i,i=i+16|0,h[G>>3]=+h[ha+(C*48|0)+16>>3],h[G+8>>3]=ma,G)|0)|0;i=G;Lv(k,r)|0;ha=c[H>>2]|0;ea=c[ha+8>>2]|0;ia=1;ja=ha;ka=ea;la=c[ea>>2]|0}if((c[la+(C*48|0)+12>>2]|0)==0){na=K;oa=ja;pa=ka;qa=la}else{if((c[53492]|0)==0){ra=+h[la+(C*48|0)+40>>3]}else{ra=+h[21426]- +h[la+(C*48|0)+40>>3]}nb(r|0,117672,(G=i,i=i+16|0,h[G>>3]=+h[la+(C*48|0)+32>>3],h[G+8>>3]=ra,G)|0)|0;i=G;Lv(k,r)|0;ea=c[H>>2]|0;ha=c[ea+8>>2]|0;na=1;oa=ea;pa=ha;qa=c[ha>>2]|0}if((c[qa+(C*48|0)+4>>2]|0)>0){ha=0;ea=oa;while(1){if((ha|0)>0){sa=c[q>>2]|0;if(sa>>>0<(c[p>>2]|0)>>>0){ta=sa}else{Jv(k,1)|0;ta=c[q>>2]|0}c[q>>2]=ta+1;a[ta]=32;ua=c[H>>2]|0}else{ua=ea}sa=c[(c[c[ua+8>>2]>>2]|0)+(C*48|0)>>2]|0;o=+h[sa+(ha<<4)+8>>3];if((c[53492]|0)==0){va=o}else{va=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[sa+(ha<<4)>>3],h[G+8>>3]=va,G)|0)|0;i=G;Lv(k,r)|0;sa=ha+1|0;wa=c[H>>2]|0;xa=c[wa+8>>2]|0;if((sa|0)<(c[(c[xa>>2]|0)+(C*48|0)+4>>2]|0)){ha=sa;ea=wa}else{ya=wa;za=xa;break}}}else{ya=oa;za=pa}ea=C+1|0;if((ea|0)<(c[za+4>>2]|0)){C=ea;L=ia;K=na;D=ya}else{Aa=ia;Ba=na;break}}}else{Aa=aa;Ba=ba}D=$|0;K=c[q>>2]|0;if(K>>>0<(c[p>>2]|0)>>>0){Ca=K}else{Jv(k,1)|0;Ca=c[q>>2]|0}a[Ca]=0;K=c[n>>2]|0;c[q>>2]=K;gw(D,163480,K)|0;K=c[H>>2]|0;L=c[K+96>>2]|0;if((L|0)==0){Da=K}else{o=+h[L+64>>3];if((c[53492]|0)==0){Ea=o}else{Ea=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ea,G)|0)|0;i=G;gw(D,145120,r)|0;Da=c[H>>2]|0}L=c[Da+108>>2]|0;do{if((L|0)==0){Fa=Da}else{if((a[L+81|0]|0)==0){Fa=Da;break}o=+h[L+64>>3];if((c[53492]|0)==0){Ga=o}else{Ga=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ga,G)|0)|0;i=G;gw(D,148272,r)|0;Fa=c[H>>2]|0}}while(0);L=c[Fa+100>>2]|0;if((L|0)==0){Ha=Fa}else{o=+h[L+64>>3];if((c[53492]|0)==0){Ia=o}else{Ia=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ia,G)|0)|0;i=G;gw(D,142144,r)|0;Ha=c[H>>2]|0}L=c[Ha+104>>2]|0;if((L|0)==0){ca=Ba;da=Aa;break}o=+h[L+64>>3];if((c[53492]|0)==0){Ja=o}else{Ja=+h[21426]-o}nb(r|0,123584,(G=i,i=i+16|0,h[G>>3]=+h[L+56>>3],h[G+8>>3]=Ja,G)|0)|0;i=G;gw(D,139048,r)|0;ca=Ba;da=Aa}}while(0);H=ow(d,$)|0;if((H|0)==0){Z=ca;_=da;break}else{$=H;aa=da;ba=ca}}}else{Z=A;_=s}}while(0);H=vx(d,z)|0;if((H|0)==0){x=_;y=Z;break}else{z=H;s=_;A=Z}}}Bk(d,t,w,v,u);Mv(k);if((b[(c[l>>2]|0)+128>>1]&1)==0){c[f>>2]=x;c[g>>2]=y;Zh(0);i=j;return}dn(d);c[f>>2]=x;c[g>>2]=y;Zh(0);i=j;return}function Ak(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0;e=i;i=i+1024|0;f=b+48|0;g=c[f>>2]|0;if((g|0)==0){j=e|0;k=c[a+8>>2]|0;l=+h[k+16>>3];if((c[53492]|0)==0){m=+h[k+24>>3];n=+h[b+40>>3]+m;o=+h[b+24>>3]+m}else{m=+h[k+24>>3];n=+h[21426]-(+h[b+40>>3]+m);o=+h[21426]-(+h[b+24>>3]+m)}m=+h[b+32>>3]+l;nb(j|0,114432,(k=i,i=i+32|0,h[k>>3]=+h[b+16>>3]+l,h[k+8>>3]=o,h[k+16>>3]=m,h[k+24>>3]=n,k)|0)|0;i=k;Lv(d,j)|0;p=c[f>>2]|0}else{p=g}if((p|0)<=0){i=e;return}p=b+56|0;b=0;do{Ak(a,c[(c[p>>2]|0)+(b<<2)>>2]|0,d);b=b+1|0;}while((b|0)<(c[f>>2]|0));i=e;return}function Bk(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0;j=i;i=i+1024|0;k=j|0;l=b+8|0;m=c[l>>2]|0;if((c[53492]|0)==0){n=+h[m+40>>3];o=+h[m+24>>3]}else{p=+h[21426];n=p- +h[m+40>>3];o=p- +h[m+24>>3]}p=+h[m+32>>3];nb(k|0,116760,(q=i,i=i+32|0,h[q>>3]=+h[m+16>>3],h[q+8>>3]=o,h[q+16>>3]=p,h[q+24>>3]=n,q)|0)|0;i=q;m=b|0;hw(m,d,k)|0;b=c[l>>2]|0;r=c[b+12>>2]|0;do{if((r|0)==0){s=b}else{if((a[c[r>>2]|0]|0)==0){s=b;break}n=+h[r+64>>3];if((c[53492]|0)==0){t=n}else{t=+h[21426]-n}nb(k|0,123584,(q=i,i=i+16|0,h[q>>3]=+h[r+56>>3],h[q+8>>3]=t,q)|0)|0;i=q;hw(m,e,k)|0;u=c[(c[l>>2]|0)+12>>2]|0;n=+h[u+32>>3];nb(k|0,115808,(q=i,i=i+8|0,h[q>>3]=+h[u+24>>3]/72.0,q)|0)|0;i=q;hw(m,f,k)|0;nb(k|0,115808,(q=i,i=i+8|0,h[q>>3]=n/72.0,q)|0)|0;i=q;hw(m,g,k)|0;s=c[l>>2]|0}}while(0);if((c[s+172>>2]|0)<1){i=j;return}else{v=1;w=s}while(1){Bk(c[(c[w+176>>2]|0)+(v<<2)>>2]|0,d,e,f,g);s=c[l>>2]|0;if((v|0)<(c[s+172>>2]|0)){v=v+1|0;w=s}else{break}}i=j;return}function Ck(a){a=a|0;var b=0;b=i;i=i+16|0;zk(a,b+8|0,b|0);i=b;return}function Dk(){return $g(21464,c[43330]|0)|0}function Ek(a){a=a|0;Vg(a)|0;return}function Fk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b;b=i;i=i+8|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];e=c[a>>2]|0;f=c[b>>2]|0;g=c[b+4>>2]|0;b=jk(16)|0;h=b+8|0;c[h>>2]=f;c[h+4>>2]=g;Hc[e&63](a,b,1)|0;i=d;return}function Gk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=c[a>>2]|0;f=jk(16)|0;g=f+8|0;c[g>>2]=b;c[g+4>>2]=d;Hc[e&63](a,f,1)|0;return}function Hk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=b;b=i;i=i+8|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];e=d|0;f=b;b=e+8|0;g=c[f+4>>2]|0;c[b>>2]=c[f>>2];c[b+4>>2]=g;g=(Hc[c[a>>2]&63](a,e,4)|0)!=0|0;i=d;return g|0}function Ik(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+16|0;f=e|0;c[f+8>>2]=b;c[f+12>>2]=d;d=(Hc[c[a>>2]&63](a,f,4)|0)!=0|0;i=e;return d|0}function Jk(a){a=a|0;return bh(a)|0}function Kk(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=jk((bh(a)|0)<<3)|0;d=Zg(a)|0;if((d|0)==0){return b|0}else{e=d;f=b}while(1){d=e+8|0;a=f;g=c[d+4>>2]|0;c[a>>2]=c[d>>2];c[a+4>>2]=g;g=c[e>>2]|0;if((g|0)==0){break}else{e=g;f=f+8|0}}return b|0}function Lk(){var a=0;a=kk(40)|0;tF(a|0,21504,36)|0;c[a+36>>2]=0;return $g(a,c[43330]|0)|0}function Mk(a){a=a|0;Hc[c[a>>2]&63](a,0,64)|0;return}function Nk(a){a=a|0;var b=0,d=0,e=0;b=c[a+4>>2]|0;Vg(a)|0;a=c[b+36>>2]|0;if((a|0)==0){d=b;eF(d);return}else{e=a}while(1){a=c[e>>2]|0;eF(e);if((a|0)==0){break}else{e=a}}d=b;eF(d);return}function Ok(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+24|0;g=f|0;c[g+8>>2]=b;c[g+12>>2]=d;c[g+16>>2]=e;e=c[(Hc[c[a>>2]&63](a,g,1)|0)+16>>2]|0;i=f;return e|0}function Pk(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;a=d+36|0;d=c[a>>2]|0;if((d|0)==0){e=kk(20)|0}else{c[a>>2]=c[d>>2];e=d}d=b+8|0;a=e+8|0;f=c[d+4>>2]|0;c[a>>2]=c[d>>2];c[a+4>>2]=f;c[e+16>>2]=c[b+16>>2];return e|0}function Qk(a,b,d){a=a|0;b=b|0;d=d|0;a=d+36|0;c[b>>2]=c[a>>2];c[a>>2]=b;return}function Rk(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=c[b>>2]|0;a=c[d>>2]|0;do{if((e|0)>(a|0)){f=1}else{if((e|0)<(a|0)){f=-1;break}g=c[b+4>>2]|0;h=c[d+4>>2]|0;if((g|0)>(h|0)){f=1;break}f=((g|0)<(h|0))<<31>>31}}while(0);return f|0}function Sk(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Tk(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+240|0;e=d|0;f=d+16|0;g=d+32|0;j=d+48|0;k=d+64|0;l=d+80|0;m=d+96|0;n=d+112|0;o=d+128|0;p=d+144|0;q=d+160|0;r=a+8|0;a=c[r>>2]|0;s=+h[a+16>>3];t=+h[a+24>>3];u=+h[a+32>>3];v=+h[a+40>>3];if((b-1|0)>>>0<2>>>0){a=o;w=p;x=o|0;h[x>>3]=s;y=o+8|0;h[y>>3]=v;si(p,o,(c[53548]|0)*90|0);c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[y>>3]=+h[y>>3]- +h[26782];y=q;c[y>>2]=c[a>>2];c[y+4>>2]=c[a+4>>2];c[y+8>>2]=c[a+8>>2];c[y+12>>2]=c[a+12>>2];a=k;y=l;x=k|0;h[x>>3]=u;w=k+8|0;h[w>>3]=t;si(l,k,(c[53548]|0)*90|0);c[a>>2]=c[y>>2];c[a+4>>2]=c[y+4>>2];c[a+8>>2]=c[y+8>>2];c[a+12>>2]=c[y+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[w>>3]=+h[w>>3]- +h[26782];w=d+192|0;c[w>>2]=c[a>>2];c[w+4>>2]=c[a+4>>2];c[w+8>>2]=c[a+8>>2];c[w+12>>2]=c[a+12>>2];a=q+16|0;c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2]}else{w=e;a=f;x=e|0;h[x>>3]=s;y=e+8|0;h[y>>3]=t;si(f,e,(c[53548]|0)*90|0);c[w>>2]=c[a>>2];c[w+4>>2]=c[a+4>>2];c[w+8>>2]=c[a+8>>2];c[w+12>>2]=c[a+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[y>>3]=+h[y>>3]- +h[26782];y=q;c[y>>2]=c[w>>2];c[y+4>>2]=c[w+4>>2];c[y+8>>2]=c[w+8>>2];c[y+12>>2]=c[w+12>>2];w=g;y=j;x=g|0;h[x>>3]=u;a=g+8|0;h[a>>3]=v;si(j,g,(c[53548]|0)*90|0);c[w>>2]=c[y>>2];c[w+4>>2]=c[y+4>>2];c[w+8>>2]=c[y+8>>2];c[w+12>>2]=c[y+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[a>>3]=+h[a>>3]- +h[26782];a=d+208|0;c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2];w=q+16|0;c[w>>2]=c[a>>2];c[w+4>>2]=c[a+4>>2];c[w+8>>2]=c[a+8>>2];c[w+12>>2]=c[a+12>>2]}a=(c[r>>2]|0)+16|0;w=q;c[a>>2]=c[w>>2];c[a+4>>2]=c[w+4>>2];c[a+8>>2]=c[w+8>>2];c[a+12>>2]=c[w+12>>2];c[a+16>>2]=c[w+16>>2];c[a+20>>2]=c[w+20>>2];c[a+24>>2]=c[w+24>>2];c[a+28>>2]=c[w+28>>2];w=c[r>>2]|0;a=c[w+12>>2]|0;if((a|0)==0){z=w}else{w=a+56|0;v=+h[a+64>>3];a=m;q=n;x=m|0;h[x>>3]=+h[w>>3];y=m+8|0;h[y>>3]=v;si(n,m,(c[53548]|0)*90|0);c[a>>2]=c[q>>2];c[a+4>>2]=c[q+4>>2];c[a+8>>2]=c[q+8>>2];c[a+12>>2]=c[q+12>>2];h[x>>3]=+h[x>>3]- +h[26781];h[y>>3]=+h[y>>3]- +h[26782];y=d+224|0;c[y>>2]=c[a>>2];c[y+4>>2]=c[a+4>>2];c[y+8>>2]=c[a+8>>2];c[y+12>>2]=c[a+12>>2];a=w;c[a>>2]=c[y>>2];c[a+4>>2]=c[y+4>>2];c[a+8>>2]=c[y+8>>2];c[a+12>>2]=c[y+12>>2];z=c[r>>2]|0}if((c[z+172>>2]|0)<1){i=d;return}else{A=1;B=z}while(1){Tk(c[(c[B+176>>2]|0)+(A<<2)>>2]|0,b);z=c[r>>2]|0;if((A|0)<(c[z+172>>2]|0)){A=A+1|0;B=z}else{break}}i=d;return}function Uk(e,f){e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0,za=0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0.0,La=0.0,Na=0.0,Oa=0.0,Pa=0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0,Ua=0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0.0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0,sb=0,tb=0.0,ub=0.0,vb=0.0,wb=0.0,xb=0,yb=0.0,zb=0.0,Ab=0,Bb=0,Cb=0.0,Db=0.0,Eb=0.0,Fb=0.0,Gb=0,Hb=0,Ib=0.0,Jb=0.0,Kb=0.0,Mb=0.0,Nb=0.0,Ob=0.0,Pb=0,Qb=0.0,Rb=0.0,Sb=0,Tb=0,Ub=0.0,Vb=0.0,Wb=0.0,Xb=0.0,Yb=0,Zb=0,_b=0.0,$b=0.0,ac=0.0,bc=0.0,cc=0.0,dc=0.0,ec=0,fc=0,hc=0.0,ic=0.0,jc=0,kc=0,lc=0.0,mc=0.0,nc=0.0,oc=0.0,pc=0,qc=0.0,rc=0.0,sc=0.0,tc=0.0,uc=0.0,vc=0.0,wc=0.0,xc=0.0,yc=0.0,zc=0.0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0.0,Kc=0.0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0.0,Sc=0.0;g=i;i=i+1608|0;j=g|0;k=g+16|0;l=g+32|0;m=g+48|0;n=g+64|0;p=g+80|0;q=g+96|0;r=g+112|0;s=g+128|0;t=g+144|0;u=g+160|0;v=g+176|0;w=g+192|0;x=g+208|0;y=g+224|0;z=g+240|0;A=g+256|0;B=g+272|0;C=g+288|0;D=g+304|0;E=g+320|0;F=g+336|0;G=g+352|0;H=g+368|0;I=g+384|0;J=g+400|0;K=g+416|0;L=g+432|0;M=g+472|0;N=g+488|0;O=g+504|0;P=g+544|0;Q=g+584|0;R=e+8|0;c[53548]=c[(c[R>>2]|0)+116>>2]&3;S=c[(c[R>>2]|0)+116>>2]&1;a[214952]=S;if(S<<24>>24==0){Wk(e)}else{Vk(e)}S=O;T=P;U=c[R>>2]|0;V=b[U+128>>1]&14;W=d[U+113|0]|0;if((W&54|0)==0){if(!((W&1|0)==0|(c[53746]|0)!=0)){X=6}}else{X=6}do{if((X|0)==6){W=ux(e)|0;if((W|0)==0){Y=0;Z=0;_=0}else{U=(V|0)!=0|0;$=0;aa=0;ba=0;ca=W;while(1){W=c[(c[ca+8>>2]|0)+108>>2]|0;do{if((W|0)==0){da=ba;ea=$}else{if((a[W+81|0]|0)==0){da=ba;ea=$+1|0;break}else{da=ba+1|0;ea=$;break}}}while(0);W=mw(e,ca)|0;if((W|0)==0){fa=aa;ga=da}else{ha=aa;ia=da;ja=W;while(1){W=c[ja+8>>2]|0;ka=c[W+108>>2]|0;do{if((ka|0)==0){la=ia;ma=ha}else{if((a[ka+81|0]|0)==0){la=ia;ma=ha+U|0;break}else{la=ia+1|0;ma=ha;break}}}while(0);ka=c[W+100>>2]|0;do{if((ka|0)==0){na=la;oa=ma}else{if((a[ka+81|0]|0)==0){na=la;oa=ma+U|0;break}else{na=la+1|0;oa=ma;break}}}while(0);ka=c[W+104>>2]|0;do{if((ka|0)==0){pa=na;qa=oa}else{if((a[ka+81|0]|0)==0){pa=na;qa=oa+U|0;break}else{pa=na+1|0;qa=oa;break}}}while(0);ka=c[W+96>>2]|0;do{if((ka|0)==0){ra=pa;sa=qa}else{if((a[ka+81|0]|0)==0){ra=pa;sa=qa+U|0;break}else{ra=pa+1|0;sa=qa;break}}}while(0);ka=ow(e,ja)|0;if((ka|0)==0){fa=sa;ga=ra;break}else{ha=sa;ia=ra;ja=ka}}}ja=vx(e,ca)|0;if((ja|0)==0){Y=ea;Z=fa;_=ga;break}else{$=ea;aa=fa;ba=ga;ca=ja}}}if((a[(c[R>>2]|0)+113|0]&8)==0){ta=0}else{ta=Yk(e)|0}ca=Y+Z|0;if((ca|0)==0){break}ba=Z+_+ta+(Lw(e)|0)|0;aa=jk(ba*40|0)|0;$=aa;U=jk(ca*40|0)|0;ja=U;ia=ux(e)|0;if((ia|0)==0){ua=-2147483647.0;va=-2147483647.0;wa=2147483647.0;xa=2147483647.0;ya=$}else{ha=(V|0)==0;ka=N|0;W=N+8|0;za=M|0;Aa=M+8|0;Ba=-2147483647.0;Ca=-2147483647.0;Da=2147483647.0;Ea=2147483647.0;Fa=$;Ga=ja;Ha=ia;while(1){ia=(a[214952]|0)==0;Ia=Ha+8|0;Ja=c[Ia>>2]|0;if(ia){Ka=+h[Ja+32>>3]*72.0;h[Fa+16>>3]=Ka;La=+h[(c[Ia>>2]|0)+40>>3]*72.0;h[Fa+24>>3]=La;Na=Ka;Oa=La}else{La=+h[Ja+40>>3]*72.0;h[Fa+16>>3]=La;Ka=+h[(c[Ia>>2]|0)+32>>3]*72.0;h[Fa+24>>3]=Ka;Na=La;Oa=Ka}Ja=Fa;Pa=(c[Ia>>2]|0)+16|0;c[Ja>>2]=c[Pa>>2];c[Ja+4>>2]=c[Pa+4>>2];c[Ja+8>>2]=c[Pa+8>>2];c[Ja+12>>2]=c[Pa+12>>2];Pa=Fa|0;Ka=+h[Pa>>3]-Na*.5;h[Pa>>3]=Ka;Pa=Fa+8|0;La=+h[Pa>>3]-Oa*.5;h[Pa>>3]=La;Qa=Ea<Ka?Ea:Ka;Ra=Da<La?Da:La;Sa=Na+Ka;Ka=Oa+La;La=Ca>Sa?Ca:Sa;Sa=Ba>Ka?Ba:Ka;Pa=c[(c[Ia>>2]|0)+108>>2]|0;do{if((Pa|0)==0){Ta=Ga;Ua=Fa;Va=Qa;Wa=Ra;Xa=La;Ya=Sa}else{if((a[Pa+81|0]|0)==0){if(ia){Ia=Ga;Ja=Pa+24|0;c[Ia>>2]=c[Ja>>2];c[Ia+4>>2]=c[Ja+4>>2];c[Ia+8>>2]=c[Ja+8>>2];c[Ia+12>>2]=c[Ja+12>>2]}else{h[Ga>>3]=+h[Pa+32>>3];h[Ga+8>>3]=+h[Pa+24>>3]}c[Ga+32>>2]=Pa;a[Ga+36|0]=0;c[Fa+32>>2]=Ga;Ta=Ga+40|0;Ua=Fa;Va=Qa;Wa=Ra;Xa=La;Ya=Sa;break}else{Ja=Fa+40|0;Ia=Pa+24|0;if(ia){Ka=+h[Ia>>3];h[Fa+56>>3]=Ka;Za=+h[Pa+32>>3];h[Fa+64>>3]=Za;_a=Ka;$a=Za}else{Za=+h[Pa+32>>3];h[Fa+56>>3]=Za;Ka=+h[Ia>>3];h[Fa+64>>3]=Ka;_a=Za;$a=Ka}Ia=Ja;ab=Pa+56|0;c[Ia>>2]=c[ab>>2];c[Ia+4>>2]=c[ab+4>>2];c[Ia+8>>2]=c[ab+8>>2];c[Ia+12>>2]=c[ab+12>>2];ab=Ja|0;Ka=+h[ab>>3]-_a*.5;h[ab>>3]=Ka;ab=Fa+48|0;Za=+h[ab>>3]-$a*.5;h[ab>>3]=Za;bb=_a+Ka;cb=$a+Za;Ta=Ga;Ua=Ja;Va=Qa<Ka?Qa:Ka;Wa=Ra<Za?Ra:Za;Xa=La>bb?La:bb;Ya=Sa>cb?Sa:cb;break}}}while(0);Pa=Ua+40|0;ia=mw(e,Ha)|0;if((ia|0)==0){db=Ya;eb=Xa;fb=Wa;gb=Va;hb=Pa;ib=Ta}else{Sa=Ya;La=Xa;Ra=Wa;Qa=Va;Ja=Pa;Pa=Ta;ab=ia;while(1){ia=ab+8|0;Ia=c[ia>>2]|0;jb=c[Ia+96>>2]|0;if((jb|0)==0){kb=Pa;lb=Ja;mb=Qa;ob=Ra;pb=La;qb=Sa;rb=Ia}else{do{if((a[jb+81|0]|0)==0){if(ha){sb=Pa;tb=Qa;ub=Ra;vb=La;wb=Sa;break}mm(M,e,ab);cb=+h[za>>3];bb=+h[Aa>>3];vF(Ja+16|0,0,16)|0;h[Ja>>3]=cb;h[Ja+8>>3]=bb;if((a[214952]|0)==0){Ia=Pa;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[Pa>>3]=+h[jb+32>>3];h[Pa+8>>3]=+h[jb+24>>3]}c[Pa+32>>2]=jb;a[Pa+36|0]=0;c[Ja+32>>2]=Pa;sb=Pa+40|0;tb=Qa;ub=Ra;vb=La;wb=Sa}else{xb=jb+24|0;if((a[214952]|0)==0){bb=+h[xb>>3];h[Ja+16>>3]=bb;cb=+h[jb+32>>3];h[Ja+24>>3]=cb;yb=bb;zb=cb}else{cb=+h[jb+32>>3];h[Ja+16>>3]=cb;bb=+h[xb>>3];h[Ja+24>>3]=bb;yb=cb;zb=bb}xb=Ja;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=Ja|0;bb=+h[Ia>>3]-yb*.5;h[Ia>>3]=bb;Ia=Ja+8|0;cb=+h[Ia>>3]-zb*.5;h[Ia>>3]=cb;Za=yb+bb;Ka=zb+cb;sb=Pa;tb=Qa<bb?Qa:bb;ub=Ra<cb?Ra:cb;vb=La>Za?La:Za;wb=Sa>Ka?Sa:Ka}}while(0);kb=sb;lb=Ja+40|0;mb=tb;ob=ub;pb=vb;qb=wb;rb=c[ia>>2]|0}jb=c[rb+104>>2]|0;if((jb|0)==0){Ab=kb;Bb=lb;Cb=mb;Db=ob;Eb=pb;Fb=qb;Gb=rb}else{do{if((a[jb+81|0]|0)==0){if(ha){Hb=kb;Ib=mb;Jb=ob;Kb=pb;Mb=qb;break}Ia=om(ab)|0;do{if((Ia|0)==0){Nb=0.0;Ob=0.0}else{xb=c[Ia>>2]|0;if((c[xb+8>>2]|0)==0){Pb=c[xb>>2]|0;Nb=+h[Pb>>3];Ob=+h[Pb+8>>3];break}else{Nb=+h[xb+16>>3];Ob=+h[xb+24>>3];break}}}while(0);vF(lb+16|0,0,16)|0;h[lb>>3]=Nb;h[lb+8>>3]=Ob;if((a[214952]|0)==0){Ia=kb;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[kb>>3]=+h[jb+32>>3];h[kb+8>>3]=+h[jb+24>>3]}c[kb+32>>2]=jb;a[kb+36|0]=0;c[lb+32>>2]=kb;Hb=kb+40|0;Ib=mb;Jb=ob;Kb=pb;Mb=qb}else{xb=jb+24|0;if((a[214952]|0)==0){Ka=+h[xb>>3];h[lb+16>>3]=Ka;Za=+h[jb+32>>3];h[lb+24>>3]=Za;Qb=Ka;Rb=Za}else{Za=+h[jb+32>>3];h[lb+16>>3]=Za;Ka=+h[xb>>3];h[lb+24>>3]=Ka;Qb=Za;Rb=Ka}xb=lb;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=lb|0;Ka=+h[Ia>>3]-Qb*.5;h[Ia>>3]=Ka;Ia=lb+8|0;Za=+h[Ia>>3]-Rb*.5;h[Ia>>3]=Za;cb=Qb+Ka;bb=Rb+Za;Hb=kb;Ib=mb<Ka?mb:Ka;Jb=ob<Za?ob:Za;Kb=pb>cb?pb:cb;Mb=qb>bb?qb:bb}}while(0);Ab=Hb;Bb=lb+40|0;Cb=Ib;Db=Jb;Eb=Kb;Fb=Mb;Gb=c[ia>>2]|0}jb=c[Gb+100>>2]|0;if((jb|0)==0){Sb=Ab;Tb=Bb;Ub=Cb;Vb=Db;Wb=Eb;Xb=Fb;Yb=Gb}else{do{if((a[jb+81|0]|0)==0){if(ha){Zb=Ab;_b=Cb;$b=Db;ac=Eb;bc=Fb;break}Ia=om(ab)|0;do{if((Ia|0)==0){cc=0.0;dc=0.0}else{xb=(c[Ia+4>>2]|0)-1|0;Pb=c[Ia>>2]|0;if((c[Pb+(xb*48|0)+12>>2]|0)==0){ec=(c[Pb+(xb*48|0)+4>>2]|0)-1|0;fc=c[Pb+(xb*48|0)>>2]|0;cc=+h[fc+(ec<<4)>>3];dc=+h[fc+(ec<<4)+8>>3];break}else{cc=+h[Pb+(xb*48|0)+32>>3];dc=+h[Pb+(xb*48|0)+40>>3];break}}}while(0);vF(Bb+16|0,0,16)|0;h[Bb>>3]=cc;h[Bb+8>>3]=dc;if((a[214952]|0)==0){Ia=Ab;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[Ab>>3]=+h[jb+32>>3];h[Ab+8>>3]=+h[jb+24>>3]}c[Ab+32>>2]=jb;a[Ab+36|0]=0;c[Bb+32>>2]=Ab;Zb=Ab+40|0;_b=Cb;$b=Db;ac=Eb;bc=Fb}else{xb=jb+24|0;if((a[214952]|0)==0){bb=+h[xb>>3];h[Bb+16>>3]=bb;cb=+h[jb+32>>3];h[Bb+24>>3]=cb;hc=bb;ic=cb}else{cb=+h[jb+32>>3];h[Bb+16>>3]=cb;bb=+h[xb>>3];h[Bb+24>>3]=bb;hc=cb;ic=bb}xb=Bb;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=Bb|0;bb=+h[Ia>>3]-hc*.5;h[Ia>>3]=bb;Ia=Bb+8|0;cb=+h[Ia>>3]-ic*.5;h[Ia>>3]=cb;Za=hc+bb;Ka=ic+cb;Zb=Ab;_b=Cb<bb?Cb:bb;$b=Db<cb?Db:cb;ac=Eb>Za?Eb:Za;bc=Fb>Ka?Fb:Ka}}while(0);Sb=Zb;Tb=Bb+40|0;Ub=_b;Vb=$b;Wb=ac;Xb=bc;Yb=c[ia>>2]|0}jb=c[Yb+108>>2]|0;if((jb|0)==0){jc=Sb;kc=Tb;lc=Ub;mc=Vb;nc=Wb;oc=Xb}else{do{if((a[jb+81|0]|0)==0){if(ha){pc=Sb;qc=Ub;rc=Vb;sc=Wb;tc=Xb;break}mm(N,e,ab);Ka=+h[ka>>3];Za=+h[W>>3];vF(Tb+16|0,0,16)|0;h[Tb>>3]=Ka;h[Tb+8>>3]=Za;if((a[214952]|0)==0){Ia=Sb;xb=jb+24|0;c[Ia>>2]=c[xb>>2];c[Ia+4>>2]=c[xb+4>>2];c[Ia+8>>2]=c[xb+8>>2];c[Ia+12>>2]=c[xb+12>>2]}else{h[Sb>>3]=+h[jb+32>>3];h[Sb+8>>3]=+h[jb+24>>3]}c[Sb+32>>2]=jb;a[Sb+36|0]=0;c[Tb+32>>2]=Sb;pc=Sb+40|0;qc=Ub;rc=Vb;sc=Wb;tc=Xb}else{xb=jb+24|0;if((a[214952]|0)==0){Za=+h[xb>>3];h[Tb+16>>3]=Za;Ka=+h[jb+32>>3];h[Tb+24>>3]=Ka;uc=Za;vc=Ka}else{Ka=+h[jb+32>>3];h[Tb+16>>3]=Ka;Za=+h[xb>>3];h[Tb+24>>3]=Za;uc=Ka;vc=Za}xb=Tb;Ia=jb+56|0;c[xb>>2]=c[Ia>>2];c[xb+4>>2]=c[Ia+4>>2];c[xb+8>>2]=c[Ia+8>>2];c[xb+12>>2]=c[Ia+12>>2];Ia=Tb|0;Za=+h[Ia>>3]-uc*.5;h[Ia>>3]=Za;Ia=Tb+8|0;Ka=+h[Ia>>3]-vc*.5;h[Ia>>3]=Ka;cb=uc+Za;bb=vc+Ka;pc=Sb;qc=Ub<Za?Ub:Za;rc=Vb<Ka?Vb:Ka;sc=Wb>cb?Wb:cb;tc=Xb>bb?Xb:bb}}while(0);jc=pc;kc=Tb+40|0;lc=qc;mc=rc;nc=sc;oc=tc}jb=ow(e,ab)|0;if((jb|0)==0){db=oc;eb=nc;fb=mc;gb=lc;hb=kc;ib=jc;break}else{Sa=oc;La=nc;Ra=mc;Qa=lc;Ja=kc;Pa=jc;ab=jb}}}ab=vx(e,Ha)|0;if((ab|0)==0){ua=db;va=eb;wa=fb;xa=gb;ya=hb;break}else{Ba=db;Ca=eb;Da=fb;Ea=gb;Fa=hb;Ga=ib;Ha=ab}}}if((ta|0)==0){wc=xa;xc=wa;yc=va;zc=ua}else{Ha=O|0;h[Ha>>3]=xa;Ga=O+8|0;h[Ga>>3]=wa;Fa=O+16|0;h[Fa>>3]=va;W=O+24|0;h[W>>3]=ua;c[O+32>>2]=ya;Zk(P,e,O);c[S>>2]=c[T>>2];c[S+4>>2]=c[T+4>>2];c[S+8>>2]=c[T+8>>2];c[S+12>>2]=c[T+12>>2];c[S+16>>2]=c[T+16>>2];c[S+20>>2]=c[T+20>>2];c[S+24>>2]=c[T+24>>2];c[S+28>>2]=c[T+28>>2];c[S+32>>2]=c[T+32>>2];c[S+36>>2]=c[T+36>>2];wc=+h[Ha>>3];xc=+h[Ga>>3];yc=+h[Fa>>3];zc=+h[W>>3]}W=L+32|0;a[W]=Jm(e|0,Wv(e,0,114920,0)|0,1)|0;Fa=L|0;h[Fa>>3]=wc;Ga=L+8|0;h[Ga>>3]=xc;Ha=L+16|0;h[Ha>>3]=yc;ka=L+24|0;h[ka>>3]=zc;Mz($,ba,ja,ca,L)|0;do{if((a[213992]|0)==0){X=118}else{ha=c[o>>2]|0;Aa=d[W]|0;Ea=+h[Fa>>3];Da=+h[Ga>>3];Ca=+h[Ha>>3];Ba=+h[ka>>3];gc(ha|0,96552,(Ac=i,i=i+56|0,c[Ac>>2]=ba,c[Ac+8>>2]=ca,c[Ac+16>>2]=Aa,h[Ac+24>>3]=Ea,h[Ac+32>>3]=Da,h[Ac+40>>3]=Ca,h[Ac+48>>3]=Ba,Ac)|0)|0;i=Ac;if((d[213992]|0)>>>0<2>>>0){X=118;break}Ma(91224,8,1,ha|0)|0;if((ba|0)>0){Aa=$;za=0;while(1){ab=c[Aa+32>>2]|0;Ba=+h[Aa>>3];Ca=+h[Aa+8>>3];Da=+h[Aa+16>>3];Ea=+h[Aa+24>>3];if((ab|0)==0){Bc=213304}else{Bc=c[c[ab+32>>2]>>2]|0}gc(ha|0,86024,(Ac=i,i=i+56|0,c[Ac>>2]=za,h[Ac+8>>3]=Ba,h[Ac+16>>3]=Ca,h[Ac+24>>3]=Da,h[Ac+32>>3]=Ea,c[Ac+40>>2]=ab,c[Ac+48>>2]=Bc,Ac)|0)|0;i=Ac;ab=za+1|0;if((ab|0)<(ba|0)){Aa=Aa+40|0;za=ab}else{break}}}Ma(167600,8,1,ha|0)|0;if((ca|0)>0){Cc=ja;Dc=0}else{Ec=0;break}while(1){za=d[Cc+36|0]|0;Ea=+h[Cc+16>>3];Da=+h[Cc+24>>3];Ca=+h[Cc>>3];Ba=+h[Cc+8>>3];Aa=c[c[Cc+32>>2]>>2]|0;gc(ha|0,163416,(Ac=i,i=i+64|0,c[Ac>>2]=Dc,c[Ac+8>>2]=Cc,c[Ac+16>>2]=za,h[Ac+24>>3]=Ea,h[Ac+32>>3]=Da,h[Ac+40>>3]=Ca,h[Ac+48>>3]=Ba,c[Ac+56>>2]=Aa,Ac)|0)|0;i=Ac;Aa=Dc+1|0;if((Aa|0)<(ca|0)){Cc=Cc+40|0;Dc=Aa}else{X=118;break}}}}while(0);do{if((X|0)==118){if((ca|0)>0){Fc=0;Gc=0;Hc=ja}else{Ec=0;break}while(1){if((a[Hc+36|0]|0)==0){Ic=Gc}else{ba=c[Hc+32>>2]|0;a[ba+81|0]=1;Ba=+h[Hc+24>>3]+ +h[Hc+8>>3]*.5;h[ba+56>>3]=+h[Hc+16>>3]+ +h[Hc>>3]*.5;h[ba+64>>3]=Ba;_m(e,ba);Ic=Gc+1|0}ba=Fc+1|0;if((ba|0)<(ca|0)){Fc=ba;Gc=Ic;Hc=Hc+40|0}else{Ec=Ic;break}}}}while(0);do{if((a[213992]|0)==0){if((Ec|0)==(ca|0)){break}Fv(0,102304,(Ac=i,i=i+16|0,c[Ac>>2]=Ec,c[Ac+8>>2]=ca,Ac)|0)|0;i=Ac}else{gc(c[o>>2]|0,108e3,(Ac=i,i=i+16|0,c[Ac>>2]=Ec,c[Ac+8>>2]=ca,Ac)|0)|0;i=Ac}}while(0);eF(aa);eF(U)}}while(0);Ec=c[R>>2]|0;Ic=c[Ec+12>>2]|0;do{if((Ic|0)==0){Jc=0.0;Kc=0.0}else{if((a[Ic+81|0]|0)!=0){Jc=0.0;Kc=0.0;break}zc=+h[Ic+24>>3]+16.0;yc=+h[Ic+32>>3]+8.0;Hc=(a[Ec+263|0]&1)!=0;if((a[214952]|0)!=0){if(Hc){Gc=Ec+32|0;h[Gc>>3]=yc+ +h[Gc>>3]}else{Gc=Ec+16|0;h[Gc>>3]=+h[Gc>>3]-yc}Gc=c[R>>2]|0;Fc=Gc+24|0;xc=+h[Fc>>3];wc=+h[Gc+40>>3]-xc;if(zc<=wc){Jc=zc;Kc=yc;break}ua=(zc-wc)*.5;h[Fc>>3]=xc-ua;Fc=(c[R>>2]|0)+40|0;h[Fc>>3]=ua+ +h[Fc>>3];Jc=zc;Kc=yc;break}Fc=(c[53548]|0)==0;do{if(Hc){if(Fc){Gc=Ec+40|0;h[Gc>>3]=yc+ +h[Gc>>3];break}else{Gc=Ec+24|0;h[Gc>>3]=+h[Gc>>3]-yc;break}}else{if(Fc){Gc=Ec+24|0;h[Gc>>3]=+h[Gc>>3]-yc;break}else{Gc=Ec+40|0;h[Gc>>3]=yc+ +h[Gc>>3];break}}}while(0);Fc=c[R>>2]|0;Hc=Fc+16|0;ua=+h[Hc>>3];xc=+h[Fc+32>>3]-ua;if(zc<=xc){Jc=zc;Kc=yc;break}wc=(zc-xc)*.5;h[Hc>>3]=ua-wc;Hc=(c[R>>2]|0)+32|0;h[Hc>>3]=wc+ +h[Hc>>3];Jc=zc;Kc=yc}}while(0);do{if((f|0)!=0){Ec=c[53548]|0;if((Ec|0)==0){Ic=(c[R>>2]|0)+16|0;c[53562]=c[Ic>>2];c[53563]=c[Ic+4>>2];c[53564]=c[Ic+8>>2];c[53565]=c[Ic+12>>2]}else if((Ec|0)==1){Ic=c[R>>2]|0;wc=+h[Ic+16>>3];h[26781]=-0.0- +h[Ic+40>>3];h[26782]=wc}else if((Ec|0)==2){Ic=c[R>>2]|0;wc=-0.0- +h[Ic+40>>3];h[26781]=+h[Ic+16>>3];h[26782]=wc}else if((Ec|0)==3){Ic=c[R>>2]|0;wc=+h[Ic+16>>3];h[26781]=+h[Ic+24>>3];h[26782]=wc}Ic=J;Hc=K;if(+h[26781]==0.0){if(!(+h[26782]!=0.0|(Ec|0)!=0)){break}}Ec=ux(e)|0;if((Ec|0)!=0){Fc=H;U=I;aa=H|0;Gc=H+8|0;X=y;Dc=z;Cc=A;Bc=B;L=C;T=D;S=E;O=s;P=t;ya=s|0;ta=s+8|0;ib=u;hb=v;jc=u|0;kc=u+8|0;Tb=w;pc=x;Sb=w|0;N=w+8|0;Yb=j;Bb=k;Zb=j|0;Ab=j+8|0;Gb=l;lb=m;Hb=l|0;kb=l+8|0;rb=n;sb=p;M=n|0;Ta=n+8|0;Ua=q;V=r;_=q|0;Z=q+8|0;Y=F;ga=G;fa=F|0;ea=F+8|0;ra=Ec;do{if((c[53548]|0)==0){Lc=0}else{vn(ra,0);Lc=(c[53548]|0)*90|0}Ec=ra+8|0;sa=c[Ec>>2]|0;qa=sa+16|0;wc=+h[sa+24>>3];h[aa>>3]=+h[qa>>3];h[Gc>>3]=wc;si(I,H,Lc);c[Fc>>2]=c[U>>2];c[Fc+4>>2]=c[U+4>>2];c[Fc+8>>2]=c[U+8>>2];c[Fc+12>>2]=c[U+12>>2];h[aa>>3]=+h[aa>>3]- +h[26781];h[Gc>>3]=+h[Gc>>3]- +h[26782];c[Ic>>2]=c[Fc>>2];c[Ic+4>>2]=c[Fc+4>>2];c[Ic+8>>2]=c[Fc+8>>2];c[Ic+12>>2]=c[Fc+12>>2];sa=qa;c[sa>>2]=c[Ic>>2];c[sa+4>>2]=c[Ic+4>>2];c[sa+8>>2]=c[Ic+8>>2];c[sa+12>>2]=c[Ic+12>>2];sa=c[(c[Ec>>2]|0)+108>>2]|0;if((sa|0)!=0){Ec=sa+56|0;wc=+h[sa+64>>3];h[fa>>3]=+h[Ec>>3];h[ea>>3]=wc;si(G,F,(c[53548]|0)*90|0);c[Y>>2]=c[ga>>2];c[Y+4>>2]=c[ga+4>>2];c[Y+8>>2]=c[ga+8>>2];c[Y+12>>2]=c[ga+12>>2];h[fa>>3]=+h[fa>>3]- +h[26781];h[ea>>3]=+h[ea>>3]- +h[26782];c[Hc>>2]=c[Y>>2];c[Hc+4>>2]=c[Y+4>>2];c[Hc+8>>2]=c[Y+8>>2];c[Hc+12>>2]=c[Y+12>>2];sa=Ec;c[sa>>2]=c[Hc>>2];c[sa+4>>2]=c[Hc+4>>2];c[sa+8>>2]=c[Hc+8>>2];c[sa+12>>2]=c[Hc+12>>2]}do{if((c[53522]|0)==1){sa=mw(e,ra)|0;if((sa|0)==0){break}else{Mc=sa}do{sa=Mc+8|0;Ec=c[sa>>2]|0;qa=c[Ec+8>>2]|0;do{if((qa|0)==0){if((a[215376]|0)!=0){break}if((a[Ec+112|0]|0)==6){break}pa=Mc;oa=$w(c[((c[pa>>2]&3|0)==3?Mc:Mc+32|0)+28>>2]|0)|0;na=$w(c[((c[pa>>2]&3|0)==2?Mc:Mc-32|0)+28>>2]|0)|0;Fv(1,126784,(Ac=i,i=i+16|0,c[Ac>>2]=oa,c[Ac+8>>2]=na,Ac)|0)|0;i=Ac}else{if((c[qa+4>>2]|0)>0){na=0;oa=qa;while(1){pa=c[oa>>2]|0;ma=c[pa+(na*48|0)>>2]|0;la=c[pa+(na*48|0)+4>>2]|0;da=c[pa+(na*48|0)+8>>2]|0;ca=c[pa+(na*48|0)+12>>2]|0;if((la|0)>0){pa=0;do{ja=ma+(pa<<4)|0;wc=+h[ma+(pa<<4)+8>>3];h[Sb>>3]=+h[ja>>3];h[N>>3]=wc;si(x,w,(c[53548]|0)*90|0);c[Tb>>2]=c[pc>>2];c[Tb+4>>2]=c[pc+4>>2];c[Tb+8>>2]=c[pc+8>>2];c[Tb+12>>2]=c[pc+12>>2];h[Sb>>3]=+h[Sb>>3]- +h[26781];h[N>>3]=+h[N>>3]- +h[26782];c[X>>2]=c[Tb>>2];c[X+4>>2]=c[Tb+4>>2];c[X+8>>2]=c[Tb+8>>2];c[X+12>>2]=c[Tb+12>>2];ba=ja;c[ba>>2]=c[X>>2];c[ba+4>>2]=c[X+4>>2];c[ba+8>>2]=c[X+8>>2];c[ba+12>>2]=c[X+12>>2];pa=pa+1|0;}while((pa|0)<(la|0))}if((da|0)!=0){la=c[c[(c[sa>>2]|0)+8>>2]>>2]|0;pa=la+(na*48|0)+16|0;wc=+h[la+(na*48|0)+24>>3];h[jc>>3]=+h[pa>>3];h[kc>>3]=wc;si(v,u,(c[53548]|0)*90|0);c[ib>>2]=c[hb>>2];c[ib+4>>2]=c[hb+4>>2];c[ib+8>>2]=c[hb+8>>2];c[ib+12>>2]=c[hb+12>>2];h[jc>>3]=+h[jc>>3]- +h[26781];h[kc>>3]=+h[kc>>3]- +h[26782];c[Dc>>2]=c[ib>>2];c[Dc+4>>2]=c[ib+4>>2];c[Dc+8>>2]=c[ib+8>>2];c[Dc+12>>2]=c[ib+12>>2];la=pa;c[la>>2]=c[Dc>>2];c[la+4>>2]=c[Dc+4>>2];c[la+8>>2]=c[Dc+8>>2];c[la+12>>2]=c[Dc+12>>2]}if((ca|0)!=0){la=c[c[(c[sa>>2]|0)+8>>2]>>2]|0;pa=la+(na*48|0)+32|0;wc=+h[la+(na*48|0)+40>>3];h[ya>>3]=+h[pa>>3];h[ta>>3]=wc;si(t,s,(c[53548]|0)*90|0);c[O>>2]=c[P>>2];c[O+4>>2]=c[P+4>>2];c[O+8>>2]=c[P+8>>2];c[O+12>>2]=c[P+12>>2];h[ya>>3]=+h[ya>>3]- +h[26781];h[ta>>3]=+h[ta>>3]- +h[26782];c[Cc>>2]=c[O>>2];c[Cc+4>>2]=c[O+4>>2];c[Cc+8>>2]=c[O+8>>2];c[Cc+12>>2]=c[O+12>>2];la=pa;c[la>>2]=c[Cc>>2];c[la+4>>2]=c[Cc+4>>2];c[la+8>>2]=c[Cc+8>>2];c[la+12>>2]=c[Cc+12>>2]}la=na+1|0;pa=c[sa>>2]|0;ma=c[pa+8>>2]|0;if((la|0)<(c[ma+4>>2]|0)){na=la;oa=ma}else{Nc=pa;break}}}else{Nc=Ec}oa=c[Nc+96>>2]|0;if((oa|0)==0){Oc=Nc}else{na=oa+56|0;wc=+h[oa+64>>3];h[_>>3]=+h[na>>3];h[Z>>3]=wc;si(r,q,(c[53548]|0)*90|0);c[Ua>>2]=c[V>>2];c[Ua+4>>2]=c[V+4>>2];c[Ua+8>>2]=c[V+8>>2];c[Ua+12>>2]=c[V+12>>2];h[_>>3]=+h[_>>3]- +h[26781];h[Z>>3]=+h[Z>>3]- +h[26782];c[Bc>>2]=c[Ua>>2];c[Bc+4>>2]=c[Ua+4>>2];c[Bc+8>>2]=c[Ua+8>>2];c[Bc+12>>2]=c[Ua+12>>2];oa=na;c[oa>>2]=c[Bc>>2];c[oa+4>>2]=c[Bc+4>>2];c[oa+8>>2]=c[Bc+8>>2];c[oa+12>>2]=c[Bc+12>>2];Oc=c[sa>>2]|0}oa=c[Oc+108>>2]|0;if((oa|0)==0){Pc=Oc}else{na=oa+56|0;wc=+h[oa+64>>3];h[M>>3]=+h[na>>3];h[Ta>>3]=wc;si(p,n,(c[53548]|0)*90|0);c[rb>>2]=c[sb>>2];c[rb+4>>2]=c[sb+4>>2];c[rb+8>>2]=c[sb+8>>2];c[rb+12>>2]=c[sb+12>>2];h[M>>3]=+h[M>>3]- +h[26781];h[Ta>>3]=+h[Ta>>3]- +h[26782];c[L>>2]=c[rb>>2];c[L+4>>2]=c[rb+4>>2];c[L+8>>2]=c[rb+8>>2];c[L+12>>2]=c[rb+12>>2];oa=na;c[oa>>2]=c[L>>2];c[oa+4>>2]=c[L+4>>2];c[oa+8>>2]=c[L+8>>2];c[oa+12>>2]=c[L+12>>2];Pc=c[sa>>2]|0}oa=c[Pc+100>>2]|0;if((oa|0)==0){Qc=Pc}else{na=oa+56|0;wc=+h[oa+64>>3];h[Hb>>3]=+h[na>>3];h[kb>>3]=wc;si(m,l,(c[53548]|0)*90|0);c[Gb>>2]=c[lb>>2];c[Gb+4>>2]=c[lb+4>>2];c[Gb+8>>2]=c[lb+8>>2];c[Gb+12>>2]=c[lb+12>>2];h[Hb>>3]=+h[Hb>>3]- +h[26781];h[kb>>3]=+h[kb>>3]- +h[26782];c[T>>2]=c[Gb>>2];c[T+4>>2]=c[Gb+4>>2];c[T+8>>2]=c[Gb+8>>2];c[T+12>>2]=c[Gb+12>>2];oa=na;c[oa>>2]=c[T>>2];c[oa+4>>2]=c[T+4>>2];c[oa+8>>2]=c[T+8>>2];c[oa+12>>2]=c[T+12>>2];Qc=c[sa>>2]|0}oa=c[Qc+104>>2]|0;if((oa|0)==0){break}na=oa+56|0;wc=+h[oa+64>>3];h[Zb>>3]=+h[na>>3];h[Ab>>3]=wc;si(k,j,(c[53548]|0)*90|0);c[Yb>>2]=c[Bb>>2];c[Yb+4>>2]=c[Bb+4>>2];c[Yb+8>>2]=c[Bb+8>>2];c[Yb+12>>2]=c[Bb+12>>2];h[Zb>>3]=+h[Zb>>3]- +h[26781];h[Ab>>3]=+h[Ab>>3]- +h[26782];c[S>>2]=c[Yb>>2];c[S+4>>2]=c[Yb+4>>2];c[S+8>>2]=c[Yb+8>>2];c[S+12>>2]=c[Yb+12>>2];oa=na;c[oa>>2]=c[S>>2];c[oa+4>>2]=c[S+4>>2];c[oa+8>>2]=c[S+8>>2];c[oa+12>>2]=c[S+12>>2]}}while(0);Mc=ow(e,Mc)|0;}while((Mc|0)!=0)}}while(0);ra=vx(e,ra)|0;}while((ra|0)!=0)}Tk(e,c[(c[R>>2]|0)+116>>2]&3)}}while(0);e=c[R>>2]|0;Mc=c[e+12>>2]|0;do{if((Mc|0)!=0){if((a[Mc+81|0]|0)!=0){break}j=a[e+263|0]|0;k=j<<24>>24;do{if((k&4|0)==0){yc=+h[e+16>>3];if((k&2|0)==0){Rc=(yc+ +h[e+32>>3])*.5;break}else{Rc=Jc*.5+yc;break}}else{Rc=+h[e+32>>3]-Jc*.5}}while(0);if((j&1)==0){Sc=Kc*.5+ +h[e+24>>3]}else{Sc=+h[e+40>>3]-Kc*.5}h[Mc+56>>3]=Rc;h[Mc+64>>3]=Sc;a[(c[(c[R>>2]|0)+12>>2]|0)+81|0]=1}}while(0);if((c[53530]|0)==0){i=g;return}R=Q|0;if((a[214952]|0)==0){Sc=+h[26782];Rc=+h[26781];nb(R|0,155504,(Ac=i,i=i+48|0,h[Ac>>3]=Sc,h[Ac+8>>3]=Rc,h[Ac+16>>3]=Sc,h[Ac+24>>3]=Rc,h[Ac+32>>3]=-0.0-Rc,h[Ac+40>>3]=-0.0-Sc,Ac)|0)|0;i=Ac}else{Sc=+h[26781];Rc=+h[26782];nb(R|0,116976,(Ac=i,i=i+32|0,h[Ac>>3]=Sc,h[Ac+8>>3]=Rc,h[Ac+16>>3]=Sc,h[Ac+24>>3]=Rc,Ac)|0)|0;i=Ac}Ac=Lb(R|0)|0;c[c[53530]>>2]=Ac;i=g;return}function Vk(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0;d=b+8|0;do{if((Ix(b|0)|0)!=(b|0)){e=c[d>>2]|0;f=c[e+12>>2]|0;if((f|0)==0){break}if((a[f+81|0]|0)!=0){break}g=a[e+263|0]|0;if((g&1)==0){i=e+104|0;j=+h[e+16>>3]+ +h[e+96>>3]*.5}else{i=e+72|0;j=+h[e+32>>3]- +h[e+64>>3]*.5}k=+h[i>>3];l=g<<24>>24;do{if((l&4|0)==0){if((l&2|0)==0){m=(+h[e+24>>3]+ +h[e+40>>3])*.5;break}else{m=+h[e+40>>3]-k*.5;break}}else{m=k*.5+ +h[e+24>>3]}}while(0);h[f+56>>3]=j;h[f+64>>3]=m;a[(c[(c[d>>2]|0)+12>>2]|0)+81|0]=1}}while(0);i=c[d>>2]|0;if((c[i+172>>2]|0)<1){return}else{n=1;o=i}while(1){Vk(c[(c[o+176>>2]|0)+(n<<2)>>2]|0);i=c[d>>2]|0;if((n|0)<(c[i+172>>2]|0)){n=n+1|0;o=i}else{break}}return}function Wk(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0,p=0;d=b+8|0;do{if((Ix(b|0)|0)!=(b|0)){e=c[d>>2]|0;f=c[e+12>>2]|0;if((f|0)==0){break}if((a[f+81|0]|0)!=0){break}g=a[e+263|0]|0;if((g&1)==0){i=e+48|0;j=+h[e+24>>3]+ +h[e+56>>3]*.5}else{i=e+80|0;j=+h[e+40>>3]- +h[e+88>>3]*.5}k=+h[i>>3];l=g<<24>>24;do{if((l&4|0)==0){m=+h[e+16>>3];if((l&2|0)==0){n=(m+ +h[e+32>>3])*.5;break}else{n=k*.5+m;break}}else{n=+h[e+32>>3]-k*.5}}while(0);h[f+56>>3]=n;h[f+64>>3]=j;a[(c[(c[d>>2]|0)+12>>2]|0)+81|0]=1}}while(0);i=c[d>>2]|0;if((c[i+172>>2]|0)<1){return}else{o=1;p=i}while(1){Wk(c[(c[p+176>>2]|0)+(o<<2)>>2]|0);i=c[d>>2]|0;if((o|0)<(c[i+172>>2]|0)){o=o+1|0;p=i}else{break}}return}function Xk(a){a=a|0;Uk(a,1);return}function Yk(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=(Ix(b|0)|0)==(b|0);e=c[b+8>>2]|0;do{if(d){f=0}else{g=c[e+12>>2]|0;if((g|0)==0){f=0;break}f=(a[g+81|0]|0)!=0|0}}while(0);d=b+8|0;if((c[e+172>>2]|0)<1){h=f;return h|0}else{i=1;j=f;k=e}while(1){e=(Yk(c[(c[k+176>>2]|0)+(i<<2)>>2]|0)|0)+j|0;f=c[d>>2]|0;if((i|0)<(c[f+172>>2]|0)){i=i+1|0;j=e;k=f}else{h=e;break}}return h|0}function Zk(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0;g=i;i=i+40|0;j=f;f=i;i=i+40|0;tF(f,j,40)|0;j=g|0;l=e+8|0;m=c[l>>2]|0;if((c[m+172>>2]|0)>=1){n=f;o=j;p=1;q=m;while(1){Zk(j,c[(c[q+176>>2]|0)+(p<<2)>>2]|0,f);c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];c[n+16>>2]=c[o+16>>2];c[n+20>>2]=c[o+20>>2];c[n+24>>2]=c[o+24>>2];c[n+28>>2]=c[o+28>>2];c[n+32>>2]=c[o+32>>2];c[n+36>>2]=c[o+36>>2];m=c[l>>2]|0;if((p|0)<(c[m+172>>2]|0)){p=p+1|0;q=m}else{break}}}do{if((Ix(e|0)|0)!=(e|0)){q=c[(c[l>>2]|0)+12>>2]|0;if((q|0)==0){break}if((a[q+81|0]|0)==0){break}p=f+32|0;o=c[p>>2]|0;n=f|0;r=(c[k>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,c[k+4>>2]=d[n+4|0]|d[n+5|0]<<8|d[n+6|0]<<16|d[n+7|0]<<24,+h[k>>3]);j=f+8|0;s=(c[k>>2]=d[j]|d[j+1|0]<<8|d[j+2|0]<<16|d[j+3|0]<<24,c[k+4>>2]=d[j+4|0]|d[j+5|0]<<8|d[j+6|0]<<16|d[j+7|0]<<24,+h[k>>3]);m=f+16|0;t=(c[k>>2]=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24,c[k+4>>2]=d[m+4|0]|d[m+5|0]<<8|d[m+6|0]<<16|d[m+7|0]<<24,+h[k>>3]);u=f+24|0;v=(c[k>>2]=d[u]|d[u+1|0]<<8|d[u+2|0]<<16|d[u+3|0]<<24,c[k+4>>2]=d[u+4|0]|d[u+5|0]<<8|d[u+6|0]<<16|d[u+7|0]<<24,+h[k>>3]);w=q+24|0;if((a[214952]|0)==0){x=+h[w>>3];h[o+16>>3]=x;y=+h[q+32>>3];h[o+24>>3]=y;z=x;A=y}else{y=+h[q+32>>3];h[o+16>>3]=y;x=+h[w>>3];h[o+24>>3]=x;z=y;A=x}w=o;B=q+56|0;c[w>>2]=c[B>>2];c[w+4>>2]=c[B+4>>2];c[w+8>>2]=c[B+8>>2];c[w+12>>2]=c[B+12>>2];B=o|0;x=+h[B>>3]-z*.5;h[B>>3]=x;B=o+8|0;y=+h[B>>3]-A*.5;h[B>>3]=y;C=z+x;D=A+y;h[n>>3]=r<x?r:x;h[j>>3]=s<y?s:y;h[m>>3]=t>C?t:C;h[u>>3]=v>D?v:D;c[p>>2]=o+40}}while(0);l=b;b=f;c[l>>2]=c[b>>2];c[l+4>>2]=c[b+4>>2];c[l+8>>2]=c[b+8>>2];c[l+12>>2]=c[b+12>>2];c[l+16>>2]=c[b+16>>2];c[l+20>>2]=c[b+20>>2];c[l+24>>2]=c[b+24>>2];c[l+28>>2]=c[b+28>>2];c[l+32>>2]=c[b+32>>2];c[l+36>>2]=c[b+36>>2];i=g;return}function _k(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+1136|0;e=d+1024|0;f=d+1104|0;g=d+1112|0;j=d+1120|0;k=d+1128|0;l=b|0;m=Sm(ew(l,116816)|0)|0;if((m|0)==0){n=$w(l)|0;Fv(0,155400,(o=i,i=i+8|0,c[o>>2]=n,o)|0)|0;i=o;i=d;return}n=d|0;l=c[53828]|0;if((l|0)==0){p=$g(173152,c[43330]|0)|0;c[53828]=p;q=p}else{q=l}l=Hc[c[q>>2]&63](q,m,512)|0;do{if((l|0)==0){q=Eb(m|0,107984)|0;if((q|0)==0){Fv(0,148208,(o=i,i=i+8|0,c[o>>2]=m,o)|0)|0;i=o;r=0;break}do{if((db(n|0,1024,q|0)|0)==0){s=16}else{p=0;t=0;while(1){u=ac(n|0,145064,(o=i,i=i+32|0,c[o>>2]=f,c[o+8>>2]=g,c[o+16>>2]=j,c[o+24>>2]=k,o)|0)|0;i=o;v=(u|0)==4?1:p;if((a[n]|0)==37){w=t}else{u=(Ua(n|0,142104)|0)==0;w=u?t:1}if((v|0)==0){x=w;y=0}else{if((w|0)==0){x=0;y=v}else{z=v;A=w&255;break}}if((db(n|0,1024,q|0)|0)==0){z=y;A=x&255;break}else{p=y;t=x}}if((z|0)==0){s=16;break}t=kk(64)|0;c[t+32>>2]=c[f>>2];p=t+36|0;c[p>>2]=c[g>>2];c[t+40>>2]=(c[j>>2]|0)-(c[f>>2]|0);c[p>>2]=(c[k>>2]|0)-(c[g>>2]|0);c[t+8>>2]=m;p=c[53652]|0;c[53652]=p+1;c[t+12>>2]=p;Xb(Ta(q|0)|0,e|0)|0;p=c[e+36>>2]|0;v=kk(p+1|0)|0;c[t+52>>2]=v;mc(q|0,0,0)|0;Nb(v|0,p|0,1,q|0)|0;a[v+p|0]=0;p=c[53828]|0;Hc[c[p>>2]&63](p,t,1)|0;a[t+16|0]=A;B=t}}while(0);if((s|0)==16){Fv(0,138968,(o=i,i=i+8|0,c[o>>2]=m,o)|0)|0;i=o;B=0}Ha(q|0)|0;r=B}else{r=l}}while(0);if((r|0)==0){i=d;return}l=c[r+40>>2]|0;B=c[r+44>>2]|0;o=b+8|0;h[(c[o>>2]|0)+32>>3]=+(l|0)/72.0;h[(c[o>>2]|0)+40>>3]=+(B|0)/72.0;b=jk(12)|0;c[(c[o>>2]|0)+12>>2]=b;c[b>>2]=c[r+12>>2];c[b+4>>2]=((l|0)/-2|0)-(c[r+32>>2]|0);c[b+8>>2]=((B|0)/-2|0)-(c[r+36>>2]|0);i=d;return}function $k(a){a=a|0;var b=0;b=c[(c[a+8>>2]|0)+12>>2]|0;if((b|0)==0){return}eF(b);return}function al(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;g=(d|0)!=0;a:do{if(g){h=0;j=1;while(1){k=c[d+(h<<2)>>2]|0;if((k|0)==0){l=4;break a}m=(a[k]|0)==0?0:j;if(m<<24>>24==0){break}else{h=h+1|0;j=m}}}else{l=4}}while(0);do{if((l|0)==4){j=c[e>>2]|0;if((j|0)==0){break}else{n=e;o=j}do{_z(b,o)|0;_z(b,126712)|0;n=n+4|0;o=c[n>>2]|0;}while((o|0)!=0)}}while(0);if(!g){i=f;return}g=c[d>>2]|0;if((g|0)==0){i=f;return}else{p=0;q=g}do{do{if((a[q]|0)!=0){g=Sm(q)|0;if((g|0)==0){Fv(0,114872,(r=i,i=i+8|0,c[r>>2]=q,r)|0)|0;i=r;break}o=Eb(g|0,107984)|0;if((o|0)==0){Fv(0,102272,(r=i,i=i+8|0,c[r>>2]=g,r)|0)|0;i=r;break}g=Rm(o)|0;if((g|0)!=0){n=g;do{_z(b,n)|0;n=Rm(o)|0;}while((n|0)!=0)}_z(b,126712)|0;Ha(o|0)|0}}while(0);p=p+1|0;q=c[d+(p<<2)>>2]|0;}while((q|0)!=0);i=f;return}function bl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;e=c[d+52>>2]|0;a:while(1){d=a[e]|0;b:do{if((d<<24>>24|0)==0){break a}else if((d<<24>>24|0)==37){if((a[e+1|0]|0)!=37){f=e;g=37;break}h=e+2|0;do{if((qm(h,96544,3)|0)==0){i=e;j=37}else{if((qm(h,91216,5)|0)==0){i=e;j=37;break}if((qm(h,86016,3)|0)==0){i=e;j=37;break}if((qm(h,81360,7)|0)==0){i=e;j=37}else{f=e;g=d;break b}}}while(0);while(1){if((j<<24>>24|0)==13){k=10;break}else if((j<<24>>24|0)==0|(j<<24>>24|0)==10){k=12;break}h=i+1|0;i=h;j=a[h]|0}do{if((k|0)==10){k=0;h=i+1|0;if((a[h]|0)!=10){l=h;break}e=i+2|0;continue a}else if((k|0)==12){k=0;l=i+1|0}}while(0);e=j<<24>>24==0?i:l;continue a}else{f=e;g=d}}while(0);while(1){if((g<<24>>24|0)==13){k=16;break}else if((g<<24>>24|0)==0|(g<<24>>24|0)==10){k=18;break}$z(b,g<<24>>24)|0;d=f+1|0;f=d;g=a[d]|0}do{if((k|0)==16){k=0;d=f+1|0;if((a[d]|0)!=10){m=d;k=19;break}n=f+2|0}else if((k|0)==18){k=0;m=f+1|0;k=19}}while(0);if((k|0)==19){k=0;n=g<<24>>24==0?f:m}$z(b,10)|0;e=n}return}function cl(b){b=b|0;var d=0,e=0,f=0,g=0;d=i;e=c[53828]|0;if((e|0)==0){i=d;return}f=Hc[c[e>>2]&63](e,0,128)|0;if((f|0)==0){i=d;return}else{g=f}do{if((a[g+16|0]|0)==0){dA(b,167576,(f=i,i=i+8|0,c[f>>2]=c[g+12>>2],f)|0);i=f;_z(b,163384)|0;bl(b,g);_z(b,159368)|0;_z(b,154296)|0}f=c[53828]|0;g=Hc[c[f>>2]&63](f,g,8)|0;}while((g|0)!=0);i=d;return}function dl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;do{if((d|0)==0){f=0;g=b;a:while(1){h=g;while(1){j=a[h]|0;if(j<<24>>24==0){k=7;break a}if((j&255)>>>0<127>>>0){h=h+1|0}else{break}}if((j&-4)<<24>>24==-64){f=1;g=h+2|0}else{k=9;break}}if((k|0)==7){if((f|0)!=1){l=b;break}l=ln(b)|0;break}else if((k|0)==9){if(a[13144]|0){l=b;break}Fv(0,151120,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;a[13144]=1;l=b;break}}else{l=ln(b)|0}}while(0);if((c[43808]|0)==0){Iv(175232,0,0)}k=c[43809]|0;if(k>>>0<(c[43810]|0)>>>0){m=k}else{Jv(175232,1)|0;m=c[43809]|0}c[43809]=m+1;a[m]=40;m=l;while(1){k=a[m]|0;if((k<<24>>24|0)==40|(k<<24>>24|0)==41|(k<<24>>24|0)==92){j=c[43809]|0;if(j>>>0<(c[43810]|0)>>>0){n=j}else{Jv(175232,1)|0;n=c[43809]|0}c[43809]=n+1;a[n]=92}else if((k<<24>>24|0)==0){break}k=c[43809]|0;if(k>>>0<(c[43810]|0)>>>0){o=k}else{Jv(175232,1)|0;o=c[43809]|0}k=a[m]|0;c[43809]=o+1;a[o]=k;m=m+1|0}m=c[43809]|0;if(m>>>0<(c[43810]|0)>>>0){p=m}else{Jv(175232,1)|0;p=c[43809]|0}c[43809]=p+1;a[p]=41;if((l|0)!=(b|0)){eF(l)}l=c[43809]|0;if(l>>>0<(c[43810]|0)>>>0){q=l;a[q]=0;r=c[43808]|0;c[43809]=r;i=e;return r|0}Jv(175232,1)|0;q=c[43809]|0;a[q]=0;r=c[43808]|0;c[43809]=r;i=e;return r|0}function el(a,b,d){a=a|0;b=b|0;d=d|0;eF(c[b+52>>2]|0);return}function fl(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+80|0;j=a;a=i;i=i+16|0;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=d;d=i;i=i+8|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];j=g|0;k=g+8|0;l=g+16|0;m=g+48|0;h[l>>3]=+h[a>>3];h[l+8>>3]=+h[a+8>>3];h[l+16>>3]=+h[b>>3];h[l+24>>3]=+h[b+8>>3];if((PB(d,l|0,j)|0)<0){n=0;i=g;return n|0}do{if((f|0)==0){l=d+4|0;b=c[l>>2]|0;if((b|0)>(c[45170]|0)){a=c[45168]|0;if((a|0)==0){o=kk(b<<5)|0}else{o=mk(a,b<<5)|0}c[45168]=o;a=c[l>>2]|0;c[45170]=a;p=a}else{p=b}b=c[45168]|0;if((p|0)>0){a=c[d>>2]|0;l=0;while(1){q=b+(l<<5)|0;r=a+(l<<4)|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];r=l+1|0;q=b+(l<<5)+16|0;s=a+(((r|0)%(p|0)|0)<<4)|0;c[q>>2]=c[s>>2];c[q+4>>2]=c[s+4>>2];c[q+8>>2]=c[s+8>>2];c[q+12>>2]=c[s+12>>2];if((r|0)<(p|0)){l=r}else{break}}}vF(m|0,0,32)|0;if((MB(b,p,j,m|0,k)|0)<0){n=0}else{break}i=g;return n|0}else{ZB(j,k)}}while(0);j=k+4|0;m=c[j>>2]|0;p=c[44370]|0;do{if((p|0)<(m|0)){d=m+300+p-((m|0)%300|0)|0;o=mk(c[43814]|0,d<<4)|0;c[43814]=o;if((o|0)!=0){c[44370]=d;t=c[j>>2]|0;break}Fv(1,126600,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,d)|0)|0;i=d;n=0;i=g;return n|0}else{t=m}}while(0);if((t|0)>0){m=c[43814]|0;j=c[k>>2]|0;k=0;do{p=m+(k<<4)|0;d=j+(k<<4)|0;c[p>>2]=c[d>>2];c[p+4>>2]=c[d+4>>2];c[p+8>>2]=c[d+8>>2];c[p+12>>2]=c[d+12>>2];k=k+1|0;}while((k|0)<(t|0))}c[e>>2]=t;n=c[43814]|0;i=g;return n|0}function gl(){var b=0,d=0,e=0,f=0;b=i;d=c[43780]|0;c[43780]=d+1;do{if((d|0)>0){e=0}else{f=kk(4800)|0;c[43814]=f;if((f|0)==0){Fv(1,116592,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;e=1;break}c[44370]=300;c[44282]=0;c[44290]=0;if((a[213992]|0)==0){e=0;break}ym();e=0}}while(0);i=b;return e|0}function hl(){var b=0,d=0,e=0,f=0,g=0.0;b=i;d=(c[43780]|0)-1|0;c[43780]=d;if((d|0)>0){i=b;return}eF(c[43814]|0);if((a[213992]|0)==0){i=b;return}d=c[o>>2]|0;e=c[44282]|0;f=c[44290]|0;g=+zm();gc(d|0,155248,(d=i,i=i+24|0,c[d>>2]=e,c[d+8>>2]=f,h[d+16>>3]=g,d)|0)|0;i=d;i=b;return}function il(a,b){a=a|0;b=b|0;return jl(a,b,0)|0}function jl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0.0,T=0,U=0.0,X=0,Y=0.0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0,Ha=0.0,Ia=0.0,Ja=0.0,Ka=0.0,La=0,Na=0.0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0,Ya=0,Za=0,_a=0.0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0;f=i;i=i+96|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+56|0;n=f+88|0;c[44282]=(c[44282]|0)+1;p=b+80|0;c[44290]=(c[44290]|0)+(c[p>>2]|0);q=c[b+88>>2]|0;a:do{if((q|0)!=0){r=q;while(1){s=c[r+8>>2]|0;if((a[s+112|0]|0)==0){break}t=c[s+116>>2]|0;if((t|0)==0){break a}else{r=t}}t=c[b+84>>2]|0;s=c[p>>2]|0;u=(s|0)>0;if(u){v=0;w=0;while(1){x=t+(v<<5)|0;y=+h[t+(v<<5)+8>>3]- +h[t+(v<<5)+24>>3];if(y<0.0){z=-0.0-y}else{z=y}do{if(z<.01){A=w}else{y=+h[x>>3]- +h[t+(v<<5)+16>>3];if(y<0.0){B=-0.0-y}else{B=y}if(B<.01){A=w;break}if((w|0)!=(v|0)){C=t+(w<<5)|0;D=x;c[C>>2]=c[D>>2];c[C+4>>2]=c[D+4>>2];c[C+8>>2]=c[D+8>>2];c[C+12>>2]=c[D+12>>2];c[C+16>>2]=c[D+16>>2];c[C+20>>2]=c[D+20>>2];c[C+24>>2]=c[D+24>>2];c[C+28>>2]=c[D+28>>2]}A=w+1|0}}while(0);x=v+1|0;if((x|0)<(s|0)){v=x;w=A}else{E=A;break}}}else{E=0}w=t|0;y=+h[w>>3];v=t+16|0;F=+h[v>>3];do{if(y<=F){x=t+8|0;G=+h[x>>3];D=t+24|0;H=+h[D>>3];if(G>H){break}C=E-1|0;do{if((C|0)>0){I=c[o>>2]|0;J=0;K=F;L=y;M=H;N=G;while(1){O=J+1|0;P=t+(O<<5)|0;Q=+h[P>>3];R=t+(O<<5)+16|0;S=+h[R>>3];if(Q>S){break}T=t+(O<<5)+8|0;U=+h[T>>3];X=t+(O<<5)+24|0;Y=+h[X>>3];if(U>Y){break}Z=t+(J<<5)+16|0;_=K<Q;$=_&1;aa=t+(J<<5)|0;ba=L>S;ca=ba&1;da=t+(J<<5)+24|0;ea=M<U;fa=ea&1;ga=t+(J<<5)+8|0;ha=N>Y;ia=ha&1;ja=ca+$+fa+ia|0;ka=(ja|0)>0;if(!((a[213992]|0)==0|ka^1)){gc(I|0,163336,(la=i,i=i+16|0,c[la>>2]=J,c[la+8>>2]=O,la)|0)|0;i=la;nl(b)}do{if(ka){do{if(_){ma=~~+h[Z>>3];h[Z>>3]=+h[P>>3];h[P>>3]=+(ma|0);na=ia;oa=fa;pa=ca;qa=0}else{if(ba){ma=~~+h[aa>>3];h[aa>>3]=+h[R>>3];h[R>>3]=+(ma|0);na=ia;oa=fa;pa=0;qa=$;break}if(ea){ma=~~+h[da>>3];h[da>>3]=+h[T>>3];h[T>>3]=+(ma|0);na=ia;oa=0;pa=ca;qa=$;break}if(!ha){na=ia;oa=fa;pa=ca;qa=$;break}ma=~~+h[ga>>3];h[ga>>3]=+h[X>>3];h[X>>3]=+(ma|0);na=0;oa=fa;pa=ca;qa=$}}while(0);ma=ja-1|0;if((ma|0)>0){ra=0;sa=qa;ta=pa;ua=oa;va=na}else{break}while(1){do{if((sa|0)==1){Y=+(~~((+h[Z>>3]+ +h[P>>3])*.5+.5)|0);h[P>>3]=Y;h[Z>>3]=Y;wa=va;xa=ua;ya=ta;za=0}else{if((ta|0)==1){Y=+(~~((+h[aa>>3]+ +h[R>>3])*.5+.5)|0);h[R>>3]=Y;h[aa>>3]=Y;wa=va;xa=ua;ya=0;za=sa;break}if((ua|0)==1){Y=+(~~((+h[da>>3]+ +h[T>>3])*.5+.5)|0);h[T>>3]=Y;h[da>>3]=Y;wa=va;xa=0;ya=ta;za=sa;break}if((va|0)!=1){wa=va;xa=ua;ya=ta;za=sa;break}Y=+(~~((+h[ga>>3]+ +h[X>>3])*.5+.5)|0);h[X>>3]=Y;h[ga>>3]=Y;wa=0;xa=ua;ya=ta;za=sa}}while(0);Aa=ra+1|0;if((Aa|0)<(ma|0)){ra=Aa;sa=za;ta=ya;ua=xa;va=wa}else{break}}}}while(0);Y=+h[aa>>3];ja=~~Y;U=+h[Z>>3];$=~~U;S=+h[P>>3];ca=~~S;Q=+h[R>>3];fa=~~Q;do{if(($|0)>(ca|0)&(ja|0)<(fa|0)){if(!((ca|0)>(ja|0)|(ja|0)>(fa|0))){Ba=fa-ja|0;break}if((ca|0)>($|0)|($|0)>(fa|0)){ia=$-ja|0;ha=fa-ca|0;Ba=(ia|0)<(ha|0)?ia:ha;break}else{Ba=$-ca|0;break}}else{Ba=0}}while(0);Ca=+h[ga>>3];ca=~~Ca;Da=+h[da>>3];$=~~Da;Ea=+h[T>>3];fa=~~Ea;Fa=+h[X>>3];ja=~~Fa;do{if(($|0)>(fa|0)&(ca|0)<(ja|0)){do{if((fa|0)>(ca|0)|(ca|0)>(ja|0)){if((fa|0)>($|0)|($|0)>(ja|0)){ha=$-ca|0;ia=ja-fa|0;Ga=(ha|0)<(ia|0)?ha:ia;break}else{Ga=$-fa|0;break}}else{Ga=ja-ca|0}}while(0);if((Ba|0)==0|(Ga|0)==0){Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}if((Ba|0)<(Ga|0)){ia=U<Q;if(U-Y>Q-S){if(ia){h[Z>>3]=S;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}else{h[aa>>3]=Q;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}}else{if(ia){h[P>>3]=U;Ha=Q;Ia=U;Ja=Fa;Ka=Ea;break}else{h[R>>3]=Y;Ha=Y;Ia=S;Ja=Fa;Ka=Ea;break}}}else{ia=Da<Fa;if(Da-Ca>Fa-Ea){if(ia){h[da>>3]=Ea;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}else{h[ga>>3]=Fa;Ha=Q;Ia=S;Ja=Fa;Ka=Ea;break}}else{if(ia){h[T>>3]=Da;Ha=Q;Ia=S;Ja=Fa;Ka=Da;break}else{h[X>>3]=Ca;Ha=Q;Ia=S;Ja=Ca;Ka=Ea;break}}}}else{Ha=Q;Ia=S;Ja=Fa;Ka=Ea}}while(0);if((O|0)<(C|0)){J=O;K=Ha;L=Ia;M=Ja;N=Ka}else{La=75;break}}if((La|0)==75){Na=+h[w>>3];break}Fv(1,167528,(la=i,i=i+8|0,c[la>>2]=O,la)|0)|0;i=la;nl(b);Oa=0;i=f;return Oa|0}else{Na=y}}while(0);J=b|0;G=+h[J>>3];do{if(G<Na){La=80}else{if(G>+h[v>>3]){La=80;break}H=+h[b+8>>3];if(H<+h[x>>3]){La=80;break}if(H>+h[D>>3]){La=80}}}while(0);do{if((La|0)==80){if((a[213992]|0)==0){Pa=G;Qa=Na}else{Ma(159320,42,1,c[o>>2]|0)|0;nl(b);Pa=+h[J>>3];Qa=+h[w>>3]}if(Pa<Qa){h[J>>3]=Qa;Ra=Qa}else{Ra=Pa}H=+h[v>>3];if(Ra>H){h[J>>3]=H}I=b+8|0;H=+h[I>>3];N=+h[x>>3];if(H<N){h[I>>3]=N;Sa=N}else{Sa=H}H=+h[D>>3];if(Sa<=H){break}h[I>>3]=H}}while(0);D=b+40|0;G=+h[D>>3];I=t+(C<<5)|0;H=+h[I>>3];do{if(G<H){La=94}else{if(G>+h[t+(C<<5)+16>>3]){La=94;break}N=+h[b+48>>3];if(N<+h[t+(C<<5)+8>>3]){La=94;break}if(N>+h[t+(C<<5)+24>>3]){La=94}}}while(0);do{if((La|0)==94){if((a[213992]|0)==0){Ta=G;Ua=H}else{Ma(154240,39,1,c[o>>2]|0)|0;nl(b);Ta=+h[D>>3];Ua=+h[I>>3]}if(Ta<Ua){h[D>>3]=Ua;Va=Ua}else{Va=Ta}N=+h[t+(C<<5)+16>>3];if(Va>N){h[D>>3]=N}X=b+48|0;N=+h[X>>3];M=+h[t+(C<<5)+8>>3];if(N<M){h[X>>3]=M;Wa=M}else{Wa=N}N=+h[t+(C<<5)+24>>3];if(Wa<=N){break}h[X>>3]=N}}while(0);C=s<<3;if((C|0)>(c[44072]|0)){I=c[44070]|0;if((I|0)==0){Xa=kk(s<<7)|0}else{Xa=mk(I,s<<7)|0}c[44070]=Xa;c[44072]=C}b:do{if((s|0)>1){H=+h[x>>3];C=H<=+h[t+40>>3];if(C|u^1){Ya=C&1^1;break}else{Za=0;_a=H}while(1){C=t+(Za<<5)+24|0;H=+h[C>>3];h[C>>3]=_a*-1.0;h[t+(Za<<5)+8>>3]=-0.0-H;C=Za+1|0;if((C|0)>=(s|0)){Ya=1;break b}Za=C;_a=+h[t+(C<<5)+8>>3]}}else{Ya=0}}while(0);x=r;C=c[x>>2]&3;I=r+32|0;X=c[((C|0)==3?r:I)+28>>2]|0;T=r-32|0;if((X|0)==(c[((C|0)==2?r:T)+28>>2]|0)){C=$w(X|0)|0;Fv(1,102232,(la=i,i=i+8|0,c[la>>2]=C,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}c:do{if(u){C=s-1|0;X=c[44070]|0;ga=0;da=0;d:while(1){if((da|0)>0){$a=+h[t+(da<<5)+8>>3]>+h[t+(da-1<<5)+8>>3]?-1:1}else{$a=0}if((da|0)<(C|0)){ab=+h[t+(da+1<<5)+8>>3]>+h[t+(da<<5)+8>>3]?1:-1}else{ab=0}do{if(($a|0)==(ab|0)){if(($a|0)==(-1|0)){bb=ga;break}else if(($a|0)!=0){La=126;break d}R=t+(da<<5)|0;h[X+(ga<<4)>>3]=+h[R>>3];P=ga+1|0;h[X+(ga<<4)+8>>3]=+h[t+(da<<5)+24>>3];h[X+(P<<4)>>3]=+h[R>>3];h[X+(P<<4)+8>>3]=+h[t+(da<<5)+8>>3];bb=ga+2|0}else{if((ab|0)==-1|($a|0)==1){P=t+(da<<5)|0;h[X+(ga<<4)>>3]=+h[P>>3];R=ga+1|0;h[X+(ga<<4)+8>>3]=+h[t+(da<<5)+24>>3];h[X+(R<<4)>>3]=+h[P>>3];h[X+(R<<4)+8>>3]=+h[t+(da<<5)+8>>3];bb=ga+2|0;break}else{R=t+(da<<5)+16|0;h[X+(ga<<4)>>3]=+h[R>>3];P=ga+1|0;h[X+(ga<<4)+8>>3]=+h[t+(da<<5)+8>>3];h[X+(P<<4)>>3]=+h[R>>3];h[X+(P<<4)+8>>3]=+h[t+(da<<5)+24>>3];bb=ga+2|0;break}}}while(0);P=da+1|0;if((P|0)<(s|0)){ga=bb;da=P}else{break}}if((La|0)==126){Fv(1,107912,(la=i,i=i+24|0,c[la>>2]=$a,c[la+8>>2]=$a,c[la+16>>2]=480,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}if(!u){cb=bb;break}da=c[44070]|0;ga=bb;X=C;e:while(1){if((X|0)<(C|0)){db=+h[t+(X<<5)+8>>3]>+h[t+(X+1<<5)+8>>3]?-1:1}else{db=0}P=(X|0)>0;if(P){eb=+h[t+(X-1<<5)+8>>3]>+h[t+(X<<5)+8>>3]?1:-1}else{eb=0}do{if((db|0)==(eb|0)){if((db|0)==0){R=t+(X<<5)+16|0;h[da+(ga<<4)>>3]=+h[R>>3];aa=ga+1|0;h[da+(ga<<4)+8>>3]=+h[t+(X<<5)+8>>3];h[da+(aa<<4)>>3]=+h[R>>3];h[da+(aa<<4)+8>>3]=+h[t+(X<<5)+24>>3];fb=ga+2|0;break}else if((db|0)==(-1|0)){aa=t+(X<<5)+16|0;h[da+(ga<<4)>>3]=+h[aa>>3];R=t+(X<<5)+8|0;Z=ga+1|0;h[da+(ga<<4)+8>>3]=+h[R>>3];h[da+(Z<<4)>>3]=+h[aa>>3];aa=t+(X<<5)+24|0;ca=ga+2|0;h[da+(Z<<4)+8>>3]=+h[aa>>3];Z=t+(X<<5)|0;h[da+(ca<<4)>>3]=+h[Z>>3];ja=ga+3|0;h[da+(ca<<4)+8>>3]=+h[aa>>3];h[da+(ja<<4)>>3]=+h[Z>>3];h[da+(ja<<4)+8>>3]=+h[R>>3];fb=ga+4|0;break}else{break e}}else{if((eb|0)==-1|(db|0)==1){R=t+(X<<5)|0;h[da+(ga<<4)>>3]=+h[R>>3];ja=ga+1|0;h[da+(ga<<4)+8>>3]=+h[t+(X<<5)+24>>3];h[da+(ja<<4)>>3]=+h[R>>3];h[da+(ja<<4)+8>>3]=+h[t+(X<<5)+8>>3];fb=ga+2|0;break}else{ja=t+(X<<5)+16|0;h[da+(ga<<4)>>3]=+h[ja>>3];R=ga+1|0;h[da+(ga<<4)+8>>3]=+h[t+(X<<5)+8>>3];h[da+(R<<4)>>3]=+h[ja>>3];h[da+(R<<4)+8>>3]=+h[t+(X<<5)+24>>3];fb=ga+2|0;break}}}while(0);if(P){ga=fb;X=X-1|0}else{cb=fb;break c}}Fv(1,107912,(la=i,i=i+24|0,c[la>>2]=db,c[la+8>>2]=db,c[la+16>>2]=513,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}else{cb=0}}while(0);do{if((Ya|0)!=0){if(u){X=0;do{ga=t+(X<<5)+24|0;da=~~+h[ga>>3];C=t+(X<<5)+8|0;h[ga>>3]=+h[C>>3]*-1.0;h[C>>3]=+(-da|0);X=X+1|0;}while((X|0)<(s|0))}if((cb|0)<=0){break}X=c[44070]|0;da=0;do{C=X+(da<<4)+8|0;h[C>>3]=+h[C>>3]*-1.0;da=da+1|0;}while((da|0)<(cb|0))}}while(0);if(u){da=0;do{h[t+(da<<5)>>3]=2147483647.0;h[t+(da<<5)+16>>3]=-2147483648.0;da=da+1|0;}while((da|0)<(s|0))}c[g>>2]=c[44070];da=g+4|0;c[da>>2]=cb;h[l>>3]=+h[J>>3];h[l+8>>3]=+h[b+8>>3];h[l+16>>3]=+h[D>>3];h[l+24>>3]=+h[b+48>>3];if((PB(g,l|0,j)|0)<0){Fv(1,96504,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}do{if((e|0)==0){X=c[da>>2]|0;if((X|0)>(c[45170]|0)){C=c[45168]|0;if((C|0)==0){gb=kk(X<<5)|0}else{gb=mk(C,X<<5)|0}c[45168]=gb;C=c[da>>2]|0;c[45170]=C;hb=C}else{hb=X}if((hb|0)>0){X=c[45168]|0;C=c[44070]|0;ga=0;while(1){R=X+(ga<<5)|0;ja=C+(ga<<4)|0;c[R>>2]=c[ja>>2];c[R+4>>2]=c[ja+4>>2];c[R+8>>2]=c[ja+8>>2];c[R+12>>2]=c[ja+12>>2];ja=ga+1|0;R=X+(ga<<5)+16|0;Z=C+(((ja|0)%(hb|0)|0)<<4)|0;c[R>>2]=c[Z>>2];c[R+4>>2]=c[Z+4>>2];c[R+8>>2]=c[Z+8>>2];c[R+12>>2]=c[Z+12>>2];if((ja|0)<(hb|0)){ga=ja}else{break}}}if((a[b+29|0]|0)==0){vF(m|0,0,16)|0}else{H=+h[b+16>>3];h[m>>3]=+V(H);h[m+8>>3]=+W(H)}if((a[b+69|0]|0)==0){vF(m+16|0,0,16)|0}else{H=+h[b+56>>3];h[m+16>>3]=-0.0- +V(H);h[m+24>>3]=-0.0- +W(H)}if((MB(c[45168]|0,hb,j,m|0,k)|0)>=0){break}Fv(1,91176,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}else{ZB(j,k)}}while(0);da=k+4|0;D=c[da>>2]|0;J=c[44370]|0;do{if((J|0)<(D|0)){ga=D+300+J-((D|0)%300|0)|0;C=mk(c[43814]|0,ga<<4)|0;c[43814]=C;if((C|0)!=0){c[44370]=ga;break}Fv(1,126600,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}}while(0);if(u){D=0;do{h[t+(D<<5)>>3]=2147483647.0;h[t+(D<<5)+16>>3]=-2147483648.0;D=D+1|0;}while((D|0)<(s|0))}D=c[da>>2]|0;if((D|0)>0){J=c[43814]|0;ga=c[k>>2]|0;C=0;do{X=J+(C<<4)|0;ja=ga+(C<<4)|0;c[X>>2]=c[ja>>2];c[X+4>>2]=c[ja+4>>2];c[X+8>>2]=c[ja+8>>2];c[X+12>>2]=c[ja+12>>2];C=C+1|0;}while((C|0)<(D|0))}f:do{if(u){C=0;ga=10;J=1;ja=D;while(1){ml(t,s,c[43814]|0,ja,ga);X=0;while(1){if(+h[t+(X<<5)>>3]==2147483647.0){La=185;break}Z=X+1|0;if(+h[t+(X<<5)+16>>3]==-2147483648.0){La=185;break}if((Z|0)<(s|0)){X=Z}else{ib=ga;jb=C;kb=Z;break}}if((La|0)==185){La=0;P=ga<<1;ib=P;jb=(P|0)>(2147483647/(s|0)|0|0)?15:C;kb=X}P=(kb|0)==(s|0)?0:J;Z=jb+1|0;if(!(P<<24>>24!=0&(Z|0)<15)){lb=P;break f}C=Z;ga=ib;J=P;ja=c[da>>2]|0}}else{ja=(s|0)==0;J=1;ga=1;C=D;while(1){ml(t,s,c[43814]|0,C,10);P=ja?0:ga;if(!(P<<24>>24!=0&(J|0)<15)){lb=P;break f}J=J+1|0;ga=P;C=c[da>>2]|0}}}while(0);if(lb<<24>>24!=0){D=$w(c[((c[x>>2]&3|0)==3?r:I)+28>>2]|0)|0;C=$w(c[((c[x>>2]&3|0)==2?r:T)+28>>2]|0)|0;Fv(0,85904,(la=i,i=i+16|0,c[la>>2]=D,c[la+8>>2]=C,la)|0)|0;i=la;ZB(j,n);C=n|0;ml(t,s,c[C>>2]|0,c[n+4>>2]|0,10);eF(c[C>>2]|0)}c[d>>2]=c[da>>2];Oa=c[43814]|0;i=f;return Oa|0}}while(0);Fv(1,81296,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;nl(b);Oa=0;i=f;return Oa|0}}while(0);Fv(1,114784,(la=i,i=i+1|0,i=i+7&-8,c[la>>2]=0,la)|0)|0;i=la;Oa=0;i=f;return Oa|0}function kl(a,b){a=a|0;b=b|0;return jl(a,b,1)|0}function ll(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0.0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,U=0,V=0.0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,aa=0;j=i;i=i+240|0;k=j|0;l=j+64|0;m=j+128|0;n=j+144|0;o=j+160|0;p=j+224|0;q=j+232|0;r=e;s=c[r>>2]|0;t=s&3;u=e-32|0;v=c[((t|0)==2?e:u)+28>>2]|0;w=c[e+8>>2]|0;x=b[w+168>>1]|0;y=x<<16>>16;z=k+16|0;A=k|0;B=c[(c[((t|0)==3?e:e+32|0)+28>>2]|0)+8>>2]|0;C=+h[B+16>>3]+ +h[w+16>>3];D=+h[B+24>>3]+ +h[w+24>>3];B=k;h[k>>3]=C;h[k+8>>3]=D;t=z;c[t>>2]=c[B>>2];c[t+4>>2]=c[B+4>>2];c[t+8>>2]=c[B+8>>2];c[t+12>>2]=c[B+12>>2];E=m;c[E>>2]=c[B>>2];c[E+4>>2]=c[B+4>>2];c[E+8>>2]=c[B+8>>2];c[E+12>>2]=c[B+12>>2];F=k+32|0;G=c[v+8>>2]|0;H=+h[G+16>>3]+ +h[w+56>>3];I=+h[G+24>>3]+ +h[w+64>>3];w=k+48|0;h[k+48>>3]=H;h[k+56>>3]=I;G=F;c[G>>2]=c[w>>2];c[G+4>>2]=c[w+4>>2];c[G+8>>2]=c[w+8>>2];c[G+12>>2]=c[w+12>>2];J=n;c[J>>2]=c[w>>2];c[J+4>>2]=c[w+4>>2];c[J+8>>2]=c[w+8>>2];c[J+12>>2]=c[w+12>>2];if(!(x<<16>>16!=1&(a[215376]|0)==0)){if((f|0)==4){K=d+8|0;L=c[K>>2]|0;M=(+h[L+16>>3]+ +h[L+32>>3])*.5;h[22376]=M;L=c[K>>2]|0;N=(+h[L+24>>3]+ +h[L+40>>3])*.5;h[22377]=N;O=(C+H)*.5;P=(D+I)*.5;Q=H-C;R=I-D;S=+T(Q*Q+R*R)/5.0;R=M-O;M=N-P;N=+T(R*R+M*M);Q=O-S*(R/N);R=P-S*(M/N);h[k+32>>3]=Q;h[k+16>>3]=Q;h[k+40>>3]=R;h[k+24>>3]=R;U=c[r>>2]|0}else{U=s}cm(e,c[((U&3|0)==2?e:u)+28>>2]|0,A,4,g);nm(d,e,m,n);i=j;return}R=C-H;Q=D-I;N=Q*Q;if(R*R+N<1.0e-6){c[t>>2]=c[B>>2];c[t+4>>2]=c[B+4>>2];c[t+8>>2]=c[B+8>>2];c[t+12>>2]=c[B+12>>2];c[G>>2]=c[w>>2];c[G+4>>2]=c[w+4>>2];c[G+8>>2]=c[w+8>>2];c[G+12>>2]=c[w+12>>2];V=0.0;W=0.0}else{R=H-C;M=+T(R*R+N);A=c[(c[(c[d+48>>2]|0)+8>>2]|0)+236>>2]|0;N=+((da(A,y-1|0)|0)/2|0|0);S=Q*N/M;h[z>>3]=C+S;C=R*N/M;h[k+24>>3]=D+C;h[F>>3]=S+H;h[k+40>>3]=C+I;I=+(-A|0);V=R*I/M;W=Q*I/M}if(x<<16>>16<=0){i=j;return}x=(f|0)==6;f=q+4|0;A=o|0;u=q|0;U=p|0;r=p+4|0;L=z|0;z=k+24|0;K=F|0;F=k+40|0;X=l|0;Y=1;Z=e;e=s;while(1){s=Z;_=Z-32|0;if((c[((e&3|0)==2?Z:_)+28>>2]|0)==(v|0)){c[E>>2]=c[B>>2];c[E+4>>2]=c[B+4>>2];c[E+8>>2]=c[B+8>>2];c[E+12>>2]=c[B+12>>2];c[J>>2]=c[w>>2];c[J+4>>2]=c[w+4>>2];c[J+8>>2]=c[w+8>>2];c[J+12>>2]=c[w+12>>2];$=l;aa=k;c[$>>2]=c[aa>>2];c[$+4>>2]=c[aa+4>>2];c[$+8>>2]=c[aa+8>>2];c[$+12>>2]=c[aa+12>>2];aa=l+16|0;c[aa>>2]=c[t>>2];c[aa+4>>2]=c[t+4>>2];c[aa+8>>2]=c[t+8>>2];c[aa+12>>2]=c[t+12>>2];aa=l+32|0;c[aa>>2]=c[G>>2];c[aa+4>>2]=c[G+4>>2];c[aa+8>>2]=c[G+8>>2];c[aa+12>>2]=c[G+12>>2];aa=l+48|0;c[aa>>2]=c[w>>2];c[aa+4>>2]=c[w+4>>2];c[aa+8>>2]=c[w+8>>2];c[aa+12>>2]=c[w+12>>2]}else{c[E>>2]=c[w>>2];c[E+4>>2]=c[w+4>>2];c[E+8>>2]=c[w+8>>2];c[E+12>>2]=c[w+12>>2];c[J>>2]=c[B>>2];c[J+4>>2]=c[B+4>>2];c[J+8>>2]=c[B+8>>2];c[J+12>>2]=c[B+12>>2];aa=l+48|0;$=k;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];$=l+32|0;c[$>>2]=c[t>>2];c[$+4>>2]=c[t+4>>2];c[$+8>>2]=c[t+8>>2];c[$+12>>2]=c[t+12>>2];$=l+16|0;c[$>>2]=c[G>>2];c[$+4>>2]=c[G+4>>2];c[$+8>>2]=c[G+8>>2];c[$+12>>2]=c[G+12>>2];$=l;c[$>>2]=c[w>>2];c[$+4>>2]=c[w+4>>2];c[$+8>>2]=c[w+8>>2];c[$+12>>2]=c[w+12>>2]}if(x){c[f>>2]=4;c[u>>2]=A;$=o;aa=l;c[$>>2]=c[aa>>2];c[$+4>>2]=c[aa+4>>2];c[$+8>>2]=c[aa+8>>2];c[$+12>>2]=c[aa+12>>2];aa=o+16|0;$=l+16|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];$=o+32|0;aa=l+32|0;c[$>>2]=c[aa>>2];c[$+4>>2]=c[aa+4>>2];c[$+8>>2]=c[aa+8>>2];c[$+12>>2]=c[aa+12>>2];aa=o+48|0;$=l+48|0;c[aa>>2]=c[$>>2];c[aa+4>>2]=c[$+4>>2];c[aa+8>>2]=c[$+8>>2];c[aa+12>>2]=c[$+12>>2];ZB(q,p);cm(Z,c[((c[s>>2]&3|0)==2?Z:_)+28>>2]|0,c[U>>2]|0,c[r>>2]|0,g)}else{cm(Z,c[((c[s>>2]&3|0)==2?Z:_)+28>>2]|0,X,4,g)}nm(d,Z,m,n);_=c[(c[Z+8>>2]|0)+172>>2]|0;h[L>>3]=W+ +h[L>>3];h[z>>3]=V+ +h[z>>3];h[K>>3]=W+ +h[K>>3];h[F>>3]=V+ +h[F>>3];if((Y|0)>=(y|0)){break}Y=Y+1|0;Z=_;e=c[_>>2]|0}i=j;return}function ml(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0;f=da(e,b)|0;if((d|0)<=3){return}e=(f|0)<0;g=+(f|0);i=(b|0)>0;j=0;k=3;while(1){a:do{if(!e){l=c+(j<<4)|0;m=c+(j<<4)+8|0;n=j+1|0;o=c+(n<<4)|0;p=c+(n<<4)+8|0;n=j+2|0;q=c+(n<<4)|0;r=c+(n<<4)+8|0;n=c+(k<<4)|0;s=c+(k<<4)+8|0;if(i){t=0}else{break}while(1){u=+(t|0)/g;v=+h[l>>3];w=+h[m>>3];x=+h[o>>3];y=+h[p>>3];z=+h[q>>3];A=+h[r>>3];B=v+u*(x-v);v=w+u*(y-w);w=x+u*(z-x);x=y+u*(A-y);y=B+u*(w-B);B=v+u*(x-v);v=y+u*(w+u*(z+u*(+h[n>>3]-z)-w)-y);y=B+u*(x+u*(A+u*(+h[s>>3]-A)-x)-B);C=0;do{do{if(y<=+h[a+(C<<5)+24>>3]+1.0e-4){if(y<+h[a+(C<<5)+8>>3]+-1.0e-4){break}D=a+(C<<5)|0;if(+h[D>>3]>v){h[D>>3]=v}D=a+(C<<5)+16|0;if(+h[D>>3]>=v){break}h[D>>3]=v}}while(0);C=C+1|0;}while((C|0)<(b|0));if((t|0)>=(f|0)){break a}t=t+1|0}}}while(0);s=k+3|0;if((s|0)<(d|0)){j=k;k=s}else{break}}return}function nl(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0.0,q=0.0;d=i;e=c[o>>2]|0;f=b+80|0;gc(e|0,151104,(g=i,i=i+8|0,c[g>>2]=c[f>>2],g)|0)|0;i=g;if((c[f>>2]|0)>0){j=b+84|0;k=0;do{l=c[j>>2]|0;m=+h[l+(k<<5)>>3];n=+h[l+(k<<5)+8>>3];p=+h[l+(k<<5)+16>>3];q=+h[l+(k<<5)+24>>3];gc(e|0,148176,(g=i,i=i+40|0,c[g>>2]=k,h[g+8>>3]=m,h[g+16>>3]=n,h[g+24>>3]=p,h[g+32>>3]=q,g)|0)|0;i=g;k=k+1|0;}while((k|0)<(c[f>>2]|0))}q=+h[b+8>>3];p=+h[b+16>>3];f=(a[b+29|0]|0)!=0?142088:138952;gc(e|0,145e3,(g=i,i=i+32|0,h[g>>3]=+h[b>>3],h[g+8>>3]=q,h[g+16>>3]=p,c[g+24>>2]=f,g)|0)|0;i=g;p=+h[b+48>>3];q=+h[b+56>>3];f=(a[b+69|0]|0)!=0?142088:138952;gc(e|0,136416,(g=i,i=i+32|0,h[g>>3]=+h[b+40>>3],h[g+8>>3]=p,h[g+16>>3]=q,c[g+24>>2]=f,g)|0)|0;i=g;i=d;return}
+
+
+
+function Wc(a){a=a|0;var b=0;b=i;i=i+a|0;i=i+7&-8;return b|0}function Xc(){return i|0}function Yc(a){a=a|0;i=a}function Zc(a,b){a=a|0;b=b|0;if((u|0)==0){u=a;v=b}}function _c(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0]}function $c(b){b=b|0;a[k]=a[b];a[k+1|0]=a[b+1|0];a[k+2|0]=a[b+2|0];a[k+3|0]=a[b+3|0];a[k+4|0]=a[b+4|0];a[k+5|0]=a[b+5|0];a[k+6|0]=a[b+6|0];a[k+7|0]=a[b+7|0]}function ad(a){a=a|0;H=a}function bd(a){a=a|0;I=a}function cd(a){a=a|0;J=a}function dd(a){a=a|0;K=a}function ed(a){a=a|0;L=a}function fd(a){a=a|0;M=a}function gd(a){a=a|0;N=a}function hd(a){a=a|0;O=a}function id(a){a=a|0;P=a}function jd(a){a=a|0;Q=a}function kd(){}function ld(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+16|0;f=e|0;if((c[45198]|0)==0){g=Oz()|0;c[45198]=g;Tz(g,23376);Tz(c[45198]|0,23368);Tz(c[45198]|0,23352)}g=mx(a)|0;Pz(c[45198]|0,g,d)|0;c[f>>2]=0;Rz(c[45198]|0,g,b,f,e+8|0)|0;JA(c[45198]|0,g)|0;Kw(g)|0;g=c[44396]|0;if((g|0)==0){h=c[f>>2]|0;c[44396]=h;i=e;return h|0}Sz(g);h=c[f>>2]|0;c[44396]=h;i=e;return h|0}function md(a){a=a|0;return nd(a,0,0)|0}function nd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;do{if((d|0)==0){f=dF(476)|0;g=f;if((f|0)==0){h=g;break}c[f+12>>2]=6;c[f+16>>2]=202;c[f+20>>2]=150;h=g}else{g=d|0;f=Ec[c[g>>2]&63](476)|0;i=f;if((f|0)==0){h=i;break}c[f+12>>2]=c[g>>2];c[f+16>>2]=c[d+4>>2];c[f+20>>2]=c[d+8>>2];h=i}}while(0);if((h|0)==0){j=0;return j|0}c[h+8>>2]=0;c[h+32>>2]=0;c[h+364>>2]=16;d=h+12|0;i=d|0;f=Ec[c[i>>2]&63](256)|0;g=h+376|0;c[g>>2]=f;if((f|0)==0){Cc[c[h+20>>2]&255](h);j=0;return j|0}f=Ec[c[i>>2]&63](1024)|0;k=h+44|0;c[k>>2]=f;if((f|0)==0){l=h+20|0;Cc[c[l>>2]&255](c[g>>2]|0);Cc[c[l>>2]&255](h);j=0;return j|0}c[h+48>>2]=f+1024;f=Ec[c[i>>2]&63](168)|0;i=f;if((f|0)==0){c[h+340>>2]=i;l=h+20|0;Cc[c[l>>2]&255](c[k>>2]|0);Cc[c[l>>2]&255](c[g>>2]|0);Cc[c[l>>2]&255](h);j=0;return j|0}vF(f+80|0,0,20)|0;c[f+100>>2]=d;vF(f+104|0,0,20)|0;c[f+124>>2]=d;a[f+4|0]=0;c[f+8>>2]=0;c[f+12>>2]=0;c[f>>2]=0;c[f+16>>2]=d;a[f+24|0]=0;c[f+28>>2]=0;c[f+32>>2]=0;c[f+20>>2]=0;c[f+36>>2]=d;a[f+44|0]=0;c[f+48>>2]=0;c[f+52>>2]=0;c[f+40>>2]=0;c[f+56>>2]=d;a[f+64|0]=0;c[f+68>>2]=0;c[f+72>>2]=0;c[f+60>>2]=0;c[f+76>>2]=d;c[f+132>>2]=0;c[f+136>>2]=0;a[f+140|0]=0;vF(f+144|0,0,24)|0;a[f+128|0]=1;a[f+129|0]=0;a[f+130|0]=0;c[h+340>>2]=i;c[h+360>>2]=0;c[h+352>>2]=0;c[h+288>>2]=0;c[h+452>>2]=0;c[h+448>>2]=0;c[h+124>>2]=0;c[h+244>>2]=0;i=h+456|0;a[i]=33;f=h+232|0;a[f]=0;a[h+233|0]=0;c[h+380>>2]=0;c[h+384>>2]=0;a[h+388|0]=0;vF(h+400|0,0,20)|0;c[h+420>>2]=d;vF(h+424|0,0,20)|0;c[h+444>>2]=d;od(h,b);do{if((b|0)!=0){if((c[h+228>>2]|0)!=0){break}qd(h);j=0;return j|0}}while(0);if((e|0)==0){c[h+224>>2]=Ze()|0;j=h;return j|0}else{a[f]=1;c[h+224>>2]=Ze()|0;a[i]=a[e]|0;j=h;return j|0}return 0}function od(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;c[b+264>>2]=102;Yd(b+252|0);a:do{if((d|0)==0){e=0}else{f=b+400|0;g=b+412|0;h=b+408|0;i=d;while(1){j=c[g>>2]|0;if((j|0)==(c[h>>2]|0)){if((Bd(f)|0)<<24>>24==0){e=0;break a}k=c[g>>2]|0}else{k=j}j=a[i]|0;c[g>>2]=k+1;a[k]=j;if((a[i]|0)==0){break}else{i=i+1|0}}i=b+416|0;f=c[i>>2]|0;c[i>>2]=c[g>>2];e=f}}while(0);c[b+228>>2]=e;c[b+344>>2]=0;_e(b+148|0,b+144|0,0)|0;c[b>>2]=0;c[b+4>>2]=0;vF(b+52|0,0,64)|0;c[b+116>>2]=b;c[b+120>>2]=0;vF(b+128|0,0,16)|0;e=c[b+8>>2]|0;c[b+24>>2]=e;c[b+28>>2]=e;c[b+36>>2]=0;c[b+40>>2]=0;e=b+392|0;c[e>>2]=0;c[e+4>>2]=0;vF(b+268|0,0,20)|0;vF(b+300|0,0,38)|0;a[b+292|0]=1;c[b+296>>2]=0;c[b+348>>2]=0;c[b+356>>2]=0;c[b+368>>2]=0;c[b+236>>2]=0;c[b+248>>2]=0;c[b+240>>2]=0;c[b+460>>2]=0;c[b+464>>2]=0;c[b+472>>2]=0;return}function pd(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;f=c[b+340>>2]|0;if((a[e]|0)==0){g=1;return g|0}h=b+400|0;i=b+412|0;j=b+408|0;k=b+416|0;l=f+132|0;m=b+356|0;n=f+60|0;o=f+80|0;p=f+92|0;q=f+88|0;r=f+96|0;s=f+8|0;t=b+472|0;u=f|0;v=f+4|0;f=e;a:while(1){e=f;while(1){w=a[e]|0;if((w<<24>>24|0)==12|(w<<24>>24|0)==0){x=5;break}y=c[i>>2]|0;if(w<<24>>24==61){x=24;break}if((y|0)==(c[j>>2]|0)){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break a}z=a[e]|0;A=c[i>>2]|0}else{z=w;A=y}c[i>>2]=A+1;a[A]=z;if((a[f]|0)==0){g=1;x=54;break a}e=e+1|0}if((x|0)==5){x=0;w=c[i>>2]|0;if((w|0)==(c[j>>2]|0)){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break}B=c[i>>2]|0}else{B=w}c[i>>2]=B+1;a[B]=0;w=c[k>>2]|0;C=c[s>>2]|0;b:do{if((C|0)==0){D=w}else{E=c[t>>2]|0;F=a[w]|0;if(F<<24>>24==0){G=E}else{H=w;I=E;E=F;while(1){J=H+1|0;K=(I*1000003|0)^E&255;L=a[J]|0;if(L<<24>>24==0){G=K;break}else{H=J;I=K;E=L}}}E=C-1|0;I=G&E;H=c[u>>2]|0;L=c[H+(I<<2)>>2]|0;if((L|0)==0){D=w;break}K=G&-C;J=E>>>2;E=0;M=I;I=L;c:while(1){L=c[I>>2]|0;if(F<<24>>24==(a[L]|0)){N=w;O=L;L=F;do{if(L<<24>>24==0){break c}N=N+1|0;O=O+1|0;L=a[N]|0;}while(L<<24>>24==(a[O]|0))}if(E<<24>>24==0){P=(K>>>(((d[v]|0)-1|0)>>>0)&J|1)&255}else{P=E}O=P&255;L=(M>>>0<O>>>0?C:0)+(M-O)|0;O=c[H+(L<<2)>>2]|0;if((O|0)==0){D=w;break b}else{E=P;M=L;I=O}}if((I|0)==0){D=w;break}a[I+32|0]=1;D=c[k>>2]|0}}while(0);w=(a[e]|0)==0?e:e+1|0;c[i>>2]=D;Q=w}else if((x|0)==24){x=0;if((y|0)==(c[k>>2]|0)){R=l;S=y}else{if((y|0)==(c[j>>2]|0)){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break}T=c[i>>2]|0}else{T=y}c[i>>2]=T+1;a[T]=0;w=Cd(b,n,c[k>>2]|0,8)|0;C=w;if((w|0)==0){g=0;x=54;break}U=w|0;w=c[U>>2]|0;M=c[k>>2]|0;if((w|0)==(M|0)){E=w;while(1){w=c[p>>2]|0;if((w|0)==(c[q>>2]|0)){if((Bd(o)|0)<<24>>24==0){x=32;break a}V=c[p>>2]|0}else{V=w}w=a[E]|0;c[p>>2]=V+1;a[V]=w;if((a[E]|0)==0){break}else{E=E+1|0}}E=c[r>>2]|0;c[r>>2]=c[p>>2];c[U>>2]=E;if((E|0)==0){g=0;x=54;break}W=c[k>>2]|0}else{W=M}c[i>>2]=W;R=C;S=W}E=e;w=S;while(1){X=E+1|0;H=a[X]|0;Y=(w|0)==(c[j>>2]|0);if((H<<24>>24|0)==12|(H<<24>>24|0)==0){break}if(Y){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break a}Z=a[X]|0;_=c[i>>2]|0}else{Z=H;_=w}c[i>>2]=_+1;a[_]=Z;E=X;w=c[i>>2]|0}if(Y){if((Bd(h)|0)<<24>>24==0){g=0;x=54;break}$=c[i>>2]|0}else{$=w}c[i>>2]=$+1;a[$]=0;if((Dd(b,R,0,c[k>>2]|0,m)|0)!=0){g=0;x=54;break}c[i>>2]=c[k>>2];Q=(a[X]|0)==0?X:E+2|0}if((a[Q]|0)==0){g=1;x=54;break}else{f=Q}}if((x|0)==32){c[U>>2]=0;g=0;return g|0}else if((x|0)==54){return g|0}return 0}function qd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if((a|0)==0){return}b=a+352|0;d=a+20|0;e=c[a+348>>2]|0;while(1){if((e|0)==0){f=c[b>>2]|0;if((f|0)==0){break}c[b>>2]=0;g=f}else{g=e}f=c[g>>2]|0;Cc[c[d>>2]&255](c[g+36>>2]|0);h=c[g+44>>2]|0;if((h|0)!=0){i=h;while(1){h=c[i+4>>2]|0;Cc[c[d>>2]&255](c[i+16>>2]|0);Cc[c[d>>2]&255](i);if((h|0)==0){break}else{i=h}}}Cc[c[d>>2]&255](g);e=f}e=a+288|0;g=c[a+284>>2]|0;while(1){if((g|0)==0){b=c[e>>2]|0;if((b|0)==0){break}c[e>>2]=0;j=b}else{j=g}b=c[j+8>>2]|0;Cc[c[d>>2]&255](j);g=b}g=c[a+360>>2]|0;if((g|0)!=0){j=g;while(1){g=c[j+4>>2]|0;Cc[c[d>>2]&255](c[j+16>>2]|0);Cc[c[d>>2]&255](j);if((g|0)==0){break}else{j=g}}}j=c[a+356>>2]|0;if((j|0)!=0){g=j;while(1){j=c[g+4>>2]|0;Cc[c[d>>2]&255](c[g+16>>2]|0);Cc[c[d>>2]&255](g);if((j|0)==0){break}else{g=j}}}g=c[a+400>>2]|0;if((g|0)!=0){j=a+420|0;e=g;while(1){g=c[e>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](e);if((g|0)==0){break}else{e=g}}}e=c[a+404>>2]|0;if((e|0)!=0){j=a+420|0;g=e;while(1){e=c[g>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](g);if((e|0)==0){break}else{g=e}}}g=c[a+424>>2]|0;if((g|0)!=0){j=a+444|0;e=g;while(1){g=c[e>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](e);if((g|0)==0){break}else{e=g}}}e=c[a+428>>2]|0;if((e|0)!=0){j=a+444|0;g=e;while(1){e=c[g>>2]|0;Cc[c[(c[j>>2]|0)+8>>2]&255](g);if((e|0)==0){break}else{g=e}}}g=c[a+340>>2]|0;if((g|0)!=0){j=(c[a+460>>2]|0)==0;e=g+20|0;b=c[e>>2]|0;i=g+28|0;h=c[i>>2]|0;k=b+(h<<2)|0;if((h|0)!=0){h=b;while(1){b=h+4|0;l=c[h>>2]|0;do{if((l|0)!=0){if((c[l+16>>2]|0)==0){break}Cc[c[d>>2]&255](c[l+20>>2]|0)}}while(0);if((b|0)==(k|0)){break}else{h=b}}}h=g+8|0;k=g+16|0;l=c[(c[k>>2]|0)+8>>2]|0;f=g|0;m=c[f>>2]|0;if((c[h>>2]|0)==0){n=l;o=m}else{p=0;q=l;l=m;while(1){Cc[q&255](c[l+(p<<2)>>2]|0);m=p+1|0;r=c[(c[k>>2]|0)+8>>2]|0;s=c[f>>2]|0;if(m>>>0<(c[h>>2]|0)>>>0){p=m;q=r;l=s}else{n=r;o=s;break}}}Cc[n&255](o);o=g+36|0;n=c[(c[o>>2]|0)+8>>2]|0;l=c[e>>2]|0;if((c[i>>2]|0)==0){t=n;u=l}else{q=0;p=n;n=l;while(1){Cc[p&255](c[n+(q<<2)>>2]|0);l=q+1|0;h=c[(c[o>>2]|0)+8>>2]|0;f=c[e>>2]|0;if(l>>>0<(c[i>>2]|0)>>>0){q=l;p=h;n=f}else{t=h;u=f;break}}}Cc[t&255](u);u=g+48|0;t=g+56|0;n=c[(c[t>>2]|0)+8>>2]|0;p=g+40|0;q=c[p>>2]|0;if((c[u>>2]|0)==0){v=n;w=q}else{i=0;e=n;n=q;while(1){Cc[e&255](c[n+(i<<2)>>2]|0);q=i+1|0;o=c[(c[t>>2]|0)+8>>2]|0;f=c[p>>2]|0;if(q>>>0<(c[u>>2]|0)>>>0){i=q;e=o;n=f}else{v=o;w=f;break}}}Cc[v&255](w);w=g+68|0;v=g+76|0;n=c[(c[v>>2]|0)+8>>2]|0;e=g+60|0;i=c[e>>2]|0;if((c[w>>2]|0)==0){x=n;y=i}else{u=0;p=n;n=i;while(1){Cc[p&255](c[n+(u<<2)>>2]|0);i=u+1|0;t=c[(c[v>>2]|0)+8>>2]|0;f=c[e>>2]|0;if(i>>>0<(c[w>>2]|0)>>>0){u=i;p=t;n=f}else{x=t;y=f;break}}}Cc[x&255](y);y=c[g+80>>2]|0;if((y|0)!=0){x=g+100|0;n=y;while(1){y=c[n>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](n);if((y|0)==0){break}else{n=y}}}n=c[g+84>>2]|0;if((n|0)!=0){x=g+100|0;y=n;while(1){n=c[y>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](y);if((n|0)==0){break}else{y=n}}}y=c[g+104>>2]|0;if((y|0)!=0){x=g+124|0;n=y;while(1){y=c[n>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](n);if((y|0)==0){break}else{n=y}}}n=c[g+108>>2]|0;if((n|0)!=0){x=g+124|0;y=n;while(1){n=c[y>>2]|0;Cc[c[(c[x>>2]|0)+8>>2]&255](y);if((n|0)==0){break}else{y=n}}}if(j){Cc[c[d>>2]&255](c[g+164>>2]|0);Cc[c[d>>2]&255](c[g+144>>2]|0)}Cc[c[d>>2]&255](g)}Cc[c[d>>2]&255](c[a+376>>2]|0);Cc[c[d>>2]&255](c[a+448>>2]|0);Cc[c[d>>2]&255](c[a+8>>2]|0);Cc[c[d>>2]&255](c[a+44>>2]|0);Cc[c[d>>2]&255](c[a+380>>2]|0);Cc[c[d>>2]&255](c[a+236>>2]|0);g=c[a+248>>2]|0;if((g|0)!=0){Cc[g&255](c[a+240>>2]|0)}Cc[c[d>>2]&255](a);return}function rd(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+4|0;e=a|0;a=(c[d>>2]|0)==(c[e>>2]|0);c[e>>2]=b;if(!a){return}c[d>>2]=b;return}function sd(a,b,d){a=a|0;b=b|0;d=d|0;c[a+52>>2]=b;c[a+56>>2]=d;return}function td(a,b){a=a|0;b=b|0;c[a+60>>2]=b;return}function ud(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=i;i=i+8|0;h=g|0;j=b+464|0;k=c[j>>2]|0;do{if((k|0)==3){c[b+268>>2]=33;l=0;i=g;return l|0}else if((k|0)==2){c[b+268>>2]=36;l=0;i=g;return l|0}else if((k|0)==0){if((c[b+460>>2]|0)!=0){break}m=b+472|0;if((c[m>>2]|0)==0){dc(((zc(0)|0)>>>0)%4294967295|0|0);c[m>>2]=yb()|0}if((a[b+232|0]|0)==0){break}if((pd(b,21576)|0)<<24>>24!=0){break}c[b+268>>2]=1;l=0;i=g;return l|0}}while(0);c[j>>2]=1;if((e|0)==0){a[b+468|0]=f;if((f|0)==0){l=1;i=g;return l|0}k=b+24|0;m=c[k>>2]|0;n=b+280|0;c[n>>2]=m;o=c[b+28>>2]|0;c[b+40>>2]=o;p=b+264|0;q=Sc[c[p>>2]&127](b,m,o,k)|0;c[b+268>>2]=q;if((q|0)!=0){c[b+276>>2]=c[b+272>>2];c[p>>2]=84;l=0;i=g;return l|0}p=c[j>>2]|0;if((p|0)==3){q=c[b+144>>2]|0;Vc[c[q+48>>2]&63](q,c[n>>2]|0,c[k>>2]|0,b+392|0);c[n>>2]=c[k>>2];l=2;i=g;return l|0}else if((p|0)==0|(p|0)==1){c[j>>2]=2;l=1;i=g;return l|0}else{l=1;i=g;return l|0}}p=b+24|0;k=b+28|0;if((c[p>>2]|0)!=(c[k>>2]|0)){n=wd(b,e)|0;if((n|0)==0){l=0;i=g;return l|0}tF(n|0,d|0,e)|0;l=xd(b,e,f)|0;i=g;return l|0}n=b+36|0;c[n>>2]=(c[n>>2]|0)+e;n=b+280|0;c[n>>2]=d;a[b+468|0]=f;q=b+264|0;o=c[q>>2]|0;m=d+e|0;r=b+40|0;c[r>>2]=m;s=Sc[o&127](b,d,m,h)|0;d=b+268|0;c[d>>2]=s;if((s|0)!=0){c[b+276>>2]=c[b+272>>2];c[q>>2]=84;l=0;i=g;return l|0}s=c[j>>2]|0;do{if((s|0)==0|(s|0)==1){if((f|0)==0){t=23;break}c[j>>2]=2;l=1;i=g;return l|0}else if((s|0)==3){u=2}else{t=23}}while(0);if((t|0)==23){u=1}s=c[b+144>>2]|0;Vc[c[s+48>>2]&63](s,c[n>>2]|0,c[h>>2]|0,b+392|0);s=c[h>>2]|0;j=m-s|0;f=b+8|0;if((m|0)!=(s|0)){m=c[f>>2]|0;do{if((m|0)==0){v=Ec[c[b+12>>2]&63](e<<1)|0;t=29}else{if((j|0)<=((c[b+32>>2]|0)-m|0)){w=m;x=s;break}v=Oc[c[b+16>>2]&255](m,e<<1)|0;t=29}}while(0);do{if((t|0)==29){if((v|0)!=0){c[f>>2]=v;c[b+32>>2]=v+(e<<1);w=v;x=c[h>>2]|0;break}c[d>>2]=1;c[b+276>>2]=0;c[b+272>>2]=0;c[q>>2]=84;l=0;i=g;return l|0}}while(0);tF(w|0,x|0,j)|0}x=c[f>>2]|0;c[p>>2]=x;p=x+j|0;c[k>>2]=p;c[n>>2]=x;c[r>>2]=p;c[b+272>>2]=x;c[b+276>>2]=x;l=u;i=g;return l|0}function vd(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return c[a+268>>2]|0}function wd(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=c[a+464>>2]|0;if((d|0)==3){c[a+268>>2]=33;e=0;return e|0}else if((d|0)==2){c[a+268>>2]=36;e=0;return e|0}else{d=a+32|0;f=c[d>>2]|0;g=a+28|0;h=c[g>>2]|0;i=f;j=h;if((i-j|0)>=(b|0)){e=h;return e|0}h=a+24|0;k=c[h>>2]|0;l=k;m=j-l|0;j=m+b|0;b=a+8|0;n=c[b>>2]|0;if((j|0)>(i-n|0)){o=(f|0)==(k|0)?1024:i-l|0;do{o=o<<1;}while((o|0)<(j|0));j=Ec[c[a+12>>2]&63](o)|0;if((j|0)==0){c[a+268>>2]=1;e=0;return e|0}c[d>>2]=j+o;o=c[h>>2]|0;if((o|0)==0){p=0}else{tF(j|0,o|0,(c[g>>2]|0)-o|0)|0;Cc[c[a+20>>2]&255](c[b>>2]|0);p=c[h>>2]|0}o=j+((c[g>>2]|0)-p)|0;c[g>>2]=o;c[b>>2]=j;q=j;r=o}else{Bb(k|0,n|0,m|0);m=c[b>>2]|0;b=m+((c[g>>2]|0)-(c[h>>2]|0))|0;c[g>>2]=b;q=m;r=b}c[h>>2]=q;c[a+276>>2]=0;c[a+272>>2]=0;c[a+280>>2]=0;e=r;return e|0}return 0}function xd(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=b+464|0;g=c[f>>2]|0;do{if((g|0)==3){c[b+268>>2]=33;h=0;return h|0}else if((g|0)==2){c[b+268>>2]=36;h=0;return h|0}else if((g|0)==0){if((c[b+460>>2]|0)!=0){break}i=b+472|0;if((c[i>>2]|0)==0){dc(((zc(0)|0)>>>0)%4294967295|0|0);c[i>>2]=yb()|0}if((a[b+232|0]|0)==0){break}if((pd(b,21576)|0)<<24>>24!=0){break}c[b+268>>2]=1;h=0;return h|0}}while(0);c[f>>2]=1;g=b+24|0;i=c[g>>2]|0;j=b+280|0;c[j>>2]=i;k=b+28|0;l=(c[k>>2]|0)+d|0;c[k>>2]=l;c[b+40>>2]=l;k=b+36|0;c[k>>2]=(c[k>>2]|0)+d;a[b+468|0]=e;d=b+264|0;k=Sc[c[d>>2]&127](b,i,l,g)|0;c[b+268>>2]=k;if((k|0)!=0){c[b+276>>2]=c[b+272>>2];c[d>>2]=84;h=0;return h|0}d=c[f>>2]|0;do{if((d|0)==3){m=2}else if((d|0)==0|(d|0)==1){if((e|0)==0){m=1;break}c[f>>2]=2;h=1;return h|0}else{m=1}}while(0);f=c[b+144>>2]|0;Vc[c[f+48>>2]&63](f,c[j>>2]|0,c[g>>2]|0,b+392|0);c[j>>2]=c[g>>2];h=m;return h|0}function yd(a){a=a|0;return c[a+268>>2]|0}function zd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+272|0;d=c[b>>2]|0;do{if((d|0)!=0){e=a+280|0;f=c[e>>2]|0;if(d>>>0<f>>>0){break}g=c[a+144>>2]|0;Vc[c[g+48>>2]&63](g,f,d,a+392|0);c[e>>2]=c[b>>2]}}while(0);return(c[a+392>>2]|0)+1|0}function Ad(a){a=a|0;var b=0;if(!((a|0)!=0&a>>>0<41>>>0)){b=0;return b|0}b=c[171440+(a<<2)>>2]|0;return b|0}function Bd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+4|0;d=c[b>>2]|0;do{if((d|0)!=0){e=a+16|0;f=c[e>>2]|0;if((f|0)==0){g=a|0;c[g>>2]=d;h=d|0;c[b>>2]=c[h>>2];c[h>>2]=0;h=c[g>>2]|0;g=h+8|0;c[e>>2]=g;c[a+8>>2]=(c[h+4>>2]|0)+(h+8);c[a+12>>2]=g;i=1;return i|0}g=a+8|0;if(((c[g>>2]|0)-f|0)>=(c[d+4>>2]|0)){break}f=d|0;h=c[f>>2]|0;j=a|0;c[f>>2]=c[j>>2];f=c[b>>2]|0;c[j>>2]=f;c[b>>2]=h;h=c[e>>2]|0;tF(f+8|0,h|0,(c[g>>2]|0)-h|0)|0;h=c[j>>2]|0;j=a+12|0;c[j>>2]=(c[j>>2]|0)-(c[e>>2]|0)+(h+8);c[e>>2]=h+8;c[g>>2]=(c[h+4>>2]|0)+(h+8);i=1;return i|0}}while(0);b=a|0;d=c[b>>2]|0;h=a+16|0;g=c[h>>2]|0;e=a+8|0;j=c[e>>2]|0;if((d|0)!=0&(g|0)==(d+8|0)){f=j-g<<1;k=Oc[c[(c[a+20>>2]|0)+4>>2]&255](d,f+8|0)|0;if((k|0)==0){i=0;return i|0}c[b>>2]=k;c[k+4>>2]=f;k=c[b>>2]|0;d=a+12|0;c[d>>2]=(c[d>>2]|0)-(c[h>>2]|0)+(k+8);c[h>>2]=k+8;c[e>>2]=k+8+f;i=1;return i|0}f=a+16|0;k=j-g|0;g=(k|0)<1024?1024:k<<1;k=g+8|0;j=Ec[c[c[a+20>>2]>>2]&63](k)|0;if((j|0)==0){i=0;return i|0}c[j+4>>2]=g;c[j>>2]=c[b>>2];c[b>>2]=j;b=a+12|0;a=c[b>>2]|0;g=c[f>>2]|0;h=j+8|0;if((a|0)==(g|0)){l=a;m=a}else{tF(h|0,g|0,a-g|0)|0;l=c[b>>2]|0;m=c[f>>2]|0}c[b>>2]=j+(l+8-m);c[f>>2]=h;c[e>>2]=j+k;i=1;return i|0}function Cd(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;h=e+8|0;i=c[h>>2]|0;do{if((i|0)==0){if((g|0)==0){j=0;return j|0}a[e+4|0]=6;c[h>>2]=64;k=e+16|0;l=Ec[c[c[k>>2]>>2]&63](256)|0;c[e>>2]=l;if((l|0)==0){c[h>>2]=0;j=0;return j|0}vF(l|0,0,256)|0;l=c[b+472>>2]|0;m=a[f]|0;if(m<<24>>24==0){n=l}else{o=f;p=l;l=m;while(1){m=o+1|0;q=(p*1000003|0)^l&255;r=a[m]|0;if(r<<24>>24==0){n=q;break}else{o=m;p=q;l=r}}}s=(c[h>>2]|0)-1&n;t=k}else{l=b+472|0;p=c[l>>2]|0;o=a[f]|0;if(o<<24>>24==0){u=p}else{r=f;q=p;p=o;while(1){m=r+1|0;v=(q*1000003|0)^p&255;w=a[m]|0;if(w<<24>>24==0){u=v;break}else{r=m;q=v;p=w}}}p=i-1|0;q=p&u;r=e|0;k=c[r>>2]|0;w=c[k+(q<<2)>>2]|0;a:do{if((w|0)==0){x=q}else{v=u&-i;m=e+4|0;y=p>>>2;z=0;A=q;B=w;b:while(1){C=c[B>>2]|0;if(o<<24>>24==(a[C]|0)){D=f;E=C;C=o;do{if(C<<24>>24==0){j=B;break b}D=D+1|0;E=E+1|0;C=a[D]|0;}while(C<<24>>24==(a[E]|0))}if(z<<24>>24==0){F=(v>>>(((d[m]|0)-1|0)>>>0)&y|1)&255}else{F=z}E=F&255;C=A-E+(A>>>0<E>>>0?i:0)|0;E=c[k+(C<<2)>>2]|0;if((E|0)==0){x=C;break a}else{z=F;A=C;B=E}}return j|0}}while(0);if((g|0)==0){j=0;return j|0}k=e+4|0;o=a[k]|0;if(((c[e+12>>2]|0)>>>(((o&255)-1|0)>>>0)|0)==0){s=x;t=e+16|0;break}w=o+1&255;o=w&255;q=1<<o;p=q-1|0;B=q<<2;A=e+16|0;z=Ec[c[c[A>>2]>>2]&63](B)|0;y=z;if((z|0)==0){j=0;return j|0}vF(z|0,0,B|0)|0;B=c[h>>2]|0;if((B|0)!=0){z=-q|0;m=o-1|0;v=p>>>2;E=0;C=B;while(1){B=c[(c[r>>2]|0)+(E<<2)>>2]|0;if((B|0)==0){G=C}else{D=c[B>>2]|0;H=c[l>>2]|0;I=a[D]|0;if(I<<24>>24==0){J=H}else{K=D;D=H;H=I;while(1){I=K+1|0;L=(D*1000003|0)^H&255;M=a[I]|0;if(M<<24>>24==0){J=L;break}else{K=I;D=L;H=M}}}H=J&p;D=y+(H<<2)|0;if((c[D>>2]|0)==0){N=D}else{D=((J&z)>>>(m>>>0)&v|1)&255;K=0;M=H;while(1){H=K<<24>>24==0?D:K;L=H&255;I=M+(M>>>0<L>>>0?q:0)-L|0;L=y+(I<<2)|0;if((c[L>>2]|0)==0){N=L;break}else{K=H;M=I}}}c[N>>2]=B;G=c[h>>2]|0}M=E+1|0;if(M>>>0<G>>>0){E=M;C=G}else{break}}}Cc[c[(c[A>>2]|0)+8>>2]&255](c[r>>2]|0);c[r>>2]=y;a[k]=w;c[h>>2]=q;C=p&u;if((c[y+(C<<2)>>2]|0)==0){s=C;t=A;break}E=((u&-q)>>>((o-1|0)>>>0)&p>>>2|1)&255;v=0;m=C;while(1){C=v<<24>>24==0?E:v;z=C&255;l=m+(m>>>0<z>>>0?q:0)-z|0;if((c[y+(l<<2)>>2]|0)==0){s=l;t=A;break}else{v=C;m=l}}}}while(0);u=Ec[c[c[t>>2]>>2]&63](g)|0;t=e|0;c[(c[t>>2]|0)+(s<<2)>>2]=u;u=c[(c[t>>2]|0)+(s<<2)>>2]|0;if((u|0)==0){j=0;return j|0}vF(u|0,0,g|0)|0;c[c[(c[t>>2]|0)+(s<<2)>>2]>>2]=f;f=e+12|0;c[f>>2]=(c[f>>2]|0)+1;j=c[(c[t>>2]|0)+(s<<2)>>2]|0;return j|0}function Dd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;h=a[f]|0;i=h<<24>>24==0;j=c[d>>2]|0;do{if(i){if((j|0)==0){k=0;l=d|0;m=12;break}else{n=28;return n|0}}else{o=d|0;if((j|0)==0){p=o;m=14;break}if((a[j]|0)!=120){k=0;l=o;m=12;break}if((a[j+1|0]|0)!=109){k=0;l=o;m=12;break}if((a[j+2|0]|0)!=108){k=0;l=o;m=12;break}q=a[j+3|0]|0;do{if(q<<24>>24==110){if((a[j+4|0]|0)!=115){break}if((a[j+5|0]|0)==0){n=39}else{break}return n|0}}while(0);k=q<<24>>24==0|0;l=o;m=12}}while(0);do{if((m|0)==12){if(i){r=k;s=l;t=0;u=1;m=30;break}if(k<<24>>24==0){p=l;m=14;break}else{v=1;w=0;x=h;y=1}while(1){do{if(y){if((w|0)<=36){if(x<<24>>24==(a[74952+w|0]|0)){z=v;break}}z=0}else{z=0}}while(0);j=w+1|0;A=a[f+j|0]|0;B=z<<24>>24!=0;if(A<<24>>24==0){C=1;D=j;E=B;F=l;G=k;m=29;break}else{v=z;w=j;x=A;y=B}}}}while(0);if((m|0)==14){y=1;x=1;w=0;z=h;h=1;while(1){do{if(h){if((w|0)<=36){if(z<<24>>24==(a[74952+w|0]|0)){H=y;break}}H=0}else{H=0}}while(0);do{if(x<<24>>24==0){I=0}else{if((w|0)<=29){if(z<<24>>24==(a[74920+w|0]|0)){I=x;break}}I=0}}while(0);v=w+1|0;k=a[f+v|0]|0;l=H<<24>>24!=0;if(k<<24>>24==0){C=I;D=v;E=l;F=p;G=0;m=29;break}else{y=H;x=I;w=v;z=k;h=l}}}if((m|0)==29){if(E){r=G;s=F;t=D;u=C;m=30}else{J=0;K=G;L=F;M=D;N=C}}if((m|0)==30){J=(t|0)==36|0;K=r;L=s;M=t;N=u}if(N<<24>>24==0){O=0}else{O=(M|0)==29|0}if((K&255|0)!=(J|0)){n=K<<24>>24!=0?38:40;return n|0}if(O<<24>>24!=0){n=40;return n|0}O=b+456|0;K=((a[O]|0)!=0)+M|0;M=b+360|0;J=c[M>>2]|0;do{if((J|0)==0){N=b+12|0;u=Ec[c[N>>2]&63](28)|0;if((u|0)==0){n=1;return n|0}t=K+24|0;s=Ec[c[N>>2]&63](t)|0;c[u+16>>2]=s;if((s|0)!=0){c[u+24>>2]=t;P=u;break}Cc[c[b+20>>2]&255](u);n=1;return n|0}else{u=J+24|0;do{if((K|0)>(c[u>>2]|0)){t=J+16|0;s=K+24|0;N=Oc[c[b+16>>2]&255](c[t>>2]|0,s)|0;if((N|0)==0){n=1;return n|0}else{c[t>>2]=N;c[u>>2]=s;break}}}while(0);c[M>>2]=c[J+4>>2];P=J}}while(0);c[P+20>>2]=K;J=P+16|0;tF(c[J>>2]|0,f|0,K)|0;M=a[O]|0;if(M<<24>>24!=0){a[(c[J>>2]|0)+(K-1)|0]=M}c[P>>2]=d;c[P+12>>2]=e;M=d+4|0;c[P+8>>2]=c[M>>2];if((a[f]|0)==0){if(((c[b+340>>2]|0)+132|0)==(d|0)){Q=0}else{m=49}}else{m=49}if((m|0)==49){Q=P}c[M>>2]=Q;c[P+4>>2]=c[g>>2];c[g>>2]=P;if((e|0)==0){n=0;return n|0}e=c[b+100>>2]|0;if((e|0)==0){n=0;return n|0}Tc[e&127](c[b+4>>2]|0,c[L>>2]|0,(c[M>>2]|0)!=0?f:0);n=0;return n|0}function Ed(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0;g=i;i=i+80|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;m=g+32|0;n=g+40|0;o=g+48|0;p=g+56|0;q=g+64|0;r=g+72|0;c[n>>2]=0;c[o>>2]=0;c[p>>2]=0;c[r>>2]=-1;s=b+144|0;t=b+272|0;u=(d|0)!=0;if((cf(d,c[s>>2]|0,e,f,t,p,q,n,o,r)|0)==0){v=u?31:30;i=g;return v|0}do{if(!u){if((c[r>>2]|0)!=1){break}a[(c[b+340>>2]|0)+130|0]=1}}while(0);u=b+140|0;do{if((c[u>>2]|0)==0){d=b+80|0;w=c[d>>2]|0;if((w|0)==0){x=0;y=0;break}z=c[s>>2]|0;c[j>>2]=e;if((a[z+68|0]|0)!=0){Tc[w&127](c[b+4>>2]|0,e,f-e|0);x=0;y=0;break}w=b+276|0;A=b+44|0;B=z+56|0;C=b+48|0;D=b+4|0;while(1){c[k>>2]=c[A>>2];Bc[c[B>>2]&63](z,j,f,k,c[C>>2]|0);c[w>>2]=c[j>>2];E=c[A>>2]|0;Tc[c[d>>2]&127](c[D>>2]|0,E,(c[k>>2]|0)-E|0);c[t>>2]=c[j>>2];if((c[j>>2]|0)==(f|0)){x=0;y=0;break}}}else{D=c[n>>2]|0;do{if((D|0)==0){F=0}else{d=b+424|0;A=c[s>>2]|0;w=D+(Oc[c[A+28>>2]&255](A,D)|0)|0;c[m>>2]=D;C=b+436|0;do{if((c[C>>2]|0)==0){if((Bd(d)|0)<<24>>24==0){v=1}else{break}i=g;return v|0}}while(0);z=A+56|0;B=b+432|0;while(1){Bc[c[z>>2]&63](A,m,w,C,c[B>>2]|0);if((c[m>>2]|0)==(w|0)){break}if((Bd(d)|0)<<24>>24==0){v=1;G=65;break}}if((G|0)==65){i=g;return v|0}w=b+440|0;if((c[w>>2]|0)==0){v=1;i=g;return v|0}A=c[C>>2]|0;do{if((A|0)==(c[B>>2]|0)){if((Bd(d)|0)<<24>>24==0){v=1;i=g;return v|0}else{H=c[C>>2]|0;break}}else{H=A}}while(0);c[C>>2]=H+1;a[H]=0;A=c[w>>2]|0;if((A|0)==0){v=1;i=g;return v|0}else{c[w>>2]=c[C>>2];F=A;break}}}while(0);D=c[p>>2]|0;do{if((D|0)==0){I=0}else{A=b+424|0;d=c[s>>2]|0;B=(c[q>>2]|0)+(-(c[d+64>>2]|0)|0)|0;c[l>>2]=D;z=b+436|0;do{if((c[z>>2]|0)==0){if((Bd(A)|0)<<24>>24==0){v=1}else{break}i=g;return v|0}}while(0);C=d+56|0;w=b+432|0;while(1){Bc[c[C>>2]&63](d,l,B,z,c[w>>2]|0);if((c[l>>2]|0)==(B|0)){break}if((Bd(A)|0)<<24>>24==0){v=1;G=65;break}}if((G|0)==65){i=g;return v|0}B=b+440|0;if((c[B>>2]|0)==0){v=1;i=g;return v|0}d=c[z>>2]|0;do{if((d|0)==(c[w>>2]|0)){if((Bd(A)|0)<<24>>24==0){v=1;i=g;return v|0}else{J=c[z>>2]|0;break}}else{J=d}}while(0);c[z>>2]=J+1;a[J]=0;d=c[B>>2]|0;if((d|0)==0){v=1}else{I=d;break}i=g;return v|0}}while(0);Vc[c[u>>2]&63](c[b+4>>2]|0,I,F,c[r>>2]|0);x=I;y=F}}while(0);do{if((c[b+228>>2]|0)==0){F=c[o>>2]|0;if((F|0)!=0){if((c[F+64>>2]|0)==(c[(c[s>>2]|0)+64>>2]|0)){c[s>>2]=F;break}c[t>>2]=c[n>>2];v=19;i=g;return v|0}F=c[n>>2]|0;if((F|0)==0){break}do{if((y|0)==0){I=b+424|0;r=c[s>>2]|0;u=F+(Oc[c[r+28>>2]&255](r,F)|0)|0;c[h>>2]=F;J=b+436|0;do{if((c[J>>2]|0)==0){if((Bd(I)|0)<<24>>24==0){v=1}else{break}i=g;return v|0}}while(0);B=r+56|0;z=b+432|0;while(1){Bc[c[B>>2]&63](r,h,u,J,c[z>>2]|0);if((c[h>>2]|0)==(u|0)){break}if((Bd(I)|0)<<24>>24==0){v=1;G=65;break}}if((G|0)==65){i=g;return v|0}u=b+440|0;if((c[u>>2]|0)==0){v=1;i=g;return v|0}r=c[J>>2]|0;do{if((r|0)==(c[z>>2]|0)){if((Bd(I)|0)<<24>>24==0){v=1;i=g;return v|0}else{K=c[J>>2]|0;break}}else{K=r}}while(0);c[J>>2]=K+1;a[K]=0;r=c[u>>2]|0;if((r|0)==0){v=1}else{L=r;break}i=g;return v|0}else{L=y}}while(0);F=Td(b,L)|0;r=b+428|0;I=c[r>>2]|0;z=b+424|0;B=c[z>>2]|0;do{if((I|0)==0){c[r>>2]=B}else{if((B|0)==0){break}else{M=B;N=I}while(1){l=M|0;q=c[l>>2]|0;c[l>>2]=N;c[r>>2]=M;if((q|0)==0){break}else{N=M;M=q}}}}while(0);c[z>>2]=0;c[b+440>>2]=0;c[b+436>>2]=0;c[b+432>>2]=0;if((F|0)!=18){v=F;i=g;return v|0}c[t>>2]=c[n>>2];v=18;i=g;return v|0}}while(0);if((y|0)==0&(x|0)==0){v=0;i=g;return v|0}x=b+428|0;y=c[x>>2]|0;n=b+424|0;t=c[n>>2]|0;do{if((y|0)==0){c[x>>2]=t}else{if((t|0)==0){break}else{O=t;P=y}while(1){M=O|0;N=c[M>>2]|0;c[M>>2]=P;c[x>>2]=O;if((N|0)==0){break}else{P=O;O=N}}}}while(0);c[n>>2]=0;c[b+440>>2]=0;c[b+436>>2]=0;c[b+432>>2]=0;v=0;i=g;return v|0}function Fd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=Gd(b,1,c[b+144>>2]|0,d,e,f,(a[b+468|0]|0)==0|0)|0;do{if((g|0)==0){if((Hd(b)|0)<<24>>24==0){h=1}else{break}return h|0}}while(0);h=g;return h|0}function Gd(b,e,f,g,h,j,k){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Fc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Pc=0,Qc=0,Rc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0;l=i;i=i+360|0;m=l|0;n=l+8|0;o=l+16|0;p=l+24|0;q=l+32|0;r=l+40|0;s=l+48|0;t=l+56|0;u=l+64|0;v=l+72|0;w=l+80|0;x=l+88|0;y=l+96|0;z=l+104|0;A=l+112|0;B=l+120|0;C=l+128|0;D=l+136|0;E=l+144|0;F=l+152|0;G=l+160|0;H=l+168|0;I=l+176|0;J=l+184|0;K=l+192|0;L=l+200|0;M=l+208|0;N=l+216|0;O=l+224|0;P=l+232|0;Q=l+240|0;R=l+248|0;S=l+256|0;T=l+264|0;U=l+272|0;V=l+280|0;W=l+288|0;X=l+296|0;Y=l+304|0;Z=l+336|0;_=l+344|0;$=l+352|0;c[R>>2]=g;aa=b+340|0;ba=c[aa>>2]|0;ca=b+144|0;if((c[ca>>2]|0)==(f|0)){da=b+272|0;ea=b+276|0;fa=da;ga=ea;ha=da;ia=ea;ja=b+284|0}else{ea=b+284|0;da=c[ea>>2]|0;fa=da|0;ga=da+4|0;ha=b+272|0;ia=b+276|0;ja=ea}c[fa>>2]=g;g=f+4|0;ea=b+80|0;da=f+68|0;ka=b+44|0;la=f+56|0;ma=b+48|0;na=b+4|0;oa=b+464|0;pa=f+44|0;qa=f+64|0;ra=ba+80|0;sa=ba+92|0;ta=ba+88|0;ua=ba+96|0;va=ba+8|0;wa=ba+129|0;xa=b+112|0;ya=b+400|0;za=b+412|0;Aa=b+408|0;Ba=b+456|0;Ca=b+416|0;Da=b+116|0;Ea=b+292|0;Fa=b+120|0;Ga=b+288|0;Ha=b+12|0;Ia=b+296|0;Ja=b+224|0;Ka=b+264|0;La=ba+130|0;Ma=b+472|0;Na=ba|0;Oa=ba+4|0;ba=b+60|0;Pa=b+352|0;Qa=b+348|0;Ra=f+28|0;Sa=b+16|0;Ta=b+52|0;Ua=b+404|0;Va=b+400|0;Wa=b+376|0;Xa=Y|0;Ya=b+56|0;Za=ya|0;_a=b+104|0;$a=b+360|0;ab=b+232|0;bb=b+233|0;cb=f+40|0;db=l+328|0;eb=b+72|0;a:while(1){fb=c[R>>2]|0;c[S>>2]=fb;gb=Sc[c[g>>2]&127](f,fb,h,S)|0;c[ga>>2]=c[S>>2];b:do{switch(gb|0){case-2:{hb=28;break a;break};case-4:{hb=20;break a;break};case-1:{hb=26;break a;break};case 9:{fb=c[qa>>2]|0;ib=(Hc[c[pa>>2]&63](f,(c[R>>2]|0)+fb|0,(c[S>>2]|0)+(-fb|0)|0)|0)&255;a[U]=ib;if(ib<<24>>24!=0){ib=c[ba>>2]|0;if((ib|0)!=0){Tc[ib&127](c[na>>2]|0,U,1);break b}ib=c[ea>>2]|0;if((ib|0)==0){break b}fb=c[R>>2]|0;jb=c[S>>2]|0;c[L>>2]=fb;if((a[da]|0)!=0){Tc[ib&127](c[na>>2]|0,fb,jb-fb|0);break b}if((c[ca>>2]|0)==(f|0)){kb=ia;lb=ha}else{fb=c[ja>>2]|0;kb=fb+4|0;lb=fb|0}while(1){c[M>>2]=c[ka>>2];Bc[c[la>>2]&63](f,L,jb,M,c[ma>>2]|0);c[kb>>2]=c[L>>2];fb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,fb,(c[M>>2]|0)-fb|0);c[lb>>2]=c[L>>2];if((c[L>>2]|0)==(jb|0)){break b}}}jb=c[qa>>2]|0;fb=(c[S>>2]|0)+(-jb|0)|0;c[K>>2]=(c[R>>2]|0)+jb;if((c[sa>>2]|0)==0){if((Bd(ra)|0)<<24>>24==0){mb=1;hb=320;break a}}while(1){Bc[c[la>>2]&63](f,K,fb,sa,c[ta>>2]|0);if((c[K>>2]|0)==(fb|0)){break}if((Bd(ra)|0)<<24>>24==0){mb=1;hb=320;break a}}if((c[ua>>2]|0)==0){mb=1;hb=320;break a}fb=c[sa>>2]|0;if((fb|0)==(c[ta>>2]|0)){if((Bd(ra)|0)<<24>>24==0){mb=1;hb=320;break a}nb=c[sa>>2]|0}else{nb=fb}c[sa>>2]=nb+1;a[nb]=0;fb=c[ua>>2]|0;if((fb|0)==0){mb=1;hb=320;break a}jb=c[va>>2]|0;c:do{if((jb|0)==0){ob=0}else{ib=c[Ma>>2]|0;pb=a[fb]|0;if(pb<<24>>24==0){qb=ib}else{rb=fb;sb=ib;ib=pb;while(1){tb=rb+1|0;ub=(sb*1000003|0)^ib&255;vb=a[tb]|0;if(vb<<24>>24==0){qb=ub;break}else{rb=tb;sb=ub;ib=vb}}}ib=jb-1|0;sb=qb&ib;rb=c[Na>>2]|0;vb=c[rb+(sb<<2)>>2]|0;if((vb|0)==0){ob=0;break}ub=qb&-jb;tb=ib>>>2;ib=0;wb=sb;sb=vb;while(1){vb=c[sb>>2]|0;if(pb<<24>>24==(a[vb]|0)){xb=fb;yb=vb;vb=pb;do{if(vb<<24>>24==0){ob=sb;break c}xb=xb+1|0;yb=yb+1|0;vb=a[xb]|0;}while(vb<<24>>24==(a[yb]|0))}if(ib<<24>>24==0){zb=(ub>>>(((d[Oa]|0)-1|0)>>>0)&tb|1)&255}else{zb=ib}yb=zb&255;vb=(wb>>>0<yb>>>0?jb:0)+(wb-yb)|0;yb=c[rb+(vb<<2)>>2]|0;if((yb|0)==0){ob=0;break}else{ib=zb;wb=vb;sb=yb}}}}while(0);jb=ob;c[sa>>2]=fb;do{if((a[wa]|0)==0){hb=62}else{if((a[La]|0)!=0){hb=62;break}if((ob|0)!=0){break}sb=c[Fa>>2]|0;if((sb|0)!=0){Tc[sb&127](c[na>>2]|0,fb,0);break b}sb=c[ea>>2]|0;if((sb|0)==0){break b}wb=c[R>>2]|0;ib=c[S>>2]|0;c[I>>2]=wb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,wb,ib-wb|0);break b}if((c[ca>>2]|0)==(f|0)){Ab=ia;Bb=ha}else{wb=c[ja>>2]|0;Ab=wb+4|0;Bb=wb|0}while(1){c[J>>2]=c[ka>>2];Bc[c[la>>2]&63](f,I,ib,J,c[ma>>2]|0);c[Ab>>2]=c[I>>2];wb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,wb,(c[J>>2]|0)-wb|0);c[Bb>>2]=c[I>>2];if((c[I>>2]|0)==(ib|0)){break b}}}}while(0);if((hb|0)==62){hb=0;if((ob|0)==0){mb=11;hb=320;break a}if((a[jb+34|0]|0)==0){mb=24;hb=320;break a}}Cb=ob+32|0;if((a[Cb]|0)!=0){mb=12;hb=320;break a}if((c[ob+28>>2]|0)!=0){mb=15;hb=320;break a}fb=ob+4|0;if((c[fb>>2]|0)!=0){if((a[Ea]|0)!=0){ib=c[Ga>>2]|0;if((ib|0)==0){wb=Ec[c[Ha>>2]&63](24)|0;if((wb|0)==0){mb=1;hb=320;break a}else{Db=wb}}else{c[Ga>>2]=c[ib+8>>2];Db=ib}a[Cb]=1;ib=ob+12|0;c[ib>>2]=0;wb=Db+8|0;c[wb>>2]=c[ja>>2];c[ja>>2]=Db;c[Db+12>>2]=jb;c[Db+16>>2]=c[Ia>>2];a[Db+20|0]=0;c[Db>>2]=0;c[Db+4>>2]=0;sb=c[fb>>2]|0;fb=sb+(c[ob+8>>2]|0)|0;rb=Gd(b,c[Ia>>2]|0,c[Ja>>2]|0,sb,fb,m,0)|0;if((rb|0)!=0){mb=rb;hb=320;break a}rb=c[m>>2]|0;do{if((fb|0)!=(rb|0)){if((c[oa>>2]|0)!=3){break}c[ib>>2]=rb-sb;c[Ka>>2]=86;break b}}while(0);a[Cb]=0;c[ja>>2]=c[wb>>2];c[wb>>2]=c[Ga>>2];c[Ga>>2]=Db;break b}sb=c[Fa>>2]|0;if((sb|0)!=0){Tc[sb&127](c[na>>2]|0,c[ob>>2]|0,0);break b}sb=c[ea>>2]|0;if((sb|0)==0){break b}rb=c[R>>2]|0;ib=c[S>>2]|0;c[G>>2]=rb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,rb,ib-rb|0);break b}if((c[ca>>2]|0)==(f|0)){Eb=ia;Fb=ha}else{rb=c[ja>>2]|0;Eb=rb+4|0;Fb=rb|0}while(1){c[H>>2]=c[ka>>2];Bc[c[la>>2]&63](f,G,ib,H,c[ma>>2]|0);c[Eb>>2]=c[G>>2];rb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,rb,(c[H>>2]|0)-rb|0);c[Fb>>2]=c[G>>2];if((c[G>>2]|0)==(ib|0)){break b}}}if((c[xa>>2]|0)==0){ib=c[ea>>2]|0;if((ib|0)==0){break b}wb=c[R>>2]|0;rb=c[S>>2]|0;c[E>>2]=wb;if((a[da]|0)!=0){Tc[ib&127](c[na>>2]|0,wb,rb-wb|0);break b}if((c[ca>>2]|0)==(f|0)){Gb=ia;Hb=ha}else{wb=c[ja>>2]|0;Gb=wb+4|0;Hb=wb|0}while(1){c[F>>2]=c[ka>>2];Bc[c[la>>2]&63](f,E,rb,F,c[ma>>2]|0);c[Gb>>2]=c[E>>2];wb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,wb,(c[F>>2]|0)-wb|0);c[Hb>>2]=c[E>>2];if((c[E>>2]|0)==(rb|0)){break b}}}a[Cb]=1;rb=c[aa>>2]|0;wb=rb+136|0;do{if((c[wb>>2]|0)==0){Ib=0}else{ib=c[za>>2]|0;if((ib|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Jb=c[za>>2]|0}else{Jb=ib}c[za>>2]=Jb+1;a[Jb]=61;ib=(((a[Ba]|0)!=0)<<31>>31)+(c[(c[wb>>2]|0)+20>>2]|0)|0;if((ib|0)>0){Kb=0}else{Ib=1;break}while(1){sb=c[za>>2]|0;if((sb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Lb=c[za>>2]|0}else{Lb=sb}sb=a[(c[(c[wb>>2]|0)+16>>2]|0)+Kb|0]|0;c[za>>2]=Lb+1;a[Lb]=sb;sb=Kb+1|0;if((sb|0)<(ib|0)){Kb=sb}else{Ib=1;break}}}}while(0);wb=c[rb+60>>2]|0;ib=c[rb+68>>2]|0;sb=wb+(ib<<2)|0;d:do{if((ib|0)==0){Mb=Ib}else{fb=wb;jb=Ib;while(1){tb=fb;while(1){Nb=tb+4|0;Ob=c[tb>>2]|0;if((Ob|0)!=0){Pb=Ob+4|0;if((c[Pb>>2]|0)!=0){break}}if((Nb|0)==(sb|0)){Mb=jb;break d}else{tb=Nb}}if(jb<<24>>24!=0){tb=c[za>>2]|0;if((tb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Qb=c[za>>2]|0}else{Qb=tb}c[za>>2]=Qb+1;a[Qb]=12}tb=c[Ob>>2]|0;ub=a[tb]|0;pb=c[za>>2]|0;yb=(pb|0)==(c[Aa>>2]|0);if(ub<<24>>24==0){Rb=yb;Sb=pb}else{vb=tb;tb=yb;yb=ub;ub=pb;while(1){if(tb){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Tb=a[vb]|0;Ub=c[za>>2]|0}else{Tb=yb;Ub=ub}c[za>>2]=Ub+1;a[Ub]=Tb;pb=vb+1|0;xb=a[pb]|0;Vb=c[za>>2]|0;Wb=(Vb|0)==(c[Aa>>2]|0);if(xb<<24>>24==0){Rb=Wb;Sb=Vb;break}else{vb=pb;tb=Wb;yb=xb;ub=Vb}}}if(Rb){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Xb=c[za>>2]|0}else{Xb=Sb}c[za>>2]=Xb+1;a[Xb]=61;ub=(((a[Ba]|0)!=0)<<31>>31)+(c[(c[Pb>>2]|0)+20>>2]|0)|0;if((ub|0)>0){yb=0;do{tb=c[za>>2]|0;if((tb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}Yb=c[za>>2]|0}else{Yb=tb}tb=a[(c[(c[Pb>>2]|0)+16>>2]|0)+yb|0]|0;c[za>>2]=Yb+1;a[Yb]=tb;yb=yb+1|0;}while((yb|0)<(ub|0))}if((Nb|0)==(sb|0)){Mb=1;break}else{fb=Nb;jb=1}}}}while(0);sb=c[rb>>2]|0;wb=c[rb+8>>2]|0;ib=sb+(wb<<2)|0;e:do{if((wb|0)!=0){jb=sb;fb=Mb;while(1){ub=jb;while(1){Zb=ub+4|0;_b=c[ub>>2]|0;if((_b|0)!=0){if((a[_b+32|0]|0)!=0){break}}if((Zb|0)==(ib|0)){break e}else{ub=Zb}}if(fb<<24>>24!=0){ub=c[za>>2]|0;if((ub|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}$b=c[za>>2]|0}else{$b=ub}c[za>>2]=$b+1;a[$b]=12}ub=c[_b>>2]|0;yb=a[ub]|0;if(yb<<24>>24!=0){tb=ub;ub=yb;do{yb=c[za>>2]|0;if((yb|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}ac=a[tb]|0;bc=c[za>>2]|0}else{ac=ub;bc=yb}c[za>>2]=bc+1;a[bc]=ac;tb=tb+1|0;ub=a[tb]|0;}while(ub<<24>>24!=0)}if((Zb|0)==(ib|0)){break}else{jb=Zb;fb=1}}}}while(0);ib=c[za>>2]|0;if((ib|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=148;break a}cc=c[za>>2]|0}else{cc=ib}c[za>>2]=cc+1;a[cc]=0;ib=c[Ca>>2]|0;a[Cb]=0;if((ib|0)==0){mb=1;hb=320;break a}if((Gc[c[xa>>2]&127](c[Da>>2]|0,ib,c[ob+20>>2]|0,c[ob+16>>2]|0,c[ob+24>>2]|0)|0)==0){mb=21;hb=320;break a}c[za>>2]=c[Ca>>2];break};case 0:{hb=25;break a;break};case-3:{hb=6;break a;break};case 2:case 1:{ib=c[Pa>>2]|0;if((ib|0)==0){dc=Ec[c[Ha>>2]&63](48)|0;if((dc|0)==0){mb=1;hb=320;break a}sb=Ec[c[Ha>>2]&63](32)|0;c[dc+36>>2]=sb;if((sb|0)==0){hb=163;break a}c[dc+40>>2]=sb+32;ec=dc}else{c[Pa>>2]=c[ib>>2];ec=ib}ib=ec+44|0;c[ib>>2]=0;c[ec>>2]=c[Qa>>2];c[Qa>>2]=ec;sb=ec+12|0;c[ec+16>>2]=0;c[ec+20>>2]=0;wb=(c[R>>2]|0)+(c[qa>>2]|0)|0;rb=ec+4|0;c[rb>>2]=wb;fb=ec+8|0;c[fb>>2]=Oc[c[Ra>>2]&255](f,wb)|0;c[Ia>>2]=(c[Ia>>2]|0)+1;wb=c[rb>>2]|0;rb=wb+(c[fb>>2]|0)|0;c[W>>2]=wb;wb=ec+36|0;fb=ec+40|0;jb=c[wb>>2]|0;while(1){c[V>>2]=jb;Bc[c[la>>2]&63](f,W,rb,V,(c[fb>>2]|0)-1|0);fc=c[wb>>2]|0;ub=fc;gc=(c[V>>2]|0)-ub|0;if((c[W>>2]|0)==(rb|0)){break}tb=(c[fb>>2]|0)-ub<<1;ub=Oc[c[Sa>>2]&255](fc,tb)|0;if((ub|0)==0){mb=1;hb=320;break a}c[wb>>2]=ub;c[fb>>2]=ub+tb;jb=ub+gc|0}c[ec+24>>2]=gc;jb=sb|0;c[jb>>2]=fc;a[c[V>>2]|0]=0;fb=Id(b,f,c[R>>2]|0,sb,ib)|0;if((fb|0)!=0){mb=fb;hb=320;break a}fb=c[Ta>>2]|0;do{if((fb|0)==0){wb=c[ea>>2]|0;if((wb|0)==0){break}rb=c[R>>2]|0;ub=c[S>>2]|0;c[C>>2]=rb;if((a[da]|0)!=0){Tc[wb&127](c[na>>2]|0,rb,ub-rb|0);break}if((c[ca>>2]|0)==(f|0)){hc=ia;ic=ha}else{rb=c[ja>>2]|0;hc=rb+4|0;ic=rb|0}do{c[D>>2]=c[ka>>2];Bc[c[la>>2]&63](f,C,ub,D,c[ma>>2]|0);c[hc>>2]=c[C>>2];rb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,rb,(c[D>>2]|0)-rb|0);c[ic>>2]=c[C>>2];}while((c[C>>2]|0)!=(ub|0))}else{Tc[fb&127](c[na>>2]|0,c[jb>>2]|0,c[Wa>>2]|0)}}while(0);jb=c[Ua>>2]|0;fb=c[Va>>2]|0;do{if((jb|0)==0){c[Ua>>2]=fb}else{if((fb|0)==0){break}else{jc=fb;kc=jb}while(1){ib=jc|0;sb=c[ib>>2]|0;c[ib>>2]=kc;c[Ua>>2]=jc;if((sb|0)==0){break}else{kc=jc;jc=sb}}}}while(0);c[Va>>2]=0;c[Ca>>2]=0;c[za>>2]=0;c[Aa>>2]=0;break};case 4:case 3:{jb=c[R>>2]|0;fb=c[qa>>2]|0;sb=jb+fb|0;c[X>>2]=0;ib=jb+((Oc[c[Ra>>2]&255](f,sb)|0)+fb)|0;c[B>>2]=sb;if((c[za>>2]|0)==0){if((Bd(ya)|0)<<24>>24==0){hb=192;break a}}while(1){Bc[c[la>>2]&63](f,B,ib,za,c[Aa>>2]|0);if((c[B>>2]|0)==(ib|0)){break}if((Bd(ya)|0)<<24>>24==0){hb=192;break a}}if((c[Ca>>2]|0)==0){hb=192;break a}ib=c[za>>2]|0;if((ib|0)==(c[Aa>>2]|0)){if((Bd(ya)|0)<<24>>24==0){hb=192;break a}lc=c[za>>2]|0}else{lc=ib}c[za>>2]=lc+1;a[lc]=0;ib=c[Ca>>2]|0;c[Xa>>2]=ib;if((ib|0)==0){mb=1;hb=320;break a}c[Ca>>2]=c[za>>2];ib=Id(b,f,c[R>>2]|0,Y,X)|0;if((ib|0)!=0){mb=ib;hb=320;break a}c[Ca>>2]=c[za>>2];ib=c[Ta>>2]|0;if((ib|0)==0){mc=1}else{Tc[ib&127](c[na>>2]|0,c[Xa>>2]|0,c[Wa>>2]|0);mc=0}ib=c[Ya>>2]|0;do{if((ib|0)==0){if(mc<<24>>24==0){break}sb=c[ea>>2]|0;if((sb|0)==0){break}fb=c[R>>2]|0;jb=c[S>>2]|0;c[z>>2]=fb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,fb,jb-fb|0);break}if((c[ca>>2]|0)==(f|0)){nc=ia;oc=ha}else{fb=c[ja>>2]|0;nc=fb+4|0;oc=fb|0}do{c[A>>2]=c[ka>>2];Bc[c[la>>2]&63](f,z,jb,A,c[ma>>2]|0);c[nc>>2]=c[z>>2];fb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,fb,(c[A>>2]|0)-fb|0);c[oc>>2]=c[z>>2];}while((c[z>>2]|0)!=(jb|0))}else{if((c[Ta>>2]|0)==0){pc=ib}else{c[fa>>2]=c[ga>>2];pc=c[Ya>>2]|0}Dc[pc&63](c[na>>2]|0,c[Xa>>2]|0)}}while(0);ib=c[Ua>>2]|0;jb=c[Za>>2]|0;do{if((ib|0)==0){c[Ua>>2]=jb}else{if((jb|0)==0){break}else{qc=jb;rc=ib}while(1){fb=qc|0;sb=c[fb>>2]|0;c[fb>>2]=rc;c[Ua>>2]=qc;if((sb|0)==0){break}else{rc=qc;qc=sb}}}}while(0);c[Za>>2]=0;c[Ca>>2]=0;c[za>>2]=0;c[Aa>>2]=0;ib=c[X>>2]|0;if((ib|0)!=0){jb=ib;while(1){ib=c[_a>>2]|0;if((ib|0)==0){sc=jb|0}else{sb=jb|0;Dc[ib&63](c[na>>2]|0,c[c[sb>>2]>>2]|0);sc=sb}sb=c[jb+4>>2]|0;c[jb+4>>2]=c[$a>>2];c[$a>>2]=jb;c[(c[sc>>2]|0)+4>>2]=c[jb+8>>2];if((sb|0)==0){break}else{jb=sb}}c[X>>2]=0}if((c[Ia>>2]|0)==0){hb=220;break a}break};case 5:{if((c[Ia>>2]|0)==(e|0)){mb=13;hb=320;break a}jb=c[Qa>>2]|0;sb=jb|0;c[Qa>>2]=c[sb>>2];c[sb>>2]=c[Pa>>2];c[Pa>>2]=jb;tc=(c[R>>2]|0)+(c[qa>>2]<<1)|0;sb=Oc[c[Ra>>2]&255](f,tc)|0;if((sb|0)!=(c[jb+8>>2]|0)){hb=224;break a}if((wF(c[jb+4>>2]|0,tc|0,sb|0)|0)!=0){hb=224;break a}c[Ia>>2]=(c[Ia>>2]|0)-1;sb=c[Ya>>2]|0;do{if((sb|0)==0){ib=c[ea>>2]|0;if((ib|0)==0){break}fb=c[R>>2]|0;ub=c[S>>2]|0;c[x>>2]=fb;if((a[da]|0)!=0){Tc[ib&127](c[na>>2]|0,fb,ub-fb|0);break}if((c[ca>>2]|0)==(f|0)){uc=ia;vc=ha}else{fb=c[ja>>2]|0;uc=fb+4|0;vc=fb|0}do{c[y>>2]=c[ka>>2];Bc[c[la>>2]&63](f,x,ub,y,c[ma>>2]|0);c[uc>>2]=c[x>>2];fb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,fb,(c[y>>2]|0)-fb|0);c[vc>>2]=c[x>>2];}while((c[x>>2]|0)!=(ub|0))}else{ub=c[jb+16>>2]|0;fb=jb+12|0;if((a[ab]|0)==0|(ub|0)==0){wc=sb}else{ib=(c[fb>>2]|0)+(c[jb+28>>2]|0)|0;rb=a[ub]|0;if(rb<<24>>24==0){xc=ib}else{wb=ub;ub=ib;ib=rb;while(1){rb=wb+1|0;tb=ub+1|0;a[ub]=ib;yb=a[rb]|0;if(yb<<24>>24==0){xc=tb;break}else{wb=rb;ub=tb;ib=yb}}}ib=c[jb+20>>2]|0;do{if((a[bb]|0)==0|(ib|0)==0){yc=xc}else{a[xc]=a[Ba]|0;ub=xc+1|0;wb=a[ib]|0;if(wb<<24>>24==0){yc=ub;break}else{zc=ib;Ac=ub;Fc=wb}while(1){wb=zc+1|0;a[Ac]=Fc;ub=Ac+1|0;yb=a[wb]|0;if(yb<<24>>24==0){yc=ub;break}else{zc=wb;Ac=ub;Fc=yb}}}}while(0);a[yc]=0;wc=c[Ya>>2]|0}Dc[wc&63](c[na>>2]|0,c[fb>>2]|0)}}while(0);sb=jb+44|0;ib=c[sb>>2]|0;if((ib|0)!=0){yb=ib;do{ib=c[_a>>2]|0;if((ib|0)==0){Ic=yb;Jc=yb|0}else{ub=yb|0;Dc[ib&63](c[na>>2]|0,c[c[ub>>2]>>2]|0);Ic=c[sb>>2]|0;Jc=ub}c[sb>>2]=c[Ic+4>>2];c[yb+4>>2]=c[$a>>2];c[$a>>2]=yb;c[(c[Jc>>2]|0)+4>>2]=c[yb+8>>2];yb=c[sb>>2]|0;}while((yb|0)!=0)}if((c[Ia>>2]|0)==0){hb=247;break a}break};case 10:{yb=Oc[c[cb>>2]&255](f,c[R>>2]|0)|0;if((yb|0)<0){mb=14;hb=320;break a}sb=c[ba>>2]|0;if((sb|0)!=0){jb=c[na>>2]|0;ub=Re(yb,db)|0;Tc[sb&127](jb,db,ub);break b}ub=c[ea>>2]|0;if((ub|0)==0){break b}jb=c[R>>2]|0;sb=c[S>>2]|0;c[v>>2]=jb;if((a[da]|0)!=0){Tc[ub&127](c[na>>2]|0,jb,sb-jb|0);break b}if((c[ca>>2]|0)==(f|0)){Kc=ia;Lc=ha}else{jb=c[ja>>2]|0;Kc=jb+4|0;Lc=jb|0}do{c[w>>2]=c[ka>>2];Bc[c[la>>2]&63](f,v,sb,w,c[ma>>2]|0);c[Kc>>2]=c[v>>2];jb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,jb,(c[w>>2]|0)-jb|0);c[Lc>>2]=c[v>>2];}while((c[v>>2]|0)!=(sb|0));break};case 7:{sb=c[ba>>2]|0;if((sb|0)!=0){a[Z]=10;Tc[sb&127](c[na>>2]|0,Z,1);break b}sb=c[ea>>2]|0;if((sb|0)==0){break b}jb=c[R>>2]|0;ub=c[S>>2]|0;c[t>>2]=jb;if((a[da]|0)!=0){Tc[sb&127](c[na>>2]|0,jb,ub-jb|0);break b}if((c[ca>>2]|0)==(f|0)){Mc=ia;Nc=ha}else{jb=c[ja>>2]|0;Mc=jb+4|0;Nc=jb|0}do{c[u>>2]=c[ka>>2];Bc[c[la>>2]&63](f,t,ub,u,c[ma>>2]|0);c[Mc>>2]=c[t>>2];jb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,jb,(c[u>>2]|0)-jb|0);c[Nc>>2]=c[t>>2];}while((c[t>>2]|0)!=(ub|0));break};case 8:{ub=c[eb>>2]|0;do{if((ub|0)==0){jb=c[ea>>2]|0;if((jb|0)==0){break}sb=c[R>>2]|0;yb=c[S>>2]|0;c[r>>2]=sb;if((a[da]|0)!=0){Tc[jb&127](c[na>>2]|0,sb,yb-sb|0);break}if((c[ca>>2]|0)==(f|0)){Pc=ia;Qc=ha}else{sb=c[ja>>2]|0;Pc=sb+4|0;Qc=sb|0}do{c[s>>2]=c[ka>>2];Bc[c[la>>2]&63](f,r,yb,s,c[ma>>2]|0);c[Pc>>2]=c[r>>2];sb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,sb,(c[s>>2]|0)-sb|0);c[Qc>>2]=c[r>>2];}while((c[r>>2]|0)!=(yb|0))}else{Cc[ub&255](c[na>>2]|0)}}while(0);ub=Kd(b,f,S,h,j,k)|0;if((ub|0)!=0){mb=ub;hb=320;break a}if((c[S>>2]|0)==0){hb=278;break a}break};case-5:{hb=279;break a;break};case 6:{ub=c[ba>>2]|0;if((ub|0)!=0){if((a[da]|0)!=0){yb=c[R>>2]|0;Tc[ub&127](c[na>>2]|0,yb,(c[S>>2]|0)-yb|0);break b}while(1){c[$>>2]=c[ka>>2];Bc[c[la>>2]&63](f,R,c[S>>2]|0,$,c[ma>>2]|0);c[ga>>2]=c[R>>2];yb=c[ka>>2]|0;Tc[ub&127](c[na>>2]|0,yb,(c[$>>2]|0)-yb|0);yb=c[R>>2]|0;if((yb|0)==(c[S>>2]|0)){break b}c[fa>>2]=yb}}ub=c[ea>>2]|0;if((ub|0)==0){break b}yb=c[R>>2]|0;fb=c[S>>2]|0;c[n>>2]=yb;if((a[da]|0)!=0){Tc[ub&127](c[na>>2]|0,yb,fb-yb|0);break b}if((c[ca>>2]|0)==(f|0)){Rc=ia;Uc=ha}else{yb=c[ja>>2]|0;Rc=yb+4|0;Uc=yb|0}do{c[o>>2]=c[ka>>2];Bc[c[la>>2]&63](f,n,fb,o,c[ma>>2]|0);c[Rc>>2]=c[n>>2];yb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,yb,(c[o>>2]|0)-yb|0);c[Uc>>2]=c[n>>2];}while((c[n>>2]|0)!=(fb|0));break};case 11:{if((Md(b,f,c[R>>2]|0,c[S>>2]|0)|0)==0){mb=1;hb=320;break a}break};case 13:{if((Nd(b,f,c[R>>2]|0,c[S>>2]|0)|0)==0){mb=1;hb=320;break a}break};case 12:{mb=17;hb=320;break a;break};default:{fb=c[ea>>2]|0;if((fb|0)==0){break b}yb=c[R>>2]|0;ub=c[S>>2]|0;c[P>>2]=yb;if((a[da]|0)!=0){Tc[fb&127](c[na>>2]|0,yb,ub-yb|0);break b}if((c[ca>>2]|0)==(f|0)){Vc=ia;Wc=ha}else{yb=c[ja>>2]|0;Vc=yb+4|0;Wc=yb|0}do{c[Q>>2]=c[ka>>2];Bc[c[la>>2]&63](f,P,ub,Q,c[ma>>2]|0);c[Vc>>2]=c[P>>2];yb=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,yb,(c[Q>>2]|0)-yb|0);c[Wc>>2]=c[P>>2];}while((c[P>>2]|0)!=(ub|0))}}}while(0);gb=c[S>>2]|0;c[R>>2]=gb;c[fa>>2]=gb;gb=c[oa>>2]|0;if((gb|0)==3){hb=319;break}else if((gb|0)==2){mb=35;hb=320;break}}if((hb|0)==6){if(k<<24>>24!=0){c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}c[ga>>2]=h;ga=c[ba>>2]|0;do{if((ga|0)==0){oa=c[ea>>2]|0;if((oa|0)==0){break}P=c[R>>2]|0;c[N>>2]=P;if((a[da]|0)!=0){Tc[oa&127](c[na>>2]|0,P,h-P|0);break}if((c[ca>>2]|0)==(f|0)){Xc=ia;Yc=ha}else{P=c[ja>>2]|0;Xc=P+4|0;Yc=P|0}do{c[O>>2]=c[ka>>2];Bc[c[la>>2]&63](f,N,h,O,c[ma>>2]|0);c[Xc>>2]=c[N>>2];P=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,P,(c[O>>2]|0)-P|0);c[Yc>>2]=c[N>>2];}while((c[N>>2]|0)!=(h|0))}else{a[T]=10;Tc[ga&127](c[na>>2]|0,T,1)}}while(0);if((e|0)==0){mb=3;i=l;return mb|0}if((c[Ia>>2]|0)!=(e|0)){mb=13;i=l;return mb|0}c[j>>2]=h;mb=0;i=l;return mb|0}else if((hb|0)==20){if(k<<24>>24!=0){c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}if((e|0)<=0){mb=3;i=l;return mb|0}if((c[Ia>>2]|0)!=(e|0)){mb=13;i=l;return mb|0}c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}else if((hb|0)==25){c[fa>>2]=c[S>>2];mb=4;i=l;return mb|0}else if((hb|0)==26){if(k<<24>>24==0){mb=5;i=l;return mb|0}c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}else if((hb|0)==28){if(k<<24>>24==0){mb=6;i=l;return mb|0}c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}else if((hb|0)==148){a[Cb]=0;mb=1;i=l;return mb|0}else if((hb|0)==163){Cc[c[b+20>>2]&255](dc);mb=1;i=l;return mb|0}else if((hb|0)==192){c[Xa>>2]=0;mb=1;i=l;return mb|0}else if((hb|0)==220){mb=Jd(b,c[S>>2]|0,h,j)|0;i=l;return mb|0}else if((hb|0)==224){c[fa>>2]=tc;mb=7;i=l;return mb|0}else if((hb|0)==247){mb=Jd(b,c[S>>2]|0,h,j)|0;i=l;return mb|0}else if((hb|0)==278){c[Ka>>2]=90;mb=0;i=l;return mb|0}else if((hb|0)==279){if(k<<24>>24!=0){c[j>>2]=c[R>>2];mb=0;i=l;return mb|0}k=c[ba>>2]|0;do{if((k|0)==0){Ka=c[ea>>2]|0;if((Ka|0)==0){break}b=c[R>>2]|0;c[p>>2]=b;if((a[da]|0)!=0){Tc[Ka&127](c[na>>2]|0,b,h-b|0);break}if((c[ca>>2]|0)==(f|0)){Zc=ia;_c=ha}else{b=c[ja>>2]|0;Zc=b+4|0;_c=b|0}do{c[q>>2]=c[ka>>2];Bc[c[la>>2]&63](f,p,h,q,c[ma>>2]|0);c[Zc>>2]=c[p>>2];b=c[ka>>2]|0;Tc[c[ea>>2]&127](c[na>>2]|0,b,(c[q>>2]|0)-b|0);c[_c>>2]=c[p>>2];}while((c[p>>2]|0)!=(h|0))}else{if((a[da]|0)==0){c[_>>2]=c[ka>>2];Bc[c[la>>2]&63](f,R,h,_,c[ma>>2]|0);b=c[ka>>2]|0;Tc[c[ba>>2]&127](c[na>>2]|0,b,(c[_>>2]|0)-b|0);break}else{b=c[R>>2]|0;Tc[k&127](c[na>>2]|0,b,h-b|0);break}}}while(0);if((e|0)==0){c[fa>>2]=h;mb=3;i=l;return mb|0}if((c[Ia>>2]|0)==(e|0)){c[j>>2]=h;mb=0;i=l;return mb|0}else{c[fa>>2]=h;mb=13;i=l;return mb|0}}else if((hb|0)==319){c[j>>2]=c[S>>2];mb=0;i=l;return mb|0}else if((hb|0)==320){i=l;return mb|0}return 0}function Hd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=a+16|0;d=c[a+348>>2]|0;if((d|0)==0){e=1;return e|0}else{f=d}while(1){d=(c[f+24>>2]|0)+1|0;a=f+36|0;g=c[a>>2]|0;h=g+d|0;i=f+4|0;j=c[i>>2]|0;if((j|0)==(h|0)){e=1;k=11;break}l=f+8|0;m=c[l>>2]|0;n=m+d|0;o=f+40|0;if((n|0)>((c[o>>2]|0)-g|0)){p=Oc[c[b>>2]&255](g,n)|0;if((p|0)==0){e=0;k=11;break}g=f+12|0;q=c[a>>2]|0;if((c[g>>2]|0)==(q|0)){c[g>>2]=p}g=f+16|0;r=c[g>>2]|0;if((r|0)!=0){c[g>>2]=p+(r-q)}c[a>>2]=p;c[o>>2]=p+n;s=p+d|0;t=c[i>>2]|0;u=c[l>>2]|0}else{s=h;t=j;u=m}tF(s|0,t|0,u)|0;c[i>>2]=s;i=c[f>>2]|0;if((i|0)==0){e=1;k=11;break}else{f=i}}if((k|0)==11){return e|0}return 0}function Id(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;j=i;i=i+8|0;k=j|0;l=c[b+340>>2]|0;m=l+20|0;n=g|0;o=c[n>>2]|0;p=c[l+28>>2]|0;a:do{if((p|0)==0){q=13}else{r=c[b+472>>2]|0;s=a[o]|0;if(s<<24>>24==0){t=r}else{u=o;v=r;r=s;while(1){w=u+1|0;x=(v*1000003|0)^r&255;y=a[w]|0;if(y<<24>>24==0){t=x;break}else{u=w;v=x;r=y}}}r=p-1|0;v=t&r;u=c[m>>2]|0;y=c[u+(v<<2)>>2]|0;if((y|0)==0){q=13;break}x=t&-p;w=l+24|0;z=r>>>2;r=0;A=v;v=y;b:while(1){y=c[v>>2]|0;if(s<<24>>24==(a[y]|0)){B=o;C=y;y=s;do{if(y<<24>>24==0){break b}B=B+1|0;C=C+1|0;y=a[B]|0;}while(y<<24>>24==(a[C]|0))}if(r<<24>>24==0){D=(x>>>(((d[w]|0)-1|0)>>>0)&z|1)&255}else{D=r}C=D&255;y=(A>>>0<C>>>0?p:0)+(A-C)|0;C=c[u+(y<<2)>>2]|0;if((C|0)==0){q=13;break a}else{r=D;A=y;v=C}}if((v|0)==0){q=13}else{E=v}}}while(0);do{if((q|0)==13){D=l+80|0;p=l+92|0;t=l+88|0;A=o;while(1){r=c[p>>2]|0;if((r|0)==(c[t>>2]|0)){if((Bd(D)|0)<<24>>24==0){F=1;q=161;break}G=c[p>>2]|0}else{G=r}r=a[A]|0;c[p>>2]=G+1;a[G]=r;if((a[A]|0)==0){break}else{A=A+1|0}}if((q|0)==161){i=j;return F|0}A=l+96|0;D=c[A>>2]|0;c[A>>2]=c[p>>2];if((D|0)==0){F=1;i=j;return F|0}A=Cd(b,m,D,24)|0;D=A;if((A|0)==0){F=1;i=j;return F|0}if((a[b+232|0]|0)==0){E=D;break}if((Pd(b,D)|0)==0){F=1}else{E=D;break}i=j;return F|0}}while(0);m=c[E+12>>2]|0;G=e+36|0;o=b+364|0;D=b+376|0;A=Sc[c[G>>2]&127](e,f,c[o>>2]|0,c[D>>2]|0)|0;t=A+m|0;v=c[o>>2]|0;do{if((t|0)>(v|0)){r=t+16|0;c[o>>2]=r;u=Oc[c[b+16>>2]&255](c[D>>2]|0,r<<4)|0;r=u;if((u|0)==0){F=1;i=j;return F|0}c[D>>2]=r;if((A|0)<=(v|0)){break}Sc[c[G>>2]&127](e,f,A,r)|0}}while(0);f=c[D>>2]|0;G=f|0;c:do{if((A|0)>0){v=e+28|0;o=b+400|0;t=b+412|0;r=b+416|0;u=b+408|0;z=E+20|0;w=e+56|0;x=0;s=0;C=0;y=f;d:while(1){B=c[y+(s<<4)>>2]|0;H=Qd(b,e,B,B+(Oc[c[v>>2]&255](e,B)|0)|0)|0;if((H|0)==0){F=1;q=161;break}B=H|0;I=(c[B>>2]|0)-1|0;if((a[I]|0)!=0){q=30;break}a[I]=1;J=C+1|0;c[G+(C<<2)>>2]=c[B>>2];I=c[D>>2]|0;if((a[I+(s<<4)+12|0]|0)==0){e:do{if((a[H+8|0]|0)==0|(m|0)<1){K=1}else{L=c[z>>2]|0;M=0;while(1){N=M+1|0;if((H|0)==(c[L+(M*12|0)>>2]|0)){break}if((N|0)<(m|0)){M=N}else{K=1;break e}}K=a[L+(M*12|0)+4|0]|0}}while(0);N=Rd(b,e,K,c[I+(s<<4)+4>>2]|0,c[I+(s<<4)+8>>2]|0,o)|0;if((N|0)!=0){F=N;q=161;break}N=c[t>>2]|0;do{if(K<<24>>24==0){if((N|0)==(c[r>>2]|0)){O=N;break}P=N-1|0;if((a[P]|0)!=32){O=N;break}c[t>>2]=P;O=P}else{O=N}}while(0);if((O|0)==(c[u>>2]|0)){if((Bd(o)|0)<<24>>24==0){F=1;q=161;break}Q=c[t>>2]|0}else{Q=O}c[t>>2]=Q+1;a[Q]=0;c[G+(J<<2)>>2]=c[r>>2]}else{N=c[I+(s<<4)+8>>2]|0;c[k>>2]=c[I+(s<<4)+4>>2];if((c[t>>2]|0)==0){if((Bd(o)|0)<<24>>24==0){q=55;break}}while(1){Bc[c[w>>2]&63](e,k,N,t,c[u>>2]|0);if((c[k>>2]|0)==(N|0)){break}if((Bd(o)|0)<<24>>24==0){q=55;break d}}if((c[r>>2]|0)==0){q=55;break}N=c[t>>2]|0;if((N|0)==(c[u>>2]|0)){if((Bd(o)|0)<<24>>24==0){q=55;break}R=c[t>>2]|0}else{R=N}c[t>>2]=R+1;a[R]=0;N=c[r>>2]|0;c[G+(J<<2)>>2]=N;if((N|0)==0){F=1;q=161;break}}c[r>>2]=c[t>>2];N=c[H+4>>2]|0;do{if((N|0)==0){S=C+2|0;T=x}else{if((a[H+9|0]|0)==0){a[(c[B>>2]|0)-1|0]=2;S=C+2|0;T=x+1|0;break}else{I=Dd(b,N,H,c[G+(J<<2)>>2]|0,h)|0;if((I|0)==0){S=C;T=x;break}else{F=I;q=161;break d}}}}while(0);H=s+1|0;if((H|0)>=(A|0)){U=T;V=S;break c}x=T;s=H;C=S;y=c[D>>2]|0}if((q|0)==30){if((c[b+144>>2]|0)!=(e|0)){F=8;i=j;return F|0}c[b+272>>2]=c[(c[D>>2]|0)+(s<<4)>>2];F=8;i=j;return F|0}else if((q|0)==55){c[G+(J<<2)>>2]=0;F=1;i=j;return F|0}else if((q|0)==161){i=j;return F|0}}else{U=0;V=0}}while(0);c[b+368>>2]=V;J=c[E+8>>2]|0;f:do{if((J|0)==0){q=70}else{D=c[J>>2]|0;if((a[D-1|0]|0)==0){q=70;break}if((V|0)>0){W=0}else{break}while(1){e=W+2|0;if((c[G+(W<<2)>>2]|0)==(D|0)){break}if((e|0)<(V|0)){W=e}else{break f}}c[b+372>>2]=W}}while(0);if((q|0)==70){c[b+372>>2]=-1}g:do{if((m|0)>0){W=E+20|0;J=U;D=0;s=V;h:while(1){e=c[W>>2]|0;S=e+(D*12|0)|0;T=c[S>>2]|0;A=(c[T>>2]|0)-1|0;do{if((a[A]|0)==0){R=e+(D*12|0)+8|0;k=c[R>>2]|0;if((k|0)==0){X=s;Y=J;break}Q=c[T+4>>2]|0;if((Q|0)==0){a[A]=1;c[G+(s<<2)>>2]=c[c[S>>2]>>2];c[G+(s+1<<2)>>2]=c[R>>2];X=s+2|0;Y=J;break}if((a[T+9|0]|0)==0){a[A]=2;c[G+(s<<2)>>2]=c[c[S>>2]>>2];c[G+(s+1<<2)>>2]=c[R>>2];X=s+2|0;Y=J+1|0;break}else{R=Dd(b,Q,T,k,h)|0;if((R|0)==0){X=s;Y=J;break}else{F=R;break h}}}else{X=s;Y=J}}while(0);T=D+1|0;if((T|0)<(m|0)){J=Y;D=T;s=X}else{Z=Y;_=X;break g}}i=j;return F|0}else{Z=U;_=V}}while(0);c[G+(_<<2)>>2]=0;i:do{if((Z|0)==0){$=0}else{V=b+384|0;U=c[V>>2]|0;X=b+388|0;Y=a[X]|0;m=Y&255;do{if((Z<<1>>m|0)==0){s=1<<m;if((U|0)!=0){aa=U;ba=s;break}ca=s;da=b+380|0;q=89}else{s=Y;while(1){ea=s+1&255;if((Z>>(s&255)|0)==0){break}else{s=ea}}s=(ea&255)>>>0<3>>>0?3:ea;a[X]=s;D=s&255;s=b+380|0;J=Oc[c[b+16>>2]&255](c[s>>2]|0,12<<D)|0;if((J|0)==0){F=1;i=j;return F|0}else{c[s>>2]=J;ca=1<<D;da=s;q=89;break}}}while(0);if((q|0)==89){Y=ca;while(1){U=Y-1|0;c[(c[da>>2]|0)+(U*12|0)>>2]=-1;if((U|0)==0){aa=-1;ba=ca;break}else{Y=U}}}Y=aa-1|0;c[V>>2]=Y;if((_|0)<=0){$=0;break}U=b+472|0;m=l+48|0;s=l+40|0;D=l+44|0;J=b+400|0;W=b+412|0;T=b+408|0;S=ba-1|0;A=b+380|0;e=b+233|0;R=b+416|0;k=b+456|0;Q=-ba|0;O=S>>>2;K=Z;f=0;j:while(1){y=G+(f<<2)|0;C=c[y>>2]|0;x=C-1|0;if((a[x]|0)==2){t=c[U>>2]|0;a[x]=0;r=c[m>>2]|0;o=c[U>>2]|0;u=a[C]|0;if(u<<24>>24==0){fa=o}else{w=C;z=o;o=u;while(1){v=w+1|0;p=(z*1000003|0)^o&255;H=a[v]|0;if(H<<24>>24==0){fa=p;break}else{w=v;z=p;o=H}}}o=r-1|0;z=c[s>>2]|0;w=fa&-r;H=o>>>2;p=0;v=fa&o;k:while(1){ga=c[z+(v<<2)>>2]|0;o=c[ga>>2]|0;if(u<<24>>24==(a[o]|0)){N=C;B=o;o=u;do{if(o<<24>>24==0){break k}N=N+1|0;B=B+1|0;o=a[N]|0;}while(o<<24>>24==(a[B]|0))}if(p<<24>>24==0){ha=(w>>>(((d[D]|0)-1|0)>>>0)&H|1)&255}else{ha=p}B=ha&255;p=ha;v=v-B+(v>>>0<B>>>0?r:0)|0}r=c[(c[ga+4>>2]|0)+4>>2]|0;if((r|0)==0){F=27;q=161;break}v=r+20|0;if((c[v>>2]|0)>0){p=r+16|0;H=0;w=t;while(1){u=a[(c[p>>2]|0)+H|0]|0;z=c[W>>2]|0;if((z|0)==(c[T>>2]|0)){if((Bd(J)|0)<<24>>24==0){F=1;q=161;break j}ia=c[W>>2]|0}else{ia=z}c[W>>2]=ia+1;a[ia]=u;z=u&255^(w*1000003|0);u=H+1|0;if((u|0)<(c[v>>2]|0)){H=u;w=z}else{ja=z;break}}}else{ja=t}w=C;while(1){H=w+1|0;if((a[w]|0)==58){ka=ja;la=H;break}else{w=H}}while(1){w=a[la]|0;C=c[W>>2]|0;if((C|0)==(c[T>>2]|0)){if((Bd(J)|0)<<24>>24==0){F=1;q=161;break j}ma=a[la]|0;na=c[W>>2]|0}else{ma=w;na=C}c[W>>2]=na+1;a[na]=ma;oa=w&255^(ka*1000003|0);if((a[la]|0)==0){break}else{ka=oa;la=la+1|0}}w=oa&S;C=c[A>>2]|0;if((c[C+(w*12|0)>>2]|0)==(Y|0)){t=oa&Q;H=w;v=0;while(1){if((oa|0)==(c[C+(H*12|0)+4>>2]|0)){p=c[R>>2]|0;z=c[C+(H*12|0)+8>>2]|0;u=a[p]|0;B=u<<24>>24==0;if(u<<24>>24!=(a[z]|0)|B){pa=B}else{B=p;p=z;while(1){z=B+1|0;u=p+1|0;o=a[z]|0;N=o<<24>>24==0;if(o<<24>>24!=(a[u]|0)|N){pa=N;break}else{B=z;p=u}}}if(pa){F=8;q=161;break j}}if(v<<24>>24==0){qa=(t>>>(((d[X]|0)-1|0)>>>0)&O|1)&255}else{qa=v}p=qa&255;B=H+((H|0)<(p|0)?ba:0)-p|0;if((c[C+(B*12|0)>>2]|0)==(Y|0)){H=B;v=qa}else{ra=B;break}}}else{ra=w}if((a[e]|0)!=0){a[(c[W>>2]|0)-1|0]=a[k]|0;v=c[c[r>>2]>>2]|0;while(1){H=c[W>>2]|0;if((H|0)==(c[T>>2]|0)){if((Bd(J)|0)<<24>>24==0){F=1;q=161;break j}sa=c[W>>2]|0}else{sa=H}H=a[v]|0;c[W>>2]=sa+1;a[sa]=H;if((a[v]|0)==0){break}else{v=v+1|0}}}v=c[R>>2]|0;c[R>>2]=c[W>>2];c[y>>2]=v;c[(c[A>>2]|0)+(ra*12|0)>>2]=Y;c[(c[A>>2]|0)+(ra*12|0)+4>>2]=oa;c[(c[A>>2]|0)+(ra*12|0)+8>>2]=v;v=K-1|0;if((v|0)==0){q=132;break}else{ta=v}}else{a[x]=0;ta=K}v=f+2|0;if((v|0)<(_|0)){K=ta;f=v}else{$=v;break i}}if((q|0)==132){$=f+2|0;break}else if((q|0)==161){i=j;return F|0}}}while(0);if(($|0)<(_|0)){q=$;do{a[(c[G+(q<<2)>>2]|0)-1|0]=0;q=q+2|0;}while((q|0)<(_|0))}_=c[h>>2]|0;if((_|0)!=0){h=_;do{a[(c[c[h+12>>2]>>2]|0)-1|0]=0;h=c[h+4>>2]|0;}while((h|0)!=0)}if((a[b+232|0]|0)==0){F=0;i=j;return F|0}h=c[E+4>>2]|0;do{if((h|0)==0){E=c[l+136>>2]|0;if((E|0)==0){F=0;i=j;return F|0}else{ua=E;va=c[n>>2]|0;break}}else{E=c[h+4>>2]|0;if((E|0)==0){F=27;i=j;return F|0}_=c[n>>2]|0;while(1){q=_+1|0;if((a[_]|0)==58){ua=E;va=q;break}else{_=q}}}}while(0);h=ua|0;do{if((a[b+233|0]|0)==0){wa=0}else{l=c[c[h>>2]>>2]|0;if((l|0)==0){wa=0;break}else{xa=0}while(1){_=xa+1|0;if((a[l+xa|0]|0)==0){wa=_;break}else{xa=_}}}}while(0);c[g+4>>2]=va;xa=ua+20|0;c[g+16>>2]=c[xa>>2];c[g+8>>2]=c[c[h>>2]>>2];c[g+20>>2]=wa;g=0;while(1){ya=g+1|0;if((a[va+g|0]|0)==0){break}else{g=ya}}l=c[xa>>2]|0;_=ya+wa+l|0;E=ua+24|0;if((_|0)>(c[E>>2]|0)){f=_+24|0;_=Ec[c[b+12>>2]&63](f)|0;if((_|0)==0){F=1;i=j;return F|0}c[E>>2]=f;f=ua+16|0;tF(_|0,c[f>>2]|0,c[xa>>2]|0)|0;E=c[b+348>>2]|0;if((E|0)!=0){q=E;do{E=q+12|0;if((c[E>>2]|0)==(c[f>>2]|0)){c[E>>2]=_}q=c[q>>2]|0;}while((q|0)!=0)}Cc[c[b+20>>2]&255](c[f>>2]|0);c[f>>2]=_;za=c[xa>>2]|0;Aa=_}else{za=l;Aa=c[ua+16>>2]|0}tF(Aa+za|0,va|0,ya)|0;if((wa|0)!=0){ya=za+g|0;a[Aa+ya|0]=a[b+456|0]|0;tF(Aa+(ya+1)|0,c[c[h>>2]>>2]|0,wa)|0}c[n>>2]=c[ua+16>>2];F=0;i=j;return F|0}function Jd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;i=i+40|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;m=g+32|0;c[b+264>>2]=82;n=b+272|0;c[n>>2]=d;o=b+144|0;p=b+276|0;q=b+80|0;r=b+44|0;s=b+48|0;t=b+4|0;u=b+464|0;v=d;a:while(1){c[m>>2]=0;d=c[o>>2]|0;w=Sc[c[d>>2]&127](d,v,e,m)|0;x=c[m>>2]|0;c[p>>2]=x;b:do{switch(w|0){case-15:{y=3;break a;break};case-4:{y=11;break a;break};case 15:{d=c[q>>2]|0;if((d|0)==0){break b}z=c[o>>2]|0;c[h>>2]=v;if((a[z+68|0]|0)!=0){Tc[d&127](c[t>>2]|0,v,x-v|0);break b}d=z+56|0;do{c[j>>2]=c[r>>2];Bc[c[d>>2]&63](z,h,x,j,c[s>>2]|0);c[p>>2]=c[h>>2];A=c[r>>2]|0;Tc[c[q>>2]&127](c[t>>2]|0,A,(c[j>>2]|0)-A|0);c[n>>2]=c[h>>2];}while((c[h>>2]|0)!=(x|0));break};case 11:{if((Md(b,c[o>>2]|0,v,x)|0)==0){B=1;y=26;break a}break};case 13:{if((Nd(b,c[o>>2]|0,v,x)|0)==0){B=1;y=26;break a}break};case 0:{y=19;break a;break};case-1:{y=20;break a;break};case-2:{y=22;break a;break};default:{B=9;y=26;break a}}}while(0);C=c[m>>2]|0;c[n>>2]=C;w=c[u>>2]|0;if((w|0)==3){y=25;break}else if((w|0)==2){B=35;y=26;break}else{v=C}}if((y|0)==3){h=c[q>>2]|0;do{if((h|0)==0){D=x}else{j=c[o>>2]|0;c[k>>2]=v;if((a[j+68|0]|0)==0){e=j+56|0;do{c[l>>2]=c[r>>2];Bc[c[e>>2]&63](j,k,x,l,c[s>>2]|0);c[p>>2]=c[k>>2];w=c[r>>2]|0;Tc[c[q>>2]&127](c[t>>2]|0,w,(c[l>>2]|0)-w|0);c[n>>2]=c[k>>2];}while((c[k>>2]|0)!=(x|0))}else{Tc[h&127](c[t>>2]|0,v,x-v|0)}if((c[u>>2]|0)==2){B=35;i=g;return B|0}else{D=c[m>>2]|0;break}}}while(0);c[f>>2]=D;B=0;i=g;return B|0}else if((y|0)==11){c[f>>2]=v;B=0;i=g;return B|0}else if((y|0)==19){c[n>>2]=x;B=4;i=g;return B|0}else if((y|0)==20){if((a[b+468|0]|0)!=0){B=5;i=g;return B|0}c[f>>2]=v;B=0;i=g;return B|0}else if((y|0)==22){if((a[b+468|0]|0)!=0){B=6;i=g;return B|0}c[f>>2]=v;B=0;i=g;return B|0}else if((y|0)==25){c[f>>2]=C;B=0;i=g;return B|0}else if((y|0)==26){i=g;return B|0}return 0}function Kd(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;j=i;i=i+80|0;k=j|0;l=j+8|0;m=j+16|0;n=j+24|0;o=j+32|0;p=j+40|0;q=j+48|0;r=j+56|0;s=j+64|0;t=j+72|0;u=c[e>>2]|0;c[q>>2]=u;v=b+144|0;if((c[v>>2]|0)==(d|0)){w=b+272|0;c[w>>2]=u;x=b+276|0;y=w;z=x;A=w;B=x;C=b+284|0}else{x=b+284|0;w=c[x>>2]|0;y=w|0;z=w+4|0;A=b+272|0;B=b+276|0;C=x}c[y>>2]=u;c[e>>2]=0;u=d+8|0;x=b+60|0;w=b+80|0;D=d+68|0;E=b+44|0;F=d+56|0;G=b+48|0;H=b+4|0;I=b+464|0;a:while(1){J=Sc[c[u>>2]&127](d,c[q>>2]|0,f,r)|0;c[z>>2]=c[r>>2];b:do{switch(J|0){case 40:{K=6;break a;break};case 7:{L=c[x>>2]|0;if((L|0)!=0){a[s]=10;Tc[L&127](c[H>>2]|0,s,1);break b}L=c[w>>2]|0;if((L|0)==0){break b}M=c[q>>2]|0;N=c[r>>2]|0;c[m>>2]=M;if((a[D]|0)!=0){Tc[L&127](c[H>>2]|0,M,N-M|0);break b}if((c[v>>2]|0)==(d|0)){O=B;P=A}else{M=c[C>>2]|0;O=M+4|0;P=M|0}do{c[n>>2]=c[E>>2];Bc[c[F>>2]&63](d,m,N,n,c[G>>2]|0);c[O>>2]=c[m>>2];M=c[E>>2]|0;Tc[c[w>>2]&127](c[H>>2]|0,M,(c[n>>2]|0)-M|0);c[P>>2]=c[m>>2];}while((c[m>>2]|0)!=(N|0));break};case 6:{N=c[x>>2]|0;if((N|0)!=0){if((a[D]|0)!=0){M=c[q>>2]|0;Tc[N&127](c[H>>2]|0,M,(c[r>>2]|0)-M|0);break b}while(1){c[t>>2]=c[E>>2];Bc[c[F>>2]&63](d,q,c[r>>2]|0,t,c[G>>2]|0);c[z>>2]=c[r>>2];M=c[E>>2]|0;Tc[N&127](c[H>>2]|0,M,(c[t>>2]|0)-M|0);M=c[q>>2]|0;if((M|0)==(c[r>>2]|0)){break b}c[y>>2]=M}}N=c[w>>2]|0;if((N|0)==0){break b}M=c[q>>2]|0;L=c[r>>2]|0;c[k>>2]=M;if((a[D]|0)!=0){Tc[N&127](c[H>>2]|0,M,L-M|0);break b}if((c[v>>2]|0)==(d|0)){Q=B;R=A}else{M=c[C>>2]|0;Q=M+4|0;R=M|0}do{c[l>>2]=c[E>>2];Bc[c[F>>2]&63](d,k,L,l,c[G>>2]|0);c[Q>>2]=c[k>>2];M=c[E>>2]|0;Tc[c[w>>2]&127](c[H>>2]|0,M,(c[l>>2]|0)-M|0);c[R>>2]=c[k>>2];}while((c[k>>2]|0)!=(L|0));break};case 0:{K=37;break a;break};case-2:{K=38;break a;break};case-1:case-4:{K=40;break a;break};default:{K=42;break a}}}while(0);J=c[r>>2]|0;c[q>>2]=J;c[y>>2]=J;J=c[I>>2]|0;if((J|0)==3){K=44;break}else if((J|0)==2){S=35;K=45;break}}if((K|0)==6){k=c[b+76>>2]|0;do{if((k|0)==0){b=c[w>>2]|0;if((b|0)==0){break}R=c[q>>2]|0;l=c[r>>2]|0;c[o>>2]=R;if((a[D]|0)!=0){Tc[b&127](c[H>>2]|0,R,l-R|0);break}if((c[v>>2]|0)==(d|0)){T=B;U=A}else{R=c[C>>2]|0;T=R+4|0;U=R|0}do{c[p>>2]=c[E>>2];Bc[c[F>>2]&63](d,o,l,p,c[G>>2]|0);c[T>>2]=c[o>>2];R=c[E>>2]|0;Tc[c[w>>2]&127](c[H>>2]|0,R,(c[p>>2]|0)-R|0);c[U>>2]=c[o>>2];}while((c[o>>2]|0)!=(l|0))}else{Cc[k&255](c[H>>2]|0)}}while(0);H=c[r>>2]|0;c[e>>2]=H;c[g>>2]=H;S=(c[I>>2]|0)==2?35:0;i=j;return S|0}else if((K|0)==37){c[y>>2]=c[r>>2];S=4;i=j;return S|0}else if((K|0)==38){if(h<<24>>24==0){S=6;i=j;return S|0}c[g>>2]=c[q>>2];S=0;i=j;return S|0}else if((K|0)==40){if(h<<24>>24==0){S=20;i=j;return S|0}c[g>>2]=c[q>>2];S=0;i=j;return S|0}else if((K|0)==42){c[y>>2]=c[r>>2];S=23;i=j;return S|0}else if((K|0)==44){c[g>>2]=c[r>>2];S=0;i=j;return S|0}else if((K|0)==45){i=j;return S|0}return 0}function Ld(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;g=i;i=i+8|0;h=g|0;c[h>>2]=d;d=b+144|0;j=b+468|0;k=Kd(b,c[d>>2]|0,h,e,f,(a[j]|0)==0|0)|0;l=c[h>>2]|0;if((k|0)!=0|(l|0)==0){m=k;i=g;return m|0}k=b+264|0;if((c[b+460>>2]|0)==0){c[k>>2]=6;h=Gd(b,0,c[d>>2]|0,l,e,f,(a[j]|0)==0|0)|0;if((h|0)!=0){m=h;i=g;return m|0}h=b+16|0;n=c[b+348>>2]|0;if((n|0)==0){m=0;i=g;return m|0}else{o=n}while(1){n=(c[o+24>>2]|0)+1|0;p=o+36|0;q=c[p>>2]|0;r=q+n|0;s=o+4|0;t=c[s>>2]|0;if((t|0)==(r|0)){m=0;u=25;break}v=o+8|0;w=c[v>>2]|0;x=w+n|0;y=o+40|0;if((x|0)>((c[y>>2]|0)-q|0)){z=Oc[c[h>>2]&255](q,x)|0;if((z|0)==0){m=1;u=25;break}q=o+12|0;A=c[p>>2]|0;if((c[q>>2]|0)==(A|0)){c[q>>2]=z}q=o+16|0;B=c[q>>2]|0;if((B|0)!=0){c[q>>2]=z+(B-A)}c[p>>2]=z;c[y>>2]=z+x;C=z+n|0;D=c[s>>2]|0;E=c[v>>2]|0}else{C=r;D=t;E=w}tF(C|0,D|0,E)|0;c[s>>2]=C;s=c[o>>2]|0;if((s|0)==0){m=0;u=25;break}else{o=s}}if((u|0)==25){i=g;return m|0}}else{c[k>>2]=2;k=Gd(b,1,c[d>>2]|0,l,e,f,(a[j]|0)==0|0)|0;if((k|0)!=0){m=k;i=g;return m|0}k=b+16|0;j=c[b+348>>2]|0;if((j|0)==0){m=0;i=g;return m|0}else{F=j}while(1){j=(c[F+24>>2]|0)+1|0;b=F+36|0;f=c[b>>2]|0;e=f+j|0;l=F+4|0;d=c[l>>2]|0;if((d|0)==(e|0)){m=0;u=25;break}o=F+8|0;C=c[o>>2]|0;E=C+j|0;D=F+40|0;if((E|0)>((c[D>>2]|0)-f|0)){h=Oc[c[k>>2]&255](f,E)|0;if((h|0)==0){m=1;u=25;break}f=F+12|0;s=c[b>>2]|0;if((c[f>>2]|0)==(s|0)){c[f>>2]=h}f=F+16|0;w=c[f>>2]|0;if((w|0)!=0){c[f>>2]=h+(w-s)}c[b>>2]=h;c[D>>2]=h+E;G=h+j|0;H=c[l>>2]|0;I=c[o>>2]|0}else{G=e;H=d;I=C}tF(G|0,H|0,I)|0;c[l>>2]=G;l=c[F>>2]|0;if((l|0)==0){m=0;u=25;break}else{F=l}}if((u|0)==25){i=g;return m|0}}return 0}function Md(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=i;i=i+32|0;h=g|0;j=g+8|0;k=g+16|0;l=g+24|0;m=b+64|0;if((c[m>>2]|0)==0){n=b+80|0;o=c[n>>2]|0;if((o|0)==0){p=1;i=g;return p|0}c[k>>2]=e;if((a[d+68|0]|0)!=0){Tc[o&127](c[b+4>>2]|0,e,f-e|0);p=1;i=g;return p|0}if((c[b+144>>2]|0)==(d|0)){q=b+276|0;r=b+272|0}else{o=c[b+284>>2]|0;q=o+4|0;r=o|0}o=b+44|0;s=d+56|0;t=b+48|0;u=b+4|0;while(1){c[l>>2]=c[o>>2];Bc[c[s>>2]&63](d,k,f,l,c[t>>2]|0);c[q>>2]=c[k>>2];v=c[o>>2]|0;Tc[c[n>>2]&127](c[u>>2]|0,v,(c[l>>2]|0)-v|0);c[r>>2]=c[k>>2];if((c[k>>2]|0)==(f|0)){p=1;break}}i=g;return p|0}k=d+64|0;r=c[k>>2]<<1;l=e+r|0;u=e+((Oc[c[d+28>>2]&255](d,l)|0)+r)|0;r=b+400|0;c[j>>2]=l;l=b+412|0;do{if((c[l>>2]|0)==0){if((Bd(r)|0)<<24>>24==0){p=0}else{break}i=g;return p|0}}while(0);e=d+56|0;n=b+408|0;while(1){Bc[c[e>>2]&63](d,j,u,l,c[n>>2]|0);if((c[j>>2]|0)==(u|0)){break}if((Bd(r)|0)<<24>>24==0){p=0;w=41;break}}if((w|0)==41){i=g;return p|0}j=b+416|0;if((c[j>>2]|0)==0){p=0;i=g;return p|0}o=c[l>>2]|0;do{if((o|0)==(c[n>>2]|0)){if((Bd(r)|0)<<24>>24==0){p=0;i=g;return p|0}else{x=c[l>>2]|0;break}}else{x=o}}while(0);c[l>>2]=x+1;a[x]=0;x=c[j>>2]|0;if((x|0)==0){p=0;i=g;return p|0}c[j>>2]=c[l>>2];o=Oc[c[d+32>>2]&255](d,u)|0;u=f+(-(c[k>>2]<<1)|0)|0;c[h>>2]=o;do{if((c[l>>2]|0)==0){if((Bd(r)|0)<<24>>24==0){p=0}else{break}i=g;return p|0}}while(0);while(1){Bc[c[e>>2]&63](d,h,u,l,c[n>>2]|0);if((c[h>>2]|0)==(u|0)){break}if((Bd(r)|0)<<24>>24==0){p=0;w=41;break}}if((w|0)==41){i=g;return p|0}if((c[j>>2]|0)==0){p=0;i=g;return p|0}u=c[l>>2]|0;do{if((u|0)==(c[n>>2]|0)){if((Bd(r)|0)<<24>>24==0){p=0;i=g;return p|0}else{y=c[l>>2]|0;break}}else{y=u}}while(0);c[l>>2]=y+1;a[y]=0;y=c[j>>2]|0;if((y|0)==0){p=0;i=g;return p|0}else{z=y}while(1){u=a[z]|0;if((u<<24>>24|0)==13){A=z;B=z;C=13;w=31;break}else if((u<<24>>24|0)==0){break}z=z+1|0}if((w|0)==31){while(1){w=0;if(C<<24>>24==13){a[A]=10;z=B+1|0;D=(a[z]|0)==10?B+2|0:z}else{a[A]=C;D=B+1|0}E=A+1|0;z=a[D]|0;if(z<<24>>24==0){break}else{A=E;B=D;C=z;w=31}}a[E]=0}Tc[c[m>>2]&127](c[b+4>>2]|0,x,y);y=b+404|0;b=c[y>>2]|0;x=r|0;r=c[x>>2]|0;do{if((b|0)==0){c[y>>2]=r}else{if((r|0)==0){break}else{F=r;G=b}while(1){m=F|0;E=c[m>>2]|0;c[m>>2]=G;c[y>>2]=F;if((E|0)==0){break}else{G=F;F=E}}}}while(0);c[x>>2]=0;c[j>>2]=0;c[l>>2]=0;c[n>>2]=0;p=1;i=g;return p|0}function Nd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;g=i;i=i+24|0;h=g|0;j=g+8|0;k=g+16|0;l=b+68|0;if((c[l>>2]|0)==0){m=b+80|0;n=c[m>>2]|0;if((n|0)==0){o=1;i=g;return o|0}c[j>>2]=e;if((a[d+68|0]|0)!=0){Tc[n&127](c[b+4>>2]|0,e,f-e|0);o=1;i=g;return o|0}if((c[b+144>>2]|0)==(d|0)){p=b+276|0;q=b+272|0}else{n=c[b+284>>2]|0;p=n+4|0;q=n|0}n=b+44|0;r=d+56|0;s=b+48|0;t=b+4|0;while(1){c[k>>2]=c[n>>2];Bc[c[r>>2]&63](d,j,f,k,c[s>>2]|0);c[p>>2]=c[j>>2];u=c[n>>2]|0;Tc[c[m>>2]&127](c[t>>2]|0,u,(c[k>>2]|0)-u|0);c[q>>2]=c[j>>2];if((c[j>>2]|0)==(f|0)){o=1;break}}i=g;return o|0}j=b+400|0;q=c[d+64>>2]|0;k=f+(q*-3|0)|0;c[h>>2]=e+(q<<2);q=b+412|0;do{if((c[q>>2]|0)==0){if((Bd(j)|0)<<24>>24==0){o=0}else{break}i=g;return o|0}}while(0);e=d+56|0;f=b+408|0;while(1){Bc[c[e>>2]&63](d,h,k,q,c[f>>2]|0);if((c[h>>2]|0)==(k|0)){break}if((Bd(j)|0)<<24>>24==0){o=0;v=32;break}}if((v|0)==32){i=g;return o|0}k=b+416|0;if((c[k>>2]|0)==0){o=0;i=g;return o|0}h=c[q>>2]|0;do{if((h|0)==(c[f>>2]|0)){if((Bd(j)|0)<<24>>24==0){o=0;i=g;return o|0}else{w=c[q>>2]|0;break}}else{w=h}}while(0);c[q>>2]=w+1;a[w]=0;w=c[k>>2]|0;if((w|0)==0){o=0;i=g;return o|0}else{x=w}while(1){h=a[x]|0;if((h<<24>>24|0)==13){y=x;z=x;A=13;v=22;break}else if((h<<24>>24|0)==0){break}x=x+1|0}if((v|0)==22){while(1){v=0;if(A<<24>>24==13){a[y]=10;x=z+1|0;B=(a[x]|0)==10?z+2|0:x}else{a[y]=A;B=z+1|0}C=y+1|0;x=a[B]|0;if(x<<24>>24==0){break}else{y=C;z=B;A=x;v=22}}a[C]=0}Dc[c[l>>2]&63](c[b+4>>2]|0,w);w=b+404|0;b=c[w>>2]|0;l=j|0;j=c[l>>2]|0;do{if((b|0)==0){c[w>>2]=j}else{if((j|0)==0){break}else{D=j;E=b}while(1){C=D|0;v=c[C>>2]|0;c[C>>2]=E;c[w>>2]=D;if((v|0)==0){break}else{E=D;D=v}}}}while(0);c[l>>2]=0;c[k>>2]=0;c[q>>2]=0;c[f>>2]=0;o=1;i=g;return o|0}function Od(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=Gd(b,0,c[b+144>>2]|0,d,e,f,(a[b+468|0]|0)==0|0)|0;do{if((g|0)==0){if((Hd(b)|0)<<24>>24==0){h=1}else{break}return h|0}}while(0);h=g;return h|0}function Pd(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=c[b+340>>2]|0;f=d|0;g=e+80|0;h=e+92|0;i=e+88|0;j=e+60|0;k=e+96|0;e=d+4|0;d=c[f>>2]|0;a:while(1){l=a[d]|0;if((l<<24>>24|0)==0){m=1;n=17;break}else if((l<<24>>24|0)==58){l=c[f>>2]|0;o=c[h>>2]|0;p=(o|0)==(c[i>>2]|0);if((l|0)==(d|0)){q=p;r=o}else{s=l;l=p;p=o;while(1){if(l){if((Bd(g)|0)<<24>>24==0){m=0;n=17;break a}t=c[h>>2]|0}else{t=p}o=a[s]|0;c[h>>2]=t+1;a[t]=o;o=s+1|0;u=c[h>>2]|0;v=(u|0)==(c[i>>2]|0);if((o|0)==(d|0)){q=v;r=u;break}else{s=o;l=v;p=u}}}if(q){if((Bd(g)|0)<<24>>24==0){m=0;n=17;break}w=c[h>>2]|0}else{w=r}c[h>>2]=w+1;a[w]=0;p=Cd(b,j,c[k>>2]|0,8)|0;if((p|0)==0){m=0;n=17;break}l=c[k>>2]|0;if((c[p>>2]|0)==(l|0)){c[k>>2]=c[h>>2]}else{c[h>>2]=l}c[e>>2]=p}d=d+1|0}if((n|0)==17){return m|0}return 0}function Qd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;g=i;i=i+8|0;h=g|0;j=c[b+340>>2]|0;k=j+80|0;l=j+92|0;m=c[l>>2]|0;n=j+88|0;do{if((m|0)==(c[n>>2]|0)){if((Bd(k)|0)<<24>>24==0){o=0;i=g;return o|0}else{p=c[l>>2]|0;break}}else{p=m}}while(0);c[l>>2]=p+1;a[p]=0;c[h>>2]=e;do{if((c[l>>2]|0)==0){if((Bd(k)|0)<<24>>24==0){o=0}else{break}i=g;return o|0}}while(0);e=d+56|0;while(1){Bc[c[e>>2]&63](d,h,f,l,c[n>>2]|0);if((c[h>>2]|0)==(f|0)){break}if((Bd(k)|0)<<24>>24==0){o=0;q=39;break}}if((q|0)==39){i=g;return o|0}f=j+96|0;if((c[f>>2]|0)==0){o=0;i=g;return o|0}h=c[l>>2]|0;do{if((h|0)==(c[n>>2]|0)){if((Bd(k)|0)<<24>>24==0){o=0;i=g;return o|0}else{r=c[l>>2]|0;break}}else{r=h}}while(0);c[l>>2]=r+1;a[r]=0;r=c[f>>2]|0;if((r|0)==0){o=0;i=g;return o|0}h=r+1|0;d=Cd(b,j+40|0,h,12)|0;e=d;if((d|0)==0){o=0;i=g;return o|0}if((c[d>>2]|0)!=(h|0)){c[l>>2]=c[f>>2];o=e;i=g;return o|0}p=c[l>>2]|0;c[f>>2]=p;if((a[b+232|0]|0)==0){o=e;i=g;return o|0}do{if((a[h]|0)==120){if((a[r+2|0]|0)!=109){s=0;break}if((a[r+3|0]|0)!=108){s=0;break}if((a[r+4|0]|0)!=110){s=0;break}if((a[r+5|0]|0)!=115){s=0;break}m=a[r+6|0]|0;if((m<<24>>24|0)==0){c[d+4>>2]=j+132}else if((m<<24>>24|0)==58){c[d+4>>2]=Cd(b,j+60|0,r+7|0,8)|0}else{s=0;break}a[e+9|0]=1;o=e;i=g;return o|0}else{s=0}}while(0);while(1){h=s+1|0;m=a[r+h|0]|0;if((m<<24>>24|0)==58){break}else if((m<<24>>24|0)==0){o=e;q=39;break}else{s=h}}if((q|0)==39){i=g;return o|0}q=(p|0)==(c[n>>2]|0);a:do{if((s|0)>0){h=0;m=q;t=p;while(1){if(m){if((Bd(k)|0)<<24>>24==0){o=0;break}u=c[l>>2]|0}else{u=t}v=h+1|0;w=a[r+v|0]|0;c[l>>2]=u+1;a[u]=w;w=c[l>>2]|0;x=(w|0)==(c[n>>2]|0);if((v|0)<(s|0)){h=v;m=x;t=w}else{y=x;z=w;break a}}i=g;return o|0}else{y=q;z=p}}while(0);do{if(y){if((Bd(k)|0)<<24>>24==0){o=0;i=g;return o|0}else{A=c[l>>2]|0;break}}else{A=z}}while(0);c[l>>2]=A+1;a[A]=0;A=Cd(b,j+60|0,c[f>>2]|0,8)|0;c[d+4>>2]=A;d=c[f>>2]|0;if((c[A>>2]|0)==(d|0)){c[f>>2]=c[l>>2];o=e;i=g;return o|0}else{c[l>>2]=d;o=e;i=g;return o|0}return 0}function Rd(b,e,f,g,h,j){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;k=i;i=i+32|0;l=k|0;m=k+8|0;n=k+16|0;o=k+24|0;p=c[b+340>>2]|0;q=e+12|0;r=e+40|0;s=f<<24>>24==0;t=j+12|0;u=j+16|0;v=o|0;w=j+8|0;x=e+56|0;y=e+64|0;z=e+44|0;A=b+424|0;B=b+436|0;C=b+432|0;D=b+440|0;E=p+8|0;F=(p+80|0)==(j|0);G=p+130|0;H=p+129|0;I=b+284|0;J=b+224|0;K=b+472|0;L=p|0;M=p+4|0;p=g;a:while(1){b:do{switch(Sc[c[q>>2]&127](e,p,h,n)|0){case 10:{g=Oc[c[r>>2]&255](e,p)|0;if((g|0)<0){N=8;break a}if(s&(g|0)==32){O=c[t>>2]|0;if((O|0)==(c[u>>2]|0)){break b}if((a[O-1|0]|0)==32){break b}}O=Re(g,v)|0;if((O|0)==0){N=15;break a}if((O|0)>0){P=0}else{break b}do{g=c[t>>2]|0;if((g|0)==(c[w>>2]|0)){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}R=c[t>>2]|0}else{R=g}g=a[o+P|0]|0;c[t>>2]=R+1;a[R]=g;P=P+1|0;}while((P|0)<(O|0));break};case 6:{O=c[n>>2]|0;c[m>>2]=p;if((c[t>>2]|0)==0){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}}while(1){Bc[c[x>>2]&63](e,m,O,t,c[w>>2]|0);if((c[m>>2]|0)==(O|0)){break}if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}}if((c[u>>2]|0)==0){Q=1;N=84;break a}break};case-3:{c[n>>2]=p+(c[y>>2]|0);N=27;break};case 39:case 7:{N=27;break};case 9:{O=c[y>>2]|0;g=(Hc[c[z>>2]&63](e,p+O|0,(c[n>>2]|0)+(-O|0)|0)|0)&255;if(g<<24>>24!=0){O=c[t>>2]|0;if((O|0)==(c[w>>2]|0)){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}S=c[t>>2]|0}else{S=O}c[t>>2]=S+1;a[S]=g;break b}g=c[y>>2]|0;O=(c[n>>2]|0)+(-g|0)|0;c[l>>2]=p+g;if((c[B>>2]|0)==0){if((Bd(A)|0)<<24>>24==0){Q=1;N=84;break a}}while(1){Bc[c[x>>2]&63](e,l,O,B,c[C>>2]|0);if((c[l>>2]|0)==(O|0)){break}if((Bd(A)|0)<<24>>24==0){Q=1;N=84;break a}}if((c[D>>2]|0)==0){Q=1;N=84;break a}O=c[B>>2]|0;if((O|0)==(c[C>>2]|0)){if((Bd(A)|0)<<24>>24==0){Q=1;N=84;break a}T=c[B>>2]|0}else{T=O}c[B>>2]=T+1;a[T]=0;O=c[D>>2]|0;if((O|0)==0){Q=1;N=84;break a}g=c[E>>2]|0;c:do{if((g|0)==0){U=0}else{V=c[K>>2]|0;W=a[O]|0;if(W<<24>>24==0){X=V}else{Y=O;Z=V;V=W;while(1){_=Y+1|0;$=(Z*1000003|0)^V&255;aa=a[_]|0;if(aa<<24>>24==0){X=$;break}else{Y=_;Z=$;V=aa}}}V=g-1|0;Z=X&V;Y=c[L>>2]|0;aa=c[Y+(Z<<2)>>2]|0;if((aa|0)==0){U=0;break}$=X&-g;_=V>>>2;V=0;ba=Z;Z=aa;while(1){aa=c[Z>>2]|0;if(W<<24>>24==(a[aa]|0)){ca=O;da=aa;aa=W;do{if(aa<<24>>24==0){U=Z;break c}ca=ca+1|0;da=da+1|0;aa=a[ca]|0;}while(aa<<24>>24==(a[da]|0))}if(V<<24>>24==0){ea=($>>>(((d[M]|0)-1|0)>>>0)&_|1)&255}else{ea=V}da=ea&255;aa=(ba>>>0<da>>>0?g:0)+(ba-da)|0;da=c[Y+(aa<<2)>>2]|0;if((da|0)==0){U=0;break}else{V=ea;ba=aa;Z=da}}}}while(0);g=U;c[B>>2]=O;do{if(F){if((a[G]|0)==0){fa=(a[H]|0)!=0}else{fa=(c[I>>2]|0)!=0}ga=fa&1^1;N=67}else{if((a[H]|0)==0){if((U|0)==0){Q=11;N=84;break a}else{N=69;break}}else{ga=(a[G]|0)!=0|0;N=67;break}}}while(0);do{if((N|0)==67){N=0;O=(U|0)!=0;if(ga<<24>>24==0){if(O){break}else{break b}}else{if(O){N=69;break}else{Q=11;N=84;break a}}}}while(0);if((N|0)==69){N=0;if((a[g+34|0]|0)==0){Q=24;N=84;break a}}O=U+32|0;if((a[O]|0)!=0){N=72;break a}if((c[U+28>>2]|0)!=0){N=75;break a}Z=c[U+4>>2]|0;if((Z|0)==0){N=78;break a}ba=Z+(c[U+8>>2]|0)|0;a[O]=1;V=Rd(b,c[J>>2]|0,f,Z,ba,j)|0;a[O]=0;if((V|0)!=0){Q=V;N=84;break a}break};case-4:{Q=0;N=84;break a;break};case-1:{N=5;break a;break};case 0:{N=3;break a;break};default:{N=81;break a}}}while(0);do{if((N|0)==27){N=0;V=c[t>>2]|0;if(s){if((V|0)==(c[u>>2]|0)){break}if((a[V-1|0]|0)==32){break}}if((V|0)==(c[w>>2]|0)){if((Bd(j)|0)<<24>>24==0){Q=1;N=84;break a}ha=c[t>>2]|0}else{ha=V}c[t>>2]=ha+1;a[ha]=32}}while(0);p=c[n>>2]|0}if((N|0)==3){if((c[b+144>>2]|0)!=(e|0)){Q=4;i=k;return Q|0}c[b+272>>2]=c[n>>2];Q=4;i=k;return Q|0}else if((N|0)==5){if((c[b+144>>2]|0)!=(e|0)){Q=4;i=k;return Q|0}c[b+272>>2]=p;Q=4;i=k;return Q|0}else if((N|0)==8){if((c[b+144>>2]|0)!=(e|0)){Q=14;i=k;return Q|0}c[b+272>>2]=p;Q=14;i=k;return Q|0}else if((N|0)==15){if((c[b+144>>2]|0)!=(e|0)){Q=14;i=k;return Q|0}c[b+272>>2]=p;Q=14;i=k;return Q|0}else if((N|0)==72){if((c[b+144>>2]|0)!=(e|0)){Q=12;i=k;return Q|0}c[b+272>>2]=p;Q=12;i=k;return Q|0}else if((N|0)==75){if((c[b+144>>2]|0)!=(e|0)){Q=15;i=k;return Q|0}c[b+272>>2]=p;Q=15;i=k;return Q|0}else if((N|0)==78){if((c[b+144>>2]|0)!=(e|0)){Q=16;i=k;return Q|0}c[b+272>>2]=p;Q=16;i=k;return Q|0}else if((N|0)==81){if((c[b+144>>2]|0)!=(e|0)){Q=23;i=k;return Q|0}c[b+272>>2]=p;Q=23;i=k;return Q|0}else if((N|0)==84){i=k;return Q|0}return 0}function Sd(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+8|0;h=g|0;j=b+284|0;k=c[j>>2]|0;if((k|0)==0){l=23;i=g;return l|0}m=c[k+12>>2]|0;n=m+4|0;o=c[n>>2]|0;p=m+12|0;q=o+(c[m+8>>2]|0)|0;r=Gd(b,c[k+16>>2]|0,c[b+224>>2]|0,o+(c[p>>2]|0)|0,q,h,0)|0;if((r|0)!=0){l=r;i=g;return l|0}r=c[h>>2]|0;do{if((q|0)!=(r|0)){if((c[b+464>>2]|0)!=3){break}c[p>>2]=r-(c[n>>2]|0);l=0;i=g;return l|0}}while(0);a[m+32|0]=0;m=k+8|0;c[j>>2]=c[m>>2];j=b+288|0;c[m>>2]=c[j>>2];c[j>>2]=k;c[b+264>>2]=6;l=Gd(b,(c[b+460>>2]|0)!=0|0,c[b+144>>2]|0,d,e,f,(a[b+468|0]|0)==0|0)|0;i=g;return l|0}function Td(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+1040|0;e=d|0;f=c[a+124>>2]|0;if((f|0)==0){g=18;i=d;return g|0}vF(e|0,-1|0,1024)|0;h=e+1028|0;c[h>>2]=0;j=e+1024|0;c[j>>2]=0;k=e+1032|0;c[k>>2]=0;do{if((Hc[f&63](c[a+244>>2]|0,b,e)|0)!=0){l=c[a+12>>2]|0;m=Se()|0;n=Ec[l&63](m)|0;c[a+236>>2]=n;if((n|0)!=0){m=Te(n,e|0,c[h>>2]|0,c[j>>2]|0)|0;if((m|0)==0){break}c[a+240>>2]=c[j>>2];c[a+248>>2]=c[k>>2];c[a+144>>2]=m;g=0;i=d;return g|0}m=c[k>>2]|0;if((m|0)==0){g=1;i=d;return g|0}Cc[m&255](c[j>>2]|0);g=1;i=d;return g|0}}while(0);a=c[k>>2]|0;if((a|0)==0){g=18;i=d;return g|0}Cc[a&255](c[j>>2]|0);g=18;i=d;return g|0}function Ud(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=a+228|0;do{if((_e(a+148|0,a+144|0,c[f>>2]|0)|0)==0){g=Td(a,c[f>>2]|0)|0;if((g|0)==0){break}else{h=g}return h|0}}while(0);c[a+264>>2]=92;h=Vd(a,b,d,e)|0;return h|0}function Vd(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0;h=i;i=i+184|0;j=h|0;k=h+8|0;l=h+16|0;m=h+24|0;n=h+32|0;o=h+40|0;p=h+48|0;q=h+56|0;r=h+64|0;s=h+72|0;t=h+80|0;u=h+88|0;v=h+96|0;w=h+104|0;x=h+112|0;y=h+120|0;z=h+128|0;A=h+136|0;B=h+144|0;C=h+152|0;D=h+160|0;E=h+168|0;F=h+176|0;c[F>>2]=e;G=b+144|0;H=c[G>>2]|0;I=Sc[c[H>>2]&127](H,e,f,F)|0;H=c[G>>2]|0;J=b+468|0;K=a[J]|0;c[E>>2]=c[F>>2];F=b+340|0;L=c[F>>2]|0;M=b+272|0;N=b+276|0;O=b+284|0;P=K<<24>>24!=0;K=b+252|0;Q=K|0;R=b+80|0;S=b+44|0;T=b+48|0;U=b+4|0;V=b+464|0;W=b+84|0;X=b+308|0;Y=b+400|0;Z=b+412|0;_=b+408|0;$=b+416|0;aa=b+304|0;ba=b+312|0;ca=b+404|0;da=b+400|0;ea=L+129|0;fa=L+128|0;ga=b+300|0;ha=L+80|0;ia=L+92|0;ja=L+88|0;ka=L+96|0;la=b+136|0;ma=b+88|0;na=b+328|0;oa=b+132|0;pa=b+332|0;qa=b+336|0;ra=b+316|0;sa=b+337|0;ta=b+12|0;ua=b+16|0;va=z|0;wa=L+120|0;xa=L+116|0;ya=b+344|0;za=L+130|0;Aa=b+108|0;Ba=b+92|0;Ca=L|0;Da=b+460|0;Ea=b+324|0;Fa=b+320|0;Ga=b+96|0;Ha=b+256|0;Ia=b+452|0;Ja=b+448|0;Ka=L+140|0;La=L+160|0;Ma=L+164|0;Na=L+144|0;Oa=b+128|0;Pa=L+156|0;Qa=L+148|0;L=H;H=e;e=I;a:while(1){c[M>>2]=H;c[N>>2]=c[E>>2];b:do{if((e|0)<1){if(!((e|0)==0|P)){Ra=4;break a}switch(e|0){case 0:{Ra=6;break a;break};case-1:{Sa=5;Ra=486;break a;break};case-2:{Ra=487;break a;break};case-15:{Ta=15;break b;break};case-4:{Ua=3;Ra=488;break a;break};default:{}}c[E>>2]=f;Ta=-e|0}else{Ta=e}}while(0);I=Gc[c[Q>>2]&127](K,Ta,H,c[E>>2]|0,L)|0;c:do{switch(I|0){case 28:{c[ra>>2]=28928;Ra=121;break};case 29:{c[ra>>2]=28888;Ra=121;break};case 30:{c[ra>>2]=28872;Ra=121;break};case 5:{a[ea]=1;if((c[W>>2]|0)==0){Va=1}else{Wa=c[L+64>>2]|0;Xa=(c[E>>2]|0)+(-Wa|0)|0;c[w>>2]=H+Wa;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Ra=261;break a}}Wa=L+56|0;while(1){Bc[c[Wa>>2]&63](L,w,Xa,Z,c[_>>2]|0);if((c[w>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ra=261;break a}}if((c[$>>2]|0)==0){Ra=261;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ra=261;break a}Ya=c[Z>>2]|0}else{Ya=Xa}c[Z>>2]=Ya+1;a[Ya]=0;Xa=c[$>>2]|0;c[X>>2]=Xa;if((Xa|0)==0){Sa=1;Ra=486;break a}c[$>>2]=c[Z>>2];Va=0}if((a[za]|0)!=0){Za=Va;Ra=475;break c}Xa=c[Aa>>2]|0;if((Xa|0)==0){Za=Va;Ra=475;break c}if((Ec[Xa&63](c[U>>2]|0)|0)==0){Sa=22;Ra=486;break a}else{Za=Va;Ra=475}break};case 4:{if((c[W>>2]|0)==0){_a=1}else{Xa=c[E>>2]|0;c[D>>2]=H;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Ra=21;break a}}Wa=L+56|0;while(1){Bc[c[Wa>>2]&63](L,D,Xa,Z,c[_>>2]|0);if((c[D>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ra=21;break a}}if((c[$>>2]|0)==0){Ra=21;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ra=21;break a}$a=c[Z>>2]|0}else{$a=Xa}c[Z>>2]=$a+1;a[$a]=0;Xa=c[$>>2]|0;c[aa>>2]=Xa;if((Xa|0)==0){Sa=1;Ra=486;break a}c[$>>2]=c[Z>>2];c[ba>>2]=0;_a=0}c[X>>2]=0;Za=_a;Ra=475;break};case 1:{Xa=Ed(b,0,H,c[E>>2]|0)|0;if((Xa|0)!=0){Sa=Xa;Ra=486;break a}ab=c[G>>2]|0;break};case 34:{Xa=c[E>>2]|0;Wa=c[F>>2]|0;bb=Wa+80|0;c[l>>2]=H;cb=Wa+92|0;if((c[cb>>2]|0)==0){if((Bd(bb)|0)<<24>>24==0){Ra=109;break a}}db=L+56|0;eb=Wa+88|0;while(1){Bc[c[db>>2]&63](L,l,Xa,cb,c[eb>>2]|0);if((c[l>>2]|0)==(Xa|0)){break}if((Bd(bb)|0)<<24>>24==0){Ra=109;break a}}Xa=Wa+96|0;if((c[Xa>>2]|0)==0){Ra=109;break a}db=c[cb>>2]|0;if((db|0)==(c[eb>>2]|0)){if((Bd(bb)|0)<<24>>24==0){Ra=109;break a}fb=c[cb>>2]|0}else{fb=db}c[cb>>2]=fb+1;a[fb]=0;db=c[Xa>>2]|0;if((db|0)==0){Ra=109;break a}gb=Cd(b,Wa+20|0,db,24)|0;hb=gb;if((gb|0)==0){Ra=109;break a}if((c[gb>>2]|0)==(db|0)){c[Xa>>2]=c[cb>>2];if((Pd(b,hb)|0)==0){Ra=109;break a}}else{c[cb>>2]=c[Xa>>2]}c[na>>2]=hb;Ra=121;break};case 21:{if((Sc[c[L+52>>2]&127](L,H,c[E>>2]|0,M)|0)==0){Sa=32;Ra=486;break a}if((c[Fa>>2]|0)==0){Ra=476;break c}hb=c[L+64>>2]|0;Xa=(c[E>>2]|0)+(-hb|0)|0;c[r>>2]=H+hb;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}hb=L+56|0;while(1){Bc[c[hb>>2]&63](L,r,Xa,Z,c[_>>2]|0);if((c[r>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}ib=c[Z>>2]|0}else{ib=Xa}c[Z>>2]=ib+1;a[ib]=0;Xa=c[$>>2]|0;if((Xa|0)==0){Sa=1;Ra=486;break a}hb=a[Xa]|0;do{if(hb<<24>>24==0){jb=Xa}else{cb=Xa;Wa=Xa;bb=hb;while(1){eb=bb<<24>>24;do{if((eb|0)==32|(eb|0)==13|(eb|0)==10){if((cb|0)==(Xa|0)){kb=Xa;break}if((a[cb-1|0]|0)==32){kb=cb;break}a[cb]=32;kb=cb+1|0}else{a[cb]=bb;kb=cb+1|0}}while(0);eb=Wa+1|0;db=a[eb]|0;if(db<<24>>24==0){break}else{cb=kb;Wa=eb;bb=db}}if((kb|0)==(Xa|0)){jb=Xa;break}bb=kb-1|0;jb=(a[bb]|0)==32?bb:kb}}while(0);a[jb]=0;c[Ea>>2]=Xa;c[$>>2]=c[Z>>2];ab=L;break};case 23:{a[qa]=1;c[ra>>2]=28944;Ra=121;break};case 37:case 38:{if((a[fa]|0)==0){Ra=476;break c}hb=a[qa]|0;bb=c[L+64>>2]|0;Wa=Rd(b,L,hb,H+bb|0,(c[E>>2]|0)+(-bb|0)|0,ha)|0;if((Wa|0)!=0){Sa=Wa;Ra=486;break a}Wa=c[ia>>2]|0;do{if(hb<<24>>24==0){if((Wa|0)==(c[ka>>2]|0)){lb=Wa;break}bb=Wa-1|0;if((a[bb]|0)!=32){lb=Wa;break}c[ia>>2]=bb;lb=bb}else{lb=Wa}}while(0);if((lb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}mb=c[ia>>2]|0}else{mb=lb}c[ia>>2]=mb+1;a[mb]=0;Wa=c[ka>>2]|0;c[ka>>2]=c[ia>>2];hb=c[na>>2]|0;Xa=c[pa>>2]|0;bb=a[qa]|0;cb=hb+12|0;db=c[cb>>2]|0;d:do{if((Wa|0)!=0&(db|0)>0){eb=c[hb+20>>2]|0;gb=0;while(1){nb=gb+1|0;if((c[eb+(gb*12|0)>>2]|0)==(Xa|0)){break d}if((nb|0)<(db|0)){gb=nb}else{Ra=187;break}}}else{Ra=187}}while(0);if((Ra|0)==187){Ra=0;gb=hb+16|0;do{if((db|0)==(c[gb>>2]|0)){if((db|0)==0){c[gb>>2]=8;eb=Ec[c[ta>>2]&63](96)|0;nb=eb;c[hb+20>>2]=nb;if((eb|0)==0){Sa=1;Ra=486;break a}else{ob=nb;break}}nb=hb+20|0;eb=Oc[c[ua>>2]&255](c[nb>>2]|0,db*24|0)|0;if((eb|0)==0){Sa=1;Ra=486;break a}pb=eb;c[gb>>2]=db<<1;c[nb>>2]=pb;ob=pb}else{ob=c[hb+20>>2]|0}}while(0);hb=c[cb>>2]|0;c[ob+(hb*12|0)>>2]=Xa;c[ob+(hb*12|0)+8>>2]=Wa;a[ob+(hb*12|0)+4|0]=bb;if(bb<<24>>24==0){a[Xa+8|0]=1}c[cb>>2]=(c[cb>>2]|0)+1}if((c[oa>>2]|0)==0){Ra=476;break c}hb=c[ra>>2]|0;if((hb|0)==0){Ra=476;break c}db=a[hb]|0;if((db<<24>>24|0)==78){if((a[hb+1|0]|0)==79){Ra=200}}else if((db<<24>>24|0)==40){Ra=200}if((Ra|0)==200){Ra=0;db=c[Z>>2]|0;if((db|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}qb=c[Z>>2]|0}else{qb=db}c[Z>>2]=qb+1;a[qb]=41;db=c[Z>>2]|0;if((db|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}rb=c[Z>>2]|0}else{rb=db}c[Z>>2]=rb+1;a[rb]=0;c[ra>>2]=c[$>>2];c[$>>2]=c[Z>>2]}c[N>>2]=H;Ic[c[oa>>2]&15](c[U>>2]|0,c[c[na>>2]>>2]|0,c[c[pa>>2]>>2]|0,c[ra>>2]|0,Wa,(I|0)==38|0);db=c[ca>>2]|0;hb=c[da>>2]|0;do{if((db|0)==0){c[ca>>2]=hb}else{if((hb|0)==0){break}else{sb=hb;tb=db}while(1){gb=sb|0;pb=c[gb>>2]|0;c[gb>>2]=tb;c[ca>>2]=sb;if((pb|0)==0){break}else{tb=sb;sb=pb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;ab=L;break};case 10:{c[ga>>2]=0;Ra=476;break};case 18:{c[Ea>>2]=0;c[Fa>>2]=0;if((c[Ga>>2]|0)==0){Ra=476;break c}db=c[E>>2]|0;c[s>>2]=H;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Ra=333;break a}}hb=L+56|0;while(1){Bc[c[hb>>2]&63](L,s,db,Z,c[_>>2]|0);if((c[s>>2]|0)==(db|0)){break}if((Bd(Y)|0)<<24>>24==0){Ra=333;break a}}if((c[$>>2]|0)==0){Ra=333;break a}db=c[Z>>2]|0;if((db|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ra=333;break a}ub=c[Z>>2]|0}else{ub=db}c[Z>>2]=ub+1;a[ub]=0;db=c[$>>2]|0;c[Fa>>2]=db;if((db|0)==0){Sa=1;Ra=486;break a}c[$>>2]=c[Z>>2];ab=L;break};case 6:{a[ea]=1;if((c[W>>2]|0)==0){Ra=53;break c}if((Sc[c[L+52>>2]&127](L,H,c[E>>2]|0,M)|0)==0){Sa=32;Ra=486;break a}db=c[L+64>>2]|0;hb=(c[E>>2]|0)+(-db|0)|0;c[C>>2]=H+db;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}db=L+56|0;while(1){Bc[c[db>>2]&63](L,C,hb,Z,c[_>>2]|0);if((c[C>>2]|0)==(hb|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}hb=c[Z>>2]|0;if((hb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}vb=c[Z>>2]|0}else{vb=hb}c[Z>>2]=vb+1;a[vb]=0;hb=c[$>>2]|0;if((hb|0)==0){Sa=1;Ra=486;break a}db=a[hb]|0;do{if(db<<24>>24==0){wb=hb}else{Wa=hb;cb=hb;Xa=db;while(1){bb=Xa<<24>>24;do{if((bb|0)==32|(bb|0)==13|(bb|0)==10){if((Wa|0)==(hb|0)){xb=hb;break}if((a[Wa-1|0]|0)==32){xb=Wa;break}a[Wa]=32;xb=Wa+1|0}else{a[Wa]=Xa;xb=Wa+1|0}}while(0);bb=cb+1|0;pb=a[bb]|0;if(pb<<24>>24==0){break}else{Wa=xb;cb=bb;Xa=pb}}if((xb|0)==(hb|0)){wb=hb;break}Xa=xb-1|0;wb=(a[Xa]|0)==32?Xa:xb}}while(0);a[wb]=0;c[$>>2]=c[Z>>2];c[ba>>2]=hb;yb=0;Ra=54;break};case 19:{do{if((c[Fa>>2]|0)==0){zb=1}else{if((c[Ga>>2]|0)==0){zb=1;break}db=c[L+64>>2]|0;Xa=(c[E>>2]|0)+(-db|0)|0;c[q>>2]=H+db;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}db=L+56|0;while(1){Bc[c[db>>2]&63](L,q,Xa,Z,c[_>>2]|0);if((c[q>>2]|0)==(Xa|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}Xa=c[Z>>2]|0;if((Xa|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}Ab=c[Z>>2]|0}else{Ab=Xa}c[Z>>2]=Ab+1;a[Ab]=0;Xa=c[$>>2]|0;if((Xa|0)==0){Sa=1;Ra=486;break a}c[N>>2]=H;Bc[c[Ga>>2]&63](c[U>>2]|0,c[Fa>>2]|0,c[ya>>2]|0,Xa,c[Ea>>2]|0);zb=0}}while(0);hb=c[ca>>2]|0;Xa=c[da>>2]|0;do{if((hb|0)==0){c[ca>>2]=Xa}else{if((Xa|0)==0){break}else{Bb=Xa;Cb=hb}while(1){db=Bb|0;cb=c[db>>2]|0;c[db>>2]=Cb;c[ca>>2]=Bb;if((cb|0)==0){break}else{Cb=Bb;Bb=cb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;Za=zb;Ra=475;break};case-1:{Ra=384;break a;break};case 44:{hb=c[Ia>>2]|0;do{if((c[Ha>>2]|0)>>>0>=hb>>>0){if((hb|0)==0){Xa=c[ta>>2]|0;c[Ia>>2]=32;cb=Ec[Xa&63](32)|0;c[Ja>>2]=cb;if((cb|0)==0){Sa=1;Ra=486;break a}else{break}}cb=c[ua>>2]|0;Xa=c[Ja>>2]|0;db=hb<<1;c[Ia>>2]=db;Wa=Oc[cb&255](Xa,db)|0;if((Wa|0)==0){Sa=1;Ra=486;break a}c[Ja>>2]=Wa;Wa=c[Ma>>2]|0;if((Wa|0)==0){break}db=Oc[c[ua>>2]&255](Wa,c[Ia>>2]<<2)|0;if((db|0)==0){Sa=1;Ra=486;break a}c[Ma>>2]=db}}while(0);a[(c[Ja>>2]|0)+(c[Ha>>2]|0)|0]=0;if((a[Ka]|0)==0){Ra=476;break c}hb=Wd(b)|0;if((hb|0)<0){Sa=1;Ra=486;break a}c[(c[Ma>>2]|0)+(c[La>>2]<<2)>>2]=hb;c[La>>2]=(c[La>>2]|0)+1;c[(c[Na>>2]|0)+(hb*28|0)>>2]=6;Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 8:{hb=c[aa>>2]|0;if((hb|0)==0){Db=1}else{Bc[c[W>>2]&63](c[U>>2]|0,hb,c[X>>2]|0,c[ba>>2]|0,0);hb=c[ca>>2]|0;db=c[da>>2]|0;do{if((hb|0)==0){c[ca>>2]=db}else{if((db|0)==0){break}else{Eb=db;Fb=hb}while(1){Wa=Eb|0;Xa=c[Wa>>2]|0;c[Wa>>2]=Fb;c[ca>>2]=Eb;if((Xa|0)==0){break}else{Fb=Eb;Eb=Xa}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;Db=0}hb=c[ma>>2]|0;if((hb|0)==0){Za=Db;Ra=475;break c}Cc[hb&255](c[U>>2]|0);ab=L;break};case 9:{if((Hc[c[L+44>>2]&63](L,H,c[E>>2]|0)|0)!=0){c[ga>>2]=0;Ra=476;break c}if((a[fa]|0)==0){c[ia>>2]=c[ka>>2];c[ga>>2]=0;Ra=476;break c}hb=c[E>>2]|0;c[t>>2]=H;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}}db=L+56|0;while(1){Bc[c[db>>2]&63](L,t,hb,ia,c[ja>>2]|0);if((c[t>>2]|0)==(hb|0)){break}if((Bd(ha)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[ka>>2]|0)==0){Sa=1;Ra=486;break a}hb=c[ia>>2]|0;if((hb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}Gb=c[ia>>2]|0}else{Gb=hb}c[ia>>2]=Gb+1;a[Gb]=0;hb=c[ka>>2]|0;if((hb|0)==0){Sa=1;Ra=486;break a}db=Cd(b,Ca,hb,36)|0;c[ga>>2]=db;if((db|0)==0){Sa=1;Ra=486;break a}if((c[db>>2]|0)!=(hb|0)){c[ia>>2]=c[ka>>2];c[ga>>2]=0;Ra=476;break c}c[ka>>2]=c[ia>>2];c[(c[ga>>2]|0)+24>>2]=0;a[(c[ga>>2]|0)+33|0]=0;if((c[Da>>2]|0)==0){Hb=(c[O>>2]|0)==0|0}else{Hb=0}a[(c[ga>>2]|0)+34|0]=Hb;Za=(c[la>>2]|0)==0|0;Ra=475;break};case 14:{Ra=53;break};case 50:{hb=(c[Ja>>2]|0)+(c[Ha>>2]|0)|0;if((a[hb]|0)==124){Sa=2;Ra=486;break a}a[hb]=44;if((a[Ka]|0)==0){Ra=476;break c}Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 49:{hb=c[Ha>>2]|0;db=c[Ja>>2]|0;Xa=a[db+hb|0]|0;if(Xa<<24>>24==44){Sa=2;Ra=486;break a}do{if((a[Ka]|0)!=0&Xa<<24>>24==0){Wa=(c[Na>>2]|0)+((c[(c[Ma>>2]|0)+((c[La>>2]|0)-1<<2)>>2]|0)*28|0)|0;if((c[Wa>>2]|0)==3){Ib=1;Jb=hb;Kb=db;break}c[Wa>>2]=5;Ib=(c[Oa>>2]|0)==0|0;Jb=c[Ha>>2]|0;Kb=c[Ja>>2]|0}else{Ib=1;Jb=hb;Kb=db}}while(0);a[Kb+Jb|0]=124;Za=Ib;Ra=475;break};case 55:{if((Md(b,L,H,c[E>>2]|0)|0)==0){Sa=1;Ra=486;break a}else{ab=L}break};case 56:{if((Nd(b,L,H,c[E>>2]|0)|0)==0){Sa=1;Ra=486;break a}else{ab=L}break};case 0:{Za=(Ta|0)!=14|0;Ra=475;break};case 3:{Za=(c[W>>2]|0)==0|0;Ra=475;break};case 11:{if((a[fa]|0)==0){Ra=476;break c}Za=(c[la>>2]|0)==0|0;Ra=475;break};case 17:{Za=(c[Ga>>2]|0)==0|0;Ra=475;break};case 33:{if((a[fa]|0)==0){Ra=476;break c}Za=(c[oa>>2]|0)==0|0;Ra=475;break};case 39:{Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 2:{Ra=84;break a;break};case 24:{a[sa]=1;c[ra>>2]=28912;Ra=121;break};case 25:{c[ra>>2]=28904;Ra=121;break};case 26:{c[ra>>2]=28896;Ra=121;break};case 27:{c[ra>>2]=28920;Ra=121;break};case 35:case 36:{if((a[fa]|0)==0){Ra=476;break c}db=c[na>>2]|0;hb=c[pa>>2]|0;Xa=a[qa]|0;Wa=db+12|0;cb=c[Wa>>2]|0;e:do{if((a[sa]|0)==0){Ra=149}else{if((cb|0)>0){pb=c[db+20>>2]|0;bb=0;while(1){gb=bb+1|0;if((c[pb+(bb*12|0)>>2]|0)==(hb|0)){break e}if((gb|0)<(cb|0)){bb=gb}else{break}}}bb=db+8|0;if((c[bb>>2]|0)!=0){Ra=149;break}if((a[hb+9|0]|0)!=0){Ra=149;break}c[bb>>2]=hb;Ra=149}}while(0);if((Ra|0)==149){Ra=0;bb=db+16|0;do{if((cb|0)==(c[bb>>2]|0)){if((cb|0)==0){c[bb>>2]=8;pb=Ec[c[ta>>2]&63](96)|0;gb=pb;c[db+20>>2]=gb;if((pb|0)==0){Sa=1;Ra=486;break a}else{Lb=gb;break}}gb=db+20|0;pb=Oc[c[ua>>2]&255](c[gb>>2]|0,cb*24|0)|0;if((pb|0)==0){Sa=1;Ra=486;break a}nb=pb;c[bb>>2]=cb<<1;c[gb>>2]=nb;Lb=nb}else{Lb=c[db+20>>2]|0}}while(0);db=c[Wa>>2]|0;c[Lb+(db*12|0)>>2]=hb;c[Lb+(db*12|0)+8>>2]=0;a[Lb+(db*12|0)+4|0]=Xa;if(Xa<<24>>24==0){a[hb+8|0]=1}c[Wa>>2]=(c[Wa>>2]|0)+1}if((c[oa>>2]|0)==0){Ra=476;break c}db=c[ra>>2]|0;if((db|0)==0){Ra=476;break c}cb=a[db]|0;if((cb<<24>>24|0)==78){if((a[db+1|0]|0)==79){Ra=162}}else if((cb<<24>>24|0)==40){Ra=162}if((Ra|0)==162){Ra=0;cb=c[Z>>2]|0;if((cb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}Mb=c[Z>>2]|0}else{Mb=cb}c[Z>>2]=Mb+1;a[Mb]=41;cb=c[Z>>2]|0;if((cb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}Nb=c[Z>>2]|0}else{Nb=cb}c[Z>>2]=Nb+1;a[Nb]=0;c[ra>>2]=c[$>>2];c[$>>2]=c[Z>>2]}c[N>>2]=H;Ic[c[oa>>2]&15](c[U>>2]|0,c[c[na>>2]>>2]|0,c[c[pa>>2]>>2]|0,c[ra>>2]|0,0,(I|0)==36|0);cb=c[ca>>2]|0;db=c[da>>2]|0;do{if((cb|0)==0){c[ca>>2]=db}else{if((db|0)==0){break}else{Ob=db;Pb=cb}while(1){bb=Ob|0;nb=c[bb>>2]|0;c[bb>>2]=Pb;c[ca>>2]=Ob;if((nb|0)==0){break}else{Pb=Ob;Ob=nb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;ab=L;break};case 40:{if((c[Oa>>2]|0)==0){Ra=476;break c}cb=c[E>>2]|0;db=c[F>>2]|0;Wa=db+80|0;c[k>>2]=H;hb=db+92|0;if((c[hb>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){Ra=423;break a}}Xa=L+56|0;nb=db+88|0;while(1){Bc[c[Xa>>2]&63](L,k,cb,hb,c[nb>>2]|0);if((c[k>>2]|0)==(cb|0)){break}if((Bd(Wa)|0)<<24>>24==0){Ra=423;break a}}cb=db+96|0;if((c[cb>>2]|0)==0){Ra=423;break a}Xa=c[hb>>2]|0;if((Xa|0)==(c[nb>>2]|0)){if((Bd(Wa)|0)<<24>>24==0){Ra=423;break a}Qb=c[hb>>2]|0}else{Qb=Xa}c[hb>>2]=Qb+1;a[Qb]=0;Xa=c[cb>>2]|0;if((Xa|0)==0){Ra=423;break a}bb=Cd(b,db+20|0,Xa,24)|0;gb=bb;if((bb|0)==0){Ra=423;break a}if((c[bb>>2]|0)==(Xa|0)){c[cb>>2]=c[hb>>2];if((Pd(b,gb)|0)==0){Ra=423;break a}}else{c[hb>>2]=c[cb>>2]}c[na>>2]=gb;c[La>>2]=0;c[Pa>>2]=0;a[Ka]=1;ab=L;break};case 22:{gb=Qd(b,L,H,c[E>>2]|0)|0;c[pa>>2]=gb;if((gb|0)==0){Sa=1;Ra=486;break a}a[qa]=0;c[ra>>2]=0;a[sa]=0;Ra=121;break};case 53:{Rb=1;Ra=435;break};case 52:{Rb=2;Ra=435;break};case 54:{Rb=3;Ra=435;break};case 51:{Rb=0;Ra=435;break};case 47:{Sb=1;Ra=459;break};case 46:{Sb=2;Ra=459;break};case 48:{Sb=3;Ra=459;break};case 45:{Sb=0;Ra=459;break};case 7:{gb=c[W>>2]|0;if((gb|0)==0){Ra=476;break c}Bc[gb&63](c[U>>2]|0,c[aa>>2]|0,c[X>>2]|0,c[ba>>2]|0,1);c[aa>>2]=0;gb=c[ca>>2]|0;cb=c[da>>2]|0;do{if((gb|0)==0){c[ca>>2]=cb}else{if((cb|0)==0){break}else{Tb=cb;Ub=gb}while(1){Xa=Tb|0;bb=c[Xa>>2]|0;c[Xa>>2]=Ub;c[ca>>2]=Tb;if((bb|0)==0){break}else{Ub=Tb;Tb=bb}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;ab=L;break};case 13:{if((a[fa]|0)==0){Ra=476;break c}if((c[ga>>2]|0)==0){Ra=476;break c}gb=c[L+64>>2]|0;cb=(c[E>>2]|0)+(-gb|0)|0;c[v>>2]=H+gb;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){Vb=0}else{Ra=271}}else{Ra=271}f:do{if((Ra|0)==271){Ra=0;gb=L+56|0;while(1){Bc[c[gb>>2]&63](L,v,cb,ia,c[ja>>2]|0);if((c[v>>2]|0)==(cb|0)){break}if((Bd(ha)|0)<<24>>24==0){Vb=0;break f}}if((c[ka>>2]|0)==0){Vb=0;break}gb=c[ia>>2]|0;if((gb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Vb=0;break}Wb=c[ia>>2]|0}else{Wb=gb}c[ia>>2]=Wb+1;a[Wb]=0;Vb=c[ka>>2]|0}}while(0);c[(c[ga>>2]|0)+16>>2]=Vb;cb=c[ga>>2]|0;if((c[cb+16>>2]|0)==0){Sa=1;Ra=486;break a}c[cb+20>>2]=c[ya>>2];c[ka>>2]=c[ia>>2];Za=(c[la>>2]|0)==0|0;Ra=475;break};case 20:{do{if((c[Ea>>2]|0)==0){Xb=1}else{if((c[Ga>>2]|0)==0){Xb=1;break}c[N>>2]=H;Bc[c[Ga>>2]&63](c[U>>2]|0,c[Fa>>2]|0,c[ya>>2]|0,0,c[Ea>>2]|0);Xb=0}}while(0);cb=c[ca>>2]|0;gb=c[da>>2]|0;do{if((cb|0)==0){c[ca>>2]=gb}else{if((gb|0)==0){break}else{Yb=gb;Zb=cb}while(1){hb=Yb|0;db=c[hb>>2]|0;c[hb>>2]=Zb;c[ca>>2]=Yb;if((db|0)==0){break}else{Zb=Yb;Yb=db}}}}while(0);c[da>>2]=0;c[$>>2]=0;c[Z>>2]=0;c[_>>2]=0;Za=Xb;Ra=475;break};case 57:{if((a[za]|0)!=0){Ra=476;break c}cb=c[Aa>>2]|0;if((cb|0)==0){Ra=476;break c}if((Ec[cb&63](c[U>>2]|0)|0)==0){Sa=22;Ra=486;break a}else{Ra=476}break};case 31:case 32:{if((a[fa]|0)==0){Ra=476;break c}if((c[oa>>2]|0)==0){Ra=476;break c}if((c[ra>>2]|0)==0){_b=(I|0)==32?28840:28856}else{_b=28864}cb=a[_b]|0;if(cb<<24>>24!=0){gb=_b;db=cb;do{cb=c[Z>>2]|0;if((cb|0)==(c[_>>2]|0)){if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}$b=a[gb]|0;ac=c[Z>>2]|0}else{$b=db;ac=cb}c[Z>>2]=ac+1;a[ac]=$b;gb=gb+1|0;db=a[gb]|0;}while(db<<24>>24!=0)}if((c[$>>2]|0)==0){Sa=1;Ra=486;break a}db=c[E>>2]|0;c[A>>2]=H;if((c[Z>>2]|0)==0){if((Bd(Y)|0)<<24>>24==0){Sa=1;Ra=486;break a}}gb=L+56|0;while(1){Bc[c[gb>>2]&63](L,A,db,Z,c[_>>2]|0);if((c[A>>2]|0)==(db|0)){break}if((Bd(Y)|0)<<24>>24==0){Ua=1;Ra=488;break a}}db=c[$>>2]|0;if((db|0)==0){Sa=1;Ra=486;break a}c[ra>>2]=db;ab=L;break};case 41:case 42:{if((a[Ka]|0)==0){Ra=476;break c}if((c[Oa>>2]|0)==0){bc=1}else{db=Ec[c[ta>>2]&63](20)|0;if((db|0)==0){Sa=1;Ra=486;break a}vF(db+4|0,0,16)|0;c[db>>2]=(I|0)==41?2:1;c[N>>2]=H;Tc[c[Oa>>2]&127](c[U>>2]|0,c[c[na>>2]>>2]|0,db);bc=0}a[Ka]=0;Za=bc;Ra=475;break};case 43:{if((a[Ka]|0)==0){Ra=476;break c}c[(c[Na>>2]|0)+((c[(c[Ma>>2]|0)+((c[La>>2]|0)-1<<2)>>2]|0)*28|0)>>2]=3;Za=(c[Oa>>2]|0)==0|0;Ra=475;break};case 15:{if((a[fa]|0)==0){Ra=476;break c}if((c[ga>>2]|0)==0){Ra=476;break c}if((c[la>>2]|0)==0){Ra=476;break c}c[N>>2]=H;db=c[ga>>2]|0;Nc[c[la>>2]&1](c[U>>2]|0,c[db>>2]|0,d[db+33|0]|0,0,0,c[db+20>>2]|0,c[db+16>>2]|0,c[db+24>>2]|0,0);ab=L;break};case 16:{if((a[fa]|0)==0){Ra=476;break c}if((c[ga>>2]|0)==0){Ra=476;break c}db=c[E>>2]|0;c[u>>2]=H;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){cc=0}else{Ra=289}}else{Ra=289}g:do{if((Ra|0)==289){Ra=0;gb=L+56|0;while(1){Bc[c[gb>>2]&63](L,u,db,ia,c[ja>>2]|0);if((c[u>>2]|0)==(db|0)){break}if((Bd(ha)|0)<<24>>24==0){cc=0;break g}}if((c[ka>>2]|0)==0){cc=0;break}gb=c[ia>>2]|0;if((gb|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){cc=0;break}dc=c[ia>>2]|0}else{dc=gb}c[ia>>2]=dc+1;a[dc]=0;cc=c[ka>>2]|0}}while(0);c[(c[ga>>2]|0)+28>>2]=cc;if((c[(c[ga>>2]|0)+28>>2]|0)==0){Sa=1;Ra=486;break a}c[ka>>2]=c[ia>>2];if((c[Ba>>2]|0)!=0){c[N>>2]=H;db=c[ga>>2]|0;Ic[c[Ba>>2]&15](c[U>>2]|0,c[db>>2]|0,c[db+20>>2]|0,c[db+16>>2]|0,c[db+24>>2]|0,c[db+28>>2]|0);ab=L;break c}if((c[la>>2]|0)==0){Ra=476;break c}c[N>>2]=H;db=c[ga>>2]|0;Nc[c[la>>2]&1](c[U>>2]|0,c[db>>2]|0,0,0,0,c[db+20>>2]|0,c[db+16>>2]|0,c[db+24>>2]|0,c[db+28>>2]|0);ab=L;break};case 12:{if((a[fa]|0)==0){Ra=476;break c}db=L+64|0;gb=c[db>>2]|0;cb=H+gb|0;hb=(c[E>>2]|0)+(-gb|0)|0;gb=c[F>>2]|0;Wa=gb+104|0;if((c[Wa>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){ec=1}else{Ra=215}}else{Ra=215}h:do{if((Ra|0)==215){Ra=0;nb=L+16|0;bb=gb+116|0;Xa=L+56|0;pb=gb+112|0;eb=gb+120|0;fc=L+40|0;gc=cb;i:while(1){j:do{switch(Sc[c[nb>>2]&127](L,gc,hb,y)|0){case 28:{Ra=217;break i;break};case 9:case 6:{hc=c[y>>2]|0;c[x>>2]=gc;if((c[bb>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}}while(1){Bc[c[Xa>>2]&63](L,x,hc,bb,c[pb>>2]|0);if((c[x>>2]|0)==(hc|0)){break}if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}}if((c[eb>>2]|0)==0){ec=1;break h}break};case-3:{c[y>>2]=gc+(c[db>>2]|0);Ra=224;break};case 7:{Ra=224;break};case 10:{hc=Oc[c[fc>>2]&255](L,gc)|0;if((hc|0)<0){Ra=229;break i}ic=Re(hc,va)|0;if((ic|0)==0){Ra=233;break i}if((ic|0)>0){jc=0}else{break j}do{hc=c[bb>>2]|0;if((c[pb>>2]|0)==(hc|0)){if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}kc=c[bb>>2]|0}else{kc=hc}hc=a[z+jc|0]|0;c[bb>>2]=kc+1;a[kc]=hc;jc=jc+1|0;}while((jc|0)<(ic|0));break};case-1:{Ra=239;break i;break};case 0:{Ra=241;break i;break};case-4:{ec=0;break h;break};default:{Ra=243;break i}}}while(0);if((Ra|0)==224){Ra=0;ic=c[bb>>2]|0;if((c[pb>>2]|0)==(ic|0)){if((Bd(Wa)|0)<<24>>24==0){ec=1;break h}lc=c[bb>>2]|0}else{lc=ic}c[bb>>2]=lc+1;a[lc]=10}gc=c[y>>2]|0}if((Ra|0)==217){Ra=0;c[M>>2]=gc;ec=10;break}else if((Ra|0)==229){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=14;break}c[M>>2]=gc;ec=14;break}else if((Ra|0)==233){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=14;break}c[M>>2]=gc;ec=14;break}else if((Ra|0)==239){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=4;break}c[M>>2]=gc;ec=4;break}else if((Ra|0)==241){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=4;break}c[M>>2]=c[y>>2];ec=4;break}else if((Ra|0)==243){Ra=0;if((c[G>>2]|0)!=(L|0)){ec=23;break}c[M>>2]=gc;ec=23;break}}}while(0);Wa=c[ga>>2]|0;db=c[wa>>2]|0;do{if((Wa|0)==0){c[xa>>2]=db;mc=1}else{c[Wa+4>>2]=db;c[(c[ga>>2]|0)+8>>2]=(c[xa>>2]|0)-(c[wa>>2]|0);c[wa>>2]=c[xa>>2];if((c[la>>2]|0)==0){mc=1;break}c[N>>2]=H;hb=c[ga>>2]|0;Nc[c[la>>2]&1](c[U>>2]|0,c[hb>>2]|0,d[hb+33|0]|0,c[hb+4>>2]|0,c[hb+8>>2]|0,c[ya>>2]|0,0,0,0);mc=0}}while(0);if((ec|0)==0){Za=mc;Ra=475}else{Sa=ec;Ra=486;break a}break};default:{Ra=476}}}while(0);do{if((Ra|0)==53){Ra=0;if((Sc[c[L+52>>2]&127](L,H,c[E>>2]|0,M)|0)==0){Sa=32;Ra=486;break a}else{yb=1;Ra=54}}else if((Ra|0)==121){Ra=0;if((a[fa]|0)==0){Ra=476;break}Za=(c[oa>>2]|0)==0|0;Ra=475}else if((Ra|0)==435){Ra=0;if((a[Ka]|0)==0){Ra=476;break}I=c[E>>2]|0;if((Rb|0)==0){nc=I}else{nc=I+(-(c[L+64>>2]|0)|0)|0}I=Wd(b)|0;if((I|0)<0){Sa=1;Ra=486;break a}c[(c[Na>>2]|0)+(I*28|0)>>2]=4;c[(c[Na>>2]|0)+(I*28|0)+4>>2]=Rb;db=c[F>>2]|0;Wa=db+80|0;c[j>>2]=H;hb=db+92|0;if((c[hb>>2]|0)==0){if((Bd(Wa)|0)<<24>>24==0){Sa=1;Ra=486;break a}}cb=L+56|0;gb=db+88|0;while(1){Bc[c[cb>>2]&63](L,j,nc,hb,c[gb>>2]|0);if((c[j>>2]|0)==(nc|0)){break}if((Bd(Wa)|0)<<24>>24==0){Ua=1;Ra=488;break a}}cb=db+96|0;if((c[cb>>2]|0)==0){Sa=1;Ra=486;break a}bb=c[hb>>2]|0;if((bb|0)==(c[gb>>2]|0)){if((Bd(Wa)|0)<<24>>24==0){Sa=1;Ra=486;break a}oc=c[hb>>2]|0}else{oc=bb}c[hb>>2]=oc+1;a[oc]=0;bb=c[cb>>2]|0;if((bb|0)==0){Sa=1;Ra=486;break a}pb=Cd(b,db+20|0,bb,24)|0;if((pb|0)==0){Sa=1;Ra=486;break a}fc=pb|0;if((c[fc>>2]|0)==(bb|0)){c[cb>>2]=c[hb>>2];if((Pd(b,pb)|0)==0){Sa=1;Ra=486;break a}}else{c[hb>>2]=c[cb>>2]}cb=c[fc>>2]|0;c[(c[Na>>2]|0)+(I*28|0)+8>>2]=cb;fc=0;while(1){pc=fc+1|0;if((a[cb+fc|0]|0)==0){break}else{fc=pc}}c[Qa>>2]=(c[Qa>>2]|0)+pc;Za=(c[Oa>>2]|0)==0|0;Ra=475}else if((Ra|0)==459){Ra=0;if((a[Ka]|0)==0){Ra=476;break}fc=(c[Oa>>2]|0)==0;cb=fc&1;I=(c[La>>2]|0)-1|0;c[La>>2]=I;c[(c[Na>>2]|0)+((c[(c[Ma>>2]|0)+(I<<2)>>2]|0)*28|0)+4>>2]=Sb;if((c[La>>2]|0)!=0){Za=cb;Ra=475;break}if(!fc){fc=c[F>>2]|0;I=fc+156|0;hb=Ec[c[ta>>2]&63](((c[I>>2]|0)*20|0)+(c[fc+148>>2]|0)|0)|0;fc=hb;if((hb|0)==0){Sa=1;Ra=486;break a}c[p>>2]=fc+((c[I>>2]|0)*20|0);c[o>>2]=hb+20;Xd(b,0,fc,o,p);c[N>>2]=H;Tc[c[Oa>>2]&127](c[U>>2]|0,c[c[na>>2]>>2]|0,fc)}a[Ka]=0;c[Qa>>2]=0;Za=cb;Ra=475}}while(0);do{if((Ra|0)==54){Ra=0;if((a[fa]|0)==0){Za=yb;Ra=475;break}if((c[ga>>2]|0)==0){Za=yb;Ra=475;break}cb=c[L+64>>2]|0;fc=(c[E>>2]|0)+(-cb|0)|0;c[B>>2]=H+cb;if((c[ia>>2]|0)==0){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}}cb=L+56|0;while(1){Bc[c[cb>>2]&63](L,B,fc,ia,c[ja>>2]|0);if((c[B>>2]|0)==(fc|0)){break}if((Bd(ha)|0)<<24>>24==0){Ua=1;Ra=488;break a}}if((c[ka>>2]|0)==0){Sa=1;Ra=486;break a}fc=c[ia>>2]|0;if((fc|0)==(c[ja>>2]|0)){if((Bd(ha)|0)<<24>>24==0){Sa=1;Ra=486;break a}qc=c[ia>>2]|0}else{qc=fc}c[ia>>2]=qc+1;a[qc]=0;fc=c[ka>>2]|0;if((fc|0)==0){Sa=1;Ra=486;break a}cb=a[fc]|0;do{if(cb<<24>>24==0){rc=fc}else{hb=fc;I=fc;db=cb;while(1){Wa=db<<24>>24;do{if((Wa|0)==32|(Wa|0)==13|(Wa|0)==10){if((hb|0)==(fc|0)){sc=fc;break}if((a[hb-1|0]|0)==32){sc=hb;break}a[hb]=32;sc=hb+1|0}else{a[hb]=db;sc=hb+1|0}}while(0);Wa=I+1|0;gb=a[Wa]|0;if(gb<<24>>24==0){break}else{hb=sc;I=Wa;db=gb}}if((sc|0)==(fc|0)){rc=fc;break}db=sc-1|0;rc=(a[db]|0)==32?db:sc}}while(0);a[rc]=0;c[(c[ga>>2]|0)+24>>2]=fc;c[ka>>2]=c[ia>>2];Za=(c[la>>2]|0)==0?yb:0;Ra=475}}while(0);if((Ra|0)==475){Ra=0;if(Za<<24>>24==0){ab=L}else{Ra=476}}do{if((Ra|0)==476){Ra=0;cb=c[R>>2]|0;if((cb|0)==0){ab=L;break}db=c[E>>2]|0;c[m>>2]=H;if((a[L+68|0]|0)!=0){Tc[cb&127](c[U>>2]|0,H,db-H|0);ab=L;break}if((c[G>>2]|0)==(L|0)){tc=N;uc=M}else{cb=c[O>>2]|0;tc=cb+4|0;uc=cb|0}cb=L+56|0;while(1){c[n>>2]=c[S>>2];Bc[c[cb>>2]&63](L,m,db,n,c[T>>2]|0);c[tc>>2]=c[m>>2];I=c[S>>2]|0;Tc[c[R>>2]&127](c[U>>2]|0,I,(c[n>>2]|0)-I|0);c[uc>>2]=c[m>>2];if((c[m>>2]|0)==(db|0)){ab=L;break}}}}while(0);db=c[V>>2]|0;if((db|0)==3){Ra=484;break}else if((db|0)==2){Sa=35;Ra=486;break}db=c[E>>2]|0;L=ab;H=db;e=Sc[c[ab>>2]&127](ab,db,f,E)|0}if((Ra|0)==4){c[g>>2]=H;Ua=0;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==6){c[M>>2]=c[E>>2];Ua=4;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==21){c[aa>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==84){c[b+264>>2]=6;aa=Gd(b,0,c[G>>2]|0,H,f,g,(a[J]|0)==0|0)|0;if((aa|0)!=0){Ua=aa;vc=4;wc=0;i=h;return Ua|0}aa=c[b+348>>2]|0;if((aa|0)==0){Ua=0;vc=4;wc=0;i=h;return Ua|0}else{xc=aa}while(1){aa=(c[xc+24>>2]|0)+1|0;b=xc+36|0;J=c[b>>2]|0;f=J+aa|0;H=xc+4|0;G=c[H>>2]|0;if((G|0)==(f|0)){Ua=0;Ra=488;break}M=xc+8|0;ab=c[M>>2]|0;e=ab+aa|0;L=xc+40|0;if((e|0)>((c[L>>2]|0)-J|0)){V=Oc[c[ua>>2]&255](J,e)|0;if((V|0)==0){Ua=1;Ra=488;break}J=xc+12|0;m=c[b>>2]|0;if((c[J>>2]|0)==(m|0)){c[J>>2]=V}J=xc+16|0;uc=c[J>>2]|0;if((uc|0)!=0){c[J>>2]=V+(uc-m)}c[b>>2]=V;c[L>>2]=V+e;yc=V+aa|0;zc=c[H>>2]|0;Ac=c[M>>2]|0}else{yc=f;zc=G;Ac=ab}tF(yc|0,zc|0,Ac)|0;c[H>>2]=yc;H=c[xc>>2]|0;if((H|0)==0){Ua=0;Ra=488;break}else{xc=H}}if((Ra|0)==488){vc=4;wc=0;i=h;return Ua|0}}else if((Ra|0)==109){c[na>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==261){c[X>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==333){c[Fa>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==384){if((Ta|0)==12){Ua=17;vc=4;wc=0;i=h;return Ua|0}else if((Ta|0)==28){Ua=10;vc=4;wc=0;i=h;return Ua|0}else{Ua=2;vc=4;wc=0;i=h;return Ua|0}}else if((Ra|0)==423){c[na>>2]=0;Ua=1;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==484){c[g>>2]=c[E>>2];Ua=0;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==486){Ua=Sa;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==487){Ua=6;vc=4;wc=0;i=h;return Ua|0}else if((Ra|0)==488){vc=4;wc=0;i=h;return Ua|0}return 0}function Wd(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=c[a+340>>2]|0;d=b+164|0;do{if((c[d>>2]|0)==0){e=Ec[c[a+12>>2]&63](c[a+452>>2]<<2)|0;f=e;c[d>>2]=f;if((e|0)==0){g=-1;return g|0}else{c[f>>2]=0;break}}}while(0);f=b+156|0;e=c[f>>2]|0;h=b+152|0;i=c[h>>2]|0;j=b+144|0;k=c[j>>2]|0;if(e>>>0<i>>>0){l=e;m=k}else{do{if((k|0)==0){e=Ec[c[a+12>>2]&63](896)|0;if((e|0)==0){g=-1}else{n=e;o=32;break}return g|0}else{e=Oc[c[a+16>>2]&255](k,i*56|0)|0;if((e|0)==0){g=-1;return g|0}else{n=e;o=c[h>>2]<<1;break}}}while(0);i=n;c[h>>2]=o;c[j>>2]=i;l=c[f>>2]|0;m=i}c[f>>2]=l+1;f=c[b+160>>2]|0;if((f|0)!=0){b=c[(c[d>>2]|0)+(f-1<<2)>>2]|0;f=m+(b*28|0)+16|0;d=c[f>>2]|0;if((d|0)!=0){c[m+(d*28|0)+24>>2]=l}d=m+(b*28|0)+20|0;i=c[d>>2]|0;if((i|0)==0){c[m+(b*28|0)+12>>2]=l}c[f>>2]=l;c[d>>2]=i+1}vF(m+(l*28|0)+12|0,0,16)|0;g=l;return g|0}function Xd(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;h=(c[b+340>>2]|0)+144|0;i=c[(c[h>>2]|0)+(d*28|0)>>2]|0;c[e>>2]=i;c[e+4>>2]=c[(c[h>>2]|0)+(d*28|0)+4>>2];if((i|0)==4){c[e+8>>2]=c[g>>2];i=c[(c[h>>2]|0)+(d*28|0)+8>>2]|0;while(1){j=a[i]|0;k=c[g>>2]|0;c[g>>2]=k+1;a[k]=j;if((a[i]|0)==0){break}else{i=i+1|0}}c[e+12>>2]=0;c[e+16>>2]=0;return}i=c[(c[h>>2]|0)+(d*28|0)+20>>2]|0;j=e+12|0;c[j>>2]=i;k=e+16|0;c[k>>2]=c[f>>2];c[f>>2]=(c[f>>2]|0)+(i*20|0);if((c[j>>2]|0)!=0){i=0;l=(c[h>>2]|0)+(d*28|0)+12|0;while(1){d=c[l>>2]|0;Xd(b,d,(c[k>>2]|0)+(i*20|0)|0,f,g);m=i+1|0;if(m>>>0<(c[j>>2]|0)>>>0){i=m;l=(c[h>>2]|0)+(d*28|0)+24|0}else{break}}}c[e+8>>2]=0;return}function Yd(a){a=a|0;c[a>>2]=60;return}function Zd(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do{switch(b|0){case 29:{c[a>>2]=90;g=2;break};case 11:{c[a>>2]=62;g=55;break};case 13:{c[a>>2]=62;g=56;break};case 15:{c[a>>2]=62;g=0;break};case 16:{if((Sc[c[f+24>>2]&127](f,d+(c[f+64>>2]<<1)|0,e,173064)|0)==0){h=9;break a}c[a>>2]=16;g=3;break};case 14:{g=0;break};case 12:{c[a>>2]=62;g=1;break};default:{h=9}}}while(0);if((h|0)==9){c[a>>2]=90;g=-1}return g|0}function _d(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do{switch(b|0){case 29:{c[a>>2]=90;g=2;break};case 13:{g=56;break};case 16:{if((Sc[c[f+24>>2]&127](f,d+(c[f+64>>2]<<1)|0,e,173064)|0)==0){h=7;break a}c[a>>2]=16;g=3;break};case 15:case 14:{g=0;break};case 11:{g=55;break};default:{h=7}}}while(0);if((h|0)==7){c[a>>2]=90;g=-1}return g|0}function $d(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=96;g=4}else if((b|0)==15){g=3}else{c[a>>2]=90;g=-1}return g|0}function ae(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return 0}function be(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==15){g=3;return g|0}else if((b|0)==17){c[a>>2]=2;g=8;return g|0}else if((b|0)==25){c[a>>2]=88;g=7;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=100;g=3;return g|0}if((Sc[c[h>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=98;g=3;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function ce(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;a:do{switch(b|0){case 11:{g=55;return g|0};case 26:{c[a>>2]=94;g=3;return g|0};case 13:{g=56;return g|0};case 15:case-4:{g=0;return g|0};case 28:{g=57;return g|0};case 16:{h=f+24|0;i=f+64|0;if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,173024)|0)!=0){c[a>>2]=32;g=11;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,173080)|0)!=0){c[a>>2]=78;g=33;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,173056)|0)!=0){c[a>>2]=20;g=39;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]<<1)|0,e,172920)|0)==0){break a}c[a>>2]=8;g=17;return g|0};default:{}}}while(0);c[a>>2]=90;g=-1;return g|0}function de(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==11){g=55}else if((b|0)==15){g=0}else if((b|0)==29){c[a>>2]=90;g=2}else if((b|0)==13){g=56}else{c[a>>2]=90;g=-1}return g|0}function ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=84;g=5}else if((b|0)==15){g=3}else{c[a>>2]=90;g=-1}return g|0}function fe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=3}else if((b|0)==27){c[a>>2]=100;g=6}else{c[a>>2]=90;g=-1}return g|0}function ge(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==17){c[a>>2]=2;g=8}else if((b|0)==15){g=3}else if((b|0)==25){c[a>>2]=88;g=7}else{c[a>>2]=90;g=-1}return g|0}function he(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==22){c[a>>2]=34;g=11}else if((b|0)==18){c[a>>2]=28;g=9}else{c[a>>2]=90;g=-1}return g|0}function ie(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=76;g=34}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function je(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=39}else if((b|0)==18|(b|0)==41){c[a>>2]=54;g=40}else{c[a>>2]=90;g=-1}return g|0}function ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18){c[a>>2]=6;g=18}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=3}else if((b|0)==17){c[a>>2]=2;g=8}else{c[a>>2]=90;g=-1}return g|0}function me(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;if((b|0)==18){g=2}else if((b|0)==15){h=17;return h|0}do{if((g|0)==2){b=f+24|0;if((Sc[c[b>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=10;h=17;return h|0}if((Sc[c[b>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=12;h=17;return h|0}}while(0);c[a>>2]=90;h=-1;return h|0}function ne(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=44;c[a+8>>2]=17;g=19}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function oe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=14;g=21}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function pe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=44;c[a+8>>2]=17;g=19}else if((b|0)==17){c[a>>2]=88;g=20}else if((b|0)==15){g=17}else{c[a>>2]=90;g=-1}return g|0}function qe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==17){c[a>>2]=88;g=c[a+8>>2]|0;return g|0}else if((b|0)==15){g=c[a+8>>2]|0;return g|0}else{c[a>>2]=90;g=-1;return g|0}return 0}function re(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==23){c[a>>2]=52;c[a+4>>2]=1;g=44;return g|0}else if((b|0)==15){g=39;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,173048)|0)!=0){c[a>>2]=44;c[a+8>>2]=39;g=42;return g|0}if((Sc[c[h>>2]&127](f,d,e,173088)|0)==0){break}c[a>>2]=44;c[a+8>>2]=39;g=41;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function se(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;a:do{switch(b|0){case 15:{g=39;break};case 30:{c[a>>2]=46;g=53;break};case 20:{if((Sc[c[f+24>>2]&127](f,d+(c[f+64>>2]|0)|0,e,172912)|0)==0){h=9;break a}c[a>>2]=58;g=43;break};case 23:{c[a+4>>2]=2;c[a>>2]=56;g=44;break};case 31:{c[a>>2]=46;g=52;break};case 18:case 41:{c[a>>2]=46;g=51;break};case 32:{c[a>>2]=46;g=54;break};default:{h=9}}}while(0);if((h|0)==9){c[a>>2]=90;g=-1}return g|0}function te(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==36){c[a>>2]=44;c[a+8>>2]=39;g=46}else if((b|0)==15){g=39}else if((b|0)==24){c[a>>2]=44;c[a+8>>2]=39;g=45}else if((b|0)==21){c[a>>2]=48;g=39}else{c[a>>2]=90;g=-1}return g|0}function ue(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;switch(b|0){case 31:{c[a>>2]=46;g=52;break};case 18:case 41:{c[a>>2]=46;g=51;break};case 32:{c[a>>2]=46;g=54;break};case 23:{b=a+4|0;c[b>>2]=(c[b>>2]|0)+1;g=44;break};case 30:{c[a>>2]=46;g=53;break};case 15:{g=39;break};default:{c[a>>2]=90;g=-1}}return g|0}function ve(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;a:do{switch(b|0){case 36:{f=a+4|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){g=46;break a}c[a>>2]=44;c[a+8>>2]=39;g=46;break};case 35:{e=a+4|0;f=(c[e>>2]|0)-1|0;c[e>>2]=f;if((f|0)!=0){g=47;break a}c[a>>2]=44;c[a+8>>2]=39;g=47;break};case 37:{f=a+4|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){g=48;break a}c[a>>2]=44;c[a+8>>2]=39;g=48;break};case 21:{c[a>>2]=56;g=49;break};case 15:{g=39;break};case 38:{c[a>>2]=56;g=50;break};case 24:{e=a+4|0;f=(c[e>>2]|0)-1|0;c[e>>2]=f;if((f|0)!=0){g=45;break a}c[a>>2]=44;c[a+8>>2]=39;g=45;break};default:{c[a>>2]=90;g=-1}}}while(0);return g|0}function we(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=50;g=51}else if((b|0)==15){g=39}else{c[a>>2]=90;g=-1}return g|0}function xe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=39}else if((b|0)==36){c[a>>2]=44;c[a+8>>2]=39;g=46}else if((b|0)==21){c[a>>2]=48;g=39}else{c[a>>2]=90;g=-1}return g|0}function ye(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18|(b|0)==41){c[a>>2]=82;g=22}else if((b|0)==15){g=33}else if((b|0)==17){c[a>>2]=88;g=33}else{c[a>>2]=90;g=-1}return g|0}function ze(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;do{if((b|0)==15){g=33;return g|0}else if((b|0)==18){h=f+24|0;i=0;j=c[h>>2]|0;while(1){k=i+1|0;if((Sc[j&127](f,d,e,c[71960+(i<<2)>>2]|0)|0)!=0){l=5;break}m=c[h>>2]|0;if((k|0)<8){i=k;j=m}else{break}}if((l|0)==5){c[a>>2]=66;g=i+23|0;return g|0}if((Sc[m&127](f,d,e,172920)|0)==0){break}c[a>>2]=68;g=33;return g|0}else if((b|0)==23){c[a>>2]=80;g=33;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Ae(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;do{if((b|0)==15){g=33;return g|0}else if((b|0)==20){h=f+24|0;i=f+64|0;if((Sc[c[h>>2]&127](f,d+(c[i>>2]|0)|0,e,172984)|0)!=0){c[a>>2]=76;g=35;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]|0)|0,e,172888)|0)!=0){c[a>>2]=76;g=36;return g|0}if((Sc[c[h>>2]&127](f,d+(c[i>>2]|0)|0,e,173016)|0)==0){break}c[a>>2]=64;g=33;return g|0}else if((b|0)==27){c[a>>2]=76;g=37;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Be(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==23){c[a>>2]=74;g=33}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function Ce(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=33}else if((b|0)==19|(b|0)==18|(b|0)==41){c[a>>2]=70;g=31}else{c[a>>2]=90;g=-1}return g|0}function De(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==24){c[a>>2]=66;g=33}else if((b|0)==21){c[a>>2]=80;g=33}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function Ee(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18){c[a>>2]=72;g=32}else if((b|0)==15){g=33}else{c[a>>2]=90;g=-1}return g|0}function Fe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==24){c[a>>2]=66;g=33}else if((b|0)==15){g=33}else if((b|0)==21){c[a>>2]=74;g=33}else{c[a>>2]=90;g=-1}return g|0}function Ge(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=33}else if((b|0)==27){c[a>>2]=76;g=38}else{c[a>>2]=90;g=-1}return g|0}function He(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==18){c[a>>2]=18;g=10}else{c[a>>2]=90;g=-1}return g|0}function Ie(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==15){g=11;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=38;g=11;return g|0}if((Sc[c[h>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=30;g=11;return g|0}else if((b|0)==27){c[a>>2]=44;c[a+8>>2]=11;g=12;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Je(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==27){c[a>>2]=40;g=13}else{c[a>>2]=90;g=-1}return g|0}function Ke(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=38;g=14}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Le(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;do{if((b|0)==17){c[a>>2]=88;g=15;return g|0}else if((b|0)==18){if((Sc[c[f+24>>2]&127](f,d,e,172960)|0)==0){break}c[a>>2]=36;g=11;return g|0}else if((b|0)==15){g=11;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Me(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==18){c[a>>2]=44;c[a+8>>2]=11;g=16}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Ne(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;do{if((b|0)==27){c[a>>2]=44;c[a+8>>2]=11;g=12;return g|0}else if((b|0)==15){g=11;return g|0}else if((b|0)==18){h=f+24|0;if((Sc[c[h>>2]&127](f,d,e,172880)|0)!=0){c[a>>2]=26;g=11;return g|0}if((Sc[c[h>>2]&127](f,d,e,172904)|0)==0){break}c[a>>2]=24;g=11;return g|0}}while(0);c[a>>2]=90;g=-1;return g|0}function Oe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==27){c[a>>2]=42;g=13}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Pe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==15){g=11}else if((b|0)==27){c[a>>2]=26;g=14}else{c[a>>2]=90;g=-1}return g|0}function Qe(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((b|0)==17){c[a>>2]=88;g=15}else if((b|0)==15){g=11}else{c[a>>2]=90;g=-1}return g|0}function Re(b,c){b=b|0;c=c|0;var d=0;if((b|0)<0){d=0;return d|0}if((b|0)<128){a[c]=b;d=1;return d|0}if((b|0)<2048){a[c]=b>>>6|192;a[c+1|0]=b&63|128;d=2;return d|0}if((b|0)<65536){a[c]=b>>>12|224;a[c+1|0]=b>>>6&63|128;a[c+2|0]=b&63|128;d=3;return d|0}if((b|0)>=1114112){d=0;return d|0}a[c]=b>>>18|240;a[c+1|0]=b>>>12&63|128;a[c+2|0]=b>>>6&63|128;a[c+3|0]=b&63|128;d=4;return d|0}function Se(){return 1908}function Te(e,f,g,h){e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;i=0;while(1){a[e+i|0]=a[20424+i|0]|0;j=i+1|0;if((j|0)<364){i=j}else{k=0;break}}do{i=a[20496+k|0]|0;if(!((i<<24>>24|0)==28|(i<<24>>24|0)==0)){if((c[f+(k<<2)>>2]|0)!=(k|0)){l=0;m=37;break}}k=k+1|0;}while((k|0)<128);if((m|0)==37){return l|0}k=e+372|0;i=e+884|0;j=0;a:while(1){n=c[f+(j<<2)>>2]|0;do{if((n|0)==-1){a[e+(j+72)|0]=1;b[k+(j<<1)>>1]=-1;a[i+(j<<2)|0]=1;a[i+(j<<2)+1|0]=0}else{if((n|0)<0){if((n|0)<-4){l=0;m=37;break a}a[e+(j+72)|0]=3-n;a[i+(j<<2)|0]=0;b[k+(j<<1)>>1]=0;break}if((n|0)<128){o=a[20496+n|0]|0;if(!((o<<24>>24|0)==28|(o<<24>>24|0)==0)){if((n|0)!=(j|0)){l=0;m=37;break a}}a[e+(j+72)|0]=o;a[i+(j<<2)|0]=1;a[i+(j<<2)+1|0]=n;b[k+(j<<1)>>1]=(n|0)==0?-1:n&65535;break}o=n>>8;switch(o|0){case 0:{if((a[20496+n|0]|0)==0){m=19}break};case 255:{if((n&-2|0)==65534){m=19}break};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{m=19;break};default:{}}if((m|0)==19){m=0;a[e+(j+72)|0]=0;b[k+(j<<1)>>1]=-1;a[i+(j<<2)|0]=1;a[i+(j<<2)+1|0]=0;break}if((n|0)>65535){l=0;m=37;break a}p=n>>>5&7;q=1<<(n&31);do{if((c[18232+((d[17968+o|0]<<3|p)<<2)>>2]&q|0)==0){r=e+(j+72)|0;if((c[18232+((d[19512+o|0]<<3|p)<<2)>>2]&q|0)==0){a[r]=28;break}else{a[r]=26;break}}else{a[e+(j+72)|0]=22}}while(0);q=i+(j<<2)|0;p=i+(j<<2)+1|0;do{if((n|0)<2048){a[p]=n>>>6|192;a[i+(j<<2)+2|0]=n&63|128;s=2}else{if((n|0)<65536){a[p]=n>>>12|224;a[i+(j<<2)+2|0]=n>>>6&63|128;a[i+(j<<2)+3|0]=n&63|128;s=3;break}if((n|0)>=1114112){s=0;break}a[p]=n>>>18|240;a[i+(j<<2)+2|0]=n>>>12&63|128;a[i+(j<<2)+3|0]=n>>>6&63|128;a[i+(j<<2)+4|0]=n&63|128;s=4}}while(0);a[q]=s;b[k+(j<<1)>>1]=n}}while(0);n=j+1|0;if((n|0)<256){j=n}else{m=34;break}}if((m|0)==34){c[e+368>>2]=h;c[e+364>>2]=g;if((g|0)!=0){c[e+328>>2]=20;c[e+332>>2]=20;c[e+336>>2]=20;c[e+340>>2]=170;c[e+344>>2]=170;c[e+348>>2]=170;c[e+352>>2]=176;c[e+356>>2]=176;c[e+360>>2]=176}c[e+56>>2]=16;c[e+60>>2]=18;l=e;return l|0}else if((m|0)==37){return l|0}return 0}function Ue(a,b){a=a|0;b=b|0;var e=0,f=0;e=Oc[c[a+364>>2]&255](c[a+368>>2]|0,b)|0;if(e>>>0>65535>>>0){f=0;return f|0}f=c[18232+(((d[19512+(e>>8)|0]|0)<<3|e>>>5&7)<<2)>>2]&1<<(e&31);return f|0}function Ve(a,b){a=a|0;b=b|0;var e=0,f=0;e=Oc[c[a+364>>2]&255](c[a+368>>2]|0,b)|0;if(e>>>0>65535>>>0){f=0;return f|0}f=c[18232+(((d[17968+(e>>8)|0]|0)<<3|e>>>5&7)<<2)>>2]&1<<(e&31);return f|0}function We(b,d){b=b|0;d=d|0;var e=0,f=0;e=Oc[c[b+364>>2]&255](c[b+368>>2]|0,d)|0;if(e>>>0>65535>>>0){f=1;return f|0}a:do{switch(e>>8|0){case 255:{if((e&-2|0)==65534){f=1}else{break a}return f|0};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{f=1;return f|0};case 0:{if((a[20496+e|0]|0)==0){f=1}else{break a}return f|0};default:{}}}while(0);f=e>>>31;return f|0}function Xe(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;j=i;i=i+8|0;k=j|0;l=c[e>>2]|0;if((l|0)==(f|0)){i=j;return}m=b+884|0;n=b+364|0;o=b+368|0;p=k|0;q=h;h=b+72|0;b=k+1|0;r=k+2|0;s=k+3|0;k=l;while(1){l=d[k]|0;t=m+(l<<2)+1|0;u=a[m+(l<<2)|0]|0;l=u<<24>>24;if(u<<24>>24==0){u=Oc[c[n>>2]&255](c[o>>2]|0,k)|0;do{if((u|0)<0){v=0}else{if((u|0)<128){a[p]=u;v=1;break}if((u|0)<2048){a[p]=u>>>6|192;a[b]=u&63|128;v=2;break}if((u|0)<65536){a[p]=u>>>12|224;a[b]=u>>>6&63|128;a[r]=u&63|128;v=3;break}if((u|0)>=1114112){v=0;break}a[p]=u>>>18|240;a[b]=u>>>12&63|128;a[r]=u>>>6&63|128;a[s]=u&63|128;v=4}}while(0);if((v|0)>(q-(c[g>>2]|0)|0)){w=20;break}u=c[e>>2]|0;x=p;y=v;z=u+((d[h+(d[u]|0)|0]|0)-3)|0}else{if((l|0)>(q-(c[g>>2]|0)|0)){w=20;break}x=t;y=l;z=k+1|0}c[e>>2]=z;u=x;A=y;while(1){B=a[u]|0;C=c[g>>2]|0;c[g>>2]=C+1;a[C]=B;B=A-1|0;if((B|0)==0){break}else{u=u+1|0;A=B}}A=c[e>>2]|0;if((A|0)==(f|0)){w=20;break}else{k=A}}if((w|0)==20){i=j;return}}function Ye(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;i=c[e>>2]|0;if((i|0)==(f|0)){return}j=a+372|0;k=a+364|0;l=a+368|0;m=a+72|0;a=i;while(1){if((c[g>>2]|0)==(h|0)){n=8;break}i=b[j+((d[a]|0)<<1)>>1]|0;if(i<<16>>16==0){o=(Oc[c[k>>2]&255](c[l>>2]|0,a)|0)&65535;p=c[e>>2]|0;q=o;r=p+((d[m+(d[p]|0)|0]|0)-3)|0}else{q=i;r=a+1|0}c[e>>2]=r;i=c[g>>2]|0;c[g>>2]=i+2;b[i>>1]=q;i=c[e>>2]|0;if((i|0)==(f|0)){n=8;break}else{a=i}}if((n|0)==8){return}}function Ze(){return 21056}function _e(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;do{if((e|0)==0){f=6}else{g=0;a:while(1){h=c[25544+(g<<2)>>2]|0;i=e;while(1){j=a[i]|0;k=a[h]|0;l=(j-97&255)>>>0<26>>>0?j-32&255:j;if(l<<24>>24!=((k-97&255)>>>0<26>>>0?k-32&255:k)<<24>>24){break}if(l<<24>>24==0){break a}else{h=h+1|0;i=i+1|0}}i=g+1|0;if((i|0)<6){g=i}else{m=0;n=8;break}}if((n|0)==8){return m|0}if((g|0)==-1){m=0}else{f=g&255;break}return m|0}}while(0);a[b+69|0]=f;c[b>>2]=46;c[b+4>>2]=64;c[b+48>>2]=14;c[b+72>>2]=d;c[d>>2]=b;m=1;return m|0}function $e(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return wg(a,0,b,c,d)|0}function af(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return wg(a,1,b,c,d)|0}function bf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;if(e>>>0>=f>>>0){return}b=g+4|0;h=g|0;g=e;while(1){switch(d[672+(d[g]|0)|0]|0){case 7:{i=g+4|0;break};case 10:{c[b>>2]=-1;c[h>>2]=(c[h>>2]|0)+1;i=g+1|0;break};case 6:{i=g+3|0;break};case 9:{c[h>>2]=(c[h>>2]|0)+1;e=g+1|0;if((e|0)==(f|0)){j=f}else{j=(a[672+(d[e]|0)|0]|0)==10?g+2|0:e}c[b>>2]=-1;i=j;break};case 5:{i=g+2|0;break};default:{i=g+1|0}}c[b>>2]=(c[b>>2]|0)+1;if(i>>>0<f>>>0){g=i}else{break}}return}function cf(b,d,e,f,g,h,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;n=i;i=i+216|0;o=n|0;p=n+8|0;q=n+16|0;r=n+24|0;s=n+152|0;t=n+160|0;u=n+168|0;v=n+176|0;w=n+184|0;x=n+192|0;y=n+200|0;z=n+208|0;c[x>>2]=0;c[y>>2]=0;c[z>>2]=0;A=d+64|0;B=c[A>>2]|0;C=e+(B*5|0)|0;c[w>>2]=C;e=f+(-(B<<1)|0)|0;B=(vg(d,C,e,y,z,x,w)|0)!=0;C=c[y>>2]|0;a:do{if(B&(C|0)!=0){f=d+24|0;D=c[z>>2]|0;do{if((Sc[c[f>>2]&127](d,C,D,172768)|0)==0){if((b|0)!=0){E=C;F=D;break}c[g>>2]=C;G=0;break a}else{if((h|0)!=0){c[h>>2]=c[x>>2]}H=c[w>>2]|0;if((j|0)!=0){c[j>>2]=H}if((vg(d,H,e,y,z,x,w)|0)==0){c[g>>2]=c[w>>2];G=0;break a}H=c[y>>2]|0;if((H|0)!=0){E=H;F=c[z>>2]|0;break}if((b|0)==0){G=1;break a}c[g>>2]=c[w>>2];G=0;break a}}while(0);if((Sc[c[f>>2]&127](d,E,F,172800)|0)==0){I=E;J=F}else{D=c[x>>2]|0;H=u|0;c[t>>2]=D;c[v>>2]=H;K=d+56|0;Bc[c[K>>2]&63](d,t,e,v,u+1|0);if((c[v>>2]|0)==(H|0)){L=-1}else{L=a[H]|0}if(!((L-97|0)>>>0<26>>>0|(L-65|0)>>>0<26>>>0)){c[g>>2]=D;G=0;break}if((k|0)!=0){c[k>>2]=D}H=c[w>>2]|0;if((l|0)!=0){M=H+(-(c[A>>2]|0)|0)|0;N=r|0;c[q>>2]=D;c[s>>2]=N;Bc[c[K>>2]&63](d,q,M,s,r+127|0);b:do{if((c[q>>2]|0)==(M|0)){a[c[s>>2]|0]=0;K=172856;D=N;while(1){O=a[D]|0;P=a[K]|0;Q=(O-97&255)>>>0<26>>>0?O-32&255:O;if(Q<<24>>24!=((P-97&255)>>>0<26>>>0?P-32&255:P)<<24>>24){R=0;break}if(Q<<24>>24==0){S=28;break}else{K=K+1|0;D=D+1|0}}if((S|0)==28){if((c[A>>2]|0)==2){T=d;break}else{R=0}}c:while(1){D=c[25544+(R<<2)>>2]|0;K=N;while(1){Q=a[K]|0;P=a[D]|0;O=(Q-97&255)>>>0<26>>>0?Q-32&255:Q;if(O<<24>>24!=((P-97&255)>>>0<26>>>0?P-32&255:P)<<24>>24){break}if(O<<24>>24==0){break c}else{D=D+1|0;K=K+1|0}}K=R+1|0;if((K|0)<6){R=K}else{T=0;break b}}if((R|0)==-1){T=0;break}T=c[28632+(R<<2)>>2]|0}else{T=0}}while(0);c[l>>2]=T}if((vg(d,H,e,y,z,x,w)|0)==0){c[g>>2]=c[w>>2];G=0;break}N=c[y>>2]|0;if((N|0)==0){G=1;break}I=N;J=c[z>>2]|0}if(!((Sc[c[f>>2]&127](d,I,J,172776)|0)!=0&(b|0)==0)){c[g>>2]=I;G=0;break}N=c[x>>2]|0;M=c[w>>2]|0;do{if((Sc[c[f>>2]&127](d,N,M+(-(c[A>>2]|0)|0)|0,172760)|0)==0){if((Sc[c[f>>2]&127](d,N,M+(-(c[A>>2]|0)|0)|0,172792)|0)==0){c[g>>2]=N;G=0;break a}if((m|0)==0){break}c[m>>2]=0}else{if((m|0)==0){break}c[m>>2]=1}}while(0);N=u|0;c[o>>2]=M;c[p>>2]=N;f=d+56|0;H=u+1|0;Bc[c[f>>2]&63](d,o,e,p,H);d:do{if((c[p>>2]|0)==(N|0)){U=M}else{K=M;while(1){D=a[N]|0;if(!((D|0)==32|(D|0)==13|(D|0)==10|(D|0)==9)){U=K;break d}D=K+(c[A>>2]|0)|0;c[w>>2]=D;c[o>>2]=D;c[p>>2]=N;Bc[c[f>>2]&63](d,o,e,p,H);if((c[p>>2]|0)==(N|0)){U=D;break}else{K=D}}}}while(0);if((U|0)==(e|0)){G=1;break}c[g>>2]=U;G=0}else{c[g>>2]=c[w>>2];G=0}}while(0);i=n;return G|0}function df(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e+1|0]|0;f=a[e]|0;a:do{if(j<<24>>24==0){l=f&255;m=b+72|0;b:do{switch(d[m+l|0]|0){case 20:{c[g>>2]=e+2;h=25;return h|0};case 4:{n=e+2|0;if((n|0)==(k|0)){h=-26;return h|0}do{if((a[e+3|0]|0)==0){if((a[n]|0)!=93){break}o=e+4|0;if((o|0)==(k|0)){h=-1;return h|0}if((a[e+5|0]|0)!=0){break}if((a[o]|0)!=62){break}c[g>>2]=e+6;h=34;return h|0}}while(0);c[g>>2]=n;h=26;return h|0};case 35:{c[g>>2]=e+2;h=38;return h|0};case 2:{o=e+2|0;if((o|0)==(k|0)){h=-1;return h|0}p=a[e+3|0]|0;q=a[o]|0;c:do{if(p<<24>>24==0){switch(d[m+(q&255)|0]|0){case 15:{h=xf(b,e+4|0,k,g)|0;return h|0};case 22:case 24:case 29:case 5:case 6:case 7:{r=73;break c;break};case 16:{break};default:{r=74;break c}}s=e+4|0;if((s|0)==(k|0)){h=-1;return h|0}do{if((a[e+5|0]|0)==0){t=d[m+(d[s]|0)|0]|0;if((t|0)==22|(t|0)==24){u=e+6|0;if((u|0)==(k|0)){h=-1;return h|0}else{v=s;w=u}d:while(1){if((a[v+3|0]|0)!=0){r=71;break}switch(d[m+(d[w]|0)|0]|0){case 21:case 9:case 10:{break d;break};case 30:{r=66;break d;break};case 22:case 24:{break};default:{r=71;break d}}u=w+2|0;if((u|0)==(k|0)){h=-1;r=175;break}else{v=w;w=u}}do{if((r|0)==66){u=v+4|0;if((u|0)==(k|0)){h=-1;return h|0}if((a[v+5|0]|0)!=0){break}x=d[m+(d[u]|0)|0]|0;if(!((x|0)==21|(x|0)==9|(x|0)==10|(x|0)==30)){break}c[g>>2]=w;h=0;return h|0}else if((r|0)==71){c[g>>2]=w;h=0;return h|0}else if((r|0)==175){return h|0}}while(0);c[g>>2]=w;h=16;return h|0}else if((t|0)==27){h=wf(b,e+6|0,k,g)|0;return h|0}else if((t|0)==20){c[g>>2]=e+6;h=33;return h|0}else{break}}}while(0);c[g>>2]=s;h=0;return h|0}else{switch(p&255|0){case 255:{break};case 223:case 222:case 221:case 220:{r=74;break c;break};default:{r=73;break c}}if(((q&255)-254|0)>>>0<2>>>0){r=74}else{r=73}}}while(0);if((r|0)==73){c[g>>2]=e;h=29;return h|0}else if((r|0)==74){c[g>>2]=o;h=0;return h|0}break};case 31:{c[g>>2]=e+2;h=23;return h|0};case 32:{q=e+2|0;if((q|0)==(k|0)){h=-24;return h|0}e:do{if((a[e+3|0]|0)==0){switch(d[m+(d[q]|0)|0]|0){case 15:{c[g>>2]=e+4;h=35;return h|0};case 34:{c[g>>2]=e+4;h=37;return h|0};case 33:{c[g>>2]=e+4;h=36;return h|0};case 9:case 10:case 21:case 11:case 35:case 36:case 32:{c[g>>2]=q;h=24;return h|0};default:{break e}}}}while(0);c[g>>2]=q;h=0;return h|0};case 9:{if((e+2|0)!=(k|0)){break b}c[g>>2]=k;h=-15;return h|0};case 30:{h=vf(b,e+2|0,k,g)|0;return h|0};case 5:{if((k-i|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 25:case 26:case 27:{y=19;break a;break};case 29:{z=0;A=l;r=144;break a;break};case 11:{c[g>>2]=e+2;h=17;return h|0};case 19:{o=e+2|0;if((o|0)==(k|0)){h=-1;return h|0}p=a[e+3|0]|0;n=a[o]|0;f:do{if(p<<24>>24==0){x=n&255;switch(d[m+x|0]|0){case 7:{r=118;break f;break};case 22:case 24:{break f;break};case 29:{B=0;C=x;r=112;break f;break};case 5:{if((k-o|0)<2){h=-2;return h|0}c[g>>2]=o;h=0;return h|0};case 6:{if((k-o|0)<3){h=-2;return h|0}c[g>>2]=o;h=0;return h|0};default:{r=120;break f}}}else{x=p&255;switch(x|0){case 255:{u=n&255;if((u-254|0)>>>0<2>>>0){r=120;break f}else{B=255;C=u;r=112;break f}break};case 216:case 217:case 218:case 219:{r=118;break f;break};case 220:case 221:case 222:case 223:{r=120;break f;break};default:{B=x;C=n&255;r=112;break f}}}}while(0);do{if((r|0)==112){if((c[18232+((d[17968+B|0]<<3|C>>>5)<<2)>>2]&1<<(C&31)|0)!=0){break}c[g>>2]=o;h=0;return h|0}else if((r|0)==118){if((k-o|0)<4){h=-2;return h|0}c[g>>2]=o;h=0;return h|0}else if((r|0)==120){c[g>>2]=o;h=0;return h|0}}while(0);n=e+4|0;if((n|0)==(k|0)){h=-20;return h|0}else{D=o;E=n}g:while(1){n=a[D+3|0]|0;p=a[E]|0;h:do{if(n<<24>>24==0){q=p&255;switch(d[m+q|0]|0){case 29:{F=0;G=q;r=126;break};case 22:case 24:case 25:case 26:case 27:{break};case 6:{r=131;break g;break};case 7:{r=133;break g;break};case 9:case 10:case 21:case 32:case 11:case 30:case 36:{r=135;break g;break};case 5:{r=129;break g;break};default:{r=136;break g}}}else{q=n&255;switch(q|0){case 216:case 217:case 218:case 219:{r=133;break g;break};case 255:{x=p&255;if((x-254|0)>>>0<2>>>0){r=136;break g}else{F=255;G=x;r=126;break h}break};case 220:case 221:case 222:case 223:{r=136;break g;break};default:{F=q;G=p&255;r=126;break h}}}}while(0);if((r|0)==126){r=0;if((c[18232+((d[19512+F|0]<<3|G>>>5)<<2)>>2]&1<<(G&31)|0)==0){r=128;break}}p=E+2|0;if((p|0)==(k|0)){h=-20;r=175;break}else{D=E;E=p}}if((r|0)==128){c[g>>2]=E;h=0;return h|0}else if((r|0)==129){if((k-E|0)<2){h=-2;return h|0}c[g>>2]=E;h=0;return h|0}else if((r|0)==131){if((k-E|0)<3){h=-2;return h|0}c[g>>2]=E;h=0;return h|0}else if((r|0)==133){if((k-E|0)<4){h=-2;return h|0}c[g>>2]=E;h=0;return h|0}else if((r|0)==135){c[g>>2]=E;h=20;return h|0}else if((r|0)==136){c[g>>2]=E;h=0;return h|0}else if((r|0)==175){return h|0}break};case 21:case 10:{break};case 12:{o=e+2|0;if((o|0)==(k|0)){h=-1;return h|0}p=k;n=o;i:while(1){o=a[n+1|0]|0;s=a[n]|0;j:do{if(o<<24>>24==0){q=a[m+(s&255)|0]|0;switch(q&255|0){case 5:{if((p-n|0)<2){h=-2;r=175;break i}H=n+2|0;break j;break};case 0:case 1:case 8:{r=23;break i;break};case 12:case 13:{I=n+2|0;if(q<<24>>24==12){r=25;break i}else{H=I;break j}break};case 7:{r=21;break j;break};case 6:{if((p-n|0)<3){h=-2;r=175;break i}H=n+3|0;break j;break};default:{r=29;break j}}}else{switch(o&255|0){case 255:{break};case 220:case 221:case 222:case 223:{r=23;break i;break};case 216:case 217:case 218:case 219:{r=21;break j;break};default:{r=29;break j}}if(((s&255)-254|0)>>>0<2>>>0){r=23;break i}else{r=29}}}while(0);if((r|0)==21){r=0;if((p-n|0)<4){h=-2;r=175;break}H=n+4|0}else if((r|0)==29){r=0;H=n+2|0}if((H|0)==(k|0)){h=-1;r=175;break}else{n=H}}if((r|0)==23){c[g>>2]=n;h=0;return h|0}else if((r|0)==25){if((I|0)==(k|0)){h=-27;return h|0}c[g>>2]=I;k:do{if((a[n+3|0]|0)==0){switch(d[m+(d[I]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break k}}return h|0}}while(0);h=0;return h|0}else if((r|0)==175){return h|0}break};case 6:{if((k-i|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{r=141;break a;break};case 22:case 24:{y=18;break a;break};case 36:{c[g>>2]=e+2;h=21;return h|0};case 13:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}p=k;s=n;l:while(1){n=a[s+1|0]|0;o=a[s]|0;m:do{if(n<<24>>24==0){q=a[m+(o&255)|0]|0;switch(q&255|0){case 6:{if((p-s|0)<3){h=-2;r=175;break l}J=s+3|0;break m;break};case 5:{if((p-s|0)<2){h=-2;r=175;break l}J=s+2|0;break m;break};case 7:{r=41;break m;break};case 0:case 1:case 8:{r=43;break l;break};case 12:case 13:{K=s+2|0;if(q<<24>>24==13){r=45;break l}else{J=K;break m}break};default:{r=49;break m}}}else{switch(n&255|0){case 255:{break};case 216:case 217:case 218:case 219:{r=41;break m;break};case 220:case 221:case 222:case 223:{r=43;break l;break};default:{r=49;break m}}if(((o&255)-254|0)>>>0<2>>>0){r=43;break l}else{r=49}}}while(0);if((r|0)==41){r=0;if((p-s|0)<4){h=-2;r=175;break}J=s+4|0}else if((r|0)==49){r=0;J=s+2|0}if((J|0)==(k|0)){h=-1;r=175;break}else{s=J}}if((r|0)==43){c[g>>2]=s;h=0;return h|0}else if((r|0)==45){if((K|0)==(k|0)){h=-27;return h|0}c[g>>2]=K;n:do{if((a[s+3|0]|0)==0){switch(d[m+(d[K]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break n}}return h|0}}while(0);h=0;return h|0}else if((r|0)==175){return h|0}break};default:{r=148;break a}}}while(0);l=e+2|0;o:do{if((l|0)!=(k|0)){s=e;p=l;while(1){if((a[s+3|0]|0)!=0){break}o=d[m+(d[p]|0)|0]|0;if((o|0)==9){if((s+4|0)==(k|0)){break}}else if(!((o|0)==21|(o|0)==10)){break}o=p+2|0;if((o|0)==(k|0)){break o}else{s=p;p=o}}c[g>>2]=p;h=15;return h|0}}while(0);c[g>>2]=k;h=15;return h|0}else{m=j&255;switch(m|0){case 220:case 221:case 222:case 223:{r=148;break a;break};case 216:case 217:case 218:case 219:{r=141;break a;break};case 255:{l=f&255;if((l-254|0)>>>0<2>>>0){r=148;break a}else{z=255;A=l;r=144;break a}break};default:{z=m;A=f&255;r=144;break a}}}}while(0);do{if((r|0)==141){if((k-i|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((r|0)==144){f=A>>>5;j=1<<(A&31);if((j&c[18232+((f|d[17968+z|0]<<3)<<2)>>2]|0)!=0){y=18;break}if((c[18232+((d[19512+z|0]<<3|f)<<2)>>2]&j|0)==0){r=148}else{y=19}}}while(0);if((r|0)==148){c[g>>2]=e;h=0;return h|0}z=e+2|0;p:do{if((z|0)!=(k|0)){A=b+72|0;i=e;j=z;q:while(1){f=a[i+3|0]|0;K=a[j]|0;r:do{if(f<<24>>24==0){J=K&255;switch(d[A+J|0]|0){case 29:{L=0;M=J;r=154;break};case 22:case 24:case 25:case 26:case 27:{break};case 34:{r=164;break q;break};case 33:{r=167;break q;break};case 15:{r=170;break q;break};case 6:{r=159;break q;break};case 7:{r=161;break q;break};case 11:case 32:case 35:case 36:case 20:case 30:case 21:case 9:case 10:{r=163;break q;break};case 5:{r=157;break q;break};default:{r=173;break q}}}else{J=f&255;switch(J|0){case 216:case 217:case 218:case 219:{r=161;break q;break};case 255:{I=K&255;if((I-254|0)>>>0<2>>>0){r=173;break q}else{L=255;M=I;r=154;break r}break};case 220:case 221:case 222:case 223:{r=173;break q;break};default:{L=J;M=K&255;r=154;break r}}}}while(0);if((r|0)==154){r=0;if((1<<(M&31)&c[18232+((M>>>5|d[19512+L|0]<<3)<<2)>>2]|0)==0){r=156;break}}K=j+2|0;if((K|0)==(k|0)){break p}else{i=j;j=K}}if((r|0)==156){c[g>>2]=j;h=0;return h|0}else if((r|0)==157){if((k-j|0)<2){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((r|0)==159){if((k-j|0)<3){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((r|0)==161){if((k-j|0)<4){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((r|0)==163){c[g>>2]=j;h=y;return h|0}else if((r|0)==164){if((y|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=32;return h|0}}else if((r|0)==167){if((y|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=31;return h|0}}else if((r|0)==170){if((y|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=30;return h|0}}else if((r|0)==173){c[g>>2]=j;h=0;return h|0}}}while(0);h=-y|0;return h|0}function ef(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0;h=i;i=i+8|0;j=h|0;a:do{if((e|0)==(f|0)){k=-4}else{l=e;m=f-l|0;if((m&1|0)==0){n=f}else{o=m&-2;if((o|0)==0){k=-1;break}n=e+o|0}o=a[e+1|0]|0;m=a[e]|0;b:do{if(o<<24>>24==0){p=b+72|0;switch(d[p+(m&255)|0]|0){case 0:case 1:case 8:{q=208;break b;break};case 2:{r=e+2|0;if((r|0)==(n|0)){k=-1;break a}s=a[e+3|0]|0;t=a[r]|0;c:do{if(s<<24>>24==0){u=t&255;switch(d[p+u|0]|0){case 15:{k=xf(b,e+4|0,n,g)|0;break a;break};case 17:{v=e+4|0;if((v|0)==(n|0)){k=-1;break a}w=a[e+5|0]|0;x=a[v]|0;d:do{if(w<<24>>24==0){y=x&255;switch(d[p+y|0]|0){case 5:{if((n-v|0)<2){k=-2;break a}c[g>>2]=v;k=0;break a;break};case 22:case 24:{break d;break};case 29:{z=0;A=y;q=43;break d;break};case 7:{q=49;break d;break};case 6:{if((n-v|0)<3){k=-2;break a}c[g>>2]=v;k=0;break a;break};default:{q=51;break d}}}else{y=w&255;switch(y|0){case 220:case 221:case 222:case 223:{q=51;break d;break};case 216:case 217:case 218:case 219:{q=49;break d;break};case 255:{B=x&255;if((B-254|0)>>>0<2>>>0){q=51;break d}else{z=255;A=B;q=43;break d}break};default:{z=y;A=x&255;q=43;break d}}}}while(0);do{if((q|0)==43){if((c[18232+((d[17968+z|0]<<3|A>>>5)<<2)>>2]&1<<(A&31)|0)!=0){break}c[g>>2]=v;k=0;break a}else if((q|0)==49){if((n-v|0)<4){k=-2;break a}c[g>>2]=v;k=0;break a}else if((q|0)==51){c[g>>2]=v;k=0;break a}}while(0);x=e+6|0;if((x|0)==(n|0)){k=-1;break a}else{C=v;D=x}e:while(1){x=a[C+3|0]|0;w=a[D]|0;f:do{if(x<<24>>24==0){y=w&255;switch(d[p+y|0]|0){case 29:{E=0;F=y;q=57;break};case 6:{q=62;break e;break};case 11:{q=72;break e;break};case 22:case 24:case 25:case 26:case 27:{break};case 7:{q=64;break e;break};case 21:case 9:case 10:{q=66;break e;break};case 5:{q=60;break e;break};default:{q=73;break e}}}else{y=x&255;switch(y|0){case 255:{B=w&255;if((B-254|0)>>>0<2>>>0){q=73;break e}else{E=255;F=B;q=57;break f}break};case 216:case 217:case 218:case 219:{q=64;break e;break};case 220:case 221:case 222:case 223:{q=73;break e;break};default:{E=y;F=w&255;q=57;break f}}}}while(0);if((q|0)==57){q=0;if((c[18232+((d[19512+E|0]<<3|F>>>5)<<2)>>2]&1<<(F&31)|0)==0){q=59;break}}w=D+2|0;if((w|0)==(n|0)){k=-1;break a}else{C=D;D=w}}if((q|0)==59){c[g>>2]=D;k=0;break a}else if((q|0)==60){if((n-D|0)<2){k=-2;break a}c[g>>2]=D;k=0;break a}else if((q|0)==62){if((n-D|0)<3){k=-2;break a}c[g>>2]=D;k=0;break a}else if((q|0)==64){if((n-D|0)<4){k=-2;break a}c[g>>2]=D;k=0;break a}else if((q|0)==66){v=C+4|0;if((v|0)==(n|0)){k=-1;break a}else{G=v}while(1){if((a[G+1|0]|0)!=0){q=70;break}v=d[p+(d[G]|0)|0]|0;if((v|0)==11){q=69;break}else if(!((v|0)==21|(v|0)==9|(v|0)==10)){q=70;break}v=G+2|0;if((v|0)==(n|0)){k=-1;break a}else{G=v}}if((q|0)==69){c[g>>2]=G+2;k=5;break a}else if((q|0)==70){c[g>>2]=G;k=0;break a}}else if((q|0)==72){c[g>>2]=C+4;k=5;break a}else if((q|0)==73){c[g>>2]=D;k=0;break a}break};case 7:{q=22;break c;break};case 5:{if((n-r|0)<2){k=-2;break a}c[g>>2]=r;k=0;break a;break};case 16:{v=e+4|0;if((v|0)==(n|0)){k=-1;break a}do{if((a[e+5|0]|0)==0){w=d[p+(d[v]|0)|0]|0;if((w|0)==27){k=wf(b,e+6|0,n,g)|0;break a}else if((w|0)!=20){break}w=e+6|0;if((n-w|0)<12){k=-1;break a}else{H=w;I=0}while(1){if((a[H+1|0]|0)!=0){q=31;break}if((a[H]|0)!=(a[17816+I|0]|0)){q=31;break}w=I+1|0;J=H+2|0;if((w|0)<6){H=J;I=w}else{q=33;break}}if((q|0)==31){c[g>>2]=H;k=0;break a}else if((q|0)==33){c[g>>2]=J;k=8;break a}}}while(0);c[g>>2]=v;k=0;break a;break};case 6:{if((n-r|0)<3){k=-2;break a}c[g>>2]=r;k=0;break a;break};case 22:case 24:{break c;break};case 29:{K=0;L=u;q=16;break c;break};default:{q=74;break c}}}else{w=s&255;switch(w|0){case 216:case 217:case 218:case 219:{q=22;break c;break};case 255:{x=t&255;if((x-254|0)>>>0<2>>>0){q=74;break c}else{K=255;L=x;q=16;break c}break};case 220:case 221:case 222:case 223:{q=74;break c;break};default:{K=w;L=t&255;q=16;break c}}}}while(0);do{if((q|0)==16){if((c[18232+((d[17968+K|0]<<3|L>>>5)<<2)>>2]&1<<(L&31)|0)!=0){break}c[g>>2]=r;k=0;break a}else if((q|0)==22){if((n-r|0)<4){k=-2;break a}c[g>>2]=r;k=0;break a}else if((q|0)==74){c[g>>2]=r;k=0;break a}}while(0);t=e+4|0;if((t|0)==(n|0)){k=-1;break a}else{M=r;N=t}g:while(1){t=a[M+3|0]|0;s=a[N]|0;h:do{if(t<<24>>24==0){w=s&255;switch(d[p+w|0]|0){case 5:{q=83;break g;break};case 22:case 24:case 25:case 26:case 27:{break};case 6:{q=85;break g;break};case 17:{O=N;break g;break};case 7:{q=87;break g;break};case 21:case 9:case 10:{q=89;break g;break};case 11:{P=N;q=182;break g;break};case 29:{Q=0;R=w;q=80;break};default:{q=188;break g}}}else{w=t&255;switch(w|0){case 220:case 221:case 222:case 223:{q=188;break g;break};case 216:case 217:case 218:case 219:{q=87;break g;break};case 255:{x=s&255;if((x-254|0)>>>0<2>>>0){q=188;break g}else{Q=255;R=x;q=80;break h}break};default:{Q=w;R=s&255;q=80;break h}}}}while(0);if((q|0)==80){q=0;if((c[18232+((d[19512+Q|0]<<3|R>>>5)<<2)>>2]&1<<(R&31)|0)==0){q=82;break}}s=N+2|0;if((s|0)==(n|0)){k=-1;break a}else{M=N;N=s}}i:do{if((q|0)==82){c[g>>2]=N;k=0;break a}else if((q|0)==83){if((n-N|0)<2){k=-2;break a}c[g>>2]=N;k=0;break a}else if((q|0)==85){if((n-N|0)<3){k=-2;break a}c[g>>2]=N;k=0;break a}else if((q|0)==87){if((n-N|0)<4){k=-2;break a}c[g>>2]=N;k=0;break a}else if((q|0)==89){r=M+4|0;if((r|0)==(n|0)){k=-1;break a}else{S=r}j:while(1){T=a[S+1|0]|0;U=a[S]|0;if(T<<24>>24!=0){q=91;break}r=U&255;switch(d[p+r|0]|0){case 29:{V=0;W=r;q=95;break j;break};case 22:case 24:{break j;break};case 5:{q=174;break j;break};case 7:{q=178;break j;break};case 17:{O=S;break i;break};case 21:case 9:case 10:{break};case 11:{P=S;q=182;break i;break};case 6:{q=176;break j;break};default:{q=181;break j}}r=S+2|0;if((r|0)==(n|0)){k=-1;break a}else{S=r}}k:do{if((q|0)==91){r=T&255;switch(r|0){case 255:{s=U&255;if((s-254|0)>>>0<2>>>0){q=181;break k}else{V=255;W=s;q=95;break k}break};case 216:case 217:case 218:case 219:{q=178;break k;break};case 220:case 221:case 222:case 223:{q=181;break k;break};default:{V=r;W=U&255;q=95;break k}}}else if((q|0)==174){if((n-S|0)<2){k=-2;break a}c[g>>2]=S;k=0;break a}else if((q|0)==176){if((n-S|0)<3){k=-2;break a}c[g>>2]=S;k=0;break a}}while(0);do{if((q|0)==95){if((c[18232+((d[17968+V|0]<<3|W>>>5)<<2)>>2]&1<<(W&31)|0)!=0){break}c[g>>2]=S;k=0;break a}else if((q|0)==178){if((n-S|0)<4){k=-2;break a}c[g>>2]=S;k=0;break a}else if((q|0)==181){c[g>>2]=S;k=0;break a}}while(0);r=S+2|0;c[j>>2]=r;if((r|0)==(n|0)){k=-1;break a}s=n;t=r;l:while(1){r=a[t+1|0]|0;u=a[t]|0;m:do{if(r<<24>>24==0){v=u&255;n:do{switch(d[p+v|0]|0){case 6:{q=109;break l;break};case 29:{X=0;Y=v;q=105;break m;break};case 5:{q=107;break l;break};case 21:case 9:case 10:{w=t+2|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{Z=t;_=w}while(1){if((a[Z+3|0]|0)!=0){q=116;break l}w=d[p+(d[_]|0)|0]|0;if((w|0)==14){$=_;break n}else if(!((w|0)==21|(w|0)==10|(w|0)==9)){q=116;break l}w=_+2|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{Z=_;_=w}}break};case 7:{q=111;break l;break};case 22:case 24:case 25:case 26:case 27:{aa=t;break m;break};case 14:{$=t;break};default:{q=173;break l}}}while(0);v=$+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{ba=$;ca=v}while(1){if((a[ba+3|0]|0)!=0){q=122;break l}da=d[p+(d[ca]|0)|0]|0;if((da&254|0)==12){break}if(!((da|0)==21|(da|0)==10|(da|0)==9)){q=122;break l}v=ca+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{ba=ca;ca=v}}v=ca+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{ea=v}while(1){v=a[ea+1|0]|0;w=a[ea]|0;o:do{if(v<<24>>24==0){fa=d[p+(w&255)|0]|0}else{switch(v&255|0){case 216:case 217:case 218:case 219:{fa=7;break o;break};case 220:case 221:case 222:case 223:{fa=8;break o;break};case 255:{if(((w&255)-254|0)>>>0<2>>>0){fa=0;break o}break};default:{}}fa=29}}while(0);if((fa|0)==(da|0)){break}switch(fa|0){case 5:{if((s-ea|0)<2){k=-2;break a}w=ea+2|0;c[j>>2]=w;ga=w;break};case 6:{if((s-ea|0)<3){k=-2;break a}w=ea+3|0;c[j>>2]=w;ga=w;break};case 2:{q=144;break l;break};case 0:case 1:case 8:{q=138;break l;break};case 3:{ha=uf(b,ea+2|0,n,j)|0;if((ha|0)<1){q=142;break l}ga=c[j>>2]|0;break};case 7:{if((s-ea|0)<4){k=-2;break a}w=ea+4|0;c[j>>2]=w;ga=w;break};default:{w=ea+2|0;c[j>>2]=w;ga=w}}if((ga|0)==(n|0)){k=-1;break a}else{ea=ga}}ia=ea+2|0;c[j>>2]=ia;if((ia|0)==(n|0)){k=-1;break a}if((a[ea+3|0]|0)!=0){q=150;break l}switch(d[p+(d[ia]|0)|0]|0){case 21:case 9:case 10:{break};case 11:{ja=ia;q=166;break l;break};case 17:{ka=ia;q=167;break l;break};default:{q=150;break l}}w=ea+4|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{la=ia;ma=w}p:while(1){na=a[la+3|0]|0;oa=a[ma]|0;if(na<<24>>24!=0){q=152;break}w=oa&255;switch(d[p+w|0]|0){case 11:{ja=ma;q=166;break l;break};case 17:{ka=ma;q=167;break l;break};case 7:{q=164;break l;break};case 29:{pa=w;break p;break};case 22:case 24:{aa=ma;break m;break};case 6:{q=162;break l;break};case 5:{q=160;break l;break};case 21:case 9:case 10:{break};default:{q=172;break l}}w=ma+2|0;c[j>>2]=w;if((w|0)==(n|0)){k=-1;break a}else{la=ma;ma=w}}q:do{if((q|0)==152){q=0;switch(na&255|0){case 220:case 221:case 222:case 223:{q=172;break l;break};case 216:case 217:case 218:case 219:{q=164;break l;break};case 255:{w=oa&255;if((w-254|0)>>>0<2>>>0){q=172;break l}else{pa=w;break q}break};default:{pa=oa&255;break q}}}}while(0);if((c[18232+((d[17968+(d[ma+1|0]|0)|0]<<3|pa>>>5)<<2)>>2]&1<<(pa&31)|0)==0){q=158;break l}else{aa=ma}}else{w=r&255;switch(w|0){case 255:{v=u&255;if((v-254|0)>>>0<2>>>0){q=173;break l}else{X=255;Y=v;q=105;break m}break};case 220:case 221:case 222:case 223:{q=173;break l;break};case 216:case 217:case 218:case 219:{q=111;break l;break};default:{X=w;Y=u&255;q=105;break m}}}}while(0);if((q|0)==105){q=0;if((c[18232+((d[19512+X|0]<<3|Y>>>5)<<2)>>2]&1<<(Y&31)|0)==0){q=106;break}else{aa=t}}u=aa+2|0;c[j>>2]=u;if((u|0)==(n|0)){k=-1;break a}else{t=u}}if((q|0)==106){c[g>>2]=t;k=0;break a}else if((q|0)==107){if((s-t|0)<2){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==109){if((s-t|0)<3){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==111){if((s-t|0)<4){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==116){c[g>>2]=_;k=0;break a}else if((q|0)==122){c[g>>2]=ca;k=0;break a}else if((q|0)==138){c[g>>2]=ea;k=0;break a}else if((q|0)==142){if((ha|0)!=0){k=ha;break a}c[g>>2]=c[j>>2];k=0;break a}else if((q|0)==144){c[g>>2]=ea;k=0;break a}else if((q|0)==150){c[g>>2]=ia;k=0;break a}else if((q|0)==158){c[g>>2]=ma;k=0;break a}else if((q|0)==160){if((s-ma|0)<2){k=-2;break a}c[g>>2]=ma;k=0;break a}else if((q|0)==162){if((s-ma|0)<3){k=-2;break a}c[g>>2]=ma;k=0;break a}else if((q|0)==164){if((s-ma|0)<4){k=-2;break a}c[g>>2]=ma;k=0;break a}else if((q|0)==166){c[g>>2]=ja+2;k=1;break a}else if((q|0)==167){u=ka+2|0;c[j>>2]=u;if((u|0)==(n|0)){k=-1;break a}do{if((a[ka+3|0]|0)==0){if((a[u]|0)!=62){break}c[g>>2]=ka+4;k=3;break a}}while(0);c[g>>2]=u;k=0;break a}else if((q|0)==172){c[g>>2]=ma;k=0;break a}else if((q|0)==173){c[g>>2]=t;k=0;break a}}else if((q|0)==188){c[g>>2]=N;k=0;break a}}while(0);if((q|0)==182){c[g>>2]=P+2;k=2;break a}s=O+2|0;if((s|0)==(n|0)){k=-1;break a}do{if((a[O+3|0]|0)==0){if((a[s]|0)!=62){break}c[g>>2]=O+4;k=4;break a}}while(0);c[g>>2]=s;k=0;break a;break};case 5:{if((n-l|0)<2){k=-2;break a}qa=e+2|0;break b;break};case 6:{if((n-l|0)<3){k=-2;break a}qa=e+3|0;break b;break};case 7:{q=206;break b;break};case 10:{c[g>>2]=e+2;k=7;break a;break};case 4:{r=e+2|0;if((r|0)==(n|0)){k=-5;break a}if((a[e+3|0]|0)!=0){qa=r;break b}if((a[r]|0)!=93){qa=r;break b}w=e+4|0;if((w|0)==(n|0)){k=-5;break a}if((a[e+5|0]|0)!=0){qa=r;break b}if((a[w]|0)!=62){qa=r;break b}c[g>>2]=w;k=0;break a;break};case 3:{k=uf(b,e+2|0,n,g)|0;break a;break};case 9:{w=e+2|0;if((w|0)==(n|0)){k=-3;break a}if((a[e+3|0]|0)==0){ra=(a[p+(d[w]|0)|0]|0)==10}else{ra=0}c[g>>2]=ra?e+4|0:w;k=7;break a;break};default:{q=209;break b}}}else{switch(o&255|0){case 220:case 221:case 222:case 223:{q=208;break b;break};case 216:case 217:case 218:case 219:{q=206;break b;break};case 255:{break};default:{q=209;break b}}if(((m&255)-254|0)>>>0<2>>>0){q=208}else{q=209}}}while(0);if((q|0)==206){if((n-l|0)<4){k=-2;break}qa=e+4|0}else if((q|0)==208){c[g>>2]=e;k=0;break}else if((q|0)==209){qa=e+2|0}r:do{if((qa|0)!=(n|0)){m=b+72|0;o=n;w=qa;s:while(1){r=a[w+1|0]|0;v=a[w]|0;t:do{if(r<<24>>24==0){switch(d[m+(v&255)|0]|0){case 6:{if((o-w|0)<3){q=220;break s}sa=w+3|0;break t;break};case 5:{if((o-w|0)<2){q=217;break s}sa=w+2|0;break t;break};case 7:{q=222;break t;break};case 4:{x=w+2|0;if((x|0)==(n|0)){q=232;break s}if((a[w+3|0]|0)!=0){sa=x;break t}if((a[x]|0)!=93){sa=x;break t}ta=w+4|0;if((ta|0)==(n|0)){q=232;break s}if((a[w+5|0]|0)!=0){sa=x;break t}if((a[ta]|0)==62){q=231;break s}else{sa=x;break t}break};case 3:case 2:case 0:case 1:case 8:case 9:case 10:{q=232;break s;break};default:{q=233;break t}}}else{switch(r&255|0){case 255:{break};case 216:case 217:case 218:case 219:{q=222;break t;break};case 220:case 221:case 222:case 223:{q=232;break s;break};default:{q=233;break t}}if(((v&255)-254|0)>>>0<2>>>0){q=232;break s}else{q=233}}}while(0);if((q|0)==222){q=0;if((o-w|0)<4){q=223;break}sa=w+4|0}else if((q|0)==233){q=0;sa=w+2|0}if((sa|0)==(n|0)){break r}else{w=sa}}if((q|0)==217){c[g>>2]=w;k=6;break a}else if((q|0)==220){c[g>>2]=w;k=6;break a}else if((q|0)==223){c[g>>2]=w;k=6;break a}else if((q|0)==231){c[g>>2]=ta;k=0;break a}else if((q|0)==232){c[g>>2]=w;k=6;break a}}}while(0);c[g>>2]=n;k=6}}while(0);i=h;return k|0}function ff(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e+1|0]|0;f=a[e]|0;a:do{if(j<<24>>24==0){l=b+72|0;switch(d[l+(f&255)|0]|0){case 9:{m=e+2|0;if((m|0)==(k|0)){h=-1;return h|0}if((a[e+3|0]|0)==0){n=(a[l+(d[m]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:m;h=7;return h|0};case 10:{c[g>>2]=e+2;h=7;return h|0};case 5:{if((k-i|0)<2){h=-2;return h|0}else{o=e+2|0;break a}break};case 6:{if((k-i|0)<3){h=-2;return h|0}else{o=e+3|0;break a}break};case 7:{p=25;break a;break};case 0:case 1:case 8:{p=27;break a;break};case 4:{m=e+2|0;if((m|0)==(k|0)){h=-1;return h|0}if((a[e+3|0]|0)!=0){o=m;break a}if((a[m]|0)!=93){o=m;break a}l=e+4|0;if((l|0)==(k|0)){h=-1;return h|0}if((a[e+5|0]|0)!=0){o=m;break a}if((a[l]|0)!=62){o=m;break a}c[g>>2]=e+6;h=40;return h|0};default:{p=28;break a}}}else{switch(j&255|0){case 255:{break};case 216:case 217:case 218:case 219:{p=25;break a;break};case 220:case 221:case 222:case 223:{p=27;break a;break};default:{p=28;break a}}if(((f&255)-254|0)>>>0<2>>>0){p=27}else{p=28}}}while(0);do{if((p|0)==25){if((k-i|0)<4){h=-2;return h|0}else{o=e+4|0;break}}else if((p|0)==27){c[g>>2]=e;h=0;return h|0}else if((p|0)==28){o=e+2|0}}while(0);b:do{if((o|0)!=(k|0)){e=b+72|0;i=k;f=o;c:while(1){j=a[f+1|0]|0;n=a[f]|0;d:do{if(j<<24>>24==0){switch(d[e+(n&255)|0]|0){case 0:case 1:case 8:case 9:case 10:case 4:{p=44;break c;break};case 5:{if((i-f|0)<2){p=36;break c}q=f+2|0;break d;break};case 7:{p=41;break d;break};case 6:{if((i-f|0)<3){p=39;break c}q=f+3|0;break d;break};default:{p=45;break d}}}else{switch(j&255|0){case 220:case 221:case 222:case 223:{p=44;break c;break};case 255:{break};case 216:case 217:case 218:case 219:{p=41;break d;break};default:{p=45;break d}}if(((n&255)-254|0)>>>0<2>>>0){p=44;break c}else{p=45}}}while(0);if((p|0)==41){p=0;if((i-f|0)<4){p=42;break}q=f+4|0}else if((p|0)==45){p=0;q=f+2|0}if((q|0)==(k|0)){break b}else{f=q}}if((p|0)==36){c[g>>2]=f;h=6;return h|0}else if((p|0)==39){c[g>>2]=f;h=6;return h|0}else if((p|0)==42){c[g>>2]=f;h=6;return h|0}else if((p|0)==44){c[g>>2]=f;h=6;return h|0}}}while(0);c[g>>2]=k;h=6;return h|0}function gf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j+1|0]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j]|0)|0]|0){case 10:{l=13;break a;break};case 2:{l=12;break a;break};case 9:{l=16;break a;break};case 6:{m=j+3|0;break b;break};case 7:{l=8;break b;break};case 3:{l=9;break a;break};case 21:{l=22;break a;break};case 5:{m=j+2|0;break b;break};default:{l=25;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){l=8}else{l=25}}}while(0);if((l|0)==8){l=0;m=j+4|0}else if((l|0)==25){l=0;m=j+2|0}if((m|0)==(f|0)){l=27;break}else{j=m}}if((l|0)==9){if((j|0)==(e|0)){h=uf(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==12){c[g>>2]=j;h=0;return h|0}else if((l|0)==13){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==16){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}b=e+2|0;if((b|0)==(f|0)){h=-3;return h|0}if((a[e+3|0]|0)==0){n=(a[i+(d[b]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:b;h=7;return h|0}else if((l|0)==22){if((j|0)==(e|0)){c[g>>2]=e+2;h=39;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==27){c[g>>2]=f;h=6;return h|0}return 0}function hf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j+1|0]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j]|0)|0]|0){case 10:{l=15;break a;break};case 3:{l=9;break a;break};case 7:{l=8;break b;break};case 9:{l=18;break a;break};case 6:{m=j+3|0;break b;break};case 5:{m=j+2|0;break b;break};case 30:{l=12;break a;break};default:{l=24;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){l=8}else{l=24}}}while(0);if((l|0)==8){l=0;m=j+4|0}else if((l|0)==24){l=0;m=j+2|0}if((m|0)==(f|0)){l=26;break}else{j=m}}if((l|0)==9){if((j|0)==(e|0)){h=uf(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==12){if((j|0)==(e|0)){m=vf(b,e+2|0,f,g)|0;h=(m|0)==22?0:m;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==15){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==18){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}j=e+2|0;if((j|0)==(f|0)){h=-3;return h|0}if((a[e+3|0]|0)==0){n=(a[i+(d[j]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:j;h=7;return h|0}else if((l|0)==26){c[g>>2]=f;h=6;return h|0}return 0}function jf(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=b+72|0;b=e;e=c;a:while(1){c=e+1|0;g=a[c]|0;h=a[e]|0;b:do{if(g<<24>>24==0){switch(d[f+(h&255)|0]|0){case 5:{i=b;j=e;k=h;l=10;break};case 29:case 22:case 24:case 25:case 26:case 27:{l=12;break};case 6:{m=b;n=e;o=h;l=8;break};case 7:{l=6;break};default:{l=15;break a}}}else{switch(g&255|0){case 220:case 221:case 222:case 223:{l=15;break a;break};case 255:{break};case 216:case 217:case 218:case 219:{l=6;break b;break};default:{l=12;break b}}if(((h&255)-254|0)>>>0<2>>>0){l=15;break a}else{l=12}}}while(0);if((l|0)==6){l=0;if(h<<24>>24!=(a[b]|0)){p=0;l=20;break}m=b+1|0;n=c;o=g;l=8}else if((l|0)==12){l=0;if((a[b]|0)!=h<<24>>24){p=0;l=20;break}if((a[b+1|0]|0)==g<<24>>24){q=b;r=e}else{p=0;l=20;break}}if((l|0)==8){l=0;s=n+1|0;if(o<<24>>24!=(a[m]|0)){p=0;l=20;break}i=m+1|0;j=s;k=a[s]|0;l=10}if((l|0)==10){l=0;if(k<<24>>24!=(a[i]|0)){p=0;l=20;break}if((a[j+1|0]|0)==(a[i+1|0]|0)){q=i;r=j}else{p=0;l=20;break}}b=q+2|0;e=r+2|0}if((l|0)==15){r=a[b+1|0]|0;e=a[b]|0;c:do{if(r<<24>>24==0){switch(d[f+(e&255)|0]|0){case 5:case 6:case 7:case 29:case 22:case 24:case 25:case 26:case 27:{p=0;break};default:{break c}}return p|0}else{switch(r&255|0){case 223:case 222:case 221:case 220:{break c;break};case 255:{break};default:{p=0;return p|0}}if(((e&255)-254|0)>>>0<2>>>0){break}else{p=0}return p|0}}while(0);p=1;return p|0}else if((l|0)==20){return p|0}return 0}function kf(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a[e]|0;f=(c|0)==(d|0);a:do{if(b<<24>>24==0){g=f}else{h=c;i=e;j=b;k=f;while(1){if(k){l=0;m=7;break}if((a[h+1|0]|0)!=0){l=0;m=7;break}if((a[h]|0)!=j<<24>>24){l=0;m=7;break}n=h+2|0;o=i+1|0;p=a[o]|0;q=(n|0)==(d|0);if(p<<24>>24==0){g=q;break a}else{h=n;i=o;j=p;k=q}}if((m|0)==7){return l|0}}}while(0);l=g&1;return l|0}function lf(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;e=b+72|0;b=c;a:while(1){f=a[b+1|0]|0;g=a[b]|0;b:do{if(f<<24>>24==0){switch(d[e+(g&255)|0]|0|0){case 7:{h=8;break b;break};case 29:case 22:case 24:case 25:case 26:case 27:{h=9;break b;break};case 6:{b=b+3|0;continue a;break};case 5:{b=b+2|0;continue a;break};default:{break a}}}else{switch(f&255|0){case 255:{break};case 216:case 217:case 218:case 219:{h=8;break b;break};case 220:case 221:case 222:case 223:{break a;break};default:{h=9;break b}}if(((g&255)-254|0)>>>0<2>>>0){break a}else{h=9}}}while(0);if((h|0)==8){h=0;b=b+4|0;continue}else if((h|0)==9){h=0;b=b+2|0;continue}}return b-c|0}function mf(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;if((a[c+1|0]|0)!=0){e=c;return e|0}f=b+72|0;b=c;while(1){c=d[f+(d[b]|0)|0]|0;if(!((c|0)==10|(c|0)==9|(c|0)==21)){e=b;g=3;break}c=b+2|0;if((a[b+3|0]|0)==0){b=c}else{e=c;g=3;break}}if((g|0)==3){return e|0}return 0}function nf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=b+72|0;b=0;i=0;j=1;k=e;a:while(1){e=k+2|0;l=k+3|0;m=a[l]|0;n=a[e]|0;b:do{if(m<<24>>24==0){switch(d[h+(n&255)|0]|0){case 21:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}o=g+(i<<4)+12|0;if((a[o]|0)==0){b=b;i=i;j=2;k=e;continue a}do{if((e|0)!=(c[g+(i<<4)+4>>2]|0)&n<<24>>24==32){p=a[k+5|0]|0;q=a[k+4|0]|0;if((p<<24>>24|0)==0){if(q<<24>>24==32){break}r=d[h+(q&255)|0]|0}else if((p<<24>>24|0)==(-1|0)){if(((q&255)-254|0)>>>0<2>>>0){r=0}else{b=b;i=i;j=2;k=e;continue a}}else{b=b;i=i;j=2;k=e;continue a}if((r|0)!=(b|0)){b=b;i=i;j=2;k=e;continue a}}}while(0);a[o]=0;b=b;i=i;j=2;k=e;continue a;break};case 3:{if((i|0)>=(f|0)){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=j;k=e;continue a;break};case 12:{if((j|0)!=2){if((i|0)>=(f|0)){b=12;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=12;i=i;j=2;k=e;continue a}if((b|0)!=12){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=12;i=i+1|0;j=0;k=e;continue a;break};case 5:{if((j|0)!=0){b=b;i=i;j=j;k=e;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e;continue a;break};case 11:case 17:{if((j|0)==2){b=b;i=i;j=2;k=e;continue a}else{break a}break};case 6:{if((j|0)!=0){b=b;i=i;j=j;k=l;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=l;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=l;continue a;break};case 29:case 22:case 24:{s=16;break b;break};case 9:case 10:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=2;k=e;continue a;break};case 13:{if((j|0)!=2){if((i|0)>=(f|0)){b=13;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=13;i=i;j=2;k=e;continue a}if((b|0)!=13){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=13;i=i+1|0;j=0;k=e;continue a;break};case 7:{s=12;break b;break};default:{b=b;i=i;j=j;k=e;continue a}}}else{switch(m&255|0){case 255:{break};case 220:case 221:case 222:case 223:{b=b;i=i;j=j;k=e;continue a;break};case 216:case 217:case 218:case 219:{s=12;break b;break};default:{s=16;break b}}if(!(((n&255)-254|0)>>>0>1>>>0&(j|0)==0)){b=b;i=i;j=j;k=e;continue a}}}while(0);if((s|0)==12){s=0;do{if((j|0)==0){if((i|0)>=(f|0)){t=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;t=1}else{t=j}}while(0);b=b;i=i;j=t;k=k+4|0;continue}else if((s|0)==16){s=0;if((j|0)!=0){b=b;i=i;j=j;k=e;continue}}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e}return i|0}function of(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=c+4|0;a:do{if((a[c+5|0]|0)==0){if((a[b]|0)!=120){d=b;e=0;f=11;break}g=c+6|0;h=0;while(1){b:do{if((a[g+1|0]|0)==0){i=a[g]|0;if(i<<24>>24==59){j=h;break a}k=i<<24>>24;switch(k|0){case 65:case 66:case 67:case 68:case 69:case 70:{l=(h<<4)-55+k|0;break b;break};case 97:case 98:case 99:case 100:case 101:case 102:{l=(h<<4)-87+k|0;break b;break};case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{l=k-48|h<<4;break b;break};default:{l=h;break b}}}else{l=h}}while(0);if((l|0)>1114111){m=-1;break}else{g=g+2|0;h=l}}return m|0}else{d=b;e=0;f=11}}while(0);c:do{if((f|0)==11){while(1){f=0;if((a[d+1|0]|0)==0){b=a[d]|0;if(b<<24>>24==59){j=e;break c}n=(b<<24>>24)-48|0}else{n=-49}b=n+(e*10|0)|0;if((b|0)>1114111){m=-1;break}else{d=d+2|0;e=b;f=11}}return m|0}}while(0);d:do{switch(j>>8|0){case 0:{if((a[20496+j|0]|0)==0){m=-1}else{break d}return m|0};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{m=-1;return m|0};case 255:{if((j&-2|0)==65534){m=-1}else{break d}return m|0};default:{}}}while(0);m=j;return m|0}function pf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;b=(d-c|0)/2|0;do{if((b|0)==2){if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=116){break}if((a[c+1|0]|0)!=0){break}d=a[c]|0;if((d|0)==108){e=60;return e|0}else if((d|0)!=103){break}e=62;return e|0}else if((b|0)==3){if((a[c+1|0]|0)!=0){break}if((a[c]|0)!=97){break}if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=109){break}if((a[c+5|0]|0)!=0){break}if((a[c+4|0]|0)==112){e=38}else{break}return e|0}else if((b|0)==4){if((a[c+1|0]|0)!=0){break}d=a[c]|0;if((d|0)==113){if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=117){break}if((a[c+5|0]|0)!=0){break}if((a[c+4|0]|0)!=111){break}if((a[c+7|0]|0)!=0){break}if((a[c+6|0]|0)==116){e=34}else{break}return e|0}else if((d|0)==97){if((a[c+3|0]|0)!=0){break}if((a[c+2|0]|0)!=112){break}if((a[c+5|0]|0)!=0){break}if((a[c+4|0]|0)!=111){break}if((a[c+7|0]|0)!=0){break}if((a[c+6|0]|0)==115){e=39}else{break}return e|0}else{break}}}while(0);e=0;return e|0}function qf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(e>>>0>=f>>>0){return}h=b+72|0;b=g+4|0;i=g|0;g=e;while(1){e=a[g+1|0]|0;a:do{if(e<<24>>24==0){switch(d[h+(d[g]|0)|0]|0){case 6:{j=g+3|0;break a;break};case 9:{c[i>>2]=(c[i>>2]|0)+1;k=g+2|0;if((k|0)==(f|0)){l=f}else{if((a[g+3|0]|0)==0){m=(a[h+(d[k]|0)|0]|0)==10}else{m=0}l=m?g+4|0:k}c[b>>2]=-1;j=l;break a;break};case 5:{j=g+2|0;break a;break};case 7:{n=8;break a;break};case 10:{c[b>>2]=-1;c[i>>2]=(c[i>>2]|0)+1;j=g+2|0;break a;break};default:{n=15;break a}}}else{if(((e&255)-216|0)>>>0<4>>>0){n=8}else{n=15}}}while(0);if((n|0)==8){n=0;j=g+4|0}else if((n|0)==15){n=0;j=g+2|0}c[b>>2]=(c[b>>2]|0)+1;if(j>>>0<f>>>0){g=j}else{break}}return}function rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;h=f-2|0;f=e+2|0;if((f|0)==(h|0)){i=1;return i|0}j=b+72|0;b=e;e=f;a:while(1){f=(a[b+3|0]|0)==0;if(!f){k=11;break}l=a[e]|0;b:do{switch(d[j+(l&255)|0]|0){case 21:{if(l<<24>>24==9){k=7;break a}break};case 26:case 22:{if(l<<24>>24>=0){break b}if(f){k=10}else{k=11;break a}break};case 25:case 24:case 27:case 13:case 31:case 32:case 34:case 35:case 17:case 14:case 15:case 9:case 10:case 18:case 16:case 33:case 30:case 19:{break};default:{k=10}}}while(0);if((k|0)==10){k=0;f=a[e]|0;if(!((f|0)==36|(f|0)==64)){k=11;break}}f=e+2|0;if((f|0)==(h|0)){i=1;k=12;break}else{b=e;e=f}}if((k|0)==7){c[g>>2]=e;i=0;return i|0}else if((k|0)==11){c[g>>2]=e;i=0;return i|0}else if((k|0)==12){return i|0}return 0}function sf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d>>2]|0;a:do{if((b|0)!=(e|0)){h=g;i=b;b:while(1){j=a[i]|0;k=a[i+1|0]|0;l=k&255;c:do{switch(l|0){case 0:{if(j<<24>>24<=-1){m=8;break c}n=c[f>>2]|0;if((n|0)==(g|0)){m=6;break b}c[f>>2]=n+1;a[n]=j;o=i;break};case 1:case 2:case 3:case 4:case 5:case 6:case 7:{m=8;break};case 216:case 217:case 218:case 219:{n=c[f>>2]|0;if((h-n|0)<4){m=15;break b}p=j&255;q=(l<<2&12|p>>>6)+1|0;c[f>>2]=n+1;a[n]=q>>>2|240;n=c[f>>2]|0;c[f>>2]=n+1;a[n]=p>>>2&15|q<<4&48|128;q=i+2|0;p=a[q]|0;n=j<<4&48|(p&255)>>>6|a[i+3|0]<<2&12|-128;r=c[f>>2]|0;c[f>>2]=r+1;a[r]=n;n=c[f>>2]|0;c[f>>2]=n+1;a[n]=p&63|-128;o=q;break};default:{q=c[f>>2]|0;if((h-q|0)<3){m=12;break b}c[f>>2]=q+1;a[q]=(k&255)>>>4|-32;q=c[f>>2]|0;c[f>>2]=q+1;a[q]=(j&255)>>>6|k<<2&60|-128;q=c[f>>2]|0;c[f>>2]=q+1;a[q]=j&63|-128;o=i}}}while(0);if((m|0)==8){m=0;l=c[f>>2]|0;if((h-l|0)<2){m=9;break}c[f>>2]=l+1;a[l]=(j&255)>>>6|k<<2|-64;l=c[f>>2]|0;c[f>>2]=l+1;a[l]=j&63|-128;o=i}l=o+2|0;if((l|0)==(e|0)){break a}else{i=l}}if((m|0)==6){c[d>>2]=i;return}else if((m|0)==9){c[d>>2]=i;return}else if((m|0)==12){c[d>>2]=i;return}else if((m|0)==15){c[d>>2]=i;return}}}while(0);c[d>>2]=e;return}function tf(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0;e=c[f>>2]|0;j=c[h>>2]|0;if((g-e|0)>(i-j|0)){k=(a[g-1|0]&-8)<<24>>24==-40?g-2|0:g}else{k=g}if((e|0)==(k|0)){return}else{l=e;m=j}while(1){if((m|0)==(i|0)){n=7;break}j=(d[l+1|0]|0)<<8|(d[l]|0);c[h>>2]=m+2;b[m>>1]=j;j=(c[f>>2]|0)+2|0;c[f>>2]=j;if((j|0)==(k|0)){n=7;break}l=j;m=c[h>>2]|0}if((n|0)==7){return}}function uf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e+1|0]|0;j=a[e]|0;a:do{if(i<<24>>24==0){k=j&255;l=b+72|0;switch(d[l+k|0]|0){case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 29:{m=0;n=k;o=9;break a;break};case 7:{o=15;break a;break};case 19:{k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[e+3|0]|0)==0){p=a[k]|0;if(p<<24>>24!=120){if((a[l+(p&255)|0]|0)==25){q=k}else{break}while(1){r=q+2|0;if((r|0)==(f|0)){h=-1;o=54;break}if((a[q+3|0]|0)!=0){o=36;break}p=d[l+(d[r]|0)|0]|0;if((p|0)==25){q=r}else if((p|0)==18){o=35;break}else{o=36;break}}if((o|0)==35){c[g>>2]=q+4;h=10;return h|0}else if((o|0)==36){c[g>>2]=r;h=0;return h|0}else if((o|0)==54){return h|0}}p=e+4|0;if((p|0)==(f|0)){h=-1;return h|0}do{if((a[e+5|0]|0)==0){if(((d[l+(d[p]|0)|0]|0)-24|0)>>>0>=2>>>0){break}s=e+6|0;if((s|0)==(f|0)){h=-1;return h|0}else{t=p;u=s}while(1){if((a[t+3|0]|0)!=0){o=29;break}s=d[l+(d[u]|0)|0]|0;if((s|0)==18){o=28;break}else if(!((s|0)==25|(s|0)==24)){o=29;break}s=u+2|0;if((s|0)==(f|0)){h=-1;o=54;break}else{t=u;u=s}}if((o|0)==28){c[g>>2]=t+4;h=10;return h|0}else if((o|0)==29){c[g>>2]=u;h=0;return h|0}else if((o|0)==54){return h|0}}}while(0);c[g>>2]=p;h=0;return h|0}}while(0);c[g>>2]=k;h=0;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};default:{o=37;break a}}}else{l=i&255;switch(l|0){case 220:case 221:case 222:case 223:{o=37;break a;break};case 216:case 217:case 218:case 219:{o=15;break a;break};case 255:{s=j&255;if((s-254|0)>>>0<2>>>0){o=37;break a}else{m=255;n=s;o=9;break a}break};default:{m=l;n=j&255;o=9;break a}}}}while(0);do{if((o|0)==9){if((1<<(n&31)&c[18232+((n>>>5|d[17968+m|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((o|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==37){c[g>>2]=e;h=0;return h|0}}while(0);m=e+2|0;if((m|0)==(f|0)){h=-1;return h|0}n=b+72|0;b=e;e=m;b:while(1){m=a[b+3|0]|0;j=a[e]|0;c:do{if(m<<24>>24==0){i=j&255;switch(d[n+i|0]|0){case 5:{o=46;break b;break};case 7:{o=50;break b;break};case 18:{o=52;break b;break};case 29:{v=0;w=i;o=43;break};case 22:case 24:case 25:case 26:case 27:{break};case 6:{o=48;break b;break};default:{o=53;break b}}}else{i=m&255;switch(i|0){case 255:{u=j&255;if((u-254|0)>>>0<2>>>0){o=53;break b}else{v=255;w=u;o=43;break c}break};case 216:case 217:case 218:case 219:{o=50;break b;break};case 220:case 221:case 222:case 223:{o=53;break b;break};default:{v=i;w=j&255;o=43;break c}}}}while(0);if((o|0)==43){o=0;if((1<<(w&31)&c[18232+((w>>>5|d[19512+v|0]<<3)<<2)>>2]|0)==0){o=45;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;o=54;break}else{b=e;e=j}}if((o|0)==45){c[g>>2]=e;h=0;return h|0}else if((o|0)==46){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==48){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==50){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((o|0)==52){c[g>>2]=b+4;h=9;return h|0}else if((o|0)==53){c[g>>2]=e;h=0;return h|0}else if((o|0)==54){return h|0}return 0}function vf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e+1|0]|0;j=a[e]|0;a:do{if(i<<24>>24==0){k=j&255;switch(d[b+72+k|0]|0|0){case 22:case 24:{break a;break};case 21:case 10:case 9:case 30:{c[g>>2]=e;h=22;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{l=15;break a;break};case 29:{m=0;n=k;l=9;break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};default:{l=18;break a}}}else{k=i&255;switch(k|0){case 220:case 221:case 222:case 223:{l=18;break a;break};case 216:case 217:case 218:case 219:{l=15;break a;break};case 255:{o=j&255;if((o-254|0)>>>0<2>>>0){l=18;break a}else{m=255;n=o;l=9;break a}break};default:{m=k;n=j&255;l=9;break a}}}}while(0);do{if((l|0)==9){if((1<<(n&31)&c[18232+((n>>>5|(d[17968+m|0]|0)<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((l|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==18){c[g>>2]=e;h=0;return h|0}}while(0);m=e+2|0;if((m|0)==(f|0)){h=-1;return h|0}n=b+72|0;b=e;e=m;b:while(1){m=a[b+3|0]|0;j=a[e]|0;c:do{if(m<<24>>24==0){i=j&255;switch(d[n+i|0]|0|0){case 7:{l=31;break b;break};case 29:{p=0;q=i;l=24;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{l=27;break b;break};case 6:{l=29;break b;break};case 18:{l=33;break b;break};default:{l=34;break b}}}else{i=m&255;switch(i|0){case 216:case 217:case 218:case 219:{l=31;break b;break};case 255:{k=j&255;if((k-254|0)>>>0<2>>>0){l=34;break b}else{p=255;q=k;l=24;break c}break};case 220:case 221:case 222:case 223:{l=34;break b;break};default:{p=i;q=j&255;l=24;break c}}}}while(0);if((l|0)==24){l=0;if((1<<(q&31)&c[18232+((q>>>5|(d[19512+p|0]|0)<<3)<<2)>>2]|0)==0){l=26;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;l=35;break}else{b=e;e=j}}if((l|0)==26){c[g>>2]=e;h=0;return h|0}else if((l|0)==27){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==29){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==31){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((l|0)==33){c[g>>2]=b+4;h=28;return h|0}else if((l|0)==34){c[g>>2]=e;h=0;return h|0}else if((l|0)==35){return h|0}return 0}function wf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-1;return h|0}do{if((a[e+1|0]|0)==0){if((a[e]|0)!=45){break}i=e+2|0;if((i|0)==(f|0)){h=-1;return h|0}j=b+72|0;k=f;l=i;a:while(1){i=a[l+1|0]|0;m=a[l]|0;b:do{if(i<<24>>24==0){switch(d[j+(m&255)|0]|0){case 7:{n=15;break b;break};case 5:{if((k-l|0)<2){h=-2;n=28;break a}o=l+2|0;break b;break};case 0:case 1:case 8:{n=17;break a;break};case 6:{if((k-l|0)<3){h=-2;n=28;break a}o=l+3|0;break b;break};case 27:{p=l+2|0;if((p|0)==(f|0)){h=-1;n=28;break a}if((a[l+3|0]|0)!=0){o=p;break b}if((a[p]|0)==45){n=22;break a}else{o=p;break b}break};default:{n=27;break b}}}else{switch(i&255|0){case 216:case 217:case 218:case 219:{n=15;break b;break};case 220:case 221:case 222:case 223:{n=17;break a;break};case 255:{break};default:{n=27;break b}}if(((m&255)-254|0)>>>0<2>>>0){n=17;break a}else{n=27}}}while(0);if((n|0)==15){n=0;if((k-l|0)<4){h=-2;n=28;break}o=l+4|0}else if((n|0)==27){n=0;o=l+2|0}if((o|0)==(f|0)){h=-1;n=28;break}else{l=o}}if((n|0)==17){c[g>>2]=l;h=0;return h|0}else if((n|0)==22){k=l+4|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[l+5|0]|0)==0){if((a[k]|0)!=62){break}c[g>>2]=l+6;h=13;return h|0}}while(0);c[g>>2]=k;h=0;return h|0}else if((n|0)==28){return h|0}}}while(0);c[g>>2]=e;h=0;return h|0}
+
+
+
+function xf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e+1|0]|0;j=i<<24>>24==0;k=a[e]|0;a:do{if(j){l=k&255;switch(d[b+72+l|0]|0){case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{m=15;break a;break};case 29:{n=0;o=l;m=9;break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};default:{m=17;break a}}}else{l=i&255;switch(l|0){case 216:case 217:case 218:case 219:{m=15;break a;break};case 220:case 221:case 222:case 223:{m=17;break a;break};case 255:{p=k&255;if((p-254|0)>>>0<2>>>0){m=17;break a}else{n=255;o=p;m=9;break a}break};default:{n=l;o=k&255;m=9;break a}}}}while(0);do{if((m|0)==9){if((1<<(o&31)&c[18232+((o>>>5|d[17968+n|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((m|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==17){c[g>>2]=e;h=0;return h|0}}while(0);n=e+2|0;if((n|0)==(f|0)){h=-1;return h|0}o=b+72|0;b=e;i=n;b:while(1){l=a[b+3|0]|0;p=a[i]|0;c:do{if(l<<24>>24==0){q=p&255;switch(d[o+q|0]|0){case 21:case 9:case 10:{m=32;break b;break};case 15:{m=61;break b;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{m=26;break b;break};case 29:{r=0;s=q;m=23;break};case 7:{m=30;break b;break};case 6:{m=28;break b;break};default:{t=i;break b}}}else{q=l&255;switch(q|0){case 255:{u=p&255;if((u-254|0)>>>0<2>>>0){t=i;break b}else{r=255;s=u;m=23;break c}break};case 220:case 221:case 222:case 223:{t=i;break b;break};case 216:case 217:case 218:case 219:{m=30;break b;break};default:{r=q;s=p&255;m=23;break c}}}}while(0);if((m|0)==23){m=0;if((1<<(s&31)&c[18232+((s>>>5|d[19512+r|0]<<3)<<2)>>2]|0)==0){m=25;break}}p=i+2|0;if((p|0)==(f|0)){h=-1;m=76;break}else{b=i;i=p}}do{if((m|0)==25){c[g>>2]=i;h=0;return h|0}else if((m|0)==26){if((f-i|0)<2){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==28){if((f-i|0)<3){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==30){if((f-i|0)<4){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==32){do{if((i-e|0)!=6|j^1){v=11}else{r=k<<24>>24;if((r|0)==120){w=0}else if((r|0)==88){w=1}else{v=11;break}if((a[e+3|0]|0)!=0){v=11;break}r=a[n]|0;if((r|0)==77){x=1}else if((r|0)==109){x=w}else{v=11;break}if((a[e+5|0]|0)!=0){v=11;break}r=a[e+4|0]|0;if((r|0)==108){if((x|0)==0){v=12;break}}else if((r|0)!=76){v=11;break}c[g>>2]=i;h=0;return h|0}}while(0);r=b+4|0;if((r|0)==(f|0)){h=-1;return h|0}s=f;p=r;d:while(1){r=a[p+1|0]|0;l=a[p]|0;e:do{if(r<<24>>24==0){switch(d[o+(l&255)|0]|0){case 15:{q=p+2|0;if((q|0)==(f|0)){h=-1;m=76;break d}if((a[p+3|0]|0)!=0){y=q;break e}if((a[q]|0)==62){m=59;break d}else{y=q;break e}break};case 5:{if((s-p|0)<2){h=-2;m=76;break d}y=p+2|0;break e;break};case 0:case 1:case 8:{m=54;break d;break};case 6:{if((s-p|0)<3){h=-2;m=76;break d}y=p+3|0;break e;break};case 7:{m=52;break e;break};default:{m=60;break e}}}else{switch(r&255|0){case 255:{break};case 220:case 221:case 222:case 223:{m=54;break d;break};case 216:case 217:case 218:case 219:{m=52;break e;break};default:{m=60;break e}}if(((l&255)-254|0)>>>0<2>>>0){m=54;break d}else{m=60}}}while(0);if((m|0)==52){m=0;if((s-p|0)<4){h=-2;m=76;break}y=p+4|0}else if((m|0)==60){m=0;y=p+2|0}if((y|0)==(f|0)){h=-1;m=76;break}else{p=y}}if((m|0)==54){c[g>>2]=p;h=0;return h|0}else if((m|0)==59){c[g>>2]=p+4;h=v;return h|0}else if((m|0)==76){return h|0}}else if((m|0)==61){do{if((i-e|0)!=6|j^1){z=11}else{s=k<<24>>24;if((s|0)==88){A=1}else if((s|0)==120){A=0}else{z=11;break}if((a[e+3|0]|0)!=0){z=11;break}s=a[n]|0;if((s|0)==77){B=1}else if((s|0)==109){B=A}else{z=11;break}if((a[e+5|0]|0)!=0){z=11;break}s=a[e+4|0]|0;if((s|0)==108){if((B|0)==0){z=12;break}}else if((s|0)!=76){z=11;break}c[g>>2]=i;h=0;return h|0}}while(0);p=b+4|0;if((p|0)==(f|0)){h=-1;return h|0}if((a[b+5|0]|0)!=0){t=p;break}if((a[p]|0)!=62){t=p;break}c[g>>2]=b+6;h=z;return h|0}else if((m|0)==76){return h|0}}while(0);c[g>>2]=t;h=0;return h|0}function yf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e]|0;f=a[e+1|0]|0;a:do{if(j<<24>>24==0){l=f&255;m=b+72|0;b:do{switch(d[m+l|0]|0){case 5:{if((k-i|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 6:{if((k-i|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 9:{if((e+2|0)!=(k|0)){break b}c[g>>2]=k;h=-15;return h|0};case 13:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}o=k;p=n;c:while(1){n=a[p]|0;q=a[p+1|0]|0;d:do{if(n<<24>>24==0){r=a[m+(q&255)|0]|0;switch(r&255|0){case 0:case 1:case 8:{s=43;break c;break};case 7:{s=41;break d;break};case 12:case 13:{t=p+2|0;if(r<<24>>24==13){s=45;break c}else{u=t;break d}break};case 5:{if((o-p|0)<2){h=-2;s=175;break c}u=p+2|0;break d;break};case 6:{if((o-p|0)<3){h=-2;s=175;break c}u=p+3|0;break d;break};default:{s=49;break d}}}else{switch(n&255|0){case 220:case 221:case 222:case 223:{s=43;break c;break};case 216:case 217:case 218:case 219:{s=41;break d;break};case 255:{break};default:{s=49;break d}}if(((q&255)-254|0)>>>0<2>>>0){s=43;break c}else{s=49}}}while(0);if((s|0)==41){s=0;if((o-p|0)<4){h=-2;s=175;break}u=p+4|0}else if((s|0)==49){s=0;u=p+2|0}if((u|0)==(k|0)){h=-1;s=175;break}else{p=u}}if((s|0)==43){c[g>>2]=p;h=0;return h|0}else if((s|0)==45){if((t|0)==(k|0)){h=-27;return h|0}c[g>>2]=t;e:do{if((a[t]|0)==0){switch(d[m+(d[p+3|0]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break e}}return h|0}}while(0);h=0;return h|0}else if((s|0)==175){return h|0}break};case 30:{h=Pf(b,e+2|0,k,g)|0;return h|0};case 12:{p=e+2|0;if((p|0)==(k|0)){h=-1;return h|0}o=k;q=p;f:while(1){p=a[q]|0;n=a[q+1|0]|0;g:do{if(p<<24>>24==0){r=a[m+(n&255)|0]|0;switch(r&255|0){case 5:{if((o-q|0)<2){h=-2;s=175;break f}v=q+2|0;break g;break};case 6:{if((o-q|0)<3){h=-2;s=175;break f}v=q+3|0;break g;break};case 12:case 13:{w=q+2|0;if(r<<24>>24==12){s=25;break f}else{v=w;break g}break};case 7:{s=21;break g;break};case 0:case 1:case 8:{s=23;break f;break};default:{s=29;break g}}}else{switch(p&255|0){case 255:{break};case 216:case 217:case 218:case 219:{s=21;break g;break};case 220:case 221:case 222:case 223:{s=23;break f;break};default:{s=29;break g}}if(((n&255)-254|0)>>>0<2>>>0){s=23;break f}else{s=29}}}while(0);if((s|0)==21){s=0;if((o-q|0)<4){h=-2;s=175;break}v=q+4|0}else if((s|0)==29){s=0;v=q+2|0}if((v|0)==(k|0)){h=-1;s=175;break}else{q=v}}if((s|0)==23){c[g>>2]=q;h=0;return h|0}else if((s|0)==25){if((w|0)==(k|0)){h=-27;return h|0}c[g>>2]=w;h:do{if((a[w]|0)==0){switch(d[m+(d[q+3|0]|0)|0]|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;break};default:{break h}}return h|0}}while(0);h=0;return h|0}else if((s|0)==175){return h|0}break};case 7:{s=141;break a;break};case 25:case 26:case 27:{x=19;break a;break};case 29:{y=0;z=l;s=144;break a;break};case 22:case 24:{x=18;break a;break};case 31:{c[g>>2]=e+2;h=23;return h|0};case 2:{q=e+2|0;if((q|0)==(k|0)){h=-1;return h|0}o=a[q]|0;n=a[e+3|0]|0;i:do{if(o<<24>>24==0){switch(d[m+(n&255)|0]|0){case 22:case 24:case 29:case 5:case 6:case 7:{s=73;break i;break};case 16:{break};case 15:{h=Rf(b,e+4|0,k,g)|0;return h|0};default:{s=74;break i}}p=e+4|0;if((p|0)==(k|0)){h=-1;return h|0}do{if((a[p]|0)==0){r=d[m+(d[e+5|0]|0)|0]|0;if((r|0)==20){c[g>>2]=e+6;h=33;return h|0}else if((r|0)==27){h=Qf(b,e+6|0,k,g)|0;return h|0}else if((r|0)==22|(r|0)==24){r=e+6|0;if((r|0)==(k|0)){h=-1;return h|0}else{A=p;B=r}j:while(1){if((a[B]|0)!=0){s=71;break}switch(d[m+(d[A+3|0]|0)|0]|0){case 30:{s=66;break j;break};case 21:case 9:case 10:{break j;break};case 22:case 24:{break};default:{s=71;break j}}r=B+2|0;if((r|0)==(k|0)){h=-1;s=175;break}else{A=B;B=r}}do{if((s|0)==66){r=A+4|0;if((r|0)==(k|0)){h=-1;return h|0}if((a[r]|0)!=0){break}r=d[m+(d[A+5|0]|0)|0]|0;if(!((r|0)==21|(r|0)==9|(r|0)==10|(r|0)==30)){break}c[g>>2]=B;h=0;return h|0}else if((s|0)==71){c[g>>2]=B;h=0;return h|0}else if((s|0)==175){return h|0}}while(0);c[g>>2]=B;h=16;return h|0}else{break}}}while(0);c[g>>2]=p;h=0;return h|0}else{switch(o&255|0){case 223:case 222:case 221:case 220:{s=74;break i;break};case 255:{break};default:{s=73;break i}}if(((n&255)-254|0)>>>0<2>>>0){s=74}else{s=73}}}while(0);if((s|0)==73){c[g>>2]=e;h=29;return h|0}else if((s|0)==74){c[g>>2]=q;h=0;return h|0}break};case 19:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}o=a[n]|0;r=a[e+3|0]|0;k:do{if(o<<24>>24==0){C=r&255;switch(d[m+C|0]|0){case 22:case 24:{break k;break};case 6:{if((k-n|0)<3){h=-2;return h|0}c[g>>2]=n;h=0;return h|0};case 29:{D=0;E=C;s=112;break k;break};case 5:{if((k-n|0)<2){h=-2;return h|0}c[g>>2]=n;h=0;return h|0};case 7:{s=118;break k;break};default:{s=120;break k}}}else{C=o&255;switch(C|0){case 216:case 217:case 218:case 219:{s=118;break k;break};case 255:{F=r&255;if((F-254|0)>>>0<2>>>0){s=120;break k}else{D=255;E=F;s=112;break k}break};case 220:case 221:case 222:case 223:{s=120;break k;break};default:{D=C;E=r&255;s=112;break k}}}}while(0);do{if((s|0)==112){if((c[18232+((d[17968+D|0]<<3|E>>>5)<<2)>>2]&1<<(E&31)|0)!=0){break}c[g>>2]=n;h=0;return h|0}else if((s|0)==118){if((k-n|0)<4){h=-2;return h|0}c[g>>2]=n;h=0;return h|0}else if((s|0)==120){c[g>>2]=n;h=0;return h|0}}while(0);r=e+4|0;if((r|0)==(k|0)){h=-20;return h|0}else{G=n;H=r}l:while(1){r=a[H]|0;o=a[G+3|0]|0;m:do{if(r<<24>>24==0){q=o&255;switch(d[m+q|0]|0){case 29:{I=0;J=q;s=126;break};case 22:case 24:case 25:case 26:case 27:{break};case 7:{s=133;break l;break};case 5:{s=129;break l;break};case 9:case 10:case 21:case 32:case 11:case 30:case 36:{s=135;break l;break};case 6:{s=131;break l;break};default:{s=136;break l}}}else{q=r&255;switch(q|0){case 216:case 217:case 218:case 219:{s=133;break l;break};case 220:case 221:case 222:case 223:{s=136;break l;break};case 255:{C=o&255;if((C-254|0)>>>0<2>>>0){s=136;break l}else{I=255;J=C;s=126;break m}break};default:{I=q;J=o&255;s=126;break m}}}}while(0);if((s|0)==126){s=0;if((c[18232+((d[19512+I|0]<<3|J>>>5)<<2)>>2]&1<<(J&31)|0)==0){s=128;break}}o=H+2|0;if((o|0)==(k|0)){h=-20;s=175;break}else{G=H;H=o}}if((s|0)==128){c[g>>2]=H;h=0;return h|0}else if((s|0)==129){if((k-H|0)<2){h=-2;return h|0}c[g>>2]=H;h=0;return h|0}else if((s|0)==131){if((k-H|0)<3){h=-2;return h|0}c[g>>2]=H;h=0;return h|0}else if((s|0)==133){if((k-H|0)<4){h=-2;return h|0}c[g>>2]=H;h=0;return h|0}else if((s|0)==135){c[g>>2]=H;h=20;return h|0}else if((s|0)==136){c[g>>2]=H;h=0;return h|0}else if((s|0)==175){return h|0}break};case 35:{c[g>>2]=e+2;h=38;return h|0};case 20:{c[g>>2]=e+2;h=25;return h|0};case 32:{n=e+2|0;if((n|0)==(k|0)){h=-24;return h|0}n:do{if((a[n]|0)==0){switch(d[m+(d[e+3|0]|0)|0]|0){case 34:{c[g>>2]=e+4;h=37;return h|0};case 9:case 10:case 21:case 11:case 35:case 36:case 32:{c[g>>2]=n;h=24;return h|0};case 33:{c[g>>2]=e+4;h=36;return h|0};case 15:{c[g>>2]=e+4;h=35;return h|0};default:{break n}}}}while(0);c[g>>2]=n;h=0;return h|0};case 4:{o=e+2|0;if((o|0)==(k|0)){h=-26;return h|0}do{if((a[o]|0)==0){if((a[e+3|0]|0)!=93){break}r=e+4|0;if((r|0)==(k|0)){h=-1;return h|0}if((a[r]|0)!=0){break}if((a[e+5|0]|0)!=62){break}c[g>>2]=e+6;h=34;return h|0}}while(0);c[g>>2]=o;h=26;return h|0};case 21:case 10:{break};case 36:{c[g>>2]=e+2;h=21;return h|0};case 11:{c[g>>2]=e+2;h=17;return h|0};default:{s=148;break a}}}while(0);l=e+2|0;o:do{if((l|0)!=(k|0)){n=e;r=l;while(1){if((a[r]|0)!=0){break}p=d[m+(d[n+3|0]|0)|0]|0;if((p|0)==9){if((n+4|0)==(k|0)){break}}else if(!((p|0)==21|(p|0)==10)){break}p=r+2|0;if((p|0)==(k|0)){break o}else{n=r;r=p}}c[g>>2]=r;h=15;return h|0}}while(0);c[g>>2]=k;h=15;return h|0}else{m=j&255;switch(m|0){case 220:case 221:case 222:case 223:{s=148;break a;break};case 216:case 217:case 218:case 219:{s=141;break a;break};case 255:{l=f&255;if((l-254|0)>>>0<2>>>0){s=148;break a}else{y=255;z=l;s=144;break a}break};default:{y=m;z=f&255;s=144;break a}}}}while(0);do{if((s|0)==141){if((k-i|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((s|0)==144){f=z>>>5;j=1<<(z&31);if((j&c[18232+((f|d[17968+y|0]<<3)<<2)>>2]|0)!=0){x=18;break}if((c[18232+((d[19512+y|0]<<3|f)<<2)>>2]&j|0)==0){s=148}else{x=19}}}while(0);if((s|0)==148){c[g>>2]=e;h=0;return h|0}y=e+2|0;p:do{if((y|0)!=(k|0)){z=b+72|0;i=e;j=y;q:while(1){f=a[j]|0;H=a[i+3|0]|0;r:do{if(f<<24>>24==0){G=H&255;switch(d[z+G|0]|0){case 5:{s=157;break q;break};case 34:{s=164;break q;break};case 33:{s=167;break q;break};case 6:{s=159;break q;break};case 7:{s=161;break q;break};case 11:case 32:case 35:case 36:case 20:case 30:case 21:case 9:case 10:{s=163;break q;break};case 29:{K=0;L=G;s=154;break};case 22:case 24:case 25:case 26:case 27:{break};case 15:{s=170;break q;break};default:{s=173;break q}}}else{G=f&255;switch(G|0){case 216:case 217:case 218:case 219:{s=161;break q;break};case 255:{J=H&255;if((J-254|0)>>>0<2>>>0){s=173;break q}else{K=255;L=J;s=154;break r}break};case 220:case 221:case 222:case 223:{s=173;break q;break};default:{K=G;L=H&255;s=154;break r}}}}while(0);if((s|0)==154){s=0;if((1<<(L&31)&c[18232+((L>>>5|d[19512+K|0]<<3)<<2)>>2]|0)==0){s=156;break}}H=j+2|0;if((H|0)==(k|0)){break p}else{i=j;j=H}}if((s|0)==156){c[g>>2]=j;h=0;return h|0}else if((s|0)==157){if((k-j|0)<2){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((s|0)==159){if((k-j|0)<3){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((s|0)==161){if((k-j|0)<4){h=-2;return h|0}c[g>>2]=j;h=0;return h|0}else if((s|0)==163){c[g>>2]=j;h=x;return h|0}else if((s|0)==164){if((x|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=32;return h|0}}else if((s|0)==167){if((x|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=31;return h|0}}else if((s|0)==170){if((x|0)==19){c[g>>2]=j;h=0;return h|0}else{c[g>>2]=i+4;h=30;return h|0}}else if((s|0)==173){c[g>>2]=j;h=0;return h|0}}}while(0);h=-x|0;return h|0}function zf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;h=i;i=i+8|0;j=h|0;a:do{if((e|0)==(f|0)){k=-4}else{l=e;m=f-l|0;if((m&1|0)==0){n=f}else{o=m&-2;if((o|0)==0){k=-1;break}n=e+o|0}o=a[e]|0;m=a[e+1|0]|0;b:do{if(o<<24>>24==0){p=b+72|0;switch(d[p+(m&255)|0]|0){case 0:case 1:case 8:{q=207;break b;break};case 5:{if((n-l|0)<2){k=-2;break a}r=e+2|0;break b;break};case 10:{c[g>>2]=e+2;k=7;break a;break};case 4:{s=e+2|0;if((s|0)==(n|0)){k=-5;break a}if((a[s]|0)!=0){r=s;break b}if((a[e+3|0]|0)!=93){r=s;break b}t=e+4|0;if((t|0)==(n|0)){k=-5;break a}if((a[t]|0)!=0){r=s;break b}if((a[e+5|0]|0)!=62){r=s;break b}c[g>>2]=t;k=0;break a;break};case 3:{k=Of(b,e+2|0,n,g)|0;break a;break};case 2:{t=e+2|0;if((t|0)==(n|0)){k=-1;break a}s=a[t]|0;u=a[e+3|0]|0;c:do{if(s<<24>>24==0){v=u&255;switch(d[p+v|0]|0){case 16:{w=e+4|0;if((w|0)==(n|0)){k=-1;break a}do{if((a[w]|0)==0){x=d[p+(d[e+5|0]|0)|0]|0;if((x|0)==27){k=Qf(b,e+6|0,n,g)|0;break a}else if((x|0)!=20){break}x=e+6|0;if((n-x|0)<12){k=-1;break a}else{y=x;z=0}while(1){if((a[y]|0)!=0){q=31;break}if((a[y+1|0]|0)!=(a[17816+z|0]|0)){q=31;break}x=z+1|0;A=y+2|0;if((x|0)<6){y=A;z=x}else{q=33;break}}if((q|0)==31){c[g>>2]=y;k=0;break a}else if((q|0)==33){c[g>>2]=A;k=8;break a}}}while(0);c[g>>2]=w;k=0;break a;break};case 7:{q=22;break c;break};case 15:{k=Rf(b,e+4|0,n,g)|0;break a;break};case 17:{x=e+4|0;if((x|0)==(n|0)){k=-1;break a}B=a[x]|0;C=a[e+5|0]|0;d:do{if(B<<24>>24==0){D=C&255;switch(d[p+D|0]|0){case 22:case 24:{break d;break};case 29:{E=0;F=D;q=43;break d;break};case 5:{if((n-x|0)<2){k=-2;break a}c[g>>2]=x;k=0;break a;break};case 6:{if((n-x|0)<3){k=-2;break a}c[g>>2]=x;k=0;break a;break};case 7:{q=49;break d;break};default:{q=51;break d}}}else{D=B&255;switch(D|0){case 255:{G=C&255;if((G-254|0)>>>0<2>>>0){q=51;break d}else{E=255;F=G;q=43;break d}break};case 216:case 217:case 218:case 219:{q=49;break d;break};case 220:case 221:case 222:case 223:{q=51;break d;break};default:{E=D;F=C&255;q=43;break d}}}}while(0);do{if((q|0)==43){if((c[18232+((d[17968+E|0]<<3|F>>>5)<<2)>>2]&1<<(F&31)|0)!=0){break}c[g>>2]=x;k=0;break a}else if((q|0)==49){if((n-x|0)<4){k=-2;break a}c[g>>2]=x;k=0;break a}else if((q|0)==51){c[g>>2]=x;k=0;break a}}while(0);C=e+6|0;if((C|0)==(n|0)){k=-1;break a}else{H=x;I=C}e:while(1){C=a[I]|0;B=a[H+3|0]|0;f:do{if(C<<24>>24==0){w=B&255;switch(d[p+w|0]|0){case 7:{q=64;break e;break};case 11:{q=72;break e;break};case 29:{J=0;K=w;q=57;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{q=60;break e;break};case 6:{q=62;break e;break};case 21:case 9:case 10:{q=66;break e;break};default:{q=73;break e}}}else{w=C&255;switch(w|0){case 216:case 217:case 218:case 219:{q=64;break e;break};case 220:case 221:case 222:case 223:{q=73;break e;break};case 255:{D=B&255;if((D-254|0)>>>0<2>>>0){q=73;break e}else{J=255;K=D;q=57;break f}break};default:{J=w;K=B&255;q=57;break f}}}}while(0);if((q|0)==57){q=0;if((c[18232+((d[19512+J|0]<<3|K>>>5)<<2)>>2]&1<<(K&31)|0)==0){q=59;break}}B=I+2|0;if((B|0)==(n|0)){k=-1;break a}else{H=I;I=B}}if((q|0)==59){c[g>>2]=I;k=0;break a}else if((q|0)==60){if((n-I|0)<2){k=-2;break a}c[g>>2]=I;k=0;break a}else if((q|0)==62){if((n-I|0)<3){k=-2;break a}c[g>>2]=I;k=0;break a}else if((q|0)==64){if((n-I|0)<4){k=-2;break a}c[g>>2]=I;k=0;break a}else if((q|0)==66){x=H+4|0;if((x|0)==(n|0)){k=-1;break a}else{L=x}while(1){if((a[L]|0)!=0){q=70;break}x=d[p+(d[L+1|0]|0)|0]|0;if((x|0)==11){q=69;break}else if(!((x|0)==21|(x|0)==9|(x|0)==10)){q=70;break}x=L+2|0;if((x|0)==(n|0)){k=-1;break a}else{L=x}}if((q|0)==69){c[g>>2]=L+2;k=5;break a}else if((q|0)==70){c[g>>2]=L;k=0;break a}}else if((q|0)==72){c[g>>2]=H+4;k=5;break a}else if((q|0)==73){c[g>>2]=I;k=0;break a}break};case 22:case 24:{break c;break};case 5:{if((n-t|0)<2){k=-2;break a}c[g>>2]=t;k=0;break a;break};case 29:{M=0;N=v;q=16;break c;break};case 6:{if((n-t|0)<3){k=-2;break a}c[g>>2]=t;k=0;break a;break};default:{q=74;break c}}}else{x=s&255;switch(x|0){case 216:case 217:case 218:case 219:{q=22;break c;break};case 220:case 221:case 222:case 223:{q=74;break c;break};case 255:{B=u&255;if((B-254|0)>>>0<2>>>0){q=74;break c}else{M=255;N=B;q=16;break c}break};default:{M=x;N=u&255;q=16;break c}}}}while(0);do{if((q|0)==16){if((c[18232+((d[17968+M|0]<<3|N>>>5)<<2)>>2]&1<<(N&31)|0)!=0){break}c[g>>2]=t;k=0;break a}else if((q|0)==22){if((n-t|0)<4){k=-2;break a}c[g>>2]=t;k=0;break a}else if((q|0)==74){c[g>>2]=t;k=0;break a}}while(0);u=e+4|0;if((u|0)==(n|0)){k=-1;break a}else{O=t;P=u}g:while(1){u=a[P]|0;s=a[O+3|0]|0;h:do{if(u<<24>>24==0){x=s&255;switch(d[p+x|0]|0){case 17:{Q=P;break g;break};case 22:case 24:case 25:case 26:case 27:{break};case 5:{q=83;break g;break};case 29:{R=0;S=x;q=80;break};case 7:{q=87;break g;break};case 6:{q=85;break g;break};case 11:{T=P;q=181;break g;break};case 21:case 9:case 10:{q=89;break g;break};default:{q=187;break g}}}else{x=u&255;switch(x|0){case 255:{B=s&255;if((B-254|0)>>>0<2>>>0){q=187;break g}else{R=255;S=B;q=80;break h}break};case 220:case 221:case 222:case 223:{q=187;break g;break};case 216:case 217:case 218:case 219:{q=87;break g;break};default:{R=x;S=s&255;q=80;break h}}}}while(0);if((q|0)==80){q=0;if((c[18232+((d[19512+R|0]<<3|S>>>5)<<2)>>2]&1<<(S&31)|0)==0){q=82;break}}s=P+2|0;if((s|0)==(n|0)){k=-1;break a}else{O=P;P=s}}i:do{if((q|0)==82){c[g>>2]=P;k=0;break a}else if((q|0)==83){if((n-P|0)<2){k=-2;break a}c[g>>2]=P;k=0;break a}else if((q|0)==85){if((n-P|0)<3){k=-2;break a}c[g>>2]=P;k=0;break a}else if((q|0)==87){if((n-P|0)<4){k=-2;break a}c[g>>2]=P;k=0;break a}else if((q|0)==89){t=O+4|0;if((t|0)==(n|0)){k=-1;break a}else{U=t}j:while(1){V=a[U]|0;W=a[U+1|0]|0;if(V<<24>>24!=0){q=91;break}t=W&255;switch(d[p+t|0]|0){case 17:{Q=U;break i;break};case 22:case 24:{break j;break};case 6:{q=175;break j;break};case 21:case 9:case 10:{break};case 29:{X=0;Y=t;q=95;break j;break};case 7:{q=177;break j;break};case 11:{T=U;q=181;break i;break};case 5:{q=173;break j;break};default:{q=180;break j}}t=U+2|0;if((t|0)==(n|0)){k=-1;break a}else{U=t}}k:do{if((q|0)==91){t=V&255;switch(t|0){case 220:case 221:case 222:case 223:{q=180;break k;break};case 255:{s=W&255;if((s-254|0)>>>0<2>>>0){q=180;break k}else{X=255;Y=s;q=95;break k}break};case 216:case 217:case 218:case 219:{q=177;break k;break};default:{X=t;Y=W&255;q=95;break k}}}else if((q|0)==173){if((n-U|0)<2){k=-2;break a}c[g>>2]=U;k=0;break a}else if((q|0)==175){if((n-U|0)<3){k=-2;break a}c[g>>2]=U;k=0;break a}}while(0);do{if((q|0)==95){if((c[18232+((d[17968+X|0]<<3|Y>>>5)<<2)>>2]&1<<(Y&31)|0)!=0){break}c[g>>2]=U;k=0;break a}else if((q|0)==177){if((n-U|0)<4){k=-2;break a}c[g>>2]=U;k=0;break a}else if((q|0)==180){c[g>>2]=U;k=0;break a}}while(0);t=U+2|0;c[j>>2]=t;if((t|0)==(n|0)){k=-1;break a}s=n;u=t;l:while(1){t=a[u]|0;v=a[u+1|0]|0;m:do{if(t<<24>>24==0){x=v&255;n:do{switch(d[p+x|0]|0){case 21:case 9:case 10:{B=u+2|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{Z=u;_=B}while(1){if((a[_]|0)!=0){q=116;break l}B=d[p+(d[Z+3|0]|0)|0]|0;if((B|0)==14){$=_;break n}else if(!((B|0)==21|(B|0)==10|(B|0)==9)){q=116;break l}B=_+2|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{Z=_;_=B}}break};case 29:{aa=0;ba=x;q=105;break m;break};case 22:case 24:case 25:case 26:case 27:{ca=u;break m;break};case 14:{$=u;break};case 5:{q=107;break l;break};case 6:{q=109;break l;break};case 7:{q=111;break l;break};default:{q=172;break l}}}while(0);x=$+2|0;c[j>>2]=x;if((x|0)==(n|0)){k=-1;break a}else{da=$;ea=x}while(1){if((a[ea]|0)!=0){q=122;break l}fa=d[p+(d[da+3|0]|0)|0]|0;if((fa&254|0)==12){break}if(!((fa|0)==21|(fa|0)==10|(fa|0)==9)){q=122;break l}x=ea+2|0;c[j>>2]=x;if((x|0)==(n|0)){k=-1;break a}else{da=ea;ea=x}}x=ea+2|0;c[j>>2]=x;if((x|0)==(n|0)){k=-1;break a}else{ga=x}while(1){x=a[ga]|0;B=a[ga+1|0]|0;o:do{if(x<<24>>24==0){ha=d[p+(B&255)|0]|0}else{switch(x&255|0){case 220:case 221:case 222:case 223:{ha=8;break o;break};case 255:{if(((B&255)-254|0)>>>0<2>>>0){ha=0;break o}break};case 216:case 217:case 218:case 219:{ha=7;break o;break};default:{}}ha=29}}while(0);if((ha|0)==(fa|0)){break}switch(ha|0){case 6:{if((s-ga|0)<3){k=-2;break a}B=ga+3|0;c[j>>2]=B;ia=B;break};case 5:{if((s-ga|0)<2){k=-2;break a}B=ga+2|0;c[j>>2]=B;ia=B;break};case 7:{if((s-ga|0)<4){k=-2;break a}B=ga+4|0;c[j>>2]=B;ia=B;break};case 0:case 1:case 8:{q=138;break l;break};case 3:{ja=Of(b,ga+2|0,n,j)|0;if((ja|0)<1){q=142;break l}ia=c[j>>2]|0;break};case 2:{q=144;break l;break};default:{B=ga+2|0;c[j>>2]=B;ia=B}}if((ia|0)==(n|0)){k=-1;break a}else{ga=ia}}ka=ga+2|0;c[j>>2]=ka;if((ka|0)==(n|0)){k=-1;break a}if((a[ka]|0)!=0){q=150;break l}switch(d[p+(d[ga+3|0]|0)|0]|0){case 11:{la=ka;q=165;break l;break};case 17:{ma=ka;q=166;break l;break};case 21:case 9:case 10:{break};default:{q=150;break l}}B=ga+4|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{na=ka;oa=B}p:while(1){pa=a[oa]|0;qa=a[na+3|0]|0;if(pa<<24>>24!=0){q=152;break}switch(d[p+(qa&255)|0]|0){case 21:case 9:case 10:{break};case 11:{la=oa;q=165;break l;break};case 17:{ma=oa;q=166;break l;break};case 7:{q=163;break l;break};case 22:case 24:{ca=oa;break m;break};case 5:{q=159;break l;break};case 29:{ra=0;break p;break};case 6:{q=161;break l;break};default:{q=171;break l}}B=oa+2|0;c[j>>2]=B;if((B|0)==(n|0)){k=-1;break a}else{na=oa;oa=B}}q:do{if((q|0)==152){q=0;B=pa&255;switch(B|0){case 216:case 217:case 218:case 219:{q=163;break l;break};case 255:{break};case 220:case 221:case 222:case 223:{q=171;break l;break};default:{ra=B;break q}}if(((qa&255)-254|0)>>>0<2>>>0){q=171;break l}else{ra=255}}}while(0);B=d[oa+1|0]|0;if((1<<(B&31)&c[18232+((B>>>5|d[17968+ra|0]<<3)<<2)>>2]|0)==0){q=157;break l}else{ca=oa}}else{B=t&255;switch(B|0){case 255:{x=v&255;if((x-254|0)>>>0<2>>>0){q=172;break l}else{aa=255;ba=x;q=105;break m}break};case 216:case 217:case 218:case 219:{q=111;break l;break};case 220:case 221:case 222:case 223:{q=172;break l;break};default:{aa=B;ba=v&255;q=105;break m}}}}while(0);if((q|0)==105){q=0;if((c[18232+((d[19512+aa|0]<<3|ba>>>5)<<2)>>2]&1<<(ba&31)|0)==0){q=106;break}else{ca=u}}v=ca+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}else{u=v}}if((q|0)==106){c[g>>2]=u;k=0;break a}else if((q|0)==107){if((s-u|0)<2){k=-2;break a}c[g>>2]=u;k=0;break a}else if((q|0)==109){if((s-u|0)<3){k=-2;break a}c[g>>2]=u;k=0;break a}else if((q|0)==111){if((s-u|0)<4){k=-2;break a}c[g>>2]=u;k=0;break a}else if((q|0)==116){c[g>>2]=_;k=0;break a}else if((q|0)==122){c[g>>2]=ea;k=0;break a}else if((q|0)==138){c[g>>2]=ga;k=0;break a}else if((q|0)==142){if((ja|0)!=0){k=ja;break a}c[g>>2]=c[j>>2];k=0;break a}else if((q|0)==144){c[g>>2]=ga;k=0;break a}else if((q|0)==150){c[g>>2]=ka;k=0;break a}else if((q|0)==157){c[g>>2]=oa;k=0;break a}else if((q|0)==159){if((s-oa|0)<2){k=-2;break a}c[g>>2]=oa;k=0;break a}else if((q|0)==161){if((s-oa|0)<3){k=-2;break a}c[g>>2]=oa;k=0;break a}else if((q|0)==163){if((s-oa|0)<4){k=-2;break a}c[g>>2]=oa;k=0;break a}else if((q|0)==165){c[g>>2]=la+2;k=1;break a}else if((q|0)==166){v=ma+2|0;c[j>>2]=v;if((v|0)==(n|0)){k=-1;break a}do{if((a[v]|0)==0){if((a[ma+3|0]|0)!=62){break}c[g>>2]=ma+4;k=3;break a}}while(0);c[g>>2]=v;k=0;break a}else if((q|0)==171){c[g>>2]=oa;k=0;break a}else if((q|0)==172){c[g>>2]=u;k=0;break a}}else if((q|0)==187){c[g>>2]=P;k=0;break a}}while(0);if((q|0)==181){c[g>>2]=T+2;k=2;break a}s=Q+2|0;if((s|0)==(n|0)){k=-1;break a}do{if((a[s]|0)==0){if((a[Q+3|0]|0)!=62){break}c[g>>2]=Q+4;k=4;break a}}while(0);c[g>>2]=s;k=0;break a;break};case 9:{t=e+2|0;if((t|0)==(n|0)){k=-3;break a}if((a[t]|0)==0){sa=(a[p+(d[e+3|0]|0)|0]|0)==10}else{sa=0}c[g>>2]=sa?e+4|0:t;k=7;break a;break};case 6:{if((n-l|0)<3){k=-2;break a}r=e+3|0;break b;break};case 7:{q=205;break b;break};default:{q=208;break b}}}else{switch(o&255|0){case 255:{break};case 220:case 221:case 222:case 223:{q=207;break b;break};case 216:case 217:case 218:case 219:{q=205;break b;break};default:{q=208;break b}}if(((m&255)-254|0)>>>0<2>>>0){q=207}else{q=208}}}while(0);if((q|0)==205){if((n-l|0)<4){k=-2;break}r=e+4|0}else if((q|0)==207){c[g>>2]=e;k=0;break}else if((q|0)==208){r=e+2|0}r:do{if((r|0)!=(n|0)){m=b+72|0;o=n;t=r;s:while(1){B=a[t]|0;x=a[t+1|0]|0;t:do{if(B<<24>>24==0){switch(d[m+(x&255)|0]|0){case 5:{if((o-t|0)<2){q=216;break s}ta=t+2|0;break t;break};case 3:case 2:case 0:case 1:case 8:case 9:case 10:{q=231;break s;break};case 6:{if((o-t|0)<3){q=219;break s}ta=t+3|0;break t;break};case 7:{q=221;break t;break};case 4:{C=t+2|0;if((C|0)==(n|0)){q=231;break s}if((a[C]|0)!=0){ta=C;break t}if((a[t+3|0]|0)!=93){ta=C;break t}ua=t+4|0;if((ua|0)==(n|0)){q=231;break s}if((a[ua]|0)!=0){ta=C;break t}if((a[t+5|0]|0)==62){q=230;break s}else{ta=C;break t}break};default:{q=232;break t}}}else{switch(B&255|0){case 255:{break};case 220:case 221:case 222:case 223:{q=231;break s;break};case 216:case 217:case 218:case 219:{q=221;break t;break};default:{q=232;break t}}if(((x&255)-254|0)>>>0<2>>>0){q=231;break s}else{q=232}}}while(0);if((q|0)==221){q=0;if((o-t|0)<4){q=222;break}ta=t+4|0}else if((q|0)==232){q=0;ta=t+2|0}if((ta|0)==(n|0)){break r}else{t=ta}}if((q|0)==216){c[g>>2]=t;k=6;break a}else if((q|0)==219){c[g>>2]=t;k=6;break a}else if((q|0)==222){c[g>>2]=t;k=6;break a}else if((q|0)==230){c[g>>2]=ua;k=0;break a}else if((q|0)==231){c[g>>2]=t;k=6;break a}}}while(0);c[g>>2]=n;k=6}}while(0);i=h;return k|0}function Af(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-4;return h|0}i=e;j=f-i|0;do{if((j&1|0)==0){k=f}else{l=j&-2;if((l|0)==0){h=-1;return h|0}else{k=e+l|0;break}}}while(0);j=a[e]|0;f=a[e+1|0]|0;a:do{if(j<<24>>24==0){l=b+72|0;switch(d[l+(f&255)|0]|0){case 6:{if((k-i|0)<3){h=-2;return h|0}else{m=e+3|0;break a}break};case 9:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}if((a[n]|0)==0){o=(a[l+(d[e+3|0]|0)|0]|0)==10}else{o=0}c[g>>2]=o?e+4|0:n;h=7;return h|0};case 5:{if((k-i|0)<2){h=-2;return h|0}else{m=e+2|0;break a}break};case 4:{n=e+2|0;if((n|0)==(k|0)){h=-1;return h|0}if((a[n]|0)!=0){m=n;break a}if((a[e+3|0]|0)!=93){m=n;break a}l=e+4|0;if((l|0)==(k|0)){h=-1;return h|0}if((a[l]|0)!=0){m=n;break a}if((a[e+5|0]|0)!=62){m=n;break a}c[g>>2]=e+6;h=40;return h|0};case 10:{c[g>>2]=e+2;h=7;return h|0};case 7:{p=25;break a;break};case 0:case 1:case 8:{p=27;break a;break};default:{p=28;break a}}}else{switch(j&255|0){case 255:{break};case 216:case 217:case 218:case 219:{p=25;break a;break};case 220:case 221:case 222:case 223:{p=27;break a;break};default:{p=28;break a}}if(((f&255)-254|0)>>>0<2>>>0){p=27}else{p=28}}}while(0);do{if((p|0)==25){if((k-i|0)<4){h=-2;return h|0}else{m=e+4|0;break}}else if((p|0)==27){c[g>>2]=e;h=0;return h|0}else if((p|0)==28){m=e+2|0}}while(0);b:do{if((m|0)!=(k|0)){e=b+72|0;i=k;f=m;c:while(1){j=a[f]|0;o=a[f+1|0]|0;d:do{if(j<<24>>24==0){switch(d[e+(o&255)|0]|0){case 5:{if((i-f|0)<2){p=36;break c}q=f+2|0;break d;break};case 6:{if((i-f|0)<3){p=39;break c}q=f+3|0;break d;break};case 7:{p=41;break d;break};case 0:case 1:case 8:case 9:case 10:case 4:{p=44;break c;break};default:{p=45;break d}}}else{switch(j&255|0){case 255:{break};case 216:case 217:case 218:case 219:{p=41;break d;break};case 220:case 221:case 222:case 223:{p=44;break c;break};default:{p=45;break d}}if(((o&255)-254|0)>>>0<2>>>0){p=44;break c}else{p=45}}}while(0);if((p|0)==41){p=0;if((i-f|0)<4){p=42;break}q=f+4|0}else if((p|0)==45){p=0;q=f+2|0}if((q|0)==(k|0)){break b}else{f=q}}if((p|0)==36){c[g>>2]=f;h=6;return h|0}else if((p|0)==39){c[g>>2]=f;h=6;return h|0}else if((p|0)==42){c[g>>2]=f;h=6;return h|0}else if((p|0)==44){c[g>>2]=f;h=6;return h|0}}}while(0);c[g>>2]=k;h=6;return h|0}function Bf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j+1|0]|0)|0]|0){case 5:{l=j+2|0;break b;break};case 21:{m=22;break a;break};case 2:{m=12;break a;break};case 7:{m=8;break b;break};case 10:{m=13;break a;break};case 9:{m=16;break a;break};case 3:{m=9;break a;break};case 6:{l=j+3|0;break b;break};default:{m=25;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){m=8}else{m=25}}}while(0);if((m|0)==8){m=0;l=j+4|0}else if((m|0)==25){m=0;l=j+2|0}if((l|0)==(f|0)){m=27;break}else{j=l}}if((m|0)==9){if((j|0)==(e|0)){h=Of(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((m|0)==12){c[g>>2]=j;h=0;return h|0}else if((m|0)==13){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((m|0)==16){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}b=e+2|0;if((b|0)==(f|0)){h=-3;return h|0}if((a[b]|0)==0){n=(a[i+(d[e+3|0]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:b;h=7;return h|0}else if((m|0)==22){if((j|0)==(e|0)){c[g>>2]=e+2;h=39;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((m|0)==27){c[g>>2]=f;h=6;return h|0}return 0}function Cf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){k=a[j]|0;b:do{if(k<<24>>24==0){switch(d[i+(d[j+1|0]|0)|0]|0){case 10:{l=15;break a;break};case 5:{m=j+2|0;break b;break};case 6:{m=j+3|0;break b;break};case 30:{l=12;break a;break};case 3:{l=9;break a;break};case 7:{l=8;break b;break};case 9:{l=18;break a;break};default:{l=24;break b}}}else{if(((k&255)-216|0)>>>0<4>>>0){l=8}else{l=24}}}while(0);if((l|0)==8){l=0;m=j+4|0}else if((l|0)==24){l=0;m=j+2|0}if((m|0)==(f|0)){l=26;break}else{j=m}}if((l|0)==9){if((j|0)==(e|0)){h=Of(b,e+2|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==12){if((j|0)==(e|0)){m=Pf(b,e+2|0,f,g)|0;h=(m|0)==22?0:m;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==15){if((j|0)==(e|0)){c[g>>2]=e+2;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==18){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}j=e+2|0;if((j|0)==(f|0)){h=-3;return h|0}if((a[j]|0)==0){n=(a[i+(d[e+3|0]|0)|0]|0)==10}else{n=0}c[g>>2]=n?e+4|0:j;h=7;return h|0}else if((l|0)==26){c[g>>2]=f;h=6;return h|0}return 0}function Df(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=b+72|0;b=e;e=c;a:while(1){c=a[e]|0;g=e+1|0;h=a[g]|0;b:do{if(c<<24>>24==0){switch(d[f+(h&255)|0]|0){case 29:case 22:case 24:case 25:case 26:case 27:{i=12;break};case 5:{j=b;k=e;l=0;i=10;break};case 7:{i=6;break};case 6:{m=b;n=e;o=0;i=8;break};default:{i=15;break a}}}else{switch(c&255|0){case 220:case 221:case 222:case 223:{i=15;break a;break};case 216:case 217:case 218:case 219:{i=6;break b;break};case 255:{break};default:{i=12;break b}}if(((h&255)-254|0)>>>0<2>>>0){i=15;break a}else{i=12}}}while(0);if((i|0)==6){i=0;if(c<<24>>24!=(a[b]|0)){p=0;i=20;break}m=b+1|0;n=g;o=h;i=8}else if((i|0)==12){i=0;if((a[b]|0)!=c<<24>>24){p=0;i=20;break}if((a[b+1|0]|0)==h<<24>>24){q=b;r=e}else{p=0;i=20;break}}if((i|0)==8){i=0;s=n+1|0;if(o<<24>>24!=(a[m]|0)){p=0;i=20;break}j=m+1|0;k=s;l=a[s]|0;i=10}if((i|0)==10){i=0;if(l<<24>>24!=(a[j]|0)){p=0;i=20;break}if((a[k+1|0]|0)==(a[j+1|0]|0)){q=j;r=k}else{p=0;i=20;break}}b=q+2|0;e=r+2|0}if((i|0)==15){r=a[b]|0;e=a[b+1|0]|0;c:do{if(r<<24>>24==0){switch(d[f+(e&255)|0]|0){case 5:case 6:case 7:case 29:case 22:case 24:case 25:case 26:case 27:{p=0;break};default:{break c}}return p|0}else{switch(r&255|0){case 255:{break};case 223:case 222:case 221:case 220:{break c;break};default:{p=0;return p|0}}if(((e&255)-254|0)>>>0<2>>>0){break}else{p=0}return p|0}}while(0);p=1;return p|0}else if((i|0)==20){return p|0}return 0}function Ef(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a[e]|0;f=(c|0)==(d|0);a:do{if(b<<24>>24==0){g=f}else{h=c;i=e;j=b;k=f;while(1){if(k){l=0;m=7;break}if((a[h]|0)!=0){l=0;m=7;break}if((a[h+1|0]|0)!=j<<24>>24){l=0;m=7;break}n=h+2|0;o=i+1|0;p=a[o]|0;q=(n|0)==(d|0);if(p<<24>>24==0){g=q;break a}else{h=n;i=o;j=p;k=q}}if((m|0)==7){return l|0}}}while(0);l=g&1;return l|0}function Ff(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;e=b+72|0;b=c;a:while(1){f=a[b]|0;g=a[b+1|0]|0;b:do{if(f<<24>>24==0){switch(d[e+(g&255)|0]|0|0){case 6:{b=b+3|0;continue a;break};case 29:case 22:case 24:case 25:case 26:case 27:{h=9;break b;break};case 5:{b=b+2|0;continue a;break};case 7:{h=8;break b;break};default:{break a}}}else{switch(f&255|0){case 220:case 221:case 222:case 223:{break a;break};case 255:{break};case 216:case 217:case 218:case 219:{h=8;break b;break};default:{h=9;break b}}if(((g&255)-254|0)>>>0<2>>>0){break a}else{h=9}}}while(0);if((h|0)==8){h=0;b=b+4|0;continue}else if((h|0)==9){h=0;b=b+2|0;continue}}return b-c|0}function Gf(b,c){b=b|0;c=c|0;var e=0,f=0,g=0;if((a[c]|0)!=0){e=c;return e|0}f=b+72|0;b=c;while(1){c=d[f+(d[b+1|0]|0)|0]|0;if(!((c|0)==10|(c|0)==9|(c|0)==21)){e=b;g=3;break}c=b+2|0;if((a[c]|0)==0){b=c}else{e=c;g=3;break}}if((g|0)==3){return e|0}return 0}function Hf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;h=b+72|0;b=0;i=0;j=1;k=e;a:while(1){e=k+2|0;l=a[e]|0;m=k+3|0;n=a[m]|0;b:do{if(l<<24>>24==0){switch(d[h+(n&255)|0]|0){case 6:{if((j|0)!=0){b=b;i=i;j=j;k=m;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=m;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=m;continue a;break};case 5:{if((j|0)!=0){b=b;i=i;j=j;k=e;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e;continue a;break};case 7:{o=12;break b;break};case 9:case 10:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=2;k=e;continue a;break};case 3:{if((i|0)>=(f|0)){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=j;k=e;continue a;break};case 13:{if((j|0)!=2){if((i|0)>=(f|0)){b=13;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=13;i=i;j=2;k=e;continue a}if((b|0)!=13){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=13;i=i+1|0;j=0;k=e;continue a;break};case 11:case 17:{if((j|0)==2){b=b;i=i;j=2;k=e;continue a}else{break a}break};case 12:{if((j|0)!=2){if((i|0)>=(f|0)){b=12;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+4;b=12;i=i;j=2;k=e;continue a}if((b|0)!=12){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=12;i=i+1|0;j=0;k=e;continue a;break};case 21:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}p=g+(i<<4)+12|0;if((a[p]|0)==0){b=b;i=i;j=2;k=e;continue a}do{if((e|0)!=(c[g+(i<<4)+4>>2]|0)&n<<24>>24==32){q=a[k+4|0]|0;r=a[k+5|0]|0;if((q<<24>>24|0)==(-1|0)){if(((r&255)-254|0)>>>0<2>>>0){s=0}else{b=b;i=i;j=2;k=e;continue a}}else if((q<<24>>24|0)==0){if(r<<24>>24==32){break}s=d[h+(r&255)|0]|0}else{b=b;i=i;j=2;k=e;continue a}if((s|0)!=(b|0)){b=b;i=i;j=2;k=e;continue a}}}while(0);a[p]=0;b=b;i=i;j=2;k=e;continue a;break};case 29:case 22:case 24:{o=16;break b;break};default:{b=b;i=i;j=j;k=e;continue a}}}else{switch(l&255|0){case 216:case 217:case 218:case 219:{o=12;break b;break};case 255:{break};case 220:case 221:case 222:case 223:{b=b;i=i;j=j;k=e;continue a;break};default:{o=16;break b}}if(!(((n&255)-254|0)>>>0>1>>>0&(j|0)==0)){b=b;i=i;j=j;k=e;continue a}}}while(0);if((o|0)==12){o=0;do{if((j|0)==0){if((i|0)>=(f|0)){t=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;t=1}else{t=j}}while(0);b=b;i=i;j=t;k=k+4|0;continue}else if((o|0)==16){o=0;if((j|0)!=0){b=b;i=i;j=j;k=e;continue}}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e}return i|0}function If(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;b=c+4|0;d=a[b]|0;a:do{if(d<<24>>24==0){if((a[c+5|0]|0)!=120){e=b;f=0;g=0;h=11;break}i=c+6|0;j=0;while(1){b:do{if((a[i]|0)==0){k=a[i+1|0]|0;if(k<<24>>24==59){l=j;break a}m=k<<24>>24;switch(m|0){case 65:case 66:case 67:case 68:case 69:case 70:{n=(j<<4)-55+m|0;break b;break};case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{n=m-48|j<<4;break b;break};case 97:case 98:case 99:case 100:case 101:case 102:{n=(j<<4)-87+m|0;break b;break};default:{n=j;break b}}}else{n=j}}while(0);if((n|0)>1114111){o=-1;break}else{i=i+2|0;j=n}}return o|0}else{e=b;f=0;g=d;h=11}}while(0);c:do{if((h|0)==11){while(1){h=0;if(g<<24>>24==0){d=a[e+1|0]|0;if(d<<24>>24==59){l=f;break c}p=(d<<24>>24)-48|0}else{p=-49}d=p+(f*10|0)|0;b=e+2|0;if((d|0)>1114111){o=-1;break}e=b;f=d;g=a[b]|0;h=11}return o|0}}while(0);d:do{switch(l>>8|0){case 0:{if((a[20496+l|0]|0)==0){o=-1}else{break d}return o|0};case 255:{if((l&-2|0)==65534){o=-1}else{break d}return o|0};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{o=-1;return o|0};default:{}}}while(0);o=l;return o|0}function Jf(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;b=(d-c|0)/2|0;do{if((b|0)==2){if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=116){break}if((a[c]|0)!=0){break}d=a[c+1|0]|0;if((d|0)==108){e=60;return e|0}else if((d|0)!=103){break}e=62;return e|0}else if((b|0)==3){if((a[c]|0)!=0){break}if((a[c+1|0]|0)!=97){break}if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=109){break}if((a[c+4|0]|0)!=0){break}if((a[c+5|0]|0)==112){e=38}else{break}return e|0}else if((b|0)==4){if((a[c]|0)!=0){break}d=a[c+1|0]|0;if((d|0)==97){if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=112){break}if((a[c+4|0]|0)!=0){break}if((a[c+5|0]|0)!=111){break}if((a[c+6|0]|0)!=0){break}if((a[c+7|0]|0)==115){e=39}else{break}return e|0}else if((d|0)==113){if((a[c+2|0]|0)!=0){break}if((a[c+3|0]|0)!=117){break}if((a[c+4|0]|0)!=0){break}if((a[c+5|0]|0)!=111){break}if((a[c+6|0]|0)!=0){break}if((a[c+7|0]|0)==116){e=34}else{break}return e|0}else{break}}}while(0);e=0;return e|0}function Kf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;if(e>>>0>=f>>>0){return}h=b+72|0;b=g+4|0;i=g|0;g=e;while(1){e=a[g]|0;a:do{if(e<<24>>24==0){switch(d[h+(d[g+1|0]|0)|0]|0){case 9:{c[i>>2]=(c[i>>2]|0)+1;j=g+2|0;if((j|0)==(f|0)){k=f}else{if((a[j]|0)==0){l=(a[h+(d[g+3|0]|0)|0]|0)==10}else{l=0}k=l?g+4|0:j}c[b>>2]=-1;m=k;break a;break};case 5:{m=g+2|0;break a;break};case 10:{c[b>>2]=-1;c[i>>2]=(c[i>>2]|0)+1;m=g+2|0;break a;break};case 7:{n=8;break a;break};case 6:{m=g+3|0;break a;break};default:{n=15;break a}}}else{if(((e&255)-216|0)>>>0<4>>>0){n=8}else{n=15}}}while(0);if((n|0)==8){n=0;m=g+4|0}else if((n|0)==15){n=0;m=g+2|0}c[b>>2]=(c[b>>2]|0)+1;if(m>>>0<f>>>0){g=m}else{break}}return}function Lf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;h=f-2|0;f=e+2|0;if((f|0)==(h|0)){i=1;return i|0}j=b+72|0;b=e;e=f;a:while(1){f=(a[e]|0)==0;k=b+3|0;if(!f){l=11;break}m=a[k]|0;b:do{switch(d[j+(m&255)|0]|0){case 25:case 24:case 27:case 13:case 31:case 32:case 34:case 35:case 17:case 14:case 15:case 9:case 10:case 18:case 16:case 33:case 30:case 19:{break};case 21:{if(m<<24>>24==9){l=7;break a}break};case 26:case 22:{if(m<<24>>24>=0){break b}if(f){l=10}else{l=11;break a}break};default:{l=10}}}while(0);if((l|0)==10){l=0;f=a[k]|0;if(!((f|0)==36|(f|0)==64)){l=11;break}}f=e+2|0;if((f|0)==(h|0)){i=1;l=12;break}else{b=e;e=f}}if((l|0)==7){c[g>>2]=e;i=0;return i|0}else if((l|0)==11){c[g>>2]=e;i=0;return i|0}else if((l|0)==12){return i|0}return 0}function Mf(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=c[d>>2]|0;a:do{if((b|0)!=(e|0)){h=g;i=b;b:while(1){j=a[i+1|0]|0;k=a[i]|0;l=k&255;c:do{switch(l|0){case 216:case 217:case 218:case 219:{m=c[f>>2]|0;if((h-m|0)<4){n=15;break b}o=j&255;p=(l<<2&12|o>>>6)+1|0;c[f>>2]=m+1;a[m]=p>>>2|240;m=c[f>>2]|0;c[f>>2]=m+1;a[m]=o>>>2&15|p<<4&48|128;p=i+2|0;o=a[i+3|0]|0;m=j<<4&48|(o&255)>>>6|a[p]<<2&12|-128;q=c[f>>2]|0;c[f>>2]=q+1;a[q]=m;m=c[f>>2]|0;c[f>>2]=m+1;a[m]=o&63|-128;r=p;break};case 1:case 2:case 3:case 4:case 5:case 6:case 7:{n=8;break};case 0:{if(j<<24>>24<=-1){n=8;break c}p=c[f>>2]|0;if((p|0)==(g|0)){n=6;break b}c[f>>2]=p+1;a[p]=j;r=i;break};default:{p=c[f>>2]|0;if((h-p|0)<3){n=12;break b}c[f>>2]=p+1;a[p]=(k&255)>>>4|-32;p=c[f>>2]|0;c[f>>2]=p+1;a[p]=(j&255)>>>6|k<<2&60|-128;p=c[f>>2]|0;c[f>>2]=p+1;a[p]=j&63|-128;r=i}}}while(0);if((n|0)==8){n=0;l=c[f>>2]|0;if((h-l|0)<2){n=9;break}c[f>>2]=l+1;a[l]=(j&255)>>>6|k<<2|-64;l=c[f>>2]|0;c[f>>2]=l+1;a[l]=j&63|-128;r=i}l=r+2|0;if((l|0)==(e|0)){break a}else{i=l}}if((n|0)==6){c[d>>2]=i;return}else if((n|0)==9){c[d>>2]=i;return}else if((n|0)==12){c[d>>2]=i;return}else if((n|0)==15){c[d>>2]=i;return}}}while(0);c[d>>2]=e;return}function Nf(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0;e=c[f>>2]|0;j=c[h>>2]|0;if((g-e|0)>(i-j|0)){k=g-2|0;l=(a[k]&-8)<<24>>24==-40?k:g}else{l=g}if((e|0)==(l|0)){return}else{m=e;n=j}while(1){if((n|0)==(i|0)){o=7;break}j=(d[m]|0)<<8|(d[m+1|0]|0);c[h>>2]=n+2;b[n>>1]=j;j=(c[f>>2]|0)+2|0;c[f>>2]=j;if((j|0)==(l|0)){o=7;break}m=j;n=c[h>>2]|0}if((o|0)==7){return}}function Of(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e]|0;j=a[e+1|0]|0;a:do{if(i<<24>>24==0){k=j&255;l=b+72|0;switch(d[l+k|0]|0){case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 7:{m=15;break a;break};case 29:{n=0;o=k;m=9;break a;break};case 19:{k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[k]|0)==0){p=a[e+3|0]|0;if(p<<24>>24!=120){if((a[l+(p&255)|0]|0)==25){q=k}else{break}while(1){r=q+2|0;if((r|0)==(f|0)){h=-1;m=54;break}if((a[r]|0)!=0){m=36;break}p=d[l+(d[q+3|0]|0)|0]|0;if((p|0)==18){m=35;break}else if((p|0)==25){q=r}else{m=36;break}}if((m|0)==35){c[g>>2]=q+4;h=10;return h|0}else if((m|0)==36){c[g>>2]=r;h=0;return h|0}else if((m|0)==54){return h|0}}p=e+4|0;if((p|0)==(f|0)){h=-1;return h|0}do{if((a[p]|0)==0){if(((d[l+(d[e+5|0]|0)|0]|0)-24|0)>>>0>=2>>>0){break}s=e+6|0;if((s|0)==(f|0)){h=-1;return h|0}else{t=p;u=s}while(1){if((a[u]|0)!=0){m=29;break}s=d[l+(d[t+3|0]|0)|0]|0;if((s|0)==18){m=28;break}else if(!((s|0)==25|(s|0)==24)){m=29;break}s=u+2|0;if((s|0)==(f|0)){h=-1;m=54;break}else{t=u;u=s}}if((m|0)==28){c[g>>2]=t+4;h=10;return h|0}else if((m|0)==29){c[g>>2]=u;h=0;return h|0}else if((m|0)==54){return h|0}}}while(0);c[g>>2]=p;h=0;return h|0}}while(0);c[g>>2]=k;h=0;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};default:{m=37;break a}}}else{l=i&255;switch(l|0){case 255:{s=j&255;if((s-254|0)>>>0<2>>>0){m=37;break a}else{n=255;o=s;m=9;break a}break};case 216:case 217:case 218:case 219:{m=15;break a;break};case 220:case 221:case 222:case 223:{m=37;break a;break};default:{n=l;o=j&255;m=9;break a}}}}while(0);do{if((m|0)==9){if((1<<(o&31)&c[18232+((o>>>5|d[17968+n|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((m|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==37){c[g>>2]=e;h=0;return h|0}}while(0);n=e+2|0;if((n|0)==(f|0)){h=-1;return h|0}o=b+72|0;b=e;e=n;b:while(1){n=a[e]|0;j=a[b+3|0]|0;c:do{if(n<<24>>24==0){i=j&255;switch(d[o+i|0]|0){case 22:case 24:case 25:case 26:case 27:{break};case 6:{m=48;break b;break};case 5:{m=46;break b;break};case 7:{m=50;break b;break};case 29:{v=0;w=i;m=43;break};case 18:{m=52;break b;break};default:{m=53;break b}}}else{i=n&255;switch(i|0){case 216:case 217:case 218:case 219:{m=50;break b;break};case 220:case 221:case 222:case 223:{m=53;break b;break};case 255:{u=j&255;if((u-254|0)>>>0<2>>>0){m=53;break b}else{v=255;w=u;m=43;break c}break};default:{v=i;w=j&255;m=43;break c}}}}while(0);if((m|0)==43){m=0;if((1<<(w&31)&c[18232+((w>>>5|d[19512+v|0]<<3)<<2)>>2]|0)==0){m=45;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;m=54;break}else{b=e;e=j}}if((m|0)==45){c[g>>2]=e;h=0;return h|0}else if((m|0)==46){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==48){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==50){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==52){c[g>>2]=b+4;h=9;return h|0}else if((m|0)==53){c[g>>2]=e;h=0;return h|0}else if((m|0)==54){return h|0}return 0}function Pf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e]|0;j=a[e+1|0]|0;a:do{if(i<<24>>24==0){k=j&255;switch(d[b+72+k|0]|0|0){case 29:{l=0;m=k;n=9;break a;break};case 7:{n=15;break a;break};case 21:case 10:case 9:case 30:{c[g>>2]=e;h=22;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 22:case 24:{break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};default:{n=18;break a}}}else{k=i&255;switch(k|0){case 216:case 217:case 218:case 219:{n=15;break a;break};case 255:{o=j&255;if((o-254|0)>>>0<2>>>0){n=18;break a}else{l=255;m=o;n=9;break a}break};case 220:case 221:case 222:case 223:{n=18;break a;break};default:{l=k;m=j&255;n=9;break a}}}}while(0);do{if((n|0)==9){if((1<<(m&31)&c[18232+((m>>>5|(d[17968+l|0]|0)<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((n|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==18){c[g>>2]=e;h=0;return h|0}}while(0);l=e+2|0;if((l|0)==(f|0)){h=-1;return h|0}m=b+72|0;b=e;e=l;b:while(1){l=a[e]|0;j=a[b+3|0]|0;c:do{if(l<<24>>24==0){i=j&255;switch(d[m+i|0]|0|0){case 7:{n=31;break b;break};case 18:{n=33;break b;break};case 6:{n=29;break b;break};case 5:{n=27;break b;break};case 29:{p=0;q=i;n=24;break};case 22:case 24:case 25:case 26:case 27:{break};default:{n=34;break b}}}else{i=l&255;switch(i|0){case 216:case 217:case 218:case 219:{n=31;break b;break};case 220:case 221:case 222:case 223:{n=34;break b;break};case 255:{k=j&255;if((k-254|0)>>>0<2>>>0){n=34;break b}else{p=255;q=k;n=24;break c}break};default:{p=i;q=j&255;n=24;break c}}}}while(0);if((n|0)==24){n=0;if((1<<(q&31)&c[18232+((q>>>5|(d[19512+p|0]|0)<<3)<<2)>>2]|0)==0){n=26;break}}j=e+2|0;if((j|0)==(f|0)){h=-1;n=35;break}else{b=e;e=j}}if((n|0)==26){c[g>>2]=e;h=0;return h|0}else if((n|0)==27){if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==29){if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==31){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((n|0)==33){c[g>>2]=b+4;h=28;return h|0}else if((n|0)==34){c[g>>2]=e;h=0;return h|0}else if((n|0)==35){return h|0}return 0}function Qf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-1;return h|0}do{if((a[e]|0)==0){if((a[e+1|0]|0)!=45){break}i=e+2|0;if((i|0)==(f|0)){h=-1;return h|0}j=b+72|0;k=f;l=i;a:while(1){i=a[l]|0;m=a[l+1|0]|0;b:do{if(i<<24>>24==0){switch(d[j+(m&255)|0]|0){case 7:{n=15;break b;break};case 0:case 1:case 8:{n=17;break a;break};case 27:{o=l+2|0;if((o|0)==(f|0)){h=-1;n=28;break a}if((a[o]|0)!=0){p=o;break b}if((a[l+3|0]|0)==45){n=22;break a}else{p=o;break b}break};case 5:{if((k-l|0)<2){h=-2;n=28;break a}p=l+2|0;break b;break};case 6:{if((k-l|0)<3){h=-2;n=28;break a}p=l+3|0;break b;break};default:{n=27;break b}}}else{switch(i&255|0){case 216:case 217:case 218:case 219:{n=15;break b;break};case 220:case 221:case 222:case 223:{n=17;break a;break};case 255:{break};default:{n=27;break b}}if(((m&255)-254|0)>>>0<2>>>0){n=17;break a}else{n=27}}}while(0);if((n|0)==15){n=0;if((k-l|0)<4){h=-2;n=28;break}p=l+4|0}else if((n|0)==27){n=0;p=l+2|0}if((p|0)==(f|0)){h=-1;n=28;break}else{l=p}}if((n|0)==17){c[g>>2]=l;h=0;return h|0}else if((n|0)==22){k=l+4|0;if((k|0)==(f|0)){h=-1;return h|0}do{if((a[k]|0)==0){if((a[l+5|0]|0)!=62){break}c[g>>2]=l+6;h=13;return h|0}}while(0);c[g>>2]=k;h=0;return h|0}else if((n|0)==28){return h|0}}}while(0);c[g>>2]=e;h=0;return h|0}function Rf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;if((e|0)==(f|0)){h=-1;return h|0}i=a[e]|0;j=i<<24>>24==0;k=a[e+1|0]|0;a:do{if(j){l=k&255;switch(d[b+72+l|0]|0){case 22:case 24:{break a;break};case 7:{m=15;break a;break};case 6:{if((f-e|0)<3){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}c[g>>2]=e;h=0;return h|0};case 29:{n=0;o=l;m=9;break a;break};default:{m=17;break a}}}else{l=i&255;switch(l|0){case 216:case 217:case 218:case 219:{m=15;break a;break};case 255:{p=k&255;if((p-254|0)>>>0<2>>>0){m=17;break a}else{n=255;o=p;m=9;break a}break};case 220:case 221:case 222:case 223:{m=17;break a;break};default:{n=l;o=k&255;m=9;break a}}}}while(0);do{if((m|0)==9){if((1<<(o&31)&c[18232+((o>>>5|d[17968+n|0]<<3)<<2)>>2]|0)!=0){break}c[g>>2]=e;h=0;return h|0}else if((m|0)==15){if((f-e|0)<4){h=-2;return h|0}c[g>>2]=e;h=0;return h|0}else if((m|0)==17){c[g>>2]=e;h=0;return h|0}}while(0);n=e+2|0;if((n|0)==(f|0)){h=-1;return h|0}o=b+72|0;b=e;i=n;b:while(1){l=a[i]|0;p=a[b+3|0]|0;c:do{if(l<<24>>24==0){q=p&255;switch(d[o+q|0]|0){case 22:case 24:case 25:case 26:case 27:{break};case 15:{m=61;break b;break};case 6:{m=28;break b;break};case 7:{m=30;break b;break};case 5:{m=26;break b;break};case 29:{r=0;s=q;m=23;break};case 21:case 9:case 10:{m=32;break b;break};default:{t=i;break b}}}else{q=l&255;switch(q|0){case 220:case 221:case 222:case 223:{t=i;break b;break};case 216:case 217:case 218:case 219:{m=30;break b;break};case 255:{u=p&255;if((u-254|0)>>>0<2>>>0){t=i;break b}else{r=255;s=u;m=23;break c}break};default:{r=q;s=p&255;m=23;break c}}}}while(0);if((m|0)==23){m=0;if((1<<(s&31)&c[18232+((s>>>5|d[19512+r|0]<<3)<<2)>>2]|0)==0){m=25;break}}p=i+2|0;if((p|0)==(f|0)){h=-1;m=76;break}else{b=i;i=p}}do{if((m|0)==25){c[g>>2]=i;h=0;return h|0}else if((m|0)==26){if((f-i|0)<2){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==28){if((f-i|0)<3){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==30){if((f-i|0)<4){h=-2;return h|0}c[g>>2]=i;h=0;return h|0}else if((m|0)==32){do{if((i-e|0)!=6|j^1){v=11}else{r=k<<24>>24;if((r|0)==88){w=1}else if((r|0)==120){w=0}else{v=11;break}if((a[n]|0)!=0){v=11;break}r=a[e+3|0]|0;if((r|0)==109){x=w}else if((r|0)==77){x=1}else{v=11;break}if((a[e+4|0]|0)!=0){v=11;break}r=a[e+5|0]|0;if((r|0)==108){if((x|0)==0){v=12;break}}else if((r|0)!=76){v=11;break}c[g>>2]=i;h=0;return h|0}}while(0);r=b+4|0;if((r|0)==(f|0)){h=-1;return h|0}s=f;p=r;d:while(1){r=a[p]|0;l=a[p+1|0]|0;e:do{if(r<<24>>24==0){switch(d[o+(l&255)|0]|0){case 6:{if((s-p|0)<3){h=-2;m=76;break d}y=p+3|0;break e;break};case 0:case 1:case 8:{m=54;break d;break};case 15:{q=p+2|0;if((q|0)==(f|0)){h=-1;m=76;break d}if((a[q]|0)!=0){y=q;break e}if((a[p+3|0]|0)==62){m=59;break d}else{y=q;break e}break};case 7:{m=52;break e;break};case 5:{if((s-p|0)<2){h=-2;m=76;break d}y=p+2|0;break e;break};default:{m=60;break e}}}else{switch(r&255|0){case 255:{break};case 220:case 221:case 222:case 223:{m=54;break d;break};case 216:case 217:case 218:case 219:{m=52;break e;break};default:{m=60;break e}}if(((l&255)-254|0)>>>0<2>>>0){m=54;break d}else{m=60}}}while(0);if((m|0)==52){m=0;if((s-p|0)<4){h=-2;m=76;break}y=p+4|0}else if((m|0)==60){m=0;y=p+2|0}if((y|0)==(f|0)){h=-1;m=76;break}else{p=y}}if((m|0)==54){c[g>>2]=p;h=0;return h|0}else if((m|0)==59){c[g>>2]=p+4;h=v;return h|0}else if((m|0)==76){return h|0}}else if((m|0)==61){do{if((i-e|0)!=6|j^1){z=11}else{s=k<<24>>24;if((s|0)==88){A=1}else if((s|0)==120){A=0}else{z=11;break}if((a[n]|0)!=0){z=11;break}s=a[e+3|0]|0;if((s|0)==77){B=1}else if((s|0)==109){B=A}else{z=11;break}if((a[e+4|0]|0)!=0){z=11;break}s=a[e+5|0]|0;if((s|0)==108){if((B|0)==0){z=12;break}}else if((s|0)!=76){z=11;break}c[g>>2]=i;h=0;return h|0}}while(0);p=b+4|0;if((p|0)==(f|0)){h=-1;return h|0}if((a[p]|0)!=0){t=p;break}if((a[b+5|0]|0)!=62){t=p;break}c[g>>2]=b+6;h=z;return h|0}else if((m|0)==76){return h|0}}while(0);c[g>>2]=t;h=0;return h|0}function Sf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 2:{j=e+1|0;if((j|0)==(f|0)){h=-1;return h|0}switch(d[i+(d[j]|0)|0]|0){case 22:case 24:case 29:case 5:case 6:case 7:{c[g>>2]=e;h=29;return h|0};case 15:{h=rg(b,e+2|0,f,g)|0;return h|0};case 16:{k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}l=d[i+(d[k]|0)|0]|0;if((l|0)==22|(l|0)==24){m=e+3|0;if((m|0)==(f|0)){h=-1;return h|0}else{n=k;o=m}b:while(1){switch(d[i+(d[o]|0)|0]|0){case 21:case 9:case 10:{break b;break};case 30:{p=16;break b;break};case 22:case 24:{break};default:{p=20;break b}}m=o+1|0;if((m|0)==(f|0)){h=-1;p=138;break}else{n=o;o=m}}do{if((p|0)==16){m=n+2|0;if((m|0)==(f|0)){h=-1;return h|0}q=d[i+(d[m]|0)|0]|0;if(!((q|0)==21|(q|0)==9|(q|0)==10|(q|0)==30)){break}c[g>>2]=o;h=0;return h|0}else if((p|0)==20){c[g>>2]=o;h=0;return h|0}else if((p|0)==138){return h|0}}while(0);c[g>>2]=o;h=16;return h|0}else if((l|0)==20){c[g>>2]=e+3;h=33;return h|0}else if((l|0)==27){h=qg(b,e+3|0,f,g)|0;return h|0}else{c[g>>2]=k;h=0;return h|0}break};default:{c[g>>2]=j;h=0;return h|0}}break};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,e)|0)!=0){r=18;s=e+4|0;break a}if((Oc[c[b+336>>2]&255](b,e)|0)!=0){r=19;s=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,e)|0)!=0){r=18;s=e+3|0;break a}if((Oc[c[b+332>>2]&255](b,e)|0)!=0){r=19;s=e+3|0;break a}c[g>>2]=e;h=0;return h|0};case 9:{if((e+1|0)!=(f|0)){p=3;break a}c[g>>2]=f;h=-15;return h|0};case 19:{q=e+1|0;if((q|0)==(f|0)){h=-1;return h|0}c:do{switch(d[i+(d[q]|0)|0]|0){case 6:{if((f-q|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,q)|0)!=0){t=e+4|0;break c}c[g>>2]=q;h=0;return h|0};case 5:{if((f-q|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,q)|0)!=0){t=e+3|0;break c}c[g>>2]=q;h=0;return h|0};case 29:{c[g>>2]=q;h=0;return h|0};case 22:case 24:{t=e+2|0;break};case 7:{if((f-q|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,q)|0)!=0){t=e+5|0;break c}c[g>>2]=q;h=0;return h|0};default:{c[g>>2]=q;h=0;return h|0}}}while(0);if((t|0)==(f|0)){h=-20;return h|0}q=f;j=b+328|0;k=b+332|0;l=b+336|0;m=t;d:while(1){switch(d[i+(d[m]|0)|0]|0){case 9:case 10:case 21:case 32:case 11:case 30:case 36:{p=85;break d;break};case 6:{if((q-m|0)<3){h=-2;p=138;break d}if((Oc[c[k>>2]&255](b,m)|0)==0){p=78;break d}u=m+3|0;break};case 29:{p=70;break d;break};case 22:case 24:case 25:case 26:case 27:{u=m+1|0;break};case 5:{if((q-m|0)<2){h=-2;p=138;break d}if((Oc[c[j>>2]&255](b,m)|0)==0){p=74;break d}u=m+2|0;break};case 7:{if((q-m|0)<4){h=-2;p=138;break d}if((Oc[c[l>>2]&255](b,m)|0)==0){p=82;break d}u=m+4|0;break};default:{p=86;break d}}if((u|0)==(f|0)){h=-20;p=138;break}else{m=u}}if((p|0)==70){c[g>>2]=m;h=0;return h|0}else if((p|0)==74){c[g>>2]=m;h=0;return h|0}else if((p|0)==78){c[g>>2]=m;h=0;return h|0}else if((p|0)==82){c[g>>2]=m;h=0;return h|0}else if((p|0)==85){c[g>>2]=m;h=20;return h|0}else if((p|0)==86){c[g>>2]=m;h=0;return h|0}else if((p|0)==138){return h|0}break};case 21:case 10:{p=3;break};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,e)|0)!=0){r=18;s=e+2|0;break a}if((Oc[c[b+328>>2]&255](b,e)|0)!=0){r=19;s=e+2|0;break a}c[g>>2]=e;h=0;return h|0};case 13:{h=sg(13,b,e+1|0,f,g)|0;return h|0};case 32:{l=e+1|0;if((l|0)==(f|0)){h=-24;return h|0}switch(d[i+(d[l]|0)|0]|0){case 33:{c[g>>2]=e+2;h=36;return h|0};case 9:case 10:case 21:case 11:case 35:case 36:case 32:{c[g>>2]=l;h=24;return h|0};case 15:{c[g>>2]=e+2;h=35;return h|0};case 34:{c[g>>2]=e+2;h=37;return h|0};default:{c[g>>2]=l;h=0;return h|0}}break};case 12:{h=sg(12,b,e+1|0,f,g)|0;return h|0};case 31:{c[g>>2]=e+1;h=23;return h|0};case 36:{c[g>>2]=e+1;h=21;return h|0};case 22:case 24:{r=18;s=e+1|0;break};case 25:case 26:case 27:{r=19;s=e+1|0;break};case 11:{c[g>>2]=e+1;h=17;return h|0};case 30:{h=pg(b,e+1|0,f,g)|0;return h|0};case 35:{c[g>>2]=e+1;h=38;return h|0};case 20:{c[g>>2]=e+1;h=25;return h|0};case 4:{l=e+1|0;if((l|0)==(f|0)){h=-26;return h|0}do{if((a[l]|0)==93){q=e+2|0;if((q|0)==(f|0)){h=-1;return h|0}if((a[q]|0)!=62){break}c[g>>2]=e+3;h=34;return h|0}}while(0);c[g>>2]=l;h=26;return h|0};default:{c[g>>2]=e;h=0;return h|0}}}while(0);if((p|0)==3){u=e+1|0;e:do{if((u|0)!=(f|0)){t=e;o=u;while(1){n=d[i+(d[o]|0)|0]|0;if((n|0)==9){if((t+2|0)==(f|0)){break}}else if(!((n|0)==21|(n|0)==10)){break}n=o+1|0;if((n|0)==(f|0)){break e}else{t=o;o=n}}c[g>>2]=o;h=15;return h|0}}while(0);c[g>>2]=f;h=15;return h|0}f:do{if((s|0)!=(f|0)){u=f;e=b+328|0;t=b+332|0;l=b+336|0;n=s;g:while(1){switch(d[i+(d[n]|0)|0]|0){case 29:{p=111;break g;break};case 22:case 24:case 25:case 26:case 27:{v=n+1|0;break};case 7:{if((u-n|0)<4){h=-2;p=138;break g}if((Oc[c[l>>2]&255](b,n)|0)==0){p=123;break g}v=n+4|0;break};case 33:{p=130;break g;break};case 6:{if((u-n|0)<3){h=-2;p=138;break g}if((Oc[c[t>>2]&255](b,n)|0)==0){p=119;break g}v=n+3|0;break};case 11:case 32:case 35:case 36:case 20:case 30:case 21:case 9:case 10:{p=126;break g;break};case 34:{p=127;break g;break};case 15:{p=133;break g;break};case 5:{if((u-n|0)<2){h=-2;p=138;break g}if((Oc[c[e>>2]&255](b,n)|0)==0){p=115;break g}v=n+2|0;break};default:{p=136;break g}}if((v|0)==(f|0)){break f}else{n=v}}if((p|0)==111){c[g>>2]=n;h=0;return h|0}else if((p|0)==115){c[g>>2]=n;h=0;return h|0}else if((p|0)==119){c[g>>2]=n;h=0;return h|0}else if((p|0)==123){c[g>>2]=n;h=0;return h|0}else if((p|0)==126){c[g>>2]=n;h=r;return h|0}else if((p|0)==127){if((r|0)==19){c[g>>2]=n;h=0;return h|0}else{c[g>>2]=n+1;h=32;return h|0}}else if((p|0)==130){if((r|0)==19){c[g>>2]=n;h=0;return h|0}else{c[g>>2]=n+1;h=31;return h|0}}else if((p|0)==133){if((r|0)==19){c[g>>2]=n;h=0;return h|0}else{c[g>>2]=n+1;h=30;return h|0}}else if((p|0)==136){c[g>>2]=n;h=0;return h|0}else if((p|0)==138){return h|0}}}while(0);h=-r|0;return h|0}function Tf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;h=i;i=i+8|0;j=h|0;a:do{if((e|0)==(f|0)){k=-4}else{l=b+72|0;b:do{switch(d[l+(d[e]|0)|0]|0){case 0:case 1:case 8:{c[g>>2]=e;k=0;break a;break};case 5:{if((f-e|0)<2){k=-2;break a}if((Oc[c[b+352>>2]&255](b,e)|0)==0){m=e+2|0;break b}else{c[g>>2]=e;k=0;break a}break};case 6:{if((f-e|0)<3){k=-2;break a}if((Oc[c[b+356>>2]&255](b,e)|0)==0){m=e+3|0;break b}else{c[g>>2]=e;k=0;break a}break};case 7:{if((f-e|0)<4){k=-2;break a}if((Oc[c[b+360>>2]&255](b,e)|0)==0){m=e+4|0;break b}else{c[g>>2]=e;k=0;break a}break};case 2:{n=e+1|0;if((n|0)==(f|0)){k=-1;break a}c:do{switch(d[l+(d[n]|0)|0]|0){case 16:{o=e+2|0;if((o|0)==(f|0)){k=-1;break a}p=d[l+(d[o]|0)|0]|0;if((p|0)==20){q=e+3|0;if((f-q|0)<6){k=-1;break a}else{r=q;s=0}while(1){if((a[r]|0)!=(a[17816+s|0]|0)){t=26;break}q=s+1|0;u=r+1|0;if((q|0)<6){r=u;s=q}else{t=28;break}}if((t|0)==26){c[g>>2]=r;k=0;break a}else if((t|0)==28){c[g>>2]=u;k=8;break a}}else if((p|0)==27){k=qg(b,e+3|0,f,g)|0;break a}else{c[g>>2]=o;k=0;break a}break};case 7:{if((f-n|0)<4){k=-2;break a}if((Oc[c[b+348>>2]&255](b,n)|0)==0){c[g>>2]=n;k=0;break a}else{v=e+5|0;break c}break};case 22:case 24:{v=e+2|0;break};case 5:{if((f-n|0)<2){k=-2;break a}if((Oc[c[b+340>>2]&255](b,n)|0)==0){c[g>>2]=n;k=0;break a}else{v=e+3|0;break c}break};case 15:{k=rg(b,e+2|0,f,g)|0;break a;break};case 17:{q=e+2|0;if((q|0)==(f|0)){k=-1;break a}d:do{switch(d[l+(d[q]|0)|0]|0){case 29:{c[g>>2]=q;k=0;break a;break};case 22:case 24:{w=e+3|0;break};case 5:{if((f-q|0)<2){k=-2;break a}if((Oc[c[b+340>>2]&255](b,q)|0)==0){c[g>>2]=q;k=0;break a}else{w=e+4|0;break d}break};case 6:{if((f-q|0)<3){k=-2;break a}if((Oc[c[b+344>>2]&255](b,q)|0)==0){c[g>>2]=q;k=0;break a}else{w=e+5|0;break d}break};case 7:{if((f-q|0)<4){k=-2;break a}if((Oc[c[b+348>>2]&255](b,q)|0)==0){c[g>>2]=q;k=0;break a}else{w=e+6|0;break d}break};default:{c[g>>2]=q;k=0;break a}}}while(0);if((w|0)==(f|0)){k=-1;break a}q=f;o=b+328|0;p=b+332|0;x=b+336|0;y=w;e:while(1){switch(d[l+(d[y]|0)|0]|0){case 5:{if((q-y|0)<2){k=-2;break a}if((Oc[c[o>>2]&255](b,y)|0)==0){t=56;break e}z=y+2|0;break};case 6:{if((q-y|0)<3){k=-2;break a}if((Oc[c[p>>2]&255](b,y)|0)==0){t=60;break e}z=y+3|0;break};case 7:{if((q-y|0)<4){k=-2;break a}if((Oc[c[x>>2]&255](b,y)|0)==0){t=64;break e}z=y+4|0;break};case 21:case 9:case 10:{t=51;break e;break};case 29:{t=52;break e;break};case 22:case 24:case 25:case 26:case 27:{z=y+1|0;break};case 11:{t=71;break e;break};default:{t=72;break e}}if((z|0)==(f|0)){k=-1;break a}else{y=z}}if((t|0)==51){x=y+1|0;if((x|0)==(f|0)){k=-1;break a}else{A=y;B=x}while(1){x=d[l+(d[B]|0)|0]|0;if((x|0)==11){t=69;break}else if(!((x|0)==21|(x|0)==9|(x|0)==10)){t=70;break}x=B+1|0;if((x|0)==(f|0)){k=-1;break a}else{A=B;B=x}}if((t|0)==69){c[g>>2]=A+2;k=5;break a}else if((t|0)==70){c[g>>2]=B;k=0;break a}}else if((t|0)==52){c[g>>2]=y;k=0;break a}else if((t|0)==56){c[g>>2]=y;k=0;break a}else if((t|0)==60){c[g>>2]=y;k=0;break a}else if((t|0)==64){c[g>>2]=y;k=0;break a}else if((t|0)==71){c[g>>2]=y+1;k=5;break a}else if((t|0)==72){c[g>>2]=y;k=0;break a}break};case 29:{c[g>>2]=n;k=0;break a;break};case 6:{if((f-n|0)<3){k=-2;break a}if((Oc[c[b+344>>2]&255](b,n)|0)==0){c[g>>2]=n;k=0;break a}else{v=e+4|0;break c}break};default:{c[g>>2]=n;k=0;break a}}}while(0);if((v|0)==(f|0)){k=-1;break a}n=f;x=b+328|0;q=b+332|0;p=b+336|0;o=v;f:while(1){switch(d[l+(d[o]|0)|0]|0){case 21:case 9:case 10:{t=75;break f;break};case 22:case 24:case 25:case 26:case 27:{C=o+1|0;break};case 29:{t=76;break f;break};case 11:{D=o;t=186;break f;break};case 17:{E=o;break f;break};case 5:{if((n-o|0)<2){k=-2;break a}if((Oc[c[x>>2]&255](b,o)|0)==0){t=80;break f}C=o+2|0;break};case 7:{if((n-o|0)<4){k=-2;break a}if((Oc[c[p>>2]&255](b,o)|0)==0){t=88;break f}C=o+4|0;break};case 6:{if((n-o|0)<3){k=-2;break a}if((Oc[c[q>>2]&255](b,o)|0)==0){t=84;break f}C=o+3|0;break};default:{t=191;break f}}if((C|0)==(f|0)){k=-1;break a}else{o=C}}g:do{if((t|0)==75){F=o+1|0;if((F|0)==(f|0)){k=-1;break a}else{G=o;H=F}h:while(1){switch(d[l+(d[H]|0)|0]|0){case 22:case 24:{t=94;break h;break};case 5:{t=95;break h;break};case 7:{t=103;break h;break};case 11:{D=H;t=186;break g;break};case 17:{E=H;break g;break};case 6:{t=99;break h;break};case 21:case 9:case 10:{break};case 29:{t=93;break h;break};default:{t=107;break h}}F=H+1|0;if((F|0)==(f|0)){k=-1;break a}else{G=H;H=F}}do{if((t|0)==93){c[g>>2]=H;k=0;break a}else if((t|0)==94){I=G+2|0}else if((t|0)==95){if((n-H|0)<2){k=-2;break a}if((Oc[c[b+340>>2]&255](b,H)|0)==0){c[g>>2]=H;k=0;break a}else{I=G+3|0;break}}else if((t|0)==99){if((n-H|0)<3){k=-2;break a}if((Oc[c[b+344>>2]&255](b,H)|0)==0){c[g>>2]=H;k=0;break a}else{I=G+4|0;break}}else if((t|0)==103){if((n-H|0)<4){k=-2;break a}if((Oc[c[b+348>>2]&255](b,H)|0)==0){c[g>>2]=H;k=0;break a}else{I=G+5|0;break}}else if((t|0)==107){c[g>>2]=H;k=0;break a}}while(0);c[j>>2]=I;if((I|0)==(f|0)){k=-1;break a}y=b+352|0;F=b+356|0;J=b+360|0;K=b+340|0;L=b+344|0;M=b+348|0;N=I;i:while(1){j:do{switch(d[l+(d[N]|0)|0]|0){case 22:case 24:case 25:case 26:case 27:{O=N+1|0;c[j>>2]=O;P=O;break};case 7:{if((n-N|0)<4){k=-2;break a}O=(Oc[c[p>>2]&255](b,N)|0)==0;Q=c[j>>2]|0;if(O){t=124;break i}O=Q+4|0;c[j>>2]=O;P=O;break};case 21:case 9:case 10:{O=N+1|0;c[j>>2]=O;if((O|0)==(f|0)){k=-1;break a}else{R=O}while(1){O=a[l+(d[R]|0)|0]|0;if(O<<24>>24==14){S=R;t=130;break j}T=O&255;if(!((T|0)==21|(T|0)==10|(T|0)==9)){t=129;break i}T=R+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{R=T}}break};case 29:{t=112;break i;break};case 14:{S=N;t=130;break};case 5:{if((n-N|0)<2){k=-2;break a}T=(Oc[c[x>>2]&255](b,N)|0)==0;U=c[j>>2]|0;if(T){t=116;break i}T=U+2|0;c[j>>2]=T;P=T;break};case 6:{if((n-N|0)<3){k=-2;break a}T=(Oc[c[q>>2]&255](b,N)|0)==0;V=c[j>>2]|0;if(T){t=120;break i}T=V+3|0;c[j>>2]=T;P=T;break};default:{t=185;break i}}}while(0);do{if((t|0)==130){t=0;T=S+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{W=S;X=T}while(1){Y=a[l+(d[X]|0)|0]|0;if((Y&-2)<<24>>24==12){break}T=Y&255;if(!((T|0)==21|(T|0)==10|(T|0)==9)){t=134;break i}T=X+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{W=X;X=T}}T=W+2|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{Z=T}while(1){T=a[l+(d[Z]|0)|0]|0;if(T<<24>>24==Y<<24>>24){break}switch(T&255|0){case 3:{_=og(b,Z+1|0,f,j)|0;if((_|0)<1){t=154;break i}$=c[j>>2]|0;break};case 6:{if((n-Z|0)<3){k=-2;break a}T=(Oc[c[F>>2]&255](b,Z)|0)==0;aa=c[j>>2]|0;if(!T){t=144;break i}T=aa+3|0;c[j>>2]=T;$=T;break};case 2:{t=156;break i;break};case 7:{if((n-Z|0)<4){k=-2;break a}T=(Oc[c[J>>2]&255](b,Z)|0)==0;ba=c[j>>2]|0;if(!T){t=148;break i}T=ba+4|0;c[j>>2]=T;$=T;break};case 0:case 1:case 8:{t=150;break i;break};case 5:{if((n-Z|0)<2){k=-2;break a}T=(Oc[c[y>>2]&255](b,Z)|0)==0;ca=c[j>>2]|0;if(!T){t=140;break i}T=ca+2|0;c[j>>2]=T;$=T;break};default:{T=Z+1|0;c[j>>2]=T;$=T}}if(($|0)==(f|0)){k=-1;break a}else{Z=$}}da=Z+1|0;c[j>>2]=da;if((da|0)==(f|0)){k=-1;break a}switch(d[l+(d[da]|0)|0]|0){case 21:case 9:case 10:{break};case 11:{ea=da;t=179;break i;break};case 17:{fa=da;t=180;break i;break};default:{t=161;break i}}T=Z+2|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{ga=T}k:while(1){switch(d[l+(d[ga]|0)|0]|0){case 11:{ea=ga;t=179;break i;break};case 17:{fa=ga;t=180;break i;break};case 7:{t=174;break k;break};case 21:case 9:case 10:{break};case 6:{t=170;break k;break};case 29:{t=164;break i;break};case 22:case 24:{t=165;break k;break};case 5:{t=166;break k;break};default:{t=184;break i}}T=ga+1|0;c[j>>2]=T;if((T|0)==(f|0)){k=-1;break a}else{ga=T}}if((t|0)==165){t=0;T=ga+1|0;c[j>>2]=T;P=T;break}else if((t|0)==166){t=0;if((n-ga|0)<2){k=-2;break a}T=(Oc[c[K>>2]&255](b,ga)|0)==0;ha=c[j>>2]|0;if(T){t=168;break i}T=ha+2|0;c[j>>2]=T;P=T;break}else if((t|0)==170){t=0;if((n-ga|0)<3){k=-2;break a}T=(Oc[c[L>>2]&255](b,ga)|0)==0;ia=c[j>>2]|0;if(T){t=172;break i}T=ia+3|0;c[j>>2]=T;P=T;break}else if((t|0)==174){t=0;if((n-ga|0)<4){k=-2;break a}T=(Oc[c[M>>2]&255](b,ga)|0)==0;ja=c[j>>2]|0;if(T){t=176;break i}T=ja+4|0;c[j>>2]=T;P=T;break}}}while(0);if((P|0)==(f|0)){k=-1;break a}else{N=P}}if((t|0)==112){c[g>>2]=N;k=0;break a}else if((t|0)==116){c[g>>2]=U;k=0;break a}else if((t|0)==120){c[g>>2]=V;k=0;break a}else if((t|0)==124){c[g>>2]=Q;k=0;break a}else if((t|0)==129){c[g>>2]=R;k=0;break a}else if((t|0)==134){c[g>>2]=X;k=0;break a}else if((t|0)==140){c[g>>2]=ca;k=0;break a}else if((t|0)==144){c[g>>2]=aa;k=0;break a}else if((t|0)==148){c[g>>2]=ba;k=0;break a}else if((t|0)==150){c[g>>2]=Z;k=0;break a}else if((t|0)==154){if((_|0)!=0){k=_;break a}c[g>>2]=c[j>>2];k=0;break a}else if((t|0)==156){c[g>>2]=Z;k=0;break a}else if((t|0)==161){c[g>>2]=da;k=0;break a}else if((t|0)==164){c[g>>2]=ga;k=0;break a}else if((t|0)==168){c[g>>2]=ha;k=0;break a}else if((t|0)==172){c[g>>2]=ia;k=0;break a}else if((t|0)==176){c[g>>2]=ja;k=0;break a}else if((t|0)==179){c[g>>2]=ea+1;k=1;break a}else if((t|0)==180){M=fa+1|0;c[j>>2]=M;if((M|0)==(f|0)){k=-1;break a}if((a[M]|0)==62){c[g>>2]=fa+2;k=3;break a}else{c[g>>2]=M;k=0;break a}}else if((t|0)==184){c[g>>2]=ga;k=0;break a}else if((t|0)==185){c[g>>2]=N;k=0;break a}}else if((t|0)==76){c[g>>2]=o;k=0;break a}else if((t|0)==80){c[g>>2]=o;k=0;break a}else if((t|0)==84){c[g>>2]=o;k=0;break a}else if((t|0)==88){c[g>>2]=o;k=0;break a}else if((t|0)==191){c[g>>2]=o;k=0;break a}}while(0);if((t|0)==186){c[g>>2]=D+1;k=2;break a}o=E+1|0;if((o|0)==(f|0)){k=-1;break a}if((a[o]|0)==62){c[g>>2]=E+2;k=4;break a}else{c[g>>2]=o;k=0;break a}break};case 3:{k=og(b,e+1|0,f,g)|0;break a;break};case 9:{o=e+1|0;if((o|0)==(f|0)){k=-3;break a}c[g>>2]=(a[l+(d[o]|0)|0]|0)==10?e+2|0:o;k=7;break a;break};case 10:{c[g>>2]=e+1;k=7;break a;break};case 4:{o=e+1|0;if((o|0)==(f|0)){k=-5;break a}if((a[o]|0)!=93){m=o;break b}n=e+2|0;if((n|0)==(f|0)){k=-5;break a}if((a[n]|0)!=62){m=o;break b}c[g>>2]=n;k=0;break a;break};default:{m=e+1|0}}}while(0);l:do{if((m|0)!=(f|0)){n=f;o=b+352|0;q=b+356|0;x=b+360|0;p=m;m:while(1){n:do{switch(d[l+(d[p]|0)|0]|0){case 5:{if((n-p|0)<2){t=220;break m}if((Oc[c[o>>2]&255](b,p)|0)!=0){t=220;break m}ka=p+2|0;break};case 3:case 2:case 0:case 1:case 8:case 9:case 10:{t=235;break m;break};case 6:{if((n-p|0)<3){t=224;break m}if((Oc[c[q>>2]&255](b,p)|0)!=0){t=224;break m}ka=p+3|0;break};case 7:{if((n-p|0)<4){t=228;break m}if((Oc[c[x>>2]&255](b,p)|0)!=0){t=228;break m}ka=p+4|0;break};case 4:{M=p+1|0;if((M|0)==(f|0)){t=235;break m}if((a[M]|0)!=93){ka=M;break n}la=p+2|0;if((la|0)==(f|0)){t=235;break m}if((a[la]|0)==62){t=234;break m}else{ka=M}break};default:{ka=p+1|0}}}while(0);if((ka|0)==(f|0)){break l}else{p=ka}}if((t|0)==220){c[g>>2]=p;k=6;break a}else if((t|0)==224){c[g>>2]=p;k=6;break a}else if((t|0)==228){c[g>>2]=p;k=6;break a}else if((t|0)==234){c[g>>2]=la;k=0;break a}else if((t|0)==235){c[g>>2]=p;k=6;break a}}}while(0);c[g>>2]=f;k=6}}while(0);i=h;return k|0}function Uf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 9:{j=e+1|0;if((j|0)==(f|0)){h=-1;return h|0}c[g>>2]=(a[i+(d[j]|0)|0]|0)==10?e+2|0:j;h=7;return h|0};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+352>>2]&255](b,e)|0)==0){k=e+2|0;break a}c[g>>2]=e;h=0;return h|0};case 4:{j=e+1|0;if((j|0)==(f|0)){h=-1;return h|0}if((a[j]|0)!=93){k=j;break a}l=e+2|0;if((l|0)==(f|0)){h=-1;return h|0}if((a[l]|0)!=62){k=j;break a}c[g>>2]=e+3;h=40;return h|0};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+360>>2]&255](b,e)|0)==0){k=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 0:case 1:case 8:{c[g>>2]=e;h=0;return h|0};case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+356>>2]&255](b,e)|0)==0){k=e+3|0;break a}c[g>>2]=e;h=0;return h|0};case 10:{c[g>>2]=e+1;h=7;return h|0};default:{k=e+1|0}}}while(0);b:do{if((k|0)!=(f|0)){e=f;j=b+352|0;l=b+356|0;m=b+360|0;n=k;c:while(1){switch(d[i+(d[n]|0)|0]|0){case 5:{if((e-n|0)<2){o=30;break c}if((Oc[c[j>>2]&255](b,n)|0)!=0){o=30;break c}p=n+2|0;break};case 6:{if((e-n|0)<3){o=34;break c}if((Oc[c[l>>2]&255](b,n)|0)!=0){o=34;break c}p=n+3|0;break};case 7:{if((e-n|0)<4){o=38;break c}if((Oc[c[m>>2]&255](b,n)|0)!=0){o=38;break c}p=n+4|0;break};case 0:case 1:case 8:case 9:case 10:case 4:{o=40;break c;break};default:{p=n+1|0}}if((p|0)==(f|0)){break b}else{n=p}}if((o|0)==30){c[g>>2]=n;h=6;return h|0}else if((o|0)==34){c[g>>2]=n;h=6;return h|0}else if((o|0)==38){c[g>>2]=n;h=6;return h|0}else if((o|0)==40){c[g>>2]=n;h=6;return h|0}}}while(0);c[g>>2]=f;h=6;return h|0}function Vf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0;do{if((e|0)==(f|0)){h=-4}else{i=b+72|0;j=e;a:while(1){switch(d[i+(d[j]|0)|0]|0){case 3:{k=7;break a;break};case 7:{l=j+4|0;break};case 9:{k=14;break a;break};case 2:{k=10;break a;break};case 10:{k=11;break a;break};case 6:{l=j+3|0;break};case 5:{l=j+2|0;break};case 21:{k=18;break a;break};default:{l=j+1|0}}if((l|0)==(f|0)){k=23;break}else{j=l}}if((k|0)==7){if((j|0)==(e|0)){h=og(b,e+1|0,f,g)|0;break}else{c[g>>2]=j;h=6;break}}else if((k|0)==10){c[g>>2]=j;h=0;break}else if((k|0)==11){if((j|0)==(e|0)){c[g>>2]=e+1;h=7;break}else{c[g>>2]=j;h=6;break}}else if((k|0)==14){if((j|0)!=(e|0)){c[g>>2]=j;h=6;break}m=e+1|0;if((m|0)==(f|0)){h=-3;break}c[g>>2]=(a[i+(d[m]|0)|0]|0)==10?e+2|0:m;h=7;break}else if((k|0)==18){if((j|0)==(e|0)){c[g>>2]=e+1;h=39;break}else{c[g>>2]=j;h=6;break}}else if((k|0)==23){c[g>>2]=f;h=6;break}}}while(0);return h|0}function Wf(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0;if((e|0)==(f|0)){h=-4;return h|0}i=b+72|0;j=e;a:while(1){switch(d[i+(d[j]|0)|0]|0){case 6:{k=j+3|0;break};case 30:{l=10;break a;break};case 7:{k=j+4|0;break};case 3:{l=7;break a;break};case 9:{l=16;break a;break};case 10:{l=13;break a;break};case 5:{k=j+2|0;break};default:{k=j+1|0}}if((k|0)==(f|0)){l=22;break}else{j=k}}if((l|0)==7){if((j|0)==(e|0)){h=og(b,e+1|0,f,g)|0;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==10){if((j|0)==(e|0)){k=pg(b,e+1|0,f,g)|0;h=(k|0)==22?0:k;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==13){if((j|0)==(e|0)){c[g>>2]=e+1;h=7;return h|0}else{c[g>>2]=j;h=6;return h|0}}else if((l|0)==16){if((j|0)!=(e|0)){c[g>>2]=j;h=6;return h|0}j=e+1|0;if((j|0)==(f|0)){h=-3;return h|0}c[g>>2]=(a[i+(d[j]|0)|0]|0)==10?e+2|0:j;h=7;return h|0}else if((l|0)==22){c[g>>2]=f;h=6;return h|0}return 0}function Xf(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=b+72|0;b=e;e=c;a:while(1){g=a[e]|0;switch(d[f+(g&255)|0]|0){case 5:{h=b;i=e;j=g;break};case 6:{k=b;l=e;m=g;n=5;break};case 29:case 22:case 24:case 25:case 26:case 27:{if((a[b]|0)==g<<24>>24){b=b+1|0;e=e+1|0;continue a}else{o=0;n=13;break a}break};case 7:{n=3;break};default:{n=10;break a}}if((n|0)==3){n=0;c=e+1|0;if(g<<24>>24!=(a[b]|0)){o=0;n=13;break}k=b+1|0;l=c;m=a[c]|0;n=5}if((n|0)==5){n=0;c=l+1|0;if(m<<24>>24!=(a[k]|0)){o=0;n=13;break}h=k+1|0;i=c;j=a[c]|0}if(j<<24>>24!=(a[h]|0)){o=0;n=13;break}if((a[i+1|0]|0)==(a[h+1|0]|0)){b=h+2|0;e=i+2|0}else{o=0;n=13;break}}if((n|0)==10){i=a[b]|0;if(g<<24>>24==i<<24>>24){o=1;return o|0}switch(d[f+(i&255)|0]|0){case 5:case 6:case 7:case 29:case 22:case 24:case 25:case 26:case 27:{o=0;return o|0};default:{}}o=1;return o|0}else if((n|0)==13){return o|0}return 0}function Yf(b,c,d,e){b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a[e]|0;f=(c|0)==(d|0);a:do{if(b<<24>>24==0){g=f}else{h=c;i=e;j=b;k=f;while(1){if(k){l=0;m=6;break}if((a[h]|0)!=j<<24>>24){l=0;m=6;break}n=h+1|0;o=i+1|0;p=a[o]|0;q=(n|0)==(d|0);if(p<<24>>24==0){g=q;break a}else{h=n;i=o;j=p;k=q}}if((m|0)==6){return l|0}}}while(0);l=g&1;return l|0}function Zf(a,b){a=a|0;b=b|0;var c=0;c=a+72|0;a=b;a:while(1){switch(d[c+(d[a]|0)|0]|0|0){case 29:case 22:case 24:case 25:case 26:case 27:{a=a+1|0;continue a;break};case 6:{a=a+3|0;continue a;break};case 7:{a=a+4|0;continue a;break};case 5:{a=a+2|0;continue a;break};default:{break a}}}return a-b|0}function _f(a,b){a=a|0;b=b|0;var c=0;c=a+72|0;a=b;while(1){b=d[c+(d[a]|0)|0]|0;if(!((b|0)==10|(b|0)==9|(b|0)==21)){break}a=a+1|0}return a|0}function $f(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;h=b+72|0;b=0;i=0;j=1;k=e;a:while(1){e=k+1|0;l=a[e]|0;switch(d[h+(l&255)|0]|0){case 13:{if((j|0)!=2){if((i|0)>=(f|0)){b=13;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+2;b=13;i=i;j=2;k=e;continue a}if((b|0)!=13){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=13;i=i+1|0;j=0;k=e;continue a;break};case 9:case 10:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=2;k=e;continue a;break};case 3:{if((i|0)>=(f|0)){b=b;i=i;j=j;k=e;continue a}a[g+(i<<4)+12|0]=0;b=b;i=i;j=j;k=e;continue a;break};case 6:{do{if((j|0)==0){if((i|0)>=(f|0)){m=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;m=1}else{m=j}}while(0);b=b;i=i;j=m;k=k+3|0;continue a;break};case 12:{if((j|0)!=2){if((i|0)>=(f|0)){b=12;i=i;j=2;k=e;continue a}c[g+(i<<4)+4>>2]=k+2;b=12;i=i;j=2;k=e;continue a}if((b|0)!=12){b=b;i=i;j=2;k=e;continue a}if((i|0)<(f|0)){c[g+(i<<4)+8>>2]=e}b=12;i=i+1|0;j=0;k=e;continue a;break};case 29:case 22:case 24:{if((j|0)!=0){b=b;i=i;j=j;k=e;continue a}if((i|0)>=(f|0)){b=b;i=i;j=1;k=e;continue a}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;b=b;i=i;j=1;k=e;continue a;break};case 11:case 17:{if((j|0)==2){b=b;i=i;j=2;k=e;continue a}else{break a}break};case 5:{do{if((j|0)==0){if((i|0)>=(f|0)){n=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;n=1}else{n=j}}while(0);b=b;i=i;j=n;k=k+2|0;continue a;break};case 21:{if((j|0)==1){b=b;i=i;j=0;k=e;continue a}if(!((j|0)==2&(i|0)<(f|0))){b=b;i=i;j=j;k=e;continue a}o=g+(i<<4)+12|0;if((a[o]|0)==0){b=b;i=i;j=2;k=e;continue a}do{if((e|0)!=(c[g+(i<<4)+4>>2]|0)&l<<24>>24==32){p=a[k+2|0]|0;if(p<<24>>24==32){break}if((d[h+(p&255)|0]|0)!=(b|0)){b=b;i=i;j=2;k=e;continue a}}}while(0);a[o]=0;b=b;i=i;j=2;k=e;continue a;break};case 7:{do{if((j|0)==0){if((i|0)>=(f|0)){q=1;break}c[g+(i<<4)>>2]=e;a[g+(i<<4)+12|0]=1;q=1}else{q=j}}while(0);b=b;i=i;j=q;k=k+4|0;continue a;break};default:{b=b;i=i;j=j;k=e;continue a}}}return i|0}function ag(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;b=c+2|0;d=a[b]|0;a:do{if((d<<24>>24|0)==59){e=0;f=12}else if((d<<24>>24|0)==120){g=c+3|0;h=a[g]|0;if(h<<24>>24==59){e=0;f=12;break}else{i=0;j=g;k=h}while(1){h=k<<24>>24;switch(h|0){case 97:case 98:case 99:case 100:case 101:case 102:{l=(i<<4)-87+h|0;break};case 65:case 66:case 67:case 68:case 69:case 70:{l=(i<<4)-55+h|0;break};case 48:case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{l=h-48|i<<4;break};default:{l=i}}h=j+1|0;if((l|0)>1114111){m=-1;break}g=a[h]|0;if(g<<24>>24==59){n=l;f=11;break a}else{i=l;j=h;k=g}}return m|0}else{g=0;h=b;o=d;while(1){p=(g*10|0)-48+(o<<24>>24)|0;q=h+1|0;if((p|0)>1114111){m=-1;break}r=a[q]|0;if(r<<24>>24==59){n=p;f=11;break a}else{g=p;h=q;o=r}}return m|0}}while(0);b:do{if((f|0)==11){switch(n>>8|0){case 0:{e=n;f=12;break b;break};case 216:case 217:case 218:case 219:case 220:case 221:case 222:case 223:{m=-1;return m|0};case 255:{break};default:{s=n;break b}}if((n&-2|0)==65534){m=-1}else{s=n;break}return m|0}}while(0);do{if((f|0)==12){if((a[20496+e|0]|0)==0){m=-1}else{s=e;break}return m|0}}while(0);m=s;return m|0}function bg(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;b=d-c|0;do{if((b|0)==4){d=a[c]|0;if((d|0)==97){if((a[c+1|0]|0)!=112){break}if((a[c+2|0]|0)!=111){break}if((a[c+3|0]|0)==115){e=39}else{break}return e|0}else if((d|0)==113){if((a[c+1|0]|0)!=117){break}if((a[c+2|0]|0)!=111){break}if((a[c+3|0]|0)==116){e=34}else{break}return e|0}else{break}}else if((b|0)==2){if((a[c+1|0]|0)!=116){break}d=a[c]|0;if((d|0)==108){e=60;return e|0}else if((d|0)!=103){break}e=62;return e|0}else if((b|0)==3){if((a[c]|0)!=97){break}if((a[c+1|0]|0)!=109){break}if((a[c+2|0]|0)==112){e=38}else{break}return e|0}}while(0);e=0;return e|0}function cg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;if(e>>>0>=f>>>0){return}h=b+72|0;b=g+4|0;i=g|0;g=e;while(1){switch(d[h+(d[g]|0)|0]|0){case 6:{j=g+3|0;break};case 9:{c[i>>2]=(c[i>>2]|0)+1;e=g+1|0;if((e|0)==(f|0)){k=f}else{k=(a[h+(d[e]|0)|0]|0)==10?g+2|0:e}c[b>>2]=-1;j=k;break};case 5:{j=g+2|0;break};case 7:{j=g+4|0;break};case 10:{c[b>>2]=-1;c[i>>2]=(c[i>>2]|0)+1;j=g+1|0;break};default:{j=g+1|0}}c[b>>2]=(c[b>>2]|0)+1;if(j>>>0<f>>>0){g=j}else{break}}return}function dg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=f-1|0;f=e+1|0;if((f|0)==(h|0)){i=1;return i|0}e=b+72|0;b=f;a:while(1){f=a[b]|0;switch(d[e+(f&255)|0]|0|0){case 21:{if(f<<24>>24==9){j=6;break a}break};case 25:case 24:case 27:case 13:case 31:case 32:case 34:case 35:case 17:case 14:case 15:case 9:case 10:case 18:case 16:case 33:case 30:case 19:{break};case 26:case 22:{if(f<<24>>24<0){j=8}break};default:{j=8}}if((j|0)==8){j=0;k=f<<24>>24;if(!((k|0)==36|(k|0)==64)){j=9;break}}k=b+1|0;if((k|0)==(h|0)){i=1;j=10;break}else{b=k}}if((j|0)==6){c[g>>2]=b;i=0;return i|0}else if((j|0)==9){c[g>>2]=b;i=0;return i|0}else if((j|0)==10){return i|0}return 0}function eg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=c[d>>2]|0;h=c[f>>2]|0;i=g-h|0;a:do{if((e-b|0)>(i|0)){g=b+i|0;while(1){if(g>>>0<=b>>>0){j=g;break a}k=g-1|0;if((a[k]&-64)<<24>>24==-128){g=k}else{j=g;break}}}else{j=e}}while(0);if((b|0)==(j|0)){l=h;m=b;c[d>>2]=m;c[f>>2]=l;return}else{n=h;o=b}while(1){a[n]=a[o]|0;b=o+1|0;h=n+1|0;if((b|0)==(j|0)){l=h;m=j;break}else{n=h;o=b}}c[d>>2]=m;c[f>>2]=l;return}function fg(e,f,g,h,i){e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;j=c[h>>2]|0;k=c[f>>2]|0;if((k|0)==(g|0)|(j|0)==(i|0)){l=k;m=j;c[f>>2]=l;c[h>>2]=m;return}n=e+72|0;e=k;k=j;while(1){j=a[e]|0;o=j&255;p=d[n+o|0]|0;if((p|0)==7){q=k+2|0;if((q|0)==(i|0)){l=e;m=k;r=10;break}s=((d[e+1|0]|0)<<12&258048|o<<18&1835008|(d[e+2|0]|0)<<6&4032|a[e+3|0]&63)-65536|0;b[k>>1]=s>>>10|55296;b[q>>1]=s&1023|56320;t=k+4|0;u=e+4|0}else if((p|0)==6){b[k>>1]=(d[e+1|0]|0)<<6&4032|(j&255)<<12|a[e+2|0]&63;t=k+2|0;u=e+3|0}else if((p|0)==5){b[k>>1]=a[e+1|0]&63|(j&255)<<6&1984;t=k+2|0;u=e+2|0}else{b[k>>1]=j<<24>>24;t=k+2|0;u=e+1|0}if((u|0)==(g|0)|(t|0)==(i|0)){l=u;m=t;r=10;break}else{e=u;k=t}}if((r|0)==10){c[f>>2]=l;c[h>>2]=m;return}}function gg(a,b){a=a|0;b=b|0;var e=0;a=d[b]|0;e=d[b+1|0]|0;return 1<<(e&31)&c[18232+(((d[19512+(a>>>2&7)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function hg(a,b){a=a|0;b=b|0;var e=0;a=d[b+1|0]|0;e=d[b+2|0]|0;return 1<<(e&31)&c[18232+(((d[19512+(a>>>2&15|(d[b]|0)<<4&240)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function ig(a,b){a=a|0;b=b|0;return 0}function jg(a,b){a=a|0;b=b|0;var e=0;a=d[b]|0;e=d[b+1|0]|0;return 1<<(e&31)&c[18232+(((d[17968+(a>>>2&7)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function kg(a,b){a=a|0;b=b|0;var e=0;a=d[b+1|0]|0;e=d[b+2|0]|0;return 1<<(e&31)&c[18232+(((d[17968+(a>>>2&15|(d[b]|0)<<4&240)|0]|0)<<3|a<<1&6|e>>>5&1)<<2)>>2]|0}function lg(a,b){a=a|0;b=b|0;var c=0;if((d[b]|0)>>>0<194>>>0){c=1;return c|0}a=d[b+1|0]|0;if((a&128|0)==0){c=1;return c|0}c=(a&192|0)==192|0;return c|0}function mg(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;b=a[c+2|0]|0;a:do{if(b<<24>>24>-1){d=1}else{e=a[c]|0;do{if(e<<24>>24==-17){if((a[c+1|0]|0)!=-65){f=5;break}if((b&255)>>>0>189>>>0){d=1;break a}else{g=191}}else{f=5}}while(0);do{if((f|0)==5){if((b&-64)<<24>>24==-64){d=1;break a}h=a[c+1|0]|0;i=h&255;if(e<<24>>24==-32){if((h&255)>>>0<160>>>0){d=1;break a}d=(i&192|0)==192;break a}if((i&128|0)==0){d=1;break a}if(e<<24>>24!=-19){g=i;break}d=(h&255)>>>0>159>>>0;break a}}while(0);d=(g&192|0)==192}}while(0);return d&1|0}function ng(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0;b=d[c+3|0]|0;do{if((b&128|0)==0|(b&192|0)==192){e=1}else{f=d[c+2|0]|0;if((f&128|0)==0|(f&192|0)==192){e=1;break}f=a[c]|0;g=a[c+1|0]|0;h=g&255;if(f<<24>>24==-16){if((g&255)>>>0<144>>>0){e=1;break}e=(h&192|0)==192;break}if((h&128|0)==0){e=1;break}if(f<<24>>24==-12){e=(g&255)>>>0>143>>>0;break}else{e=(h&192|0)==192;break}}}while(0);return e&1|0}function og(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((e|0)==(f|0)){h=-1;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 22:case 24:{j=e+1|0;break};case 29:{c[g>>2]=e;h=0;return h|0};case 19:{k=e+1|0;if((k|0)==(f|0)){h=-1;return h|0}l=a[k]|0;if(l<<24>>24!=120){if((a[i+(l&255)|0]|0)==25){m=k}else{c[g>>2]=k;h=0;return h|0}while(1){n=m+1|0;if((n|0)==(f|0)){h=-1;o=54;break}k=d[i+(d[n]|0)|0]|0;if((k|0)==18){o=33;break}else if((k|0)==25){m=n}else{o=34;break}}if((o|0)==33){c[g>>2]=m+2;h=10;return h|0}else if((o|0)==34){c[g>>2]=n;h=0;return h|0}else if((o|0)==54){return h|0}}k=e+2|0;if((k|0)==(f|0)){h=-1;return h|0}if(((d[i+(d[k]|0)|0]|0)-24|0)>>>0>=2>>>0){c[g>>2]=k;h=0;return h|0}l=e+3|0;if((l|0)==(f|0)){h=-1;return h|0}else{p=k;q=l}while(1){l=d[i+(d[q]|0)|0]|0;if((l|0)==18){o=27;break}else if(!((l|0)==25|(l|0)==24)){o=28;break}l=q+1|0;if((l|0)==(f|0)){h=-1;o=54;break}else{p=q;q=l}}if((o|0)==27){c[g>>2]=p+2;h=10;return h|0}else if((o|0)==28){c[g>>2]=q;h=0;return h|0}else if((o|0)==54){return h|0}break};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,e)|0)!=0){j=e+2|0;break a}c[g>>2]=e;h=0;return h|0};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,e)|0)!=0){j=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,e)|0)!=0){j=e+3|0;break a}c[g>>2]=e;h=0;return h|0};default:{c[g>>2]=e;h=0;return h|0}}}while(0);if((j|0)==(f|0)){h=-1;return h|0}e=f;q=b+328|0;p=b+332|0;n=b+336|0;m=j;b:while(1){switch(d[i+(d[m]|0)|0]|0){case 5:{if((e-m|0)<2){h=-2;o=54;break b}if((Oc[c[q>>2]&255](b,m)|0)==0){o=41;break b}r=m+2|0;break};case 22:case 24:case 25:case 26:case 27:{r=m+1|0;break};case 7:{if((e-m|0)<4){h=-2;o=54;break b}if((Oc[c[n>>2]&255](b,m)|0)==0){o=49;break b}r=m+4|0;break};case 6:{if((e-m|0)<3){h=-2;o=54;break b}if((Oc[c[p>>2]&255](b,m)|0)==0){o=45;break b}r=m+3|0;break};case 29:{o=37;break b;break};case 18:{o=52;break b;break};default:{o=53;break b}}if((r|0)==(f|0)){h=-1;o=54;break}else{m=r}}if((o|0)==37){c[g>>2]=m;h=0;return h|0}else if((o|0)==41){c[g>>2]=m;h=0;return h|0}else if((o|0)==45){c[g>>2]=m;h=0;return h|0}else if((o|0)==49){c[g>>2]=m;h=0;return h|0}else if((o|0)==52){c[g>>2]=m+1;h=9;return h|0}else if((o|0)==53){c[g>>2]=m;h=0;return h|0}else if((o|0)==54){return h|0}return 0}function pg(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((b|0)==(e|0)){g=-1;return g|0}h=a+72|0;a:do{switch(d[h+(d[b]|0)|0]|0|0){case 29:{c[f>>2]=b;g=0;return g|0};case 5:{if((e-b|0)<2){g=-2;return g|0}if((Oc[c[a+340>>2]&255](a,b)|0)!=0){i=b+2|0;break a}c[f>>2]=b;g=0;return g|0};case 6:{if((e-b|0)<3){g=-2;return g|0}if((Oc[c[a+344>>2]&255](a,b)|0)!=0){i=b+3|0;break a}c[f>>2]=b;g=0;return g|0};case 22:case 24:{i=b+1|0;break};case 7:{if((e-b|0)<4){g=-2;return g|0}if((Oc[c[a+348>>2]&255](a,b)|0)!=0){i=b+4|0;break a}c[f>>2]=b;g=0;return g|0};case 21:case 10:case 9:case 30:{c[f>>2]=b;g=22;return g|0};default:{c[f>>2]=b;g=0;return g|0}}}while(0);if((i|0)==(e|0)){g=-1;return g|0}b=e;j=a+328|0;k=a+332|0;l=a+336|0;m=i;b:while(1){switch(d[h+(d[m]|0)|0]|0|0){case 22:case 24:case 25:case 26:case 27:{n=m+1|0;break};case 7:{if((b-m|0)<4){g=-2;o=39;break b}if((Oc[c[l>>2]&255](a,m)|0)==0){o=34;break b}n=m+4|0;break};case 6:{if((b-m|0)<3){g=-2;o=39;break b}if((Oc[c[k>>2]&255](a,m)|0)==0){o=30;break b}n=m+3|0;break};case 29:{o=22;break b;break};case 18:{o=37;break b;break};case 5:{if((b-m|0)<2){g=-2;o=39;break b}if((Oc[c[j>>2]&255](a,m)|0)==0){o=26;break b}n=m+2|0;break};default:{o=38;break b}}if((n|0)==(e|0)){g=-1;o=39;break}else{m=n}}if((o|0)==22){c[f>>2]=m;g=0;return g|0}else if((o|0)==26){c[f>>2]=m;g=0;return g|0}else if((o|0)==30){c[f>>2]=m;g=0;return g|0}else if((o|0)==34){c[f>>2]=m;g=0;return g|0}else if((o|0)==37){c[f>>2]=m+1;g=28;return g|0}else if((o|0)==38){c[f>>2]=m;g=0;return g|0}else if((o|0)==39){return g|0}return 0}function qg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==(f|0)){h=-1;return h|0}if((a[e]|0)!=45){c[g>>2]=e;h=0;return h|0}i=e+1|0;if((i|0)==(f|0)){h=-1;return h|0}e=b+72|0;j=f;k=b+352|0;l=b+356|0;m=b+360|0;n=i;a:while(1){switch(d[e+(d[n]|0)|0]|0){case 0:case 1:case 8:{o=19;break a;break};case 27:{i=n+1|0;if((i|0)==(f|0)){h=-1;o=28;break a}if((a[i]|0)==45){o=23;break a}else{p=i}break};case 6:{if((j-n|0)<3){h=-2;o=28;break a}if((Oc[c[l>>2]&255](b,n)|0)!=0){o=13;break a}p=n+3|0;break};case 7:{if((j-n|0)<4){h=-2;o=28;break a}if((Oc[c[m>>2]&255](b,n)|0)!=0){o=17;break a}p=n+4|0;break};case 5:{if((j-n|0)<2){h=-2;o=28;break a}if((Oc[c[k>>2]&255](b,n)|0)!=0){o=9;break a}p=n+2|0;break};default:{p=n+1|0}}if((p|0)==(f|0)){h=-1;o=28;break}else{n=p}}if((o|0)==9){c[g>>2]=n;h=0;return h|0}else if((o|0)==13){c[g>>2]=n;h=0;return h|0}else if((o|0)==17){c[g>>2]=n;h=0;return h|0}else if((o|0)==19){c[g>>2]=n;h=0;return h|0}else if((o|0)==23){p=n+2|0;if((p|0)==(f|0)){h=-1;return h|0}if((a[p]|0)==62){c[g>>2]=n+3;h=13;return h|0}else{c[g>>2]=p;h=0;return h|0}}else if((o|0)==28){return h|0}return 0}function rg(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;if((e|0)==(f|0)){h=-1;return h|0}i=b+72|0;a:do{switch(d[i+(d[e]|0)|0]|0){case 6:{if((f-e|0)<3){h=-2;return h|0}if((Oc[c[b+344>>2]&255](b,e)|0)!=0){j=e+3|0;break a}c[g>>2]=e;h=0;return h|0};case 7:{if((f-e|0)<4){h=-2;return h|0}if((Oc[c[b+348>>2]&255](b,e)|0)!=0){j=e+4|0;break a}c[g>>2]=e;h=0;return h|0};case 29:{c[g>>2]=e;h=0;return h|0};case 22:case 24:{j=e+1|0;break};case 5:{if((f-e|0)<2){h=-2;return h|0}if((Oc[c[b+340>>2]&255](b,e)|0)!=0){j=e+2|0;break a}c[g>>2]=e;h=0;return h|0};default:{c[g>>2]=e;h=0;return h|0}}}while(0);if((j|0)==(f|0)){h=-1;return h|0}k=f;l=b+328|0;m=b+332|0;n=b+336|0;o=j;b:while(1){switch(d[i+(d[o]|0)|0]|0){case 29:{p=21;break b;break};case 15:{p=65;break b;break};case 21:case 9:case 10:{p=36;break b;break};case 7:{if((k-o|0)<4){h=-2;p=77;break b}if((Oc[c[n>>2]&255](b,o)|0)==0){p=33;break b}q=o+4|0;break};case 5:{if((k-o|0)<2){h=-2;p=77;break b}if((Oc[c[l>>2]&255](b,o)|0)==0){p=25;break b}q=o+2|0;break};case 22:case 24:case 25:case 26:case 27:{q=o+1|0;break};case 6:{if((k-o|0)<3){h=-2;p=77;break b}if((Oc[c[m>>2]&255](b,o)|0)==0){p=29;break b}q=o+3|0;break};default:{r=o;break b}}if((q|0)==(f|0)){h=-1;p=77;break}else{o=q}}do{if((p|0)==21){c[g>>2]=o;h=0;return h|0}else if((p|0)==25){c[g>>2]=o;h=0;return h|0}else if((p|0)==29){c[g>>2]=o;h=0;return h|0}else if((p|0)==33){c[g>>2]=o;h=0;return h|0}else if((p|0)==36){do{if((o-e|0)==3){q=a[e]|0;if((q|0)==88){s=1}else if((q|0)==120){s=0}else{t=11;break}q=a[e+1|0]|0;if((q|0)==109){u=s}else if((q|0)==77){u=1}else{t=11;break}q=a[e+2|0]|0;if((q|0)==108){if((u|0)==0){t=12;break}}else if((q|0)!=76){t=11;break}c[g>>2]=o;h=0;return h|0}else{t=11}}while(0);q=o+1|0;if((q|0)==(f|0)){h=-1;return h|0}m=b+352|0;l=b+356|0;n=b+360|0;j=q;c:while(1){switch(d[i+(d[j]|0)|0]|0){case 0:case 1:case 8:{p=59;break c;break};case 7:{if((k-j|0)<4){h=-2;p=77;break c}if((Oc[c[n>>2]&255](b,j)|0)!=0){p=57;break c}v=j+4|0;break};case 5:{if((k-j|0)<2){h=-2;p=77;break c}if((Oc[c[m>>2]&255](b,j)|0)!=0){p=49;break c}v=j+2|0;break};case 15:{q=j+1|0;if((q|0)==(f|0)){h=-1;p=77;break c}if((a[q]|0)==62){p=63;break c}else{v=q}break};case 6:{if((k-j|0)<3){h=-2;p=77;break c}if((Oc[c[l>>2]&255](b,j)|0)!=0){p=53;break c}v=j+3|0;break};default:{v=j+1|0}}if((v|0)==(f|0)){h=-1;p=77;break}else{j=v}}if((p|0)==49){c[g>>2]=j;h=0;return h|0}else if((p|0)==53){c[g>>2]=j;h=0;return h|0}else if((p|0)==57){c[g>>2]=j;h=0;return h|0}else if((p|0)==59){c[g>>2]=j;h=0;return h|0}else if((p|0)==63){c[g>>2]=j+2;h=t;return h|0}else if((p|0)==77){return h|0}}else if((p|0)==65){do{if((o-e|0)==3){l=a[e]|0;if((l|0)==120){w=0}else if((l|0)==88){w=1}else{x=11;break}l=a[e+1|0]|0;if((l|0)==77){y=1}else if((l|0)==109){y=w}else{x=11;break}l=a[e+2|0]|0;if((l|0)==108){if((y|0)==0){x=12;break}}else if((l|0)!=76){x=11;break}c[g>>2]=o;h=0;return h|0}else{x=11}}while(0);j=o+1|0;if((j|0)==(f|0)){h=-1;return h|0}if((a[j]|0)!=62){r=j;break}c[g>>2]=o+2;h=x;return h|0}else if((p|0)==77){return h|0}}while(0);c[g>>2]=r;h=0;return h|0}function sg(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((e|0)==(f|0)){h=-1;return h|0}i=b+72|0;j=f;k=b+352|0;l=b+356|0;m=b+360|0;n=e;a:while(1){e=d[i+(d[n]|0)|0]|0;switch(e|0){case 0:case 1:case 8:{o=16;break a;break};case 6:{if((j-n|0)<3){h=-2;o=23;break a}if((Oc[c[l>>2]&255](b,n)|0)!=0){o=10;break a}p=n+3|0;break};case 12:case 13:{q=n+1|0;if((e|0)==(a|0)){o=18;break a}else{p=q}break};case 7:{if((j-n|0)<4){h=-2;o=23;break a}if((Oc[c[m>>2]&255](b,n)|0)!=0){o=14;break a}p=n+4|0;break};case 5:{if((j-n|0)<2){h=-2;o=23;break a}if((Oc[c[k>>2]&255](b,n)|0)!=0){o=6;break a}p=n+2|0;break};default:{p=n+1|0}}if((p|0)==(f|0)){h=-1;o=23;break}else{n=p}}if((o|0)==6){c[g>>2]=n;h=0;return h|0}else if((o|0)==10){c[g>>2]=n;h=0;return h|0}else if((o|0)==14){c[g>>2]=n;h=0;return h|0}else if((o|0)==16){c[g>>2]=n;h=0;return h|0}else if((o|0)==18){if((q|0)==(f|0)){h=-27;return h|0}c[g>>2]=q;switch(d[i+(d[q]|0)|0]|0|0){case 21:case 9:case 10:case 11:case 30:case 20:{h=27;return h|0};default:{}}h=0;return h|0}else if((o|0)==23){return h|0}return 0}function tg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0;b=c[d>>2]|0;if((b|0)==(e|0)){return}else{h=b}while(1){if((c[f>>2]|0)==(g|0)){i=4;break}c[d>>2]=h+1;b=a[h]|0;j=c[f>>2]|0;c[f>>2]=j+1;a[j]=b;b=c[d>>2]|0;if((b|0)==(e|0)){i=4;break}else{h=b}}if((i|0)==4){return}}function ug(a,e,f,g,h){a=a|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0;a=c[e>>2]|0;if((a|0)==(f|0)){return}else{i=a}while(1){if((c[g>>2]|0)==(h|0)){j=4;break}c[e>>2]=i+1;a=d[i]|0;k=c[g>>2]|0;c[g>>2]=k+2;b[k>>1]=a;a=c[e>>2]|0;if((a|0)==(f|0)){j=4;break}else{i=a}}if((j|0)==4){return}}function vg(b,d,e,f,g,h,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k=i;i=i+120|0;l=k|0;m=k+8|0;n=k+16|0;o=k+24|0;p=k+32|0;q=k+40|0;r=k+48|0;s=k+56|0;t=k+64|0;u=k+72|0;v=k+80|0;w=k+88|0;x=k+96|0;y=k+104|0;z=k+112|0;if((d|0)==(e|0)){c[f>>2]=0;A=1;i=k;return A|0}B=y|0;c[x>>2]=d;c[z>>2]=B;C=b+56|0;D=y+1|0;Bc[c[C>>2]&63](b,x,e,z,D);do{if((c[z>>2]|0)!=(B|0)){x=a[B]|0;if(!((x|0)==32|(x|0)==13|(x|0)==10|(x|0)==9)){break}x=b+64|0;y=d+(c[x>>2]|0)|0;c[t>>2]=y;c[u>>2]=B;Bc[c[C>>2]&63](b,t,e,u,D);a:do{if((c[u>>2]|0)==(B|0)){E=y}else{F=y;while(1){G=a[B]|0;if(!((G|0)==32|(G|0)==13|(G|0)==10|(G|0)==9)){E=F;break a}G=F+(c[x>>2]|0)|0;c[t>>2]=G;c[u>>2]=B;Bc[c[C>>2]&63](b,t,e,u,D);if((c[u>>2]|0)==(B|0)){E=G;break}else{F=G}}}}while(0);if((E|0)==(e|0)){c[f>>2]=0;A=1;i=k;return A|0}c[f>>2]=E;c[p>>2]=E;c[q>>2]=B;Bc[c[C>>2]&63](b,p,e,q,D);b:do{if((c[q>>2]|0)==(B|0)){H=E}else{y=E;c:while(1){switch(a[B]|0){case-1:{H=y;break b;break};case 32:case 13:case 10:case 9:{I=15;break c;break};case 61:{I=14;break c;break};default:{}}F=y+(c[x>>2]|0)|0;c[p>>2]=F;c[q>>2]=B;Bc[c[C>>2]&63](b,p,e,q,D);if((c[q>>2]|0)==(B|0)){H=F;break b}else{y=F}}d:do{if((I|0)==14){c[g>>2]=y;J=y}else if((I|0)==15){c[g>>2]=y;F=y+(c[x>>2]|0)|0;c[l>>2]=F;c[m>>2]=B;Bc[c[C>>2]&63](b,l,e,m,D);e:do{if((c[m>>2]|0)==(B|0)){K=F}else{G=F;while(1){switch(a[B]|0){case 61:{J=G;break d;break};case 32:case 13:case 10:case 9:{break};default:{K=G;break e}}L=G+(c[x>>2]|0)|0;c[l>>2]=L;c[m>>2]=B;Bc[c[C>>2]&63](b,l,e,m,D);if((c[m>>2]|0)==(B|0)){K=L;break e}else{G=L}}}}while(0);c[j>>2]=K;A=0;i=k;return A|0}}while(0);if((J|0)==(c[f>>2]|0)){c[j>>2]=J;A=0;i=k;return A|0}y=J+(c[x>>2]|0)|0;c[n>>2]=y;c[o>>2]=B;Bc[c[C>>2]&63](b,n,e,o,D);if((c[o>>2]|0)==(B|0)){M=-1}else{M=a[B]|0}F=M;G=y;f:while(1){switch(F|0){case 39:case 34:{break f;break};case 32:case 13:case 10:case 9:{break};default:{I=28;break f}}y=G+(c[x>>2]|0)|0;c[r>>2]=y;c[s>>2]=B;Bc[c[C>>2]&63](b,r,e,s,D);if((c[s>>2]|0)==(B|0)){F=-1;G=y;continue}F=a[B]|0;G=y}if((I|0)==28){c[j>>2]=G;A=0;i=k;return A|0}y=G+(c[x>>2]|0)|0;c[h>>2]=y;L=y;while(1){c[v>>2]=L;c[w>>2]=B;Bc[c[C>>2]&63](b,v,e,w,D);if((c[w>>2]|0)==(B|0)){N=-1}else{N=a[B]|0}if((N|0)==(F|0)){I=37;break}if((N-65|0)>>>0>25>>>0&(N-97|0)>>>0>25>>>0&(N-48|0)>>>0>9>>>0){if(!((N|0)==95|(N|0)==46|(N|0)==45)){I=35;break}}L=L+(c[x>>2]|0)|0}if((I|0)==35){c[j>>2]=L;A=0;i=k;return A|0}else if((I|0)==37){c[j>>2]=L+(c[x>>2]|0);A=1;i=k;return A|0}}}while(0);c[j>>2]=H;A=0;i=k;return A|0}}while(0);c[j>>2]=d;A=0;i=k;return A|0}function wg(b,e,f,g,h){b=b|0;e=e|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((f|0)==(g|0)){i=-4;return i|0}j=c[b+72>>2]|0;k=f+1|0;a:do{if((k|0)==(g|0)){if((e|0)!=1){i=-1;return i|0}l=a[b+69|0]|0;if(((l<<24>>24)-3|0)>>>0<3>>>0){i=-1;return i|0}switch(d[f]|0){case 254:case 255:case 239:{break};case 0:case 60:{i=-1;return i|0};default:{break a}}if(l<<24>>24==0){break}else{i=-1}return i|0}else{l=a[f]|0;m=a[k]|0;n=(l&255)<<8|m&255;if((n|0)==61371){if((e|0)==1){o=a[b+69|0]|0;if((o&-5)<<24>>24==0|o<<24>>24==5|o<<24>>24==3){break}}o=f+2|0;if((o|0)==(g|0)){i=-1;return i|0}if((a[o]|0)!=-65){break}c[h>>2]=f+3;c[j>>2]=600;i=14;return i|0}else if((n|0)==65534){if((a[b+69|0]|0)==0&(e|0)==1){break}c[h>>2]=f+2;c[j>>2]=20048;i=14;return i|0}else if((n|0)==65279){if((a[b+69|0]|0)==0&(e|0)==1){break}c[h>>2]=f+2;c[j>>2]=71352;i=14;return i|0}else if((n|0)==15360){if(((a[b+69|0]|0)-3&255)>>>0<2>>>0&(e|0)==1){break}c[j>>2]=20048;i=Sc[c[20048+(e<<2)>>2]&127](20048,f,g,h)|0;return i|0}else{if(l<<24>>24!=0){if(m<<24>>24!=0|(e|0)==1){break}c[j>>2]=20048;i=Sc[c[20048+(e<<2)>>2]&127](20048,f,g,h)|0;return i|0}if((e|0)==1){if((a[b+69|0]|0)==5){break}}c[j>>2]=71352;i=Sc[c[71352+(e<<2)>>2]&127](71352,f,g,h)|0;return i|0}}}while(0);k=c[28632+(a[b+69|0]<<2)>>2]|0;c[j>>2]=k;i=Sc[c[k+(e<<2)>>2]&127](k,f,g,h)|0;return i|0}function xg(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=g;h=c[d>>2]|0;if((h|0)==(e|0)){return}else{i=h}while(1){h=a[i]|0;j=c[f>>2]|0;if(h<<24>>24>-1){if((j|0)==(g|0)){k=8;break}c[d>>2]=i+1;l=a[i]|0;m=c[f>>2]|0;c[f>>2]=m+1;a[m]=l;n=c[d>>2]|0}else{if((b-j|0)<2){k=8;break}c[f>>2]=j+1;a[j]=(h&255)>>>6|-64;j=c[f>>2]|0;c[f>>2]=j+1;a[j]=h&63|-128;h=(c[d>>2]|0)+1|0;c[d>>2]=h;n=h}if((n|0)==(e|0)){k=8;break}else{i=n}}if((k|0)==8){return}}function yg(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=a>>>16;f=a&65535;if((c|0)==1){a=(d[b]|0)+f|0;g=a>>>0>65520>>>0?a-65521|0:a;a=g+e|0;h=(a>>>0>65520>>>0?a+15|0:a)<<16|g;return h|0}if((b|0)==0){h=1;return h|0}if(c>>>0<16>>>0){if((c|0)==0){i=f;j=e}else{g=f;a=b;k=c;l=e;while(1){m=k-1|0;n=(d[a]|0)+g|0;o=n+l|0;if((m|0)==0){i=n;j=o;break}else{g=n;a=a+1|0;k=m;l=o}}}h=((j>>>0)%65521|0)<<16|(i>>>0>65520>>>0?i-65521|0:i);return h|0}do{if(c>>>0>5551>>>0){i=f;j=b;l=c;k=e;do{l=l-5552|0;a=347;g=k;o=j;m=i;while(1){n=(d[o]|0)+m|0;p=n+(d[o+1|0]|0)|0;q=p+(d[o+2|0]|0)|0;r=q+(d[o+3|0]|0)|0;s=r+(d[o+4|0]|0)|0;t=s+(d[o+5|0]|0)|0;u=t+(d[o+6|0]|0)|0;v=u+(d[o+7|0]|0)|0;w=v+(d[o+8|0]|0)|0;x=w+(d[o+9|0]|0)|0;y=x+(d[o+10|0]|0)|0;z=y+(d[o+11|0]|0)|0;A=z+(d[o+12|0]|0)|0;B=A+(d[o+13|0]|0)|0;C=B+(d[o+14|0]|0)|0;D=C+(d[o+15|0]|0)|0;E=n+g+p+q+r+s+t+u+v+w+x+y+z+A+B+C+D|0;C=a-1|0;if((C|0)==0){break}else{a=C;g=E;o=o+16|0;m=D}}j=j+5552|0;i=(D>>>0)%65521|0;k=(E>>>0)%65521|0;}while(l>>>0>5551>>>0);if((l|0)==0){F=k;G=i;break}if(l>>>0>15>>>0){H=i;I=j;J=l;K=k;L=15}else{M=i;N=j;O=l;P=k;L=16}}else{H=f;I=b;J=c;K=e;L=15}}while(0);if((L|0)==15){while(1){L=0;Q=J-16|0;e=(d[I]|0)+H|0;c=e+(d[I+1|0]|0)|0;b=c+(d[I+2|0]|0)|0;f=b+(d[I+3|0]|0)|0;E=f+(d[I+4|0]|0)|0;D=E+(d[I+5|0]|0)|0;m=D+(d[I+6|0]|0)|0;o=m+(d[I+7|0]|0)|0;g=o+(d[I+8|0]|0)|0;a=g+(d[I+9|0]|0)|0;C=a+(d[I+10|0]|0)|0;B=C+(d[I+11|0]|0)|0;A=B+(d[I+12|0]|0)|0;z=A+(d[I+13|0]|0)|0;y=z+(d[I+14|0]|0)|0;R=y+(d[I+15|0]|0)|0;S=e+K+c+b+f+E+D+m+o+g+a+C+B+A+z+y+R|0;T=I+16|0;if(Q>>>0>15>>>0){H=R;I=T;J=Q;K=S;L=15}else{break}}if((Q|0)==0){U=R;V=S;L=17}else{M=R;N=T;O=Q;P=S;L=16}}if((L|0)==16){while(1){L=0;S=O-1|0;Q=(d[N]|0)+M|0;T=Q+P|0;if((S|0)==0){U=Q;V=T;L=17;break}else{M=Q;N=N+1|0;O=S;P=T;L=16}}}if((L|0)==17){F=(V>>>0)%65521|0;G=(U>>>0)%65521|0}h=F<<16|G;return h|0}function zg(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((b|0)==0){f=0;return f|0}g=~a;a:do{if((e|0)==0){h=g}else{a=b;i=e;j=g;while(1){if((a&3|0)==0){break}k=c[29760+(((d[a]|0)^j&255)<<2)>>2]^j>>>8;l=i-1|0;if((l|0)==0){h=k;break a}else{a=a+1|0;i=l;j=k}}k=a;if(i>>>0>31>>>0){l=i;m=j;n=k;while(1){o=c[n>>2]^m;p=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+4>>2];o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2]^c[n+8>>2];p=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+12>>2];o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2]^c[n+16>>2];p=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+20>>2];o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2]^c[n+24>>2];p=n+32|0;q=c[31808+((o>>>8&255)<<2)>>2]^c[32832+((o&255)<<2)>>2]^c[30784+((o>>>16&255)<<2)>>2]^c[29760+(o>>>24<<2)>>2]^c[n+28>>2];o=c[31808+((q>>>8&255)<<2)>>2]^c[32832+((q&255)<<2)>>2]^c[30784+((q>>>16&255)<<2)>>2]^c[29760+(q>>>24<<2)>>2];q=l-32|0;if(q>>>0>31>>>0){l=q;m=o;n=p}else{r=q;s=o;t=p;break}}}else{r=i;s=j;t=k}if(r>>>0>3>>>0){n=r;m=s;l=t;while(1){a=l+4|0;p=c[l>>2]^m;o=c[31808+((p>>>8&255)<<2)>>2]^c[32832+((p&255)<<2)>>2]^c[30784+((p>>>16&255)<<2)>>2]^c[29760+(p>>>24<<2)>>2];p=n-4|0;if(p>>>0>3>>>0){n=p;m=o;l=a}else{u=p;v=o;w=a;break}}}else{u=r;v=s;w=t}if((u|0)==0){h=v;break}l=v;m=u;n=w;while(1){k=c[29760+(((d[n]|0)^l&255)<<2)>>2]^l>>>8;j=m-1|0;if((j|0)==0){h=k;break}else{l=k;m=j;n=n+1|0}}}}while(0);f=~h;return f|0}function Ag(d,f,g,h,i,j,k,l){d=d|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;if((k|0)==0){m=-6;return m|0}if(!((a[k]|0)==49&(l|0)==56)){m=-6;return m|0}if((d|0)==0){m=-2;return m|0}l=d+24|0;c[l>>2]=0;k=d+32|0;n=c[k>>2]|0;if((n|0)==0){c[k>>2]=36;c[d+40>>2]=0;o=36}else{o=n}n=d+36|0;if((c[n>>2]|0)==0){c[n>>2]=4}n=(f|0)==-1?6:f;if((h|0)<0){p=0;q=-h|0}else{f=(h|0)>15;p=f?2:1;q=f?h-16|0:h}if(!((i-1|0)>>>0<9>>>0&(g|0)==8)){m=-2;return m|0}if((q-8|0)>>>0>7>>>0|n>>>0>9>>>0|j>>>0>4>>>0){m=-2;return m|0}g=(q|0)==8?9:q;q=d+40|0;h=Hc[o&63](c[q>>2]|0,1,5828)|0;if((h|0)==0){m=-4;return m|0}o=d+28|0;c[o>>2]=h;c[h>>2]=d;c[h+24>>2]=p;c[h+28>>2]=0;c[h+48>>2]=g;p=1<<g;g=h+44|0;c[g>>2]=p;c[h+52>>2]=p-1;f=i+7|0;c[h+80>>2]=f;r=1<<f;f=h+76|0;c[f>>2]=r;c[h+84>>2]=r-1;c[h+88>>2]=((i+9|0)>>>0)/3|0;r=h+56|0;c[r>>2]=Hc[c[k>>2]&63](c[q>>2]|0,p,2)|0;p=h+64|0;c[p>>2]=Hc[c[k>>2]&63](c[q>>2]|0,c[g>>2]|0,2)|0;g=h+68|0;c[g>>2]=Hc[c[k>>2]&63](c[q>>2]|0,c[f>>2]|0,2)|0;c[h+5824>>2]=0;f=1<<i+6;i=h+5788|0;c[i>>2]=f;s=Hc[c[k>>2]&63](c[q>>2]|0,f,4)|0;f=s;c[h+8>>2]=s;q=c[i>>2]|0;c[h+12>>2]=q<<2;do{if((c[r>>2]|0)!=0){if((c[p>>2]|0)==0){break}if((c[g>>2]|0)==0|(s|0)==0){break}c[h+5796>>2]=f+(q>>>1<<1);c[h+5784>>2]=s+(q*3|0);c[h+132>>2]=n;c[h+136>>2]=j;a[h+36|0]=8;i=Dg(d)|0;if((i|0)!=0){m=i;return m|0}i=c[o>>2]|0;c[i+60>>2]=c[i+44>>2]<<1;k=i+76|0;t=i+68|0;b[(c[t>>2]|0)+((c[k>>2]|0)-1<<1)>>1]=0;vF(c[t>>2]|0,0,(c[k>>2]<<1)-2|0)|0;k=c[i+132>>2]|0;c[i+128>>2]=e[40330+(k*12|0)>>1]|0;c[i+140>>2]=e[40328+(k*12|0)>>1]|0;c[i+144>>2]=e[40332+(k*12|0)>>1]|0;c[i+124>>2]=e[40334+(k*12|0)>>1]|0;c[i+108>>2]=0;c[i+92>>2]=0;c[i+116>>2]=0;c[i+5812>>2]=0;c[i+120>>2]=2;c[i+96>>2]=2;c[i+104>>2]=0;c[i+72>>2]=0;m=0;return m|0}}while(0);c[h+4>>2]=666;c[l>>2]=c[12];Bg(d)|0;m=-4;return m|0}function Bg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((a|0)==0){b=-2;return b|0}d=a+28|0;e=c[d>>2]|0;if((e|0)==0){b=-2;return b|0}f=c[e+4>>2]|0;switch(f|0){case 666:case 113:case 103:case 91:case 73:case 69:case 42:{break};default:{b=-2;return b|0}}g=c[e+8>>2]|0;if((g|0)==0){h=e}else{Dc[c[a+36>>2]&63](c[a+40>>2]|0,g);h=c[d>>2]|0}g=c[h+68>>2]|0;if((g|0)==0){i=h}else{Dc[c[a+36>>2]&63](c[a+40>>2]|0,g);i=c[d>>2]|0}g=c[i+64>>2]|0;if((g|0)==0){j=i}else{Dc[c[a+36>>2]&63](c[a+40>>2]|0,g);j=c[d>>2]|0}g=c[j+56>>2]|0;i=a+36|0;if((g|0)==0){k=j;l=a+40|0}else{j=a+40|0;Dc[c[i>>2]&63](c[j>>2]|0,g);k=c[d>>2]|0;l=j}Dc[c[i>>2]&63](c[l>>2]|0,k);c[d>>2]=0;b=(f|0)==113?-3:0;return b|0}function Cg(a){a=a|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;f=a+44|0;g=c[f>>2]|0;h=a+60|0;i=a+116|0;j=a+108|0;k=g-262|0;l=a|0;m=a+56|0;n=a+5812|0;o=a+72|0;p=a+88|0;q=a+84|0;r=a+68|0;s=a+52|0;t=a+64|0;u=a+112|0;v=a+92|0;w=a+76|0;x=c[i>>2]|0;y=g;while(1){z=c[j>>2]|0;A=(c[h>>2]|0)-x-z|0;if(z>>>0<(k+y|0)>>>0){B=A}else{z=c[m>>2]|0;tF(z|0,z+g|0,g)|0;c[u>>2]=(c[u>>2]|0)-g;c[j>>2]=(c[j>>2]|0)-g;c[v>>2]=(c[v>>2]|0)-g;z=c[w>>2]|0;C=z;D=(c[r>>2]|0)+(z<<1)|0;do{D=D-2|0;z=e[D>>1]|0;if(z>>>0<g>>>0){E=0}else{E=z-g&65535}b[D>>1]=E;C=C-1|0;}while((C|0)!=0);C=g;D=(c[t>>2]|0)+(g<<1)|0;do{D=D-2|0;z=e[D>>1]|0;if(z>>>0<g>>>0){F=0}else{F=z-g&65535}b[D>>1]=F;C=C-1|0;}while((C|0)!=0);B=A+g|0}C=c[l>>2]|0;D=C+4|0;z=c[D>>2]|0;if((z|0)==0){break}G=c[i>>2]|0;H=(c[m>>2]|0)+(G+(c[j>>2]|0))|0;I=z>>>0>B>>>0?B:z;if((I|0)==0){J=0;K=G}else{c[D>>2]=z-I;z=C|0;tF(H|0,c[z>>2]|0,I)|0;D=c[(c[C+28>>2]|0)+24>>2]|0;if((D|0)==1){G=C+48|0;c[G>>2]=yg(c[G>>2]|0,H,I)|0}else if((D|0)==2){D=C+48|0;c[D>>2]=zg(c[D>>2]|0,H,I)|0}c[z>>2]=(c[z>>2]|0)+I;z=C+8|0;c[z>>2]=(c[z>>2]|0)+I;J=I;K=c[i>>2]|0}I=K+J|0;c[i>>2]=I;z=c[n>>2]|0;a:do{if((I+z|0)>>>0>2>>>0){C=(c[j>>2]|0)-z|0;H=c[m>>2]|0;D=d[H+C|0]|0;c[o>>2]=D;c[o>>2]=((d[H+(C+1)|0]|0)^D<<c[p>>2])&c[q>>2];D=C;C=z;H=I;while(1){if((C|0)==0){L=H;break a}G=((d[(c[m>>2]|0)+(D+2)|0]|0)^c[o>>2]<<c[p>>2])&c[q>>2];c[o>>2]=G;b[(c[t>>2]|0)+((c[s>>2]&D)<<1)>>1]=b[(c[r>>2]|0)+(G<<1)>>1]|0;b[(c[r>>2]|0)+(c[o>>2]<<1)>>1]=D;G=(c[n>>2]|0)-1|0;c[n>>2]=G;M=c[i>>2]|0;if((M+G|0)>>>0<3>>>0){L=M;break}else{D=D+1|0;C=G;H=M}}}else{L=I}}while(0);if(L>>>0>=262>>>0){break}if((c[(c[l>>2]|0)+4>>2]|0)==0){break}x=L;y=c[f>>2]|0}f=a+5824|0;a=c[f>>2]|0;y=c[h>>2]|0;if(a>>>0>=y>>>0){return}h=(c[i>>2]|0)+(c[j>>2]|0)|0;if(a>>>0<h>>>0){j=y-h|0;i=j>>>0>258>>>0?258:j;vF((c[m>>2]|0)+h|0,0,i|0)|0;c[f>>2]=i+h;return}i=h+258|0;if(a>>>0>=i>>>0){return}h=i-a|0;i=y-a|0;y=h>>>0>i>>>0?i:h;vF((c[m>>2]|0)+a|0,0,y|0)|0;c[f>>2]=(c[f>>2]|0)+y;return}function Dg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;if((a|0)==0){b=-2;return b|0}d=c[a+28>>2]|0;if((d|0)==0){b=-2;return b|0}if((c[a+32>>2]|0)==0){b=-2;return b|0}if((c[a+36>>2]|0)==0){b=-2;return b|0}c[a+20>>2]=0;c[a+8>>2]=0;c[a+24>>2]=0;c[a+44>>2]=2;c[d+20>>2]=0;c[d+16>>2]=c[d+8>>2];e=d+24|0;f=c[e>>2]|0;if((f|0)<0){g=-f|0;c[e>>2]=g;h=g}else{h=f}c[d+4>>2]=(h|0)!=0?42:113;if((h|0)==2){i=zg(0,0,0)|0}else{i=yg(0,0,0)|0}c[a+48>>2]=i;c[d+40>>2]=0;Jg(d);b=0;return b|0}function Eg(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;if((e|0)==0){g=-2;return g|0}h=e+28|0;i=c[h>>2]|0;if((i|0)==0|f>>>0>5>>>0){g=-2;return g|0}j=e+12|0;do{if((c[j>>2]|0)!=0){if((c[e>>2]|0)==0){if((c[e+4>>2]|0)!=0){break}}k=i+4|0;l=c[k>>2]|0;m=(f|0)==4;if(!((l|0)!=666|m)){break}n=e+16|0;if((c[n>>2]|0)==0){c[e+24>>2]=c[13];g=-5;return g|0}o=i|0;c[o>>2]=e;p=i+40|0;q=c[p>>2]|0;c[p>>2]=f;do{if((l|0)==42){if((c[i+24>>2]|0)!=2){r=(c[i+48>>2]<<12)-30720|0;do{if((c[i+136>>2]|0)>1){s=0}else{t=c[i+132>>2]|0;if((t|0)<2){s=0;break}if((t|0)<6){s=64;break}s=(t|0)==6?128:192}}while(0);t=s|r;u=i+108|0;v=(c[u>>2]|0)==0?t:t|32;c[k>>2]=113;t=i+20|0;w=c[t>>2]|0;c[t>>2]=w+1;x=i+8|0;a[(c[x>>2]|0)+w|0]=v>>>8;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=(v|((v>>>0)%31|0))^31;v=e+48|0;if((c[u>>2]|0)!=0){u=c[v>>2]|0;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u>>>24;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u>>>16;u=c[v>>2]|0;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u>>>8;w=c[t>>2]|0;c[t>>2]=w+1;a[(c[x>>2]|0)+w|0]=u}c[v>>2]=yg(0,0,0)|0;y=c[k>>2]|0;z=32;break}v=e+48|0;c[v>>2]=zg(0,0,0)|0;u=i+20|0;w=c[u>>2]|0;c[u>>2]=w+1;x=i+8|0;a[(c[x>>2]|0)+w|0]=31;w=c[u>>2]|0;c[u>>2]=w+1;a[(c[x>>2]|0)+w|0]=-117;w=c[u>>2]|0;c[u>>2]=w+1;a[(c[x>>2]|0)+w|0]=8;w=i+28|0;t=c[w>>2]|0;if((t|0)==0){A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=0;A=c[i+132>>2]|0;do{if((A|0)==9){B=2}else{if((c[i+136>>2]|0)>1){B=4;break}B=(A|0)<2?4:0}}while(0);A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=B;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=3;c[k>>2]=113;break}A=((c[t+44>>2]|0)!=0?2:0)|(c[t>>2]|0)!=0|((c[t+16>>2]|0)==0?0:4)|((c[t+28>>2]|0)==0?0:8)|((c[t+36>>2]|0)==0?0:16);r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=c[(c[w>>2]|0)+4>>2]&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=(c[(c[w>>2]|0)+4>>2]|0)>>>8&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=(c[(c[w>>2]|0)+4>>2]|0)>>>16&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=(c[(c[w>>2]|0)+4>>2]|0)>>>24&255;r=c[u>>2]|0;c[u>>2]=r+1;a[(c[x>>2]|0)+r|0]=A;A=c[i+132>>2]|0;do{if((A|0)==9){C=2}else{if((c[i+136>>2]|0)>1){C=4;break}C=(A|0)<2?4:0}}while(0);A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=C;A=c[(c[w>>2]|0)+12>>2]&255;t=c[u>>2]|0;c[u>>2]=t+1;a[(c[x>>2]|0)+t|0]=A;A=c[w>>2]|0;if((c[A+16>>2]|0)==0){D=A}else{t=c[A+20>>2]&255;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=t;t=(c[(c[w>>2]|0)+20>>2]|0)>>>8&255;A=c[u>>2]|0;c[u>>2]=A+1;a[(c[x>>2]|0)+A|0]=t;D=c[w>>2]|0}if((c[D+44>>2]|0)!=0){c[v>>2]=zg(c[v>>2]|0,c[x>>2]|0,c[u>>2]|0)|0}c[i+32>>2]=0;c[k>>2]=69;E=w;z=34}else{y=l;z=32}}while(0);do{if((z|0)==32){if((y|0)!=69){F=y;z=55;break}E=i+28|0;z=34}}while(0);do{if((z|0)==34){l=c[E>>2]|0;if((c[l+16>>2]|0)==0){c[k>>2]=73;G=l;z=57;break}t=i+20|0;A=c[t>>2]|0;r=i+32|0;H=c[r>>2]|0;a:do{if(H>>>0<(c[l+20>>2]&65535)>>>0){I=i+12|0;J=e+48|0;K=i+8|0;L=e+20|0;M=A;N=l;O=A;P=H;while(1){if((O|0)==(c[I>>2]|0)){if((c[N+44>>2]|0)!=0&O>>>0>M>>>0){c[J>>2]=zg(c[J>>2]|0,(c[K>>2]|0)+M|0,O-M|0)|0}Q=c[h>>2]|0;Mg(Q);R=Q+20|0;S=c[R>>2]|0;T=c[n>>2]|0;U=S>>>0>T>>>0?T:S;do{if((U|0)!=0){S=Q+16|0;tF(c[j>>2]|0,c[S>>2]|0,U)|0;c[j>>2]=(c[j>>2]|0)+U;c[S>>2]=(c[S>>2]|0)+U;c[L>>2]=(c[L>>2]|0)+U;c[n>>2]=(c[n>>2]|0)-U;T=c[R>>2]|0;c[R>>2]=T-U;if((T|0)!=(U|0)){break}c[S>>2]=c[Q+8>>2]}}while(0);V=c[t>>2]|0;if((V|0)==(c[I>>2]|0)){break}W=V;X=V;Y=c[r>>2]|0;Z=c[E>>2]|0}else{W=M;X=O;Y=P;Z=N}Q=a[(c[Z+16>>2]|0)+Y|0]|0;c[t>>2]=X+1;a[(c[K>>2]|0)+X|0]=Q;Q=(c[r>>2]|0)+1|0;c[r>>2]=Q;U=c[E>>2]|0;if(Q>>>0>=(c[U+20>>2]&65535)>>>0){_=W;$=U;break a}M=W;N=U;O=c[t>>2]|0;P=Q}_=V;$=c[E>>2]|0}else{_=A;$=l}}while(0);do{if((c[$+44>>2]|0)==0){aa=$}else{l=c[t>>2]|0;if(l>>>0<=_>>>0){aa=$;break}A=e+48|0;c[A>>2]=zg(c[A>>2]|0,(c[i+8>>2]|0)+_|0,l-_|0)|0;aa=c[E>>2]|0}}while(0);if((c[r>>2]|0)==(c[aa+20>>2]|0)){c[r>>2]=0;c[k>>2]=73;G=aa;z=57;break}else{F=c[k>>2]|0;z=55;break}}}while(0);do{if((z|0)==55){if((F|0)!=73){ba=F;z=75;break}G=c[i+28>>2]|0;z=57}}while(0);do{if((z|0)==57){t=i+28|0;if((c[G+28>>2]|0)==0){c[k>>2]=91;ca=t;z=77;break}l=i+20|0;A=c[l>>2]|0;H=i+12|0;w=e+48|0;u=i+8|0;x=e+20|0;v=i+32|0;P=A;O=A;while(1){if((O|0)==(c[H>>2]|0)){if((c[(c[t>>2]|0)+44>>2]|0)!=0&O>>>0>P>>>0){c[w>>2]=zg(c[w>>2]|0,(c[u>>2]|0)+P|0,O-P|0)|0}A=c[h>>2]|0;Mg(A);N=A+20|0;M=c[N>>2]|0;K=c[n>>2]|0;I=M>>>0>K>>>0?K:M;do{if((I|0)!=0){M=A+16|0;tF(c[j>>2]|0,c[M>>2]|0,I)|0;c[j>>2]=(c[j>>2]|0)+I;c[M>>2]=(c[M>>2]|0)+I;c[x>>2]=(c[x>>2]|0)+I;c[n>>2]=(c[n>>2]|0)-I;K=c[N>>2]|0;c[N>>2]=K-I;if((K|0)!=(I|0)){break}c[M>>2]=c[A+8>>2]}}while(0);A=c[l>>2]|0;if((A|0)==(c[H>>2]|0)){da=1;ea=A;break}else{fa=A;ga=A}}else{fa=P;ga=O}A=c[v>>2]|0;c[v>>2]=A+1;I=a[(c[(c[t>>2]|0)+28>>2]|0)+A|0]|0;c[l>>2]=ga+1;a[(c[u>>2]|0)+ga|0]=I;if(I<<24>>24==0){da=I&255;ea=fa;break}P=fa;O=c[l>>2]|0}do{if((c[(c[t>>2]|0)+44>>2]|0)!=0){O=c[l>>2]|0;if(O>>>0<=ea>>>0){break}c[w>>2]=zg(c[w>>2]|0,(c[u>>2]|0)+ea|0,O-ea|0)|0}}while(0);if((da|0)==0){c[v>>2]=0;c[k>>2]=91;ca=t;z=77;break}else{ba=c[k>>2]|0;z=75;break}}}while(0);do{if((z|0)==75){if((ba|0)!=91){ha=ba;z=95;break}ca=i+28|0;z=77}}while(0);do{if((z|0)==77){if((c[(c[ca>>2]|0)+36>>2]|0)==0){c[k>>2]=103;ia=ca;z=97;break}u=i+20|0;w=c[u>>2]|0;l=i+12|0;O=e+48|0;P=i+8|0;H=e+20|0;x=i+32|0;r=w;I=w;while(1){if((I|0)==(c[l>>2]|0)){if((c[(c[ca>>2]|0)+44>>2]|0)!=0&I>>>0>r>>>0){c[O>>2]=zg(c[O>>2]|0,(c[P>>2]|0)+r|0,I-r|0)|0}w=c[h>>2]|0;Mg(w);A=w+20|0;N=c[A>>2]|0;M=c[n>>2]|0;K=N>>>0>M>>>0?M:N;do{if((K|0)!=0){N=w+16|0;tF(c[j>>2]|0,c[N>>2]|0,K)|0;c[j>>2]=(c[j>>2]|0)+K;c[N>>2]=(c[N>>2]|0)+K;c[H>>2]=(c[H>>2]|0)+K;c[n>>2]=(c[n>>2]|0)-K;M=c[A>>2]|0;c[A>>2]=M-K;if((M|0)!=(K|0)){break}c[N>>2]=c[w+8>>2]}}while(0);w=c[u>>2]|0;if((w|0)==(c[l>>2]|0)){ja=1;ka=w;break}else{la=w;ma=w}}else{la=r;ma=I}w=c[x>>2]|0;c[x>>2]=w+1;K=a[(c[(c[ca>>2]|0)+36>>2]|0)+w|0]|0;c[u>>2]=ma+1;a[(c[P>>2]|0)+ma|0]=K;if(K<<24>>24==0){ja=K&255;ka=la;break}r=la;I=c[u>>2]|0}do{if((c[(c[ca>>2]|0)+44>>2]|0)!=0){I=c[u>>2]|0;if(I>>>0<=ka>>>0){break}c[O>>2]=zg(c[O>>2]|0,(c[P>>2]|0)+ka|0,I-ka|0)|0}}while(0);if((ja|0)==0){c[k>>2]=103;ia=ca;z=97;break}else{ha=c[k>>2]|0;z=95;break}}}while(0);do{if((z|0)==95){if((ha|0)!=103){break}ia=i+28|0;z=97}}while(0);do{if((z|0)==97){if((c[(c[ia>>2]|0)+44>>2]|0)==0){c[k>>2]=113;break}P=i+20|0;O=i+12|0;do{if(((c[P>>2]|0)+2|0)>>>0>(c[O>>2]|0)>>>0){u=c[h>>2]|0;Mg(u);I=u+20|0;r=c[I>>2]|0;x=c[n>>2]|0;l=r>>>0>x>>>0?x:r;if((l|0)==0){break}r=u+16|0;tF(c[j>>2]|0,c[r>>2]|0,l)|0;c[j>>2]=(c[j>>2]|0)+l;c[r>>2]=(c[r>>2]|0)+l;x=e+20|0;c[x>>2]=(c[x>>2]|0)+l;c[n>>2]=(c[n>>2]|0)-l;x=c[I>>2]|0;c[I>>2]=x-l;if((x|0)!=(l|0)){break}c[r>>2]=c[u+8>>2]}}while(0);u=c[P>>2]|0;if((u+2|0)>>>0>(c[O>>2]|0)>>>0){break}r=e+48|0;l=c[r>>2]&255;c[P>>2]=u+1;x=i+8|0;a[(c[x>>2]|0)+u|0]=l;l=(c[r>>2]|0)>>>8&255;u=c[P>>2]|0;c[P>>2]=u+1;a[(c[x>>2]|0)+u|0]=l;c[r>>2]=zg(0,0,0)|0;c[k>>2]=113}}while(0);r=i+20|0;do{if((c[r>>2]|0)==0){if((c[e+4>>2]|0)!=0){break}if(((f<<1)-((f|0)>4?9:0)|0)>((q<<1)-((q|0)>4?9:0)|0)|m){break}c[e+24>>2]=c[13];g=-5;return g|0}else{l=c[h>>2]|0;Mg(l);u=l+20|0;x=c[u>>2]|0;I=c[n>>2]|0;H=x>>>0>I>>>0?I:x;if((H|0)==0){na=I}else{I=l+16|0;tF(c[j>>2]|0,c[I>>2]|0,H)|0;c[j>>2]=(c[j>>2]|0)+H;c[I>>2]=(c[I>>2]|0)+H;x=e+20|0;c[x>>2]=(c[x>>2]|0)+H;c[n>>2]=(c[n>>2]|0)-H;x=c[u>>2]|0;c[u>>2]=x-H;if((x|0)==(H|0)){c[I>>2]=c[l+8>>2]}na=c[n>>2]|0}if((na|0)!=0){break}c[p>>2]=-1;g=0;return g|0}}while(0);q=(c[k>>2]|0)==666;l=(c[e+4>>2]|0)==0;do{if(q){if(l){z=119;break}c[e+24>>2]=c[13];g=-5;return g|0}else{if(l){z=119}else{z=122}}}while(0);do{if((z|0)==119){if((c[i+116>>2]|0)!=0){z=122;break}if((f|0)==0){g=0;return g|0}else{if(q){break}else{z=122;break}}}}while(0);b:do{if((z|0)==122){q=c[i+136>>2]|0;c:do{if((q|0)==2){l=i+116|0;I=i+96|0;H=i+108|0;x=i+56|0;u=i+5792|0;t=i+5796|0;v=i+5784|0;K=i+5788|0;w=i+92|0;while(1){if((c[l>>2]|0)==0){Cg(i);if((c[l>>2]|0)==0){break}}c[I>>2]=0;A=a[(c[x>>2]|0)+(c[H>>2]|0)|0]|0;b[(c[t>>2]|0)+(c[u>>2]<<1)>>1]=0;N=c[u>>2]|0;c[u>>2]=N+1;a[(c[v>>2]|0)+N|0]=A;N=i+148+((A&255)<<2)|0;b[N>>1]=(b[N>>1]|0)+1;N=(c[u>>2]|0)==((c[K>>2]|0)-1|0);c[l>>2]=(c[l>>2]|0)-1;A=(c[H>>2]|0)+1|0;c[H>>2]=A;if(!N){continue}N=c[w>>2]|0;if((N|0)>-1){oa=(c[x>>2]|0)+N|0}else{oa=0}Og(i,oa,A-N|0,0);c[w>>2]=c[H>>2];N=c[o>>2]|0;A=c[N+28>>2]|0;Mg(A);M=A+20|0;L=c[M>>2]|0;J=N+16|0;Q=c[J>>2]|0;U=L>>>0>Q>>>0?Q:L;do{if((U|0)!=0){L=N+12|0;Q=A+16|0;tF(c[L>>2]|0,c[Q>>2]|0,U)|0;c[L>>2]=(c[L>>2]|0)+U;c[Q>>2]=(c[Q>>2]|0)+U;L=N+20|0;c[L>>2]=(c[L>>2]|0)+U;c[J>>2]=(c[J>>2]|0)-U;L=c[M>>2]|0;c[M>>2]=L-U;if((L|0)!=(U|0)){break}c[Q>>2]=c[A+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195;break c}}if((f|0)==0){z=195;break}c[i+5812>>2]=0;if(m){l=c[w>>2]|0;if((l|0)>-1){pa=(c[x>>2]|0)+l|0}else{pa=0}Og(i,pa,(c[H>>2]|0)-l|0,1);c[w>>2]=c[H>>2];l=c[o>>2]|0;K=c[l+28>>2]|0;Mg(K);v=K+20|0;t=c[v>>2]|0;I=l+16|0;A=c[I>>2]|0;U=t>>>0>A>>>0?A:t;do{if((U|0)!=0){t=l+12|0;A=K+16|0;tF(c[t>>2]|0,c[A>>2]|0,U)|0;c[t>>2]=(c[t>>2]|0)+U;c[A>>2]=(c[A>>2]|0)+U;t=l+20|0;c[t>>2]=(c[t>>2]|0)+U;c[I>>2]=(c[I>>2]|0)-U;t=c[v>>2]|0;c[v>>2]=t-U;if((t|0)!=(U|0)){break}c[A>>2]=c[K+8>>2]}}while(0);qa=(c[(c[o>>2]|0)+16>>2]|0)==0?2:3;z=192;break}if((c[u>>2]|0)==0){break}K=c[w>>2]|0;if((K|0)>-1){ra=(c[x>>2]|0)+K|0}else{ra=0}Og(i,ra,(c[H>>2]|0)-K|0,0);c[w>>2]=c[H>>2];K=c[o>>2]|0;U=c[K+28>>2]|0;Mg(U);v=U+20|0;I=c[v>>2]|0;l=K+16|0;A=c[l>>2]|0;t=I>>>0>A>>>0?A:I;do{if((t|0)!=0){I=K+12|0;A=U+16|0;tF(c[I>>2]|0,c[A>>2]|0,t)|0;c[I>>2]=(c[I>>2]|0)+t;c[A>>2]=(c[A>>2]|0)+t;I=K+20|0;c[I>>2]=(c[I>>2]|0)+t;c[l>>2]=(c[l>>2]|0)-t;I=c[v>>2]|0;c[v>>2]=I-t;if((I|0)!=(t|0)){break}c[A>>2]=c[U+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195}}else if((q|0)==3){U=i+116|0;t=(f|0)==0;v=i+96|0;l=i+108|0;K=i+5792|0;H=i+5796|0;w=i+5784|0;x=i+2440+(d[169256]<<2)|0;u=i+5788|0;A=i+56|0;I=i+92|0;d:while(1){M=c[U>>2]|0;do{if(M>>>0<259>>>0){Cg(i);J=c[U>>2]|0;if(J>>>0<259>>>0&t){z=195;break c}if((J|0)==0){break d}c[v>>2]=0;if(J>>>0>2>>>0){sa=J;z=155;break}ta=c[l>>2]|0;z=170}else{c[v>>2]=0;sa=M;z=155}}while(0);do{if((z|0)==155){z=0;M=c[l>>2]|0;if((M|0)==0){ta=0;z=170;break}J=c[A>>2]|0;N=a[J+(M-1)|0]|0;if(N<<24>>24!=(a[J+M|0]|0)){ta=M;z=170;break}if(N<<24>>24!=(a[J+(M+1)|0]|0)){ta=M;z=170;break}Q=J+(M+2)|0;if(N<<24>>24!=(a[Q]|0)){ta=M;z=170;break}L=J+(M+258)|0;J=Q;while(1){Q=J+1|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+2|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+3|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+4|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+5|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+6|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+7|0;if(N<<24>>24!=(a[Q]|0)){ua=Q;break}Q=J+8|0;if(N<<24>>24==(a[Q]|0)&Q>>>0<L>>>0){J=Q}else{ua=Q;break}}J=ua-L+258|0;N=J>>>0>sa>>>0?sa:J;c[v>>2]=N;if(N>>>0<=2>>>0){ta=M;z=170;break}J=N+253|0;b[(c[H>>2]|0)+(c[K>>2]<<1)>>1]=1;N=c[K>>2]|0;c[K>>2]=N+1;a[(c[w>>2]|0)+N|0]=J;N=i+148+((d[169e3+(J&255)|0]|256)+1<<2)|0;b[N>>1]=(b[N>>1]|0)+1;b[x>>1]=(b[x>>1]|0)+1;N=(c[K>>2]|0)==((c[u>>2]|0)-1|0);J=c[v>>2]|0;c[U>>2]=(c[U>>2]|0)-J;Q=(c[l>>2]|0)+J|0;c[l>>2]=Q;c[v>>2]=0;if(N){va=Q}else{continue d}}}while(0);if((z|0)==170){z=0;Q=a[(c[A>>2]|0)+ta|0]|0;b[(c[H>>2]|0)+(c[K>>2]<<1)>>1]=0;N=c[K>>2]|0;c[K>>2]=N+1;a[(c[w>>2]|0)+N|0]=Q;N=i+148+((Q&255)<<2)|0;b[N>>1]=(b[N>>1]|0)+1;N=(c[K>>2]|0)==((c[u>>2]|0)-1|0);c[U>>2]=(c[U>>2]|0)-1;Q=(c[l>>2]|0)+1|0;c[l>>2]=Q;if(N){va=Q}else{continue}}Q=c[I>>2]|0;if((Q|0)>-1){wa=(c[A>>2]|0)+Q|0}else{wa=0}Og(i,wa,va-Q|0,0);c[I>>2]=c[l>>2];Q=c[o>>2]|0;N=c[Q+28>>2]|0;Mg(N);J=N+20|0;R=c[J>>2]|0;S=Q+16|0;T=c[S>>2]|0;xa=R>>>0>T>>>0?T:R;do{if((xa|0)!=0){R=Q+12|0;T=N+16|0;tF(c[R>>2]|0,c[T>>2]|0,xa)|0;c[R>>2]=(c[R>>2]|0)+xa;c[T>>2]=(c[T>>2]|0)+xa;R=Q+20|0;c[R>>2]=(c[R>>2]|0)+xa;c[S>>2]=(c[S>>2]|0)-xa;R=c[J>>2]|0;c[J>>2]=R-xa;if((R|0)!=(xa|0)){break}c[T>>2]=c[N+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195;break c}}c[i+5812>>2]=0;if(m){U=c[I>>2]|0;if((U|0)>-1){ya=(c[A>>2]|0)+U|0}else{ya=0}Og(i,ya,(c[l>>2]|0)-U|0,1);c[I>>2]=c[l>>2];U=c[o>>2]|0;u=c[U+28>>2]|0;Mg(u);w=u+20|0;H=c[w>>2]|0;v=U+16|0;x=c[v>>2]|0;t=H>>>0>x>>>0?x:H;do{if((t|0)!=0){H=U+12|0;x=u+16|0;tF(c[H>>2]|0,c[x>>2]|0,t)|0;c[H>>2]=(c[H>>2]|0)+t;c[x>>2]=(c[x>>2]|0)+t;H=U+20|0;c[H>>2]=(c[H>>2]|0)+t;c[v>>2]=(c[v>>2]|0)-t;H=c[w>>2]|0;c[w>>2]=H-t;if((H|0)!=(t|0)){break}c[x>>2]=c[u+8>>2]}}while(0);qa=(c[(c[o>>2]|0)+16>>2]|0)==0?2:3;z=192;break}if((c[K>>2]|0)==0){break}u=c[I>>2]|0;if((u|0)>-1){za=(c[A>>2]|0)+u|0}else{za=0}Og(i,za,(c[l>>2]|0)-u|0,0);c[I>>2]=c[l>>2];u=c[o>>2]|0;t=c[u+28>>2]|0;Mg(t);w=t+20|0;v=c[w>>2]|0;U=u+16|0;x=c[U>>2]|0;H=v>>>0>x>>>0?x:v;do{if((H|0)!=0){v=u+12|0;x=t+16|0;tF(c[v>>2]|0,c[x>>2]|0,H)|0;c[v>>2]=(c[v>>2]|0)+H;c[x>>2]=(c[x>>2]|0)+H;v=u+20|0;c[v>>2]=(c[v>>2]|0)+H;c[U>>2]=(c[U>>2]|0)-H;v=c[w>>2]|0;c[w>>2]=v-H;if((v|0)!=(H|0)){break}c[x>>2]=c[t+8>>2]}}while(0);if((c[(c[o>>2]|0)+16>>2]|0)==0){z=195}}else{qa=Oc[c[40336+((c[i+132>>2]|0)*12|0)>>2]&255](i,f)|0;z=192}}while(0);do{if((z|0)==192){if((qa&-2|0)==2){c[k>>2]=666}if((qa&-3|0)==0){z=195;break}if((qa|0)!=1){break b}}}while(0);if((z|0)==195){if((c[n>>2]|0)!=0){g=0;return g|0}c[p>>2]=-1;g=0;return g|0}do{if((f|0)==1){Ng(i)}else if((f|0)!=5){Lg(i,0,0,0);if((f|0)!=3){break}q=i+76|0;P=i+68|0;b[(c[P>>2]|0)+((c[q>>2]|0)-1<<1)>>1]=0;vF(c[P>>2]|0,0,(c[q>>2]<<1)-2|0)|0;if((c[i+116>>2]|0)!=0){break}c[i+108>>2]=0;c[i+92>>2]=0;c[i+5812>>2]=0}}while(0);q=c[h>>2]|0;Mg(q);P=q+20|0;O=c[P>>2]|0;t=c[n>>2]|0;H=O>>>0>t>>>0?t:O;if((H|0)==0){Aa=t}else{t=q+16|0;tF(c[j>>2]|0,c[t>>2]|0,H)|0;c[j>>2]=(c[j>>2]|0)+H;c[t>>2]=(c[t>>2]|0)+H;O=e+20|0;c[O>>2]=(c[O>>2]|0)+H;c[n>>2]=(c[n>>2]|0)-H;O=c[P>>2]|0;c[P>>2]=O-H;if((O|0)==(H|0)){c[t>>2]=c[q+8>>2]}Aa=c[n>>2]|0}if((Aa|0)!=0){break}c[p>>2]=-1;g=0;return g|0}}while(0);if(!m){g=0;return g|0}p=i+24|0;k=c[p>>2]|0;if((k|0)<1){g=1;return g|0}o=e+48|0;q=c[o>>2]|0;if((k|0)==2){k=c[r>>2]|0;c[r>>2]=k+1;t=i+8|0;a[(c[t>>2]|0)+k|0]=q;k=(c[o>>2]|0)>>>8&255;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[t>>2]|0)+H|0]=k;k=(c[o>>2]|0)>>>16&255;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[t>>2]|0)+H|0]=k;k=(c[o>>2]|0)>>>24&255;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[t>>2]|0)+H|0]=k;k=e+8|0;H=c[k>>2]&255;O=c[r>>2]|0;c[r>>2]=O+1;a[(c[t>>2]|0)+O|0]=H;H=(c[k>>2]|0)>>>8&255;O=c[r>>2]|0;c[r>>2]=O+1;a[(c[t>>2]|0)+O|0]=H;H=(c[k>>2]|0)>>>16&255;O=c[r>>2]|0;c[r>>2]=O+1;a[(c[t>>2]|0)+O|0]=H;H=(c[k>>2]|0)>>>24&255;k=c[r>>2]|0;c[r>>2]=k+1;a[(c[t>>2]|0)+k|0]=H}else{H=c[r>>2]|0;c[r>>2]=H+1;k=i+8|0;a[(c[k>>2]|0)+H|0]=q>>>24;H=c[r>>2]|0;c[r>>2]=H+1;a[(c[k>>2]|0)+H|0]=q>>>16;q=c[o>>2]|0;o=c[r>>2]|0;c[r>>2]=o+1;a[(c[k>>2]|0)+o|0]=q>>>8;o=c[r>>2]|0;c[r>>2]=o+1;a[(c[k>>2]|0)+o|0]=q}q=c[h>>2]|0;Mg(q);o=q+20|0;k=c[o>>2]|0;H=c[n>>2]|0;t=k>>>0>H>>>0?H:k;do{if((t|0)!=0){k=q+16|0;tF(c[j>>2]|0,c[k>>2]|0,t)|0;c[j>>2]=(c[j>>2]|0)+t;c[k>>2]=(c[k>>2]|0)+t;H=e+20|0;c[H>>2]=(c[H>>2]|0)+t;c[n>>2]=(c[n>>2]|0)-t;H=c[o>>2]|0;c[o>>2]=H-t;if((H|0)!=(t|0)){break}c[k>>2]=c[q+8>>2]}}while(0);q=c[p>>2]|0;if((q|0)>0){c[p>>2]=-q}g=(c[r>>2]|0)==0|0;return g|0}}while(0);c[e+24>>2]=c[10];g=-2;return g|0}function Fg(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;d=(c[a+12>>2]|0)-5|0;e=d>>>0<65535>>>0?d:65535;d=a+116|0;f=a+108|0;g=a+92|0;h=a+44|0;i=a+56|0;j=a|0;while(1){k=c[d>>2]|0;if(k>>>0<2>>>0){Cg(a);l=c[d>>2]|0;if((l|b|0)==0){m=0;n=35;break}if((l|0)==0){n=20;break}else{o=l}}else{o=k}k=(c[f>>2]|0)+o|0;c[f>>2]=k;c[d>>2]=0;l=c[g>>2]|0;p=l+e|0;if((k|0)!=0&k>>>0<p>>>0){q=k;r=l}else{c[d>>2]=k-p;c[f>>2]=p;if((l|0)>-1){s=(c[i>>2]|0)+l|0}else{s=0}Og(a,s,e,0);c[g>>2]=c[f>>2];l=c[j>>2]|0;p=c[l+28>>2]|0;Mg(p);k=p+20|0;t=c[k>>2]|0;u=l+16|0;v=c[u>>2]|0;w=t>>>0>v>>>0?v:t;do{if((w|0)!=0){t=l+12|0;v=p+16|0;tF(c[t>>2]|0,c[v>>2]|0,w)|0;c[t>>2]=(c[t>>2]|0)+w;c[v>>2]=(c[v>>2]|0)+w;t=l+20|0;c[t>>2]=(c[t>>2]|0)+w;c[u>>2]=(c[u>>2]|0)-w;t=c[k>>2]|0;c[k>>2]=t-w;if((t|0)!=(w|0)){break}c[v>>2]=c[p+8>>2]}}while(0);if((c[(c[j>>2]|0)+16>>2]|0)==0){m=0;n=35;break}q=c[f>>2]|0;r=c[g>>2]|0}p=q-r|0;if(p>>>0<((c[h>>2]|0)-262|0)>>>0){continue}if((r|0)>-1){x=(c[i>>2]|0)+r|0}else{x=0}Og(a,x,p,0);c[g>>2]=c[f>>2];p=c[j>>2]|0;w=c[p+28>>2]|0;Mg(w);k=w+20|0;u=c[k>>2]|0;l=p+16|0;v=c[l>>2]|0;t=u>>>0>v>>>0?v:u;do{if((t|0)!=0){u=p+12|0;v=w+16|0;tF(c[u>>2]|0,c[v>>2]|0,t)|0;c[u>>2]=(c[u>>2]|0)+t;c[v>>2]=(c[v>>2]|0)+t;u=p+20|0;c[u>>2]=(c[u>>2]|0)+t;c[l>>2]=(c[l>>2]|0)-t;u=c[k>>2]|0;c[k>>2]=u-t;if((u|0)!=(t|0)){break}c[v>>2]=c[w+8>>2]}}while(0);if((c[(c[j>>2]|0)+16>>2]|0)==0){m=0;n=35;break}}if((n|0)==20){c[a+5812>>2]=0;if((b|0)==4){b=c[g>>2]|0;if((b|0)>-1){y=(c[i>>2]|0)+b|0}else{y=0}Og(a,y,(c[f>>2]|0)-b|0,1);c[g>>2]=c[f>>2];b=c[j>>2]|0;y=c[b+28>>2]|0;Mg(y);x=y+20|0;r=c[x>>2]|0;h=b+16|0;q=c[h>>2]|0;e=r>>>0>q>>>0?q:r;do{if((e|0)!=0){r=b+12|0;q=y+16|0;tF(c[r>>2]|0,c[q>>2]|0,e)|0;c[r>>2]=(c[r>>2]|0)+e;c[q>>2]=(c[q>>2]|0)+e;r=b+20|0;c[r>>2]=(c[r>>2]|0)+e;c[h>>2]=(c[h>>2]|0)-e;r=c[x>>2]|0;c[x>>2]=r-e;if((r|0)!=(e|0)){break}c[q>>2]=c[y+8>>2]}}while(0);m=(c[(c[j>>2]|0)+16>>2]|0)==0?2:3;return m|0}y=c[f>>2]|0;e=c[g>>2]|0;do{if((y|0)>(e|0)){if((e|0)>-1){z=(c[i>>2]|0)+e|0}else{z=0}Og(a,z,y-e|0,0);c[g>>2]=c[f>>2];x=c[j>>2]|0;h=c[x+28>>2]|0;Mg(h);b=h+20|0;q=c[b>>2]|0;r=x+16|0;s=c[r>>2]|0;d=q>>>0>s>>>0?s:q;do{if((d|0)!=0){q=x+12|0;s=h+16|0;tF(c[q>>2]|0,c[s>>2]|0,d)|0;c[q>>2]=(c[q>>2]|0)+d;c[s>>2]=(c[s>>2]|0)+d;q=x+20|0;c[q>>2]=(c[q>>2]|0)+d;c[r>>2]=(c[r>>2]|0)-d;q=c[b>>2]|0;c[b>>2]=q-d;if((q|0)!=(d|0)){break}c[s>>2]=c[h+8>>2]}}while(0);if((c[(c[j>>2]|0)+16>>2]|0)==0){m=0}else{break}return m|0}}while(0);m=1;return m|0}else if((n|0)==35){return m|0}return 0}function Gg(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0;g=e+116|0;h=(f|0)==0;i=e+72|0;j=e+88|0;k=e+108|0;l=e+56|0;m=e+84|0;n=e+68|0;o=e+52|0;p=e+64|0;q=e+44|0;r=e+96|0;s=e+112|0;t=e+5792|0;u=e+5796|0;v=e+5784|0;w=e+5788|0;x=e+128|0;y=e+92|0;z=e|0;while(1){if((c[g>>2]|0)>>>0<262>>>0){Cg(e);A=c[g>>2]|0;if(A>>>0<262>>>0&h){B=0;C=41;break}if((A|0)==0){C=26;break}if(A>>>0>2>>>0){C=6}else{C=9}}else{C=6}do{if((C|0)==6){C=0;A=c[k>>2]|0;D=((d[(c[l>>2]|0)+(A+2)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=D;E=b[(c[n>>2]|0)+(D<<1)>>1]|0;b[(c[p>>2]|0)+((c[o>>2]&A)<<1)>>1]=E;A=E&65535;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];if(E<<16>>16==0){C=9;break}if(((c[k>>2]|0)-A|0)>>>0>((c[q>>2]|0)-262|0)>>>0){C=9;break}E=Ig(e,A)|0;c[r>>2]=E;F=E}}while(0);if((C|0)==9){C=0;F=c[r>>2]|0}do{if(F>>>0>2>>>0){E=F+253|0;A=(c[k>>2]|0)-(c[s>>2]|0)&65535;b[(c[u>>2]|0)+(c[t>>2]<<1)>>1]=A;D=c[t>>2]|0;c[t>>2]=D+1;a[(c[v>>2]|0)+D|0]=E;D=A-1&65535;A=e+148+((d[169e3+(E&255)|0]|0|256)+1<<2)|0;b[A>>1]=(b[A>>1]|0)+1;A=D&65535;if((D&65535)>>>0<256>>>0){G=A}else{G=(A>>>7)+256|0}A=e+2440+((d[169256+G|0]|0)<<2)|0;b[A>>1]=(b[A>>1]|0)+1;A=(c[t>>2]|0)==((c[w>>2]|0)-1|0)|0;D=c[r>>2]|0;E=(c[g>>2]|0)-D|0;c[g>>2]=E;if(!(D>>>0<=(c[x>>2]|0)>>>0&E>>>0>2>>>0)){E=(c[k>>2]|0)+D|0;c[k>>2]=E;c[r>>2]=0;H=c[l>>2]|0;I=d[H+E|0]|0;c[i>>2]=I;c[i>>2]=((d[H+(E+1)|0]|0)^I<<c[j>>2])&c[m>>2];J=A;K=E;break}c[r>>2]=D-1;do{D=c[k>>2]|0;E=D+1|0;c[k>>2]=E;I=((d[(c[l>>2]|0)+(D+3)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=I;b[(c[p>>2]|0)+((c[o>>2]&E)<<1)>>1]=b[(c[n>>2]|0)+(I<<1)>>1]|0;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];I=(c[r>>2]|0)-1|0;c[r>>2]=I;}while((I|0)!=0);I=(c[k>>2]|0)+1|0;c[k>>2]=I;J=A;K=I}else{I=a[(c[l>>2]|0)+(c[k>>2]|0)|0]|0;b[(c[u>>2]|0)+(c[t>>2]<<1)>>1]=0;E=c[t>>2]|0;c[t>>2]=E+1;a[(c[v>>2]|0)+E|0]=I;E=e+148+((I&255)<<2)|0;b[E>>1]=(b[E>>1]|0)+1;E=(c[t>>2]|0)==((c[w>>2]|0)-1|0)|0;c[g>>2]=(c[g>>2]|0)-1;I=(c[k>>2]|0)+1|0;c[k>>2]=I;J=E;K=I}}while(0);if((J|0)==0){continue}I=c[y>>2]|0;if((I|0)>-1){L=(c[l>>2]|0)+I|0}else{L=0}Og(e,L,K-I|0,0);c[y>>2]=c[k>>2];I=c[z>>2]|0;E=c[I+28>>2]|0;Mg(E);D=E+20|0;H=c[D>>2]|0;M=I+16|0;N=c[M>>2]|0;O=H>>>0>N>>>0?N:H;do{if((O|0)!=0){H=I+12|0;N=E+16|0;tF(c[H>>2]|0,c[N>>2]|0,O)|0;c[H>>2]=(c[H>>2]|0)+O;c[N>>2]=(c[N>>2]|0)+O;H=I+20|0;c[H>>2]=(c[H>>2]|0)+O;c[M>>2]=(c[M>>2]|0)-O;H=c[D>>2]|0;c[D>>2]=H-O;if((H|0)!=(O|0)){break}c[N>>2]=c[E+8>>2]}}while(0);if((c[(c[z>>2]|0)+16>>2]|0)==0){B=0;C=41;break}}if((C|0)==26){K=c[k>>2]|0;c[e+5812>>2]=K>>>0<2>>>0?K:2;if((f|0)==4){f=c[y>>2]|0;if((f|0)>-1){P=(c[l>>2]|0)+f|0}else{P=0}Og(e,P,K-f|0,1);c[y>>2]=c[k>>2];f=c[z>>2]|0;P=c[f+28>>2]|0;Mg(P);L=P+20|0;J=c[L>>2]|0;g=f+16|0;w=c[g>>2]|0;v=J>>>0>w>>>0?w:J;do{if((v|0)!=0){J=f+12|0;w=P+16|0;tF(c[J>>2]|0,c[w>>2]|0,v)|0;c[J>>2]=(c[J>>2]|0)+v;c[w>>2]=(c[w>>2]|0)+v;J=f+20|0;c[J>>2]=(c[J>>2]|0)+v;c[g>>2]=(c[g>>2]|0)-v;J=c[L>>2]|0;c[L>>2]=J-v;if((J|0)!=(v|0)){break}c[w>>2]=c[P+8>>2]}}while(0);B=(c[(c[z>>2]|0)+16>>2]|0)==0?2:3;return B|0}do{if((c[t>>2]|0)!=0){P=c[y>>2]|0;if((P|0)>-1){Q=(c[l>>2]|0)+P|0}else{Q=0}Og(e,Q,K-P|0,0);c[y>>2]=c[k>>2];P=c[z>>2]|0;v=c[P+28>>2]|0;Mg(v);L=v+20|0;g=c[L>>2]|0;f=P+16|0;w=c[f>>2]|0;J=g>>>0>w>>>0?w:g;do{if((J|0)!=0){g=P+12|0;w=v+16|0;tF(c[g>>2]|0,c[w>>2]|0,J)|0;c[g>>2]=(c[g>>2]|0)+J;c[w>>2]=(c[w>>2]|0)+J;g=P+20|0;c[g>>2]=(c[g>>2]|0)+J;c[f>>2]=(c[f>>2]|0)-J;g=c[L>>2]|0;c[L>>2]=g-J;if((g|0)!=(J|0)){break}c[w>>2]=c[v+8>>2]}}while(0);if((c[(c[z>>2]|0)+16>>2]|0)==0){B=0}else{break}return B|0}}while(0);B=1;return B|0}else if((C|0)==41){return B|0}return 0}function Hg(e,f){e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;g=e+116|0;h=(f|0)==0;i=e+72|0;j=e+88|0;k=e+108|0;l=e+56|0;m=e+84|0;n=e+68|0;o=e+52|0;p=e+64|0;q=e+96|0;r=e+120|0;s=e+112|0;t=e+100|0;u=e+5792|0;v=e+5796|0;w=e+5784|0;x=e+5788|0;y=e+104|0;z=e+92|0;A=e|0;B=e+128|0;C=e+44|0;D=e+136|0;a:while(1){E=c[g>>2]|0;while(1){do{if(E>>>0<262>>>0){Cg(e);F=c[g>>2]|0;if(F>>>0<262>>>0&h){G=0;H=57;break a}if((F|0)==0){H=40;break a}if(F>>>0>2>>>0){H=8;break}c[r>>2]=c[q>>2];c[t>>2]=c[s>>2];c[q>>2]=2;I=2;H=16}else{H=8}}while(0);do{if((H|0)==8){H=0;F=c[k>>2]|0;J=((d[(c[l>>2]|0)+(F+2)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=J;K=b[(c[n>>2]|0)+(J<<1)>>1]|0;b[(c[p>>2]|0)+((c[o>>2]&F)<<1)>>1]=K;F=K&65535;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];J=c[q>>2]|0;c[r>>2]=J;c[t>>2]=c[s>>2];c[q>>2]=2;if(K<<16>>16==0){I=2;H=16;break}if(J>>>0>=(c[B>>2]|0)>>>0){L=J;M=2;break}if(((c[k>>2]|0)-F|0)>>>0>((c[C>>2]|0)-262|0)>>>0){I=2;H=16;break}J=Ig(e,F)|0;c[q>>2]=J;if(J>>>0>=6>>>0){I=J;H=16;break}if((c[D>>2]|0)!=1){if((J|0)!=3){I=J;H=16;break}if(((c[k>>2]|0)-(c[s>>2]|0)|0)>>>0<=4096>>>0){I=3;H=16;break}}c[q>>2]=2;I=2;H=16}}while(0);if((H|0)==16){H=0;L=c[r>>2]|0;M=I}if(!(L>>>0<3>>>0|M>>>0>L>>>0)){break}if((c[y>>2]|0)==0){c[y>>2]=1;c[k>>2]=(c[k>>2]|0)+1;J=(c[g>>2]|0)-1|0;c[g>>2]=J;E=J;continue}J=a[(c[l>>2]|0)+((c[k>>2]|0)-1)|0]|0;b[(c[v>>2]|0)+(c[u>>2]<<1)>>1]=0;F=c[u>>2]|0;c[u>>2]=F+1;a[(c[w>>2]|0)+F|0]=J;F=e+148+((J&255)<<2)|0;b[F>>1]=(b[F>>1]|0)+1;do{if((c[u>>2]|0)==((c[x>>2]|0)-1|0)){F=c[z>>2]|0;if((F|0)>-1){N=(c[l>>2]|0)+F|0}else{N=0}Og(e,N,(c[k>>2]|0)-F|0,0);c[z>>2]=c[k>>2];F=c[A>>2]|0;J=c[F+28>>2]|0;Mg(J);K=J+20|0;O=c[K>>2]|0;P=F+16|0;Q=c[P>>2]|0;R=O>>>0>Q>>>0?Q:O;if((R|0)==0){break}O=F+12|0;Q=J+16|0;tF(c[O>>2]|0,c[Q>>2]|0,R)|0;c[O>>2]=(c[O>>2]|0)+R;c[Q>>2]=(c[Q>>2]|0)+R;O=F+20|0;c[O>>2]=(c[O>>2]|0)+R;c[P>>2]=(c[P>>2]|0)-R;P=c[K>>2]|0;c[K>>2]=P-R;if((P|0)!=(R|0)){break}c[Q>>2]=c[J+8>>2]}}while(0);c[k>>2]=(c[k>>2]|0)+1;J=(c[g>>2]|0)-1|0;c[g>>2]=J;if((c[(c[A>>2]|0)+16>>2]|0)==0){G=0;H=57;break a}else{E=J}}E=c[k>>2]|0;J=E-3+(c[g>>2]|0)|0;Q=L+253|0;R=E+65535-(c[t>>2]|0)&65535;b[(c[v>>2]|0)+(c[u>>2]<<1)>>1]=R;E=c[u>>2]|0;c[u>>2]=E+1;a[(c[w>>2]|0)+E|0]=Q;E=R-1&65535;R=e+148+((d[169e3+(Q&255)|0]|0|256)+1<<2)|0;b[R>>1]=(b[R>>1]|0)+1;R=E&65535;if((E&65535)>>>0<256>>>0){S=R}else{S=(R>>>7)+256|0}R=e+2440+((d[169256+S|0]|0)<<2)|0;b[R>>1]=(b[R>>1]|0)+1;R=c[u>>2]|0;E=(c[x>>2]|0)-1|0;Q=c[r>>2]|0;c[g>>2]=1-Q+(c[g>>2]|0);P=Q-2|0;c[r>>2]=P;Q=P;do{P=c[k>>2]|0;K=P+1|0;c[k>>2]=K;if(K>>>0>J>>>0){T=Q}else{O=((d[(c[l>>2]|0)+(P+3)|0]|0)^c[i>>2]<<c[j>>2])&c[m>>2];c[i>>2]=O;b[(c[p>>2]|0)+((c[o>>2]&K)<<1)>>1]=b[(c[n>>2]|0)+(O<<1)>>1]|0;b[(c[n>>2]|0)+(c[i>>2]<<1)>>1]=c[k>>2];T=c[r>>2]|0}Q=T-1|0;c[r>>2]=Q;}while((Q|0)!=0);c[y>>2]=0;c[q>>2]=2;Q=(c[k>>2]|0)+1|0;c[k>>2]=Q;if((R|0)!=(E|0)){continue}J=c[z>>2]|0;if((J|0)>-1){U=(c[l>>2]|0)+J|0}else{U=0}Og(e,U,Q-J|0,0);c[z>>2]=c[k>>2];J=c[A>>2]|0;Q=c[J+28>>2]|0;Mg(Q);O=Q+20|0;K=c[O>>2]|0;P=J+16|0;F=c[P>>2]|0;V=K>>>0>F>>>0?F:K;do{if((V|0)!=0){K=J+12|0;F=Q+16|0;tF(c[K>>2]|0,c[F>>2]|0,V)|0;c[K>>2]=(c[K>>2]|0)+V;c[F>>2]=(c[F>>2]|0)+V;K=J+20|0;c[K>>2]=(c[K>>2]|0)+V;c[P>>2]=(c[P>>2]|0)-V;K=c[O>>2]|0;c[O>>2]=K-V;if((K|0)!=(V|0)){break}c[F>>2]=c[Q+8>>2]}}while(0);if((c[(c[A>>2]|0)+16>>2]|0)==0){G=0;H=57;break}}if((H|0)==40){if((c[y>>2]|0)!=0){U=a[(c[l>>2]|0)+((c[k>>2]|0)-1)|0]|0;b[(c[v>>2]|0)+(c[u>>2]<<1)>>1]=0;v=c[u>>2]|0;c[u>>2]=v+1;a[(c[w>>2]|0)+v|0]=U;v=e+148+((U&255)<<2)|0;b[v>>1]=(b[v>>1]|0)+1;c[y>>2]=0}y=c[k>>2]|0;c[e+5812>>2]=y>>>0<2>>>0?y:2;if((f|0)==4){f=c[z>>2]|0;if((f|0)>-1){W=(c[l>>2]|0)+f|0}else{W=0}Og(e,W,y-f|0,1);c[z>>2]=c[k>>2];f=c[A>>2]|0;W=c[f+28>>2]|0;Mg(W);v=W+20|0;U=c[v>>2]|0;w=f+16|0;q=c[w>>2]|0;r=U>>>0>q>>>0?q:U;do{if((r|0)!=0){U=f+12|0;q=W+16|0;tF(c[U>>2]|0,c[q>>2]|0,r)|0;c[U>>2]=(c[U>>2]|0)+r;c[q>>2]=(c[q>>2]|0)+r;U=f+20|0;c[U>>2]=(c[U>>2]|0)+r;c[w>>2]=(c[w>>2]|0)-r;U=c[v>>2]|0;c[v>>2]=U-r;if((U|0)!=(r|0)){break}c[q>>2]=c[W+8>>2]}}while(0);G=(c[(c[A>>2]|0)+16>>2]|0)==0?2:3;return G|0}do{if((c[u>>2]|0)!=0){W=c[z>>2]|0;if((W|0)>-1){X=(c[l>>2]|0)+W|0}else{X=0}Og(e,X,y-W|0,0);c[z>>2]=c[k>>2];W=c[A>>2]|0;r=c[W+28>>2]|0;Mg(r);v=r+20|0;w=c[v>>2]|0;f=W+16|0;q=c[f>>2]|0;U=w>>>0>q>>>0?q:w;do{if((U|0)!=0){w=W+12|0;q=r+16|0;tF(c[w>>2]|0,c[q>>2]|0,U)|0;c[w>>2]=(c[w>>2]|0)+U;c[q>>2]=(c[q>>2]|0)+U;w=W+20|0;c[w>>2]=(c[w>>2]|0)+U;c[f>>2]=(c[f>>2]|0)-U;w=c[v>>2]|0;c[v>>2]=w-U;if((w|0)!=(U|0)){break}c[q>>2]=c[r+8>>2]}}while(0);if((c[(c[A>>2]|0)+16>>2]|0)==0){G=0}else{break}return G|0}}while(0);G=1;return G|0}else if((H|0)==57){return G|0}return 0}function Ig(b,d){b=b|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=c[b+124>>2]|0;g=c[b+56>>2]|0;h=c[b+108>>2]|0;i=g+h|0;j=c[b+120>>2]|0;k=c[b+144>>2]|0;l=(c[b+44>>2]|0)-262|0;m=h>>>0>l>>>0?h-l|0:0;l=c[b+64>>2]|0;n=c[b+52>>2]|0;o=g+(h+258)|0;p=c[b+116>>2]|0;q=k>>>0>p>>>0?p:k;k=b+112|0;r=g+(h+1)|0;s=g+(h+2)|0;t=o;u=h+257|0;v=a[g+(j+h)|0]|0;w=a[g+(h-1+j)|0]|0;x=d;d=j>>>0<(c[b+140>>2]|0)>>>0?f:f>>>2;f=j;a:while(1){j=g+x|0;do{if((a[g+(x+f)|0]|0)==v<<24>>24){if((a[g+(f-1+x)|0]|0)!=w<<24>>24){y=v;z=w;A=f;break}if((a[j]|0)!=(a[i]|0)){y=v;z=w;A=f;break}if((a[g+(x+1)|0]|0)!=(a[r]|0)){y=v;z=w;A=f;break}b=s;B=g+(x+2)|0;while(1){C=b+1|0;if((a[C]|0)!=(a[B+1|0]|0)){D=C;break}C=b+2|0;if((a[C]|0)!=(a[B+2|0]|0)){D=C;break}C=b+3|0;if((a[C]|0)!=(a[B+3|0]|0)){D=C;break}C=b+4|0;if((a[C]|0)!=(a[B+4|0]|0)){D=C;break}C=b+5|0;if((a[C]|0)!=(a[B+5|0]|0)){D=C;break}C=b+6|0;if((a[C]|0)!=(a[B+6|0]|0)){D=C;break}C=b+7|0;if((a[C]|0)!=(a[B+7|0]|0)){D=C;break}C=b+8|0;E=B+8|0;if((a[C]|0)==(a[E]|0)&C>>>0<o>>>0){b=C;B=E}else{D=C;break}}B=D-t|0;b=B+258|0;if((b|0)<=(f|0)){y=v;z=w;A=f;break}c[k>>2]=x;if((b|0)>=(q|0)){F=b;G=20;break a}y=a[g+(b+h)|0]|0;z=a[g+(u+B)|0]|0;A=b}else{y=v;z=w;A=f}}while(0);j=e[l+((x&n)<<1)>>1]|0;if(j>>>0<=m>>>0){F=A;G=20;break}b=d-1|0;if((b|0)==0){F=A;G=20;break}else{v=y;w=z;x=j;d=b;f=A}}if((G|0)==20){return(F>>>0>p>>>0?p:F)|0}return 0}function Jg(a){a=a|0;c[a+2840>>2]=a+148;c[a+2848>>2]=11576;c[a+2852>>2]=a+2440;c[a+2860>>2]=11720;c[a+2864>>2]=a+2684;c[a+2872>>2]=11744;b[a+5816>>1]=0;c[a+5820>>2]=0;Kg(a);return}function Kg(a){a=a|0;var d=0;d=0;do{b[a+148+(d<<2)>>1]=0;d=d+1|0;}while((d|0)<286);b[a+2440>>1]=0;b[a+2444>>1]=0;b[a+2448>>1]=0;b[a+2452>>1]=0;b[a+2456>>1]=0;b[a+2460>>1]=0;b[a+2464>>1]=0;b[a+2468>>1]=0;b[a+2472>>1]=0;b[a+2476>>1]=0;b[a+2480>>1]=0;b[a+2484>>1]=0;b[a+2488>>1]=0;b[a+2492>>1]=0;b[a+2496>>1]=0;b[a+2500>>1]=0;b[a+2504>>1]=0;b[a+2508>>1]=0;b[a+2512>>1]=0;b[a+2516>>1]=0;b[a+2520>>1]=0;b[a+2524>>1]=0;b[a+2528>>1]=0;b[a+2532>>1]=0;b[a+2536>>1]=0;b[a+2540>>1]=0;b[a+2544>>1]=0;b[a+2548>>1]=0;b[a+2552>>1]=0;b[a+2556>>1]=0;b[a+2684>>1]=0;b[a+2688>>1]=0;b[a+2692>>1]=0;b[a+2696>>1]=0;b[a+2700>>1]=0;b[a+2704>>1]=0;b[a+2708>>1]=0;b[a+2712>>1]=0;b[a+2716>>1]=0;b[a+2720>>1]=0;b[a+2724>>1]=0;b[a+2728>>1]=0;b[a+2732>>1]=0;b[a+2736>>1]=0;b[a+2740>>1]=0;b[a+2744>>1]=0;b[a+2748>>1]=0;b[a+2752>>1]=0;b[a+2756>>1]=0;b[a+1172>>1]=1;c[a+5804>>2]=0;c[a+5800>>2]=0;c[a+5808>>2]=0;c[a+5792>>2]=0;return}function Lg(d,f,g,h){d=d|0;f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;i=d+5820|0;j=c[i>>2]|0;k=h&65535;h=d+5816|0;l=e[h>>1]|0|k<<j;b[h>>1]=l;if((j|0)>13){m=d+20|0;n=c[m>>2]|0;c[m>>2]=n+1;o=d+8|0;a[(c[o>>2]|0)+n|0]=l;n=(e[h>>1]|0)>>>8&255;p=c[m>>2]|0;c[m>>2]=p+1;a[(c[o>>2]|0)+p|0]=n;n=c[i>>2]|0;p=k>>>((16-n|0)>>>0);b[h>>1]=p;q=n-13|0;r=p&255}else{q=j+3|0;r=l&255}c[i>>2]=q;do{if((q|0)>8){l=d+20|0;j=c[l>>2]|0;c[l>>2]=j+1;p=d+8|0;a[(c[p>>2]|0)+j|0]=r;j=(e[h>>1]|0)>>>8&255;n=c[l>>2]|0;c[l>>2]=n+1;a[(c[p>>2]|0)+n|0]=j;s=l;t=p}else{p=d+20|0;if((q|0)>0){l=c[p>>2]|0;c[p>>2]=l+1;j=d+8|0;a[(c[j>>2]|0)+l|0]=r;s=p;t=j;break}else{s=p;t=d+8|0;break}}}while(0);b[h>>1]=0;c[i>>2]=0;i=c[s>>2]|0;c[s>>2]=i+1;a[(c[t>>2]|0)+i|0]=g;i=c[s>>2]|0;c[s>>2]=i+1;a[(c[t>>2]|0)+i|0]=g>>>8;i=g&65535^65535;h=c[s>>2]|0;c[s>>2]=h+1;a[(c[t>>2]|0)+h|0]=i;h=c[s>>2]|0;c[s>>2]=h+1;a[(c[t>>2]|0)+h|0]=i>>>8;if((g|0)==0){return}else{u=g;v=f}while(1){f=u-1|0;g=a[v]|0;i=c[s>>2]|0;c[s>>2]=i+1;a[(c[t>>2]|0)+i|0]=g;if((f|0)==0){break}else{u=f;v=v+1|0}}return}function Mg(d){d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=d+5820|0;g=c[f>>2]|0;if((g|0)==16){h=d+5816|0;i=b[h>>1]&255;j=d+20|0;k=c[j>>2]|0;c[j>>2]=k+1;l=d+8|0;a[(c[l>>2]|0)+k|0]=i;i=(e[h>>1]|0)>>>8&255;k=c[j>>2]|0;c[j>>2]=k+1;a[(c[l>>2]|0)+k|0]=i;b[h>>1]=0;c[f>>2]=0;return}if((g|0)<=7){return}g=d+5816|0;h=b[g>>1]&255;i=d+20|0;k=c[i>>2]|0;c[i>>2]=k+1;a[(c[d+8>>2]|0)+k|0]=h;b[g>>1]=(e[g>>1]|0)>>>8;c[f>>2]=(c[f>>2]|0)-8;return}function Ng(d){d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=d+5820|0;g=c[f>>2]|0;h=d+5816|0;i=e[h>>1]|0|2<<g;b[h>>1]=i;if((g|0)>13){j=d+20|0;k=c[j>>2]|0;c[j>>2]=k+1;l=d+8|0;a[(c[l>>2]|0)+k|0]=i;k=(e[h>>1]|0)>>>8&255;m=c[j>>2]|0;c[j>>2]=m+1;a[(c[l>>2]|0)+m|0]=k;k=c[f>>2]|0;m=2>>>((16-k|0)>>>0);b[h>>1]=m;n=k-13|0;o=m&255}else{n=g+3|0;o=i&255}c[f>>2]=n;if((n|0)>9){i=d+20|0;g=c[i>>2]|0;c[i>>2]=g+1;m=d+8|0;a[(c[m>>2]|0)+g|0]=o;g=(e[h>>1]|0)>>>8&255;k=c[i>>2]|0;c[i>>2]=k+1;a[(c[m>>2]|0)+k|0]=g;b[h>>1]=0;p=(c[f>>2]|0)-9|0;q=0}else{p=n+7|0;q=o}c[f>>2]=p;if((p|0)==16){o=d+20|0;n=c[o>>2]|0;c[o>>2]=n+1;g=d+8|0;a[(c[g>>2]|0)+n|0]=q;n=(e[h>>1]|0)>>>8&255;k=c[o>>2]|0;c[o>>2]=k+1;a[(c[g>>2]|0)+k|0]=n;b[h>>1]=0;c[f>>2]=0;return}if((p|0)<=7){return}p=d+20|0;n=c[p>>2]|0;c[p>>2]=n+1;a[(c[d+8>>2]|0)+n|0]=q;b[h>>1]=(e[h>>1]|0)>>>8;c[f>>2]=(c[f>>2]|0)-8;return}function Og(f,g,h,i){f=f|0;g=g|0;h=h|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;if((c[f+132>>2]|0)>0){j=(c[f>>2]|0)+44|0;if((c[j>>2]|0)==2){k=-201342849;l=0;while(1){if((k&1|0)!=0){if((b[f+148+(l<<2)>>1]|0)!=0){m=0;break}}n=l+1|0;if((n|0)<32){k=k>>>1;l=n}else{o=6;break}}a:do{if((o|0)==6){if((b[f+184>>1]|0)!=0){m=1;break}if((b[f+188>>1]|0)!=0){m=1;break}if((b[f+200>>1]|0)==0){p=32}else{m=1;break}while(1){l=p+1|0;if((b[f+148+(p<<2)>>1]|0)!=0){m=1;break a}if((l|0)<256){p=l}else{m=0;break}}}}while(0);c[j>>2]=m}Pg(f,f+2840|0);Pg(f,f+2852|0);Sg(f,f+148|0,c[f+2844>>2]|0);Sg(f,f+2440|0,c[f+2856>>2]|0);Pg(f,f+2864|0);m=18;while(1){j=m-1|0;if((b[f+2684+(d[71328+m|0]<<2)+2>>1]|0)!=0){q=m;break}if((j|0)>2){m=j}else{q=j;break}}m=f+5800|0;j=(q*3|0)+17+(c[m>>2]|0)|0;c[m>>2]=j;m=(j+10|0)>>>3;j=((c[f+5804>>2]|0)+10|0)>>>3;r=j>>>0>m>>>0?m:j;s=j;t=q}else{q=h+5|0;r=q;s=q;t=0}do{if((h+4|0)>>>0>r>>>0|(g|0)==0){q=f+5820|0;j=c[q>>2]|0;m=(j|0)>13;if((c[f+136>>2]|0)==4|(s|0)==(r|0)){p=i+2&65535;o=f+5816|0;l=e[o>>1]|p<<j;b[o>>1]=l;if(m){k=f+20|0;n=c[k>>2]|0;c[k>>2]=n+1;u=f+8|0;a[(c[u>>2]|0)+n|0]=l;l=(e[o>>1]|0)>>>8&255;n=c[k>>2]|0;c[k>>2]=n+1;a[(c[u>>2]|0)+n|0]=l;l=c[q>>2]|0;b[o>>1]=p>>>((16-l|0)>>>0);v=l-13|0}else{v=j+3|0}c[q>>2]=v;Qg(f,10424,11600);break}l=i+4&65535;p=f+5816|0;o=e[p>>1]|l<<j;n=o&65535;b[p>>1]=n;if(m){m=f+20|0;u=c[m>>2]|0;c[m>>2]=u+1;k=f+8|0;a[(c[k>>2]|0)+u|0]=o;o=(e[p>>1]|0)>>>8&255;u=c[m>>2]|0;c[m>>2]=u+1;a[(c[k>>2]|0)+u|0]=o;o=c[q>>2]|0;u=l>>>((16-o|0)>>>0)&65535;b[p>>1]=u;w=o-13|0;x=u}else{w=j+3|0;x=n}c[q>>2]=w;n=c[f+2844>>2]|0;j=c[f+2856>>2]|0;u=n+65280&65535;o=x&65535|u<<w;l=o&65535;b[p>>1]=l;if((w|0)>11){k=f+20|0;m=c[k>>2]|0;c[k>>2]=m+1;y=f+8|0;a[(c[y>>2]|0)+m|0]=o;o=(e[p>>1]|0)>>>8&255;m=c[k>>2]|0;c[k>>2]=m+1;a[(c[y>>2]|0)+m|0]=o;o=c[q>>2]|0;m=u>>>((16-o|0)>>>0)&65535;b[p>>1]=m;z=o-11|0;A=m}else{z=w+5|0;A=l}c[q>>2]=z;l=j&65535;m=l<<z|A&65535;o=m&65535;b[p>>1]=o;if((z|0)>11){u=f+20|0;y=c[u>>2]|0;c[u>>2]=y+1;k=f+8|0;a[(c[k>>2]|0)+y|0]=m;m=(e[p>>1]|0)>>>8&255;y=c[u>>2]|0;c[u>>2]=y+1;a[(c[k>>2]|0)+y|0]=m;m=c[q>>2]|0;y=l>>>((16-m|0)>>>0)&65535;b[p>>1]=y;B=m-11|0;C=y}else{B=z+5|0;C=o}c[q>>2]=B;o=t+65533&65535;y=o<<B|C&65535;m=y&65535;b[p>>1]=m;if((B|0)>12){l=f+20|0;k=c[l>>2]|0;c[l>>2]=k+1;u=f+8|0;a[(c[u>>2]|0)+k|0]=y;y=(e[p>>1]|0)>>>8&255;k=c[l>>2]|0;c[l>>2]=k+1;a[(c[u>>2]|0)+k|0]=y;y=c[q>>2]|0;k=o>>>((16-y|0)>>>0)&65535;b[p>>1]=k;D=y-12|0;E=k}else{D=B+4|0;E=m}c[q>>2]=D;if((t|0)>-1){m=f+20|0;k=f+8|0;y=0;o=D;u=E;while(1){l=e[f+2684+(d[71328+y|0]<<2)+2>>1]|0;F=l<<o|u&65535;G=F&65535;b[p>>1]=G;if((o|0)>13){H=c[m>>2]|0;c[m>>2]=H+1;a[(c[k>>2]|0)+H|0]=F;F=(e[p>>1]|0)>>>8&255;H=c[m>>2]|0;c[m>>2]=H+1;a[(c[k>>2]|0)+H|0]=F;F=c[q>>2]|0;H=l>>>((16-F|0)>>>0)&65535;b[p>>1]=H;I=F-13|0;J=H}else{I=o+3|0;J=G}c[q>>2]=I;if((y|0)<(t|0)){y=y+1|0;o=I;u=J}else{break}}}u=f+148|0;Rg(f,u,n);o=f+2440|0;Rg(f,o,j);Qg(f,u,o)}else{Lg(f,g,h,i)}}while(0);Kg(f);if((i|0)==0){return}i=f+5820|0;h=c[i>>2]|0;do{if((h|0)>8){g=f+5816|0;J=b[g>>1]&255;I=f+20|0;t=c[I>>2]|0;c[I>>2]=t+1;E=f+8|0;a[(c[E>>2]|0)+t|0]=J;J=(e[g>>1]|0)>>>8&255;t=c[I>>2]|0;c[I>>2]=t+1;a[(c[E>>2]|0)+t|0]=J;K=g}else{g=f+5816|0;if((h|0)<=0){K=g;break}J=b[g>>1]&255;t=f+20|0;E=c[t>>2]|0;c[t>>2]=E+1;a[(c[f+8>>2]|0)+E|0]=J;K=g}}while(0);b[K>>1]=0;c[i>>2]=0;return}function Pg(f,g){f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;h=i;i=i+32|0;j=h|0;k=g|0;l=c[k>>2]|0;m=g+8|0;n=c[m>>2]|0;o=c[n>>2]|0;p=c[n+12>>2]|0;n=f+5200|0;c[n>>2]=0;q=f+5204|0;c[q>>2]=573;if((p|0)>0){r=0;s=-1;while(1){if((b[l+(r<<2)>>1]|0)==0){b[l+(r<<2)+2>>1]=0;t=s}else{u=(c[n>>2]|0)+1|0;c[n>>2]=u;c[f+2908+(u<<2)>>2]=r;a[f+5208+r|0]=0;t=r}u=r+1|0;if((u|0)<(p|0)){r=u;s=t}else{break}}s=c[n>>2]|0;if((s|0)<2){v=s;w=t;x=3}else{y=t}}else{v=0;w=-1;x=3}if((x|0)==3){x=f+5800|0;t=f+5804|0;if((o|0)==0){s=w;r=v;while(1){u=(s|0)<2;z=s+1|0;A=u?z:s;B=u?z:0;z=r+1|0;c[n>>2]=z;c[f+2908+(z<<2)>>2]=B;b[l+(B<<2)>>1]=1;a[f+5208+B|0]=0;c[x>>2]=(c[x>>2]|0)-1;B=c[n>>2]|0;if((B|0)<2){s=A;r=B}else{y=A;break}}}else{r=w;w=v;while(1){v=(r|0)<2;s=r+1|0;A=v?s:r;B=v?s:0;s=w+1|0;c[n>>2]=s;c[f+2908+(s<<2)>>2]=B;b[l+(B<<2)>>1]=1;a[f+5208+B|0]=0;c[x>>2]=(c[x>>2]|0)-1;c[t>>2]=(c[t>>2]|0)-(e[o+(B<<2)+2>>1]|0);B=c[n>>2]|0;if((B|0)<2){r=A;w=B}else{y=A;break}}}}w=g+4|0;c[w>>2]=y;g=c[n>>2]|0;if((g|0)>1){r=(g|0)/2|0;o=g;while(1){t=c[f+2908+(r<<2)>>2]|0;x=f+5208+t|0;A=r<<1;a:do{if((A|0)>(o|0)){C=r}else{B=l+(t<<2)|0;s=r;v=A;z=o;while(1){do{if((v|0)<(z|0)){u=v|1;D=c[f+2908+(u<<2)>>2]|0;E=b[l+(D<<2)>>1]|0;F=c[f+2908+(v<<2)>>2]|0;G=b[l+(F<<2)>>1]|0;if((E&65535)>>>0>=(G&65535)>>>0){if(E<<16>>16!=G<<16>>16){H=v;break}if((d[f+5208+D|0]|0)>>>0>(d[f+5208+F|0]|0)>>>0){H=v;break}}H=u}else{H=v}}while(0);u=b[B>>1]|0;F=c[f+2908+(H<<2)>>2]|0;D=b[l+(F<<2)>>1]|0;if((u&65535)>>>0<(D&65535)>>>0){C=s;break a}if(u<<16>>16==D<<16>>16){if((d[x]|0)>>>0<=(d[f+5208+F|0]|0)>>>0){C=s;break a}}c[f+2908+(s<<2)>>2]=F;F=H<<1;D=c[n>>2]|0;if((F|0)>(D|0)){C=H;break}else{s=H;v=F;z=D}}}}while(0);c[f+2908+(C<<2)>>2]=t;x=r-1|0;A=c[n>>2]|0;if((x|0)>0){r=x;o=A}else{I=A;break}}}else{I=g}g=f+2912|0;o=p;p=I;while(1){I=c[g>>2]|0;r=p-1|0;c[n>>2]=r;C=c[f+2908+(p<<2)>>2]|0;c[g>>2]=C;H=f+5208+C|0;b:do{if((p|0)<3){J=1}else{A=l+(C<<2)|0;x=1;z=2;v=r;while(1){do{if((z|0)<(v|0)){s=z|1;B=c[f+2908+(s<<2)>>2]|0;D=b[l+(B<<2)>>1]|0;F=c[f+2908+(z<<2)>>2]|0;u=b[l+(F<<2)>>1]|0;if((D&65535)>>>0>=(u&65535)>>>0){if(D<<16>>16!=u<<16>>16){K=z;break}if((d[f+5208+B|0]|0)>>>0>(d[f+5208+F|0]|0)>>>0){K=z;break}}K=s}else{K=z}}while(0);s=b[A>>1]|0;F=c[f+2908+(K<<2)>>2]|0;B=b[l+(F<<2)>>1]|0;if((s&65535)>>>0<(B&65535)>>>0){J=x;break b}if(s<<16>>16==B<<16>>16){if((d[H]|0)>>>0<=(d[f+5208+F|0]|0)>>>0){J=x;break b}}c[f+2908+(x<<2)>>2]=F;F=K<<1;B=c[n>>2]|0;if((F|0)>(B|0)){J=K;break}else{x=K;z=F;v=B}}}}while(0);c[f+2908+(J<<2)>>2]=C;H=c[g>>2]|0;r=(c[q>>2]|0)-1|0;c[q>>2]=r;c[f+2908+(r<<2)>>2]=I;r=(c[q>>2]|0)-1|0;c[q>>2]=r;c[f+2908+(r<<2)>>2]=H;r=l+(o<<2)|0;b[r>>1]=(b[l+(H<<2)>>1]|0)+(b[l+(I<<2)>>1]|0);t=a[f+5208+I|0]|0;v=a[f+5208+H|0]|0;z=f+5208+o|0;a[z]=((t&255)>>>0<(v&255)>>>0?v:t)+1;t=o&65535;b[l+(H<<2)+2>>1]=t;b[l+(I<<2)+2>>1]=t;t=o+1|0;c[g>>2]=o;H=c[n>>2]|0;c:do{if((H|0)<2){L=1}else{v=1;x=2;A=H;while(1){do{if((x|0)<(A|0)){B=x|1;F=c[f+2908+(B<<2)>>2]|0;s=b[l+(F<<2)>>1]|0;u=c[f+2908+(x<<2)>>2]|0;D=b[l+(u<<2)>>1]|0;if((s&65535)>>>0>=(D&65535)>>>0){if(s<<16>>16!=D<<16>>16){M=x;break}if((d[f+5208+F|0]|0)>>>0>(d[f+5208+u|0]|0)>>>0){M=x;break}}M=B}else{M=x}}while(0);B=b[r>>1]|0;u=c[f+2908+(M<<2)>>2]|0;F=b[l+(u<<2)>>1]|0;if((B&65535)>>>0<(F&65535)>>>0){L=v;break c}if(B<<16>>16==F<<16>>16){if((d[z]|0)>>>0<=(d[f+5208+u|0]|0)>>>0){L=v;break c}}c[f+2908+(v<<2)>>2]=u;u=M<<1;F=c[n>>2]|0;if((u|0)>(F|0)){L=M;break}else{v=M;x=u;A=F}}}}while(0);c[f+2908+(L<<2)>>2]=o;z=c[n>>2]|0;if((z|0)>1){o=t;p=z}else{break}}p=c[g>>2]|0;g=(c[q>>2]|0)-1|0;c[q>>2]=g;c[f+2908+(g<<2)>>2]=p;p=c[k>>2]|0;k=c[w>>2]|0;w=c[m>>2]|0;m=c[w>>2]|0;g=c[w+4>>2]|0;o=c[w+8>>2]|0;n=c[w+16>>2]|0;w=f+2876|0;vF(w|0,0,32)|0;b[p+(c[f+2908+(c[q>>2]<<2)>>2]<<2)+2>>1]=0;L=(c[q>>2]|0)+1|0;d:do{if((L|0)<573){q=f+5800|0;M=f+5804|0;if((m|0)==0){J=0;K=L;while(1){z=c[f+2908+(K<<2)>>2]|0;r=p+(z<<2)+2|0;H=e[p+(e[r>>1]<<2)+2>>1]|0;I=(H|0)<(n|0);C=I?H+1|0:n;H=(I&1^1)+J|0;b[r>>1]=C;if((z|0)<=(k|0)){r=f+2876+(C<<1)|0;b[r>>1]=(b[r>>1]|0)+1;if((z|0)<(o|0)){N=0}else{N=c[g+(z-o<<2)>>2]|0}r=da(e[p+(z<<2)>>1]|0,N+C|0)|0;c[q>>2]=r+(c[q>>2]|0)}r=K+1|0;if((r|0)<573){J=H;K=r}else{O=H;break}}}else{K=0;J=L;while(1){t=c[f+2908+(J<<2)>>2]|0;H=p+(t<<2)+2|0;r=e[p+(e[H>>1]<<2)+2>>1]|0;C=(r|0)<(n|0);z=C?r+1|0:n;r=(C&1^1)+K|0;b[H>>1]=z;if((t|0)<=(k|0)){H=f+2876+(z<<1)|0;b[H>>1]=(b[H>>1]|0)+1;if((t|0)<(o|0)){P=0}else{P=c[g+(t-o<<2)>>2]|0}H=e[p+(t<<2)>>1]|0;C=da(H,P+z|0)|0;c[q>>2]=C+(c[q>>2]|0);C=da((e[m+(t<<2)+2>>1]|0)+P|0,H)|0;c[M>>2]=C+(c[M>>2]|0)}C=J+1|0;if((C|0)<573){K=r;J=C}else{O=r;break}}}if((O|0)==0){break}J=f+2876+(n<<1)|0;K=O;do{M=n;while(1){r=M-1|0;Q=f+2876+(r<<1)|0;R=b[Q>>1]|0;if(R<<16>>16==0){M=r}else{break}}b[Q>>1]=R-1;r=f+2876+(M<<1)|0;b[r>>1]=(b[r>>1]|0)+2;S=(b[J>>1]|0)-1&65535;b[J>>1]=S;K=K-2|0;}while((K|0)>0);if((n|0)==0){break}else{T=n;U=573;V=S}while(1){K=T&65535;if(V<<16>>16==0){W=U}else{J=V&65535;r=U;while(1){C=r;do{C=C-1|0;X=c[f+2908+(C<<2)>>2]|0;}while((X|0)>(k|0));H=p+(X<<2)+2|0;t=e[H>>1]|0;if((t|0)!=(T|0)){z=da(e[p+(X<<2)>>1]|0,T-t|0)|0;c[q>>2]=z+(c[q>>2]|0);b[H>>1]=K}H=J-1|0;if((H|0)==0){W=C;break}else{J=H;r=C}}}r=T-1|0;if((r|0)==0){break d}T=r;U=W;V=b[f+2876+(r<<1)>>1]|0}}}while(0);V=b[w>>1]<<1;b[j+2>>1]=V;w=((b[f+2878>>1]|0)+V&65535)<<1;b[j+4>>1]=w;V=(w+(b[f+2880>>1]|0)&65535)<<1;b[j+6>>1]=V;w=(V+(b[f+2882>>1]|0)&65535)<<1;b[j+8>>1]=w;V=(w+(b[f+2884>>1]|0)&65535)<<1;b[j+10>>1]=V;w=(V+(b[f+2886>>1]|0)&65535)<<1;b[j+12>>1]=w;V=(w+(b[f+2888>>1]|0)&65535)<<1;b[j+14>>1]=V;w=(V+(b[f+2890>>1]|0)&65535)<<1;b[j+16>>1]=w;V=(w+(b[f+2892>>1]|0)&65535)<<1;b[j+18>>1]=V;w=(V+(b[f+2894>>1]|0)&65535)<<1;b[j+20>>1]=w;V=(w+(b[f+2896>>1]|0)&65535)<<1;b[j+22>>1]=V;w=(V+(b[f+2898>>1]|0)&65535)<<1;b[j+24>>1]=w;V=(w+(b[f+2900>>1]|0)&65535)<<1;b[j+26>>1]=V;w=(V+(b[f+2902>>1]|0)&65535)<<1;b[j+28>>1]=w;b[j+30>>1]=(w+(b[f+2904>>1]|0)&65535)<<1;if((y|0)<0){Y=32;Z=0;i=h;return}else{_=0}while(1){f=b[l+(_<<2)+2>>1]|0;w=f&65535;if(f<<16>>16!=0){f=j+(w<<1)|0;V=b[f>>1]|0;b[f>>1]=V+1;f=0;W=w;w=V&65535;while(1){$=f|w&1;V=W-1|0;if((V|0)>0){f=$<<1;W=V;w=w>>>1}else{break}}b[l+(_<<2)>>1]=$}if((_|0)<(y|0)){_=_+1|0}else{break}}Y=32;Z=0;i=h;return}function Qg(f,g,h){f=f|0;g=g|0;h=h|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;i=f+5792|0;if((c[i>>2]|0)==0){j=c[f+5820>>2]|0;k=b[f+5816>>1]|0}else{l=f+5796|0;m=f+5784|0;n=f+5820|0;o=f+5816|0;p=f+20|0;q=f+8|0;r=0;while(1){s=b[(c[l>>2]|0)+(r<<1)>>1]|0;t=s&65535;u=r+1|0;v=d[(c[m>>2]|0)+r|0]|0;do{if(s<<16>>16==0){w=e[g+(v<<2)+2>>1]|0;x=c[n>>2]|0;y=e[g+(v<<2)>>1]|0;z=e[o>>1]|0|y<<x;A=z&65535;b[o>>1]=A;if((x|0)>(16-w|0)){B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=z;z=(e[o>>1]|0)>>>8&255;B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=z;z=c[n>>2]|0;B=y>>>((16-z|0)>>>0)&65535;b[o>>1]=B;y=w-16+z|0;c[n>>2]=y;C=y;D=B;break}else{B=x+w|0;c[n>>2]=B;C=B;D=A;break}}else{A=d[169e3+v|0]|0;B=(A|256)+1|0;w=e[g+(B<<2)+2>>1]|0;x=c[n>>2]|0;y=e[g+(B<<2)>>1]|0;B=e[o>>1]|0|y<<x;z=B&65535;b[o>>1]=z;if((x|0)>(16-w|0)){E=c[p>>2]|0;c[p>>2]=E+1;a[(c[q>>2]|0)+E|0]=B;B=(e[o>>1]|0)>>>8&255;E=c[p>>2]|0;c[p>>2]=E+1;a[(c[q>>2]|0)+E|0]=B;B=c[n>>2]|0;E=y>>>((16-B|0)>>>0)&65535;b[o>>1]=E;F=w-16+B|0;G=E}else{F=x+w|0;G=z}c[n>>2]=F;z=c[26200+(A<<2)>>2]|0;do{if((A-8|0)>>>0<20>>>0){w=v-(c[71720+(A<<2)>>2]|0)&65535;x=w<<F|G&65535;E=x&65535;b[o>>1]=E;if((F|0)>(16-z|0)){B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=x;x=(e[o>>1]|0)>>>8&255;B=c[p>>2]|0;c[p>>2]=B+1;a[(c[q>>2]|0)+B|0]=x;x=c[n>>2]|0;B=w>>>((16-x|0)>>>0)&65535;b[o>>1]=B;w=z-16+x|0;c[n>>2]=w;H=w;I=B;break}else{B=F+z|0;c[n>>2]=B;H=B;I=E;break}}else{H=F;I=G}}while(0);z=t-1|0;if(z>>>0<256>>>0){J=z}else{J=(z>>>7)+256|0}A=d[169256+J|0]|0;E=e[h+(A<<2)+2>>1]|0;B=e[h+(A<<2)>>1]|0;w=I&65535|B<<H;x=w&65535;b[o>>1]=x;if((H|0)>(16-E|0)){y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=w;w=(e[o>>1]|0)>>>8&255;y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=w;w=c[n>>2]|0;y=B>>>((16-w|0)>>>0)&65535;b[o>>1]=y;K=E-16+w|0;L=y}else{K=H+E|0;L=x}c[n>>2]=K;x=c[26320+(A<<2)>>2]|0;if((A-4|0)>>>0>=26>>>0){C=K;D=L;break}E=z-(c[71840+(A<<2)>>2]|0)&65535;A=E<<K|L&65535;z=A&65535;b[o>>1]=z;if((K|0)>(16-x|0)){y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=A;A=(e[o>>1]|0)>>>8&255;y=c[p>>2]|0;c[p>>2]=y+1;a[(c[q>>2]|0)+y|0]=A;A=c[n>>2]|0;y=E>>>((16-A|0)>>>0)&65535;b[o>>1]=y;E=x-16+A|0;c[n>>2]=E;C=E;D=y;break}else{y=K+x|0;c[n>>2]=y;C=y;D=z;break}}}while(0);if(u>>>0<(c[i>>2]|0)>>>0){r=u}else{j=C;k=D;break}}}D=e[g+1026>>1]|0;C=f+5820|0;r=e[g+1024>>1]|0;g=f+5816|0;i=k&65535|r<<j;b[g>>1]=i;if((j|0)>(16-D|0)){k=f+20|0;n=c[k>>2]|0;c[k>>2]=n+1;K=f+8|0;a[(c[K>>2]|0)+n|0]=i;i=(e[g>>1]|0)>>>8&255;n=c[k>>2]|0;c[k>>2]=n+1;a[(c[K>>2]|0)+n|0]=i;i=c[C>>2]|0;b[g>>1]=r>>>((16-i|0)>>>0);M=D-16+i|0;c[C>>2]=M;return}else{M=j+D|0;c[C>>2]=M;return}}function Rg(d,f,g){d=d|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;h=b[f+2>>1]|0;i=h<<16>>16==0;j=d+2754|0;k=d+5820|0;l=d+2752|0;m=d+5816|0;n=d+20|0;o=d+8|0;p=d+2758|0;q=d+2756|0;r=d+2750|0;s=d+2748|0;t=0;u=-1;v=h&65535;h=i?138:7;w=i?3:4;a:while(1){i=t;x=0;while(1){if((i|0)>(g|0)){break a}y=i+1|0;z=b[f+(y<<2)+2>>1]|0;A=z&65535;B=x+1|0;C=(v|0)==(A|0);if((B|0)<(h|0)&C){i=y;x=B}else{break}}do{if((B|0)<(w|0)){i=d+2684+(v<<2)+2|0;D=d+2684+(v<<2)|0;E=B;F=c[k>>2]|0;G=b[m>>1]|0;while(1){H=e[i>>1]|0;I=e[D>>1]|0;J=G&65535|I<<F;K=J&65535;b[m>>1]=K;if((F|0)>(16-H|0)){L=c[n>>2]|0;c[n>>2]=L+1;a[(c[o>>2]|0)+L|0]=J;J=(e[m>>1]|0)>>>8&255;L=c[n>>2]|0;c[n>>2]=L+1;a[(c[o>>2]|0)+L|0]=J;J=c[k>>2]|0;L=I>>>((16-J|0)>>>0)&65535;b[m>>1]=L;M=H-16+J|0;N=L}else{M=F+H|0;N=K}c[k>>2]=M;K=E-1|0;if((K|0)==0){break}else{E=K;F=M;G=N}}}else{if((v|0)!=0){if((v|0)==(u|0)){O=B;P=c[k>>2]|0;Q=b[m>>1]|0}else{G=e[d+2684+(v<<2)+2>>1]|0;F=c[k>>2]|0;E=e[d+2684+(v<<2)>>1]|0;D=e[m>>1]|0|E<<F;i=D&65535;b[m>>1]=i;if((F|0)>(16-G|0)){K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=D;D=(e[m>>1]|0)>>>8&255;K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=D;D=c[k>>2]|0;K=E>>>((16-D|0)>>>0)&65535;b[m>>1]=K;R=G-16+D|0;S=K}else{R=F+G|0;S=i}c[k>>2]=R;O=x;P=R;Q=S}i=e[r>>1]|0;G=e[s>>1]|0;F=Q&65535|G<<P;K=F&65535;b[m>>1]=K;if((P|0)>(16-i|0)){D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=F;F=(e[m>>1]|0)>>>8&255;D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=F;F=c[k>>2]|0;D=G>>>((16-F|0)>>>0)&65535;b[m>>1]=D;T=i-16+F|0;U=D}else{T=P+i|0;U=K}c[k>>2]=T;K=O+65533&65535;i=U&65535|K<<T;b[m>>1]=i;if((T|0)>14){D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=i;i=(e[m>>1]|0)>>>8&255;D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=i;i=c[k>>2]|0;b[m>>1]=K>>>((16-i|0)>>>0);c[k>>2]=i-14;break}else{c[k>>2]=T+2;break}}if((B|0)<11){i=e[j>>1]|0;K=c[k>>2]|0;D=e[l>>1]|0;F=e[m>>1]|0|D<<K;G=F&65535;b[m>>1]=G;if((K|0)>(16-i|0)){E=c[n>>2]|0;c[n>>2]=E+1;a[(c[o>>2]|0)+E|0]=F;F=(e[m>>1]|0)>>>8&255;E=c[n>>2]|0;c[n>>2]=E+1;a[(c[o>>2]|0)+E|0]=F;F=c[k>>2]|0;E=D>>>((16-F|0)>>>0)&65535;b[m>>1]=E;V=i-16+F|0;W=E}else{V=K+i|0;W=G}c[k>>2]=V;G=x+65534&65535;i=W&65535|G<<V;b[m>>1]=i;if((V|0)>13){K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=i;i=(e[m>>1]|0)>>>8&255;K=c[n>>2]|0;c[n>>2]=K+1;a[(c[o>>2]|0)+K|0]=i;i=c[k>>2]|0;b[m>>1]=G>>>((16-i|0)>>>0);c[k>>2]=i-13;break}else{c[k>>2]=V+3;break}}else{i=e[p>>1]|0;G=c[k>>2]|0;K=e[q>>1]|0;E=e[m>>1]|0|K<<G;F=E&65535;b[m>>1]=F;if((G|0)>(16-i|0)){D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=E;E=(e[m>>1]|0)>>>8&255;D=c[n>>2]|0;c[n>>2]=D+1;a[(c[o>>2]|0)+D|0]=E;E=c[k>>2]|0;D=K>>>((16-E|0)>>>0)&65535;b[m>>1]=D;X=i-16+E|0;Y=D}else{X=G+i|0;Y=F}c[k>>2]=X;F=x+65526&65535;i=Y&65535|F<<X;b[m>>1]=i;if((X|0)>9){G=c[n>>2]|0;c[n>>2]=G+1;a[(c[o>>2]|0)+G|0]=i;i=(e[m>>1]|0)>>>8&255;G=c[n>>2]|0;c[n>>2]=G+1;a[(c[o>>2]|0)+G|0]=i;i=c[k>>2]|0;b[m>>1]=F>>>((16-i|0)>>>0);c[k>>2]=i-9;break}else{c[k>>2]=X+7;break}}}}while(0);if(z<<16>>16==0){t=y;u=v;v=A;h=138;w=3;continue}t=y;u=v;v=A;h=C?6:7;w=C?3:4}return}function Sg(a,c,d){a=a|0;c=c|0;d=d|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=b[c+2>>1]|0;g=f<<16>>16==0;b[c+(d+1<<2)+2>>1]=-1;h=a+2752|0;i=a+2756|0;j=a+2748|0;k=g?3:4;l=g?138:7;g=f&65535;f=0;m=-1;a:while(1){n=0;o=f;do{if((o|0)>(d|0)){break a}o=o+1|0;p=b[c+(o<<2)+2>>1]|0;q=p&65535;n=n+1|0;r=(g|0)==(q|0);}while((n|0)<(l|0)&r);do{if((n|0)<(k|0)){s=a+2684+(g<<2)|0;b[s>>1]=(e[s>>1]|0)+n}else{if((g|0)==0){if((n|0)<11){b[h>>1]=(b[h>>1]|0)+1;break}else{b[i>>1]=(b[i>>1]|0)+1;break}}else{if((g|0)!=(m|0)){s=a+2684+(g<<2)|0;b[s>>1]=(b[s>>1]|0)+1}b[j>>1]=(b[j>>1]|0)+1;break}}}while(0);if(p<<16>>16==0){k=3;l=138;m=g;g=q;f=o;continue}k=r?3:4;l=r?6:7;m=g;g=q;f=o}return}function Tg(a,b,c){a=a|0;b=b|0;c=c|0;return dF(da(c,b)|0)|0}function Ug(a,b){a=a|0;b=b|0;eF(b);return}function Vg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;if((a|0)==0){b=-1;return b|0}if((c[a+24>>2]|0)>0){b=-1;return b|0}d=c[a+4>>2]|0;e=d+32|0;f=c[e>>2]|0;do{if((f|0)==0){g=0}else{h=Sc[f&127](a,2,0,d)|0;if((h|0)<0){b=-1}else{g=h;break}return b|0}}while(0);if((c[a+28>>2]|0)!=0){fh(a,0)|0}f=(g|0)==0;if(f){Hc[c[c[a+16>>2]>>2]&63](a,0,64)|0;if((bh(a)|0)>0){b=-1;return b|0}g=a+8|0;h=c[g>>2]|0;i=a+12|0;if((c[h+12>>2]|0)>0){Sc[c[i>>2]&127](a,c[h+8>>2]|0,0,d)|0;j=c[g>>2]|0}else{j=h}Sc[c[i>>2]&127](a,j,0,d)|0}j=c[a+20>>2]|0;do{if((j|0)==0){eF(a)}else{if(!(f&(j|0)==1)){break}Sc[c[a+12>>2]&127](a,a,0,d)|0}}while(0);j=c[e>>2]|0;if((j|0)==0){b=0;return b|0}Sc[j&127](a,6,0,d)|0;b=0;return b|0}function Wg(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=a+4|0;f=c[e>>2]|0;if((f|0)==0){c[e>>2]=b;g=c[b+28>>2]|0;c[a+12>>2]=(g|0)==0?40:g;h=b;return h|0}if((b|0)==0){h=f;return h|0}g=c[c[a+16>>2]>>2]|0;i=a+8|0;if((c[c[i>>2]>>2]&4096|0)!=0){ah(a,0)|0}j=c[f+32>>2]|0;do{if((j|0)!=0){if((Sc[j&127](a,3,b,f)|0)<0){h=0}else{break}return h|0}}while(0);c[e>>2]=b;e=c[b+28>>2]|0;c[a+12>>2]=(e|0)==0?40:e;e=c[c[i>>2]>>2]|0;if((e&112|0)!=0){h=f;return h|0}do{if((e&2|0)==0){if((e&3|0)==0){if((d&1|0)==0){break}else{h=f}return h|0}else{if((d&3|0)==3){h=f}else{break}return h|0}}else{if((d&2|0)==0){break}else{h=f}return h|0}}while(0);e=Zg(a)|0;j=c[i>>2]|0;c[j>>2]=c[j>>2]&-4097;c[(c[i>>2]|0)+4>>2]=0;c[(c[i>>2]|0)+16>>2]=0;j=c[i>>2]|0;do{if((c[j>>2]&3|0)!=0){i=c[j+8>>2]|0;k=c[j+12>>2]|0;l=i+(k<<2)|0;if((k|0)>0){m=i}else{break}while(1){i=m+4|0;c[m>>2]=0;if(i>>>0<l>>>0){m=i}else{break}}}}while(0);if((e|0)==0){h=f;return h|0}m=b+8|0;j=b+4|0;l=b|0;i=b+24|0;if((d&2|0)==0){n=e}else{d=e;while(1){e=c[d>>2]|0;Hc[g&63](a,d,32)|0;if((e|0)==0){h=f;break}else{d=e}}return h|0}while(1){d=c[n>>2]|0;e=c[m>>2]|0;if((e|0)<0){o=c[n+8>>2]|0}else{o=n+(-e|0)|0}e=c[j>>2]|0;k=o+(c[l>>2]|0)|0;if((e|0)<0){p=c[k>>2]|0}else{p=k}k=c[i>>2]|0;if((k|0)==0){q=dh(0,p,e)|0}else{q=Hc[k&63](a,p,b)|0}c[n+4>>2]=q;Hc[g&63](a,n,32)|0;if((d|0)==0){h=f;break}else{n=d}}return h|0}function Xg(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;d=(c|0)==0;do{if((b|0)==0){if(d){e=0;break}e=dF(c)|0}else{if(d){eF(b);e=0;break}else{e=gF(b,c)|0;break}}}while(0);return e|0}function Yg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;d=c[b>>2]|0;e=c[d>>2]|0;do{if((e&12|0)==0){if((e&3|0)==0){f=d+8|0;g=c[f>>2]|0;c[f>>2]=0;h=g;break}g=Zg(a)|0;f=c[b>>2]|0;i=c[f+8>>2]|0;j=c[f+12>>2]|0;f=i+(j<<2)|0;if((j|0)>0){k=i}else{h=g;break}while(1){c[k>>2]=0;i=k+4|0;if(i>>>0<f>>>0){k=i}else{h=g;break}}}else{h=c[d+4>>2]|0}}while(0);d=c[b>>2]|0;c[d>>2]=c[d>>2]&-4097;c[(c[b>>2]|0)+16>>2]=0;c[(c[b>>2]|0)+4>>2]=0;return h|0}function Zg(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=a+8|0;a=c[b>>2]|0;d=c[a>>2]|0;if((d&4096|0)!=0){e=c[a+4>>2]|0;return e|0}do{if((d&3|0)==0){if((d&112|0)!=0){f=c[a+8>>2]|0;break}g=c[a+4>>2]|0;if((g|0)==0){f=0;break}h=g+4|0;i=c[h>>2]|0;if((i|0)==0){j=g;k=c[g>>2]|0}else{l=g;g=h;h=i;while(1){i=h|0;c[g>>2]=c[i>>2];c[i>>2]=l;i=h+4|0;m=c[i>>2]|0;if((m|0)==0){j=h;k=l;break}else{l=h;g=i;h=m}}}if((k|0)==0){f=j;break}h=j|0;g=k;while(1){l=c[g+4>>2]|0;if((l|0)==0){n=g}else{m=g;i=l;while(1){l=i|0;c[m+4>>2]=c[l>>2];c[l>>2]=m;l=c[i+4>>2]|0;if((l|0)==0){break}else{m=i;i=l}}c[h>>2]=i;n=i}m=n|0;l=c[m>>2]|0;if((l|0)==0){f=j;break}else{h=m;g=l}}}else{g=c[a+8>>2]|0;h=c[a+12>>2]|0;l=g+(h<<2)|0;if((h|0)>0){o=0;p=0;q=g}else{f=0;break}while(1){g=c[q>>2]|0;if((g|0)==0){r=p;s=o}else{if((p|0)==0){t=g;u=g}else{c[p>>2]=g;t=p;u=o}g=t;while(1){h=c[g>>2]|0;if((h|0)==0){break}else{g=h}}c[q>>2]=g;r=g;s=u}i=q+4|0;if(i>>>0<l>>>0){o=s;p=r;q=i}else{f=s;break}}}}while(0);c[(c[b>>2]|0)+4>>2]=f;s=c[b>>2]|0;c[s>>2]=c[s>>2]|4096;e=f;return e|0}function _g(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;e=a+8|0;if((c[c[e>>2]>>2]&4096|0)!=0){ah(a,0)|0}f=c[a+4>>2]|0;g=c[f>>2]|0;h=c[f+4>>2]|0;i=f+8|0;j=c[i>>2]|0;k=c[f+20>>2]|0;l=a+20|0;c[l>>2]=c[l>>2]&-32769;do{if((b|0)==0){if((d&384|0)!=0){m=c[e>>2]|0;n=c[m+8>>2]|0;if((n|0)==0){o=0;return o|0}do{if((d&256|0)==0){c[m+4>>2]=n;p=n}else{q=c[n+4>>2]|0;c[m+4>>2]=q;if((q|0)==0){o=0}else{p=q;break}return o|0}}while(0);if((j|0)<0){o=c[p+8>>2]|0;return o|0}else{o=p+(-j|0)|0;return o|0}}if((d&4098|0)!=0){m=c[e>>2]|0;if((c[m>>2]&144|0)!=0){o=0;return o|0}n=c[m+8>>2]|0;if((n|0)==0){o=0}else{r=n;break}return o|0}if((d&64|0)==0){o=0;return o|0}n=f+16|0;m=c[n>>2]|0;if((m|0)==0){if((c[i>>2]|0)<0){s=18}}else{s=18}a:do{if((s|0)==18){q=c[(c[e>>2]|0)+8>>2]|0;if((q|0)==0){break}t=a+12|0;u=-j|0;if((j|0)<0){v=q;w=m;while(1){x=c[v>>2]|0;if((w|0)!=0){Tc[w&127](a,c[v+8>>2]|0,f)}if((c[i>>2]|0)<0){Sc[c[t>>2]&127](a,v,0,f)|0}if((x|0)==0){break a}v=x;w=c[n>>2]|0}}else{w=q;v=m;while(1){x=c[w>>2]|0;if((v|0)!=0){Tc[v&127](a,w+u|0,f)}if((c[i>>2]|0)<0){Sc[c[t>>2]&127](a,w,0,f)|0}if((x|0)==0){break a}w=x;v=c[n>>2]|0}}}}while(0);c[(c[e>>2]|0)+4>>2]=0;c[(c[e>>2]|0)+8>>2]=0;c[(c[e>>2]|0)+16>>2]=0;o=0;return o|0}else{if((d&2049|0)!=0){n=f+12|0;m=c[n>>2]|0;do{if((m|0)==0){y=b}else{if((d&1|0)==0){y=b;break}v=Hc[m&63](a,b,f)|0;if((v|0)==0){o=0}else{y=v;break}return o|0}}while(0);do{if((j|0)>-1){z=y+j|0}else{m=Sc[c[a+12>>2]&127](a,0,12,f)|0;if((m|0)!=0){c[m+8>>2]=y;z=m;break}if((c[n>>2]|0)==0){o=0;return o|0}m=c[f+16>>2]|0;if((m|0)==0){o=0;return o|0}if((d&1|0)==0){o=0;return o|0}Tc[m&127](a,y,f);o=0;return o|0}}while(0);n=z;m=c[e>>2]|0;v=c[m>>2]|0;do{if((v&128|0)==0){if((v&16|0)==0){if((v&32|0)==0){s=60;break}else{s=56;break}}w=c[m+4>>2]|0;t=(w|0)!=0;if((d&8192|0)==0){if(!t){s=56;break}if((w|0)==(c[m+8>>2]|0)){s=56;break}u=w+4|0;q=c[u>>2]|0;c[z+4>>2]=q;c[q>>2]=n;c[z>>2]=w;c[u>>2]=z;break}else{if(!t){s=60;break}t=w|0;u=c[t>>2]|0;if((u|0)==0){s=60;break}c[z>>2]=u;c[u+4>>2]=z;c[z+4>>2]=w;c[t>>2]=n;break}}else{if((d&8192|0)==0){s=56}else{s=60}}}while(0);if((s|0)==56){v=c[m+8>>2]|0;t=z;c[t>>2]=v;if((v|0)==0){c[z+4>>2]=n}else{w=v+4|0;c[z+4>>2]=c[w>>2];c[w>>2]=z}c[(c[e>>2]|0)+8>>2]=t}else if((s|0)==60){t=m+8|0;w=c[t>>2]|0;if((w|0)==0){v=z;c[t>>2]=v;c[z+4>>2]=n;A=v}else{v=w+4|0;w=v;c[c[w>>2]>>2]=n;c[z+4>>2]=c[w>>2];c[v>>2]=z;A=z}c[A>>2]=0}v=c[e>>2]|0;w=v+16|0;t=c[w>>2]|0;if((t|0)>-1){c[w>>2]=t+1;B=c[e>>2]|0}else{B=v}c[B+4>>2]=n;if((j|0)<0){o=c[z+8>>2]|0;return o|0}else{o=z+(-j|0)|0;return o|0}}v=c[e>>2]|0;do{if((d&512|0)==0){t=c[v+4>>2]|0;if((t|0)!=0){if((j|0)<0){C=c[t+8>>2]|0}else{C=t+(-j|0)|0}if((C|0)==(b|0)){D=t;break}}t=b+g|0;if((h|0)>=0){E=t;s=77;break}E=c[t>>2]|0;s=77}else{E=b;s=77}}while(0);b:do{if((s|0)==77){n=c[v+8>>2]|0;if((n|0)==0){o=0;return o|0}m=(h|0)<0;t=(k|0)==0;w=(h|0)<1;if((j|0)<0){u=n;while(1){q=(c[u+8>>2]|0)+g|0;if(m){F=c[q>>2]|0}else{F=q}do{if(t){if(w){G=Ya(E|0,F|0)|0;break}else{G=wF(E|0,F|0,h|0)|0;break}}else{G=Sc[k&127](a,E,F,f)|0}}while(0);if((G|0)==0){D=u;break b}q=c[u>>2]|0;if((q|0)==0){o=0;break}else{u=q}}return o|0}else{u=n;while(1){q=u+(g-j)|0;if(m){H=c[q>>2]|0}else{H=q}do{if(t){if(w){I=Ya(E|0,H|0)|0;break}else{I=wF(E|0,H|0,h|0)|0;break}}else{I=Sc[k&127](a,E,H,f)|0}}while(0);if((I|0)==0){D=u;break b}q=c[u>>2]|0;if((q|0)==0){o=0;break}else{u=q}}return o|0}}}while(0);if((D|0)==0){o=0;return o|0}c[l>>2]=c[l>>2]|32768;if((d&4098|0)!=0){r=D;break}do{if((d&8|0)==0){if((d&16|0)==0){J=D;break}v=c[e>>2]|0;if((D|0)!=(c[v+8>>2]|0)){J=c[D+4>>2]|0;break}c[v+4>>2]=0;o=0;return o|0}else{J=c[D>>2]|0}}while(0);c[(c[e>>2]|0)+4>>2]=J;if((J|0)==0){o=0;return o|0}if((j|0)<0){o=c[J+8>>2]|0;return o|0}else{o=J+(-j|0)|0;return o|0}}}while(0);J=r|0;D=c[J>>2]|0;if((D|0)==0){K=0}else{c[D+4>>2]=c[r+4>>2];K=c[J>>2]|0}D=(c[e>>2]|0)+8|0;l=c[D>>2]|0;do{if((r|0)==(l|0)){c[D>>2]=K;I=c[(c[e>>2]|0)+8>>2]|0;if((I|0)==0){break}c[I+4>>2]=c[r+4>>2]}else{I=r+4|0;c[c[I>>2]>>2]=K;H=l+4|0;if((r|0)!=(c[H>>2]|0)){break}c[H>>2]=c[I>>2]}}while(0);l=(c[e>>2]|0)+4|0;if((r|0)==(c[l>>2]|0)){L=c[J>>2]|0}else{L=0}c[l>>2]=L;L=(c[e>>2]|0)+16|0;c[L>>2]=(c[L>>2]|0)-1;if((j|0)<0){M=c[r+8>>2]|0}else{M=r+(-j|0)|0}j=c[f+16>>2]|0;do{if((j|0)!=0){if((d&2|0)==0){break}Tc[j&127](a,M,f)}}while(0);if((c[i>>2]|0)>=0){o=M;return o|0}Sc[c[a+12>>2]&127](a,r,0,f)|0;o=M;return o|0}function $g(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+8|0;e=d|0;if((a|0)==0|(b|0)==0){f=0;i=d;return f|0}g=dF(40)|0;h=g;if((g|0)==0){f=0;i=d;return f|0}c[g>>2]=0;c[g+16>>2]=0;c[g+4>>2]=0;Wg(h,a,0)|0;j=a+32|0;vF(g+20|0,0,20)|0;k=c[j>>2]|0;do{if((k|0)==0){l=h;m=11}else{c[e>>2]=0;n=Sc[k&127](h,1,e,a)|0;if((n|0)<0){o=h;m=12;break}if((n|0)<=0){l=h;m=11;break}n=c[e>>2]|0;if((n|0)!=0){if((c[b+4>>2]&c[n>>2]|0)==0){o=h;m=12;break}else{p=h;q=n;break}}n=a+28|0;if((c[n>>2]|0)==0){o=h;m=12;break}eF(g);r=Sc[c[n>>2]&127](0,0,40,a)|0;n=r;if((r|0)==0){f=0;i=d;return f|0}else{c[r>>2]=0;c[r+16>>2]=0;c[r+4>>2]=0;Wg(n,a,0)|0;c[r+20>>2]=1;c[r+24>>2]=0;c[r+32>>2]=0;c[r+28>>2]=0;l=n;m=11;break}}}while(0);do{if((m|0)==11){g=Sc[c[l+12>>2]&127](l,0,28,a)|0;c[e>>2]=g;if((g|0)==0){o=l;m=12;break}c[g>>2]=c[b+4>>2];c[(c[e>>2]|0)+4>>2]=0;c[(c[e>>2]|0)+8>>2]=0;c[(c[e>>2]|0)+20>>2]=0;c[(c[e>>2]|0)+16>>2]=0;c[(c[e>>2]|0)+12>>2]=0;c[(c[e>>2]|0)+24>>2]=0;p=l;q=c[e>>2]|0}}while(0);if((m|0)==12){eF(o);f=0;i=d;return f|0}c[p+8>>2]=q;c[p>>2]=c[b>>2];c[p+16>>2]=b;b=c[j>>2]|0;if((b|0)==0){f=p;i=d;return f|0}Sc[b&127](p,5,p,a)|0;f=p;i=d;return f|0}function ah(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[c[a+16>>2]>>2]|0;e=a+8|0;f=c[e>>2]|0;g=f|0;h=c[g>>2]|0;i=h&4096;do{if((b|0)==0){if((i|0)==0){j=-1;return j|0}else{k=i;l=c[f+4>>2]|0;break}}else{if((c[f+16>>2]|0)==0){k=0;l=b;break}else{j=-1}return j|0}}while(0);c[g>>2]=h&-4097;h=c[e>>2]|0;g=c[h>>2]|0;if((g&3|0)==0){b=h+4|0;if((g&12|0)==0){c[b>>2]=0;c[(c[e>>2]|0)+8>>2]=l}else{c[b>>2]=l}if((k|0)!=0){j=0;return j|0}c[(c[e>>2]|0)+16>>2]=-1;j=0;return j|0}c[h+4>>2]=0;h=c[e>>2]|0;if((k|0)==0){c[h+16>>2]=0;if((l|0)==0){j=0;return j|0}else{m=l}while(1){k=c[m>>2]|0;Hc[d&63](a,m,32)|0;if((k|0)==0){j=0;break}else{m=k}}return j|0}m=c[h+8>>2]|0;a=c[h+12>>2]|0;h=m+(a<<2)|0;if((a|0)>0){n=m;o=l}else{j=0;return j|0}while(1){l=c[n>>2]|0;if((l|0)==0){p=o}else{c[n>>2]=o;m=l|0;l=c[m>>2]|0;c[m>>2]=0;p=l}l=n+4|0;if(l>>>0<h>>>0){n=l;o=p}else{j=0;break}}return j|0}function bh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+8|0;d=c[b>>2]|0;if((c[d>>2]&4096|0)==0){e=d}else{ah(a,0)|0;e=c[b>>2]|0}a=e+16|0;do{if((c[a>>2]|0)<0){d=c[e>>2]|0;if((d&12|0)!=0){c[a>>2]=ch(c[e+4>>2]|0)|0;break}if((d&112|0)==0){break}d=c[e+8>>2]|0;if((d|0)==0){f=0}else{g=0;h=d;while(1){d=g+1|0;i=c[h>>2]|0;if((i|0)==0){f=d;break}else{g=d;h=i}}}c[a>>2]=f}}while(0);return c[(c[b>>2]|0)+16>>2]|0}function ch(a){a=a|0;var b=0;if((a|0)==0){return 0}else{b=ch(c[a+4>>2]|0)|0;return b+1+(ch(c[a>>2]|0)|0)|0}return 0}function dh(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;if((e|0)<1){f=a[c]|0;if(f<<24>>24==0){g=c;h=b}else{i=c;j=b;k=f;while(1){f=a[i+1|0]|0;l=da(((k&255)<<8)+j+(f&255)|0,17109811)|0;m=i+(f<<24>>24!=0?2:1)|0;f=a[m]|0;if(f<<24>>24==0){g=m;h=l;break}else{i=m;j=l;k=f}}}n=h;o=g-c|0;p=n+o|0;q=da(p,17109811)|0;return q|0}g=e-1|0;h=c+g|0;if((g|0)>0){g=c;k=b;while(1){j=da(((d[g]|0)<<8)+k+(d[g+1|0]|0)|0,17109811)|0;i=g+2|0;if(i>>>0<h>>>0){g=i;k=j}else{r=i;s=j;break}}}else{r=c;s=b}if(r>>>0>h>>>0){n=s;o=e;p=n+o|0;q=da(p,17109811)|0;return q|0}n=da(((d[r]|0)<<8)+s|0,17109811)|0;o=e;p=n+o|0;q=da(p,17109811)|0;return q|0}
+
+
+
+function Mz(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,S=0,T=0,U=0.0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0.0,ab=0.0,bb=0.0,cb=0,db=0.0,eb=0.0,fb=0,gb=0.0,hb=0.0,ib=0.0,jb=0,kb=0.0,lb=0.0,mb=0.0,nb=0,ob=0.0,pb=0.0,qb=0.0,rb=0,sb=0.0,tb=0.0,ub=0.0,vb=0,wb=0.0,xb=0.0,yb=0.0,zb=0,Ab=0.0,Bb=0.0,Cb=0.0,Db=0,Eb=0.0,Fb=0.0,Gb=0.0,Hb=0,Ib=0.0,Jb=0.0,Kb=0.0,Lb=0,Mb=0.0,Nb=0.0,Ob=0.0,Pb=0.0,Qb=0,Rb=0.0,Sb=0.0,Tb=0,Ub=0.0,Vb=0.0,Wb=0.0,Xb=0.0,Yb=0,Zb=0.0,_b=0.0,$b=0,ac=0.0,bc=0.0,dc=0.0,ec=0,fc=0.0,gc=0.0,hc=0.0,ic=0.0,jc=0,kc=0.0,lc=0.0,mc=0.0,nc=0,oc=0.0,pc=0.0,qc=0.0,rc=0.0,sc=0,tc=0.0,uc=0.0,vc=0,wc=0.0,xc=0.0,yc=0.0,zc=0;j=i;i=i+424|0;k=j|0;l=j+40|0;m=j+72|0;n=j+104|0;p=j+136|0;q=j+168|0;r=j+200|0;s=j+232|0;t=j+264|0;u=j+296|0;v=j+328|0;w=j+360|0;x=j+392|0;y=jk(28)|0;z=y;A=$g(173192,c[43332]|0)|0;B=y+20|0;c[B>>2]=A;do{if((A|0)==0){Ma(84568,14,1,c[o>>2]|0)|0;C=6}else{D=tz()|0;c[y+24>>2]=D;if((D|0)==0){Ma(84568,14,1,c[o>>2]|0)|0;C=6;break}else{c[y>>2]=b;c[y+4>>2]=d;c[y+8>>2]=e;c[y+12>>2]=f;c[y+16>>2]=g;E=z;break}}}while(0);if((C|0)==6){z=c[B>>2]|0;if((z|0)!=0){Vg(z)|0}z=c[y+24>>2]|0;if((z|0)!=0){uz(z)|0}eF(y);E=0}y=c[E+16>>2]|0;F=+h[y+16>>3];G=+h[y+24>>3];y=~~(F>G?F:G);if((y|0)==0){H=0}else{z=y>>>0>65535>>>0;B=z?y>>>16:y;y=z?16:0;if(B>>>0>255>>>0){I=y|8;J=B>>>8}else{I=y;J=B}if(J>>>0>15>>>0){K=I+4|0;L=J>>>4}else{K=I;L=J}if(L>>>0>3>>>0){M=K+2|0;N=L>>>2}else{M=K;N=L}H=M+1+(N>>>0>1>>>0)|0}N=E+4|0;a:do{if((c[N>>2]|0)>0){M=E|0;L=E+20|0;if((H|0)>0){O=0}else{K=0;while(1){J=jk(32)|0;c[J+28>>2]=(c[M>>2]|0)+(K*40|0);I=c[M>>2]|0;B=c[I+(K*40|0)+32>>2]|0;if((B|0)==0){P=0.0;Q=0.0}else{P=+h[B>>3];Q=+h[B+8>>3]}G=+h[I+(K*40|0)>>3];B=~~+R(G-P);F=+h[I+(K*40|0)+8>>3];y=~~+R(F-Q);z=~~+ca(P+(G+ +h[I+(K*40|0)+16>>3]));if((z|0)==2147483647){C=34;break}f=~~+ca(Q+(F+ +h[I+(K*40|0)+24>>3]));if((f|0)==2147483647){C=36;break}c[J+12>>2]=B;c[J+16>>2]=y;c[J+20>>2]=z;c[J+24>>2]=f;c[J+8>>2]=0;f=c[L>>2]|0;z=K+1|0;if((Hc[c[f>>2]&63](f,J,1)|0)==0){S=-1;C=123;break}if((z|0)<(c[N>>2]|0)){K=z}else{T=L;break a}}if((C|0)==34){cc(94960,147512,264,170168);return 0}else if((C|0)==36){cc(89528,147512,266,170168);return 0}else if((C|0)==123){i=j;return S|0}}while(1){K=jk(32)|0;c[K+28>>2]=(c[M>>2]|0)+(O*40|0);z=c[M>>2]|0;J=c[z+(O*40|0)+32>>2]|0;if((J|0)==0){U=0.0;V=0.0}else{U=+h[J>>3];V=+h[J+8>>3]}F=+h[z+(O*40|0)>>3];J=~~+R(F-U);G=+h[z+(O*40|0)+8>>3];f=~~+R(G-V);y=~~+ca(U+(F+ +h[z+(O*40|0)+16>>3]));if((y|0)==2147483647){C=34;break}B=~~+ca(V+(G+ +h[z+(O*40|0)+24>>3]));if((B|0)==2147483647){C=36;break}c[K+12>>2]=J;c[K+16>>2]=f;c[K+20>>2]=y;c[K+24>>2]=B;z=((B-f|0)/2|0)+f|0;f=((y-J|0)/2|0)+J|0;J=0;y=H;while(1){B=y-1|0;I=f>>>(B>>>0)&1;e=z>>>(B>>>0)&1;W=I<<1|J<<2|e^I;A=e-1|0;e=A&(z^f);D=A&-I;if((B|0)>0){z=e^z^D;f=e^f^D;J=W;y=B}else{break}}c[K+8>>2]=W;y=c[L>>2]|0;J=O+1|0;if((Hc[c[y>>2]&63](y,K,1)|0)==0){S=-1;C=123;break}if((J|0)<(c[N>>2]|0)){O=J}else{T=L;break a}}if((C|0)==34){cc(94960,147512,264,170168);return 0}else if((C|0)==36){cc(89528,147512,266,170168);return 0}else if((C|0)==123){i=j;return S|0}}else{T=E+20|0}}while(0);O=c[T>>2]|0;N=Hc[c[O>>2]&63](O,0,128)|0;if((N|0)!=0){O=E+24|0;W=N;do{N=c[O>>2]|0;xz(N,W+12|0,c[W+28>>2]|0,N|0,0)|0;N=c[T>>2]|0;W=Hc[c[N>>2]&63](N,W,8)|0;}while((W|0)!=0)}W=bh(c[T>>2]|0)|0;b:do{if((bh(c[T>>2]|0)|0)==0){X=0}else{O=0;while(1){N=c[T>>2]|0;H=c[(c[N+8>>2]|0)+4>>2]|0;if((H|0)==0){C=47;break}L=c[(c[N+4>>2]|0)+8>>2]|0;if((L|0)<0){Y=c[H+8>>2]|0}else{Y=H+(-L|0)|0}if((Y|0)==0){C=47;break}Hc[c[N>>2]&63](N,Y,4096)|0;eF(Y);N=O+1|0;if((bh(c[T>>2]|0)|0)==0){X=N;break b}else{O=N}}if((C|0)==47){cc(106312,147512,616,169816);return 0}}}while(0);if((W|0)!=(X|0)){cc(100584,147512,623,169816);return 0}X=Vg(c[T>>2]|0)|0;if((X|0)<0){S=X;i=j;return S|0}if((d|0)>0){X=k;T=k|0;W=l|0;Y=l+8|0;O=l+16|0;N=l+24|0;L=g+32|0;g=m|0;H=m+8|0;M=m+16|0;J=m+24|0;y=n|0;f=n+8|0;z=n+16|0;B=n+24|0;D=p|0;e=p+8|0;I=p+16|0;A=p+24|0;Z=q|0;_=q+8|0;$=q+16|0;aa=q+24|0;ba=r|0;da=r+8|0;ea=r+16|0;fa=r+24|0;ga=s|0;ha=s+8|0;ia=s+16|0;ja=s+24|0;ka=t|0;la=t+8|0;ma=t+16|0;na=t+24|0;oa=k+24|0;pa=k+28|0;qa=k+32|0;ra=k+12|0;sa=k+8|0;ta=k+4|0;ua=k+20|0;k=w|0;va=w+8|0;wa=w+16|0;xa=w+24|0;ya=x|0;za=x+8|0;Aa=x+16|0;Ba=x+24|0;Ca=u|0;Da=u+8|0;Ea=u+16|0;Fa=u+24|0;Ga=v|0;Ha=v+8|0;Ia=v+16|0;Ja=v+24|0;Ka=0;La=0;while(1){Na=b+(Ka*40|0)+32|0;Oa=c[Na>>2]|0;do{if((Oa|0)==0){Pa=La}else{Qa=b+(Ka*40|0)|0;Ra=Oa|0;V=+h[Ra>>3];Sa=b+(Ka*40|0)+16|0;U=(V*2.0+ +h[Sa>>3])*.125;Ta=Oa+8|0;Ua=b+(Ka*40|0)+24|0;Q=(+h[Ta>>3]*2.0+ +h[Ua>>3])*.5;vF(X|0,0,36)|0;Va=Qa|0;Wa=Oa+16|0;h[Wa>>3]=+h[Va>>3]-V;Xa=b+(Ka*40|0)+8|0;Ya=Oa+24|0;h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];Nz(l,E,Qa,T);Za=c[W>>2]|0;V=+h[Y>>3];P=+h[O>>3];G=+h[N>>3];c:do{if((Za|0)==0){_a=0;$a=V;ab=P;bb=G}else{h[Ya>>3]=+h[Xa>>3];Nz(m,E,Qa,T);cb=c[g>>2]|0;F=+h[H>>3];db=+h[M>>3];eb=+h[J>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<V){fb=cb;gb=F;hb=db;ib=eb}else{fb=Za;gb=V;hb=P;ib=G}h[Ya>>3]=+h[Xa>>3]- +h[Ta>>3];Nz(n,E,Qa,T);cb=c[y>>2]|0;eb=+h[f>>3];db=+h[z>>3];F=+h[B>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break}if(eb<gb){jb=cb;kb=eb;lb=db;mb=F}else{jb=fb;kb=gb;lb=hb;mb=ib}h[Wa>>3]=+h[Va>>3];h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];Nz(p,E,Qa,T);cb=c[D>>2]|0;F=+h[e>>3];db=+h[I>>3];eb=+h[A>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<kb){nb=cb;ob=F;pb=db;qb=eb}else{nb=jb;ob=kb;pb=lb;qb=mb}h[Ya>>3]=+h[Xa>>3]- +h[Ta>>3];Nz(q,E,Qa,T);cb=c[Z>>2]|0;eb=+h[_>>3];db=+h[$>>3];F=+h[aa>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break}if(eb<ob){rb=cb;sb=eb;tb=db;ub=F}else{rb=nb;sb=ob;tb=pb;ub=qb}h[Wa>>3]=+h[Va>>3]+ +h[Sa>>3];h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];Nz(r,E,Qa,T);cb=c[ba>>2]|0;F=+h[da>>3];db=+h[ea>>3];eb=+h[fa>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<sb){vb=cb;wb=F;xb=db;yb=eb}else{vb=rb;wb=sb;xb=tb;yb=ub}h[Ya>>3]=+h[Xa>>3];Nz(s,E,Qa,T);cb=c[ga>>2]|0;eb=+h[ha>>3];db=+h[ia>>3];F=+h[ja>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break}if(eb<wb){zb=cb;Ab=eb;Bb=db;Cb=F}else{zb=vb;Ab=wb;Bb=xb;Cb=yb}h[Ya>>3]=+h[Xa>>3]- +h[Ta>>3];Nz(t,E,Qa,T);cb=c[ka>>2]|0;F=+h[la>>3];db=+h[ma>>3];eb=+h[na>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break}if(F<Ab){Db=cb;Eb=F;Fb=db;Gb=eb}else{Db=zb;Eb=Ab;Fb=Bb;Gb=Cb}cb=(c[pa>>2]|0)==0;do{if((c[oa>>2]|0)==0){if(!cb){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}if((c[qa>>2]|0)!=0){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}if((c[ra>>2]|0)!=0){C=84;break}if((c[T>>2]|0)==0){Lb=Db;Mb=Eb;Nb=Fb;Ob=Gb}else{C=84}}else{if(!cb){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}if((c[qa>>2]|0)==0){C=84}else{Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89}}}while(0);do{if((C|0)==84){C=0;eb=+h[Va>>3]- +h[Ra>>3];h[Wa>>3]=eb;h[Ya>>3]=+h[Xa>>3]+ +h[Ua>>3];if(eb>+h[Va>>3]+ +h[Sa>>3]){Hb=Db;Ib=Eb;Jb=Fb;Kb=Gb;C=89;break}else{Pb=Eb;Qb=Db;Rb=Fb;Sb=Gb}while(1){Nz(u,E,Qa,T);cb=c[Ca>>2]|0;eb=+h[Da>>3];db=+h[Ea>>3];F=+h[Fa>>3];if((cb|0)==0){_a=0;$a=eb;ab=db;bb=F;break c}if(eb<Pb){Tb=cb;Ub=eb;Vb=db;Wb=F}else{Tb=Qb;Ub=Pb;Vb=Rb;Wb=Sb}F=U+ +h[Wa>>3];h[Wa>>3]=F;if(F>+h[Va>>3]+ +h[Sa>>3]){Hb=Tb;Ib=Ub;Jb=Vb;Kb=Wb;C=89;break}else{Pb=Ub;Qb=Tb;Rb=Vb;Sb=Wb}}}}while(0);do{if((C|0)==89){C=0;if((c[ra>>2]|0)!=0){Lb=Hb;Mb=Ib;Nb=Jb;Ob=Kb;break}if((c[T>>2]|0)!=0){Lb=Hb;Mb=Ib;Nb=Jb;Ob=Kb;break}h[Wa>>3]=+h[Va>>3]- +h[Ra>>3];F=+h[Xa>>3]+ +h[Ua>>3];h[Ya>>3]=F;if(F<+h[Xa>>3]- +h[Ta>>3]){Lb=Hb;Mb=Ib;Nb=Jb;Ob=Kb;break}else{Xb=Ib;Yb=Hb;Zb=Jb;_b=Kb}while(1){Nz(v,E,Qa,T);cb=c[Ga>>2]|0;F=+h[Ha>>3];db=+h[Ia>>3];eb=+h[Ja>>3];if((cb|0)==0){_a=0;$a=F;ab=db;bb=eb;break c}if(F<Xb){$b=cb;ac=F;bc=db;dc=eb}else{$b=Yb;ac=Xb;bc=Zb;dc=_b}eb=+h[Ya>>3]-Q;h[Ya>>3]=eb;if(eb<+h[Xa>>3]- +h[Ta>>3]){Lb=$b;Mb=ac;Nb=bc;Ob=dc;break}else{Xb=ac;Yb=$b;Zb=bc;_b=dc}}}}while(0);h[Wa>>3]=+h[Va>>3]+ +h[Sa>>3];eb=+h[Ta>>3];h[Ya>>3]=+h[Xa>>3]-eb;cb=(c[ta>>2]|0)==0;do{if((c[sa>>2]|0)==0){if(!cb){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}if((c[T>>2]|0)!=0){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}if((c[ua>>2]|0)!=0){C=103;break}if((c[qa>>2]|0)==0){_a=Lb;$a=Mb;ab=Nb;bb=Ob;break c}else{C=103}}else{if(!cb){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}if((c[T>>2]|0)==0){C=103}else{ec=Lb;fc=Mb;gc=Nb;hc=Ob}}}while(0);do{if((C|0)==103){C=0;db=+h[Va>>3]+ +h[Sa>>3];h[Wa>>3]=db;h[Ya>>3]=+h[Xa>>3]-eb;if(db<+h[Va>>3]- +h[Ra>>3]){ec=Lb;fc=Mb;gc=Nb;hc=Ob;break}else{ic=Mb;jc=Lb;kc=Nb;lc=Ob}while(1){Nz(w,E,Qa,T);cb=c[k>>2]|0;db=+h[va>>3];F=+h[wa>>3];mc=+h[xa>>3];if((cb|0)==0){_a=0;$a=db;ab=F;bb=mc;break c}if(db<ic){nc=cb;oc=db;pc=F;qc=mc}else{nc=jc;oc=ic;pc=kc;qc=lc}mc=+h[Wa>>3]-U;h[Wa>>3]=mc;if(mc<+h[Va>>3]- +h[Ra>>3]){ec=nc;fc=oc;gc=pc;hc=qc;break}else{ic=oc;jc=nc;kc=pc;lc=qc}}}}while(0);if((c[ua>>2]|0)!=0){_a=ec;$a=fc;ab=gc;bb=hc;break}if((c[qa>>2]|0)!=0){_a=ec;$a=fc;ab=gc;bb=hc;break}h[Wa>>3]=+h[Va>>3]+ +h[Sa>>3];eb=+h[Xa>>3]- +h[Ta>>3];h[Ya>>3]=eb;if(eb>+h[Xa>>3]+ +h[Ua>>3]){_a=ec;$a=fc;ab=gc;bb=hc;break}else{rc=fc;sc=ec;tc=gc;uc=hc}while(1){Nz(x,E,Qa,T);cb=c[ya>>2]|0;eb=+h[za>>3];mc=+h[Aa>>3];F=+h[Ba>>3];if((cb|0)==0){_a=0;$a=eb;ab=mc;bb=F;break c}if(eb<rc){vc=cb;wc=eb;xc=mc;yc=F}else{vc=sc;wc=rc;xc=tc;yc=uc}F=Q+ +h[Ya>>3];h[Ya>>3]=F;if(F>+h[Xa>>3]+ +h[Ua>>3]){_a=vc;$a=wc;ab=xc;bb=yc;break}else{rc=wc;sc=vc;tc=xc;uc=yc}}}}while(0);if((_a|0)==0){a[(c[Na>>2]|0)+36|0]=1;Pa=La;break}if($a==0.0){h[(c[Na>>2]|0)+16>>3]=ab;h[(c[Na>>2]|0)+24>>3]=bb;a[(c[Na>>2]|0)+36|0]=1;Pa=La;break}if((a[L]|0)!=1){Pa=1;break}h[(c[Na>>2]|0)+16>>3]=ab;h[(c[Na>>2]|0)+24>>3]=bb;a[(c[Na>>2]|0)+36|0]=1;Pa=La}}while(0);Na=Ka+1|0;if((Na|0)<(d|0)){Ka=Na;La=Pa}else{zc=Pa;break}}}else{zc=0}uz(c[E+24>>2]|0)|0;eF(E);S=zc;i=j;return S|0}function Nz(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0,U=0.0,V=0,W=0,X=0,Y=0.0,Z=0.0,_=0.0,$=0,aa=0.0,ba=0,ca=0.0,da=0.0,ea=0.0,fa=0.0;g=i;i=i+32|0;j=g|0;k=e+32|0;l=c[k>>2]|0;if((l|0)==0){cc(101272,147512,382,169800)}m=l+16|0;n=g+16|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];m=c[d+4>>2]|0;a:do{if((m|0)>0){o=c[d>>2]|0;p=0;q=0;b:while(1){do{if((o+(q*40|0)|0)==(e|0)){r=p}else{s=+h[o+(q*40|0)+16>>3];if(s>0.0){if(+h[o+(q*40|0)+24>>3]>0.0){r=p;break}}if(s!=0.0){t=10;break b}if(+h[o+(q*40|0)+24>>3]!=0.0){t=10;break b}s=+h[o+(q*40|0)>>3];u=+h[l+16>>3];do{if(s>u){if(s>=u+ +h[l>>3]){v=0;break}w=+h[o+(q*40|0)+8>>3];x=+h[l+24>>3];if(w<=x){v=0;break}v=w<x+ +h[l+8>>3]|0}else{v=0}}while(0);r=v+p|0}}while(0);y=q+1|0;if((y|0)<(m|0)){p=r;q=y}else{z=r;break a}}if((t|0)==10){cc(112928,147512,219,170448)}}else{z=0}}while(0);r=l+16|0;m=j|0;c[m>>2]=~~+h[r>>3];v=l+24|0;q=j+4|0;c[q>>2]=~~+h[v>>3];p=j+8|0;c[p>>2]=~~(+h[r>>3]+ +h[l>>3]);r=j+12|0;c[r>>2]=~~(+h[v>>3]+ +h[l+8>>3]);l=c[d+24>>2]|0;d=wz(l,c[l>>2]|0,j)|0;if((d|0)==0){c[b>>2]=z;h[b+8>>3]=0.0;j=b+16|0;c[j>>2]=c[n>>2];c[j+4>>2]=c[n+4>>2];c[j+8>>2]=c[n+8>>2];c[j+12>>2]=c[n+12>>2];i=g;return}j=e|0;l=e+8|0;v=d;u=0.0;o=z;c:while(1){z=c[(c[v+4>>2]|0)+16>>2]|0;y=z;do{if((y|0)==(e|0)){A=o;B=u}else{C=z;s=+h[C>>3];D=~~s;E=z+8|0;x=+h[E>>3];F=~~x;G=~~(s+ +h[z+16>>3]);H=~~(x+ +h[z+24>>3]);I=c[p>>2]|0;do{if((I|0)<(D|0)){J=o;K=u}else{L=c[m>>2]|0;if((L|0)>(G|0)){J=o;K=u;break}M=c[r>>2]|0;if((M|0)<(F|0)){J=o;K=u;break}N=c[q>>2]|0;if((N|0)>(H|0)){J=o;K=u;break}w=(+(((I|0)<(G|0)?I:G)|0)- +(((L|0)>(D|0)?L:D)|0))*(+(((M|0)<(H|0)?M:H)|0)- +(((N|0)>(F|0)?N:F)|0));if(w<=0.0){J=o;K=u;break}O=c[k>>2]|0;P=c[z+32>>2]|0;if((O|0)==(P|0)){t=27;break c}do{if((a[O+36|0]|0)==0){Q=-1}else{if((a[P+36|0]|0)==0){Q=-1;break}R=+h[j>>3];if(R==0.0){if(+h[l>>3]==0.0){Q=-1;break}}if(s==0.0&x==0.0){Q=-1;break}S=+h[l>>3];if(x<S){if(s<R){Q=0;break}Q=s>R?2:1;break}T=s<R;if(x>S){if(T){Q=6;break}Q=s>R?8:7;break}if(T){Q=3;break}if(s<=R){Q=-1;break}Q=5}}while(0);P=f+(((Q|0)<0?5:Q)<<2)|0;O=c[P>>2]|0;do{if((O|0)==0){c[P>>2]=y;U=w}else{R=+h[O>>3];T=~~R;S=+h[O+8>>3];V=~~S;W=~~(R+ +h[O+16>>3]);X=~~(S+ +h[O+24>>3]);if((I|0)<(T|0)|(L|0)>(W|0)|(M|0)<(V|0)|(N|0)>(X|0)){Y=0.0}else{Y=(+(((I|0)<(W|0)?I:W)|0)- +(((L|0)>(T|0)?L:T)|0))*(+(((M|0)<(X|0)?M:X)|0)- +(((N|0)>(V|0)?N:V)|0))}S=Y>w?Y:0.0;V=c[O+32>>2]|0;do{if((V|0)==0){Z=S}else{R=+h[V+16>>3];X=~~R;_=+h[V+24>>3];T=~~_;W=~~(R+ +h[V>>3]);$=~~(_+ +h[V+8>>3]);if((I|0)<(X|0)|(L|0)>(W|0)|(M|0)<(T|0)|(N|0)>($|0)){aa=0.0}else{aa=(+(((I|0)<(W|0)?I:W)|0)- +(((L|0)>(X|0)?L:X)|0))*(+(((M|0)<($|0)?M:$)|0)- +(((N|0)>(T|0)?N:T)|0))}if(aa<=w){Z=S;break}Z=aa>S?aa:S}}while(0);if(Z>0.0){U=Z;break}c[P>>2]=y;U=w}}while(0);J=o+1|0;K=u+U}}while(0);F=c[z+32>>2]|0;if((F|0)==0){A=J;B=K;break}if((a[F+36|0]|0)==0){A=J;B=K;break}s=+h[F+16>>3];H=~~s;x=+h[F+24>>3];D=~~x;G=~~(s+ +h[F>>3]);P=~~(x+ +h[F+8>>3]);if((I|0)<(H|0)){A=J;B=K;break}N=c[m>>2]|0;if((N|0)>(G|0)){A=J;B=K;break}M=c[r>>2]|0;if((M|0)<(D|0)){A=J;B=K;break}L=c[q>>2]|0;if((L|0)>(P|0)){A=J;B=K;break}x=(+(((I|0)<(G|0)?I:G)|0)- +(((N|0)>(H|0)?N:H)|0))*(+(((M|0)<(P|0)?M:P)|0)- +(((L|0)>(D|0)?L:D)|0));if(x<=0.0){A=J;B=K;break}D=c[k>>2]|0;if((D|0)==(F|0)){t=62;break c}do{if((a[D+36|0]|0)==0){ba=-1}else{s=+h[j>>3];if(s==0.0){if(+h[l>>3]==0.0){ba=-1;break}}w=+h[C>>3];S=+h[E>>3];if(w==0.0&S==0.0){ba=-1;break}_=+h[l>>3];if(S<_){if(w<s){ba=0;break}ba=w>s?2:1;break}F=w<s;if(S>_){if(F){ba=6;break}ba=w>s?8:7;break}if(F){ba=3;break}if(w<=s){ba=-1;break}ba=5}}while(0);E=f+(((ba|0)<0?5:ba)<<2)|0;C=c[E>>2]|0;do{if((C|0)==0){c[E>>2]=y;ca=x}else{s=+h[C>>3];D=~~s;w=+h[C+8>>3];F=~~w;P=~~(s+ +h[C+16>>3]);H=~~(w+ +h[C+24>>3]);if((I|0)<(D|0)|(N|0)>(P|0)|(M|0)<(F|0)|(L|0)>(H|0)){da=0.0}else{da=(+(((I|0)<(P|0)?I:P)|0)- +(((N|0)>(D|0)?N:D)|0))*(+(((M|0)<(H|0)?M:H)|0)- +(((L|0)>(F|0)?L:F)|0))}w=da>x?da:0.0;F=c[C+32>>2]|0;do{if((F|0)==0){ea=w}else{s=+h[F+16>>3];H=~~s;_=+h[F+24>>3];D=~~_;P=~~(s+ +h[F>>3]);G=~~(_+ +h[F+8>>3]);if((I|0)<(H|0)|(N|0)>(P|0)|(M|0)<(D|0)|(L|0)>(G|0)){fa=0.0}else{fa=(+(((I|0)<(P|0)?I:P)|0)- +(((N|0)>(H|0)?N:H)|0))*(+(((M|0)<(G|0)?M:G)|0)- +(((L|0)>(D|0)?L:D)|0))}if(fa<=x){ea=w;break}ea=fa>w?fa:w}}while(0);if(ea>0.0){ca=ea;break}c[E>>2]=y;ca=x}}while(0);A=J+1|0;B=K+ca}}while(0);y=c[v>>2]|0;if((y|0)==0){t=89;break}else{v=y;u=B;o=A}}if((t|0)==27){cc(121496,147512,276,170536)}else if((t|0)==62){cc(121496,147512,276,170536)}else if((t|0)==89){sz(d);c[b>>2]=A;h[b+8>>3]=B;A=b+16|0;c[A>>2]=c[n>>2];c[A+4>>2]=c[n+4>>2];c[A+8>>2]=c[n+8>>2];c[A+12>>2]=c[n+12>>2];i=g;return}}function Oz(){var a=0;Wv(0,1,167424,164312)|0;a=Wz(0,1)|0;Vz(a,0);return a|0}function Pz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0;f=i;i=i+256|0;if((HA(b,e)|0)==999){g=NA(b,1,e)|0;Fv(1,131864,(j=i,i=i+16|0,c[j>>2]=e,c[j+8>>2]=g,j)|0)|0;i=j;k=-1;i=f;return k|0}if((IA(b,d)|0)==-1){k=-1;i=f;return k|0}b=c[d+8>>2]|0;g=f|0;if((a[(c[b+8>>2]|0)+81|0]|0)==0){l=+h[b+16>>3];if(l<0.0){m=l+-.5}else{m=l+.5}l=+h[b+24>>3];if(l<0.0){n=l+-.5}else{n=l+.5}l=+h[b+32>>3];if(l<0.0){o=l+-.5}else{o=l+.5}l=+h[b+40>>3];if(l<0.0){p=l+-.5}else{p=l+.5}nb(g|0,116720,(j=i,i=i+32|0,c[j>>2]=~~m,c[j+8>>2]=~~n,c[j+16>>2]=~~o,c[j+24>>2]=~~p,j)|0)|0;i=j}else{p=+h[b+24>>3];if(p<0.0){q=p+-.5}else{q=p+.5}p=+h[b+16>>3];if(p<0.0){r=p+-.5}else{r=p+.5}p=+h[b+40>>3];if(p<0.0){s=p+-.5}else{s=p+.5}p=+h[b+32>>3];if(p<0.0){t=p+-.5}else{t=p+.5}nb(g|0,116720,(j=i,i=i+32|0,c[j>>2]=~~q,c[j+8>>2]=~~r,c[j+16>>2]=~~s,c[j+24>>2]=~~t,j)|0)|0;i=j}iw(d|0,109272,g,213384)|0;k=0;i=f;return k|0}function Qz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=c[b+48>>2]|0;CA(a,d)|0;d=c[a+164>>2]|0;c[d+56>>2]=OA(d,c[d+52>>2]|0)|0;do{if((c[(c[f+8>>2]|0)+8>>2]|0)==0){if((c[d+152>>2]&67108864|0)!=0){break}Ma(92216,20,1,c[o>>2]|0)|0;g=-1;return g|0}}while(0);BA(a,e);e=_h(a,f)|0;QA(d);cA(d);GA(a);g=e;return g|0}function Rz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=c[b+48>>2]|0;CA(a,d)|0;d=c[a+164>>2]|0;c[d+56>>2]=OA(d,c[d+52>>2]|0)|0;do{if((c[(c[h+8>>2]|0)+8>>2]|0)==0){if((c[d+152>>2]&67108864|0)!=0){break}Ma(92216,20,1,c[o>>2]|0)|0;j=-1;i=g;return j|0}}while(0);do{if((e|0)!=0){b=dF(4096)|0;c[e>>2]=b;if((b|0)==0){break}k=d+40|0;c[k>>2]=b;c[d+44>>2]=4096;b=d+48|0;c[b>>2]=0;l=_h(a,h)|0;QA(d);if((l|0)==0){c[e>>2]=c[k>>2];c[f>>2]=c[b>>2]}GA(a);j=l;i=g;return j|0}}while(0);Fv(1,86872,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0)|0;i=a;j=-1;i=g;return j|0}function Sz(a){a=a|0;eF(a);return}function Tz(a,b){a=a|0;b=b|0;Uz(a,0,b);return}function Uz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[d>>2]|0;f=kk(12)|0;g=f;if((b|0)==0){h=0}else{h=Lb(b|0)|0}c[f+4>>2]=h;c[f+8>>2]=Lb(e|0)|0;e=a+100|0;c[f>>2]=c[e>>2];c[e>>2]=g;e=c[d+4>>2]|0;d=c[e+4>>2]|0;if((d|0)==0){return}else{i=e;j=d}while(1){d=c[j+4>>2]|0;if((d|0)!=0){e=i|0;f=0;h=d;do{LA(a,c[e>>2]|0,h,c[j+(f*20|0)+8>>2]|0,g,j+(f*20|0)|0)|0;f=f+1|0;h=c[j+(f*20|0)+4>>2]|0;}while((h|0)!=0)}h=c[i+12>>2]|0;if((h|0)==0){break}else{i=i+8|0;j=h}}return}function Vz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[b+32>>2]|0;if((d|0)==0){e=b+44|0;a[e]=0;f=zB(b)|0;g=tm(b)|0;return}h=c[d>>2]|0;if((h|0)==0){e=b+44|0;a[e]=0;f=zB(b)|0;g=tm(b)|0;return}i=b+100|0;j=d;d=h;do{do{if((a[d]|0)==103){if((Ua(d|0,138896)|0)==0){break}h=c[j+4>>2]|0;k=c[h>>2]|0;l=kk(12)|0;m=l;c[l+4>>2]=0;c[l+8>>2]=Lb(k|0)|0;c[l>>2]=c[i>>2];c[i>>2]=m;l=c[h+4>>2]|0;h=c[l+4>>2]|0;if((h|0)==0){break}else{n=l;o=h}while(1){h=c[o+4>>2]|0;if((h|0)!=0){l=n|0;k=0;p=h;do{LA(b,c[l>>2]|0,p,c[o+(k*20|0)+8>>2]|0,m,o+(k*20|0)|0)|0;k=k+1|0;p=c[o+(k*20|0)+4>>2]|0;}while((p|0)!=0)}p=c[n+12>>2]|0;if((p|0)==0){break}else{n=n+8|0;o=p}}}}while(0);j=j+8|0;d=c[j>>2]|0;}while((d|0)!=0);e=b+44|0;a[e]=0;f=zB(b)|0;g=tm(b)|0;return}function Wz(a,b){a=a|0;b=b|0;var d=0,e=0;d=jk(392)|0;e=d;if((d|0)==0){return e|0}c[d>>2]=172736;c[d+16>>2]=24;c[d+32>>2]=a;c[d+36>>2]=b;return e|0}function Xz(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+104|0;e=d|0;f=c[b+76>>2]|0;g=c[b>>2]|0;do{if((f|0)==0){h=4}else{j=c[f>>2]|0;if((j|0)==0){h=4;break}Cc[j&255](b)}}while(0);do{if((h|0)==4){if((c[b+40>>2]|0)!=0){break}f=b+36|0;if((c[f>>2]|0)!=0){break}if((a[g+13|0]|0)==0){k=c[b+32>>2]|0}else{j=e|0;l=c[b+24>>2]|0;if((l|0)==0){a[j]=0}else{nb(j|0,154200,(m=i,i=i+8|0,c[m>>2]=l+1,m)|0)|0;i=m}l=c[b+20>>2]|0;n=(l|0)!=0?l:151040;l=xF(n|0)|0;o=xF(j|0)|0;q=b+52|0;r=l+1+o+(xF(c[q>>2]|0)|0)|0;if((c[53236]|0)>>>0<(r+1|0)>>>0){o=r+11|0;c[53236]=o;r=gF(c[53238]|0,o)|0;c[53238]=r;s=r}else{s=c[53238]|0}zF(s|0,n|0)|0;AF(c[53238]|0,j|0)|0;j=c[53238]|0;n=j+(xF(j|0)|0)|0;z=46;a[n]=z;z=z>>8;a[n+1|0]=z;n=Lb(c[q>>2]|0)|0;q=ob(n|0,58)|0;j=c[53238]|0;if((q|0)==0){t=j}else{r=q;q=j;while(1){AF(q|0,r+1|0)|0;j=c[53238]|0;o=j+(xF(j|0)|0)|0;z=46;a[o]=z;z=z>>8;a[o+1|0]=z;a[r]=0;o=ob(n|0,58)|0;j=c[53238]|0;if((o|0)==0){t=j;break}else{r=o;q=j}}}AF(t|0,n|0)|0;eF(n);q=c[53238]|0;c[b+32>>2]=q;k=q}if((k|0)==0){c[f>>2]=c[p>>2];break}q=Eb(k|0,119272)|0;c[f>>2]=q;if((q|0)!=0){break}q=c[(c[b+12>>2]|0)+16>>2]|0;r=c[b+32>>2]|0;j=Wb(c[(Vb()|0)>>2]|0)|0;Dc[q&63](156928,(m=i,i=i+16|0,c[m>>2]=r,c[m+8>>2]=j,m)|0);i=m;u=1;i=d;return u|0}}while(0);if((c[b+152>>2]&1024|0)==0){u=0;i=d;return u|0}c[43600]=0;c[43601]=0;c[43602]=0;c[43592]=0;c[43595]=0;c[43593]=0;c[45196]=zg(0,0,0)|0;if((Ag(174368,-1,8,-15,9,0,127008,56)|0)==0){Yz(b,8,10)|0;u=0;i=d;return u|0}else{Dc[c[(c[b+12>>2]|0)+16>>2]&63](114832,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;u=1;i=d;return u|0}return 0}function Yz(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;g=c[(c[b>>2]|0)+104>>2]|0;if((g|0)!=0){h=Hc[g&63](b,d,e)|0;i=f;return h|0}g=b+40|0;j=c[g>>2]|0;if((j|0)==0){h=Ma(d|0,1,e|0,c[b+36>>2]|0)|0;i=f;return h|0}k=b+44|0;l=b+48|0;m=c[l>>2]|0;do{if(((c[k>>2]|0)-1-m|0)>>>0<e>>>0){n=e+4096+m&-4096;c[k>>2]=n;o=gF(j,n)|0;c[g>>2]=o;if((o|0)==0){Dc[c[(c[b+12>>2]|0)+16>>2]&63](107728,(n=i,i=i+1|0,i=i+7&-8,c[n>>2]=0,n)|0);i=n;mb(1);return 0}else{p=o;q=c[l>>2]|0;break}}else{p=j;q=m}}while(0);tF(p+q|0,d|0,e)|0;d=(c[l>>2]|0)+e|0;c[l>>2]=d;a[(c[g>>2]|0)+d|0]=0;h=e;i=f;return h|0}function Zz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;if((d|0)==0|(b|0)==0){f=0;i=e;return f|0}if((c[a+152>>2]&1024|0)==0){if((Yz(a,b,d)|0)==(d|0)){f=d;i=e;return f|0}else{Dc[c[(c[a+12>>2]|0)+16>>2]&63](96176,(g=i,i=i+8|0,c[g>>2]=d,g)|0);i=g;mb(1);return 0}}h=c[45188]|0;j=h+(d<<1)-(c[43596]|0)|0;do{if(h>>>0<j>>>0){k=j+4096&-4096;c[45188]=k;l=gF(c[45190]|0,k)|0;c[45190]=l;if((l|0)!=0){break}Dc[c[(c[a+12>>2]|0)+16>>2]&63](107728,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0);i=g;mb(1);return 0}}while(0);c[45196]=zg(c[45196]|0,b,d)|0;c[43592]=b;c[43593]=d;while(1){c[43595]=c[45190];c[43596]=c[45188];m=Eg(174368,0)|0;if((m|0)!=0){n=9;break}b=c[43595]|0;j=c[45190]|0;h=b-j|0;if((b|0)!=(j|0)){o=Yz(a,j,h)|0;if((o|0)!=(h|0)){n=12;break}}if((c[43593]|0)==0){f=d;n=15;break}}if((n|0)==9){Dc[c[(c[a+12>>2]|0)+16>>2]&63](102016,(g=i,i=i+8|0,c[g>>2]=m,g)|0);i=g;mb(1);return 0}else if((n|0)==12){Dc[c[(c[a+12>>2]|0)+16>>2]&63](96176,(g=i,i=i+8|0,c[g>>2]=o,g)|0);i=g;mb(1);return 0}else if((n|0)==15){i=e;return f|0}return 0}function _z(a,b){a=a|0;b=b|0;var c=0,d=0;c=xF(b|0)|0;d=(Zz(a,b,c)|0)==(c|0);return(d?1:-1)|0}function $z(b,c){b=b|0;c=c|0;var d=0,e=0,f=0;d=i;i=i+8|0;e=d|0;a[e]=c;f=(Zz(b,e,1)|0)==1;i=d;return(f?c:-1)|0}function aA(b){b=b|0;var d=0,e=0;d=c[b+36>>2]|0;do{if((d|0)==0){e=0}else{if((a[b+144|0]|0)!=0){e=0;break}if((c[(c[b>>2]|0)+104>>2]|0)!=0){e=0;break}e=Ia(d|0)|0}}while(0);return e|0}function bA(b){b=b|0;var d=0,e=0;d=c[b+76>>2]|0;do{if((d|0)!=0){e=c[d+4>>2]|0;if((e|0)==0){break}Cc[e&255](b)}}while(0);d=c[b+36>>2]|0;if((d|0)==0){return}if((a[b+144|0]|0)!=0){return}if((c[(c[b>>2]|0)+104>>2]|0)!=0){return}Ia(d|0)|0;return}function cA(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,q=0;d=i;i=i+8|0;e=d|0;f=e;g=c[b+76>>2]|0;do{if((c[b+152>>2]&1024|0)!=0){c[e>>2]=0;c[e+4>>2]=0;h=e;c[43592]=h;c[43593]=0;j=0;while(1){c[43595]=c[45190];c[43596]=c[45188];k=Eg(174368,4)|0;if((k|0)==1){l=7;break}else if((k|0)!=0){m=j;n=k;l=6;break}k=j+1|0;if((j|0)>=101){m=k;n=0;l=6;break}o=c[45190]|0;Yz(b,o,(c[43595]|0)-o|0)|0;j=k}if((l|0)==6){Dc[c[(c[b+12>>2]|0)+16>>2]&63](80992,(q=i,i=i+16|0,c[q>>2]=n,c[q+8>>2]=m,q)|0);i=q;mb(1)}else if((l|0)==7){j=c[45190]|0;Yz(b,j,(c[43595]|0)-j|0)|0;j=Bg(174368)|0;if((j|0)==0){k=c[45196]|0;a[h]=k;a[f+1|0]=k>>>8;a[f+2|0]=k>>>16;a[f+3|0]=k>>>24;k=c[43594]|0;a[f+4|0]=k;a[f+5|0]=k>>>8;a[f+6|0]=k>>>16;a[f+7|0]=k>>>24;Yz(b,h,8)|0;break}else{Dc[c[(c[b+12>>2]|0)+16>>2]&63](167120,(q=i,i=i+8|0,c[q>>2]=j,q)|0);i=q;mb(1)}}}}while(0);do{if((g|0)!=0){q=c[g+8>>2]|0;if((q|0)==0){break}Cc[q&255](b);i=d;return}}while(0);g=b+36|0;q=c[g>>2]|0;do{if((q|0)!=0){if((a[b+144|0]|0)!=0){break}if((c[(c[b>>2]|0)+104>>2]|0)!=0){break}Ia(q|0)|0}}while(0);q=b+32|0;if((c[q>>2]|0)==0){i=d;return}f=c[g>>2]|0;if((f|0)==(c[p>>2]|0)){i=d;return}if((a[b+144|0]|0)!=0){i=d;return}if((f|0)!=0){Ha(f|0)|0;c[g>>2]=0}c[q>>2]=0;i=d;return}function dA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+1040|0;f=e+1024|0;g=e|0;h=f;c[h>>2]=d;c[h+4>>2]=0;Zz(a,g,_b(g|0,b|0,f|0)|0)|0;i=e;return}function eA(b,c){b=b|0;c=+c;var d=0,e=0,f=0,g=0.0,h=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(c<-1.0e15){d=19856;e=19;f=Zz(b,d,e)|0;return}if(c>1.0e15){d=19857;e=18;f=Zz(b,d,e)|0;return}g=c*100.0;if(g<0.0){h=g+-.5}else{h=g+.5}i=~~h;if((i|0)==0){d=159152;e=1;f=Zz(b,d,e)|0;return}j=(i|0)<0;k=178892;l=j?-i|0:i;i=0;m=2;while(1){n=(l|0)%10|0;o=(l|0)/10|0;if((n|0)==0&i<<24>>24==0){p=0;q=k}else{r=k-1|0;a[r]=n|48;p=1;q=r}do{if((m|0)==1){if(p<<24>>24==0){s=1;t=q;break}r=q-1|0;a[r]=46;s=1;t=r}else{s=p;t=q}}while(0);r=m-1|0;if((l+9|0)>>>0>18>>>0|(r|0)>0){k=t;l=o;i=s;m=r}else{break}}if(j){j=t-1|0;a[j]=45;u=j}else{u=t}d=u;e=178892-u|0;f=Zz(b,d,e)|0;return}function fA(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0;e=i;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[d>>3];do{if(g<-1.0e15){j=19856;k=19}else{if(g>1.0e15){j=19857;k=18;break}l=g*100.0;if(l<0.0){m=l+-.5}else{m=l+.5}f=~~m;if((f|0)==0){j=159152;k=1;break}n=(f|0)<0;o=178892;p=n?-f|0:f;f=0;q=2;while(1){r=(p|0)%10|0;s=(p|0)/10|0;if((r|0)==0&f<<24>>24==0){t=0;u=o}else{v=o-1|0;a[v]=r|48;t=1;u=v}do{if((q|0)==1){if(t<<24>>24==0){w=1;x=u;break}v=u-1|0;a[v]=46;w=1;x=v}else{w=t;x=u}}while(0);v=q-1|0;if((p+9|0)>>>0>18>>>0|(v|0)>0){o=x;p=s;f=w;q=v}else{break}}if(n){q=x-1|0;a[q]=45;y=q}else{y=x}j=y;k=178892-y|0}}while(0);Zz(b,j,k)|0;Zz(b,163208,1)|0;m=+h[d+8>>3];if(m<-1.0e15){z=19856;A=19;B=Zz(b,z,A)|0;i=e;return}if(m>1.0e15){z=19857;A=18;B=Zz(b,z,A)|0;i=e;return}g=m*100.0;if(g<0.0){C=g+-.5}else{C=g+.5}d=~~C;if((d|0)==0){z=159152;A=1;B=Zz(b,z,A)|0;i=e;return}k=(d|0)<0;j=178892;y=k?-d|0:d;d=0;x=2;while(1){w=(y|0)%10|0;u=(y|0)/10|0;if((w|0)==0&d<<24>>24==0){D=0;E=j}else{t=j-1|0;a[t]=w|48;D=1;E=t}do{if((x|0)==1){if(D<<24>>24==0){F=1;G=E;break}t=E-1|0;a[t]=46;F=1;G=t}else{F=D;G=E}}while(0);n=x-1|0;if((y+9|0)>>>0>18>>>0|(n|0)>0){j=G;y=u;d=F;x=n}else{break}}if(k){k=G-1|0;a[k]=45;H=k}else{H=G}z=H;A=178892-H|0;B=Zz(b,z,A)|0;i=e;return}function gA(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;fA(a,b);if((c|0)>1){d=1}else{return}do{Zz(a,163208,1)|0;fA(a,b+(d<<4)|0);d=d+1|0;}while((d|0)<(c|0));return}function hA(a){a=a|0;return 1}function iA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+336|0;h[c>>3]=10.0/+h[b+352>>3]+ +h[c>>3];a[b+537|0]=1;return 0}function jA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+336|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537|0]=1;return 0}function kA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+344|0;h[c>>3]=+h[c>>3]-10.0/+h[b+352>>3];a[b+537|0]=1;return 0}function lA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+344|0;h[c>>3]=10.0/+h[b+352>>3]+ +h[c>>3];a[b+537|0]=1;return 0}function mA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+352|0;h[c>>3]=+h[c>>3]*1.1;a[b+537|0]=1;return 0}function nA(b){b=b|0;var c=0;a[b+536|0]=0;c=b+352|0;h[c>>3]=+h[c>>3]/1.1;a[b+537|0]=1;return 0}function oA(b){b=b|0;var d=0,e=0,f=0.0,g=0.0;d=b+536|0;e=(a[d]|0)==0;a[d]=e&1;if(!e){return 0}e=c[b+448>>2]|0;d=c[b+452>>2]|0;f=+(e>>>0>>>0)/+(e|0);g=+(d>>>0>>>0)/+(d|0);h[b+352>>3]=f<g?f:g;vF(b+336|0,0,16)|0;a[b+537|0]=1;return 0}function pA(b){b=b|0;var d=0,e=0,f=0;d=c[(c[b>>2]|0)+168>>2]|0;e=b+580|0;if((c[e>>2]|0)!=0){Rh(b,d);f=b+540|0;a[f]=1;return}c[e>>2]=d;e=(c[d+8>>2]|0)+112|0;a[e]=a[e]|2;AA(b,d);Rh(b,d);f=b+540|0;a[f]=1;return}function qA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;f=i;g=e;e=i;i=i+16|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];switch(d|0){case 2:{a[b+538|0]=1;a[b+541|0]=2;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 3:{yA(b,+h[e>>3],+h[e+8>>3]);a[b+538|0]=1;a[b+541|0]=3;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 4:{a[b+536|0]=0;if((c[b+360>>2]|0)==0){m=+h[b+352>>3];d=b+336|0;h[d>>3]=(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+520>>3])+ +h[d>>3];d=b+344|0;h[d>>3]=(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+528>>3])+ +h[d>>3];n=m}else{m=+h[b+352>>3];d=b+336|0;h[d>>3]=+h[d>>3]-(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+528>>3]);d=b+344|0;h[d>>3]=(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(m*+h[b+520>>3])+ +h[d>>3];n=m}h[b+352>>3]=n*1.1;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 5:{a[b+536|0]=0;d=b+352|0;n=+h[d>>3]/1.1;h[d>>3]=n;if((c[b+360>>2]|0)==0){d=b+336|0;h[d>>3]=+h[d>>3]-(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+520>>3]);d=b+344|0;h[d>>3]=+h[d>>3]-(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+528>>3])}else{d=b+336|0;h[d>>3]=(+h[e+8>>3]- +((c[b+452>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+528>>3])+ +h[d>>3];d=b+344|0;h[d>>3]=+h[d>>3]-(+h[e>>3]- +((c[b+448>>2]|0)>>>0>>>0)*.5)*.10000000000000009/(n*+h[b+520>>3])}a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};case 1:{yA(b,+h[e>>3],+h[e+8>>3]);d=b+580|0;g=c[d>>2]|0;do{if((g|0)!=0){o=Sx(g)|0;if((o|0)==0){p=g+8|0;q=(c[p>>2]|0)+112|0;a[q]=a[q]|4;q=(c[p>>2]|0)+112|0;a[q]=a[q]&-3;break}else if((o|0)==2){q=g+8|0;p=(c[q>>2]|0)+115|0;a[p]=a[p]|4;p=(c[q>>2]|0)+115|0;a[p]=a[p]&-3;break}else if((o|0)==1){o=g+8|0;p=(c[o>>2]|0)+117|0;a[p]=a[p]|4;p=(c[o>>2]|0)+117|0;a[p]=a[p]&-3;break}else{break}}}while(0);g=b+588|0;p=c[g>>2]|0;if((p|0)!=0){eF(p);c[g>>2]=0}p=c[b+576>>2]|0;c[d>>2]=p;do{if((p|0)!=0){d=Sx(p)|0;if((d|0)==1){o=(c[p+8>>2]|0)+117|0;a[o]=a[o]|2;o=b+592|0;FA(o,0,118592);FA(o,1,$w(p)|0);c[b+596>>2]=2;o=b+604|0;q=Ix(Hx(p)|0)|0;r=Xv(q,1,0)|0;if((r|0)==0){s=2}else{t=2;u=r;while(1){FA(o,t,c[u+8>>2]|0);r=t+2|0;FA(o,t|1,fw(p,u)|0);v=Xv(q,1,u)|0;if((v|0)==0){s=r;break}else{t=r;u=v}}}c[b+608>>2]=s;u=Wv(Hx(p)|0,1,123512,0)|0;if((u|0)==0){t=Wv(Hx(p)|0,1,125272,0)|0;if((t|0)==0){break}else{w=t}}else{w=u}c[g>>2]=fk(fw(p,w)|0,p)|0;break}else if((d|0)==2){u=p;t=(c[p+8>>2]|0)+115|0;a[t]=a[t]|2;t=b+592|0;FA(t,0,119112);q=p;o=p+32|0;FA(t,1,$w(c[((c[q>>2]&3|0)==3?u:o)+28>>2]|0)|0);v=(Nw(Hx(c[((c[q>>2]&3|0)==3?u:o)+28>>2]|0)|0)|0)!=0;FA(t,3,v?131448:129144);v=p-32|0;FA(t,4,$w(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0);c[b+596>>2]=7;o=b+604|0;r=Ix(Hx(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0)|0;x=Xv(r,2,0)|0;a:do{if((x|0)==0){y=7}else{z=7;A=x;while(1){B=A;while(1){C=B+8|0;D=c[C>>2]|0;if((Ya(D|0,120056)|0)==0){E=20;break}if((Ya(D|0,120832)|0)==0){E=22;break}if((Ya(D|0,121680)|0)!=0){break}FA(t,6,fw(p,B)|0);D=Xv(r,2,B)|0;if((D|0)==0){y=z;break a}else{B=D}}if((E|0)==20){E=0;FA(t,2,fw(p,B)|0)}else if((E|0)==22){E=0;FA(t,5,fw(p,B)|0)}FA(o,z,c[C>>2]|0);D=z+2|0;FA(o,z+1|0,fw(p,B)|0);F=Xv(r,2,B)|0;if((F|0)==0){y=D;break}else{z=D;A=F}}}}while(0);c[b+608>>2]=y;r=Wv(Hx(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0,2,123512,0)|0;if((r|0)==0){o=Wv(Hx(c[((c[q>>2]&3|0)==2?u:v)+28>>2]|0)|0,2,125272,0)|0;if((o|0)==0){break}else{G=o}}else{G=r}c[g>>2]=fk(fw(p,G)|0,p)|0;break}else if((d|0)==0){r=(c[p+8>>2]|0)+112|0;a[r]=a[r]|2;AA(b,p);break}else{break}}}while(0);a[b+538|0]=1;a[b+541|0]=1;a[b+537|0]=1;j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return};default:{j=b+560|0;k=j;l=e;c[k>>2]=c[l>>2];c[k+4>>2]=c[l+4>>2];c[k+8>>2]=c[l+8>>2];c[k+12>>2]=c[l+12>>2];i=f;return}}}function rA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;d=i;f=e;e=i;i=i+16|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];a[b+538|0]=0;a[b+541|0]=0;i=d;return}function sA(b,e){b=b|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0;f=i;g=e;e=i;i=i+16|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];j=+h[e>>3];g=b+560|0;k=(j- +h[g>>3])/+h[b+520>>3];l=+h[e+8>>3];m=(l- +h[b+568>>3])/+h[b+528>>3];n=~~k;do{if((((n|0)>-1?n:-n|0)|0)<1){o=~~m;if((((o|0)>-1?o:-o|0)|0)>=1){break}i=f;return}}while(0);n=d[b+541|0]|0;if((n|0)==0){yA(b,j,l)}else if((n|0)==2){l=+h[b+352>>3];if((c[b+360>>2]|0)==0){n=b+336|0;h[n>>3]=+h[n>>3]-k/l;n=b+344|0;h[n>>3]=+h[n>>3]-m/l}else{n=b+336|0;h[n>>3]=+h[n>>3]-m/l;n=b+344|0;h[n>>3]=k/l+ +h[n>>3]}a[b+537|0]=1}b=g;g=e;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];i=f;return}function tA(a,b,c){a=a|0;b=b|0;c=c|0;return}function uA(a){a=a|0;return}function vA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[b>>2]|0;do{if((d|0)==0){g=Hw(150416,173944,0)|0;c[b+32>>2]=148120;h=g}else{g=Eb(d|0,144944)|0;if((g|0)==0){return}else{i=Dw(g,0)|0;Ha(g|0)|0;h=i;break}}}while(0);if((h|0)==0){return}d=f+168|0;i=c[d>>2]|0;if((i|0)!=0){g=c[f+172>>2]|0;do{if((g|0)==0){j=i}else{k=c[g+4>>2]|0;if((k|0)==0){j=i;break}Cc[k&255](i);j=c[d>>2]|0}}while(0);Sj(j);Kw(c[d>>2]|0)|0}Zx(h,0,142024,272,1);Zx(h,1,138264,304,1);Zx(h,2,136288,176,1);c[d>>2]=h;c[(c[h+8>>2]|0)+136>>2]=f;if((Pz(f,h,e)|0)==-1){return}c[b+580>>2]=0;c[b+576>>2]=0;a[b+537|0]=1;return}function wA(a,b){a=a|0;b=b|0;var d=0;d=c[a>>2]|0;Pz(d,c[d+168>>2]|0,b)|0;return}function xA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a>>2]|0;Qz(e,c[e+168>>2]|0,b,d)|0;return}function yA(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+32|0;g=f|0;j=+h[b+352>>3];if((c[b+360>>2]|0)==0){k=d/(j*+h[b+520>>3])- +h[b+504>>3];l=e/(j*+h[b+528>>3])- +h[b+512>>3]}else{k=e/(j*+h[b+528>>3])- +h[b+504>>3];l=(-0.0-d)/(j*+h[b+520>>3])- +h[b+512>>3]}d=1.0/j;m=c[(c[b>>2]|0)+168>>2]|0;h[g>>3]=k-d;h[g+8>>3]=l-d;h[g+16>>3]=k+d;h[g+24>>3]=l+d;n=ux(m)|0;a:do{if((n|0)==0){o=10}else{p=n;b:while(1){q=mw(m,p)|0;if((q|0)!=0){r=q;while(1){if((on(r,g)|0)<<24>>24!=0){break b}q=ow(m,r)|0;if((q|0)==0){break}else{r=q}}}q=vx(m,p)|0;if((q|0)==0){o=10;break a}else{p=q}}s=r|0}}while(0);c:do{if((o|0)==10){r=wx(m)|0;d:do{if((r|0)!=0){n=r;while(1){if((mn(n,g)|0)<<24>>24!=0){break}p=xx(m,n)|0;if((p|0)==0){break d}else{n=p}}s=n|0;break c}}while(0);r=zA(m,g)|0;if((r|0)==0){s=m|0;break}else{s=r|0;break}}}while(0);m=b+576|0;g=c[m>>2]|0;if((s|0)==(g|0)){i=f;return}do{if((g|0)!=0){o=Sx(g)|0;if((o|0)==0){r=(c[g+8>>2]|0)+112|0;a[r]=a[r]&-2;break}else if((o|0)==1){r=(c[g+8>>2]|0)+117|0;a[r]=a[r]&-2;break}else if((o|0)==2){o=(c[g+8>>2]|0)+115|0;a[o]=a[o]&-2;break}else{break}}}while(0);g=b+584|0;c[g>>2]=0;c[m>>2]=s;do{if((s|0)!=0){m=Sx(s)|0;if((m|0)==0){o=(c[s+8>>2]|0)+112|0;a[o]=a[o]|1;o=Wv(s,0,133568,0)|0;if((o|0)==0){break}c[g>>2]=fk(fw(s,o)|0,s)|0;break}else if((m|0)==2){o=(c[s+8>>2]|0)+115|0;a[o]=a[o]|1;o=Wv(Hx(c[((c[s>>2]&3|0)==2?s:s-32|0)+28>>2]|0)|0,2,133568,0)|0;if((o|0)==0){break}c[g>>2]=fk(fw(s,o)|0,s)|0;break}else if((m|0)==1){m=(c[s+8>>2]|0)+117|0;a[m]=a[m]|1;m=Wv(Hx(s)|0,1,133568,0)|0;if((m|0)==0){break}c[g>>2]=fk(fw(s,m)|0,s)|0;break}else{break}}}while(0);a[b+537|0]=1;i=f;return}function zA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0;d=i;e=b;b=i;i=i+32|0;tF(b,e,32)|0;e=c[a+8>>2]|0;f=c[e+172>>2]|0;a:do{if((f|0)>=1){g=c[e+176>>2]|0;j=1;while(1){k=zA(c[g+(j<<2)>>2]|0,b)|0;if((k|0)!=0){l=k;break}if((j|0)<(f|0)){j=j+1|0}else{break a}}i=d;return l|0}}while(0);m=+h[e+24>>3];n=+h[e+40>>3];do{if(+h[b+16>>3]>=+h[e+16>>3]){if(+h[e+32>>3]<+h[b>>3]){break}if(+h[b+24>>3]<m){break}if(n<+h[b+8>>3]){break}else{l=a}i=d;return l|0}}while(0);l=0;i=d;return l|0}function AA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+592|0;e=b|0;do{if((Ix(e)|0)==(b|0)){if((Nw(b)|0)==0){FA(d,0,116736);break}else{FA(d,0,115792);break}}else{FA(d,0,117648)}}while(0);FA(d,1,$w(e)|0);c[a+596>>2]=2;d=a+604|0;f=Xv(b,0,0)|0;if((f|0)==0){g=2}else{h=2;i=f;while(1){FA(d,h,c[i+8>>2]|0);FA(d,h+1|0,fw(e,i)|0);f=h+3|0;FA(d,h+2|0,0);j=Xv(b,0,i)|0;if((j|0)==0){g=f;break}else{h=f;i=j}}}c[a+608>>2]=g;g=Wv(b,0,123512,0)|0;do{if((g|0)==0){i=Wv(b,0,125272,0)|0;if((i|0)!=0){k=i;break}return}else{k=g}}while(0);c[a+588>>2]=fk(fw(e,k)|0,e)|0;return}function BA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+160|0;e=c[d>>2]|0;do{if((e|0)==0){f=jk(632)|0;c[d>>2]=f;c[a+164>>2]=f;c[44216]=f;g=f}else{f=c[44216]|0;if((f|0)==0){c[44216]=e;g=e;break}h=c[f+4>>2]|0;if((h|0)==0){f=jk(632)|0;c[(c[44216]|0)+4>>2]=f;i=c[(c[44216]|0)+4>>2]|0}else{i=h}c[44216]=i;g=i}}while(0);c[g+32>>2]=b;c[c[44216]>>2]=a;return}function CA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+160|0;e=c[d>>2]|0;do{if((e|0)==0){f=jk(632)|0;c[d>>2]=f;c[a+164>>2]=f;c[44214]=f;g=f}else{f=c[44214]|0;if((f|0)==0){c[44214]=e;g=e;break}h=c[f+4>>2]|0;if((h|0)==0){f=jk(632)|0;c[(c[44214]|0)+4>>2]=f;i=c[(c[44214]|0)+4>>2]|0}else{i=h}c[44214]=i;g=i}}while(0);c[g+52>>2]=b;c[c[44214]>>2]=a;return(MA(a,3,b)|0)!=0|0}function DA(a){a=a|0;var b=0;b=c[a+160>>2]|0;c[a+164>>2]=b;return b|0}function EA(a){a=a|0;var b=0,d=0,e=0;b=a+164|0;a=c[b>>2]|0;d=c[a+4>>2]|0;do{if((d|0)!=0){e=d+52|0;if((c[e>>2]|0)!=0){break}c[e>>2]=c[a+52>>2]}}while(0);c[b>>2]=d;return d|0}function FA(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=a+8|0;if((c[e>>2]|0)>(b|0)){f=c[a>>2]|0;g=f+(b<<2)|0;c[g>>2]=d;return}else{h=b+10|0;c[e>>2]=h;e=a|0;a=mk(c[e>>2]|0,h<<2)|0;c[e>>2]=a;f=a;g=f+(b<<2)|0;c[g>>2]=d;return}}function GA(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+160|0;d=c[b>>2]|0;if((d|0)!=0){e=d;while(1){d=c[e+4>>2]|0;f=e+604|0;g=c[f>>2]|0;if((g|0)!=0){eF(g)}c[f>>2]=0;c[e+612>>2]=0;c[e+608>>2]=0;f=e+592|0;g=c[f>>2]|0;if((g|0)!=0){eF(g)}c[f>>2]=0;c[e+600>>2]=0;c[e+596>>2]=0;f=c[e+584>>2]|0;if((f|0)!=0){eF(f)}f=c[e+588>>2]|0;if((f|0)!=0){eF(f)}eF(e);if((d|0)==0){break}else{e=d}}}c[44214]=0;c[44216]=0;c[a+192>>2]=0;c[a+164>>2]=0;c[b>>2]=0;c[a+28>>2]=0;return}function HA(a,b){a=a|0;b=b|0;var d=0,e=0;d=MA(a,1,b)|0;if((d|0)==0){e=999;return e|0}b=c[d+16>>2]|0;c[a+184>>2]=c[b+4>>2];c[a+172>>2]=c[b+12>>2];c[a+176>>2]=c[b>>2];c[a+180>>2]=c[b+16>>2];e=300;return e|0}function IA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;e=b|0;Wx(e,95216,272,1)|0;f=b+8|0;g=a;c[(c[f>>2]|0)+136>>2]=g;if((Ix(e)|0)!=(b|0)){c[(c[(Ix(e)|0)+8>>2]|0)+136>>2]=g}g=ew(e,144120)|0;h=a+172|0;do{if((g|0)==0){j=c[h>>2]|0}else{c[h>>2]=0;k=MA(a,1,g)|0;if((k|0)!=0){l=c[k+16>>2]|0;c[a+184>>2]=c[l+4>>2];k=c[l+12>>2]|0;c[h>>2]=k;c[a+176>>2]=c[l>>2];c[a+180>>2]=c[l+16>>2];j=k;break}k=NA(a,1,g)|0;Fv(1,120552,(l=i,i=i+16|0,c[l>>2]=g,c[l+8>>2]=k,l)|0)|0;i=l;m=-1;i=d;return m|0}}while(0);if((j|0)==0){m=-1;i=d;return m|0}Zh(1);Pj(b,c[c[a+180>>2]>>2]&1);a=c[(c[f>>2]|0)+8>>2]|0;c[(c[(Ix(e)|0)+8>>2]|0)+8>>2]=a;a=c[j>>2]|0;do{if((a|0)!=0){Cc[a&255](b);e=c[j+4>>2]|0;if((e|0)==0){break}c[(c[f>>2]|0)+140>>2]=e}}while(0);Zh(0);m=0;i=d;return m|0}function JA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((Wx(b|0,95216,0,1)|0)==0){return 0}a=b+8|0;d=c[a>>2]|0;e=c[d+140>>2]|0;if((e|0)==0){f=d}else{Cc[e&255](b);c[(c[a>>2]|0)+140>>2]=0;f=c[a>>2]|0}if((c[f+8>>2]|0)==0){return 0}Sj(b);return 0}function KA(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0;h=i;i=i+128|0;j=e;e=i;i=i+32|0;tF(e,j,32)|0;j=h|0;k=j|0;zF(k|0,c[d+28>>2]|0)|0;l=j+(xF(k|0)|0)|0;z=58;a[l]=z;z=z>>8;a[l+1|0]=z;AF(k|0,g|0)|0;g=MA(c[b>>2]|0,4,k)|0;if((g|0)==0){Fv(0,142448,(l=i,i=i+8|0,c[l>>2]=k,l)|0)|0;i=l;m=c[b+92>>2]|0}else{l=c[g+16>>2]|0;g=c[l+12>>2]|0;c[b+92>>2]=g;c[b+96>>2]=c[l>>2];m=g}if((m|0)==0){i=h;return}g=c[m>>2]|0;if((g|0)==0){i=h;return}Vc[g&63](b,d,e,f);i=h;return}function LA(b,d,e,f,g,h){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;j=i;i=i+128|0;k=j+64|0;l=j|0;DF(l|0,e|0,63)|0;m=gb(l|0,58)|0;if((m|0)!=0){a[m]=0}m=b+60+(d<<2)|0;d=c[m>>2]|0;a:do{if((d|0)==0){n=m}else{b=k|0;o=m;p=d;while(1){DF(b|0,c[p+4>>2]|0,63)|0;q=gb(b|0,58)|0;if((q|0)!=0){a[q]=0}q=(Ya(l|0,b|0)|0)<1;r=c[o>>2]|0;if(q){break}q=r|0;s=c[q>>2]|0;if((s|0)==0){n=q;break a}else{o=q;p=s}}if((r|0)==0){n=o;break}p=k|0;b=o;s=r;while(1){DF(p|0,c[s+4>>2]|0,63)|0;q=gb(p|0,58)|0;if((q|0)!=0){a[q]=0}if((Ya(l|0,p|0)|0)!=0){n=b;break a}q=c[b>>2]|0;t=q|0;if((c[q+8>>2]|0)<=(f|0)){n=b;break a}q=c[t>>2]|0;if((q|0)==0){n=t;break}else{b=t;s=q}}}}while(0);l=kk(20)|0;c[l>>2]=c[n>>2];c[n>>2]=l;c[l+4>>2]=e;c[l+8>>2]=f;c[l+12>>2]=g;c[l+16>>2]=h;i=j;return 1}function MA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;f=i;i=i+128|0;g=f+64|0;h=(d-3|0)>>>0<2>>>0?0:d;j=f|0;DF(j|0,e|0,63)|0;e=gb(j|0,58)|0;do{if((e|0)==0){k=0;l=0}else{m=e+1|0;a[e]=0;n=gb(m|0,58)|0;if((n|0)==0){k=0;l=m;break}a[n]=0;k=n+1|0;l=m}}while(0);e=b+60+(d<<2)|0;m=c[e>>2]|0;if((m|0)==0){p=0;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}n=g|0;g=(k|0)==0;r=(h|0)==(d|0);a:do{if((l|0)==0){s=e;t=m;while(1){DF(n|0,c[t+4>>2]|0,63)|0;u=gb(n|0,58)|0;if((u|0)==0){v=0}else{a[u]=0;v=u+1|0}do{if((Ya(n|0,j|0)|0)==0){u=(v|0)==0;if(!g){if((Ya(k|0,c[(c[(c[s>>2]|0)+12>>2]|0)+8>>2]|0)|0)!=0){break}}if(u|r){w=s;break a}if((MA(b,h,v)|0)!=0){w=s;break a}}}while(0);u=c[s>>2]|0;x=c[u>>2]|0;if((x|0)==0){p=0;break}else{s=u;t=x}}q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}else{if(g){t=e;s=m;while(1){DF(n|0,c[s+4>>2]|0,63)|0;x=gb(n|0,58)|0;if((x|0)==0){y=0}else{a[x]=0;y=x+1|0}do{if((Ya(n|0,j|0)|0)==0){x=(y|0)==0;if(x){w=t;break a}if((Ya(y|0,l|0)|0)!=0){break}if(x|r){w=t;break a}if((MA(b,h,y)|0)!=0){w=t;break a}}}while(0);x=c[t>>2]|0;u=c[x>>2]|0;if((u|0)==0){p=0;break}else{t=x;s=u}}q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}else{z=e;A=m}while(1){DF(n|0,c[A+4>>2]|0,63)|0;s=gb(n|0,58)|0;if((s|0)==0){B=0}else{a[s]=0;B=s+1|0}do{if((Ya(n|0,j|0)|0)==0){s=(B|0)==0;if(!s){if((Ya(B|0,l|0)|0)!=0){break}}if((Ya(k|0,c[(c[(c[z>>2]|0)+12>>2]|0)+8>>2]|0)|0)!=0){break}if(s|r){w=z;break a}if((MA(b,h,B)|0)!=0){w=z;break a}}}while(0);s=c[z>>2]|0;t=c[s>>2]|0;if((t|0)==0){p=0;break}else{z=s;A=t}}q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}}while(0);A=c[w>>2]|0;if((A|0)==0){p=0;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}w=A+16|0;z=c[w>>2]|0;if((z|0)==0){Fv(1,91016,(C=i,i=i+1|0,i=i+7&-8,c[C>>2]=0,C)|0)|0;i=C;D=c[w>>2]|0}else{D=z}z=(D|0)==0?0:A;if((z|0)==0){p=0;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}if((c[b+8>>2]|0)<=0){p=z;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}A=c[z+4>>2]|0;D=c[(c[z+12>>2]|0)+8>>2]|0;gc(c[o>>2]|0,112008,(C=i,i=i+24|0,c[C>>2]=c[74600+(d<<2)>>2],c[C+8>>2]=A,c[C+16>>2]=D,C)|0)|0;i=C;p=z;q=b+80+(d<<2)|0;c[q>>2]=p;i=f;return p|0}function NA(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((e|0)==0){f=0;return f|0}if(!(a[23360]|0)){Iv(178896,0,0);a[23360]=1}g=Lb(e|0)|0;e=gb(g|0,58)|0;do{if((e|0)==0){eF(g);h=1;i=b+60+(d<<2)|0;j=19}else{a[e]=0;k=b+60+(d<<2)|0;l=c[k>>2]|0;if((l|0)==0){eF(g);h=1;i=k;j=19;break}else{m=k;n=1;o=l}while(1){l=Lb(c[o+4>>2]|0)|0;p=gb(l|0,58)|0;if((p|0)!=0){a[p]=0}if((a[g]|0)==0){j=12}else{if((pm(g,l)|0)==0){j=12}else{q=n}}if((j|0)==12){j=0;p=c[44725]|0;if(p>>>0<(c[44726]|0)>>>0){r=p}else{Jv(178896,1)|0;r=c[44725]|0}c[44725]=r+1;a[r]=32;Lv(178896,c[(c[m>>2]|0)+4>>2]|0)|0;p=c[44725]|0;if(p>>>0<(c[44726]|0)>>>0){s=p}else{Jv(178896,1)|0;s=c[44725]|0}c[44725]=s+1;a[s]=58;Lv(178896,c[(c[(c[m>>2]|0)+12>>2]|0)+8>>2]|0)|0;q=0}eF(l);l=c[m>>2]|0;p=c[l>>2]|0;if((p|0)==0){break}else{m=l;n=q;o=p}}eF(g);if(q<<24>>24!=0){h=q;i=k;j=19}}}while(0);do{if((j|0)==19){q=c[i>>2]|0;if((q|0)==0){t=h}else{g=i;o=0;n=h;m=q;while(1){q=Lb(c[m+4>>2]|0)|0;s=gb(q|0,58)|0;if((s|0)!=0){a[s]=0}if((o|0)==0){j=24}else{if((pm(o,q)|0)==0){u=n}else{j=24}}if((j|0)==24){j=0;s=c[44725]|0;if(s>>>0<(c[44726]|0)>>>0){v=s}else{Jv(178896,1)|0;v=c[44725]|0}c[44725]=v+1;a[v]=32;Lv(178896,q)|0;u=0}s=c[g>>2]|0;r=c[s>>2]|0;if((r|0)==0){t=u;break}else{g=s;o=q;n=u;m=r}}}if(t<<24>>24==0){break}else{f=213392}return f|0}}while(0);t=c[44725]|0;if(t>>>0<(c[44726]|0)>>>0){w=t}else{Jv(178896,1)|0;w=c[44725]|0}a[w]=0;w=c[44724]|0;c[44725]=w;f=w;return f|0}function OA(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[a>>2]|0;MA(d,3,b)|0;b=c[d+92>>2]|0;if((b|0)==0){e=999;return e|0}f=c[b+16>>2]|0;g=c[f+12>>2]|0;c[a+76>>2]=g;h=c[f+16>>2]|0;c[a+84>>2]=h;i=c[f>>2]|0;c[a+80>>2]=i;c[a+88>>2]=c[b+4>>2];b=a+152|0;f=c[b>>2]|c[h>>2];c[b>>2]=f;h=c[d+80>>2]|0;if((h|0)==0){c[a+60>>2]=0;e=999;return e|0}d=c[h+16>>2]|0;c[a+60>>2]=c[d+12>>2];j=c[d+16>>2]|0;c[a+68>>2]=j;c[a+72>>2]=c[h+4>>2];c[b>>2]=f|c[j>>2];if((g|0)==0){c[a+64>>2]=i;e=300;return e|0}else{c[a+64>>2]=c[d>>2];e=300;return e|0}return 0}function PA(a){a=a|0;var b=0,d=0,e=0;b=c[a+60>>2]|0;do{if((Xz(a)|0)==0){if((b|0)==0){d=0;break}e=c[b>>2]|0;if((e|0)==0){d=0;break}Cc[e&255](a);d=0}else{d=1}}while(0);return d|0}function QA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;do{if((b|0)!=0){d=c[b+4>>2]|0;if((d|0)==0){break}Cc[d&255](a)}}while(0);c[(c[a>>2]|0)+24>>2]=0;cA(a);return}function RA(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0;f=+h[a+504>>3];g=+h[a+512>>3];i=+h[a+352>>3];j=i*+h[a+520>>3];k=i*+h[a+528>>3];l=(e|0)>0;if((c[a+360>>2]|0)==0){if(l){m=0}else{return d|0}do{h[d+(m<<4)>>3]=j*(f+ +h[b+(m<<4)>>3]);h[d+(m<<4)+8>>3]=k*(g+ +h[b+(m<<4)+8>>3]);m=m+1|0;}while((m|0)<(e|0));return d|0}else{if(l){n=0}else{return d|0}do{i=-0.0-j*(g+ +h[b+(n<<4)+8>>3]);h[d+(n<<4)+8>>3]=k*(f+ +h[b+(n<<4)>>3]);h[d+(n<<4)>>3]=i;n=n+1|0;}while((n|0)<(e|0));return d|0}return 0}function SA(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+8>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function TA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;do{if((b|0)!=0){d=c[b+12>>2]|0;if((d|0)==0){break}Cc[d&255](a)}}while(0);bA(a);return}function UA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+24>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function VA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+28>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function WA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+16>>2]|0;if((d|0)==0){return}b=c[a+160>>2]|0;Vc[d&63](a,c[(c[(c[a>>2]|0)+308>>2]|0)+(b<<2)>>2]|0,b,c[a+156>>2]|0);return}function XA(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+20>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function YA(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+32>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function ZA(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+36>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function _A(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+40>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function $A(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+44>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function aB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+48>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function bB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+52>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function cB(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+56>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function dB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+60>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function eB(a,b){a=a|0;b=b|0;var d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+64>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function fB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+68>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function gB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0;g=c[a+60>>2]|0;if((g|0)==0){return}h=c[g+72>>2]|0;if((h|0)==0){return}Bc[h&63](a,b,d,e,f);return}function hB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+76>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function iB(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[a+60>>2]|0;if((d|0)==0){return}e=c[d+80>>2]|0;if((e|0)==0){return}Dc[e&63](a,b);return}function jB(a){a=a|0;var b=0,d=0;b=c[a+60>>2]|0;if((b|0)==0){return}d=c[b+84>>2]|0;if((d|0)==0){return}Cc[d&255](a);return}function kB(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0;g=i;i=i+16|0;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=g|0;l=c[b+60>>2]|0;m=c[f>>2]|0;if((m|0)==0){i=g;return}if((a[m]|0)==0){i=g;return}m=c[b+16>>2]|0;do{if((m|0)!=0){if((c[m+144>>2]|0)!=0){break}i=g;return}}while(0);if((c[b+152>>2]&8192|0)==0){m=e|0;n=(c[k>>2]=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24,c[k+4>>2]=d[m+4|0]|d[m+5|0]<<8|d[m+6|0]<<16|d[m+7|0]<<24,+h[k>>3]);m=e+8|0;o=(c[k>>2]=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24,c[k+4>>2]=d[m+4|0]|d[m+5|0]<<8|d[m+6|0]<<16|d[m+7|0]<<24,+h[k>>3]);p=+h[b+504>>3];q=+h[b+512>>3];r=+h[b+352>>3];if((c[b+360>>2]|0)==0){s=o+q;t=n+p}else{s=n+p;t=-0.0-(o+q)}q=r*+h[b+528>>3]*s;h[j>>3]=r*+h[b+520>>3]*t;h[j+8>>3]=q}else{m=j;u=e;c[m>>2]=c[u>>2];c[m+4>>2]=c[u+4>>2];c[m+8>>2]=c[u+8>>2];c[m+12>>2]=c[u+12>>2]}if((l|0)==0){i=g;return}u=c[l+88>>2]|0;if((u|0)==0){i=g;return}Tc[u&127](b,j,f);i=g;return}function lB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=c[b+60>>2]|0;f=(c[b+16>>2]|0)+16|0;g=gb(d|0,58)|0;h=(g|0)!=0;if(h){a[g]=0}do{if((e|0)!=0){mB(c[b+68>>2]|0,d,f);i=c[e+92>>2]|0;if((i|0)==0){break}Dc[i&63](b,f)}}while(0);if(!h){return}a[g]=58;return}function mB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+8|0;f=e|0;c[d>>2]=b;c[d+32>>2]=5;c[f>>2]=zh(b)|0;g=c[a+16>>2]|0;do{if((g|0)!=0){if((vb(f|0,g|0,c[a+20>>2]|0,4,22)|0)==0){break}i=e;return}}while(0);g=Ah(b,d,c[a+24>>2]|0)|0;if((g|0)==0){i=e;return}else if((g|0)==1){g=kk((xF(b|0)|0)+16|0)|0;nb(g|0,149e3,(h=i,i=i+8|0,c[h>>2]=b,h)|0)|0;i=h;if((Sh(g)|0)!=0){Fv(0,145840,(h=i,i=i+8|0,c[h>>2]=b,h)|0)|0;i=h}eF(g);i=e;return}else{Fv(1,142848,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;i=e;return}}function nB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=c[b+60>>2]|0;f=(c[b+16>>2]|0)+56|0;g=gb(d|0,58)|0;h=(g|0)!=0;if(h){a[g]=0}do{if((e|0)!=0){mB(c[b+68>>2]|0,d,f);i=c[e+92>>2]|0;if((i|0)==0){break}Dc[i&63](b,f)}}while(0);if(!h){return}a[g]=58;return}function oB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=+e;var f=0,h=0,i=0,j=0;f=c[a+60>>2]|0;h=a+16|0;i=(c[h>>2]|0)+96|0;do{if((f|0)!=0){mB(c[a+68>>2]|0,b,i);j=c[f+92>>2]|0;if((j|0)==0){break}Dc[j&63](a,i)}}while(0);c[(c[h>>2]|0)+136>>2]=d;g[(c[h>>2]|0)+140>>2]=e;return}function pB(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=i;f=c[b+60>>2]|0;g=c[b+16>>2]|0;c[g+160>>2]=d;if((f|0)==0|(d|0)==0){i=e;return}f=c[d>>2]|0;if((f|0)==0){i=e;return}b=g+144|0;j=g+152|0;k=g+148|0;g=d;d=f;do{g=g+4|0;f=a[d]|0;l=f<<24>>24==115;a:do{if(l){if((Ya(d|0,164472)|0)!=0){m=20;break}c[b>>2]=3}else{do{if((f<<24>>24|0)==100){if((Ya(d|0,132280)|0)==0){c[b>>2]=1;break a}if((Ya(d|0,117240)|0)==0){c[b>>2]=2;break a}else{if((f<<24>>24|0)==105){m=14;break}else if((f<<24>>24|0)==98){break}else{m=20;break a}}}else if((f<<24>>24|0)==105){m=14}else if((f<<24>>24|0)!=98){m=20;break a}}while(0);b:do{if((m|0)==14){m=0;do{if((Ya(d|0,109680)|0)!=0){if((Ya(d|0,103848)|0)==0){break}if(f<<24>>24==98){break b}else{m=20;break a}}}while(0);c[b>>2]=0;break a}}while(0);if((Ya(d|0,98216)|0)!=0){m=20;break}h[j>>3]=2.0}}while(0);c:do{if((m|0)==20){m=0;do{if(l){if((Ya(d|0,92648)|0)==0){n=d;o=0}else{break}while(1){p=n+1|0;if(o){break}n=p;o=(a[p]|0)==0}h[j>>3]=+rF(p);break c}else{if((f<<24>>24|0)==116){if((Ya(d|0,168568)|0)==0){break c}else{break}}else if((f<<24>>24|0)==102){if((Ya(d|0,87288)|0)!=0){break}c[k>>2]=1;break c}else if((f<<24>>24|0)==117){if((Ya(d|0,82552)|0)!=0){break}c[k>>2]=0;break c}else{break}}}while(0);Fv(0,164352,(q=i,i=i+8|0,c[q>>2]=d,q)|0)|0;i=q}}while(0);d=c[g>>2]|0;}while((d|0)!=0);i=e;return}function qB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0;d=i;i=i+32|0;f=d|0;g=c[a+60>>2]|0;if((g|0)==0){i=d;return}j=g+96|0;if((c[j>>2]|0)==0){i=d;return}if((c[(c[a+16>>2]|0)+144>>2]|0)==0){i=d;return}g=b+16|0;k=(+h[b>>3]+ +h[g>>3])*.5;l=f|0;m=f|0;h[m>>3]=k;n=(+h[b+8>>3]+ +h[b+24>>3])*.5;b=f+8|0;h[b>>3]=n;o=f+16|0;p=g;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];do{if((c[a+152>>2]&8192|0)==0){q=+h[a+504>>3];r=+h[a+512>>3];s=+h[a+352>>3];t=s*+h[a+520>>3];u=s*+h[a+528>>3];if((c[a+360>>2]|0)==0){h[m>>3]=t*(q+k);h[b>>3]=u*(r+n);p=f+16|0;h[p>>3]=t*(q+ +h[p>>3]);p=f+24|0;h[p>>3]=u*(r+ +h[p>>3]);break}else{h[b>>3]=u*(q+k);h[m>>3]=-0.0-t*(r+n);p=f+24|0;s=-0.0-t*(r+ +h[p>>3]);o=f+16|0;h[p>>3]=u*(q+ +h[o>>3]);h[o>>3]=s;break}}}while(0);Tc[c[j>>2]&127](a,l,e);i=d;return}function rB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0;f=i;i=i+40|0;g=f|0;j=c[a+60>>2]|0;if((j|0)==0){i=f;return}k=j+100|0;if((c[k>>2]|0)==0){i=f;return}j=a+16|0;l=c[j>>2]|0;if((c[l+144>>2]|0)==0){i=f;return}if((e&4|0)==0){m=e;n=0}else{o=g;p=l+16|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];c[o+16>>2]=c[p+16>>2];c[o+20>>2]=c[p+20>>2];c[o+24>>2]=c[p+24>>2];c[o+28>>2]=c[p+28>>2];c[o+32>>2]=c[p+32>>2];c[o+36>>2]=c[p+36>>2];o=l+56|0;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[p+16>>2]=c[o+16>>2];c[p+20>>2]=c[o+20>>2];c[p+24>>2]=c[o+24>>2];c[p+28>>2]=c[o+28>>2];c[p+32>>2]=c[o+32>>2];c[p+36>>2]=c[o+36>>2];m=e&-5;n=1}if((c[a+152>>2]&8192|0)==0){if((c[43760]|0)<(d|0)){e=d+10|0;c[43760]=e;o=mk(c[53856]|0,e<<4)|0;c[53856]=o;q=o}else{q=c[53856]|0}r=+h[a+504>>3];s=+h[a+512>>3];t=+h[a+352>>3];u=t*+h[a+520>>3];v=t*+h[a+528>>3];o=(d|0)>0;do{if((c[a+360>>2]|0)==0){if(o){w=0}else{break}do{h[q+(w<<4)>>3]=u*(r+ +h[b+(w<<4)>>3]);h[q+(w<<4)+8>>3]=v*(s+ +h[b+(w<<4)+8>>3]);w=w+1|0;}while((w|0)<(d|0))}else{if(o){x=0}else{break}do{t=-0.0-u*(s+ +h[b+(x<<4)+8>>3]);h[q+(x<<4)+8>>3]=v*(r+ +h[b+(x<<4)>>3]);h[q+(x<<4)>>3]=t;x=x+1|0;}while((x|0)<(d|0))}}while(0);Vc[c[k>>2]&63](a,q,d,m)}else{Vc[c[k>>2]&63](a,b,d,m)}if((n|0)==0){i=f;return}n=(c[j>>2]|0)+16|0;j=g;c[n>>2]=c[j>>2];c[n+4>>2]=c[j+4>>2];c[n+8>>2]=c[j+8>>2];c[n+12>>2]=c[j+12>>2];c[n+16>>2]=c[j+16>>2];c[n+20>>2]=c[j+20>>2];c[n+24>>2]=c[j+24>>2];c[n+28>>2]=c[j+28>>2];c[n+32>>2]=c[j+32>>2];c[n+36>>2]=c[j+36>>2];i=f;return}function sB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0;e=i;i=i+64|0;f=b;b=i;i=i+32|0;tF(b,f,32)|0;f=e|0;g=f;j=b;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];j=f+32|0;g=j;k=b+16|0;c[g>>2]=c[k>>2];c[g+4>>2]=c[k+4>>2];c[g+8>>2]=c[k+8>>2];c[g+12>>2]=c[k+12>>2];h[f+16>>3]=+h[f>>3];h[f+24>>3]=+h[f+40>>3];h[f+48>>3]=+h[j>>3];h[f+56>>3]=+h[f+8>>3];rB(a,f|0,4,d);i=e;return}function tB(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0;i=c[a+60>>2]|0;if((i|0)==0){return}j=i+104|0;i=c[j>>2]|0;if((i|0)==0){return}if((c[(c[a+16>>2]|0)+144>>2]|0)==0){return}if((c[a+152>>2]&8192|0)!=0){Ic[i&15](a,b,d,e,f,g&255);return}if((c[43760]|0)<(d|0)){i=d+10|0;c[43760]=i;k=mk(c[53856]|0,i<<4)|0;c[53856]=k;l=k}else{l=c[53856]|0}m=+h[a+504>>3];n=+h[a+512>>3];o=+h[a+352>>3];p=o*+h[a+520>>3];q=o*+h[a+528>>3];k=(d|0)>0;do{if((c[a+360>>2]|0)==0){if(k){r=0}else{break}do{h[l+(r<<4)>>3]=p*(m+ +h[b+(r<<4)>>3]);h[l+(r<<4)+8>>3]=q*(n+ +h[b+(r<<4)+8>>3]);r=r+1|0;}while((r|0)<(d|0))}else{if(k){s=0}else{break}do{o=-0.0-p*(n+ +h[b+(s<<4)+8>>3]);h[l+(s<<4)+8>>3]=q*(m+ +h[b+(s<<4)>>3]);h[l+(s<<4)>>3]=o;s=s+1|0;}while((s|0)<(d|0))}}while(0);Ic[c[j>>2]&15](a,l,d,e,f,g&255);return}function uB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0;e=c[a+60>>2]|0;if((e|0)==0){return}f=e+108|0;e=c[f>>2]|0;if((e|0)==0){return}if((c[(c[a+16>>2]|0)+144>>2]|0)==0){return}if((c[a+152>>2]&8192|0)!=0){Tc[e&127](a,b,d);return}if((c[43760]|0)<(d|0)){e=d+10|0;c[43760]=e;g=mk(c[53856]|0,e<<4)|0;c[53856]=g;i=g}else{i=c[53856]|0}j=+h[a+504>>3];k=+h[a+512>>3];l=+h[a+352>>3];m=l*+h[a+520>>3];n=l*+h[a+528>>3];g=(d|0)>0;do{if((c[a+360>>2]|0)==0){if(g){o=0}else{break}do{h[i+(o<<4)>>3]=m*(j+ +h[b+(o<<4)>>3]);h[i+(o<<4)+8>>3]=n*(k+ +h[b+(o<<4)+8>>3]);o=o+1|0;}while((o|0)<(d|0))}else{if(g){p=0}else{break}do{l=-0.0-m*(k+ +h[b+(p<<4)+8>>3]);h[i+(p<<4)+8>>3]=n*(j+ +h[b+(p<<4)>>3]);h[i+(p<<4)>>3]=l;p=p+1|0;}while((p|0)<(d|0))}}while(0);Tc[c[f>>2]&127](a,i,d);return}function vB(b,d){b=b|0;d=d|0;var e=0,f=0;e=c[b+60>>2]|0;if((d|0)==0){return}if((a[d]|0)==0|(e|0)==0){return}f=c[e+112>>2]|0;if((f|0)==0){return}Dc[f&63](b,d);return}function wB(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;k=i;i=i+40|0;l=k|0;m=k+32|0;n=c[b+60>>2]|0;o=BB(d)|0;if((o|0)==0){if((ul(d)|0)==0|(n|0)==0){i=k;return}p=c[n+116>>2]|0;if((p|0)==0){i=k;return}Bc[p&63](b,d,e,f,g&255);i=k;return}EB(m,o,b+432|0);d=c[m>>2]|0;p=c[m+4>>2]|0;if((d|0)<1&(p|0)<1){i=k;return}m=l+16|0;q=m;r=e;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];q=l;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];if((f|0)>1){r=l|0;q=l+8|0;s=m|0;t=l+24|0;u=1;v=+h[r>>3];w=+h[q>>3];x=+h[s>>3];y=+h[t>>3];do{z=+h[e+(u<<4)>>3];v=v<z?v:z;A=+h[e+(u<<4)+8>>3];w=w<A?w:A;x=x>z?x:z;y=y>A?y:A;u=u+1|0;}while((u|0)<(f|0));h[r>>3]=v;h[q>>3]=w;h[s>>3]=x;h[t>>3]=y;B=x;C=v;D=y;E=w}else{B=+h[m>>3];C=+h[l>>3];D=+h[l+24>>3];E=+h[l+8>>3]}t=m|0;m=l|0;w=B-C;s=l+24|0;q=l+8|0;C=D-E;E=+(p|0);D=+(d|0);B=w/D;y=C/E;do{if((a[j]|0)==0){F=D;G=E}else{if((pm(j,160408)|0)==0){F=D*B;G=E;break}if((pm(j,155480)|0)==0){F=D;G=E*y;break}if((pm(j,151816)|0)==0){F=D*B;G=E*y;break}if((Km(j)|0)<<24>>24==0){F=D;G=E;break}if(B<y){F=D*B;G=E*B;break}else{F=D*y;G=E*y;break}}}while(0);if(F<w){y=(w-F)*.5;h[m>>3]=y+ +h[m>>3];h[t>>3]=+h[t>>3]-y}if(G<C){y=(C-G)*.5;h[q>>3]=y+ +h[q>>3];h[s>>3]=+h[s>>3]-y}y=+h[m>>3];if((c[b+152>>2]&8192|0)==0){G=+h[q>>3];C=+h[b+504>>3];F=+h[b+512>>3];w=+h[b+352>>3];E=w*+h[b+520>>3];D=w*+h[b+528>>3];j=(c[b+360>>2]|0)==0;if(j){H=G+F;I=y+C}else{H=y+C;I=-0.0-(G+F)}G=E*I;h[m>>3]=G;h[q>>3]=D*H;d=l+16|0;H=+h[d>>3];I=+h[s>>3];if(j){J=I+F;K=H+C}else{J=H+C;K=-0.0-(I+F)}F=E*K;h[d>>3]=F;h[s>>3]=D*J;L=G;M=F}else{L=y;M=+h[t>>3]}if(L>M){h[m>>3]=M;h[t>>3]=L}L=+h[q>>3];M=+h[s>>3];if(L>M){h[q>>3]=M;h[s>>3]=L}if((n|0)==0){i=k;return}KA(b,o,l,g,c[b+72>>2]|0);i=k;return}function xB(a,b){a=a|0;b=+b;if((c[a+60>>2]|0)==0){return}h[(c[a+16>>2]|0)+152>>3]=b;return}function yB(a,b){a=a|0;b=b|0;return Ya(c[a>>2]|0,c[b>>2]|0)|0}function zB(a){a=a|0;var b=0,d=0;b=MA(a,2,155360)|0;if((b|0)==0){d=999;return d|0}c[a+148>>2]=c[(c[b+16>>2]|0)+12>>2];d=300;return d|0}function AB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=c[a+148>>2]|0;if((e|0)==0){f=0;return f|0}a=c[e>>2]|0;if((a|0)==0){f=0;return f|0}f=Oc[a&255](b,d)|0;return f|0}function BB(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;i=i+64|0;d=b|0;e=c[53676]|0;if((e|0)==0){f=0;i=b;return f|0}c[d+8>>2]=a;f=Hc[c[e>>2]&63](e,d,4)|0;i=b;return f|0}function CB(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;if((b|0)==0){cc(153800,163008,590,170512);return 0}e=c[b+8>>2]|0;if((e|0)==0){cc(131336,163008,591,170512);return 0}f=b+20|0;g=c[f>>2]|0;if((g|0)!=0){mc(g|0,0,0)|0;h=1;i=d;return h|0}g=Sm(e)|0;if((g|0)==0){h=1;i=d;return h|0}e=Eb(g|0,116680)|0;c[f>>2]=e;if((e|0)==0){e=Wb(c[(Vb()|0)>>2]|0)|0;Fv(0,109336,(f=i,i=i+16|0,c[f>>2]=e,c[f+8>>2]=g,f)|0)|0;i=f;h=0;i=d;return h|0}f=c[44710]|0;if((f|0)>49){a[b+17|0]=1;h=1;i=d;return h|0}else{c[44710]=f+1;h=1;i=d;return h|0}return 0}function DB(b){b=b|0;var d=0;if((a[b+17|0]|0)==0){return}d=b+20|0;b=c[d>>2]|0;if((b|0)==0){return}Ha(b|0)|0;c[d>>2]=0;return}function EB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0;e=i;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];if((b|0)==0){g=-1;j=-1}else{f=c[b+48>>2]|0;if((f|0)==0){k=+h[d>>3];l=+h[d+8>>3]}else{m=+(f|0);h[d+8>>3]=m;h[d>>3]=m;k=m;l=m}g=~~(+((c[b+40>>2]|0)*72|0|0)/k);j=~~(+((c[b+44>>2]|0)*72|0|0)/l)}c[a>>2]=g;c[a+4>>2]=j;i=e;return}function FB(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0.0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0.0,Ta=0,Va=0,Wa=0,Xa=0,Za=0,_a=0,$a=0,bb=0,cb=0,eb=0,fb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0.0;g=i;i=i+2488|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+1056|0;p=g+1064|0;q=g+1072|0;r=g+1080|0;s=g+1088|0;t=g+1096|0;u=g+1112|0;v=g+1144|0;w=g+2168|0;x=g+2176|0;y=g+2184|0;z=g+2192|0;A=g+2200|0;B=g+2224|0;C=g+2424|0;do{if((f|0)!=0){if((a[f]|0)==0){break}do{if((c[53686]|0)==0){D=c[53702]|0;if((c[44708]|0)==(D|0)){break}c[44708]=D;D=c[53676]|0;if((D|0)==0){break}Vg(D)|0;c[53676]=0}}while(0);E=+h[(c[(c[e+8>>2]|0)+8>>2]|0)+24>>3];F=E<1.0?96.0:E;D=c[53676]|0;if((D|0)==0){G=$g(173112,c[43326]|0)|0;c[53676]=G;if((G|0)==0){H=12}else{I=G;J=C;H=11}}else{I=D;J=C;H=11}if((H|0)==11){c[C+8>>2]=f;D=Hc[c[I>>2]&63](I,J,4)|0;if((D|0)==0){H=12}else{K=D;H=191}}a:do{if((H|0)==12){D=jk(64)|0;G=D;if((D|0)==0){L=-1;M=-1;break}N=D+8|0;c[N>>2]=f;if((CB(G)|0)<<24>>24==0){L=-1;M=-1;break}O=A|0;P=B|0;Q=D+20|0;R=c[Q>>2]|0;b:do{if((R|0)==0){H=25}else{if((Nb(O|0,1,20,R|0)|0)==20){S=0}else{H=25;break}while(1){T=S+1|0;if((wF(O|0,c[20792+(S<<4)>>2]|0,c[20796+(S<<4)>>2]|0)|0)==0){break}if(T>>>0<10>>>0){S=T}else{H=25;break b}}T=D+28|0;c[T>>2]=c[20804+(S<<4)>>2];U=c[20800+(S<<4)>>2]|0;V=D+24|0;c[V>>2]=U;do{if((S|0)==8){if((wF(A+8|0,121160,4)|0)!=0){W=U;H=26;break}c[T>>2]=120288;c[V>>2]=11;H=90}else if((S|0)==7){while(1){if((db(P|0,200,c[Q>>2]|0)|0)==0){H=24;break}if((wF(P|0,124064,4)|0)==0){H=21;break}}if((H|0)==21){c[T>>2]=121952;c[V>>2]=8;H=105;break}else if((H|0)==24){W=c[V>>2]|0;H=26;break}}else{W=U;H=26}}while(0);c:do{if((H|0)==26){switch(W|0){case 1:{c[D+48>>2]=0;mc(c[Q>>2]|0,16,0)|0;U=c[Q>>2]|0;V=0;T=0;do{X=ab(U|0)|0;if((bc(U|0)|0)!=0){break c}T=X<<(V<<3)|T;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;U=0;X=0;do{Y=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}X=Y<<(U<<3)|X;U=U+1|0;}while(U>>>0<2>>>0);U=c[Q>>2]|0;V=0;Y=0;do{Z=ab(U|0)|0;if((bc(U|0)|0)!=0){break c}Y=Z<<(V<<3)|Y;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;U=0;Z=0;do{_=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}Z=_<<(U<<3)|Z;U=U+1|0;}while(U>>>0<2>>>0);c[D+40>>2]=X|T<<16;c[D+44>>2]=Z|Y<<16;break c;break};case 5:{c[D+48>>2]=0;mc(c[Q>>2]|0,0,0)|0;U=c[Q>>2]|0;V=n|0;do{if((db(V|0,1024,U|0)|0)==0){break c}$=Ua(V|0,97936)|0;}while(($|0)==0);Y=v|0;Z=$+9|0;while(1){T=a[Z]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){aa=Z;break}X=a[V]|0;if(X<<24>>24==0){aa=V;break}else{ba=X;ca=V}}else{ba=T;ca=Z}if((Qa(ba&255|0)|0)==0){aa=ca;break}else{Z=ca+1|0}}Z=a[aa]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){break c}da=d[V]|0;ea=V}else{da=Z<<24>>24;ea=aa}if((da|0)==91){fa=ea}else{break c}while(1){Z=fa+1|0;T=a[Z]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){ga=0;ha=Z;break}X=a[V]|0;if(X<<24>>24==0){ga=0;ha=V;break}else{ia=X;ja=V}}else{ia=T;ja=Z}if((Qa(ia&255|0)|0)==0){ga=0;ha=ja;break}else{fa=ja}}while(1){Z=a[ha]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){ka=ga;la=ha;break}T=a[V]|0;if(T<<24>>24==0){ka=ga;la=V;break}else{ma=T;na=V}}else{ma=Z;na=ha}if(!(((ma<<24>>24)-48|0)>>>0<10>>>0|ma<<24>>24==46)){ka=ga;la=na;break}Z=ga+1|0;a[v+ga|0]=ma;T=na+1|0;if((Z|0)==1023){ka=1023;la=T;break}else{ga=Z;ha=T}}a[v+ka|0]=0;E=+sF(Y,m);if((c[m>>2]|0)==(Y|0)){break c}else{oa=la}while(1){T=a[oa]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){pa=0;qa=oa;break}Z=a[V]|0;if(Z<<24>>24==0){pa=0;qa=V;break}else{ra=Z;sa=V}}else{ra=T;sa=oa}if((Qa(ra&255|0)|0)==0){pa=0;qa=sa;break}else{oa=sa+1|0}}while(1){T=a[qa]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){ta=pa;ua=qa;break}Z=a[V]|0;if(Z<<24>>24==0){ta=pa;ua=V;break}else{va=Z;wa=V}}else{va=T;wa=qa}if(!(((va<<24>>24)-48|0)>>>0<10>>>0|va<<24>>24==46)){ta=pa;ua=wa;break}T=pa+1|0;a[v+pa|0]=va;Z=wa+1|0;if((T|0)==1023){ta=1023;ua=Z;break}else{pa=T;qa=Z}}a[v+ta|0]=0;xa=+sF(Y,l);if((c[l>>2]|0)==(Y|0)){break c}else{ya=ua}while(1){Z=a[ya]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){za=0;Aa=ya;break}T=a[V]|0;if(T<<24>>24==0){za=0;Aa=V;break}else{Ba=T;Ca=V}}else{Ba=Z;Ca=ya}if((Qa(Ba&255|0)|0)==0){za=0;Aa=Ca;break}else{ya=Ca+1|0}}while(1){Z=a[Aa]|0;if(Z<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){Da=za;Ea=Aa;break}T=a[V]|0;if(T<<24>>24==0){Da=za;Ea=V;break}else{Fa=T;Ga=V}}else{Fa=Z;Ga=Aa}if(!(((Fa<<24>>24)-48|0)>>>0<10>>>0|Fa<<24>>24==46)){Da=za;Ea=Ga;break}Z=za+1|0;a[v+za|0]=Fa;T=Ga+1|0;if((Z|0)==1023){Da=1023;Ea=T;break}else{za=Z;Aa=T}}a[v+Da|0]=0;Ia=+sF(Y,k);if((c[k>>2]|0)==(Y|0)){break c}else{Ja=Ea}while(1){T=a[Ja]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){Ka=0;La=Ja;break}Z=a[V]|0;if(Z<<24>>24==0){Ka=0;La=V;break}else{Ma=Z;Na=V}}else{Ma=T;Na=Ja}if((Qa(Ma&255|0)|0)==0){Ka=0;La=Na;break}else{Ja=Na+1|0}}while(1){T=a[La]|0;if(T<<24>>24==0){if((db(V|0,1024,U|0)|0)==0){Oa=Ka;break}Z=a[V]|0;if(Z<<24>>24==0){Oa=Ka;break}else{Pa=Z;Ra=V}}else{Pa=T;Ra=La}if(!(((Pa<<24>>24)-48|0)>>>0<10>>>0|Pa<<24>>24==46)){Oa=Ka;break}T=Ka+1|0;a[v+Ka|0]=Pa;if((T|0)==1023){Oa=1023;break}Ka=T;La=Ra+1|0}a[v+Oa|0]=0;Sa=+sF(Y,j);if((c[j>>2]|0)==(Y|0)){break c}c[D+32>>2]=~~E;c[D+36>>2]=~~xa;c[D+40>>2]=~~(Ia-E);c[D+44>>2]=~~(Sa-xa);break c;break};case 3:{c[D+48>>2]=0;mc(c[Q>>2]|0,16,0)|0;V=c[Q>>2]|0;U=0;T=0;do{Z=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=Z|T<<8;U=U+1|0;}while(U>>>0<4>>>0);U=c[Q>>2]|0;V=0;Y=0;do{Z=ab(U|0)|0;if((bc(U|0)|0)!=0){break c}Y=Z|Y<<8;V=V+1|0;}while(V>>>0<4>>>0);c[D+40>>2]=T;c[D+44>>2]=Y;break c;break};case 11:{H=90;break c;break};case 6:{V=v|0;c[D+48>>2]=0;mc(c[Q>>2]|0,0,0)|0;if((db(V|0,1024,c[Q>>2]|0)|0)==0){break c}while(1){U=Ua(V|0,129848)|0;if((U|0)!=0){Z=ac(U|0,126552,(Ta=i,i=i+32|0,c[Ta>>2]=w,c[Ta+8>>2]=x,c[Ta+16>>2]=y,c[Ta+24>>2]=z,Ta)|0)|0;i=Ta;if((Z|0)==4){break}}if((db(V|0,1024,c[Q>>2]|0)|0)==0){break c}}V=c[w>>2]|0;c[D+32>>2]=V;Y=c[x>>2]|0;c[D+36>>2]=Y;c[D+40>>2]=(c[y>>2]|0)-V;c[D+44>>2]=(c[z>>2]|0)-Y;break c;break};case 4:{c[D+48>>2]=0;Y=c[Q>>2]|0;V=ab(Y|0)|0;if((bc(Y|0)|0)==0){Va=V}else{break c}d:while(1){do{if((Va|0)!=255){if((gb(20952,Va|0)|0)!=0){break}if((Va|0)==192){break d}Wa=c[Q>>2]|0;if((Va|0)==194){Xa=0;H=73;break d}else{Za=0;_a=0}do{V=ab(Wa|0)|0;if((bc(Wa|0)|0)!=0){break c}_a=V|_a<<8;Za=Za+1|0;}while(Za>>>0<2>>>0);mc(c[Q>>2]|0,_a-2|0,1)|0}}while(0);V=c[Q>>2]|0;Va=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}}if((H|0)==73){while(1){H=0;ab(Wa|0)|0;if((bc(Wa|0)|0)!=0){break c}V=Xa+1|0;if(V>>>0<3>>>0){Xa=V;H=73}else{break}}V=c[Q>>2]|0;Y=0;T=0;do{Z=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=Z|T<<8;Y=Y+1|0;}while(Y>>>0<2>>>0);Y=c[Q>>2]|0;V=0;Z=0;do{U=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}Z=U|Z<<8;V=V+1|0;}while(V>>>0<2>>>0);c[D+44>>2]=T;c[D+40>>2]=Z;break c}V=c[Q>>2]|0;Y=0;do{ab(V|0)|0;if((bc(V|0)|0)!=0){break c}Y=Y+1|0;}while(Y>>>0<3>>>0);Y=c[Q>>2]|0;V=0;Z=0;do{T=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}Z=T|Z<<8;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;Y=0;T=0;do{U=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=U|T<<8;Y=Y+1|0;}while(Y>>>0<2>>>0);c[D+44>>2]=Z;c[D+40>>2]=T;break c;break};case 0:{break b;break};case 8:{H=105;break c;break};case 2:{c[D+48>>2]=0;mc(c[Q>>2]|0,6,0)|0;Y=c[Q>>2]|0;V=0;U=0;do{X=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}U=X<<(V<<3)|U;V=V+1|0;}while(V>>>0<2>>>0);V=c[Q>>2]|0;Y=0;T=0;do{Z=ab(V|0)|0;if((bc(V|0)|0)!=0){break c}T=Z<<(Y<<3)|T;Y=Y+1|0;}while(Y>>>0<2>>>0);c[D+40>>2]=U;c[D+44>>2]=T;break c;break};case 12:{c[D+48>>2]=0;mc(c[Q>>2]|0,6,0)|0;Y=c[Q>>2]|0;V=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}Y=c[Q>>2]|0;Z=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break c}c[D+40>>2]=V;c[D+44>>2]=Z;break c;break};default:{break c}}}}while(0);e:do{if((H|0)==90){c[D+48>>2]=0;mc(c[Q>>2]|0,15,0)|0;Z=(ab(c[Q>>2]|0)|0)==88;V=c[Q>>2]|0;if(Z){mc(V|0,24,0)|0;Z=c[Q>>2]|0;Y=0;X=0;do{_=ab(Z|0)|0;if((bc(Z|0)|0)!=0){break e}X=_<<(Y<<3)|X;Y=Y+1|0;}while(Y>>>0<4>>>0);Y=c[Q>>2]|0;Z=0;T=0;do{U=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break e}T=U<<(Z<<3)|T;Z=Z+1|0;}while(Z>>>0<4>>>0);c[D+40>>2]=X;c[D+44>>2]=T;break}else{mc(V|0,26,0)|0;Z=c[Q>>2]|0;Y=0;U=0;do{_=ab(Z|0)|0;if((bc(Z|0)|0)!=0){break e}U=_<<(Y<<3)|U;Y=Y+1|0;}while(Y>>>0<2>>>0);Y=c[Q>>2]|0;Z=0;V=0;do{T=ab(Y|0)|0;if((bc(Y|0)|0)!=0){break e}V=T<<(Z<<3)|V;Z=Z+1|0;}while(Z>>>0<2>>>0);c[D+40>>2]=U;c[D+44>>2]=V;break}}else if((H|0)==105){Z=t|0;if((c[43816]|0)==0){if((LE(175160,132080,1)|0)!=0){Fv(1,92408,(Ta=i,i=i+8|0,c[Ta>>2]=132080,Ta)|0)|0;i=Ta}c[43816]=175160}mc(c[Q>>2]|0,0,0)|0;f:do{if((db(P|0,200,c[Q>>2]|0)|0)==0){$a=0;bb=0}else{Y=u|0;T=u+12|0;X=u+20|0;_=u+8|0;cb=u+16|0;eb=u+4|0;fb=0;hb=0;ib=0;jb=0;while(1){if(ib<<24>>24==0|jb<<24>>24==0){kb=jb;lb=ib;mb=P;nb=hb;ob=fb}else{$a=fb;bb=hb;break f}g:while(1){pb=kb;qb=lb;rb=mb;sb=nb;h:while(1){if((YE(175160,rb,4,Y,0)|0)==0){tb=rb}else{ub=pb;vb=qb;wb=sb;xb=ob;break g}while(1){a[tb+(c[T>>2]|0)|0]=0;a[tb+(c[X>>2]|0)|0]=0;yb=tb+(c[_>>2]|0)|0;zb=tb+(c[cb>>2]|0)|0;Ab=tb+((c[eb>>2]|0)+1)|0;if((Ya(yb|0,87080)|0)==0){break}if((Ya(yb|0,160280)|0)==0){break h}if((Ya(yb|0,155296)|0)==0){yb=ac(zb|0,151720,(Ta=i,i=i+32|0,c[Ta>>2]=p,c[Ta+8>>2]=q,c[Ta+16>>2]=r,c[Ta+24>>2]=s,Ta)|0)|0;i=Ta;if((yb|0)==4){H=129;break g}}if((YE(175160,Ab,4,Y,0)|0)==0){tb=Ab}else{ub=pb;vb=qb;wb=sb;xb=ob;break g}}yb=ac(zb|0,82328,(Ta=i,i=i+16|0,c[Ta>>2]=o,c[Ta+8>>2]=Z,Ta)|0)|0;i=Ta;do{if((yb|0)==2){Bb=1;Cb=GB(+h[o>>3],Z)|0}else{Db=ac(zb|0,168376,(Ta=i,i=i+8|0,c[Ta>>2]=o,Ta)|0)|0;i=Ta;if((Db|0)!=1){Bb=qb;Cb=sb;break}Bb=1;Cb=GB(+h[o>>3],164232)|0}}while(0);if(pb<<24>>24==0){pb=0;qb=Bb;rb=Ab;sb=Cb}else{ub=pb;vb=Bb;wb=Cb;xb=ob;break g}}rb=ac(zb|0,82328,(Ta=i,i=i+16|0,c[Ta>>2]=o,c[Ta+8>>2]=Z,Ta)|0)|0;i=Ta;do{if((rb|0)==2){Eb=1;Fb=GB(+h[o>>3],Z)|0}else{yb=ac(zb|0,168376,(Ta=i,i=i+8|0,c[Ta>>2]=o,Ta)|0)|0;i=Ta;if((yb|0)!=1){Eb=pb;Fb=ob;break}Eb=1;Fb=GB(+h[o>>3],164232)|0}}while(0);if(qb<<24>>24==0){kb=Eb;lb=0;mb=Ab;nb=sb;ob=Fb}else{ub=Eb;vb=qb;wb=sb;xb=Fb;break}}if((H|0)==129){H=0;ub=1;vb=1;wb=~~(+h[r>>3]- +h[p>>3]+1.0);xb=~~(+h[s>>3]- +h[q>>3]+1.0)}if((db(P|0,200,c[Q>>2]|0)|0)==0){$a=xb;bb=wb;break}else{fb=xb;hb=wb;ib=vb;jb=ub}}}}while(0);c[D+48>>2]=0;c[D+40>>2]=bb;c[D+44>>2]=$a;}}while(0);Z=c[53676]|0;Hc[c[Z>>2]&63](Z,D,1)|0;K=G;H=191;break a}}while(0);if((H|0)==25){c[D+28>>2]=119560;c[D+24>>2]=0;}G=ul(c[N>>2]|0)|0;c[D+52>>2]=G;if((G|0)==0){Fv(0,103432,(Ta=i,i=i+8|0,c[Ta>>2]=c[N>>2],Ta)|0)|0;i=Ta}eF(D);L=-1;M=-1}}while(0);i:do{if((H|0)==191){do{if((a[K+17|0]|0)==0){if((K|0)==0){L=-1;M=-1;break i}}else{G=K+20|0;Q=c[G>>2]|0;if((Q|0)==0){break}Ha(Q|0)|0;c[G>>2]=0}}while(0);D=c[K+48>>2]|0;if((D|0)==0){Gb=F}else{Gb=+(D|0)}L=~~(+((c[K+40>>2]|0)*72|0|0)/Gb);M=~~(+((c[K+44>>2]|0)*72|0|0)/Gb)}}while(0);c[b>>2]=L;c[b+4>>2]=M;i=g;return}}while(0);c[b>>2]=-1;c[b+4>>2]=-1;i=g;return}function GB(a,b){a=+a;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0,h=0.0,i=0.0,j=0.0;if((Ya(b|0,148872)|0)==0){c=a*72.0;if(c<0.0){d=c+-.5}else{d=c+.5}e=~~d;return e|0}if((Ya(b|0,145712)|0)==0){d=a*72.0/96.0;if(d<0.0){f=d+-.5}else{f=d+.5}e=~~f;return e|0}if((Ya(b|0,142696)|0)==0){f=a*72.0/6.0;if(f<0.0){g=f+-.5}else{g=f+.5}e=~~g;return e|0}do{if((Ya(b|0,164232)|0)!=0){if((Ya(b|0,139624)|0)==0){break}if((Ya(b|0,136976)|0)==0){g=a*28.346456664;if(g<0.0){h=g+-.5}else{h=g+.5}e=~~h;return e|0}if((Ya(b|0,134064)|0)!=0){e=0;return e|0}g=a*2.8346456663999997;if(g<0.0){i=g+-.5}else{i=g+.5}e=~~i;return e|0}}while(0);if(a<0.0){j=a+-.5}else{j=a+.5}e=~~j;return e|0}function HB(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b+20>>2]|0;if((d|0)!=0){Ha(d|0)|0}if((c[b+52>>2]|0)==0){eF(b);return}d=c[b+60>>2]|0;if((d|0)==0){eF(b);return}Cc[d&255](b);eF(b);return}function IB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=dF(28)|0;e=d;if((d|0)==0){f=0;return f|0}g=(b|0)>0;do{if(g){h=0;i=0;do{h=(c[(c[a+(i<<2)>>2]|0)+4>>2]|0)+h|0;i=i+1|0;}while((i|0)<(b|0));i=h<<4;if((i|0)==0){j=0;k=h;break}j=dF(i)|0;k=h}else{j=0;k=0}}while(0);i=d+8|0;c[i>>2]=j;j=(b<<2)+4|0;if((j|0)==0){l=0}else{l=dF(j)|0}j=d+12|0;c[j>>2]=l;m=k<<2;if((m|0)==0){n=d+16|0;c[n>>2]=0;o=0;p=n}else{n=d+16|0;c[n>>2]=dF(m)|0;o=dF(m)|0;p=n}n=d+20|0;c[n>>2]=o;c[d+4>>2]=k;c[d>>2]=b;c[l>>2]=0;if(g){g=0;l=0;while(1){d=a+(l<<2)|0;k=c[d>>2]|0;o=c[k+4>>2]|0;m=g-1+o|0;if((o|0)>0){o=0;q=g;r=k;while(1){k=(c[i>>2]|0)+(q<<4)|0;s=(c[r>>2]|0)+(o<<4)|0;c[k>>2]=c[s>>2];c[k+4>>2]=c[s+4>>2];c[k+8>>2]=c[s+8>>2];c[k+12>>2]=c[s+12>>2];s=q+1|0;c[(c[p>>2]|0)+(q<<2)>>2]=s;c[(c[n>>2]|0)+(q<<2)>>2]=q-1;k=o+1|0;t=c[d>>2]|0;if((k|0)<(c[t+4>>2]|0)){o=k;q=s;r=t}else{u=s;break}}}else{u=g}c[(c[p>>2]|0)+(m<<2)>>2]=g;c[(c[n>>2]|0)+(g<<2)>>2]=m;r=l+1|0;c[(c[j>>2]|0)+(r<<2)>>2]=u;if((r|0)<(b|0)){g=u;l=r}else{break}}}aC(e);f=e;return f|0}function JB(a){a=a|0;var b=0,d=0,e=0;eF(c[a+8>>2]|0);eF(c[a+12>>2]|0);eF(c[a+16>>2]|0);eF(c[a+20>>2]|0);b=a+24|0;d=c[b>>2]|0;if((d|0)==0){e=a;eF(e);return}eF(c[d>>2]|0);eF(c[b>>2]|0);e=a;eF(e);return}function KB(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;h=i;j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=bC(a,d,b)|0;k=bC(a,f,e)|0;l=WB(b,d,j,e,f,k,a)|0;f=c[a+4>>2]|0;d=f+1|0;m=f;n=1;while(1){o=c[l+(m<<2)>>2]|0;p=n+1|0;if((o|0)==(d|0)){break}else{m=o;n=p}}m=dF(p<<4)|0;o=m+(n<<4)|0;q=e;c[o>>2]=c[q>>2];c[o+4>>2]=c[q+4>>2];c[o+8>>2]=c[q+8>>2];c[o+12>>2]=c[q+12>>2];q=c[l+(f<<2)>>2]|0;f=n-1|0;n=m+(f<<4)|0;if((q|0)==(d|0)){r=f;s=n}else{o=c[a+8>>2]|0;a=q;q=f;f=n;while(1){n=f;e=o+(a<<4)|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];e=c[l+(a<<2)>>2]|0;n=q-1|0;t=m+(n<<4)|0;if((e|0)==(d|0)){r=n;s=t;break}else{a=e;q=n;f=t}}}f=s;s=b;c[f>>2]=c[s>>2];c[f+4>>2]=c[s+4>>2];c[f+8>>2]=c[s+8>>2];c[f+12>>2]=c[s+12>>2];if((r|0)!=0){cc(113416,153568,148,171208);return 0}if((j|0)!=0){eF(j)}if((k|0)==0){u=g+4|0;c[u>>2]=p;v=g|0;c[v>>2]=m;w=l;eF(w);i=h;return 1}eF(k);u=g+4|0;c[u>>2]=p;v=g|0;c[v>>2]=m;w=l;eF(w);i=h;return 1}function LB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=a;a=i;i=i+8|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=c[a>>2]|0;f=c[a+4>>2]|0;a=f-1|0;if((f|0)>0){g=0}else{h=1;i=d;return h|0}while(1){j=g+1|0;if((_B(e+(((a+g|0)%(f|0)|0)<<4)|0,e+(g<<4)|0,b)|0)==1){h=0;k=4;break}if((j|0)<(f|0)){g=j}else{h=1;k=4;break}}if((k|0)==4){i=d;return h|0}return 0}function MB(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0,I=0;g=i;j=d;d=i;i=i+8|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];j=1;k=0;l=i;i=i+168|0;c[l>>2]=0;while(1)switch(j|0){case 1:m=c[d>>2]|0;n=c[d+4>>2]|0;o=BF(177752,j,l)|0;j=9;break;case 9:if((o|0)==0){j=2;break}else{p=-1;j=8;break};case 2:q=e|0;r=+h[q>>3];s=e+8|0;t=+h[s>>3];w=r*r+t*t;if(w>1.0e-6){j=3;break}else{x=r;y=t;j=4;break};case 3:z=+ta(2,w);if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;x=r/z;y=t/z;j=4;break;case 4:h[q>>3]=x;h[s>>3]=y;A=e+16|0;B=+h[A>>3];C=e+24|0;D=+h[C>>3];E=B*B+D*D;if(E>1.0e-6){j=5;break}else{F=B;G=D;j=6;break};case 5:z=+ta(2,E);if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;F=B/z;G=D/z;j=6;break;case 6:h[A>>3]=F;h[C>>3]=G;c[44262]=0;ka(168,4);if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;H=c[44262]|0;c[44262]=H+1;I=(c[44256]|0)+(H<<4)|0;H=m;c[I>>2]=c[H>>2];c[I+4>>2]=c[H+4>>2];c[I+8>>2]=c[H+8>>2];c[I+12>>2]=c[H+12>>2];H=ra(2,a|0,b|0,m|0,n|0,+(+h[q>>3]),+(+h[s>>3]),+(+h[A>>3]),+(+h[C>>3]))|0;if((u|0)!=0&(v|0)!=0){k=CF(c[u>>2]|0,l)|0;if((k|0)>0){j=-1;break}else return 0}u=v=0;if((H|0)==-1){p=-1;j=8;break}else{j=7;break};case 7:c[f+4>>2]=c[44262];c[f>>2]=c[44256];p=0;j=8;break;case 8:i=g;return p|0;case-1:if((k|0)==1){o=v;j=9}u=v=0;break}return 0}function NB(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((c[44260]|0)>=(a|0)){i=b;return}d=c[44256]|0;do{if((d|0)==0){e=dF(a<<4)|0;c[44256]=e;if((e|0)!=0){break}gc(c[o>>2]|0,125472,(f=i,i=i+24|0,c[f>>2]=154064,c[f+8>>2]=531,c[f+16>>2]=123408,f)|0)|0;i=f;rc(177752,1)}else{e=gF(d,a<<4)|0;c[44256]=e;if((e|0)!=0){break}gc(c[o>>2]|0,125472,(f=i,i=i+24|0,c[f>>2]=154064,c[f+8>>2]=537,c[f+16>>2]=114304,f)|0)|0;i=f;rc(177752,1)}}while(0);c[44260]=a;i=b;return}function OB(a,b,d,e,f,g,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;j=+j;k=+k;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0,oa=0.0,pa=0,qa=0.0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0;l=i;i=i+112|0;m=l|0;n=l+32|0;o=l+56|0;p=l+80|0;q=c[43786]|0;if((c[43788]|0)<(e|0)){do{if((q|0)==0){r=dF(e*40|0)|0;s=r;c[43786]=s;if((r|0)==0){t=-1}else{u=s;break}i=l;return t|0}else{s=gF(q,e*40|0)|0;r=s;c[43786]=r;if((s|0)==0){t=-1}else{u=r;break}i=l;return t|0}}while(0);c[43788]=e;v=u}else{v=q}h[v>>3]=0.0;q=(e|0)>1;do{if(q){u=1;w=0.0;do{r=u-1|0;x=+h[d+(r<<4)>>3]- +h[d+(u<<4)>>3];y=+h[d+(r<<4)+8>>3]- +h[d+(u<<4)+8>>3];w=w+ +T(x*x+y*y);h[v+(u*40|0)>>3]=w;u=u+1|0;}while((u|0)<(e|0));if(!q){break}u=v+((e-1|0)*40|0)|0;r=1;do{s=v+(r*40|0)|0;h[s>>3]=+h[s>>3]/+h[u>>3];r=r+1|0;}while((r|0)<(e|0))}}while(0);r=(e|0)>0;a:do{if(r){u=0;do{w=+h[v+(u*40|0)>>3];y=1.0-w;x=w*3.0;z=y*x*y;h[v+(u*40|0)+8>>3]=z*f;h[v+(u*40|0)+16>>3]=z*g;z=y*w*x;h[v+(u*40|0)+24>>3]=z*j;h[v+(u*40|0)+32>>3]=z*k;u=u+1|0;}while((u|0)<(e|0));if(!r){A=0.0;B=0.0;C=0.0;D=0.0;E=0.0;break}z=+h[d>>3];x=+h[d+8>>3];u=e-1|0;w=+h[d+(u<<4)>>3];y=+h[d+(u<<4)+8>>3];F=0.0;G=0.0;H=0.0;I=0.0;J=0.0;u=0;K=z;L=x;while(1){M=+h[v+(u*40|0)+8>>3];N=+h[v+(u*40|0)+16>>3];O=H+(M*M+N*N);P=+h[v+(u*40|0)+24>>3];Q=+h[v+(u*40|0)+32>>3];R=I+(M*P+N*Q);S=J+(P*P+Q*Q);U=+h[v+(u*40|0)>>3];V=1.0-U;W=V*V*(V+U*3.0);X=U*U*(U+V*3.0);V=K-(z*W+w*X);U=L-(x*W+y*X);X=G+(M*V+N*U);N=F+(P*V+Q*U);s=u+1|0;if((s|0)>=(e|0)){A=N;B=X;C=O;D=R;E=S;break a}F=N;G=X;H=O;I=R;J=S;u=s;K=+h[d+(s<<4)>>3];L=+h[d+(s<<4)+8>>3]}}else{A=0.0;B=0.0;C=0.0;D=0.0;E=0.0}}while(0);L=E*C-D*D;v=L>=0.0;if(v){Y=L}else{Y=-0.0-L}if(Y<1.0e-6){Z=0.0;_=0.0}else{Z=(C*A-D*B)/L;_=(E*B-D*A)/L}if(v){$=L}else{$=-0.0-L}v=e-1|0;L=+h[d>>3];A=+h[d+8>>3];D=+h[d+(v<<4)>>3];B=+h[d+(v<<4)+8>>3];if($>=1.0e-6&_>0.0&Z>0.0){aa=Z;ba=_}else{_=D-L;Z=B-A;$=+T(_*_+Z*Z)/3.0;aa=$;ba=$}r=d|0;u=d+8|0;$=ba*f;Z=ba*g;ba=aa*j;_=aa*k;s=(e|0)==2;ca=(b|0)>0;da=m|0;ea=m+24|0;fa=m+16|0;ga=m+8|0;m=n|0;ha=o|0;aa=L*3.0;E=A*3.0;ia=1;C=4.0;Y=4.0;b:while(1){ja=L+$*Y/3.0;ka=A+Z*Y/3.0;la=D-ba*C/3.0;ma=B-_*C/3.0;if(ia){K=ja-L;J=ka-A;I=la-ja;H=ma-ka;G=D-la;F=B-ma;y=+T(K*K+J*J)+0.0+ +T(I*I+H*H)+ +T(G*G+F*F);if(q){na=1;F=0.0;G=+h[r>>3];H=+h[u>>3];while(1){I=+h[d+(na<<4)>>3];J=I-G;K=+h[d+(na<<4)+8>>3];x=K-H;oa=F+ +T(J*J+x*x);pa=na+1|0;if((pa|0)<(e|0)){na=pa;F=oa;G=I;H=K}else{break}}qa=oa+-.001}else{qa=-.001}if(y<qa){break}}if(!ca){ra=71;break}H=la*3.0;G=D+ja*3.0-(L+H);F=aa+H-ja*6.0;H=(ja-L)*3.0;K=ma*3.0;I=B+ka*3.0-(A+K);x=E+K-ka*6.0;K=(ka-A)*3.0;na=0;c:while(1){J=+h[a+(na<<5)>>3];w=+h[a+(na<<5)+8>>3];z=+h[a+(na<<5)+16>>3];S=+h[a+(na<<5)+24>>3];R=z-J;O=S-w;d:do{if(R==0.0){h[ea>>3]=G;h[fa>>3]=F;h[ga>>3]=H;h[da>>3]=L-J;pa=XB(da,m)|0;if(O!=0.0){if((pa|0)==4){sa=4;break}if((pa|0)>0){ta=0;ua=0}else{sa=0;break}while(1){X=+h[n+(ua<<3)>>3];do{if(X>=0.0&X<=1.0){h[ea>>3]=I;h[fa>>3]=x;h[ga>>3]=K;h[da>>3]=A;N=(A+X*(K+X*(x+I*X))-w)/O;if(!(N>=0.0&N<=1.0)){va=ta;break}h[p+(ta<<3)>>3]=X;va=ta+1|0}else{va=ta}}while(0);wa=ua+1|0;if((wa|0)<(pa|0)){ta=va;ua=wa}else{sa=va;break d}}}h[ea>>3]=I;h[fa>>3]=x;h[ga>>3]=K;h[da>>3]=A-w;wa=XB(da,ha)|0;xa=(wa|0)==4;if((pa|0)==4){if(xa){sa=4;break}if((wa|0)>0){ya=0;za=0}else{sa=0;break}while(1){X=+h[o+(za<<3)>>3];if(X>=0.0&X<=1.0){h[p+(ya<<3)>>3]=X;Aa=ya+1|0}else{Aa=ya}Ba=za+1|0;if((Ba|0)<(wa|0)){ya=Aa;za=Ba}else{sa=Aa;break d}}}Ba=(pa|0)>0;if(xa){if(Ba){Ca=0;Da=0}else{sa=0;break}while(1){X=+h[n+(Da<<3)>>3];if(X>=0.0&X<=1.0){h[p+(Ca<<3)>>3]=X;Ea=Ca+1|0}else{Ea=Ca}Fa=Da+1|0;if((Fa|0)<(pa|0)){Ca=Ea;Da=Fa}else{sa=Ea;break d}}}if(Ba&(wa|0)>0){Ga=0;Ha=0}else{sa=0;break}while(1){X=+h[n+(Ha<<3)>>3];if(X>=0.0&X<=1.0){xa=Ga;Fa=0;while(1){if(X==+h[o+(Fa<<3)>>3]){h[p+(xa<<3)>>3]=X;Ia=xa+1|0}else{Ia=xa}Ja=Fa+1|0;if((Ja|0)<(wa|0)){xa=Ia;Fa=Ja}else{Ka=Ia;break}}}else{Ka=Ga}Fa=Ha+1|0;if((Fa|0)<(pa|0)){Ga=Ka;Ha=Fa}else{sa=Ka;break}}}else{X=O/R;N=A-L*X;U=ka-ja*X;Q=(ma-la*X)*3.0;h[ea>>3]=B-D*X+U*3.0-(N+Q);h[fa>>3]=N*3.0+Q-U*6.0;h[ga>>3]=(U-N)*3.0;h[da>>3]=J*X-w+N;pa=XB(da,m)|0;if((pa|0)==4){sa=4;break}if((pa|0)>0){La=0;Ma=0}else{sa=0;break}while(1){N=+h[n+(Ma<<3)>>3];do{if(N>=0.0&N<=1.0){h[ea>>3]=G;h[fa>>3]=F;h[ga>>3]=H;h[da>>3]=L;X=(L+N*(H+N*(F+G*N))-J)/R;if(!(X>=0.0&X<=1.0)){Na=La;break}h[p+(La<<3)>>3]=N;Na=La+1|0}else{Na=La}}while(0);wa=Ma+1|0;if((wa|0)<(pa|0)){La=Na;Ma=wa}else{sa=Na;break}}}}while(0);if((sa|0)!=4&(sa|0)>0){pa=0;do{R=+h[p+(pa<<3)>>3];do{if(!(R<1.0e-6|R>.999999)){O=R*R*R;N=R*3.0;X=1.0-R;U=X*R*N;Q=X*N*X;N=X*X*X;X=D*O+(la*U+(L*N+ja*Q));V=B*O+(ma*U+(A*N+ka*Q));Q=X-J;N=V-w;if(Q*Q+N*N<.001){break}N=X-z;X=V-S;if(N*N+X*X>=.001){break c}}}while(0);pa=pa+1|0;}while((pa|0)<(sa|0))}pa=na+1|0;if((pa|0)<(b|0)){na=pa}else{ra=71;break b}}if(Y==0.0&C==0.0){ra=73;break}if(Y<=.01){ia=0;C=0.0;Y=0.0;continue}ia=0;C=C*.5;Y=Y*.5}if((ra|0)==71){NB((c[44262]|0)+4|0);ia=c[44256]|0;sa=c[44262]|0;h[ia+(sa<<4)>>3]=ja;p=sa+1|0;h[ia+(sa<<4)+8>>3]=ka;h[ia+(p<<4)>>3]=la;Na=sa+2|0;h[ia+(p<<4)+8>>3]=ma;h[ia+(Na<<4)>>3]=D;h[ia+(Na<<4)+8>>3]=B;c[44262]=sa+3;t=0;i=l;return t|0}do{if((ra|0)==73){if(!s){break}NB((c[44262]|0)+4|0);sa=c[44256]|0;Na=c[44262]|0;h[sa+(Na<<4)>>3]=ja;ia=Na+1|0;h[sa+(Na<<4)+8>>3]=ka;h[sa+(ia<<4)>>3]=la;p=Na+2|0;h[sa+(ia<<4)+8>>3]=ma;h[sa+(p<<4)>>3]=D;h[sa+(p<<4)+8>>3]=B;c[44262]=Na+3;t=0;i=l;return t|0}}while(0);ma=L+$*.3333333333333333;$=Z*.3333333333333333+A;Z=D-ba*.3333333333333333;ba=B-_*.3333333333333333;if((v|0)>1){s=c[43786]|0;_=-1.0;ra=-1;Na=1;while(1){la=+h[s+(Na*40|0)>>3];ka=1.0-la;ja=ka*ka*ka;Y=la*3.0;C=ka*Y*ka;E=ka*la*Y;Y=la*la*la;la=+h[d+(Na<<4)>>3]-(D*Y+(Z*E+(L*ja+ma*C)));ka=+h[d+(Na<<4)+8>>3]-(B*Y+(ba*E+(A*ja+$*C)));C=+T(la*la+ka*ka);p=C>_;sa=p?Na:ra;ia=Na+1|0;if((ia|0)<(v|0)){_=p?C:_;ra=sa;Na=ia}else{Oa=sa;break}}}else{Oa=-1}Na=d+(Oa<<4)|0;ra=Oa-1|0;_=+h[Na>>3];$=+h[d+(Oa<<4)+8>>3];A=_- +h[d+(ra<<4)>>3];ba=$- +h[d+(ra<<4)+8>>3];B=A*A+ba*ba;if(B>1.0e-6){ma=+T(B);Pa=A/ma;Qa=ba/ma}else{Pa=A;Qa=ba}ra=Oa+1|0;ba=+h[d+(ra<<4)>>3]-_;_=+h[d+(ra<<4)+8>>3]-$;$=ba*ba+_*_;if($>1.0e-6){A=+T($);Ra=ba/A;Sa=_/A}else{Ra=ba;Sa=_}_=Pa+Ra;Ra=Qa+Sa;Sa=Ra*Ra+_*_;if(Sa>1.0e-6){Qa=+T(Sa);Ta=_/Qa;Ua=Ra/Qa}else{Ta=_;Ua=Ra}OB(a,b,d,ra,f,g,Ta,Ua)|0;OB(a,b,Na,e-Oa|0,Ta,Ua,j,k)|0;t=0;i=l;return t|0}function PB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0,H=0,I=0.0,J=0,K=0,L=0.0,M=0.0,N=0,O=0.0,P=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,na=0.0,oa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0,ua=0.0,va=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ca=0.0,Da=0.0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0.0,Ja=0.0,Ka=0.0,La=0,Ma=0,Na=0.0,Oa=0.0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0.0,Va=0.0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0.0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0;e=i;i=i+16|0;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:k=e|0;l=BF(177592,f,j)|0;f=150;break;case 150:if((l|0)==0){f=2;break}else{m=-2;f=149;break};case 2:n=a+4|0;p=c[n>>2]|0;if((c[44104]|0)<(p|0)){f=3;break}else{f=13;break};case 3:q=c[44100]|0;if((q|0)==0){f=4;break}else{f=8;break};case 4:r=ma(6,p<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44100]=r;if((r|0)==0){f=5;break}else{f=6;break};case 5:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=523,c[s+16>>2]=81032,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 6:r=ma(6,p<<2|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44102]=r;if((r|0)==0){f=7;break}else{f=12;break};case 7:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=527,c[s+16>>2]=167232,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 8:r=wa(202,q|0,p<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44100]=r;if((r|0)==0){f=9;break}else{f=10;break};case 9:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=533,c[s+16>>2]=163024,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 10:r=wa(202,c[44102]|0,p<<2|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[44102]=r;if((r|0)==0){f=11;break}else{f=12;break};case 11:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=539,c[s+16>>2]=158976,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 12:c[44104]=p;f=13;break;case 13:c[44106]=0;c[43660]=0;w=c[n>>2]|0;x=w<<1;r=c[45178]|0;if((r|0)<(x|0)){f=14;break}else{y=r;f=20;break};case 14:z=c[45180]|0;if((z|0)==0){f=15;break}else{f=17;break};case 15:r=ma(6,w<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45180]=r;if((r|0)==0){f=16;break}else{f=19;break};case 16:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=573,c[s+16>>2]=90928,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 17:r=wa(202,z|0,w<<3|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45180]=r;if((r|0)==0){f=18;break}else{f=19;break};case 18:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=580,c[s+16>>2]=85648,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;la(40,177592,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 19:c[45178]=x;y=x;f=20;break;case 20:r=(y|0)/2|0;c[45176]=r;c[45174]=r-1;A=c[n>>2]|0;B=(A|0)>0;C=a|0;D=c[C>>2]|0;if(B){E=t;F=-1;G=0;f=21;break}else{H=-1;f=22;break};case 21:I=+h[D+(G<<4)>>3];r=E>I;J=r?G:F;K=G+1|0;if((K|0)<(A|0)){E=r?I:E;F=J;G=K;f=21;break}else{H=J;f=22;break};case 22:L=+h[D+(H<<4)>>3];M=+h[D+(H<<4)+8>>3];N=((H|0)==0?A:H)-1|0;O=+h[D+(N<<4)>>3];J=(H|0)==(A-1|0)?0:H+1|0;P=+h[D+(J<<4)>>3];Q=+h[D+(J<<4)+8>>3];if(O==L&L==P&Q>M){f=25;break}else{f=23;break};case 23:if((P-L)*(+h[D+(N<<4)+8>>3]-M)-(O-L)*(Q-M)>0.0){f=24;break}else{f=25;break};case 24:if(B){R=0;S=A;f=32;break}else{f=37;break};case 25:if(B){T=A;U=A;f=26;break}else{f=37;break};case 26:V=T-1|0;W=c[C>>2]|0;if((T|0)>(U-1|0)){f=31;break}else{f=27;break};case 27:if(+h[W+(V<<4)>>3]==+h[W+(T<<4)>>3]){f=28;break}else{f=31;break};case 28:if(+h[W+(V<<4)+8>>3]==+h[W+(T<<4)+8>>3]){f=29;break}else{f=31;break};case 29:if((V|0)>0){f=30;break}else{f=37;break};case 30:T=V;U=c[n>>2]|0;f=26;break;case 31:c[(c[44100]|0)+(c[44106]<<3)>>2]=W+(V<<4);J=c[44106]|0;K=c[44100]|0;c[K+(J<<3)+4>>2]=K+(((J|0)%(c[n>>2]|0)|0)<<3);J=c[44106]|0;c[(c[44102]|0)+(J<<2)>>2]=(c[44100]|0)+(J<<3);c[44106]=(c[44106]|0)+1;f=29;break;case 32:X=c[C>>2]|0;if((R|0)>0){f=33;break}else{f=35;break};case 33:Y=R-1|0;if(+h[X+(R<<4)>>3]==+h[X+(Y<<4)>>3]){f=34;break}else{f=35;break};case 34:if(+h[X+(R<<4)+8>>3]==+h[X+(Y<<4)+8>>3]){Z=S;f=36;break}else{f=35;break};case 35:c[(c[44100]|0)+(c[44106]<<3)>>2]=X+(R<<4);J=c[44106]|0;K=c[44100]|0;c[K+(J<<3)+4>>2]=K+(((J|0)%(c[n>>2]|0)|0)<<3);J=c[44106]|0;c[(c[44102]|0)+(J<<2)>>2]=(c[44100]|0)+(J<<3);c[44106]=(c[44106]|0)+1;Z=c[n>>2]|0;f=36;break;case 36:J=R+1|0;if((J|0)<(Z|0)){R=J;S=Z;f=32;break}else{f=37;break};case 37:_=c[44102]|0;J=c[44106]|0;if((J|0)>3){$=J;f=39;break}else{f=74;break};case 38:if((aa|0)>3){$=aa;f=39;break}else{f=74;break};case 39:aa=$-1|0;ba=0;f=40;break;case 40:ca=ba+1|0;da=(ca|0)==($|0)?0:ca;ea=(ba+2|0)%($|0)|0;J=c[c[_+(((ba+aa|0)%($|0)|0)<<2)>>2]>>2]|0;fa=c[_+(ba<<2)>>2]|0;K=c[fa>>2]|0;ga=c[_+(da<<2)>>2]|0;r=c[ga>>2]|0;ha=+h[J>>3];ia=+h[J+8>>3];ja=+h[K>>3];na=+h[K+8>>3];oa=+h[r>>3];qa=+h[r+8>>3];ra=oa-ja;sa=qa-na;ta=c[_+(ea<<2)>>2]|0;r=c[ta>>2]|0;ua=+h[r>>3];va=+h[r+8>>3];xa=na-va;if((ia-na)*ra-(ha-ja)*sa>0.0){f=41;break}else{f=43;break};case 41:if((ha-ua)*xa-(ja-ua)*(ia-va)>0.0){f=42;break}else{f=45;break};case 42:I=va-na;ya=ua-ja;if(ra*I-sa*ya>0.0){za=ya;Aa=I;f=46;break}else{f=45;break};case 43:I=(oa-ua)*xa-(ja-ua)*(qa-va);if(I<=0.0&I<0.0){f=44;break}else{f=45;break};case 44:za=ua-ja;Aa=va-na;f=46;break;case 45:if((ca|0)<($|0)){ba=ca;f=40;break}else{f=73;break};case 46:Ca=ja-ua;Da=za*za+Aa*Aa;Ea=0;f=47;break;case 47:Fa=Ea+1|0;Ga=(Fa|0)==($|0)?0:Fa;if((Ea|0)==(ba|0)|(Ga|0)==(ba|0)|(Ea|0)==(ea|0)|(Ga|0)==(ea|0)){f=48;break}else{f=49;break};case 48:if((Fa|0)<($|0)){Ea=Fa;f=47;break}else{f=71;break};case 49:r=c[c[_+(Ea<<2)>>2]>>2]|0;Ha=c[c[_+(Ga<<2)>>2]>>2]|0;Ia=+h[r>>3];Ja=+h[r+8>>3];Ka=xa*(Ia-ua)-Ca*(Ja-va);La=Ka>0.0;Ma=Ka>=0.0;if(Ma&(La^1)){f=53;break}else{f=50;break};case 50:Na=+h[Ha>>3];Oa=+h[Ha+8>>3];Pa=xa*(Na-ua)-Ca*(Oa-va);if(Pa<=0.0&Pa>=0.0){f=53;break}else{f=51;break};case 51:Qa=Ja-Oa;Ra=Ia-Na;Sa=(ja-Na)*Qa-Ra*(na-Oa);if(Sa<=0.0&Sa>=0.0){f=53;break}else{f=52;break};case 52:Ta=(ua-Na)*Qa-Ra*(va-Oa);if(Ta<=0.0&Ta>=0.0){f=53;break}else{f=65;break};case 53:Ua=Ia-ja;Va=Ja-na;if(Ka<=0.0&Ma){f=54;break}else{f=56;break};case 54:if(za*Ua+Aa*Va<0.0){f=56;break}else{f=55;break};case 55:if(Ua*Ua+Va*Va>Da){f=56;break}else{f=45;break};case 56:Wa=+h[Ha>>3];Xa=+h[Ha+8>>3];Ya=Wa-ja;Za=Xa-na;I=xa*(Wa-ua)-Ca*(Xa-va);if(I<=0.0&I>=0.0){f=57;break}else{f=59;break};case 57:if(za*Ya+Aa*Za<0.0){f=59;break}else{f=58;break};case 58:if(Ya*Ya+Za*Za>Da){f=59;break}else{f=45;break};case 59:_a=Wa-Ia;$a=Xa-Ja;ab=ja-Ia;bb=na-Ja;cb=Ja-Xa;db=Ia-Wa;I=(ja-Wa)*cb-db*(na-Xa);if(I<=0.0&I>=0.0){f=60;break}else{f=62;break};case 60:if(ab*_a+bb*$a<0.0){f=62;break}else{f=61;break};case 61:if(ab*ab+bb*bb>_a*_a+$a*$a){f=62;break}else{f=45;break};case 62:eb=ua-Ia;fb=va-Ja;I=(ua-Wa)*cb-db*(va-Xa);if(I<=0.0&I>=0.0){f=63;break}else{f=48;break};case 63:if(eb*_a+fb*$a<0.0){f=48;break}else{f=64;break};case 64:if(eb*eb+fb*fb>_a*_a+$a*$a){f=48;break}else{f=45;break};case 65:gb=Pa>0.0;if(Sa>0.0){hb=1;f=67;break}else{f=66;break};case 66:hb=Sa<0.0?2:3;f=67;break;case 67:if(Ta>0.0){ib=1;f=69;break}else{f=68;break};case 68:ib=Ta<0.0?2:3;f=69;break;case 69:if(La^gb){f=70;break}else{f=48;break};case 70:if((hb|0)==1^(ib|0)==1){f=45;break}else{f=48;break};case 71:Ba(58,fa|0,ga|0,ta|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((da|0)<(aa|0)){jb=da;f=72;break}else{f=38;break};case 72:r=jb+1|0;c[_+(jb<<2)>>2]=c[_+(r<<2)>>2];if((r|0)<(aa|0)){jb=r;f=72;break}else{f=38;break};case 73:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=324,c[s+16>>2]=155376,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;f=75;break;case 74:Ba(58,c[_>>2]|0,c[_+4>>2]|0,c[_+8>>2]|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;f=75;break;case 75:r=c[43660]|0;if((r|0)>0){kb=0;lb=r;f=78;break}else{mb=0;nb=r;ob=0;f=102;break};case 76:if((pb|0)<(qb|0)){kb=pb;lb=qb;f=78;break}else{f=77;break};case 77:rb=(qb|0)>0;if(rb){sb=0;f=101;break}else{mb=0;nb=qb;ob=0;f=102;break};case 78:pb=kb+1|0;if((pb|0)<(lb|0)){tb=pb;f=79;break}else{qb=lb;f=76;break};case 79:ub=0;f=80;break;case 80:vb=c[43656]|0;wb=vb+(kb*52|0)|0;xb=vb+(tb*52|0)|0;yb=c[c[vb+(kb*52|0)+4+(ub<<4)>>2]>>2]|0;zb=c[c[vb+(tb*52|0)+4>>2]>>2]|0;if((yb|0)==(zb|0)){f=82;break}else{f=81;break};case 81:Ab=c[c[vb+(tb*52|0)+8>>2]>>2]|0;f=83;break;case 82:r=c[c[vb+(tb*52|0)+8>>2]>>2]|0;if((c[c[vb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(r|0)){f=85;break}else{Ab=r;f=83;break};case 83:if((yb|0)==(Ab|0)){f=84;break}else{Bb=vb;Cb=yb;f=86;break};case 84:if((c[c[vb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(zb|0)){f=85;break}else{Bb=vb;Cb=yb;f=86;break};case 85:c[vb+(kb*52|0)+4+(ub<<4)+12>>2]=xb;c[vb+(tb*52|0)+16>>2]=wb;r=c[43656]|0;Bb=r;Cb=c[c[r+(kb*52|0)+4+(ub<<4)>>2]>>2]|0;f=86;break;case 86:Db=Bb+(kb*52|0)|0;Eb=Bb+(tb*52|0)|0;Fb=c[c[Bb+(tb*52|0)+20>>2]>>2]|0;if((Cb|0)==(Fb|0)){f=88;break}else{f=87;break};case 87:Gb=c[c[Bb+(tb*52|0)+24>>2]>>2]|0;f=89;break;case 88:r=c[c[Bb+(tb*52|0)+24>>2]>>2]|0;if((c[c[Bb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(r|0)){f=91;break}else{Gb=r;f=89;break};case 89:if((Cb|0)==(Gb|0)){f=90;break}else{Hb=Bb;Ib=Cb;f=92;break};case 90:if((c[c[Bb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(Fb|0)){f=91;break}else{Hb=Bb;Ib=Cb;f=92;break};case 91:c[Bb+(kb*52|0)+4+(ub<<4)+12>>2]=Eb;c[Bb+(tb*52|0)+32>>2]=Db;r=c[43656]|0;Hb=r;Ib=c[c[r+(kb*52|0)+4+(ub<<4)>>2]>>2]|0;f=92;break;case 92:Jb=Hb+(kb*52|0)|0;Kb=Hb+(tb*52|0)|0;Lb=c[c[Hb+(tb*52|0)+36>>2]>>2]|0;if((Ib|0)==(Lb|0)){f=94;break}else{f=93;break};case 93:Mb=c[c[Hb+(tb*52|0)+40>>2]>>2]|0;f=95;break;case 94:r=c[c[Hb+(tb*52|0)+40>>2]>>2]|0;if((c[c[Hb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(r|0)){f=97;break}else{Mb=r;f=95;break};case 95:if((Ib|0)==(Mb|0)){f=96;break}else{f=98;break};case 96:if((c[c[Hb+(kb*52|0)+4+(ub<<4)+4>>2]>>2]|0)==(Lb|0)){f=97;break}else{f=98;break};case 97:c[Hb+(kb*52|0)+4+(ub<<4)+12>>2]=Kb;c[Hb+(tb*52|0)+48>>2]=Jb;f=98;break;case 98:r=ub+1|0;if((r|0)<3){ub=r;f=80;break}else{f=99;break};case 99:r=tb+1|0;K=c[43660]|0;if((r|0)<(K|0)){tb=r;f=79;break}else{qb=K;f=76;break};case 100:if((Nb|0)<(qb|0)){sb=Nb;f=101;break}else{mb=Nb;nb=qb;ob=rb;f=102;break};case 101:K=wa(168,sb|0,b|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;Nb=sb+1|0;if((K|0)==0){f=100;break}else{mb=sb;nb=qb;ob=rb;f=102;break};case 102:if((mb|0)==(nb|0)){f=104;break}else{f=103;break};case 103:Ob=b+16|0;if(ob){Pb=0;f=106;break}else{Qb=0;f=107;break};case 104:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=192,c[s+16>>2]=119192,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;m=-1;f=149;break;case 105:if((Rb|0)<(nb|0)){Pb=Rb;f=106;break}else{Qb=Rb;f=107;break};case 106:K=wa(168,Pb|0,Ob|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;Rb=Pb+1|0;if((K|0)==0){f=105;break}else{Qb=Pb;f=107;break};case 107:if((Qb|0)==(nb|0)){f=108;break}else{f=109;break};case 108:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=200,c[s+16>>2]=110712,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;m=-1;f=149;break;case 109:K=wa(182,mb|0,Qb|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((K|0)==0){f=110;break}else{f=111;break};case 110:pa(30,c[o>>2]|0,96136,(s=i,i=i+24|0,c[s>>2]=141896,c[s+8>>2]=207,c[s+16>>2]=107328,s)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=s;ka(68,2);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[d+4>>2]=2;K=c[44254]|0;r=K;J=b;c[r>>2]=c[J>>2];c[r+4>>2]=c[J+4>>2];c[r+8>>2]=c[J+8>>2];c[r+12>>2]=c[J+12>>2];J=K+16|0;r=Ob;c[J>>2]=c[r>>2];c[J+4>>2]=c[r+4>>2];c[J+8>>2]=c[r+8>>2];c[J+12>>2]=c[r+12>>2];c[d>>2]=K;m=0;f=149;break;case 111:if((mb|0)==(Qb|0)){f=112;break}else{f=113;break};case 112:ka(68,2);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[d+4>>2]=2;K=c[44254]|0;r=K;J=b;c[r>>2]=c[J>>2];c[r+4>>2]=c[J+4>>2];c[r+8>>2]=c[J+8>>2];c[r+12>>2]=c[J+12>>2];J=K+16|0;r=Ob;c[J>>2]=c[r>>2];c[J+4>>2]=c[r+4>>2];c[J+8>>2]=c[r+8>>2];c[J+12>>2]=c[r+12>>2];c[d>>2]=K;m=0;f=149;break;case 113:Sb=k|0;c[k>>2]=b;Tb=k+4|0;c[Tb>>2]=0;Ub=k+8|0;c[Ub>>2]=Ob;c[k+12>>2]=0;Vb=c[45176]|0;Wb=c[45180]|0;if(((c[45174]|0)-Vb|0)>-1){f=114;break}else{f=115;break};case 114:c[Tb>>2]=c[Wb+(Vb<<2)>>2];f=115;break;case 115:K=Vb-1|0;c[45176]=K;c[Wb+(K<<2)>>2]=Sb;c[45172]=c[45176];if((mb|0)==-1){Xb=0;Yb=Ub;f=145;break}else{f=116;break};case 116:Zb=Ob|0;_b=b+24|0;$b=mb;f=117;break;case 117:ac=c[43656]|0;c[ac+($b*52|0)>>2]=2;bc=0;f=118;break;case 118:cc=c[ac+($b*52|0)+4+(bc<<4)+12>>2]|0;if((cc|0)==0){f=120;break}else{f=119;break};case 119:if((c[cc>>2]|0)==1){dc=bc;f=121;break}else{f=120;break};case 120:K=bc+1|0;if((K|0)<3){bc=K;f=118;break}else{dc=K;f=121;break};case 121:if((dc|0)==3){f=122;break}else{f=123;break};case 122:K=c[45180]|0;r=c[c[K+(c[45176]<<2)>>2]>>2]|0;J=c[K+(c[45174]<<2)>>2]|0;K=c[J>>2]|0;I=+h[r>>3];ya=+h[r+8>>3];r=(+h[_b>>3]-ya)*(+h[K>>3]-I)-(+h[Zb>>3]-I)*(+h[K+8>>3]-ya)>0.0;ec=r?Ub:J;fc=r?J:Ub;f=125;break;case 123:gc=c[ac+($b*52|0)+4+(dc<<4)>>2]|0;J=c[gc>>2]|0;r=c[c[ac+($b*52|0)+4+(((dc+1|0)%3|0)<<4)+4>>2]>>2]|0;hc=c[ac+($b*52|0)+4+(dc<<4)+4>>2]|0;K=c[hc>>2]|0;ya=+h[r>>3];I=+h[r+8>>3];if((+h[J+8>>3]-I)*(+h[K>>3]-ya)-(+h[J>>3]-ya)*(+h[K+8>>3]-I)>0.0){ec=gc;fc=hc;f=125;break}else{f=124;break};case 124:ec=hc;fc=gc;f=125;break;case 125:if(($b|0)==(mb|0)){f=126;break}else{f=131;break};case 126:ic=c[45174]|0;if((ic-(c[45176]|0)|0)>-1){f=127;break}else{jc=ic;f=128;break};case 127:c[fc+4>>2]=c[(c[45180]|0)+(ic<<2)>>2];jc=c[45174]|0;f=128;break;case 128:K=jc+1|0;c[45174]=K;c[(c[45180]|0)+(K<<2)>>2]=fc;kc=c[45176]|0;if(((c[45174]|0)-kc|0)>-1){f=129;break}else{lc=kc;f=130;break};case 129:c[ec+4>>2]=c[(c[45180]|0)+(kc<<2)>>2];lc=c[45176]|0;f=130;break;case 130:K=lc-1|0;c[45176]=K;c[(c[45180]|0)+(K<<2)>>2]=ec;mc=0;f=141;break;case 131:nc=c[45176]|0;oc=c[45180]|0;if((c[oc+(nc<<2)>>2]|0)==(ec|0)){f=137;break}else{f=132;break};case 132:pc=c[45174]|0;if((c[oc+(pc<<2)>>2]|0)==(ec|0)){f=137;break}else{f=133;break};case 133:qc=ma(8,ec|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45176]=qc;if((pc-qc|0)>-1){f=134;break}else{rc=qc;sc=oc;f=135;break};case 134:c[ec+4>>2]=c[oc+(qc<<2)>>2];rc=c[45176]|0;sc=c[45180]|0;f=135;break;case 135:K=rc-1|0;c[45176]=K;c[sc+(K<<2)>>2]=ec;if((qc|0)>(c[45172]|0)){f=136;break}else{mc=0;f=141;break};case 136:c[45172]=qc;mc=0;f=141;break;case 137:tc=ma(8,fc|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[45174]=tc;if((tc-nc|0)>-1){f=138;break}else{uc=tc;vc=oc;f=139;break};case 138:c[fc+4>>2]=c[oc+(tc<<2)>>2];uc=c[45174]|0;vc=c[45180]|0;f=139;break;case 139:K=uc+1|0;c[45174]=K;c[vc+(K<<2)>>2]=fc;if((tc|0)<(c[45172]|0)){f=140;break}else{mc=0;f=141;break};case 140:c[45172]=tc;mc=0;f=141;break;case 141:wc=c[ac+($b*52|0)+4+(mc<<4)+12>>2]|0;if((wc|0)==0){f=144;break}else{f=142;break};case 142:if((c[wc>>2]|0)==1){f=143;break}else{f=144;break};case 143:K=wc-(c[43656]|0)|0;if((K|0)==-52){Xb=0;Yb=Ub;f=145;break}else{$b=(K|0)/52|0;f=117;break};case 144:K=mc+1|0;if((K|0)<3){mc=K;f=141;break}else{Xb=0;Yb=Ub;f=145;break};case 145:xc=Xb+1|0;K=c[Yb+4>>2]|0;if((K|0)==0){f=146;break}else{Xb=xc;Yb=K;f=145;break};case 146:ka(68,xc|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[d+4>>2]=xc;yc=c[44254]|0;zc=Ub;Ac=Xb;f=147;break;case 147:K=yc+(Ac<<4)|0;J=c[zc>>2]|0;c[K>>2]=c[J>>2];c[K+4>>2]=c[J+4>>2];c[K+8>>2]=c[J+8>>2];c[K+12>>2]=c[J+12>>2];J=c[zc+4>>2]|0;if((J|0)==0){f=148;break}else{zc=J;Ac=Ac-1|0;f=147;break};case 148:c[d>>2]=yc;m=0;f=149;break;case 149:i=e;return m|0;case-1:if((g|0)==1){l=v;f=150}u=v=0;break}return 0}function QB(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0;d=c[43656]|0;e=+h[b>>3];f=+h[b+8>>3];b=c[c[d+(a*52|0)+4>>2]>>2]|0;g=c[c[d+(a*52|0)+8>>2]>>2]|0;i=+h[g>>3];j=+h[g+8>>3];k=(+h[b+8>>3]-j)*(e-i)-(+h[b>>3]-i)*(f-j);if(k>0.0){l=1}else{l=k>=0.0|0}b=c[c[d+(a*52|0)+20>>2]>>2]|0;g=c[c[d+(a*52|0)+24>>2]>>2]|0;k=+h[g>>3];j=+h[g+8>>3];i=(+h[b+8>>3]-j)*(e-k)-(+h[b>>3]-k)*(f-j);if(i>0.0){m=1}else{m=i>=0.0|0}b=c[c[d+(a*52|0)+36>>2]>>2]|0;g=c[c[d+(a*52|0)+40>>2]>>2]|0;i=+h[g>>3];j=+h[g+8>>3];k=(+h[b+8>>3]-j)*(e-i)-(+h[b>>3]-i)*(f-j);if(k>0.0){n=1}else{n=k>=0.0|0}b=n+(m+l)|0;if((b|0)==3){o=1;return o|0}o=(b|0)==0|0;return o|0}function RB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=(c[43656]|0)+(a*52|0)|0;if((c[d>>2]|0)!=0){e=0;return e|0}c[d>>2]=1;if((a|0)==(b|0)){e=1;return e|0}d=0;f=c[43656]|0;while(1){g=c[f+(a*52|0)+4+(d<<4)+12>>2]|0;if((g|0)==0){h=f}else{if((RB((g-f|0)/52|0,b)|0)!=0){e=1;i=9;break}h=c[43656]|0}g=d+1|0;if((g|0)<3){d=g;f=h}else{break}}if((i|0)==9){return e|0}c[h+(a*52|0)>>2]=0;e=0;return e|0}function SB(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;if((c[44258]|0)>=(a|0)){i=b;return}d=c[44254]|0;do{if((d|0)==0){e=dF(a<<4)|0;c[44254]=e;if((e|0)!=0){break}gc(c[o>>2]|0,96136,(f=i,i=i+24|0,c[f>>2]=141896,c[f+8>>2]=593,c[f+16>>2]=101744,f)|0)|0;i=f;rc(177592,1)}else{e=gF(d,a<<4)|0;c[44254]=e;if((e|0)!=0){break}gc(c[o>>2]|0,96136,(f=i,i=i+24|0,c[f>>2]=141896,c[f+8>>2]=599,c[f+16>>2]=98176,f)|0)|0;i=f;rc(177592,1)}}while(0);c[44258]=a;i=b;return}function TB(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0;b=c[45172]|0;d=c[45180]|0;e=a|0;a=c[45176]|0;while(1){if((a|0)>=(b|0)){break}f=a+1|0;g=c[c[d+(f<<2)>>2]>>2]|0;i=c[c[d+(a<<2)>>2]>>2]|0;j=c[e>>2]|0;k=+h[i>>3];l=+h[i+8>>3];if((+h[g+8>>3]-l)*(+h[j>>3]-k)-(+h[g>>3]-k)*(+h[j+8>>3]-l)>0.0){m=a;n=7;break}else{a=f}}if((n|0)==7){return m|0}a=c[45174]|0;while(1){if((a|0)<=(b|0)){m=b;n=7;break}f=a-1|0;j=c[c[d+(f<<2)>>2]>>2]|0;g=c[c[d+(a<<2)>>2]>>2]|0;i=c[e>>2]|0;l=+h[g>>3];k=+h[g+8>>3];o=(+h[j+8>>3]-k)*(+h[i>>3]-l)-(+h[j>>3]-l)*(+h[i+8>>3]-k);if(o<=0.0&o<0.0){m=a;n=7;break}else{a=f}}if((n|0)==7){return m|0}return 0}function UB(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0;e=i;f=c[43660]|0;g=c[43658]|0;if((f|0)<(g|0)){h=f;j=c[43656]|0}else{k=g+20|0;g=c[43656]|0;do{if((g|0)==0){l=dF(k*52|0)|0;m=l;c[43656]=m;if((l|0)!=0){n=m;p=f;break}gc(c[o>>2]|0,96136,(q=i,i=i+24|0,c[q>>2]=141896,c[q+8>>2]=552,c[q+16>>2]=150848,q)|0)|0;i=q;rc(177592,1)}else{m=gF(g,k*52|0)|0;l=m;c[43656]=l;if((m|0)==0){gc(c[o>>2]|0,96136,(q=i,i=i+24|0,c[q>>2]=141896,c[q+8>>2]=558,c[q+16>>2]=147984,q)|0)|0;i=q;rc(177592,1)}else{n=l;p=c[43660]|0;break}}}while(0);c[43658]=k;h=p;j=n}c[43660]=h+1;n=j+(h*52|0)|0;c[n>>2]=0;c[j+(h*52|0)+4>>2]=a;c[j+(h*52|0)+8>>2]=b;c[j+(h*52|0)+16>>2]=0;c[j+(h*52|0)+20>>2]=b;c[j+(h*52|0)+24>>2]=d;c[j+(h*52|0)+32>>2]=0;c[j+(h*52|0)+36>>2]=d;c[j+(h*52|0)+40>>2]=a;c[j+(h*52|0)+48>>2]=0;c[j+(h*52|0)+12>>2]=n;c[j+(h*52|0)+28>>2]=n;c[j+(h*52|0)+44>>2]=n;i=e;return}function VB(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0;f=dF(d<<2)|0;g=f;i=dF((d<<3)+8|0)|0;j=i+8|0;k=(d|0)>0;if(k){vF(f|0,-1|0,d<<2|0)|0;f=0;do{h[j+(f<<3)>>3]=-2147483647.0;f=f+1|0;}while((f|0)<(d|0))}h[i>>3]=-2147483648.0;if((a|0)==(b|0)){eF(i);return g|0}if(k){l=a}else{k=a;while(1){a=j+(k<<3)|0;m=+h[a>>3]*-1.0;h[a>>3]=m==2147483647.0?0.0:m;if((b|0)==-1){break}else{k=-1}}eF(i);return g|0}while(1){k=j+(l<<3)|0;m=+h[k>>3]*-1.0;h[k>>3]=m==2147483647.0?0.0:m;a=e+(l<<2)|0;f=0;n=-1;while(1){o=j+(f<<3)|0;m=+h[o>>3];do{if(m<0.0){if((l|0)<(f|0)){p=(c[e+(f<<2)>>2]|0)+(l<<3)|0}else{p=(c[a>>2]|0)+(f<<3)|0}q=+h[p>>3];r=-0.0-(q+ +h[k>>3]);if(q!=0.0&m<r){h[o>>3]=r;c[g+(f<<2)>>2]=l;s=r}else{s=m}if(s<=+h[j+(n<<3)>>3]){t=n;break}t=f}else{t=n}}while(0);o=f+1|0;if((o|0)<(d|0)){f=o;n=t}else{break}}if((t|0)==(b|0)){break}else{l=t}}eF(i);return g|0}function WB(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,k=0,l=0;j=i;k=a;a=i;i=i+16|0;c[a>>2]=c[k>>2];c[a+4>>2]=c[k+4>>2];c[a+8>>2]=c[k+8>>2];c[a+12>>2]=c[k+12>>2];k=e;e=i;i=i+16|0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];k=c[h+4>>2]|0;if((cC(a,b,e,f,h)|0)==0){f=c[h+24>>2]|0;c[f+(k<<2)>>2]=g;g=k+1|0;c[f+(g<<2)>>2]=d;l=VB(g,k,k+2|0,f)|0;i=j;return l|0}else{f=dF((k<<2)+8|0)|0;g=k+1|0;c[f+(k<<2)>>2]=g;c[f+(g<<2)>>2]=-1;l=f;i=j;return l|0}return 0}function XB(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0,i=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0.0,p=0.0,q=0.0;c=+h[a+24>>3];if(c<1.0e-7&c>-1.0e-7){d=+h[a+16>>3];e=a+8|0;if(d<1.0e-7&d>-1.0e-7){f=+h[e>>3];g=+h[a>>3];if(f<1.0e-7&f>-1.0e-7){i=g<1.0e-7&g>-1.0e-7?4:0;return i|0}else{h[b>>3]=(-0.0-g)/f;i=1;return i|0}}f=+h[e>>3]/(d*2.0);g=f*f- +h[a>>3]/d;if(g<0.0){i=0;return i|0}if(g==0.0){h[b>>3]=-0.0-f;i=1;return i|0}else{d=+T(g)-f;h[b>>3]=d;h[b+8>>3]=f*-2.0-d;i=2;return i|0}}d=+h[a+16>>3]/(c*3.0);f=+h[a+8>>3]/c;g=d*d;j=+h[a>>3]/c+(d*2.0*g-d*f);c=f/3.0-g;g=j*j;f=g+c*c*c*4.0;do{if(f<0.0){c=+T(g-f)*.5;k=+$(+(+T(-0.0-f)),+(-0.0-j));if(c<0.0){l=+U(+(-0.0-c),+.3333333333333333)*-1.0}else{l=+U(+c,+.3333333333333333)}c=l*2.0;m=c*+V(k/3.0);h[b>>3]=m;h[b+8>>3]=c*+V((k+6.283185307179586)/3.0);h[b+16>>3]=c*+V((k+ -3.141592653589793+ -3.141592653589793)/3.0);n=3;o=m}else{m=(+T(f)-j)*.5;k=-0.0-j-m;if(m<0.0){p=+U(+(-0.0-m),+.3333333333333333)*-1.0}else{p=+U(+m,+.3333333333333333)}if(k<0.0){q=+U(+(-0.0-k),+.3333333333333333)*-1.0}else{q=+U(+k,+.3333333333333333)}k=p+q;h[b>>3]=k;if(f>0.0){n=1;o=k;break}m=k*-.5;h[b+16>>3]=m;h[b+8>>3]=m;n=3;o=k}}while(0);a=0;f=o;while(1){h[b+(a<<3)>>3]=f-d;e=a+1|0;if((e|0)>=(n|0)){i=n;break}a=e;f=+h[b+(e<<3)>>3]}return i|0}function YB(a){a=a|0;eF(c[a>>2]|0);eF(a);return}function ZB(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=a;a=i;i=i+8|0;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];e=c[a+4>>2]|0;f=(e*3|0)-2|0;g=c[44388]|0;if((f|0)>(c[44386]|0)){if((g|0)==0){h=dF(f<<4)|0}else{h=gF(g,f<<4)|0}j=h;c[44388]=j;c[44386]=f;k=j}else{k=g}g=c[a>>2]|0;a=k;j=g;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];uF(k+16|0,j|0,16)|0;j=e-1|0;if((j|0)>1){e=(j|0)>2?j:2;a=e*3|0;h=2;l=1;while(1){m=k+(h<<4)|0;n=g+(l<<4)|0;c[m>>2]=c[n>>2];c[m+4>>2]=c[n+4>>2];c[m+8>>2]=c[n+8>>2];c[m+12>>2]=c[n+12>>2];m=k+(h+1<<4)|0;uF(m|0,n|0,16)|0;n=k+(h+2<<4)|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];m=l+1|0;if((m|0)<(j|0)){h=h+3|0;l=m}else{break}}o=a-1|0;p=e}else{o=2;p=1}e=k+(o<<4)|0;a=g+(p<<4)|0;c[e>>2]=c[a>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];uF(k+(o+1<<4)|0,a|0,16)|0;c[b+4>>2]=f;c[b>>2]=c[44388];i=d;return}function _B(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[b+8>>3];j=+h[b>>3];k=(+h[a+8>>3]-g)*(+h[d>>3]-j)-(+h[d+8>>3]-g)*(+h[a>>3]-j);if(k>1.0e-4){l=1;i=e;return l|0}l=(k<-1.0e-4)<<31>>31;i=e;return l|0}function $B(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0,x=0,y=0;f=i;g=a;a=i;i=i+16|0;c[a>>2]=c[g>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];g=b;b=i;i=i+16|0;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=e;e=i;i=i+16|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];j=+h[a+8>>3];k=+h[b+8>>3];l=j-k;m=+h[d>>3];n=+h[b>>3];o=+h[d+8>>3];p=+h[a>>3];q=p-n;r=l*(m-n)-(o-k)*q;do{if(r>1.0e-4){s=1}else{a=r<-1.0e-4;d=a<<31>>31;if(a){s=d;break}if(p!=n){if(p<m&m<n){t=1;i=f;return t|0}if(n<m&m<p){t=1}else{s=d;break}i=f;return t|0}else{if(j<o&o<k){t=1;i=f;return t|0}if(k<o&o<j){t=1}else{s=d;break}i=f;return t|0}}}while(0);r=+h[e>>3];u=+h[e+8>>3];v=l*(r-n)-(u-k)*q;do{if(v>1.0e-4){w=1}else{e=v<-1.0e-4;d=e<<31>>31;if(e){w=d;break}if(p!=n){if(p<r&r<n){t=1;i=f;return t|0}if(n<r&r<p){t=1}else{w=d;break}i=f;return t|0}else{if(j<u&u<k){t=1;i=f;return t|0}if(k<u&u<j){t=1}else{w=d;break}i=f;return t|0}}}while(0);v=o-u;o=m-r;m=v*(p-r)-(j-u)*o;if(m>1.0e-4){x=1}else{x=(m<-1.0e-4)<<31>>31}m=v*(n-r)-(k-u)*o;if(m>1.0e-4){y=1}else{y=(m<-1.0e-4)<<31>>31}if((da(w,s)|0)>=0){t=0;i=f;return t|0}t=(da(y,x)|0)>>>31;i=f;return t|0}function aC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,U=0;b=c[a+4>>2]|0;d=b+2|0;e=dF(d<<2)|0;f=e;g=fF(da(b,b)|0,8)|0;i=(b|0)>0;if(i){j=0;k=g;while(1){c[f+(j<<2)>>2]=k;g=j+1|0;if((g|0)<(b|0)){j=g;k=k+(b<<3)|0}else{break}}}k=b+1|0;vF(e+(b<<2)|0,0,((d|0)>(k|0)?d:k)-b<<2|0)|0;c[a+24>>2]=f;k=c[a+8>>2]|0;d=c[a+16>>2]|0;e=c[a+20>>2]|0;if(i){l=0}else{return}do{i=e+(l<<2)|0;a=c[i>>2]|0;j=k+(l<<4)|0;g=k+(l<<4)+8|0;m=+h[j>>3]- +h[k+(a<<4)>>3];n=+h[g>>3]- +h[k+(a<<4)+8>>3];o=+T(m*m+n*n);p=f+(l<<2)|0;h[(c[p>>2]|0)+(a<<3)>>3]=o;h[(c[f+(a<<2)>>2]|0)+(l<<3)>>3]=o;q=l-1|0;r=(a|0)==(q|0)?l-2|0:q;a:do{if((r|0)>-1){q=d+(l<<2)|0;a=r;while(1){s=c[i>>2]|0;t=c[q>>2]|0;o=+h[k+(s<<4)>>3];n=+h[k+(s<<4)+8>>3];m=+h[j>>3];u=+h[g>>3];v=+h[k+(a<<4)>>3];w=+h[k+(a<<4)+8>>3];x=(m-o)*(w-n)-(u-n)*(v-o);if(x>1.0e-4){y=1}else{y=(x<-1.0e-4)<<31>>31}x=+h[k+(t<<4)>>3]-m;z=+h[k+(t<<4)+8>>3]-u;A=x*(w-u)-z*(v-m);if(A>1.0e-4){B=1}else{B=(A<-1.0e-4)<<31>>31>>>31^1}t=(y|0)>-1;if((n-u)*x-(o-m)*z>1.0e-4){C=t?B:0}else{C=t?1:B}b:do{if((C|0)!=0){t=c[e+(a<<2)>>2]|0;s=c[d+(a<<2)>>2]|0;z=+h[k+(t<<4)>>3];o=+h[k+(t<<4)+8>>3];x=(v-z)*(u-o)-(m-z)*(w-o);if(x>1.0e-4){D=1}else{D=(x<-1.0e-4)<<31>>31}x=u-w;n=+h[k+(s<<4)>>3]-v;A=+h[k+(s<<4)+8>>3]-w;E=m-v;F=x*n-E*A;if(F>1.0e-4){G=1}else{G=(F<-1.0e-4)<<31>>31>>>31^1}s=(D|0)>-1;if((o-w)*n-(z-v)*A>1.0e-4){H=s?G:0}else{H=s?1:G}if((H|0)==0){break}if(m!=v){s=0;do{t=c[d+(s<<2)>>2]|0;A=+h[k+(s<<4)>>3];z=+h[k+(s<<4)+8>>3];n=x*(A-v)-E*(z-w);do{if(n>1.0e-4){I=1}else{J=n<-1.0e-4;K=J<<31>>31;if(J){I=K;break}if(m<A&A<v){break b}if(v<A&A<m){break b}else{I=K}}}while(0);n=+h[k+(t<<4)>>3];o=+h[k+(t<<4)+8>>3];F=x*(n-v)-E*(o-w);do{if(F>1.0e-4){L=1}else{K=F<-1.0e-4;J=K<<31>>31;if(K){L=J;break}if(m<n&n<v){break b}if(v<n&n<m){break b}else{L=J}}}while(0);F=z-o;M=A-n;N=(m-n)*F-M*(u-o);if(N>1.0e-4){O=1}else{O=(N<-1.0e-4)<<31>>31}N=(v-n)*F-M*(w-o);if(N>1.0e-4){P=1}else{P=(N<-1.0e-4)<<31>>31}if((da(L,I)|0)<0){if((da(P,O)|0)<=-1){break b}}s=s+1|0;}while((s|0)<(b|0))}else{s=0;do{t=c[d+(s<<2)>>2]|0;N=+h[k+(s<<4)>>3];M=+h[k+(s<<4)+8>>3];F=x*(N-v)-E*(M-w);do{if(F>1.0e-4){Q=1}else{J=F<-1.0e-4;K=J<<31>>31;if(J){Q=K;break}if(u<M&M<w){break b}if(w<M&M<u){break b}else{Q=K}}}while(0);F=+h[k+(t<<4)>>3];o=+h[k+(t<<4)+8>>3];n=x*(F-v)-E*(o-w);do{if(n>1.0e-4){R=1}else{K=n<-1.0e-4;J=K<<31>>31;if(K){R=J;break}if(u<o&o<w){break b}if(w<o&o<u){break b}else{R=J}}}while(0);n=M-o;A=N-F;z=(m-F)*n-A*(u-o);if(z>1.0e-4){S=1}else{S=(z<-1.0e-4)<<31>>31}z=(v-F)*n-A*(w-o);if(z>1.0e-4){U=1}else{U=(z<-1.0e-4)<<31>>31}if((da(R,Q)|0)<0){if((da(U,S)|0)<=-1){break b}}s=s+1|0;}while((s|0)<(b|0))}z=+T(E*E+x*x);h[(c[p>>2]|0)+(a<<3)>>3]=z;h[(c[f+(a<<2)>>2]|0)+(l<<3)>>3]=z}}while(0);if((a|0)<=0){break a}a=a-1|0}}}while(0);l=l+1|0;}while((l|0)<(b|0));return}function bC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0.0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0;e=i;i=i+24|0;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];f=e|0;g=e+16|0;j=c[a+4>>2]|0;k=a+8|0;l=c[k>>2]|0;m=c[a+16>>2]|0;n=c[a+20>>2]|0;o=dF((j<<3)+16|0)|0;p=o;a:do{if((b|0)==-2222){q=+h[d+8>>3];h[f>>3]=+h[d>>3];h[f+8>>3]=q;r=a+12|0;s=a|0;t=g|0;u=g+4|0;v=0;while(1){if((v|0)>=(c[s>>2]|0)){w=j;x=j;break a}y=c[r>>2]|0;z=y+(v<<2)|0;c[t>>2]=(c[k>>2]|0)+(c[z>>2]<<4);A=v+1|0;c[u>>2]=(c[y+(A<<2)>>2]|0)-(c[z>>2]|0);if((LB(g,f)|0)==0){v=A}else{B=v;C=5;break}}}else{B=b;C=5}}while(0);do{if((C|0)==5){if((B|0)<=-1){w=j;x=j;break}b=c[a+12>>2]|0;w=c[b+(B+1<<2)>>2]|0;x=c[b+(B<<2)>>2]|0}}while(0);B=(x|0)>0;if(B){q=+h[d>>3];D=+h[d+8>>3];a=(w|0)<(j|0);b=0;do{E=+h[l+(b<<4)>>3];F=+h[l+(b<<4)+8>>3];f=c[n+(b<<2)>>2]|0;g=c[m+(b<<2)>>2]|0;G=+h[l+(f<<4)>>3];H=+h[l+(f<<4)+8>>3];I=(E-G)*(D-H)-(F-H)*(q-G);if(I>1.0e-4){J=1}else{J=(I<-1.0e-4)<<31>>31}I=D-F;K=+h[l+(g<<4)>>3]-E;L=+h[l+(g<<4)+8>>3]-F;M=q-E;N=K*I-L*M;if(N>1.0e-4){O=1}else{O=(N<-1.0e-4)<<31>>31>>>31^1}g=(J|0)>-1;if((H-F)*K-(G-E)*L>1.0e-4){P=g?O:0}else{P=g?1:O}b:do{if((P|0)==0){C=65}else{g=q!=E;f=0;do{k=c[m+(f<<2)>>2]|0;L=+h[l+(f<<4)>>3];G=+h[l+(f<<4)+8>>3];K=I*(L-E)-M*(G-F);do{if(K>1.0e-4){Q=1}else{v=K<-1.0e-4;u=v<<31>>31;if(v){Q=u;break}if(g){if(q<L&L<E){C=65;break b}if(E<L&L<q){C=65;break b}else{Q=u;break}}else{if(D<G&G<F){C=65;break b}if(F<G&G<D){C=65;break b}else{Q=u;break}}}}while(0);K=+h[l+(k<<4)>>3];H=+h[l+(k<<4)+8>>3];N=I*(K-E)-M*(H-F);do{if(N>1.0e-4){R=1}else{u=N<-1.0e-4;v=u<<31>>31;if(u){R=v;break}if(g){if(q<K&K<E){C=65;break b}if(E<K&K<q){C=65;break b}else{R=v;break}}else{if(D<H&H<F){C=65;break b}if(F<H&H<D){C=65;break b}else{R=v;break}}}}while(0);N=G-H;S=L-K;U=(q-K)*N-S*(D-H);if(U>1.0e-4){V=1}else{V=(U<-1.0e-4)<<31>>31}U=(E-K)*N-S*(F-H);if(U>1.0e-4){W=1}else{W=(U<-1.0e-4)<<31>>31}if((da(R,Q)|0)<0){if((da(W,V)|0)<=-1){C=65;break b}}f=f+1|0;}while((f|0)<(x|0));if(a){f=q!=E;g=w;do{k=c[m+(g<<2)>>2]|0;U=+h[l+(g<<4)>>3];S=+h[l+(g<<4)+8>>3];N=I*(U-E)-M*(S-F);do{if(N>1.0e-4){X=1}else{v=N<-1.0e-4;u=v<<31>>31;if(v){X=u;break}if(f){if(q<U&U<E){C=65;break b}if(E<U&U<q){C=65;break b}else{X=u;break}}else{if(D<S&S<F){C=65;break b}if(F<S&S<D){C=65;break b}else{X=u;break}}}}while(0);N=+h[l+(k<<4)>>3];H=+h[l+(k<<4)+8>>3];K=I*(N-E)-M*(H-F);do{if(K>1.0e-4){Y=1}else{u=K<-1.0e-4;v=u<<31>>31;if(u){Y=v;break}if(f){if(q<N&N<E){C=65;break b}if(E<N&N<q){C=65;break b}else{Y=v;break}}else{if(D<H&H<F){C=65;break b}if(F<H&H<D){C=65;break b}else{Y=v;break}}}}while(0);K=S-H;L=U-N;G=(q-N)*K-L*(D-H);if(G>1.0e-4){Z=1}else{Z=(G<-1.0e-4)<<31>>31}G=(E-N)*K-L*(F-H);if(G>1.0e-4){_=1}else{_=(G<-1.0e-4)<<31>>31}if((da(Y,X)|0)<0){if((da(_,Z)|0)<=-1){C=65;break b}}g=g+1|0;}while((g|0)<(j|0))}h[p+(b<<3)>>3]=+T(M*M+I*I)}}while(0);if((C|0)==65){C=0;h[p+(b<<3)>>3]=0.0}b=b+1|0;}while((b|0)<(x|0))}if((x|0)<(w|0)){vF(o+(x<<3)|0,0,w-x<<3|0)|0}if((w|0)>=(j|0)){$=p+(j<<3)|0;h[$>>3]=0.0;aa=j+1|0;ba=p+(aa<<3)|0;h[ba>>3]=0.0;i=e;return p|0}D=+h[d>>3];q=+h[d+8>>3];d=w;do{I=+h[l+(d<<4)>>3];M=+h[l+(d<<4)+8>>3];o=c[n+(d<<2)>>2]|0;b=c[m+(d<<2)>>2]|0;F=+h[l+(o<<4)>>3];E=+h[l+(o<<4)+8>>3];G=(I-F)*(q-E)-(M-E)*(D-F);if(G>1.0e-4){ca=1}else{ca=(G<-1.0e-4)<<31>>31}G=q-M;L=+h[l+(b<<4)>>3]-I;K=+h[l+(b<<4)+8>>3]-M;ea=D-I;fa=L*G-K*ea;if(fa>1.0e-4){ga=1}else{ga=(fa<-1.0e-4)<<31>>31>>>31^1}b=(ca|0)>-1;if((E-M)*L-(F-I)*K>1.0e-4){ha=b?ga:0}else{ha=b?1:ga}c:do{if((ha|0)==0){C=123}else{if(B){b=D!=I;o=0;do{Z=c[m+(o<<2)>>2]|0;K=+h[l+(o<<4)>>3];F=+h[l+(o<<4)+8>>3];L=G*(K-I)-ea*(F-M);do{if(L>1.0e-4){ia=1}else{_=L<-1.0e-4;X=_<<31>>31;if(_){ia=X;break}if(b){if(D<K&K<I){C=123;break c}if(I<K&K<D){C=123;break c}else{ia=X;break}}else{if(q<F&F<M){C=123;break c}if(M<F&F<q){C=123;break c}else{ia=X;break}}}}while(0);L=+h[l+(Z<<4)>>3];H=+h[l+(Z<<4)+8>>3];N=G*(L-I)-ea*(H-M);do{if(N>1.0e-4){ja=1}else{X=N<-1.0e-4;_=X<<31>>31;if(X){ja=_;break}if(b){if(D<L&L<I){C=123;break c}if(I<L&L<D){C=123;break c}else{ja=_;break}}else{if(q<H&H<M){C=123;break c}if(M<H&H<q){C=123;break c}else{ja=_;break}}}}while(0);N=F-H;U=K-L;S=(D-L)*N-U*(q-H);if(S>1.0e-4){ka=1}else{ka=(S<-1.0e-4)<<31>>31}S=(I-L)*N-U*(M-H);if(S>1.0e-4){la=1}else{la=(S<-1.0e-4)<<31>>31}if((da(ja,ia)|0)<0){if((da(la,ka)|0)<=-1){C=123;break c}}o=o+1|0;}while((o|0)<(x|0))}o=D!=I;b=w;do{Z=c[m+(b<<2)>>2]|0;S=+h[l+(b<<4)>>3];U=+h[l+(b<<4)+8>>3];N=G*(S-I)-ea*(U-M);do{if(N>1.0e-4){ma=1}else{_=N<-1.0e-4;X=_<<31>>31;if(_){ma=X;break}if(o){if(D<S&S<I){C=123;break c}if(I<S&S<D){C=123;break c}else{ma=X;break}}else{if(q<U&U<M){C=123;break c}if(M<U&U<q){C=123;break c}else{ma=X;break}}}}while(0);N=+h[l+(Z<<4)>>3];H=+h[l+(Z<<4)+8>>3];L=G*(N-I)-ea*(H-M);do{if(L>1.0e-4){na=1}else{X=L<-1.0e-4;_=X<<31>>31;if(X){na=_;break}if(o){if(D<N&N<I){C=123;break c}if(I<N&N<D){C=123;break c}else{na=_;break}}else{if(q<H&H<M){C=123;break c}if(M<H&H<q){C=123;break c}else{na=_;break}}}}while(0);L=U-H;K=S-N;F=(D-N)*L-K*(q-H);if(F>1.0e-4){oa=1}else{oa=(F<-1.0e-4)<<31>>31}F=(I-N)*L-K*(M-H);if(F>1.0e-4){pa=1}else{pa=(F<-1.0e-4)<<31>>31}if((da(na,ma)|0)<0){if((da(pa,oa)|0)<=-1){C=123;break c}}b=b+1|0;}while((b|0)<(j|0));h[p+(d<<3)>>3]=+T(ea*ea+G*G)}}while(0);if((C|0)==123){C=0;h[p+(d<<3)>>3]=0.0}d=d+1|0;}while((d|0)<(j|0));$=p+(j<<3)|0;h[$>>3]=0.0;aa=j+1|0;ba=p+(aa<<3)|0;h[ba>>3]=0.0;i=e;return p|0}function cC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;h=a;a=i;i=i+16|0;c[a>>2]=c[h>>2];c[a+4>>2]=c[h+4>>2];c[a+8>>2]=c[h+8>>2];c[a+12>>2]=c[h+12>>2];h=d;d=i;i=i+16|0;c[d>>2]=c[h>>2];c[d+4>>2]=c[h+4>>2];c[d+8>>2]=c[h+8>>2];c[d+12>>2]=c[h+12>>2];h=c[f+4>>2]|0;j=c[f+8>>2]|0;k=c[f+16>>2]|0;l=(e|0)<0;a:do{if((b|0)<0){if(l){m=0;break}n=c[f+12>>2]|0;o=0;p=c[n+(e<<2)>>2]|0;q=c[n+(e+1<<2)>>2]|0;r=11}else{if(l){n=c[f+12>>2]|0;o=0;p=c[n+(b<<2)>>2]|0;q=c[n+(b+1<<2)>>2]|0;r=11;break}n=c[f+12>>2]|0;if((b|0)>(e|0)){s=b;t=b;u=e;v=e}else{s=e;t=e;u=b;v=b}w=c[n+(s+1<<2)>>2]|0;x=c[n+(t<<2)>>2]|0;y=c[n+(u+1<<2)>>2]|0;z=c[n+(v<<2)>>2]|0;if((z|0)>0){A=0}else{o=y;p=x;q=w;r=11;break}while(1){n=A+1|0;if(($B(a,d,j+(A<<4)|0,j+(c[k+(A<<2)>>2]<<4)|0)|0)!=0){B=0;break}if((n|0)<(z|0)){A=n}else{o=y;p=x;q=w;r=11;break a}}i=g;return B|0}}while(0);b:do{if((r|0)==11){if((o|0)<(p|0)){C=o}else{m=q;break}while(1){A=C+1|0;if(($B(a,d,j+(C<<4)|0,j+(c[k+(C<<2)>>2]<<4)|0)|0)!=0){B=0;break}if((A|0)<(p|0)){C=A}else{m=q;break b}}i=g;return B|0}}while(0);if((m|0)<(h|0)){D=m}else{B=1;i=g;return B|0}while(1){m=D+1|0;if(($B(a,d,j+(D<<4)|0,j+(c[k+(D<<2)>>2]<<4)|0)|0)!=0){B=0;r=18;break}if((m|0)<(h|0)){D=m}else{B=1;r=18;break}}if((r|0)==18){i=g;return B|0}return 0}function dC(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+2048|0;g=e;e=i;i=i+32|0;tF(e,g,32)|0;g=f|0;j=f+1024|0;k=b+16|0;b=c[248+(c[(c[k>>2]|0)+12>>2]<<2)>>2]|0;Lv(b,153400)|0;l=+h[e>>3];m=e+8|0;eC(b,l,+h[m>>3]);n=j|0;nb(n|0,107520,(o=i,i=i+8|0,h[o>>3]=+h[e+16>>3]-l,o)|0)|0;i=o;p=gb(n|0,46)|0;do{if((p|0)==0){q=j+(xF(n|0)|0)|0}else{r=p;while(1){s=r+1|0;if((a[s]|0)==0){t=r;break}else{r=s}}while(1){r=a[t]|0;if((r<<24>>24|0)==46){u=5;break}else if((r<<24>>24|0)!=48){u=6;break}a[t]=0;t=t-1|0}if((u|0)==5){a[t]=0;q=t;break}else if((u|0)==6){q=t+1|0;break}}}while(0);a[q]=32;a[q+1|0]=0;Lv(b,n)|0;nb(n|0,107520,(o=i,i=i+8|0,h[o>>3]=+h[e+24>>3]- +h[m>>3],o)|0)|0;i=o;m=gb(n|0,46)|0;do{if((m|0)==0){v=j+(xF(n|0)|0)|0}else{e=m;while(1){q=e+1|0;if((a[q]|0)==0){w=e;break}else{e=q}}while(1){e=a[w]|0;if((e<<24>>24|0)==46){u=12;break}else if((e<<24>>24|0)!=48){u=13;break}a[w]=0;w=w-1|0}if((u|0)==12){a[w]=0;v=w;break}else if((u|0)==13){v=w+1|0;break}}}while(0);a[v]=32;a[v+1|0]=0;Lv(b,n)|0;n=c[d+8>>2]|0;d=c[248+(c[(c[k>>2]|0)+12>>2]<<2)>>2]|0;k=g|0;g=xF(n|0)|0;nb(k|0,121624,(o=i,i=i+16|0,c[o>>2]=213464,c[o+8>>2]=g,o)|0)|0;i=o;Lv(d,k)|0;Lv(d,n)|0;n=d+4|0;k=c[n>>2]|0;if(k>>>0<(c[d+8>>2]|0)>>>0){x=k;y=x+1|0;c[n>>2]=y;a[x]=32;z=1024;A=0;i=f;return}Jv(d,1)|0;x=c[n>>2]|0;y=x+1|0;c[n>>2]=y;a[x]=32;z=1024;A=0;i=f;return}function eC(b,c,d){b=b|0;c=+c;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;i=i+1024|0;f=e|0;g=f|0;nb(g|0,107520,(j=i,i=i+8|0,h[j>>3]=c,j)|0)|0;i=j;k=gb(g|0,46)|0;do{if((k|0)==0){l=f+(xF(g|0)|0)|0}else{m=k;while(1){n=m+1|0;if((a[n]|0)==0){o=m;break}else{m=n}}while(1){m=a[o]|0;if((m<<24>>24|0)==46){p=5;break}else if((m<<24>>24|0)!=48){p=6;break}a[o]=0;o=o-1|0}if((p|0)==5){a[o]=0;l=o;break}else if((p|0)==6){l=o+1|0;break}}}while(0);a[l]=32;a[l+1|0]=0;Lv(b,g)|0;c=+wk(d);nb(g|0,107520,(j=i,i=i+8|0,h[j>>3]=c,j)|0)|0;i=j;j=gb(g|0,46)|0;do{if((j|0)==0){q=f+(xF(g|0)|0)|0}else{l=j;while(1){o=l+1|0;if((a[o]|0)==0){r=l;break}else{l=o}}while(1){l=a[r]|0;if((l<<24>>24|0)==46){p=12;break}else if((l<<24>>24|0)!=48){p=13;break}a[r]=0;r=r-1|0}if((p|0)==12){a[r]=0;q=r;break}else if((p|0)==13){q=r+1|0;break}}}while(0);a[q]=32;a[q+1|0]=0;Lv(b,g)|0;i=e;return}function fC(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=i;i=i+1040|0;f=e|0;g=e+1024|0;h=e+1032|0;j=c[(c[d+16>>2]|0)+8>>2]|0;k=d+64|0;switch(c[k>>2]|0){case 1:{if((b[(c[j+8>>2]|0)+128>>1]&1)==0){i=e;return}dn(j);i=e;return};case 6:case 5:case 4:{zk(j,h,g);d=c[h>>2]|0;h=c[g>>2]|0;g=c[k>>2]|0;k=dF(8240)|0;c[43614]=k;a:do{if((g|0)==5){b[k+8232>>1]=12;c[k+8236>>2]=113088}else if((g|0)==6){b[k+8232>>1]=14;c[k+8236>>2]=113640}else{l=ew(j|0,114376)|0;do{if((l|0)!=0){if((a[l]|0)==0){break}m=f|0;n=0;o=l;b:while(1){p=o;while(1){q=p+1|0;r=a[p]|0;if(r<<24>>24==0){break b}if(((r<<24>>24)-48|0)>>>0<10>>>0){break}else{p=q}}if((n|0)>=1023){s=16;break}a[f+n|0]=r;n=n+1|0;o=q}if((s|0)==16){Fv(0,108536,(t=i,i=i+8|0,c[t>>2]=l,t)|0)|0;i=t}a[f+n|0]=0;o=(Rb(m|0)|0)&65535;if((o&65535)>>>0<=10>>>0){break}b[(c[43614]|0)+8232>>1]=o;c[(c[43614]|0)+8236>>2]=l;break a}}while(0);l=f|0;o=0;p=112568;c:while(1){u=p;while(1){v=u+1|0;w=a[u]|0;if(w<<24>>24==0){break c}if(((w<<24>>24)-48|0)>>>0<10>>>0){break}else{u=v}}if((o|0)>=1023){s=25;break}a[f+o|0]=w;o=o+1|0;p=v}if((s|0)==25){Fv(0,108536,(t=i,i=i+8|0,c[t>>2]=112568,t)|0)|0;i=t}a[f+o|0]=0;p=(Rb(l|0)|0)&65535;b[(c[43614]|0)+8232>>1]=p;c[(c[43614]|0)+8236>>2]=112568}}while(0);f=j+8|0;if((c[(c[f>>2]|0)+172>>2]|0)==0){c[c[43614]>>2]=0}else{t=en(j,0,115752,213464)|0;c[c[43614]>>2]=t}if((a[(c[f>>2]|0)+113|0]&8)==0){c[(c[43614]|0)+4>>2]=0}else{t=en(j,0,112048,213464)|0;c[(c[43614]|0)+4>>2]=t}t=en(j,1,115752,213464)|0;c[(c[43614]|0)+8>>2]=t;t=en(j,1,112048,213464)|0;c[(c[43614]|0)+12>>2]=t;t=en(j,2,115752,213464)|0;c[(c[43614]|0)+16>>2]=t;if((h|0)==0){c[(c[43614]|0)+20>>2]=0}else{h=en(j,2,111448,213464)|0;c[(c[43614]|0)+20>>2]=h}if((d|0)==0){c[(c[43614]|0)+24>>2]=0}else{d=en(j,2,110704,213464)|0;c[(c[43614]|0)+24>>2]=d}if((a[(c[f>>2]|0)+113|0]&33)==0){c[(c[43614]|0)+28>>2]=0}else{d=en(j,2,112048,213464)|0;c[(c[43614]|0)+28>>2]=d}if((a[(c[f>>2]|0)+113|0]&2)==0){c[(c[43614]|0)+32>>2]=0}else{d=en(j,2,110056,213464)|0;c[(c[43614]|0)+32>>2]=d}if((a[(c[f>>2]|0)+113|0]&4)==0){c[(c[43614]|0)+36>>2]=0}else{f=en(j,2,109368,213464)|0;c[(c[43614]|0)+36>>2]=f}Iv(174464,1024,(c[43614]|0)+40|0);Iv(174480,1024,(c[43614]|0)+1064|0);Iv(174496,1024,(c[43614]|0)+2088|0);Iv(174512,1024,(c[43614]|0)+3112|0);Iv(174528,1024,(c[43614]|0)+4136|0);Iv(174544,1024,(c[43614]|0)+5160|0);Iv(174560,1024,(c[43614]|0)+6184|0);Iv(174576,1024,(c[43614]|0)+7208|0);i=e;return};case 0:{Ck(j);i=e;return};default:{i=e;return}}}function gC(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=c[(c[b+16>>2]|0)+8>>2]|0;if((c[45182]|0)==0){c[45182]=c[43564];c[45183]=30;c[45184]=34}e=d+52|0;f=(c[e>>2]|0)+8|0;g=c[f>>2]|0;c[f>>2]=180728;switch(c[b+64>>2]|0){case 0:case 1:{if((c[b+152>>2]&134217728|0)!=0){i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return}Fy(d,b)|0;i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};case 2:{xk(b,d,b,0);i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};case 3:{xk(b,d,b,1);i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};case 4:case 5:case 6:{f=c[43617]|0;if((f|0)==(c[43616]|0)){k=d|0}else{l=c[c[43614]>>2]|0;if((l|0)==0){m=en(d,0,115752,213464)|0;c[c[43614]>>2]=m;n=c[c[43614]>>2]|0;o=c[43617]|0}else{n=l;o=f}f=d|0;if(o>>>0<(c[43618]|0)>>>0){p=o}else{Jv(174464,1)|0;p=c[43617]|0}a[p]=0;p=c[43616]|0;c[43617]=p;hw(f,n,p)|0;k=f}if((c[(c[d+8>>2]|0)+12>>2]|0)!=0){f=c[(c[43614]|0)+4>>2]|0;p=c[43633]|0;if(p>>>0<(c[43634]|0)>>>0){q=p}else{Jv(174528,1)|0;q=c[43633]|0}a[q]=0;q=c[43632]|0;c[43633]=q;hw(k,f,q)|0}iw(k,114376,c[(c[43614]|0)+8236>>2]|0,213464)|0;Mv(174464);Mv(174480);Mv(174496);Mv(174512);Mv(174528);Mv(174544);Mv(174560);Mv(174576);eF(c[43614]|0);h[1836]=1.0;h[1840]=1.0;c[43682]=0;c[43686]=0;if((c[b+152>>2]&134217728|0)!=0){i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return}Fy(d,b)|0;i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return};default:{i=c[e>>2]|0;j=i+8|0;c[j>>2]=g;return}}}function hC(b){b=b|0;var d=0,e=0,f=0,g=0,i=0;d=c[(c[b+16>>2]|0)+8>>2]|0;b=d|0;e=c[c[43614]>>2]|0;f=c[43621]|0;if(f>>>0<(c[43622]|0)>>>0){g=f}else{Jv(174480,1)|0;g=c[43621]|0}a[g]=0;g=c[43620]|0;c[43621]=g;hw(b,e,g)|0;if((c[(c[d+8>>2]|0)+12>>2]|0)==0){h[1837]=1.0;h[1841]=1.0;c[43683]=0;c[43687]=0;return}d=c[(c[43614]|0)+4>>2]|0;g=c[43637]|0;if(g>>>0<(c[43638]|0)>>>0){i=g}else{Jv(174544,1)|0;i=c[43637]|0}a[i]=0;i=c[43636]|0;c[43637]=i;hw(b,d,i)|0;h[1837]=1.0;h[1841]=1.0;c[43683]=0;c[43687]=0;return}function iC(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[(c[b+16>>2]|0)+8>>2]|0;b=c[43621]|0;if((b|0)!=(c[43620]|0)){e=c[(c[43614]|0)+8>>2]|0;if(b>>>0<(c[43622]|0)>>>0){f=b}else{Jv(174480,1)|0;f=c[43621]|0}a[f]=0;f=c[43620]|0;c[43621]=f;hw(d|0,e,f)|0}f=c[43637]|0;if((f|0)==(c[43636]|0)){h[1844]=1.0;h[1846]=1.0;c[43690]=0;c[43692]=0;return}e=c[(c[43614]|0)+12>>2]|0;if(f>>>0<(c[43638]|0)>>>0){g=f}else{Jv(174544,1)|0;g=c[43637]|0}a[g]=0;g=c[43636]|0;c[43637]=g;hw(d|0,e,g)|0;h[1844]=1.0;h[1846]=1.0;c[43690]=0;c[43692]=0;return}function jC(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;d=c[(c[b+16>>2]|0)+8>>2]|0;b=c[43621]|0;if((b|0)!=(c[43620]|0)){e=c[(c[43614]|0)+16>>2]|0;if(b>>>0<(c[43622]|0)>>>0){f=b}else{Jv(174480,1)|0;f=c[43621]|0}a[f]=0;f=c[43620]|0;c[43621]=f;hw(d|0,e,f)|0}f=c[43625]|0;if((f|0)!=(c[43624]|0)){e=c[(c[43614]|0)+24>>2]|0;if(f>>>0<(c[43626]|0)>>>0){g=f}else{Jv(174496,1)|0;g=c[43625]|0}a[g]=0;g=c[43624]|0;c[43625]=g;hw(d|0,e,g)|0}g=c[43629]|0;if((g|0)!=(c[43628]|0)){e=c[(c[43614]|0)+20>>2]|0;if(g>>>0<(c[43630]|0)>>>0){i=g}else{Jv(174512,1)|0;i=c[43629]|0}a[i]=0;i=c[43628]|0;c[43629]=i;hw(d|0,e,i)|0}i=c[43637]|0;if((i|0)!=(c[43636]|0)){e=c[(c[43614]|0)+28>>2]|0;if(i>>>0<(c[43638]|0)>>>0){j=i}else{Jv(174544,1)|0;j=c[43637]|0}a[j]=0;j=c[43636]|0;c[43637]=j;hw(d|0,e,j)|0}j=c[43641]|0;if((j|0)!=(c[43640]|0)){e=c[(c[43614]|0)+36>>2]|0;if(j>>>0<(c[43642]|0)>>>0){k=j}else{Jv(174560,1)|0;k=c[43641]|0}a[k]=0;k=c[43640]|0;c[43641]=k;hw(d|0,e,k)|0}k=c[43645]|0;if((k|0)==(c[43644]|0)){h[1845]=1.0;h[1847]=1.0;h[1838]=1.0;h[1839]=1.0;h[1842]=1.0;h[1843]=1.0;c[43691]=0;c[43693]=0;c[43684]=0;c[43685]=0;c[43688]=0;c[43689]=0;return}e=c[(c[43614]|0)+32>>2]|0;if(k>>>0<(c[43646]|0)>>>0){l=k}else{Jv(174576,1)|0;l=c[43645]|0}a[l]=0;l=c[43644]|0;c[43645]=l;hw(d|0,e,l)|0;h[1845]=1.0;h[1847]=1.0;h[1838]=1.0;h[1839]=1.0;h[1842]=1.0;h[1843]=1.0;c[43691]=0;c[43693]=0;c[43684]=0;c[43685]=0;c[43688]=0;c[43689]=0;return}function kC(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0;j=i;i=i+3072|0;k=f;f=i;i=i+16|0;c[f>>2]=c[k>>2];c[f+4>>2]=c[k+4>>2];c[f+8>>2]=c[k+8>>2];c[f+12>>2]=c[k+12>>2];k=j|0;l=j+1024|0;m=j+2048|0;n=e+16|0;e=c[(c[n>>2]|0)+12>>2]|0;o=c[248+(e<<2)>>2]|0;Lv(o,119184)|0;p=m|0;q=g+4|0;nb(p|0,107520,(r=i,i=i+8|0,h[r>>3]=+h[(c[q>>2]|0)+16>>3],r)|0)|0;i=r;s=gb(p|0,46)|0;do{if((s|0)==0){t=m+(xF(p|0)|0)|0}else{u=s;while(1){v=u+1|0;if((a[v]|0)==0){w=u;break}else{u=v}}while(1){u=a[w]|0;if((u<<24>>24|0)==46){x=5;break}else if((u<<24>>24|0)!=48){x=6;break}a[w]=0;w=w-1|0}if((x|0)==5){a[w]=0;t=w;break}else if((x|0)==6){t=w+1|0;break}}}while(0);a[t]=32;a[t+1|0]=0;Lv(o,p)|0;t=c[c[q>>2]>>2]|0;w=c[248+(c[(c[n>>2]|0)+12>>2]<<2)>>2]|0;s=l|0;l=xF(t|0)|0;nb(s|0,121624,(r=i,i=i+16|0,c[r>>2]=213464,c[r+8>>2]=l,r)|0)|0;i=r;Lv(w,s)|0;Lv(w,t)|0;t=w+4|0;l=c[t>>2]|0;if(l>>>0<(c[w+8>>2]|0)>>>0){y=l}else{Jv(w,1)|0;y=c[t>>2]|0}c[t>>2]=y+1;a[y]=32;y=(c[n>>2]|0)+16|0;t=a[y+3|0]|0;w=d[y]|0;l=d[y+1|0]|0;u=d[y+2|0]|0;if(t<<24>>24==-1){nb(180832,150832,(r=i,i=i+24|0,c[r>>2]=w,c[r+8>>2]=l,c[r+16>>2]=u,r)|0)|0;i=r}else{nb(180832,147960,(r=i,i=i+32|0,c[r>>2]=w,c[r+8>>2]=l,c[r+16>>2]=u,c[r+24>>2]=t&255,r)|0)|0;i=r}t=c[248+(c[(c[n>>2]|0)+12>>2]<<2)>>2]|0;u=k|0;k=xF(180832)|0;nb(u|0,121624,(r=i,i=i+16|0,c[r>>2]=154040,c[r+8>>2]=k,r)|0)|0;i=r;Lv(t,u)|0;Lv(t,180832)|0;u=t+4|0;k=c[u>>2]|0;if(k>>>0<(c[t+8>>2]|0)>>>0){z=k}else{Jv(t,1)|0;z=c[u>>2]|0}c[u>>2]=z+1;a[z]=32;z=a[g+48|0]|0;if((z|0)==114){A=1}else if((z|0)==108){A=-1}else{A=0}z=c[q>>2]|0;if((z|0)==0){B=0}else{B=c[z+24>>2]<<25>>25}z=b[(c[43614]|0)+8232>>1]|0;do{if((z&65535)>>>0>14>>>0){q=((z&65535)>>>0>15>>>0?63:31)&B;u=174728+(e<<2)|0;if((c[u>>2]|0)==(q|0)){break}nb(p|0,118560,(r=i,i=i+8|0,c[r>>2]=q,r)|0)|0;i=r;Lv(o,p)|0;c[u>>2]=q}}while(0);e=f+8|0;C=+h[g+24>>3]+ +h[e>>3];h[e>>3]=C;Lv(o,117608)|0;eC(o,+h[f>>3],C);nb(p|0,116688,(r=i,i=i+8|0,c[r>>2]=A,r)|0)|0;i=r;Lv(o,p)|0;nb(p|0,107520,(r=i,i=i+8|0,h[r>>3]=+h[g+32>>3],r)|0)|0;i=r;A=gb(p|0,46)|0;do{if((A|0)==0){D=m+(xF(p|0)|0)|0}else{f=A;while(1){e=f+1|0;if((a[e]|0)==0){E=f;break}else{f=e}}while(1){f=a[E]|0;if((f<<24>>24|0)==46){x=27;break}else if((f<<24>>24|0)!=48){x=28;break}a[E]=0;E=E-1|0}if((x|0)==27){a[E]=0;D=E;break}else if((x|0)==28){D=E+1|0;break}}}while(0);a[D]=32;a[D+1|0]=0;Lv(o,p)|0;p=c[g>>2]|0;g=c[248+(c[(c[n>>2]|0)+12>>2]<<2)>>2]|0;n=xF(p|0)|0;nb(s|0,121624,(r=i,i=i+16|0,c[r>>2]=213464,c[r+8>>2]=n,r)|0)|0;i=r;Lv(g,s)|0;Lv(g,p)|0;p=g+4|0;s=c[p>>2]|0;if(s>>>0<(c[g+8>>2]|0)>>>0){F=s;G=F+1|0;c[p>>2]=G;a[F]=32;H=1024;I=0;i=j;return}Jv(g,1)|0;F=c[p>>2]|0;G=F+1|0;c[p>>2]=G;a[F]=32;H=1024;I=0;i=j;return}function lC(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;i=i+3072|0;j=g|0;k=g+2048|0;l=b+16|0;m=c[(c[l>>2]|0)+12>>2]|0;pC(b);n=(c[l>>2]|0)+16|0;o=a[n+3|0]|0;p=d[n]|0;q=d[n+1|0]|0;r=d[n+2|0]|0;if(o<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,c[s+24>>2]=o&255,s)|0)|0;i=s}o=c[248+(c[(c[l>>2]|0)+12>>2]<<2)>>2]|0;r=g+1024|0;q=xF(180832)|0;nb(r|0,121624,(s=i,i=i+16|0,c[s>>2]=154040,c[s+8>>2]=q,s)|0)|0;i=s;Lv(o,r)|0;Lv(o,180832)|0;r=o+4|0;q=c[r>>2]|0;if(q>>>0<(c[o+8>>2]|0)>>>0){t=q}else{Jv(o,1)|0;t=c[r>>2]|0}c[r>>2]=t+1;a[t]=32;if((f|0)==0){t=c[248+(m<<2)>>2]|0;Lv(t,120024)|0;u=t}else{if((f&-2|0)==2){qC(b,f,e,2)}else{f=(c[l>>2]|0)+56|0;b=a[f+3|0]|0;t=d[f]|0;r=d[f+1|0]|0;o=d[f+2|0]|0;if(b<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=t,c[s+8>>2]=r,c[s+16>>2]=o,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=t,c[s+8>>2]=r,c[s+16>>2]=o,c[s+24>>2]=b&255,s)|0)|0;i=s}b=c[248+(c[(c[l>>2]|0)+12>>2]<<2)>>2]|0;l=j|0;j=xF(180832)|0;nb(l|0,121624,(s=i,i=i+16|0,c[s>>2]=128936,c[s+8>>2]=j,s)|0)|0;i=s;Lv(b,l)|0;Lv(b,180832)|0;l=b+4|0;j=c[l>>2]|0;if(j>>>0<(c[b+8>>2]|0)>>>0){v=j}else{Jv(b,1)|0;v=c[l>>2]|0}c[l>>2]=v+1;a[v]=32;}v=c[248+(m<<2)>>2]|0;Lv(v,120792)|0;u=v}v=e|0;m=e+8|0;eC(u,+h[v>>3],+h[m>>3]);l=k|0;nb(l|0,107520,(s=i,i=i+8|0,h[s>>3]=+h[e+16>>3]- +h[v>>3],s)|0)|0;i=s;v=gb(l|0,46)|0;do{if((v|0)==0){w=k+(xF(l|0)|0)|0}else{b=v;while(1){j=b+1|0;if((a[j]|0)==0){x=b;break}else{b=j}}while(1){b=a[x]|0;if((b<<24>>24|0)==46){y=21;break}else if((b<<24>>24|0)!=48){y=22;break}a[x]=0;x=x-1|0}if((y|0)==21){a[x]=0;w=x;break}else if((y|0)==22){w=x+1|0;break}}}while(0);a[w]=32;a[w+1|0]=0;Lv(u,l)|0;nb(l|0,107520,(s=i,i=i+8|0,h[s>>3]=+h[e+24>>3]- +h[m>>3],s)|0)|0;i=s;s=gb(l|0,46)|0;if((s|0)==0){z=k+(xF(l|0)|0)|0;A=z+1|0;a[z]=32;a[A]=0;B=Lv(u,l)|0;i=g;return}else{C=s}while(1){s=C+1|0;if((a[s]|0)==0){D=C;break}else{C=s}}while(1){C=a[D]|0;if((C<<24>>24|0)==46){y=28;break}else if((C<<24>>24|0)!=48){y=29;break}a[D]=0;D=D-1|0}if((y|0)==28){a[D]=0;z=D;A=z+1|0;a[z]=32;a[A]=0;B=Lv(u,l)|0;i=g;return}else if((y|0)==29){z=D+1|0;A=z+1|0;a[z]=32;a[A]=0;B=Lv(u,l)|0;i=g;return}}function mC(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+3072|0;k=j|0;l=j+2048|0;pC(b);m=b+16|0;n=(c[m>>2]|0)+16|0;o=a[n+3|0]|0;p=d[n]|0;q=d[n+1|0]|0;r=d[n+2|0]|0;if(o<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,c[s+24>>2]=o&255,s)|0)|0;i=s}o=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;r=j+1024|0;q=xF(180832)|0;nb(r|0,121624,(s=i,i=i+16|0,c[s>>2]=154040,c[s+8>>2]=q,s)|0)|0;i=s;Lv(o,r)|0;Lv(o,180832)|0;r=o+4|0;q=c[r>>2]|0;if(q>>>0<(c[o+8>>2]|0)>>>0){t=q}else{Jv(o,1)|0;t=c[r>>2]|0}c[r>>2]=t+1;a[t]=32;if((g|0)==0){t=l|0;r=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;o=r+4|0;q=c[o>>2]|0;if(q>>>0<(c[r+8>>2]|0)>>>0){u=q}else{Jv(r,1)|0;u=c[o>>2]|0}c[o>>2]=u+1;a[u]=112;nb(t|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(r,t)|0;if((f|0)>0){v=0}else{i=j;return}do{eC(r,+h[e+(v<<4)>>3],+h[e+(v<<4)+8>>3]);v=v+1|0;}while((v|0)<(f|0));i=j;return}if((g&-2|0)==2){qC(b,g,e,f)}else{g=(c[m>>2]|0)+56|0;b=a[g+3|0]|0;v=d[g]|0;r=d[g+1|0]|0;t=d[g+2|0]|0;if(b<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,c[s+24>>2]=b&255,s)|0)|0;i=s}b=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;t=k|0;k=xF(180832)|0;nb(t|0,121624,(s=i,i=i+16|0,c[s>>2]=128936,c[s+8>>2]=k,s)|0)|0;i=s;Lv(b,t)|0;Lv(b,180832)|0;t=b+4|0;k=c[t>>2]|0;if(k>>>0<(c[b+8>>2]|0)>>>0){w=k}else{Jv(b,1)|0;w=c[t>>2]|0}c[t>>2]=w+1;a[w]=32;}w=l|0;l=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;m=l+4|0;t=c[m>>2]|0;if(t>>>0<(c[l+8>>2]|0)>>>0){x=t}else{Jv(l,1)|0;x=c[m>>2]|0}c[m>>2]=x+1;a[x]=80;nb(w|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(l,w)|0;if((f|0)>0){y=0}else{i=j;return}do{eC(l,+h[e+(y<<4)>>3],+h[e+(y<<4)+8>>3]);y=y+1|0;}while((y|0)<(f|0));i=j;return}function nC(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;j=i;i=i+3072|0;g=j|0;l=j+2048|0;pC(b);m=b+16|0;n=(c[m>>2]|0)+16|0;o=a[n+3|0]|0;p=d[n]|0;q=d[n+1|0]|0;r=d[n+2|0]|0;if(o<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=p,c[s+8>>2]=q,c[s+16>>2]=r,c[s+24>>2]=o&255,s)|0)|0;i=s}o=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;r=j+1024|0;q=xF(180832)|0;nb(r|0,121624,(s=i,i=i+16|0,c[s>>2]=154040,c[s+8>>2]=q,s)|0)|0;i=s;Lv(o,r)|0;Lv(o,180832)|0;r=o+4|0;q=c[r>>2]|0;if(q>>>0<(c[o+8>>2]|0)>>>0){t=q}else{Jv(o,1)|0;t=c[r>>2]|0}c[r>>2]=t+1;a[t]=32;if((k|0)==0){t=l|0;r=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;o=r+4|0;q=c[o>>2]|0;if(q>>>0<(c[r+8>>2]|0)>>>0){u=q}else{Jv(r,1)|0;u=c[o>>2]|0}c[o>>2]=u+1;a[u]=66;nb(t|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(r,t)|0;if((f|0)>0){v=0}else{i=j;return}do{eC(r,+h[e+(v<<4)>>3],+h[e+(v<<4)+8>>3]);v=v+1|0;}while((v|0)<(f|0));i=j;return}if((k&-2|0)==2){qC(b,k,e,f)}else{k=(c[m>>2]|0)+56|0;b=a[k+3|0]|0;v=d[k]|0;r=d[k+1|0]|0;t=d[k+2|0]|0;if(b<<24>>24==-1){nb(180832,150832,(s=i,i=i+24|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,s)|0)|0;i=s}else{nb(180832,147960,(s=i,i=i+32|0,c[s>>2]=v,c[s+8>>2]=r,c[s+16>>2]=t,c[s+24>>2]=b&255,s)|0)|0;i=s}b=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;t=g|0;g=xF(180832)|0;nb(t|0,121624,(s=i,i=i+16|0,c[s>>2]=128936,c[s+8>>2]=g,s)|0)|0;i=s;Lv(b,t)|0;Lv(b,180832)|0;t=b+4|0;g=c[t>>2]|0;if(g>>>0<(c[b+8>>2]|0)>>>0){w=g}else{Jv(b,1)|0;w=c[t>>2]|0}c[t>>2]=w+1;a[w]=32;}w=l|0;l=c[248+(c[(c[m>>2]|0)+12>>2]<<2)>>2]|0;m=l+4|0;t=c[m>>2]|0;if(t>>>0<(c[l+8>>2]|0)>>>0){x=t}else{Jv(l,1)|0;x=c[m>>2]|0}c[m>>2]=x+1;a[x]=98;nb(w|0,157816,(s=i,i=i+8|0,c[s>>2]=f,s)|0)|0;i=s;Lv(l,w)|0;if((f|0)>0){y=0}else{i=j;return}do{eC(l,+h[e+(y<<4)>>3],+h[e+(y<<4)+8>>3]);y=y+1|0;}while((y|0)<(f|0));i=j;return}function oC(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;g=i;i=i+2048|0;pC(b);j=b+16|0;b=(c[j>>2]|0)+16|0;k=a[b+3|0]|0;l=d[b]|0;m=d[b+1|0]|0;n=d[b+2|0]|0;if(k<<24>>24==-1){nb(180832,150832,(o=i,i=i+24|0,c[o>>2]=l,c[o+8>>2]=m,c[o+16>>2]=n,o)|0)|0;i=o}else{nb(180832,147960,(o=i,i=i+32|0,c[o>>2]=l,c[o+8>>2]=m,c[o+16>>2]=n,c[o+24>>2]=k&255,o)|0)|0;i=o}k=c[248+(c[(c[j>>2]|0)+12>>2]<<2)>>2]|0;n=g|0;m=xF(180832)|0;nb(n|0,121624,(o=i,i=i+16|0,c[o>>2]=154040,c[o+8>>2]=m,o)|0)|0;i=o;Lv(k,n)|0;Lv(k,180832)|0;n=k+4|0;m=c[n>>2]|0;if(m>>>0<(c[k+8>>2]|0)>>>0){p=m}else{Jv(k,1)|0;p=c[n>>2]|0}c[n>>2]=p+1;a[p]=32;p=g+1024|0;n=c[248+(c[(c[j>>2]|0)+12>>2]<<2)>>2]|0;j=n+4|0;k=c[j>>2]|0;if(k>>>0<(c[n+8>>2]|0)>>>0){q=k}else{Jv(n,1)|0;q=c[j>>2]|0}c[j>>2]=q+1;a[q]=76;nb(p|0,157816,(o=i,i=i+8|0,c[o>>2]=f,o)|0)|0;i=o;Lv(n,p)|0;if((f|0)>0){r=0}else{s=1024;t=0;i=g;return}do{eC(n,+h[e+(r<<4)>>3],+h[e+(r<<4)+8>>3]);r=r+1|0;}while((r|0)<(f|0));s=1024;t=0;i=g;return}function pC(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+2192|0;e=d|0;f=d+2176|0;Iv(f,1024,d+1024|0);g=b+16|0;b=c[g>>2]|0;j=+h[b+152>>3];k=14688+(c[b+12>>2]<<3)|0;if(j!=+h[k>>3]){h[k>>3]=j;Lv(f,144824)|0;k=d+2048|0;nb(k|0,141888,(l=i,i=i+8|0,h[l>>3]=+h[(c[g>>2]|0)+152>>3],l)|0)|0;i=l;m=gb(k|0,46)|0;a:do{if((m|0)!=0){n=m;while(1){o=n+1|0;if((a[o]|0)==0){p=n;break}else{n=o}}while(1){n=a[p]|0;if((n<<24>>24|0)==46){break}else if((n<<24>>24|0)!=48){break a}a[p]=0;p=p-1|0}a[p]=0}}while(0);Lv(f,k)|0;k=f+4|0;p=c[k>>2]|0;m=f+8|0;if(p>>>0<(c[m>>2]|0)>>>0){q=p}else{Jv(f,1)|0;q=c[k>>2]|0}c[k>>2]=q+1;a[q]=41;q=c[k>>2]|0;if(q>>>0<(c[m>>2]|0)>>>0){r=q}else{Jv(f,1)|0;r=c[k>>2]|0}a[r]=0;r=c[f>>2]|0;c[k>>2]=r;k=c[248+(c[(c[g>>2]|0)+12>>2]<<2)>>2]|0;q=e|0;m=xF(r|0)|0;nb(q|0,121624,(l=i,i=i+16|0,c[l>>2]=138744,c[l+8>>2]=m,l)|0)|0;i=l;Lv(k,q)|0;Lv(k,r)|0;r=k+4|0;q=c[r>>2]|0;if(q>>>0<(c[k+8>>2]|0)>>>0){s=q}else{Jv(k,1)|0;s=c[r>>2]|0}c[r>>2]=s+1;a[s]=32;t=c[g>>2]|0}else{t=b}b=c[t+160>>2]|0;if((b|0)==0){i=d;return}t=c[b>>2]|0;if((t|0)!=0){s=f+4|0;r=f+8|0;k=f|0;q=e|0;e=b;b=t;do{e=e+4|0;t=a[b]|0;if((t<<24>>24|0)==98){if((Ya(b|0,133480)|0)!=0){u=21}}else if((t<<24>>24|0)==102){if((Ya(b|0,136176)|0)!=0){u=21}}else if((t<<24>>24|0)==115){if((Ya(b|0,131360)|0)!=0){u=21}}else{u=21}if((u|0)==21){u=0;Lv(f,b)|0;t=b;while(1){v=t+1|0;if((a[t]|0)==0){break}else{t=v}}if((a[v]|0)!=0){t=c[s>>2]|0;if(t>>>0<(c[r>>2]|0)>>>0){w=t}else{Jv(f,1)|0;w=c[s>>2]|0}c[s>>2]=w+1;a[w]=40;if((a[v]|0)!=0){t=v;m=0;while(1){if((m|0)!=0){p=c[s>>2]|0;if(p>>>0<(c[r>>2]|0)>>>0){x=p}else{Jv(f,1)|0;x=c[s>>2]|0}c[s>>2]=x+1;a[x]=44}Lv(f,t)|0;p=t;while(1){y=p+1|0;if((a[p]|0)==0){break}else{p=y}}if((a[y]|0)==0){break}else{t=y;m=m+1|0}}}m=c[s>>2]|0;if(m>>>0<(c[r>>2]|0)>>>0){z=m}else{Jv(f,1)|0;z=c[s>>2]|0}c[s>>2]=z+1;a[z]=41}m=c[s>>2]|0;if(m>>>0<(c[r>>2]|0)>>>0){A=m}else{Jv(f,1)|0;A=c[s>>2]|0}a[A]=0;m=c[k>>2]|0;c[s>>2]=m;t=c[248+(c[(c[g>>2]|0)+12>>2]<<2)>>2]|0;p=xF(m|0)|0;nb(q|0,121624,(l=i,i=i+16|0,c[l>>2]=138744,c[l+8>>2]=p,l)|0)|0;i=l;Lv(t,q)|0;Lv(t,m)|0;m=t+4|0;p=c[m>>2]|0;if(p>>>0<(c[t+8>>2]|0)>>>0){B=p}else{Jv(t,1)|0;B=c[m>>2]|0}c[m>>2]=B+1;a[B]=32;}b=c[e>>2]|0;}while((b|0)!=0)}Mv(f);i=d;return}function qC(b,f,j,k){b=b|0;f=f|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;l=i;i=i+3120|0;m=l|0;n=l+1024|0;o=l+2048|0;p=l+3072|0;q=l+3088|0;r=b+16|0;b=c[r>>2]|0;s=+(c[b+136>>2]|0)*3.141592653589793/180.0;if((e[(c[43614]|0)+8232>>1]|0)>>>0<14>>>0){t=b+56|0;u=a[t+3|0]|0;v=d[t]|0;w=d[t+1|0]|0;x=d[t+2|0]|0;if(u<<24>>24==-1){nb(180832,150832,(y=i,i=i+24|0,c[y>>2]=v,c[y+8>>2]=w,c[y+16>>2]=x,y)|0)|0;i=y}else{nb(180832,147960,(y=i,i=i+32|0,c[y>>2]=v,c[y+8>>2]=w,c[y+16>>2]=x,c[y+24>>2]=u&255,y)|0)|0;i=y}u=c[248+(c[(c[r>>2]|0)+12>>2]<<2)>>2]|0;x=m|0;m=xF(180832)|0;nb(x|0,121624,(y=i,i=i+16|0,c[y>>2]=128936,c[y+8>>2]=m,y)|0)|0;i=y;Lv(u,x)|0;Lv(u,180832)|0;x=u+4|0;m=c[x>>2]|0;if(m>>>0<(c[u+8>>2]|0)>>>0){z=m}else{Jv(u,1)|0;z=c[x>>2]|0}c[x>>2]=z+1;a[z]=32;i=l;return}Iv(p,1024,o|0);o=(f|0)==2;f=q|0;if(o){rn(j,f,k,s,2);z=p+4|0;x=c[z>>2]|0;if(x>>>0<(c[p+8>>2]|0)>>>0){A=x}else{Jv(p,1)|0;A=c[z>>2]|0}c[z>>2]=A+1;a[A]=91;eC(p,+h[q>>3],+h[q+8>>3]);eC(p,+h[q+16>>3],+h[q+24>>3])}else{rn(j,f,k,0.0,3);B=+h[q+24>>3];C=+h[q>>3];if(s==0.0){D=+h[q+8>>3];E=C;F=D;G=D;H=B*.25}else{D=B*.25;I=D;J=s;s=C+I*+V(J);K=+h[q+8>>3];E=s;F=K+I*+W(J);G=K;H=D}q=p+4|0;k=c[q>>2]|0;if(k>>>0<(c[p+8>>2]|0)>>>0){L=k}else{Jv(p,1)|0;L=c[q>>2]|0}c[q>>2]=L+1;a[L]=40;eC(p,E,F);L=n|0;nb(L|0,107520,(y=i,i=i+8|0,h[y>>3]=H,y)|0)|0;i=y;q=gb(L|0,46)|0;do{if((q|0)==0){M=n+(xF(L|0)|0)|0}else{k=q;while(1){f=k+1|0;if((a[f]|0)==0){N=k;break}else{k=f}}while(1){k=a[N]|0;if((k<<24>>24|0)==46){O=21;break}else if((k<<24>>24|0)!=48){O=22;break}a[N]=0;N=N-1|0}if((O|0)==21){a[N]=0;M=N;break}else if((O|0)==22){M=N+1|0;break}}}while(0);a[M]=32;a[M+1|0]=0;Lv(p,L)|0;eC(p,C,G);nb(L|0,107520,(y=i,i=i+8|0,h[y>>3]=B,y)|0)|0;i=y;M=gb(L|0,46)|0;do{if((M|0)==0){P=n+(xF(L|0)|0)|0}else{N=M;while(1){q=N+1|0;if((a[q]|0)==0){Q=N;break}else{N=q}}while(1){N=a[Q]|0;if((N<<24>>24|0)==46){O=28;break}else if((N<<24>>24|0)!=48){O=29;break}a[Q]=0;Q=Q-1|0}if((O|0)==28){a[Q]=0;P=Q;break}else if((O|0)==29){P=Q+1|0;break}}}while(0);a[P]=32;a[P+1|0]=0;Lv(p,L)|0;}Lv(p,125744)|0;L=b+140|0;B=+g[L>>2];P=b+56|0;if(B>0.0){rC(p,B,P);rC(p,+g[L>>2],b+96|0)}else{rC(p,0.0,P);rC(p,1.0,b+96|0)}Nv(p)|0;b=p+4|0;P=c[b>>2]|0;L=p+8|0;Q=P>>>0>=(c[L>>2]|0)>>>0;if(o){if(Q){Jv(p,1)|0;R=c[b>>2]|0}else{R=P}c[b>>2]=R+1;a[R]=93}else{if(Q){Jv(p,1)|0;S=c[b>>2]|0}else{S=P}c[b>>2]=S+1;a[S]=41}S=c[b>>2]|0;if(S>>>0<(c[L>>2]|0)>>>0){T=S}else{Jv(p,1)|0;T=c[b>>2]|0}a[T]=0;T=c[p>>2]|0;c[b>>2]=T;b=c[248+(c[(c[r>>2]|0)+12>>2]<<2)>>2]|0;r=n|0;n=xF(T|0)|0;nb(r|0,121624,(y=i,i=i+16|0,c[y>>2]=128936,c[y+8>>2]=n,y)|0)|0;i=y;Lv(b,r)|0;Lv(b,T)|0;T=b+4|0;r=c[T>>2]|0;if(r>>>0<(c[b+8>>2]|0)>>>0){U=r}else{Jv(b,1)|0;U=c[T>>2]|0}c[T>>2]=U+1;a[U]=32;Mv(p);i=l;return}function rC(b,e,f){b=b|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;i=i+2048|0;j=g|0;k=g+1024|0;l=k|0;nb(l|0,123384,(m=i,i=i+8|0,h[m>>3]=e,m)|0)|0;i=m;n=gb(l|0,46)|0;do{if((n|0)==0){o=k+(xF(l|0)|0)|0}else{p=n;while(1){q=p+1|0;if((a[q]|0)==0){r=p;break}else{p=q}}while(1){p=a[r]|0;if((p<<24>>24|0)==46){s=5;break}else if((p<<24>>24|0)!=48){s=6;break}a[r]=0;r=r-1|0}if((s|0)==5){a[r]=0;o=r;break}else if((s|0)==6){o=r+1|0;break}}}while(0);a[o]=32;a[o+1|0]=0;o=f;f=a[o+3|0]|0;r=d[o]|0;s=d[o+1|0]|0;n=d[o+2|0]|0;if(f<<24>>24==-1){nb(180832,150832,(m=i,i=i+24|0,c[m>>2]=r,c[m+8>>2]=s,c[m+16>>2]=n,m)|0)|0;i=m}else{nb(180832,147960,(m=i,i=i+32|0,c[m>>2]=r,c[m+8>>2]=s,c[m+16>>2]=n,c[m+24>>2]=f&255,m)|0)|0;i=m}f=j|0;j=xF(180832)|0;nb(f|0,121624,(m=i,i=i+16|0,c[m>>2]=l,c[m+8>>2]=j,m)|0)|0;i=m;Lv(b,f)|0;Lv(b,180832)|0;f=b+4|0;m=c[f>>2]|0;if(m>>>0<(c[b+8>>2]|0)>>>0){t=m;u=t+1|0;c[f>>2]=u;a[t]=32;v=1024;w=0;i=g;return}Jv(b,1)|0;t=c[f>>2]|0;u=t+1|0;c[f>>2]=u;a[t]=32;v=1024;w=0;i=g;return}function sC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+16>>2]|0;_z(a,121432)|0;e=c[c[a+12>>2]>>2]|0;f=c[e+4>>2]|0;g=c[e+8>>2]|0;dA(a,120504,(h=i,i=i+24|0,c[h>>2]=c[e>>2],c[h+8>>2]=f,c[h+16>>2]=g,h)|0);i=h;g=$w(c[d+8>>2]|0)|0;dA(a,119856,(h=i,i=i+8|0,c[h>>2]=g,h)|0);i=h;g=da(c[a+168>>2]|0,c[a+164>>2]|0)|0;dA(a,119024,(h=i,i=i+8|0,c[h>>2]=g,h)|0);i=h;_z(a,118192)|0;_z(a,117384)|0;_z(a,116304)|0;_z(a,115360)|0;_z(a,114160)|0;_z(a,113456)|0;_z(a,112904)|0;_z(a,112424)|0;_z(a,111856)|0;i=b;return}function tC(a){a=a|0;_z(a,122640)|0;return}function uC(a){a=a|0;c[53842]=2;return}function vC(a){a=a|0;c[53842]=1;return}function wC(a){a=a|0;c[53842]=2;return}function xC(a){a=a|0;c[53842]=0;return}function yC(a){a=a|0;c[53842]=2;return}function zC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=c[(c[b+16>>2]|0)+16>>2]|0;j=c[53842]|0;k=c[e+4>>2]|0;l=+h[k+16>>3]*+h[b+352>>3];m=(c[b+360>>2]|0)!=0?1.5707963267948966:0.0;n=c[k+8>>2]|0;if((n|0)==0){o=-1}else{o=c[n+20>>2]|0}n=a[e+48|0]|0;if((n|0)==108){p=0}else if((n|0)==114){p=2}else{p=1}q=+h[d>>3];if(q<0.0){r=q+-.5}else{r=q+.5}n=~~r;r=+h[d+8>>3];if(r<0.0){s=r+-.5}else{s=r+.5}d=~~s;k=c[e>>2]|0;e=c[44766]|0;if((e|0)==0){c[44764]=64;t=dF(64)|0;c[44766]=t;u=t}else{u=e}e=a[k]|0;if(e<<24>>24==0){v=u}else{t=0;w=u;u=k;k=e;while(1){e=u+1|0;x=c[44764]|0;if((t|0)>(x-8|0)){y=x<<1;c[44764]=y;x=gF(c[44766]|0,y)|0;c[44766]=x;z=x+t|0}else{z=w}if(k<<24>>24>-1){if(k<<24>>24==92){a[z]=92;A=z+1|0;B=t+1|0}else{A=z;B=t}a[A]=k;C=A+1|0;D=B+1|0}else{a[z]=92;nb(z+1|0,124960,(E=i,i=i+8|0,c[E>>2]=k&255,E)|0)|0;i=E;C=z+4|0;D=t+4|0}x=a[e]|0;if(x<<24>>24==0){v=C;break}else{t=D;w=C;u=e;k=x}}}a[v]=0;v=c[44766]|0;dA(b,127968,(E=i,i=i+112|0,c[E>>2]=4,c[E+8>>2]=p,c[E+16>>2]=g,c[E+24>>2]=j,c[E+32>>2]=0,c[E+40>>2]=o,h[E+48>>3]=l,h[E+56>>3]=m,c[E+64>>2]=6,h[E+72>>3]=0.0,h[E+80>>3]=0.0,c[E+88>>2]=n,c[E+96>>2]=d,c[E+104>>2]=v,E)|0);i=E;i=f;return}function AC(e,f){e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=i;h=f+32|0;j=c[h>>2]|0;if((j|0)==5){k=c[f>>2]|0;l=a[k]|0;m=0;n=122104;while(1){if((a[n]|0)==l<<24>>24){if((Ya(n|0,k|0)|0)==0){break}}o=m+1|0;if((o|0)==8){p=17;break}else{m=o;n=c[25944+(o<<2)>>2]|0}}if((p|0)==17){c[h>>2]=6;i=g;return}c[f>>2]=m;c[h>>2]=6;i=g;return}else if((j|0)==1){j=f;m=f;n=a[m]|0;k=n&255;l=j+1|0;o=a[l]|0;q=o&255;r=j+2|0;j=a[r]|0;s=j&255;t=c[44768]|0;do{if((t|0)>0){u=-1;v=0;w=195075;while(1){x=(b[179080+(v<<1)>>1]|0)-k|0;y=(b[179592+(v<<1)>>1]|0)-q|0;z=(b[180104+(v<<1)>>1]|0)-s|0;A=(da(y,y)|0)+(da(x,x)|0)+(da(z,z)|0)|0;if((A|0)<(w|0)){if((A|0)==0){B=v;break}else{C=A;D=v}}else{C=w;D=u}E=v+1|0;if((E|0)<(t|0)){u=D;v=E;w=C}else{p=12;break}}if((p|0)==12){c[44768]=t+1;if((t|0)==256){B=D}else{F=E;p=14;break}}G=B+32|0}else{c[44768]=t+1;F=0;p=14}}while(0);if((p|0)==14){b[179080+(F<<1)>>1]=n&255;b[179592+(F<<1)>>1]=o&255;b[180104+(F<<1)>>1]=j&255;j=F+32|0;F=d[m]|0;m=d[l]|0;l=d[r]|0;dA(e,132936,(e=i,i=i+40|0,c[e>>2]=0,c[e+8>>2]=j,c[e+16>>2]=F,c[e+24>>2]=m,c[e+32>>2]=l,e)|0);i=e;G=j}c[f>>2]=G;c[h>>2]=6;i=g;return}else{cc(130760,147224,165,170632)}}function BC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;e=i;f=c[a+16>>2]|0;g=~~+h[f+152>>3];j=c[f+16>>2]|0;k=c[f+56>>2]|0;l=c[53842]|0;m=(d|0)!=0?20:-1;d=c[f+144>>2]|0;if((d|0)==1){n=10.0;o=1}else if((d|0)==2){n=10.0;o=2}else{n=0.0;o=0}p=+h[b>>3];if(p<0.0){q=p+-.5}else{q=p+.5}d=~~q;q=+h[b+8>>3];if(q<0.0){r=q+-.5}else{r=q+.5}f=~~r;r=+h[b+16>>3];s=r-p;if(s<0.0){t=s+-.5}else{t=s+.5}s=+h[b+24>>3];p=s-q;if(p<0.0){u=p+-.5}else{u=p+.5}if(r<0.0){v=r+-.5}else{v=r+.5}if(s<0.0){w=s+-.5}else{w=s+.5}dA(a,135256,(a=i,i=i+160|0,c[a>>2]=1,c[a+8>>2]=1,c[a+16>>2]=o,c[a+24>>2]=g,c[a+32>>2]=j,c[a+40>>2]=k,c[a+48>>2]=l,c[a+56>>2]=0,c[a+64>>2]=m,h[a+72>>3]=n,c[a+80>>2]=0,h[a+88>>3]=0.0,c[a+96>>2]=d,c[a+104>>2]=f,c[a+112>>2]=~~t,c[a+120>>2]=~~u,c[a+128>>2]=d,c[a+136>>2]=f,c[a+144>>2]=~~v,c[a+152>>2]=~~w,a)|0);i=a;i=e;return}function CC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0;f=i;g=c[a+16>>2]|0;j=~~+h[g+152>>3];k=c[g+16>>2]|0;l=c[g+56>>2]|0;m=c[53842]|0;n=(e|0)!=0?20:-1;e=d+1|0;o=c[g+144>>2]|0;if((o|0)==1){p=10.0;q=1}else if((o|0)==2){p=10.0;q=2}else{p=0.0;q=0}dA(a,162144,(o=i,i=i+128|0,c[o>>2]=2,c[o+8>>2]=3,c[o+16>>2]=q,c[o+24>>2]=j,c[o+32>>2]=k,c[o+40>>2]=l,c[o+48>>2]=m,c[o+56>>2]=0,c[o+64>>2]=n,h[o+72>>3]=p,c[o+80>>2]=0,c[o+88>>2]=0,c[o+96>>2]=0,c[o+104>>2]=0,c[o+112>>2]=0,c[o+120>>2]=e,o)|0);i=o;GC(a,b,d,1);i=f;return}function DC(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0;f=i;i=i+80|0;e=f|0;j=f+64|0;k=c[a+16>>2]|0;l=~~+h[k+152>>3];m=c[k+16>>2]|0;n=c[53842]|0;if((d|0)<=3){cc(150216,147224,356,170656)}o=dF((d*140|0)+140|0)|0;p=c[k+144>>2]|0;if((p|0)==2){q=10.0;r=2}else if((p|0)==1){q=10.0;r=1}else{q=0.0;r=0}if((g|0)==0){s=4;t=0;u=-1}else{s=5;t=c[k+56>>2]|0;u=20}v=+h[b>>3];k=e+48|0;h[k>>3]=v;w=+h[b+8>>3];g=e+56|0;h[g>>3]=w;if(v<0.0){x=v+-.5}else{x=v+.5}if(w<0.0){y=w+-.5}else{y=w+.5}p=nb(o|0,158264,(z=i,i=i+16|0,c[z>>2]=~~x,c[z+8>>2]=~~y,z)|0)|0;i=z;A=e|0;B=e;C=k;k=j|0;D=j+8|0;E=0;F=1;G=o+p|0;p=3;while(1){c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];H=E+1|0;h[e+16>>3]=+h[b+(H<<4)>>3];h[e+24>>3]=+h[b+(H<<4)+8>>3];H=E+2|0;h[e+32>>3]=+h[b+(H<<4)>>3];h[e+40>>3]=+h[b+(H<<4)+8>>3];H=E+3|0;h[e+48>>3]=+h[b+(H<<4)>>3];h[g>>3]=+h[b+(H<<4)+8>>3];H=1;I=G;do{Qm(j,A,3,+(H|0)/6.0,0,0);y=+h[k>>3];x=+h[D>>3];if(y<0.0){J=y+-.5}else{J=y+.5}if(x<0.0){K=x+-.5}else{K=x+.5}L=nb(I|0,158264,(z=i,i=i+16|0,c[z>>2]=~~J,c[z+8>>2]=~~K,z)|0)|0;i=z;I=I+L|0;H=H+1|0;}while((H|0)<7);M=F+6|0;H=p+3|0;if((H|0)<(d|0)){E=p;F=M;G=I;p=H}else{break}}dA(a,144016,(z=i,i=i+112|0,c[z>>2]=3,c[z+8>>2]=s,c[z+16>>2]=r,c[z+24>>2]=l,c[z+32>>2]=m,c[z+40>>2]=t,c[z+48>>2]=n,c[z+56>>2]=0,c[z+64>>2]=u,h[z+72>>3]=q,c[z+80>>2]=0,c[z+88>>2]=0,c[z+96>>2]=0,c[z+104>>2]=M,z)|0);i=z;dA(a,140952,(z=i,i=i+8|0,c[z>>2]=o,z)|0);i=z;eF(o);if((M|0)<=0){N=_z(a,153232)|0;i=f;return}o=F+5|0;F=0;do{dA(a,138080,(z=i,i=i+8|0,c[z>>2]=((F|0)%(o|0)|0|0)!=0,z)|0);i=z;F=F+1|0;}while((F|0)<(M|0));N=_z(a,153232)|0;i=f;return}function EC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0.0,r=0.0;e=i;f=c[a+16>>2]|0;g=~~+h[f+152>>3];j=c[f+16>>2]|0;k=c[53842]|0;l=c[f+144>>2]|0;if((l|0)==1){m=10.0;n=1}else if((l|0)==2){m=10.0;n=2}else{m=0.0;n=0}dA(a,162144,(l=i,i=i+128|0,c[l>>2]=2,c[l+8>>2]=1,c[l+16>>2]=n,c[l+24>>2]=g,c[l+32>>2]=j,c[l+40>>2]=0,c[l+48>>2]=k,c[l+56>>2]=0,c[l+64>>2]=0,h[l+72>>3]=m,c[l+80>>2]=0,c[l+88>>2]=0,c[l+96>>2]=0,c[l+104>>2]=0,c[l+112>>2]=0,c[l+120>>2]=d,l)|0);i=l;if((d|0)>0){o=0}else{p=_z(a,153232)|0;i=e;return}do{m=+h[b+(o<<4)>>3];if(m<0.0){q=m+-.5}else{q=m+.5}m=+h[b+(o<<4)+8>>3];if(m<0.0){r=m+-.5}else{r=m+.5}dA(a,158264,(l=i,i=i+16|0,c[l>>2]=~~q,c[l+8>>2]=~~r,l)|0);i=l;o=o+1|0;}while((o|0)<(d|0));p=_z(a,153232)|0;i=e;return}function FC(a,b){a=a|0;b=b|0;var d=0;d=i;dA(a,166272,(a=i,i=i+8|0,c[a>>2]=b,a)|0);i=a;i=d;return}function GC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;f=i;if((d|0)>0){g=0;do{j=+h[b+(g<<4)>>3];if(j<0.0){k=j+-.5}else{k=j+.5}j=+h[b+(g<<4)+8>>3];if(j<0.0){l=j+-.5}else{l=j+.5}dA(a,158264,(m=i,i=i+16|0,c[m>>2]=~~k,c[m+8>>2]=~~l,m)|0);i=m;g=g+1|0;}while((g|0)<(d|0))}if((e|0)==0){n=_z(a,153232)|0;i=f;return}l=+h[b>>3];if(l<0.0){o=l+-.5}else{o=l+.5}l=+h[b+8>>3];if(l<0.0){p=l+-.5}else{p=l+.5}dA(a,158264,(m=i,i=i+16|0,c[m>>2]=~~o,c[m+8>>2]=~~p,m)|0);i=m;n=_z(a,153232)|0;i=f;return}function HC(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b+16>>2]|0;e=c[b+64>>2]|0;if((e|0)==0){_z(b,116088)|0;f=d+208|0;g=c[f>>2]|0;if((g|0)==0){return}if((a[g]|0)==0){return}_z(b,114904)|0;_z(b,gk(c[f>>2]|0)|0)|0;_z(b,164480)|0;return}else if((e|0)==3){f=gk($w(c[d+8>>2]|0)|0)|0;_z(b,113328)|0;_z(b,f)|0;_z(b,112792)|0;_z(b,f)|0;_z(b,117936)|0;return}else if((e|0)==1){e=d+208|0;f=c[e>>2]|0;if((f|0)==0){return}if((a[f]|0)==0){return}_z(b,114904)|0;_z(b,gk(c[e>>2]|0)|0)|0;_z(b,114024)|0;_z(b,gk($w(c[d+8>>2]|0)|0)|0)|0;_z(b,164480)|0;return}else{return}}function IC(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;d=c[a+64>>2]|0;if((d|0)==3){KC(a,c[b+264>>2]|0,c[b+272>>2]|0,c[b+268>>2]|0,c[b+208>>2]|0,c[b+228>>2]|0,c[b+244>>2]|0,c[b+212>>2]|0);_z(a,117232)|0;return}else if((d|0)==2){KC(a,c[b+264>>2]|0,c[b+272>>2]|0,c[b+268>>2]|0,c[b+208>>2]|0,c[b+228>>2]|0,c[b+244>>2]|0,c[b+212>>2]|0);return}else{return}}function JC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;g=c[a+16>>2]|0;KC(a,c[g+264>>2]|0,c[g+272>>2]|0,c[g+268>>2]|0,b,d,e,f);return}function KC(b,d,e,f,g,j,k,l){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;var m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;m=i;if((e|0)==0|(f|0)==0){i=m;return}if((c[44374]|0)<(f|0)){n=f+10|0;c[44374]=n;c[44376]=gF(c[44376]|0,n<<3)|0}n=(f|0)>0;if(n){o=0;do{p=+h[e+(o<<4)>>3];if(p<0.0){q=p+-.5}else{q=p+.5}c[(c[44376]|0)+(o<<3)>>2]=~~q;p=+h[e+(o<<4)+8>>3];if(p<0.0){r=p+-.5}else{r=p+.5}c[(c[44376]|0)+(o<<3)+4>>2]=~~r;o=o+1|0;}while((o|0)<(f|0))}o=b+64|0;e=c[o>>2]|0;s=(g|0)==0;do{if(!((e|0)!=0|s)){if((a[g]|0)==0){break}if((d|0)==2){dA(b,78672,(t=i,i=i+8|0,c[t>>2]=g,t)|0);i=t;if(n){u=0;do{v=c[44376]|0;w=c[v+(u<<3)+4>>2]|0;dA(b,168600,(t=i,i=i+16|0,c[t>>2]=c[v+(u<<3)>>2],c[t+8>>2]=w,t)|0);i=t;u=u+1|0;}while((u|0)<(f|0))}_z(b,164480)|0;i=m;return}else if((d|0)==1){u=c[44376]|0;w=c[u>>2]|0;v=c[u+4>>2]|0;x=(c[u+8>>2]|0)-w|0;dA(b,83016,(t=i,i=i+32|0,c[t>>2]=g,c[t+8>>2]=w,c[t+16>>2]=v,c[t+24>>2]=x,t)|0);i=t;i=m;return}else if((d|0)==0){x=c[44376]|0;v=c[x>>2]|0;w=c[x+12>>2]|0;u=c[x+8>>2]|0;y=c[x+4>>2]|0;dA(b,87896,(t=i,i=i+40|0,c[t>>2]=g,c[t+8>>2]=v,c[t+16>>2]=w,c[t+24>>2]=u,c[t+32>>2]=y,t)|0);i=t;i=m;return}else{cc(160496,156352,65,170312)}}}while(0);do{if(!((e|0)!=1|s)){if((a[g]|0)==0){break}if((d|0)!=0){cc(160496,156352,77,170312)}n=c[44376]|0;y=c[n+12>>2]|0;u=c[n+8>>2]|0;w=c[n+4>>2]|0;dA(b,151872,(t=i,i=i+48|0,c[t>>2]=c[n>>2],c[t+8>>2]=y,c[t+16>>2]=u,c[t+24>>2]=w,c[t+32>>2]=g,c[t+40>>2]=j,t)|0);i=t;i=m;return}}while(0);if((e-2|0)>>>0>=2>>>0){i=m;return}if((d|0)==2){_z(b,142952)|0}else if((d|0)==1){_z(b,149056)|0}else if((d|0)==0){_z(b,145920)|0}else{cc(160496,156352,93,170312)}do{if((l|0)!=0){if((a[l]|0)==0){break}_z(b,139840)|0;_z(b,ik(l)|0)|0;_z(b,137160)|0}}while(0);do{if(!s){if((a[g]|0)==0){break}_z(b,134264)|0;_z(b,ik(g)|0)|0;_z(b,137160)|0}}while(0);do{if((k|0)!=0){if((a[k]|0)==0){break}_z(b,132288)|0;_z(b,gk(k)|0)|0;_z(b,137160)|0}}while(0);do{if((j|0)!=0){if((a[j]|0)==0){break}_z(b,129944)|0;_z(b,gk(j)|0)|0;_z(b,137160)|0}}while(0);_z(b,126808)|0;_z(b,124240)|0;do{if((d|0)==0){j=c[44376]|0;k=c[j+12>>2]|0;g=c[j+8>>2]|0;s=c[j+4>>2]|0;dA(b,121200,(t=i,i=i+32|0,c[t>>2]=c[j>>2],c[t+8>>2]=k,c[t+16>>2]=g,c[t+24>>2]=s,t)|0);i=t}else if((d|0)==2){s=c[44376]|0;g=c[s+4>>2]|0;dA(b,120328,(t=i,i=i+16|0,c[t>>2]=c[s>>2],c[t+8>>2]=g,t)|0);i=t;if((f|0)>1){z=1}else{break}do{g=c[44376]|0;s=c[g+(z<<3)+4>>2]|0;dA(b,119600,(t=i,i=i+16|0,c[t>>2]=c[g+(z<<3)>>2],c[t+8>>2]=s,t)|0);i=t;z=z+1|0;}while((z|0)<(f|0))}else if((d|0)==1){s=c[44376]|0;g=c[s>>2]|0;k=c[s+4>>2]|0;j=(c[s+8>>2]|0)-g|0;dA(b,122008,(t=i,i=i+24|0,c[t>>2]=g,c[t+8>>2]=k,c[t+16>>2]=j,t)|0);i=t}}while(0);if((c[o>>2]|0)==3){_z(b,118832)|0;i=m;return}else{_z(b,117936)|0;i=m;return}}function LC(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;_z(a,132568)|0;if((c[a+64>>2]|0)==2){_z(a,132408)|0}else{_z(a,136984)|0}d=c[c[a+12>>2]>>2]|0;e=c[d+4>>2]|0;f=c[d+8>>2]|0;dA(a,132168,(a=i,i=i+24|0,c[a>>2]=c[d>>2],c[a+8>>2]=e,c[a+16>>2]=f,a)|0);i=a;i=b;return}function MC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0;b=i;_z(a,133184)|0;d=a+64|0;e=a+12|0;if((c[d>>2]|0)!=2){dA(a,133040,(f=i,i=i+8|0,c[f>>2]=c[(c[e>>2]|0)+28>>2],f)|0);i=f}if((c[(c[e>>2]|0)+20>>2]|0)!=0){g=_z(a,132856)|0;h=_z(a,132728)|0;i=b;return}if((c[d>>2]|0)==2){g=_z(a,132856)|0;h=_z(a,132728)|0;i=b;return}d=c[a+476>>2]|0;e=c[a+480>>2]|0;j=c[a+484>>2]|0;dA(a,99424,(f=i,i=i+32|0,c[f>>2]=c[a+472>>2],c[f+8>>2]=d,c[f+16>>2]=e,c[f+24>>2]=j,f)|0);i=f;g=_z(a,132856)|0;h=_z(a,132728)|0;i=b;return}function NC(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+8|0;e=d|0;f=c[b+16>>2]|0;a[11864]=0;g=b+12|0;h=f+8|0;do{if((c[(c[g>>2]|0)+28>>2]|0)==0){j=$w(c[h>>2]|0)|0;dA(b,101240,(k=i,i=i+8|0,c[k>>2]=j,k)|0);i=k;j=b+64|0;if((c[j>>2]|0)==2){_z(b,100376)|0}else{_z(b,100784)|0}do{if((c[(c[g>>2]|0)+20>>2]|0)==0){if((c[j>>2]|0)==2){l=c[b+460>>2]|0;m=c[b+464>>2]|0;n=c[b+468>>2]|0;dA(b,99424,(k=i,i=i+32|0,c[k>>2]=c[b+456>>2],c[k+8>>2]=l,c[k+16>>2]=m,c[k+24>>2]=n,k)|0);i=k;break}else{_z(b,99824)|0;break}}}while(0);_z(b,99008)|0;al(b,c[(c[g>>2]|0)+24>>2]|0,12448);cl(b);j=c[(c[g>>2]|0)+20>>2]|0;if((j|0)==0){break}n=e|0;c[n>>2]=c[j>>2];c[e+4>>2]=0;al(b,0,n)}}while(0);c[44678]=(a[(c[(c[h>>2]|0)+8>>2]|0)+115|0]|0)==1;if(!(a[11864]|0)){_z(b,98584)|0;a[11864]=1}h=c[f+208>>2]|0;if((h|0)==0){i=d;return}dA(b,97984,(k=i,i=i+8|0,c[k>>2]=h,k)|0);i=k;i=d;return}function OC(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;b=i;dA(a,101960,(a=i,i=i+16|0,c[a>>2]=d,c[a+8>>2]=e,a)|0);i=a;i=b;return}function PC(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0;b=i;d=c[a+456>>2]|0;e=c[a+460>>2]|0;f=c[a+464>>2]|0;g=c[a+468>>2]|0;j=a+12|0;k=(c[(c[j>>2]|0)+28>>2]|0)+1|0;dA(a,108832,(l=i,i=i+16|0,c[l>>2]=k,c[l+8>>2]=k,l)|0);i=l;if((c[(c[j>>2]|0)+20>>2]|0)==0){dA(a,107856,(l=i,i=i+32|0,c[l>>2]=d,c[l+8>>2]=e,c[l+16>>2]=f,c[l+24>>2]=g,l)|0);i=l}k=a+360|0;dA(a,107112,(l=i,i=i+8|0,c[l>>2]=(c[k>>2]|0)!=0?106440:106024,l)|0);i=l;m=a+64|0;if((c[m>>2]|0)==1){dA(a,105504,(l=i,i=i+16|0,c[l>>2]=f,c[l+8>>2]=g,l)|0);i=l}n=c[a+200>>2]|0;o=c[a+204>>2]|0;dA(a,105112,(l=i,i=i+24|0,c[l>>2]=c[a+196>>2],c[l+8>>2]=n,c[l+16>>2]=o,l)|0);i=l;if((c[(c[j>>2]|0)+20>>2]|0)==0){dA(a,104664,(l=i,i=i+32|0,c[l>>2]=d,c[l+8>>2]=e,c[l+16>>2]=f-d,c[l+24>>2]=g-e,l)|0);i=l}p=+h[a+496>>3];o=c[k>>2]|0;q=+h[a+504>>3];r=+h[a+512>>3];dA(a,104176,(l=i,i=i+40|0,h[l>>3]=+h[a+488>>3],h[l+8>>3]=p,c[l+16>>2]=o,h[l+24>>3]=q,h[l+32>>3]=r,l)|0);i=l;if((c[m>>2]|0)!=1){i=b;return}if((f|0)>14399|(g|0)>14399){Dc[c[(c[j>>2]|0)+16>>2]&63](103504,(l=i,i=i+24|0,c[l>>2]=f,c[l+8>>2]=g,c[l+16>>2]=14400,l)|0);i=l}dA(a,102872,(l=i,i=i+32|0,c[l>>2]=d,c[l+8>>2]=e,c[l+16>>2]=f,c[l+24>>2]=g,l)|0);i=l;i=b;return}function QC(a){a=a|0;var b=0,d=0;b=i;d=a+12|0;if((c[(c[d>>2]|0)+20>>2]|0)!=0){_z(a,111704)|0;al(a,0,(c[(c[d>>2]|0)+20>>2]|0)+4|0)}_z(a,111072)|0;_z(a,110400)|0;dA(a,109656,(a=i,i=i+8|0,c[a>>2]=c[(c[d>>2]|0)+28>>2],a)|0);i=a;i=b;return}function RC(a){a=a|0;var b=0,d=0,e=0;b=i;d=$w(c[(c[a+16>>2]|0)+8>>2]|0)|0;dA(a,112328,(e=i,i=i+8|0,c[e>>2]=d,e)|0);i=e;_z(a,112784)|0;i=b;return}function SC(a){a=a|0;_z(a,113304)|0;return}function TC(a){a=a|0;_z(a,112784)|0;return}function UC(a){a=a|0;_z(a,113304)|0;return}function VC(a){a=a|0;_z(a,112784)|0;return}function WC(a){a=a|0;_z(a,113304)|0;return}function XC(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;f=i;if((b|0)==0){i=f;return}e=(c[a+16>>2]|0)+272|0;if((c[e>>2]|0)==0){i=f;return}_z(a,116072)|0;gA(a,c[e>>2]|0,2);_z(a,114760)|0;e=dl(b,c[44678]|0)|0;dA(a,113928,(a=i,i=i+8|0,c[a>>2]=e,a)|0);i=a;i=f;return}function YC(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0,p=0;f=i;g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=c[b+16>>2]|0;if(+h[g+40>>3]<.5){i=f;return}j=c[g+4>>2]|0;if((j|0)==0|(j|0)==1){k=155304}else if((j|0)==2){k=151736}else if((j|0)==3){k=148880}else{k=145744}l=+h[g+24>>3];m=+h[g+32>>3];dA(b,142720,(j=i,i=i+32|0,h[j>>3]=+h[g+16>>3],h[j+8>>3]=l,h[j+16>>3]=m,c[j+24>>2]=k,j)|0);i=j;k=e+4|0;eA(b,+h[(c[k>>2]|0)+16>>3]);dA(b,118808,(j=i,i=i+8|0,c[j>>2]=c[c[k>>2]>>2],j)|0);i=j;k=dl(c[e>>2]|0,c[44678]|0)|0;g=a[e+48|0]|0;if((g|0)==114){n=e+32|0;o=d|0;h[o>>3]=+h[o>>3]- +h[n>>3];p=n}else if((g|0)==108){p=e+32|0}else{g=e+32|0;n=d|0;h[n>>3]=+h[n>>3]- +h[g>>3]*.5;p=g}g=d+8|0;h[g>>3]=+h[e+24>>3]+ +h[g>>3];fA(b,d);_z(b,117912)|0;eA(b,+h[p>>3]);dA(b,117208,(j=i,i=i+8|0,c[j>>2]=k,j)|0);i=j;i=f;return}function ZC(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0;e=i;i=i+32|0;f=e|0;g=f|0;j=f;k=b;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];h[f+16>>3]=+h[b+16>>3]- +h[b>>3];h[f+24>>3]=+h[b+24>>3]- +h[b+8>>3];b=a+16|0;do{if((d|0)!=0){f=c[b>>2]|0;if(+h[f+80>>3]<=.5){break}k=c[f+4>>2]|0;if((k|0)==3){l=148880}else if((k|0)==0|(k|0)==1){l=155304}else if((k|0)==2){l=151736}else{l=145744}m=+h[f+64>>3];n=+h[f+72>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[f+56>>3],h[o+8>>3]=m,h[o+16>>3]=n,c[o+24>>2]=l,o)|0);i=o;gA(a,g,2);_z(a,120296)|0}}while(0);if(+h[(c[b>>2]|0)+40>>3]<=.5){i=e;return}dD(a);l=c[b>>2]|0;b=c[l+4>>2]|0;if((b|0)==0|(b|0)==1){p=155304}else if((b|0)==2){p=151736}else if((b|0)==3){p=148880}else{p=145744}n=+h[l+24>>3];m=+h[l+32>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[l+16>>3],h[o+8>>3]=n,h[o+16>>3]=m,c[o+24>>2]=p,o)|0);i=o;gA(a,g,2);_z(a,119568)|0;i=e;return}function _C(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0;f=i;g=a+16|0;do{if((e|0)!=0){j=c[g>>2]|0;if(+h[j+80>>3]<=.5){break}k=c[j+4>>2]|0;if((k|0)==0|(k|0)==1){l=155304}else if((k|0)==3){l=148880}else if((k|0)==2){l=151736}else{l=145744}m=+h[j+64>>3];n=+h[j+72>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[j+56>>3],h[o+8>>3]=m,h[o+16>>3]=n,c[o+24>>2]=l,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){j=1;do{fA(a,b+(j<<4)|0);_z(a,129864)|0;j=j+1|0;}while((j|0)<(d|0))}_z(a,121960)|0}}while(0);if(+h[(c[g>>2]|0)+40>>3]<=.5){i=f;return}dD(a);l=c[g>>2]|0;g=c[l+4>>2]|0;if((g|0)==3){p=148880}else if((g|0)==0|(g|0)==1){p=155304}else if((g|0)==2){p=151736}else{p=145744}n=+h[l+24>>3];m=+h[l+32>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[l+16>>3],h[o+8>>3]=n,h[o+16>>3]=m,c[o+24>>2]=p,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){o=1;do{fA(a,b+(o<<4)|0);_z(a,129864)|0;o=o+1|0;}while((o|0)<(d|0))}_z(a,121168)|0;i=f;return}function $C(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0;f=i;e=a+16|0;do{if((g|0)!=0){j=c[e>>2]|0;if(+h[j+80>>3]<=.5){break}k=c[j+4>>2]|0;if((k|0)==3){l=148880}else if((k|0)==0|(k|0)==1){l=155304}else if((k|0)==2){l=151736}else{l=145744}m=+h[j+64>>3];n=+h[j+72>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[j+56>>3],h[o+8>>3]=m,h[o+16>>3]=n,c[o+24>>2]=l,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){j=1;do{gA(a,b+(j<<4)|0,3);_z(a,124072)|0;j=j+3|0;}while((j|0)<(d|0))}_z(a,121960)|0}}while(0);if(+h[(c[e>>2]|0)+40>>3]<=.5){i=f;return}dD(a);l=c[e>>2]|0;e=c[l+4>>2]|0;if((e|0)==0|(e|0)==1){p=155304}else if((e|0)==3){p=148880}else if((e|0)==2){p=151736}else{p=145744}n=+h[l+24>>3];m=+h[l+32>>3];dA(a,142720,(o=i,i=i+32|0,h[o>>3]=+h[l+16>>3],h[o+8>>3]=n,h[o+16>>3]=m,c[o+24>>2]=p,o)|0);i=o;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){o=1;do{gA(a,b+(o<<4)|0,3);_z(a,124072)|0;o=o+3|0;}while((o|0)<(d|0))}_z(a,126584)|0;i=f;return}function aD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0;e=i;f=a+16|0;if(+h[(c[f>>2]|0)+40>>3]<=.5){i=e;return}dD(a);g=c[f>>2]|0;f=c[g+4>>2]|0;if((f|0)==0|(f|0)==1){j=155304}else if((f|0)==2){j=151736}else if((f|0)==3){j=148880}else{j=145744}k=+h[g+24>>3];l=+h[g+32>>3];dA(a,142720,(f=i,i=i+32|0,h[f>>3]=+h[g+16>>3],h[f+8>>3]=k,h[f+16>>3]=l,c[f+24>>2]=j,f)|0);i=f;_z(a,134072)|0;fA(a,b);_z(a,132112)|0;if((d|0)>1){f=1;do{fA(a,b+(f<<4)|0);_z(a,129864)|0;f=f+1|0;}while((f|0)<(d|0))}_z(a,126584)|0;i=e;return}function bD(a,b){a=a|0;b=b|0;_z(a,139632)|0;_z(a,b)|0;_z(a,136984)|0;return}function cD(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0;g=i;j=a+16|0;do{if((f|0)!=0){k=c[j>>2]|0;if(+h[k+80>>3]<=.5){break}l=c[k+4>>2]|0;if((l|0)==3){m=148880}else if((l|0)==2){m=151736}else if((l|0)==0|(l|0)==1){m=155304}else{m=145744}n=+h[k+64>>3];o=+h[k+72>>3];dA(a,142720,(p=i,i=i+32|0,h[p>>3]=+h[k+56>>3],h[p+8>>3]=n,h[p+16>>3]=o,c[p+24>>2]=m,p)|0);i=p;_z(a,109360)|0;gA(a,d,e);_z(a,103496)|0;fA(a,d);dA(a,97968,(p=i,i=i+16|0,c[p>>2]=e,c[p+8>>2]=b,p)|0);i=p}}while(0);if(+h[(c[j>>2]|0)+40>>3]<=.5){i=g;return}dD(a);m=c[j>>2]|0;j=c[m+4>>2]|0;if((j|0)==3){q=148880}else if((j|0)==0|(j|0)==1){q=155304}else if((j|0)==2){q=151736}else{q=145744}o=+h[m+24>>3];n=+h[m+32>>3];dA(a,142720,(p=i,i=i+32|0,h[p>>3]=+h[m+16>>3],h[p+8>>3]=o,h[p+16>>3]=n,c[p+24>>2]=q,p)|0);i=p;_z(a,109360)|0;gA(a,d,e);_z(a,103496)|0;fA(a,d);dA(a,92464,(p=i,i=i+16|0,c[p>>2]=e,c[p+8>>2]=b,p)|0);i=p;i=g;return}function dD(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=b+16|0;f=c[e>>2]|0;g=c[f+160>>2]|0;eA(b,+h[f+152>>3]);_z(b,87088)|0;if((g|0)==0){i=d;return}else{j=g}while(1){g=j+4|0;f=c[j>>2]|0;if((f|0)==0){break}if((Ya(f|0,82336)|0)==0){j=g;continue}else{k=f}while(1){l=k+1|0;if((a[k]|0)==0){break}else{k=l}}if((a[l]|0)!=0){m=l;while(1){dA(b,168384,(n=i,i=i+8|0,c[n>>2]=m,n)|0);i=n;o=m;while(1){p=o+1|0;if((a[o]|0)==0){break}else{o=p}}if((a[p]|0)==0){break}else{m=p}}}if((Ya(f|0,164240)|0)==0){h[(c[e>>2]|0)+152>>3]=0.0}dA(b,160288,(n=i,i=i+8|0,c[n>>2]=f,n)|0);i=n;j=g}i=d;return}
+
+
+
+function fq(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=e+8|0;g=(c[f>>2]|0)+157|0;if((a[g]|0)!=0){return}a[g]=1;a[(c[f>>2]|0)+158|0]=1;g=mw(d,e)|0;if((g|0)!=0){e=g;while(1){g=ow(d,e)|0;h=e;i=c[h>>2]&3;j=e-32|0;k=c[((i|0)==2?e:j)+28>>2]|0;l=c[k+8>>2]|0;do{if((a[l+158|0]|0)==0){if((a[l+157|0]|0)!=0){break}fq(d,k)}else{m=e+32|0;n=uw(d,k,c[((i|0)==3?e:m)+28>>2]|0,0,0)|0;if((n|0)==0){o=c[h>>2]&3;p=uw(d,c[((o|0)==2?e:j)+28>>2]|0,c[((o|0)==3?e:m)+28>>2]|0,0,1)|0}else{p=n}n=c[e+8>>2]|0;m=b[n+170>>1]|0;o=c[n+156>>2]|0;n=p+8|0;q=(c[n>>2]|0)+170|0;r=b[q>>1]|0;b[q>>1]=(r&65535)>>>0>(m&65535)>>>0?r:m;m=(c[n>>2]|0)+156|0;c[m>>2]=(c[m>>2]|0)+o;Gx(d,e|0)|0}}while(0);if((g|0)==0){break}else{e=g}}}a[(c[f>>2]|0)+158|0]=0;return}function gq(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;h=uw(a,d,e,0,0)|0;do{if((h|0)==0){j=uw(a,e,d,0,0)|0;if((j|0)!=0){k=j;break}j=uw(a,d,e,0,1)|0;if((j|0)!=0){k=j;break}j=$w(d|0)|0;l=$w(e|0)|0;Fv(1,160112,(m=i,i=i+16|0,c[m>>2]=j,c[m+8>>2]=l,m)|0)|0;i=m;i=g;return}else{k=h}}while(0);h=c[f+8>>2]|0;f=b[h+170>>1]|0;e=c[h+156>>2]|0;h=k+8|0;k=(c[h>>2]|0)+170|0;d=b[k>>1]|0;b[k>>1]=(d&65535)>>>0>(f&65535)>>>0?d:f;f=(c[h>>2]|0)+156|0;c[f>>2]=(c[f>>2]|0)+e;i=g;return}function hq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=ux(d)|0;if((e|0)!=0){f=b+8|0;b=e;while(1){e=vx(d,b)|0;g=b+8|0;if((a[(c[g>>2]|0)+159|0]|0)==0){h=c[f>>2]|0;i=c[h+172>>2]|0;a:do{if((i|0)>1){j=b|0;k=1;l=h;while(1){m=(Rx(c[(c[l+176>>2]|0)+(k<<2)>>2]|0,j)|0)==0;n=k+1|0;o=c[f>>2]|0;p=c[o+172>>2]|0;if(!m){q=k;r=p;break a}if((n|0)<(p|0)){k=n;l=o}else{q=n;r=p;break}}}else{q=1;r=i}}while(0);if((q|0)<(r|0)){Gx(d,b|0)|0}c[(c[g>>2]|0)+212>>2]=0}else{Gx(d,b|0)|0}if((e|0)==0){break}else{b=e}}}b=ux(d)|0;if((b|0)==0){return}r=d|0;q=b;do{b=mw(Ix(r)|0,q)|0;if((b|0)!=0){f=b;do{if((Rx(d,c[((c[f>>2]&3|0)==2?f:f-32|0)+28>>2]|0)|0)!=0){xw(d,f,1)|0}f=ow(Ix(r)|0,f)|0;}while((f|0)!=0)}q=vx(d,q)|0;}while((q|0)!=0);return}function iq(a,b,d){a=a|0;b=b|0;d=d|0;Wx(b|0,103336,c[d>>2]|0,1)|0;return}function jq(a,b,d){a=a|0;b=b|0;d=d|0;Wx(b|0,132048,c[d+4>>2]|0,1)|0;return}function kq(a,b,d){a=a|0;b=b|0;d=d|0;Wx(b|0,134032,c[d+8>>2]|0,1)|0;return}function lq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=sy(d)|0;if((e|0)==0){return}d=b+8|0;f=e;do{e=f|0;do{if((Za($w(e)|0,116432,7)|0)==0){g=7;h=5}else{i=Um(ew(e,151672)|0,12248,12272)|0;a[(c[f+8>>2]|0)+262|0]=i;if((i|0)!=0){g=i;h=5;break}lq(b,f)}}while(0);a:do{if((h|0)==5){h=0;if((g|0)==7&(c[53850]|0)==100){oq(b,f);break}e=ux(f)|0;if((e|0)==0){break}i=g&255;j=e+8|0;a[(c[j>>2]|0)+159|0]=i;k=vx(f,e)|0;if((k|0)!=0){l=k;do{Mm(e,l)|0;a[(c[l+8>>2]|0)+159|0]=a[(c[j>>2]|0)+159|0]|0;l=vx(f,l)|0;}while((l|0)!=0)}do{if((g|0)==2|(g|0)==3){l=(c[d>>2]|0)+212|0;j=c[l>>2]|0;if((j|0)==0){c[l>>2]=e;break}else{l=Mm(j,e)|0;c[(c[d>>2]|0)+212>>2]=l;break}}else if((g|0)==4|(g|0)==5){l=(c[d>>2]|0)+216|0;j=c[l>>2]|0;if((j|0)==0){c[l>>2]=e;break}else{l=Mm(j,e)|0;c[(c[d>>2]|0)+216>>2]=l;break}}else{break a}}while(0);if((g|0)==3){a[(c[(c[(c[d>>2]|0)+212>>2]|0)+8>>2]|0)+159|0]=i;break}else if((g|0)==5){a[(c[(c[(c[d>>2]|0)+216>>2]|0)+8>>2]|0)+159|0]=i;break}else{break}}}while(0);f=ty(f)|0;}while((f|0)!=0);return}function mq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=d+8|0;d=c[e>>2]|0;f=c[d+216>>2]|0;g=c[d+212>>2]|0;d=(g|0)==0;do{if((f|0)==0){if(!d){h=5;break}c[b>>2]=0;c[b+4>>2]=0;return}else{if(d){i=f;h=6}else{h=5}}}while(0);if((h|0)==5){f=Lm(g)|0;c[(c[e>>2]|0)+212>>2]=f;f=c[e>>2]|0;g=c[f+216>>2]|0;if((g|0)==0){j=0;k=f}else{i=g;h=6}}do{if((h|0)==6){g=Lm(i)|0;c[(c[e>>2]|0)+216>>2]=g;g=c[e>>2]|0;f=c[g+216>>2]|0;if((f|0)==0){j=0;k=g;break}d=f+8|0;f=c[d>>2]|0;l=(a[f+159|0]|0)==5|0;m=c[c[f+180>>2]>>2]|0;if((m|0)==0){j=l;k=g;break}else{n=m}while(1){m=c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0;if((m|0)!=(Lm(m)|0)){h=9;break}Kn(n);m=c[c[(c[d>>2]|0)+180>>2]>>2]|0;if((m|0)==0){h=11;break}else{n=m}}if((h|0)==9){cc(121920,126496,346,170232)}else if((h|0)==11){j=l;k=c[e>>2]|0;break}}}while(0);e=c[k+212>>2]|0;a:do{if((e|0)==0){o=0}else{k=e+8|0;h=c[k>>2]|0;n=(a[h+159|0]|0)==3|0;i=c[c[h+172>>2]>>2]|0;if((i|0)==0){o=n;break}else{p=i}while(1){i=c[((c[p>>2]&3|0)==3?p:p+32|0)+28>>2]|0;if((i|0)!=(Lm(i)|0)){break}Kn(p);i=c[c[(c[k>>2]|0)+172>>2]>>2]|0;if((i|0)==0){o=n;break a}else{p=i}}cc(121128,126496,353,170232)}}while(0);c[b>>2]=o;c[b+4>>2]=j;return}function nq(a){a=a|0;var d=0,f=0,g=0,h=0;d=a+8|0;a=c[d>>2]|0;f=a+224|0;b[f>>1]=(e[f>>1]|0)+(c[(c[(c[a+252>>2]|0)+8>>2]|0)+232>>2]|0);a=c[d>>2]|0;f=a+226|0;b[f>>1]=(e[f>>1]|0)+(c[(c[(c[a+252>>2]|0)+8>>2]|0)+232>>2]|0);a=c[d>>2]|0;if((c[a+172>>2]|0)<1){return}else{g=1;h=a}while(1){nq(c[(c[h+176>>2]|0)+(g<<2)>>2]|0);a=c[d>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;h=a}else{break}}return}function oq(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=e+8|0;g=(c[f>>2]|0)+188|0;if((c[g>>2]|0)!=0){return}c[g>>2]=d;hq(d,e);if((ux(e)|0)==0){return}g=d+8|0;d=(c[g>>2]|0)+172|0;h=c[d>>2]|0;i=h+1|0;c[d>>2]=i;d=c[g>>2]|0;j=c[d+176>>2]|0;if((j|0)==0){k=jk((h<<2)+8|0)|0}else{k=lk(j,h+2|0,4,c[d+172>>2]|0)|0}c[(c[g>>2]|0)+176>>2]=k;c[(c[(c[g>>2]|0)+176>>2]|0)+(i<<2)>>2]=e;Rj(e);if((c[53850]|0)!=100){b[(c[f>>2]|0)+224>>1]=32767;b[(c[f>>2]|0)+226>>1]=-1;i=ux(e)|0;g=c[f>>2]|0;if((i|0)==0){l=0;m=g}else{k=i;i=0;d=g;while(1){g=d+226|0;h=k+8|0;j=c[(c[h>>2]|0)+232>>2]|0;if((b[g>>1]|0)<(j|0)){b[g>>1]=j;n=c[f>>2]|0;o=c[(c[h>>2]|0)+232>>2]|0}else{n=d;o=j}j=n+224|0;if((b[j>>1]|0)>(o|0)){b[j>>1]=o}if((i|0)==0){p=k}else{p=(c[(c[h>>2]|0)+232>>2]|0)<(c[(c[i+8>>2]|0)+232>>2]|0)?k:i}h=vx(e,k)|0;j=c[f>>2]|0;if((h|0)==0){l=p;m=j;break}else{k=h;i=p;d=j}}}c[m+252>>2]=l;return}_p(e,0);l=c[f>>2]|0;f=c[l+180>>2]|0;if((f|0)==0){cc(129800,126496,238,170984)}else{q=0;r=f}while(1){f=c[r+8>>2]|0;if((c[f+232>>2]|0)==0){s=(a[f+156|0]|0)==0?r:q}else{s=q}m=c[f+164>>2]|0;if((m|0)==0){break}else{q=s;r=m}}if((s|0)==0){cc(129800,126496,238,170984)}c[l+252>>2]=s;l=ux(e)|0;if((l|0)==0){return}else{t=l}while(1){l=t+8|0;if(!((c[(c[l>>2]|0)+216>>2]|0)<2|(t|0)==(s|0))){u=15;break}Mm(t,s)|0;a[(c[l>>2]|0)+159|0]=7;l=vx(e,t)|0;if((l|0)==0){u=26;break}else{t=l}}if((u|0)==15){cc(124e3,126496,242,170984)}else if((u|0)==26){return}}function pq(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=i;i=i+240|0;e=d|0;f=d+120|0;c[53770]=Wv(b,2,137312,0)|0;g=Wv(b,2,161104,0)|0;c[53768]=g;if(!((c[53770]|0)!=0|(g|0)!=0)){i=d;return}g=ux(b)|0;if((g|0)==0){i=d;return}h=e|0;j=f|0;k=g;do{g=rw(b,k)|0;do{if((g|0)!=0){l=g;m=0;n=0;while(1){o=l;p=c[o>>2]|0;q=p&3;r=c[((q|0)==2?l:l-32|0)+28>>2]|0;s=l+32|0;a:do{if((r|0)==(c[((q|0)==3?l:s)+28>>2]|0)){t=n;u=m}else{v=c[53770]|0;do{if((r|0)==(k|0)&(v|0)!=0){w=fw(l|0,v)|0;if((a[w]|0)==0){x=c[o>>2]|0;break}else{t=n;u=qq(h,m,k,l,w)|0;break a}}else{x=p}}while(0);v=c[53768]|0;if(!((c[((x&3|0)==3?l:s)+28>>2]|0)==(k|0)&(v|0)!=0)){t=n;u=m;break}w=fw(l|0,v)|0;if((a[w]|0)==0){t=n;u=m;break}t=qq(j,n,k,l,w)|0;u=m}}while(0);s=sw(b,l,k)|0;if((s|0)==0){break}else{l=s;m=u;n=t}}if((u|0)>0){n=0;do{m=e+(n*24|0)+4|0;if((c[e+(n*24|0)+8>>2]|0)>1){rq(k,m)}l=c[m>>2]|0;if((l|0)!=0){eF(l)}n=n+1|0;}while((n|0)<(u|0))}if((t|0)>0){y=0}else{break}do{n=f+(y*24|0)+4|0;if((c[f+(y*24|0)+8>>2]|0)>1){rq(k,n)}l=c[n>>2]|0;if((l|0)!=0){eF(l)}y=y+1|0;}while((y|0)<(t|0))}}while(0);k=vx(b,k)|0;}while((k|0)!=0);i=d;return}function qq(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0;j=i;i=i+16|0;k=j|0;l=j+8|0;do{if((d|0)>0){m=a[g]|0;n=0;while(1){o=c[b+(n*24|0)>>2]|0;if((a[o]|0)==m<<24>>24){if((Ya(o|0,g|0)|0)==0){break}}p=n+1|0;if((p|0)<(d|0)){n=p}else{q=10;break}}if((q|0)==10){if((d|0)<=4){r=p;q=12;break}m=$w(e|0)|0;Fv(1,130352,(o=i,i=i+16|0,c[o>>2]=5,c[o+8>>2]=m,o)|0)|0;i=o;s=d;i=j;return s|0}o=b+(n*24|0)+4|0;m=c[o>>2]|0;if((m|0)==0){t=kk((c[b+(n*24|0)+8>>2]<<2)+8|0)|0}else{t=mk(m,(c[b+(n*24|0)+8>>2]<<2)+8|0)|0}m=t;c[o>>2]=m;u=b+(n*24|0)+8|0;v=c[u>>2]|0;c[u>>2]=v+1;c[m+(v<<2)>>2]=f;c[(c[o>>2]|0)+(c[u>>2]<<2)>>2]=0;w=d;x=n}else{r=0;q=12}}while(0);if((q|0)==12){q=b+(r*24|0)+8|0;c[q>>2]=0;t=jk(8)|0;p=b+(r*24|0)+4|0;c[p>>2]=t;u=c[q>>2]|0;c[q>>2]=u+1;c[t+(u<<2)>>2]=f;c[(c[p>>2]|0)+(c[q>>2]<<2)>>2]=0;c[b+(r*24|0)>>2]=g;c[b+(r*24|0)+12>>2]=0;h[b+(r*24|0)+16>>3]=0.0;w=d+1|0;x=r}ih(f,k,l);r=(c[((c[f>>2]&3|0)==2?f:f-32|0)+28>>2]|0)==(e|0)?c[l>>2]|0:c[k>>2]|0;if((r|0)==0){s=w;i=j;return s|0}k=b+(x*24|0)+12|0;l=c[k>>2]|0;c[k>>2]=l+1;if((l|0)==0){y=+kh(f,r)}else{y=0.0}h[b+(x*24|0)+16>>3]=y;s=w;i=j;return s|0}function rq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;i=i+80|0;f=e|0;g=e+8|0;j=e+16|0;k=d+4|0;if((c[k>>2]|0)>0){l=d|0;m=b+8|0;n=0.0;o=0.0;p=0;while(1){q=c[(c[l>>2]|0)+(p<<2)>>2]|0;r=c[q>>2]&3;s=c[((r|0)==2?q:q-32|0)+28>>2]|0;if((s|0)==(b|0)){t=c[((r|0)==3?q:q+32|0)+28>>2]|0}else{t=s}s=c[t+8>>2]|0;q=c[m>>2]|0;u=+h[s+16>>3]- +h[q+16>>3];v=+h[s+24>>3]- +h[q+24>>3];w=+cb(+u,+v);x=o+u/w;u=n+v/w;q=p+1|0;if((q|0)<(c[k>>2]|0)){n=u;o=x;p=q}else{y=u;z=x;A=m;break}}}else{y=0.0;z=0.0;A=b+8|0}o=+cb(+z,+y);m=c[A>>2]|0;n=+h[m+16>>3];x=+h[m+24>>3];u=+h[m+88>>3]+ +h[m+96>>3];w=+h[m+80>>3];m=b|0;p=u>w+ +(c[(c[(Hx(m)|0)+8>>2]|0)+240>>2]|0);t=c[A>>2]|0;if(p){B=+h[t+88>>3]+ +h[t+96>>3];C=t}else{w=+h[t+80>>3];u=w+ +(c[(c[(Hx(m)|0)+8>>2]|0)+240>>2]|0);B=u;C=c[A>>2]|0}u=z/o*B+ +h[C+16>>3];z=y/o*B+ +h[C+24>>3];C=j|0;h[C>>3]=n;m=j+8|0;h[m>>3]=x;h[j+16>>3]=(n*2.0+u)/3.0;h[j+24>>3]=(x*2.0+z)/3.0;h[j+32>>3]=(n+u*2.0)/3.0;h[j+40>>3]=(x+z*2.0)/3.0;h[j+48>>3]=u;h[j+56>>3]=z;$l(b,j|0);j=c[A>>2]|0;z=+h[C>>3]- +h[j+16>>3];u=+h[m>>3]- +h[j+24>>3];if(z<0.0){D=z+-.5}else{D=z+.5}z=+(~~D|0);if(u<0.0){E=u+-.5}else{E=u+.5}u=+(~~E|0);E=+h[j+88>>3];m=~~((z+E)*256.0/(E+ +h[j+96>>3]));if((c[k>>2]|0)<=0){F=j;G=F;H=G+145|0;a[H]=1;i=e;return}j=d|0;d=0;do{C=c[(c[j>>2]|0)+(d<<2)>>2]|0;ih(C,f,g);if((C|0)!=0){t=C;do{C=(t|0)==0;a:do{if(!C){p=t;do{l=p;q=c[l>>2]|0;s=p-32|0;if((c[((q&3|0)==2?p:s)+28>>2]|0)==(b|0)){r=c[p+8>>2]|0;I=r;h[r+56>>3]=z;h[r+64>>3]=u;h[r+72>>3]=0.0;c[r+80>>2]=0;a[r+84|0]=1;a[I+85|0]=0;a[I+86|0]=0;a[I+87|0]=0;a[r+88|0]=m;a[I+89|0]=0;c[r+92>>2]=0;J=c[l>>2]|0}else{J=q}q=p+8|0;if((c[((J&3|0)==3?p:p+32|0)+28>>2]|0)==(b|0)){r=c[q>>2]|0;I=r;h[r+16>>3]=z;h[r+24>>3]=u;h[r+32>>3]=0.0;c[r+40>>2]=0;a[r+44|0]=1;a[I+45|0]=0;a[I+46|0]=0;a[I+47|0]=0;a[r+48|0]=m;a[I+49|0]=0;c[r+52>>2]=0}if((a[(c[q>>2]|0)+112|0]|0)!=1){break}q=c[(c[((c[l>>2]&3|0)==2?p:s)+28>>2]|0)+8>>2]|0;if((a[q+156|0]|0)!=1){break}s=q+180|0;if((c[s+4>>2]|0)!=1){break}p=c[c[s>>2]>>2]|0;}while((p|0)!=0);if(C){break}else{K=t}do{p=K;s=c[p>>2]|0;if((c[((s&3|0)==2?K:K-32|0)+28>>2]|0)==(b|0)){q=c[K+8>>2]|0;l=q;h[q+56>>3]=z;h[q+64>>3]=u;h[q+72>>3]=0.0;c[q+80>>2]=0;a[q+84|0]=1;a[l+85|0]=0;a[l+86|0]=0;a[l+87|0]=0;a[q+88|0]=m;a[l+89|0]=0;c[q+92>>2]=0;L=c[p>>2]|0}else{L=s}s=K+32|0;q=K+8|0;if((c[((L&3|0)==3?K:s)+28>>2]|0)==(b|0)){l=c[q>>2]|0;r=l;h[l+16>>3]=z;h[l+24>>3]=u;h[l+32>>3]=0.0;c[l+40>>2]=0;a[l+44|0]=1;a[r+45|0]=0;a[r+46|0]=0;a[r+47|0]=0;a[l+48|0]=m;a[r+49|0]=0;c[l+52>>2]=0}if((a[(c[q>>2]|0)+112|0]|0)!=1){break a}q=c[(c[((c[p>>2]&3|0)==3?K:s)+28>>2]|0)+8>>2]|0;if((a[q+156|0]|0)!=1){break a}s=q+172|0;if((c[s+4>>2]|0)!=1){break a}K=c[c[s>>2]>>2]|0;}while((K|0)!=0)}}while(0);t=c[(c[t+8>>2]|0)+172>>2]|0;}while((t|0)!=0)}d=d+1|0;}while((d|0)<(c[k>>2]|0));F=c[A>>2]|0;G=F;H=G+145|0;a[H]=1;i=e;return}function sq(a){a=a|0;c[a>>2]=0;c[a+4>>2]=0;return}function tq(a){a=a|0;var b=0;b=jk(64)|0;c[b+36>>2]=0;c[b+40>>2]=0;c[b+8>>2]=a;return b|0}function uq(a){a=a|0;if((a|0)==0){return}br(c[a+32>>2]|0);eF(a);return}function vq(a){a=a|0;return Lw(c[a+8>>2]|0)|0}function wq(a,b){a=a|0;b=b|0;var d=0,e=0;c[b+4>>2]=0;d=a+4|0;e=c[d>>2]|0;if((e|0)==0){c[a>>2]=b;c[d>>2]=b;return}else{c[e+4>>2]=b;c[d>>2]=b;return}}function xq(a,b){a=a|0;b=b|0;var d=0,e=0;d=a|0;e=c[d>>2]|0;if((e|0)==0){c[d>>2]=b;c[a+4>>2]=b;return}else{c[b+4>>2]=e;c[d>>2]=b;return}}function yq(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0,ya=0.0,za=0,Aa=0,Ba=0;e=i;i=i+128|0;f=e|0;g=c[b+8>>2]|0;j=ux(g)|0;if((j|0)!=0){k=j;do{j=mw(a,k)|0;if((j|0)!=0){l=j;do{if((c[(c[(c[(c[((c[l>>2]&3|0)==2?l:l-32|0)+28>>2]|0)+8>>2]|0)+112>>2]|0)+12>>2]|0)==(b|0)){xw(g,l,1)|0}l=ow(a,l)|0;}while((l|0)!=0)}k=vx(g,k)|0;}while((k|0)!=0)}k=f|0;f=c[45214]|0;c[45214]=f+1;nb(k|0,115440,(a=i,i=i+8|0,c[a>>2]=f,a)|0)|0;i=a;f=ry(g,k,1)|0;Wx(f|0,158088,272,1)|0;l=c[45214]|0;c[45214]=l+1;nb(k|0,115440,(a=i,i=i+8|0,c[a>>2]=l,a)|0)|0;i=a;l=Hw(k,g+12|0,0)|0;j=ux(g)|0;if((j|0)!=0){m=j;do{zx(f,m,1)|0;j=Ax(l,$w(m|0)|0,1)|0;Wx(j|0,108392,304,1)|0;c[(c[(c[m+8>>2]|0)+112>>2]|0)+16>>2]=j;m=vx(g,m)|0;}while((m|0)!=0)}m=ux(g)|0;if((m|0)!=0){j=m;do{m=c[(c[(c[j+8>>2]|0)+112>>2]|0)+16>>2]|0;n=mw(g,j)|0;if((n|0)!=0){o=m+8|0;p=n;do{xw(f,p,1)|0;n=c[(c[(c[(c[((c[p>>2]&3|0)==2?p:p-32|0)+28>>2]|0)+8>>2]|0)+112>>2]|0)+16>>2]|0;q=uw(l,m,n,0,1)|0;Wx(q|0,128120,176,1)|0;c[(c[q+8>>2]|0)+116>>2]=p;q=(c[o>>2]|0)+236|0;c[q>>2]=(c[q>>2]|0)+1;q=(c[n+8>>2]|0)+236|0;c[q>>2]=(c[q>>2]|0)+1;p=ow(g,p)|0;}while((p|0)!=0)}j=vx(g,j)|0;}while((j|0)!=0)}j=Lw(l)|0;p=Nq()|0;o=ux(l)|0;if((o|0)!=0){m=o;do{Pq(p,m);m=vx(l,m)|0;}while((m|0)!=0)}m=j-3|0;if((m|0)>0){j=0;do{o=Rq(p)|0;q=rw(l,o)|0;if((q|0)!=0){n=q;do{q=c[n>>2]&3;r=c[((q|0)==2?n:n-32|0)+28>>2]|0;if((o|0)==(r|0)){s=c[((q|0)==3?n:n+32|0)+28>>2]|0}else{s=r}Qq(p,s);n=sw(l,n,o)|0;}while((n|0)!=0)}n=c[(c[o+8>>2]|0)+236>>2]|0;r=n<<2;q=kk(r)|0;t=q;u=kk(r)|0;r=u;v=rw(l,o)|0;if((v|0)==0){w=0;x=0}else{y=0;z=0;A=v;v=0;while(1){B=c[A>>2]&3;C=c[((B|0)==2?A:A-32|0)+28>>2]|0;if((C|0)==(o|0)){D=c[((B|0)==3?A:A+32|0)+28>>2]|0}else{D=C}C=rw(l,o)|0;do{if((C|0)==0){E=v;F=35}else{B=C;G=0;H=v;while(1){do{if((B|0)==(A|0)){I=H;J=G}else{K=c[B>>2]&3;L=c[((K|0)==2?B:B-32|0)+28>>2]|0;if((L|0)==(o|0)){M=c[((K|0)==3?B:B+32|0)+28>>2]|0}else{M=L}L=uw(l,D,M,0,0)|0;if((L|0)==0){I=H;J=G;break}if(D>>>0>=M>>>0){I=H;J=1;break}K=H+1|0;N=L+8|0;L=c[(c[N>>2]|0)+116>>2]|0;if((L|0)==0){I=K;J=1;break}Gx(f,L)|0;c[(c[N>>2]|0)+116>>2]=0;I=K;J=1}}while(0);K=sw(l,B,o)|0;if((K|0)==0){break}else{B=K;G=J;H=I}}if((J|0)==0){E=I;F=35;break}c[t+(y<<2)>>2]=D;O=z;P=y+1|0;Q=I}}while(0);if((F|0)==35){F=0;c[r+(z<<2)>>2]=D;O=z+1|0;P=y;Q=E}C=sw(l,A,o)|0;if((C|0)==0){w=O;x=Q;break}else{y=P;z=O;A=C;v=Q}}}v=n-1-x|0;a:do{if((v|0)>0){if((v|0)>=(w|0)){if((v|0)!=(w|0)){break}A=c[t>>2]|0;if((w|0)<=0){break}z=A+8|0;y=0;while(1){C=c[r+(y<<2)>>2]|0;Wx(uw(l,A,C,0,1)|0,128120,176,1)|0;H=(c[z>>2]|0)+236|0;c[H>>2]=(c[H>>2]|0)+1;H=(c[C+8>>2]|0)+236|0;c[H>>2]=(c[H>>2]|0)+1;y=y+1|0;if((y|0)>=(w|0)){break a}}}b:do{if((w|0)>0){y=v;z=0;while(1){A=z|1;if((A|0)>=(w|0)){R=y;break b}H=c[r+(z<<2)>>2]|0;C=c[r+(A<<2)>>2]|0;Wx(uw(l,H,C,0,1)|0,128120,176,1)|0;A=(c[H+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=(c[C+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=y-1|0;C=z+2|0;if((C|0)<(w|0)){y=A;z=C}else{R=A;break}}}else{R=v}}while(0);if((R|0)>0){S=R;T=2}else{break}while(1){z=c[r>>2]|0;y=c[r+(T<<2)>>2]|0;Wx(uw(l,z,y,0,1)|0,128120,176,1)|0;A=(c[z+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=(c[y+8>>2]|0)+236|0;c[A>>2]=(c[A>>2]|0)+1;A=S-1|0;if((A|0)>0){S=A;T=T+1|0}else{break}}}}while(0);eF(u);eF(q);r=rw(l,o)|0;if((r|0)!=0){v=r;do{r=c[v>>2]&3;t=c[((r|0)==2?v:v-32|0)+28>>2]|0;if((o|0)==(t|0)){U=c[((r|0)==3?v:v+32|0)+28>>2]|0}else{U=t}t=(c[U+8>>2]|0)+236|0;c[t>>2]=(c[t>>2]|0)-1;Pq(p,U);v=sw(l,v,o)|0;}while((v|0)!=0)}Gx(l,o|0)|0;j=j+1|0;}while((j|0)<(m|0))}Kw(l)|0;Oq(p);p=c[43748]|0;c[43748]=p+1;nb(k|0,120712,(a=i,i=i+8|0,c[a>>2]=p,a)|0)|0;i=a;a=ry(f,k,1)|0;Wx(a|0,158088,272,1)|0;k=ux(f)|0;if((k|0)!=0){p=k;do{zx(a,p,1)|0;k=p+8|0;c[(c[(c[k>>2]|0)+112>>2]|0)+28>>2]=0;c[(c[(c[k>>2]|0)+112>>2]|0)+32>>2]=0;l=(c[(c[k>>2]|0)+112>>2]|0)+4|0;c[l>>2]=c[l>>2]&-2;p=vx(f,p)|0;}while((p|0)!=0)}p=ux(f)|0;if((p|0)!=0){l=p;do{p=c[(c[l+8>>2]|0)+112>>2]|0;if((c[p+4>>2]&1|0)==0){c[p+16>>2]=0;Aq(f,l,a)}l=vx(f,l)|0;}while((l|0)!=0)}do{if((Lw(a)|0)==1){l=ar()|0;p=ux(a)|0;cr(l,0,p);k=(c[(c[p+8>>2]|0)+112>>2]|0)+4|0;c[k>>2]=c[k>>2]|16;X=l}else{l=ux(a)|0;if((l|0)!=0){k=l;do{l=rw(a,k)|0;c:do{if((l|0)!=0){p=l;m=0;while(1){j=sw(a,p,k)|0;if((j|0)==0){break}else{p=j;m=m+1|0}}if((m|0)!=0){break}p=c[(c[(c[k+8>>2]|0)+112>>2]|0)+16>>2]|0;if((p|0)==0){break}else{Y=0;Z=0;_=p}while(1){$=Y+1|0;aa=_+8|0;ba=c[(c[aa>>2]|0)+112>>2]|0;p=c[ba+28>>2]|0;if((p|0)==0){c[ba+20>>2]=k;c[(c[(c[aa>>2]|0)+112>>2]|0)+28>>2]=$;ca=Z}else{if((p|0)>(Y|0)){break}p=c[ba+20>>2]|0;if((p|0)==(Z|0)){da=Z;ea=ba}else{j=ba+24|0;if((c[ba+32>>2]|0)==0){F=72}else{if((c[j>>2]|0)==(Z|0)){fa=Z}else{F=72}}if((F|0)==72){F=0;fa=p}c[j>>2]=p;p=c[(c[aa>>2]|0)+112>>2]|0;c[p+32>>2]=c[p+28>>2];da=fa;ea=c[(c[aa>>2]|0)+112>>2]|0}c[ea+20>>2]=k;c[(c[(c[aa>>2]|0)+112>>2]|0)+28>>2]=$;ca=da}p=c[(c[(c[aa>>2]|0)+112>>2]|0)+16>>2]|0;if((p|0)==0){break c}else{Y=$;Z=ca;_=p}}if((c[ba+32>>2]|0)>(Y|0)){break}c[ba+24>>2]=k;c[(c[(c[aa>>2]|0)+112>>2]|0)+32>>2]=$}}while(0);k=vx(a,k)|0;}while((k|0)!=0)}k=ux(a)|0;if((k|0)==0){ga=0}else{o=0;l=k;k=0;while(1){m=c[(c[l+8>>2]|0)+112>>2]|0;p=(c[m+32>>2]|0)+(c[m+28>>2]|0)|0;m=(p|0)>(k|0);j=m?l:o;U=vx(a,l)|0;if((U|0)==0){ga=j;break}else{o=j;l=U;k=m?p:k}}}k=ar()|0;l=ga+8|0;o=c[(c[(c[l>>2]|0)+112>>2]|0)+20>>2]|0;if((o|0)!=(ga|0)){p=o;do{cr(k,0,p);o=p+8|0;m=(c[(c[o>>2]|0)+112>>2]|0)+4|0;c[m>>2]=c[m>>2]|16;p=c[(c[(c[o>>2]|0)+112>>2]|0)+16>>2]|0;}while((p|0)!=(ga|0))}cr(k,0,ga);p=(c[(c[l>>2]|0)+112>>2]|0)+4|0;c[p>>2]=c[p>>2]|16;if((c[(c[(c[l>>2]|0)+112>>2]|0)+32>>2]|0)==0){X=k;break}p=ar()|0;o=c[(c[(c[l>>2]|0)+112>>2]|0)+24>>2]|0;if((o|0)!=(ga|0)){m=o;do{cr(p,0,m);o=m+8|0;U=(c[(c[o>>2]|0)+112>>2]|0)+4|0;c[U>>2]=c[U>>2]|16;m=c[(c[(c[o>>2]|0)+112>>2]|0)+16>>2]|0;}while((m|0)!=(ga|0))}hr(k,p);X=k}}while(0);ga=ux(g)|0;if((ga|0)!=0){a=X|0;$=X+4|0;aa=ga;do{if((c[(c[(c[aa+8>>2]|0)+112>>2]|0)+4>>2]&16|0)==0){ga=ar()|0;ba=mw(g,aa)|0;if((ba|0)!=0){Y=ba;do{ba=Y;_=Y-32|0;cr(ga,0,c[((c[ba>>2]&3|0)==2?Y:_)+28>>2]|0);ca=(c[(c[(c[((c[ba>>2]&3|0)==2?Y:_)+28>>2]|0)+8>>2]|0)+112>>2]|0)+4|0;c[ca>>2]=c[ca>>2]|32;Y=ow(g,Y)|0;}while((Y|0)!=0)}Y=pw(g,aa)|0;if((Y|0)!=0){k=Y;do{Y=k;p=k+32|0;cr(ga,0,c[((c[Y>>2]&3|0)==3?k:p)+28>>2]|0);ca=(c[(c[(c[((c[Y>>2]&3|0)==3?k:p)+28>>2]|0)+8>>2]|0)+112>>2]|0)+4|0;c[ca>>2]=c[ca>>2]|32;k=qw(g,k)|0;}while((k|0)!=0)}d:do{if((gr(ga)|0)>1){k=c[a>>2]|0;if((k|0)==0){F=100;break}else{ha=k}while(1){k=ha+4|0;if((c[(c[(c[(c[ha>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&32|0)!=0){if((c[(c[(c[(c[c[((ha|0)==(c[$>>2]|0)?a:k)>>2]>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&32|0)!=0){break}}ca=c[k>>2]|0;if((ca|0)==0){F=100;break d}else{ha=ca}}cr(X,ha,aa)}else{F=100}}while(0);e:do{if((F|0)==100){F=0;f:do{if((gr(ga)|0)>0){ca=c[a>>2]|0;if((ca|0)==0){break}else{ia=ca}while(1){if((c[(c[(c[(c[ia>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&32|0)!=0){break}ca=c[ia+4>>2]|0;if((ca|0)==0){break f}else{ia=ca}}cr(X,ia,aa);break e}}while(0);cr(X,0,aa)}}while(0);ca=c[ga>>2]|0;if((ca|0)!=0){k=ca;do{ca=(c[(c[(c[k>>2]|0)+8>>2]|0)+112>>2]|0)+4|0;c[ca>>2]=c[ca>>2]&-33;k=c[k+4>>2]|0;}while((k|0)!=0)}br(ga)}aa=vx(g,aa)|0;}while((aa|0)!=0)}aa=zq(X,g)|0;g:do{if((aa|0)==0){ja=X}else{ia=aa;a=X;ha=0;while(1){$=ux(g)|0;if(($|0)==0){ka=a;la=ia}else{k=$;$=a;ca=ia;while(1){p=rw(g,k)|0;if((p|0)==0){ma=$;na=ca}else{Y=p;p=$;_=ca;while(1){ba=c[Y>>2]&3;Z=c[((ba|0)==3?Y:Y+32|0)+28>>2]|0;if((Z|0)==(k|0)){oa=c[((ba|0)==2?Y:Y-32|0)+28>>2]|0}else{oa=Z}Z=p;ba=_;da=0;while(1){ea=er(Z)|0;fr(Z,k,oa,da);fa=zq(Z,g)|0;if((fa|0)<(ba|0)){br(ea);if((fa|0)==0){ja=Z;break g}else{pa=fa;qa=Z}}else{br(Z);pa=ba;qa=ea}ea=da+1|0;if((ea|0)<2){Z=qa;ba=pa;da=ea}else{break}}da=sw(g,Y,k)|0;if((da|0)==0){ma=qa;na=pa;break}else{Y=da;p=qa;_=pa}}}_=vx(g,k)|0;if((_|0)==0){ka=ma;la=na;break}else{k=_;$=ma;ca=na}}}ca=ha+1|0;if((la|0)!=0&(ia|0)!=(la|0)&(ca|0)<10){ia=la;a=ka;ha=ca}else{ja=ka;break}}}}while(0);ka=gr(ja)|0;la=ja|0;na=c[la>>2]|0;ma=(na|0)==0;if(ma){ra=0.0}else{sa=0.0;g=na;while(1){pa=c[(c[c[(c[(c[g>>2]|0)+8>>2]|0)+112>>2]>>2]|0)+8>>2]|0;ta=+h[pa+32>>3];ua=ta>sa?ta:sa;ta=+h[pa+40>>3];va=ta>ua?ta:ua;pa=c[g+4>>2]|0;if((pa|0)==0){ra=va;break}else{sa=va;g=pa}}}g=(ka|0)==1;if(g){wa=0.0}else{wa=+(ka|0)*(ra+d)/6.283185307179586}do{if(!ma){pa=na;while(1){if((c[(c[(c[(c[pa>>2]|0)+8>>2]|0)+112>>2]|0)+4>>2]&8|0)!=0){F=130;break}qa=c[pa+4>>2]|0;if((qa|0)==0){xa=na;break}else{pa=qa}}if((F|0)==130){dr(ja,pa);xa=c[la>>2]|0}if((xa|0)==0){break}d=6.283185307179586/+(ka|0);qa=0;oa=xa;while(1){X=(c[oa>>2]|0)+8|0;c[(c[(c[X>>2]|0)+112>>2]|0)+16>>2]=qa;h[(c[(c[X>>2]|0)+112>>2]|0)+24>>3]=0.0;sa=+(qa|0)*d;va=wa*+V(sa);h[c[(c[X>>2]|0)+132>>2]>>3]=va;va=wa*+W(sa);h[(c[(c[X>>2]|0)+132>>2]|0)+8>>3]=va;X=c[oa+4>>2]|0;if((X|0)==0){break}else{qa=qa+1|0;oa=X}}}}while(0);if(g){d=ra*.5;h[b+16>>3]=d;ya=d;za=b+24|0;h[za>>3]=ya;Aa=b+48|0;h[Aa>>3]=-1.0;Ba=Kw(f)|0;i=e;return ja|0}else{h[b+16>>3]=wa;ya=wa;za=b+24|0;h[za>>3]=ya;Aa=b+48|0;h[Aa>>3]=-1.0;Ba=Kw(f)|0;i=e;return ja|0}return 0}function zq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=Vq()|0;e=ux(b)|0;if((e|0)!=0){f=e;do{e=mw(b,f)|0;if((e|0)!=0){g=e;do{c[c[(c[g+8>>2]|0)+120>>2]>>2]=0;g=ow(b,g)|0;}while((g|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0)}f=c[a>>2]|0;if((f|0)==0){h=0;Wq(d);return h|0}a=d|0;g=0;e=1;i=f;while(1){f=c[i>>2]|0;j=rw(b,f)|0;if((j|0)==0){k=g}else{l=j;j=g;while(1){m=l+8|0;if((c[c[(c[m>>2]|0)+120>>2]>>2]|0)>0){n=Hc[c[a>>2]&63](d,0,128)|0;if((n|0)==0){o=j}else{p=j;q=n;while(1){n=c[q+8>>2]|0;do{if((c[c[(c[n+8>>2]|0)+120>>2]>>2]|0)>(c[c[(c[m>>2]|0)+120>>2]>>2]|0)){r=c[n>>2]&3;if((c[((r|0)==2?n:n-32|0)+28>>2]|0)==(f|0)){s=p;break}s=((c[((r|0)==3?n:n+32|0)+28>>2]|0)!=(f|0))+p|0}else{s=p}}while(0);n=Hc[c[a>>2]&63](d,q,8)|0;if((n|0)==0){o=s;break}else{p=s;q=n}}}Yq(d,l);t=o}else{t=j}q=sw(b,l,f)|0;if((q|0)==0){k=t;break}else{l=q;j=t}}}j=rw(b,f)|0;if((j|0)!=0){l=j;do{j=c[(c[l+8>>2]|0)+120>>2]|0;if((c[j>>2]|0)==0){c[j>>2]=e;Xq(d,l)}l=sw(b,l,f)|0;}while((l|0)!=0)}l=c[i+4>>2]|0;if((l|0)==0){h=k;break}else{g=k;e=e+1|0;i=l}}Wq(d);return h|0}function Aq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=(c[(c[b+8>>2]|0)+112>>2]|0)+4|0;c[e>>2]=c[e>>2]|1;e=rw(a,b)|0;if((e|0)==0){return}else{f=e}do{e=c[f>>2]&3;g=c[((e|0)==2?f:f-32|0)+28>>2]|0;if((g|0)==(b|0)){h=c[((e|0)==3?f:f+32|0)+28>>2]|0}else{h=g}g=h+8|0;if((c[(c[(c[g>>2]|0)+112>>2]|0)+4>>2]&1|0)==0){xw(d,f,1)|0;c[(c[(c[g>>2]|0)+112>>2]|0)+16>>2]=b;Aq(a,h,d)}f=sw(a,f,b)|0;}while((f|0)!=0);return}function Bq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0;e=i;i=i+8|0;f=e|0;g=c[d+24>>2]|0;if((g|0)==0){h=3}else{j=Ax(b,g,0)|0;if((j|0)==0){h=3}else{k=j}}a:do{if((h|0)==3){j=d+20|0;do{if((c[j>>2]|0)!=0){g=ux(b)|0;if((g|0)==0){break}else{l=g}do{if((Jm(c[c[(c[l+8>>2]|0)+112>>2]>>2]|0,c[j>>2]|0,0)|0)<<24>>24!=0){k=l;break a}l=vx(b,l)|0;}while((l|0)!=0)}}while(0);k=ux(b)|0}}while(0);if((a[213992]|0)!=0){l=c[o>>2]|0;h=$w(k|0)|0;gc(l|0,102768,(l=i,i=i+8|0,c[l>>2]=h,l)|0)|0;i=l}c[f+4>>2]=0;c[f>>2]=0;Dq(b,k,d,1,f);f=d|0;k=c[d>>2]|0;d=c[k+4>>2]|0;if((d|0)==0){sq(f);i=e;return k|0}else{m=d}while(1){d=c[m+8>>2]|0;b=ux(d)|0;l=c[(c[b+8>>2]|0)+112>>2]|0;h=c[l+20>>2]|0;j=c[l+8>>2]|0;l=vx(d,b)|0;if((l|0)==0){n=j;p=b}else{g=h;h=l;l=j;j=b;while(1){b=c[(c[h+8>>2]|0)+112>>2]|0;q=c[b+20>>2]|0;if((q|0)<(g|0)){r=h;s=c[b+8>>2]|0;t=q}else{r=j;s=l;t=g}q=vx(d,h)|0;if((q|0)==0){n=s;p=r;break}else{g=t;h=q;l=s;j=r}}}j=n+8|0;l=(c[(c[j>>2]|0)+112>>2]|0)+4|0;c[l>>2]=c[l>>2]|8;c[m>>2]=p;l=c[m+4>>2]|0;wq((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)+36|0,m);if((l|0)==0){break}else{m=l}}sq(f);i=e;return k|0}function Cq(a){a=a|0;var b=0,d=0;b=c[a+36>>2]|0;if((b|0)==0){uq(a);return}else{d=b}while(1){b=c[d+4>>2]|0;Cq(d);if((b|0)==0){break}else{d=b}}uq(a);return}function Dq(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;g=i;i=i+128|0;h=g|0;j=d+8|0;k=c[j>>2]|0;c[j>>2]=k+1;j=b+8|0;c[(c[(c[j>>2]|0)+112>>2]|0)+20>>2]=k;c[(c[(c[j>>2]|0)+112>>2]|0)+24>>2]=k;k=rw(a,b)|0;a:do{if((k|0)!=0){l=f|0;m=f+4|0;n=h|0;o=d+12|0;p=(e|0)==0;q=d|0;r=k;b:while(1){s=c[r>>2]&3;t=c[((s|0)==2?r:r-32|0)+28>>2]|0;do{if((t|0)==(b|0)){u=c[((s|0)==3?r:r+32|0)+28>>2]|0;v=c[(c[r+8>>2]|0)+120>>2]|0;if((c[v>>2]|0)!=0){w=u;break}c[v>>2]=-1;w=u}else{u=c[(c[r+8>>2]|0)+120>>2]|0;if((c[u>>2]|0)!=0){w=t;break}c[u>>2]=1;w=t}}while(0);t=w+8|0;s=c[(c[t>>2]|0)+112>>2]|0;u=c[s+20>>2]|0;c:do{if((u|0)==0){c[s+8>>2]=b;c[(c[(c[r+8>>2]|0)+120>>2]|0)+4>>2]=c[l>>2];c[l>>2]=r;c[m>>2]=(c[m>>2]|0)+1;Dq(a,w,d,0,f);v=(c[(c[j>>2]|0)+112>>2]|0)+24|0;x=c[v>>2]|0;y=c[(c[(c[t>>2]|0)+112>>2]|0)+24>>2]|0;c[v>>2]=(x|0)<(y|0)?x:y;if((c[(c[(c[t>>2]|0)+112>>2]|0)+24>>2]|0)<(c[(c[(c[j>>2]|0)+112>>2]|0)+20>>2]|0)){break}else{z=0}while(1){y=c[l>>2]|0;if((y|0)==0){A=13;break b}x=c[m>>2]|0;if((x|0)<=0){A=12;break b}v=y+8|0;c[l>>2]=c[(c[(c[v>>2]|0)+120>>2]|0)+4>>2];c[m>>2]=x-1;x=c[y>>2]&3;if((c[c[(c[v>>2]|0)+120>>2]>>2]|0)==1){B=(x|0)==2?y:y-32|0}else{B=(x|0)==3?y:y+32|0}x=c[B+28>>2]|0;v=x+8|0;if((c[(c[(c[v>>2]|0)+112>>2]|0)+12>>2]|0)==0){if((z|0)==0){C=c[o>>2]|0;c[o>>2]=C+1;nb(n|0,145288,(D=i,i=i+8|0,c[D>>2]=C,D)|0)|0;i=D;C=ry(a,n,1)|0;Wx(C|0,120200,272,1)|0;E=tq(C)|0}else{E=z}zx(c[E+8>>2]|0,x,1)|0;c[(c[(c[v>>2]|0)+112>>2]|0)+12>>2]=E;F=E}else{F=z}if((y|0)==(r|0)){break}else{z=F}}if((F|0)==0){break}do{if((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)==0){if((vq(F)|0)<=1){break}zx(c[F+8>>2]|0,b,1)|0;c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]=F}}while(0);do{if(!p){if((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)!=(F|0)){break}xq(q,F);break c}}while(0);wq(q,F)}else{y=c[(c[j>>2]|0)+112>>2]|0;if((c[y+8>>2]|0)==(w|0)){break}v=y+24|0;y=c[v>>2]|0;c[v>>2]=(y|0)<(u|0)?y:u}}while(0);r=sw(a,r,b)|0;if((r|0)==0){break a}}if((A|0)==12){cc(111616,104840,61,170096)}else if((A|0)==13){cc(103904,104840,65,170096)}}}while(0);if((e|0)==0){i=g;return}if((c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]|0)!=0){i=g;return}e=h|0;h=d+12|0;A=c[h>>2]|0;c[h>>2]=A+1;nb(e|0,145288,(D=i,i=i+8|0,c[D>>2]=A,D)|0)|0;i=D;D=ry(a,e,1)|0;Wx(D|0,120200,272,1)|0;e=tq(D)|0;zx(c[e+8>>2]|0,b,1)|0;c[(c[(c[j>>2]|0)+112>>2]|0)+12>>2]=e;xq(d|0,e);i=g;return}function Eq(a,b,c){a=a|0;b=b|0;c=c|0;Fq(a,b,+h[c+32>>3]);return}function Fq(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0.0,O=0.0,P=0,Q=0.0,R=0,S=0.0,U=0,X=0.0,Y=0.0,_=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0,ga=0.0,ha=0,ia=0.0,ja=0.0,ka=0,la=0,ma=0,na=0,oa=0.0,pa=0.0,qa=0,ra=0.0,sa=0.0,ta=0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ba=0,Ca=0.0,Da=0.0,Ea=0,Fa=0,Ga=0,Ha=0.0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0.0,Na=0.0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0;e=b+36|0;f=c[e>>2]|0;if((f|0)==0){g=0}else{i=0;j=f;while(1){Fq(a,j,d);f=i+1|0;k=c[j+4>>2]|0;if((k|0)==0){g=f;break}else{i=f;j=k}}}j=yq(a,b,d)|0;c[b+32>>2]=j;a=gr(j)|0;if((g|0)>0){i=jk(g*56|0)|0;k=i;f=c[e>>2]|0;e=b+16|0;l=+h[e>>3];m=c[b>>2]|0;n=6.283185307179586/+(a|0);o=c[j>>2]|0;a:do{if((o|0)==0){p=-1.0;q=-1.0;r=l;s=0.0}else{j=(f|0)==0;t=l+d;if(j){u=t+0.0;v=0;w=0;x=o;while(1){y=c[x>>2]|0;if((c[(c[(c[y+8>>2]|0)+112>>2]|0)+4>>2]&8|0)==0){z=w}else{c[k+(w*56|0)>>2]=y;h[k+(w*56|0)+8>>3]=n*+(v|0);h[k+(w*56|0)+32>>3]=0.0;c[k+(w*56|0)+48>>2]=0;h[k+(w*56|0)+16>>3]=u;h[k+(w*56|0)+24>>3]=0.0;z=w+1|0}y=c[x+4>>2]|0;if((y|0)==0){A=0.0;B=z;break}else{v=v+1|0;w=z;x=y}}}else{x=0;u=0.0;w=0;v=o;while(1){y=c[v>>2]|0;C=x+1|0;if((c[(c[(c[y+8>>2]|0)+112>>2]|0)+4>>2]&8|0)==0){D=w;E=u}else{c[k+(w*56|0)>>2]=y;h[k+(w*56|0)+8>>3]=n*+(x|0);F=0.0;G=0.0;H=0;I=f;while(1){J=c[I>>2]|0;if((J|0)==0){K=0}else{K=c[(c[(c[J+8>>2]|0)+112>>2]|0)+8>>2]|0}if((K|0)==(y|0)){L=+h[I+16>>3];M=H+1|0;N=G+(L*2.0+d);O=F<L?L:F}else{M=H;N=G;O=F}J=c[I+4>>2]|0;if((J|0)==0){break}else{F=O;G=N;H=M;I=J}}h[k+(w*56|0)+32>>3]=N;c[k+(w*56|0)+48>>2]=M;h[k+(w*56|0)+16>>3]=t+O;h[k+(w*56|0)+24>>3]=O;D=w+1|0;E=O}I=c[v+4>>2]|0;if((I|0)==0){A=E;B=D;break}else{x=C;u=E;w=D;v=I}}}do{if((B|0)==1){h[i+40>>3]=1.0;P=1}else if((B|0)==2){u=+h[i+64>>3]- +h[i+8>>3];if(u>3.141592653589793){Q=6.283185307179586-u}else{Q=u}u=+h[i+72>>3];t=+h[i+16>>3];G=(+h[i+32>>3]*u+ +h[i+88>>3]*t)/(u*Q*2.0*t);t=G<1.0?1.0:G;v=i+40|0;if(t>+h[v>>3]){h[v>>3]=t}v=i+96|0;if(t<=+h[v>>3]){R=29;break}h[v>>3]=t;R=29}else{if((B|0)<=0){p=-1.0;q=-1.0;r=l;s=A;break a}v=i+8|0;w=0;x=k;while(1){I=w+1|0;if((I|0)==(B|0)){S=+h[v>>3]- +h[x+8>>3]+6.283185307179586;U=k}else{S=+h[x+64>>3]- +h[x+8>>3];U=x+56|0}t=+h[U+16>>3];G=+h[x+16>>3];u=(+h[x+32>>3]*t+ +h[U+32>>3]*G)/(t*S*2.0*G);G=u<1.0?1.0:u;H=x+40|0;if(G>+h[H>>3]){h[H>>3]=G}H=U+40|0;if(G>+h[H>>3]){h[H>>3]=G}if((I|0)<(B|0)){w=I;x=x+56|0}else{R=29;break}}}}while(0);if((R|0)==29){if((B|0)>0){P=B}else{p=-1.0;q=-1.0;r=l;s=A;break}}x=(a|0)==1;w=(a|0)>1;v=m+8|0;G=-1.0;u=-1.0;t=l;C=0;while(1){I=k+(C*56|0)|0;F=+h[k+(C*56|0)+40>>3]*+h[k+(C*56|0)+16>>3];do{if(x){L=+h[k+(C*56|0)+32>>3];X=L/6.283185307179586;Y=F>X?F:X;X=Y*6.283185307179586-L;if(X<=0.0){_=d;aa=0.0;ba=Y;break}_=X/+(c[k+(C*56|0)+48>>2]|0)+d;aa=0.0;ba=Y}else{_=d;aa=+h[k+(C*56|0)+8>>3]- +h[k+(C*56|0)+32>>3]/(F*2.0);ba=F}}while(0);F=ba+ +h[k+(C*56|0)+24>>3];Y=F>t?F:t;F=_/ba;H=k+(C*56|0)+48|0;y=((c[H>>2]|0)+1|0)/2|0;if(j){ca=0.0;da=u;ea=G}else{J=I|0;X=F*.5;fa=k+(C*56|0)+8|0;L=x?F:X;F=0.0;ga=aa;ha=0;ia=u;ja=G;ka=f;while(1){la=ka|0;ma=c[la>>2]|0;if((ma|0)==0){na=0}else{na=c[(c[(c[ma+8>>2]|0)+112>>2]|0)+8>>2]|0}do{if((na|0)==(c[J>>2]|0)){ma=ka+32|0;if((gr(c[ma>>2]|0)|0)<1){oa=ja;pa=ia;qa=ha;ra=ga;sa=F;break}ta=ka+16|0;ua=+h[ta>>3]/ba;do{if(x){do{if(ga!=0.0){if((c[H>>2]|0)==2){va=3.141592653589793;break}va=ga+ua}else{va=ga}}while(0);wa=va;xa=ia<0.0?va:ia;ya=va}else{if((c[H>>2]|0)==1){wa=ja;xa=ia;ya=+h[fa>>3];break}else{wa=ja;xa=ia;ya=ga+(X+ua);break}}}while(0);za=ba*+V(ya);Aa=ba*+W(ya);Ba=c[ka+8>>2]|0;Ca=+h[ka+48>>3];b:do{if(Ca<0.0){if((gr(c[ma>>2]|0)|0)==2){Da=ya+ -1.5707963267948966;break}Ea=c[la>>2]|0;Fa=Ea+8|0;Ga=c[(c[Fa>>2]|0)+132>>2]|0;Ha=za+ +h[Ga>>3];Ia=Aa+ +h[Ga+8>>3];Ga=ux(Ba)|0;if((Ga|0)==0){Ja=Ea}else{Ka=Ea;La=Ga;Ma=Ha*Ha+Ia*Ia;while(1){do{if((La|0)==(Ea|0)){Na=Ma;Oa=Ka}else{Ga=c[(c[La+8>>2]|0)+132>>2]|0;Ia=za+ +h[Ga>>3];Ha=Aa+ +h[Ga+8>>3];Pa=Ia*Ia+Ha*Ha;if(Pa>=Ma){Na=Ma;Oa=Ka;break}Na=Pa;Oa=La}}while(0);Ga=vx(Ba,La)|0;if((Ga|0)==0){Ja=Oa;break}else{Ka=Oa;La=Ga;Ma=Na}}}if((Ea|0)==(Ja|0)){Da=0.0;break}Ma=+h[ka+24>>3];Pa=+h[ta>>3]-Ma;La=c[Fa>>2]|0;Ka=c[La+132>>2]|0;Ha=+h[Ka>>3];do{if((c[ka+56>>2]&1|0)!=0){if(Ha<=-0.0-Pa){break}Ia=+T(za*za+Aa*Aa);Qa=+$(+(+h[Ka+8>>3]),+(Pa+Ha));Ra=+V(Qa);Da=ya+(1.5707963267948966-Qa- +Z(Ra*((Pa-Ma/Ra)/Ia)));break b}}while(0);Ma=3.141592653589793- +$(+(+h[Ka+8>>3]),+Ha);Pa=ya+(Ma- +h[(c[La+112>>2]|0)+24>>3]);if(Pa<=6.283185307179586){Da=Pa;break}Da=Pa+ -6.283185307179586}else{Pa=ya+(3.141592653589793-Ca);if(Pa>=0.0){Da=Pa;break}Da=Pa+6.283185307179586}}while(0);Gq(ka,za,Aa,Da);Ca=L+ua+ya;ta=ha+1|0;oa=wa;pa=xa;qa=ta;ra=Ca;sa=(ta|0)==(y|0)?Ca:F}else{oa=ja;pa=ia;qa=ha;ra=ga;sa=F}}while(0);la=c[ka+4>>2]|0;if((la|0)==0){ca=sa;da=pa;ea=oa;break}else{F=sa;ga=ra;ha=qa;ia=pa;ja=oa;ka=la}}}do{if(w){if((c[I>>2]|0)!=(m|0)){break}h[(c[(c[v>>2]|0)+112>>2]|0)+24>>3]=ca}}while(0);I=C+1|0;if((I|0)<(P|0)){G=ea;u=da;t=Y;C=I}else{p=ea;q=da;r=Y;s=A;break}}}}while(0);eF(i);if((g|0)==1){A=d*.5+s;Gq(b,-0.0-A,0.0,0.0);h[e>>3]=A+ +h[e>>3];g=b+56|0;c[g>>2]=c[g>>2]|1}else{h[e>>3]=r}Sa=(q+p)*.5+ -3.141592653589793}else{Sa=3.141592653589793}if((a|0)!=1){return}a=c[b>>2]|0;if((a|0)==0){return}if((c[(c[(c[a+8>>2]|0)+112>>2]|0)+8>>2]|0)==0){return}a=b+48|0;h[a>>3]=Sa;if(Sa>=0.0){return}h[a>>3]=Sa+6.283185307179586;return}function Gq(a,b,d,e){a=a|0;b=+b;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0;f=c[a+8>>2]|0;g=ux(f)|0;if((g|0)!=0){if(e!=0.0){i=g;do{j=i+8|0;k=c[(c[j>>2]|0)+132>>2]|0;l=k;m=+h[l>>3];n=+h[k+8>>3];o=+V(e);p=+W(e);h[l>>3]=m*o-n*p+b;h[(c[(c[j>>2]|0)+132>>2]|0)+8>>3]=n*o+m*p+d;i=vx(f,i)|0;}while((i|0)!=0)}else{i=g;do{g=i+8|0;j=c[(c[g>>2]|0)+132>>2]|0;l=j;p=+h[j+8>>3];h[l>>3]=+h[l>>3]+b;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=p+d;i=vx(f,i)|0;}while((i|0)!=0)}}i=c[a+36>>2]|0;if((i|0)==0){return}else{q=i}do{Gq(q,b,d,e);q=c[q+4>>2]|0;}while((q|0)!=0);return}function Hq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0;d=i;i=i+128|0;e=(Lw(a)|0)==1;f=(ux(a)|0)+8|0;g=c[f>>2]|0;if(e){h[c[g+132>>2]>>3]=0.0;h[(c[(c[f>>2]|0)+132>>2]|0)+8>>3]=0.0;i=d;return}f=Hx(c[c[g+112>>2]>>2]|0)|0;if((f|0)==(c[44682]|0)){j=0;k=f}else{c[45219]=0;c[44682]=f;g=Wv(f,0,131232,0)|0;c[44686]=Wv(c[44682]|0,1,116448,0)|0;c[44684]=Wv(c[44682]|0,1,109176,0)|0;j=g;k=c[44682]|0}c[44680]=ew(k|0,109176)|0;h[2694]=+Fm(c[44682]|0,j,1.0,0.0);sq(180864);c[45218]=1;h[22612]=+h[2694];c[45220]=c[44686];c[45221]=c[44684];c[45222]=c[44680];do{if((Km(ew(b|0,159688)|0)|0)<<24>>24==0){l=Bq(a,180864)|0}else{j=d|0;k=c[45219]|0;c[45219]=k+1;nb(j|0,163248,(g=i,i=i+8|0,c[g>>2]=k,g)|0)|0;i=g;g=tq(ry(a,j,1)|0)|0;j=ux(a)|0;if((j|0)==0){l=g;break}k=g+8|0;f=j;while(1){zx(c[k>>2]|0,f,1)|0;c[(c[(c[f+8>>2]|0)+112>>2]|0)+12>>2]=g;j=vx(a,f)|0;if((j|0)==0){l=g;break}else{f=j}}}}while(0);Eq(a,l,180864);Cq(l);i=d;return}function Iq(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;e=jk((Lw(a)|0)<<2)|0;f=jk(((Lw(a)|0)<<2)+4|0)|0;c[(c[d>>2]|0)+144>>2]=f;f=ux(a)|0;if((f|0)!=0){g=0;i=f;while(1){qt(i);c[(c[i+8>>2]|0)+112>>2]=e+(g<<2);c[(c[(c[d>>2]|0)+144>>2]|0)+(g<<2)>>2]=i;f=vx(a,i)|0;if((f|0)==0){break}else{g=g+1|0;i=f}}}i=ux(a)|0;if((i|0)==0){return}else{j=i}do{i=mw(a,j)|0;if((i|0)!=0){g=i;do{i=g|0;Wx(i,130336,176,1)|0;Zm(g)|0;k=+Fm(i,c[53750]|0,1.0,0.0);h[(c[g+8>>2]|0)+128>>3]=k;g=ow(a,g)|0;}while((g|0)!=0)}j=vx(a,j)|0;}while((j|0)!=0);return}function Jq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=i;i=i+8|0;e=d|0;f=Hw(142352,173928,0)|0;Wx(f|0,161376,272,1)|0;c[(c[a+8>>2]|0)+132>>2]=f;g=ux(a)|0;if((g|0)!=0){j=g;do{g=j+8|0;if((c[c[(c[g>>2]|0)+112>>2]>>2]|0)==0){k=Ax(f,$w(j|0)|0,1)|0;Wx(k|0,108856,304,1)|0;l=jk(40)|0;m=k+8|0;c[(c[m>>2]|0)+112>>2]=l;l=jk(c[53568]<<3)|0;c[(c[m>>2]|0)+132>>2]=l;l=j+8|0;h[(c[m>>2]|0)+88>>3]=+h[(c[l>>2]|0)+88>>3];h[(c[m>>2]|0)+96>>3]=+h[(c[l>>2]|0)+96>>3];h[(c[m>>2]|0)+80>>3]=+h[(c[l>>2]|0)+80>>3];c[c[(c[m>>2]|0)+112>>2]>>2]=j;c[c[(c[g>>2]|0)+112>>2]>>2]=k}j=vx(a,j)|0;}while((j|0)!=0)}j=ux(a)|0;if((j|0)!=0){k=j;do{j=mw(a,k)|0;if((j|0)!=0){g=j;do{j=c[g>>2]&3;m=c[c[(c[(c[((j|0)==3?g:g+32|0)+28>>2]|0)+8>>2]|0)+112>>2]>>2]|0;l=c[c[(c[(c[((j|0)==2?g:g-32|0)+28>>2]|0)+8>>2]|0)+112>>2]>>2]|0;if((m|0)!=(l|0)){Wx(uw(f,m,l,0,1)|0,130336,176,1)|0}g=ow(a,g)|0;}while((g|0)!=0)}k=vx(a,k)|0;}while((k|0)!=0)}k=iv(f,e,0)|0;if((c[e>>2]|0)>0){g=0;do{l=c[k+(g<<2)>>2]|0;m=ux(l)|0;if((m|0)!=0){j=m;do{m=mw(a,c[c[(c[j+8>>2]|0)+112>>2]>>2]|0)|0;if((m|0)!=0){n=m;do{m=c[c[(c[(c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0)+8>>2]|0)+112>>2]>>2]|0;if((j|0)!=(m|0)){o=uw(f,j,m,0,1)|0;Wx(o|0,130336,176,1)|0;xw(l,o,1)|0}n=ow(a,n)|0;}while((n|0)!=0)}j=vx(l,j)|0;}while((j|0)!=0)}g=g+1|0;}while((g|0)<(c[e>>2]|0))}g=ux(f)|0;if((g|0)==0){p=c[e>>2]|0;c[b>>2]=p;i=d;return k|0}else{q=g}do{g=mw(f,q)|0;if((g|0)!=0){a=g;do{g=jk(8)|0;c[(c[a+8>>2]|0)+120>>2]=g;a=ow(f,a)|0;}while((a|0)!=0)}q=vx(f,q)|0;}while((q|0)!=0);p=c[e>>2]|0;c[b>>2]=p;i=d;return k|0}function Kq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=i;i=i+40|0;d=b|0;e=b+8|0;if((Lw(a)|0)==0){i=b;return}f=Jq(a,d)|0;g=c[d>>2]|0;d=c[f>>2]|0;do{if((g|0)==1){Hq(d,a);j=c[f>>2]|0;k=ux(j)|0;if((k|0)!=0){l=k;do{k=l+8|0;m=c[k>>2]|0;n=(c[c[m+112>>2]>>2]|0)+8|0;h[c[(c[n>>2]|0)+132>>2]>>3]=+h[c[m+132>>2]>>3];h[(c[(c[n>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[k>>2]|0)+132>>2]|0)+8>>3];l=vx(j,l)|0;}while((l|0)!=0)}nr(a)|0}else{l=c[d+48>>2]|0;tv(a,2,8,e)|0;j=(g|0)>0;if(j){o=0}else{sv(g,f,l,e)|0;break}do{k=c[f+(o<<2)>>2]|0;Hq(k,a);nr(k)|0;o=o+1|0;}while((o|0)<(g|0));sv(g,f,l,e)|0;if(j){p=0}else{break}do{k=c[f+(p<<2)>>2]|0;n=ux(k)|0;if((n|0)!=0){m=n;do{n=m+8|0;q=c[n>>2]|0;r=(c[c[q+112>>2]>>2]|0)+8|0;h[c[(c[r>>2]|0)+132>>2]>>3]=+h[c[q+132>>2]>>3];h[(c[(c[r>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[n>>2]|0)+132>>2]|0)+8>>3];m=vx(k,m)|0;}while((m|0)!=0)}p=p+1|0;}while((p|0)<(g|0))}}while(0);eF(f);i=b;return}function Lq(a){a=a|0;if((Lw(a)|0)==0){return}Iq(a);Kq(a);eF(c[(c[(ux(a)|0)+8>>2]|0)+112>>2]|0);Pt(a);Xk(a);return}function Mq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=ux(a)|0;if((b|0)==0){return}d=a+8|0;e=c[(c[d>>2]|0)+132>>2]|0;f=ux(e)|0;if((f|0)!=0){g=f;do{f=mw(e,g)|0;if((f|0)!=0){h=f;do{eF(c[(c[h+8>>2]|0)+120>>2]|0);h=ow(e,h)|0;}while((h|0)!=0)}h=g+8|0;eF(c[(c[h>>2]|0)+112>>2]|0);eF(c[(c[h>>2]|0)+132>>2]|0);g=vx(e,g)|0;}while((g|0)!=0)}Kw(e)|0;e=b;do{b=mw(a,e)|0;if((b|0)!=0){g=b;do{tn(g);g=ow(a,g)|0;}while((g|0)!=0)}un(e);e=vx(a,e)|0;}while((e|0)!=0);eF(c[(c[d>>2]|0)+144>>2]|0);if((Ix(a|0)|0)==(a|0)){return}_x(a,0,116128);return}function Nq(){return $g(17840,c[43330]|0)|0}function Oq(a){a=a|0;Vg(a)|0;return}function Pq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d|0;f=b+8|0;c[e+8>>2]=c[(c[f>>2]|0)+236>>2];g=(Hc[c[a>>2]&63](a,e,1)|0)+12|0;c[(c[f>>2]|0)+164>>2]=c[g>>2];c[g>>2]=b;i=d;return}function Qq(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d|0;f=b+8|0;c[e+8>>2]=c[(c[f>>2]|0)+236>>2];g=a|0;h=Hc[c[g>>2]&63](a,e,4)|0;if((h|0)==0){cc(129488,159160,107,170032)}e=h+12|0;j=c[e>>2]|0;if((j|0)==(b|0)){k=c[(c[f>>2]|0)+164>>2]|0;c[e>>2]=k;if((k|0)!=0){i=d;return}Hc[c[g>>2]&63](a,h,2)|0;i=d;return}h=c[(c[j+8>>2]|0)+164>>2]|0;a=h;g=(h|0)!=0;if(g&(a|0)!=(b|0)){k=h;e=a;while(1){a=c[(c[k+8>>2]|0)+164>>2]|0;f=a;l=(a|0)!=0;if(l&(f|0)!=(b|0)){k=a;e=f}else{m=e;n=a;o=l;break}}}else{m=j;n=h;o=g}if(!o){i=d;return}c[(c[m+8>>2]|0)+164>>2]=c[(c[n+8>>2]|0)+164>>2];i=d;return}function Rq(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a|0;d=Hc[c[b>>2]&63](a,0,128)|0;if((d|0)==0){e=0;return e|0}f=d+12|0;g=c[f>>2]|0;h=c[(c[g+8>>2]|0)+164>>2]|0;c[f>>2]=h;if((h|0)!=0){e=g;return e|0}Hc[c[b>>2]&63](a,d,2)|0;e=g;return e|0}function Sq(a,b,d){a=a|0;b=b|0;d=d|0;d=kk(16)|0;c[d+12>>2]=0;c[d+8>>2]=c[b+8>>2];return d|0}function Tq(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Uq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;b=c[d>>2]|0;if((e|0)<(b|0)){f=-1;return f|0}f=(e|0)>(b|0)|0;return f|0}function Vq(){return $g(173264,c[43330]|0)|0}function Wq(a){a=a|0;Vg(a)|0;return}function Xq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d|0;c[e+8>>2]=b;Hc[c[a>>2]&63](a,e,1)|0;i=d;return}function Yq(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;i=i+16|0;e=d|0;c[e+8>>2]=b;Hc[c[a>>2]&63](a,e,2)|0;i=d;return}function Zq(a,b,d){a=a|0;b=b|0;d=d|0;d=kk(12)|0;c[d+8>>2]=c[b+8>>2];return d|0}function _q(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function $q(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;b=c[d>>2]|0;if(e>>>0>b>>>0){f=1;return f|0}f=(e>>>0<b>>>0)<<31>>31;return f|0}function ar(){return jk(12)|0}function br(a){a=a|0;var b=0,d=0;if((a|0)==0){return}b=c[a>>2]|0;if((b|0)!=0){d=b;while(1){b=c[d+4>>2]|0;eF(d);if((b|0)==0){break}else{d=b}}}eF(a);return}function cr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=jk(12)|0;f=e;c[e>>2]=d;d=a+8|0;c[d>>2]=(c[d>>2]|0)+1;d=c[a+4>>2]|0;if(!((b|0)==0|(d|0)==(b|0))){g=b+4|0;h=c[g>>2]|0;c[g>>2]=f;c[e+8>>2]=b;c[h+8>>2]=f;c[e+4>>2]=h;return}if((d|0)==0){c[a>>2]=f}else{c[d+4>>2]=f}c[e+8>>2]=d;c[e+4>>2]=0;c[a+4>>2]=f;return}function dr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=a|0;e=c[d>>2]|0;if((e|0)==(b|0)){return}f=b+8|0;g=c[f>>2]|0;c[d>>2]=b;c[f>>2]=0;f=a+4|0;c[(c[f>>2]|0)+4>>2]=e;c[e+8>>2]=c[f>>2];c[f>>2]=g;c[g+4>>2]=0;return}function er(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=jk(12)|0;d=b;e=c[a>>2]|0;if((e|0)==0){return d|0}a=b+8|0;f=b+4|0;g=b;b=0;h=e;while(1){e=c[h>>2]|0;i=jk(12)|0;j=i;c[i>>2]=e;c[a>>2]=(c[a>>2]|0)+1;e=c[f>>2]|0;if((b|0)==0|(e|0)==(b|0)){if((e|0)==0){c[g>>2]=j}else{c[e+4>>2]=j}c[i+8>>2]=e;c[i+4>>2]=0;c[f>>2]=j;k=j}else{e=b+4|0;l=c[e>>2]|0;c[e>>2]=j;c[i+8>>2]=b;c[l+8>>2]=j;c[i+4>>2]=l;k=c[f>>2]|0}l=c[h+4>>2]|0;if((l|0)==0){break}else{b=k;h=l}}return d|0}function fr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=a|0;g=c[f>>2]|0;if((g|0)==0){cc(107032,150440,217,170480)}else{h=g}while(1){if((c[h>>2]|0)==(b|0)){break}g=c[h+4>>2]|0;if((g|0)==0){i=12;break}else{h=g}}if((i|0)==12){cc(107032,150440,217,170480)}b=h+8|0;g=c[b>>2]|0;j=h+4|0;k=c[j>>2]|0;if((g|0)==0){c[f>>2]=k}else{c[g+4>>2]=k}if((k|0)==0){c[a+4>>2]=g}else{c[k+8>>2]=g}if((h|0)==0){cc(107032,150440,217,170480)}g=c[f>>2]|0;if((g|0)==0){return}else{l=0;m=g}while(1){if((c[m>>2]|0)==(d|0)){break}k=c[m+4>>2]|0;if((k|0)==0){i=22;break}else{l=m;m=k}}if((i|0)==22){return}if((e|0)==0){if((m|0)==(g|0)){c[f>>2]=h;c[j>>2]=g;c[b>>2]=0;c[g+8>>2]=h;return}else{c[l+4>>2]=h;c[b>>2]=l;c[j>>2]=m;c[m+8>>2]=h;return}}else{l=a+4|0;if((m|0)==(c[l>>2]|0)){c[l>>2]=h;c[j>>2]=0;c[b>>2]=m;c[m+4>>2]=h;return}else{c[b>>2]=m;b=m+4|0;c[j>>2]=c[b>>2];c[(c[b>>2]|0)+8>>2]=h;c[b>>2]=h;return}}}function gr(a){a=a|0;return c[a+8>>2]|0}function hr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=b|0;e=c[d>>2]|0;if((e|0)==0){f=0}else{g=e;while(1){e=g+4|0;h=c[e>>2]|0;i=g+8|0;c[e>>2]=c[i>>2];c[i>>2]=h;if((h|0)==0){break}else{g=h}}f=c[d>>2]|0}g=b+4|0;h=c[g>>2]|0;c[g>>2]=f;c[d>>2]=h;if((h|0)==0){j=b;eF(j);return}f=a+4|0;c[(c[f>>2]|0)+4>>2]=h;c[(c[d>>2]|0)+8>>2]=c[f>>2];c[f>>2]=c[g>>2];g=a+8|0;c[g>>2]=(c[g>>2]|0)+(c[b+8>>2]|0);j=b;eF(j);return}function ir(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;d=i;i=i+8|0;e=d|0;f=ew(b|0,105224)|0;if((f|0)==0){g=0;i=d;return g|0}if((a[f]|0)==0){g=0;i=d;return g|0}j=+sF(f,e);do{if((c[e>>2]|0)==(f|0)){if((Km(f)|0)<<24>>24==0){g=0}else{k=0.0;break}i=d;return g|0}else{if(j>180.0){l=j;while(1){m=l+-360.0;if(m>180.0){l=m}else{n=m;break}}}else{n=j}if(n>-180.0){k=n;break}else{o=n}while(1){l=o+360.0;if(l>-180.0){k=l;break}else{o=l}}}}while(0);o=k/180.0*3.141592653589793;f=c[(c[(ux(b)|0)+8>>2]|0)+132>>2]|0;k=+h[f>>3];n=+h[f+8>>3];f=ux(b)|0;if((f|0)!=0){e=f;do{f=e+8|0;p=c[(c[f>>2]|0)+132>>2]|0;h[p>>3]=+h[p>>3]-k;p=(c[(c[f>>2]|0)+132>>2]|0)+8|0;h[p>>3]=+h[p>>3]-n;e=vx(b,e)|0;}while((e|0)!=0)}e=(k!=0.0|n!=0.0)&1;p=ux(b)|0;if((p|0)==0){g=e;i=d;return g|0}else{q=p}while(1){r=mw(b,q)|0;if((r|0)!=0){break}p=vx(b,q)|0;if((p|0)==0){g=e;s=17;break}else{q=p}}if((s|0)==17){i=d;return g|0}s=c[r>>2]&3;q=c[(c[(c[((s|0)==2?r:r-32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;p=c[(c[(c[((s|0)==3?r:r+32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;n=+h[p+8>>3];k=+h[p>>3];j=o- +$(+(+h[q+8>>3]-n),+(+h[q>>3]-k));if(j==0.0){g=e;i=d;return g|0}o=+V(j);l=+W(j);e=ux(b)|0;if((e|0)==0){g=1;i=d;return g|0}else{t=e}while(1){e=t+8|0;q=c[(c[e>>2]|0)+132>>2]|0;p=q;j=+h[p>>3]-k;m=+h[q+8>>3]-n;h[p>>3]=k+(o*j-l*m);h[(c[(c[e>>2]|0)+132>>2]|0)+8>>3]=n+(l*j+o*m);e=vx(b,t)|0;if((e|0)==0){g=1;break}else{t=e}}i=d;return g|0}function jr(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=ew(a|0,108352)|0;if((d|0)==0){e=(c|0)!=0?c:213376}else{e=d}return kr(a,e,b)|0}function kr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+8|0;g=f|0;do{if((d|0)!=0){if((a[d]|0)==0){break}else{j=74640;k=129464}while(1){l=j+16|0;if((qm(d,k,c[j+8>>2]|0)|0)==0){m=6;break}n=c[j+20>>2]|0;if((n|0)==0){o=l;break}else{j=l;k=n}}do{if((m|0)==6){if((c[j+12>>2]|0)==0){Fv(0,142304,(p=i,i=i+8|0,c[p>>2]=k,p)|0)|0;i=p;q=74640}else{q=j}n=q|0;c[e>>2]=c[n>>2];c[e+4>>2]=c[q+12>>2];if((c[n>>2]|0)!=18){o=q;break}n=ac(d+(c[q+8>>2]|0)|0,136656,(p=i,i=i+8|0,c[p>>2]=g,p)|0)|0;i=p;l=c[g>>2]|0;c[e+8>>2]=(n|0)>0&(l|0)>-1?l:1e3;h[e+16>>3]=+Fm(b|0,Wv(b,0,133752,0)|0,-4.0,-1.0e10);o=q}}while(0);if((c[o+4>>2]|0)!=0){i=f;return e|0}l=Vm(d,63)|0;do{if(l<<24>>24==63){Fv(0,139200,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;r=e|0}else{n=e|0;if(l<<24>>24==0){r=n;break}c[n>>2]=0;c[e+4>>2]=131664;i=f;return e|0}}while(0);c[r>>2]=1;c[e+4>>2]=126224;i=f;return e|0}}while(0);c[e>>2]=0;c[e+4>>2]=131664;i=f;return e|0}function lr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0.0,Q=0.0,R=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0.0,ma=0.0,na=0.0,oa=0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0,xa=0,ya=0;e=i;i=i+16|0;f=e|0;if((Lw(b)|0)<2){j=0;i=e;return j|0}k=ir(b)|0;l=d|0;m=c[l>>2]|0;if((m|0)==0){j=k;i=e;return j|0}if((a[213992]|0)==0){n=m}else{m=c[o>>2]|0;p=$w(b|0)|0;q=c[d+4>>2]|0;gc(m|0,97152,(r=i,i=i+16|0,c[r>>2]=p,c[r+8>>2]=q,r)|0)|0;i=r;n=c[l>>2]|0}if(n>>>0>2>>>0){switch(n|0){case 4:{s=Jr(b,0)|0;break};case 12:case 11:case 13:case 14:case 8:case 7:case 9:case 10:{Cr(b,n)|0;s=0;break};case 5:case 6:{s=0;break};case 3:{s=Jr(b,1)|0;break};case 15:{s=Jr(b,-1)|0;break};default:{Fv(0,91656,(r=i,i=i+8|0,c[r>>2]=c[d+4>>2],r)|0)|0;i=r;s=0}}j=s+k|0;i=e;return j|0}c[44272]=Lw(b)|0;Zr();c[44274]=kk((c[44272]|0)*96|0)|0;s=ux(b)|0;d=c[44274]|0;or(f,b);t=+g[f>>2];u=+g[f+4>>2];if((a[f+8|0]|0)==0){v=4;w=t;x=u}else{v=2;w=t/72.0;x=u/72.0}f=c[44272]|0;a:do{if((f|0)>0){n=s;q=0;p=d;while(1){m=n+8|0;h[p+8>>3]=+h[c[(c[m>>2]|0)+132>>2]>>3];h[p+16>>3]=+h[(c[(c[m>>2]|0)+132>>2]|0)+8>>3];if((Fc[v&7](p+40|0,n,w,x)|0)!=0){break}c[p+24>>2]=q;c[p+28>>2]=1;c[p>>2]=n;c[p+88>>2]=0;m=vx(b,n)|0;y=q+1|0;z=c[44272]|0;if((y|0)<(z|0)){n=m;q=y;p=p+96|0}else{A=z;break a}}eF(c[44274]|0);c[44274]=0;if((c[44272]|0)>0){p=0;q=0;while(1){Xt(q+40|0);n=p+1|0;if((n|0)<(c[44272]|0)){p=n;q=q+96|0}else{break}}}Wt();xs();eF(c[44274]|0);eF(c[43762]|0);c[43762]=0;j=k;i=e;return j|0}else{A=f}}while(0);f=c[44274]|0;x=+h[f+8>>3];w=+h[f+16>>3];u=x+ +h[f+40>>3];t=w+ +h[f+48>>3];B=x+ +h[f+56>>3];x=w+ +h[f+64>>3];if((A|0)>1){w=x;C=t;D=B;E=u;v=1;d=f;while(1){F=+h[d+104>>3];G=+h[d+112>>3];H=F+ +h[d+136>>3];I=G+ +h[d+144>>3];J=F+ +h[d+152>>3];F=G+ +h[d+160>>3];G=H<E?H:E;H=I<C?I:C;I=J>D?J:D;J=F>w?F:w;f=v+1|0;if((f|0)<(A|0)){w=J;C=H;D=I;E=G;v=f;d=d+96|0}else{K=J;L=H;M=I;N=G;break}}}else{K=x;L=t;M=B;N=u}d=ew(b|0,145272)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}h[2485]=+rF(d)}}while(0);u=+h[2485];B=(K-L)*u;t=(M-N)*u;u=N-t;N=L-B;L=M+t;t=K+B;h[1539]=u;h[1540]=L;h[1537]=N;h[1538]=t;h[21847]=u;h[22132]=u;h[21884]=L;h[22143]=L;h[22144]=t;h[22133]=t;h[21885]=N;h[21848]=N;d=(c[l>>2]|0)==2;l=qr(0)|0;b=(l|0)==0;do{if(d){if(b){O=71;break}rr();v=0;do{if((c[44272]|0)>0){A=c[44274]|0;f=0;while(1){s=A+8|0;h[s>>3]=+h[s>>3]*1.05;s=A+16|0;h[s>>3]=+h[s>>3]*1.05;s=f+1|0;if((s|0)<(c[44272]|0)){A=A+96|0;f=s}else{break}}}v=v+1|0;}while((qr(v)|0)!=0);if((a[213992]|0)==0){O=72;break}gc(c[o>>2]|0,154672,(r=i,i=i+8|0,c[r>>2]=v,r)|0)|0;i=r;O=72}else{if(b){O=71;break}rr();f=c[43762]|0;N=+h[c[f>>2]>>3];h[10]=N;t=+h[c[f>>2]>>3];h[11]=t;A=c[44272]|0;if((A|0)>1){s=1;L=N;u=t;while(1){q=f+(s<<2)|0;B=+h[c[q>>2]>>3];if(B<L){h[10]=B;P=B;Q=+h[c[q>>2]>>3]}else{P=L;Q=B}if(Q>u){h[11]=Q;R=Q}else{R=u}q=s+1|0;if((q|0)<(A|0)){s=q;L=P;u=R}else{T=R;U=P;break}}}else{T=t;U=N}u=+h[(c[f>>2]|0)+8>>3];h[8]=u;L=+h[(c[f+(A-1<<2)>>2]|0)+8>>3];h[9]=L;h[3711]=L-u;h[3712]=T-U;Iu(0,2);s=0;v=1;q=l;p=1;while(1){n=c[44274]|0;z=n+8|0;u=+_r(z,174776);L=+_r(z,177056);B=+_r(z,175072);K=+_r(z,177144);if((c[44272]|0)>1){z=n;y=n;m=n;V=n;M=u;u=L;L=B;B=K;W=1;X=n;while(1){Y=X+96|0;Z=X+104|0;K=+_r(Z,174776);_=K<M;$=_?Y:z;x=+_r(Z,175072);aa=x<L;ba=aa?Y:m;E=+_r(Z,177056);ca=E<u;da=ca?Y:y;D=+_r(Z,177144);Z=D<B;ea=Z?Y:V;fa=W+1|0;if((fa|0)<(c[44272]|0)){z=$;y=da;m=ba;V=ea;M=_?K:M;u=ca?E:u;L=aa?x:L;B=Z?D:B;W=fa;X=Y}else{ga=$;ha=da;ia=ba;ja=ea;break}}}else{ga=n;ha=n;ia=n;ja=n}ys(ga+8|0,+h[21847],+h[21848]);ys(ia+8|0,+h[21884],+h[21885]);ys(ha+8|0,+h[22132],+h[22133]);ys(ja+8|0,+h[22143],+h[22144]);X=c[44272]|0;if((X|0)>0){W=a[28952]|0;V=0;m=n;y=X;while(1){if(W){O=49}else{if((c[m+32>>2]|0)==0){ka=y}else{O=49}}if((O|0)==49){O=0;X=c[m+88>>2]|0;z=c[X>>2]|0;ea=c[z>>2]|0;if((ea|0)==0){la=0.0;ma=0.0;na=0.0}else{B=+h[X+8>>3];L=+h[X+16>>3];u=0.0;M=0.0;D=0.0;X=ea;x=+h[z+8>>3];E=+h[z+16>>3];while(1){K=+h[X+8>>3];C=+h[X+16>>3];w=+S(+((L-E)*K+(B*(E-C)+x*(C-L))))*.5;G=M+w*((B+x+K)/3.0);I=D+w*((L+E+C)/3.0);H=u+w;z=c[X>>2]|0;if((z|0)==0){la=H;ma=G;na=I;break}else{u=H;M=G;D=I;X=z;x=K;E=C}}}h[m+8>>3]=ma/la;h[m+16>>3]=na/la;ka=c[44272]|0}X=V+1|0;if((X|0)<(ka|0)){V=X;m=m+96|0;y=ka}else{break}}}y=qr(p)|0;if((y|0)==0){break}m=(y|0)<(q|0)?0:v;a[28952]=1;if((m|0)==0){oa=s}else{E=+h[1540];x=+h[1538];D=+h[1539];M=+h[1537];u=(x-M)*.05;L=(E-D)*.05;B=E+L;E=x+u;x=D-L;L=M-u;h[1539]=x;h[1540]=B;h[1537]=L;h[1538]=E;h[21847]=x;h[22132]=x;h[21884]=B;h[22143]=B;h[22144]=E;h[22133]=E;h[21885]=L;h[21848]=L;oa=s+1|0}V=c[43762]|0;if((V|0)==0){W=kk(c[44272]<<2)|0;c[43762]=W;c[45154]=W+(c[44272]<<2);pa=W}else{pa=V}V=c[44274]|0;xs();W=c[44272]|0;if((W|0)>0){n=0;X=pa;z=V;while(1){c[X>>2]=z+8;c[z+88>>2]=0;c[z+28>>2]=1;V=n+1|0;ea=c[44272]|0;if((V|0)<(ea|0)){n=V;X=X+4|0;z=z+96|0}else{qa=ea;break}}}else{qa=W}Jb(c[43762]|0,qa|0,4,138);z=c[43762]|0;c[44278]=z;L=+h[c[z>>2]>>3];h[10]=L;E=+h[c[z>>2]>>3];h[11]=E;X=c[44272]|0;if((X|0)>1){n=1;B=L;x=E;while(1){ea=z+(n<<2)|0;u=+h[c[ea>>2]>>3];if(u<B){h[10]=u;ra=u;sa=+h[c[ea>>2]>>3]}else{ra=B;sa=u}if(sa>x){h[11]=sa;ta=sa}else{ta=x}ea=n+1|0;if((ea|0)<(X|0)){n=ea;B=ra;x=ta}else{ua=ta;va=ra;break}}}else{ua=E;va=L}x=+h[(c[z>>2]|0)+8>>3];h[8]=x;B=+h[(c[z+(X-1<<2)>>2]|0)+8>>3];h[9]=B;h[3711]=B-x;h[3712]=ua-va;Iu(0,2);s=oa;v=m+1|0;q=y;p=p+1|0}if((a[213992]|0)!=0){q=c[o>>2]|0;gc(q|0,154672,(r=i,i=i+8|0,c[r>>2]=p,r)|0)|0;i=r;gc(q|0,151384,(r=i,i=i+8|0,c[r>>2]=s,r)|0)|0;i=r}js();ls();au();Tr();O=72}}while(0);do{if((O|0)==71){wa=0;xa=c[44272]|0;O=75}else if((O|0)==72){if((c[44272]|0)<=0){ya=1;break}r=0;oa=c[44274]|0;while(1){qa=oa|0;h[c[(c[(c[qa>>2]|0)+8>>2]|0)+132>>2]>>3]=+h[oa+8>>3];h[(c[(c[(c[qa>>2]|0)+8>>2]|0)+132>>2]|0)+8>>3]=+h[oa+16>>3];qa=r+1|0;pa=c[44272]|0;if((qa|0)<(pa|0)){r=qa;oa=oa+96|0}else{wa=1;xa=pa;O=75;break}}}}while(0);do{if((O|0)==75){if((xa|0)<=0){ya=wa;break}oa=0;r=c[44274]|0;while(1){Xt(r+40|0);s=oa+1|0;if((s|0)<(c[44272]|0)){oa=s;r=r+96|0}else{ya=wa;break}}}}while(0);Wt();xs();eF(c[44274]|0);eF(c[43762]|0);c[43762]=0;j=ya+k|0;i=e;return j|0}function mr(a,b){a=a|0;b=b|0;var c=0,d=0,e=0;c=i;i=i+24|0;d=c|0;if((Lw(a)|0)<2){e=0}else{kr(a,b,d)|0;e=lr(a,d)|0}i=c;return e|0}function nr(a){a=a|0;var b=0,c=0,d=0,e=0;b=i;i=i+24|0;c=b|0;d=ew(a|0,108352)|0;if((Lw(a)|0)<2){e=0}else{kr(a,d,c)|0;e=lr(a,c)|0}i=b;return e|0}function or(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;e=i;i=i+40|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=d|0;d=ew(n,86424)|0;do{if((d|0)==0){p=10}else{q=d;while(1){r=q+1|0;if((Qa(a[q]|0)|0)==0){break}else{q=r}}s=(a[q]|0)==43;t=s&1;u=ac((s?r:q)|0,159680,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=l,v)|0)|0;i=v;if((u|0)==1){w=+g[k>>2];g[l>>2]=w;x=w}else if((u|0)==0){p=10;break}else{x=+g[k>>2]}if(s){y=x;z=+g[l>>2];A=t;break}else{y=x+1.0;z=+g[l>>2]+1.0;A=t;break}}}while(0);do{if((p|0)==10){l=ew(n,81608)|0;if((l|0)==0){y=4.0;z=4.0;A=1;break}k=l;while(1){B=k+1|0;if((Qa(a[k]|0)|0)==0){break}else{k=B}}q=(a[k]|0)==43;l=q&1;r=ac((q?B:k)|0,159680,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=j,v)|0)|0;i=v;if((r|0)==1){x=+g[f>>2];g[j>>2]=x;C=x}else if((r|0)==0){y=4.0;z=4.0;A=1;break}else{C=+g[f>>2]}x=C/.800000011920929;if(q){y=x;z=+g[j>>2]/.800000011920929;A=l;break}else{y=x+1.0;z=+g[j>>2]/.800000011920929+1.0;A=l;break}}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,167864,(v=i,i=i+24|0,c[v>>2]=A&255,h[v+8>>3]=y,h[v+16>>3]=z,v)|0)|0;i=v}g[b>>2]=y;g[b+4>>2]=z;a[b+8|0]=A;A=b+9|0;b=m|0;a[A]=a[b]|0;a[A+1|0]=a[b+1|0]|0;a[A+2|0]=a[b+2|0]|0;i=e;return}function pr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0.0;e=i;i=i+40|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=d|0;d=ew(n,81608)|0;do{if((d|0)==0){p=10}else{q=d;while(1){r=q+1|0;if((Qa(a[q]|0)|0)==0){break}else{q=r}}s=(a[q]|0)==43;t=s&1;u=ac((s?r:q)|0,159680,(v=i,i=i+16|0,c[v>>2]=k,c[v+8>>2]=l,v)|0)|0;i=v;if((u|0)==0){p=10;break}else if((u|0)==1){w=+g[k>>2];g[l>>2]=w;x=w}else{x=+g[k>>2]}if(s){y=x;z=+g[l>>2];A=t;break}else{y=x+1.0;z=+g[l>>2]+1.0;A=t;break}}}while(0);do{if((p|0)==10){l=ew(n,86424)|0;if((l|0)==0){y=3.200000047683716;z=3.200000047683716;A=1;break}k=l;while(1){B=k+1|0;if((Qa(a[k]|0)|0)==0){break}else{k=B}}q=(a[k]|0)==43;l=q&1;r=ac((q?B:k)|0,159680,(v=i,i=i+16|0,c[v>>2]=f,c[v+8>>2]=j,v)|0)|0;i=v;if((r|0)==1){x=+g[f>>2];g[j>>2]=x;C=x}else if((r|0)==0){y=3.200000047683716;z=3.200000047683716;A=1;break}else{C=+g[f>>2]}x=C/1.25;if(q){y=x;z=+g[j>>2]/1.25;A=l;break}else{y=x+1.0;z=+g[j>>2]/1.25+1.0;A=l;break}}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,163688,(v=i,i=i+24|0,c[v>>2]=A&255,h[v+8>>3]=y,h[v+16>>3]=z,v)|0)|0;i=v}g[b>>2]=y;g[b+4>>2]=z;a[b+8|0]=A;A=b+9|0;b=m|0;a[A]=a[b]|0;a[A+1|0]=a[b+1|0]|0;a[A+2|0]=a[b+2|0]|0;i=e;return}function qr(a){a=a|0;var b=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;b=i;e=c[44274]|0;f=c[44272]|0;a:do{if((f|0)>0){g=0;h=e;while(1){c[h+(g*96|0)+32>>2]=0;j=g+1|0;k=c[44272]|0;if((j|0)>=(k|0)){l=k;break a}g=j;h=c[44274]|0}}else{l=f}}while(0);if((l-1|0)>0){f=0;h=0;g=e;e=l;while(1){l=g+96|0;j=h+1|0;if((j|0)<(e|0)){k=g+8|0;m=g+40|0;n=g+32|0;p=f;q=j;r=l;while(1){if((_t(k,m,r+8|0,r+40|0)|0)==0){s=p}else{c[n>>2]=1;c[r+32>>2]=1;s=p+1|0}t=q+1|0;u=c[44272]|0;if((t|0)<(u|0)){p=s;q=t;r=r+96|0}else{v=s;w=u;break}}}else{v=f;w=e}if((j|0)<(w-1|0)){f=v;h=j;g=l;e=w}else{x=v;break}}}else{x=0}if((d[213992]|0)>>>0<=1>>>0){i=b;return x|0}gc(c[o>>2]|0,148496,(v=i,i=i+16|0,c[v>>2]=a,c[v+8>>2]=x,v)|0)|0;i=v;i=b;return x|0}function rr(){var a=0,b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0.0;a=c[43762]|0;if((a|0)==0){b=kk(c[44272]<<2)|0;c[43762]=b;c[45154]=b+(c[44272]<<2);d=b}else{d=a}a=c[44274]|0;xs();b=c[44272]|0;if((b|0)>0){e=0;f=d;d=a;while(1){c[f>>2]=d+8;c[d+88>>2]=0;c[d+28>>2]=1;a=e+1|0;g=c[44272]|0;if((a|0)<(g|0)){e=a;f=f+4|0;d=d+96|0}else{i=g;break}}}else{i=b}Jb(c[43762]|0,i|0,4,138);i=c[43762]|0;c[44278]=i;b=c[45154]|0;if(i>>>0<b>>>0){j=i}else{return}while(1){i=j+4|0;a:do{if(i>>>0<b>>>0){d=c[i>>2]|0;k=+h[d>>3];f=c[j>>2]|0;l=+h[f>>3];if(k!=l){m=i;break}n=+h[f+8>>3];if(+h[d+8>>3]!=n){m=i;break}e=j+8|0;b:do{if(e>>>0<b>>>0){g=2;a=e;while(1){o=c[a>>2]|0;if(+h[o>>3]!=l){p=g;q=a;break b}if(+h[o+8>>3]!=n){p=g;q=a;break b}o=g+1|0;r=a+4|0;if(r>>>0<b>>>0){g=o;a=r}else{p=o;q=r;break}}}else{p=2;q=e}}while(0);do{if(q>>>0<b>>>0){e=c[q>>2]|0;if(+h[e+8>>3]!=n){break}s=(+h[e>>3]-l)/+(p|0);if(i>>>0<q>>>0){t=i;u=1;v=d;w=k}else{m=q;break a}while(1){h[v>>3]=s*+(u|0)+w;e=t+4|0;if(e>>>0>=q>>>0){m=q;break a}a=c[e>>2]|0;t=e;u=u+1|0;v=a;w=+h[a>>3]}}}while(0);if(i>>>0<q>>>0){x=j;y=i;z=f;A=d;B=l}else{m=q;break}while(1){a=c[44274]|0;e=c[z+16>>2]|0;g=c[A+16>>2]|0;h[A>>3]=B+(+h[a+(e*96|0)+56>>3]- +h[a+(e*96|0)+40>>3]+(+h[a+(g*96|0)+56>>3]- +h[a+(g*96|0)+40>>3]))*.5;g=x+4|0;a=y+4|0;if(a>>>0>=q>>>0){m=q;break a}e=c[g>>2]|0;x=g;y=a;z=e;A=c[a>>2]|0;B=+h[e>>3]}}else{m=i}}while(0);if(m>>>0<b>>>0){j=m}else{break}}return}function sr(){var a=0,b=0;a=c[44278]|0;if(a>>>0>=(c[45154]|0)>>>0){b=0;return b|0}c[44278]=a+4;b=c[a>>2]|0;return b|0}function tr(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0,i=0.0,j=0.0;d=c[a>>2]|0;a=c[b>>2]|0;e=+h[d+8>>3];f=+h[a+8>>3];do{if(e<f){g=-1}else{if(e>f){g=1;break}i=+h[d>>3];j=+h[a>>3];if(i<j){g=-1;break}g=i>j|0}}while(0);return g|0}function ur(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;h=(d|0)>0;if(h){vF(e|0,-1|0,d<<2|0)|0}c[e+(a<<2)>>2]=0;i=f|0;c[c[i>>2]>>2]=a;a=f+12|0;c[a>>2]=0;j=f+8|0;c[j>>2]=1;k=f+4|0;if((c[b+8>>2]|0)==0){f=0;l=1;while(1){m=f+1|0;c[a>>2]=m;n=c[(c[i>>2]|0)+(f<<2)>>2]|0;o=c[e+(n<<2)>>2]|0;p=b+(n<<4)|0;if((c[p>>2]|0)>1){q=b+(n<<4)+4|0;n=o+1|0;r=1;do{s=c[(c[q>>2]|0)+(r<<2)>>2]|0;t=e+(s<<2)|0;do{if((c[t>>2]|0)<0){c[t>>2]=n;u=c[j>>2]|0;if((u|0)>=(c[k>>2]|0)){break}c[j>>2]=u+1;c[(c[i>>2]|0)+(u<<2)>>2]=s}}while(0);r=r+1|0;}while((r|0)<(c[p>>2]|0));v=c[a>>2]|0;w=c[j>>2]|0}else{v=m;w=l}if((v|0)<(w|0)){f=v;l=w}else{x=o;break}}}else{w=0;l=1;while(1){v=w+1|0;c[a>>2]=v;f=c[(c[i>>2]|0)+(w<<2)>>2]|0;p=c[e+(f<<2)>>2]|0;r=b+(f<<4)|0;if((c[r>>2]|0)>1){n=b+(f<<4)+4|0;q=b+(f<<4)+8|0;f=1;do{s=c[(c[n>>2]|0)+(f<<2)>>2]|0;t=e+(s<<2)|0;do{if((c[t>>2]|0)<0){c[t>>2]=~~+g[(c[q>>2]|0)+(f<<2)>>2]+p;u=c[j>>2]|0;if((u|0)>=(c[k>>2]|0)){break}c[j>>2]=u+1;c[(c[i>>2]|0)+(u<<2)>>2]=s}}while(0);f=f+1|0;}while((f|0)<(c[r>>2]|0));y=c[a>>2]|0;z=c[j>>2]|0}else{y=v;z=l}if((y|0)<(z|0)){w=y;l=z}else{x=p;break}}}if(!h){return}h=x+10|0;x=0;do{z=e+(x<<2)|0;if((c[z>>2]|0)<0){c[z>>2]=h}x=x+1|0;}while((x|0)<(d|0));return}function vr(a,b){a=a|0;b=b|0;c[a>>2]=kk(b<<2)|0;c[a+4>>2]=b;c[a+8>>2]=0;c[a+12>>2]=0;return}function wr(a){a=a|0;eF(c[a>>2]|0);return}function xr(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0,m=0.0,n=0;if((a[213992]|0)!=0){Ma(104808,25,1,c[o>>2]|0)|0}if((b|0)>0){f=0}else{g=b-1|0;i=Ms(d,e,g)|0;return i|0}do{j=d+(f<<2)|0;k=0.0;l=0;while(1){if((f|0)==(l|0)){m=k}else{m=k+ +h[(c[j>>2]|0)+(l<<3)>>3]}n=l+1|0;if((n|0)<(b|0)){k=m;l=n}else{break}}h[(c[j>>2]|0)+(f<<3)>>3]=-0.0-m;f=f+1|0;}while((f|0)<(b|0));g=b-1|0;i=Ms(d,e,g)|0;return i|0}function yr(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0;e=pu(d,d,0.0)|0;f=pu(d,d,0.0)|0;g=ux(b)|0;if((g|0)!=0){i=g;do{g=rw(b,i)|0;if((g|0)!=0){j=g;do{g=c[j>>2]&3;k=(c[c[((g|0)==3?j:j+32|0)+28>>2]>>2]|0)>>>4;l=(c[c[((g|0)==2?j:j-32|0)+28>>2]>>2]|0)>>>4;if((k|0)!=(l|0)){m=-1.0/+h[(c[j+8>>2]|0)+136>>3];h[(c[e+(l<<2)>>2]|0)+(k<<3)>>3]=m;h[(c[e+(k<<2)>>2]|0)+(l<<3)>>3]=m}j=sw(b,j,i)|0;}while((j|0)!=0)}i=vx(b,i)|0;}while((i|0)!=0)}if((a[213992]|0)!=0){Ma(104808,25,1,c[o>>2]|0)|0}i=(d|0)>0;if(i){j=0;do{l=e+(j<<2)|0;m=0.0;k=0;while(1){if((j|0)==(k|0)){n=m}else{n=m+ +h[(c[l>>2]|0)+(k<<3)>>3]}g=k+1|0;if((g|0)<(d|0)){m=n;k=g}else{break}}h[(c[l>>2]|0)+(j<<3)>>3]=-0.0-n;j=j+1|0;}while((j|0)<(d|0))}j=Ms(e,f,d-1|0)|0;if((j|0)==0|i^1){qu(e);qu(f);return j|0}i=b+8|0;b=0;do{k=f+(b<<2)|0;g=0;do{p=c[k>>2]|0;h[(c[(c[(c[i>>2]|0)+152>>2]|0)+(b<<2)>>2]|0)+(g<<3)>>3]=+h[p+(b<<3)>>3]+ +h[(c[f+(g<<2)>>2]|0)+(g<<3)>>3]- +h[p+(g<<3)>>3]*2.0;g=g+1|0;}while((g|0)<(d|0));b=b+1|0;}while((b|0)<(d|0));qu(e);qu(f);return j|0}function zr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0;f=i;i=i+64|0;j=f|0;k=f+16|0;l=f+32|0;m=f+48|0;n=kk(d<<4)|0;o=b<<2;p=kk(o)|0;q=p;r=kk(o)|0;s=r;t=kk(o)|0;u=t;v=kk(o)|0;w=v;x=(b|0)>0;if(x){y=0;do{c[u+(y<<2)>>2]=y;y=y+1|0;}while((y|0)<(b|0));y=b-1|0;Gs(a,u,0,y);z=0;while(1){c[w+(c[u+(z<<2)>>2]<<2)>>2]=z;A=z+1|0;if((A|0)<(b|0)){z=A}else{B=y;break}}}else{y=b-1|0;Gs(a,u,0,y);B=y}y=kk(B<<4)|0;z=(B|0)>0;if(z){A=0;while(1){C=c[u+(A<<2)>>2]|0;D=A+1|0;E=c[u+(D<<2)>>2]|0;F=+h[a+(E<<3)>>3]- +h[a+(C<<3)>>3];c[y+(A<<4)>>2]=C;c[y+(A<<4)+4>>2]=E;h[y+(A<<4)+8>>3]=F;if((D|0)<(B|0)){A=D}else{break}}}if((B|0)>-2){A=m;m=(B|0)/2|0;while(1){D=m;while(1){E=D<<1;C=E|1;do{if((E|0)<(B|0)){F=+h[y+(E<<4)+8>>3];G=+h[y+(D<<4)+8>>3];if(F<G){H=E;break}if(F!=G){I=15;break}if(((yb()|0)&1|0)==0){I=15}else{H=E}}else{I=15}}while(0);if((I|0)==15){I=0;H=D}do{if((C|0)<(B|0)){G=+h[y+(C<<4)+8>>3];F=+h[y+(H<<4)+8>>3];if(G>=F){if(G!=F){J=H;break}if(((yb()|0)&1|0)==0){J=H;break}}J=C}else{J=H}}while(0);if((J|0)==(D|0)){break}C=y+(J<<4)|0;c[A>>2]=c[C>>2];c[A+4>>2]=c[C+4>>2];c[A+8>>2]=c[C+8>>2];c[A+12>>2]=c[C+12>>2];E=y+(D<<4)|0;c[C>>2]=c[E>>2];c[C+4>>2]=c[E+4>>2];c[C+8>>2]=c[E+8>>2];c[C+12>>2]=c[E+12>>2];c[E>>2]=c[A>>2];c[E+4>>2]=c[A+4>>2];c[E+8>>2]=c[A+8>>2];c[E+12>>2]=c[A+12>>2];D=J}if((m|0)>0){m=m-1|0}else{break}}}if((b|0)>1){m=1;do{c[q+(c[u+(m<<2)>>2]<<2)>>2]=c[u+(m-1<<2)>>2];m=m+1|0;}while((m|0)<(b|0))}if(z){z=0;while(1){m=z+1|0;c[s+(c[u+(z<<2)>>2]<<2)>>2]=c[u+(m<<2)>>2];if((m|0)<(B|0)){z=m}else{break}}}if((d|0)<1|(B|0)==0){K=y;L=n;M=0}else{z=l;l=k;k=j;j=B;m=B;J=y;y=n;n=d;A=0;while(1){H=c[J>>2]|0;D=c[J+4>>2]|0;F=+h[J+8>>3];E=m-1|0;C=J;N=J+(E<<4)|0;c[C>>2]=c[N>>2];c[C+4>>2]=c[N+4>>2];c[C+8>>2]=c[N+8>>2];c[C+12>>2]=c[N+12>>2];N=0;while(1){O=N<<1;P=O|1;do{if((O|0)<(E|0)){G=+h[J+(O<<4)+8>>3];Q=+h[J+(N<<4)+8>>3];if(G<Q){R=O;break}if(G!=Q){I=35;break}if(((yb()|0)&1|0)==0){I=35}else{R=O}}else{I=35}}while(0);if((I|0)==35){I=0;R=N}do{if((P|0)<(E|0)){Q=+h[J+(P<<4)+8>>3];G=+h[J+(R<<4)+8>>3];if(Q>=G){if(Q!=G){S=R;break}if(((yb()|0)&1|0)==0){S=R;break}}S=P}else{S=R}}while(0);if((S|0)==(N|0)){break}P=J+(S<<4)|0;c[z>>2]=c[P>>2];c[z+4>>2]=c[P+4>>2];c[z+8>>2]=c[P+8>>2];c[z+12>>2]=c[P+12>>2];O=J+(N<<4)|0;c[P>>2]=c[O>>2];c[P+4>>2]=c[O+4>>2];c[P+8>>2]=c[O+8>>2];c[P+12>>2]=c[O+12>>2];c[O>>2]=c[z>>2];c[O+4>>2]=c[z+4>>2];c[O+8>>2]=c[z+8>>2];c[O+12>>2]=c[z+12>>2];N=S}if((A|0)<(n|0)){T=y;U=n}else{T=gF(y,n<<5)|0;U=n<<1}N=A+1|0;c[T+(A<<4)>>2]=H;c[T+(A<<4)+4>>2]=D;h[T+(A<<4)+8>>3]=F;O=c[w+(H<<2)>>2]|0;P=c[w+(D<<2)>>2]|0;do{if((O|0)>0){V=c[u+(O-1<<2)>>2]|0;W=s+(V<<2)|0;if((c[w+(c[W>>2]<<2)>>2]|0)>=(P|0)){X=J;Y=E;Z=j;break}G=+h[a+(D<<3)>>3]- +h[a+(V<<3)>>3];if((E|0)==(j|0)){_=gF(C,j<<5)|0;$=j<<1}else{_=J;$=j}c[_+(E<<4)>>2]=V;c[_+(E<<4)+4>>2]=D;h[_+(E<<4)+8>>3]=G;a:do{if((E|0)>0){aa=E;Q=G;while(1){ba=(aa|0)/2|0;ca=_+(ba<<4)+8|0;da=+h[ca>>3];if(Q>=da){if(Q!=da){break a}if(((yb()|0)&1|0)==0){break a}}ea=_+(aa<<4)|0;c[l>>2]=c[ea>>2];c[l+4>>2]=c[ea+4>>2];c[l+8>>2]=c[ea+8>>2];c[l+12>>2]=c[ea+12>>2];fa=_+(ba<<4)|0;c[ea>>2]=c[fa>>2];c[ea+4>>2]=c[fa+4>>2];c[ea+8>>2]=c[fa+8>>2];c[ea+12>>2]=c[fa+12>>2];c[fa>>2]=c[l>>2];c[fa+4>>2]=c[l+4>>2];c[fa+8>>2]=c[l+8>>2];c[fa+12>>2]=c[l+12>>2];if((aa|0)<=1){break a}aa=ba;Q=+h[ca>>3]}}}while(0);c[W>>2]=D;c[q+(D<<2)>>2]=V;X=_;Y=m;Z=$}else{X=J;Y=E;Z=j}}while(0);do{if((P|0)<(B|0)){E=c[u+(P+1<<2)>>2]|0;D=q+(E<<2)|0;if((c[w+(c[D>>2]<<2)>>2]|0)<=(O|0)){ga=X;ha=Y;ia=Z;break}F=+h[a+(E<<3)>>3]- +h[a+(H<<3)>>3];if((Y|0)==(Z|0)){ja=gF(X,Z<<5)|0;ka=Z<<1}else{ja=X;ka=Z}C=Y+1|0;c[ja+(Y<<4)>>2]=H;c[ja+(Y<<4)+4>>2]=E;h[ja+(Y<<4)+8>>3]=F;b:do{if((Y|0)>0){aa=Y;G=F;while(1){ca=(aa|0)/2|0;ba=ja+(ca<<4)+8|0;Q=+h[ba>>3];if(G>=Q){if(G!=Q){break b}if(((yb()|0)&1|0)==0){break b}}fa=ja+(aa<<4)|0;c[k>>2]=c[fa>>2];c[k+4>>2]=c[fa+4>>2];c[k+8>>2]=c[fa+8>>2];c[k+12>>2]=c[fa+12>>2];ea=ja+(ca<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];c[ea>>2]=c[k>>2];c[ea+4>>2]=c[k+4>>2];c[ea+8>>2]=c[k+8>>2];c[ea+12>>2]=c[k+12>>2];if((aa|0)<=1){break b}aa=ca;G=+h[ba>>3]}}}while(0);c[D>>2]=H;c[s+(H<<2)>>2]=E;ga=ja;ha=C;ia=ka}else{ga=X;ha=Y;ia=Z}}while(0);if((N|0)>=(d|0)|(ha|0)==0){K=ga;L=T;M=N;break}else{j=ia;m=ha;J=ga;y=T;n=U;A=N}}}eF(p);eF(r);eF(t);eF(v);eF(K);K=kk(o)|0;o=K;v=(M<<1)+b|0;t=v<<2;r=kk(t)|0;p=kk(t)|0;if(x){t=0;do{c[o+(t<<2)>>2]=1;t=t+1|0;}while((t|0)<(b|0))}if((M|0)>0){t=0;do{A=c[L+(t<<4)+4>>2]|0;U=o+(c[L+(t<<4)>>2]<<2)|0;c[U>>2]=(c[U>>2]|0)+1;U=o+(A<<2)|0;c[U>>2]=(c[U>>2]|0)+1;t=t+1|0;}while((t|0)<(M|0))}if((v|0)>0){t=0;do{g[p+(t<<2)>>2]=1.0;t=t+1|0;}while((t|0)<(v|0))}v=kk(b<<4)|0;t=v;c[e>>2]=t;if(x){x=0;e=r;r=p;while(1){c[t+(x<<4)>>2]=1;c[t+(x<<4)+8>>2]=r;c[t+(x<<4)+4>>2]=e;c[e>>2]=x;g[r>>2]=0.0;p=c[o+(x<<2)>>2]|0;U=x+1|0;if((U|0)<(b|0)){x=U;e=e+(p<<2)|0;r=r+(p<<2)|0}else{break}}}eF(K);if((M|0)==0){la=L;eF(la);i=f;return}K=v+8|0;v=M;do{v=v-1|0;M=c[L+(v<<4)>>2]|0;r=c[L+(v<<4)+4>>2]|0;e=t+(M<<4)|0;x=c[e>>2]|0;b=c[t+(M<<4)+4>>2]|0;c:do{if((x|0)>0){o=0;while(1){p=o+1|0;if((c[b+(o<<2)>>2]|0)==(r|0)){break c}if((p|0)<(x|0)){o=p}else{I=81;break}}}else{I=81}}while(0);do{if((I|0)==81){I=0;c[e>>2]=x+1;c[b+(x<<2)>>2]=r;N=t+(r<<4)|0;o=c[N>>2]|0;c[N>>2]=o+1;c[(c[t+(r<<4)+4>>2]|0)+(o<<2)>>2]=M;if((c[K>>2]|0)==0){break}o=c[t+(M<<4)+8>>2]|0;g[o>>2]=+g[o>>2]+-1.0;o=c[t+(r<<4)+8>>2]|0;g[o>>2]=+g[o>>2]+-1.0}}while(0);}while((v|0)!=0);la=L;eF(la);i=f;return}function Ar(a,b,d,e,f,g,h){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;h=h|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0;j=i;k=e<<3;l=kk(k)|0;m=l;n=kk(k)|0;o=n;p=kk(k)|0;q=p;r=kk(k)|0;s=r;t=kk(k)|0;u=t;v=kk(k)|0;k=v;Xs(e,d,k);if(h<<24>>24!=0){Ss(e,k);Ss(e,b)}Ts(a,e,b,s);Us(e,k,s,m);Xs(e,m,o);w=+Ys(e,m,m);a:do{if((g|0)>0){s=g-1|0;x=w;k=0;while(1){if(+Zs(e,m)<=f){y=0;break a}Ts(a,e,o,q);z=+Ys(e,o,q);if(z==0.0){y=0;break a}A=x/z;Ws(e,o,A,u);Vs(e,b,u,b);if((k|0)<(s|0)){Ws(e,q,A,q);Us(e,m,q,m);A=+Ys(e,m,m);if(x==0.0){break}Ws(e,o,A/x,o);Vs(e,m,o,o);B=A}else{B=x}h=k+1|0;if((h|0)<(g|0)){x=B;k=h}else{y=0;break a}}Fv(1,104304,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0)|0;i=k;y=1}else{y=0}}while(0);eF(l);eF(n);eF(p);eF(r);eF(t);eF(v);i=j;return y|0}function Br(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0;h=i;j=e<<2;k=jk(j)|0;l=k;m=jk(j)|0;n=m;o=jk(j)|0;p=o;q=jk(j)|0;j=q;$s(e,b);$s(e,d);at(a,e,b,j);$s(e,j);bt(e,d,j,l);ft(e,l,n);r=+gt(e,l,l);a:do{if((g|0)>0){j=g-1|0;s=r;d=0;while(1){if(+it(e,l)<=f){t=0;break a}$s(e,n);$s(e,b);$s(e,l);at(a,e,n,p);$s(e,p);u=+gt(e,n,p);if(u==0.0){t=0;break a}v=s/u;dt(e,b,v,n);if((d|0)<(j|0)){dt(e,l,-0.0-v,p);v=+gt(e,l,l);if(s==0.0){break}et(e,n,v/s,n);ct(e,l,n,n);w=v}else{w=s}x=d+1|0;if((x|0)<(g|0)){s=w;d=x}else{t=0;break a}}Fv(1,104304,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,d)|0)|0;i=d;t=1}else{t=0}}while(0);eF(k);eF(m);eF(o);eF(q);i=h;return t|0}function Cr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;e=i;i=i+16|0;f=e|0;j=Lw(b)|0;k=kk(j*48|0)|0;l=k;or(f,b);m=+g[f>>2];n=+g[f+4>>2];o=a[f+8|0]|0;f=ux(b)|0;if((f|0)!=0){p=m*5.0;q=n*5.0;if(o<<24>>24==0){o=l;r=f;while(1){s=c[r+8>>2]|0;t=c[s+132>>2]|0;u=+h[t>>3]*10.0*72.0;if(u<0.0){v=u+-.5}else{v=u+.5}w=~~v;u=+h[t+8>>3]*10.0*72.0;if(u<0.0){x=u+-.5}else{x=u+.5}t=~~x;u=p*+h[s+32>>3]*72.0;if(u<0.0){y=u+-.5}else{y=u+.5}z=~~y;u=q*+h[s+40>>3]*72.0;if(u<0.0){A=u+-.5}else{A=u+.5}s=~~A;c[o+12>>2]=w;c[o+16>>2]=t;c[o+20>>2]=r;c[o+32>>2]=w-z;c[o+36>>2]=t-s;c[o+40>>2]=z+w;c[o+44>>2]=s+t;t=vx(b,r)|0;if((t|0)==0){break}else{o=o+48|0;r=t}}}else{r=l;o=f;while(1){f=c[o+8>>2]|0;t=c[f+132>>2]|0;A=+h[t>>3]*10.0*72.0;if(A<0.0){B=A+-.5}else{B=A+.5}s=~~B;A=+h[t+8>>3]*10.0*72.0;if(A<0.0){C=A+-.5}else{C=A+.5}t=~~C;A=+h[f+32>>3]*.5*72.0;if(A<0.0){D=A+-.5}else{D=A+.5}w=~~((m+ +(~~D|0))*10.0);A=+h[f+40>>3]*.5*72.0;if(A<0.0){E=A+-.5}else{E=A+.5}f=~~((n+ +(~~E|0))*10.0);c[r+12>>2]=s;c[r+16>>2]=t;c[r+20>>2]=o;c[r+32>>2]=s-w;c[r+36>>2]=t-f;c[r+40>>2]=w+s;c[r+44>>2]=f+t;t=vx(b,o)|0;if((t|0)==0){break}else{r=r+48|0;o=t}}}}o=j-1|0;if((o|0)>0){F=0;G=l}else{H=0;eF(k);i=e;return H|0}a:while(1){r=G+48|0;t=F+1|0;if((t|0)<(j|0)){f=c[G+32>>2]|0;s=G+40|0;w=G+36|0;z=G+44|0;I=t;J=r;while(1){do{if((f|0)<=(c[J+40>>2]|0)){if((c[J+32>>2]|0)>(c[s>>2]|0)){break}if((c[w>>2]|0)>(c[J+44>>2]|0)){break}if((c[J+36>>2]|0)<=(c[z>>2]|0)){break a}}}while(0);K=I+1|0;if((K|0)<(j|0)){I=K;J=J+48|0}else{break}}}if((t|0)<(o|0)){F=t;G=r}else{H=0;L=49;break}}if((L|0)==49){eF(k);i=e;return H|0}switch(d|0){case 9:{Dr(b,l,j,140,1);Fr(b,l,j,142,1);break};case 10:{Fr(b,l,j,142,1);Dr(b,l,j,140,1);break};case 7:{Dr(b,l,j,204,1);Fr(b,l,j,142,1);L=42;break};case 8:{L=42;break};case 13:{L=43;break};case 14:{Fr(b,l,j,142,0);Dr(b,l,j,140,0);break};case 12:{Fr(b,l,j,162,0);Dr(b,l,j,140,0);break};default:{Dr(b,l,j,204,0);Fr(b,l,j,142,0)}}if((L|0)==42){Fr(b,l,j,162,1);Dr(b,l,j,140,1);L=43}if((L|0)==43){Dr(b,l,j,140,0);Fr(b,l,j,142,0)}if((j|0)>0){M=l;N=0}else{H=1;eF(k);i=e;return H|0}while(1){l=c[M+16>>2]|0;b=(c[M+20>>2]|0)+8|0;h[c[(c[b>>2]|0)+132>>2]>>3]=+(c[M+12>>2]|0)/72.0/10.0;h[(c[(c[b>>2]|0)+132>>2]|0)+8>>3]=+(l|0)/72.0/10.0;l=N+1|0;if((l|0)<(j|0)){M=M+48|0;N=l}else{H=1;break}}eF(k);i=e;return H|0}function Dr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=$g(40288,c[43332]|0)|0;h=(d|0)>0;if(h){i=g|0;j=0;k=b;while(1){c[k+8>>2]=c[k+12>>2];Hc[c[i>>2]&63](g,k,1)|0;l=j+1|0;if((l|0)<(d|0)){j=l;k=k+48|0}else{break}}}if((f|0)==0){m=Or(a,g,e,178)|0}else{m=Nr(g,e,178)|0}ok(m,2,2147483647)|0;if(h){h=0;e=b;while(1){b=e+12|0;a=c[(c[(c[e+24>>2]|0)+8>>2]|0)+232>>2]|0;f=a-(c[b>>2]|0)|0;c[b>>2]=a;a=e+32|0;c[a>>2]=(c[a>>2]|0)+f;a=e+40|0;c[a>>2]=(c[a>>2]|0)+f;f=h+1|0;if((f|0)<(d|0)){h=f;e=e+48|0}else{break}}}e=ux(m)|0;if((e|0)==0){n=Kw(m)|0;o=Vg(g)|0;return}else{p=e}do{e=p+8|0;h=c[e>>2]|0;d=c[h+172>>2]|0;if((d|0)==0){q=h}else{eF(d);q=c[e>>2]|0}e=c[q+180>>2]|0;if((e|0)!=0){eF(e)}p=vx(m,p)|0;}while((p|0)!=0);n=Kw(m)|0;o=Vg(g)|0;return}function Er(a,b){a=a|0;b=b|0;var d=0;if((c[a+36>>2]|0)>(c[b+44>>2]|0)){d=0;return d|0}d=(c[b+36>>2]|0)<=(c[a+44>>2]|0)|0;return d|0}function Fr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=$g(40288,c[43332]|0)|0;h=(d|0)>0;if(h){i=g|0;j=0;k=b;while(1){c[k+8>>2]=c[k+16>>2];Hc[c[i>>2]&63](g,k,1)|0;l=j+1|0;if((l|0)<(d|0)){j=l;k=k+48|0}else{break}}}if((f|0)==0){m=Or(a,g,e,98)|0}else{m=Nr(g,e,98)|0}ok(m,2,2147483647)|0;if(h){h=0;e=b;while(1){b=e+16|0;a=c[(c[(c[e+24>>2]|0)+8>>2]|0)+232>>2]|0;f=a-(c[b>>2]|0)|0;c[b>>2]=a;a=e+36|0;c[a>>2]=(c[a>>2]|0)+f;a=e+44|0;c[a>>2]=(c[a>>2]|0)+f;f=h+1|0;if((f|0)<(d|0)){h=f;e=e+48|0}else{break}}}e=ux(m)|0;if((e|0)==0){n=Kw(m)|0;o=Vg(g)|0;return}else{p=e}do{e=p+8|0;h=c[e>>2]|0;d=c[h+172>>2]|0;if((d|0)==0){q=h}else{eF(d);q=c[e>>2]|0}e=c[q+180>>2]|0;if((e|0)!=0){eF(e)}p=vx(m,p)|0;}while((p|0)!=0);n=Kw(m)|0;o=Vg(g)|0;return}function Gr(a,b){a=a|0;b=b|0;var d=0;if((c[a+32>>2]|0)>(c[b+40>>2]|0)){d=0;return d|0}d=(c[b+32>>2]|0)<=(c[a+40>>2]|0)|0;return d|0}function Hr(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=c[a+36>>2]|0;e=c[b+44>>2]|0;if((d|0)>(e|0)){f=0;return f|0}g=c[b+36>>2]|0;h=c[a+44>>2]|0;if((g|0)>(h|0)){f=0;return f|0}i=c[a+40>>2]|0;j=c[b+32>>2]|0;if((i|0)<(j|0)){f=1;return f|0}k=c[b+16>>2]|0;l=c[a+16>>2]|0;f=(((i-j-(c[a+32>>2]|0)+(c[b+40>>2]|0)|0)/2|0)-(c[b+12>>2]|0)+(c[a+12>>2]|0)|0)<=(((h-d+e-g|0)/2|0)+((k|0)<(l|0)?k-l|0:l-k|0)|0)|0;return f|0}function Ir(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=c[a+32>>2]|0;e=c[b+40>>2]|0;if((d|0)>(e|0)){f=0;return f|0}g=c[b+32>>2]|0;h=c[a+40>>2]|0;if((g|0)>(h|0)){f=0;return f|0}i=c[a+44>>2]|0;j=c[b+36>>2]|0;if((i|0)<(j|0)){f=1;return f|0}k=c[b+12>>2]|0;l=c[a+12>>2]|0;f=(((i-(c[a+36>>2]|0)+(c[b+44>>2]|0)-j|0)/2|0)-(c[b+16>>2]|0)+(c[a+16>>2]|0)|0)<=(((h-(g+d)+e|0)/2|0)+((k|0)<(l|0)?k-l|0:l-k|0)|0)|0;return f|0}function Jr(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0,q=0.0,r=0.0,s=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0.0,aa=0.0,ba=0,ca=0,da=0.0,ea=0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0;e=i;i=i+16|0;f=e|0;j=Lw(b)|0;k=kk(j*72|0)|0;l=k;or(f,b);m=+g[f>>2];n=+g[f+4>>2];p=(a[f+8|0]|0)!=0;if(p){q=m/72.0;r=n/72.0}else{q=m;r=n}f=ux(b)|0;if((f|0)!=0){n=q;q=r;s=f;f=l;while(1){u=c[s+8>>2]|0;r=+h[u+32>>3];if(p){v=q+ +h[u+40>>3]*.5;w=n+r*.5}else{v=q*+h[u+40>>3]*.5;w=n*r*.5}r=+h[c[u+132>>2]>>3];h[f>>3]=r;m=+h[(c[(c[s+8>>2]|0)+132>>2]|0)+8>>3];h[f+8>>3]=m;h[f+16>>3]=r-w;h[f+24>>3]=m-v;h[f+32>>3]=w+r;h[f+40>>3]=v+m;h[f+48>>3]=w;h[f+56>>3]=v;c[f+64>>2]=s;u=vx(b,s)|0;if((u|0)==0){break}else{s=u;f=f+72|0}}}a:do{if((d|0)<0){b:do{if((j|0)>0){f=l;s=0;v=0.0;c:while(1){b=f+72|0;p=s+1|0;if((p|0)>=(j|0)){break}w=+h[f+16>>3];u=f|0;x=f+8|0;y=f+56|0;z=f+48|0;A=f+32|0;B=f+24|0;C=f+40|0;D=b;E=p;n=v;while(1){do{if(w<=+h[D+32>>3]){if(+h[D+16>>3]>+h[A>>3]){break}if(+h[B>>3]>+h[D+40>>3]){break}if(+h[D+24>>3]<=+h[C>>3]){break b}}}while(0);q=+h[u>>3];m=+h[D>>3];if(q==m){F=t}else{F=(+h[z>>3]+ +h[D+48>>3])/+S(+(q-m))}m=+h[x>>3];q=+h[D+8>>3];if(m==q){G=t}else{G=(+h[y>>3]+ +h[D+56>>3])/+S(+(m-q))}q=G<F?G:F;m=q>n?q:n;H=E+1|0;if((H|0)<(j|0)){D=D+72|0;E=H;n=m}else{f=b;s=p;v=m;continue c}}}if(v==0.0){break}gc(c[o>>2]|0,103696,(s=i,i=i+8|0,h[s>>3]=v,s)|0)|0;i=s;I=v;J=v;break a}}while(0);eF(k);K=0;i=e;return K|0}else{s=kk((j<<4)+16|0)|0;d:do{if((j|0)>0){f=l;p=j;b=s;E=0;D=0;e:while(1){y=f+72|0;x=E+1|0;if((x|0)>=(j|0)){L=b;M=D;break d}z=f+16|0;u=f+32|0;C=f+24|0;B=f+40|0;A=f|0;H=f+8|0;N=f+56|0;O=f+48|0;P=y;Q=p;R=b;T=x;U=D;while(1){do{if(+h[z>>3]>+h[P+32>>3]){V=U;W=R;X=Q}else{if(+h[P+16>>3]>+h[u>>3]){V=U;W=R;X=Q;break}if(+h[C>>3]>+h[P+40>>3]){V=U;W=R;X=Q;break}if(+h[P+24>>3]>+h[B>>3]){V=U;W=R;X=Q;break}if((U|0)==(Q|0)){Y=U+j|0;Z=mk(R,(Y<<4)+16|0)|0;_=Y}else{Z=R;_=Q}n=+h[A>>3];w=+h[P>>3];do{if(n==w){$=t}else{m=(+h[O>>3]+ +h[P+48>>3])/+S(+(n-w));if(m>=1.0){$=m;break}$=1.0}}while(0);w=+h[H>>3];n=+h[P+8>>3];do{if(w==n){aa=t}else{m=(+h[N>>3]+ +h[P+56>>3])/+S(+(w-n));if(m>=1.0){aa=m;break}aa=1.0}}while(0);Y=U+1|0;h[Z+(Y<<4)>>3]=$;h[Z+(Y<<4)+8>>3]=aa;V=Y;W=Z;X=_}}while(0);Y=T+1|0;if((Y|0)>=(j|0)){f=y;p=X;b=W;E=x;D=V;continue e}P=P+72|0;Q=X;R=W;T=Y;U=V}}}else{L=s;M=0}}while(0);s=(M<<4)+16|0;D=mk(L,s)|0;E=D;if((M|0)==0){eF(D);eF(k);K=0;i=e;return K|0}do{if((d|0)==0){h[D>>3]=1.0;h[D+8>>3]=t;Jb(D+16|0,M|0,16,60);b=kk(s)|0;h[b+(M<<4)>>3]=+h[E+(M<<4)>>3];h[b+(M<<4)+8>>3]=1.0;if((M|0)>0){p=M;v=1.0;while(1){f=p-1|0;h[b+(f<<4)>>3]=+h[E+(f<<4)>>3];n=+h[E+(p<<4)+8>>3];w=n>v?n:v;h[b+(f<<4)+8>>3]=w;if((f|0)>0){p=f;v=w}else{break}}}if((M|0)<0){cc(148680,121688,834,170968);return 0}else{ba=0;ca=0;da=t}while(1){v=+h[b+(ca<<4)>>3]*+h[b+(ca<<4)+8>>3];p=v<da;ea=p?ca:ba;fa=p?v:da;if((ca|0)<(M|0)){ba=ea;ca=ca+1|0;da=fa}else{break}}if(fa<t){ga=+h[b+(ea<<4)>>3];ha=+h[b+(ea<<4)+8>>3];break}else{cc(148680,121688,834,170968);return 0}}else{if((M|0)<1){ga=0.0;ha=0.0;break}else{ia=0.0;ja=1;ka=E}while(1){p=ka+16|0;v=+h[p>>3];w=+h[ka+24>>3];n=v<w?v:w;w=n>ia?n:ia;if((ja|0)<(M|0)){ia=w;ja=ja+1|0;ka=p}else{ga=w;ha=w;break}}}}while(0);eF(D);I=ga;J=ha}}while(0);if((j|0)>0){ka=0;ja=l;while(1){l=ja+64|0;h[c[(c[(c[l>>2]|0)+8>>2]|0)+132>>2]>>3]=I*+h[ja>>3];h[(c[(c[(c[l>>2]|0)+8>>2]|0)+132>>2]|0)+8>>3]=J*+h[ja+8>>3];l=ka+1|0;if((l|0)<(j|0)){ka=l;ja=ja+72|0}else{break}}}eF(k);K=1;i=e;return K|0}function Kr(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0;c=+h[a>>3];d=+h[b>>3];do{if(c<d){e=-1}else{if(c>d){e=1;break}f=+h[a+8>>3];g=+h[b+8>>3];if(f<g){e=-1;break}e=f>g|0}}while(0);return e|0}function Lr(a,b){a=a|0;b=b|0;return((c[a+12>>2]|0)-(c[a+4>>2]|0)+(c[b+12>>2]|0)-(c[b+4>>2]|0)|0)/2|0|0}function Mr(a,b){a=a|0;b=b|0;return((c[a+8>>2]|0)-(c[a>>2]|0)+(c[b+8>>2]|0)-(c[b>>2]|0)|0)/2|0|0}function Nr(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;f=Hw(113056,173936,0)|0;Wx(f|0,106384,272,1)|0;g=Zg(a)|0;if((g|0)==0){h=0}else{i=0;j=-2147483647;k=g;while(1){g=c[k+8>>2]|0;l=((j|0)!=(g|0))+i|0;m=c[k>>2]|0;if((m|0)==0){h=l;break}else{i=l;j=g;k=m}}}k=f+8|0;j=(h<<3)-4|0;i=0;m=0;g=0;l=0;n=-2147483647;o=0;p=Zg(a)|0;while(1){q=c[p+8>>2]|0;do{if((n|0)==(q|0)){r=o;s=n;t=l;u=g;v=m;w=i}else{x=Ax(f,$w(c[p+20>>2]|0)|0,1)|0;Wx(x|0,100712,304,1)|0;y=x+8|0;c[(c[y>>2]|0)+112>>2]=p;if((m|0)==0){c[(c[k>>2]|0)+180>>2]=x;z=x}else{c[(c[o+8>>2]|0)+164>>2]=x;z=m}c[(c[y>>2]|0)+176>>2]=0;A=l+1|0;B=jk(A<<2)|0;c[(c[y>>2]|0)+172>>2]=B;if((i|0)==0){r=x;s=q;t=A;u=x;v=z;w=x;break}B=i+8|0;c[(c[B>>2]|0)+184>>2]=0;if((i|0)==(z|0)){C=jk(j)|0;c[(c[B>>2]|0)+180>>2]=C}else{C=jk(h-l<<2)|0;c[(c[B>>2]|0)+180>>2]=C}C=uw(f,i,x,0,1)|0;Wx(C|0,95048,176,1)|0;D=C+8|0;b[(c[D>>2]|0)+170>>1]=10;c[(c[D>>2]|0)+156>>2]=1;D=(c[B>>2]|0)+180|0;E=c[D>>2]|0;if((E|0)==0){F=kk((c[D+4>>2]<<2)+8|0)|0}else{F=mk(E,(c[D+4>>2]<<2)+8|0)|0}c[(c[B>>2]|0)+180>>2]=F;D=(c[B>>2]|0)+184|0;E=c[D>>2]|0;c[D>>2]=E+1;c[(c[(c[B>>2]|0)+180>>2]|0)+(E<<2)>>2]=C;E=(c[B>>2]|0)+180|0;c[(c[E>>2]|0)+(c[E+4>>2]<<2)>>2]=0;E=(c[y>>2]|0)+172|0;B=c[E>>2]|0;if((B|0)==0){G=kk((c[E+4>>2]<<2)+8|0)|0}else{G=mk(B,(c[E+4>>2]<<2)+8|0)|0}c[(c[y>>2]|0)+172>>2]=G;E=(c[y>>2]|0)+176|0;B=c[E>>2]|0;c[E>>2]=B+1;c[(c[(c[y>>2]|0)+172>>2]|0)+(B<<2)>>2]=C;C=(c[y>>2]|0)+172|0;c[(c[C>>2]|0)+(c[C+4>>2]<<2)>>2]=0;r=x;s=q;t=A;u=x;v=z;w=x}}while(0);c[p+24>>2]=u;q=c[p>>2]|0;if((q|0)==0){break}else{i=w;m=v;g=u;l=t;n=s;o=r;p=q}}p=w+8|0;c[(c[p>>2]|0)+184>>2]=0;w=jk(4)|0;c[(c[p>>2]|0)+180>>2]=w;w=Hw(84680,173936,0)|0;p=Zg(a)|0;if((p|0)!=0){r=p;do{p=Ax(w,$w(c[r+20>>2]|0)|0,1)|0;Wx(p|0,100712,304,1)|0;c[r+28>>2]=p;c[(c[p+8>>2]|0)+112>>2]=r;r=c[r>>2]|0;}while((r|0)!=0)}r=Zg(a)|0;a:do{if((r|0)!=0){a=0;p=-2147483647;o=r;while(1){s=o;n=c[o+8>>2]|0;if((p|0)==(n|0)){H=p;I=a}else{t=o;do{t=c[t>>2]|0;if((t|0)==0){break a}}while((c[t+8>>2]|0)==(n|0));H=n;I=t}if((I|0)!=0){l=o+28|0;u=I;do{if((Oc[d&255](s,u)|0)!=0){uw(w,c[l>>2]|0,c[u+28>>2]|0,0,1)|0}u=c[u>>2]|0;}while((u|0)!=0)}u=c[o>>2]|0;if((u|0)==0){break}else{a=I;p=H;o=u}}}}while(0);H=ux(w)|0;if((H|0)==0){J=Kw(w)|0;return f|0}else{K=H}do{H=c[(c[K+8>>2]|0)+112>>2]|0;I=c[H+24>>2]|0;d=mw(w,K)|0;if((d|0)!=0){r=H+32|0;H=I+8|0;o=d;do{d=c[(c[(c[((c[o>>2]&3|0)==2?o:o-32|0)+28>>2]|0)+8>>2]|0)+112>>2]|0;p=Oc[e&255](r,d+32|0)|0;a=c[d+24>>2]|0;d=uw(f,I,a,0,1)|0;Wx(d|0,95048,176,1)|0;u=d+8|0;c[(c[u>>2]|0)+156>>2]=1;l=c[u>>2]|0;s=b[l+170>>1]|0;if((s&65535|0)<(p|0)){if(s<<16>>16==0){s=(c[H>>2]|0)+180|0;t=c[s>>2]|0;if((t|0)==0){L=kk((c[s+4>>2]<<2)+8|0)|0}else{L=mk(t,(c[s+4>>2]<<2)+8|0)|0}c[(c[H>>2]|0)+180>>2]=L;s=(c[H>>2]|0)+184|0;t=c[s>>2]|0;c[s>>2]=t+1;c[(c[(c[H>>2]|0)+180>>2]|0)+(t<<2)>>2]=d;t=(c[H>>2]|0)+180|0;c[(c[t>>2]|0)+(c[t+4>>2]<<2)>>2]=0;t=a+8|0;a=(c[t>>2]|0)+172|0;s=c[a>>2]|0;if((s|0)==0){M=kk((c[a+4>>2]<<2)+8|0)|0}else{M=mk(s,(c[a+4>>2]<<2)+8|0)|0}c[(c[t>>2]|0)+172>>2]=M;a=(c[t>>2]|0)+176|0;s=c[a>>2]|0;c[a>>2]=s+1;c[(c[(c[t>>2]|0)+172>>2]|0)+(s<<2)>>2]=d;d=(c[t>>2]|0)+172|0;c[(c[d>>2]|0)+(c[d+4>>2]<<2)>>2]=0;N=c[u>>2]|0}else{N=l}b[N+170>>1]=p}o=ow(w,o)|0;}while((o|0)!=0)}K=vx(w,K)|0;}while((K|0)!=0);J=Kw(w)|0;return f|0}function Or(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;g=Hw(113056,173936,0)|0;Wx(g|0,106384,272,1)|0;h=Zg(d)|0;if((h|0)!=0){i=g+8|0;j=0;k=h;while(1){h=Ax(g,$w(c[k+20>>2]|0)|0,1)|0;Wx(h|0,100712,304,1)|0;l=h+8|0;c[(c[l>>2]|0)+112>>2]=k;c[k+24>>2]=h;c[(c[l>>2]|0)+176>>2]=0;m=jk(4)|0;c[(c[l>>2]|0)+172>>2]=m;c[(c[l>>2]|0)+184>>2]=0;m=jk(4)|0;c[(c[l>>2]|0)+180>>2]=m;if((j|0)==0){c[(c[i>>2]|0)+180>>2]=h}else{c[(c[j+8>>2]|0)+164>>2]=h}m=c[k>>2]|0;if((m|0)==0){break}else{j=h;k=m}}}k=Zg(d)|0;a:do{if((k|0)!=0){j=k;b:while(1){i=j;m=j|0;h=c[m>>2]|0;if((h|0)==0){break a}l=j+32|0;n=j+24|0;o=j+20|0;p=h;do{do{if((Oc[e&255](i,p)|0)!=0){h=Oc[f&255](l,p+32|0)|0;q=uw(g,c[n>>2]|0,c[p+24>>2]|0,0,1)|0;Wx(q|0,95048,176,1)|0;if((h|0)>=65536){break b}r=q+8|0;b[(c[r>>2]|0)+170>>1]=~~+(h|0);c[(c[r>>2]|0)+156>>2]=1;if((q|0)==0){break}if((uw(a,c[o>>2]|0,c[p+20>>2]|0,0,0)|0)==0){break}c[(c[r>>2]|0)+156>>2]=100}}while(0);p=c[p>>2]|0;}while((p|0)!=0);j=c[m>>2]|0;if((j|0)==0){break a}}cc(89688,121688,256,170216);return 0}}while(0);a=Zg(d)|0;if((a|0)==0){return g|0}else{s=a}do{a=c[s+24>>2]|0;d=mw(g,a)|0;if((d|0)!=0){f=a+8|0;a=d;do{d=(c[f>>2]|0)+180|0;e=c[d>>2]|0;if((e|0)==0){t=kk((c[d+4>>2]<<2)+8|0)|0}else{t=mk(e,(c[d+4>>2]<<2)+8|0)|0}c[(c[f>>2]|0)+180>>2]=t;d=(c[f>>2]|0)+184|0;e=c[d>>2]|0;c[d>>2]=e+1;c[(c[(c[f>>2]|0)+180>>2]|0)+(e<<2)>>2]=a;e=(c[f>>2]|0)+180|0;c[(c[e>>2]|0)+(c[e+4>>2]<<2)>>2]=0;e=a;d=a-32|0;k=(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172|0;j=c[k>>2]|0;if((j|0)==0){u=kk((c[k+4>>2]<<2)+8|0)|0}else{u=mk(j,(c[k+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172>>2]=u;k=(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+176|0;j=c[k>>2]|0;c[k>>2]=j+1;c[(c[(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(j<<2)>>2]=a;j=(c[(c[((c[e>>2]&3|0)==2?a:d)+28>>2]|0)+8>>2]|0)+172|0;c[(c[j>>2]|0)+(c[j+4>>2]<<2)>>2]=0;a=ow(g,a)|0;}while((a|0)!=0)}s=c[s>>2]|0;}while((s|0)!=0);return g|0}function Pr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b>>2]|0)-(c[d>>2]|0)|0}function Qr(a){a=a|0;var b=0;if((a|0)==0){return}b=c[a+4>>2]|0;if((b|0)!=0){eF(b)}b=c[a+8>>2]|0;if((b|0)!=0){eF(b)}eF(a);return}function Rr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=d<<2;c[45186]=gF(c[45186]|0,f)|0;h=(d|0)>0;if(h){i=0;do{c[e+(i<<2)>>2]=2147483647;i=i+1|0;}while((i|0)<(d|0))}c[e+(a<<2)>>2]=0;i=b+(a<<4)|0;if((c[i>>2]|0)>1){j=b+(a<<4)+8|0;k=b+(a<<4)+4|0;l=1;do{c[e+(c[(c[k>>2]|0)+(l<<2)>>2]<<2)>>2]=~~+g[(c[j>>2]|0)+(l<<2)>>2];l=l+1|0;}while((l|0)<(c[i>>2]|0))}i=c[45186]|0;if((d|0)==1){m=0;n=0;o=8}else{l=kk(f-4|0)|0;f=d-1|0;if(h){m=f;n=l;o=8}else{p=f;q=l}}if((o|0)==8){l=0;f=0;while(1){if((l|0)==(a|0)){r=f}else{c[n+(f<<2)>>2]=l;c[i+(l<<2)>>2]=f;r=f+1|0}j=l+1|0;if((j|0)<(d|0)){l=j;f=r}else{p=m;q=n;break}}}if((p|0)>-2){n=(p|0)/2|0;while(1){m=n;while(1){r=m<<1;f=r|1;if((r|0)<(p|0)){if((c[e+(c[q+(r<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(m<<2)>>2]<<2)>>2]|0)){s=r}else{o=17}}else{o=17}if((o|0)==17){o=0;s=m}if((f|0)<(p|0)){t=(c[e+(c[q+(f<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(s<<2)>>2]<<2)>>2]|0)?f:s}else{t=s}if((t|0)==(m|0)){break}f=q+(t<<2)|0;r=c[f>>2]|0;l=q+(m<<2)|0;c[f>>2]=c[l>>2];c[l>>2]=r;c[i+(c[f>>2]<<2)>>2]=t;c[i+(c[l>>2]<<2)>>2]=m;m=t}if((n|0)>0){n=n-1|0}else{break}}if((p|0)==0){u=-2147483639}else{v=p;w=-2147483639;o=25}}else{v=p;w=-2147483639;o=25}a:do{if((o|0)==25){while(1){o=0;p=c[45186]|0;n=c[q>>2]|0;t=v-1|0;i=c[q+(t<<2)>>2]|0;c[q>>2]=i;c[p+(i<<2)>>2]=0;i=0;while(1){s=i<<1;m=s|1;if((s|0)<(t|0)){if((c[e+(c[q+(s<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(i<<2)>>2]<<2)>>2]|0)){x=s}else{o=28}}else{o=28}if((o|0)==28){o=0;x=i}if((m|0)<(t|0)){y=(c[e+(c[q+(m<<2)>>2]<<2)>>2]|0)<(c[e+(c[q+(x<<2)>>2]<<2)>>2]|0)?m:x}else{y=x}if((y|0)==(i|0)){break}m=q+(y<<2)|0;s=c[m>>2]|0;l=q+(i<<2)|0;c[m>>2]=c[l>>2];c[l>>2]=s;c[p+(c[m>>2]<<2)>>2]=y;c[p+(c[l>>2]<<2)>>2]=i;i=y}i=c[e+(n<<2)>>2]|0;if((i|0)==2147483647){u=w;break a}p=b+(n<<4)|0;l=c[p>>2]|0;if((l|0)>1){m=b+(n<<4)+4|0;s=b+(n<<4)+8|0;f=1;r=l;while(1){l=c[(c[m>>2]|0)+(f<<2)>>2]|0;a=~~+g[(c[s>>2]|0)+(f<<2)>>2]+i|0;j=c[45186]|0;k=e+(l<<2)|0;if((c[k>>2]|0)>(a|0)){z=j+(l<<2)|0;A=c[z>>2]|0;c[k>>2]=a;b:do{if((A|0)>0){k=A;while(1){B=(k|0)/2|0;C=c[q+(B<<2)>>2]|0;if((c[e+(C<<2)>>2]|0)<=(a|0)){D=k;break b}c[q+(k<<2)>>2]=C;c[j+(C<<2)>>2]=k;if((k|0)>1){k=B}else{D=B;break}}}else{D=A}}while(0);c[q+(D<<2)>>2]=l;c[z>>2]=D;E=c[p>>2]|0}else{E=r}A=f+1|0;if((A|0)<(E|0)){f=A;r=E}else{break}}}r=i+10|0;if((t|0)==0){u=r;break}else{v=t;w=r;o=25}}}}while(0);if(h){h=0;do{o=e+(h<<2)|0;if((c[o>>2]|0)==2147483647){c[o>>2]=u}h=h+1|0;}while((h|0)<(d|0))}if((q|0)==0){return}eF(q);return}function Sr(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0;f=kk(d<<2)|0;h=f;i=(d|0)>0;if(i){j=0;do{g[e+(j<<2)>>2]=3.4028234663852886e+38;j=j+1|0;}while((j|0)<(d|0))}g[e+(a<<2)>>2]=0.0;j=b+(a<<4)|0;if((c[j>>2]|0)>1){k=b+(a<<4)+8|0;l=b+(a<<4)+4|0;m=1;do{g[e+(c[(c[l>>2]|0)+(m<<2)>>2]<<2)>>2]=+g[(c[k>>2]|0)+(m<<2)>>2];m=m+1|0;}while((m|0)<(c[j>>2]|0))}j=d-1|0;m=kk(j<<2)|0;k=m;if(i){i=0;l=0;while(1){if((i|0)==(a|0)){n=l}else{c[k+(l<<2)>>2]=i;c[h+(i<<2)>>2]=l;n=l+1|0}o=i+1|0;if((o|0)<(d|0)){i=o;l=n}else{break}}}if((j|0)>-2){n=(j|0)/2|0;while(1){l=n;while(1){i=l<<1;d=i|1;if((i|0)<(j|0)){if(+g[e+(c[k+(i<<2)>>2]<<2)>>2]<+g[e+(c[k+(l<<2)>>2]<<2)>>2]){p=i}else{q=15}}else{q=15}if((q|0)==15){q=0;p=l}do{if((d|0)<(j|0)){if(+g[e+(c[k+(d<<2)>>2]<<2)>>2]>=+g[e+(c[k+(p<<2)>>2]<<2)>>2]){r=p;break}r=d}else{r=p}}while(0);if((r|0)==(l|0)){break}d=k+(r<<2)|0;i=c[d>>2]|0;a=k+(l<<2)|0;c[d>>2]=c[a>>2];c[a>>2]=i;c[h+(c[d>>2]<<2)>>2]=r;c[h+(c[a>>2]<<2)>>2]=l;l=r}if((n|0)>0){n=n-1|0}else{break}}if((j|0)!=0){s=j;q=24}}else{s=j;q=24}a:do{if((q|0)==24){while(1){q=0;j=c[k>>2]|0;n=s-1|0;r=c[k+(n<<2)>>2]|0;c[k>>2]=r;c[h+(r<<2)>>2]=0;r=0;while(1){p=r<<1;l=p|1;if((p|0)<(n|0)){if(+g[e+(c[k+(p<<2)>>2]<<2)>>2]<+g[e+(c[k+(r<<2)>>2]<<2)>>2]){t=p}else{q=27}}else{q=27}if((q|0)==27){q=0;t=r}do{if((l|0)<(n|0)){if(+g[e+(c[k+(l<<2)>>2]<<2)>>2]>=+g[e+(c[k+(t<<2)>>2]<<2)>>2]){u=t;break}u=l}else{u=t}}while(0);if((u|0)==(r|0)){break}l=k+(u<<2)|0;p=c[l>>2]|0;a=k+(r<<2)|0;c[l>>2]=c[a>>2];c[a>>2]=p;c[h+(c[l>>2]<<2)>>2]=u;c[h+(c[a>>2]<<2)>>2]=r;r=u}v=+g[e+(j<<2)>>2];if(v==3.4028234663852886e+38){break a}r=b+(j<<4)|0;a=c[r>>2]|0;if((a|0)>1){l=b+(j<<4)+4|0;p=b+(j<<4)+8|0;d=1;i=a;while(1){a=c[(c[l>>2]|0)+(d<<2)>>2]|0;w=v+ +g[(c[p>>2]|0)+(d<<2)>>2];o=e+(a<<2)|0;if(+g[o>>2]>w){x=h+(a<<2)|0;y=c[x>>2]|0;g[o>>2]=w;b:do{if((y|0)>0){o=y;while(1){z=(o|0)/2|0;A=c[k+(z<<2)>>2]|0;if(+g[e+(A<<2)>>2]<=w){B=o;break b}c[k+(o<<2)>>2]=A;c[h+(A<<2)>>2]=o;if((o|0)>1){o=z}else{B=z;break}}}else{B=y}}while(0);c[k+(B<<2)>>2]=a;c[x>>2]=B;C=c[r>>2]|0}else{C=i}y=d+1|0;if((y|0)<(C|0)){d=y;i=C}else{break}}}if((n|0)==0){break}else{s=n;q=24}}}}while(0);if((m|0)==0){eF(f);return}eF(m);eF(f);return}function Tr(){nt(180656,48);c[44280]=0;return}function Ur(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0;d=ot(180656)|0;e=d;c[d+32>>2]=a;c[d+36>>2]=b;fu(a);fu(b);c[d+24>>2]=0;c[d+28>>2]=0;f=+h[a>>3];g=+h[b>>3]-f;i=+h[a+8>>3];j=+h[b+8>>3]-i;if(g>0.0){k=g}else{k=-0.0-g}if(j>0.0){l=j}else{l=-0.0-j}m=(g*g+j*j)*.5+(g*f+j*i);b=d+16|0;h[b>>3]=m;if(k>l){h[d>>3]=1.0;h[d+8>>3]=j/g;n=g;o=m/n;h[b>>3]=o;p=c[44280]|0;q=d+40|0;r=q;c[r>>2]=p;s=c[44280]|0;t=s+1|0;c[44280]=t;return e|0}else{h[d+8>>3]=1.0;h[d>>3]=g/j;n=j;o=m/n;h[b>>3]=o;p=c[44280]|0;q=d+40|0;r=q;c[r>>2]=p;s=c[44280]|0;t=s+1|0;c[44280]=t;return e|0}return 0}function Vr(a){a=a|0;var b=0.0,d=0,e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;b=+h[a>>3];do{if(b==1.0){if(+h[a+8>>3]<0.0){d=c[a+28>>2]|0;e=c[a+24>>2]|0;if((e|0)==0){f=d;g=9}else{i=e;j=d;g=5}}else{d=c[a+24>>2]|0;e=c[a+28>>2]|0;if((e|0)==0){f=d;g=9}else{i=e;j=d;g=5}}do{if((g|0)==5){k=+h[i+8>>3];if(k>+h[1538]){return}l=+h[1537];if(k<l){m=l;n=+h[a+16>>3]-l*+h[a+8>>3];o=l;p=j;break}else{m=k;n=+h[i>>3];o=l;p=j;break}}else if((g|0)==9){l=+h[1537];m=l;n=+h[a+16>>3]-l*+h[a+8>>3];o=l;p=f}}while(0);do{if((p|0)==0){l=+h[1538];q=l;r=+h[a+16>>3]-l*+h[a+8>>3]}else{l=+h[p+8>>3];if(l<o){return}k=+h[1538];if(l>k){q=k;r=+h[a+16>>3]-k*+h[a+8>>3];break}else{q=l;r=+h[p>>3];break}}}while(0);l=+h[1540];d=n>l;e=r>l;k=+h[1539];if(d&e|n<k&r<k){return}if(d){s=(+h[a+16>>3]-l)/+h[a+8>>3];t=l}else{s=m;t=n}if(t<k){u=(+h[a+16>>3]-k)/+h[a+8>>3];v=k}else{u=s;v=t}if(e){w=(+h[a+16>>3]-l)/+h[a+8>>3];x=l}else{w=q;x=r}if(x>=k){y=w;z=u;A=x;B=v;break}y=(+h[a+16>>3]-k)/+h[a+8>>3];z=u;A=k;B=v}else{e=c[a+28>>2]|0;d=c[a+24>>2]|0;do{if((d|0)==0){k=+h[1539];C=+h[a+16>>3]-b*k;D=k;E=k}else{k=+h[d>>3];if(k>+h[1540]){return}l=+h[1539];if(k<l){C=+h[a+16>>3]-b*l;D=l;E=l;break}else{C=+h[d+8>>3];D=k;E=l;break}}}while(0);do{if((e|0)==0){l=+h[1540];F=+h[a+16>>3]-l*b;G=l}else{l=+h[e>>3];if(l<E){return}k=+h[1540];if(l>k){F=+h[a+16>>3]-k*b;G=k;break}else{F=+h[e+8>>3];G=l;break}}}while(0);l=+h[1538];e=C>l;d=F>l;k=+h[1537];if(e&d|C<k&F<k){return}if(e){H=l;I=(+h[a+16>>3]-l)/b}else{H=C;I=D}if(H<k){J=k;K=(+h[a+16>>3]-k)/b}else{J=H;K=I}if(d){L=l;M=(+h[a+16>>3]-l)/b}else{L=F;M=G}if(L>=k){y=L;z=J;A=M;B=K;break}y=k;z=J;A=(+h[a+16>>3]-k)/b;B=K}}while(0);p=a+32|0;ys(c[p>>2]|0,B,z);ys(c[p>>2]|0,A,y);p=a+36|0;ys(c[p>>2]|0,B,z);ys(c[p>>2]|0,A,y);return}function Wr(a,b,d){a=a|0;b=b|0;d=d|0;c[a+24+(b<<2)>>2]=d;fu(d);if((c[a+24+(1-b<<2)>>2]|0)==0){return}Vr(a);eu(c[a+32>>2]|0);eu(c[a+36>>2]|0);pt(a,180656);return}function Xr(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;g=i;i=i+16|0;h=g|0;j=b<<2;k=kk(da(j,d)|0)|0;l=c[e>>2]|0;m=kk(j)|0;j=m;n=c[a+8>>2]|0;if((l|0)!=0){eF(c[l>>2]|0);eF(l)}l=kk(d<<2)|0;c[e>>2]=l;if((d|0)>0){e=0;do{c[l+(e<<2)>>2]=k+((da(e,b)|0)<<2);e=e+1|0;}while((e|0)<(d|0))}e=(f|0)!=0;if(e){Ds(a,b)}f=(yb()|0)%(b|0)|0;vr(h,b);k=c[l>>2]|0;if(e){Rr(f,a,b,k)}else{ur(f,a,b,k,h)}k=(b|0)>0;if(k){o=f;p=0;q=0;while(1){r=c[(c[l>>2]|0)+(p<<2)>>2]|0;c[j+(p<<2)>>2]=r;s=(r|0)>(q|0);t=s?p:o;u=p+1|0;if((u|0)<(b|0)){o=t;p=u;q=s?r:q}else{v=t;break}}}else{v=f}a:do{if((d|0)>1){if(e){f=v;q=1;while(1){p=l+(q<<2)|0;Rr(f,a,b,c[p>>2]|0);if(k){o=f;t=0;r=0;while(1){s=j+(t<<2)|0;u=c[s>>2]|0;w=c[(c[p>>2]|0)+(t<<2)>>2]|0;x=(u|0)<(w|0)?u:w;c[s>>2]=x;s=(x|0)>(r|0);w=s?t:o;u=t+1|0;if((u|0)<(b|0)){o=w;t=u;r=s?x:r}else{y=w;break}}}else{y=f}r=q+1|0;if((r|0)<(d|0)){f=y;q=r}else{break a}}}if(k){z=v;A=1}else{q=1;while(1){ur(v,a,b,c[l+(q<<2)>>2]|0,h);q=q+1|0;if((q|0)>=(d|0)){break a}}}while(1){q=l+(A<<2)|0;ur(z,a,b,c[q>>2]|0,h);f=z;r=0;t=0;while(1){o=j+(r<<2)|0;p=c[o>>2]|0;w=c[(c[q>>2]|0)+(r<<2)>>2]|0;x=(p|0)<(w|0)?p:w;c[o>>2]=x;o=(x|0)>(t|0);B=o?r:f;w=r+1|0;if((w|0)<(b|0)){f=B;r=w;t=o?x:t}else{break}}t=A+1|0;if((t|0)<(d|0)){z=B;A=t}else{break}}}}while(0);eF(m);if(!e){i=g;return}Es(a,b,n);i=g;return}function Yr(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0,h=0,i=0,j=0.0,k=0,l=0;if((d|0)<=0){return}e=(b|0)>0;f=+(b|0);g=0;do{do{if(e){h=c[a+(g<<2)>>2]|0;i=0;j=0.0;do{j=j+ +(c[h+(i<<2)>>2]|0);i=i+1|0;}while((i|0)<(b|0));if(!e){break}i=~~(j/f);h=a+(g<<2)|0;k=0;do{l=(c[h>>2]|0)+(k<<2)|0;c[l>>2]=(c[l>>2]|0)-i;k=k+1|0;}while((k|0)<(b|0))}}while(0);g=g+1|0;}while((g|0)<(d|0));return}function Zr(){c[43746]=~~+T(+((c[44272]|0)+4|0));return}function _r(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a>>3]- +h[b>>3];d=+h[a+8>>3]- +h[b+8>>3];return+(c*c+d*d)}function $r(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];h[a>>3]=+h[b>>3]- +h[d>>3];h[a+8>>3]=+h[b+8>>3]- +h[d+8>>3];i=e;return}function as(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];h[a>>3]=+h[b>>3]+ +h[d>>3];h[a+8>>3]=+h[b+8>>3]+ +h[d+8>>3];i=e;return}function bs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[b+8>>3];j=+h[b>>3];i=e;return+((+h[a+8>>3]-g)*(+h[d>>3]-j)-(+h[d+8>>3]-g)*(+h[a>>3]-j))}function cs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[b+8>>3];j=+h[b>>3];i=e;return(+h[a+8>>3]-g)*(+h[d>>3]-j)-(+h[d+8>>3]-g)*(+h[a>>3]-j)>0.0|0}function ds(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0.0;g=i;j=a;a=i;i=i+16|0;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=d;d=i;i=i+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];k=+h[a>>3];l=+h[e+8>>3];m=+h[d+8>>3];n=k*(l-m);o=+h[b>>3];p=+h[e>>3];q=+h[b+8>>3];r=+h[a+8>>3];s=q-r;t=+h[d>>3];u=t*(r-q)+(n+o*(m-l)+p*s);if(u==0.0){v=0;i=g;return v|0}w=(p*(m-r)+(n+t*(r-l)))/u;l=(-0.0-(t*s+(k*(m-q)+o*(r-m))))/u;h[f>>3]=k+(o-k)*w;h[f+8>>3]=r+w*s;do{if(w>=0.0&w<=1.0){if(l>=0.0&l<=1.0){v=1}else{break}i=g;return v|0}}while(0);v=0;i=g;return v|0}function es(a,b,d){a=a|0;b=b|0;d=+d;var e=0.0,f=0,g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;c[a+20>>2]=b;fu(b);e=+h[b+8>>3]+d;h[a+24>>3]=e;f=c[53556]|0;d=+(f|0);g=(e- +h[8])/+h[3711]*d;do{if(g<0.0){i=0}else{if(g<d){i=~~g;break}else{i=f-1|0;break}}}while(0);if((i|0)<(c[53554]|0)){c[53554]=i}f=b|0;b=(c[53558]|0)+(i*40|0)+32|0;i=c[b>>2]|0;a:do{if((i|0)==0){j=b;k=0}else{l=b;m=i;while(1){g=+h[m+24>>3];if(e<=g){if(e!=g){j=l;k=m;break a}if(+h[f>>3]<=+h[c[m+20>>2]>>3]){j=l;k=m;break a}}n=m+32|0;o=c[n>>2]|0;if((o|0)==0){j=n;k=0;break}else{l=n;m=o}}}}while(0);c[a+32>>2]=k;c[j>>2]=a;c[53560]=(c[53560]|0)+1;return}function fs(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0,i=0;b=a+20|0;if((c[b>>2]|0)==0){return}d=c[53556]|0;e=+(d|0);f=(+h[a+24>>3]- +h[8])/+h[3711]*e;do{if(f<0.0){g=0}else{if(f<e){g=~~f;break}else{g=d-1|0;break}}}while(0);if((g|0)<(c[53554]|0)){c[53554]=g}d=(c[53558]|0)+(g*40|0)|0;do{i=d+32|0;d=c[i>>2]|0;}while((d|0)!=(a|0));c[i>>2]=c[a+32>>2];c[53560]=(c[53560]|0)-1;eu(c[b>>2]|0);c[b>>2]=0;return}function gs(){return(c[53560]|0)==0|0}function hs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0.0;b=c[53554]|0;d=c[53558]|0;e=c[d+(b*40|0)+32>>2]|0;if((e|0)==0){f=b;while(1){b=f+1|0;c[53554]=b;g=c[d+(b*40|0)+32>>2]|0;if((g|0)==0){f=b}else{i=g;break}}}else{i=e}j=+h[i+24>>3];h[a>>3]=+h[c[i+20>>2]>>3];h[a+8>>3]=j;return}function is(){var a=0,b=0;a=(c[53558]|0)+((c[53554]|0)*40|0)+32|0;b=c[a>>2]|0;c[a>>2]=c[b+32>>2];c[53560]=(c[53560]|0)-1;return b|0}function js(){eF(c[53558]|0);c[53558]=0;return}function ks(){var a=0,b=0,d=0,e=0,f=0,g=0,h=0,i=0;c[53560]=0;c[53554]=0;a=c[43746]|0;b=a<<2;c[53556]=b;d=c[53558]|0;if((d|0)==0){e=kk(a*160|0)|0;c[53558]=e;f=c[53556]|0;g=e}else{f=b;g=d}if((f|0)>0){h=0;i=g}else{return}while(1){c[i+(h*40|0)+32>>2]=0;g=h+1|0;if((g|0)>=(c[53556]|0)){break}h=g;i=c[53558]|0}return}function ls(){nt(178816,40);eF(c[53836]|0);c[53836]=0;return}function ms(){var b=0,d=0,e=0,f=0,g=0,h=0;nt(178816,40);b=c[43746]|0;d=b<<1;c[53834]=d;e=c[53836]|0;if((e|0)==0){f=kk(b<<3)|0;c[53836]=f;g=c[53834]|0;h=f}else{g=d;h=e}a:do{if((g|0)>0){e=0;d=h;while(1){c[d+(e<<2)>>2]=0;f=e+1|0;if((f|0)>=(c[53834]|0)){break a}e=f;d=c[53836]|0}}}while(0);h=ot(178816)|0;c[h+8>>2]=0;a[h+16|0]=0;c[h+32>>2]=0;c[h+20>>2]=0;c[h+12>>2]=0;c[53832]=h;h=ot(178816)|0;c[h+8>>2]=0;a[h+16|0]=0;c[h+32>>2]=0;c[h+20>>2]=0;c[h+12>>2]=0;c[53830]=h;c[c[53832]>>2]=0;c[(c[53832]|0)+4>>2]=c[53830];c[c[53830]>>2]=c[53832];c[(c[53830]|0)+4>>2]=0;c[c[53836]>>2]=c[53832];c[(c[53836]|0)+((c[53834]|0)-1<<2)>>2]=c[53830];return}function ns(b,d){b=b|0;d=d|0;var e=0;e=ot(178816)|0;c[e+8>>2]=b;a[e+16|0]=d;c[e+32>>2]=0;c[e+20>>2]=0;c[e+12>>2]=0;return e|0}function os(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0;e=c[b+8>>2]|0;f=c[d+8>>2]|0;if((e|0)==0|(f|0)==0){g=0;return g|0}i=c[e+36>>2]|0;j=c[f+36>>2]|0;if((i|0)==(j|0)){g=0;return g|0}k=+h[e>>3];l=+h[f+8>>3];m=+h[e+8>>3];n=+h[f>>3];o=k*l-m*n;if(o>-1.0e-10&o<1.0e-10){g=0;return g|0}p=+h[e+16>>3];q=+h[f+16>>3];r=(l*p-m*q)/o;m=(k*q-n*p)/o;o=+h[i+8>>3];p=+h[j+8>>3];do{if(o<p){s=b;t=i}else{if(o==p){if(+h[i>>3]<+h[j>>3]){s=b;t=i;break}}s=d;t=j}}while(0);j=a[s+16|0]|0;do{if(r<+h[t>>3]){if(j<<24>>24==1){g=0}else{break}return g|0}else{if(j<<24>>24==0){g=0}else{break}return g|0}}while(0);j=bu()|0;c[j+20>>2]=0;h[j>>3]=r;h[j+8>>3]=m;g=j;return g|0}function ps(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0;e=c[b+8>>2]|0;f=c[e+36>>2]|0;g=+h[d>>3];i=+h[f>>3];j=g>i;k=a[b+16|0]|0;do{if(j){if(k<<24>>24==0){l=1}else{break}return l|0}else{if(k<<24>>24==1){l=0}else{break}return l|0}}while(0);m=+h[e>>3];a:do{if(m==1.0){n=+h[d+8>>3];o=n- +h[f+8>>3];p=g-i;q=+h[e+8>>3];b=q<0.0;do{if((b&1&(j&1^1)|j&q>=0.0&1|0)==0){r=g+n*q>+h[e+16>>3];if(b){if(r){s=r&1^1;break a}else{break}}else{if(r){break}else{s=r&1;break a}}}else{r=o>=q*p;if(r){s=r&1;break a}}}while(0);n=i- +h[c[e+32>>2]>>3];r=(p*p-o*o)*q<o*n*(q*q+(p*2.0/n+1.0))|0;if(!b){s=r;break}s=r^1}else{n=+h[e+16>>3]-m*g;t=+h[d+8>>3]-n;u=g-i;v=n- +h[f+8>>3];s=t*t>u*u+v*v|0}}while(0);if(k<<24>>24==0){l=s;return l|0}l=(s|0)==0|0;return l|0}function qs(a,b){a=a|0;b=b|0;var d=0;c[b>>2]=a;d=a+4|0;c[b+4>>2]=c[d>>2];c[c[d>>2]>>2]=b;c[d>>2]=b;return}function rs(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;b=c[53834]|0;d=~~((+h[a>>3]- +h[10])/+h[3712]*+(b|0));e=(d|0)<0?0:d;d=(e|0)<(b|0)?e:b-1|0;do{if((d|0)>-1){e=c[53836]|0;f=e+(d<<2)|0;g=c[f>>2]|0;if((g|0)==0){i=1;j=6;break}if((c[g+8>>2]|0)!=-2){k=g;l=b;m=e;break}c[f>>2]=0;f=g+12|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){i=1;j=6;break}pt(g,178816);i=1;j=6}else{i=1;j=6}}while(0);if((j|0)==6){a:while(1){j=0;b=d-i|0;g=c[53834]|0;do{if((b|0)>-1&(g|0)>(b|0)){e=c[53836]|0;f=e+(b<<2)|0;n=c[f>>2]|0;if((n|0)==0){break}if((c[n+8>>2]|0)!=-2){o=n;p=g;q=e;break a}c[f>>2]=0;f=n+12|0;e=(c[f>>2]|0)-1|0;c[f>>2]=e;if((e|0)!=0){break}pt(n,178816)}}while(0);g=i+d|0;b=c[53834]|0;do{if((g|0)>-1&(b|0)>(g|0)){n=c[53836]|0;e=n+(g<<2)|0;f=c[e>>2]|0;if((f|0)==0){break}if((c[f+8>>2]|0)!=-2){o=f;p=b;q=n;break a}c[e>>2]=0;e=f+12|0;n=(c[e>>2]|0)-1|0;c[e>>2]=n;if((n|0)!=0){break}pt(f,178816)}}while(0);i=i+1|0;j=6}c[43680]=(c[43680]|0)+i;k=o;l=p;m=q}c[44270]=(c[44270]|0)+1;q=c[53832]|0;p=c[53830]|0;b:do{if((k|0)==(q|0)){j=21}else{if((k|0)==(p|0)){r=k}else{if((ps(k,a)|0)==0){r=k}else{j=21;break}}while(1){o=c[r>>2]|0;if((o|0)==(q|0)){s=q;break b}if((ps(o,a)|0)==0){r=o}else{s=o;break}}}}while(0);if((j|0)==21){j=k;do{j=c[j+4>>2]|0;if((j|0)==(p|0)){break}}while((ps(j,a)|0)!=0);s=c[j>>2]|0}if((d|0)<=0){return s|0}if((d|0)>=(l-1|0)){return s|0}l=c[m+(d<<2)>>2]|0;if((l|0)==0){t=m}else{m=l+12|0;c[m>>2]=(c[m>>2]|0)-1;t=c[53836]|0}c[t+(d<<2)>>2]=s;t=(c[(c[53836]|0)+(d<<2)>>2]|0)+12|0;c[t>>2]=(c[t>>2]|0)+1;return s|0}function ss(a){a=a|0;var b=0,d=0;b=a+4|0;d=a|0;c[(c[d>>2]|0)+4>>2]=c[b>>2];c[c[b>>2]>>2]=c[d>>2];c[a+8>>2]=-2;return}function ts(a){a=a|0;return c[a+4>>2]|0}function us(a){a=a|0;return c[a>>2]|0}function vs(b){b=b|0;var d=0,e=0;d=c[b+8>>2]|0;if((d|0)==0){e=212936}else{e=(a[b+16|0]|0)==0?d+32|0:d+36|0}return c[e>>2]|0}function ws(b){b=b|0;var d=0,e=0;d=c[b+8>>2]|0;if((d|0)==0){e=212936}else{e=(a[b+16|0]|0)==0?d+36|0:d+32|0}return c[e>>2]|0}function xs(){nt(176456,24);return}function ys(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=(c[44274]|0)+((c[a+16>>2]|0)*96|0)+88|0;f=c[e>>2]|0;a:do{if((f|0)!=0){g=+h[f+8>>3];i=+h[f+16>>3];if(g==b&i==d){return}j=+h[a>>3];k=b-j;l=+h[a+8>>3];m=d-l;n=g-j;g=i-l;o=k<0.0;do{if(o){if(n>=0.0){break}i=g/n;p=m/k;if(p<i){break a}if(p>i){break}q=k>n?-1:1;r=21}else{if(n<0.0){break a}s=n>0.0;if(k>0.0){if(!s){q=g>0.0?-1:1;r=21;break}i=g/n;p=m/k;if(p<i){break a}if(p>i){break}q=k<n?-1:1;r=21;break}else{if(s){q=m>0.0?1:-1;r=21;break}if(m<g){q=g>0.0?-1:1;r=21;break}else{q=m>0.0?1:-1;r=21;break}}}}while(0);if((r|0)==21){if((q|0)<0){break}}s=f|0;t=c[s>>2]|0;b:do{if((t|0)==0){u=s;v=0}else{w=s;x=t;while(1){g=+h[x+8>>3];n=+h[x+16>>3];if(g==b&n==d){break}i=g-j;g=n-l;do{if(o){if(i>=0.0){break}n=g/i;p=m/k;if(p<n){u=w;v=x;break b}if(p>n){break}y=k>i?-1:1;r=41}else{if(i<0.0){u=w;v=x;break b}z=i>0.0;if(k>0.0){if(!z){y=g>0.0?-1:1;r=41;break}n=g/i;p=m/k;if(p<n){u=w;v=x;break b}if(p>n){break}y=k<i?-1:1;r=41;break}else{if(z){y=m>0.0?1:-1;r=41;break}if(m<g){y=g>0.0?-1:1;r=41;break}else{y=m>0.0?1:-1;r=41;break}}}}while(0);if((r|0)==41){r=0;if((y|0)<=0){u=w;v=x;break b}}z=x|0;A=c[z>>2]|0;if((A|0)==0){u=z;v=0;break b}else{w=z;x=A}}return}}while(0);o=ot(176456)|0;h[o+8>>3]=b;h[o+16>>3]=d;c[u>>2]=o;c[o>>2]=v;return}}while(0);v=ot(176456)|0;h[v+8>>3]=b;h[v+16>>3]=d;c[v>>2]=f;c[e>>2]=v;return}function zs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;b=c[a+(d<<4)>>2]|0;if((b|0)<=1){f=0;return f|0}g=c[a+(d<<4)+4>>2]|0;d=0;a=1;while(1){h=((c[e+(c[g+(a<<2)>>2]<<2)>>2]|0)>0)+d|0;i=a+1|0;if((i|0)<(b|0)){d=h;a=i}else{f=h;break}}return f|0}function As(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+(b<<4)|0;if((c[e>>2]|0)<=1){return}f=a+(b<<4)+4|0;b=1;do{c[d+(c[(c[f>>2]|0)+(b<<2)>>2]<<2)>>2]=1;b=b+1|0;}while((b|0)<(c[e>>2]|0));return}function Bs(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=a+(b<<4)|0;if((c[e>>2]|0)<=1){return}f=a+(b<<4)+4|0;b=1;do{c[d+(c[(c[f>>2]|0)+(b<<2)>>2]<<2)>>2]=0;b=b+1|0;}while((b|0)<(c[e>>2]|0));return}function Cs(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=a+8|0;e=c[d>>2]|0;Ds(a,b);f=b<<2;g=kk(da(f,b)|0)|0;h=kk(f)|0;f=(b|0)>0;if(f){i=0;while(1){c[h+(i<<2)>>2]=g+((da(i,b)|0)<<2);j=i+1|0;if((j|0)<(b|0)){i=j}else{k=0;break}}do{Rr(k,a,b,c[h+(k<<2)>>2]|0);k=k+1|0;}while((k|0)<(b|0))}eF(c[d>>2]|0);c[d>>2]=0;if((e|0)!=0&f){l=e;m=0}else{return h|0}while(1){c[a+(m<<4)+8>>2]=l;e=m+1|0;if((e|0)<(b|0)){l=l+(c[a+(m<<4)>>2]<<2)|0;m=e}else{break}}return h|0}function Ds(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=kk(b<<2)|0;e=d;f=(b|0)>0;if(f){h=0;i=0}else{kk(0)|0;eF(d);return}do{h=(c[a+(i<<4)>>2]|0)+h|0;i=i+1|0;}while((i|0)<(b|0));i=kk(h<<2)|0;if(!f){eF(d);return}vF(d|0,0,b<<2|0)|0;f=i;i=0;while(1){c[a+(i<<4)+8>>2]=f;h=a+(i<<4)|0;j=c[h>>2]|0;do{if((j|0)>1){k=a+(i<<4)+4|0;l=1;do{c[e+(c[(c[k>>2]|0)+(l<<2)>>2]<<2)>>2]=1;l=l+1|0;m=c[h>>2]|0;}while((l|0)<(m|0));l=m-1|0;if((m|0)<2){n=m;break}k=a+(i<<4)+4|0;o=m-2|0;p=1;while(1){q=c[(c[k>>2]|0)+(p<<2)>>2]|0;r=c[a+(q<<4)>>2]|0;if((r|0)>1){s=c[a+(q<<4)+4>>2]|0;q=0;t=1;do{q=((c[e+(c[s+(t<<2)>>2]<<2)>>2]|0)>0)+q|0;t=t+1|0;}while((t|0)<(r|0));u=q<<1}else{u=0}g[f+(p<<2)>>2]=+(o+r-u|0);if((p|0)<(l|0)){p=p+1|0}else{break}}p=c[h>>2]|0;if((p|0)<=1){n=p;break}p=a+(i<<4)+4|0;l=1;while(1){c[e+(c[(c[p>>2]|0)+(l<<2)>>2]<<2)>>2]=0;o=l+1|0;k=c[h>>2]|0;if((o|0)<(k|0)){l=o}else{n=k;break}}}else{n=j}}while(0);j=i+1|0;if((j|0)<(b|0)){f=f+(n<<2)|0;i=j}else{break}}eF(d);return}function Es(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=a+8|0;eF(c[e>>2]|0);c[e>>2]=0;if((d|0)!=0&(b|0)>0){f=d;g=0}else{return}while(1){c[a+(g<<4)+8>>2]=f;d=g+1|0;if((d|0)<(b|0)){f=f+(c[a+(g<<4)>>2]<<2)|0;g=d}else{break}}return}function Fs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0.0,g=0,i=0.0,j=0.0,k=0,l=0.0,m=0.0;if((b|0)>0){f=0.0;g=0}else{i=0.0;j=+T(i);return+j}while(1){k=c[a+(g<<2)>>2]|0;l=+h[k+(d<<3)>>3]- +h[k+(e<<3)>>3];m=f+l*l;k=g+1|0;if((k|0)<(b|0)){f=m;g=k}else{i=m;break}}j=+T(i);return+j}function Gs(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0,C=0;f=e+1|0;g=d;while(1){if((g|0)>=(e|0)){i=21;break}d=yb()|0;j=g+1|0;k=b+(((((yb()|0)<<16|d)>>>0)%((f-g|0)>>>0)|0)+g<<2)|0;d=c[k>>2]|0;l=b+(g<<2)|0;c[k>>2]=c[l>>2];c[l>>2]=d;m=+h[a+(d<<3)>>3];if((j|0)<(e|0)){k=e;n=j;while(1){a:do{if((n|0)<(k|0)){o=n;while(1){p=o+1|0;if(+h[a+(c[b+(o<<2)>>2]<<3)>>3]>m){q=o;break a}if((p|0)<(k|0)){o=p}else{q=p;break}}}else{q=n}}while(0);b:do{if((q|0)<(k|0)){o=k;while(1){r=b+(o<<2)|0;s=c[r>>2]|0;t=o-1|0;if(+h[a+(s<<3)>>3]<=m){break}if((q|0)<(t|0)){o=t}else{u=q;v=t;break b}}o=b+(q<<2)|0;p=c[o>>2]|0;c[o>>2]=s;c[r>>2]=p;u=q+1|0;v=t}else{u=q;v=k}}while(0);if((u|0)<(v|0)){k=v;n=u}else{w=u;break}}}else{w=j}n=((+h[a+(c[b+(w<<2)>>2]<<3)>>3]>m)<<31>>31)+w|0;k=b+(n<<2)|0;c[l>>2]=c[k>>2];c[k>>2]=d;k=n-1|0;Gs(a,b,g,k);p=n+1|0;Gs(a,b,p,e);do{if((k|0)>(g|0)){n=1;o=g;x=+h[a+(c[l>>2]<<3)>>3];while(1){y=o+1|0;z=+h[a+(c[b+(y<<2)>>2]<<3)>>3];A=x>z?0:n;B=(A|0)==0;if((y|0)>=(k|0)|B){break}else{n=A;o=y;x=z}}if(!B){break}Gs(a,b,g,k)}}while(0);if((p|0)>=(e|0)){i=21;break}k=1;l=p;m=+h[a+(c[b+(p<<2)>>2]<<3)>>3];while(1){d=l+1|0;x=+h[a+(c[b+(d<<2)>>2]<<3)>>3];j=m>x?0:k;C=(j|0)==0;if((d|0)>=(e|0)|C){break}else{k=j;l=d;m=x}}if(C){g=p}else{i=21;break}}if((i|0)==21){return}}function Hs(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,na=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0,Ca=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0.0,Pa=0,Qa=0.0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0.0,Xa=0.0,Ya=0.0,Za=0.0,_a=0.0,$a=0.0,ab=0,bb=0,cb=0,db=0,eb=0.0,fb=0.0,gb=0.0,hb=0,ib=0.0,jb=0,kb=0,lb=0,mb=0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0,sb=0,tb=0.0,ub=0.0,vb=0.0,wb=0,xb=0.0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0.0,Eb=0.0,Fb=0,Gb=0.0,Hb=0.0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0.0,Nb=0.0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0.0,Ub=0.0,Vb=0,Wb=0.0,Xb=0.0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0.0,cc=0.0,dc=0,ec=0,fc=0,gc=0,hc=0.0,ic=0.0,jc=0,kc=0.0,lc=0.0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0.0,tc=0.0,uc=0,vc=0.0,wc=0.0,xc=0,yc=0,zc=0,Ac=0.0,Bc=0.0,Cc=0.0,Dc=0.0,Ec=0,Fc=0,Gc=0.0,Hc=0.0,Ic=0.0,Jc=0.0,Kc=0,Lc=0,Mc=0.0,Nc=0.0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0.0,Uc=0.0,Vc=0,Wc=0,Xc=0,Yc=0.0,Zc=0.0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0,hd=0,id=0,jd=0,kd=0,ld=0,md=0,nd=0,od=0,pd=0,qd=0,rd=0,sd=0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0.0,zd=0.0,Ad=0,Bd=0.0,Cd=0.0,Dd=0.0,Ed=0.0,Fd=0.0,Gd=0.0,Hd=0.0,Id=0.0;e=i;i=i+32|0;f=1;g=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(f|0){case 1:k=e|0;l=e+16|0;m=e+24|0;n=ma(54,b*40|0|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;p=n;q=(b|0)>0;if(q){r=0;s=0;f=3;break}else{f=2;break};case 2:t=ma(54,0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;w=0;x=t;y=t;f=8;break;case 3:z=(c[(c[a+(s<<2)>>2]|0)+4>>2]|0)+r|0;t=s+1|0;if((t|0)<(b|0)){r=z;s=t;f=3;break}else{f=4;break};case 4:A=ma(54,z*24|0|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;B=A;if(q){C=0;D=0;f=5;break}else{w=z;x=A;y=B;f=8;break};case 5:E=p+(D*40|0)|0;c[E>>2]=B+(C*24|0);F=a+(D<<2)|0;t=c[F>>2]|0;if((c[t+4>>2]|0)>0){G=C;H=0;I=-1.7976931348623157e+308;J=-1.7976931348623157e+308;K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=t;f=6;break}else{N=C;O=-1.7976931348623157e+308;P=-1.7976931348623157e+308;Q=1.7976931348623157e+308;R=1.7976931348623157e+308;f=7;break};case 6:t=c[M>>2]|0;S=+h[t+(H<<4)>>3];T=+h[t+(H<<4)+8>>3];U=L<S?L:S;V=K<T?K:T;W=J>S?J:S;X=I>T?I:T;h[B+(G*24|0)>>3]=S;h[B+(G*24|0)+8>>3]=T;c[B+(G*24|0)+16>>2]=E;c[B+(G*24|0)+20>>2]=0;t=G+1|0;Y=H+1|0;Z=c[F>>2]|0;if((Y|0)<(c[Z+4>>2]|0)){G=t;H=Y;I=X;J=W;K=V;L=U;M=Z;f=6;break}else{N=t;O=X;P=W;Q=V;R=U;f=7;break};case 7:c[p+(D*40|0)+4>>2]=B+((N-1|0)*24|0);h[p+(D*40|0)+8>>3]=R;h[p+(D*40|0)+16>>3]=Q;h[p+(D*40|0)+24>>3]=P;h[p+(D*40|0)+32>>3]=O;t=D+1|0;if((t|0)<(b|0)){C=N;D=t;f=5;break}else{w=z;x=A;y=B;f=8;break};case 8:_=BF(178232,f,j)|0;f=209;break;case 209:if((_|0)==0){f=10;break}else{f=9;break};case 9:ka(150,n|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ka(150,x|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;$=0;f=208;break;case 10:aa=ma(54,w<<2|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ba=aa;if((w|0)>0){ca=0;f=11;break}else{f=189;break};case 11:c[ba+(ca<<2)>>2]=y+(ca*24|0);t=ca+1|0;if((t|0)<(w|0)){ca=t;f=11;break}else{f=12;break};case 12:Da(40,aa|0,w|0,4,34);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ea=0;fa=0;ga=0;ha=0;f=13;break;case 13:ia=ba+(ha<<2)|0;ja=c[ia>>2]|0;na=c[ja+16>>2]|0;if((ja|0)==(c[na>>2]|0)){f=14;break}else{f=15;break};case 14:qa=c[na+4>>2]|0;f=16;break;case 15:qa=ja-24|0;f=16;break;case 16:ra=ja|0;sa=ja+8|0;ta=qa;ua=1;va=ea;xa=fa;ya=ga;za=qa;f=17;break;case 17:U=+h[ra>>3]- +h[ta>>3];if(U!=0.0){Aa=U;f=19;break}else{f=18;break};case 18:U=+h[sa>>3]- +h[ta+8>>3];if(U==0.0){Ba=ya;Ca=xa;Ea=va;f=181;break}else{Aa=U;f=19;break};case 19:if(Aa>0.0){f=172;break}else{f=20;break};case 20:if((va|0)>0){f=21;break}else{f=168;break};case 21:Fa=za|0;Ga=za+8|0;Ha=za+16|0;Ia=za+24|0;Ja=za+24|0;Ka=0;La=ya;f=22;break;case 22:Ma=c[La>>2]|0;Na=Ma|0;Oa=+h[Na>>3];Pa=Ma+8|0;Qa=+h[Pa>>3];Ra=Ma+16|0;Sa=c[Ra>>2]|0;Ta=(c[Sa+4>>2]|0)==(Ma|0);if(Ta){f=23;break}else{f=24;break};case 23:t=c[Sa>>2]|0;Ua=t;Va=t|0;f=25;break;case 24:Ua=Ma+24|0;Va=Ma+24|0;f=25;break;case 25:Wa=+h[Va>>3]-Oa;Xa=+h[Ua+8>>3]-Qa;Ya=+h[Fa>>3];Za=Ya-Oa;_a=+h[Ga>>3];$a=_a-Qa;ab=c[Ha>>2]|0;bb=(c[ab+4>>2]|0)==(za|0);if(bb){f=26;break}else{cb=Ia;db=Ja;f=27;break};case 26:t=c[ab>>2]|0;cb=t;db=t|0;f=27;break;case 27:eb=+h[db>>3]-Oa;fb=+h[cb+8>>3]-Qa;gb=Wa*$a-Xa*Za;if(gb==0.0){hb=0;f=29;break}else{f=28;break};case 28:hb=gb>0.0?1:-1;f=29;break;case 29:ib=Wa*fb-Xa*eb;if(ib==0.0){jb=0;f=31;break}else{f=30;break};case 30:jb=ib>0.0?1:-1;f=31;break;case 31:kb=da(jb,hb)|0;if((kb|0)>0){f=167;break}else{f=32;break};case 32:if((kb|0)<0){f=33;break}else{f=63;break};case 33:if(bb){f=34;break}else{lb=Ia;mb=Ja;f=35;break};case 34:t=c[ab>>2]|0;lb=t;mb=t|0;f=35;break;case 35:nb=+h[mb>>3]-Ya;ob=+h[lb+8>>3]-_a;pb=Oa-Ya;qb=Qa-_a;if(Ta){f=36;break}else{f=37;break};case 36:t=c[Sa>>2]|0;rb=t;sb=t|0;f=38;break;case 37:rb=Ma+24|0;sb=Ma+24|0;f=38;break;case 38:tb=+h[sb>>3]-Ya;ub=+h[rb+8>>3]-_a;vb=qb*nb-pb*ob;if(vb==0.0){wb=0;f=40;break}else{f=39;break};case 39:wb=vb>0.0?1:-1;f=40;break;case 40:xb=nb*ub-ob*tb;if(xb==0.0){yb=0;f=42;break}else{f=41;break};case 41:yb=xb>0.0?1:-1;f=42;break;case 42:zb=da(yb,wb)|0;if((zb|0)>0){f=167;break}else{f=43;break};case 43:if((zb|0)<0){Ab=3;f=62;break}else{f=44;break};case 44:Bb=(wb|0)>-1?wb:-wb|0;if(bb){f=45;break}else{Cb=Ia;f=46;break};case 45:Cb=c[ab>>2]|0;f=46;break;case 46:Db=+h[Cb>>3];Eb=+h[Cb+8>>3];if((Bb|0)==0){Fb=Ma;f=50;break}else{f=47;break};case 47:if(Ta){f=48;break}else{f=49;break};case 48:Fb=c[Sa>>2]|0;f=50;break;case 49:Fb=Ma+24|0;f=50;break;case 50:Gb=+h[Fb>>3];Hb=+h[Fb+8>>3];Ib=Ya==Gb;if(Ya==Db){f=51;break}else{f=57;break};case 51:if(Ib){f=52;break}else{Ab=0;f=62;break};case 52:if(_a==Hb|Hb==Eb){Jb=1;f=56;break}else{f=53;break};case 53:if(_a<Hb){f=54;break}else{f=55;break};case 54:Jb=Hb<Eb;f=56;break;case 55:Jb=Eb<Hb;f=56;break;case 56:Ab=Jb&1;f=62;break;case 57:if(Ib|Gb==Db){Ab=0;f=62;break}else{f=58;break};case 58:if(Ya<Gb){f=59;break}else{f=60;break};case 59:Kb=Gb<Db;f=61;break;case 60:Kb=Db<Gb;f=61;break;case 61:Ab=Kb?1:-1;f=62;break;case 62:t=oa(4,Ma|0,za|0,l|0,m|0,Ab|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((t|0)==0){f=167;break}else{f=148;break};case 63:if((hb|0)==(jb|0)){f=64;break}else{f=130;break};case 64:if(Ta){f=65;break}else{f=66;break};case 65:Lb=c[Sa>>2]|0;f=67;break;case 66:Lb=Ma+24|0;f=67;break;case 67:Mb=+h[Lb>>3];Nb=+h[Lb+8>>3];Ob=Oa==Ya;if(Oa==Mb){f=68;break}else{f=74;break};case 68:if(Ob){f=69;break}else{Pb=0;f=79;break};case 69:if(Qa==_a|_a==Nb){Qb=1;f=73;break}else{f=70;break};case 70:if(Qa<_a){f=71;break}else{f=72;break};case 71:Qb=_a<Nb;f=73;break;case 72:Qb=Nb<_a;f=73;break;case 73:Pb=Qb&1;f=79;break;case 74:if(Ob|Ya==Mb){Pb=0;f=79;break}else{f=75;break};case 75:if(Oa<Ya){f=76;break}else{f=77;break};case 76:Rb=Ya<Mb;f=78;break;case 77:Rb=Mb<Ya;f=78;break;case 78:Pb=Rb?1:-1;f=79;break;case 79:if(Ta){f=80;break}else{f=81;break};case 80:Sb=c[Sa>>2]|0;f=82;break;case 81:Sb=Ma+24|0;f=82;break;case 82:Tb=+h[Sb>>3];Ub=+h[Sb+8>>3];if(bb){f=83;break}else{Vb=Ia;f=84;break};case 83:Vb=c[ab>>2]|0;f=84;break;case 84:Wb=+h[Vb>>3];Xb=+h[Vb+8>>3];Yb=Oa==Wb;if(Oa==Tb){f=85;break}else{f=91;break};case 85:if(Yb){f=86;break}else{Zb=0;f=96;break};case 86:if(Qa==Xb|Xb==Ub){_b=1;f=90;break}else{f=87;break};case 87:if(Qa<Xb){f=88;break}else{f=89;break};case 88:_b=Xb<Ub;f=90;break;case 89:_b=Ub<Xb;f=90;break;case 90:Zb=_b&1;f=96;break;case 91:if(Yb|Wb==Tb){Zb=0;f=96;break}else{f=92;break};case 92:if(Oa<Wb){f=93;break}else{f=94;break};case 93:$b=Wb<Tb;f=95;break;case 94:$b=Tb<Wb;f=95;break;case 95:Zb=$b?1:-1;f=96;break;case 96:if((Pb|0)>(Zb|0)){f=97;break}else{f=112;break};case 97:if(Ta){f=98;break}else{f=99;break};case 98:ac=c[Sa>>2]|0;f=100;break;case 99:ac=Ma+24|0;f=100;break;case 100:bc=+h[ac>>3];cc=+h[ac+8>>3];if(Oa==bc){f=101;break}else{f=107;break};case 101:if(Ob){f=102;break}else{dc=0;f=129;break};case 102:if(Qa==_a|_a==cc){ec=1;f=106;break}else{f=103;break};case 103:if(Qa<_a){f=104;break}else{f=105;break};case 104:ec=_a<cc;f=106;break;case 105:ec=cc<_a;f=106;break;case 106:dc=ec&1;f=129;break;case 107:if(Ob|Ya==bc){dc=0;f=129;break}else{f=108;break};case 108:if(Oa<Ya){f=109;break}else{f=110;break};case 109:fc=Ya<bc;f=111;break;case 110:fc=bc<Ya;f=111;break;case 111:dc=fc?1:-1;f=129;break;case 112:if(Ta){f=113;break}else{f=114;break};case 113:gc=c[Sa>>2]|0;f=115;break;case 114:gc=Ma+24|0;f=115;break;case 115:hc=+h[gc>>3];ic=+h[gc+8>>3];if(bb){f=116;break}else{jc=Ia;f=117;break};case 116:jc=c[ab>>2]|0;f=117;break;case 117:kc=+h[jc>>3];lc=+h[jc+8>>3];mc=Oa==kc;if(Oa==hc){f=118;break}else{f=124;break};case 118:if(mc){f=119;break}else{dc=0;f=129;break};case 119:if(Qa==lc|lc==ic){nc=1;f=123;break}else{f=120;break};case 120:if(Qa<lc){f=121;break}else{f=122;break};case 121:nc=lc<ic;f=123;break;case 122:nc=ic<lc;f=123;break;case 123:dc=nc&1;f=129;break;case 124:if(mc|kc==hc){dc=0;f=129;break}else{f=125;break};case 125:if(Oa<kc){f=126;break}else{f=127;break};case 126:oc=kc<hc;f=128;break;case 127:oc=hc<kc;f=128;break;case 128:dc=oc?1:-1;f=129;break;case 129:pc=dc<<1;f=147;break;case 130:qc=(hb|0)>-1?hb:-hb|0;if(Ta){f=131;break}else{f=132;break};case 131:rc=c[Sa>>2]|0;f=133;break;case 132:rc=Ma+24|0;f=133;break;case 133:sc=+h[rc>>3];tc=+h[rc+8>>3];t=(qc|0)==0;if(t|bb^1){uc=t?za:Ia;f=135;break}else{f=134;break};case 134:uc=c[ab>>2]|0;f=135;break;case 135:vc=+h[uc>>3];wc=+h[uc+8>>3];xc=Oa==vc;if(Oa==sc){f=136;break}else{f=142;break};case 136:if(xc){f=137;break}else{pc=0;f=147;break};case 137:if(Qa==wc|wc==tc){yc=1;f=141;break}else{f=138;break};case 138:if(Qa<wc){f=139;break}else{f=140;break};case 139:yc=wc<tc;f=141;break;case 140:yc=tc<wc;f=141;break;case 141:pc=yc&1;f=147;break;case 142:if(xc|vc==sc){pc=0;f=147;break}else{f=143;break};case 143:if(Oa<vc){f=144;break}else{f=145;break};case 144:zc=vc<sc;f=146;break;case 145:zc=sc<vc;f=146;break;case 146:pc=zc?1:-1;f=147;break;case 147:t=oa(4,Ma|0,za|0,l|0,m|0,pc|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((t|0)==0){f=167;break}else{f=148;break};case 148:Ac=+h[l>>3];Bc=+h[m>>3];Cc=+h[Na>>3];Dc=+h[Pa>>3];Ec=c[Ra>>2]|0;if((c[Ec+4>>2]|0)==(Ma|0)){f=149;break}else{f=150;break};case 149:Fc=c[Ec>>2]|0;f=151;break;case 150:Fc=Ma+24|0;f=151;break;case 151:Gc=+h[Fc>>3];Hc=+h[Fc+8>>3];Ic=+h[Fa>>3];Jc=+h[Ga>>3];Kc=c[Ha>>2]|0;if((c[Kc+4>>2]|0)==(za|0)){f=152;break}else{Lc=Ia;f=153;break};case 152:Lc=c[Kc>>2]|0;f=153;break;case 153:Mc=+h[Lc>>3];Nc=+h[Lc+8>>3];if(Cc!=Gc&Ic!=Mc){f=160;break}else{f=154;break};case 154:if(Cc==Gc){f=155;break}else{f=157;break};case 155:if(Cc==Ac&Dc==Bc){f=157;break}else{f=156;break};case 156:if(Gc==Ac&Hc==Bc){f=157;break}else{f=160;break};case 157:if(Ic==Mc){f=158;break}else{f=167;break};case 158:if(Ic==Ac&Jc==Bc){f=167;break}else{f=159;break};case 159:if(Mc==Ac&Nc==Bc){f=167;break}else{f=160;break};case 160:if((d[213992]|0)>>>0>1>>>0){f=161;break}else{Oc=ya;Pc=va;Qc=1;f=187;break};case 161:Rc=c[o>>2]|0;pa(30,Rc|0,163936,(Sc=i,i=i+16|0,h[Sc>>3]=Ac,h[Sc+8>>3]=Bc,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;Tc=+h[Na>>3];Uc=+h[Pa>>3];Vc=c[Ra>>2]|0;if((c[Vc+4>>2]|0)==(Ma|0)){f=162;break}else{f=163;break};case 162:t=c[Vc>>2]|0;Wc=t;Xc=t|0;f=164;break;case 163:Wc=Ma+24|0;Xc=Ma+24|0;f=164;break;case 164:U=+h[Xc>>3];V=+h[Wc+8>>3];pa(30,Rc|0,131784,(Sc=i,i=i+40|0,c[Sc>>2]=1,h[Sc+8>>3]=Tc,h[Sc+16>>3]=Uc,h[Sc+24>>3]=U,h[Sc+32>>3]=V,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;Yc=+h[Fa>>3];Zc=+h[Ga>>3];_c=c[Ha>>2]|0;if((c[_c+4>>2]|0)==(za|0)){f=165;break}else{$c=Ia;ad=Ja;f=166;break};case 165:t=c[_c>>2]|0;$c=t;ad=t|0;f=166;break;case 166:V=+h[ad>>3];U=+h[$c+8>>3];pa(30,Rc|0,131784,(Sc=i,i=i+40|0,c[Sc>>2]=2,h[Sc+8>>3]=Yc,h[Sc+16>>3]=Zc,h[Sc+24>>3]=V,h[Sc+32>>3]=U,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;Oc=ya;Pc=va;Qc=1;f=187;break;case 167:t=Ka+1|0;if((t|0)<(va|0)){Ka=t;La=c[La+4>>2]|0;f=22;break}else{f=168;break};case 168:bd=ma(54,12)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;cd=bd;if((va|0)==0){f=169;break}else{f=170;break};case 169:c[bd+8>>2]=0;dd=cd;f=171;break;case 170:c[xa+4>>2]=cd;c[bd+8>>2]=xa;dd=ya;f=171;break;case 171:c[bd>>2]=za;c[bd+4>>2]=0;c[za+20>>2]=cd;Ba=dd;Ca=cd;Ea=va+1|0;f=181;break;case 172:ed=za+20|0;fd=c[ed>>2]|0;if((fd|0)==0){f=173;break}else{f=174;break};case 173:pa(16,1,159880,(Sc=i,i=i+1|0,i=i+7&-8,c[Sc>>2]=0,Sc)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;i=Sc;la(40,178232,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;return 0;case 174:if((va|0)==1){gd=0;hd=0;f=180;break}else{f=175;break};case 175:if((fd|0)==(ya|0)){f=176;break}else{f=177;break};case 176:t=c[ya+4>>2]|0;c[t+8>>2]=0;gd=t;hd=xa;f=180;break;case 177:if((fd|0)==(xa|0)){f=178;break}else{f=179;break};case 178:t=c[xa+8>>2]|0;c[t+4>>2]=0;gd=ya;hd=t;f=180;break;case 179:t=fd+4|0;Z=fd+8|0;c[(c[Z>>2]|0)+4>>2]=c[t>>2];c[(c[t>>2]|0)+8>>2]=c[Z>>2];gd=ya;hd=xa;f=180;break;case 180:ka(150,fd|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;c[ed>>2]=0;Ba=gd;Ca=hd;Ea=va-1|0;f=181;break;case 181:id=c[ia>>2]|0;jd=c[id+16>>2]|0;if((id|0)==(c[jd+4>>2]|0)){f=182;break}else{f=183;break};case 182:kd=c[jd>>2]|0;f=184;break;case 183:kd=id+24|0;f=184;break;case 184:if((ua|0)<2){f=185;break}else{f=186;break};case 185:ta=kd;ua=ua+1|0;va=Ea;xa=Ca;ya=Ba;za=id;f=17;break;case 186:Z=ha+1|0;if((Z|0)<(w|0)){ea=Ea;fa=Ca;ga=Ba;ha=Z;f=13;break}else{Oc=Ba;Pc=Ea;Qc=0;f=187;break};case 187:if((Pc|0)>0){ld=0;md=Oc;f=188;break}else{f=190;break};case 188:Z=c[md+4>>2]|0;ka(150,md|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;t=ld+1|0;if((t|0)<(Pc|0)){ld=t;md=Z;f=188;break}else{f=190;break};case 189:Da(40,aa|0,w|0,4,34);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ka(150,aa|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;f=191;break;case 190:ka(150,aa|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((Qc|0)==0){f=191;break}else{nd=Qc;f=207;break};case 191:od=k;if(q){pd=0;f=192;break}else{nd=0;f=207;break};case 192:qd=c[a+(pd<<2)>>2]|0;Z=c[qd>>2]|0;c[od>>2]=c[Z>>2];c[od+4>>2]=c[Z+4>>2];c[od+8>>2]=c[Z+8>>2];c[od+12>>2]=c[Z+12>>2];rd=pd+1|0;if((rd|0)<(b|0)){f=193;break}else{nd=0;f=207;break};case 193:sd=p+(pd*40|0)+8|0;td=p+(pd*40|0)+24|0;ud=p+(pd*40|0)+32|0;vd=p+(pd*40|0)+16|0;wd=rd;f=194;break;case 194:xd=c[a+(wd<<2)>>2]|0;yd=+h[sd>>3];zd=+h[p+(wd*40|0)+24>>3];Ad=yd>zd;Bd=+h[p+(wd*40|0)+8>>3];if(Ad|yd<Bd){f=200;break}else{f=195;break};case 195:Cd=+h[vd>>3];Dd=+h[p+(wd*40|0)+32>>3];if(Cd>Dd){f=200;break}else{f=196;break};case 196:Ed=+h[p+(wd*40|0)+16>>3];if(Cd<Ed){f=200;break}else{f=197;break};case 197:U=+h[td>>3];if(U>zd|U<Bd){f=200;break}else{f=198;break};case 198:U=+h[ud>>3];if(U>Dd|U<Ed){f=200;break}else{f=199;break};case 199:Z=wa(200,xd|0,k|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((Z|0)==0){f=206;break}else{nd=1;f=207;break};case 200:Fd=+h[td>>3];if(Bd>Fd|Bd<yd){f=206;break}else{f=201;break};case 201:Gd=+h[p+(wd*40|0)+16>>3];Hd=+h[ud>>3];if(Gd>Hd){f=206;break}else{f=202;break};case 202:Id=+h[vd>>3];if(Gd<Id){f=206;break}else{f=203;break};case 203:if(zd>Fd|Ad){f=206;break}else{f=204;break};case 204:U=+h[p+(wd*40|0)+32>>3];if(U>Hd|U<Id){f=206;break}else{f=205;break};case 205:Z=wa(200,qd|0,c[xd>>2]|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;if((Z|0)==0){f=206;break}else{nd=1;f=207;break};case 206:Z=wd+1|0;if((Z|0)<(b|0)){wd=Z;f=194;break}else{pd=rd;f=192;break};case 207:ka(150,n|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;ka(150,x|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,j)|0;if((g|0)>0){f=-1;break}else return 0}u=v=0;$=(nd|0)==0|0;f=208;break;case 208:i=e;return $|0;case-1:if((g|0)==8){_=v;f=209}u=v=0;break}return 0}function Is(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0;d=c[a>>2]|0;a=c[b>>2]|0;e=+h[d>>3]- +h[a>>3];if(e!=0.0){f=e>0.0?1:-1;return f|0}e=+h[d+8>>3]- +h[a+8>>3];if(e==0.0){f=0;return f|0}f=e>0.0?1:-1;return f|0}function Js(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;if((f|0)<1){g=0;return g|0}i=+h[a>>3];j=+h[a+8>>3];k=c[a+16>>2]|0;l=(c[k+4>>2]|0)==(a|0);if(l){m=c[k>>2]|0}else{m=a+24|0}n=+h[m>>3];o=+h[m+8>>3];p=+h[b>>3];q=+h[b+8>>3];m=c[b+16>>2]|0;r=(c[m+4>>2]|0)==(b|0);if(r){s=c[m>>2]|0}else{s=b+24|0}t=+h[s>>3];u=+h[s+8>>3];if((f|0)==3){if(i==n){h[d>>3]=i;h[e>>3]=u+(i-t)*((q-u)/(p-t));g=1;return g|0}if(p==t){h[d>>3]=p;h[e>>3]=o+(p-n)*((j-o)/(i-n));g=1;return g|0}else{v=(q-u)/(p-t);w=(j-o)/(i-n);x=q-p*v;y=j-i*w;z=v-w;h[d>>3]=(y-x)/z;h[e>>3]=(v*y-w*x)/z;g=1;return g|0}}else if((f|0)==1){if((i-n)*(q-j)==(j-o)*(p-i)){h[d>>3]=p;h[e>>3]=q;g=1;return g|0}else{h[d>>3]=t;h[e>>3]=u;g=1;return g|0}}else if((f|0)==2){if(l){A=c[k>>2]|0}else{A=a+24|0}z=+h[A>>3];A=i==p;do{if(i==z){B=42}else{if(A|p==z){B=42;break}if(i<p){if(p<z){B=42;break}}else{if(z<p){B=42;break}}if(r){C=c[m>>2]|0}else{C=b+24|0}x=+h[C>>3];if(l){D=c[k>>2]|0}else{D=a+24|0}w=+h[D>>3];if(p==x){E=q;F=p;G=u;H=t;break}if(p==w|w==x){E=q;F=p;G=u;H=t;break}if(p<w){if(w<x){E=q;F=p;G=u;H=t;break}}else{if(x<w){E=q;F=p;G=u;H=t;break}}if(r){I=c[m>>2]|0}else{I=b+24|0}w=+h[I>>3];if(p==w|i==w){J=0}else{if(p<i){K=i<w}else{K=w<i}J=K^1}E=q;F=p;G=J?o:j;H=J?n:i}}while(0);a:do{if((B|0)==42){if(l){L=c[k>>2]|0}else{L=a+24|0}z=+h[L>>3];if(r){M=c[m>>2]|0}else{M=b+24|0}w=+h[M>>3];do{if(i!=z){if(i==w|w==z){break}if(i<w){if(w<z){break}}else{if(z<w){break}}if(l){N=c[k>>2]|0}else{N=a+24|0}x=+h[N>>3];if(i==x){E=u;F=t;G=q;H=p;break a}if(A|p==x){E=u;F=t;G=q;H=p;break a}if(i<p){if(p<x){E=u;F=t;G=q;H=p;break a}}else{if(x<p){E=u;F=t;G=q;H=p;break a}}if(r){O=c[m>>2]|0}else{O=b+24|0}x=+h[O>>3];if(p==x|i==x){P=0}else{if(p<i){Q=i<x}else{Q=x<i}P=Q^1}E=u;F=t;G=P?o:j;H=P?n:i;break a}}while(0);if(r){R=c[m>>2]|0}else{R=b+24|0}w=+h[R>>3];if(p==w){g=0;return g|0}if(A|i==w){g=0;return g|0}if(p<i){if(i<w){g=0}else{E=j;F=i;G=o;H=n;break}return g|0}else{if(w<i){g=0}else{E=j;F=i;G=o;H=n;break}return g|0}}}while(0);h[d>>3]=(H+F)*.5;h[e>>3]=(G+E)*.5;g=1;return g|0}else{g=1;return g|0}return 0}function Ks(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0;d=c[44390]|0;if((d|0)!=0){qu(d)}c[44390]=pu(b,b,0.0)|0;d=c[43812]|0;if((d|0)!=0){eF(d)}c[43812]=jk(b<<2)|0;d=c[43772]|0;if((d|0)!=0){eF(d)}c[43772]=jk(b<<3)|0;a:do{if((b|0)>0){d=0;while(1){e=a+(d<<2)|0;f=c[44390]|0;g=0;i=0.0;do{j=+h[(c[e>>2]|0)+(g<<3)>>3];h[(c[f+(d<<2)>>2]|0)+(g<<3)>>3]=j;k=+S(+j);i=i<k?k:i;g=g+1|0;}while((g|0)<(b|0));if(i==0.0){break}h[(c[43772]|0)+(d<<3)>>3]=1.0/i;c[(c[43812]|0)+(d<<2)>>2]=d;g=d+1|0;if((g|0)<(b|0)){d=g}else{break a}}h[(c[43772]|0)+(d<<3)>>3]=0.0;l=0;return l|0}}while(0);a=b-1|0;b:do{if((a|0)>0){g=0;f=0;while(1){if((g|0)>=(b|0)){l=0;m=27;break}e=c[43812]|0;n=c[44390]|0;o=c[43772]|0;p=f;q=g;k=0.0;do{r=c[e+(q<<2)>>2]|0;j=+S(+(+h[(c[n+(r<<2)>>2]|0)+(g<<3)>>3]));s=j*+h[o+(r<<3)>>3];r=k<s;p=r?q:p;k=r?s:k;q=q+1|0;}while((q|0)<(b|0));if(k==0.0){l=0;m=27;break}if((p|0)!=(g|0)){q=c[43812]|0;o=q+(g<<2)|0;n=c[o>>2]|0;c[o>>2]=c[q+(p<<2)>>2];c[(c[43812]|0)+(p<<2)>>2]=n}n=c[43812]|0;q=n+(g<<2)|0;o=c[44390]|0;i=+h[(c[o+(c[q>>2]<<2)>>2]|0)+(g<<3)>>3];e=g+1|0;if((e|0)<(b|0)){r=e;do{t=n+(r<<2)|0;u=(c[o+(c[t>>2]<<2)>>2]|0)+(g<<3)|0;s=+h[u>>3]/i;h[u>>3]=s;if(s!=0.0){u=e;do{v=(c[o+(c[t>>2]<<2)>>2]|0)+(u<<3)|0;h[v>>3]=+h[v>>3]-s*+h[(c[o+(c[q>>2]<<2)>>2]|0)+(u<<3)>>3];u=u+1|0;}while((u|0)<(b|0))}r=r+1|0;}while((r|0)<(b|0))}if((e|0)<(a|0)){g=e;f=p}else{w=n;x=o;break b}}if((m|0)==27){return l|0}}else{w=c[43812]|0;x=c[44390]|0}}while(0);l=+h[(c[x+(c[w+(a<<2)>>2]<<2)>>2]|0)+(a<<3)>>3]!=0.0|0;return l|0}function Ls(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0;e=(d|0)>0;if(!e){return}f=c[43812]|0;g=0;do{i=c[f+(g<<2)>>2]|0;if((g|0)>0){j=c[(c[44390]|0)+(i<<2)>>2]|0;k=0;l=0.0;while(1){m=l+ +h[j+(k<<3)>>3]*+h[a+(k<<3)>>3];n=k+1|0;if((n|0)<(g|0)){k=n;l=m}else{o=m;break}}}else{o=0.0}h[a+(g<<3)>>3]=+h[b+(i<<3)>>3]-o;g=g+1|0;}while((g|0)<(d|0));if(e){p=d}else{return}while(1){e=p-1|0;g=c[(c[44390]|0)+(c[(c[43812]|0)+(e<<2)>>2]<<2)>>2]|0;if((p|0)<(d|0)){b=p;o=0.0;while(1){l=o+ +h[g+(b<<3)>>3]*+h[a+(b<<3)>>3];f=b+1|0;if((f|0)<(d|0)){b=f;o=l}else{q=l;break}}}else{q=0.0}b=a+(e<<3)|0;h[b>>3]=(+h[b>>3]-q)/+h[g+(e<<3)>>3];if((e|0)>0){p=e}else{break}}return}function Ms(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0;if((Ks(a,d)|0)==0){e=0;return e|0}a=jk(d<<3)|0;f=a;g=(d|0)>0;if(!g){eF(a);e=1;return e|0}i=d<<3;j=0;do{vF(a|0,0,i|0)|0;h[f+(j<<3)>>3]=1.0;Ls(c[b+(j<<2)>>2]|0,f,d);j=j+1|0;}while((j|0)<(d|0));eF(a);if(g){k=0}else{e=1;return e|0}while(1){if((k|0)>0){g=b+(k<<2)|0;a=0;do{j=(c[g>>2]|0)+(a<<3)|0;l=+h[j>>3];f=b+(a<<2)|0;h[j>>3]=+h[(c[f>>2]|0)+(k<<3)>>3];h[(c[f>>2]|0)+(k<<3)>>3]=l;a=a+1|0;}while((a|0)<(k|0))}a=k+1|0;if((a|0)<(d|0)){k=a}else{e=1;break}}return e|0}function Ns(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0,R=0.0,U=0.0,V=0,W=0,X=0.0,Y=0,Z=0,_=0,$=0.0,aa=0,ba=0.0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0,la=0,ma=0;i=b<<3;j=kk(i)|0;k=j;l=kk(i)|0;i=l;m=b*30|0;n=(d|0)<(b|0)?d:b;a:do{if((n|0)>0){d=(g|0)==0;o=(b|0)>0;p=(b|0)==0;q=0;while(1){r=c[e+(q<<2)>>2]|0;s=(q|0)>0;do{if(!(d|o^1)){t=0;do{h[r+(t<<3)>>3]=+((yb()|0)%100|0|0);t=t+1|0;}while((t|0)<(b|0))}if(s){t=0;do{if(!p){u=c[e+(t<<2)>>2]|0;v=u;w=r;x=b;y=0.0;while(1){z=y+ +h[v>>3]*+h[w>>3];A=x-1|0;if((A|0)==0){B=r;C=u;D=b;break}else{v=v+8|0;w=w+8|0;x=A;y=z}}while(1){h[B>>3]=+h[B>>3]-z*+h[C>>3];x=D-1|0;if((x|0)==0){break}else{B=B+8|0;C=C+8|0;D=x}}}t=t+1|0;}while((t|0)<(q|0))}if(p){E=0.0}else{t=r;x=b;y=0.0;while(1){F=+h[t>>3];G=y+F*F;w=x-1|0;if((w|0)==0){E=G;break}else{t=t+8|0;x=w;y=G}}}H=+T(E);}while(H<1.0e-10);y=1.0/H;if(p){I=0}else{x=r;t=b;while(1){h[x>>3]=y*+h[x>>3];w=t-1|0;if((w|0)==0){I=0;break}else{x=x+8|0;t=w}}}while(1){J=I+1|0;if(!p){t=i;x=r;w=b;while(1){h[t>>3]=+h[x>>3];v=w-1|0;if((v|0)==0){break}else{t=t+8|0;x=x+8|0;w=v}}if(o){w=0;while(1){x=c[a+(w<<2)>>2]|0;t=0;y=0.0;do{y=y+ +h[x+(t<<3)>>3]*+h[r+(t<<3)>>3];t=t+1|0;}while((t|0)<(b|0));h[k+(w<<3)>>3]=y;t=w+1|0;if((t|0)<(b|0)){w=t}else{K=r;L=k;M=b;break}}}else{K=r;L=k;M=b}while(1){h[K>>3]=+h[L>>3];w=M-1|0;if((w|0)==0){break}else{K=K+8|0;L=L+8|0;M=w}}}if(s){w=0;do{if(!p){t=c[e+(w<<2)>>2]|0;x=t;v=r;u=b;G=0.0;while(1){N=G+ +h[x>>3]*+h[v>>3];A=u-1|0;if((A|0)==0){O=r;P=t;Q=b;break}else{x=x+8|0;v=v+8|0;u=A;G=N}}while(1){h[O>>3]=+h[O>>3]-N*+h[P>>3];u=Q-1|0;if((u|0)==0){break}else{O=O+8|0;P=P+8|0;Q=u}}}w=w+1|0;}while((w|0)<(q|0))}if(p){R=0.0}else{w=r;u=b;G=0.0;while(1){y=+h[w>>3];F=G+y*y;v=u-1|0;if((v|0)==0){R=F;break}else{w=w+8|0;u=v;G=F}}}U=+T(R);if(!(U>=1.0e-10&(I|0)<(m|0))){V=J;W=q;break a}G=1.0/U;if(p){X=0.0}else{u=r;w=b;while(1){h[u>>3]=G*+h[u>>3];v=w-1|0;if((v|0)==0){Y=r;Z=i;_=b;$=0.0;break}else{u=u+8|0;w=v}}while(1){G=$+ +h[Y>>3]*+h[Z>>3];w=_-1|0;if((w|0)==0){X=G;break}else{Y=Y+8|0;Z=Z+8|0;_=w;$=G}}}if(+S(+X)<.999){I=J}else{break}}h[f+(q<<3)>>3]=U*X;r=q+1|0;if((r|0)<(n|0)){q=r}else{V=J;W=r;break}}}else{V=0;W=0}}while(0);if((W|0)<(n|0)){J=(b|0)>0;I=(b|0)==0;_=W;do{W=c[e+(_<<2)>>2]|0;if(J){Z=0;do{h[W+(Z<<3)>>3]=+((yb()|0)%100|0|0);Z=Z+1|0;}while((Z|0)<(b|0))}do{if((_|0)>0){if(I){break}else{aa=0}while(1){Z=c[e+(aa<<2)>>2]|0;Y=Z;i=W;Q=b;X=0.0;while(1){ba=X+ +h[Y>>3]*+h[i>>3];P=Q-1|0;if((P|0)==0){ca=W;da=Z;ea=b;break}else{Y=Y+8|0;i=i+8|0;Q=P;X=ba}}while(1){h[ca>>3]=+h[ca>>3]-ba*+h[da>>3];Q=ea-1|0;if((Q|0)==0){break}else{ca=ca+8|0;da=da+8|0;ea=Q}}Q=aa+1|0;if((Q|0)<(_|0)){aa=Q}else{fa=55;break}}}else{fa=55}}while(0);do{if((fa|0)==55){fa=0;if(I){break}else{ga=W;ha=b;ia=0.0}while(1){X=+h[ga>>3];ja=ia+X*X;Q=ha-1|0;if((Q|0)==0){break}else{ga=ga+8|0;ha=Q;ia=ja}}X=1.0/+T(ja);Q=W;i=b;while(1){h[Q>>3]=X*+h[Q>>3];Y=i-1|0;if((Y|0)==0){break}else{Q=Q+8|0;i=Y}}}}while(0);h[f+(_<<3)>>3]=0.0;_=_+1|0;}while((_|0)<(n|0))}_=n-1|0;if((_|0)<=0){eF(j);eF(l);ka=(V|0)<=(m|0);la=ka&1;return la|0}if((b|0)==0){ha=0;while(1){ga=f+(ha<<3)|0;ja=+h[ga>>3];I=ha+1|0;do{if((I|0)<(n|0)){fa=I;aa=ha;ia=ja;do{ba=+h[f+(fa<<3)>>3];ea=ia<ba;aa=ea?fa:aa;ia=ea?ba:ia;fa=fa+1|0;}while((fa|0)<(n|0));if((aa|0)==(ha|0)){break}h[f+(aa<<3)>>3]=ja;h[ga>>3]=ia}}while(0);if((I|0)<(_|0)){ha=I}else{break}}eF(j);eF(l);ka=(V|0)<=(m|0);la=ka&1;return la|0}else{ma=0}while(1){ha=f+(ma<<3)|0;ga=ma+1|0;do{if((ga|0)<(n|0)){fa=ga;ea=ma;ja=+h[ha>>3];do{ba=+h[f+(fa<<3)>>3];da=ja<ba;ea=da?fa:ea;ja=da?ba:ja;fa=fa+1|0;}while((fa|0)<(n|0));if((ea|0)==(ma|0)){break}fa=e+(ma<<2)|0;aa=k;da=c[fa>>2]|0;ca=b;while(1){h[aa>>3]=+h[da>>3];J=ca-1|0;if((J|0)==0){break}else{aa=aa+8|0;da=da+8|0;ca=J}}ca=e+(ea<<2)|0;da=c[fa>>2]|0;aa=c[ca>>2]|0;J=b;while(1){h[da>>3]=+h[aa>>3];W=J-1|0;if((W|0)==0){break}else{da=da+8|0;aa=aa+8|0;J=W}}J=c[ca>>2]|0;aa=k;da=b;while(1){h[J>>3]=+h[aa>>3];fa=da-1|0;if((fa|0)==0){break}else{J=J+8|0;aa=aa+8|0;da=fa}}h[f+(ea<<3)>>3]=+h[ha>>3];h[ha>>3]=ja}}while(0);if((ga|0)<(_|0)){ma=ga}else{break}}eF(j);eF(l);ka=(V|0)<=(m|0);la=ka&1;return la|0}function Os(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0;if((b|0)<=0){return}if((d|0)>0){g=0}else{vF(f|0,0,b<<3|0)|0;return}do{i=c[a+(g<<2)>>2]|0;j=0;k=0.0;do{k=k+ +h[i+(j<<3)>>3]*+h[e+(j<<3)>>3];j=j+1|0;}while((j|0)<(d|0));h[f+(g<<3)>>3]=k;g=g+1|0;}while((g|0)<(b|0));return}function Ps(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0.0;j=c[i>>2]|0;if((j|0)==0){k=d<<2;l=dF(da(k,f)|0)|0;m=l;n=dF(k)|0}else{k=d<<2;l=gF(c[j>>2]|0,da(k,f)|0)|0;m=l;n=gF(j,k)|0}k=n;c[i>>2]=k;i=(d|0)>0;if(!i){return}n=0;j=m;while(1){c[k+(n<<2)>>2]=j;m=n+1|0;if((m|0)<(d|0)){n=m;j=j+(f<<2)|0}else{break}}if(!i){return}i=(f|0)>0;j=(e|0)>0;n=0;do{if(i){m=k+(n<<2)|0;l=a+(n<<2)|0;o=0;do{if(j){p=c[l>>2]|0;q=0.0;r=0;do{q=q+ +h[p+(r<<3)>>3]*+g[(c[b+(r<<2)>>2]|0)+(o<<2)>>2];r=r+1|0;}while((r|0)<(e|0));s=q}else{s=0.0}g[(c[m>>2]|0)+(o<<2)>>2]=s;o=o+1|0;}while((o|0)<(f|0))}n=n+1|0;}while((n|0)<(d|0));return}function Qs(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0.0;j=c[i>>2]|0;if((j|0)==0){k=dF(da(d<<3,f)|0)|0;l=k;m=dF(d<<2)|0}else{k=gF(c[j>>2]|0,da(d<<3,f)|0)|0;l=k;m=gF(j,d<<2)|0}j=m;c[i>>2]=j;i=(d|0)>0;if(!i){return}m=l;l=0;while(1){c[j+(l<<2)>>2]=m;k=l+1|0;if((k|0)<(d|0)){m=m+(f<<3)|0;l=k}else{break}}if(!i){return}i=(f|0)>0;l=(e|0)>0;m=0;do{if(i){k=j+(m<<2)|0;n=a+(m<<2)|0;o=0;do{if(l){p=c[n>>2]|0;q=0;r=0.0;while(1){s=r+ +h[p+(q<<3)>>3]*+g[(c[b+(q<<2)>>2]|0)+(o<<2)>>2];t=q+1|0;if((t|0)<(e|0)){q=t;r=s}else{u=s;break}}}else{u=0.0}h[(c[k>>2]|0)+(o<<3)>>3]=u;o=o+1|0;}while((o|0)<(f|0))}m=m+1|0;}while((m|0)<(d|0));return}function Rs(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0;i=c[f>>2]|0;if((i|0)==0){j=dF(da(d<<4,e)|0)|0;k=j;l=dF(d<<2)|0}else{j=gF(c[i>>2]|0,da(d<<4,e)|0)|0;k=j;l=gF(i,d<<2)|0}i=l;c[f>>2]=i;f=(d|0)>0;if(!f){return}l=0;j=k;while(1){c[i+(l<<2)>>2]=j;k=l+1|0;if((k|0)<(d|0)){l=k;j=j+(e<<2)|0}else{break}}if(!f){return}f=(e|0)>0;j=0;do{l=c[a+(j<<4)+4>>2]|0;k=c[a+(j<<4)+8>>2]|0;m=c[a+(j<<4)>>2]|0;if(f){n=(m|0)>0;o=i+(j<<2)|0;p=0;do{if(n){q=c[b+(p<<2)>>2]|0;r=0;s=0.0;do{s=s+ +g[k+(r<<2)>>2]*+h[q+(c[l+(r<<2)>>2]<<3)>>3];r=r+1|0;}while((r|0)<(m|0));t=s}else{t=0.0}g[(c[o>>2]|0)+(p<<2)>>2]=t;p=p+1|0;}while((p|0)<(e|0))}j=j+1|0;}while((j|0)<(d|0));return}function Ss(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0.0,g=0.0,i=0,j=0,k=0;c=(a|0)==0;if(c){return}else{d=a;e=b;f=0.0}while(1){g=f+ +h[e>>3];i=d-1|0;if((i|0)==0){break}else{d=i;e=e+8|0;f=g}}f=g/+(a|0);if(c){return}else{j=a;k=b}while(1){h[k>>3]=+h[k>>3]-f;b=j-1|0;if((b|0)==0){break}else{j=b;k=k+8|0}}return}function Ts(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,i=0,j=0,k=0.0;if((b|0)>0){f=0}else{return}do{i=c[a+(f<<2)>>2]|0;j=0;k=0.0;do{k=k+ +g[i+(j<<2)>>2]*+h[d+(j<<3)>>3];j=j+1|0;}while((j|0)<(b|0));h[e+(f<<3)>>3]=k;f=f+1|0;}while((f|0)<(b|0));return}function Us(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]- +h[c+(e<<3)>>3];e=e+1|0;}while((e|0)<(a|0));return}function Vs(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]+ +h[c+(e<<3)>>3];e=e+1|0;}while((e|0)<(a|0));return}function Ws(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{h[d+(e<<3)>>3]=+h[b+(e<<3)>>3]*c;e=e+1|0;}while((e|0)<(a|0));return}function Xs(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((a|0)>0){d=0}else{return}do{h[c+(d<<3)>>3]=+h[b+(d<<3)>>3];d=d+1|0;}while((d|0)<(a|0));return}function Ys(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0,g=0.0,i=0;if((a|0)>0){d=0;e=0.0}else{f=0.0;return+f}while(1){g=e+ +h[b+(d<<3)>>3]*+h[c+(d<<3)>>3];i=d+1|0;if((i|0)<(a|0)){d=i;e=g}else{f=g;break}}return+f}function Zs(a,b){a=a|0;b=b|0;var c=0.0,d=0,e=0.0,f=0.0,g=0.0,i=0;if((a|0)>0){c=-1.0e+50;d=0}else{e=-1.0e+50;return+e}while(1){f=+S(+(+h[b+(d<<3)>>3]));g=f>c?f:c;i=d+1|0;if((i|0)<(a|0)){c=g;d=i}else{e=g;break}}return+e}function _s(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0.0;if((b|0)<=0){return}g=(d|0)>0;i=0;do{if(g){j=0;k=0.0;while(1){l=k+ +h[(c[a+(j<<2)>>2]|0)+(i<<3)>>3]*+h[e+(j<<3)>>3];m=j+1|0;if((m|0)<(d|0)){j=m;k=l}else{n=l;break}}}else{n=0.0}h[f+(i<<3)>>3]=n;i=i+1|0;}while((i|0)<(b|0));return}function $s(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0.0,h=0.0,i=0,j=0,k=0;c=(a|0)==0;if(c){return}else{d=a;e=b;f=0.0}while(1){h=f+ +g[e>>2];i=d-1|0;if((i|0)==0){break}else{d=i;e=e+4|0;f=h}}f=h/+(a|0);if(c){return}else{j=a;k=b}while(1){g[k>>2]=+g[k>>2]-f;b=j-1|0;if((b|0)==0){break}else{j=b;k=k+4|0}}return}function at(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,h=0,i=0.0,j=0.0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0;if((b|0)<=0){return}vF(d|0,0,b<<2|0)|0;e=0;f=0;h=b;while(1){i=+g[c+(f<<2)>>2];j=i*+g[a+(e<<2)>>2]+0.0;k=f+1|0;l=(k|0)<(b|0);if(l){m=k;n=j;o=e}else{break}do{o=o+1|0;p=+g[a+(o<<2)>>2];n=n+p*+g[c+(m<<2)>>2];q=d+(m<<2)|0;g[q>>2]=i*p+ +g[q>>2];m=m+1|0;}while((m|0)<(b|0));q=d+(f<<2)|0;g[q>>2]=n+ +g[q>>2];if(l){e=e+h|0;f=k;h=h-1|0}else{r=7;break}}if((r|0)==7){return}r=d+(f<<2)|0;g[r>>2]=j+ +g[r>>2];return}function bt(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]- +g[c+(e<<2)>>2];e=e+1|0;}while((e|0)<(a|0));return}function ct(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]+ +g[c+(e<<2)>>2];e=e+1|0;}while((e|0)<(a|0));return}function dt(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0,f=0;if((a|0)>0){e=0}else{return}do{f=b+(e<<2)|0;g[f>>2]=+g[f>>2]+ +g[d+(e<<2)>>2]*c;e=e+1|0;}while((e|0)<(a|0));return}function et(a,b,c,d){a=a|0;b=b|0;c=+c;d=d|0;var e=0;if((a|0)>0){e=0}else{return}do{g[d+(e<<2)>>2]=+g[b+(e<<2)>>2]*c;e=e+1|0;}while((e|0)<(a|0));return}function ft(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((a|0)>0){d=0}else{return}do{g[c+(d<<2)>>2]=+g[b+(d<<2)>>2];d=d+1|0;}while((d|0)<(a|0));return}function gt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0,f=0.0,h=0.0,i=0;if((a|0)>0){d=0;e=0.0}else{f=0.0;return+f}while(1){h=e+ +g[b+(d<<2)>>2]*+g[c+(d<<2)>>2];i=d+1|0;if((i|0)<(a|0)){d=i;e=h}else{f=h;break}}return+f}function ht(a,b,c){a=a|0;b=+b;c=c|0;var d=0;if((a|0)>0){d=0}else{return}do{g[c+(d<<2)>>2]=b;d=d+1|0;}while((d|0)<(a|0));return}function it(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0.0,f=0.0;if((a|0)>0){c=0;d=-1.0000000150474662e+30}else{e=-1.0000000150474662e+30;return+e}do{f=+S(+(+g[b+(c<<2)>>2]));d=f>d?f:d;c=c+1|0;}while((c|0)<(a|0));e=d;return+e}function jt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;if((a|0)>0){c=0}else{return}do{d=b+(c<<2)|0;e=+g[d>>2];g[d>>2]=e*e;c=c+1|0;}while((c|0)<(a|0));return}function kt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;if((a|0)>0){c=0}else{return}do{d=b+(c<<2)|0;e=+g[d>>2];if(e!=0.0){g[d>>2]=1.0/e}c=c+1|0;}while((c|0)<(a|0));return}function lt(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0.0;if((a|0)>0){d=0}else{return}do{e=+g[b+(d<<2)>>2];if(e>=0.0){g[c+(d<<2)>>2]=+T(e)}d=d+1|0;}while((d|0)<(a|0));return}function mt(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0;if((a|0)>0){c=0}else{return}do{d=b+(c<<2)|0;e=+g[d>>2];if(e>0.0){g[d>>2]=1.0/+T(e)}c=c+1|0;}while((c|0)<(a|0));return}function nt(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[a>>2]=0;do{if((b&3|0)==0){d=b}else{if((4%(b>>>0)|0|0)==0){d=4;break}a:do{if((b|0)==4){e=4}else{f=b;g=4;while(1){h=g;while(1){i=h-f|0;if((f|0)>=(h|0)){break}if((i|0)==(f|0)){e=f;break a}else{h=i}}i=f-h|0;if((h|0)==(i|0)){e=h;break}else{f=i;g=h}}}}while(0);d=da(4/(e>>>0)|0,b)|0}}while(0);c[a+8>>2]=d;d=a+4|0;a=c[d>>2]|0;if((a|0)==0){c[d>>2]=0;return}else{j=a}while(1){a=c[j>>2]|0;eF(c[j+4>>2]|0);eF(j);if((a|0)==0){break}else{j=a}}c[d>>2]=0;return}function ot(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;b=a|0;d=c[b>>2]|0;if((d|0)!=0){e=d;f=e|0;g=c[f>>2]|0;c[b>>2]=g;h=e;return h|0}d=c[a+8>>2]|0;i=kk(8)|0;j=i;k=kk(da(c[43746]|0,d)|0)|0;c[i+4>>2]=k;if((c[43746]|0)>0){l=0;m=c[b>>2]|0;while(1){n=k+(da(l,d)|0)|0;o=n;c[n>>2]=m;c[b>>2]=o;n=l+1|0;if((n|0)<(c[43746]|0)){l=n;m=o}else{break}}}m=a+4|0;c[i>>2]=c[m>>2];c[m>>2]=j;e=c[b>>2]|0;f=e|0;g=c[f>>2]|0;c[b>>2]=g;h=e;return h|0}function pt(a,b){a=a|0;b=b|0;var d=0;d=b|0;c[a>>2]=c[d>>2];c[d>>2]=a;return}function qt(a){a=a|0;var b=0,d=0;b=a|0;Wx(b,141360,304,1)|0;Ym(a);d=jk((e[(c[(Hx(b)|0)+8>>2]|0)+168>>1]|0)<<3)|0;c[(c[a+8>>2]|0)+132>>2]=d;vn(a,c[(c[(Hx(b)|0)+8>>2]|0)+116>>2]&1);return}function rt(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0;g=i;i=i+16|0;j=g|0;k=g+8|0;if((b|0)==0){l=0;i=g;return l|0}m=e+8|0;n=c[(c[m>>2]|0)+132>>2]|0;o=e|0;p=fw(o,b)|0;if((a[p]|0)==0){l=0;i=g;return l|0}a[j]=0;b=n+8|0;do{if((c[53568]|0)>2){q=ac(p|0,161560,(r=i,i=i+32|0,c[r>>2]=n,c[r+8>>2]=b,c[r+16>>2]=n+16,c[r+24>>2]=j,r)|0)|0;i=r;if((q|0)<=2){break}a[(c[m>>2]|0)+119|0]=1;s=+h[21580];q=c[53568]|0;a:do{if(s>0.0){if((q|0)>0){t=0;u=s}else{break}while(1){v=n+(t<<3)|0;h[v>>3]=+h[v>>3]/u;v=t+1|0;w=c[53568]|0;if((v|0)>=(w|0)){x=w;y=9;break a}t=v;u=+h[21580]}}else{x=q;y=9}}while(0);do{if((y|0)==9){if((x|0)<=3){break}vu(e,f,3)}}while(0);do{if((a[j]|0)!=33){if((d|0)==0){l=1;i=g;return l|0}if((Km(fw(o,d)|0)|0)<<24>>24==0){l=1}else{break}i=g;return l|0}}while(0);a[(c[m>>2]|0)+119|0]=3;l=1;i=g;return l|0}}while(0);x=ac(p|0,130648,(r=i,i=i+24|0,c[r>>2]=n,c[r+8>>2]=b,c[r+16>>2]=j,r)|0)|0;i=r;if((x|0)<=1){x=$w(o)|0;Fv(1,109024,(r=i,i=i+16|0,c[r>>2]=x,c[r+8>>2]=p,r)|0)|0;i=r;l=0;i=g;return l|0}a[(c[m>>2]|0)+119|0]=1;u=+h[21580];p=c[53568]|0;b:do{if(u>0.0){if((p|0)>0){z=0;A=u}else{break}while(1){x=n+(z<<3)|0;h[x>>3]=+h[x>>3]/A;x=z+1|0;b=c[53568]|0;if((x|0)>=(b|0)){B=b;y=20;break b}z=x;A=+h[21580]}}else{B=p;y=20}}while(0);c:do{if((y|0)==20){if((B|0)<=2){break}p=c[53570]|0;do{if((p|0)!=0){z=fw(o,p)|0;if((z|0)==0){break}x=ac(z|0,116320,(r=i,i=i+8|0,c[r>>2]=k,r)|0)|0;i=r;if((x|0)!=1){break}A=+h[21580];u=+h[k>>3];if(A>0.0){h[n+16>>3]=u/A}else{h[n+16>>3]=u}vu(e,f,3);break c}}while(0);wu(e,f)}}while(0);do{if((a[j]|0)!=33){if((d|0)==0){l=1;i=g;return l|0}if((Km(fw(o,d)|0)|0)<<24>>24==0){l=1}else{break}i=g;return l|0}}while(0);a[(c[m>>2]|0)+119|0]=3;l=1;i=g;return l|0}function st(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)!=0){d=b;do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0)}if((c[53566]|0)!=0|(c[53552]|0)<0){uu(a)}if((Ix(a|0)|0)==(a|0)){return}_x(a,0,139536);return}function tt(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0,V=0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;f=i;i=i+152|0;g=f|0;j=f+8|0;k=f+16|0;l=f+24|0;m=f+32|0;n=f+40|0;o=f+48|0;p=f+56|0;q=f+64|0;r=f+72|0;s=f+80|0;t=f+88|0;u=f+96|0;v=f+104|0;w=f+112|0;x=f+120|0;y=Wv(b,0,103264,0)|0;z=Wv(b,0,97632,0)|0;if((z|0)==0){A=Wv(b,0,97632,213344)|0}else{A=z}tu(b)|0;z=b+8|0;B=c[c[(c[z>>2]|0)+144>>2]>>2]|0;a:do{if((B|0)!=0){C=0;D=B;while(1){E=D+8|0;F=c[E>>2]|0;if((a[F+119|0]|0)==0){G=D|0;if((Za($w(G)|0,86848,7)|0)!=0){break}H=c[E>>2]|0}else{H=F}F=c[H+108>>2]|0;do{if((F|0)!=0){E=ew(D|0,168264)|0;if((E|0)==0){break}I=ac(E|0,98704,(J=i,i=i+16|0,c[J>>2]=v,c[J+8>>2]=w,J)|0)|0;i=J;if((I|0)!=2){break}K=+h[w>>3];h[F+56>>3]=+h[v>>3];h[F+64>>3]=K;a[F+81|0]=1}}while(0);C=C+1|0;D=c[(c[(c[z>>2]|0)+144>>2]|0)+(C<<2)>>2]|0;if((D|0)==0){break a}}D=$w(G)|0;C=$w(b|0)|0;Fv(1,82048,(J=i,i=i+16|0,c[J>>2]=D,c[J+8>>2]=C,J)|0)|0;i=J;L=-1;i=f;return L|0}}while(0);ut(b,y,A);do{if((Mw(b)|0)==0){M=2}else{A=Wv(b,2,104384,0)|0;if((A|0)==0|(c[53566]|0)<2){M=0;break}y=ux(b)|0;if((y|0)==0){M=0;break}G=y;y=0;while(1){v=mw(b,G)|0;if((v|0)==0){N=y}else{w=v;v=y;while(1){H=w|0;B=fw(H,A)|0;do{if((a[B]|0)==0){O=0}else{ih(w,t,u);C=1;K=0.0;P=0.0;Q=0.0;R=0.0;D=0;F=0;I=B;b:while(1){E=ac(I|0,102080,(J=i,i=i+24|0,c[J>>2]=r,c[J+8>>2]=s,c[J+16>>2]=q,J)|0)|0;i=J;if((E|0)==2){S=+h[r>>3];T=+h[s>>3];U=1;V=I+(c[q>>2]|0)|0}else{S=Q;T=R;U=F;V=I}E=ac(V|0,101336,(J=i,i=i+24|0,c[J>>2]=r,c[J+8>>2]=s,c[J+16>>2]=q,J)|0)|0;i=J;if((E|0)==2){W=+h[r>>3];X=+h[s>>3];Y=1;Z=V+(c[q>>2]|0)|0}else{W=K;X=P;Y=D;Z=V}E=0;_=Z;while(1){$=_;while(1){if((Qa(d[$]|0)|0)==0){break}else{$=$+1|0}}aa=a[$]|0;c:do{if(aa<<24>>24==0){ba=0;ca=E;da=$}else{ea=E+1|0;fa=$;ga=aa;while(1){ha=fa+1|0;if((Qa(ga&255|0)|0)!=0|ga<<24>>24==59){ba=ga;ca=ea;da=fa;break c}ia=a[ha]|0;if(ia<<24>>24==0){ba=0;ca=ea;da=ha;break}else{fa=ha;ga=ia}}}}while(0);if((Qa(ba&255|0)|0)==0){break}else{E=ca;_=da}}if(!((ca|0)>3&((ca|0)%3|0|0)==1)){ja=34;break}ka=kk(ca<<4)|0;_=ka;if((ca|0)==0){la=Z}else{E=ca;aa=Z;$=_;while(1){ga=ac(aa|0,100472,(J=i,i=i+24|0,c[J>>2]=r,c[J+8>>2]=s,c[J+16>>2]=q,J)|0)|0;i=J;if((ga|0)<2){ja=38;break b}ga=aa+(c[q>>2]|0)|0;h[$>>3]=+h[r>>3];h[$+8>>3]=+h[s>>3];fa=E-1|0;if((fa|0)==0){la=ga;break}else{E=fa;aa=ga;$=$+16|0}}}while(1){ma=la+1|0;if((Qa(a[la]|0)|0)==0){break}else{la=ma}}$=(a[la]|0)==0;aa=$?la:ma;E=$?0:C;$=bm(w,ca)|0;if((U|0)!=0){c[$+8>>2]=c[t>>2];h[$+16>>3]=S;h[$+24>>3]=T}if((Y|0)!=0){c[$+12>>2]=c[u>>2];h[$+32>>3]=W;h[$+40>>3]=X}if((ca|0)>0){ga=$|0;$=0;do{fa=(c[ga>>2]|0)+($<<4)|0;ea=_+($<<4)|0;c[fa>>2]=c[ea>>2];c[fa+4>>2]=c[ea+4>>2];c[fa+8>>2]=c[ea+8>>2];c[fa+12>>2]=c[ea+12>>2];$=$+1|0;}while(($|0)<(ca|0))}eF(ka);if((E|0)==0){ja=51;break}else{C=E;K=W;P=X;Q=S;R=T;D=Y;F=U;I=aa}}if((ja|0)==34){ja=0;sn(w);if(a[976]|0){O=0;break}a[976]=1;I=w;F=$w(c[((c[I>>2]&3|0)==3?w:w+32|0)+28>>2]|0)|0;D=$w(c[((c[I>>2]&3|0)==2?w:w-32|0)+28>>2]|0)|0;Fv(0,100880,(J=i,i=i+16|0,c[J>>2]=F,c[J+8>>2]=D,J)|0)|0;i=J;O=0;break}else if((ja|0)==38){ja=0;if(!(a[976]|0)){a[976]=1;D=w;F=$w(c[((c[D>>2]&3|0)==3?w:w+32|0)+28>>2]|0)|0;I=$w(c[((c[D>>2]&3|0)==2?w:w-32|0)+28>>2]|0)|0;Fv(0,99912,(J=i,i=i+16|0,c[J>>2]=F,c[J+8>>2]=I,J)|0)|0;i=J}eF(ka);sn(w);O=0;break}else if((ja|0)==51){ja=0;I=w+8|0;F=c[(c[I>>2]|0)+96>>2]|0;do{if((F|0)!=0){D=ew(H,103264)|0;if((D|0)==0){break}C=ac(D|0,98704,(J=i,i=i+16|0,c[J>>2]=o,c[J+8>>2]=p,J)|0)|0;i=J;if((C|0)!=2){break}R=+h[p>>3];h[F+56>>3]=+h[o>>3];h[F+64>>3]=R;a[F+81|0]=1}}while(0);F=c[(c[I>>2]|0)+108>>2]|0;do{if((F|0)!=0){C=ew(H,168264)|0;if((C|0)==0){break}D=ac(C|0,98704,(J=i,i=i+16|0,c[J>>2]=m,c[J+8>>2]=n,J)|0)|0;i=J;if((D|0)!=2){break}R=+h[n>>3];h[F+56>>3]=+h[m>>3];h[F+64>>3]=R;a[F+81|0]=1}}while(0);F=c[(c[I>>2]|0)+100>>2]|0;do{if((F|0)!=0){D=ew(H,99528)|0;if((D|0)==0){break}C=ac(D|0,98704,(J=i,i=i+16|0,c[J>>2]=k,c[J+8>>2]=l,J)|0)|0;i=J;if((C|0)!=2){break}R=+h[l>>3];h[F+56>>3]=+h[k>>3];h[F+64>>3]=R;a[F+81|0]=1}}while(0);F=c[(c[I>>2]|0)+104>>2]|0;if((F|0)==0){O=1;break}C=ew(H,99144)|0;if((C|0)==0){O=1;break}D=ac(C|0,98704,(J=i,i=i+16|0,c[J>>2]=g,c[J+8>>2]=j,J)|0)|0;i=J;if((D|0)!=2){O=1;break}R=+h[j>>3];h[F+56>>3]=+h[g>>3];h[F+64>>3]=R;a[F+81|0]=1;O=1;break}}}while(0);H=O+v|0;B=ow(b,w)|0;if((B|0)==0){N=H;break}else{w=B;v=H}}}v=vx(b,G)|0;if((v|0)==0){break}else{G=v;y=N}}if((N|0)==0){M=0;break}y=(N|0)==(Mw(b)|0);M=y?2:1}}while(0);N=c[(c[z>>2]|0)+8>>2]|0;d:do{if((c[N+88>>2]|0)==0){O=(e|0)!=0;do{if(O&(c[53566]|0)==1){if((nr(b)|0)==0){break}g=c[(c[z>>2]|0)+12>>2]|0;if((g|0)==0){break}a[g+81|0]=0}}while(0);$m(b);if(!O){na=0;ja=115;break}g=c[z>>2]|0;T=+h[g+16>>3];j=~~T;J=(j|0)>-1?j:-j|0;S=+(J|0);if((J|0)>-1){if((~~(S+.5)|0)==0){ja=81}}else{if((~~(S+-.5)|0)==0){ja=81}}do{if((ja|0)==81){J=~~+h[g+24>>3];j=(J|0)>-1?J:-J|0;S=+(j|0);if((j|0)>-1){if((~~(S+.5)|0)==0){oa=0;break d}else{break}}else{if((~~(S+-.5)|0)==0){oa=0;break d}else{break}}}}while(0);S=+h[g+24>>3];X=T/72.0;W=S/72.0;O=ux(b)|0;if((O|0)!=0){j=O;do{O=j+8|0;J=c[(c[O>>2]|0)+132>>2]|0;h[J>>3]=+h[J>>3]-X;J=(c[(c[O>>2]|0)+132>>2]|0)+8|0;h[J>>3]=+h[J>>3]-W;j=vx(b,j)|0;}while((j|0)!=0)}do{if((M|0)!=0){j=ux(b)|0;if((j|0)==0){break}else{pa=j}do{j=mw(b,pa)|0;if((j|0)!=0){g=j;do{j=g+8|0;J=c[j>>2]|0;O=c[J+8>>2]|0;do{if((O|0)!=0){if((c[O+4>>2]|0)>0){k=0;l=c[O>>2]|0;while(1){m=l+4|0;if((c[m>>2]|0)>0){n=0;o=c[l>>2]|0;while(1){p=o|0;h[p>>3]=+h[p>>3]-T;p=o+8|0;h[p>>3]=+h[p>>3]-S;p=n+1|0;if((p|0)<(c[m>>2]|0)){n=p;o=o+16|0}else{break}}}if((c[l+8>>2]|0)!=0){o=l+16|0;h[o>>3]=+h[o>>3]-T;o=l+24|0;h[o>>3]=+h[o>>3]-S}if((c[l+12>>2]|0)!=0){o=l+32|0;h[o>>3]=+h[o>>3]-T;o=l+40|0;h[o>>3]=+h[o>>3]-S}o=k+1|0;n=c[j>>2]|0;if((o|0)<(c[(c[n+8>>2]|0)+4>>2]|0)){k=o;l=l+48|0}else{qa=n;break}}}else{qa=J}l=c[qa+96>>2]|0;do{if((l|0)==0){ra=qa}else{if((a[l+81|0]|0)==0){ra=qa;break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+96>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S;ra=c[j>>2]|0}}while(0);l=c[ra+108>>2]|0;do{if((l|0)==0){sa=ra}else{if((a[l+81|0]|0)==0){sa=ra;break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+108>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S;sa=c[j>>2]|0}}while(0);l=c[sa+100>>2]|0;do{if((l|0)==0){ta=sa}else{if((a[l+81|0]|0)==0){ta=sa;break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+100>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S;ta=c[j>>2]|0}}while(0);l=c[ta+104>>2]|0;if((l|0)==0){break}if((a[l+81|0]|0)==0){break}k=l+56|0;h[k>>3]=+h[k>>3]-T;k=(c[(c[j>>2]|0)+104>>2]|0)+64|0;h[k>>3]=+h[k>>3]-S}}while(0);g=ow(b,g)|0;}while((g|0)!=0)}pa=vx(b,pa)|0;}while((pa|0)!=0)}}while(0);Bt(b,T,S);oa=0}else{c[N+84>>2]=0;$m(b);g=(c[z>>2]|0)+16|0;Ph(x,b);j=g;g=x;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];c[j+16>>2]=c[g+16>>2];c[j+20>>2]=c[g+20>>2];c[j+24>>2]=c[g+24>>2];c[j+28>>2]=c[g+28>>2];if((e|0)==0){na=1;ja=115}else{oa=1}}}while(0);if((ja|0)==115){c[53522]=1;ja=ux(b)|0;if((ja|0)==0){L=na;i=f;return L|0}else{ua=ja}while(1){ja=ua+8|0;e=c[ja>>2]|0;h[e+16>>3]=+h[c[e+132>>2]>>3]*72.0;e=c[ja>>2]|0;h[e+24>>3]=+h[(c[e+132>>2]|0)+8>>3]*72.0;e=vx(b,ua)|0;if((e|0)==0){L=na;break}else{ua=e}}i=f;return L|0}if((M|0)==2){c[53522]=1;Ot(b);L=oa;i=f;return L|0}else{Nt(b);L=oa;i=f;return L|0}return 0}function ut(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0;f=i;i=i+16|0;g=f|0;j=f+8|0;k=b+8|0;do{if(!((c[(c[k>>2]|0)+12>>2]|0)==0|(d|0)==0)){l=ac(fw(b|0,d)|0,98704,(m=i,i=i+16|0,c[m>>2]=g,c[m+8>>2]=j,m)|0)|0;i=m;if((l|0)!=2){break}l=c[(c[k>>2]|0)+12>>2]|0;n=+h[j>>3];h[l+56>>3]=+h[g>>3];h[l+64>>3]=n;a[(c[(c[k>>2]|0)+12>>2]|0)+81|0]=1}}while(0);if((e|0)==0){i=f;return}k=sy(b)|0;if((k|0)==0){i=f;return}else{o=k}do{Ct(o,b,d,e);o=ty(o)|0;}while((o|0)!=0);i=f;return}function vt(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+40|0;h=g|0;j=g+32|0;k=b|0;b=ew(k,164128)|0;if((b|0)==0){l=e;i=g;return l|0}m=a[b]|0;if(m<<24>>24==0){l=e;i=g;return l|0}do{if((Kb(m&255|0)|0)==0){n=b;o=((d[b]|0)-48|0)>>>0<10>>>0}else{if((Za(b|0,160072,4)|0)==0){l=0;i=g;return l|0}if((Za(b|0,155040,7)|0)==0){l=1;i=g;return l|0}else{p=(Za(b|0,151632,6)|0)==0;n=p?b+6|0:b;o=p;break}}}while(0);b=o?2:e;if((b|0)!=2){l=b;i=g;return l|0}if(((d[n]|0)-48|0)>>>0<10>>>0){b=ac(n|0,148776,(q=i,i=i+8|0,c[q>>2]=j,q)|0)|0;i=q;if((b|0)<1){r=11}}else{r=11}if((r|0)==11){r=fb()|0;b=(zc(0)|0)^r;c[j>>2]=b;r=h|0;nb(r|0,148776,(q=i,i=i+8|0,c[q>>2]=b,q)|0)|0;i=q;gw(k,164128,r)|0}c[f>>2]=c[j>>2];l=2;i=g;return l|0}function wt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0.0;f=i;i=i+8|0;g=f|0;c[g>>2]=1;j=vt(b,e,g)|0;if(!((c[53596]|0)==0|(j|0)==2)){Fv(0,145560,(e=i,i=i+1|0,i=i+7&-8,c[e>>2]=0,e)|0)|0;i=e}if((j|0)!=1){k=c[g>>2]|0;dc(k|0);i=f;return j|0}l=+(d|0);m=6.283185307179586/l;e=ux(b)|0;if((e|0)==0){k=c[g>>2]|0;dc(k|0);i=f;return j|0}else{n=0.0;o=e}while(1){p=l*+V(n);e=o+8|0;h[c[(c[e>>2]|0)+132>>2]>>3]=p;p=l*+W(n);h[(c[(c[e>>2]|0)+132>>2]|0)+8>>3]=p;a[(c[e>>2]|0)+119|0]=1;if((c[53568]|0)>2){wu(o,d)}e=vx(b,o)|0;if((e|0)==0){break}else{n=m+n;o=e}}k=c[g>>2]|0;dc(k|0);i=f;return j|0}function xt(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;i=i+1096|0;e=d|0;f=d+1024|0;g=d+1056|0;j=d+1080|0;k=d+1088|0;l=+h[21580];do{if((c[53566]|0)==0){h[21580]=+Gm(b);yt(b);m=b|0;n=ew(m,107080)|0;do{if((n|0)==0){o=1}else{p=a[n]|0;if((p<<24>>24|0)==0){o=1;break}else if((p<<24>>24|0)==75){if((Ya(n|0,106624)|0)==0){o=0;break}}else if((p<<24>>24|0)==109){if((Ya(n|0,106200)|0)==0){o=1;break}}p=$w(m)|0;Fv(0,105680,(q=i,i=i+16|0,c[q>>2]=n,c[q+8>>2]=p,q)|0)|0;i=q;o=1}}while(0);jr(b,g,0)|0;n=ew(m,112752)|0;a:do{if((n|0)==0){r=0}else{p=a[n]|0;do{if((p<<24>>24|0)==99){if((Ya(n|0,112296)|0)==0){r=1;break a}}else if((p<<24>>24|0)==115){if((Ya(n|0,111672)|0)==0){r=2;break a}if((Ya(n|0,111032)|0)==0){r=0;break a}}else if((p<<24>>24|0)==109){if((Ya(n|0,110368)|0)!=0){break}if((Wv(b,2,121896,0)|0)!=0){r=3;break a}s=$w(m)|0;Fv(0,109568,(q=i,i=i+8|0,c[q>>2]=s,q)|0)|0;i=q;Fv(3,108728,(q=i,i=i+1|0,i=i+7&-8,c[q>>2]=0,q)|0)|0;i=q;r=0;break a}else if((p<<24>>24|0)==0){r=0;break a}}while(0);p=$w(m)|0;Fv(0,107760,(q=i,i=i+16|0,c[q>>2]=n,c[q+8>>2]=p,q)|0)|0;i=q;r=0}}while(0);n=vv(b,0,f)|0;m=wv(b,-1,8)|0;c[53552]=m;p=(m|0)<0;do{if((n|0)==0){if(!((o|0)==0|p^1)){c[53552]=8;c[f+16>>2]=2;t=28;break}c[f+16>>2]=2;if((m|0)>-1){t=28;break}zt(b,o,r);lr(b,g)|0;s=e|0;do{if((c[53568]|0)>2&(c[53570]|0)!=0){u=ux(b)|0;if((u|0)==0){break}else{v=u}do{nb(s|0,116320,(q=i,i=i+8|0,h[q>>3]=+h[(c[(c[v+8>>2]|0)+132>>2]|0)+16>>3]*72.0,q)|0)|0;i=q;hw(v|0,c[53570]|0,s)|0;v=vx(b,v)|0;}while((v|0)!=0)}}while(0);Pt(b)}else{if(!p){t=28;break}c[53552]=8;t=28}}while(0);if((t|0)==28){p=fv(b,j,113264,k)|0;do{if((c[j>>2]|0)>1){m=0;do{n=c[p+(m<<2)>>2]|0;jv(n)|0;zt(n,o,r);lr(n,g)|0;qn(n,2);Pt(n);m=m+1|0;w=c[j>>2]|0;}while((m|0)<(w|0));if((a[k]|0)==0){x=0;y=w}else{m=jk(w)|0;a[m]=1;x=m;y=c[j>>2]|0}c[f+8>>2]=c[53552];c[f+20>>2]=x;c[f+12>>2]=1;rv(y,p,b,f)|0;if((x|0)==0){break}eF(x)}else{zt(b,o,r);lr(b,g)|0;Pt(b)}}while(0);$m(b);m=e|0;do{if((c[53568]|0)>2&(c[53570]|0)!=0){n=ux(b)|0;if((n|0)==0){break}else{z=n}do{nb(m|0,116320,(q=i,i=i+8|0,h[q>>3]=+h[(c[(c[z+8>>2]|0)+132>>2]|0)+16>>3]*72.0,q)|0)|0;i=q;hw(z|0,c[53570]|0,m)|0;z=vx(b,z)|0;}while((z|0)!=0)}}while(0);if((c[j>>2]|0)>0){m=0;do{n=c[p+(m<<2)>>2]|0;uu(n);s=n|0;Xx(s,139536)|0;Gx(b,s)|0;m=m+1|0;}while((m|0)<(c[j>>2]|0))}eF(p)}Xk(b)}else{h[21580]=72.0;yt(b);m=e|0;do{if((c[53568]|0)>2&(c[53570]|0)!=0){s=ux(b)|0;if((s|0)==0){break}else{A=s}do{nb(m|0,116320,(q=i,i=i+8|0,h[q>>3]=+h[(c[(c[A+8>>2]|0)+132>>2]|0)+16>>3]*72.0,q)|0)|0;i=q;hw(A|0,c[53570]|0,m)|0;A=vx(b,A)|0;}while((A|0)!=0)}}while(0);m=tt(b,1)|0;if((m|0)>=0){Uk(b,(m|0)==0|0);break}Fv(3,142592,(q=i,i=i+1|0,i=i+7&-8,c[q>>2]=0,q)|0)|0;i=q;i=d;return}}while(0);h[21580]=l;i=d;return}function yt(a){a=a|0;var d=0,f=0,g=0,i=0,j=0,k=0,l=0.0;qn(a,2);d=a|0;f=Em(d,Wv(a,0,105272,0)|0,2,2)|0;g=(Em(d,Wv(a,0,104896,0)|0,f,2)|0)&65535;b[(c[(Ix(d)|0)+8>>2]|0)+168>>1]=g;g=a+48|0;d=(c[(c[g>>2]|0)+8>>2]|0)+168|0;i=b[d>>1]|0;j=(i&65535)>>>0<10>>>0?i:10;b[d>>1]=j;d=j&65535;c[53568]=d;b[(c[(c[g>>2]|0)+8>>2]|0)+170>>1]=(f|0)<(d|0)?f:d;d=Lw(a)|0;c[53596]=Wv(a,1,104384,0)|0;f=Wv(a,1,103824,0)|0;g=ux(a)|0;if((g|0)!=0){j=g;do{g=j|0;Wx(g,141360,304,1)|0;Ym(j);i=jk((e[(c[(Hx(g)|0)+8>>2]|0)+168>>1]|0)<<3)|0;c[(c[j+8>>2]|0)+132>>2]=i;vn(j,c[(c[(Hx(g)|0)+8>>2]|0)+116>>2]&1);rt(c[53596]|0,f,j,d)|0;j=vx(a,j)|0;}while((j|0)!=0)}j=ux(a)|0;if((j|0)==0){return}else{k=j}do{j=mw(a,k)|0;if((j|0)!=0){d=j;do{j=d|0;Wx(j,103024,176,1)|0;Zm(d)|0;l=+Fm(j,c[53750]|0,1.0,1.0);h[(c[d+8>>2]|0)+128>>3]=l;d=ow(a,d)|0;}while((d|0)!=0)}k=vx(a,k)|0;}while((k|0)!=0);return}function zt(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0;f=i;i=i+24|0;g=f|0;j=f+8|0;k=f+16|0;l=b|0;m=ew(l,136896)|0;do{if((m|0)==0){if((d|0)==1){c[53660]=200;break}else{c[53660]=(Lw(b)|0)*100|0;break}}else{c[53660]=Rb(m|0)|0}}while(0);m=ru(b,d)|0;if((m|0)<2|(c[53660]|0)<0){i=f;return}if((d|0)!=0){n=c[53568]|0;p=wt(b,m,(d|0)==2?0:2)|0;q=Em(l,Wv(b,0,114704,0)|0,2,0)|0;if((q|0)==0|(q|0)>2){Fv(0,113856,(r=i,i=i+8|0,c[r>>2]=114704,r)|0)|0;i=r;s=2}else{s=q}q=(p|0)==0;p=q?s|4:s;s=kk(n<<2)|0;t=s;u=kk(da(m<<3,n)|0)|0;c[t>>2]=u;a:do{if((c[53568]|0)>1){c[s+4>>2]=u+(m<<3);if((c[53568]|0)>2){v=2;w=u}else{break}while(1){c[t+(v<<2)>>2]=w+((da(v,m)|0)<<3);n=v+1|0;if((n|0)>=(c[53568]|0)){break a}v=n;w=c[t>>2]|0}}}while(0);if((a[213992]|0)!=0){w=c[o>>2]|0;v=c[53660]|0;x=+h[21657];gc(w|0,119480,(r=i,i=i+40|0,c[r>>2]=e,c[r+8>>2]=q&1,c[r+16>>2]=p&3,c[r+24>>2]=v,h[r+32>>3]=x,r)|0)|0;i=r;Ma(118760,15,1,w|0)|0;ym();Ma(117848,13,1,w|0)|0}w=At(b,m,j,d,e,k)|0;if((a[213992]|0)!=0){d=c[o>>2]|0;x=+zm();gc(d|0,116936,(r=i,i=i+16|0,c[r>>2]=m,h[r+8>>3]=x,r)|0)|0;i=r}do{if((nu(w,m,c[j>>2]|0,t,c[k>>2]|0,c[53568]|0,p,e,c[53660]|0)|0)<0){Fv(3,116016,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r}else{d=ux(b)|0;if((d|0)==0){break}else{y=d}do{d=y+8|0;v=c[d>>2]|0;q=c[v+120>>2]|0;do{if((c[53568]|0)>0){h[c[v+132>>2]>>3]=+h[(c[t>>2]|0)+(q<<3)>>3];if((c[53568]|0)>1){z=1}else{break}do{h[(c[(c[d>>2]|0)+132>>2]|0)+(z<<3)>>3]=+h[(c[t+(z<<2)>>2]|0)+(q<<3)>>3];z=z+1|0;}while((z|0)<(c[53568]|0))}}while(0);y=vx(b,y)|0;}while((y|0)!=0)}}while(0);Qr(w);eF(c[t>>2]|0);eF(s);eF(c[k>>2]|0);i=f;return}do{if((e|0)==2){k=At(b,m,g,0,2,0)|0;s=Cs(k,m)|0;if((m|0)>0){t=b+8|0;w=0;do{y=s+(w<<2)|0;z=0;do{h[(c[(c[(c[t>>2]|0)+152>>2]|0)+(w<<2)>>2]|0)+(z<<3)>>3]=+(c[(c[y>>2]|0)+(z<<2)>>2]|0);z=z+1|0;}while((z|0)<(m|0));w=w+1|0;}while((w|0)<(m|0))}eF(c[s>>2]|0);eF(s);Qr(k);}else if((e|0)==1){if((yr(b,m)|0)!=0){break}w=$w(l)|0;Fv(0,133960,(r=i,i=i+8|0,c[r>>2]=w,r)|0)|0;i=r;Fv(3,131976,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;Fv(3,129712,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;Fv(3,126424,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;Gu(b,m)}else{Gu(b,m);if((e|0)!=3){break}w=ux(b)|0;if((w|0)==0){break}t=b+8|0;z=w;do{w=mw(b,z)|0;if((w|0)!=0){y=w;do{w=c[y>>2]&3;p=(c[c[((w|0)==3?y:y+32|0)+28>>2]>>2]|0)>>>4;j=(c[c[((w|0)==2?y:y-32|0)+28>>2]>>2]|0)>>>4;if((p|0)!=(j|0)){x=+h[(c[y+8>>2]|0)+136>>3];h[(c[(c[(c[t>>2]|0)+152>>2]|0)+(j<<2)>>2]|0)+(p<<3)>>3]=x;h[(c[(c[(c[t>>2]|0)+152>>2]|0)+(p<<2)>>2]|0)+(j<<3)>>3]=x}y=ow(b,y)|0;}while((y|0)!=0)}z=vx(b,z)|0;}while((z|0)!=0)}}while(0);xu(b,m);yu(b,m);if((a[213992]|0)!=0){l=c[53660]|0;x=+h[21657];gc(c[o>>2]|0,123944,(r=i,i=i+24|0,c[r>>2]=e,c[r+8>>2]=l,h[r+16>>3]=x,r)|0)|0;i=r;ym()}zu(b,m);i=f;return}function At(a,b,d,e,f,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0;j=Mw(a)|0;k=Lk()|0;if((f|0)==2){l=0;m=0}else{f=Wv(a,2,121896,0)|0;l=(c[53750]|0)!=0|0;m=(f|0)!=0}f=(e&-2|0)==2;e=kk(b<<4)|0;n=e;o=kk(b<<2)|0;p=o;q=(j<<1)+b<<2;j=kk(q)|0;r=m|f;if(r){s=kk(q)|0}else{s=0}t=(l|0)!=0;if(t){u=kk(q)|0}else{u=0}q=ux(a)|0;a:do{if((q|0)==0){v=u;w=s;x=0}else{l=u;y=0;z=q;A=s;B=j;C=0;while(1){Mk(k);if((c[(c[z+8>>2]|0)+120>>2]|0)!=(y|0)){break}c[p+(y<<2)>>2]=z;D=B+4|0;E=n+(y<<4)+4|0;c[E>>2]=B;if(r){c[n+(y<<4)+8>>2]=A;F=A+4|0}else{c[n+(y<<4)+8>>2]=0;F=A}if(t){c[n+(y<<4)+12>>2]=l;G=l+4|0}else{c[n+(y<<4)+12>>2]=0;G=l}H=rw(a,z)|0;if((H|0)==0){I=G;J=1;K=F;L=D;M=C}else{N=n+(y<<4)+12|0;O=n+(y<<4)+8|0;P=G;Q=H;H=1;R=1;S=F;T=D;D=C;while(1){U=Q;V=c[U>>2]&3;W=Q-32|0;X=c[((V|0)==2?Q:W)+28>>2]|0;Y=Q+32|0;Z=c[((V|0)==3?Q:Y)+28>>2]|0;do{if((X|0)==(Z|0)){_=D;$=T;aa=S;ba=R;ca=H;da=P}else{V=c[(c[Z+8>>2]|0)+120>>2]|0;ea=c[(c[X+8>>2]|0)+120>>2]|0;fa=(V|0)>(ea|0);ga=Ok(k,fa?ea:V,fa?V:ea,R)|0;if((ga|0)!=(R|0)){if(t){ea=(c[N>>2]|0)+(ga<<2)|0;g[ea>>2]=+h[(c[Q+8>>2]|0)+128>>3]+ +g[ea>>2]}if(!m){_=D;$=T;aa=S;ba=R;ca=H;da=P;break}ea=(c[O>>2]|0)+(ga<<2)|0;ha=+h[(c[Q+8>>2]|0)+136>>3];ia=+(~~+g[ea>>2]|0);g[ea>>2]=ha>ia?ha:ia;_=D;$=T;aa=S;ba=R;ca=H;da=P;break}ea=c[U>>2]&3;ga=c[((ea|0)==3?Q:Y)+28>>2]|0;if((ga|0)==(z|0)){ja=c[((ea|0)==2?Q:W)+28>>2]|0}else{ja=ga}ga=D+1|0;ea=R+1|0;V=T+4|0;c[T>>2]=c[(c[ja+8>>2]|0)+120>>2];if(t){g[P>>2]=+h[(c[Q+8>>2]|0)+128>>3];ka=P+4|0}else{ka=P}do{if(m){g[S>>2]=+h[(c[Q+8>>2]|0)+136>>3];la=S+4|0}else{if(!f){la=S;break}g[S>>2]=1.0;la=S+4|0}}while(0);_=ga;$=V;aa=la;ba=ea;ca=H+1|0;da=ka}}while(0);W=sw(a,Q,z)|0;if((W|0)==0){I=da;J=ca;K=aa;L=$;M=_;break}else{P=da;Q=W;H=ca;R=ba;S=aa;T=$;D=_}}}c[n+(y<<4)>>2]=J;c[c[E>>2]>>2]=y;D=vx(a,z)|0;if((D|0)==0){v=I;w=K;x=M;break a}else{l=I;y=y+1|0;z=D;A=K;B=L;C=M}}cc(121096,120256,895,170408);return 0}}while(0);M=(x|0)/2|0;do{if((M|0)!=(Mw(a)|0)){x=(M<<1)+b<<2;L=mk(c[e+4>>2]|0,x)|0;if(m){ma=mk(c[e+8>>2]|0,x)|0}else{ma=w}if(t){na=mk(c[e+12>>2]|0,x)|0}else{na=v}if((b|0)<=0){break}if(m){if(t){x=na;K=0;I=ma;J=L;while(1){_=c[n+(K<<4)>>2]|0;c[n+(K<<4)+4>>2]=J;c[n+(K<<4)+8>>2]=I;c[n+(K<<4)+12>>2]=x;$=K+1|0;if(($|0)<(b|0)){x=x+(_<<2)|0;K=$;I=I+(_<<2)|0;J=J+(_<<2)|0}else{break}}}else{J=0;I=ma;K=L;while(1){x=c[n+(J<<4)>>2]|0;c[n+(J<<4)+4>>2]=K;c[n+(J<<4)+8>>2]=I;_=J+1|0;if((_|0)<(b|0)){J=_;I=I+(x<<2)|0;K=K+(x<<2)|0}else{break}}}}else{if(t){K=na;I=0;J=L;while(1){x=c[n+(I<<4)>>2]|0;c[n+(I<<4)+4>>2]=J;c[n+(I<<4)+12>>2]=K;_=I+1|0;if((_|0)<(b|0)){K=K+(x<<2)|0;I=_;J=J+(x<<2)|0}else{break}}}else{J=0;I=L;while(1){K=c[n+(J<<4)>>2]|0;c[n+(J<<4)+4>>2]=I;x=J+1|0;if((x|0)<(b|0)){J=x;I=I+(K<<2)|0}else{break}}}}}}while(0);c[d>>2]=M;if((i|0)==0){eF(o);Nk(k);return n|0}else{c[i>>2]=p;Nk(k);return n|0}return 0}function Bt(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,l=0;f=b+8|0;b=(c[f>>2]|0)+32|0;h[b>>3]=+h[b>>3]-d;b=(c[f>>2]|0)+40|0;h[b>>3]=+h[b>>3]-e;b=(c[f>>2]|0)+16|0;h[b>>3]=+h[b>>3]-d;b=(c[f>>2]|0)+24|0;h[b>>3]=+h[b>>3]-e;b=c[f>>2]|0;g=c[b+12>>2]|0;do{if((g|0)==0){i=b}else{if((a[g+81|0]|0)==0){i=b;break}j=g+56|0;h[j>>3]=+h[j>>3]-d;j=(c[(c[f>>2]|0)+12>>2]|0)+64|0;h[j>>3]=+h[j>>3]-e;i=c[f>>2]|0}}while(0);if((c[i+172>>2]|0)<1){return}else{k=1;l=i}while(1){Bt(c[(c[l+176>>2]|0)+(k<<2)>>2]|0,d,e);i=c[f>>2]|0;if((k|0)<(c[i+172>>2]|0)){k=k+1|0;l=i}else{break}}return}function Ct(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0;f=i;i=i+64|0;g=f|0;j=f+32|0;k=a|0;do{if((Za($w(k)|0,86848,7)|0)==0){l=g;m=g+8|0;n=g+24|0;o=ac(fw(k,e)|0,98144,(p=i,i=i+32|0,c[p>>2]=g,c[p+8>>2]=m,c[p+16>>2]=g+16,c[p+24>>2]=n,p)|0)|0;i=p;if((o|0)!=4){break}q=+h[m>>3];r=+h[n>>3];if(q>r){h[m>>3]=r;h[n>>3]=q}n=j;c[n>>2]=c[l>>2];c[n+4>>2]=c[l+4>>2];c[n+8>>2]=c[l+8>>2];c[n+12>>2]=c[l+12>>2];c[n+16>>2]=c[l+16>>2];c[n+20>>2]=c[l+20>>2];c[n+24>>2]=c[l+24>>2];c[n+28>>2]=c[l+28>>2];Wx(k,139536,272,1)|0;l=(c[a+8>>2]|0)+16|0;c[l>>2]=c[n>>2];c[l+4>>2]=c[n+4>>2];c[l+8>>2]=c[n+8>>2];c[l+12>>2]=c[n+12>>2];c[l+16>>2]=c[n+16>>2];c[l+20>>2]=c[n+20>>2];c[l+24>>2]=c[n+24>>2];c[l+28>>2]=c[n+28>>2];n=b+8|0;l=(c[n>>2]|0)+172|0;m=c[l>>2]|0;o=m+1|0;c[l>>2]=o;l=c[n>>2]|0;p=c[l+176>>2]|0;if((p|0)==0){s=jk((m<<2)+8|0)|0}else{s=lk(p,m+2|0,4,c[l+172>>2]|0)|0}c[(c[n>>2]|0)+176>>2]=s;c[(c[(c[n>>2]|0)+176>>2]|0)+(o<<2)>>2]=a;Rj(a);ut(a,d,e);i=f;return}}while(0);s=sy(a)|0;if((s|0)==0){i=f;return}else{t=s}do{Ct(t,b,d,e);t=ty(t)|0;}while((t|0)!=0);i=f;return}function Dt(a,d,e){a=a|0;d=d|0;e=e|0;var f=0;e=jk(64)|0;a=e+8|0;f=d+8|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];c[a+16>>2]=c[f+16>>2];c[a+20>>2]=c[f+20>>2];c[a+24>>2]=c[f+24>>2];c[a+28>>2]=c[f+28>>2];c[a+32>>2]=c[f+32>>2];c[a+36>>2]=c[f+36>>2];c[a+40>>2]=c[f+40>>2];c[a+44>>2]=c[f+44>>2];f=c[d+56>>2]|0;c[e+56>>2]=f;b[(c[f+8>>2]|0)+168>>1]=1;return e|0}function Et(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function Ft(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;a=c[d>>2]|0;if(e>>>0>a>>>0){f=1;return f|0}if(e>>>0<a>>>0){f=-1;return f|0}a=c[b+24>>2]|0;e=c[d+24>>2]|0;if(a>>>0>e>>>0){f=1;return f|0}if(a>>>0<e>>>0){f=-1;return f|0}e=~~(+h[b+8>>3]- +h[d+8>>3]);if((e|0)!=0){f=e;return f|0}e=~~(+h[b+16>>3]- +h[d+16>>3]);if((e|0)!=0){f=e;return f|0}e=~~(+h[b+32>>3]- +h[d+32>>3]);if((e|0)!=0){f=e;return f|0}f=~~(+h[b+40>>3]- +h[d+40>>3]);return f|0}function Gt(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0;g=i;i=i+8|0;h=e+8|0;j=b[(c[h>>2]|0)+168>>1]|0;k=j<<16>>16;if(!(j<<16>>16!=1&(a[215376]|0)==0)){l=g|0;c[l>>2]=e;m=+(f|0);im(d,l,0,1,m,m,11832);if((c[(c[h>>2]|0)+96>>2]|0)!=0){l=Hx(c[((c[e>>2]&3|0)==3?e:e+32|0)+28>>2]|0)|0;_m(l,c[(c[h>>2]|0)+96>>2]|0)}km(e);i=g;return}h=kk(k<<2)|0;l=h;n=j<<16>>16>0;do{if(n){j=0;o=e;while(1){c[l+(j<<2)>>2]=o;p=j+1|0;if((p|0)<(k|0)){j=p;o=c[(c[o+8>>2]|0)+172>>2]|0}else{break}}m=+(f|0);im(d,l,0,k,m,m,11832);if(n){q=0}else{break}do{o=c[l+(q<<2)>>2]|0;j=o+8|0;if((c[(c[j>>2]|0)+96>>2]|0)!=0){p=Hx(c[((c[o>>2]&3|0)==3?o:o+32|0)+28>>2]|0)|0;_m(p,c[(c[j>>2]|0)+96>>2]|0)}km(o);q=q+1|0;}while((q|0)<(k|0))}else{m=+(f|0);im(d,l,0,k,m,m,11832)}}while(0);eF(h);i=g;return}
+
+
+
+function Ht(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0;f=i;i=i+64|0;j=f|0;k=pl(b)|0;if((k|0)==4){l=b+8|0;m=jk(8)|0;n=m;c[m+4>>2]=4;o=jk(64)|0;p=m;c[p>>2]=o;m=c[l>>2]|0;q=+h[m+16>>3];r=+h[m+24>>3];s=-0.0- +h[m+88>>3];if((a[d+8|0]|0)==0){t=d|0;u=d+4|0;v=r- +h[m+80>>3]*+g[u>>2];h[o>>3]=q+ +g[t>>2]*s;h[o+8>>3]=v;w=c[p>>2]|0;x=c[l>>2]|0;v=r+ +h[x+80>>3]*+g[u>>2];h[w+16>>3]=q- +h[x+88>>3]*+g[t>>2];h[w+24>>3]=v;w=c[p>>2]|0;x=c[l>>2]|0;v=r+ +h[x+80>>3]*+g[u>>2];h[w+32>>3]=q+ +h[x+96>>3]*+g[t>>2];h[w+40>>3]=v;w=c[p>>2]|0;x=c[l>>2]|0;v=r- +h[x+80>>3]*+g[u>>2];h[w+48>>3]=q+ +h[x+96>>3]*+g[t>>2];h[w+56>>3]=v;y=n;i=f;return y|0}else{w=d|0;t=d+4|0;v=r+(-0.0- +h[m+80>>3]- +g[t>>2]);h[o>>3]=q+(s- +g[w>>2]);h[o+8>>3]=v;o=c[p>>2]|0;m=c[l>>2]|0;v=r+(+h[m+80>>3]+ +g[t>>2]);h[o+16>>3]=q+(-0.0- +h[m+88>>3]- +g[w>>2]);h[o+24>>3]=v;o=c[p>>2]|0;m=c[l>>2]|0;v=r+(+h[m+80>>3]+ +g[t>>2]);h[o+32>>3]=q+(+h[m+96>>3]+ +g[w>>2]);h[o+40>>3]=v;o=c[p>>2]|0;p=c[l>>2]|0;v=r+(-0.0- +h[p+80>>3]- +g[t>>2]);h[o+48>>3]=q+(+h[p+96>>3]+ +g[w>>2]);h[o+56>>3]=v;y=n;i=f;return y|0}}else if((k|0)==2){n=b+8|0;o=c[(c[n>>2]|0)+12>>2]|0;v=+h[o+16>>3];q=+h[o+24>>3];r=+h[o+32>>3];s=+h[o+40>>3];o=jk(8)|0;w=o;c[o+4>>2]=4;p=jk(64)|0;t=o;c[t>>2]=p;o=c[n>>2]|0;z=+h[o+16>>3];A=+h[o+24>>3];o=d|0;B=+g[o>>2];if((a[d+8|0]|0)==0){n=d+4|0;C=A+q*+g[n>>2];h[p>>3]=z+v*B;h[p+8>>3]=C;l=c[t>>2]|0;C=A+s*+g[n>>2];h[l+16>>3]=z+v*+g[o>>2];h[l+24>>3]=C;l=c[t>>2]|0;C=A+s*+g[n>>2];h[l+32>>3]=z+r*+g[o>>2];h[l+40>>3]=C;l=c[t>>2]|0;C=A+q*+g[n>>2];h[l+48>>3]=z+r*+g[o>>2];h[l+56>>3]=C;y=w;i=f;return y|0}else{l=d+4|0;C=A+(q- +g[l>>2]);h[p>>3]=z+(v-B);h[p+8>>3]=C;p=c[t>>2]|0;C=A+(s+ +g[l>>2]);h[p+16>>3]=z+(v- +g[o>>2]);h[p+24>>3]=C;p=c[t>>2]|0;C=A+(s+ +g[l>>2]);h[p+32>>3]=z+(r+ +g[o>>2]);h[p+40>>3]=C;p=c[t>>2]|0;C=A+(q- +g[l>>2]);h[p+48>>3]=z+(r+ +g[o>>2]);h[p+56>>3]=C;y=w;i=f;return y|0}}else if((k|0)==1|(k|0)==3){k=jk(8)|0;w=k;p=b+8|0;b=c[p>>2]|0;o=c[b+12>>2]|0;do{if(e<<24>>24==0){l=c[o+8>>2]|0;if((l|0)>2){D=0.0;E=+g[d>>2];F=+g[d+4>>2];G=l;H=c[o+44>>2]|0;I=1;break}else{D=+wn()*.01;E=0.0;F=0.0;G=8;H=0;I=0;break}}else{C=+h[b+88>>3];r=-0.0-C;z=+h[b+80>>3];q=z*-.5;h[j>>3]=r;h[j+8>>3]=q;h[j+16>>3]=C;h[j+24>>3]=q;q=z*.5;h[j+32>>3]=C;h[j+40>>3]=q;h[j+48>>3]=r;h[j+56>>3]=q;D=0.0;E=0.0;F=0.0;G=4;H=j|0;I=1}}while(0);c[k+4>>2]=G;j=k;c[j>>2]=jk(G<<4)|0;if((G|0)<=0){y=w;i=f;return y|0}q=+(G|0);k=d+8|0;b=d|0;o=d+4|0;d=(G|0)==4;r=-0.0-E;C=-0.0-F;if((I|0)==0){I=0;while(1){z=D+ +(I|0)*6.283185307179586/q;A=+V(z);s=+W(z);if((a[k]|0)==0){e=c[p>>2]|0;J=A*+g[b>>2]*(+h[e+88>>3]+ +h[e+96>>3]);K=+h[e+80>>3]*s*+g[o>>2]}else{e=c[p>>2]|0;J=A*(+h[e+88>>3]+ +h[e+96>>3]+ +g[b>>2]);K=s*(+h[e+80>>3]+ +g[o>>2])}e=G-I-1|0;h[(c[j>>2]|0)+(e<<4)>>3]=J*.5+ +h[(c[p>>2]|0)+16>>3];h[(c[j>>2]|0)+(e<<4)+8>>3]=K*.5+ +h[(c[p>>2]|0)+24>>3];e=I+1|0;if((e|0)<(G|0)){I=e}else{y=w;break}}i=f;return y|0}else{L=0}while(1){do{if((a[k]|0)==0){M=F*+h[H+(L<<4)+8>>3];N=E*+h[H+(L<<4)>>3]}else{if(!d){K=+h[H+(L<<4)>>3];J=+h[H+(L<<4)+8>>3];q=+T(K*K+J*J);M=J*(F/q+1.0);N=K*(E/q+1.0);break}if((L|0)==2){O=C;P=r}else if((L|0)==1){O=F;P=r}else if((L|0)==3){O=C;P=E}else if((L|0)==0){O=F;P=E}else{O=0.0;P=0.0}M=O+ +h[H+(L<<4)+8>>3];N=P+ +h[H+(L<<4)>>3]}}while(0);I=G-L-1|0;h[(c[j>>2]|0)+(I<<4)>>3]=N+ +h[(c[p>>2]|0)+16>>3];h[(c[j>>2]|0)+(I<<4)+8>>3]=M+ +h[(c[p>>2]|0)+24>>3];I=L+1|0;if((I|0)<(G|0)){L=I}else{y=w;break}}i=f;return y|0}else{y=0;i=f;return y|0}return 0}function It(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;g=i;i=i+8|0;f=g|0;j=f;k=i;i=i+16|0;l=i;i=i+16|0;m=c[b>>2]&3;n=(c[((m|0)==3?b:b+32|0)+28>>2]|0)+8|0;o=c[n>>2]|0;p=c[b+8>>2]|0;q=+h[o+24>>3]+ +h[p+24>>3];h[k>>3]=+h[o+16>>3]+ +h[p+16>>3];h[k+8>>3]=q;o=(c[((m|0)==2?b:b-32|0)+28>>2]|0)+8|0;b=c[o>>2]|0;q=+h[b+24>>3]+ +h[p+64>>3];h[l>>3]=+h[b+16>>3]+ +h[p+56>>3];h[l+8>>3]=q;if((e|0)==0){r=-1111;s=-1111;t=KB(d,k,s,l,r,j)|0;u=a;v=f|0;w=c[v>>2]|0;x=f+4|0;y=c[x>>2]|0;z=u|0;c[z>>2]=w;A=u+4|0;c[A>>2]=y;i=g;return}r=c[(c[o>>2]|0)+284>>2]|0;s=c[(c[n>>2]|0)+284>>2]|0;t=KB(d,k,s,l,r,j)|0;u=a;v=f|0;w=c[v>>2]|0;x=f+4|0;y=c[x>>2]|0;z=u|0;c[z>>2]=w;A=u+4|0;c[A>>2]=y;i=g;return}function Jt(a,b,e,f,g){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;h=i;i=i+8|0;j=h|0;k=j;l=i;i=i+8|0;m=i;i=i+32|0;n=i;i=i+16|0;p=i;i=i+16|0;q=(c[b+8>>2]|0)+144|0;r=c[q>>2]|0;s=c[q+4>>2]|0;c[j>>2]=r;c[j+4>>2]=s;j=r;r=n;q=j;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];q=p;r=j+(s-1<<4)|0;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];do{if(g<<24>>24==0){t=-1111;u=-1111;v=8}else{if((f|0)>0){w=0;x=-1111;y=-1111}else{v=9;break}while(1){if((x|0)==-1111){r=(LB(c[e+(w<<2)>>2]|0,n)|0)==0;z=r?-1111:w}else{z=x}if((y|0)==-1111){r=(LB(c[e+(w<<2)>>2]|0,p)|0)==0;A=r?-1111:w}else{A=y}r=w+1|0;if((r|0)<(f|0)){w=r;x=z;y=A}else{t=A;u=z;v=8;break}}}}while(0);do{if((v|0)==8){if((f|0)>0){B=0;C=0}else{v=9;break}while(1){if((C|0)==(u|0)|(C|0)==(t|0)){D=B}else{D=(c[(c[e+(C<<2)>>2]|0)+4>>2]|0)+B|0}z=C+1|0;if((z|0)<(f|0)){B=D;C=z}else{break}}z=kk(D<<5)|0;A=0;y=0;while(1){do{if((y|0)==(u|0)|(y|0)==(t|0)){E=A}else{x=e+(y<<2)|0;w=c[x>>2]|0;g=c[w+4>>2]|0;if((g|0)>0){F=0;G=A;H=w;I=g}else{E=A;break}while(1){g=F+1|0;w=z+(G<<5)|0;r=(c[H>>2]|0)+(F<<4)|0;c[w>>2]=c[r>>2];c[w+4>>2]=c[r+4>>2];c[w+8>>2]=c[r+8>>2];c[w+12>>2]=c[r+12>>2];r=z+(G<<5)+16|0;w=(c[c[x>>2]>>2]|0)+(((g|0)<(I|0)?g:0)<<4)|0;c[r>>2]=c[w>>2];c[r+4>>2]=c[w+4>>2];c[r+8>>2]=c[w+8>>2];c[r+12>>2]=c[w+12>>2];w=G+1|0;r=c[x>>2]|0;q=c[r+4>>2]|0;if((g|0)<(q|0)){F=g;G=w;H=r;I=q}else{E=w;break}}}}while(0);x=y+1|0;if((x|0)<(f|0)){A=E;y=x}else{break}}if((E|0)==(D|0)){J=z;K=D;break}cc(151464,108624,79,170376)}}while(0);if((v|0)==9){J=kk(0)|0;K=0}vF(m|0,0,32)|0;if((MB(J,K,k,m|0,l)|0)<0){m=b;k=$w(c[((c[m>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;K=$w(c[((c[m>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;Fv(1,127880,(L=i,i=i+16|0,c[L>>2]=k,c[L+8>>2]=K,L)|0)|0;i=L;i=h;return}if((d[213992]|0)>>>0>1>>>0){K=c[o>>2]|0;k=b;m=$w(c[((c[k>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;v=b-32|0;D=$w(c[((c[k>>2]&3|0)==2?b:v)+28>>2]|0)|0;gc(K|0,159536,(L=i,i=i+16|0,c[L>>2]=m,c[L+8>>2]=D,L)|0)|0;i=L;M=k;N=v}else{M=b;N=b-32|0}cm(b,c[((c[M>>2]&3|0)==2?b:N)+28>>2]|0,c[l>>2]|0,c[l+4>>2]|0,11832);eF(J);nm(a,b,n,p);i=h;return}function Kt(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0;f=i;i=i+96|0;g=f|0;j=f+64|0;k=f+80|0;pr(k,a);l=j;m=k;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];m=ux(a)|0;if((m|0)!=0){l=m;do{m=mw(a,l)|0;if((m|0)!=0){k=m;do{yl(k);k=ow(a,k)|0;}while((k|0)!=0)}l=vx(a,l)|0;}while((l|0)!=0)}l=$g(28664,c[43330]|0)|0;k=ux(a)|0;if((k|0)!=0){m=g;n=g+8|0;o=g+16|0;p=g+24|0;q=g+32|0;r=g+40|0;s=g+48|0;t=g+56|0;g=l|0;u=k;do{k=mw(a,u)|0;if((k|0)!=0){v=k;do{k=c[v>>2]&3;w=c[((k|0)==3?v:v+32|0)+28>>2]|0;x=c[((k|0)==2?v:v-32|0)+28>>2]|0;do{if(w>>>0<x>>>0){k=c[v+8>>2]|0;y=+h[k+24>>3];z=+h[k+16>>3];A=+h[k+64>>3];B=+h[k+56>>3];C=x;D=w}else{k=c[v+8>>2]|0;if(w>>>0>x>>>0){y=+h[k+64>>3];z=+h[k+56>>3];A=+h[k+24>>3];B=+h[k+16>>3];C=w;D=x;break}E=+h[k+56>>3];F=+h[k+64>>3];G=+h[k+16>>3];H=+h[k+24>>3];if(G<E){y=H;z=G;A=F;B=E;C=w;D=w;break}if(G>E){y=F;z=E;A=H;B=G;C=w;D=w;break}if(H<F){y=H;z=G;A=F;B=E;C=w;D=w;break}k=H>F;y=k?F:H;z=k?E:G;A=H;B=G;C=w;D=w}}while(0);c[n>>2]=D;h[o>>3]=z;h[p>>3]=y;c[q>>2]=C;h[r>>3]=B;h[s>>3]=A;c[t>>2]=v;w=c[(Hc[c[g>>2]&63](l,m,1)|0)+56>>2]|0;if((w|0)!=(v|0)){x=w+8|0;w=(c[x>>2]|0)+168|0;b[w>>1]=(b[w>>1]|0)+1;c[(c[v+8>>2]|0)+172>>2]=c[(c[x>>2]|0)+172>>2];c[(c[x>>2]|0)+172>>2]=v}v=ow(a,v)|0;}while((v|0)!=0)}u=vx(a,u)|0;}while((u|0)!=0)}Vg(l)|0;if((Hc[d&63](a,j,e)|0)!=0){I=1;i=f;return I|0}c[53522]=1;I=0;i=f;return I|0}function Lt(a,b){a=a|0;b=b|0;return Kt(a,4,b)|0}function Mt(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0;k=i;i=i+120|0;l=k|0;m=k+8|0;n=k+16|0;p=k+32|0;q=k+48|0;r=k+56|0;s=k+72|0;t=k+88|0;u=k+104|0;v=(c[53566]|0)>1;do{if((j|0)>5){w=jk((Lw(e)|0)<<2)|0;x=w;y=ux(e)|0;if((y|0)==0){z=0}else{A=(j|0)==8|0;B=0;C=y;while(1){y=Ht(C,f,A)|0;D=(c[C+8>>2]|0)+284|0;if((y|0)==0){c[D>>2]=-1111;E=B}else{c[D>>2]=B;c[x+(B<<2)>>2]=y;E=B+1|0}y=vx(e,C)|0;if((y|0)==0){z=E;break}else{B=E;C=y}}}if((w|0)==0){F=0;G=0;H=z;I=0;J=0;break}C=Hs(x,z)|0;B=(j|0)==8;if((C|0)!=0){if(B){F=C;G=0;H=z;I=x;J=1;break}F=C;G=IB(x,z)|0;H=z;I=x;J=1;break}if(B){Fv(0,97328,(K=i,i=i+1|0,i=i+7&-8,c[K>>2]=0,K)|0)|0;i=K;F=0;G=0;H=z;I=x;J=1;break}else{L=+g[f+4>>2];Fv(0,91824,(K=i,i=i+16|0,h[K>>3]=+g[f>>2],h[K+8>>3]=L,K)|0)|0;i=K;F=0;G=0;H=z;I=x;J=1;break}}else{F=0;G=0;H=0;I=0;J=0}}while(0);if((a[213992]|0)!=0){z=c[o>>2]|0;do{if((F|0)!=0&(j|0)==8){M=81792}else{if((G|0)==0){M=159792;break}M=(j|0)==10?168024:163872}}while(0);gc(z|0,86592,(K=i,i=i+8|0,c[K>>2]=M,K)|0)|0;i=K}M=(G|0)!=0;do{if(M){z=ux(e)|0;if((z|0)==0){break}F=q;f=r|0;E=r+8|0;B=s|0;C=s+8|0;A=z;do{z=mw(e,A)|0;if((z|0)!=0){y=z;do{z=c[y+8>>2]|0;D=c[y>>2]&3;N=(c[((D|0)==3?y:y+32|0)+28>>2]|0)+8|0;O=c[N>>2]|0;L=+h[O+24>>3]+ +h[z+24>>3];h[f>>3]=+h[O+16>>3]+ +h[z+16>>3];h[E>>3]=L;O=(c[((D|0)==2?y:y-32|0)+28>>2]|0)+8|0;D=c[O>>2]|0;L=+h[D+24>>3]+ +h[z+64>>3];h[B>>3]=+h[D+16>>3]+ +h[z+56>>3];h[C>>3]=L;KB(G,r,c[(c[N>>2]|0)+284>>2]|0,s,c[(c[O>>2]|0)+284>>2]|0,F)|0;O=c[q+4>>2]|0;N=z+144|0;c[N>>2]=c[q>>2];c[N+4>>2]=O;y=ow(e,y)|0;}while((y|0)!=0)}A=vx(e,A)|0;}while((A|0)!=0)}}while(0);q=ux(e)|0;if((q|0)==0){P=0}else{s=t|0;r=t+8|0;A=u|0;F=u+8|0;C=e+48|0;B=(j|0)==10;E=n;f=p;x=m;w=c[o>>2]|0;y=l|0;O=l+4|0;N=0;z=q;while(1){q=mw(e,z)|0;if((q|0)==0){Q=N}else{D=z+8|0;R=N;S=q;while(1){q=c[((c[S>>2]&3|0)==2?S:S-32|0)+28>>2]|0;T=S+8|0;U=c[T>>2]|0;do{if(v){if((c[U+8>>2]|0)==0){V=33;break}W=c[D>>2]|0;L=+h[W+24>>3]+ +h[U+24>>3];h[s>>3]=+h[W+16>>3]+ +h[U+16>>3];h[r>>3]=L;W=c[q+8>>2]|0;X=c[T>>2]|0;L=+h[W+24>>3]+ +h[X+64>>3];h[A>>3]=+h[W+16>>3]+ +h[X+56>>3];h[F>>3]=L;nm(e,S,t,u);Y=R}else{V=33}}while(0);do{if((V|0)==33){V=0;T=b[U+168>>1]|0;X=T<<16>>16;if(T<<16>>16==0){Y=R;break}if((z|0)==(q|0)){if((R|0)==0){T=jk(96)|0;c[T+84>>2]=jk(((Lw(e)|0)<<5)+11520|0)|0;Z=T}else{Z=R}Gt(Z,S,c[(c[(c[C>>2]|0)+8>>2]|0)+236>>2]|0);Y=Z;break}if(!M){ll(e,S,j,11832);Y=R;break}T=(a[215376]|0)!=0?1:X;if((T|0)>0){_=0;$=S}else{Y=R;break}while(1){if(B){Jt(e,$,I,H,1);aa=$+8|0}else{X=$+8|0;W=(c[X>>2]|0)+144|0;ba=c[W>>2]|0;ca=c[W+4>>2]|0;c[m>>2]=ba;c[m+4>>2]=ca;W=ba;ba=W;c[E>>2]=c[ba>>2];c[E+4>>2]=c[ba+4>>2];c[E+8>>2]=c[ba+8>>2];c[E+12>>2]=c[ba+12>>2];ba=W+(ca-1<<4)|0;c[f>>2]=c[ba>>2];c[f+4>>2]=c[ba+4>>2];c[f+8>>2]=c[ba+8>>2];c[f+12>>2]=c[ba+12>>2];ZB(x,l);ba=$;if((d[213992]|0)>>>0>1>>>0){ca=$w(c[((c[ba>>2]&3|0)==3?$:$+32|0)+28>>2]|0)|0;W=$-32|0;da=$w(c[((c[ba>>2]&3|0)==2?$:W)+28>>2]|0)|0;gc(w|0,154792,(K=i,i=i+16|0,c[K>>2]=ca,c[K+8>>2]=da,K)|0)|0;i=K;ea=W}else{ea=$-32|0}cm($,c[((c[ba>>2]&3|0)==2?$:ea)+28>>2]|0,c[y>>2]|0,c[O>>2]|0,11832);nm(e,$,n,p);aa=X}X=_+1|0;if((X|0)<(T|0)){_=X;$=c[(c[aa>>2]|0)+172>>2]|0}else{Y=R;break}}}}while(0);q=ow(e,S)|0;if((q|0)==0){Q=Y;break}else{R=Y;S=q}}}S=vx(e,z)|0;if((S|0)==0){P=Q;break}else{N=Q;z=S}}}if(M){JB(G)}if((P|0)!=0){eF(c[P+84>>2]|0);eF(P)}if(!J){i=k;return 0}if((H|0)>0){J=0;do{eF(c[I+(J<<2)>>2]|0);J=J+1|0;}while((J|0)<(H|0))}eF(I);i=k;return 0}function Nt(a){a=a|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b[(c[a+8>>2]|0)+128>>1]&14;Ot(a);if((e|0)==8){Fv(0,129344,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;f=a+48|0;g=(c[(c[f>>2]|0)+8>>2]|0)+128|0;b[g>>1]=b[g>>1]&-9;g=(c[(c[f>>2]|0)+8>>2]|0)+128|0;b[g>>1]=b[g>>1]|6;h=6}else if((e|0)==0){i=d;return}else{h=e}Kt(a,4,h)|0;i=d;return}function Ot(b){b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;a:do{if((c[b+48>>2]|0)==(b|0)){d=b+8|0;e=c[d>>2]|0;f=c[e+8>>2]|0;g=c[f+84>>2]|0;if((g|0)==0){break}i=+h[e+16>>3];if(i<0.0){j=i+-.5}else{j=i+.5}if((~~j|0)!=0){cc(115816,108624,893,171072)}i=+h[e+24>>3];if(i<0.0){k=i+-.5}else{k=i+.5}if((~~k|0)!=0){cc(102968,108624,894,171072)}if((c[e+116>>2]&1|0)==0){l=e;m=f;n=g}else{g=e+32|0;i=+h[g>>3];h[g>>3]=+h[e+40>>3];h[(c[d>>2]|0)+40>>3]=i;e=c[d>>2]|0;d=c[e+8>>2]|0;l=e;m=d;n=c[d+84>>2]|0}do{if((n|0)==2){i=+h[m+64>>3];if(i<=0.0){break a}o=i/+h[l+32>>3];i=+h[m+72>>3]/+h[l+40>>3];if(!(o<1.0|i<1.0)){p=o;q=i;break}if(o<i){p=1.0;q=i/o;break}else{p=o/i;q=1.0;break}}else if((n|0)==1){i=+h[m+16>>3];o=+h[l+40>>3]/+h[l+32>>3];if(o<i){p=1.0;q=i/o;break}else{p=o/i;q=1.0;break}}else if((n|0)==5){i=+h[m+64>>3];if(i<=0.0){break a}o=i/+h[l+32>>3];i=+h[m+72>>3]/+h[l+40>>3];if(!(o>1.0&i>1.0)){break a}r=o<i?o:i;p=r;q=r}else{break a}}while(0);d=(c[l+116>>2]&1|0)==0;r=d?q:p;i=d?p:q;do{if((c[53566]|0)>1){d=ux(b)|0;if((d|0)==0){break}o=i+-1.0;s=r+-1.0;e=d;do{d=mw(b,e)|0;if((d|0)!=0){g=d;do{d=g+8|0;f=c[d>>2]|0;t=c[f+8>>2]|0;do{if((t|0)!=0){u=c[g>>2]&3;v=c[(c[(c[((u|0)==2?g:g-32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;w=o*+h[v>>3]*72.0;x=s*+h[v+8>>3]*72.0;v=c[(c[(c[((u|0)==3?g:g+32|0)+28>>2]|0)+8>>2]|0)+132>>2]|0;y=o*+h[v>>3]*72.0;z=s*+h[v+8>>3]*72.0;if((c[t+4>>2]|0)>0){v=c[t>>2]|0;u=0;while(1){A=v+4|0;B=c[A>>2]|0;if((B|0)>0){C=c[v>>2]|0;D=0;E=B;while(1){b:do{if((D|u|0)==0){B=C|0;h[B>>3]=y+ +h[B>>3];B=C+8|0;h[B>>3]=z+ +h[B>>3]}else{do{if((u|0)==((c[(c[(c[d>>2]|0)+8>>2]|0)+4>>2]|0)-1|0)){if((D|0)!=(E-1|0)){break}B=C|0;h[B>>3]=w+ +h[B>>3];B=C+8|0;h[B>>3]=x+ +h[B>>3];break b}}while(0);B=C|0;h[B>>3]=i*+h[B>>3];B=C+8|0;h[B>>3]=r*+h[B>>3]}}while(0);B=D+1|0;F=c[A>>2]|0;if((B|0)<(F|0)){C=C+16|0;D=B;E=F}else{break}}}if((c[v+8>>2]|0)!=0){E=v+16|0;h[E>>3]=y+ +h[E>>3];E=v+24|0;h[E>>3]=z+ +h[E>>3]}if((c[v+12>>2]|0)!=0){E=v+32|0;h[E>>3]=w+ +h[E>>3];E=v+40|0;h[E>>3]=x+ +h[E>>3]}E=u+1|0;D=c[d>>2]|0;if((E|0)<(c[(c[D+8>>2]|0)+4>>2]|0)){v=v+48|0;u=E}else{G=D;break}}}else{G=f}u=c[G+96>>2]|0;do{if((u|0)==0){H=G}else{if((a[u+81|0]|0)==0){H=G;break}v=u+56|0;h[v>>3]=i*+h[v>>3];v=(c[(c[d>>2]|0)+96>>2]|0)+64|0;h[v>>3]=r*+h[v>>3];H=c[d>>2]|0}}while(0);u=c[H+100>>2]|0;do{if((u|0)==0){I=H}else{if((a[u+81|0]|0)==0){I=H;break}v=u+56|0;h[v>>3]=w+ +h[v>>3];v=(c[(c[d>>2]|0)+100>>2]|0)+64|0;h[v>>3]=x+ +h[v>>3];I=c[d>>2]|0}}while(0);u=c[I+104>>2]|0;if((u|0)==0){break}if((a[u+81|0]|0)==0){break}v=u+56|0;h[v>>3]=y+ +h[v>>3];v=(c[(c[d>>2]|0)+104>>2]|0)+64|0;h[v>>3]=z+ +h[v>>3]}}while(0);g=ow(b,g)|0;}while((g|0)!=0)}e=vx(b,e)|0;}while((e|0)!=0)}}while(0);e=ux(b)|0;if((e|0)!=0){g=e;do{e=g+8|0;d=c[(c[e>>2]|0)+132>>2]|0;h[d>>3]=i*+h[d>>3];d=(c[(c[e>>2]|0)+132>>2]|0)+8|0;h[d>>3]=r*+h[d>>3];g=vx(b,g)|0;}while((g|0)!=0)}Rt(b,i,r)}}while(0);I=ux(b)|0;if((I|0)==0){return}else{J=I}do{I=J+8|0;H=c[I>>2]|0;h[H+16>>3]=+h[c[H+132>>2]>>3]*72.0;H=c[I>>2]|0;h[H+24>>3]=+h[(c[H+132>>2]|0)+8>>3]*72.0;J=vx(b,J)|0;}while((J|0)!=0);return}function Pt(a){a=a|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0,l=0,m=0;d=i;$m(a);e=a+8|0;f=c[e>>2]|0;g=+h[f+16>>3]/72.0;j=+h[f+24>>3]/72.0;f=ux(a)|0;if((f|0)!=0){k=f;do{f=k+8|0;l=c[(c[f>>2]|0)+132>>2]|0;h[l>>3]=+h[l>>3]-g;l=(c[(c[f>>2]|0)+132>>2]|0)+8|0;h[l>>3]=+h[l>>3]-j;k=vx(a,k)|0;}while((k|0)!=0)}k=c[e>>2]|0;Qt(a,+h[k+16>>3],+h[k+24>>3]);k=b[(c[e>>2]|0)+128>>1]&14;Ot(a);if((k|0)==0){i=d;return}else if((k|0)==8){Fv(0,129344,(e=i,i=i+1|0,i=i+7&-8,c[e>>2]=0,e)|0)|0;i=e;e=a+48|0;l=(c[(c[e>>2]|0)+8>>2]|0)+128|0;b[l>>1]=b[l>>1]&-9;l=(c[(c[e>>2]|0)+8>>2]|0)+128|0;b[l>>1]=b[l>>1]|6;m=6}else{m=k}Kt(a,4,m)|0;i=d;return}function Qt(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0,i=0;e=a+8|0;a=c[e>>2]|0;if((c[a+172>>2]|0)<1){f=a}else{g=1;i=a;while(1){Qt(c[(c[i+176>>2]|0)+(g<<2)>>2]|0,b,d);a=c[e>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;i=a}else{f=a;break}}}i=f+32|0;h[i>>3]=+h[i>>3]-b;i=(c[e>>2]|0)+40|0;h[i>>3]=+h[i>>3]-d;i=(c[e>>2]|0)+16|0;h[i>>3]=+h[i>>3]-b;i=(c[e>>2]|0)+24|0;h[i>>3]=+h[i>>3]-d;return}function Rt(b,d,e){b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0,k=0,l=0;f=b+8|0;b=(c[f>>2]|0)+32|0;h[b>>3]=+h[b>>3]*d;b=(c[f>>2]|0)+40|0;h[b>>3]=+h[b>>3]*e;b=(c[f>>2]|0)+16|0;h[b>>3]=+h[b>>3]*d;b=(c[f>>2]|0)+24|0;h[b>>3]=+h[b>>3]*e;b=c[f>>2]|0;g=c[b+12>>2]|0;do{if((g|0)==0){i=b}else{if((a[g+81|0]|0)==0){i=b;break}j=g+56|0;h[j>>3]=+h[j>>3]*d;j=(c[(c[f>>2]|0)+12>>2]|0)+64|0;h[j>>3]=+h[j>>3]*e;i=c[f>>2]|0}}while(0);if((c[i+172>>2]|0)<1){return}else{k=1;l=i}while(1){Rt(c[(c[l+176>>2]|0)+(k<<2)>>2]|0,d,e);i=c[f>>2]|0;if((k|0)<(c[i+172>>2]|0)){k=k+1|0;l=i}else{break}}return}function St(a){a=a|0;return 0}function Tt(a){a=a|0;return 0}function Ut(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0.0,A=0,B=0.0,C=0,D=0,E=0;g=kk(f<<2)|0;i=g;j=(f|0)>0;k=b<<3;if(j){l=0;do{c[i+(l<<2)>>2]=kk(k)|0;l=l+1|0;}while((l|0)<(f|0))}l=kk(f<<3)|0;m=l;n=kk(b<<2)|0;o=n;p=kk(da(k,b)|0)|0;k=(b|0)>0;do{if(k){q=0;r=p;while(1){c[o+(q<<2)>>2]=r;s=q+1|0;if((s|0)<(b|0)){q=s;r=r+(b<<3)|0}else{break}}if(!k){break}r=(d|0)>0;q=0;do{s=o+(q<<2)|0;t=a+(q<<2)|0;u=0;while(1){if(r){v=c[t>>2]|0;w=c[a+(u<<2)>>2]|0;x=0.0;y=0;while(1){z=x+ +(da(c[w+(y<<2)>>2]|0,c[v+(y<<2)>>2]|0)|0);A=y+1|0;if((A|0)<(d|0)){x=z;y=A}else{B=z;break}}}else{B=0.0}h[(c[o+(u<<2)>>2]|0)+(q<<3)>>3]=B;h[(c[s>>2]|0)+(u<<3)>>3]=B;if((u|0)<(q|0)){u=u+1|0}else{break}}q=q+1|0;}while((q|0)<(b|0))}}while(0);Ns(o,b,f,i,m,1)|0;if(!j){eF(g);eF(l);C=c[o>>2]|0;D=C;eF(D);eF(n);return}do{if((d|0)>0){m=0;do{p=e+(m<<2)|0;q=i+(m<<2)|0;if(k){r=0;do{u=c[q>>2]|0;B=0.0;s=0;do{B=B+ +(c[(c[a+(s<<2)>>2]|0)+(r<<2)>>2]|0)*+h[u+(s<<3)>>3];s=s+1|0;}while((s|0)<(b|0));h[(c[p>>2]|0)+(r<<3)>>3]=B;r=r+1|0;}while((r|0)<(d|0))}else{r=0;do{h[(c[p>>2]|0)+(r<<3)>>3]=0.0;r=r+1|0;}while((r|0)<(d|0))}m=m+1|0;}while((m|0)<(f|0));if(j){E=0;break}eF(g);eF(l);C=c[o>>2]|0;D=C;eF(D);eF(n);return}else{E=0}}while(0);do{eF(c[i+(E<<2)>>2]|0);E=E+1|0;}while((E|0)<(f|0));eF(g);eF(l);C=c[o>>2]|0;D=C;eF(D);eF(n);return}function Vt(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+40|0;g=f|0;h=f+8|0;j=f+16|0;k=f+24|0;c[g>>2]=e;c[j>>2]=0;c[k>>2]=0;zr(c[a>>2]|0,d,d<<2,h);Rs(c[h>>2]|0,a,d,b,j);Qs(a,c[j>>2]|0,b,d,b,k);eF(c[c[j>>2]>>2]|0);eF(c[j>>2]|0);j=(Ns(c[k>>2]|0,b,1,g,f+32|0,1)|0)&255;i=f;return j|0}function Wt(){c[44372]=0;eF(c[43678]|0);eF(c[43676]|0);eF(c[43674]|0);c[43678]=0;c[43676]=0;c[43674]=0;return}function Xt(a){a=a|0;eF(c[a+36>>2]|0);return}function Yt(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0;g=i;j=d+8|0;k=c[j>>2]|0;a:do{if((c[k+212>>2]|0)==0){l=pl(d)|0;if((l|0)==1){m=c[j>>2]|0;n=c[m+12>>2]|0;o=c[n+8>>2]|0;p=c[c[m+8>>2]>>2]|0;m=a[p]|0;do{if((m<<24>>24|0)==112){if((Ya(p|0,158472)|0)!=0){q=18;break}r=c[n+44>>2]|0;if((o|0)!=4){q=18;break}s=+h[r+8>>3];t=r+16|0;u=+h[r+24>>3];if(s==u){if(+h[r+40>>3]!=+h[r+56>>3]){q=18;break}if(+h[r>>3]!=+h[r+48>>3]){q=18;break}if(+h[t>>3]!=+h[r+32>>3]){q=18;break}}else{if(+h[r>>3]!=+h[t>>3]){q=21;break}if(+h[r+32>>3]!=+h[r+48>>3]){q=18;break}if(s!=+h[r+56>>3]){q=18;break}if(u!=+h[r+40>>3]){q=18;break}}c[b+40>>2]=1;q=22}else if((m<<24>>24|0)==98){if((Ya(p|0,121888)|0)!=0){q=18;break}c[b+40>>2]=1;q=22}else{q=18}}while(0);do{if((q|0)==18){if((o|0)>=3){q=21;break}if((c[n>>2]|0)==0){q=21;break}c[b+40>>2]=2}}while(0);if((q|0)==21){c[b+40>>2]=0;q=22}do{if((q|0)==22){if((o|0)<=2){break}p=kk(o<<4)|0;m=p;if((c[b+40>>2]|0)==1){r=n+44|0;u=e;h[p>>3]=u+ +h[c[r>>2]>>3]/72.0;s=f;h[p+8>>3]=s+ +h[(c[r>>2]|0)+8>>3]/72.0;h[p+16>>3]=+h[(c[r>>2]|0)+16>>3]/72.0-u;h[p+24>>3]=s+ +h[(c[r>>2]|0)+24>>3]/72.0;h[p+32>>3]=+h[(c[r>>2]|0)+32>>3]/72.0-u;h[p+40>>3]=+h[(c[r>>2]|0)+40>>3]/72.0-s;h[p+48>>3]=u+ +h[(c[r>>2]|0)+48>>3]/72.0;h[p+56>>3]=+h[(c[r>>2]|0)+56>>3]/72.0-s;v=m;w=o;break a}if((o|0)<=0){v=m;w=o;break a}r=n+44|0;s=e;u=f;p=0;while(1){t=c[r>>2]|0;x=+h[t+(p<<4)>>3];y=+h[t+(p<<4)+8>>3];z=+T(x*x+y*y);y=x*(s/z+1.0);t=m+(p<<4)|0;h[t>>3]=y;x=+h[(c[r>>2]|0)+(p<<4)+8>>3]*(u/z+1.0);h[t>>3]=y/72.0;h[m+(p<<4)+8>>3]=x/72.0;t=p+1|0;if((t|0)<(o|0)){p=t}else{v=m;w=o;break a}}}}while(0);o=ew(d|0,108448)|0;if((o|0)==0){A=0}else{A=Rb(o|0)|0}o=(A|0)<3?20:A;n=kk(o<<4)|0;if((o|0)<=0){v=n;w=o;break}u=e;s=+(o|0);x=f;m=0;while(1){y=+(m|0)/s*3.141592653589793*2.0;h[n+(m<<4)>>3]=(u+ +h[(c[j>>2]|0)+32>>3]*.5)*+V(y);h[n+(m<<4)+8>>3]=+W(y)*(x+ +h[(c[j>>2]|0)+40>>3]*.5);p=m+1|0;if((p|0)<(o|0)){m=p}else{v=n;w=o;break}}}else if((l|0)==2){o=kk(64)|0;n=c[(c[j>>2]|0)+12>>2]|0;x=+h[n+32>>3];u=+h[n+40>>3];s=-0.0-e+ +(~~+h[n+16>>3]|0)/72.0;y=-0.0-f+ +(~~+h[n+24>>3]|0)/72.0;h[o>>3]=s;h[o+8>>3]=y;z=e+ +(~~x|0)/72.0;h[o+16>>3]=z;h[o+24>>3]=y;y=f+ +(~~u|0)/72.0;h[o+32>>3]=z;h[o+40>>3]=y;h[o+48>>3]=s;h[o+56>>3]=y;c[b+40>>2]=1;v=o;w=4;break}else if((l|0)==3){c[b+40>>2]=2;o=ew(d|0,108448)|0;if((o|0)==0){B=0}else{B=Rb(o|0)|0}o=(B|0)<3?20:B;n=kk(o<<4)|0;if((o|0)<=0){v=n;w=o;break}y=e;s=+(o|0);z=f;m=0;while(1){u=+(m|0)/s*3.141592653589793*2.0;h[n+(m<<4)>>3]=(y+ +h[(c[j>>2]|0)+32>>3]*.5)*+V(u);h[n+(m<<4)+8>>3]=+W(u)*(z+ +h[(c[j>>2]|0)+40>>3]*.5);p=m+1|0;if((p|0)<(o|0)){m=p}else{v=n;w=o;break}}}else{Fv(1,128392,(o=i,i=i+8|0,c[o>>2]=c[c[(c[j>>2]|0)+8>>2]>>2],o)|0)|0;i=o;C=1;i=g;return C|0}}else{z=e+ +h[k+32>>3]*.5;y=f+ +h[k+40>>3]*.5;c[b+40>>2]=1;o=kk(64)|0;h[o>>3]=z;h[o+8>>3]=y;s=-0.0-z;h[o+16>>3]=s;h[o+24>>3]=y;h[o+32>>3]=s;s=-0.0-y;h[o+40>>3]=s;h[o+48>>3]=z;h[o+56>>3]=s;v=o;w=4}}while(0);c[b+36>>2]=v;c[b+32>>2]=w;f=+h[v>>3];e=+h[v+8>>3];if((w|0)>1){k=v;s=f;z=e;y=f;u=e;v=1;while(1){j=k+16|0;x=+h[j>>3];D=x<s?x:s;E=+h[k+24>>3];F=E<z?E:z;G=x>y?x:y;x=E>u?E:u;B=v+1|0;if((B|0)<(w|0)){k=j;s=D;z=F;y=G;u=x;v=B}else{H=D;I=F;J=G;K=x;break}}}else{H=f;I=e;J=f;K=e}h[b>>3]=H;h[b+8>>3]=I;h[b+16>>3]=J;h[b+24>>3]=K;if((w|0)<=(c[44372]|0)){C=0;i=g;return C|0}c[44372]=w;C=0;i=g;return C|0}function Zt(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0;g=i;j=d+8|0;k=c[j>>2]|0;a:do{if((c[k+212>>2]|0)==0){l=pl(d)|0;if((l|0)==2){m=kk(64)|0;n=c[(c[j>>2]|0)+12>>2]|0;o=+h[n+32>>3];p=+h[n+40>>3];q=+h[n+16>>3]/72.0;r=+h[n+24>>3]/72.0;h[m>>3]=q;h[m+8>>3]=r;s=o/72.0;h[m+16>>3]=s;h[m+24>>3]=r;r=p/72.0;h[m+32>>3]=s;h[m+40>>3]=r;h[m+48>>3]=q;h[m+56>>3]=r;c[b+40>>2]=1;t=m;u=4;v=36;break}else if((l|0)==1){m=c[(c[j>>2]|0)+12>>2]|0;n=m+8|0;w=c[n>>2]|0;do{if((w|0)>2){x=kk(w<<4)|0;y=m+44|0;z=0;while(1){h[x+(z<<4)>>3]=+h[(c[y>>2]|0)+(z<<4)>>3]/72.0;h[x+(z<<4)+8>>3]=+h[(c[y>>2]|0)+(z<<4)+8>>3]/72.0;A=z+1|0;if((A|0)<(w|0)){z=A}else{B=x;C=w;break}}}else{x=ew(d|0,108448)|0;if((x|0)==0){D=0}else{D=Rb(x|0)|0}x=(D|0)<3?20:D;z=kk(x<<4)|0;if((x|0)<=0){B=z;C=x;break}r=+(x|0);y=0;while(1){q=+(y|0)/r*3.141592653589793*2.0;h[z+(y<<4)>>3]=(+h[(c[j>>2]|0)+32>>3]*.5+0.0)*+V(q);h[z+(y<<4)+8>>3]=+W(q)*(+h[(c[j>>2]|0)+40>>3]*.5+0.0);A=y+1|0;if((A|0)<(x|0)){y=A}else{B=z;C=x;break}}}}while(0);w=c[c[(c[j>>2]|0)+8>>2]>>2]|0;x=a[w]|0;do{if((x<<24>>24|0)==98){if((Ya(w|0,121888)|0)!=0){break}c[b+40>>2]=1;t=B;u=C;v=36;break a}else if((x<<24>>24|0)==112){if(!((Ya(w|0,158472)|0)==0&(C|0)==4)){break}r=+h[B+8>>3];z=B+16|0;q=+h[B+24>>3];if(r==q){if(+h[B+40>>3]!=+h[B+56>>3]){break}if(+h[B>>3]!=+h[B+48>>3]){break}if(+h[z>>3]!=+h[B+32>>3]){break}}else{if(+h[B>>3]!=+h[z>>3]){break}if(+h[B+32>>3]!=+h[B+48>>3]){break}if(r!=+h[B+56>>3]){break}if(q!=+h[B+40>>3]){break}}c[b+40>>2]=1;t=B;u=4;v=36;break a}}while(0);do{if((c[n>>2]|0)<3){if((c[m>>2]|0)==0){break}c[b+40>>2]=2;t=B;u=C;v=36;break a}}while(0);c[b+40>>2]=0;t=B;u=C;v=36;break}else if((l|0)==3){c[b+40>>2]=2;m=ew(d|0,108448)|0;if((m|0)==0){E=0}else{E=Rb(m|0)|0}m=(E|0)<3?20:E;n=kk(m<<4)|0;if((m|0)<=0){F=m;G=n;break}q=+(m|0);w=0;while(1){r=+(w|0)/q*3.141592653589793*2.0;h[n+(w<<4)>>3]=(+h[(c[j>>2]|0)+32>>3]*.5+0.0)*+V(r);h[n+(w<<4)+8>>3]=+W(r)*(+h[(c[j>>2]|0)+40>>3]*.5+0.0);x=w+1|0;if((x|0)<(m|0)){w=x}else{t=n;u=m;v=36;break}}}else{Fv(1,115584,(m=i,i=i+8|0,c[m>>2]=c[c[(c[j>>2]|0)+8>>2]>>2],m)|0)|0;i=m;H=1;i=g;return H|0}}else{q=+h[k+32>>3]*.5;r=+h[k+40>>3]*.5;c[b+40>>2]=1;m=kk(64)|0;h[m>>3]=q;h[m+8>>3]=r;s=-0.0-q;h[m+16>>3]=s;h[m+24>>3]=r;h[m+32>>3]=s;s=-0.0-r;h[m+40>>3]=s;h[m+48>>3]=q;h[m+56>>3]=s;t=m;u=4;v=36}}while(0);do{if((v|0)==36){if(!((e!=1.0|f!=1.0)&(u|0)>0)){F=u;G=t;break}s=e;q=f;k=0;j=t;while(1){E=j|0;h[E>>3]=s*+h[E>>3];E=j+8|0;h[E>>3]=q*+h[E>>3];E=k+1|0;if((E|0)<(u|0)){k=E;j=j+16|0}else{F=u;G=t;break}}}}while(0);c[b+36>>2]=G;c[b+32>>2]=F;f=+h[G>>3];e=+h[G+8>>3];if((F|0)>1){t=G;q=f;s=e;r=f;p=e;G=1;while(1){u=t+16|0;o=+h[u>>3];I=o<q?o:q;J=+h[t+24>>3];K=J<s?J:s;L=o>r?o:r;o=J>p?J:p;v=G+1|0;if((v|0)<(F|0)){t=u;q=I;s=K;r=L;p=o;G=v}else{M=I;N=K;O=L;P=o;break}}}else{M=f;N=e;O=f;P=e}h[b>>3]=M;h[b+8>>3]=N;h[b+16>>3]=O;h[b+24>>3]=P;if((F|0)<=(c[44372]|0)){H=0;i=g;return H|0}c[44372]=F;H=0;i=g;return H|0}function _t(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;f=i;i=i+112|0;g=a;a=i;i=i+16|0;c[a>>2]=c[g>>2];c[a+4>>2]=c[g+4>>2];c[a+8>>2]=c[g+8>>2];c[a+12>>2]=c[g+12>>2];g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=f|0;j=f+16|0;k=f+32|0;l=f+48|0;m=f+64|0;n=f+80|0;o=f+96|0;as(l,a,b|0);p=b+16|0;as(m,a,p);as(n,d,e|0);q=e+16|0;as(o,d,q);r=l|0;s=l+8|0;l=m|0;t=m+8|0;m=n|0;u=n+8|0;n=o|0;v=o+8|0;if(+h[r>>3]>+h[n>>3]|+h[m>>3]>+h[l>>3]|+h[s>>3]>+h[v>>3]){w=0;i=f;return w|0}if(+h[u>>3]>+h[t>>3]){w=0;i=f;return w|0}o=c[b+40>>2]|0;do{if((o&1|0)!=0){if((c[e+40>>2]&1|0)==0){break}else{w=1}i=f;return w|0}}while(0);do{if((o&2|0)!=0){if((c[e+40>>2]&2|0)==0){break}x=+h[p>>3]- +h[b>>3]+ +h[q>>3]- +h[e>>3];y=+h[a>>3]- +h[d>>3];z=+h[a+8>>3]- +h[d+8>>3];w=y*y+z*z<=x*x*.25|0;i=f;return w|0}}while(0);if((c[43678]|0)==0){c[43678]=kk(c[44372]<<4)|0;c[43676]=kk(c[44372]<<4)|0}q=b+32|0;p=c[q>>2]|0;x=+h[a>>3];z=+h[a+8>>3];if((p|0)>0){a=c[b+36>>2]|0;b=c[43678]|0;o=0;while(1){h[b>>3]=x+ +h[a>>3];h[b+8>>3]=z+ +h[a+8>>3];A=o+1|0;if((A|0)<(p|0)){a=a+16|0;b=b+16|0;o=A}else{break}}}o=e+32|0;b=c[o>>2]|0;z=+h[d>>3];x=+h[d+8>>3];if((b|0)>0){d=c[43676]|0;a=c[e+36>>2]|0;e=d;p=0;while(1){h[e>>3]=z+ +h[a>>3];h[e+8>>3]=x+ +h[a+8>>3];A=p+1|0;if((A|0)<(b|0)){a=a+16|0;e=e+16|0;p=A}else{break}}B=c[o>>2]|0;C=d}else{B=b;C=c[43676]|0}b=c[43678]|0;d=c[q>>2]|0;p=d-1|0;e=B-1|0;a=d<<1;A=B<<1;D=0;E=0;F=0;G=0;while(1){H=b+(D<<4)|0;I=b+(((p+D|0)%(d|0)|0)<<4)|0;$r(g,H,I);J=C+(E<<4)|0;K=C+(((e+E|0)%(B|0)|0)<<4)|0;$r(j,J,K);x=+bs(177e3,g,j);L=cs(I,H,J)|0;M=cs(K,J,H)|0;if((ds(I,H,K,J,k)|0)!=0){w=1;N=36;break}J=(L|0)==0;L=(M|0)==0;do{if(x==0.0&J&L){O=(D+1|0)%(d|0)|0;P=E;Q=F+1|0;R=G}else{if(x<0.0){if(L){O=(D+1|0)%(d|0)|0;P=E;Q=F+1|0;R=G;break}else{O=D;P=(E+1|0)%(B|0)|0;Q=F;R=G+1|0;break}}else{if(J){O=D;P=(E+1|0)%(B|0)|0;Q=F;R=G+1|0;break}else{O=(D+1|0)%(d|0)|0;P=E;Q=F+1|0;R=G;break}}}}while(0);if(((Q|0)<(d|0)|(R|0)<(B|0))&(Q|0)<(a|0)&(R|0)<(A|0)){D=O;E=P;F=Q;G=R}else{break}}if((N|0)==36){i=f;return w|0}N=c[43678]|0;x=+h[N>>3];z=+h[N+8>>3];do{if(!(x>+h[n>>3]|x<+h[m>>3]|z>+h[v>>3])){if(z<+h[u>>3]){break}if(($t(c[43676]|0,c[o>>2]|0,x,z)|0)==0){break}else{w=1}i=f;return w|0}}while(0);o=c[43676]|0;z=+h[o>>3];x=+h[o+8>>3];if(z>+h[l>>3]|z<+h[r>>3]|x>+h[t>>3]){w=0;i=f;return w|0}if(x<+h[s>>3]){w=0;i=f;return w|0}w=($t(c[43678]|0,c[q>>2]|0,z,x)|0)!=0|0;i=f;return w|0}function $t(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,i=0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0,t=0.0;f=c[43674]|0;if((f|0)==0){g=kk(c[44372]<<4)|0;c[43674]=g;i=g}else{i=f}f=(b|0)>0;a:do{if(f){g=0;do{h[i+(g<<4)>>3]=+h[a+(g<<4)>>3]-d;h[i+(g<<4)+8>>3]=+h[a+(g<<4)+8>>3]-e;g=g+1|0;}while((g|0)<(b|0));if(!f){j=0.0;break}g=b-1|0;k=0;l=0.0;b:while(1){m=(g+k|0)%(b|0)|0;n=+h[i+(k<<4)+8>>3];o=n==0.0;do{if(o){if(+h[i+(m<<4)+8>>3]!=0.0){p=10;break}if(+h[i+(k<<4)>>3]*+h[i+(m<<4)>>3]<0.0){q=1;p=19;break b}else{r=l}}else{p=10}}while(0);do{if((p|0)==10){p=0;s=+h[i+(m<<4)+8>>3];if(n<0.0|s>0.0){if(s<0.0|n>0.0){r=l;break}}t=(+h[i+(k<<4)>>3]*s- +h[i+(m<<4)>>3]*n)/(s-n);if(t==0.0){q=1;p=19;break b}if(t<=0.0){r=l;break}if(o|s==0.0){r=l+.5;break}else{r=l+1.0;break}}}while(0);o=k+1|0;if((o|0)<(b|0)){k=o;l=r}else{j=r;break a}}if((p|0)==19){return q|0}}else{j=0.0}}while(0);q=((~~j|0)%2|0|0)==1|0;return q|0}function au(){nt(175056,24);c[44268]=0;return}function bu(){return ot(175056)|0}function cu(a,b){a=a|0;b=b|0;var c=0.0,d=0.0;c=+h[a>>3]- +h[b>>3];d=+h[a+8>>3]- +h[b+8>>3];return+(+T(c*c+d*d))}function du(a){a=a|0;c[a+16>>2]=c[44268];c[44268]=(c[44268]|0)+1;return}function eu(a){a=a|0;var b=0,d=0;b=a+20|0;d=(c[b>>2]|0)-1|0;c[b>>2]=d;if((d|0)!=0){return}pt(a,175056);return}function fu(a){a=a|0;var b=0;b=a+20|0;c[b>>2]=(c[b>>2]|0)+1;return}function gu(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0,F=0;e=da(d,d)|0;f=kk(e<<3)|0;g=f;i=kk(d<<3)|0;j=i;k=(d|0)>0;if(k){l=0;do{h[j+(l<<3)>>3]=+h[c+(l<<3)>>3];l=l+1|0;}while((l|0)<(d|0))}l=(e|0)==0;if(!l){m=0;do{h[g+(m<<3)>>3]=+h[a+(m<<3)>>3];m=m+1|0;}while((m|0)<(e|0))}m=d-1|0;n=(m|0)>0;a:do{if(n){o=0;p=0;while(1){q=(p|0)<(d|0);if(q){r=o;s=p;t=0.0}else{break a}do{u=+S(+(+h[a+((da(s,d)|0)+p<<3)>>3]));v=u<t;r=v?r:s;t=v?t:u;s=s+1|0;}while((s|0)<(d|0));if(t<1.0e-10){break a}if(q){v=da(r,d)|0;w=da(p,d)|0;x=p;do{y=a+(x+v<<3)|0;u=+h[y>>3];z=a+(x+w<<3)|0;h[y>>3]=+h[z>>3];h[z>>3]=u;x=x+1|0;}while((x|0)<(d|0))}x=c+(r<<3)|0;u=+h[x>>3];w=c+(p<<3)|0;h[x>>3]=+h[w>>3];h[w>>3]=u;x=p+1|0;b:do{if((x|0)<(d|0)){v=da(p,d)|0;q=a+(v+p<<3)|0;if(k){A=x;B=u}else{z=x;C=u;while(1){D=+h[a+((da(z,d)|0)+p<<3)>>3];y=c+(z<<3)|0;h[y>>3]=+h[y>>3]-D/+h[q>>3]*C;y=z+1|0;if((y|0)>=(d|0)){break b}z=y;C=+h[w>>3]}}while(1){z=da(A,d)|0;C=+h[a+(z+p<<3)>>3]/+h[q>>3];y=c+(A<<3)|0;h[y>>3]=+h[y>>3]-C*B;y=0;do{E=a+(y+z<<3)|0;h[E>>3]=+h[E>>3]-C*+h[a+(y+v<<3)>>3];y=y+1|0;}while((y|0)<(d|0));y=A+1|0;if((y|0)>=(d|0)){break b}A=y;B=+h[w>>3]}}}while(0);if((x|0)<(m|0)){o=r;p=x}else{F=21;break}}}else{F=21}}while(0);do{if((F|0)==21){B=+h[a+(e-1<<3)>>3];if(+S(+B)<1.0e-10){break}h[b+(m<<3)>>3]=+h[c+(m<<3)>>3]/B;if(n){r=0;do{A=d-r|0;s=A-2|0;B=+h[c+(s<<3)>>3];p=b+(s<<3)|0;h[p>>3]=B;o=da(s,d)|0;w=A-1|0;t=B;do{t=t- +h[a+(w+o<<3)>>3]*+h[b+(w<<3)>>3];h[p>>3]=t;w=w+1|0;}while((w|0)<(d|0));h[p>>3]=t/+h[a+(o+s<<3)>>3];r=r+1|0;}while((r|0)<(m|0))}if(k){r=0;do{h[c+(r<<3)>>3]=+h[j+(r<<3)>>3];r=r+1|0;}while((r|0)<(d|0))}if(!l){r=0;do{h[a+(r<<3)>>3]=+h[g+(r<<3)>>3];r=r+1|0;}while((r|0)<(e|0))}eF(f);eF(i);return}}while(0);ib(10408)|0;eF(f);eF(i);return}function hu(b,e,f,g,i){b=b|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0;b=c[g>>2]|0;j=c[g+4>>2]|0;a:do{if((e|0)>0){if((f|0)>2){k=b;l=j;m=0;n=0}else{o=b;p=j;q=0;r=0;while(1){s=(c[i+(q<<2)>>2]|0)+8|0;t=c[s>>2]|0;if((a[t+119|0]|0)==0){h[o>>3]=+wn();h[p>>3]=+wn();u=r}else{v=c[t+132>>2]|0;h[o>>3]=+h[v>>3];h[p>>3]=+h[v+8>>3];u=(d[(c[s>>2]|0)+119|0]|0)>>>0>1>>>0?1:r}s=q+1|0;if((s|0)<(e|0)){o=o+8|0;p=p+8|0;q=s;r=u}else{w=u;break a}}}while(1){r=(c[i+(m<<2)>>2]|0)+8|0;q=c[r>>2]|0;if((a[q+119|0]|0)==0){h[k>>3]=+wn();h[l>>3]=+wn();p=2;while(1){x=+wn();h[(c[g+(p<<2)>>2]|0)+(m<<3)>>3]=x;o=p+1|0;if((o|0)<(f|0)){p=o}else{y=n;break}}}else{p=c[q+132>>2]|0;h[k>>3]=+h[p>>3];h[l>>3]=+h[p+8>>3];o=p+16|0;p=2;while(1){h[(c[g+(p<<2)>>2]|0)+(m<<3)>>3]=+h[o>>3];s=p+1|0;if((s|0)<(f|0)){o=o+8|0;p=s}else{break}}y=(d[(c[r>>2]|0)+119|0]|0)>>>0>1>>>0?1:n}p=m+1|0;if((p|0)<(e|0)){k=k+8|0;l=l+8|0;m=p;n=y}else{w=y;break}}}else{w=0}}while(0);if((f|0)>0){z=0}else{return w|0}do{Ss(e,c[g+(z<<2)>>2]|0);z=z+1|0;}while((z|0)<(f|0));return w|0}function iu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0.0;d=jk(((da(b+1|0,b)|0)/2|0)<<2)|0;e=d;f=pu(b,b,0.0)|0;i=pu(b,b,0.0)|0;j=(b|0)>0;do{if((c[a+8>>2]|0)==0){if(j){k=0}else{break}do{l=a+(k<<4)|0;if((c[l>>2]|0)>1){m=a+(k<<4)+4|0;n=f+(k<<2)|0;o=1;do{p=c[(c[m>>2]|0)+(o<<2)>>2]|0;h[(c[f+(p<<2)>>2]|0)+(k<<3)>>3]=-1.0;h[(c[n>>2]|0)+(p<<3)>>3]=-1.0;o=o+1|0;}while((o|0)<(c[l>>2]|0))}k=k+1|0;}while((k|0)<(b|0))}else{if(j){q=0}else{break}do{l=a+(q<<4)|0;if((c[l>>2]|0)>1){o=a+(q<<4)+4|0;n=a+(q<<4)+8|0;m=f+(q<<2)|0;p=1;do{r=c[(c[o>>2]|0)+(p<<2)>>2]|0;s=-1.0/+g[(c[n>>2]|0)+(p<<2)>>2];h[(c[f+(r<<2)>>2]|0)+(q<<3)>>3]=s;h[(c[m>>2]|0)+(r<<3)>>3]=s;p=p+1|0;}while((p|0)<(c[l>>2]|0))}q=q+1|0;}while((q|0)<(b|0))}}while(0);if((xr(b,f,i)|0)==0){eF(d);t=0;qu(f);qu(i);return t|0}if((b|0)>0){u=0;v=0;w=b}else{t=e;qu(f);qu(i);return t|0}while(1){d=i+(v<<2)|0;q=u;a=v;while(1){if((v|0)==(a|0)){x=0.0}else{j=c[d>>2]|0;x=+h[j+(v<<3)>>3]+ +h[(c[i+(a<<2)>>2]|0)+(a<<3)>>3]- +h[j+(a<<3)>>3]*2.0}g[e+(q<<2)>>2]=x;j=a+1|0;if((j|0)<(b|0)){q=q+1|0;a=j}else{break}}a=v+1|0;if((a|0)<(b|0)){u=u+w|0;v=a;w=w-1|0}else{t=e;break}}qu(f);qu(i);return t|0}function ju(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0.0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0,x=0.0,y=0,z=0,A=0.0,B=0.0,C=0.0;e=i;if((c[b+8>>2]|0)==0){f=0;i=e;return f|0}j=ku(b,d)|0;if((d|0)>0){k=0;l=0;m=0.0;while(1){n=l+k|0;p=b+(k<<4)|0;q=c[p>>2]|0;if((q|0)>1){r=b+(k<<4)+4|0;s=(da(k,d)|0)-n|0;t=b+(k<<4)+8|0;u=1;v=m;w=q;while(1){q=c[(c[r>>2]|0)+(u<<2)>>2]|0;if((q|0)<(k|0)){x=v;y=w}else{z=j+(s+q<<2)|0;A=+g[(c[t>>2]|0)+(u<<2)>>2];q=~~(+g[z>>2]-A);g[z>>2]=A;x=v+ +(((q|0)>-1?q:-q|0)|0);y=c[p>>2]|0}q=u+1|0;if((q|0)<(y|0)){u=q;v=x;w=y}else{B=x;break}}}else{B=m}w=k+1|0;if((w|0)<(d|0)){k=w;l=n;m=B}else{C=B;break}}}else{C=0.0}if((a[213992]|0)==0){f=j;i=e;return f|0}gc(c[o>>2]|0,119712,(l=i,i=i+8|0,h[l>>3]=C,l)|0)|0;i=l;f=j;i=e;return f|0}function ku(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;c=i;i=i+16|0;d=c|0;e=jk(((da(b+1|0,b)|0)/2|0)<<2)|0;f=jk(b<<2)|0;h=f;vr(d,b);if((b|0)>0){j=0;k=0;l=b}else{eF(f);wr(d);i=c;return e|0}while(1){Sr(k,a,b,h);m=j;n=k;while(1){g[e+(m<<2)>>2]=+g[h+(n<<2)>>2];o=n+1|0;if((o|0)<(b|0)){m=m+1|0;n=o}else{break}}n=k+1|0;if((n|0)<(b|0)){j=j+l|0;k=n;l=l-1|0}else{break}}eF(f);wr(d);i=c;return e|0}function lu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+16|0;e=d|0;f=jk(((da(b+1|0,b)|0)/2|0)<<2)|0;h=jk(b<<2)|0;j=h;vr(e,b);if((b|0)>0){k=0;l=0;m=b}else{eF(h);wr(e);i=d;return f|0}while(1){ur(l,a,b,j,e);n=k;o=l;while(1){g[f+(n<<2)>>2]=+(c[j+(o<<2)>>2]|0);p=o+1|0;if((p|0)<(b|0)){n=n+1|0;o=p}else{break}}o=l+1|0;if((o|0)<(b|0)){k=k+m|0;l=o;m=m-1|0}else{break}}eF(h);wr(e);i=d;return f|0}function mu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0,A=0;d=a+8|0;e=c[d>>2]|0;f=(b|0)>0;if(f){h=0;i=0;do{i=(c[a+(h<<4)>>2]|0)+i|0;h=h+1|0;}while((h|0)<(b|0));j=i<<2}else{j=0}i=jk(j)|0;j=b<<2;h=jk(j)|0;k=h;if(f){vF(h|0,0,j|0)|0}if((c[d>>2]|0)==0){if(f){j=0;l=i;while(1){c[a+(j<<4)+8>>2]=l;As(a,j,k);m=a+(j<<4)|0;n=c[m>>2]|0;o=n-1|0;if((n|0)>=2){n=a+(j<<4)+4|0;p=+(o|0);q=1;while(1){r=c[(c[n>>2]|0)+(q<<2)>>2]|0;s=p+ +((c[a+(r<<4)>>2]|0)-1|0);g[l+(q<<2)>>2]=s- +((zs(a,j,r,k)|0)<<1|0);if((q|0)<(o|0)){q=q+1|0}else{break}}}Bs(a,j,k);q=j+1|0;if((q|0)<(b|0)){j=q;l=l+(c[m>>2]<<2)|0}else{break}}}t=lu(a,b)|0}else{if(f){l=0;j=i;while(1){As(a,l,k);i=a+(l<<4)|0;q=c[i>>2]|0;o=q-1|0;if((q|0)<2){u=a+(l<<4)+8|0}else{n=a+(l<<4)+4|0;r=q-2|0;q=a+(l<<4)+8|0;v=1;while(1){w=c[(c[n>>2]|0)+(v<<2)>>2]|0;x=r+(c[a+(w<<4)>>2]|0)|0;p=+(x-((zs(a,l,w,k)|0)<<1)|0);s=+g[(c[q>>2]|0)+(v<<2)>>2];if(p>s){y=+(x-((zs(a,l,w,k)|0)<<1)|0)}else{y=s}g[j+(v<<2)>>2]=y;if((v|0)<(o|0)){v=v+1|0}else{u=q;break}}}Bs(a,l,k);c[u>>2]=j;q=l+1|0;if((q|0)<(b|0)){l=q;j=j+(c[i>>2]<<2)|0}else{break}}}t=ku(a,b)|0}eF(h);eF(c[d>>2]|0);c[d>>2]=0;if((e|0)==0|f^1){return t|0}else{z=0;A=e}do{c[a+(z<<4)+8>>2]=A;A=A+(c[a+(z<<4)>>2]<<2)|0;z=z+1|0;}while((z|0)<(b|0));return t|0}function nu(b,e,f,j,k,l,m,n,p){b=b|0;e=e|0;f=f|0;j=j|0;k=k|0;l=l|0;m=m|0;n=n|0;p=p|0;var q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0.0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0.0,Ia=0.0,Ja=0.0,La=0.0,Na=0,Oa=0,Pa=0.0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0.0,bb=0,cb=0,db=0,eb=0.0,fb=0,gb=0,hb=0.0,ib=0.0,jb=0,kb=0.0,lb=0.0,mb=0.0,nb=0,ob=0.0,pb=0,qb=0.0,rb=0.0,sb=0.0,tb=0,ub=0.0,vb=0,wb=0.0,xb=0.0,zb=0,Ab=0,Bb=0,Cb=0.0,Db=0.0,Eb=0.0,Fb=0.0,Gb=0,Hb=0.0,Ib=0;f=i;i=i+40|0;q=f|0;r=f+8|0;s=f+24|0;t=f+32|0;u=m&4;v=m&3;if((p|0)<0){w=0;i=f;return w|0}if((a[213992]|0)!=0){ym()}m=(n|0)==2;do{if(m){if((a[213992]|0)!=0){Ma(157464,24,1,c[o>>2]|0)|0}x=mu(b,e)|0;y=14}else{if((n|0)==1){z=iu(b,e)|0;if((z|0)!=0){A=z;break}Fv(0,127544,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;Fv(3,115272,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;y=15;break}else if((n|0)!=3){y=15;break}if((a[213992]|0)!=0){Ma(108184,21,1,c[o>>2]|0)|0}x=ju(b,e)|0;y=14}}while(0);if((y|0)==14){if((x|0)==0){y=15}else{A=x}}do{if((y|0)==15){if((a[213992]|0)!=0){Ma(102560,26,1,c[o>>2]|0)|0}if((c[b+8>>2]|0)==0){A=lu(b,e)|0;break}else{A=ku(b,e)|0;break}}}while(0);if((a[213992]|0)!=0){x=c[o>>2]|0;C=+zm();gc(x|0,96864,(B=i,i=i+8|0,h[B>>3]=C,B)|0)|0;i=B;Ma(91480,25,1,x|0)|0;ym()}do{if((u|0)!=0&(e|0)>1){x=m&1;n=(e|0)>50?50:e;z=kk(n<<2)|0;D=z;E=e<<3;F=kk(da(n,E)|0)|0;G=(n|0)>0;if(G){H=0;do{c[D+(H<<2)>>2]=F+((da(H,e)|0)<<3);H=H+1|0;}while((H|0)<(n|0))}H=n<<1;F=(H|0)>50?H:50;H=(F|0)>(e|0)?e:F;c[q>>2]=0;Xr(b,e,H,q,x);Yr(c[q>>2]|0,e,H);Ut(c[q>>2]|0,H,e,D,n);eF(c[c[q>>2]>>2]|0);eF(c[q>>2]|0);H=e<<2;F=kk(H)|0;I=F;J=(e|0)>0;if(J){vF(F|0,-1|0,H|0)|0}vr(r,e);K=c[b+8>>2]|0;if(m){Ds(b,e)}L=kk(H)|0;M=kk(160)|0;N=kk(e*160|0)|0;O=kk(160)|0;P=O;Q=0;do{c[P+(Q<<2)>>2]=N+((da(Q,e)|0)<<2);Q=Q+1|0;}while((Q|0)<40);Q=L;N=M;x=(yb()|0)%(e|0)|0;c[I+(x<<2)>>2]=0;c[N>>2]=x;R=c[P>>2]|0;if(m){Rr(x,b,e,R)}else{ur(x,b,e,R,r)}if(J){R=0;U=x;V=0;while(1){W=c[(c[P>>2]|0)+(V<<2)>>2]|0;c[Q+(V<<2)>>2]=W;X=(W|0)>(R|0);Y=X?V:U;Z=V+1|0;if((Z|0)<(e|0)){R=X?W:R;U=Y;V=Z}else{_=Y;$=1;break}}}else{_=x;$=1}while(1){c[I+(_<<2)>>2]=$;c[N+($<<2)>>2]=_;V=P+($<<2)|0;U=c[V>>2]|0;if(m){Rr(_,b,e,U)}else{ur(_,b,e,U,r)}if(J){U=0;R=_;Y=0;while(1){Z=Q+(Y<<2)|0;W=c[Z>>2]|0;X=c[(c[V>>2]|0)+(Y<<2)>>2]|0;aa=(W|0)<(X|0)?W:X;c[Z>>2]=aa;do{if((aa|0)>(U|0)){ba=Y;ca=aa}else{if((aa|0)!=(U|0)){ba=R;ca=U;break}if(((yb()|0)%(Y+1|0)|0|0)!=0){ba=R;ca=U;break}ba=Y;ca=c[Z>>2]|0}}while(0);Z=Y+1|0;if((Z|0)<(e|0)){U=ca;R=ba;Y=Z}else{ea=ba;break}}}else{ea=_}Y=$+1|0;if((Y|0)<40){_=ea;$=Y}else{break}}if(J){vF(L|0,-1|0,H|0)|0}Q=kk(H)|0;x=e<<4;Y=kk(x)|0;R=Y;if(J){U=e-1|0;V=U<<2;Z=0;aa=0;X=0;W=0;fa=0;while(1){ga=I+(fa<<2)|0;do{if((c[ga>>2]|0)>-1){ha=R+(fa<<4)+4|0;c[ha>>2]=kk(V)|0;ia=R+(fa<<4)+8|0;c[ia>>2]=kk(V)|0;c[R+(fa<<4)>>2]=U;a[R+(fa<<4)+12|0]=1;ja=c[ga>>2]|0;if((fa|0)>0){ka=P+(ja<<2)|0;la=0;do{c[(c[ha>>2]|0)+(la<<2)>>2]=la;c[(c[ia>>2]|0)+(la<<2)>>2]=c[(c[ka>>2]|0)+(la<<2)>>2];la=la+1|0;}while((la|0)<(fa|0))}la=fa+1|0;if((la|0)>=(e|0)){ma=U;na=X;oa=aa;pa=Z;qa=la;break}ka=P+(ja<<2)|0;ra=fa;sa=la;while(1){c[(c[ha>>2]|0)+(ra<<2)>>2]=sa;c[(c[ia>>2]|0)+(ra<<2)>>2]=c[(c[ka>>2]|0)+(sa<<2)>>2];ta=sa+1|0;if((ta|0)<(e|0)){ra=sa;sa=ta}else{ma=U;na=X;oa=aa;pa=Z;qa=la;break}}}else{if((Z|0)<40){la=kk(H)|0;sa=kk(H)|0;a[R+(fa<<4)+12|0]=1;ua=sa;va=la;wa=e}else{a[R+(fa<<4)+12|0]=0;ua=X;va=aa;wa=Z}c[R+(fa<<4)+4>>2]=va;c[R+(fa<<4)+8>>2]=ua;c[R+(fa<<4)>>2]=40;la=0;do{c[va+(la<<2)>>2]=c[N+(la<<2)>>2];c[ua+(la<<2)>>2]=c[(c[P+(la<<2)>>2]|0)+(fa<<2)>>2];la=la+1|0;}while((la|0)<40);ma=40;na=ua+160|0;oa=va+160|0;pa=wa-40|0;qa=fa+1|0}}while(0);ga=ma+W|0;if((qa|0)<(e|0)){Z=pa;aa=oa;X=na;W=ga;fa=qa}else{xa=ga;break}}}else{xa=0}eF(L);eF(Q);if((O|0)!=0){eF(c[P>>2]|0);eF(O)}fa=kk(x)|0;W=fa;X=xa+e<<2;aa=kk(X)|0;Z=kk(X)|0;if(J){X=(v|0)==2;N=aa;aa=Z;Z=0;while(1){c[W+(Z<<4)+4>>2]=N;c[W+(Z<<4)+8>>2]=aa;H=c[R+(Z<<4)>>2]|0;U=W+(Z<<4)|0;c[U>>2]=H+1;V=c[R+(Z<<4)+8>>2]|0;I=(H|0)>0;do{if(X){if(!I){ya=0.0;break}H=R+(Z<<4)+4|0;C=0.0;ga=1;while(1){la=ga-1|0;c[N+(ga<<2)>>2]=c[(c[H>>2]|0)+(la<<2)>>2];za=+(c[V+(la<<2)>>2]|0);Aa=-1.0/(za*za);g[aa+(ga<<2)>>2]=Aa;za=C-Aa;la=ga+1|0;if((la|0)<(c[U>>2]|0)){C=za;ga=la}else{ya=za;break}}}else{if(!I){ya=0.0;break}ga=R+(Z<<4)+4|0;C=0.0;H=1;while(1){la=H-1|0;c[N+(H<<2)>>2]=c[(c[ga>>2]|0)+(la<<2)>>2];za=-1.0/+(c[V+(la<<2)>>2]|0);g[aa+(H<<2)>>2]=za;Aa=C-za;la=H+1|0;if((la|0)<(c[U>>2]|0)){C=Aa;H=la}else{ya=Aa;break}}}}while(0);c[N>>2]=Z;g[aa>>2]=ya;V=c[U>>2]|0;I=Z+1|0;if((I|0)<(e|0)){N=N+(V<<2)|0;aa=aa+(V<<2)|0;Z=I}else{break}}}Z=kk(l<<2)|0;aa=Z;N=n<<3;X=kk(da(N,l)|0)|0;c[aa>>2]=X;a:do{if((l|0)>1){c[Z+4>>2]=X+(n<<3);if((l|0)>2){Ba=2;Ca=X}else{Da=0;y=81;break}while(1){c[aa+(Ba<<2)>>2]=Ca+((da(Ba,n)|0)<<3);x=Ba+1|0;if((x|0)>=(l|0)){y=80;break a}Ba=x;Ca=c[aa>>2]|0}}else{y=80}}while(0);if((y|0)==80){if((l|0)>0){Da=0;y=81}else{Ea=0}}if((y|0)==81){while(1){y=0;if(G){X=aa+(Da<<2)|0;U=0;do{h[(c[X>>2]|0)+(U<<3)>>3]=0.0;U=U+1|0;}while((U|0)<(n|0))}U=Da+1|0;if((U|0)<(l|0)){Da=U;y=81}else{break}}do{if((l|0)==2){h[c[aa>>2]>>3]=1.0;U=Z+4|0;if((Vt(D,n,e,c[U>>2]|0)|0)<<24>>24!=0){Fa=0;break}X=c[U>>2]|0;if(G){x=0;O=X;while(1){h[O+(x<<3)>>3]=0.0;P=x+1|0;Q=c[U>>2]|0;if((P|0)<(n|0)){x=P;O=Q}else{Ga=Q;break}}}else{Ga=X}h[Ga+8>>3]=1.0;Fa=0}else{O=0;while(1){h[(c[aa+(O<<2)>>2]|0)+(O<<3)>>3]=1.0;x=O+1|0;if((x|0)<(l|0)){O=x}else{Fa=0;break}}}}while(0);while(1){_s(D,e,n,c[aa+(Fa<<2)>>2]|0,c[j+(Fa<<2)>>2]|0);G=Fa+1|0;if((G|0)<(l|0)){Fa=G}else{Ea=1;break}}}c[s>>2]=0;c[t>>2]=0;Rs(W,D,e,n,s);Ps(D,c[s>>2]|0,n,e,n,t);eF(c[c[s>>2]>>2]|0);eF(c[s>>2]|0);G=kk(E)|0;O=G;X=kk(N)|0;x=X;C=+ou(j,R,l,e,v);U=0;b:while(1){if(Ea){Q=0;do{if(J){P=j+(Q<<2)|0;L=0;do{I=O+(L<<3)|0;h[I>>3]=0.0;V=c[R+(L<<4)+8>>2]|0;H=c[W+(L<<4)+4>>2]|0;ga=c[W+(L<<4)+8>>2]|0;la=W+(L<<4)|0;if((c[la>>2]|0)>1){Aa=0.0;sa=1;while(1){ra=c[H+(sa<<2)>>2]|0;za=+Fs(j,l,L,ra);if(za>1.0e-30){Ha=(-0.0- +g[ga+(sa<<2)>>2]*+(c[V+(sa-1<<2)>>2]|0))/za;h[I>>3]=+h[I>>3]+Ha*+h[(c[P>>2]|0)+(ra<<3)>>3];Ia=Aa-Ha}else{Ia=Aa}ra=sa+1|0;if((ra|0)<(c[la>>2]|0)){Aa=Ia;sa=ra}else{break}}Ja=Ia;La=+h[I>>3]}else{Ja=0.0;La=0.0}h[I>>3]=La+Ja*+h[(c[P>>2]|0)+(L<<3)>>3];L=L+1|0;}while((L|0)<(e|0))}Os(D,n,e,O,x);L=aa+(Q<<2)|0;if((Ar(c[t>>2]|0,c[L>>2]|0,x,n,.001,n,0)|0)!=0){Na=-1;break b}_s(D,e,n,c[L>>2]|0,c[j+(Q<<2)>>2]|0);Q=Q+1|0;}while((Q|0)<(l|0))}if((U&1|0)==0){Aa=+ou(j,R,l,e,v);Ha=+S(+(Aa-C))/(Aa+1.0e-10);Oa=Ha>=+h[21657];Pa=Aa}else{Oa=1;Pa=C}Q=U+1|0;if((Q|0)<50&Oa){C=Pa;U=Q}else{Na=Q;break}}eF(X);eF(G);if(m){Es(b,e,K)}if(J){U=0;do{if((a[R+(U<<4)+12|0]|0)!=0){eF(c[R+(U<<4)+4>>2]|0);eF(c[R+(U<<4)+8>>2]|0)}U=U+1|0;}while((U|0)<(e|0))}eF(Y);eF(c[fa+4>>2]|0);eF(c[fa+8>>2]|0);eF(fa);eF(F);eF(M);eF(c[aa>>2]|0);eF(Z);U=c[t>>2]|0;if((U|0)!=0){eF(c[U>>2]|0);eF(c[t>>2]|0)}eF(c[D>>2]|0);eF(z);wr(r);if((Na|0)<0){Qa=-1;Ra=0;Sa=0;Ta=0;Ua=0;Va=0;Wa=0;Xa=0;Ya=0;break}if(Ea){Za=0}else{_a=0;y=129;break}while(1){do{if(J){U=c[j+(Za<<2)>>2]|0;R=0;C=1.0;do{Aa=+S(+(+h[U+(R<<3)>>3]));C=Aa>C?Aa:C;R=R+1|0;}while((R|0)<(e|0));if(!J){y=124;break}R=j+(Za<<2)|0;U=0;do{K=(c[R>>2]|0)+(U<<3)|0;h[K>>3]=+h[K>>3]/C;U=U+1|0;}while((U|0)<(e|0));if(!J){y=124;break}U=j+(Za<<2)|0;R=0;while(1){C=(+wn()+-.5)*1.0e-6;K=(c[U>>2]|0)+(R<<3)|0;h[K>>3]=+h[K>>3]+C;K=R+1|0;if((K|0)<(e|0)){R=K}else{$a=U;break}}}else{y=124}}while(0);if((y|0)==124){y=0;$a=j+(Za<<2)|0}Ss(e,c[$a>>2]|0);U=Za+1|0;if((U|0)<(l|0)){Za=U}else{_a=0;y=129;break}}}else{_a=hu(0,e,l,j,k)|0;y=129}}while(0);c:do{if((y|0)==129){if((a[213992]|0)!=0){Za=c[o>>2]|0;Pa=+zm();gc(Za|0,86240,(B=i,i=i+8|0,h[B>>3]=Pa,B)|0)|0;i=B}if((e|0)==1|(p|0)==0){w=0;i=f;return w|0}if((a[213992]|0)!=0){Za=c[o>>2]|0;Pa=+zm();gc(Za|0,96864,(B=i,i=i+8|0,h[B>>3]=Pa,B)|0)|0;i=B;Ma(81504,26,1,Za|0)|0;ym()}Za=l<<2;$a=jk(Za)|0;Ea=e<<2;Na=da(Ea,l)|0;r=jk(Na)|0;t=(l|0)>0;if(t){b=(e|0)>0;m=0;do{Oa=r+((da(m,e)|0)<<2)|0;s=$a+(m<<2)|0;c[s>>2]=Oa;d:do{if(b){Fa=j+(m<<2)|0;Ga=0;Da=Oa;while(1){g[Da+(Ga<<2)>>2]=+h[(c[Fa>>2]|0)+(Ga<<3)>>3];Ca=Ga+1|0;if((Ca|0)>=(e|0)){break d}Ga=Ca;Da=c[s>>2]|0}}}while(0);m=m+1|0;}while((m|0)<(l|0))}do{if((v|0)==0){m=e-1|0;if((m|0)>0){ab=0.0;bb=0;cb=0;db=e}else{eb=0.0;fb=(da(e+1|0,e)|0)/2|0;gb=0;break}while(1){b=bb+1|0;s=e-cb|0;if((s|0)>1){Pa=ab;Oa=1;Da=b;while(1){hb=Pa+ +g[A+(Da<<2)>>2];Ga=Oa+1|0;if((Ga|0)<(s|0)){Pa=hb;Oa=Ga;Da=Da+1|0}else{break}}ib=hb;jb=bb+db|0}else{ib=ab;jb=b}Da=cb+1|0;if((Da|0)<(m|0)){ab=ib;bb=jb;cb=Da;db=db-1|0}else{kb=ib;y=149;break}}}else{kb=+(e|0)*+(e-1|0)*.5;y=149}}while(0);do{if((y|0)==149){m=(da(e+1|0,e)|0)/2|0;if((v|0)!=2){eb=kb;fb=m;gb=0;break}jt(m,A);eb=kb;fb=m;gb=1}}while(0);kt(fb,A);m=e<<3;Da=jk(m)|0;Oa=Da;vF(Da|0,0,m|0)|0;s=e-1|0;Ga=(s|0)>0;if(Ga){Fa=0;Ca=0;Ba=e;while(1){xa=Fa+1|0;qa=e-Ca|0;if((qa|0)>1){Pa=0.0;na=1;oa=xa;while(1){Ja=+g[A+(oa<<2)>>2];lb=Pa+Ja;pa=Oa+(na+Ca<<3)|0;h[pa>>3]=+h[pa>>3]-Ja;pa=na+1|0;if((pa|0)<(qa|0)){Pa=lb;na=pa;oa=oa+1|0}else{break}}mb=lb;nb=Fa+Ba|0}else{mb=0.0;nb=xa}oa=Oa+(Ca<<3)|0;h[oa>>3]=+h[oa>>3]-mb;oa=Ca+1|0;if((oa|0)<(s|0)){Fa=nb;Ca=oa;Ba=Ba-1|0}else{break}}}Ba=(e|0)>0;if(Ba){Ca=0;Fa=e;oa=0;while(1){g[A+(Ca<<2)>>2]=+h[Oa+(oa<<3)>>3];na=oa+1|0;if((na|0)<(e|0)){Ca=Fa+Ca|0;Fa=Fa-1|0;oa=na}else{break}}}oa=jk(Za)|0;Fa=jk(Na)|0;c[oa>>2]=Fa;e:do{if((l|0)>1){Ca=1;na=Fa;while(1){c[oa+(Ca<<2)>>2]=na+((da(Ca,e)|0)<<2);qa=Ca+1|0;if((qa|0)>=(l|0)){break e}Ca=qa;na=c[oa>>2]|0}}}while(0);Fa=jk(Ea)|0;Na=jk(Ea)|0;Za=jk(fb<<2)|0;if((a[213992]|0)!=0){na=c[o>>2]|0;Pa=+zm();gc(na|0,96864,(B=i,i=i+8|0,h[B>>3]=Pa,B)|0)|0;i=B;Ma(167776,15,1,na|0)|0;ym()}if((p|0)>0){Pa=eb;na=c[o>>2]|0;Ca=(_a|0)==0;Ja=1.7976931348623157e+308;xa=0;while(1){vF(Da|0,0,m|0)|0;if(gb){lt(fb,A,Za)}if(Ga){qa=0;pa=0;ma=e;while(1){wa=e-pa-1|0;ht(wa,0.0,Na);if(t){va=pa+1|0;ua=0;do{$=$a+(ua<<2)|0;ht(wa,+g[(c[$>>2]|0)+(pa<<2)>>2],Fa);dt(wa,Fa,-1.0,(c[$>>2]|0)+(va<<2)|0);jt(wa,Fa);ct(wa,Fa,Na,Na);ua=ua+1|0;}while((ua|0)<(l|0))}mt(wa,Na);ua=(wa|0)>0;if(ua){va=0;do{b=Na+(va<<2)|0;La=+g[b>>2];if(La>=3.4028234663852886e+38|La<0.0){g[b>>2]=0.0}va=va+1|0;}while((va|0)<(wa|0))}va=qa+1|0;do{if(gb){if(!ua){ob=0.0;pb=va;break}b=pa+1|0;$=va;La=0.0;ea=0;while(1){_=Za+($<<2)|0;Ia=+g[Na+(ea<<2)>>2]*+g[_>>2];g[_>>2]=Ia;ya=Ia;qb=La+ya;_=Oa+(b+ea<<3)|0;h[_>>3]=+h[_>>3]-ya;_=ea+1|0;if((_|0)<(wa|0)){$=$+1|0;La=qb;ea=_}else{break}}ob=qb;pb=qa+ma|0}else{if(!ua){ob=0.0;pb=va;break}ea=pa+1|0;$=va;La=0.0;b=0;while(1){ya=+g[Na+(b<<2)>>2];g[Za+($<<2)>>2]=ya;Ia=ya;rb=La+Ia;I=Oa+(ea+b<<3)|0;h[I>>3]=+h[I>>3]-Ia;I=b+1|0;if((I|0)<(wa|0)){$=$+1|0;La=rb;b=I}else{break}}ob=rb;pb=qa+ma|0}}while(0);wa=Oa+(pa<<3)|0;h[wa>>3]=+h[wa>>3]-ob;wa=pa+1|0;if((wa|0)<(s|0)){qa=pb;pa=wa;ma=ma-1|0}else{break}}}if(Ba){ma=0;pa=e;qa=0;while(1){g[Za+(ma<<2)>>2]=+h[Oa+(qa<<3)>>3];wa=qa+1|0;if((wa|0)<(e|0)){ma=pa+ma|0;pa=pa-1|0;qa=wa}else{break}}}do{if(t){qa=0;do{at(Za,e,c[$a+(qa<<2)>>2]|0,c[oa+(qa<<2)>>2]|0);qa=qa+1|0;}while((qa|0)<(l|0));if(t){sb=0.0;tb=0}else{y=191;break}do{sb=sb+ +gt(e,c[$a+(tb<<2)>>2]|0,c[oa+(tb<<2)>>2]|0);tb=tb+1|0;}while((tb|0)<(l|0));La=Pa+sb*2.0;if(t){ub=La;vb=0}else{wb=La;break}while(1){qa=$a+(vb<<2)|0;at(A,e,c[qa>>2]|0,Fa);La=ub- +gt(e,c[qa>>2]|0,Fa);qa=vb+1|0;if((qa|0)<(l|0)){ub=La;vb=qa}else{wb=La;break}}}else{y=191}}while(0);if((y|0)==191){y=0;wb=Pa+0.0}La=Ja-wb;if(La<0.0){xb=-0.0-La}else{xb=La}La=+h[21657];if(xb/Ja<La){zb=1}else{zb=wb<La|0}if(t){qa=0;do{pa=$a+(qa<<2)|0;ma=c[pa>>2]|0;do{if(Ca){if((Br(A,ma,c[oa+(qa<<2)>>2]|0,e,.001,e)|0)<0){Qa=-1;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break c}}else{ft(e,ma,Fa);if((Br(A,Fa,c[oa+(qa<<2)>>2]|0,e,.001,e)|0)<0){Qa=-1;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break c}if(Ba){Ab=0}else{break}do{if((d[(c[(c[k+(Ab<<2)>>2]|0)+8>>2]|0)+119|0]|0)>>>0<=1>>>0){g[(c[pa>>2]|0)+(Ab<<2)>>2]=+g[Fa+(Ab<<2)>>2]}Ab=Ab+1|0;}while((Ab|0)<(e|0))}}while(0);qa=qa+1|0;}while((qa|0)<(l|0))}do{if((a[213992]|0)!=0){if(((xa|0)%5|0|0)!=0){break}gc(na|0,163608,(B=i,i=i+8|0,h[B>>3]=wb,B)|0)|0;i=B;if(((xa+5|0)%50|0|0)!=0){break}Ka(10,na|0)|0}}while(0);qa=xa+1|0;if((qa|0)<(p|0)&zb<<24>>24==0){Ja=wb;xa=qa}else{Bb=qa;break}}}else{Bb=0}if((a[213992]|0)!=0){xa=c[o>>2]|0;if(Ga){na=0;Ca=0;Ja=0.0;m=e;while(1){Da=Ca+1|0;Ea=e-na|0;if((Ea|0)>1){qa=1;Pa=Ja;pa=Da;while(1){ma=qa+na|0;if(t){wa=0;La=0.0;while(1){va=c[$a+(wa<<2)>>2]|0;Ia=+g[va+(na<<2)>>2]- +g[va+(ma<<2)>>2];ya=La+Ia*Ia;va=wa+1|0;if((va|0)<(l|0)){wa=va;La=ya}else{Cb=ya;break}}}else{Cb=0.0}La=+T(Cb);ya=+g[A+(pa<<2)>>2];if(gb){Ia=1.0/+T(ya)-La;Db=Ia*Ia}else{Ia=1.0/ya-La;Db=Ia*Ia}Eb=Pa+ya*Db;wa=qa+1|0;if((wa|0)<(Ea|0)){qa=wa;Pa=Eb;pa=pa+1|0}else{break}}Fb=Eb;Gb=Ca+m|0}else{Fb=Ja;Gb=Da}pa=na+1|0;if((pa|0)<(s|0)){na=pa;Ca=Gb;Ja=Fb;m=m-1|0}else{Hb=Fb;break}}}else{Hb=0.0}Ja=+zm();gc(xa|0,154504,(B=i,i=i+24|0,h[B>>3]=Hb,c[B+8>>2]=Bb,h[B+16>>3]=Ja,B)|0)|0;i=B}if(t){Ib=0}else{Qa=Bb;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break}while(1){if(Ba){m=$a+(Ib<<2)|0;Ca=j+(Ib<<2)|0;na=0;do{h[(c[Ca>>2]|0)+(na<<3)>>3]=+g[(c[m>>2]|0)+(na<<2)>>2];na=na+1|0;}while((na|0)<(e|0))}na=Ib+1|0;if((na|0)<(l|0)){Ib=na}else{Qa=Bb;Ra=Za;Sa=Na;Ta=Fa;Ua=oa;Va=Oa;Wa=A;Xa=$a;Ya=r;break}}}}while(0);eF(Ya);eF(Xa);eF(Wa);if((Ua|0)!=0){eF(c[Ua>>2]|0);eF(Ua)}eF(Ta);eF(Sa);eF(Va);eF(Ra);w=Qa;i=f;return w|0}function ou(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0.0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0;g=(e|0)>0;if((f|0)==2){if(!g){i=0.0;return+i}f=(d|0)>0;j=0;k=0.0;while(1){l=c[b+(j<<4)>>2]|0;if((l|0)>0){m=c[b+(j<<4)+4>>2]|0;n=b+(j<<4)+8|0;o=0;p=k;while(1){q=c[m+(o<<2)>>2]|0;if((q|0)>(j|0)){if(f){r=0;s=0.0;while(1){t=c[a+(r<<2)>>2]|0;u=+h[t+(j<<3)>>3]- +h[t+(q<<3)>>3];v=s+u*u;t=r+1|0;if((t|0)<(d|0)){r=t;s=v}else{w=v;break}}}else{w=0.0}s=+T(w);v=+(c[(c[n>>2]|0)+(o<<2)>>2]|0);u=v-s;x=p+u*u/(v*v)}else{x=p}r=o+1|0;if((r|0)<(l|0)){o=r;p=x}else{y=x;break}}}else{y=k}o=j+1|0;if((o|0)<(e|0)){j=o;k=y}else{i=y;break}}return+i}else{if(!g){i=0.0;return+i}g=(d|0)>0;j=0;y=0.0;while(1){f=c[b+(j<<4)>>2]|0;if((f|0)>0){o=c[b+(j<<4)+4>>2]|0;l=b+(j<<4)+8|0;n=0;k=y;while(1){m=c[o+(n<<2)>>2]|0;if((m|0)>(j|0)){if(g){r=0;x=0.0;while(1){q=c[a+(r<<2)>>2]|0;w=+h[q+(j<<3)>>3]- +h[q+(m<<3)>>3];p=x+w*w;q=r+1|0;if((q|0)<(d|0)){r=q;x=p}else{z=p;break}}}else{z=0.0}x=+T(z);p=+(c[(c[l>>2]|0)+(n<<2)>>2]|0);w=p-x;A=k+w*w/p}else{A=k}r=n+1|0;if((r|0)<(f|0)){n=r;k=A}else{B=A;break}}}else{B=y}n=j+1|0;if((n|0)<(e|0)){j=n;y=B}else{i=B;break}}return+i}return 0.0}function pu(a,b,d){a=a|0;b=b|0;d=+d;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0;e=jk(a<<2)|0;f=jk(da(a<<3,b)|0)|0;if((a|0)<=0){return e|0}if((b|0)>0){g=f;i=0}else{j=f;f=0;while(1){c[e+(f<<2)>>2]=j;k=f+1|0;if((k|0)<(a|0)){j=j+(b<<3)|0;f=k}else{break}}return e|0}while(1){f=e+(i<<2)|0;c[f>>2]=g;j=g+(b<<3)|0;k=0;l=g;while(1){h[l+(k<<3)>>3]=d;m=k+1|0;if((m|0)>=(b|0)){break}k=m;l=c[f>>2]|0}f=i+1|0;if((f|0)<(a|0)){g=j;i=f}else{break}}return e|0}function qu(a){a=a|0;if((a|0)==0){return}eF(c[a>>2]|0);eF(a);return}function ru(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0.0,S=0,U=0.0,V=0,W=0.0,X=0,Y=0.0,Z=0,_=0,$=0;e=i;if((a[213992]|0)!=0){f=c[o>>2]|0;g=$w(b|0)|0;j=Lw(b)|0;gc(f|0,118408,(f=i,i=i+16|0,c[f>>2]=g,c[f+8>>2]=j,f)|0)|0;i=f}do{if((a[214184]|0)!=0){f=ux(b)|0;if((f|0)==0){break}j=b+48|0;g=0;k=f;while(1){f=vx(b,k)|0;l=rw(b,k)|0;a:do{if((l|0)==0){m=g;n=15}else{p=l;q=0;r=0;s=g;while(1){t=c[p>>2]&3;u=c[((t|0)==2?p:p-32|0)+28>>2]|0;v=c[((t|0)==3?p:p+32|0)+28>>2]|0;do{if((u|0)==(v|0)){w=r;x=q;y=s}else{t=(v|0)==(k|0);if((q|0)!=1){z=t?u:v;w=z;x=q+1|0;y=z;break}if(t&(u|0)==(r|0)){w=r;x=1;y=s;break}if((v|0)==(r|0)&(u|0)==(k|0)){w=r;x=1;y=s}else{A=f;B=s;break a}}}while(0);u=sw(b,p,k)|0;if((u|0)==0){break}else{p=u;q=x;r=w;s=y}}if((x|0)==0){m=y;n=15;break}else if((x|0)!=1){A=f;B=y;break}Gx(c[j>>2]|0,k|0)|0;if((y|0)==0){A=f;B=0;break}else{C=0;D=f;E=y}while(1){s=rw(b,E)|0;if((s|0)==0){break}else{F=s;G=0;H=0;I=C}while(1){s=c[F>>2]&3;r=c[((s|0)==2?F:F-32|0)+28>>2]|0;q=c[((s|0)==3?F:F+32|0)+28>>2]|0;do{if((r|0)==(q|0)){J=H;K=G;L=I}else{s=(q|0)==(E|0);if((G|0)!=1){p=s?r:q;J=p;K=G+1|0;L=p;break}if(s&(r|0)==(H|0)){J=H;K=1;L=I;break}if((q|0)==(H|0)&(r|0)==(E|0)){J=H;K=1;L=I}else{A=D;B=y;break a}}}while(0);r=sw(b,F,E)|0;if((r|0)==0){break}else{F=r;G=K;H=J;I=L}}if((K|0)==0){break}else if((K|0)!=1){A=D;B=y;break a}if((D|0)==(E|0)){M=vx(b,E)|0}else{M=D}Gx(c[j>>2]|0,E|0)|0;if((L|0)==0){A=M;B=y;break a}else{C=L;D=M;E=L}}if((D|0)==(E|0)){N=vx(b,E)|0}else{N=D}Gx(c[j>>2]|0,E|0)|0;A=N;B=y}}while(0);if((n|0)==15){n=0;Gx(c[j>>2]|0,k|0)|0;A=f;B=m}if((A|0)==0){break}else{g=B;k=A}}}}while(0);A=Lw(b)|0;B=Mw(b)|0;m=Wv(b,2,156808,0)|0;y=(d|0)==0;do{if(y){h[21657]=+(A|0)*1.0e-4;Oj(b,127200,173256);d=ew(c[b+48>>2]|0,115168)|0;if((d|0)==0){O=.99}else{O=+rF(d)}h[21674]=O;d=jk((A<<2)+4|0)|0;N=b+8|0;c[(c[N>>2]|0)+144>>2]=d;d=ux(b)|0;if((d|0)==0){P=0.0;break}else{Q=d;R=0.0;S=0}while(1){c[(c[(c[N>>2]|0)+144>>2]|0)+(S<<2)>>2]=Q;d=Q+8|0;c[(c[d>>2]|0)+120>>2]=S;c[(c[d>>2]|0)+124>>2]=-1;U=R+ +su(b,Q,m);d=vx(b,Q)|0;if((d|0)==0){P=U;break}else{Q=d;R=U;S=S+1|0}}}else{h[21657]=1.0e-4;Oj(b,127200,173256);N=ux(b)|0;if((N|0)==0){P=0.0;break}else{V=N;W=0.0;X=0}while(1){c[(c[V+8>>2]|0)+120>>2]=X;U=W+ +su(b,V,m);N=vx(b,V)|0;if((N|0)==0){P=U;break}else{V=N;W=U;X=X+1|0}}}}while(0);X=ew(b|0,108128)|0;do{if((X|0)==0){n=42}else{if((a[X]|0)==0){n=42;break}W=+h[21657];R=+rF(X);if(W>R){Y=W;break}Y=R}}while(0);if((n|0)==42){Y=P/((B|0)<1?1.0:+(B|0))*+T(+(A|0))+1.0}h[21638]=Y;if((c[53566]|0)!=0|y^1){i=e;return A|0}y=A<<2;B=jk(y)|0;n=B;X=A<<3;V=da(X,A)|0;m=jk(V)|0;S=(A|0)>0;if(S){Q=(A|0)>1;N=m;m=0;while(1){d=n+(m<<2)|0;c[d>>2]=N;E=N+(A<<3)|0;h[N>>3]=Y;if(Q){D=1;do{h[(c[d>>2]|0)+(D<<3)>>3]=Y;D=D+1|0;}while((D|0)<(A|0))}D=m+1|0;if((D|0)<(A|0)){N=E;m=D}else{break}}}m=b+8|0;c[(c[m>>2]|0)+152>>2]=B;B=jk(y)|0;b=B;N=jk(V)|0;if(S){V=(A|0)>1;Q=N;N=0;while(1){n=b+(N<<2)|0;c[n>>2]=Q;D=Q+(A<<3)|0;h[Q>>3]=1.0;if(V){d=1;do{h[(c[n>>2]|0)+(d<<3)>>3]=1.0;d=d+1|0;}while((d|0)<(A|0))}d=N+1|0;if((d|0)<(A|0)){Q=D;N=d}else{break}}}c[(c[m>>2]|0)+156>>2]=B;B=c[53568]|0;N=jk(y)|0;Q=N;V=jk(da(B,X)|0)|0;b:do{if(S){if((B|0)<=0){X=V;b=0;while(1){c[Q+(b<<2)>>2]=X;d=b+1|0;if((d|0)<(A|0)){X=X+(B<<3)|0;b=d}else{break b}}}if((B|0)>1){Z=V;_=0}else{b=V;X=0;while(1){c[Q+(X<<2)>>2]=b;h[b>>3]=1.0;D=X+1|0;if((D|0)<(A|0)){b=b+(B<<3)|0;X=D}else{break b}}}while(1){X=Q+(_<<2)|0;c[X>>2]=Z;b=Z+(B<<3)|0;h[Z>>3]=1.0;D=1;do{h[(c[X>>2]|0)+(D<<3)>>3]=1.0;D=D+1|0;}while((D|0)<(B|0));D=_+1|0;if((D|0)<(A|0)){Z=b;_=D}else{break}}}}while(0);c[(c[m>>2]|0)+160>>2]=N;N=c[53568]|0;_=y+4|0;y=jk(_)|0;Z=y;if(S){S=N<<3;B=(N|0)>0;Q=0;while(1){V=Z+(Q<<2)|0;c[V>>2]=jk(_)|0;if(B){D=0;do{X=jk(S)|0;c[(c[V>>2]|0)+(D<<2)>>2]=X;X=0;do{h[(c[(c[V>>2]|0)+(D<<2)>>2]|0)+(X<<3)>>3]=0.0;X=X+1|0;}while((X|0)<(N|0));D=D+1|0;}while((D|0)<(A|0))}else{D=0;do{X=jk(S)|0;c[(c[V>>2]|0)+(D<<2)>>2]=X;D=D+1|0;}while((D|0)<(A|0))}c[(c[V>>2]|0)+(A<<2)>>2]=0;D=Q+1|0;if((D|0)<(A|0)){Q=D}else{$=A;break}}}else{$=0}c[Z+($<<2)>>2]=0;c[(c[m>>2]|0)+164>>2]=y;i=e;return A|0}function su(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0.0;f=i;i=i+8|0;g=f|0;j=mw(b,d)|0;if((j|0)==0){k=0.0;i=f;return+k}d=b|0;if((e|0)==0){l=0.0;m=j;while(1){h[g>>3]=1.0;h[(c[m+8>>2]|0)+136>>3]=1.0;n=l+ +h[g>>3];o=ow(b,m)|0;if((o|0)==0){k=n;break}else{l=n;m=o}}i=f;return+k}else{p=0.0;q=j}while(1){j=fw(q|0,e)|0;a:do{if((a[j]|0)==0){r=9}else{m=ac(j|0,129224,(o=i,i=i+8|0,c[o>>2]=g,o)|0)|0;i=o;do{if((m|0)>=1){l=+h[g>>3];if(l<0.0){break}if(l!=0.0|(c[53566]|0)!=0){s=l;break a}}}while(0);Fv(0,126024,(o=i,i=i+8|0,c[o>>2]=j,o)|0)|0;i=o;m=$w(d)|0;Fv(3,131512,(o=i,i=i+16|0,c[o>>2]=m,h[o+8>>3]=1.0,o)|0)|0;i=o;r=9}}while(0);if((r|0)==9){r=0;h[g>>3]=1.0;s=1.0}h[(c[q+8>>2]|0)+136>>3]=s;l=p+ +h[g>>3];j=ow(b,q)|0;if((j|0)==0){k=l;break}else{p=l;q=j}}i=f;return+k}function tu(a){a=a|0;return ru(a,0)|0}function uu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=a+8|0;eF(c[(c[b>>2]|0)+144>>2]|0);if((c[53566]|0)!=0){return}a=c[b>>2]|0;d=c[a+152>>2]|0;if((d|0)==0){e=a}else{eF(c[d>>2]|0);eF(d);e=c[b>>2]|0}d=c[e+156>>2]|0;if((d|0)==0){f=e}else{eF(c[d>>2]|0);eF(d);f=c[b>>2]|0}d=c[f+160>>2]|0;if((d|0)==0){g=f}else{eF(c[d>>2]|0);eF(d);g=c[b>>2]|0}d=c[g+164>>2]|0;f=d;if((d|0)==0){h=g}else{g=c[f>>2]|0;if((g|0)!=0){e=0;a=f;i=g;do{g=c[i>>2]|0;if((g|0)==0){j=i}else{k=0;l=g;while(1){eF(l);g=k+1|0;m=c[a>>2]|0;n=c[m+(g<<2)>>2]|0;if((n|0)==0){j=m;break}else{k=g;l=n}}}eF(j);e=e+1|0;a=f+(e<<2)|0;i=c[a>>2]|0;}while((i|0)!=0)}eF(d);h=c[b>>2]|0}c[h+164>>2]=0;return}function vu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0.0,f=0.0;if((c[53568]|0)<=(d|0)){return}e=+(b|0);b=a+8|0;a=d;do{f=e*+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+(a<<3)>>3]=f;a=a+1|0;}while((a|0)<(c[53568]|0));return}function wu(a,b){a=a|0;b=b|0;var d=0.0,e=0.0;if((c[53568]|0)<=2){return}d=+(b|0);b=a+8|0;a=2;do{e=d*+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+(a<<3)>>3]=e;a=a+1|0;}while((a|0)<(c[53568]|0));return}function xu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0;e=i;if((a[213992]|0)!=0){Ma(102424,26,1,c[o>>2]|0)|0}f=wt(b,d,2)|0;if((f|0)==1){i=e;return}if((f|0)==0&(a[21544]^1)){Fv(0,96704,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;a[21544]=1}f=b+8|0;b=c[c[(c[f>>2]|0)+144>>2]>>2]|0;if((b|0)==0){i=e;return}else{g=0;j=b}do{b=j+8|0;do{if((a[(c[b>>2]|0)+119|0]|0)==0){k=+wn();h[c[(c[b>>2]|0)+132>>2]>>3]=k;k=+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+8>>3]=k;if((c[53568]|0)>2){l=2}else{break}do{k=+wn();h[(c[(c[b>>2]|0)+132>>2]|0)+(l<<3)>>3]=k;l=l+1|0;}while((l|0)<(c[53568]|0))}}while(0);g=g+1|0;j=c[(c[(c[f>>2]|0)+144>>2]|0)+(g<<2)>>2]|0;}while((j|0)!=0);i=e;return}function yu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0.0,z=0,A=0,B=0;e=i;i=i+80|0;f=e|0;if((a[213992]|0)!=0){Ma(91336,25,1,c[o>>2]|0)|0;ym()}g=b+8|0;j=c[g>>2]|0;k=c[j+156>>2]|0;l=c[j+152>>2]|0;j=(d|0)>0;do{if(j){m=0;do{if((m|0)>0){n=l+(m<<2)|0;p=k+(m<<2)|0;q=0;do{r=+h[(c[n>>2]|0)+(q<<3)>>3];s=1.0/(r*r);t=c[(c[g>>2]|0)+144>>2]|0;u=uw(b,c[t+(m<<2)>>2]|0,c[t+(q<<2)>>2]|0,0,0)|0;if((u|0)==0){v=s}else{v=s*+h[(c[u+8>>2]|0)+128>>3]}h[(c[k+(q<<2)>>2]|0)+(m<<3)>>3]=v;h[(c[p>>2]|0)+(q<<3)>>3]=v;q=q+1|0;}while((q|0)<(m|0))}m=m+1|0;}while((m|0)<(d|0));if(!j){break}m=0;q=c[53568]|0;while(1){if((q|0)>0){p=0;while(1){h[(c[(c[(c[g>>2]|0)+160>>2]|0)+(m<<2)>>2]|0)+(p<<3)>>3]=0.0;n=p+1|0;u=c[53568]|0;if((n|0)<(u|0)){p=n}else{w=u;break}}}else{w=q}p=m+1|0;if((p|0)<(d|0)){m=p;q=w}else{break}}}}while(0);w=c[g>>2]|0;k=c[c[w+144>>2]>>2]|0;if((k|0)!=0){b=0;l=k;k=w;while(1){if(j){w=l+8|0;q=0;do{a:do{if((b|0)!=(q|0)){m=c[g>>2]|0;p=c[(c[w>>2]|0)+132>>2]|0;u=c[(c[(c[(c[m+144>>2]|0)+(q<<2)>>2]|0)+8>>2]|0)+132>>2]|0;n=c[53568]|0;t=(n|0)>0;if(t){x=0;y=0.0}else{break}do{v=+h[p+(x<<3)>>3]- +h[u+(x<<3)>>3];h[f+(x<<3)>>3]=v;y=y+v*v;x=x+1|0;}while((x|0)<(n|0));v=+T(y);if(t){z=0;A=m}else{break}while(1){s=+h[f+(z<<3)>>3];h[(c[(c[(c[A+164>>2]|0)+(b<<2)>>2]|0)+(q<<2)>>2]|0)+(z<<3)>>3]=+h[(c[(c[A+156>>2]|0)+(b<<2)>>2]|0)+(q<<3)>>3]*(s-s*+h[(c[(c[A+152>>2]|0)+(b<<2)>>2]|0)+(q<<3)>>3]/v);n=c[g>>2]|0;u=(c[(c[n+160>>2]|0)+(b<<2)>>2]|0)+(z<<3)|0;h[u>>3]=+h[(c[(c[(c[n+164>>2]|0)+(b<<2)>>2]|0)+(q<<2)>>2]|0)+(z<<3)>>3]+ +h[u>>3];u=z+1|0;if((u|0)>=(c[53568]|0)){break a}z=u;A=c[g>>2]|0}}}while(0);q=q+1|0;}while((q|0)<(d|0));B=c[g>>2]|0}else{B=k}q=b+1|0;w=c[(c[B+144>>2]|0)+(q<<2)>>2]|0;if((w|0)==0){break}else{b=q;l=w;k=B}}}if((a[213992]|0)==0){i=e;return}B=c[o>>2]|0;y=+zm();gc(B|0,86160,(B=i,i=i+8|0,h[B>>3]=y,B)|0)|0;i=B;i=e;return}function zu(b,d){b=b|0;d=d|0;var e=0,f=0.0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0.0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0.0,J=0;e=i;f=+h[21657];h[21656]=f*f;g=Au(b,d)|0;if((g|0)!=0){j=g;do{Bu(b,d,j);j=Au(b,d)|0;}while((j|0)!=0)}if((a[213992]|0)==0){k=b+8|0}else{j=c[o>>2]|0;g=d-1|0;l=b+8|0;if((g|0)>0){m=c[l>>2]|0;n=c[m+144>>2]|0;p=c[53568]|0;q=(p|0)>0;r=m+156|0;s=m+152|0;f=0.0;m=0;while(1){t=m+1|0;if((t|0)<(d|0)){u=c[(c[r>>2]|0)+(m<<2)>>2]|0;v=c[(c[s>>2]|0)+(m<<2)>>2]|0;w=(c[n+(m<<2)>>2]|0)+8|0;x=f;y=t;while(1){if(q){z=c[(c[w>>2]|0)+132>>2]|0;A=c[(c[(c[n+(y<<2)>>2]|0)+8>>2]|0)+132>>2]|0;B=0.0;C=0;while(1){D=+h[z+(C<<3)>>3]- +h[A+(C<<3)>>3];E=B+D*D;F=C+1|0;if((F|0)<(p|0)){B=E;C=F}else{G=E;break}}}else{G=0.0}B=+h[v+(y<<3)>>3];E=x+ +h[u+(y<<3)>>3]*(G+B*B-B*2.0*+T(G));C=y+1|0;if((C|0)<(d|0)){x=E;y=C}else{H=E;break}}}else{H=f}if((t|0)<(g|0)){f=H;m=t}else{I=H;break}}}else{I=0.0}gc(j|0,81416,(J=i,i=i+8|0,h[J>>3]=I,J)|0)|0;i=J;m=c[(c[l>>2]|0)+148>>2]|0;g=(m|0)==(c[53660]|0)?163488:213472;I=+zm();gc(j|0,167648,(J=i,i=i+24|0,c[J>>2]=m,c[J+8>>2]=g,h[J+16>>3]=I,J)|0)|0;i=J;k=l}l=c[(c[k>>2]|0)+148>>2]|0;if((l|0)!=(c[53660]|0)){i=e;return}k=$w(b|0)|0;Fv(0,154336,(J=i,i=i+16|0,c[J>>2]=l,c[J+8>>2]=k,J)|0)|0;i=J;i=e;return}function Au(b,e){b=b|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0.0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0;f=i;g=(c[45226]|0)+1|0;c[45226]=g;j=c[b+8>>2]|0;if((c[j+148>>2]|0)>=(c[53660]|0)){k=0;i=f;return k|0}if((e|0)>0){b=c[j+144>>2]|0;l=c[53568]|0;m=(l|0)>0;n=0;p=0.0;q=0;while(1){r=c[b+(n<<2)>>2]|0;do{if((d[(c[r+8>>2]|0)+119|0]|0)>>>0>1>>>0){s=q;t=p}else{if(m){u=c[(c[j+160>>2]|0)+(n<<2)>>2]|0;v=0;w=0.0;while(1){x=+h[u+(v<<3)>>3];y=w+x*x;z=v+1|0;if((z|0)<(l|0)){v=z;w=y}else{A=y;break}}}else{A=0.0}if(A<=p){s=q;t=p;break}s=r;t=A}}while(0);r=n+1|0;if((r|0)<(e|0)){n=r;p=t;q=s}else{B=t;C=s;break}}}else{B=0.0;C=0}if(B<+h[21656]){k=0;i=f;return k|0}if((a[213992]|0)==0){k=C;i=f;return k|0}if(((g|0)%100|0|0)!=0){k=C;i=f;return k|0}g=c[o>>2]|0;t=+T(B);gc(g|0,148240,(s=i,i=i+8|0,h[s>>3]=t,s)|0)|0;i=s;if(((c[45226]|0)%1e3|0|0)!=0){k=C;i=f;return k|0}Ka(10,g|0)|0;k=C;i=f;return k|0}function Bu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,p=0.0;e=i;f=d+8|0;g=c[(c[f>>2]|0)+120>>2]|0;j=c[44368]|0;if((j|0)==0){k=c[53568]|0;l=kk(da(k<<3,k)|0)|0}else{k=c[53568]|0;l=mk(j,da(k<<3,k)|0)|0}k=l;c[44368]=k;Du(a,b,g,k);k=c[53568]|0;if((k|0)>0){l=a+8|0;j=0;do{h[177312+(j<<3)>>3]=-0.0- +h[(c[(c[(c[l>>2]|0)+160>>2]|0)+(g<<2)>>2]|0)+(j<<3)>>3];j=j+1|0;}while((j|0)<(k|0))}gu(c[44368]|0,177392,177312,k);if((c[53568]|0)>0){k=0;do{m=+h[21674];n=m+ +wn()*(1.0-m)*2.0;j=177392+(k<<3)|0;m=+h[j>>3]*n;h[j>>3]=m;j=(c[(c[f>>2]|0)+132>>2]|0)+(k<<3)|0;h[j>>3]=+h[j>>3]+m;k=k+1|0;}while((k|0)<(c[53568]|0))}k=(c[a+8>>2]|0)+148|0;c[k>>2]=(c[k>>2]|0)+1;Cu(a,b,g);if((Xm()|0)==0){i=e;return}g=c[53568]|0;if((g|0)>0){b=0;m=0.0;while(1){n=m+ +S(+(+h[177392+(b<<3)>>3]));a=b+1|0;if((a|0)<(g|0)){b=a;m=n}else{p=n;break}}}else{p=0.0}m=+T(p);b=c[o>>2]|0;g=$w(d|0)|0;gc(b|0,142112,(b=i,i=i+16|0,c[b>>2]=g,h[b+8>>3]=m,b)|0)|0;i=b;i=e;return}function Cu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0.0;e=i;i=i+80|0;f=e|0;g=a+8|0;a=c[g>>2]|0;j=c[(c[a+144>>2]|0)+(d<<2)>>2]|0;k=c[53568]|0;a:do{if((k|0)>0){l=0;m=a;while(1){h[(c[(c[m+160>>2]|0)+(d<<2)>>2]|0)+(l<<3)>>3]=0.0;n=l+1|0;o=c[53568]|0;if((n|0)>=(o|0)){p=o;break a}l=n;m=c[g>>2]|0}}else{p=k}}while(0);if((b|0)<=0){i=e;return}k=j+8|0;j=0;a=p;while(1){b:do{if((j|0)==(d|0)){q=a}else{p=c[g>>2]|0;m=c[(c[k>>2]|0)+132>>2]|0;l=c[(c[(c[(c[p+144>>2]|0)+(j<<2)>>2]|0)+8>>2]|0)+132>>2]|0;n=(a|0)>0;if(n){r=0;s=0.0}else{q=a;break}do{t=+h[m+(r<<3)>>3]- +h[l+(r<<3)>>3];h[f+(r<<3)>>3]=t;s=s+t*t;r=r+1|0;}while((r|0)<(a|0));t=+T(s);if(n){u=0;v=p}else{q=a;break}while(1){w=+h[f+(u<<3)>>3];h[(c[(c[(c[v+164>>2]|0)+(d<<2)>>2]|0)+(j<<2)>>2]|0)+(u<<3)>>3]=+h[(c[(c[v+156>>2]|0)+(d<<2)>>2]|0)+(j<<3)>>3]*(w-w*+h[(c[(c[v+152>>2]|0)+(d<<2)>>2]|0)+(j<<3)>>3]/t);l=c[g>>2]|0;m=(c[(c[l+160>>2]|0)+(d<<2)>>2]|0)+(u<<3)|0;h[m>>3]=+h[(c[(c[(c[l+164>>2]|0)+(d<<2)>>2]|0)+(j<<2)>>2]|0)+(u<<3)>>3]+ +h[m>>3];m=c[(c[g>>2]|0)+164>>2]|0;l=(c[(c[m+(j<<2)>>2]|0)+(d<<2)>>2]|0)+(u<<3)|0;w=+h[l>>3];h[l>>3]=-0.0- +h[(c[(c[m+(d<<2)>>2]|0)+(j<<2)>>2]|0)+(u<<3)>>3];m=c[g>>2]|0;l=(c[(c[m+160>>2]|0)+(j<<2)>>2]|0)+(u<<3)|0;h[l>>3]=+h[(c[(c[(c[m+164>>2]|0)+(j<<2)>>2]|0)+(d<<2)>>2]|0)+(u<<3)>>3]-w+ +h[l>>3];l=u+1|0;m=c[53568]|0;if((l|0)>=(m|0)){q=m;break b}u=l;v=c[g>>2]|0}}}while(0);p=j+1|0;if((p|0)<(b|0)){j=p;a=q}else{break}}i=e;return}function Du(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;f=i;i=i+80|0;g=f|0;j=a+8|0;a=c[j>>2]|0;k=c[a+156>>2]|0;l=c[a+152>>2]|0;m=c[(c[a+144>>2]|0)+(d<<2)>>2]|0;a=c[53568]|0;if((a|0)>0){n=0;o=a;while(1){if((o|0)>0){p=0;q=o;while(1){h[e+((da(q,n)|0)+p<<3)>>3]=0.0;r=p+1|0;s=c[53568]|0;if((r|0)<(s|0)){p=r;q=s}else{t=s;break}}}else{t=o}q=n+1|0;if((q|0)<(t|0)){n=q;o=t}else{u=t;break}}}else{u=a}if((b|0)>0){a=k+(d<<2)|0;k=l+(d<<2)|0;l=m+8|0;m=0;t=u;o=u;while(1){do{if((m|0)==(d|0)){v=t;w=o}else{n=(t|0)>0;if(n){q=c[(c[l>>2]|0)+132>>2]|0;p=c[(c[(c[(c[(c[j>>2]|0)+144>>2]|0)+(m<<2)>>2]|0)+8>>2]|0)+132>>2]|0;s=0;x=0.0;while(1){y=+h[q+(s<<3)>>3]- +h[p+(s<<3)>>3];h[g+(s<<3)>>3]=y;z=x+y*y;r=s+1|0;if((r|0)<(t|0)){s=r;x=z}else{A=z;break}}}else{A=0.0}x=+T(A);z=1.0/(x*x*x);if(n){B=0;C=t;D=o}else{v=t;w=o;break}while(1){x=+h[(c[a>>2]|0)+(m<<3)>>3];y=+h[(c[k>>2]|0)+(m<<3)>>3];E=+h[g+(B<<3)>>3];if((B|0)>0){s=0;F=x;G=y;p=D;while(1){q=e+((da(p,s)|0)+B<<3)|0;h[q>>3]=+h[q>>3]+z*F*G*E*+h[g+(s<<3)>>3];q=s+1|0;H=+h[(c[a>>2]|0)+(m<<3)>>3];I=+h[(c[k>>2]|0)+(m<<3)>>3];r=c[53568]|0;if((q|0)<(B|0)){s=q;F=H;G=I;p=r}else{J=H;K=I;L=r;break}}}else{J=x;K=y;L=C}p=e+((da(L,B)|0)+B<<3)|0;h[p>>3]=+h[p>>3]+J*(1.0-z*K*(A-E*E));p=B+1|0;s=c[53568]|0;if((p|0)<(s|0)){B=p;C=s;D=s}else{v=s;w=s;break}}}}while(0);n=m+1|0;if((n|0)<(b|0)){m=n;t=v;o=w}else{M=v;N=w;break}}}else{M=u;N=u}if((M|0)>1){O=1;P=M;Q=N}else{i=f;return}while(1){if((O|0)>0){N=0;M=Q;while(1){h[e+((da(M,O)|0)+N<<3)>>3]=+h[e+((da(M,N)|0)+O<<3)>>3];u=N+1|0;w=c[53568]|0;if((u|0)<(O|0)){N=u;M=w}else{R=w;S=w;break}}}else{R=P;S=Q}M=O+1|0;if((M|0)<(R|0)){O=M;P=R;Q=S}else{break}}i=f;return}function Eu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;b=a+8|0;if((c[(c[b>>2]|0)+124>>2]|0)>=0){cc(139008,136472,645,170200)}d=c[53680]|0;c[53680]=d+1;c[(c[b>>2]|0)+124>>2]=d;c[(c[53682]|0)+(d<<2)>>2]=a;if((d|0)<=0){return}d=c[b>>2]|0;e=c[d+124>>2]|0;if((e|0)<=0){return}f=e-1|0;g=(f|0)/2|0;i=(c[53682]|0)+(g<<2)|0;j=c[i>>2]|0;k=j+8|0;if(+h[(c[k>>2]|0)+136>>3]>+h[d+136>>3]){l=e;m=f;n=g;o=i;p=j;q=k}else{return}while(1){c[o>>2]=a;c[(c[b>>2]|0)+124>>2]=n;c[(c[53682]|0)+(l<<2)>>2]=p;c[(c[q>>2]|0)+124>>2]=l;if((m|0)<=1){r=8;break}k=n-1|0;j=(k|0)/2|0;i=(c[53682]|0)+(j<<2)|0;g=c[i>>2]|0;f=g+8|0;if(+h[(c[f>>2]|0)+136>>3]>+h[(c[b>>2]|0)+136>>3]){l=n;m=k;n=j;o=i;p=g;q=f}else{r=8;break}}if((r|0)==8){return}}function Fu(){var a=0,b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0,r=0,s=0.0,t=0,u=0.0,v=0;a=c[53680]|0;if((a|0)==0){b=0;return b|0}d=c[53682]|0;e=c[d>>2]|0;f=a-1|0;c[53680]=f;a=c[d+(f<<2)>>2]|0;c[d>>2]=a;d=a+8|0;c[(c[d>>2]|0)+124>>2]=0;a:do{if((f|0)>1){g=c[(c[d>>2]|0)+124>>2]|0;i=g<<1|1;j=c[53680]|0;if((i|0)<(j|0)){k=g;l=i;m=j}else{break}while(1){j=l+1|0;i=c[53682]|0;if((j|0)<(m|0)){g=c[i+(j<<2)>>2]|0;n=+h[(c[g+8>>2]|0)+136>>3];o=c[i+(l<<2)>>2]|0;p=+h[(c[o+8>>2]|0)+136>>3];if(n<p){q=j;r=g;s=n}else{t=o;u=p;v=7}}else{o=c[i+(l<<2)>>2]|0;t=o;u=+h[(c[o+8>>2]|0)+136>>3];v=7}if((v|0)==7){v=0;q=l;r=t;s=u}if(+h[(c[d>>2]|0)+136>>3]<=s){break a}c[i+(q<<2)>>2]=a;c[(c[d>>2]|0)+124>>2]=q;c[(c[53682]|0)+(k<<2)>>2]=r;c[(c[r+8>>2]|0)+124>>2]=k;i=q<<1|1;o=c[53680]|0;if((i|0)<(o|0)){k=q;l=i;m=o}else{break}}}}while(0);c[(c[e+8>>2]|0)+124>>2]=-1;b=e;return b|0}function Gu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0;e=i;c[53682]=jk((d<<2)+4|0)|0;if((a[213992]|0)!=0){Ma(133632,28,1,c[o>>2]|0)|0;ym()}d=ux(b)|0;if((d|0)!=0){f=d;do{Hu(b,f);f=vx(b,f)|0;}while((f|0)!=0)}if((a[213992]|0)==0){g=c[53682]|0;j=g;eF(j);i=e;return}f=c[o>>2]|0;k=+zm();gc(f|0,86160,(f=i,i=i+8|0,h[f>>3]=k,f)|0)|0;i=f;g=c[53682]|0;j=g;eF(j);i=e;return}function Hu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;d=a+8|0;e=c[c[(c[d>>2]|0)+144>>2]>>2]|0;if((e|0)!=0){f=0;g=e;do{h[(c[g+8>>2]|0)+136>>3]=+h[21638];f=f+1|0;g=c[(c[(c[d>>2]|0)+144>>2]|0)+(f<<2)>>2]|0;}while((g|0)!=0)}c[53524]=b;g=b+8|0;h[(c[g>>2]|0)+136>>3]=0.0;c[(c[g>>2]|0)+128>>2]=0;Eu(c[53524]|0);g=Fu()|0;if((g|0)==0){return}else{i=g}do{g=c[53524]|0;if((i|0)!=(g|0)){b=c[i+8>>2]|0;j=+h[b+136>>3];f=c[(c[g+8>>2]|0)+120>>2]|0;g=c[b+120>>2]|0;h[(c[(c[(c[d>>2]|0)+152>>2]|0)+(g<<2)>>2]|0)+(f<<3)>>3]=j;h[(c[(c[(c[d>>2]|0)+152>>2]|0)+(f<<2)>>2]|0)+(g<<3)>>3]=j}g=rw(a,i)|0;if((g|0)!=0){f=i+8|0;b=g;do{g=c[b>>2]&3;e=c[((g|0)==3?b:b+32|0)+28>>2]|0;if((e|0)==(i|0)){k=c[((g|0)==2?b:b-32|0)+28>>2]|0}else{k=e}j=+h[(c[f>>2]|0)+136>>3]+ +h[(c[b+8>>2]|0)+136>>3];e=k+8|0;g=(c[e>>2]|0)+136|0;a:do{if(+h[g>>3]>j){h[g>>3]=j;l=c[e>>2]|0;m=c[l+124>>2]|0;if((m|0)<=-1){c[l+128>>2]=(c[(c[f>>2]|0)+128>>2]|0)+1;Eu(k);break}if((m|0)<=0){break}n=m-1|0;o=(n|0)/2|0;p=(c[53682]|0)+(o<<2)|0;q=c[p>>2]|0;r=q+8|0;if(+h[(c[r>>2]|0)+136>>3]>+h[l+136>>3]){s=m;t=n;u=o;v=p;w=q;x=r}else{break}while(1){c[v>>2]=k;c[(c[e>>2]|0)+124>>2]=u;c[(c[53682]|0)+(s<<2)>>2]=w;c[(c[x>>2]|0)+124>>2]=s;if((t|0)<=1){break a}r=u-1|0;q=(r|0)/2|0;p=(c[53682]|0)+(q<<2)|0;o=c[p>>2]|0;n=o+8|0;if(+h[(c[n>>2]|0)+136>>3]>+h[(c[e>>2]|0)+136>>3]){s=u;t=r;u=q;v=p;w=o;x=n}else{break}}}}while(0);b=sw(a,b,i)|0;}while((b|0)!=0)}i=Fu()|0;}while((i|0)!=0);return}function Iu(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;b=i;i=i+16|0;e=b|0;Tr();au();ks();c[53234]=Qc[d&3]()|0;ms();f=e|0;g=e+8|0;j=Qc[d&3]()|0;k=0.0;l=0.0;a:while(1){m=j+8|0;n=j|0;if((j|0)==0){o=3;break}else{p=k;q=l}while(1){if((gs()|0)==0){hs(e);r=+h[f>>3];s=+h[g>>3]}else{r=p;s=q}if((gs()|0)!=0){break}t=+h[m>>3];if(t<s){break}if(t==s){if(+h[n>>3]<r){break}}if((gs()|0)!=0){break a}u=is()|0;v=us(u)|0;w=ts(u)|0;x=ts(w)|0;y=vs(u)|0;z=ws(w)|0;A=c[u+20>>2]|0;du(A);Wr(c[u+8>>2]|0,a[u+16|0]|0,A);Wr(c[w+8>>2]|0,a[w+16|0]|0,A);ss(u);fs(w);ss(w);w=+h[y+8>>3]>+h[z+8>>3];u=w?z:y;B=Ur(u,w?y:z)|0;z=ns(B,w&1)|0;qs(v,z);Wr(B,w&1^1,A);eu(A);A=os(v,z)|0;if((A|0)!=0){fs(v);es(v,A,+cu(A,u))}A=os(z,x)|0;if((A|0)==0){p=r;q=s;continue}es(z,A,+cu(A,u));p=r;q=s}n=rs(j|0)|0;m=ts(n)|0;u=Ur(ws(n)|0,j)|0;A=ns(u,0)|0;qs(n,A);z=os(n,A)|0;if((z|0)!=0){fs(n);es(n,z,+cu(z,j))}z=ns(u,1)|0;qs(A,z);A=os(z,m)|0;if((A|0)!=0){es(z,A,+cu(A,j))}j=Qc[d&3]()|0;k=r;l=s}b:do{if((o|0)==3){while(1){o=0;if((gs()|0)==0){hs(e)}if((gs()|0)!=0){break b}d=is()|0;j=us(d)|0;g=ts(d)|0;f=ts(g)|0;A=vs(d)|0;z=ws(g)|0;m=c[d+20>>2]|0;du(m);Wr(c[d+8>>2]|0,a[d+16|0]|0,m);Wr(c[g+8>>2]|0,a[g+16|0]|0,m);ss(d);fs(g);ss(g);g=+h[A+8>>3]>+h[z+8>>3];d=g?z:A;u=Ur(d,g?A:z)|0;z=ns(u,g&1)|0;qs(j,z);Wr(u,g&1^1,m);eu(m);m=os(j,z)|0;if((m|0)!=0){fs(j);es(j,m,+cu(m,d))}m=os(z,f)|0;if((m|0)==0){o=3;continue}es(z,m,+cu(m,d));o=3}}}while(0);o=ts(c[53832]|0)|0;if((o|0)==(c[53830]|0)){i=b;return}else{C=o}do{Vr(c[C+8>>2]|0);C=ts(C)|0;}while((C|0)!=(c[53830]|0));i=b;return}function Ju(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,X=0.0,Y=0.0,Z=0,_=0,$=0.0,aa=0.0,ba=0,ca=0.0,ea=0.0,fa=0;e=i;i=i+8|0;f=e|0;if((Lw(b)|0)==1){g=(ux(b)|0)+8|0;h[c[(c[g>>2]|0)+132>>2]>>3]=0.0;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=0.0;j=d;i=e;return j|0}g=Lw(b)|0;k=da(g,g)|0;g=ux(b)|0;if((g|0)!=0){l=g;do{g=l+8|0;c[(c[(c[g>>2]|0)+112>>2]|0)+12>>2]=k;h[(c[(c[g>>2]|0)+112>>2]|0)+32>>3]=10.0;m=rw(b,l)|0;a:do{if((m|0)==0){n=11}else{p=m;q=0;b:while(1){r=c[p>>2]&3;s=c[((r|0)==3?p:p+32|0)+28>>2]|0;if((s|0)==(l|0)){t=c[((r|0)==2?p:p-32|0)+28>>2]|0}else{t=s}do{if((t|0)==(l|0)){u=q}else{if((q|0)==0){u=t;break}if((q|0)==(t|0)){u=q}else{break b}}}while(0);s=sw(b,p,l)|0;if((s|0)==0){n=11;break a}else{p=s;q=u}}c[c[(c[g>>2]|0)+112>>2]>>2]=k}}while(0);if((n|0)==11){n=0;c[c[(c[g>>2]|0)+112>>2]>>2]=0}l=vx(b,l)|0;}while((l|0)!=0)}do{if((d|0)==0){l=(Lw(b)|0)<3;k=ux(b)|0;if(l){v=k;break}if((k|0)!=0){l=k;do{if((c[c[(c[l+8>>2]|0)+112>>2]>>2]|0)==0){Mu(b,l,0)}l=vx(b,l)|0;}while((l|0)!=0)}l=ux(b)|0;if((l|0)==0){v=0;break}else{w=l;x=0;y=0}while(1){l=c[c[(c[w+8>>2]|0)+112>>2]>>2]|0;g=l>>>0>y>>>0;k=g?w:x;u=vx(b,w)|0;if((u|0)==0){v=k;break}else{w=u;x=k;y=g?l:y}}}else{v=d}}while(0);if((a[213992]|0)==0){z=v|0}else{d=c[o>>2]|0;y=v|0;x=$w(y)|0;gc(d|0,119768,(A=i,i=i+8|0,c[A>>2]=x,A)|0)|0;i=A;z=y}y=v+8|0;x=(c[(c[y>>2]|0)+112>>2]|0)+12|0;d=c[x>>2]|0;c[x>>2]=0;c[(c[(c[y>>2]|0)+112>>2]|0)+16>>2]=0;x=Wv(b,2,97008,0)|0;w=jk(8)|0;l=w;c[w>>2]=z;c:do{if((w|0)!=0){z=(x|0)==0;g=l;k=l;while(1){u=c[k>>2]|0;t=c[k+4>>2]|0;eF(k);m=u;if((u|0)==0){break c}q=(t|0)==0?0:g;p=u+8|0;u=(c[(c[(c[p>>2]|0)+112>>2]|0)+12>>2]|0)+1|0;s=rw(b,m)|0;d:do{if((s|0)==0){B=q;C=t}else{if(z){r=q;D=t;E=s;while(1){F=c[E>>2]&3;G=c[((F|0)==3?E:E+32|0)+28>>2]|0;if((G|0)==(m|0)){H=c[((F|0)==2?E:E-32|0)+28>>2]|0}else{H=G}G=H+8|0;F=(c[(c[G>>2]|0)+112>>2]|0)+12|0;do{if(u>>>0<(c[F>>2]|0)>>>0){c[F>>2]=u;c[(c[(c[G>>2]|0)+112>>2]|0)+16>>2]=m;I=(c[(c[p>>2]|0)+112>>2]|0)+8|0;c[I>>2]=(c[I>>2]|0)+1;I=jk(8)|0;J=I;c[I>>2]=H;if((r|0)==0){K=J;L=J;break}c[r+4>>2]=J;K=D;L=J}else{K=D;L=r}}while(0);G=sw(b,E,m)|0;if((G|0)==0){B=L;C=K;break d}else{r=L;D=K;E=G}}}else{M=q;N=t;O=s}while(1){E=O|0;if((a[fw(E,x)|0]|0)==48){if((Ya(fw(E,x)|0,91552)|0)==0){P=N;Q=M}else{n=39}}else{n=39}do{if((n|0)==39){n=0;E=c[O>>2]&3;D=c[((E|0)==3?O:O+32|0)+28>>2]|0;if((D|0)==(m|0)){R=c[((E|0)==2?O:O-32|0)+28>>2]|0}else{R=D}D=R+8|0;E=(c[(c[D>>2]|0)+112>>2]|0)+12|0;if(u>>>0>=(c[E>>2]|0)>>>0){P=N;Q=M;break}c[E>>2]=u;c[(c[(c[D>>2]|0)+112>>2]|0)+16>>2]=m;D=(c[(c[p>>2]|0)+112>>2]|0)+8|0;c[D>>2]=(c[D>>2]|0)+1;D=jk(8)|0;E=D;c[D>>2]=R;if((M|0)==0){P=E;Q=E;break}c[M+4>>2]=E;P=N;Q=E}}while(0);E=sw(b,O,m)|0;if((E|0)==0){B=Q;C=P;break}else{M=Q;N=P;O=E}}}}while(0);if((C|0)==0){break}else{g=B;k=C}}}}while(0);C=ux(b)|0;do{if((C|0)==0){S=0}else{B=C;O=0;while(1){P=c[(c[(c[B+8>>2]|0)+112>>2]|0)+12>>2]|0;if((P|0)==(d|0)){break}T=P>>>0>O>>>0?P:O;P=vx(b,B)|0;if((P|0)==0){n=48;break}else{B=P;O=T}}if((n|0)==48){if((T|0)>=0){S=T;break}}Fv(1,157624,(A=i,i=i+1|0,i=i+7&-8,c[A>>2]=0,A)|0)|0;i=A;j=v;i=e;return j|0}}while(0);T=ux(b)|0;if((T|0)!=0){n=T;do{T=n+8|0;d=c[(c[T>>2]|0)+112>>2]|0;do{if((c[d+8>>2]|0)==0){C=d+4|0;c[C>>2]=(c[C>>2]|0)+1;C=c[(c[(c[T>>2]|0)+112>>2]|0)+16>>2]|0;if((C|0)==0){break}else{U=C}do{C=U+8|0;O=(c[(c[C>>2]|0)+112>>2]|0)+4|0;c[O>>2]=(c[O>>2]|0)+1;U=c[(c[(c[C>>2]|0)+112>>2]|0)+16>>2]|0;}while((U|0)!=0)}}while(0);n=vx(b,n)|0;}while((n|0)!=0)}h[(c[(c[y>>2]|0)+112>>2]|0)+24>>3]=6.283185307179586;Lu(b,v);h[(c[(c[y>>2]|0)+112>>2]|0)+32>>3]=0.0;Ku(b,v);y=jk((S<<3)+8|0)|0;n=y;U=Hm(b|0,Wv(c[b+48>>2]|0,0,102688,0)|0,0)|0;e:do{if((U|0)==0){X=1.0;Y=0.0;Z=1}else{if((S|0)<1){X=0.0;Y=0.0;Z=1;break}else{_=1;$=0.0;aa=0.0;ba=U}while(1){ca=+sF(ba,f);if(ca<=0.0){X=aa;Y=$;Z=_;break e}ea=ca>.02?ca:.02;ca=$+ea;T=_+1|0;h[n+(_<<3)>>3]=ca;d=c[f>>2]|0;C=a[d]|0;f:do{if(C<<24>>24==0){fa=d}else{O=d;B=C;while(1){P=O+1|0;if(!((Qa(B<<24>>24|0)|0)!=0|B<<24>>24==58)){fa=O;break f}N=a[P]|0;if(N<<24>>24==0){fa=P;break}else{O=P;B=N}}}}while(0);if((_|0)<(S|0)){_=T;$=ca;aa=ea;ba=fa}else{X=ea;Y=ca;Z=T;break}}}}while(0);if((Z|0)<=(S|0)){fa=Z;aa=Y;while(1){Y=X+aa;h[n+(fa<<3)>>3]=Y;if((fa|0)<(S|0)){fa=fa+1|0;aa=Y}else{break}}}if((a[213992]|0)!=0){fa=c[o>>2]|0;Ma(127712,18,1,fa|0)|0;Z=0;while(1){gc(fa|0,115384,(A=i,i=i+8|0,h[A>>3]=+h[n+(Z<<3)>>3],A)|0)|0;i=A;if((Z|0)<(S|0)){Z=Z+1|0}else{break}}Ka(10,fa|0)|0}fa=ux(b)|0;if((fa|0)!=0){Z=fa;do{fa=Z+8|0;S=c[fa>>2]|0;A=c[S+112>>2]|0;aa=+h[n+(c[A+12>>2]<<3)>>3];X=aa*+V(+h[A+32>>3]);h[c[S+132>>2]>>3]=X;S=c[fa>>2]|0;X=aa*+W(+h[(c[S+112>>2]|0)+32>>3]);h[(c[S+132>>2]|0)+8>>3]=X;Z=vx(b,Z)|0;}while((Z|0)!=0)}eF(y);j=v;i=e;return j|0}function Ku(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,g=0.0,i=0,j=0,k=0,l=0.0;d=c[(c[b+8>>2]|0)+112>>2]|0;if((c[d+16>>2]|0)==0){e=0.0}else{e=+h[d+32>>3]- +h[d+24>>3]*.5}d=rw(a,b)|0;if((d|0)==0){return}else{f=d;g=e}while(1){d=c[f>>2]&3;i=c[((d|0)==3?f:f+32|0)+28>>2]|0;if((i|0)==(b|0)){j=c[((d|0)==2?f:f-32|0)+28>>2]|0}else{j=i}i=j+8|0;d=c[(c[i>>2]|0)+112>>2]|0;do{if((c[d+16>>2]|0)==(b|0)){k=d+32|0;if(+h[k>>3]!=10.0){l=g;break}h[k>>3]=g+ +h[d+24>>3]*.5;k=c[(c[i>>2]|0)+112>>2]|0;e=g+ +h[k+24>>3];if((c[k+8>>2]|0)==0){l=e;break}Ku(a,j);l=e}else{l=g}}while(0);i=sw(a,f,b)|0;if((i|0)==0){break}else{f=i;g=l}}return}function Lu(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0,g=0,i=0,j=0;d=c[(c[b+8>>2]|0)+112>>2]|0;e=+h[d+24>>3]/+((c[d+4>>2]|0)>>>0>>>0);d=rw(a,b)|0;if((d|0)==0){return}else{f=d}do{d=c[f>>2]&3;g=c[((d|0)==3?f:f+32|0)+28>>2]|0;if((g|0)==(b|0)){i=c[((d|0)==2?f:f-32|0)+28>>2]|0}else{i=g}g=i+8|0;d=c[(c[g>>2]|0)+112>>2]|0;do{if((c[d+16>>2]|0)==(b|0)){j=d+24|0;if(+h[j>>3]!=0.0){break}h[j>>3]=e*+((c[d+4>>2]|0)>>>0>>>0);if((c[(c[(c[g>>2]|0)+112>>2]|0)+8>>2]|0)==0){break}Lu(a,i)}}while(0);f=sw(a,f,b)|0;}while((f|0)!=0);return}function Mu(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=(c[c[(c[b+8>>2]|0)+112>>2]>>2]|0)+1|0;f=rw(a,b)|0;if((f|0)==0){return}else{g=f}do{f=c[g>>2]&3;h=c[((f|0)==3?g:g+32|0)+28>>2]|0;if((h|0)==(b|0)){i=c[((f|0)==2?g:g-32|0)+28>>2]|0}else{i=h}do{if((i|0)!=(d|0)){h=c[(c[i+8>>2]|0)+112>>2]|0;if(e>>>0>=(c[h>>2]|0)>>>0){break}c[h>>2]=e;Mu(a,i,b)}}while(0);g=sw(a,g,b)|0;}while((g|0)!=0);return}function Nu(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0.0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;e=Lw(a)|0;f=jk(e*40|0)|0;g=jk((e<<2)+4|0)|0;c[(c[d>>2]|0)+144>>2]=g;g=ux(a)|0;if((g|0)!=0){e=0;i=g;while(1){qt(i);c[(c[i+8>>2]|0)+112>>2]=f+(e*40|0);c[(c[(c[d>>2]|0)+144>>2]|0)+(e<<2)>>2]=i;g=vx(a,i)|0;if((g|0)==0){break}else{e=e+1|0;i=g}}}i=ux(a)|0;if((i|0)==0){return}else{j=i}do{i=mw(a,j)|0;if((i|0)!=0){e=i;do{i=e|0;Wx(i,92664,176,1)|0;Zm(e)|0;k=+Fm(i,c[53750]|0,1.0,0.0);h[(c[e+8>>2]|0)+128>>3]=k;e=ow(a,e)|0;}while((e|0)!=0)}j=vx(a,j)|0;}while((j|0)!=0);return}function Ou(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=i;i=i+56|0;e=d|0;f=d+16|0;g=d+24|0;if((Lw(b)|0)==0){i=d;return}Nu(b);j=b|0;ew(j,108264)|0;k=ew(j,108264)|0;do{if((k|0)==0){l=0;m=0}else{if((a[k]|0)==0){l=0;m=1;break}n=Ax(b,k,0)|0;if((n|0)!=0){l=n;m=0;break}Fv(0,148416,(p=i,i=i+8|0,c[p>>2]=k,p)|0)|0;i=p;Fv(3,120912,(p=i,i=i+1|0,i=i+7&-8,c[p>>2]=0,p)|0)|0;i=p;l=0;m=1}}while(0);k=ew(j,112160)|0;do{if((k|0)==0){q=0}else{if((a[k]|0)==0){q=0;break}n=e|0;r=e+8|0;s=ac(k|0,105200,(p=i,i=i+16|0,c[p>>2]=n,c[p+8>>2]=r,p)|0)|0;i=p;if((s|0)==0){q=0;break}else if((s|0)==1){h[r>>3]=+h[n>>3]}if((a[213992]|0)==0){q=1;break}t=+h[r>>3];gc(c[o>>2]|0,99120,(p=i,i=i+16|0,h[p>>3]=+h[n>>3],h[p+8>>3]=t,p)|0)|0;i=p;q=1}}while(0);if((Lw(b)|0)==0){u=l}else{p=iv(b,f,0)|0;if((c[f>>2]|0)==1){k=Ju(b,l)|0;n=(m|0)!=0&(l|0)==0?k:l;r=(ux(b)|0)+8|0;eF(c[(c[r>>2]|0)+112>>2]|0);c[(c[r>>2]|0)+112>>2]=0;do{if((q|0)!=0){t=+h[e>>3];v=+h[e+8>>3];r=c[(c[k+8>>2]|0)+132>>2]|0;w=+h[r>>3];x=+h[r+8>>3];r=ux(b)|0;if((r|0)==0){break}else{y=r}do{if((y|0)!=(k|0)){r=y+8|0;s=c[(c[r>>2]|0)+132>>2]|0;h[s>>3]=w+t*(+h[s>>3]-w);s=(c[(c[r>>2]|0)+132>>2]|0)+8|0;h[s>>3]=x+v*(+h[s>>3]-x)}y=vx(b,y)|0;}while((y|0)!=0)}}while(0);nr(b)|0;Pt(b);z=n}else{tv(b,2,8,g)|0;c[g+12>>2]=0;if((c[f>>2]|0)>0){n=(q|0)==0;q=e|0;y=e+8|0;if((m|0)==0){e=0;while(1){k=c[p+(e<<2)>>2]|0;if((l|0)==0){A=24}else{if((Rx(k,l|0)|0)==0){A=24}else{B=l}}if((A|0)==24){A=0;B=0}jv(k)|0;s=Ju(k,B)|0;do{if(!n){x=+h[q>>3];v=+h[y>>3];r=c[(c[s+8>>2]|0)+132>>2]|0;w=+h[r>>3];t=+h[r+8>>3];r=ux(k)|0;if((r|0)==0){break}else{C=r}do{if((C|0)!=(s|0)){r=C+8|0;D=c[(c[r>>2]|0)+132>>2]|0;h[D>>3]=w+x*(+h[D>>3]-w);D=(c[(c[r>>2]|0)+132>>2]|0)+8|0;h[D>>3]=t+v*(+h[D>>3]-t)}C=vx(k,C)|0;}while((C|0)!=0)}}while(0);nr(k)|0;s=e+1|0;if((s|0)<(c[f>>2]|0)){e=s}else{E=l;break}}}else{e=l;C=0;while(1){B=c[p+(C<<2)>>2]|0;s=(e|0)!=0;if(s){if((Rx(B,e|0)|0)==0){A=33}else{F=e}}else{A=33}if((A|0)==33){A=0;F=0}jv(B)|0;D=Ju(B,F)|0;r=s?e:D;do{if(!n){t=+h[q>>3];v=+h[y>>3];s=c[(c[D+8>>2]|0)+132>>2]|0;w=+h[s>>3];x=+h[s+8>>3];s=ux(B)|0;if((s|0)==0){break}else{G=s}do{if((G|0)!=(D|0)){s=G+8|0;H=c[(c[s>>2]|0)+132>>2]|0;h[H>>3]=w+t*(+h[H>>3]-w);H=(c[(c[s>>2]|0)+132>>2]|0)+8|0;h[H>>3]=x+v*(+h[H>>3]-x)}G=vx(B,G)|0;}while((G|0)!=0)}}while(0);nr(B)|0;D=C+1|0;if((D|0)<(c[f>>2]|0)){e=r;C=D}else{E=r;break}}}}else{E=l}l=(ux(b)|0)+8|0;eF(c[(c[l>>2]|0)+112>>2]|0);c[(c[l>>2]|0)+112>>2]=0;sv(c[f>>2]|0,p,b,g)|0;Pt(b);z=E}if((c[f>>2]|0)>0){E=0;do{Gx(b,c[p+(E<<2)>>2]|0)|0;E=E+1|0;}while((E|0)<(c[f>>2]|0))}eF(p);u=z}if((m|0)!=0){gw(j,108264,$w(u|0)|0)|0}Xk(b);i=d;return}function Pu(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)==0){return}else{d=b}do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0);eF(c[(c[a+8>>2]|0)+144>>2]|0);if((Ix(a|0)|0)==(a|0)){return}_x(a,0,98352);return}function Qu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0.0;b=i;i=i+32|0;d=b|0;e=Wv(a,1,119608,0)|0;f=Wv(a,0,119608,0)|0;g=Ru(a,f,e,Wv(a,0,157512,0)|0)|0;j=+T(+h[g>>3]+.1);_u(d,0.0,0.0,j,j);a=g+16|0;e=d;c[a>>2]=c[e>>2];c[a+4>>2]=c[e+4>>2];c[a+8>>2]=c[e+8>>2];c[a+12>>2]=c[e+12>>2];c[a+16>>2]=c[e+16>>2];c[a+20>>2]=c[e+20>>2];c[a+24>>2]=c[e+24>>2];c[a+28>>2]=c[e+28>>2];Su(g);Tu(g);Uu(g);i=b;return}function Ru(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0.0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0.0;f=jk(72)|0;g=f;c[f+60>>2]=0;i=f+56|0;c[i>>2]=a;j=a+8|0;k=c[j>>2]|0;if((c[k+172>>2]|0)<1){l=0;m=0;n=0;o=0.0}else{p=0;q=0;r=1;s=0;t=0.0;u=k;while(1){k=Ru(c[(c[u+176>>2]|0)+(r<<2)>>2]|0,b,d,e)|0;v=s+1|0;w=t+ +h[k>>3];x=(p|0)==0?k:p;if((q|0)!=0){c[q+52>>2]=k}y=c[j>>2]|0;if((r|0)<(c[y+172>>2]|0)){p=x;q=k;r=r+1|0;s=v;t=w;u=y}else{l=x;m=k;n=v;o=w;break}}}u=ux(a)|0;if((u|0)==0){z=l;A=n;B=o}else{s=u;u=l;l=m;m=n;t=o;while(1){n=s+8|0;if((c[c[(c[n>>2]|0)+112>>2]>>2]|0)==0){r=jk(72)|0;q=r;o=+Fm(s|0,d,1.0,0.0);w=o==0.0?1.0e3:o*1.0e3;h[r>>3]=w;c[r+60>>2]=1;c[r+56>>2]=s;if((l|0)!=0){c[l+52>>2]=q}c[c[(c[n>>2]|0)+112>>2]>>2]=a;C=t+w;D=m+1|0;E=q;F=(u|0)==0?q:u}else{C=t;D=m;E=l;F=u}q=vx(a,s)|0;if((q|0)==0){z=F;A=D;B=C;break}else{s=q;u=F;l=E;m=D;t=C}}}c[f+64>>2]=A;if((A|0)==0){C=+Fm(a|0,b,1.0,0.0);h[f>>3]=C==0.0?1.0e3:C*1.0e3;G=f+48|0;H=G;c[H>>2]=z;return g|0}b=f+8|0;h[b>>3]=B;B=+Fm(c[i>>2]|0,e,0.0,0.0);if(B==0.0){I=+h[b>>3]}else{C=B*2.0+ +T(+h[b>>3]);I=C*C}h[f>>3]=I;G=f+48|0;H=G;c[H>>2]=z;return g|0}function Su(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0.0,A=0,B=0;d=i;i=i+32|0;e=d|0;f=c[b+64>>2]|0;if((f|0)==0){i=d;return}g=jk(f<<2)|0;j=g;k=b+48|0;l=(f|0)>0;if(l){m=0;n=k;while(1){p=c[n>>2]|0;c[j+(m<<2)>>2]=p;q=m+1|0;if((q|0)<(f|0)){m=q;n=p+52|0}else{break}}}Jb(g|0,f|0,4,80);n=jk(f<<3)|0;m=n;if(l){p=0;do{h[m+(p<<3)>>3]=+h[c[j+(p<<2)>>2]>>3];p=p+1|0;}while((p|0)<(f|0))}r=+h[b+8>>3];if(+h[b>>3]==r){s=Zu(f,m,b+16|0)|0}else{t=+h[b+40>>3];u=+h[b+32>>3];h[e>>3]=+h[b+16>>3];h[e+8>>3]=+h[b+24>>3];v=t-u;w=(t+u- +T(v*v+r*4.0))*.5;h[e+16>>3]=u-w;h[e+24>>3]=t-w;s=Zu(f,m,e)|0}if((a[213992]|0)!=0){w=+h[b+24>>3];t=+h[b+32>>3];u=+h[b+40>>3];gc(c[o>>2]|0,108224,(x=i,i=i+32|0,h[x>>3]=+h[b+16>>3],h[x+8>>3]=w,h[x+16>>3]=t,h[x+24>>3]=u,x)|0)|0;i=x}if(!l){eF(g);eF(n);eF(s);i=d;return}b=c[o>>2]|0;e=0;do{p=s+(e<<5)|0;q=(c[j+(e<<2)>>2]|0)+16|0;y=p;c[q>>2]=c[y>>2];c[q+4>>2]=c[y+4>>2];c[q+8>>2]=c[y+8>>2];c[q+12>>2]=c[y+12>>2];c[q+16>>2]=c[y+16>>2];c[q+20>>2]=c[y+20>>2];c[q+24>>2]=c[y+24>>2];c[q+28>>2]=c[y+28>>2];if((a[213992]|0)!=0){u=+h[p>>3];t=+h[s+(e<<5)+16>>3];w=t*.5;r=+h[s+(e<<5)+8>>3];v=+h[s+(e<<5)+24>>3];z=v*.5;gc(b|0,102600,(x=i,i=i+80|0,h[x>>3]=+h[m+(e<<3)>>3],h[x+8>>3]=u-w,h[x+16>>3]=r-z,h[x+24>>3]=u+w,h[x+32>>3]=r+z,h[x+40>>3]=t*v,h[x+48>>3]=u,h[x+56>>3]=r,h[x+64>>3]=t,h[x+72>>3]=v,x)|0)|0;i=x}e=e+1|0;}while((e|0)<(f|0));eF(g);eF(n);eF(s);if(l){A=0;B=k}else{i=d;return}while(1){k=c[B>>2]|0;if((c[k+60>>2]|0)==0){Su(k)}l=A+1|0;if((l|0)<(f|0)){A=l;B=k+52|0}else{break}}i=d;return}function Tu(b){b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,p=0;d=i;i=i+40|0;e=d|0;if((c[b+60>>2]|0)==0){f=c[b+48>>2]|0;if((f|0)!=0){g=f;do{Tu(g);g=c[g+52>>2]|0;}while((g|0)!=0)}j=+h[b+32>>3];k=+h[b+40>>3];l=+h[b+16>>3]-j*.5;m=+h[b+24>>3]-k*.5;g=c[(c[b+56>>2]|0)+8>>2]|0;h[g+16>>3]=l;h[g+24>>3]=m;h[g+32>>3]=j+l;h[g+40>>3]=k+m;i=d;return}m=+h[b+24>>3];k=+h[b+32>>3];l=+h[b+40>>3];g=c[b+56>>2]|0;f=g+8|0;n=c[f>>2]|0;h[n+16>>3]=+h[b+16>>3];h[n+24>>3]=m;h[(c[f>>2]|0)+32>>3]=k/72.0;h[(c[f>>2]|0)+40>>3]=l/72.0;n=g|0;vn(g,c[(c[(Hx(n)|0)+8>>2]|0)+116>>2]&1);b=e|0;e=c[53624]|0;do{if((e|0)!=0){if((a[fw(n,e)|0]|0)!=0){break}nb(b|0,115344,(p=i,i=i+8|0,h[p>>3]=+h[(c[f>>2]|0)+80>>3]*.7,p)|0)|0;i=p;hw(n,c[53624]|0,b)|0}}while(0);Ym(g);if((a[213992]|0)==0){i=d;return}g=c[o>>2]|0;b=$w(n)|0;n=c[f>>2]|0;l=+h[n+16>>3];k=+h[n+24>>3];m=+h[n+80>>3];j=+h[n+88>>3]+ +h[n+96>>3];gc(g|0,127608,(p=i,i=i+40|0,c[p>>2]=b,h[p+8>>3]=l,h[p+16>>3]=k,h[p+24>>3]=m,h[p+32>>3]=j,p)|0)|0;i=p;i=d;return}function Uu(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=c[a+64>>2]|0;if((b|0)<=0){d=a;eF(d);return}e=0;f=a+48|0;while(1){g=c[f>>2]|0;Uu(g);h=e+1|0;if((h|0)<(b|0)){e=h;f=g+52|0}else{break}}d=a;eF(d);return}function Vu(a,b){a=a|0;b=b|0;var d=0.0,e=0;d=+h[c[a>>2]>>3]- +h[c[b>>2]>>3];if(d<0.0){e=1;return e|0}e=(d>0.0)<<31>>31;return e|0}function Wu(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;c[53590]=Wv(a,1,142256,119360)|0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;Yu(a,0);e=jk((Lw(a)|0)<<2)|0;f=jk(((Lw(a)|0)<<2)+4|0)|0;c[(c[d>>2]|0)+144>>2]=f;f=ux(a)|0;if((f|0)!=0){g=0;h=f;while(1){f=h|0;Wx(f,110896,304,1)|0;c[(c[h+8>>2]|0)+112>>2]=e+(g<<2);i=g+1|0;c[(c[(c[d>>2]|0)+144>>2]|0)+(g<<2)>>2]=h;gw(f,142256,119360)|0;f=mw(a,h)|0;if((f|0)!=0){j=f;do{Wx(j|0,109720,304,1)|0;j=ow(a,j)|0;}while((j|0)!=0)}j=vx(a,h)|0;if((j|0)==0){break}else{g=i;h=j}}}do{if((Lw(a)|0)==0){if((c[(c[d>>2]|0)+172>>2]|0)!=0){break}return}}while(0);Qu(a);Xk(a);return}function Xu(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)==0){return}eF(c[(c[b+8>>2]|0)+112>>2]|0);d=b;do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0);eF(c[(c[a+8>>2]|0)+144>>2]|0);if((Ix(a|0)|0)==(a|0)){return}_x(a,0,96984);return}function Yu(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d|0;f=(b|0)==0;if(f){c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;g=e}else{g=b}b=sy(a)|0;if((b|0)!=0){h=g+8|0;j=g+4|0;k=g|0;l=b;do{b=l|0;if((Za($w(b)|0,103864,7)|0)==0){Wx(b,96984,272,1)|0;b=(c[h>>2]|0)+1|0;c[h>>2]=b;m=c[j>>2]|0;if((b|0)<(m|0)){n=b;o=c[k>>2]|0}else{b=m+10|0;c[j>>2]=b;m=mk(c[k>>2]|0,b<<2)|0;c[k>>2]=m;n=c[h>>2]|0;o=m}c[o+(n<<2)>>2]=l;Yu(l,0)}else{Yu(l,g)}l=ty(l)|0;}while((l|0)!=0)}if(!f){i=d;return}f=e+8|0;l=a+8|0;c[(c[l>>2]|0)+172>>2]=c[f>>2];a=c[f>>2]|0;if((a|0)==0){i=d;return}f=mk(c[e>>2]|0,(a<<2)+4|0)|0;c[(c[l>>2]|0)+176>>2]=f;i=d;return}function Zu(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,l=0.0,m=0.0,n=0,p=0.0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0;g=i;j=f;f=i;i=i+32|0;tF(f,j,32)|0;if((b|0)>0){l=0.0;j=0;while(1){m=l+ +h[e+(j<<3)>>3];n=j+1|0;if((n|0)<(b|0)){l=m;j=n}else{p=m;break}}}else{p=0.0}l=+h[f+16>>3];m=+h[f+24>>3];if(p>l*m+.001){q=0;i=g;return q|0}j=jk(b<<5)|0;if((b|0)<1){q=j;i=g;return q|0}n=f+8|0;r=f|0;p=(c[k>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,c[k+4>>2]=d[n+4|0]|d[n+5|0]<<8|d[n+6|0]<<16|d[n+7|0]<<24,+h[k>>3]);n=c[o>>2]|0;f=b;b=e;e=j;s=1.0;t=l;u=m;v=l<m?l:m;w=(c[k>>2]=d[r]|d[r+1|0]<<8|d[r+2|0]<<16|d[r+3|0]<<24,c[k+4>>2]=d[r+4|0]|d[r+5|0]<<8|d[r+6|0]<<16|d[r+7|0]<<24,+h[k>>3]);x=p;p=l;l=m;while(1){m=t<u?t:u;r=0;y=0.0;z=s;A=0.0;B=1.0;C=v;while(1){if((a[213992]|0)!=0){gc(n|0,159552,(D=i,i=i+32|0,h[D>>3]=w,h[D+8>>3]=t,h[D+16>>3]=x,h[D+24>>3]=u,D)|0)|0;i=D;gc(n|0,163216,(D=i,i=i+8|0,c[D>>2]=r,D)|0)|0;i=D}if((r|0)==0){E=+h[b>>3];F=C*C;G=E/F;H=F/E;r=1;y=E;z=E;A=E;B=G>H?G:H;C=m;continue}if((r|0)>=(f|0)){break}H=+h[b+(r<<3)>>3];G=H<y?y:H;E=H>z?z:H;F=A+H;H=F/C;I=H/(E/H);J=G/H/H;H=I>J?I:J;if(H>B){break}r=r+1|0;y=G;z=E;A=F;B=H;C=m}m=A/C;if((a[213992]|0)!=0){gc(n|0,131176,(D=i,i=i+32|0,c[D>>2]=r,h[D+8>>3]=A,h[D+16>>3]=C,h[D+24>>3]=m,D)|0)|0;i=D}K=(r|0)>0;if(C==t){if(K){B=m*.5;z=l*.5+x-B;L=0;y=w-t*.5;while(1){h[e+(L<<5)+24>>3]=m;H=+h[b+(L<<3)>>3]/m;h[e+(L<<5)+16>>3]=H;h[e+(L<<5)+8>>3]=z;h[e+(L<<5)>>3]=y+H*.5;M=L+1|0;if((M|0)<(r|0)){L=M;y=y+H}else{N=l;O=p;P=B;break}}}else{N=u;O=t;P=m*.5}B=N-m;Q=O;R=B;S=w;T=x-P;U=p;V=B}else{if(K){B=m*.5;y=w-p*.5+B;L=0;z=x+u*.5;while(1){h[e+(L<<5)+16>>3]=m;C=+h[b+(L<<3)>>3]/m;h[e+(L<<5)+24>>3]=C;h[e+(L<<5)>>3]=y;h[e+(L<<5)+8>>3]=z-C*.5;M=L+1|0;if((M|0)<(r|0)){L=M;z=z-C}else{W=p;X=l;Y=B;break}}}else{W=t;X=u;Y=m*.5}B=W-m;Q=B;R=X;S=w+Y;T=x;U=B;V=l}L=f-r|0;if((L|0)<1){q=j;break}else{f=L;b=b+(r<<3)|0;e=e+(r<<5)|0;s=0.0;t=Q;u=R;v=Q<R?Q:R;w=S;x=T;p=U;l=V}}i=g;return q|0}function _u(a,b,c,d,e){a=a|0;b=+b;c=+c;d=+d;e=+e;h[a>>3]=b;h[a+8>>3]=c;h[a+16>>3]=d;h[a+24>>3]=e;return}function $u(a){a=a|0;var d=0,e=0,f=0,g=0;qn(a,2);d=a+8|0;b[(c[d>>2]|0)+168>>1]=2;c[53568]=2;e=ux(a)|0;if((e|0)!=0){f=e;do{qt(f);f=vx(a,f)|0;}while((f|0)!=0)}f=ux(a)|0;if((f|0)!=0){e=f;do{f=mw(a,e)|0;if((f|0)!=0){g=f;do{Wx(g|0,81536,176,1)|0;Zm(g)|0;g=ow(a,g)|0;}while((g|0)!=0)}e=vx(a,e)|0;}while((e|0)!=0)}av(a,0);bv(a,0);cv(a,0);e=c[d>>2]|0;if((c[(c[e+8>>2]|0)+84>>2]|0)==0){d=b[e+128>>1]&14;if((d|0)==0){Xk(a);return}Lt(a,d)|0;Xk(a);return}else{d=ux(a)|0;if((d|0)!=0){e=d;do{d=e+8|0;g=c[d>>2]|0;h[c[g+132>>2]>>3]=+h[g+16>>3]/72.0;g=c[d>>2]|0;h[(c[g+132>>2]|0)+8>>3]=+h[g+24>>3]/72.0;e=vx(a,e)|0;}while((e|0)!=0)}Nt(a);Xk(a);return}}function av(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+16|0;e=d|0;f=(b|0)==0;if(f){c[e>>2]=0;c[e+4>>2]=0;c[e+8>>2]=0;g=e}else{g=b}b=sy(a)|0;if((b|0)!=0){h=g+8|0;j=g+4|0;k=g|0;l=b;do{b=l|0;if((Za($w(b)|0,91512,7)|0)==0){Wx(b,86256,272,1)|0;Rj(l);b=(c[h>>2]|0)+1|0;c[h>>2]=b;m=c[j>>2]|0;if((b|0)<(m|0)){n=b;o=c[k>>2]|0}else{b=m+10|0;c[j>>2]=b;m=mk(c[k>>2]|0,b<<2)|0;c[k>>2]=m;n=c[h>>2]|0;o=m}c[o+(n<<2)>>2]=l;av(l,0)}else{av(l,g)}l=ty(l)|0;}while((l|0)!=0)}if(!f){i=d;return}f=e+8|0;l=a+8|0;c[(c[l>>2]|0)+172>>2]=c[f>>2];a=c[f>>2]|0;if((a|0)==0){i=d;return}f=mk(c[e>>2]|0,(a<<2)+4|0)|0;c[(c[l>>2]|0)+176>>2]=f;i=d;return}function bv(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0;e=i;i=i+32|0;f=e|0;g=c[a+48>>2]|0;if((d[213992]|0)>>>0>1>>>0){j=c[o>>2]|0;if((b|0)>0){k=b;do{Ma(115328,2,1,j|0)|0;k=k-1|0;}while((k|0)>0)}k=$w(a|0)|0;gc(j|0,108208,(l=i,i=i+8|0,c[l>>2]=k,l)|0)|0;i=l}k=a+8|0;j=c[k>>2]|0;if((c[j+172>>2]|0)<1){m=0}else{n=b+1|0;p=0;q=1;r=j;while(1){j=c[(c[r+176>>2]|0)+(q<<2)>>2]|0;bv(j,n);s=(Lw(j)|0)+p|0;j=c[k>>2]|0;if((q|0)<(c[j+172>>2]|0)){p=s;q=q+1|0;r=j}else{m=s;break}}}r=(Lw(a)|0)-m|0;m=c[k>>2]|0;q=(c[m+172>>2]|0)+r|0;p=(q|0)==0;do{if(p){if((c[m+12>>2]|0)!=0){break}h[m+24>>3]=0.0;h[(c[k>>2]|0)+16>>3]=0.0;h[(c[k>>2]|0)+40>>3]=18.0;h[(c[k>>2]|0)+32>>3]=18.0;i=e;return}}while(0);m=f+16|0;do{if((tv(a,4,4,f)|0)>>>0<3>>>0){c[m>>2]=3;t=0;u=0}else{if((c[m>>2]|0)!=4){t=0;u=0;break}if((c[f+28>>2]&2|0)==0){t=0;u=0;break}n=Wv(g,0,102592,0)|0;s=Wv(g,1,102592,0)|0;if((n|0)==0&(s|0)==0){j=$w(a|0)|0;Fv(0,96896,(l=i,i=i+8|0,c[l>>2]=j,l)|0)|0;i=l;t=0;u=0;break}else{c[f+24>>2]=jk(q)|0;t=s;u=n;break}}}while(0);g=jk(q<<5)|0;m=g;n=jk(q<<2)|0;s=n;j=c[k>>2]|0;if((c[j+172>>2]|0)<1){v=0}else{w=f+24|0;x=(u|0)==0;y=0;z=1;A=j;while(1){j=c[(c[A+176>>2]|0)+(z<<2)>>2]|0;B=m+(y<<5)|0;C=(c[j+8>>2]|0)+16|0;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];c[B+16>>2]=c[C+16>>2];c[B+20>>2]=c[C+20>>2];c[B+24>>2]=c[C+24>>2];c[B+28>>2]=c[C+28>>2];C=j|0;if(!((c[w>>2]|0)==0|x)){j=Em(C,u,0,0)|0;c[(c[w>>2]|0)+(y<<2)>>2]=j}j=y+1|0;c[s+(y<<2)>>2]=C;C=c[k>>2]|0;if((z|0)<(c[C+172>>2]|0)){y=j;z=z+1|0;A=C}else{v=j;break}}}a:do{if((r|0)>0){A=ux(a)|0;if((A|0)==0){break}z=a|0;y=f+24|0;if((t|0)==0){w=A;u=v;while(1){x=w+8|0;j=(c[x>>2]|0)+112|0;if((c[j>>2]|0)==0){c[j>>2]=z;j=c[x>>2]|0;D=+h[j+88>>3]+ +h[j+96>>3];E=+h[j+80>>3];vF(m+(u<<5)|0,0,16)|0;h[m+(u<<5)+16>>3]=D;h[m+(u<<5)+24>>3]=E;c[s+(u<<2)>>2]=w;F=u+1|0}else{F=u}j=vx(a,w)|0;if((j|0)==0){break a}else{w=j;u=F}}}else{G=A;H=v}while(1){u=G+8|0;w=(c[u>>2]|0)+112|0;if((c[w>>2]|0)==0){c[w>>2]=z;w=c[u>>2]|0;E=+h[w+88>>3]+ +h[w+96>>3];D=+h[w+80>>3];vF(m+(H<<5)|0,0,16)|0;h[m+(H<<5)+16>>3]=E;h[m+(H<<5)+24>>3]=D;w=G|0;if((c[y>>2]|0)!=0){u=Em(w,t,0,0)|0;c[(c[y>>2]|0)+(H<<2)>>2]=u}c[s+(H<<2)>>2]=w;I=H+1|0}else{I=H}w=vx(a,G)|0;if((w|0)==0){break}else{G=w;H=I}}}}while(0);I=ov(q,m,f)|0;H=c[f+24>>2]|0;if((H|0)!=0){eF(H)}H=(q|0)>0;if(H){G=(b|0)>0;t=c[o>>2]|0;D=-2147483647.0;E=-2147483647.0;J=2147483647.0;K=2147483647.0;v=0;while(1){L=+(c[I+(v<<3)>>2]|0);M=+(c[I+(v<<3)+4>>2]|0);N=L+ +h[m+(v<<5)>>3];O=L+ +h[m+(v<<5)+16>>3];L=M+ +h[m+(v<<5)+8>>3];P=M+ +h[m+(v<<5)+24>>3];M=K<N?K:N;Q=J<L?J:L;R=E>O?E:O;S=D>P?D:P;F=c[s+(v<<2)>>2]|0;r=F+8|0;y=c[r>>2]|0;z=y+16|0;do{if((v|0)<(c[(c[k>>2]|0)+172>>2]|0)){h[z>>3]=N;h[y+24>>3]=L;h[y+32>>3]=O;h[y+40>>3]=P;if((d[213992]|0)>>>0<=1>>>0){break}if(G){A=b;do{Ma(115328,2,1,t|0)|0;A=A-1|0;}while((A|0)>0)}A=$w(F)|0;gc(t|0,127520,(l=i,i=i+40|0,c[l>>2]=A,h[l+8>>3]=N,h[l+16>>3]=L,h[l+24>>3]=O,h[l+32>>3]=P,l)|0)|0;i=l}else{h[z>>3]=(N+O)*.5;h[y+24>>3]=(L+P)*.5;if((d[213992]|0)>>>0<=1>>>0){break}if(G){A=b;do{Ma(115328,2,1,t|0)|0;A=A-1|0;}while((A|0)>0)}A=$w(F)|0;w=c[r>>2]|0;T=+h[w+16>>3];U=+h[w+24>>3];gc(t|0,157320,(l=i,i=i+24|0,c[l>>2]=A,h[l+8>>3]=T,h[l+16>>3]=U,l)|0)|0;i=l}}while(0);r=v+1|0;if((r|0)<(q|0)){D=S;E=R;J=Q;K=M;v=r}else{V=S;W=R;X=Q;Y=M;break}}}else{V=-2147483647.0;W=-2147483647.0;X=2147483647.0;Y=2147483647.0}v=c[k>>2]|0;t=c[v+12>>2]|0;do{if((t|0)==0){Z=Y;_=X;$=W;aa=V}else{K=+h[t+24>>3];if(p){ba=0.0;ca=0.0;da=K;ea=+h[t+32>>3]}else{ba=Y;ca=X;da=W;ea=V}J=K-(da-ba);if(J<=0.0){Z=ba;_=ca;$=da;aa=ea;break}K=J*.5;Z=ba-K;_=ca;$=da+K;aa=ea}}while(0);t=(b|0)>0;if(t){fa=+((c[f+8>>2]|0)>>>0>>>0)*.5}else{fa=0.0}ea=Z-fa;Z=$+fa;$=_-(fa+ +h[v+56>>3]);_=aa+(fa+ +h[v+88>>3]);if((d[213992]|0)>>>0>1>>>0){if(t){v=c[o>>2]|0;f=b;do{Ma(115328,2,1,v|0)|0;f=f-1|0;}while((f|0)>0)}f=c[o>>2]|0;v=$w(a|0)|0;gc(f|0,127520,(l=i,i=i+40|0,c[l>>2]=v,h[l+8>>3]=ea,h[l+16>>3]=$,h[l+24>>3]=Z,h[l+32>>3]=_,l)|0)|0;i=l}b:do{if(H){v=c[o>>2]|0;if(t){ga=0}else{f=0;while(1){p=c[s+(f<<2)>>2]|0;G=p+8|0;m=c[G>>2]|0;r=m+16|0;fa=+h[r>>3];F=m+24|0;aa=+h[F>>3];do{if((f|0)<(c[(c[k>>2]|0)+172>>2]|0)){y=m+32|0;z=m+40|0;da=fa-ea;ca=aa-$;ba=+h[y>>3]-ea;V=+h[z>>3]-$;h[r>>3]=da;h[F>>3]=ca;h[y>>3]=ba;h[z>>3]=V;if((d[213992]|0)>>>0<=1>>>0){break}z=$w(p)|0;gc(v|0,127520,(l=i,i=i+40|0,c[l>>2]=z,h[l+8>>3]=da,h[l+16>>3]=ca,h[l+24>>3]=ba,h[l+32>>3]=V,l)|0)|0;i=l}else{h[r>>3]=fa-ea;h[F>>3]=aa-$;if((d[213992]|0)>>>0<=1>>>0){break}z=$w(p)|0;y=c[G>>2]|0;V=+h[y+16>>3];ba=+h[y+24>>3];gc(v|0,157320,(l=i,i=i+24|0,c[l>>2]=z,h[l+8>>3]=V,h[l+16>>3]=ba,l)|0)|0;i=l}}while(0);f=f+1|0;if((f|0)>=(q|0)){break b}}}do{f=c[s+(ga<<2)>>2]|0;G=f+8|0;p=c[G>>2]|0;F=p+16|0;M=+h[F>>3];r=p+24|0;Q=+h[r>>3];do{if((ga|0)<(c[(c[k>>2]|0)+172>>2]|0)){m=p+32|0;z=p+40|0;R=M-ea;S=Q-$;aa=+h[m>>3]-ea;fa=+h[z>>3]-$;h[F>>3]=R;h[r>>3]=S;h[m>>3]=aa;h[z>>3]=fa;if((d[213992]|0)>>>0>1>>>0){ha=b}else{break}do{Ma(115328,2,1,v|0)|0;ha=ha-1|0;}while((ha|0)>0);z=$w(f)|0;gc(v|0,127520,(l=i,i=i+40|0,c[l>>2]=z,h[l+8>>3]=R,h[l+16>>3]=S,h[l+24>>3]=aa,h[l+32>>3]=fa,l)|0)|0;i=l}else{h[F>>3]=M-ea;h[r>>3]=Q-$;if((d[213992]|0)>>>0>1>>>0){ia=b}else{break}do{Ma(115328,2,1,v|0)|0;ia=ia-1|0;}while((ia|0)>0);z=$w(f)|0;m=c[G>>2]|0;fa=+h[m+16>>3];aa=+h[m+24>>3];gc(v|0,157320,(l=i,i=i+24|0,c[l>>2]=z,h[l+8>>3]=fa,h[l+16>>3]=aa,l)|0)|0;i=l}}while(0);ga=ga+1|0;}while((ga|0)<(q|0))}}while(0);Q=Z-ea;Z=_-$;_=ea-ea;ea=$-$;q=c[k>>2]|0;h[q+16>>3]=_;h[q+24>>3]=ea;h[q+32>>3]=Q;h[q+40>>3]=Z;if((d[213992]|0)>>>0>1>>>0){if(t){t=c[o>>2]|0;q=b;do{Ma(115328,2,1,t|0)|0;q=q-1|0;}while((q|0)>0)}q=c[o>>2]|0;t=$w(a|0)|0;gc(q|0,127520,(l=i,i=i+40|0,c[l>>2]=t,h[l+8>>3]=_,h[l+16>>3]=ea,h[l+24>>3]=Q,h[l+32>>3]=Z,l)|0)|0;i=l}eF(g);eF(n);eF(I);i=e;return}function cv(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0;e=i;f=a+8|0;g=c[f>>2]|0;j=+h[g+16>>3];k=+h[g+24>>3];if((d[213992]|0)>>>0>1>>>0){g=c[o>>2]|0;if((b|0)>0){l=b;do{Ma(115328,2,1,g|0)|0;l=l-1|0;}while((l|0)>0)}l=$w(a|0)|0;gc(g|0,119416,(m=i,i=i+8|0,c[m>>2]=l,m)|0)|0;i=m}l=(b|0)!=0;do{if(l){g=ux(a)|0;if((g|0)==0){break}n=(b|0)>0;p=c[o>>2]|0;q=g;do{g=q+8|0;r=c[g>>2]|0;do{if((c[r+112>>2]|0)==(a|0)){s=r+16|0;h[s>>3]=j+ +h[s>>3];s=(c[g>>2]|0)+24|0;h[s>>3]=k+ +h[s>>3];if((d[213992]|0)>>>0<=1>>>0){break}if(n){s=b;do{Ma(115328,2,1,p|0)|0;s=s-1|0;}while((s|0)>0)}s=$w(q|0)|0;t=c[g>>2]|0;u=+h[t+16>>3];v=+h[t+24>>3];gc(p|0,157320,(m=i,i=i+24|0,c[m>>2]=s,h[m+8>>3]=u,h[m+16>>3]=v,m)|0)|0;i=m}}while(0);q=vx(a,q)|0;}while((q|0)!=0)}}while(0);a=c[f>>2]|0;if((c[a+172>>2]|0)<1){i=e;return}q=(b|0)>0;p=c[o>>2]|0;n=b+1|0;g=1;r=a;while(1){a=c[(c[r+176>>2]|0)+(g<<2)>>2]|0;if(l){s=a+8|0;t=c[s>>2]|0;v=j+ +h[t+16>>3];u=k+ +h[t+24>>3];w=j+ +h[t+32>>3];x=k+ +h[t+40>>3];if((d[213992]|0)>>>0>1>>>0){if(q){y=b;do{Ma(115328,2,1,p|0)|0;y=y-1|0;}while((y|0)>0)}y=$w(a|0)|0;gc(p|0,127520,(m=i,i=i+40|0,c[m>>2]=y,h[m+8>>3]=v,h[m+16>>3]=u,h[m+24>>3]=w,h[m+32>>3]=x,m)|0)|0;i=m;z=c[s>>2]|0}else{z=t}h[z+16>>3]=v;h[z+24>>3]=u;h[z+32>>3]=w;h[z+40>>3]=x}cv(a,n);y=c[f>>2]|0;if((g|0)<(c[y+172>>2]|0)){g=g+1|0;r=y}else{break}}i=e;return}function dv(a){a=a|0;var b=0,c=0;b=ux(a)|0;if((b|0)==0){ev(a);return}else{c=b}do{un(c);c=vx(a,c)|0;}while((c|0)!=0);ev(a);return}function ev(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a+8|0;a=c[b>>2]|0;d=c[a+176>>2]|0;if((c[a+172>>2]|0)<1){e=d;f=e;eF(f);return}else{g=1;h=d}while(1){d=c[h+(g<<2)>>2]|0;dk(c[(c[d+8>>2]|0)+12>>2]|0);ev(d);d=c[b>>2]|0;a=c[d+176>>2]|0;if((g|0)<(c[d+172>>2]|0)){g=g+1|0;h=a}else{e=a;break}}f=e;eF(f);return}function fv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,la=0,na=0,oa=0,qa=0,ra=0;g=i;i=i+4256|0;h=1;j=0;k=i;i=i+168|0;c[k>>2]=0;while(1)switch(h|0){case 1:l=g|0;m=g+128|0;n=g+144|0;o=g+160|0;p=ma(20,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){h=2;break}else{h=3;break};case 2:c[d>>2]=0;q=0;h=37;break;case 3:if((e|0)==0){r=118752;h=6;break}else{s=e;h=4;break};case 4:t=s+1|0;w=a[s]|0;if((w<<24>>24|0)==95){s=t;h=4;break}else if((w<<24>>24|0)==0){r=e;h=6;break}else{h=5;break};case 5:p=ma(2,w&255|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){r=118752;h=6;break}else{s=t;h=4;break};case 6:x=ma(24,r|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;y=x+25|0;if((y|0)<129){h=7;break}else{h=8;break};case 7:z=l|0;h=9;break;case 8:p=ma(54,y|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;z=p;h=9;break;case 9:wa(172,z|0,r|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;p=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){h=11;break}else{A=p;h=10;break};case 10:a[(c[A+8>>2]|0)+157|0]=0;p=wa(88,b|0,A|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){h=11;break}else{A=p;h=10;break};case 11:p=ma(54,40)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;B=p;p=o|0;c[n>>2]=p;c[n+4>>2]=o+4096;c[n+12>>2]=0;c[n+8>>2]=0;C=m|0;c[C>>2]=n;c[m+4>>2]=n;c[m+8>>2]=p;D=BF(178072,h,k)|0;h=38;break;case 38:if((D|0)==0){h=12;break}else{E=1;F=0;G=B;H=0;I=n;h=28;break};case 12:J=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((J|0)==0){K=0;L=0;h=20;break}else{h=13;break};case 13:M=z+x|0;N=0;O=0;P=J;Q=0;h=14;break;case 14:R=c[P+8>>2]|0;if((a[R+157|0]|0)==0){h=15;break}else{S=Q;T=O;U=N;h=19;break};case 15:if((a[R+119|0]|0)==3){h=16;break}else{S=Q;T=O;U=N;h=19;break};case 16:if((O|0)==0){h=17;break}else{V=Q;W=O;X=N;h=18;break};case 17:pa(6,M|0,156992,(Y=i,i=i+8|0,c[Y>>2]=N,Y)|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;i=Y;p=pa(38,b|0,z|0,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;Aa(60,p|0,127304,272,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;c[B+(N<<2)>>2]=p;V=1;W=p;X=N+1|0;h=18;break;case 18:ja(26,b|0,P|0,26,W|0,m|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;S=V;T=W;U=X;h=19;break;case 19:p=wa(88,b|0,P|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((p|0)==0){K=U;L=S;h=20;break}else{N=U;O=T;P=p;Q=S;h=14;break};case 20:Z=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((Z|0)==0){_=K;$=B;h=27;break}else{h=21;break};case 21:aa=z+x|0;ba=K;ca=Z;da=B;ea=10;h=22;break;case 22:if((a[(c[ca+8>>2]|0)+157|0]|0)==0){h=23;break}else{fa=ea;ga=da;ha=ba;h=26;break};case 23:pa(6,aa|0,156992,(Y=i,i=i+8|0,c[Y>>2]=ba,Y)|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;i=Y;ia=pa(38,b|0,z|0,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;p=ia|0;Aa(60,p|0,127304,272,1)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;ja(26,b|0,ca|0,26,p|0,m|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((ba|0)==(ea|0)){h=24;break}else{la=ea;na=da;h=25;break};case 24:p=ea<<1;oa=wa(206,da|0,ea<<3|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;la=p;na=oa;h=25;break;case 25:c[na+(ba<<2)>>2]=ia;fa=la;ga=na;ha=ba+1|0;h=26;break;case 26:oa=wa(88,b|0,ca|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((oa|0)==0){_=ha;$=ga;h=27;break}else{ba=ha;ca=oa;da=ga;ea=fa;h=22;break};case 27:E=0;F=L;G=$;H=_;I=c[C>>2]|0;h=28;break;case 28:oa=c[I+12>>2]|0;if((oa|0)==0){h=30;break}else{qa=oa;h=29;break};case 29:oa=c[qa+12>>2]|0;ka(150,c[qa>>2]|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;ka(150,qa|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;if((oa|0)==0){h=30;break}else{qa=oa;h=29;break};case 30:if((z|0)==(l|0)){h=32;break}else{h=31;break};case 31:ka(150,z|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;h=32;break;case 32:if((E|0)==0){h=36;break}else{h=33;break};case 33:c[d>>2]=0;if((H|0)>0){ra=0;h=34;break}else{h=35;break};case 34:ma(38,c[G+(ra<<2)>>2]|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;oa=ra+1|0;if((oa|0)<(H|0)){ra=oa;h=34;break}else{h=35;break};case 35:ka(150,G|0);if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;q=0;h=37;break;case 36:oa=wa(206,G|0,H<<2|0)|0;if((u|0)!=0&(v|0)!=0){j=CF(c[u>>2]|0,k)|0;if((j|0)>0){h=-1;break}else return 0}u=v=0;c[d>>2]=H;a[f]=F;q=oa;h=37;break;case 37:i=g;return q|0;case-1:if((j|0)==11){D=v;h=38}u=v=0;break}return 0}function gv(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;kv(g,d);d=g|0;h=g+8|0;i=g+4|0;a:while(1){j=c[h>>2]|0;k=c[i>>2]|0;if((j|0)==(c[k>>2]|0)){if((k|0)==(c[d>>2]|0)){l=12;break}m=c[k+8>>2]|0;c[i>>2]=m;k=c[m+4>>2]|0;c[h>>2]=k;n=k}else{n=j}j=n-4|0;c[h>>2]=j;k=c[j>>2]|0;if((k|0)==0){l=12;break}a[(c[k+8>>2]|0)+157|0]=1;Dc[e&63](k,f);j=rw(b,k)|0;if((j|0)==0){continue}else{o=j}while(1){j=c[o>>2]&3;m=c[((j|0)==3?o:o+32|0)+28>>2]|0;if((m|0)==(k|0)){p=c[((j|0)==2?o:o-32|0)+28>>2]|0}else{p=m}if((a[(c[p+8>>2]|0)+157|0]|0)==0){kv(g,p)}m=sw(b,o,k)|0;if((m|0)==0){continue a}else{o=m}}}if((l|0)==12){return}}function hv(a,b){a=a|0;b=b|0;zx(b,a,1)|0;return}function iv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;f=i;i=i+4256|0;g=1;h=0;j=i;i=i+168|0;c[j>>2]=0;while(1)switch(g|0){case 1:k=f|0;l=f+128|0;m=f+144|0;n=f+160|0;o=ma(20,b|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=2;break}else{g=3;break};case 2:c[d>>2]=0;p=0;g=30;break;case 3:if((e|0)==0){q=118752;g=6;break}else{r=e;g=4;break};case 4:s=r+1|0;t=a[r]|0;if((t<<24>>24|0)==95){r=s;g=4;break}else if((t<<24>>24|0)==0){q=e;g=6;break}else{g=5;break};case 5:o=ma(2,t&255|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){q=118752;g=6;break}else{r=s;g=4;break};case 6:w=ma(24,q|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;x=w+25|0;if((x|0)<129){g=7;break}else{g=8;break};case 7:y=k|0;g=9;break;case 8:o=ma(54,x|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){p=0;g=30;break}else{y=o;g=9;break};case 9:wa(172,y|0,q|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;o=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=11;break}else{z=o;g=10;break};case 10:a[(c[z+8>>2]|0)+157|0]=0;o=wa(88,b|0,z|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=11;break}else{z=o;g=10;break};case 11:A=ma(54,40)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;o=n|0;c[m>>2]=o;c[m+4>>2]=n+4096;B=m+12|0;c[B>>2]=0;c[m+8>>2]=0;C=l|0;c[C>>2]=m;c[l+4>>2]=m;c[l+8>>2]=o;D=BF(178072,g,j)|0;g=31;break;case 31:if((D|0)==0){g=17;break}else{g=12;break};case 12:o=c[B>>2]|0;if((o|0)==0){g=14;break}else{E=o;g=13;break};case 13:o=c[E+12>>2]|0;ka(150,c[E>>2]|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;ka(150,E|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((o|0)==0){g=14;break}else{E=o;g=13;break};case 14:ka(150,A|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((y|0)==(k|0)){g=16;break}else{g=15;break};case 15:ka(150,y|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;g=16;break;case 16:c[d>>2]=0;p=0;g=30;break;case 17:F=A;G=ma(18,b|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((G|0)==0){H=0;I=F;J=m;g=25;break}else{g=18;break};case 18:K=y+w|0;L=0;M=G;N=F;O=10;g=19;break;case 19:if((a[(c[M+8>>2]|0)+157|0]|0)==0){g=20;break}else{P=O;Q=N;R=L;g=23;break};case 20:pa(6,K|0,156992,(o=i,i=i+8|0,c[o>>2]=L,o)|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;i=o;S=pa(38,b|0,y|0,1)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;o=S|0;Aa(60,o|0,127304,272,1)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;ja(26,b|0,M|0,26,o|0,l|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((L|0)==(O|0)){g=21;break}else{T=O;U=N;g=22;break};case 21:o=O<<1;V=wa(206,N|0,O<<3|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;T=o;U=V;g=22;break;case 22:c[U+(L<<2)>>2]=S;P=T;Q=U;R=L+1|0;g=23;break;case 23:V=wa(88,b|0,M|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((V|0)==0){g=24;break}else{L=R;M=V;N=Q;O=P;g=19;break};case 24:H=R;I=Q;J=c[C>>2]|0;g=25;break;case 25:V=c[J+12>>2]|0;if((V|0)==0){g=27;break}else{W=V;g=26;break};case 26:V=c[W+12>>2]|0;ka(150,c[W>>2]|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;ka(150,W|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;if((V|0)==0){g=27;break}else{W=V;g=26;break};case 27:V=wa(206,I|0,H<<2|0)|0;if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;X=V;if((y|0)==(k|0)){g=29;break}else{g=28;break};case 28:ka(150,y|0);if((u|0)!=0&(v|0)!=0){h=CF(c[u>>2]|0,j)|0;if((h|0)>0){g=-1;break}else return 0}u=v=0;g=29;break;case 29:c[d>>2]=H;p=X;g=30;break;case 30:i=f;return p|0;case-1:if((h|0)==11){D=v;g=31}u=v=0;break}return 0}function jv(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=c[a+48>>2]|0;d=ux(a)|0;if((d|0)==0){e=0;return e|0}else{f=d;g=0}while(1){d=mw(b,f)|0;if((d|0)==0){h=g}else{i=d;d=g;while(1){if((Rx(a,c[((c[i>>2]&3|0)==2?i:i-32|0)+28>>2]|0)|0)==0){j=d}else{xw(a,i,1)|0;j=d+1|0}k=ow(b,i)|0;if((k|0)==0){h=j;break}else{i=k;d=j}}}d=vx(a,f)|0;if((d|0)==0){e=h;break}else{f=d;g=h}}return e|0}function kv(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;f=b+8|0;g=b+4|0;b=c[g>>2]|0;if((c[f>>2]|0)!=(c[b+4>>2]|0)){h=d+8|0;j=c[h>>2]|0;k=j;l=k+157|0;a[l]=1;m=c[f>>2]|0;n=m+4|0;c[f>>2]=n;c[m>>2]=d;i=e;return}o=c[b+12>>2]|0;do{if((o|0)==0){b=kk(16)|0;if((b|0)==0){Fv(1,115176,(p=i,i=i+1|0,i=i+7&-8,c[p>>2]=0,p)|0)|0;i=p;rc(178072,1)}c[b+8>>2]=c[g>>2];c[b+12>>2]=0;q=kk(4e6)|0;c[b>>2]=q;if((q|0)==0){Fv(1,115176,(p=i,i=i+1|0,i=i+7&-8,c[p>>2]=0,p)|0)|0;i=p;rc(178072,1)}else{c[b+4>>2]=q+4e6;c[(c[g>>2]|0)+12>>2]=b;r=c[(c[g>>2]|0)+12>>2]|0;break}}else{r=o}}while(0);c[g>>2]=r;c[f>>2]=c[r>>2];h=d+8|0;j=c[h>>2]|0;k=j;l=k+157|0;a[l]=1;m=c[f>>2]|0;n=m+4|0;c[f>>2]=n;c[m>>2]=d;i=e;return}function lv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];g=+h[a>>3];if(g<0.0){j=g+-.5}else{j=g+.5}f=~~j;j=+h[a+8>>3];if(j<0.0){k=j+-.5}else{k=j+.5}a=~~k;k=+h[b>>3];if(k<0.0){l=k+-.5}else{l=k+.5}m=~~l;l=+h[b+8>>3];if(l<0.0){n=l+-.5}else{n=l+.5}b=~~n;o=m-f|0;p=((o|0)>-1?o:-o|0)<<1;q=o>>31|1;o=b-a|0;r=((o|0)>-1?o:-o|0)<<1;s=o>>31|1;Gk(d,f,a);if((p|0)>(r|0)){if((f|0)==(m|0)){i=e;return}o=a;t=f;u=r-(p>>1)|0;while(1){if((u|0)>-1){v=u-p|0;w=o+s|0}else{v=u;w=o}x=t+q|0;Gk(d,x,w);if((x|0)==(m|0)){break}else{o=w;t=x;u=v+r|0}}i=e;return}else{if((a|0)==(b|0)){i=e;return}v=a;a=f;f=p-(r>>1)|0;while(1){if((f|0)>-1){y=f-r|0;z=a+q|0}else{y=f;z=a}u=v+s|0;Gk(d,z,u);if((u|0)==(b|0)){break}else{v=u;a=z;f=y+p|0}}i=e;return}}function mv(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0,K=0.0,L=0,M=0.0,N=0,O=0.0,P=0,Q=0,R=0,S=0,T=0.0,U=0.0,V=0.0,W=0,X=0,Y=0.0,Z=0,_=0.0,$=0,aa=0,ba=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0.0,la=0,ma=0.0,na=0,oa=0.0,pa=0,qa=0.0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0.0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0.0,Ka=0.0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0;j=i;i=i+40|0;k=j|0;l=j+16|0;m=j+32|0;if((b|0)<1){n=0;i=j;return n|0}p=g+16|0;if((c[p>>2]|0)>>>0>=4>>>0){q=kk(b<<5)|0;r=q;s=(b|0)>0;if(s){t=0;do{u=c[e+(t<<2)>>2]|0;$m(u);v=r+(t<<5)|0;w=(c[u+8>>2]|0)+16|0;c[v>>2]=c[w>>2];c[v+4>>2]=c[w+4>>2];c[v+8>>2]=c[w+8>>2];c[v+12>>2]=c[w+12>>2];c[v+16>>2]=c[w+16>>2];c[v+20>>2]=c[w+20>>2];c[v+24>>2]=c[w+24>>2];c[v+28>>2]=c[w+28>>2];t=t+1|0;}while((t|0)<(b|0))}do{if((c[p>>2]|0)==4){t=g+28|0;do{if((c[t>>2]&2|0)!=0){w=g+24|0;c[w>>2]=jk(b<<2)|0;if(s){x=0}else{break}do{v=ew(c[e+(x<<2)>>2]|0,108152)|0;do{if((v|0)!=0){u=ac(v|0,148336,(y=i,i=i+8|0,c[y>>2]=m,y)|0)|0;i=y;z=c[m>>2]|0;if(!((u|0)>0&(z|0)>-1)){break}c[(c[w>>2]|0)+(x<<2)>>2]=z}}while(0);x=x+1|0;}while((x|0)<(b|0))}}while(0);w=nv(b,r,g)|0;if((c[t>>2]&2|0)==0){A=w;break}eF(c[g+24>>2]|0);A=w}else{A=0}}while(0);eF(q);n=A;i=j;return n|0}A=c[g+20>>2]|0;q=(A|0)==0;r=c[o>>2]|0;x=0;m=0;s=0;w=0;v=0;z=0;while(1){u=c[e+(z<<2)>>2]|0;$m(u);do{if(q){B=v;C=w;D=s;E=m;F=x}else{if((a[A+z|0]|0)==0){B=v;C=w;D=s;E=m;F=x;break}G=c[u+8>>2]|0;H=+h[G+16>>3];if(H<0.0){I=H+-.5}else{I=H+.5}J=~~I;H=+h[G+24>>3];if(H<0.0){K=H+-.5}else{K=H+.5}L=~~K;H=+h[G+32>>3];if(H<0.0){M=H+-.5}else{M=H+.5}N=~~M;H=+h[G+40>>3];if(H<0.0){O=H+-.5}else{O=H+.5}G=~~O;if((v|0)==0){P=J;Q=L;R=N;S=G}else{P=(J|0)<(w|0)?J:w;Q=(L|0)<(s|0)?L:s;R=(N|0)>(m|0)?N:m;S=(G|0)>(x|0)?G:x}B=v+1|0;C=P;D=Q;E=R;F=S}}while(0);if((d[213992]|0)>>>0>2>>>0){t=$w(u|0)|0;G=c[u+8>>2]|0;H=+h[G+16>>3];T=+h[G+24>>3];U=+h[G+32>>3];V=+h[G+40>>3];gc(r|0,114504,(y=i,i=i+40|0,c[y>>2]=t,h[y+8>>3]=H,h[y+16>>3]=T,h[y+24>>3]=U,h[y+32>>3]=V,y)|0)|0;i=y}t=z+1|0;if((t|0)<(b|0)){x=F;m=E;s=D;w=C;v=B;z=t}else{break}}z=kk(b<<5)|0;B=z;v=0;do{w=B+(v<<5)|0;s=(c[(c[e+(v<<2)>>2]|0)+8>>2]|0)+16|0;c[w>>2]=c[s>>2];c[w+4>>2]=c[s+4>>2];c[w+8>>2]=c[s+8>>2];c[w+12>>2]=c[s+12>>2];c[w+16>>2]=c[s+16>>2];c[w+20>>2]=c[s+20>>2];c[w+24>>2]=c[s+24>>2];c[w+28>>2]=c[s+28>>2];v=v+1|0;}while((v|0)<(b|0));v=g+8|0;s=xv(b,B,c[v>>2]|0)|0;if((a[213992]|0)!=0){gc(r|0,136576,(y=i,i=i+8|0,c[y>>2]=s,y)|0)|0;i=y}if((s|0)<1){n=0;i=j;return n|0}w=(A|0)!=0;if(w){W=(C+E|0)/2|0;X=(D+F|0)/2|0}else{W=0;X=0}F=jk(b<<4)|0;D=F;E=g+12|0;g=(f|0)==0;C=k|0;m=k+8|0;O=+(s|0);x=l|0;S=l+8|0;R=0;do{Q=e+(R<<2)|0;P=c[Q>>2]|0;q=D+(R<<4)|0;c[D+(R<<4)+12>>2]=R;if((c[p>>2]|0)==3){t=(c[P+8>>2]|0)+16|0;G=c[v>>2]|0;yv(t,q,s,G,W,X,$w(P|0)|0)}else{P=c[Q>>2]|0;Q=c[v>>2]|0;G=c[E>>2]|0;t=g?P:f;N=Dk()|0;L=P+8|0;J=c[L>>2]|0;M=+h[J+16>>3];if(M<0.0){Y=M+-.5}else{Y=M+.5}Z=W-~~Y|0;M=+h[J+24>>3];if(M<0.0){_=M+-.5}else{_=M+.5}J=X-~~_|0;do{if((c[p>>2]|0)==1){$=kk((Lw(P)|0)<<2)|0;aa=$;ba=ux(P)|0;if((ba|0)!=0){da=ba;ba=0;while(1){ea=da+8|0;c[aa+(ba<<2)>>2]=c[(c[ea>>2]|0)+112>>2];c[(c[ea>>2]|0)+112>>2]=0;ea=vx(P,da)|0;if((ea|0)==0){break}else{da=ea;ba=ba+1|0}}}ba=c[L>>2]|0;if((c[ba+172>>2]|0)>=1){da=Z-Q|0;ea=J-Q|0;fa=Z+Q|0;ga=J+Q|0;ha=1;ia=ba;while(1){ba=c[(c[ia+176>>2]|0)+(ha<<2)>>2]|0;ja=c[ba+8>>2]|0;M=+h[ja+16>>3];if(M<0.0){ka=M+-.5}else{ka=M+.5}la=~~ka;M=+h[ja+24>>3];if(M<0.0){ma=M+-.5}else{ma=M+.5}na=~~ma;M=+h[ja+32>>3];if(M<0.0){oa=M+-.5}else{oa=M+.5}pa=~~oa;M=+h[ja+40>>3];if(M<0.0){qa=M+-.5}else{qa=M+.5}ja=~~qa;if((pa|0)>(la|0)&(ja|0)>(na|0)){ra=la+da|0;la=na+ea|0;na=fa+pa|0;pa=ga+ja|0;if((ra|0)>-1){sa=(ra|0)/(s|0)|0}else{sa=((ra+1|0)/(s|0)|0)-1|0}if((la|0)>-1){ta=(la|0)/(s|0)|0}else{ta=((la+1|0)/(s|0)|0)-1|0}if((na|0)>-1){ua=(na|0)/(s|0)|0}else{ua=((na+1|0)/(s|0)|0)-1|0}if((pa|0)>-1){va=(pa|0)/(s|0)|0}else{va=((pa+1|0)/(s|0)|0)-1|0}if(!((sa|0)>(ua|0)|(ta|0)>(va|0))){pa=sa;while(1){na=ta;while(1){Gk(N,pa,na);if((na|0)<(va|0)){na=na+1|0}else{break}}if((pa|0)<(ua|0)){pa=pa+1|0}else{break}}}pa=ux(ba)|0;if((pa|0)!=0){na=ba;la=pa;do{c[(c[la+8>>2]|0)+212>>2]=na;la=vx(ba,la)|0;}while((la|0)!=0)}wa=c[L>>2]|0}else{wa=ia}if((ha|0)<(c[wa+172>>2]|0)){ha=ha+1|0;ia=wa}else{break}}}ia=ux(P)|0;if((ia|0)!=0){M=+(Q|0);ha=ia;do{Pm(k,ha);K=+h[C>>3];I=+h[m>>3];if(K<0.0){xa=K+-.5}else{xa=K+.5}if(I<0.0){ya=I+-.5}else{ya=I+.5}ia=~~xa+Z|0;ga=~~ya+J|0;fa=ha+8|0;ea=c[fa>>2]|0;do{if((c[ea+212>>2]|0)==0){da=~~(M+(+h[ea+88>>3]+ +h[ea+96>>3])*.5);la=~~(M+ +h[ea+80>>3]*.5);ba=ia-da|0;na=ga-la|0;pa=da+ia|0;da=la+ga|0;if((ba|0)>-1){za=(ba|0)/(s|0)|0}else{za=((ba+1|0)/(s|0)|0)-1|0}if((na|0)>-1){Aa=(na|0)/(s|0)|0}else{Aa=((na+1|0)/(s|0)|0)-1|0}if((pa|0)>-1){Ba=(pa|0)/(s|0)|0}else{Ba=((pa+1|0)/(s|0)|0)-1|0}if((da|0)>-1){Ca=(da|0)/(s|0)|0}else{Ca=((da+1|0)/(s|0)|0)-1|0}if(!((za|0)>(Ba|0)|(Aa|0)>(Ca|0))){da=za;while(1){pa=Aa;while(1){Gk(N,da,pa);if((pa|0)<(Ca|0)){pa=pa+1|0}else{break}}if((da|0)<(Ba|0)){da=da+1|0}else{break}}}if((ia|0)>-1){Da=(ia|0)/(s|0)|0}else{Da=((ia+1|0)/(s|0)|0)-1|0}if((ga|0)>-1){Ea=(ga|0)/(s|0)|0}else{Ea=((ga+1|0)/(s|0)|0)-1|0}da=mw(t,ha)|0;if((da|0)==0){break}else{Fa=da}do{Ev(Fa,Da,Ea,N,Z,J,s,G);Fa=ow(t,Fa)|0;}while((Fa|0)!=0)}else{if((ia|0)>-1){Ga=(ia|0)/(s|0)|0}else{Ga=((ia+1|0)/(s|0)|0)-1|0}if((ga|0)>-1){Ha=(ga|0)/(s|0)|0}else{Ha=((ga+1|0)/(s|0)|0)-1|0}da=mw(t,ha)|0;if((da|0)==0){break}else{Ia=da}do{if((c[(c[fa>>2]|0)+212>>2]|0)!=(c[(c[(c[((c[Ia>>2]&3|0)==2?Ia:Ia-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)){Ev(Ia,Ga,Ha,N,Z,J,s,G)}Ia=ow(t,Ia)|0;}while((Ia|0)!=0)}}while(0);ha=vx(P,ha)|0;}while((ha|0)!=0)}ha=ux(P)|0;if((ha|0)!=0){fa=ha;ha=0;while(1){c[(c[fa+8>>2]|0)+112>>2]=c[aa+(ha<<2)>>2];ga=vx(P,fa)|0;if((ga|0)==0){break}else{fa=ga;ha=ha+1|0}}}eF($)}else{ha=ux(P)|0;if((ha|0)==0){break}M=+(Q|0);fa=ha;do{Pm(l,fa);I=+h[x>>3];K=+h[S>>3];if(I<0.0){Ja=I+-.5}else{Ja=I+.5}if(K<0.0){Ka=K+-.5}else{Ka=K+.5}ha=~~Ja+Z|0;aa=~~Ka+J|0;ga=c[fa+8>>2]|0;ia=~~(M+(+h[ga+88>>3]+ +h[ga+96>>3])*.5);ea=~~(M+ +h[ga+80>>3]*.5);ga=ha-ia|0;da=aa-ea|0;pa=ia+ha|0;ia=ea+aa|0;if((ga|0)>-1){La=(ga|0)/(s|0)|0}else{La=((ga+1|0)/(s|0)|0)-1|0}if((da|0)>-1){Ma=(da|0)/(s|0)|0}else{Ma=((da+1|0)/(s|0)|0)-1|0}if((pa|0)>-1){Na=(pa|0)/(s|0)|0}else{Na=((pa+1|0)/(s|0)|0)-1|0}if((ia|0)>-1){Oa=(ia|0)/(s|0)|0}else{Oa=((ia+1|0)/(s|0)|0)-1|0}if(!((La|0)>(Na|0)|(Ma|0)>(Oa|0))){ia=La;while(1){pa=Ma;while(1){Gk(N,ia,pa);if((pa|0)<(Oa|0)){pa=pa+1|0}else{break}}if((ia|0)<(Na|0)){ia=ia+1|0}else{break}}}if((ha|0)>-1){Pa=(ha|0)/(s|0)|0}else{Pa=((ha+1|0)/(s|0)|0)-1|0}if((aa|0)>-1){Qa=(aa|0)/(s|0)|0}else{Qa=((aa+1|0)/(s|0)|0)-1|0}ia=mw(t,fa)|0;if((ia|0)!=0){pa=ia;do{Ev(pa,Pa,Qa,N,Z,J,s,G);pa=ow(t,pa)|0;}while((pa|0)!=0)}fa=vx(P,fa)|0;}while((fa|0)!=0)}}while(0);t=D+(R<<4)+4|0;c[t>>2]=Kk(N)|0;G=D+(R<<4)+8|0;c[G>>2]=Jk(N)|0;J=c[L>>2]|0;M=+(Q<<1|0);Z=~~+ca((M+(+h[J+32>>3]- +h[J+16>>3]))/O);u=~~+ca((M+(+h[J+40>>3]- +h[J+24>>3]))/O);c[q>>2]=u+Z;do{if((d[213992]|0)>>>0>2>>>0){J=$w(P|0)|0;fa=c[G>>2]|0;gc(r|0,126120,(y=i,i=i+32|0,c[y>>2]=J,c[y+8>>2]=fa,c[y+16>>2]=Z,c[y+24>>2]=u,y)|0)|0;i=y;if((c[G>>2]|0)>0){Ra=0}else{break}do{fa=c[t>>2]|0;J=c[fa+(Ra<<3)+4>>2]|0;gc(r|0,123640,(y=i,i=i+16|0,c[y>>2]=c[fa+(Ra<<3)>>2],c[y+8>>2]=J,y)|0)|0;i=y;Ra=Ra+1|0;}while((Ra|0)<(c[G>>2]|0))}}while(0);Ek(N);}R=R+1|0;}while((R|0)<(b|0));R=jk(b<<2)|0;Ra=R;Qa=0;do{c[Ra+(Qa<<2)>>2]=D+(Qa<<4);Qa=Qa+1|0;}while((Qa|0)<(b|0));Jb(R|0,b|0,4,180);Qa=Dk()|0;Pa=jk(b<<3)|0;if(w){w=-W|0;W=-X|0;X=0;while(1){do{if((a[A+X|0]|0)!=0){Na=c[Ra+(X<<2)>>2]|0;Oa=c[Na+12>>2]|0;Ma=c[Na+4>>2]|0;La=c[Na+8>>2]|0;Na=Pa+(Oa<<3)|0;c[Na>>2]=w;S=Pa+(Oa<<3)+4|0;c[S>>2]=W;if((La|0)>0){Oa=Ma;Ma=0;while(1){Fk(Qa,Oa);x=Ma+1|0;if((x|0)<(La|0)){Oa=Oa+8|0;Ma=x}else{break}}}if((d[213992]|0)>>>0<=1>>>0){break}Ma=c[Na>>2]|0;Oa=c[S>>2]|0;gc(r|0,113712,(y=i,i=i+24|0,c[y>>2]=La,c[y+8>>2]=Ma,c[y+16>>2]=Oa,y)|0)|0;i=y}}while(0);N=X+1|0;if((N|0)<(b|0)){X=N}else{Sa=0;break}}do{if((a[A+Sa|0]|0)==0){X=c[Ra+(Sa<<2)>>2]|0;Av(Sa,X,Qa,Pa+(c[X+12>>2]<<3)|0,s,c[v>>2]|0,B)}Sa=Sa+1|0;}while((Sa|0)<(b|0))}else{Sa=0;do{A=c[Ra+(Sa<<2)>>2]|0;Av(Sa,A,Qa,Pa+(c[A+12>>2]<<3)|0,s,c[v>>2]|0,B);Sa=Sa+1|0;}while((Sa|0)<(b|0))}eF(R);R=0;do{eF(c[D+(R<<4)+4>>2]|0);R=R+1|0;}while((R|0)<(b|0));eF(F);Ek(Qa);eF(z);if((d[213992]|0)>>>0>1>>>0){Ta=0}else{n=Pa;i=j;return n|0}while(1){z=c[Pa+(Ta<<3)>>2]|0;Qa=c[Pa+(Ta<<3)+4>>2]|0;gc(r|0,131600,(y=i,i=i+24|0,c[y>>2]=Ta,c[y+8>>2]=z,c[y+16>>2]=Qa,y)|0)|0;i=y;Qa=Ta+1|0;if((Qa|0)<(b|0)){Ta=Qa}else{n=Pa;break}}i=j;return n|0}function nv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0,H=0;f=i;g=jk(b<<3)|0;j=c[e+4>>2]|0;k=e+28|0;l=(j|0)>0;do{if((c[k>>2]&1|0)==0){if(l){m=1;n=(b-1+j|0)/(j|0)|0;p=j;break}else{q=~~+ca(+T(+(b|0)));m=1;n=(b-1+q|0)/(q|0)|0;p=q;break}}else{if(l){m=0;n=j;p=(b-1+j|0)/(j|0)|0;break}else{q=~~+ca(+T(+(b|0)));m=0;n=q;p=(b-1+q|0)/(q|0)|0;break}}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,117712,(j=i,i=i+24|0,c[j>>2]=(m|0)!=0?116800:115864,c[j+8>>2]=n,c[j+16>>2]=p,j)|0)|0;i=j}j=jk((p<<3)+8|0)|0;l=j;q=jk((n<<3)+8|0)|0;r=q;s=jk(b*24|0)|0;t=s;u=(b|0)>0;do{if(u){v=e+8|0;w=t;x=0;while(1){y=+h[d+(x<<5)+8>>3];z=+h[d+(x<<5)+24>>3];h[w>>3]=+h[d+(x<<5)+16>>3]- +h[d+(x<<5)>>3]+ +((c[v>>2]|0)>>>0>>>0);h[w+8>>3]=z-y+ +((c[v>>2]|0)>>>0>>>0);c[w+16>>2]=x;A=x+1|0;if((A|0)<(b|0)){w=w+24|0;x=A}else{break}}x=jk(b<<2)|0;w=x;if(u){B=0}else{C=x;D=w;break}while(1){c[w+(B<<2)>>2]=t+(B*24|0);v=B+1|0;if((v|0)<(b|0)){B=v}else{C=x;D=w;break}}}else{w=jk(b<<2)|0;C=w;D=w}}while(0);B=c[e+24>>2]|0;do{if((B|0)==0){if((c[k>>2]&64|0)!=0){break}Jb(C|0,b|0,4,24)}else{c[43654]=B;Jb(C|0,b|0,4,160)}}while(0);if(u){if((m|0)==0){B=0;e=0;t=0;while(1){w=c[D+(t<<2)>>2]|0;x=l+(B<<3)|0;y=+h[x>>3];z=+h[w>>3];h[x>>3]=y>z?y:z;x=r+(e<<3)|0;z=+h[x>>3];y=+h[w+8>>3];h[x>>3]=z>y?z:y;x=e+1|0;w=(x|0)==(n|0);v=t+1|0;if((v|0)<(b|0)){B=(w&1)+B|0;e=w?0:x;t=v}else{break}}}else{t=0;e=0;B=0;while(1){v=c[D+(B<<2)>>2]|0;x=l+(t<<3)|0;y=+h[x>>3];z=+h[v>>3];h[x>>3]=y>z?y:z;x=r+(e<<3)|0;z=+h[x>>3];y=+h[v+8>>3];h[x>>3]=z>y?z:y;x=t+1|0;v=(x|0)==(p|0);w=B+1|0;if((w|0)<(b|0)){t=v?0:x;e=(v&1)+e|0;B=w}else{break}}}}if((p|0)>=0){y=0.0;B=0;while(1){e=l+(B<<3)|0;z=+h[e>>3];h[e>>3]=y;if((B|0)<(p|0)){y=y+z;B=B+1|0}else{break}}}if((n|0)>0){y=0.0;B=n;while(1){e=B-1|0;z=+h[r+(e<<3)>>3];h[r+(B<<3)>>3]=y;E=y+z;if((e|0)>0){y=E;B=e}else{F=E;break}}}else{F=0.0}h[r>>3]=F;if(!u){eF(s);eF(C);eF(j);eF(q);i=f;return g|0}u=(m|0)==0;m=0;B=0;e=0;while(1){t=c[(c[D+(e<<2)>>2]|0)+16>>2]|0;F=+h[d+(t<<5)>>3];y=+h[d+(t<<5)+8>>3];E=+h[d+(t<<5)+16>>3];z=+h[d+(t<<5)+24>>3];w=c[k>>2]|0;do{if((w&4|0)==0){if((w&8|0)==0){c[g+(t<<3)>>2]=~~((+h[l+(m<<3)>>3]+ +h[l+(m+1<<3)>>3]-E-F)*.5);break}else{c[g+(t<<3)>>2]=~~(+h[l+(m+1<<3)>>3]-(E-F));break}}else{c[g+(t<<3)>>2]=~~+h[l+(m<<3)>>3]}}while(0);w=c[k>>2]|0;do{if((w&16|0)==0){if((w&32|0)==0){c[g+(t<<3)+4>>2]=~~((+h[r+(B<<3)>>3]+ +h[r+(B+1<<3)>>3]-z-y)*.5);break}else{c[g+(t<<3)+4>>2]=~~+h[r+(B+1<<3)>>3];break}}else{c[g+(t<<3)+4>>2]=~~(+h[r+(B<<3)>>3]-(z-y))}}while(0);if(u){t=B+1|0;w=(t|0)==(n|0);G=w?0:t;H=(w&1)+m|0}else{w=m+1|0;t=(w|0)==(p|0);G=(t&1)+B|0;H=t?0:w}w=e+1|0;if((w|0)<(b|0)){m=H;B=G;e=w}else{break}}eF(s);eF(C);eF(j);eF(q);i=f;return g|0}function ov(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=i;if((b|0)<1){h=0;i=g;return h|0}j=c[f+16>>2]|0;if((j|0)==3){k=f+8|0;l=xv(b,e,c[k>>2]|0)|0;if((a[213992]|0)!=0){gc(c[o>>2]|0,136576,(m=i,i=i+8|0,c[m>>2]=l,m)|0)|0;i=m}if((l|0)<1){h=0;i=g;return h|0}n=jk(b<<4)|0;p=n;q=(b|0)>0;if(q){r=0;do{c[p+(r<<4)+12>>2]=r;yv(e+(r<<5)|0,p+(r<<4)|0,l,c[k>>2]|0,0,0,213416);r=r+1|0;}while((r|0)<(b|0));r=jk(b<<2)|0;s=r;t=0;while(1){c[s+(t<<2)>>2]=p+(t<<4);u=t+1|0;if((u|0)<(b|0)){t=u}else{v=r;w=s;break}}}else{s=jk(b<<2)|0;v=s;w=s}Jb(v|0,b|0,4,180);s=Dk()|0;r=jk(b<<3)|0;if(q){t=0;do{u=c[w+(t<<2)>>2]|0;Av(t,u,s,r+(c[u+12>>2]<<3)|0,l,c[k>>2]|0,e);t=t+1|0;}while((t|0)<(b|0));eF(v);t=0;do{eF(c[p+(t<<4)+4>>2]|0);t=t+1|0;}while((t|0)<(b|0))}else{eF(v)}eF(n);Ek(s);if((d[213992]|0)>>>0<2>>>0|q^1){h=r;i=g;return h|0}q=c[o>>2]|0;s=0;while(1){n=c[r+(s<<3)>>2]|0;v=c[r+(s<<3)+4>>2]|0;gc(q|0,131600,(m=i,i=i+24|0,c[m>>2]=s,c[m+8>>2]=n,c[m+16>>2]=v,m)|0)|0;i=m;v=s+1|0;if((v|0)<(b|0)){s=v}else{h=r;break}}i=g;return h|0}else if((j|0)==4){h=nv(b,e,f)|0;i=g;return h|0}else{h=0;i=g;return h|0}return 0}function pv(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;if((a|0)<1){g=(a|0)>-1?a:-a|0;return g|0}i=(e|0)==0;j=(f|0)==0;f=0;while(1){k=c[b+(f<<2)>>2]|0;l=i?k:e;m=c[d+(f<<3)>>2]|0;n=c[d+(f<<3)+4>>2]|0;o=+(m|0);p=o/72.0;q=+(n|0);r=q/72.0;s=ux(k)|0;if((s|0)!=0){t=s;do{s=t+8|0;u=c[(c[s>>2]|0)+132>>2]|0;h[u>>3]=p+ +h[u>>3];u=(c[(c[s>>2]|0)+132>>2]|0)+8|0;h[u>>3]=r+ +h[u>>3];u=(c[s>>2]|0)+16|0;h[u>>3]=o+ +h[u>>3];u=(c[s>>2]|0)+24|0;h[u>>3]=q+ +h[u>>3];u=c[(c[s>>2]|0)+108>>2]|0;if((u|0)!=0){v=u+56|0;h[v>>3]=o+ +h[v>>3];v=(c[(c[s>>2]|0)+108>>2]|0)+64|0;h[v>>3]=q+ +h[v>>3]}do{if(!j){v=mw(l,t)|0;if((v|0)==0){break}else{w=v}do{v=w+8|0;s=c[v>>2]|0;u=c[s+96>>2]|0;if((u|0)==0){x=s}else{s=u+56|0;h[s>>3]=o+ +h[s>>3];s=(c[(c[v>>2]|0)+96>>2]|0)+64|0;h[s>>3]=q+ +h[s>>3];x=c[v>>2]|0}s=c[x+108>>2]|0;if((s|0)==0){y=x}else{u=s+56|0;h[u>>3]=o+ +h[u>>3];u=(c[(c[v>>2]|0)+108>>2]|0)+64|0;h[u>>3]=q+ +h[u>>3];y=c[v>>2]|0}u=c[y+100>>2]|0;if((u|0)==0){z=y}else{s=u+56|0;h[s>>3]=o+ +h[s>>3];s=(c[(c[v>>2]|0)+100>>2]|0)+64|0;h[s>>3]=q+ +h[s>>3];z=c[v>>2]|0}s=c[z+104>>2]|0;if((s|0)==0){A=z}else{u=s+56|0;h[u>>3]=o+ +h[u>>3];u=(c[(c[v>>2]|0)+104>>2]|0)+64|0;h[u>>3]=q+ +h[u>>3];A=c[v>>2]|0}u=c[A+8>>2]|0;do{if((u|0)!=0){if((c[u+4>>2]|0)>0){B=0;C=u}else{break}do{s=c[C>>2]|0;D=c[s+(B*48|0)>>2]|0;E=c[s+(B*48|0)+4>>2]|0;F=c[s+(B*48|0)+8>>2]|0;G=c[s+(B*48|0)+12>>2]|0;if((E|0)>0){s=0;do{H=D+(s<<4)|0;h[H>>3]=o+ +h[H>>3];H=D+(s<<4)+8|0;h[H>>3]=q+ +h[H>>3];s=s+1|0;}while((s|0)<(E|0))}if((F|0)!=0){E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+16|0;h[E>>3]=o+ +h[E>>3];E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+24|0;h[E>>3]=q+ +h[E>>3]}if((G|0)!=0){E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+32|0;h[E>>3]=o+ +h[E>>3];E=(c[c[(c[v>>2]|0)+8>>2]>>2]|0)+(B*48|0)+40|0;h[E>>3]=q+ +h[E>>3]}B=B+1|0;C=c[(c[v>>2]|0)+8>>2]|0;}while((B|0)<(c[C+4>>2]|0))}}while(0);w=ow(l,w)|0;}while((w|0)!=0)}}while(0);t=vx(k,t)|0;}while((t|0)!=0)}qv(k,m,n);t=f+1|0;if((t|0)<(a|0)){f=t}else{g=0;break}}return g|0}function qv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0,r=0;e=a+8|0;a=c[e>>2]|0;f=a+16|0;g=a+24|0;i=a+32|0;j=a+40|0;k=+(b|0);l=k+ +h[i>>3];m=+(d|0);n=m+ +h[g>>3];o=m+ +h[j>>3];h[f>>3]=k+ +h[f>>3];h[g>>3]=n;h[i>>3]=l;h[j>>3]=o;j=c[e>>2]|0;i=c[j+12>>2]|0;if((i|0)==0){p=j}else{j=i+56|0;h[j>>3]=k+ +h[j>>3];j=(c[(c[e>>2]|0)+12>>2]|0)+64|0;h[j>>3]=m+ +h[j>>3];p=c[e>>2]|0}if((c[p+172>>2]|0)<1){return}else{q=1;r=p}while(1){qv(c[(c[r+176>>2]|0)+(q<<2)>>2]|0,b,d);p=c[e>>2]|0;if((q|0)<(c[p+172>>2]|0)){q=q+1|0;r=p}else{break}}return}function rv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;f=mv(a,b,d,e)|0;if((f|0)==0){g=1;return g|0}h=pv(a,b,f,d,c[e+12>>2]|0)|0;eF(f);g=h;return g|0}function sv(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0.0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0.0,B=0.0,C=0.0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0;f=mv(a,b,d,e)|0;if((f|0)==0){g=1;return g|0}i=pv(a,b,f,d,c[e+12>>2]|0)|0;eF(f);if((i|0)!=0){g=i;return g|0}$m(d);i=c[d+8>>2]|0;d=i+16|0;j=+h[d>>3];f=i+24|0;k=+h[f>>3];e=i+32|0;l=+h[e>>3];m=i+40|0;n=+h[m>>3];if((a|0)>0){o=n;p=l;q=k;r=j;i=0;while(1){s=c[(c[b+(i<<2)>>2]|0)+8>>2]|0;t=c[s+172>>2]|0;if((t|0)<1){u=o;v=p;w=q;x=r}else{y=c[s+176>>2]|0;s=1;z=o;A=p;B=q;C=r;while(1){D=c[(c[y+(s<<2)>>2]|0)+8>>2]|0;E=+h[D+16>>3];F=C<E?C:E;E=+h[D+24>>3];G=B<E?B:E;E=+h[D+32>>3];H=A>E?A:E;E=+h[D+40>>3];I=z>E?z:E;if((s|0)<(t|0)){s=s+1|0;z=I;A=H;B=G;C=F}else{u=I;v=H;w=G;x=F;break}}}s=i+1|0;if((s|0)<(a|0)){o=u;p=v;q=w;r=x;i=s}else{J=u;K=v;L=w;M=x;break}}}else{J=n;K=l;L=k;M=j}h[d>>3]=M;h[f>>3]=L;h[e>>3]=K;h[m>>3]=J;g=0;return g|0}function tv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0;g=i;i=i+8|0;h=g|0;if((f|0)==0){cc(120888,112128,1400,170552);return 0}j=b|0;b=ew(j,145176)|0;if((b|0)==0){k=e}else{l=ac(b|0,148336,(m=i,i=i+8|0,c[m>>2]=h,m)|0)|0;i=m;b=c[h>>2]|0;k=(l|0)==1&(b|0)>-1?b:e}c[f+8>>2]=k;if((a[213992]|0)!=0){gc(c[o>>2]|0,142208,(m=i,i=i+8|0,c[m>>2]=k,m)|0)|0;i=m}c[f+12>>2]=0;c[f+20>>2]=0;uv(ew(j,146488)|0,d,f)|0;i=g;return c[f+16>>2]|0}function uv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;f=i;i=i+16|0;j=f|0;k=f+8|0;if((e|0)==0){cc(120888,112128,1292,170128);return 0}l=e+28|0;c[l>>2]=0;m=e+16|0;c[m>>2]=d;d=e+4|0;c[d>>2]=0;c[e+24>>2]=0;do{if((b|0)!=0){n=a[b]|0;if(n<<24>>24==0){break}p=n<<24>>24;if((p|0)==97){if((Za(b|0,105176,5)|0)!=0){if((Za(b|0,102536,6)|0)!=0){break}c[m>>2]=5;q=ac(b+5|0,96840,(r=i,i=i+8|0,c[r>>2]=j,r)|0)|0;i=r;s=+g[j>>2];t=e|0;if((q|0)>0&s>0.0){g[t>>2]=s;break}else{g[t>>2]=1.0;break}}c[m>>2]=4;t=b+5|0;a:do{if((a[t]|0)==95){q=b+6|0;u=a[q]|0;if(u<<24>>24==0){v=q;break}else{w=q;x=u;y=0}while(1){switch(x<<24>>24|0){case 116:{u=y|16;c[l>>2]=u;z=u;break};case 108:{u=y|4;c[l>>2]=u;z=u;break};case 98:{u=y|32;c[l>>2]=u;z=u;break};case 105:{u=y|64;c[l>>2]=u;z=u;break};case 114:{u=y|8;c[l>>2]=u;z=u;break};case 99:{u=y|1;c[l>>2]=u;z=u;break};case 117:{u=y|2;c[l>>2]=u;z=u;break};default:{v=w;break a}}u=w+1|0;q=a[u]|0;if(q<<24>>24==0){v=u;break a}else{w=u;x=q;y=z}}}else{v=t}}while(0);t=ac(v|0,148336,(r=i,i=i+8|0,c[r>>2]=k,r)|0)|0;i=r;q=c[k>>2]|0;if(!((t|0)>0&(q|0)>0)){break}c[d>>2]=q;break}else if((p|0)==103){if(n<<24>>24!=103){break}if((Ya(b|0,86216)|0)!=0){break}c[m>>2]=3;break}else if((p|0)==110){if(n<<24>>24!=110){break}if((Ya(b|0,81480)|0)!=0){break}c[m>>2]=2;break}else if((p|0)==99){if(n<<24>>24!=99){break}if((Ya(b|0,91456)|0)!=0){break}c[m>>2]=1;break}else{break}}}while(0);if((a[213992]|0)==0){A=c[m>>2]|0;i=f;return A|0}b=c[o>>2]|0;Ma(167760,11,1,b|0)|0;switch(c[m>>2]|0){case 2:{B=81480;break};case 3:{B=86216;break};case 4:{B=105176;break};case 5:{B=102536;break};case 1:{B=91456;break};default:{B=139120}}gc(b|0,163592,(r=i,i=i+8|0,c[r>>2]=B,r)|0)|0;i=r;if((c[m>>2]|0)==5){gc(b|0,159504,(r=i,i=i+8|0,h[r>>3]=+g[e>>2],r)|0)|0;i=r}gc(b|0,154488,(r=i,i=i+8|0,c[r>>2]=c[d>>2],r)|0)|0;i=r;gc(b|0,151272,(r=i,i=i+8|0,c[r>>2]=c[l>>2],r)|0)|0;i=r;A=c[m>>2]|0;i=f;return A|0}function vv(a,b,c){a=a|0;b=b|0;c=c|0;return uv(ew(a|0,146488)|0,b,c)|0}function wv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=ew(b|0,145176)|0;do{if((h|0)==0){j=d}else{b=ac(h|0,148336,(k=i,i=i+8|0,c[k>>2]=g,k)|0)|0;i=k;k=c[g>>2]|0;if((b|0)==1&(k|0)>-1){j=k;break}k=a[h]|0;if(!((k<<24>>24|0)==116|(k<<24>>24|0)==84)){j=d;break}j=e}}while(0);i=f;return j|0}function xv(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,p=0.0,q=0.0,r=0,s=0.0,t=0.0,u=0,v=0;f=i;g=+((a*100|0)-1|0);if((a|0)>0){j=+(e<<1|0);e=0;k=0.0;l=0.0;while(1){m=j+(+h[b+(e<<5)+16>>3]- +h[b+(e<<5)>>3]);n=j+(+h[b+(e<<5)+24>>3]- +h[b+(e<<5)+8>>3]);p=l-(m+n);q=k-m*n;r=e+1|0;if((r|0)<(a|0)){e=r;k=q;l=p}else{s=q;t=p;break}}}else{s=0.0;t=0.0}l=t*t-g*4.0*s;if(l<0.0){Fv(1,121760,(u=i,i=i+8|0,h[u>>3]=l,u)|0)|0;i=u;v=-1;i=f;return v|0}k=+T(l);j=g*2.0;p=(k-t)/j;q=(-0.0-t-k)/j;e=~~p;a=(e|0)==0?1:e;if((d[213992]|0)>>>0<=2>>>0){v=a;i=f;return v|0}e=c[o>>2]|0;Ma(121216,27,1,e|0)|0;gc(e|0,120144,(u=i,i=i+40|0,h[u>>3]=g,h[u+8>>3]=t,h[u+16>>3]=s,h[u+24>>3]=l,h[u+32>>3]=k,u)|0)|0;i=u;gc(e|0,119328,(u=i,i=i+32|0,c[u>>2]=a,h[u+8>>3]=p,c[u+16>>2]=~~q,h[u+24>>3]=q,u)|0)|0;i=u;gc(e|0,118664,(u=i,i=i+16|0,h[u>>3]=s+(t*p+p*g*p),h[u+8>>3]=s+(t*q+q*g*q),u)|0)|0;i=u;v=a;i=f;return v|0}function yv(a,b,e,f,g,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;l=i;m=a;a=i;i=i+32|0;tF(a,m,32)|0;n=+h[a>>3];if(n<0.0){p=n+-.5}else{p=n+.5}q=+h[a+8>>3];if(q<0.0){r=q+-.5}else{r=q+.5}s=+h[a+16>>3];if(s<0.0){t=s+-.5}else{t=s+.5}u=+h[a+24>>3];if(u<0.0){v=u+-.5}else{v=u+.5}a=Dk()|0;m=g-f|0;w=j-f|0;x=g+f-~~p+~~t|0;g=j+f-~~r+~~v|0;if((m|0)>-1){y=(m|0)/(e|0)|0}else{y=((m+1|0)/(e|0)|0)-1|0}if((w|0)>-1){z=(w|0)/(e|0)|0}else{z=((w+1|0)/(e|0)|0)-1|0}if((x|0)>-1){A=(x|0)/(e|0)|0}else{A=((x+1|0)/(e|0)|0)-1|0}if((g|0)>-1){B=(g|0)/(e|0)|0}else{B=((g+1|0)/(e|0)|0)-1|0}if(!((y|0)>(A|0)|(z|0)>(B|0))){g=y;while(1){y=z;while(1){Gk(a,g,y);if((y|0)<(B|0)){y=y+1|0}else{break}}if((g|0)<(A|0)){g=g+1|0}else{break}}}g=b+4|0;c[g>>2]=Kk(a)|0;A=Jk(a)|0;B=b+8|0;c[B>>2]=A;v=+(f<<1|0);r=+(e|0);e=~~+ca((v+(s-n))/r);f=~~+ca((v+(u-q))/r);c[b>>2]=f+e;if((d[213992]|0)>>>0<=2>>>0){Ek(a);i=l;return}b=c[o>>2]|0;gc(b|0,126120,(z=i,i=i+32|0,c[z>>2]=k,c[z+8>>2]=A,c[z+16>>2]=e,c[z+24>>2]=f,z)|0)|0;i=z;if((c[B>>2]|0)>0){C=0}else{Ek(a);i=l;return}do{f=c[g>>2]|0;e=c[f+(C<<3)+4>>2]|0;gc(b|0,123640,(z=i,i=i+16|0,c[z>>2]=c[f+(C<<3)>>2],c[z+8>>2]=e,z)|0)|0;i=z;C=C+1|0;}while((C|0)<(c[B>>2]|0));Ek(a);i=l;return}function zv(a,b){a=a|0;b=b|0;return(c[c[b>>2]>>2]|0)-(c[c[a>>2]>>2]|0)|0}function Av(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=c[b+12>>2]|0;k=+h[i+(j<<5)>>3];l=+h[i+(j<<5)+8>>3];m=+h[i+(j<<5)+16>>3];n=+h[i+(j<<5)+24>>3];do{if((a|0)==0){o=+(g<<1|0);p=+(f|0);if((Bv((~~+ca((o+(m-k))/p)|0)/-2|0,(~~+ca((o+(n-l))/p)|0)/-2|0,b,d,e,f,i)|0)==0){break}return}}while(0);if((Bv(0,0,b,d,e,f,i)|0)!=0){return}if((~~+ca(m-k)|0)<(~~+ca(n-l)|0)){g=1;a:while(1){a=-g|0;if((g|0)>0){j=0;while(1){q=j-1|0;if((Bv(a,j,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)>(a|0)){j=q}else{s=q;break}}}else{s=0}if((g|0)>(a|0)){j=a;while(1){q=j+1|0;if((Bv(j,s,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)<(g|0)){j=q}else{t=q;break}}}else{t=a}if((s|0)<(g|0)){j=s;while(1){q=j+1|0;if((Bv(t,j,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)<(g|0)){j=q}else{u=q;break}}}else{u=s}if((t|0)>(a|0)){j=t;while(1){q=j-1|0;if((Bv(j,u,b,d,e,f,i)|0)!=0){r=37;break a}if((q|0)>(a|0)){j=q}else{v=q;break}}}else{v=t}if((u|0)>0){j=u;while(1){a=j-1|0;if((Bv(v,j,b,d,e,f,i)|0)!=0){r=37;break a}if((a|0)>0){j=a}else{break}}}g=g+1|0}if((r|0)==37){return}}else{g=1;b:while(1){v=-g|0;if((g|0)>0){u=0;while(1){t=u+1|0;if((Bv(u,v,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)<(g|0)){u=t}else{w=t;break}}}else{w=0}if((g|0)>(v|0)){u=v;while(1){t=u+1|0;if((Bv(w,u,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)<(g|0)){u=t}else{x=t;break}}}else{x=v}if((w|0)>(v|0)){u=w;while(1){t=u-1|0;if((Bv(u,x,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)>(v|0)){u=t}else{y=t;break}}}else{y=w}if((x|0)>(v|0)){u=x;while(1){t=u-1|0;if((Bv(y,u,b,d,e,f,i)|0)!=0){r=37;break b}if((t|0)>(v|0)){u=t}else{z=t;break}}}else{z=x}if((y|0)<0){u=y;while(1){v=u+1|0;if((Bv(u,z,b,d,e,f,i)|0)!=0){r=37;break b}if((v|0)<0){u=v}else{break}}}g=g+1|0}if((r|0)==37){return}}}function Bv(a,b,e,f,g,j,k){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0;l=i;i=i+8|0;m=l|0;n=m;p=e+4|0;q=c[e+8>>2]|0;r=(q|0)>0;a:do{if(r){s=m;t=n+4|0;u=0;v=c[p>>2]|0;while(1){w=v;x=c[w>>2]|0;y=c[w+4>>2]|0;c[m>>2]=x;c[m+4>>2]=y;c[s>>2]=x+a;c[t>>2]=y+b;if((Hk(f,n)|0)!=0){z=0;break}y=u+1|0;if((y|0)<(q|0)){u=y;v=v+8|0}else{break a}}i=l;return z|0}}while(0);v=c[e+12>>2]|0;A=+h[k+(v<<5)>>3];if(A<0.0){B=A+-.5}else{B=A+.5}A=+h[k+(v<<5)+8>>3];if(A<0.0){C=A+-.5}else{C=A+.5}v=g|0;c[v>>2]=(da(j,a)|0)-~~B;k=g+4|0;c[k>>2]=(da(j,b)|0)-~~C;if(r){r=m;j=n+4|0;g=0;e=c[p>>2]|0;while(1){p=e;u=c[p>>2]|0;t=c[p+4>>2]|0;c[m>>2]=u;c[m+4>>2]=t;c[r>>2]=u+a;c[j>>2]=t+b;Fk(f,n);t=g+1|0;if((t|0)<(q|0)){g=t;e=e+8|0}else{break}}}if((d[213992]|0)>>>0<=1>>>0){z=1;i=l;return z|0}e=c[v>>2]|0;v=c[k>>2]|0;gc(c[o>>2]|0,129304,(k=i,i=i+40|0,c[k>>2]=q,c[k+8>>2]=a,c[k+16>>2]=b,c[k+24>>2]=e,c[k+32>>2]=v,k)|0)|0;i=k;z=1;i=l;return z|0}function Cv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=c[43654]|0;e=c[d+(c[(c[a>>2]|0)+16>>2]<<2)>>2]|0;a=c[d+(c[(c[b>>2]|0)+16>>2]<<2)>>2]|0;if((e|0)>(a|0)){f=1;return f|0}f=((e|0)<(a|0))<<31>>31;return f|0}function Dv(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0,g=0;d=c[a>>2]|0;a=c[b>>2]|0;e=+h[d+8>>3]+ +h[d>>3];f=+h[a+8>>3]+ +h[a>>3];if(e<f){g=1;return g|0}g=(e>f)<<31>>31;return g|0}function Ev(a,b,d,e,f,g,j,k){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0;l=i;i=i+64|0;m=l|0;n=l+32|0;o=l+48|0;p=n|0;h[p>>3]=+(b|0);b=n+8|0;h[b>>3]=+(d|0);do{if((k|0)!=0){d=a+8|0;q=c[(c[d>>2]|0)+8>>2]|0;if((q|0)==0){break}if((c[q+4>>2]|0)<=0){i=l;return}r=m;s=n;t=o;u=+(f|0);v=+(g|0);w=+(j|0);x=o|0;y=o+8|0;z=m+16|0;A=0;B=q;do{q=c[B>>2]|0;C=c[q+(A*48|0)>>2]|0;D=c[q+(A*48|0)+4>>2]|0;E=c[q+(A*48|0)+8>>2]|0;F=c[q+(A*48|0)+12>>2]|0;G=q+(A*48|0)+16|0;c[r>>2]=c[G>>2];c[r+4>>2]=c[G+4>>2];c[r+8>>2]=c[G+8>>2];c[r+12>>2]=c[G+12>>2];c[r+16>>2]=c[G+16>>2];c[r+20>>2]=c[G+20>>2];c[r+24>>2]=c[G+24>>2];c[r+28>>2]=c[G+28>>2];if((E|0)==0){E=C;c[s>>2]=c[E>>2];c[s+4>>2]=c[E+4>>2];c[s+8>>2]=c[E+8>>2];c[s+12>>2]=c[E+12>>2];E=C+16|0;c[t>>2]=c[E>>2];c[t+4>>2]=c[E+4>>2];c[t+8>>2]=c[E+8>>2];c[t+12>>2]=c[E+12>>2];H=2}else{c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];E=C;c[t>>2]=c[E>>2];c[t+4>>2]=c[E+4>>2];c[t+8>>2]=c[E+8>>2];c[t+12>>2]=c[E+12>>2];H=1}I=u+ +h[p>>3];h[p>>3]=I;J=v+ +h[b>>3];h[b>>3]=J;if(I<0.0){K=(I+1.0)/w+-1.0}else{K=I/w}h[p>>3]=K;if(J<0.0){L=(J+1.0)/w+-1.0}else{L=J/w}h[b>>3]=L;J=u+ +h[x>>3];h[x>>3]=J;I=v+ +h[y>>3];h[y>>3]=I;if(J<0.0){M=(J+1.0)/w+-1.0}else{M=J/w}h[x>>3]=M;if(I<0.0){N=(I+1.0)/w+-1.0}else{N=I/w}h[y>>3]=N;lv(n,o,e);if((H|0)<(D|0)){E=H;do{c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];G=C+(E<<4)|0;c[t>>2]=c[G>>2];c[t+4>>2]=c[G+4>>2];c[t+8>>2]=c[G+8>>2];c[t+12>>2]=c[G+12>>2];I=u+ +h[x>>3];h[x>>3]=I;J=v+ +h[y>>3];h[y>>3]=J;if(I<0.0){O=(I+1.0)/w+-1.0}else{O=I/w}h[x>>3]=O;if(J<0.0){P=(J+1.0)/w+-1.0}else{P=J/w}h[y>>3]=P;lv(n,o,e);E=E+1|0;}while((E|0)<(D|0))}if((F|0)!=0){c[s>>2]=c[t>>2];c[s+4>>2]=c[t+4>>2];c[s+8>>2]=c[t+8>>2];c[s+12>>2]=c[t+12>>2];c[t>>2]=c[z>>2];c[t+4>>2]=c[z+4>>2];c[t+8>>2]=c[z+8>>2];c[t+12>>2]=c[z+12>>2];J=u+ +h[x>>3];h[x>>3]=J;I=v+ +h[y>>3];h[y>>3]=I;if(J<0.0){Q=(J+1.0)/w+-1.0}else{Q=J/w}h[x>>3]=Q;if(I<0.0){R=(I+1.0)/w+-1.0}else{R=I/w}h[y>>3]=R;lv(n,o,e)}A=A+1|0;B=c[(c[d>>2]|0)+8>>2]|0;}while((A|0)<(c[B+4>>2]|0));i=l;return}}while(0);Pm(o,c[((c[a>>2]&3|0)==2?a:a-32|0)+28>>2]|0);a=o|0;R=+(f|0)+ +h[a>>3];h[a>>3]=R;f=o+8|0;Q=+(g|0)+ +h[f>>3];h[f>>3]=Q;if(R<0.0){S=(R+1.0)/+(j|0)+-1.0}else{S=R/+(j|0)}h[a>>3]=S;if(Q<0.0){T=(Q+1.0)/+(j|0)+-1.0}else{T=Q/+(j|0)}h[f>>3]=T;lv(n,o,e);i=l;return}function Fv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=i;i=i+16|0;f=e|0;g=f;c[g>>2]=d;c[g+4>>2]=0;g=Gv(a,b,f|0)|0;i=e;return g|0}function Gv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;f=(a|0)==3;if(f){g=c[53280]|0}else{g=(a|0)==2?1:a}c[53280]=g;h=c[53250]|0;c[53250]=h>>>0>g>>>0?h:g;if(g>>>0<(c[53282]|0)>>>0){g=c[53278]|0;do{if((g|0)==0){h=_a()|0;c[53278]=h;if((h|0)==0){j=1}else{k=h;break}i=e;return j|0}else{k=g}}while(0);if(f){l=k}else{c[53252]=lb(k|0)|0;l=c[53278]|0}Sb(l|0,b|0,d|0)|0;j=0;i=e;return j|0}l=c[43652]|0;if((l|0)==0){k=c[o>>2]|0;if(!f){gc(k|0,118168,(g=i,i=i+8|0,c[g>>2]=(a|0)==1?156768:127176,g)|0)|0;i=g}Sb(k|0,b|0,d|0)|0;j=0;i=e;return j|0}do{if((c[43650]|0)==0){k=dF(c[242]|0)|0;c[43650]=k;if((k|0)!=0){break}Ma(115128,35,1,c[o>>2]|0)|0;j=0;i=e;return j|0}}while(0);if(!f){Ec[l&63]((a|0)==1?156768:127176)|0;Ec[c[43652]&63](108144)|0}while(1){a=$b(c[43650]|0,c[242]|0,b|0,d|0)|0;l=c[242]|0;if((a|0)>-1&(a|0)<(l|0)){m=12;break}f=l<<1;l=a+1|0;a=(f|0)>(l|0)?f:l;c[242]=a;if((gF(c[43650]|0,a)|0)==0){m=14;break}}if((m|0)==12){Ec[c[43652]&63](c[43650]|0)|0;j=0;i=e;return j|0}else if((m|0)==14){Ma(115128,35,1,c[o>>2]|0)|0;j=0;i=e;return j|0}return 0}function Hv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+16|0;e=d|0;f=e;c[f>>2]=b;c[f+4>>2]=0;Gv(1,a,e|0)|0;i=d;return}function Iv(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;if((e|0)==0){f=(d|0)==0?1024:d;c[b+12>>2]=1;g=dF(f)|0;c[b>>2]=g;h=f;i=g}else{c[b>>2]=e;c[b+12>>2]=0;h=d;i=e}c[b+8>>2]=i+h;c[b+4>>2]=i;a[i]=0;return}function Jv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+8|0;e=a|0;f=c[e>>2]|0;g=f;h=(c[d>>2]|0)-g|0;i=h<<1;j=h+b|0;b=(j|0)>(i|0)?j:i;i=a+4|0;j=(c[i>>2]|0)-g|0;g=a+12|0;if((c[g>>2]|0)==0){a=dF(b)|0;tF(a|0,f|0,j)|0;c[g>>2]=1;k=a}else{k=gF(f,b)|0}c[e>>2]=k;c[i>>2]=k+j;c[d>>2]=k+b;return 0}function Kv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;h=c[g>>2]|0;if((f+d|0)>>>0<=h>>>0){i=f;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}l=a|0;m=c[l>>2]|0;n=m;o=h-n|0;h=o<<1;p=o+d|0;o=(p|0)>(h|0)?p:h;h=f-n|0;n=a+12|0;if((c[n>>2]|0)==0){a=dF(o)|0;tF(a|0,m|0,h)|0;c[n>>2]=1;q=a}else{q=gF(m,o)|0}c[l>>2]=q;l=q+h|0;c[e>>2]=l;c[g>>2]=q+o;i=l;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}function Lv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=xF(b|0)|0;e=a+4|0;f=c[e>>2]|0;g=a+8|0;h=c[g>>2]|0;if((f+d|0)>>>0<=h>>>0){i=f;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}l=a|0;m=c[l>>2]|0;n=m;o=h-n|0;h=o<<1;p=o+d|0;o=(p|0)>(h|0)?p:h;h=f-n|0;n=a+12|0;if((c[n>>2]|0)==0){a=dF(o)|0;tF(a|0,m|0,h)|0;c[n>>2]=1;q=a}else{q=gF(m,o)|0}c[l>>2]=q;l=q+h|0;c[e>>2]=l;c[g>>2]=q+o;i=l;tF(i|0,b|0,d)|0;j=c[e>>2]|0;k=j+d|0;c[e>>2]=k;return d|0}function Mv(a){a=a|0;if((c[a+12>>2]|0)==0){return}eF(c[a>>2]|0);return}function Nv(a){a=a|0;var b=0,e=0,f=0;b=a+4|0;e=c[b>>2]|0;if(e>>>0<=(c[a>>2]|0)>>>0){f=-1;return f|0}c[b>>2]=e-1;f=d[e]|0;return f|0}function Ov(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;h=c[b>>2]&3;if((h|0)==0){j=2}else if((h|0)==2|(h|0)==3){j=8}else if((h|0)==1){j=122}else{Fv(1,102488,(k=i,i=i+8|0,c[k>>2]=h,k)|0)|0;i=k;l=-1;i=g;return l|0}k=Oc[j&255](a,b)|0;if((k|0)==0){l=-1;i=g;return l|0}Sv(a,k,d,e,j,f);l=0;i=g;return l|0}function Pv(a,b){a=a|0;b=b|0;return a|0}function Qv(a,b){a=a|0;b=b|0;var c=0;if((Hx(b|0)|0)==(a|0)){c=b;return c|0}c=zx(a,b,0)|0;return c|0}function Rv(a,b){a=a|0;b=b|0;var c=0;if((Hx(b|0)|0)==(a|0)){c=b;return c|0}c=xw(a,b,0)|0;return c|0}function Sv(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0;g=(f|0)!=0;if(g){Tc[c&127](a,b,d)}h=sy(a)|0;if((h|0)!=0){i=h;do{h=Oc[e&255](i,b)|0;if((h|0)!=0){Sv(i,h,c,d,e,f)}i=ty(i)|0;}while((i|0)!=0)}if(g){return}Tc[c&127](a,b,d);return}function Tv(a,b,d){a=a|0;b=b|0;d=d|0;fy(c[53854]|0,c[b+8>>2]|0)|0;fy(c[53854]|0,c[b+12>>2]|0)|0;tx(c[53854]|0,b);return}function Uv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a|0;e=Vx(d,173376,0)|0;if((e|0)!=0|(b|0)==0){f=e;g=f;return g|0}e=Ix(d)|0;Ov(e,e|0,64,0,1)|0;b=ux(e)|0;if((b|0)!=0){h=b;do{b=h|0;i=Vx(b,c[43580]|0,0)|0;if((i|0)==0){j=5}else{if((c[i+8>>2]|0)==0){j=5}}if((j|0)==5){j=0;Zv(a,b)}b=mw(e,h)|0;if((b|0)!=0){i=b;do{b=i|0;k=Vx(b,c[43580]|0,0)|0;if((k|0)==0){j=9}else{if((c[k+8>>2]|0)==0){j=9}}if((j|0)==9){j=0;Zv(a,b)}i=ow(e,i)|0;}while((i|0)!=0)}h=vx(e,h)|0;}while((h|0)!=0)}f=Vx(d,173376,0)|0;g=f;return g|0}function Vv(a){a=a|0;return Vx(a,c[43580]|0,0)|0}function Wv(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;g=i;i=i+72|0;h=g|0;j=g+24|0;k=g+48|0;do{if((b|0)==0){l=c[53550]|0;if((l|0)!=0){m=l;break}l=Hw(0,172632,0)|0;c[53550]=l;m=l}else{m=b}}while(0);b=m|0;if((f|0)==0){l=Vx(b,173376,0)|0;if((l|0)==0){n=0;i=g;return n|0}if((d|0)==0){o=c[l+16>>2]|0}else if((d|0)==1){o=c[l+8>>2]|0}else if((d|0)==3|(d|0)==2){o=c[l+12>>2]|0}else{Fv(1,96792,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;n=0;i=g;return n|0}if((o|0)==0){n=0;i=g;return n|0}c[h+8>>2]=e;n=Hc[c[o>>2]&63](o,h,4)|0;i=g;return n|0}h=Ix(b)|0;Uv(m,1)|0;o=Vx(b,173376,0)|0;do{if((o|0)==0){q=0}else{if((d|0)==0){q=c[o+16>>2]|0;break}else if((d|0)==3|(d|0)==2){q=c[o+12>>2]|0;break}else if((d|0)==1){q=c[o+8>>2]|0;break}else{Fv(1,96792,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;q=0;break}}}while(0);o=fh(q,0)|0;c[k+8>>2]=e;l=q|0;r=Hc[c[l>>2]&63](q,k,4)|0;fh(q,o)|0;do{if((r|0)==0){c[j+8>>2]=e;o=Hc[c[l>>2]&63](q,j,4)|0;if((o|0)!=0){k=c[o+16>>2]|0;o=sx(m,24)|0;a[o+20|0]=d;c[o+8>>2]=dy(m,e)|0;c[o+12>>2]=dy(m,f)|0;c[o+16>>2]=k;Hc[c[l>>2]&63](q,o,1)|0;s=o;t=37;break}o=Vx(h|0,173376,0)|0;do{if((o|0)==0){u=0}else{if((d|0)==0){u=c[o+16>>2]|0;break}else if((d|0)==1){u=c[o+8>>2]|0;break}else if((d|0)==3|(d|0)==2){u=c[o+12>>2]|0;break}else{Fv(1,96792,(p=i,i=i+8|0,c[p>>2]=d,p)|0)|0;i=p;u=0;break}}}while(0);o=bh(u)|0;k=sx(m,24)|0;v=k;a[k+20|0]=d;c[k+8>>2]=dy(m,e)|0;w=k+12|0;c[w>>2]=dy(m,f)|0;x=k+16|0;c[x>>2]=o;Hc[c[u>>2]&63](u,k,1)|0;if((d|0)==0){Ov(h,h|0,76,k,1)|0;s=v;t=37;break}else if((d|0)==3|(d|0)==2){k=ux(h)|0;if((k|0)==0){s=v;t=37;break}o=m+52|0;y=k;while(1){k=mw(h,y)|0;if((k|0)!=0){z=k;do{k=Vx(z|0,c[43580]|0,0)|0;A=c[x>>2]|0;if((A|0)>3){B=c[o>>2]|0;C=k+12|0;D=A<<2;c[C>>2]=Sc[c[(c[B>>2]|0)+8>>2]&127](c[B+12>>2]|0,c[C>>2]|0,D,D+4|0)|0;E=C}else{E=k+12|0}k=dy(m,c[w>>2]|0)|0;c[(c[E>>2]|0)+(c[x>>2]<<2)>>2]=k;z=ow(h,z)|0;}while((z|0)!=0)}z=vx(h,y)|0;if((z|0)==0){s=v;t=37;break}else{y=z}}}else if((d|0)==1){y=ux(h)|0;if((y|0)==0){F=v;break}o=m+52|0;z=y;while(1){y=Vx(z|0,c[43580]|0,0)|0;k=c[x>>2]|0;if((k|0)>3){C=c[o>>2]|0;D=y+12|0;B=k<<2;c[D>>2]=Sc[c[(c[C>>2]|0)+8>>2]&127](c[C+12>>2]|0,c[D>>2]|0,B,B+4|0)|0;G=D}else{G=y+12|0}y=dy(m,c[w>>2]|0)|0;c[(c[G>>2]|0)+(c[x>>2]<<2)>>2]=y;y=vx(h,z)|0;if((y|0)==0){s=v;t=37;break}else{z=y}}}else{F=v;break}}else{z=r+12|0;fy(m,c[z>>2]|0)|0;c[z>>2]=dy(m,f)|0;s=r;t=37}}while(0);do{if((t|0)==37){if(!((s|0)!=0&(d|0)==0)){F=s;break}hw(b,s,f)|0;F=s}}while(0);Lx(m,b,F);n=F;i=g;return n|0}function Xv(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;f=Vx(a|0,173376,0)|0;if((f|0)==0){g=0;i=e;return g|0}if((b|0)==0){h=c[f+16>>2]|0}else if((b|0)==3|(b|0)==2){h=c[f+12>>2]|0}else if((b|0)==1){h=c[f+8>>2]|0}else{Fv(1,96792,(f=i,i=i+8|0,c[f>>2]=b,f)|0)|0;i=f;g=0;i=e;return g|0}if((h|0)==0){g=0;i=e;return g|0}f=c[h>>2]|0;if((d|0)==0){g=Hc[f&63](h,0,128)|0;i=e;return g|0}else{g=Hc[f&63](h,d,8)|0;i=e;return g|0}return 0}function Yv(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=b+12|0;a[d]=a[d]|64;d=b|0;e=Wx(d,173376,20,0)|0;f=e+8|0;c[f>>2]=yy(b,174328,c[43326]|0)|0;g=e+12|0;c[g>>2]=yy(b,174328,c[43326]|0)|0;h=e+16|0;c[h>>2]=yy(b,174328,c[43326]|0)|0;e=uy(b)|0;if((e|0)!=0){i=Vx(e|0,173376,0)|0;fh(c[f>>2]|0,c[i+8>>2]|0)|0;fh(c[g>>2]|0,c[i+12>>2]|0)|0;fh(c[h>>2]|0,c[i+16>>2]|0)|0;j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}i=c[53550]|0;if((i|0)==0|(i|0)==(b|0)){j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}e=Vx(i|0,173376,0)|0;i=c[e+8>>2]|0;m=c[f>>2]|0;f=i|0;n=Hc[c[f>>2]&63](i,0,128)|0;if((n|0)!=0){o=m|0;p=n;do{n=c[p+8>>2]|0;q=c[p+12>>2]|0;r=c[p+16>>2]|0;s=sx(b,24)|0;a[s+20|0]=1;c[s+8>>2]=dy(b,n)|0;c[s+12>>2]=dy(b,q)|0;c[s+16>>2]=r;a[s+22|0]=a[p+22|0]|0;a[s+21|0]=a[p+21|0]|0;Hc[c[o>>2]&63](m,s,1)|0;p=Hc[c[f>>2]&63](i,p,8)|0;}while((p|0)!=0)}p=c[e+12>>2]|0;i=p;f=c[g>>2]|0;g=p;p=Hc[c[g>>2]&63](i,0,128)|0;if((p|0)!=0){m=f|0;o=p;do{p=c[o+8>>2]|0;s=c[o+12>>2]|0;r=c[o+16>>2]|0;q=sx(b,24)|0;a[q+20|0]=2;c[q+8>>2]=dy(b,p)|0;c[q+12>>2]=dy(b,s)|0;c[q+16>>2]=r;a[q+22|0]=a[o+22|0]|0;a[q+21|0]=a[o+21|0]|0;Hc[c[m>>2]&63](f,q,1)|0;o=Hc[c[g>>2]&63](i,o,8)|0;}while((o|0)!=0)}o=c[e+16>>2]|0;e=c[h>>2]|0;h=o|0;i=Hc[c[h>>2]&63](o,0,128)|0;if((i|0)==0){j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}g=e|0;f=i;do{i=c[f+8>>2]|0;m=c[f+12>>2]|0;q=c[f+16>>2]|0;r=sx(b,24)|0;a[r+20|0]=0;c[r+8>>2]=dy(b,i)|0;c[r+12>>2]=dy(b,m)|0;c[r+16>>2]=q;a[r+22|0]=a[f+22|0]|0;a[r+21|0]=a[f+21|0]|0;Hc[c[g>>2]&63](e,r,1)|0;f=Hc[c[h>>2]&63](o,f,8)|0;}while((f|0)!=0);j=uy(b)|0;k=(j|0)==0;l=k?b:j;Zv(l,d);return}function Zv(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=Wx(b,c[43580]|0,16,0)|0;f=b;g=c[f>>2]&3;h=a|0;a=Vx(h,173376,0)|0;do{if((a|0)==0){j=0}else{if((g|0)==3|(g|0)==2){j=c[a+12>>2]|0;break}else if((g|0)==0){j=c[a+16>>2]|0;break}else if((g|0)==1){j=c[a+8>>2]|0;break}else{Fv(1,96792,(k=i,i=i+8|0,c[k>>2]=g,k)|0)|0;i=k;j=0;break}}}while(0);g=e+8|0;if((c[g>>2]|0)!=0){i=d;return}a=Ix(h)|0;h=c[f>>2]&3;l=Vx(a|0,173376,0)|0;do{if((l|0)==0){m=0}else{if((h|0)==0){m=c[l+16>>2]|0;break}else if((h|0)==1){m=c[l+8>>2]|0;break}else if((h|0)==3|(h|0)==2){m=c[l+12>>2]|0;break}else{Fv(1,96792,(k=i,i=i+8|0,c[k>>2]=h,k)|0)|0;i=k;m=0;break}}}while(0);c[g>>2]=m;m=Ix(Hx(b)|0)|0;g=c[f>>2]&3;f=Vx(m|0,173376,0)|0;do{if((f|0)==0){n=0}else{if((g|0)==0){o=c[f+16>>2]|0}else if((g|0)==1){o=c[f+8>>2]|0}else if((g|0)==3|(g|0)==2){o=c[f+12>>2]|0}else{Fv(1,96792,(k=i,i=i+8|0,c[k>>2]=g,k)|0)|0;i=k;n=0;break}if((o|0)==0){n=0;break}n=bh(o)|0}}while(0);o=Hx(b)|0;k=e+12|0;c[k>>2]=sx(o,(n|0)<4?16:n<<2)|0;n=j|0;o=Hc[c[n>>2]&63](j,0,128)|0;if((o|0)==0){i=d;return}else{p=o}do{o=Hx(b)|0;e=dy(o,c[p+12>>2]|0)|0;c[(c[k>>2]|0)+(c[p+16>>2]<<2)>>2]=e;p=Hc[c[n>>2]&63](j,p,8)|0;}while((p|0)!=0);i=d;return}function _v(a){a=a|0;var b=0,d=0,e=0;c[53854]=a;b=a|0;d=Vx(b,c[43580]|0,0)|0;if((d|0)!=0){$v(a|0,d);Xx(b,c[d>>2]|0)|0}d=Vx(b,173376,0)|0;if((d|0)==0){e=0;return e|0}if((Ay(a,c[d+8>>2]|0)|0)!=0){e=1;return e|0}if((Ay(a,c[d+12>>2]|0)|0)!=0){e=1;return e|0}if((Ay(a,c[d+16>>2]|0)|0)!=0){e=1;return e|0}Xx(b,c[d>>2]|0)|0;e=0;return e|0}function $v(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;e=a|0;f=Hx(e)|0;g=Ix(Hx(e)|0)|0;e=c[a>>2]&3;a=Vx(g|0,173376,0)|0;do{if((a|0)!=0){if((e|0)==3|(e|0)==2){h=c[a+12>>2]|0}else if((e|0)==1){h=c[a+8>>2]|0}else if((e|0)==0){h=c[a+16>>2]|0}else{Fv(1,96792,(g=i,i=i+8|0,c[g>>2]=e,g)|0)|0;i=g;break}if((h|0)==0){break}g=bh(h)|0;j=b+12|0;k=c[j>>2]|0;if((g|0)>0){l=0;m=k}else{n=k;o=n;tx(f,o);i=d;return}while(1){fy(f,c[m+(l<<2)>>2]|0)|0;k=l+1|0;p=c[j>>2]|0;if((k|0)<(g|0)){l=k;m=p}else{n=p;break}}o=n;tx(f,o);i=d;return}}while(0);n=c[b+12>>2]|0;o=n;tx(f,o);i=d;return}function aw(a,b){a=a|0;b=b|0;var d=0;d=b|0;b=Vx(d,c[43580]|0,0)|0;do{if((b|0)!=0){if((c[b+8>>2]|0)==0){break}return}}while(0);Zv(a,d);return}function bw(a){a=a|0;var b=0,d=0;b=a|0;d=Vx(b,c[43580]|0,0)|0;if((d|0)==0){return}$v(a|0,d);Xx(b,c[43580]|0)|0;return}function cw(a,b){a=a|0;b=b|0;var d=0;d=b|0;b=Vx(d,c[43580]|0,0)|0;do{if((b|0)!=0){if((c[b+8>>2]|0)==0){break}return}}while(0);Zv(a,d);return}function dw(a){a=a|0;var b=0,d=0;b=a|0;d=Vx(b,c[43580]|0,0)|0;if((d|0)==0){return}$v(a|0,d);Xx(b,c[43580]|0)|0;return}function ew(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+24|0;e=d|0;f=Vx(a,c[43580]|0,0)|0;if((f|0)==0){g=0;i=d;return g|0}h=c[f+8>>2]|0;c[e+8>>2]=b;b=Hc[c[h>>2]&63](h,e,4)|0;if((b|0)==0){g=0;i=d;return g|0}e=Vx(a,c[43580]|0,0)|0;g=c[(c[e+12>>2]|0)+(c[b+16>>2]<<2)>>2]|0;i=d;return g|0}function fw(a,b){a=a|0;b=b|0;var d=0;d=Vx(a,c[43580]|0,0)|0;return c[(c[d+12>>2]|0)+(c[b+16>>2]<<2)>>2]|0}function gw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+24|0;f=e|0;g=Vx(a,c[43580]|0,0)|0;if((g|0)==0){h=-1;i=e;return h|0}j=c[g+8>>2]|0;c[f+8>>2]=b;b=Hc[c[j>>2]&63](j,f,4)|0;if((b|0)==0){h=-1;i=e;return h|0}hw(a,b,d)|0;h=0;i=e;return h|0}function hw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+24|0;g=f|0;h=Hx(b)|0;j=Vx(b,c[43580]|0,0)|0;k=d+16|0;l=j+12|0;fy(h,c[(c[l>>2]|0)+(c[k>>2]<<2)>>2]|0)|0;j=dy(h,e)|0;c[(c[l>>2]|0)+(c[k>>2]<<2)>>2]=j;j=b;if((c[j>>2]&3|0)!=0){Lx(h,b,d);i=f;return 0}l=c[(Vx(h|0,173376,0)|0)+16>>2]|0;m=d+8|0;n=c[m>>2]|0;o=fh(l,0)|0;c[g+8>>2]=n;n=l|0;p=Hc[c[n>>2]&63](l,g,4)|0;fh(l,o)|0;if((p|0)==0){o=c[m>>2]|0;m=c[k>>2]|0;k=c[j>>2]|0;j=sx(h,24)|0;a[j+20|0]=k&3;c[j+8>>2]=dy(h,o)|0;c[j+12>>2]=dy(h,e)|0;c[j+16>>2]=m;Hc[c[n>>2]&63](l,j,1)|0;Lx(h,b,d);i=f;return 0}else{j=p+12|0;fy(h,c[j>>2]|0)|0;c[j>>2]=dy(h,e)|0;Lx(h,b,d);i=f;return 0}return 0}function iw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+24|0;g=f|0;h=Hx(a)|0;j=a;k=c[j>>2]&3;do{if((h|0)==0){l=c[53550]|0;if((l|0)!=0){m=l;break}l=Hw(0,172632,0)|0;c[53550]=l;m=l}else{m=h}}while(0);h=Vx(m|0,173376,0)|0;do{if((h|0)!=0){if((k|0)==3|(k|0)==2){n=c[h+12>>2]|0}else if((k|0)==1){n=c[h+8>>2]|0}else if((k|0)==0){n=c[h+16>>2]|0}else{Fv(1,96792,(m=i,i=i+8|0,c[m>>2]=k,m)|0)|0;i=m;break}if((n|0)==0){break}c[g+8>>2]=b;m=Hc[c[n>>2]&63](n,g,4)|0;if((m|0)==0){break}else{o=m}p=hw(a,o,d)|0;i=f;return 0}}while(0);g=Hx(a)|0;o=Wv(g,c[j>>2]&3,b,e)|0;p=hw(a,o,d)|0;i=f;return 0}function jw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+24|0;e=d|0;f=Hx(a)|0;g=a;h=c[g>>2]|0;if(((c[b>>2]^h)&3|0)!=0){j=1;i=d;return j|0}k=f|0;f=Vx(k,173376,0)|0;if((f|0)==0){j=1;i=d;return j|0}l=e;m=e+8|0;e=0;n=1;o=h;h=f;while(1){p=o&3;if((p|0)==0){q=c[h+16>>2]|0}else if((p|0)==3|(p|0)==2){q=c[h+12>>2]|0}else if((p|0)==1){q=c[h+8>>2]|0}else{r=8;break}if((q|0)==0){j=n;r=19;break}f=c[q>>2]|0;if((e|0)==0){s=Hc[f&63](q,0,128)|0}else{s=Hc[f&63](q,e,8)|0}if((s|0)==0){j=n;r=19;break}f=c[s+8>>2]|0;t=Vx(b,c[43580]|0,0)|0;if((t|0)==0){j=1;r=19;break}u=c[t+8>>2]|0;c[m>>2]=f;f=Hc[c[u>>2]&63](u,l,4)|0;if((f|0)==0){j=1;r=19;break}u=Vx(a,c[43580]|0,0)|0;t=c[(c[u+12>>2]|0)+(c[s+16>>2]<<2)>>2]|0;hw(b,f,t)|0;if((gy(t)|0)!=0){t=Vx(b,c[43580]|0,0)|0;hy(c[(c[t+12>>2]|0)+(c[f+16>>2]<<2)>>2]|0)}f=c[g>>2]|0;t=Vx(k,173376,0)|0;if((t|0)==0){j=0;r=19;break}else{e=s;n=0;o=f;h=t}}if((r|0)==8){Fv(1,96792,(h=i,i=i+8|0,c[h>>2]=p,h)|0)|0;i=h;j=n;i=d;return j|0}else if((r|0)==19){i=d;return j|0}return 0}function kw(a,b,c){a=a|0;b=b|0;c=c|0;Yv(a);return}function lw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=Vx(b|0,c[43580]|0,0)|0;b=d+16|0;f=c[b>>2]|0;if((f|0)>3){g=c[a+52>>2]|0;h=e+12|0;i=f<<2;c[h>>2]=Sc[c[(c[g>>2]|0)+8>>2]&127](c[g+12>>2]|0,c[h>>2]|0,i,i+4|0)|0;j=h}else{j=e+12|0}e=dy(a,c[d+12>>2]|0)|0;c[(c[j>>2]|0)+(c[b>>2]<<2)>>2]=e;return}function mw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+40|0;e=d|0;do{if((c[b+12>>2]|0)==(a|0)){f=b+16|0}else{c[e+16>>2]=b;g=c[a+28>>2]|0;h=Hc[c[g>>2]&63](g,e,4)|0;if((h|0)==0){j=0}else{f=h;break}i=d;return j|0}}while(0);e=a+32|0;a=f+32|0;ah(c[e>>2]|0,c[a>>2]|0)|0;f=c[e>>2]|0;b=Hc[c[f>>2]&63](f,0,128)|0;c[a>>2]=Yg(c[e>>2]|0)|0;j=b;i=d;return j|0}function nw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;i=i+40|0;e=d|0;if((c[b+12>>2]|0)==(a|0)){f=b+16|0;i=d;return f|0}else{c[e+16>>2]=b;b=c[a+28>>2]|0;f=Hc[c[b>>2]&63](b,e,4)|0;i=d;return f|0}return 0}function ow(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+40|0;e=d|0;f=c[((c[b>>2]&3|0)==3?b:b+32|0)+28>>2]|0;do{if((c[f+12>>2]|0)==(a|0)){g=f+16|0}else{c[e+16>>2]=f;h=c[a+28>>2]|0;j=Hc[c[h>>2]&63](h,e,4)|0;if((j|0)==0){k=0}else{g=j;break}i=d;return k|0}}while(0);e=a+32|0;a=g+32|0;ah(c[e>>2]|0,c[a>>2]|0)|0;g=c[e>>2]|0;f=Hc[c[g>>2]&63](g,b|0,8)|0;c[a>>2]=Yg(c[e>>2]|0)|0;k=f;i=d;return k|0}function pw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;i=i+40|0;e=d|0;do{if((c[b+12>>2]|0)==(a|0)){f=b+16|0}else{c[e+16>>2]=b;g=c[a+28>>2]|0;h=Hc[c[g>>2]&63](g,e,4)|0;if((h|0)==0){j=0}else{f=h;break}i=d;return j|0}}while(0);e=a+32|0;a=f+28|0;ah(c[e>>2]|0,c[a>>2]|0)|0;f=c[e>>2]|0;b=Hc[c[f>>2]&63](f,0,128)|0;c[a>>2]=Yg(c[e>>2]|0)|0;j=b;i=d;return j|0}function qw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;i=i+40|0;e=d|0;f=c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0;do{if((c[f+12>>2]|0)==(a|0)){g=f+16|0}else{c[e+16>>2]=f;h=c[a+28>>2]|0;j=Hc[c[h>>2]&63](h,e,4)|0;if((j|0)==0){k=0}else{g=j;break}i=d;return k|0}}while(0);e=a+32|0;a=g+28|0;ah(c[e>>2]|0,c[a>>2]|0)|0;g=c[e>>2]|0;f=Hc[c[g>>2]&63](g,b|0,8)|0;c[a>>2]=Yg(c[e>>2]|0)|0;k=f;i=d;return k|0}function rw(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;i=i+80|0;e=d|0;f=d+40|0;g=b+12|0;if((c[g>>2]|0)==(a|0)){h=b+16|0;j=4}else{c[f+16>>2]=b;k=c[a+28>>2]|0;l=Hc[c[k>>2]&63](k,f,4)|0;if((l|0)!=0){h=l;j=4}}do{if((j|0)==4){l=a+32|0;f=h+32|0;ah(c[l>>2]|0,c[f>>2]|0)|0;k=c[l>>2]|0;m=Hc[c[k>>2]&63](k,0,128)|0;c[f>>2]=Yg(c[l>>2]|0)|0;if((m|0)==0){break}else{n=m}i=d;return n|0}}while(0);do{if((c[g>>2]|0)==(a|0)){o=b+16|0}else{c[e+16>>2]=b;h=c[a+28>>2]|0;j=Hc[c[h>>2]&63](h,e,4)|0;if((j|0)==0){n=0}else{o=j;break}i=d;return n|0}}while(0);e=a+32|0;a=o+28|0;ah(c[e>>2]|0,c[a>>2]|0)|0;o=c[e>>2]|0;b=Hc[c[o>>2]&63](o,0,128)|0;c[a>>2]=Yg(c[e>>2]|0)|0;n=b;i=d;return n|0}function sw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;e=i;i=i+160|0;f=e|0;g=e+40|0;h=e+80|0;j=e+120|0;k=c[b>>2]|0;if((k&3|0)!=2){l=f+16|0;m=f;f=a+32|0;n=a+28|0;o=b;p=k;while(1){k=c[((p&3|0)==2?o:o-32|0)+28>>2]|0;if((c[k+12>>2]|0)==(a|0)){q=k+16|0}else{c[l>>2]=k;k=c[n>>2]|0;r=Hc[c[k>>2]&63](k,m,4)|0;if((r|0)==0){s=0;t=26;break}else{q=r}}r=q+28|0;ah(c[f>>2]|0,c[r>>2]|0)|0;k=c[f>>2]|0;u=Hc[c[k>>2]&63](k,o|0,8)|0;k=u;c[r>>2]=Yg(c[f>>2]|0)|0;if((u|0)==0){s=0;t=26;break}if((c[u+28>>2]|0)!=(d|0)){s=k;t=26;break}o=k;p=c[u>>2]|0}if((t|0)==26){i=e;return s|0}}p=c[b+60>>2]|0;do{if((c[p+12>>2]|0)==(a|0)){v=p+16|0;t=7}else{c[j+16>>2]=p;o=a+28|0;f=c[o>>2]|0;q=Hc[c[f>>2]&63](f,j,4)|0;if((q|0)!=0){v=q;t=7;break}w=a+32|0;x=o}}while(0);do{if((t|0)==7){j=a+32|0;p=v+32|0;ah(c[j>>2]|0,c[p>>2]|0)|0;o=c[j>>2]|0;q=Hc[c[o>>2]&63](o,b|0,8)|0;c[p>>2]=Yg(c[j>>2]|0)|0;if((q|0)==0){w=j;x=a+28|0;break}else{s=q;i=e;return s|0}}}while(0);b=g+16|0;v=h+16|0;q=h;h=d+12|0;j=d+16|0;p=g;g=0;while(1){if((g|0)==0){if((c[h>>2]|0)==(a|0)){y=j}else{c[v>>2]=d;o=c[x>>2]|0;f=Hc[c[o>>2]&63](o,q,4)|0;if((f|0)==0){s=0;t=26;break}else{y=f}}f=y+28|0;ah(c[w>>2]|0,c[f>>2]|0)|0;o=c[w>>2]|0;m=Hc[c[o>>2]&63](o,0,128)|0;c[f>>2]=Yg(c[w>>2]|0)|0;z=m}else{m=c[((c[g>>2]&3|0)==2?g:g-32|0)+28>>2]|0;if((c[m+12>>2]|0)==(a|0)){A=m+16|0}else{c[b>>2]=m;m=c[x>>2]|0;f=Hc[c[m>>2]&63](m,p,4)|0;if((f|0)==0){s=0;t=26;break}else{A=f}}f=A+28|0;ah(c[w>>2]|0,c[f>>2]|0)|0;m=c[w>>2]|0;o=Hc[c[m>>2]&63](m,g|0,8)|0;c[f>>2]=Yg(c[w>>2]|0)|0;z=o}o=z;if((z|0)==0){s=0;t=26;break}if((c[z+28>>2]|0)==(d|0)){g=o}else{s=o;t=26;break}}if((t|0)==26){i=e;return s|0}return 0}function tw(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0;zx(b,d,1)|0;zx(b,e,1)|0;g=sx(b,64)|0;h=g;i=Jw(b,2)|0;j=g+32|0;k=c[j>>2]|0;l=g;m=c[l>>2]|0;c[g+4>>2]=f;c[g+36>>2]=f;f=i<<4;c[l>>2]=m&12|f|2;c[j>>2]=k&12|f|3;c[g+60>>2]=d;c[g+28>>2]=e;yw(b,h);if((a[b+12|0]&64)==0){Jx(b,g);return h|0}Wx(g,c[43580]|0,16,0)|0;cw(b,h);Jx(b,g);return h|0}function uw(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;h=i;i=i+368|0;j=h|0;k=h+40|0;l=h+72|0;m=h+112|0;n=h+144|0;o=h+184|0;p=h+216|0;q=h+256|0;r=h+288|0;s=h+328|0;t=h+360|0;do{if((Yw(b,2,f,t,0)|0)==0){if((f|0)!=0){break}if((g|0)==0){u=0;v=0;w=0;x=0;y=6;break}if((Pw(b)|0)!=0){u=0;v=0;w=0;x=0;y=6}}else{u=0;v=2;w=c[t>>2]|0;x=0;y=6}}while(0);do{if((y|0)==6){z=s|0;A=(d|0)==0|(e|0)==0;do{if(!A){B=s;c[B>>2]=v|x;c[B+4>>2]=u|w;c[s+28>>2]=d;if((c[e+12>>2]|0)==(b|0)){C=e+16|0}else{c[r+16>>2]=e;B=c[b+28>>2]|0;D=Hc[c[B>>2]&63](B,r,4)|0;if((D|0)==0){break}else{C=D}}D=b+36|0;B=C+20|0;ah(c[D>>2]|0,c[B>>2]|0)|0;E=c[D>>2]|0;F=Hc[c[E>>2]&63](E,z,4)|0;c[B>>2]=Yg(c[D>>2]|0)|0;if((F|0)==0){break}else{G=F}i=h;return G|0}}while(0);do{if((Ow(b)|0)!=0){z=q|0;if(A){break}F=q;c[F>>2]=v|x;c[F+4>>2]=u|w;c[q+28>>2]=e;if((c[d+12>>2]|0)==(b|0)){H=d+16|0}else{c[p+16>>2]=d;F=c[b+28>>2]|0;D=Hc[c[F>>2]&63](F,p,4)|0;if((D|0)==0){break}else{H=D}}D=b+36|0;F=H+20|0;ah(c[D>>2]|0,c[F>>2]|0)|0;B=c[D>>2]|0;E=Hc[c[B>>2]&63](B,z,4)|0;c[F>>2]=Yg(c[D>>2]|0)|0;if((E|0)==0){break}else{G=E}i=h;return G|0}}while(0);if((g|0)==0){G=0;i=h;return G|0}E=b|0;D=Ix(E)|0;F=o|0;do{if(A){y=23}else{z=o;c[z>>2]=v|x;c[z+4>>2]=u|w;c[o+28>>2]=d;if((c[e+12>>2]|0)==(D|0)){I=e+16|0}else{c[n+16>>2]=e;z=c[D+28>>2]|0;B=Hc[c[z>>2]&63](z,n,4)|0;if((B|0)==0){y=23;break}else{I=B}}B=D+36|0;z=I+20|0;ah(c[B>>2]|0,c[z>>2]|0)|0;J=c[B>>2]|0;K=Hc[c[J>>2]&63](J,F,4)|0;c[z>>2]=Yg(c[B>>2]|0)|0;if((K|0)==0){y=23}else{L=K}}}while(0);if((y|0)==23){if((Ow(b)|0)==0){break}F=Ix(E)|0;D=m|0;if(A){break}K=m;c[K>>2]=v|x;c[K+4>>2]=u|w;c[m+28>>2]=e;if((c[d+12>>2]|0)==(F|0)){M=d+16|0}else{c[l+16>>2]=d;K=c[F+28>>2]|0;B=Hc[c[K>>2]&63](K,l,4)|0;if((B|0)==0){break}else{M=B}}B=F+36|0;F=M+20|0;ah(c[B>>2]|0,c[F>>2]|0)|0;K=c[B>>2]|0;z=Hc[c[K>>2]&63](K,D,4)|0;c[F>>2]=Yg(c[B>>2]|0)|0;if((z|0)==0){break}else{L=z}}z=L;yw(b,z);G=z;i=h;return G|0}}while(0);if((g|0)==0){G=0;i=h;return G|0}do{if((Pw(b)|0)!=0){if((a[b+12|0]&4)!=0&(d|0)==(e|0)){G=0;i=h;return G|0}g=k|0;if((d|0)==0|(e|0)==0){break}L=k;c[L>>2]=0;c[L+4>>2]=0;c[k+28>>2]=d;if((c[e+12>>2]|0)==(b|0)){N=e+16|0}else{c[j+16>>2]=e;L=c[b+28>>2]|0;M=Hc[c[L>>2]&63](L,j,4)|0;if((M|0)==0){break}else{N=M}}M=b+36|0;L=N+20|0;ah(c[M>>2]|0,c[L>>2]|0)|0;l=c[M>>2]|0;m=Hc[c[l>>2]&63](l,g,4)|0;c[L>>2]=Yg(c[M>>2]|0)|0;if((m|0)==0){break}else{G=0}i=h;return G|0}}while(0);if((Yw(b,2,f,t,1)|0)==0){G=0;i=h;return G|0}f=tw(b,d,e,c[t>>2]|0)|0;ax(b,2,f|0);G=f;i=h;return G|0}function vw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+80|0;e=d|0;f=d+40|0;g=(c[b>>2]&3|0)==3;h=g?b-32|0:b;j=g?b:b+32|0;b=c[j+28>>2]|0;g=c[h+28>>2]|0;if((c[b+12>>2]|0)==(a|0)){k=b+16|0}else{c[f+16>>2]=b;b=c[a+28>>2]|0;k=Hc[c[b>>2]&63](b,f,4)|0}f=a+32|0;b=c[f>>2]|0;l=k+32|0;ah(b,c[l>>2]|0)|0;m=h|0;Hc[c[b>>2]&63](b,m,2)|0;c[l>>2]=Yg(b)|0;b=a+36|0;l=c[b>>2]|0;h=k+24|0;ah(l,c[h>>2]|0)|0;Hc[c[l>>2]&63](l,m,2)|0;c[h>>2]=Yg(l)|0;if((c[g+12>>2]|0)==(a|0)){n=g+16|0}else{c[e+16>>2]=g;g=c[a+28>>2]|0;n=Hc[c[g>>2]&63](g,e,4)|0}e=c[f>>2]|0;f=n+28|0;ah(e,c[f>>2]|0)|0;g=j|0;Hc[c[e>>2]&63](e,g,2)|0;c[f>>2]=Yg(e)|0;e=c[b>>2]|0;b=n+20|0;ah(e,c[b>>2]|0)|0;Hc[c[e>>2]&63](e,g,2)|0;c[b>>2]=Yg(e)|0;i=d;return}
+
+
+
+function eh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Za=0,_a=0,$a=0,ab=0,bb=0;e=i;i=i+128|0;f=e|0;g=e+8|0;h=a+8|0;j=c[h>>2]|0;if((c[j>>2]&4096|0)==0){k=j}else{ah(a,0)|0;k=c[h>>2]|0}j=c[a+4>>2]|0;l=c[j>>2]|0;m=c[j+4>>2]|0;n=j+8|0;o=c[n>>2]|0;p=c[j+20>>2]|0;q=a+20|0;c[q>>2]=c[q>>2]&-32769;r=c[k+4>>2]|0;if((b|0)==0){if((r|0)==0){s=0;i=e;return s|0}if((d&448|0)==0){s=0;i=e;return s|0}if((d&64|0)==0){do{if((d&256|0)==0){t=r+4|0;u=c[t>>2]|0;if((u|0)==0){v=r;break}else{w=r;x=t;y=u}while(1){u=y|0;c[x>>2]=c[u>>2];c[u>>2]=w;u=y+4|0;t=c[u>>2]|0;if((t|0)==0){v=y;break}else{w=y;x=u;y=t}}}else{t=r|0;u=c[t>>2]|0;if((u|0)==0){v=r;break}else{z=r;A=t;B=u}while(1){u=B+4|0;c[A>>2]=c[u>>2];c[u>>2]=z;u=B|0;t=c[u>>2]|0;if((t|0)==0){v=B;break}else{z=B;A=u;B=t}}}}while(0);c[(c[h>>2]|0)+4>>2]=v;if((o|0)<0){s=c[v+8>>2]|0;i=e;return s|0}else{s=v+(-o|0)|0;i=e;return s|0}}v=j+16|0;if((c[v>>2]|0)==0){if((c[n>>2]|0)<0){C=9}else{D=k}}else{C=9}if((C|0)==9){k=a+12|0;B=-o|0;if((o|0)<0){A=r;while(1){z=A+4|0;y=c[z>>2]|0;if((y|0)!=0){x=y|0;c[z>>2]=c[x>>2];c[x>>2]=A;A=y;continue}y=c[A>>2]|0;x=c[v>>2]|0;if((x|0)!=0){Tc[x&127](a,c[A+8>>2]|0,j)}if((c[n>>2]|0)<0){Sc[c[k>>2]&127](a,A,0,j)|0}if((y|0)==0){break}else{A=y}}}else{A=r;while(1){y=A+4|0;x=c[y>>2]|0;if((x|0)!=0){z=x|0;c[y>>2]=c[z>>2];c[z>>2]=A;A=x;continue}x=c[A>>2]|0;z=c[v>>2]|0;if((z|0)!=0){Tc[z&127](a,A+B|0,j)}if((c[n>>2]|0)<0){Sc[c[k>>2]&127](a,A,0,j)|0}if((x|0)==0){break}else{A=x}}}D=c[h>>2]|0}c[D+16>>2]=0;c[(c[h>>2]|0)+4>>2]=0;s=0;i=e;return s|0}D=a+16|0;a:do{if((c[(c[D>>2]|0)+4>>2]|0)==8){if((d&4098|0)==0){C=51;break}A=(m|0)<0;k=b+l|0;if(A){E=c[k>>2]|0}else{E=k}k=a;B=Hc[c[k>>2]&63](a,b,4)|0;if((B|0)==0){C=51;break}v=(p|0)==0;x=(m|0)<1;z=B;while(1){B=z+l|0;if(A){F=c[B>>2]|0}else{F=B}do{if(v){if(x){G=Ya(E|0,F|0)|0;break}else{G=wF(E|0,F|0,m|0)|0;break}}else{G=Sc[p&127](a,E,F,j)|0}}while(0);if((G|0)!=0){C=51;break a}if((z|0)==(b|0)){break}B=Hc[c[k>>2]&63](a,z,8)|0;if((B|0)==0){C=51;break a}else{z=B}}z=c[(c[h>>2]|0)+4>>2]|0;c[f>>2]=c[z+4>>2];c[f+4>>2]=c[z>>2];H=z;I=f;C=202}else{C=51}}while(0);b:do{if((C|0)==51){do{if((d&2565|0)==0){if((d&32|0)!=0){G=b;if((o|0)<0){J=c[b+8>>2]|0}else{J=b+(-o|0)|0}F=J+l|0;if((m|0)<0){K=c[F>>2]|0}else{K=F}if((r|0)==0){L=f;M=f;N=G;O=J;C=222;break}else{P=J;Q=G;R=K;C=70;break}}if((r|0)==0){L=f;M=f;N=0;O=b;C=222;break}if((o|0)<0){S=c[r+8>>2]|0}else{S=r+(-o|0)|0}if((S|0)==(b|0)){T=b;U=r;V=0;W=f;X=f;C=151;break}G=b+l|0;if((m|0)>=0){P=b;Q=0;R=G;C=70;break}P=b;Q=0;R=c[G>>2]|0;C=70}else{do{if((d&512|0)==0){G=b+l|0;if((m|0)>=0){Y=G;break}Y=c[G>>2]|0}else{Y=b}}while(0);if((r|0)==0){L=f;M=f;N=0;O=b;C=222}else{P=b;Q=0;R=Y;C=70}}}while(0);c:do{if((C|0)==70){do{if((c[(c[D>>2]|0)+4>>2]|0)==4){G=c[(c[h>>2]|0)+24>>2]|0;if((G|0)==0){Z=r;_=f;$=f;break}if((d&516|0)==0){Z=r;_=f;$=f;break}F=(G|0)>0;if(!F){Z=r;_=f;$=f;break}E=(o|0)<0;z=(m|0)<0;k=(p|0)==0;x=(m|0)<1;v=-o|0;A=r;B=0;while(1){if(E){aa=c[A+8>>2]|0}else{aa=A+v|0}y=aa+l|0;if(z){ba=c[y>>2]|0}else{ba=y}do{if(k){if(x){ca=Ya(R|0,ba|0)|0;break}else{ca=wF(R|0,ba|0,m|0)|0;break}}else{ca=Sc[p&127](a,R,ba,j)|0}}while(0);if((ca|0)==0){C=89;break}c[g+(B<<2)>>2]=ca;if((ca|0)<0){da=A+4|0}else{da=A|0}y=c[da>>2]|0;w=B+1|0;if((y|0)==0){s=0;C=246;break}if((w|0)<(G|0)){A=y;B=w}else{C=77;break}}if((C|0)==77){if(F){ea=f;fa=f;ga=0;ha=r}else{Z=r;_=f;$=f;break}while(1){do{if((c[g+(ga<<2)>>2]|0)<0){B=ha+4|0;x=c[B>>2]|0;if((c[g+((ga|1)<<2)>>2]|0)<0){k=x|0;c[B>>2]=c[k>>2];c[k>>2]=ha;c[fa+4>>2]=x;ia=x+4|0;ja=x;ka=ea;break}else{c[ea>>2]=x;c[fa+4>>2]=ha;ia=x|0;ja=ha;ka=x;break}}else{x=ha|0;k=c[x>>2]|0;if((c[g+((ga|1)<<2)>>2]|0)>0){B=k+4|0;c[x>>2]=c[B>>2];c[B>>2]=ha;c[ea>>2]=k;ia=k|0;ja=fa;ka=k;break}else{c[fa+4>>2]=k;c[ea>>2]=ha;ia=k+4|0;ja=k;ka=ha;break}}}while(0);k=c[ia>>2]|0;B=ga+2|0;if((B|0)<(G|0)){ea=ka;fa=ja;ga=B;ha=k}else{Z=k;_=ja;$=ka;break}}}else if((C|0)==89){if(E){s=c[A+8>>2]|0;i=e;return s|0}else{s=A+v|0;i=e;return s|0}}else if((C|0)==246){i=e;return s|0}}else{Z=r;_=f;$=f}}while(0);G=(o|0)<0;F=(m|0)<0;k=(p|0)!=0;B=(m|0)<1;x=-o|0;z=Z;w=_;y=$;d:while(1){la=z;ma=w;while(1){if(G){na=c[la+8>>2]|0}else{na=la+x|0}t=na+l|0;if(F){oa=c[t>>2]|0}else{oa=t}do{if(k){pa=Sc[p&127](a,R,oa,j)|0}else{if(B){pa=Ya(R|0,oa|0)|0;break}else{pa=wF(R|0,oa|0,m|0)|0;break}}}while(0);if((pa|0)==0){T=P;U=la;V=Q;W=ma;X=y;C=151;break c}if((pa|0)>=0){break}t=la+4|0;qa=c[t>>2]|0;if((qa|0)==0){C=132;break d}if(G){ra=c[qa+8>>2]|0}else{ra=qa+x|0}u=ra+l|0;if(F){sa=c[u>>2]|0}else{sa=u}do{if(k){ta=Sc[p&127](a,R,sa,j)|0}else{if(B){ta=Ya(R|0,sa|0)|0;break}else{ta=wF(R|0,sa|0,m|0)|0;break}}}while(0);if((ta|0)>=0){C=129;break}u=qa|0;c[t>>2]=c[u>>2];c[u>>2]=la;c[ma+4>>2]=qa;u=c[qa+4>>2]|0;if((u|0)==0){L=y;M=qa;N=Q;O=P;C=222;break c}else{la=u;ma=qa}}if((C|0)==129){C=0;if((ta|0)==0){C=130;break}c[y>>2]=qa;c[ma+4>>2]=la;v=c[qa>>2]|0;if((v|0)==0){L=qa;M=la;N=Q;O=P;C=222;break c}else{z=v;w=la;y=qa;continue}}v=la|0;ua=c[v>>2]|0;if((ua|0)==0){C=150;break}if(G){va=c[ua+8>>2]|0}else{va=ua+x|0}A=va+l|0;if(F){wa=c[A>>2]|0}else{wa=A}do{if(k){xa=Sc[p&127](a,R,wa,j)|0}else{if(B){xa=Ya(R|0,wa|0)|0;break}else{xa=wF(R|0,wa|0,m|0)|0;break}}}while(0);if((xa|0)>0){A=ua+4|0;c[v>>2]=c[A>>2];c[A>>2]=la;c[y>>2]=ua;A=c[ua>>2]|0;if((A|0)==0){L=ua;M=ma;N=Q;O=P;C=222;break c}else{z=A;w=ma;y=ua;continue}}if((xa|0)==0){C=148;break}c[ma+4>>2]=ua;c[y>>2]=la;A=c[ua+4>>2]|0;if((A|0)==0){L=la;M=ua;N=Q;O=P;C=222;break c}else{z=A;w=ua;y=la}}if((C|0)==130){c[ma+4>>2]=la;T=P;U=qa;V=Q;W=la;X=y;C=151;break}else if((C|0)==132){c[ma+4>>2]=la;L=y;M=la;N=Q;O=P;C=222;break}else if((C|0)==148){c[y>>2]=la;T=P;U=ua;V=Q;W=ma;X=la;C=151;break}else if((C|0)==150){c[y>>2]=la;L=la;M=ma;N=Q;O=P;C=222;break}}}while(0);do{if((C|0)==151){if((U|0)==0){L=X;M=W;N=V;O=T;C=222;break}c[q>>2]=c[q>>2]|32768;w=U+4|0;c[X>>2]=c[w>>2];z=U|0;c[W+4>>2]=c[z>>2];if((d&516|0)!=0){ya=U;break}if((d&8|0)!=0){B=f|0;c[w>>2]=c[B>>2];c[z>>2]=0;c[B>>2]=U;za=W;Aa=T;C=189;break}if((d&16|0)!=0){B=f+4|0;c[z>>2]=c[B>>2];c[w>>2]=0;c[B>>2]=U;Ba=W;Ca=T;C=196;break}if((d&4098|0)!=0){H=U;I=W;C=202;break b}if((d&2049|0)!=0){if((c[(c[D>>2]|0)+4>>2]&4|0)!=0){ya=U;break}c[w>>2]=0;w=f+4|0;c[z>>2]=c[w>>2];c[w>>2]=U;Da=W;Ea=U;Fa=T;C=229;break}if((d&32|0)==0){s=0;i=e;return s|0}if((c[(c[D>>2]|0)+4>>2]&4|0)==0){c[V+4>>2]=0;w=f+4|0;c[V>>2]=c[w>>2];c[w>>2]=V;w=(c[h>>2]|0)+16|0;c[w>>2]=(c[w>>2]|0)+1;ya=U;break}w=c[j+16>>2]|0;if((w|0)!=0){Tc[w&127](a,T,j)}if((c[n>>2]|0)>=0){ya=U;break}Sc[c[a+12>>2]&127](a,V,0,j)|0;ya=U}}while(0);do{if((C|0)==222){c[M+4>>2]=0;c[L>>2]=0;if((d&8|0)!=0){za=M;Aa=O;C=189;break}if((d&16|0)!=0){Ba=M;Ca=O;C=196;break}if((d&516|0)!=0){Ga=O;Ha=M;break b}if((d&2049|0)!=0){Da=M;Ea=0;Fa=O;C=229;break}if((d&32|0)==0){Ga=0;Ha=M;break b}w=(c[h>>2]|0)+16|0;c[w>>2]=(c[w>>2]|0)+1;ya=N}}while(0);do{if((C|0)==189){w=f+4|0;z=c[w>>2]|0;if((z|0)==0){Ga=Aa;Ha=za;break b}B=z+4|0;k=c[B>>2]|0;if((k|0)==0){Ia=z;Ja=c[z>>2]|0}else{F=z;z=B;B=k;while(1){k=B|0;c[z>>2]=c[k>>2];c[k>>2]=F;k=B+4|0;x=c[k>>2]|0;if((x|0)==0){Ia=B;Ja=F;break}else{F=B;z=k;B=x}}}c[w>>2]=Ja;ya=Ia}else if((C|0)==196){B=f|0;z=c[B>>2]|0;if((z|0)==0){Ga=Ca;Ha=Ba;break b}F=z|0;y=c[F>>2]|0;if((y|0)==0){Ka=z;La=c[z+4>>2]|0}else{x=z;z=F;F=y;while(1){y=F+4|0;c[z>>2]=c[y>>2];c[y>>2]=x;y=F|0;k=c[y>>2]|0;if((k|0)==0){Ka=F;La=x;break}else{x=F;z=y;F=k}}}c[B>>2]=La;ya=Ka}else if((C|0)==229){F=j+12|0;z=c[F>>2]|0;do{if((z|0)==0){Ma=Fa}else{if((d&1|0)==0){Ma=Fa;break}Ma=Hc[z&63](a,Fa,j)|0}}while(0);do{if((Ma|0)==0){Na=Ea}else{if((o|0)>-1){Na=Ma+o|0;break}z=Sc[c[a+12>>2]&127](a,0,12,j)|0;B=z;if((z|0)!=0){c[z+8>>2]=Ma;Na=B;break}if((c[F>>2]|0)==0){Na=B;break}z=c[j+16>>2]|0;if((z|0)==0){Na=B;break}if((d&1|0)==0){Na=B;break}Tc[z&127](a,Ma,j);Na=B}}while(0);if((Na|0)==0){Ga=Ma;Ha=Da;break b}F=(c[h>>2]|0)+16|0;B=c[F>>2]|0;if((B|0)<=-1){ya=Na;break}c[F>>2]=B+1;ya=Na}}while(0);B=c[f>>2]|0;c[ya+4>>2]=B;c[ya>>2]=c[f+4>>2];e:do{if((c[(c[D>>2]|0)+4>>2]&8|0)==0){Oa=ya}else{if((d&516|0)==0){Oa=ya;break}F=(o|0)<0;if(F){Pa=c[ya+8>>2]|0}else{Pa=ya+(-o|0)|0}z=(m|0)<0;x=Pa+l|0;if(z){Qa=c[x>>2]|0}else{Qa=x}x=ya+4|0;if((B|0)==0){Oa=ya;break}w=(p|0)==0;k=(m|0)<1;if(F){F=ya;y=x;G=B;while(1){A=G|0;E=c[A>>2]|0;if((E|0)==0){Ra=G;Sa=A}else{u=G;Ta=A;A=E;while(1){E=A+4|0;c[Ta>>2]=c[E>>2];c[E>>2]=u;E=A|0;Ua=c[E>>2]|0;if((Ua|0)==0){Ra=A;Sa=E;break}else{u=A;Ta=E;A=Ua}}}A=y|0;c[A>>2]=Ra;Ta=(c[Ra+8>>2]|0)+l|0;if(z){Va=c[Ta>>2]|0}else{Va=Ta}do{if(w){if(k){Wa=Ya(Qa|0,Va|0)|0;break}else{Wa=wF(Qa|0,Va|0,m|0)|0;break}}else{Wa=Sc[p&127](a,Qa,Va,j)|0}}while(0);if((Wa|0)!=0){Oa=F;break e}c[A>>2]=c[Sa>>2];c[Sa>>2]=F;Ta=Ra+4|0;u=c[Ta>>2]|0;if((u|0)==0){Oa=Ra;break}else{F=Ra;y=Ta;G=u}}}else{G=ya;y=x;F=B;while(1){u=F|0;Ta=c[u>>2]|0;if((Ta|0)==0){Xa=F;Za=u}else{v=F;Ua=u;u=Ta;while(1){Ta=u+4|0;c[Ua>>2]=c[Ta>>2];c[Ta>>2]=v;Ta=u|0;E=c[Ta>>2]|0;if((E|0)==0){Xa=u;Za=Ta;break}else{v=u;Ua=Ta;u=E}}}u=y|0;c[u>>2]=Xa;Ua=Xa+(l-o)|0;if(z){_a=c[Ua>>2]|0}else{_a=Ua}do{if(w){if(k){$a=Ya(Qa|0,_a|0)|0;break}else{$a=wF(Qa|0,_a|0,m|0)|0;break}}else{$a=Sc[p&127](a,Qa,_a,j)|0}}while(0);if(($a|0)!=0){Oa=G;break e}c[u>>2]=c[Za>>2];c[Za>>2]=G;Ua=Xa+4|0;v=c[Ua>>2]|0;if((v|0)==0){Oa=Xa;break}else{G=Xa;y=Ua;F=v}}}}}while(0);c[(c[h>>2]|0)+4>>2]=Oa;if((o|0)<0){s=c[Oa+8>>2]|0;i=e;return s|0}else{s=Oa+(-o|0)|0;i=e;return s|0}}}while(0);do{if((C|0)==202){if((o|0)<0){ab=c[H+8>>2]|0}else{ab=H+(-o|0)|0}Oa=c[j+16>>2]|0;do{if((Oa|0)!=0){if((d&2|0)==0){break}Tc[Oa&127](a,ab,j)}}while(0);if((c[n>>2]|0)<0){Sc[c[a+12>>2]&127](a,H,0,j)|0}Oa=(c[h>>2]|0)+16|0;Xa=c[Oa>>2]|0;c[Oa>>2]=Xa-1;if((Xa|0)>=1){Ga=ab;Ha=I;break}c[(c[h>>2]|0)+16>>2]=-1;Ga=ab;Ha=I}}while(0);I=Ha;do{bb=I+4|0;I=c[bb>>2]|0;}while((I|0)!=0);c[bb>>2]=c[f>>2];c[(c[h>>2]|0)+4>>2]=c[f+4>>2];s=(d&2|0)!=0?Ga:0;i=e;return s|0}function fh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((c[c[a+8>>2]>>2]&4096|0)!=0){ah(a,0)|0}d=(b|0)!=0;a:do{if(d){if((c[c[b+8>>2]>>2]&4096|0)!=0){ah(b,0)|0}if((c[b+16>>2]|0)!=(c[a+16>>2]|0)){e=0;return e|0}if((b|0)==0){break}else{f=b}while(1){if((f|0)==(a|0)){e=0;break}f=c[f+28>>2]|0;if((f|0)==0){break a}}return e|0}}while(0);f=a+28|0;g=c[f>>2]|0;if((g|0)!=0){h=g+24|0;c[h>>2]=(c[h>>2]|0)-1}c[a+32>>2]=0;c[f>>2]=0;if(d){c[f>>2]=b;c[a>>2]=62;f=b+24|0;c[f>>2]=(c[f>>2]|0)+1;e=b;return e|0}else{c[a>>2]=c[c[a+16>>2]>>2];e=g;return e|0}return 0}function gh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0;if((d&99|0)!=0){e=Hc[c[c[a+16>>2]>>2]&63](a,b,d)|0;return e|0}do{if((d&516|0)==0){f=c[a+16>>2]|0;g=c[f+4>>2]|0;if((d&384|0)!=0){if((g&12|0)==0){break}}if((g&12|0)==0){if((d&24|0)==0){e=0;return e|0}g=a+32|0;h=c[g>>2]|0;if((h|0)==0){i=47}else{j=c[(c[h+4>>2]|0)+8>>2]|0;k=c[(c[h+8>>2]|0)+4>>2]|0;if((j|0)<0){l=c[k+8>>2]|0}else{l=k+(-j|0)|0}if((l|0)==(b|0)){m=b;n=h}else{i=47}}a:do{if((i|0)==47){b:do{if((a|0)!=0){h=a;j=f;while(1){o=Hc[c[j>>2]&63](h,b,4)|0;if((o|0)!=0){break}k=c[h+28>>2]|0;if((k|0)==0){break b}h=k;j=c[k+16>>2]|0}c[g>>2]=h;m=o;n=h;break a}}while(0);c[g>>2]=0;e=0;return e|0}}while(0);j=(d&8|0)==0;k=Hc[c[c[n+16>>2]>>2]&63](n,m,d)|0;p=n;c:while(1){if((k|0)!=0){q=p+16|0;if((p|0)==(a|0)){e=k;i=64;break}else{r=k}do{s=a;while(1){if((Hc[c[c[s+16>>2]>>2]&63](s,r,4)|0)!=0){break}t=c[s+28>>2]|0;if((t|0)==(p|0)){e=r;i=64;break c}else{s=t}}r=Hc[c[c[q>>2]>>2]&63](p,r,d)|0;}while((r|0)!=0)}q=c[p+28>>2]|0;c[g>>2]=q;if((q|0)==0){e=0;i=64;break}s=c[c[q+16>>2]>>2]|0;if(j){k=Hc[s&63](q,0,256)|0;p=q;continue}else{k=Hc[s&63](q,0,128)|0;p=q;continue}}if((i|0)==64){return e|0}}if((d&408|0)==0){e=0;return e|0}d:do{if((a|0)==0){u=0;v=0}else{p=(d&272|0)!=0;if((d&136|0)==0){k=0;j=0;g=0;q=a;s=f;while(1){h=Hc[c[s>>2]&63](q,b,d)|0;do{if((h|0)==0){w=g;x=j;y=k}else{t=c[q+4>>2]|0;z=c[t+4>>2]|0;A=c[t+20>>2]|0;B=h+(c[t>>2]|0)|0;if((z|0)<0){C=c[B>>2]|0}else{C=B}if((k|0)!=0){do{if((A|0)==0){if((z|0)<1){D=Ya(C|0,j|0)|0;break}else{D=wF(C|0,j|0,z|0)|0;break}}else{D=Sc[A&127](q,C,j,t)|0}}while(0);if(!(p&(D|0)>0)){w=g;x=j;y=k;break}}w=q;x=C;y=h}}while(0);h=c[q+28>>2]|0;if((h|0)==0){u=y;v=w;break d}k=y;j=x;g=w;q=h;s=c[h+16>>2]|0}}else{s=0;q=0;g=0;j=a;k=f;while(1){h=Hc[c[k>>2]&63](j,b,d)|0;do{if((h|0)==0){E=g;F=q;G=s}else{t=c[j+4>>2]|0;A=c[t+4>>2]|0;z=c[t+20>>2]|0;B=h+(c[t>>2]|0)|0;if((A|0)<0){H=c[B>>2]|0}else{H=B}if((s|0)!=0){do{if((z|0)==0){if((A|0)<1){I=Ya(H|0,q|0)|0;break}else{I=wF(H|0,q|0,A|0)|0;break}}else{I=Sc[z&127](j,H,q,t)|0}}while(0);if(!((I|0)<0|p&(I|0)>0)){E=g;F=q;G=s;break}}E=j;F=H;G=h}}while(0);h=c[j+28>>2]|0;if((h|0)==0){u=G;v=E;break d}s=G;q=F;g=E;j=h;k=c[h+16>>2]|0}}}}while(0);c[a+32>>2]=v;e=u;return e|0}}while(0);e:do{if((a|0)==0){J=0;K=0}else{u=a;while(1){v=Hc[c[c[u+16>>2]>>2]&63](u,b,d)|0;if((v|0)!=0){J=v;K=u;break e}v=c[u+28>>2]|0;if((v|0)==0){J=0;K=0;break}else{u=v}}}}while(0);c[a+32>>2]=K;e=J;return e|0}function hh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=a|0;f=a+32|0;g=Hc[c[e>>2]&63](a,0,128)|0;while(1){if((g|0)==0){h=0;i=4;break}j=c[f>>2]|0;k=Hc[c[e>>2]&63](a,g,8)|0;l=Hc[b&63]((j|0)==0?a:j,g,d)|0;if((l|0)<0){h=l;i=4;break}else{g=k}}if((i|0)==4){return h|0}return 0}function ih(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=i;i=i+16|0;g=f|0;h=f+8|0;c[d>>2]=0;j=b|0;c[e>>2]=(Nw(Hx(j)|0)|0)!=0;k=c[53804]|0;a:do{if((k|0)!=0){l=fw(j,k)|0;m=a[l]|0;if(m<<24>>24==0){break}else{n=173856;o=134728}while(1){if(m<<24>>24==(a[o]|0)){if((Ya(l|0,o|0)|0)==0){break}}p=n+12|0;q=c[p>>2]|0;if((q|0)==0){break a}else{n=p;o=q}}c[d>>2]=c[n+4>>2];c[e>>2]=c[n+8>>2]}}while(0);n=c[53822]|0;do{if((n|0)!=0){if((c[e>>2]|0)!=1){break}o=fw(j,n)|0;if((a[o]|0)==0){break}jh(o,e)}}while(0);n=c[53818]|0;do{if((n|0)!=0){if((c[d>>2]|0)!=1){break}o=fw(j,n)|0;if((a[o]|0)==0){break}jh(o,d)}}while(0);if((a[(c[b+8>>2]|0)+153|0]|0)==0){i=f;return}n=b;j=b-32|0;o=Hx(c[((c[n>>2]&3|0)==2?b:j)+28>>2]|0)|0;k=c[n>>2]&3;ih(uw(o,c[((k|0)==2?b:j)+28>>2]|0,c[((k|0)==3?b:b+32|0)+28>>2]|0,0,0)|0,g,h);c[e>>2]=c[g>>2]|c[e>>2];c[d>>2]=c[h>>2]|c[d>>2];i=f;return}function jh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;e=i;c[d>>2]=0;if((a[b]|0)==0){i=e;return}else{f=b;g=0;h=0}a:while(1){b=c[43422]|0;j=c[43452]|0;k=(j|0)==0;l=c[43426]|0;m=(l|0)==0;do{if((b|0)==0){if(k){n=0;o=f}else{p=f;q=0;while(1){r=173808;s=j;while(1){t=xF(s|0)|0;u=r+8|0;if((Za(p|0,s|0,t|0)|0)==0){v=7;break}w=c[u>>2]|0;if((w|0)==0){x=p;y=q;break}else{r=u;s=w}}if((v|0)==7){v=0;x=p+t|0;y=c[r+4>>2]|q}if((p|0)==(x|0)){n=y;o=p;break}else{p=x;q=y}}}b:do{if(m){z=o;A=n}else{q=173704;p=l;while(1){B=xF(p|0)|0;s=q+8|0;if((Za(o|0,p|0,B|0)|0)==0){break}w=c[s>>2]|0;if((w|0)==0){z=o;A=n;break b}else{q=s;p=w}}z=o+B|0;A=c[q+4>>2]|n}}while(0);p=(A|0)!=0&(A&15|0)==0&1|A;if((p|0)==0){v=30;break a}else if((p|0)!=8){C=p;D=z;v=33;break}if((g|0)==3){E=3;F=z;G=h;break}else if((g|0)!=0){C=8;D=z;v=33;break}if((a[z]|0)==0){v=35;break a}else{C=8;D=z;v=33}}else{p=173688;r=b;while(1){H=xF(r|0)|0;w=p+8|0;if((Za(f|0,r|0,H|0)|0)==0){v=18;break}s=c[w>>2]|0;if((s|0)==0){I=f;J=0;v=19;break}else{p=w;r=s}}if((v|0)==18){v=0;r=c[p+4>>2]|0;s=f+H|0;if((H|0)==0){I=s;J=r;v=19}else{K=s;L=r}}c:do{if((v|0)==19){v=0;if(k){M=J;N=I}else{r=I;s=J;while(1){w=173808;u=j;while(1){O=xF(u|0)|0;P=w+8|0;if((Za(r|0,u|0,O|0)|0)==0){v=23;break}Q=c[P>>2]|0;if((Q|0)==0){R=r;S=s;break}else{w=P;u=Q}}if((v|0)==23){v=0;R=r+O|0;S=c[w+4>>2]|s}if((r|0)==(R|0)){M=S;N=r;break}else{r=R;s=S}}}if(m){K=N;L=M;break}else{T=173704;U=l}while(1){V=xF(U|0)|0;s=T+8|0;if((Za(N|0,U|0,V|0)|0)==0){break}r=c[s>>2]|0;if((r|0)==0){K=N;L=M;break c}else{T=s;U=r}}K=N+V|0;L=c[T+4>>2]|M}}while(0);p=(L|0)!=0&(L&15|0)==0&1|L;if((p|0)==0){v=30;break a}else if((p|0)!=8){C=p;D=K;v=33;break}if((g|0)==3){E=3;F=K;G=h;break}else if((g|0)!=0){C=8;D=K;v=33;break}if((a[K]|0)==0){v=35;break a}else{C=8;D=K;v=33}}}while(0);if((v|0)==33){v=0;l=h|C<<(g<<3);c[d>>2]=l;E=g+1|0;F=D;G=l}if((a[F]|0)!=0&(E|0)<4){f=F;g=E;h=G}else{v=35;break}}if((v|0)==30){Fv(0,105792,(G=i,i=i+8|0,c[G>>2]=f,G)|0)|0;i=G;i=e;return}else if((v|0)==35){i=e;return}}function kh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;d=b&15;e=173472;while(1){if((d|0)==(c[e>>2]|0)){f=4;break}if((c[e+40>>2]|0)==0){g=0.0;break}else{e=e+24|0}}if((f|0)==4){g=+h[e+8>>3]+0.0}e=b>>>8&15;d=173472;while(1){if((e|0)==(c[d>>2]|0)){f=8;break}if((c[d+40>>2]|0)==0){i=g;break}else{d=d+24|0}}if((f|0)==8){i=g+ +h[d+8>>3]}d=b>>>16&15;e=173472;while(1){if((d|0)==(c[e>>2]|0)){f=12;break}if((c[e+40>>2]|0)==0){j=i;break}else{e=e+24|0}}if((f|0)==12){j=i+ +h[e+8>>3]}e=b>>>24&15;b=173472;while(1){if((e|0)==(c[b>>2]|0)){break}if((c[b+40>>2]|0)==0){k=j;f=17;break}else{b=b+24|0}}if((f|0)==17){l=k*10.0;m=a|0;n=c[53820]|0;o=+Fm(m,n,1.0,0.0);p=l*o;return+p}k=j+ +h[b+8>>3];l=k*10.0;m=a|0;n=c[53820]|0;o=+Fm(m,n,1.0,0.0);p=l*o;return+p}function lh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0.0,r=0,s=0,t=0,u=0;j=i;i=i+80|0;k=j|0;l=j+8|0;m=j+72|0;n=+kh(a,g);o=n*n;h[m>>3]=o;c[f+12>>2]=g;g=e+3|0;a=b+(g<<4)|0;p=f+32|0;f=a;c[p>>2]=c[f>>2];c[p+4>>2]=c[f+4>>2];c[p+8>>2]=c[f+8>>2];c[p+12>>2]=c[f+12>>2];do{if((e|0)>(d|0)){n=+h[b+(e<<4)>>3]- +h[a>>3];q=+h[b+(e<<4)+8>>3]- +h[b+(g<<4)+8>>3];if(n*n+q*q>=o){r=e;break}r=e-3|0}else{r=e}}while(0);e=l+48|0;g=b+(r<<4)|0;c[e>>2]=c[g>>2];c[e+4>>2]=c[g+4>>2];c[e+8>>2]=c[g+8>>2];c[e+12>>2]=c[g+12>>2];a=l+32|0;d=b+(r+1<<4)|0;c[a>>2]=c[d>>2];c[a+4>>2]=c[d+4>>2];c[a+8>>2]=c[d+8>>2];c[a+12>>2]=c[d+12>>2];f=l+16|0;s=b+(r+2<<4)|0;c[f>>2]=c[s>>2];c[f+4>>2]=c[s+4>>2];c[f+8>>2]=c[s+8>>2];c[f+12>>2]=c[s+12>>2];t=l|0;u=l;c[u>>2]=c[p>>2];c[u+4>>2]=c[p+4>>2];c[u+8>>2]=c[p+8>>2];c[u+12>>2]=c[p+12>>2];c[k>>2]=t;c[k+4>>2]=m;_l(k,198,t,1);c[g>>2]=c[e>>2];c[g+4>>2]=c[e+4>>2];c[g+8>>2]=c[e+8>>2];c[g+12>>2]=c[e+12>>2];c[d>>2]=c[a>>2];c[d+4>>2]=c[a+4>>2];c[d+8>>2]=c[a+8>>2];c[d+12>>2]=c[a+12>>2];c[s>>2]=c[f>>2];c[s+4>>2]=c[f+4>>2];c[s+8>>2]=c[f+8>>2];c[s+12>>2]=c[f+12>>2];f=b+(r+3<<4)|0;c[f>>2]=c[u>>2];c[f+4>>2]=c[u+4>>2];c[f+8>>2]=c[u+8>>2];c[f+12>>2]=c[u+12>>2];i=j;return r|0}function mh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0;d=i;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=c[a>>2]|0;f=+h[b>>3]- +h[e>>3];g=+h[b+8>>3]- +h[e+8>>3];i=d;return f*f+g*g<=+h[c[a+4>>2]>>3]|0}function nh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0;j=i;i=i+80|0;k=j|0;l=j+8|0;m=j+72|0;n=+kh(a,g);o=n*n;h[m>>3]=o;c[f+8>>2]=g;g=b+(d<<4)|0;a=f+16|0;f=g;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];do{if((e|0)>(d|0)){f=d+3|0;n=+h[g>>3]- +h[b+(f<<4)>>3];p=+h[b+(d<<4)+8>>3]- +h[b+(f<<4)+8>>3];if(n*n+p*p>=o){q=d;break}q=f}else{q=d}}while(0);d=l;g=b+(q+3<<4)|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];e=l+16|0;f=b+(q+2<<4)|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];r=l+32|0;s=b+(q+1<<4)|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];t=l+48|0;u=t;c[u>>2]=c[a>>2];c[u+4>>2]=c[a+4>>2];c[u+8>>2]=c[a+8>>2];c[u+12>>2]=c[a+12>>2];c[k>>2]=t;c[k+4>>2]=m;_l(k,198,l|0,0);l=b+(q<<4)|0;c[l>>2]=c[u>>2];c[l+4>>2]=c[u+4>>2];c[l+8>>2]=c[u+8>>2];c[l+12>>2]=c[u+12>>2];c[s>>2]=c[r>>2];c[s+4>>2]=c[r+4>>2];c[s+8>>2]=c[r+8>>2];c[s+12>>2]=c[r+12>>2];c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];c[g>>2]=c[d>>2];c[g+4>>2]=c[d+4>>2];c[g+8>>2]=c[d+8>>2];c[g+12>>2]=c[d+12>>2];i=j;return q|0}function oh(a,b,d,e,f,g,i){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;i=i|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0.0,J=0.0;j=(g|0)!=0;k=(i|0)==0;if(j&(k^1)&(e|0)==(d|0)){l=b+(e<<4)|0;m=+h[l>>3];n=+h[b+(e<<4)+8>>3];o=e+3|0;p=b+(o<<4)|0;q=p|0;r=+h[q>>3];s=b+(o<<4)+8|0;t=+h[s>>3];u=+kh(a,g);v=+kh(a,i);w=m-r;x=n-t;y=+T(w*w+x*x);if(u+v<y){z=v;A=u}else{u=y/3.0;z=u;A=u}do{if(n==t){if(m<r){B=r-z;C=n;D=m+A;E=n;break}else{B=r+z;C=n;D=m-A;E=n;break}}else{if(n<t){B=m;C=t-z;D=m;E=n+A;break}else{B=m;C=t+z;D=m;E=n-A;break}}}while(0);o=e+1|0;F=b+(o<<4)|0;h[F>>3]=D;h[b+(o<<4)+8>>3]=E;o=l;l=F;c[o>>2]=c[l>>2];c[o+4>>2]=c[l+4>>2];c[o+8>>2]=c[l+8>>2];c[o+12>>2]=c[l+12>>2];h[q>>3]=B;h[s>>3]=C;s=b+(e+2<<4)|0;q=p;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];c[f+12>>2]=i;h[f+32>>3]=m;h[f+40>>3]=n;c[f+8>>2]=g;h[f+16>>3]=r;h[f+24>>3]=t;return}if(!k){t=+kh(a,i);r=+h[b+(e<<4)>>3];n=+h[b+(e<<4)+8>>3];k=e+3|0;q=b+(k<<4)|0;s=q|0;m=+h[s>>3];p=b+(k<<4)+8|0;C=+h[p>>3];B=r-m;E=n-C;D=+T(B*B+E*E)*.9;E=t<D?t:D;do{if(n==C){if(r<m){G=m-E;H=n;break}else{G=m+E;H=n;break}}else{if(n<C){G=r;H=C-E;break}else{G=r;H=C+E;break}}}while(0);k=e+1|0;h[b+(k<<4)>>3]=r;h[b+(k<<4)+8>>3]=n;h[s>>3]=G;h[p>>3]=H;p=b+(e+2<<4)|0;e=q;c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];c[f+12>>2]=i;h[f+32>>3]=m;h[f+40>>3]=C}if(!j){return}C=+kh(a,g);a=b+(d<<4)|0;m=+h[a>>3];H=+h[b+(d<<4)+8>>3];j=d+3|0;G=+h[b+(j<<4)>>3];n=+h[b+(j<<4)+8>>3];r=m-G;E=H-n;D=+T(r*r+E*E)*.9;E=C<D?C:D;do{if(H==n){if(m<G){I=m+E;J=H;break}else{I=m-E;J=H;break}}else{if(H<n){I=m;J=H+E;break}else{I=m;J=H-E;break}}}while(0);j=d+1|0;i=b+(j<<4)|0;h[i>>3]=I;h[b+(j<<4)+8>>3]=J;j=a;a=i;c[j>>2]=c[a>>2];c[j+4>>2]=c[a+4>>2];c[j+8>>2]=c[a+8>>2];c[j+12>>2]=c[a+12>>2];a=d+2|0;h[b+(a<<4)>>3]=G;h[b+(a<<4)+8>>3]=n;c[f+8>>2]=g;h[f+16>>3]=m;h[f+24>>3]=H;return}function ph(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;var g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;f=i;g=b;b=i;i=i+16|0;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];j=+h[b>>3];k=+h[d>>3]-j;l=+h[b+8>>3];m=+h[d+8>>3]-l;n=e*10.0/(+T(k*k+m*m)+1.0e-4);e=n*(k+(k>=0.0?1.0e-4:-1.0e-4));k=n*(m+(m>=0.0?1.0e-4:-1.0e-4));m=e*.5;n=k*.5;o=j-n;p=l-m;q=j+n;n=m+l;l=e+o;m=k+p;j=e+q;e=k+n;k=l>j?l:j;r=q>k?q:k;k=m>e?m:e;s=n>k?n:k;k=l<j?l:j;j=q<k?q:k;k=m<e?m:e;e=n<k?n:k;h[a>>3]=o<j?o:j;h[a+8>>3]=p<e?p:e;h[a+16>>3]=o>r?o:r;h[a+24>>3]=p>s?p:s;i=f;return}function qh(a,b,d,e,f,g,j){a=a|0;b=b|0;d=d|0;e=e|0;f=+f;g=+g;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;k=i;i=i+48|0;l=d;d=i;i=i+16|0;c[d>>2]=c[l>>2];c[d+4>>2]=c[l+4>>2];c[d+8>>2]=c[l+8>>2];c[d+12>>2]=c[l+12>>2];l=e;e=i;i=i+16|0;c[e>>2]=c[l>>2];c[e+4>>2]=c[l+4>>2];c[e+8>>2]=c[l+8>>2];c[e+12>>2]=c[l+12>>2];l=k|0;m=k+16|0;n=(c[a+16>>2]|0)+12|0;o=c[n>>2]|0;c[n>>2]=b;pB(a,c[(c[a>>2]|0)+336>>2]|0);xB(a,g);b=d|0;p=e|0;q=+h[p>>3]- +h[b>>3];r=d+8|0;s=e+8|0;t=+h[s>>3]- +h[r>>3];u=10.0/(+T(q*q+t*t)+1.0e-4);v=u*(q+(q>=0.0?1.0e-4:-1.0e-4));h[p>>3]=v;q=u*(t+(t>=0.0?1.0e-4:-1.0e-4));h[s>>3]=q;s=m;p=l|0;e=l+8|0;w=m|0;x=m+8|0;y=k+32|0;z=d;d=0;while(1){A=j>>(d<<3);B=A&255;if((B|0)==0){C=8;break}t=+h[b>>3];u=+h[r>>3];h[p>>3]=v;h[e>>3]=q;h[w>>3]=t;h[x>>3]=u;D=A&15;A=173472;E=1;while(1){F=A+24|0;if((D|0)==(E|0)){C=6;break}G=c[F>>2]|0;if((G|0)==0){break}else{A=F;E=G}}if((C|0)==6){C=0;E=A+8|0;h[p>>3]=v*+h[E>>3]*f;h[e>>3]=q*+h[E>>3]*f;Rc[c[A+16>>2]&31](a,m,l,f,g,B);h[w>>3]=+h[w>>3]+ +h[p>>3];h[x>>3]=+h[x>>3]+ +h[e>>3]}c[y>>2]=c[s>>2];c[y+4>>2]=c[s+4>>2];c[y+8>>2]=c[s+8>>2];c[y+12>>2]=c[s+12>>2];c[z>>2]=c[y>>2];c[z+4>>2]=c[y+4>>2];c[z+8>>2]=c[y+8>>2];c[z+12>>2]=c[y+12>>2];E=d+1|0;if((E|0)<4){d=E}else{C=8;break}}if((C|0)==8){c[n>>2]=o;i=k;return}}function rh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0;j=i;i=i+80|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;if(f>4.0){l=f*.25*.35}else{l=.35}f=+h[d+8>>3];e=l*f;m=+h[d>>3];n=l*m;l=+h[b>>3];o=m+l;m=+h[b+8>>3];p=f+m;d=k+64|0;if((g&32|0)==0){h[k+64>>3]=o;h[k+72>>3]=p;q=k;c[q>>2]=c[d>>2];c[q+4>>2]=c[d+4>>2];c[q+8>>2]=c[d+8>>2];c[q+12>>2]=c[d+12>>2];h[k+16>>3]=e+o;h[k+24>>3]=p-n;q=k+32|0;r=b;c[q>>2]=c[r>>2];c[q+4>>2]=c[r+4>>2];c[q+8>>2]=c[r+8>>2];c[q+12>>2]=c[r+12>>2];h[k+48>>3]=o-e;h[k+56>>3]=n+p}else{r=b;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];d=k;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];h[k+16>>3]=e+l;h[k+24>>3]=m-n;h[k+32>>3]=o;h[k+40>>3]=p;h[k+48>>3]=l-e;h[k+56>>3]=n+m}if((g&64|0)!=0){rB(a,k|0,3,g>>>4&1^1);i=j;return}if((g&128|0)==0){rB(a,k+16|0,3,g>>>4&1^1);i=j;return}else{rB(a,k+32|0,3,g>>>4&1^1);i=j;return}}function sh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0;j=i;i=i+144|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;l=e*4.0;do{if(l<f){if((g&32|0)==0){m=.45;break}m=f/l*.45}else{m=.45}}while(0);n=g&32;do{if(f>1.0){if((n|0)==0){o=0.0;p=0;break}o=(f+-1.0)*.05/e;p=n}else{o=0.0;p=n}}while(0);e=+h[d+8>>3];f=-0.0-e;l=m*f;q=+h[d>>3];r=m*q;m=o*f;f=o*q;o=+h[b>>3];s=q+o;t=+h[b+8>>3];u=e+t;v=o+q*.5;q=e*.5+t;d=k|0;n=k+128|0;if((p|0)==0){h[k+128>>3]=s;h[k+136>>3]=u;p=k;c[p>>2]=c[n>>2];c[p+4>>2]=c[n+4>>2];c[p+8>>2]=c[n+8>>2];c[p+12>>2]=c[n+12>>2];h[k+16>>3]=o-l;h[k+24>>3]=t-r;h[k+32>>3]=v-m;h[k+40>>3]=q-f;h[k+48>>3]=o;h[k+56>>3]=t;p=k+64|0;w=b;c[p>>2]=c[w>>2];c[p+4>>2]=c[w+4>>2];c[p+8>>2]=c[w+8>>2];c[p+12>>2]=c[w+12>>2];h[k+80>>3]=o;h[k+88>>3]=t;h[k+96>>3]=m+v;h[k+104>>3]=f+q;h[k+112>>3]=l+o;h[k+120>>3]=r+t}else{w=b;c[n>>2]=c[w>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];n=k;c[n>>2]=c[w>>2];c[n+4>>2]=c[w+4>>2];c[n+8>>2]=c[w+8>>2];c[n+12>>2]=c[w+12>>2];h[k+16>>3]=s-l;h[k+24>>3]=u-r;h[k+32>>3]=v-m;h[k+40>>3]=q-f;h[k+48>>3]=s-m;h[k+56>>3]=u-f;h[k+64>>3]=s;h[k+72>>3]=u;h[k+80>>3]=m+s;h[k+88>>3]=f+u;h[k+96>>3]=m+v;h[k+104>>3]=f+q;h[k+112>>3]=l+s;h[k+120>>3]=r+u}if((g&64|0)!=0){rB(a,d,6,1);i=j;return}if((g&128|0)==0){rB(a,d,9,1);i=j;return}else{rB(a,k+48|0,6,1);i=j;return}}function th(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;j=i;i=i+64|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d+8>>3];e=+h[d>>3];l=+h[b>>3];m=e+l;n=+h[b+8>>3];o=f+n;p=l+e*.2;q=f*.2+n;r=l+e*.6;l=f*.6+n;d=k|0;s=k|0;h[s>>3]=p-f;t=k+8|0;h[t>>3]=e+q;u=k+16|0;h[u>>3]=f+p;v=k+24|0;h[v>>3]=q-e;w=k+32|0;h[w>>3]=f+r;x=k+40|0;h[x>>3]=l-e;y=k+48|0;h[y>>3]=r-f;z=k+56|0;h[z>>3]=e+l;do{if((g&64|0)==0){if((g&128|0)==0){break}h[u>>3]=p;h[v>>3]=q;h[w>>3]=r;h[x>>3]=l}else{h[s>>3]=p;h[t>>3]=q;h[y>>3]=r;h[z>>3]=l}}while(0);rB(a,d,4,1);z=k;k=b;c[z>>2]=c[k>>2];c[z+4>>2]=c[k+4>>2];c[z+8>>2]=c[k+8>>2];c[z+12>>2]=c[k+12>>2];h[u>>3]=m;h[v>>3]=o;uB(a,d,2);i=j;return}function uh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;j=i;i=i+64|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d+8>>3];e=f*-.4;l=+h[d>>3];m=l*.4;n=+h[b>>3];o=n+l*.8;p=+h[b+8>>3];q=f*.8+p;r=l+n;l=f+p;d=k|0;s=k|0;h[s>>3]=e+n;t=k+8|0;h[t>>3]=m+p;u=k+16|0;h[u>>3]=n-e;v=k+24|0;h[v>>3]=p-m;w=k+32|0;h[w>>3]=o-e;x=k+40|0;h[x>>3]=q-m;y=k+48|0;h[y>>3]=e+o;z=k+56|0;h[z>>3]=m+q;do{if((g&64|0)==0){if((g&128|0)==0){break}A=u;B=b;c[A>>2]=c[B>>2];c[A+4>>2]=c[B+4>>2];c[A+8>>2]=c[B+8>>2];c[A+12>>2]=c[B+12>>2];h[w>>3]=o;h[x>>3]=q}else{B=k;A=b;c[B>>2]=c[A>>2];c[B+4>>2]=c[A+4>>2];c[B+8>>2]=c[A+8>>2];c[B+12>>2]=c[A+12>>2];h[y>>3]=o;h[z>>3]=q}}while(0);rB(a,d,4,g>>>4&1^1);h[s>>3]=o;h[t>>3]=q;h[k+16>>3]=r;h[v>>3]=l;uB(a,d,2);i=j;return}function vh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0;j=i;i=i+80|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d+8>>3];e=(-0.0-f)/3.0;l=+h[d>>3];m=l/3.0;n=+h[b>>3];o=l*.5+n;p=+h[b+8>>3];q=f*.5+p;d=k|0;h[k+64>>3]=l+n;h[k+72>>3]=f+p;r=k;s=k+64|0;c[r>>2]=c[s>>2];c[r+4>>2]=c[s+4>>2];c[r+8>>2]=c[s+8>>2];c[r+12>>2]=c[s+12>>2];h[k+16>>3]=e+o;h[k+24>>3]=m+q;s=k+32|0;r=s;t=b;c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];h[k+48>>3]=o-e;h[k+56>>3]=q-m;if((g&64|0)!=0){rB(a,s,3,g>>>4&1^1);i=j;return}s=g>>>4&1^1;if((g&128|0)==0){rB(a,d,4,s);i=j;return}else{rB(a,d,3,s);i=j;return}}function wh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0.0,m=0.0;j=i;i=i+32|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;f=+h[d>>3];e=+h[d+8>>3];l=+T(f*f+e*e)*.5;m=f*.5+ +h[b>>3];h[k>>3]=m-l;f=+h[b+8>>3]+e*.5;h[k+8>>3]=f-l;h[k+16>>3]=l+m;h[k+24>>3]=l+f;qB(a,k|0,2,g>>>4&1^1);i=j;return}function xh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0.0;j=i;i=i+128|0;k=b;b=i;i=i+16|0;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=d;d=i;i=i+16|0;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];k=j|0;l=j+64|0;if(f>4.0){m=f*.5*.25}else{m=.5}f=+h[b>>3];e=+h[d>>3];n=+h[b+8>>3];o=+h[d+8>>3];p=m*o;q=m*e;d=l;r=b;c[d>>2]=c[r>>2];c[d+4>>2]=c[r+4>>2];c[d+8>>2]=c[r+8>>2];c[d+12>>2]=c[r+12>>2];h[l+16>>3]=f+e;h[l+24>>3]=n+o;r=k|0;h[k>>3]=q+(f-p);o=p+(q+n);h[k+8>>3]=o;h[k+48>>3]=q+(p+f);e=p+(n-q);h[k+56>>3]=e;n=p*-.95;m=q*4.0/3.0;h[k+16>>3]=q+(n+f)-m;s=p*4.0/3.0;h[k+24>>3]=o-s;h[k+32>>3]=q+(f-n)-m;h[k+40>>3]=e-s;uB(a,l|0,2);if((g&64|0)!=0){Qm(j+96|0,r,3,.5,0,r);tB(a,r,4,0,0,0);i=j;return}if((g&128|0)==0){tB(a,r,4,0,0,0);i=j;return}Qm(j+112|0,r,3,.5,r,0);tB(a,r,4,0,0,0);i=j;return}function yh(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=+f;g=g|0;var j=0,k=0;g=i;i=i+32|0;j=b;b=i;i=i+16|0;c[b>>2]=c[j>>2];c[b+4>>2]=c[j+4>>2];c[b+8>>2]=c[j+8>>2];c[b+12>>2]=c[j+12>>2];j=d;d=i;i=i+16|0;c[d>>2]=c[j>>2];c[d+4>>2]=c[j+4>>2];c[d+8>>2]=c[j+8>>2];c[d+12>>2]=c[j+12>>2];j=g|0;f=+h[b>>3]+ +h[d>>3];e=+h[b+8>>3]+ +h[d+8>>3];d=j;k=b;c[d>>2]=c[k>>2];c[d+4>>2]=c[k+4>>2];c[d+8>>2]=c[k+8>>2];c[d+12>>2]=c[k+12>>2];h[j+16>>3]=f;h[j+24>>3]=e;uB(a,j|0,2);i=g;return}function zh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=xF(b|0)|0;do{if((d|0)<(c[45230]|0)){e=c[45228]|0}else{f=d+11|0;c[45230]=f;g=mk(c[45228]|0,f)|0;c[45228]=g;if((g|0)==0){h=0}else{e=g;break}return h|0}}while(0);d=a[b]|0;if(d<<24>>24==0){i=e}else{g=e;e=b;b=d;while(1){d=e+1|0;f=b&255;if((xb(f|0)|0)==0){j=b}else{j=(yF(f|0)|0)&255}f=g+1|0;a[g]=j;k=a[d]|0;if(k<<24>>24==0){i=f;break}else{g=f;e=d;b=k}}}a[i]=0;h=c[45228]|0;return h|0}function Ah(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;g=i;i=i+72|0;j=g|0;k=g+16|0;l=g+24|0;m=g+32|0;n=g+40|0;o=g+48|0;p=g+56|0;q=g+64|0;c[e+32>>2]=f;r=b;while(1){s=r+1|0;if((a[r]|0)==32){r=s}else{break}}c[q>>2]=255;b=a[r]|0;do{if(b<<24>>24==35){t=ac(r|0,127384,(u=i,i=i+32|0,c[u>>2]=n,c[u+8>>2]=o,c[u+16>>2]=p,c[u+24>>2]=q,u)|0)|0;i=u;if((t|0)<=2){v=a[r]|0;break}switch(f|0){case 0:{w=+((c[n>>2]|0)>>>0>>>0)/255.0;x=+((c[o>>2]|0)>>>0>>>0)/255.0;y=+((c[p>>2]|0)>>>0>>>0)/255.0;A=+((c[q>>2]|0)>>>0>>>0)/255.0;B=x<y?x:y;C=x>y?x:y;D=C<w?w:C;do{if(D>0.0){C=D-(B>w?w:B);E=C/D;if(E<=0.0){F=0.0;G=E;break}H=(D-w)/C;I=(D-x)/C;J=(D-y)/C;do{if(D==w){K=J-I}else{if(D==x){K=H+2.0-J;break}if(D!=y){K=0.0;break}K=I+4.0-H}}while(0);H=K*60.0;if(H>=0.0){F=H;G=E;break}F=H+360.0;G=E}else{F=0.0;G=0.0}}while(0);y=F/360.0;h[k>>3]=y;h[m>>3]=D;h[l>>3]=G;h[e>>3]=y;h[e+8>>3]=G;h[e+16>>3]=D;h[e+24>>3]=A;L=0;i=g;return L|0};case 2:{t=e;c[e>>2]=(((c[n>>2]|0)*65535|0)>>>0)/255|0;c[t+4>>2]=(((c[o>>2]|0)*65535|0)>>>0)/255|0;c[e+8>>2]=(((c[p>>2]|0)*65535|0)>>>0)/255|0;c[t+12>>2]=(((c[q>>2]|0)*65535|0)>>>0)/255|0;L=0;i=g;return L|0};case 4:{h[e>>3]=+((c[n>>2]|0)>>>0>>>0)/255.0;h[e+8>>3]=+((c[o>>2]|0)>>>0>>>0)/255.0;h[e+16>>3]=+((c[p>>2]|0)>>>0>>>0)/255.0;h[e+24>>3]=+((c[q>>2]|0)>>>0>>>0)/255.0;L=0;i=g;return L|0};case 3:{y=1.0- +((c[n>>2]|0)>>>0>>>0)/255.0;x=1.0- +((c[o>>2]|0)>>>0>>>0)/255.0;w=1.0- +((c[p>>2]|0)>>>0>>>0)/255.0;B=y<x?y:x;H=w<B?w:B;t=e;a[e]=~~(y-H)*255|0;a[t+1|0]=~~(x-H)*255|0;a[t+2|0]=~~(w-H)*255|0;a[t+3|0]=~~H*255|0;L=0;i=g;return L|0};case 1:{t=e;a[e]=c[n>>2];a[t+1|0]=c[o>>2];a[t+2|0]=c[p>>2];a[t+3|0]=c[q>>2];L=0;i=g;return L|0};default:{L=0;i=g;return L|0}}}else{v=b}}while(0);if(v<<24>>24==46){M=24}else{if(((v&255)-48|0)>>>0<10>>>0){M=24}else{N=v}}do{if((M|0)==24){v=xF(r|0)|0;do{if((v|0)<(c[45204]|0)){O=c[45202]|0;P=r}else{b=v+11|0;c[45204]=b;q=mk(c[45202]|0,b)|0;c[45202]=q;if((q|0)==0){L=-1}else{O=q;P=r;break}i=g;return L|0}}while(0);while(1){v=P+1|0;q=a[P]|0;if((q<<24>>24|0)==0){break}else if((q<<24>>24|0)==44){Q=32}else{Q=q}a[O]=Q;O=O+1|0;P=v}a[O]=0;v=ac(c[45202]|0,159488,(u=i,i=i+24|0,c[u>>2]=k,c[u+8>>2]=l,c[u+16>>2]=m,u)|0)|0;i=u;if((v|0)!=3){N=a[r]|0;break}A=+h[k>>3];D=A<1.0?A:1.0;A=D>0.0?D:0.0;h[k>>3]=A;D=+h[l>>3];G=D<1.0?D:1.0;D=G>0.0?G:0.0;h[l>>3]=D;G=+h[m>>3];F=G<1.0?G:1.0;G=F>0.0?F:0.0;h[m>>3]=G;switch(f|0){case 2:{a:do{if(D>0.0){F=A<1.0?A*6.0:0.0;v=~~F;K=F- +(v|0);F=G*(1.0-D);H=G*(1.0-D*K);w=G*(1.0-D*(1.0-K));switch(v|0){case 3:{R=G;S=H;T=F;break a;break};case 4:{R=G;S=F;T=w;break a;break};case 0:{R=F;S=w;T=G;break a;break};case 1:{R=F;S=G;T=H;break a;break};case 2:{R=w;S=G;T=F;break a;break};case 5:{R=H;S=F;T=G;break a;break};default:{R=0.0;S=0.0;T=0.0;break a}}}else{R=G;S=G;T=G}}while(0);v=e;c[e>>2]=~~(T*65535.0);c[v+4>>2]=~~(S*65535.0);c[e+8>>2]=~~(R*65535.0);c[v+12>>2]=65535;L=0;i=g;return L|0};case 1:{b:do{if(D>0.0){F=A<1.0?A*6.0:0.0;v=~~F;H=F- +(v|0);F=G*(1.0-D);w=G*(1.0-D*H);K=G*(1.0-D*(1.0-H));switch(v|0){case 2:{U=K;V=G;W=F;break b;break};case 1:{U=F;V=G;W=w;break b;break};case 4:{U=G;V=F;W=K;break b;break};case 3:{U=G;V=w;W=F;break b;break};case 0:{U=F;V=K;W=G;break b;break};case 5:{U=w;V=F;W=G;break b;break};default:{U=0.0;V=0.0;W=0.0;break b}}}else{U=G;V=G;W=G}}while(0);v=e;a[e]=~~(W*255.0);a[v+1|0]=~~(V*255.0);a[v+2|0]=~~(U*255.0);a[v+3|0]=-1;L=0;i=g;return L|0};case 3:{c:do{if(D>0.0){F=A<1.0?A*6.0:0.0;v=~~F;w=F- +(v|0);F=G*(1.0-D);K=G*(1.0-D*w);H=G*(1.0-D*(1.0-w));switch(v|0){case 2:{X=H;Y=G;Z=F;break c;break};case 4:{X=G;Y=F;Z=H;break c;break};case 1:{X=F;Y=G;Z=K;break c;break};case 5:{X=K;Y=F;Z=G;break c;break};case 0:{X=F;Y=H;Z=G;break c;break};case 3:{X=G;Y=K;Z=F;break c;break};default:{X=0.0;Y=0.0;Z=0.0;break c}}}else{X=G;Y=G;Z=G}}while(0);F=1.0-Z;K=1.0-Y;H=1.0-X;w=F<K?F:K;x=H<w?H:w;v=e;a[e]=~~(F-x)*255|0;a[v+1|0]=~~(K-x)*255|0;a[v+2|0]=~~(H-x)*255|0;a[v+3|0]=~~x*255|0;L=0;i=g;return L|0};case 4:{d:do{if(D>0.0){x=A<1.0?A*6.0:0.0;v=~~x;H=x- +(v|0);x=G*(1.0-D);K=G*(1.0-D*H);F=G*(1.0-D*(1.0-H));switch(v|0){case 1:{_=x;$=G;aa=K;break d;break};case 4:{_=G;$=x;aa=F;break d;break};case 5:{_=K;$=x;aa=G;break d;break};case 0:{_=x;$=F;aa=G;break d;break};case 2:{_=F;$=G;aa=x;break d;break};case 3:{_=G;$=K;aa=x;break d;break};default:{_=0.0;$=0.0;aa=0.0;break d}}}else{_=G;$=G;aa=G}}while(0);h[e>>3]=aa;h[e+8>>3]=$;h[e+16>>3]=_;h[e+24>>3]=1.0;L=0;i=g;return L|0};case 0:{h[e>>3]=A;h[e+8>>3]=D;h[e+16>>3]=G;h[e+24>>3]=1.0;L=0;i=g;return L|0};default:{L=0;i=g;return L|0}}}}while(0);do{if(N<<24>>24==98){ba=r}else{if((Za(s|0,122280,4)|0)==0|N<<24>>24==119){ba=r;break}if((Za(s|0,122216,4)|0)==0|N<<24>>24==108){ba=r;break}if((Za(s|0,122200,8)|0)==0){ba=r;break}e:do{if(N<<24>>24==47){m=gb(s|0,47)|0;if((m|0)==0){ca=s;break}if((a[s]|0)!=47){l=(qm(122192,s,4)|0)==0;ca=l?m+1|0:r;break}m=c[45206]|0;do{if((m|0)!=0){if((a[m]|0)==0){break}if((qm(122192,m,3)|0)==0){break}l=r+2|0;k=xF(m|0)|0;O=(xF(l|0)|0)+k|0;if((O+3|0)<(c[44758]|0)){da=c[44756]|0}else{k=O+13|0;c[44758]=k;O=mk(c[44756]|0,k)|0;c[44756]=O;da=O}nb(da|0,122184,(u=i,i=i+16|0,c[u>>2]=m,c[u+8>>2]=l,u)|0)|0;i=u;ca=c[44756]|0;break e}}while(0);ca=r+2|0}else{m=c[45206]|0;if((m|0)==0){ca=r;break}if((a[m]|0)==0){ca=r;break}if((qm(122192,m,3)|0)==0){ca=r;break}l=xF(m|0)|0;O=(xF(r|0)|0)+l|0;if((O+3|0)<(c[44758]|0)){ea=c[44756]|0}else{l=O+13|0;c[44758]=l;O=mk(c[44756]|0,l)|0;c[44756]=O;ea=O}nb(ea|0,122184,(u=i,i=i+16|0,c[u>>2]=m,c[u+8>>2]=r,u)|0)|0;i=u;ca=c[44756]|0}}while(0);m=xF(ca|0)|0;do{if((m|0)<(c[45230]|0)){fa=c[45228]|0}else{O=m+11|0;c[45230]=O;l=mk(c[45228]|0,O)|0;c[45228]=l;if((l|0)!=0){fa=l;break}c[j>>2]=0;L=-1;i=g;return L|0}}while(0);m=a[ca]|0;if(m<<24>>24==0){ga=fa}else{l=fa;O=ca;k=m;while(1){m=O+1|0;P=k&255;if((xb(P|0)|0)==0){ha=k}else{ha=(yF(P|0)|0)&255}P=l+1|0;a[l]=ha;Q=a[m]|0;if(Q<<24>>24==0){ga=P;break}else{l=P;O=m;k=Q}}}a[ga]=0;ba=c[45228]|0}}while(0);c[j>>2]=ba;if((ba|0)==0){L=-1;i=g;return L|0}ga=c[45200]|0;do{if((ga|0)==0){M=106}else{ha=c[ga>>2]|0;if((a[ha]|0)!=(a[ba]|0)){M=106;break}if((Ya(ha|0,ba|0)|0)==0){ia=ga}else{M=106}}}while(0);if((M|0)==106){M=vb(j|0,40448,2491,12,44)|0;c[45200]=M;ia=M}if((ia|0)==0){switch(f|0){case 3:{M=e;z=0;a[M]=z;z=z>>8;a[M+1|0]=z;z=z>>8;a[M+2|0]=z;z=z>>8;a[M+3|0]=z;L=1;i=g;return L|0};case 2:{M=e;c[e+8>>2]=0;c[M+4>>2]=0;c[e>>2]=0;c[M+12>>2]=65535;L=1;i=g;return L|0};case 4:{vF(e|0,0,24)|0;h[e+24>>3]=1.0;L=1;i=g;return L|0};case 0:{vF(e|0,0,24)|0;h[e+24>>3]=1.0;L=1;i=g;return L|0};case 1:{M=e;a[M+2|0]=0;a[M+1|0]=0;a[e]=0;a[M+3|0]=-1;L=1;i=g;return L|0};default:{L=1;i=g;return L|0}}}else{switch(f|0){case 0:{h[e>>3]=+((d[ia+4|0]|0)>>>0)/255.0;h[e+8>>3]=+((d[ia+5|0]|0)>>>0)/255.0;h[e+16>>3]=+((d[ia+6|0]|0)>>>0)/255.0;h[e+24>>3]=+((d[ia+10|0]|0)>>>0)/255.0;L=0;i=g;return L|0};case 1:{f=e;a[e]=a[ia+7|0]|0;a[f+1|0]=a[(c[45200]|0)+8|0]|0;a[f+2|0]=a[(c[45200]|0)+9|0]|0;a[f+3|0]=a[(c[45200]|0)+10|0]|0;L=0;i=g;return L|0};case 3:{G=1.0- +(d[ia+7|0]|0)/255.0;D=1.0- +(d[ia+8|0]|0)/255.0;A=1.0- +(d[ia+9|0]|0)/255.0;E=G<D?G:D;_=A<E?A:E;f=e;a[e]=~~(G-_)*255|0;a[f+1|0]=~~(D-_)*255|0;a[f+2|0]=~~(A-_)*255|0;a[f+3|0]=~~_*255|0;L=0;i=g;return L|0};case 2:{f=e;c[e>>2]=(((d[ia+7|0]|0)*65535|0)>>>0)/255|0;c[f+4>>2]=(((d[(c[45200]|0)+8|0]|0)*65535|0)>>>0)/255|0;c[e+8>>2]=(((d[(c[45200]|0)+9|0]|0)*65535|0)>>>0)/255|0;c[f+12>>2]=(((d[(c[45200]|0)+10|0]|0)*65535|0)>>>0)/255|0;L=0;i=g;return L|0};case 4:{h[e>>3]=+(d[ia+7|0]|0)/255.0;h[e+8>>3]=+(d[ia+8|0]|0)/255.0;h[e+16>>3]=+(d[ia+9|0]|0)/255.0;h[e+24>>3]=+(d[ia+10|0]|0)/255.0;L=0;i=g;return L|0};default:{L=0;i=g;return L|0}}}return 0}function Bh(a,b){a=a|0;b=b|0;return pm(c[a>>2]|0,c[b>>2]|0)|0}function Ch(a){a=a|0;c[45206]=a;return}function Dh(a,b,d,e,f){a=a|0;b=+b;d=+d;e=+e;f=+f;var g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,S=0,U=0,Y=0,Z=0,_=0,ba=0,ca=0,da=0.0,ea=0,fa=0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0;g=i;j=a;a=i;i=i+16|0;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];k=+h[a>>3];l=+h[a+8>>3];m=+$(+(+W(e)/d),+(+V(e)/b));n=+$(+(+W(f)/d),+(+V(f)/b));o=n- +R((n-m)/6.283185307179586)*6.283185307179586;do{if(f-e>3.141592653589793){if(o-m>=3.141592653589793){p=o;break}p=o+6.283185307179586}else{p=o}}while(0);o=+V(m);e=o*b;f=+W(m);n=f*d;q=k+e-n*0.0;r=n+(l+e*0.0);e=d/b;a=jk(8)|0;n=p-m;j=e<.25?70344:70600;s=j+160|0;t=j+192|0;u=j+168|0;v=j+128|0;w=j+32|0;x=j+224|0;y=j+200|0;z=j+136|0;A=j+64|0;B=j+40|0;C=j|0;D=j+232|0;E=j+184|0;F=j+176|0;G=j+96|0;H=j+72|0;I=j+8|0;J=j+216|0;K=j+208|0;L=j+152|0;M=j+144|0;N=j+104|0;O=j+56|0;P=j+48|0;Q=j+248|0;S=j+240|0;U=j+88|0;Y=j+80|0;Z=j+24|0;_=j+16|0;ba=j+120|0;ca=j+112|0;p=(e*(e*.001+4.98)+.207)/(e+.0067)*b;j=1;da=n;while(1){if(da>1.5707963267948966){ea=1}else{if((j|0)<=0){fa=7;break}ga=(e*(e*+h[s>>3]+ +h[u>>3])+ +h[F>>3])/(e+ +h[E>>3]);ha=(e*(e*+h[t>>3]+ +h[y>>3])+ +h[K>>3])/(e+ +h[J>>3]);ia=(e*(e*+h[v>>3]+ +h[z>>3])+ +h[M>>3])/(e+ +h[L>>3]);ja=(e*(e*+h[w>>3]+ +h[B>>3])+ +h[P>>3])/(e+ +h[O>>3]);ka=(e*(e*+h[x>>3]+ +h[D>>3])+ +h[S>>3])/(e+ +h[Q>>3]);la=(e*(e*+h[A>>3]+ +h[H>>3])+ +h[Y>>3])/(e+ +h[U>>3]);ma=(e*(e*+h[C>>3]+ +h[I>>3])+ +h[_>>3])/(e+ +h[Z>>3]);na=(e*(e*+h[G>>3]+ +h[N>>3])+ +h[ca>>3])/(e+ +h[ba>>3]);oa=0;pa=m;while(1){qa=da+pa;ra=(pa+qa)*.5;sa=+V(ra*2.0);ta=+V(ra*4.0);ua=+V(ra*6.0);va=p*+aa(la*ta+(ma+ja*sa)+na*ua+(qa-pa)*(ha*ta+(ia+ga*sa)+ka*ua))<=1.0e-5;wa=oa+1|0;if(va&(wa|0)<(j|0)){oa=wa;pa=qa}else{break}}ea=va^1}oa=j<<1;pa=n/+(oa|0);if(ea&(oa|0)<1024){j=oa;da=pa}else{xa=oa;ya=pa;break}}if((fa|0)==7){fa=j<<1;xa=fa;ya=n/+(fa|0)}fa=a;n=f*b;f=o*d;c[45232]=100;j=jk(1600)|0;ea=a;c[ea>>2]=j;h[j>>3]=k;h[(c[ea>>2]|0)+8>>3]=l;j=a+4|0;c[j>>2]=1;a=c[ea>>2]|0;o=+h[a>>3];da=+h[a+8>>3];va=c[45232]|0;if((va|0)>4){za=1;Aa=a}else{c[45232]=va<<1;a=gF(c[ea>>2]|0,va<<5)|0;c[ea>>2]=a;za=c[j>>2]|0;Aa=a}h[Aa+(za<<4)>>3]=o;za=c[j>>2]|0;c[j>>2]=za+1;h[(c[ea>>2]|0)+(za<<4)+8>>3]=da;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=q;za=c[j>>2]|0;c[j>>2]=za+1;h[(c[ea>>2]|0)+(za<<4)+8>>3]=r;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=q;za=c[j>>2]|0;c[j>>2]=za+1;h[(c[ea>>2]|0)+(za<<4)+8>>3]=r;da=+X(ya*.5);o=+W(ya)*(+T(da*da*3.0+4.0)+-1.0)/3.0;if((xa|0)>0){da=-0.0-n-f*0.0;p=f+n*-0.0;n=r;r=q;za=0;q=m;while(1){m=ya+q;f=+V(m);e=+W(m);pa=f*b;ka=e*d;ga=e*b;e=f*d;f=k+pa-ka*0.0;ia=ka+(l+pa*0.0);pa=-0.0-ga-e*0.0;ka=e+ga*-0.0;Aa=c[j>>2]|0;a=c[45232]|0;if((Aa+3|0)<(a|0)){Ba=Aa;Ca=c[ea>>2]|0}else{c[45232]=a<<1;Aa=gF(c[ea>>2]|0,a<<5)|0;c[ea>>2]=Aa;Ba=c[j>>2]|0;Ca=Aa}h[Ca+(Ba<<4)>>3]=r+o*da;Aa=c[j>>2]|0;c[j>>2]=Aa+1;h[(c[ea>>2]|0)+(Aa<<4)+8>>3]=n+o*p;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=f-o*pa;Aa=c[j>>2]|0;c[j>>2]=Aa+1;h[(c[ea>>2]|0)+(Aa<<4)+8>>3]=ia-o*ka;h[(c[ea>>2]|0)+(c[j>>2]<<4)>>3]=f;Aa=c[j>>2]|0;c[j>>2]=Aa+1;h[(c[ea>>2]|0)+(Aa<<4)+8>>3]=ia;Aa=za+1|0;if((Aa|0)<(xa|0)){da=pa;p=ka;n=ia;r=f;za=Aa;q=m}else{break}}}za=c[ea>>2]|0;q=+h[za>>3];r=+h[za+8>>3];xa=c[j>>2]|0;Ba=xa-1|0;n=+h[za+(Ba<<4)>>3];p=+h[za+(Ba<<4)+8>>3];Ba=c[45232]|0;if((xa+3|0)<(Ba|0)){Da=xa;Ea=za;Fa=Ea+(Da<<4)|0;h[Fa>>3]=n;Ga=c[j>>2]|0;Ha=Ga+1|0;c[j>>2]=Ha;Ia=c[ea>>2]|0;Ja=Ia+(Ga<<4)+8|0;h[Ja>>3]=p;Ka=c[j>>2]|0;La=c[ea>>2]|0;Ma=La+(Ka<<4)|0;h[Ma>>3]=q;Na=c[j>>2]|0;Oa=Na+1|0;c[j>>2]=Oa;Pa=c[ea>>2]|0;Qa=Pa+(Na<<4)+8|0;h[Qa>>3]=r;Ra=c[j>>2]|0;Sa=c[ea>>2]|0;Ta=Sa+(Ra<<4)|0;h[Ta>>3]=q;Ua=c[j>>2]|0;Va=Ua+1|0;c[j>>2]=Va;Wa=c[ea>>2]|0;Xa=Wa+(Ua<<4)+8|0;h[Xa>>3]=r;Ya=c[ea>>2]|0;Za=Ya;_a=c[j>>2]|0;$a=_a<<4;ab=gF(Za,$a)|0;bb=ab;c[ea>>2]=bb;c[45232]=0;i=g;return fa|0}c[45232]=Ba<<1;za=gF(c[ea>>2]|0,Ba<<5)|0;c[ea>>2]=za;Da=c[j>>2]|0;Ea=za;Fa=Ea+(Da<<4)|0;h[Fa>>3]=n;Ga=c[j>>2]|0;Ha=Ga+1|0;c[j>>2]=Ha;Ia=c[ea>>2]|0;Ja=Ia+(Ga<<4)+8|0;h[Ja>>3]=p;Ka=c[j>>2]|0;La=c[ea>>2]|0;Ma=La+(Ka<<4)|0;h[Ma>>3]=q;Na=c[j>>2]|0;Oa=Na+1|0;c[j>>2]=Oa;Pa=c[ea>>2]|0;Qa=Pa+(Na<<4)+8|0;h[Qa>>3]=r;Ra=c[j>>2]|0;Sa=c[ea>>2]|0;Ta=Sa+(Ra<<4)|0;h[Ta>>3]=q;Ua=c[j>>2]|0;Va=Ua+1|0;c[j>>2]=Va;Wa=c[ea>>2]|0;Xa=Wa+(Ua<<4)+8|0;h[Xa>>3]=r;Ya=c[ea>>2]|0;Za=Ya;_a=c[j>>2]|0;$a=_a<<4;ab=gF(Za,$a)|0;bb=ab;c[ea>>2]=bb;c[45232]=0;i=g;return fa|0}function Eh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;e=b|0;b=ew(e,122168)|0;do{if((b|0)==0){f=0}else{if((a[b]|0)==0){f=0;break}g=Gn(b,0,120)|0;if((g|0)!=0){f=g;break}g=$w(e)|0;Fv(0,158584,(h=i,i=i+8|0,c[h>>2]=g,h)|0)|0;i=h;Fv(3,128528,(h=i,i=i+8|0,c[h>>2]=b,h)|0)|0;i=h;f=0}}while(0);i=d;return f|0}function Fh(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=i;d=jk(304)|0;e=d;if((d|0)==0){Fv(1,115680,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f}f=a+16|0;a=c[f>>2]|0;c[d>>2]=a;c[f>>2]=e;if((a|0)==0){c[d+144>>2]=3;c[d+148>>2]=0;h[d+152>>3]=1.0;i=b;return e|0}else{f=d+16|0;g=a+16|0;c[f>>2]=c[g>>2];c[f+4>>2]=c[g+4>>2];c[f+8>>2]=c[g+8>>2];c[f+12>>2]=c[g+12>>2];c[f+16>>2]=c[g+16>>2];c[f+20>>2]=c[g+20>>2];c[f+24>>2]=c[g+24>>2];c[f+28>>2]=c[g+28>>2];c[f+32>>2]=c[g+32>>2];c[f+36>>2]=c[g+36>>2];g=d+56|0;f=a+56|0;c[g>>2]=c[f>>2];c[g+4>>2]=c[f+4>>2];c[g+8>>2]=c[f+8>>2];c[g+12>>2]=c[f+12>>2];c[g+16>>2]=c[f+16>>2];c[g+20>>2]=c[f+20>>2];c[g+24>>2]=c[f+24>>2];c[g+28>>2]=c[f+28>>2];c[g+32>>2]=c[f+32>>2];c[g+36>>2]=c[f+36>>2];c[d+144>>2]=c[a+144>>2];c[d+148>>2]=c[a+148>>2];h[d+152>>3]=+h[a+152>>3];c[d+136>>2]=c[a+136>>2];f=d+96|0;d=a+96|0;c[f>>2]=c[d>>2];c[f+4>>2]=c[d+4>>2];c[f+8>>2]=c[d+8>>2];c[f+12>>2]=c[d+12>>2];c[f+16>>2]=c[d+16>>2];c[f+20>>2]=c[d+20>>2];c[f+24>>2]=c[d+24>>2];c[f+28>>2]=c[d+28>>2];c[f+32>>2]=c[d+32>>2];c[f+36>>2]=c[d+36>>2];i=b;return e|0}return 0}function Gh(a){a=a|0;var b=0;b=a+16|0;a=c[b>>2]|0;if((a|0)==0){cc(108512,102832,116,170080)}else{eF(c[a+212>>2]|0);eF(c[a+208>>2]|0);eF(c[a+216>>2]|0);eF(c[a+220>>2]|0);eF(c[a+224>>2]|0);eF(c[a+228>>2]|0);eF(c[a+232>>2]|0);eF(c[a+236>>2]|0);eF(c[a+240>>2]|0);eF(c[a+244>>2]|0);eF(c[a+248>>2]|0);eF(c[a+252>>2]|0);eF(c[a+256>>2]|0);eF(c[a+272>>2]|0);eF(c[a+284>>2]|0);eF(c[a+280>>2]|0);c[b>>2]=c[a>>2];eF(a);return}}function Hh(d,e,f,g,h,i,j){d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0;k=c[d+16>>2]|0;l=c[d+152>>2]|0;if(!((l&32768|0)==0|(e|0)==0)){c[k+192>>2]=e}do{if((l&65536|0)==0){m=0}else{c[k+212>>2]=fk(i,j)|0;if((f|0)==0){m=0;break}if((a[f]|0)==0){m=0;break}c[k+208>>2]=fk(f,j)|0;m=1}}while(0);a:do{if((l&4194304|0)==0){n=m}else{do{if((g|0)!=0){if((a[g]|0)==0){break}c[k+228>>2]=fk(g,j)|0;f=k+260|0;b[f>>1]=b[f>>1]|1;n=1;break a}}while(0);f=c[k+192>>2]|0;if((f|0)==0){n=m;break}c[k+228>>2]=Lb(f|0)|0;n=1}}while(0);if((l&8388608|0)==0|(h|0)==0){o=n;return o|0}if((a[h]|0)==0){o=n;return o|0}c[k+244>>2]=fk(h,j)|0;o=1;return o|0}function Ih(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+64|0;g=f|0;h=c[(c[b>>2]|0)+168>>2]|0;j=c[(c[(c[h+8>>2]|0)+8>>2]|0)+92>>2]|0;Jh(b,e);b=ew(d,97248)|0;do{if((b|0)!=0){if((a[b]|0)==0){break}Lv(e,b)|0;k=e+4|0;l=c[k>>2]|0;if(l>>>0<(c[e+8>>2]|0)>>>0){m=l}else{Jv(e,1)|0;m=c[k>>2]|0}a[m]=0;l=c[e>>2]|0;c[k>>2]=l;n=l;i=f;return n|0}}while(0);if(!((h|0)==(d|0)|(j|0)==0)){Lv(e,j)|0;j=e+4|0;m=c[j>>2]|0;if(m>>>0<(c[e+8>>2]|0)>>>0){o=m}else{Jv(e,1)|0;o=c[j>>2]|0}c[j>>2]=o+1;a[o]=95}o=Sx(d)|0;if((o|0)==0){p=(h|0)==(d|0)?91736:86520;q=(c[d>>2]|0)>>>4}else if((o|0)==2){p=167984;q=(c[d>>2]|0)>>>4}else if((o|0)==1){p=81736;q=(c[d>>2]|0)>>>4}else{p=0;q=0}Lv(e,p)|0;p=g|0;nb(p|0,163832,(g=i,i=i+8|0,c[g>>2]=q,g)|0)|0;i=g;Lv(e,p)|0;p=e+4|0;g=c[p>>2]|0;if(g>>>0<(c[e+8>>2]|0)>>>0){r=g}else{Jv(e,1)|0;r=c[p>>2]|0}a[r]=0;r=c[e>>2]|0;c[p>>2]=r;n=r;i=f;return n|0}function Jh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;i=i+128|0;f=e|0;g=c[b+160>>2]|0;do{if((g|0)>1){if((c[b+152>>2]&64|0)==0){break}Lv(d,c[(c[(c[b>>2]|0)+308>>2]|0)+(g<<2)>>2]|0)|0;h=d+4|0;j=c[h>>2]|0;if(j>>>0<(c[d+8>>2]|0)>>>0){k=j}else{Jv(d,1)|0;k=c[h>>2]|0}c[h>>2]=k+1;a[k]=95}}while(0);k=c[b+196>>2]|0;if((k|0)<=0){i=e;return}g=f|0;f=c[b+200>>2]|0;nb(g|0,159176,(b=i,i=i+16|0,c[b>>2]=k,c[b+8>>2]=f,b)|0)|0;i=b;Lv(d,g)|0;i=e;return}function Kh(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,j=0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;e=i;i=i+24|0;f=e|0;j=e+8|0;k=+h[(c[a+16>>2]|0)+152>>3];l=Lh(d,0,f)|0;if((l-1|0)>>>0<2>>>0){i=e;return l|0}m=+h[b+16>>3];n=(+h[b>>3]+m)*.5;h[j>>3]=n;o=+h[b+24>>3];p=(+h[b+8>>3]+o)*.5;h[j+8>>3]=p;q=m-n;n=o-p;b=k>.5;if(b){xB(a,.5)}d=c[f>>2]|0;f=d+8|0;r=c[f>>2]|0;s=c[r>>2]|0;if((s|0)!=0){t=r;p=0.0;r=s;while(1){s=t+4|0;if(+g[s>>2]==0.0){u=p}else{nB(a,r);if((c[t+12>>2]|0)==0){v=6.283185307179586}else{v=p+ +g[s>>2]*6.283185307179586}s=Dh(j,q,n,p,v)|0;tB(a,c[s>>2]|0,c[s+4>>2]|0,0,0,1);YB(s);u=v}s=t+12|0;w=c[s>>2]|0;if((w|0)==0){break}else{t=s;p=u;r=w}}}if(b){xB(a,k)}eF(c[d+4>>2]|0);eF(c[f>>2]|0);eF(d);i=e;return l|0}function Lh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0,x=0.0,y=0,z=0.0,A=0.0,B=0,C=0.0,D=0,E=0.0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;f=i;i=i+8|0;h=f|0;j=jk(12)|0;k=j;l=Lb(b|0)|0;a:do{if((d|0)==0){m=1;n=l;while(1){o=a[n]|0;if((o<<24>>24|0)==0){p=m;break a}else if((o<<24>>24|0)==58){q=m+1|0}else{q=m}m=q;n=n+1|0}}else{p=d}}while(0);d=j+4|0;c[d>>2]=l;q=jk((p*12|0)+12|0)|0;p=j+8|0;c[p>>2]=q;n=La(l|0,87264)|0;b:do{if((n|0)==0){r=0;s=1.0;t=0;u=31}else{l=n;m=0;v=1.0;o=0;while(1){w=gb(l|0,59)|0;if((w|0)==0){x=0.0}else{y=w+1|0;a[w]=0;z=+sF(y,h);A=(c[h>>2]|0)==(y|0)|z<0.0?-1.0:z;if(A<0.0){u=18;break}else{x=A}}A=x-v;do{if(A>0.0){if(a[14800]|0){B=o;C=v;break}if(A<1.0e-5&A>-1.0e-5){B=o;C=v;break}Fv(0,160368,(D=i,i=i+8|0,c[D>>2]=b,D)|0)|0;i=D;a[14800]=1;B=3;C=v}else{B=o;C=x}}while(0);E=v-C;if(C>0.0){a[q+(m*12|0)+8|0]=1}if((a[l]|0)!=0){c[q+(m*12|0)>>2]=l}F=m+1|0;g[q+(m*12|0)+4>>2]=C;if(E<1.0e-5&E>-1.0e-5){G=F;H=B;break b}y=La(0,87264)|0;if((y|0)==0){break}else{l=y;m=F;v=E;o=B}}if((u|0)==18){if(a[14800]|0){I=1}else{Fv(1,159912,(D=i,i=i+8|0,c[D>>2]=b,D)|0)|0;i=D;a[14800]=1;I=2}eF(c[d>>2]|0);eF(c[p>>2]|0);eF(j);J=I;i=f;return J|0}if(E<=0.0){G=F;H=B;break}o=(m|0)>-1;if(o){K=0;L=0}else{r=B;s=E;t=F;u=31;break}do{L=(+g[q+(K*12|0)+4>>2]==0.0)+L|0;K=K+1|0;}while((K|0)<(F|0));if((L|0)<=0){r=B;s=E;t=F;u=31;break}if(!o){G=F;H=B;break}v=E/+(L|0);m=0;while(1){l=q+(m*12|0)+4|0;if(+g[l>>2]==0.0){g[l>>2]=v}l=m+1|0;if((l|0)<(F|0)){m=l}else{G=F;H=B;break}}}}while(0);if((u|0)==31){u=q+((t-1|0)*12|0)+4|0;g[u>>2]=s+ +g[u>>2];G=t;H=r}r=G;while(1){G=r-1|0;if((r|0)<=0){break}if(+g[q+(G*12|0)+4>>2]>0.0){break}else{r=G}}c[q+(r*12|0)>>2]=0;c[j>>2]=r;c[e>>2]=k;J=H;i=f;return J|0}function Mh(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,j=0,k=0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0.0;f=i;i=i+72|0;j=f|0;k=f+8|0;l=+h[(c[a+16>>2]|0)+152>>3];m=Lh(d,0,j)|0;if((m-1|0)>>>0<2>>>0){i=f;return m|0}d=k|0;if((e|0)==0){e=k;n=b;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+16|0;e=b+16|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];e=k+32|0;n=b+32|0;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+48|0;e=b+48|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2]}else{e=k;n=b+32|0;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+16|0;e=b+48|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2];e=k+32|0;n=b;c[e>>2]=c[n>>2];c[e+4>>2]=c[n+4>>2];c[e+8>>2]=c[n+8>>2];c[e+12>>2]=c[n+12>>2];n=k+48|0;e=b+16|0;c[n>>2]=c[e>>2];c[n+4>>2]=c[e+4>>2];c[n+8>>2]=c[e+8>>2];c[n+12>>2]=c[e+12>>2]}e=k+16|0;o=+h[e>>3];n=k|0;p=+h[n>>3];q=o-p;b=k+32|0;h[b>>3]=p;h[e>>3]=p;r=l>.5;if(r){xB(a,.5)}s=c[j>>2]|0;j=s+8|0;t=c[j>>2]|0;u=c[t>>2]|0;if((u|0)!=0){v=k+48|0;k=t;t=u;do{u=k+4|0;if(+g[u>>2]!=0.0){nB(a,t);if((c[k+12>>2]|0)==0){w=o}else{w=+h[n>>3]+q*+g[u>>2]}h[b>>3]=w;h[e>>3]=w;rB(a,d,4,1);p=+h[e>>3];h[v>>3]=p;h[n>>3]=p}k=k+12|0;t=c[k>>2]|0;}while((t|0)!=0)}if(r){xB(a,l)}eF(c[s+4>>2]|0);eF(c[j>>2]|0);eF(s);i=f;return m|0}function Nh(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=b;b=i;i=i+32|0;tF(b,e,32)|0;e=c[a+16>>2]|0;f=c[a+152>>2]|0;if((f&4259840|0)==0){i=d;return}g=(f&131072|0)!=0;h=e+264|0;if(g){c[h>>2]=0;c[e+268>>2]=2}else{c[h>>2]=2;c[e+268>>2]=4}h=e+272|0;eF(c[h>>2]|0);j=jk(c[e+268>>2]<<4)|0;e=j;c[h>>2]=e;h=b;c[j>>2]=c[h>>2];c[j+4>>2]=c[h+4>>2];c[j+8>>2]=c[h+8>>2];c[j+12>>2]=c[h+12>>2];h=j+16|0;j=b+16|0;c[h>>2]=c[j>>2];c[h+4>>2]=c[j+4>>2];c[h+8>>2]=c[j+8>>2];c[h+12>>2]=c[j+12>>2];if((f&8192|0)==0){RA(a,e,e,2)|0}if(g){i=d;return}qi(e);i=d;return}function Oh(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;c=i;i=i+144|0;d=c|0;e=c+64|0;f=c+128|0;g=b|0;j=+h[g>>3];k=a+16|0;l=+h[k>>3];do{if(j<=l){m=+h[a>>3];if(j<m){break}n=+h[b+8>>3];o=+h[a+24>>3];if(n>o){break}p=+h[a+8>>3];if(n<p){break}n=+h[b+16>>3];if(n>l|n<m){break}n=+h[b+24>>3];if(n>o|n<p){break}n=+h[b+32>>3];if(n>l|n<m){break}n=+h[b+40>>3];if(n>o|n<p){break}n=+h[b+48>>3];if(n>l|n<m){break}m=+h[b+56>>3];if(m>o|m<p){break}i=c;return}}while(0);q=b+48|0;l=+ui(b,q,b+16|0);if(!(l<4.0&+ui(b,q,b+32|0)<4.0)){q=d|0;d=e|0;Qm(f,b,3,.5,q,d);Oh(a,q);Oh(a,d);i=c;return}d=a+24|0;q=a+8|0;f=a|0;l=+h[g>>3];j=+h[k>>3];do{if(l>j){h[k>>3]=l;r=l}else{if(l>=+h[f>>3]){r=j;break}h[f>>3]=l;r=j}}while(0);j=+h[b+8>>3];l=+h[d>>3];do{if(j>l){h[d>>3]=j;s=j}else{if(j>=+h[q>>3]){s=l;break}h[q>>3]=j;s=l}}while(0);l=+h[b+16>>3];do{if(l>r){h[k>>3]=l;t=l}else{if(l>=+h[f>>3]){t=r;break}h[f>>3]=l;t=r}}while(0);r=+h[b+24>>3];do{if(r>s){h[d>>3]=r;u=r}else{if(r>=+h[q>>3]){u=s;break}h[q>>3]=r;u=s}}while(0);s=+h[b+32>>3];do{if(s>t){h[k>>3]=s;v=s}else{if(s>=+h[f>>3]){v=t;break}h[f>>3]=s;v=t}}while(0);t=+h[b+40>>3];do{if(t>u){h[d>>3]=t;w=t}else{if(t>=+h[q>>3]){w=u;break}h[q>>3]=t;w=u}}while(0);u=+h[b+48>>3];do{if(u>v){h[k>>3]=u}else{if(u>=+h[f>>3]){break}h[f>>3]=u}}while(0);u=+h[b+56>>3];if(u>w){h[d>>3]=u;i=c;return}if(u>=+h[q>>3]){i=c;return}h[q>>3]=u;i=c;return}function Ph(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0.0,T=0.0,U=0.0,V=0.0,W=0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0;e=i;i=i+48|0;f=e|0;g=e+32|0;j=c[d+8>>2]|0;d=c[j+136>>2]|0;k=+h[j+16>>3];l=+h[j+24>>3];m=+h[j+32>>3];n=+h[j+40>>3];o=c[(c[j+8>>2]|0)+88>>2]|0;if((o|0)==0){h[b>>3]=k;h[b+8>>3]=l;h[b+16>>3]=m;h[b+24>>3]=n;i=e;return}j=k==m&l==n;p=j?-1.7976931348623157e+308:n;n=j?-1.7976931348623157e+308:m;m=j?1.7976931348623157e+308:l;l=j?1.7976931348623157e+308:k;j=o;a:do{if((c[j>>2]|0)>0){q=f;r=f|0;s=f+16|0;t=d+144|0;u=o+12|0;k=p;v=n;w=m;x=l;y=0;z=0.0;A=0;B=c[o+8>>2]|0;while(1){c[q>>2]=c[54];c[q+4>>2]=c[55];c[q+8>>2]=c[56];c[q+12>>2]=c[57];c[q+16>>2]=c[58];c[q+20>>2]=c[59];c[q+24>>2]=c[60];c[q+28>>2]=c[61];b:do{switch(c[B>>2]|0){case 4:case 5:{C=B+8|0;D=c[C+4>>2]|0;E=c[C>>2]|0;F=+h[D>>3];G=+h[D+8>>3];if((E|0)>1){H=G;I=F;J=G;K=F;C=D;D=1;while(1){L=C+24|0;M=+h[L>>3];do{if(M<K){N=M;O=I}else{if(M<=I){N=K;O=I;break}N=K;O=M}}while(0);M=+h[C+32>>3];do{if(M<J){P=M;Q=H}else{if(M<=H){P=J;Q=H;break}P=J;Q=M}}while(0);R=D+1|0;if((R|0)<(E|0)){H=Q;I=O;J=P;K=N;C=L;D=R}else{S=Q;T=O;U=P;V=N;break}}}else{S=G;T=F;U=G;V=F}K=v<V?V:v;J=x>V?V:x;I=k<U?U:k;H=w>U?U:w;h[B+80>>3]=V;h[B+88>>3]=U;h[B+96>>3]=T;h[B+104>>3]=S;W=A;X=z;Y=J>T?T:J;Z=H>S?S:H;_=K<T?T:K;$=I<S?S:I;break};case 7:{D=B+112|0;c[D>>2]=jk(56)|0;C=Lb(c[B+40>>2]|0)|0;c[c[D>>2]>>2]=C;a[(c[D>>2]|0)+48|0]=a[74912+(c[B+24>>2]|0)|0]|0;c[r>>2]=A;h[s>>3]=z;C=c[t>>2]|0;E=Hc[c[C>>2]&63](C,q,1)|0;c[(c[D>>2]|0)+4>>2]=E;sm(g,d,c[D>>2]|0);I=+h[B+8>>3];K=+h[B+16>>3];E=c[D>>2]|0;H=+h[E+32>>3];J=+h[E+40>>3];D=a[E+48|0]|0;if((D|0)==114){aa=I;ba=I-H}else if((D|0)==110){M=H*.5;aa=I+M;ba=I-M}else if((D|0)==108){aa=I+H;ba=I}else{aa=0.0;ba=0.0}I=K+ +h[E+16>>3];K=I-J;h[B+80>>3]=ba;h[B+88>>3]=K;h[B+96>>3]=aa;h[B+104>>3]=I;J=v<ba?ba:v;H=x>ba?ba:x;M=k<K?K:k;ca=w>K?K:w;K=J<aa?aa:J;J=H>aa?aa:H;H=M<I?I:M;M=ca>I?I:ca;if((c[u>>2]|0)!=0){W=A;X=z;Y=J;Z=M;_=K;$=H;break b}c[u>>2]=130;W=A;X=z;Y=J;Z=M;_=K;$=H;break};case 10:{W=c[B+16>>2]|0;X=+h[B+8>>3];Y=x;Z=w;_=v;$=k;break};case 2:case 3:{E=B+8|0;D=c[E+4>>2]|0;C=c[E>>2]|0;H=+h[D>>3];K=+h[D+8>>3];if((C|0)>1){M=K;J=H;ca=K;I=H;E=D;D=1;while(1){R=E+24|0;da=+h[R>>3];do{if(da<I){ea=da;fa=J}else{if(da<=J){ea=I;fa=J;break}ea=I;fa=da}}while(0);da=+h[E+32>>3];do{if(da<ca){ga=da;ha=M}else{if(da<=M){ga=ca;ha=M;break}ga=ca;ha=da}}while(0);L=D+1|0;if((L|0)<(C|0)){M=ha;J=fa;ca=ga;I=ea;E=R;D=L}else{ia=ha;ja=fa;ka=ga;la=ea;break}}}else{ia=K;ja=H;ka=K;la=H}I=v<la?la:v;ca=x>la?la:x;J=k<ka?ka:k;M=w>ka?ka:w;h[B+80>>3]=la;h[B+88>>3]=ka;h[B+96>>3]=ja;h[B+104>>3]=ia;W=A;X=z;Y=ca>ja?ja:ca;Z=M>ia?ia:M;_=I<ja?ja:I;$=J<ia?ia:J;break};case 0:case 1:{J=+h[B+8>>3];I=+h[B+24>>3];M=J-I;ca=+h[B+16>>3];F=+h[B+32>>3];G=ca-F;da=J+I;I=ca+F;h[B+80>>3]=M;h[B+88>>3]=G;h[B+96>>3]=da;h[B+104>>3]=I;F=v<M?M:v;ca=x>M?M:x;M=k<G?G:k;J=w>G?G:w;G=F<da?da:F;F=ca>da?da:ca;ca=M<I?I:M;if(J<=I){W=A;X=z;Y=F;Z=J;_=G;$=ca;break b}W=A;X=z;Y=F;Z=I;_=G;$=ca;break};case 6:{D=B+8|0;E=c[D+4>>2]|0;C=c[D>>2]|0;ca=+h[E>>3];G=+h[E+8>>3];if((C|0)>1){I=G;F=ca;J=G;M=ca;D=E;E=1;while(1){L=D+24|0;da=+h[L>>3];do{if(da<M){ma=da;na=F}else{if(da<=F){ma=M;na=F;break}ma=M;na=da}}while(0);da=+h[D+32>>3];do{if(da<J){oa=da;pa=I}else{if(da<=I){oa=J;pa=I;break}oa=J;pa=da}}while(0);R=E+1|0;if((R|0)<(C|0)){I=pa;F=na;J=oa;M=ma;D=L;E=R}else{qa=pa;ra=na;sa=oa;ta=ma;break}}}else{qa=G;ra=ca;sa=G;ta=ca}M=v<ta?ta:v;J=x>ta?ta:x;F=k<sa?sa:k;I=w>sa?sa:w;h[B+80>>3]=ta;h[B+88>>3]=sa;h[B+96>>3]=ra;h[B+104>>3]=qa;W=A;X=z;Y=J>ra?ra:J;Z=I>qa?qa:I;_=M<ra?ra:M;$=F<qa?qa:F;break};default:{W=A;X=z;Y=x;Z=w;_=v;$=k}}}while(0);E=y+1|0;if((E|0)<(c[j>>2]|0)){k=$;v=_;w=Z;x=Y;y=E;z=X;A=W;B=B+120|0}else{ua=$;va=_;wa=Z;xa=Y;break a}}}else{ua=p;va=n;wa=m;xa=l}}while(0);h[b>>3]=xa;h[b+8>>3]=wa;h[b+16>>3]=va;h[b+24>>3]=ua;i=e;return}function Qh(a){a=a|0;if((c[a>>2]|0)!=7){return}ck(c[a+112>>2]|0,1);return}function Rh(d,e){d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Za=0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0.0,db=0.0,eb=0,fb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0;f=i;i=i+200|0;j=f|0;k=f+8|0;l=f+16|0;m=f+24|0;n=f+56|0;o=f+184|0;p=d+152|0;q=c[p>>2]|0;r=d+352|0;s=+h[r>>3];t=+h[d+432>>3];u=s*t/72.0;h[d+488>>3]=u;v=+h[d+440>>3];w=s*v/72.0;h[d+496>>3]=w;h[d+520>>3]=t/72.0;t=v/72.0;x=d+528|0;h[x>>3]=t;if((q&4096|c[53492]|0)!=0){h[x>>3]=t*-1.0}x=d+360|0;t=+((c[d+448>>2]|0)>>>0>>>0);if((c[x>>2]|0)==0){h[d+368>>3]=t/u;h[d+376>>3]=+((c[d+452>>2]|0)>>>0>>>0)/w}else{h[d+376>>3]=t/w;h[d+368>>3]=+((c[d+452>>2]|0)>>>0>>>0)/u}y=e|0;vB(d,Hm(y,Wv(e,0,154768,0)|0,213440)|0);z=d+160|0;c[z>>2]=0;A=jk(304)|0;if((A|0)==0){Fv(1,115680,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B}C=d+16|0;D=c[C>>2]|0;c[A>>2]=D;c[C>>2]=A;if((D|0)==0){c[A+144>>2]=3;c[A+148>>2]=0;h[A+152>>3]=1.0}else{E=A+16|0;F=D+16|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[E+16>>2]=c[F+16>>2];c[E+20>>2]=c[F+20>>2];c[E+24>>2]=c[F+24>>2];c[E+28>>2]=c[F+28>>2];c[E+32>>2]=c[F+32>>2];c[E+36>>2]=c[F+36>>2];F=A+56|0;E=D+56|0;c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];c[F+16>>2]=c[E+16>>2];c[F+20>>2]=c[E+20>>2];c[F+24>>2]=c[E+24>>2];c[F+28>>2]=c[E+28>>2];c[F+32>>2]=c[E+32>>2];c[F+36>>2]=c[E+36>>2];c[A+144>>2]=c[D+144>>2];c[A+148>>2]=c[D+148>>2];h[A+152>>3]=+h[D+152>>3];c[A+136>>2]=c[D+136>>2];E=A+96|0;F=D+96|0;c[E>>2]=c[F>>2];c[E+4>>2]=c[F+4>>2];c[E+8>>2]=c[F+8>>2];c[E+12>>2]=c[F+12>>2];c[E+16>>2]=c[F+16>>2];c[E+20>>2]=c[F+20>>2];c[E+24>>2]=c[F+24>>2];c[E+28>>2]=c[F+28>>2];c[E+32>>2]=c[F+32>>2];c[E+36>>2]=c[F+36>>2]}c[A+4>>2]=0;c[A+8>>2]=e;c[A+12>>2]=0;A=e+8|0;mi(d,c[(c[A>>2]|0)+12>>2]|0,y);SA(d,e);do{if((q&2|0)!=0){nB(d,119400);F=ew(y,120224)|0;do{if((F|0)!=0){if((a[F]|0)==0){break}nB(d,F)}}while(0);F=ew(y,160752)|0;do{if((F|0)!=0){if((a[F]|0)==0){break}lB(d,F)}}while(0);oi(d,e);F=ux(e)|0;if((F|0)==0){break}else{G=F}do{F=G|0;E=ew(F,123768)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}lB(d,E)}}while(0);E=ew(F,121832)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}nB(d,E)}}while(0);E=ew(F,121048)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}if((gb(E|0,58)|0)==0){lB(d,E);break}D=Lb(E|0)|0;H=La(D|0,87264)|0;if((H|0)!=0){I=H;do{if((a[I]|0)!=0){lB(d,I)}I=La(0,87264)|0;}while((I|0)!=0)}eF(D)}}while(0);E=ew(F,160752)|0;do{if((E|0)!=0){if((a[E]|0)==0){break}lB(d,E)}}while(0);E=mw(e,G)|0;if((E|0)!=0){F=E;do{E=F|0;I=ew(E,123768)|0;do{if((I|0)!=0){if((a[I]|0)==0){break}if((gb(I|0,58)|0)==0){lB(d,I);break}H=Lb(I|0)|0;J=La(H|0,87264)|0;if((J|0)!=0){K=J;do{if((a[K]|0)!=0){lB(d,K)}K=La(0,87264)|0;}while((K|0)!=0)}eF(H)}}while(0);I=ew(E,160752)|0;do{if((I|0)!=0){if((a[I]|0)==0){break}lB(d,I)}}while(0);F=ow(e,F)|0;}while((F|0)!=0)}G=vx(e,G)|0;}while((G|0)!=0)}}while(0);G=ux(e)|0;if((G|0)!=0){q=G;do{a[(c[q+8>>2]|0)+116|0]=0;q=vx(e,q)|0;}while((q|0)!=0)}q=d|0;G=c[q>>2]|0;F=c[G+312>>2]|0;I=d+156|0;c[I>>2]=F;E=c[G+316>>2]|0;do{if((E|0)==0){if((F|0)<=1){L=0;M=1;N=F;O=62;break}if((c[p>>2]&64|0)!=0){L=0;M=1;N=F;O=62;break}Fv(0,161048,(B=i,i=i+8|0,c[B>>2]=c[d+52>>2],B)|0)|0;i=B;c[I>>2]=1;c[z>>2]=1;P=0}else{G=E+4|0;do{if((c[E>>2]|0)>1){if((c[p>>2]&64|0)!=0){Q=F;break}Fv(0,161048,(B=i,i=i+8|0,c[B>>2]=c[d+52>>2],B)|0)|0;i=B;c[E+8>>2]=(c[I>>2]|0)+1;Q=c[I>>2]|0}else{Q=F}}while(0);L=E+8|0;M=c[G>>2]|0;N=Q;O=62}}while(0);do{if((O|0)==62){c[z>>2]=M;if((M|0)<=(N|0)){P=L;break}TA(d);Gh(d);i=f;return}}while(0);L=d+196|0;N=d+172|0;M=L;Q=d+164|0;E=d+200|0;F=d+168|0;D=m;K=n|0;n=o+4|0;J=o+8|0;R=o|0;S=d+164|0;T=d+320|0;U=d+240|0;V=d+288|0;W=d+328|0;X=d+248|0;Z=d+296|0;_=d+304|0;aa=d+312|0;ba=d+12|0;ca=d+472|0;da=ca;ea=d+456|0;fa=d+336|0;ga=d+256|0;ha=d+344|0;ia=d+264|0;ja=d+272|0;ka=d+280|0;la=d+384|0;ma=d+504|0;na=d+392|0;oa=d+512|0;pa=j|0;qa=d+256|0;ra=j+4|0;j=L|0;L=d+188|0;sa=d+192|0;ta=d+184|0;ua=d+176|0;va=d+180|0;wa=d+172|0;xa=qa;ya=m+16|0;m=d+288|0;za=d+304|0;Aa=d+384|0;Ba=d+504|0;Ca=d+368|0;Da=d+376|0;Ea=ca|0;ca=d+456|0;Fa=d+476|0;Ga=d+460|0;Ha=d+480|0;Ia=d+464|0;Ja=d+484|0;Ka=d+468|0;Ma=P;while(1){P=c[(c[q>>2]|0)+316>>2]|0;if((c[((P|0)==0?I:P)>>2]|0)>1){WA(d)}P=c[N>>2]|0;Na=c[N+4>>2]|0;c[M>>2]=P;c[M+4>>2]=Na;Oa=P;a:do{if((Oa|0)>-1){P=Na;Pa=Oa;while(1){if(!((Pa|0)<(c[Q>>2]|0)&(P|0)>-1)){break a}if((P|0)>=(c[F>>2]|0)){break a}Qa=c[C>>2]|0;Ra=c[p>>2]|0;if((c[z>>2]|0)>1|(Pa|0)>0){Iv(o,128,K);Sa=Qa+212|0;Ta=c[Sa>>2]|0;Jh(d,o);Lv(o,Ta)|0;Ua=c[n>>2]|0;if(Ua>>>0<(c[J>>2]|0)>>>0){Va=Ua}else{Jv(o,1)|0;Va=c[n>>2]|0}a[Va]=0;Ua=c[R>>2]|0;c[n>>2]=Ua;c[Sa>>2]=Ua;Wa=Ta}else{Wa=0}Ch(ew(y,148552)|0);Ta=c[M>>2]|0;Ua=c[M+4>>2]|0;Sa=c[S>>2]|0;Xa=c[S+4>>2]|0;Za=(c[x>>2]|0)==0;u=+((Za?Ta:Ua)|0);w=+h[T>>3];t=w*u- +h[U>>3];h[V>>3]=t;v=+((Za?Ua:Ta)|0);s=+h[W>>3];_a=v*s- +h[X>>3];h[Z>>3]=_a;h[_>>3]=w+t;h[aa>>3]=s+_a;if((c[(c[ba>>2]|0)+28>>2]|0)==0){c[da>>2]=c[ea>>2];c[da+4>>2]=c[ea+4>>2];c[da+8>>2]=c[ea+8>>2];c[da+12>>2]=c[ea+12>>2]}else{Ta=c[Ea>>2]|0;Ua=c[ca>>2]|0;c[Ea>>2]=(Ta|0)<(Ua|0)?Ta:Ua;Ua=c[Fa>>2]|0;Ta=c[Ga>>2]|0;c[Fa>>2]=(Ua|0)<(Ta|0)?Ua:Ta;Ta=c[Ha>>2]|0;Ua=c[Ia>>2]|0;c[Ha>>2]=(Ta|0)>(Ua|0)?Ta:Ua;Ua=c[Ja>>2]|0;Ta=c[Ka>>2]|0;c[Ja>>2]=(Ua|0)>(Ta|0)?Ua:Ta}Ta=c[p>>2]|0;_a=+h[fa>>3];if((Ta&128|0)==0){t=w*(u- +((Za?Sa:Xa)|0)*.5)+_a;h[ga>>3]=t;u=s*(v- +((Za?Xa:Sa)|0)*.5)+ +h[ha>>3];h[ia>>3]=u;v=w+t;h[ja>>3]=v;$a=t;ab=u;bb=v;cb=s+u}else{u=+h[Ca>>3]*.5;s=_a-u;h[ga>>3]=s;v=+h[ha>>3];t=+h[Da>>3]*.5;w=v-t;h[ia>>3]=w;db=_a+u;h[ja>>3]=db;$a=s;ab=w;bb=db;cb=v+t}h[ka>>3]=cb;do{if(Za){t=+h[r>>3];h[ma>>3]=+h[la>>3]/t-$a;if((c[53492]|Ta&4096|0)==0){h[oa>>3]=+h[na>>3]/t-ab;break}else{h[oa>>3]=-0.0-cb- +h[na>>3]/t;break}}else{t=+h[r>>3];h[oa>>3]=-0.0-cb- +h[na>>3]/t;if((c[53492]|Ta&4096|0)==0){h[Ba>>3]=+h[Aa>>3]/t-$a;break}else{h[Ba>>3]=-0.0-bb- +h[Aa>>3]/t;break}}}while(0);UA(d);lB(d,159752);nB(d,119400);do{if((Ra&4259840|0)!=0){if((c[Qa+208>>2]|0)==0){if((b[Qa+260>>1]&1)==0){break}}do{if((Ra&655360|0)==0){eb=0;fb=0}else{Ta=Ra&131072;Za=Ta>>>16^2;Sa=Za+2|0;c[Qa+264>>2]=Za;Za=jk(Sa<<4)|0;Xa=Za;c[Za>>2]=c[m>>2];c[Za+4>>2]=c[m+4>>2];c[Za+8>>2]=c[m+8>>2];c[Za+12>>2]=c[m+12>>2];Ua=Za+16|0;c[Ua>>2]=c[za>>2];c[Ua+4>>2]=c[za+4>>2];c[Ua+8>>2]=c[za+8>>2];c[Ua+12>>2]=c[za+12>>2];if((Ta|0)!=0){eb=Xa;fb=Sa;break}qi(Xa);eb=Xa;fb=Sa}}while(0);if((Ra&8192|0)==0){RA(d,eb,eb,fb)|0}c[Qa+272>>2]=eb;c[Qa+268>>2]=fb}}while(0);do{if((Ra&32768|0)!=0){H=c[(c[A>>2]|0)+12>>2]|0;if((H|0)==0){break}c[Qa+192>>2]=c[H>>2]}}while(0);H=(Ra&4|0)!=0;do{if(!H){Sa=Qa+208|0;if((c[Sa>>2]|0)==0){if((b[Qa+260>>1]&1)==0){break}}tF(D|0,xa|0,32)|0;Xa=c[C>>2]|0;Ta=c[p>>2]|0;do{if((Ta&4259840|0)!=0){Ua=(Ta&131072|0)!=0;Za=Xa+264|0;if(Ua){c[Za>>2]=0;c[Xa+268>>2]=2}else{c[Za>>2]=2;c[Xa+268>>2]=4}Za=Xa+272|0;eF(c[Za>>2]|0);hb=jk(c[Xa+268>>2]<<4)|0;ib=hb;c[Za>>2]=ib;c[hb>>2]=c[D>>2];c[hb+4>>2]=c[D+4>>2];c[hb+8>>2]=c[D+8>>2];c[hb+12>>2]=c[D+12>>2];Za=hb+16|0;c[Za>>2]=c[ya>>2];c[Za+4>>2]=c[ya+4>>2];c[Za+8>>2]=c[ya+8>>2];c[Za+12>>2]=c[ya+12>>2];if((Ta&8192|0)==0){RA(d,ib,ib,2)|0}if(Ua){break}qi(ib)}}while(0);gB(d,c[Sa>>2]|0,c[Qa+228>>2]|0,c[Qa+244>>2]|0,c[Qa+212>>2]|0)}}while(0);Ta=ew(y,120224)|0;if((Ta|0)==0){jb=1;kb=162072}else{Xa=(a[Ta]|0)==0;jb=Xa&1;kb=Xa?162072:Ta}Ta=c[p>>2]|0;Xa=(a[kb]|0)==116;do{if((Ta&256|0)==0){if(!Xa){lb=kb;mb=jb;O=118;break}ib=(Ya(kb|0,118712)|0)==0;lb=ib?162072:kb;mb=ib?1:jb;O=118}else{if(!Xa){lb=kb;mb=jb;O=118;break}if((Ya(kb|0,118712)|0)!=0){lb=kb;mb=jb;O=118}}}while(0);do{if((O|0)==118){O=0;if(!((Ta&33554432|0)==0|(mb|0)==0)){break}if((Vh(lb,pa,k)|0)<<24>>24==0){nB(d,lb);lB(d,118712);sB(d,qa,1);break}c[l>>2]=0;Xa=c[pa>>2]|0;nB(d,Xa);lB(d,118712);Uh(e,l)|0;ib=c[ra>>2]|0;Ua=Em(y,c[53722]|0,0,0)|0;t=+g[k>>2];if((ib|0)==0){oB(d,159752,Ua,t)}else{oB(d,ib,Ua,t)}sB(d,qa,(c[l>>2]|0)>>>1&1|2);eF(Xa)}}while(0);Ta=c[A>>2]|0;Xa=c[(c[Ta+8>>2]|0)+88>>2]|0;if((Xa|0)==0){nb=Ta}else{Ta=kk(16e3)|0;Ua=Xa;do{if((c[Ua>>2]|0)>0){ib=1e3;Za=c[Xa+8>>2]|0;hb=0;ob=0;pb=1;qb=Ta;rb=1;while(1){sb=Za|0;b:do{switch(c[sb>>2]|0){case 0:case 1:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}yb=Za+24|0;h[qb>>3]=+h[Za+8>>3]- +h[yb>>3];zb=Za+32|0;h[qb+8>>3]=+h[Za+16>>3]- +h[zb>>3];h[qb+16>>3]=+h[yb>>3];h[qb+24>>3]=+h[zb>>3];qB(d,qb,2,(c[sb>>2]|0)==0?pb:0);tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break};case 7:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}h[qb>>3]=+h[Za+8>>3];h[qb+8>>3]=+h[Za+16>>3];kB(d,qb,c[Za+112>>2]|0);tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break};case 14:{Fv(0,161720,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break};case 2:case 3:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}zb=Za+8|0;yb=c[zb+4>>2]|0;Ab=zb|0;zb=c[Ab>>2]|0;if((ib|0)<(zb|0)){Bb=ib<<1;Cb=(Bb|0)>(zb|0)?Bb:zb;Db=mk(qb,Cb<<4)|0;Eb=Cb}else{Db=qb;Eb=ib}if((zb|0)>0){Cb=0;do{h[Db+(Cb<<4)>>3]=+h[yb+(Cb*24|0)>>3];h[Db+(Cb<<4)+8>>3]=+h[yb+(Cb*24|0)+8>>3];Cb=Cb+1|0;}while((Cb|0)<(zb|0))}rB(d,Db,c[Ab>>2]|0,(c[sb>>2]|0)==2?pb:0);tb=rb;ub=Db;vb=pb;wb=ob;xb=Eb;break};case 8:{nB(d,c[Za+8>>2]|0);tb=rb;ub=qb;vb=1;wb=ob;xb=ib;break};case 9:{lB(d,c[Za+8>>2]|0);tb=rb;ub=qb;vb=1;wb=ob;xb=ib;break};case 4:case 5:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}zb=Za+8|0;Cb=c[zb+4>>2]|0;yb=zb|0;zb=c[yb>>2]|0;if((ib|0)<(zb|0)){Bb=ib<<1;Fb=(Bb|0)>(zb|0)?Bb:zb;Gb=mk(qb,Fb<<4)|0;Hb=Fb}else{Gb=qb;Hb=ib}if((zb|0)>0){Fb=0;do{h[Gb+(Fb<<4)>>3]=+h[Cb+(Fb*24|0)>>3];h[Gb+(Fb<<4)+8>>3]=+h[Cb+(Fb*24|0)+8>>3];Fb=Fb+1|0;}while((Fb|0)<(zb|0))}tB(d,Gb,c[yb>>2]|0,0,0,(c[sb>>2]|0)==4?pb&255:0);tb=rb;ub=Gb;vb=pb;wb=ob;xb=Hb;break};case 6:{if(+h[Za+96>>3]<+h[ga>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ja>>3]<+h[Za+80>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[Za+104>>3]<+h[ia>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}if(+h[ka>>3]<+h[Za+88>>3]){tb=rb;ub=qb;vb=pb;wb=ob;xb=ib;break b}zb=Za+8|0;Fb=c[zb+4>>2]|0;Cb=zb|0;zb=c[Cb>>2]|0;if((ib|0)<(zb|0)){Ab=ib<<1;Bb=(Ab|0)>(zb|0)?Ab:zb;Ib=mk(qb,Bb<<4)|0;Jb=Bb}else{Ib=qb;Jb=ib}if((zb|0)>0){Bb=0;do{h[Ib+(Bb<<4)>>3]=+h[Fb+(Bb*24|0)>>3];h[Ib+(Bb<<4)+8>>3]=+h[Fb+(Bb*24|0)+8>>3];Bb=Bb+1|0;}while((Bb|0)<(zb|0))}uB(d,Ib,c[Cb>>2]|0);tb=rb;ub=Ib;vb=pb;wb=ob;xb=Jb;break};case 12:{if((rb|0)==0){tb=0;ub=qb;vb=pb;wb=ob;xb=ib;break b}Fv(0,161384,(B=i,i=i+1|0,i=i+7&-8,c[B>>2]=0,B)|0)|0;i=B;tb=0;ub=qb;vb=pb;wb=ob;xb=ib;break};case 13:{zb=Za+16|0;if((c[Za+8>>2]|0)!=2){Bb=c[zb+36>>2]|0;Fb=c[Bb+12>>2]|0;t=+g[Bb+8>>2];yb=~~(+$(+(+h[Za+40>>3]- +h[Za+24>>3]),+(+h[Za+32>>3]- +h[zb>>3]))*180.0/3.141592653589793);nB(d,c[Bb+4>>2]|0);oB(d,Fb,yb,t);tb=rb;ub=qb;vb=2;wb=ob;xb=ib;break b}yb=c[Za+68>>2]|0;Fb=c[yb+4>>2]|0;Bb=c[yb+12>>2]|0;t=+g[yb+8>>2];v=+h[Za+40>>3];db=+h[zb>>3];if(v==db){if(+h[Za+48>>3]==+h[Za+24>>3]){Kb=0}else{O=171}}else{O=171}if((O|0)==171){O=0;Kb=~~(+Y((db-v)/+h[Za+32>>3])*180.0/3.141592653589793)}nB(d,Fb);oB(d,Bb,Kb,t);tb=rb;ub=qb;vb=3;wb=ob;xb=ib;break};case 11:{Yh(c[Za+8>>2]|0)|0;pB(d,176472);tb=rb;ub=qb;vb=pb;wb=176472;xb=ib;break};default:{tb=rb;ub=qb;vb=pb;wb=ob;xb=ib}}}while(0);sb=hb+1|0;if((sb|0)<(c[Ua>>2]|0)){ib=xb;Za=Za+120|0;hb=sb;ob=wb;pb=vb;qb=ub;rb=tb}else{break}}if((wb|0)==0){Mb=ub;break}pB(d,c[(c[q>>2]|0)+336>>2]|0);Mb=ub}else{Mb=Ta}}while(0);eF(Mb);nb=c[A>>2]|0}Ta=c[nb+12>>2]|0;if((Ta|0)!=0){ek(d,4,Ta)}if(H){Ta=(c[q>>2]|0)+28|0;c[Ta>>2]=(c[Ta>>2]|0)+1}else{if((c[Qa+208>>2]|0)==0){if((b[Qa+260>>1]&1)!=0){O=188}}else{O=188}if((O|0)==188){O=0;hB(d)}Ta=(c[q>>2]|0)+28|0;c[Ta>>2]=(c[Ta>>2]|0)+1;Th(d,e,Ra)}c:do{if((Ra&1|0)==0){if((Ra&16|0)!=0){aB(d);Ta=ux(e)|0;if((Ta|0)!=0){Ua=Ta;do{Ta=mw(e,Ua)|0;if((Ta|0)!=0){Xa=Ta;do{Xh(d,Xa);Xa=ow(e,Xa)|0;}while((Xa|0)!=0)}Ua=vx(e,Ua)|0;}while((Ua|0)!=0)}bB(d);_A(d);Ua=ux(e)|0;if((Ua|0)!=0){Xa=Ua;do{Wh(d,Xa);Xa=vx(e,Xa)|0;}while((Xa|0)!=0)}$A(d);break}if((Ra&8|0)==0){Xa=ux(e)|0;if((Xa|0)==0){break}else{Nb=Xa}while(1){Wh(d,Nb);Xa=mw(e,Nb)|0;if((Xa|0)!=0){Ua=Xa;do{Wh(d,c[((c[Ua>>2]&3|0)==2?Ua:Ua-32|0)+28>>2]|0);Xh(d,Ua);Ua=ow(e,Ua)|0;}while((Ua|0)!=0)}Nb=vx(e,Nb)|0;if((Nb|0)==0){break c}}}_A(d);Ua=ux(e)|0;if((Ua|0)!=0){Xa=Ua;do{Ua=c[A>>2]|0;d:do{if((c[Ua+172>>2]|0)<1){O=212}else{Ta=Xa|0;rb=1;qb=Ua;while(1){if((Rx(c[(c[qb+176>>2]|0)+(rb<<2)>>2]|0,Ta)|0)!=0){break d}pb=c[A>>2]|0;if((rb|0)<(c[pb+172>>2]|0)){rb=rb+1|0;qb=pb}else{O=212;break}}}}while(0);if((O|0)==212){O=0;Wh(d,Xa)}Xa=vx(e,Xa)|0;}while((Xa|0)!=0)}$A(d);aB(d);Xa=ux(e)|0;if((Xa|0)!=0){Ua=Xa;do{Xa=mw(e,Ua)|0;if((Xa|0)!=0){qb=Xa;do{Xa=c[A>>2]|0;e:do{if((c[Xa+172>>2]|0)<1){O=220}else{rb=qb|0;Ta=1;Cb=Xa;while(1){if((Rx(c[(c[Cb+176>>2]|0)+(Ta<<2)>>2]|0,rb)|0)!=0){break e}pb=c[A>>2]|0;if((Ta|0)<(c[pb+172>>2]|0)){Ta=Ta+1|0;Cb=pb}else{O=220;break}}}}while(0);if((O|0)==220){O=0;Xh(d,qb)}qb=ow(e,qb)|0;}while((qb|0)!=0)}Ua=vx(e,Ua)|0;}while((Ua|0)!=0)}bB(d)}else{_A(d);Ua=ux(e)|0;if((Ua|0)!=0){qb=Ua;do{Wh(d,qb);qb=vx(e,qb)|0;}while((qb|0)!=0)}$A(d);aB(d);qb=ux(e)|0;if((qb|0)!=0){Ua=qb;do{qb=mw(e,Ua)|0;if((qb|0)!=0){Xa=qb;do{Xh(d,Xa);Xa=ow(e,Xa)|0;}while((Xa|0)!=0)}Ua=vx(e,Ua)|0;}while((Ua|0)!=0)}bB(d)}}while(0);if(H){Th(d,e,Ra)}VA(d);if((Wa|0)!=0){Mv(o);c[Qa+212>>2]=Wa}Ua=(c[L>>2]|0)+(c[j>>2]|0)|0;Xa=(c[sa>>2]|0)+(c[E>>2]|0)|0;c[M>>2]=Ua;c[M+4>>2]=Xa;do{if((Ua|0)>-1){if(!((Ua|0)<(c[Q>>2]|0)&(Xa|0)>-1)){O=236;break}if((Xa|0)<(c[F>>2]|0)){Ob=Xa;Pb=Ua}else{O=236}}else{O=236}}while(0);if((O|0)==236){O=0;Qa=c[ta>>2]|0;if((Qa|0)==0){Ra=c[ua>>2]|0;c[E>>2]=Ra;Qb=Ua;Rb=Ra}else{Ra=c[wa>>2]|0;c[j>>2]=Ra;Qb=Ra;Rb=Xa}Ra=(c[va>>2]|0)+Qb|0;H=Rb+Qa|0;c[M>>2]=Ra;c[M+4>>2]=H;Ob=H;Pb=Ra}if((Pb|0)>-1){P=Ob;Pa=Pb}else{break}}}}while(0);Oa=c[(c[q>>2]|0)+316>>2]|0;if((c[((Oa|0)==0?I:Oa)>>2]|0)>1){XA(d)}if((Ma|0)==0){Sb=0;Tb=(c[z>>2]|0)+1|0}else{Sb=Ma+4|0;Tb=c[Ma>>2]|0}c[z>>2]=Tb;if((Tb|0)>(c[I>>2]|0)){break}else{Ma=Sb}}TA(d);Gh(d);i=f;return}function Sh(a){a=a|0;var b=0,d=0,e=0,f=0;b=c[43702]|0;if((b|0)==0){d=$g(10328,c[43330]|0)|0;c[43702]=d;e=d}else{e=b}if((Hc[c[e>>2]&63](e,a,4)|0)!=0){f=0;return f|0}e=c[43702]|0;b=c[e>>2]|0;d=Lb(a|0)|0;Hc[b&63](e,d,1)|0;f=1;return f|0}function Th(e,f,j){e=e|0;f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0.0,qa=0;k=i;i=i+152|0;l=k|0;m=k+32|0;n=k+64|0;o=k+72|0;p=k+136|0;q=k+144|0;r=f+8|0;s=c[r>>2]|0;if((c[s+172>>2]|0)<1){i=k;return}t=e+156|0;u=(j&4|0)!=0;v=e+16|0;w=p|0;x=o|0;y=o;z=o+32|0;A=z;B=z|0;z=o+16|0;C=o+8|0;D=o+24|0;E=o|0;F=o+48|0;G=o+40|0;H=o+56|0;o=l;I=e+152|0;J=l+16|0;l=(j&8|0)==0;K=p+4|0;p=m;L=m+16|0;m=e|0;M=e+160|0;N=1;O=s;while(1){s=c[(c[O+176>>2]|0)+(N<<2)>>2]|0;a:do{if((c[t>>2]|0)<2){P=9}else{Q=Hm(s|0,Wv(s,0,162416,0)|0,213440)|0;if(($h(c[m>>2]|0,c[M>>2]|0,c[t>>2]|0,Q)|0)<<24>>24!=0){P=9;break}if((a[Q]|0)!=0){break}Q=ux(s)|0;if((Q|0)==0){break}else{R=Q}do{if((li(e,s,R)|0)<<24>>24!=0){P=9;break a}R=vx(s,R)|0;}while((R|0)!=0)}}while(0);do{if((P|0)==9){P=0;if(u){Th(e,s,j)}Q=jk(304)|0;if((Q|0)==0){Fv(1,115680,(S=i,i=i+1|0,i=i+7&-8,c[S>>2]=0,S)|0)|0;i=S}T=c[v>>2]|0;c[Q>>2]=T;c[v>>2]=Q;if((T|0)==0){c[Q+144>>2]=3;c[Q+148>>2]=0;h[Q+152>>3]=1.0}else{U=Q+16|0;V=T+16|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];c[U+16>>2]=c[V+16>>2];c[U+20>>2]=c[V+20>>2];c[U+24>>2]=c[V+24>>2];c[U+28>>2]=c[V+28>>2];c[U+32>>2]=c[V+32>>2];c[U+36>>2]=c[V+36>>2];V=Q+56|0;U=T+56|0;c[V>>2]=c[U>>2];c[V+4>>2]=c[U+4>>2];c[V+8>>2]=c[U+8>>2];c[V+12>>2]=c[U+12>>2];c[V+16>>2]=c[U+16>>2];c[V+20>>2]=c[U+20>>2];c[V+24>>2]=c[U+24>>2];c[V+28>>2]=c[U+28>>2];c[V+32>>2]=c[U+32>>2];c[V+36>>2]=c[U+36>>2];c[Q+144>>2]=c[T+144>>2];c[Q+148>>2]=c[T+148>>2];h[Q+152>>3]=+h[T+152>>3];c[Q+136>>2]=c[T+136>>2];U=Q+96|0;V=T+96|0;c[U>>2]=c[V>>2];c[U+4>>2]=c[V+4>>2];c[U+8>>2]=c[V+8>>2];c[U+12>>2]=c[V+12>>2];c[U+16>>2]=c[V+16>>2];c[U+20>>2]=c[V+20>>2];c[U+24>>2]=c[V+24>>2];c[U+28>>2]=c[V+28>>2];c[U+32>>2]=c[V+32>>2];c[U+36>>2]=c[V+36>>2]}c[Q+4>>2]=1;c[Q+8>>2]=s;c[Q+12>>2]=1;Q=s+8|0;V=s|0;mi(e,c[(c[Q>>2]|0)+12>>2]|0,V);YA(e,s);U=c[v>>2]|0;T=U+208|0;if((c[T>>2]|0)==0){W=(b[U+260>>1]&1)!=0}else{W=1}Ch(ew(V,148552)|0);if(!(u|W^1)){tF(p|0,(c[Q>>2]|0)+16|0,32)|0;X=c[v>>2]|0;Y=c[I>>2]|0;do{if((Y&4259840|0)!=0){Z=(Y&131072|0)!=0;_=X+264|0;if(Z){c[_>>2]=0;c[X+268>>2]=2}else{c[_>>2]=2;c[X+268>>2]=4}_=X+272|0;eF(c[_>>2]|0);$=jk(c[X+268>>2]<<4)|0;aa=$;c[_>>2]=aa;c[$>>2]=c[p>>2];c[$+4>>2]=c[p+4>>2];c[$+8>>2]=c[p+8>>2];c[$+12>>2]=c[p+12>>2];_=$+16|0;c[_>>2]=c[L>>2];c[_+4>>2]=c[L+4>>2];c[_+8>>2]=c[L+8>>2];c[_+12>>2]=c[L+12>>2];if((Y&8192|0)==0){RA(e,aa,aa,2)|0}if(Z){break}qi(aa)}}while(0);gB(e,c[T>>2]|0,c[U+228>>2]|0,c[U+244>>2]|0,c[U+212>>2]|0)}c[n>>2]=0;Y=Uh(s,n)|0;if((Y|0)==0){ba=0}else{pB(e,Y);ba=c[n>>2]&1}Y=d[(c[Q>>2]|0)+112|0]|0;do{if((Y&1|0)==0){if((Y&2|0)!=0){X=Im(V,c[53728]|0,139280)|0;ca=Im(V,c[53730]|0,136712)|0;da=X;P=47;break}if((Y&8|0)!=0){X=Im(V,c[53724]|0,133792)|0;ca=Im(V,c[53726]|0,131744)|0;da=X;P=47;break}if((Y&4|0)!=0){X=Im(V,c[53710]|0,129560)|0;ca=Im(V,c[53712]|0,126280)|0;da=X;P=47;break}X=ew(V,123768)|0;if((X|0)==0){ea=0}else{ea=(a[X]|0)==0?0:X}X=ew(V,121832)|0;if((X|0)==0){fa=ea}else{fa=(a[X]|0)==0?ea:X}X=ew(V,121048)|0;if((X|0)==0){ga=ea}else{ga=(a[X]|0)==0?ea:X}do{if((ba|0)==0|(ga|0)==0){X=ew(V,120224)|0;if((X|0)==0){ha=ba;ia=ga;break}aa=(a[X]|0)==0;ha=aa?ba:1;ia=aa?ga:X}else{ha=ba;ia=ga}}while(0);X=(fa|0)==0?159752:fa;aa=(ia|0)==0?119400:ia;c[w>>2]=0;if((ha|0)==0){ja=0;ka=X;la=aa}else{ma=ha;na=X;oa=aa;P=49}}else{aa=Im(V,c[53728]|0,145328)|0;ca=Im(V,c[53730]|0,142384)|0;da=aa;P=47}}while(0);if((P|0)==47){P=0;c[w>>2]=0;ma=1;na=(da|0)==0?159752:da;oa=(ca|0)==0?119400:ca;P=49}do{if((P|0)==49){P=0;if((Vh(oa,w,q)|0)<<24>>24==0){nB(e,oa);ja=ma;ka=na;la=oa;break}nB(e,c[w>>2]|0);Y=c[K>>2]|0;aa=Em(V,c[53722]|0,0,0)|0;pa=+g[q>>2];if((Y|0)==0){oB(e,159752,aa,pa)}else{oB(e,Y,aa,pa)}ja=(c[n>>2]|0)>>>1&1|2;ka=na;la=oa}}while(0);aa=c[53716]|0;do{if((aa|0)!=0){Y=fw(V,aa)|0;if((Y|0)==0){break}if((a[Y]|0)==0){break}xB(e,+Fm(V,c[53716]|0,1.0,0.0))}}while(0);aa=c[n>>2]|0;do{if((aa&4|0)==0){if((aa&64|0)==0){if((Em(V,c[53714]|0,1,0)|0)!=0){lB(e,ka);sB(e,(c[Q>>2]|0)+16|0,ja);break}if((ja|0)==0){break}lB(e,118712);sB(e,(c[Q>>2]|0)+16|0,ja);break}Y=(c[Q>>2]|0)+16|0;c[y>>2]=c[Y>>2];c[y+4>>2]=c[Y+4>>2];c[y+8>>2]=c[Y+8>>2];c[y+12>>2]=c[Y+12>>2];Y=(c[Q>>2]|0)+32|0;c[A>>2]=c[Y>>2];c[A+4>>2]=c[Y+4>>2];c[A+8>>2]=c[Y+8>>2];c[A+12>>2]=c[Y+12>>2];h[z>>3]=+h[B>>3];h[D>>3]=+h[C>>3];h[F>>3]=+h[E>>3];h[H>>3]=+h[G>>3];if((Em(V,c[53714]|0,1,0)|0)==0){lB(e,118712)}else{lB(e,ka)}if((Mh(e,x,la,0)|0)>1){Y=$w(V)|0;Fv(3,117808,(S=i,i=i+8|0,c[S>>2]=Y,S)|0)|0;i=S}sB(e,(c[Q>>2]|0)+16|0,0)}else{Y=(Em(V,c[53714]|0,1,0)|0)!=0;if((ja|0)==0&(Y^1)){break}X=(c[Q>>2]|0)+16|0;c[y>>2]=c[X>>2];c[y+4>>2]=c[X+4>>2];c[y+8>>2]=c[X+8>>2];c[y+12>>2]=c[X+12>>2];X=(c[Q>>2]|0)+32|0;c[A>>2]=c[X>>2];c[A+4>>2]=c[X+4>>2];c[A+8>>2]=c[X+8>>2];c[A+12>>2]=c[X+12>>2];h[z>>3]=+h[B>>3];h[D>>3]=+h[C>>3];h[F>>3]=+h[E>>3];h[H>>3]=+h[G>>3];if(Y){lB(e,ka)}else{lB(e,118712)}ol(e,x,4,aa,ja)}}while(0);eF(c[w>>2]|0);aa=c[(c[Q>>2]|0)+12>>2]|0;if((aa|0)!=0){ek(e,5,aa)}if(W){if(u){tF(o|0,(c[Q>>2]|0)+16|0,32)|0;aa=c[v>>2]|0;V=c[I>>2]|0;do{if((V&4259840|0)!=0){Y=(V&131072|0)!=0;X=aa+264|0;if(Y){c[X>>2]=0;c[aa+268>>2]=2}else{c[X>>2]=2;c[aa+268>>2]=4}X=aa+272|0;eF(c[X>>2]|0);Z=jk(c[aa+268>>2]<<4)|0;_=Z;c[X>>2]=_;c[Z>>2]=c[o>>2];c[Z+4>>2]=c[o+4>>2];c[Z+8>>2]=c[o+8>>2];c[Z+12>>2]=c[o+12>>2];X=Z+16|0;c[X>>2]=c[J>>2];c[X+4>>2]=c[J+4>>2];c[X+8>>2]=c[J+8>>2];c[X+12>>2]=c[J+12>>2];if((V&8192|0)==0){RA(e,_,_,2)|0}if(Y){break}qi(_)}}while(0);gB(e,c[T>>2]|0,c[U+228>>2]|0,c[U+244>>2]|0,c[U+212>>2]|0)}hB(e)}do{if(!l){V=ux(s)|0;if((V|0)==0){break}else{qa=V}do{Wh(e,qa);V=mw(s,qa)|0;if((V|0)!=0){aa=V;do{Xh(e,aa);aa=ow(s,aa)|0;}while((aa|0)!=0)}qa=vx(s,qa)|0;}while((qa|0)!=0)}}while(0);ZA(e,f);Gh(e);if(u){break}Th(e,s,j)}}while(0);s=c[r>>2]|0;if((N|0)<(c[s+172>>2]|0)){N=N+1|0;O=s}else{break}}i=k;return}function Uh(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=ew(b|0,164344)|0;a:do{if((e|0)==0){f=0;g=0}else{if((a[e]|0)==0){f=0;g=0;break}Yh(e)|0;b=c[44118]|0;if((b|0)==0){f=176472;g=0;break}else{h=0;i=176472;j=b}while(1){b=i;k=j;while(1){if((Ya(k|0,164776)|0)==0){l=10;break}if((Ya(k|0,164016)|0)==0){m=b;l=13;break}if((Ya(k|0,163264)|0)==0){n=b;l=15;break}o=b+4|0;if((Ya(k|0,162776)|0)==0){p=b;l=17;break}q=c[o>>2]|0;if((q|0)==0){f=176472;g=h;break a}else{b=o;k=q}}if((l|0)==10){l=0;r=b+4|0;s=h|1}else if((l|0)==13){while(1){l=0;k=m+4|0;q=c[k>>2]|0;c[m>>2]=q;if((q|0)==0){break}else{m=k;l=13}}r=b;s=h|3}else if((l|0)==15){while(1){l=0;k=n+4|0;q=c[k>>2]|0;c[n>>2]=q;if((q|0)==0){break}else{n=k;l=15}}r=b;s=h|64}else if((l|0)==17){while(1){l=0;k=p+4|0;q=c[k>>2]|0;c[p>>2]=q;if((q|0)==0){break}else{p=k;l=17}}r=b;s=h|4}k=c[r>>2]|0;if((k|0)==0){f=176472;g=s;break}else{h=s;i=r;j=k}}}}while(0);c[d>>2]=g;return f|0}function Vh(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+8|0;h=f|0;do{if((Lh(b,0,h)|0)==0){j=c[h>>2]|0;k=c[j>>2]|0;if((k|0)<2){break}l=j+8|0;if((c[c[l>>2]>>2]|0)==0){break}if((k|0)>2){Fv(0,110296,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0)|0;i=k}k=kk((xF(b|0)|0)+1|0)|0;c[d>>2]=k;zF(k|0,c[c[l>>2]>>2]|0)|0;if((c[(c[l>>2]|0)+12>>2]|0)==0){c[d+4>>2]=0}else{k=c[d>>2]|0;m=k+((xF(k|0)|0)+1)|0;c[d+4>>2]=m;zF(m|0,c[(c[l>>2]|0)+12>>2]|0)|0}m=c[l>>2]|0;do{if((a[m+8|0]|0)==0){if((a[m+20|0]|0)==0){g[e>>2]=0.0;break}else{g[e>>2]=1.0- +g[m+16>>2];break}}else{g[e>>2]=+g[m+4>>2]}}while(0);eF(c[j+4>>2]|0);eF(c[l>>2]|0);eF(j);n=1;i=f;return n|0}}while(0);c[d>>2]=0;n=0;i=f;return n|0}function Wh(d,f){d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0,N=0.0,O=0,P=0.0,Q=0,R=0,S=0,T=0;g=i;j=c[d>>2]|0;k=f+8|0;if((c[(c[k>>2]|0)+8>>2]|0)==0){i=g;return}l=f|0;if((li(d,Hx(l)|0,f)|0)<<24>>24==0){i=g;return}m=c[k>>2]|0;if(+h[m+64>>3]<+h[d+256>>3]){i=g;return}if(+h[d+272>>3]<+h[m+48>>3]){i=g;return}if(+h[m+72>>3]<+h[d+264>>3]){i=g;return}if(+h[d+280>>3]<+h[m+56>>3]){i=g;return}n=m+116|0;m=c[j+28>>2]|0;if((a[n]|0)==(m|0)){i=g;return}a[n]=m;vB(d,$w(l)|0);m=Hm(l,c[53642]|0,213440)|0;if((a[m]|0)!=0){vB(d,m)}m=Hm(l,c[53582]|0,213440)|0;a:do{if((a[m]|0)!=0){Yh(m)|0;n=c[44118]|0;if((n|0)==0){break}else{o=176476;p=n}while(1){if((a[p]|0)==105){if((Ya(p|0,91128)|0)==0){break}}n=c[o>>2]|0;if((n|0)==0){break a}else{o=o+4|0;p=n}}i=g;return}}while(0);p=c[d+152>>2]|0;o=jk(304)|0;if((o|0)==0){Fv(1,115680,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0)|0;i=m}m=d+16|0;n=c[m>>2]|0;c[o>>2]=n;c[m>>2]=o;if((n|0)==0){c[o+144>>2]=3;c[o+148>>2]=0;h[o+152>>3]=1.0}else{m=o+16|0;j=n+16|0;c[m>>2]=c[j>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];c[m+12>>2]=c[j+12>>2];c[m+16>>2]=c[j+16>>2];c[m+20>>2]=c[j+20>>2];c[m+24>>2]=c[j+24>>2];c[m+28>>2]=c[j+28>>2];c[m+32>>2]=c[j+32>>2];c[m+36>>2]=c[j+36>>2];j=o+56|0;m=n+56|0;c[j>>2]=c[m>>2];c[j+4>>2]=c[m+4>>2];c[j+8>>2]=c[m+8>>2];c[j+12>>2]=c[m+12>>2];c[j+16>>2]=c[m+16>>2];c[j+20>>2]=c[m+20>>2];c[j+24>>2]=c[m+24>>2];c[j+28>>2]=c[m+28>>2];c[j+32>>2]=c[m+32>>2];c[j+36>>2]=c[m+36>>2];c[o+144>>2]=c[n+144>>2];c[o+148>>2]=c[n+148>>2];h[o+152>>3]=+h[n+152>>3];c[o+136>>2]=c[n+136>>2];m=o+96|0;j=n+96|0;c[m>>2]=c[j>>2];c[m+4>>2]=c[j+4>>2];c[m+8>>2]=c[j+8>>2];c[m+12>>2]=c[j+12>>2];c[m+16>>2]=c[j+16>>2];c[m+20>>2]=c[j+20>>2];c[m+24>>2]=c[j+24>>2];c[m+28>>2]=c[j+28>>2];c[m+32>>2]=c[j+32>>2];c[m+36>>2]=c[j+36>>2]}c[o+4>>2]=2;c[o+8>>2]=f;c[o+12>>2]=8;do{if((p&16777216|0)!=0){if((e[(c[(Hx(l)|0)+8>>2]|0)+170>>1]|0)>>>0<=2>>>0){h[o+168>>3]=0.0;break}q=+h[(c[(c[k>>2]|0)+132>>2]|0)+16>>3]*72.0;if(q<0.0){r=q+-.5}else{r=q+.5}h[o+168>>3]=+(~~r|0)}}while(0);mi(d,c[(c[k>>2]|0)+104>>2]|0,l);do{if((p&4259840|0)!=0){if((c[o+208>>2]|0)==0){if((b[o+260>>1]&1)==0){break}}j=pl(f)|0;m=c[k>>2]|0;r=+h[m+16>>3];q=+h[m+24>>3];m=Im(l,c[53582]|0,213440)|0;do{if((a[m]|0)==0){s=0}else{Yh(m)|0;n=c[44118]|0;if((n|0)==0){s=0;break}else{t=176472;u=0;v=n}while(1){n=(Ya(v|0,164776)|0)==0;w=n?1:u;n=t+4|0;x=c[n>>2]|0;if((x|0)==0){s=w;break}else{t=n;u=w;v=x}}}}while(0);b:do{if((j&-3|0)==1){m=c[(c[k>>2]|0)+12>>2]|0;x=m+8|0;w=c[x>>2]|0;do{if((w|0)==4){y=+h[m+16>>3];if(y<0.0){z=y+-.5}else{z=y+.5}if(((~~z|0)%90|0|0)!=0){A=1;break}if(+h[m+24>>3]!=0.0){A=1;break}if(+h[m+32>>3]!=0.0){A=1;break}A=(c[m+4>>2]|s|0)==0}else{A=1}}while(0);if(!((m|0)!=0&A)){B=61;break}if((p&524288|0)==0){B=61;break}n=(w|0)<3?1:w;C=m+4|0;D=c[C>>2]|0;E=(D|0)>1?D:1;D=c[m+44>>2]|0;F=ew(l,165160)|0;if((F|0)==0){G=0}else{G=Rb(F|0)|0}F=(G-4|0)>>>0>56>>>0?20:G;if((c[C>>2]|s|0)==0){c[o+264>>2]=0;C=jk(32)|0;h[C>>3]=r- +h[(c[k>>2]|0)+88>>3];h[C+8>>3]=q- +h[(c[k>>2]|0)+80>>3]*.5;h[C+16>>3]=r+ +h[(c[k>>2]|0)+88>>3];h[C+24>>3]=q+ +h[(c[k>>2]|0)+80>>3]*.5;H=C;I=2;break}C=c[x>>2]|0;do{if((C|0)<3){if(+h[m+32>>3]!=0.0){break}if(+h[m+24>>3]!=0.0){break}J=o+264|0;if((c[m>>2]|0)!=0){c[J>>2]=1;K=jk(32)|0;h[K>>3]=r;h[K+8>>3]=q;L=(E<<1)-1|0;h[K+16>>3]=r+ +h[D+(L<<4)>>3];h[K+24>>3]=q+ +h[D+(L<<4)+8>>3];H=K;I=2;break b}c[J>>2]=2;J=(E<<1)-1|0;y=+h[D+(J<<4)>>3];M=+h[D+(J<<4)+8>>3];N=6.283185307179586/+(F|0);J=jk(F<<4)|0;if((F|0)>0){O=0;P=0.0}else{H=J;I=F;break b}while(1){h[J+(O<<4)>>3]=y*+V(P);h[J+(O<<4)+8>>3]=M*+W(P);K=O+1|0;if((K|0)<(F|0)){O=K;P=N+P}else{Q=0;break}}while(1){K=J+(Q<<4)|0;h[K>>3]=r+ +h[K>>3];K=J+(Q<<4)+8|0;h[K>>3]=q+ +h[K>>3];K=Q+1|0;if((K|0)<(F|0)){Q=K}else{H=J;I=F;break b}}}}while(0);m=da(C,E-1|0)|0;c[o+264>>2]=2;w=c[x>>2]|0;if((w|0)<(F|0)){J=jk(n<<4)|0;if((n|0)>0){R=0}else{H=J;I=n;break}while(1){K=R+m|0;h[J+(R<<4)>>3]=r+ +h[D+(K<<4)>>3];h[J+(R<<4)+8>>3]=q+ +h[D+(K<<4)+8>>3];K=R+1|0;if((K|0)<(n|0)){R=K}else{H=J;I=n;break}}}else{n=(w|0)/(F|0)|0;J=jk(F<<4)|0;if((F|0)>0){S=0;T=0}else{H=J;I=F;break}while(1){x=T+m|0;h[J+(S<<4)>>3]=r+ +h[D+(x<<4)>>3];h[J+(S<<4)+8>>3]=q+ +h[D+(x<<4)+8>>3];x=S+1|0;if((x|0)<(F|0)){S=x;T=T+n|0}else{H=J;I=F;break}}}}else{B=61}}while(0);if((B|0)==61){c[o+264>>2]=0;j=jk(32)|0;h[j>>3]=r- +h[(c[k>>2]|0)+88>>3];h[j+8>>3]=q- +h[(c[k>>2]|0)+80>>3]*.5;h[j+16>>3]=r+ +h[(c[k>>2]|0)+96>>3];h[j+24>>3]=q+ +h[(c[k>>2]|0)+80>>3]*.5;H=j;I=2}if((p&8192|0)==0){RA(d,H,H,I)|0}c[o+272>>2]=H;c[o+268>>2]=I}}while(0);Ch(ew(l,148552)|0);cB(d,f);Dc[c[(c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]|0)+20>>2]&63](d,f);f=c[(c[k>>2]|0)+108>>2]|0;k=f;do{if((f|0)!=0){if((a[k+81|0]|0)==0){break}ek(d,10,k)}}while(0);dB(d);Gh(d);i=g;return}function Xh(f,j){f=f|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,U=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Za=0,_a=0,$a=0,ab=0.0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0.0,mb=0.0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0.0,ub=0.0,vb=0.0,wb=0.0,xb=0.0,yb=0.0,zb=0.0,Ab=0.0,Bb=0.0,Cb=0.0,Db=0.0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0;k=i;i=i+2088|0;l=k|0;m=k+48|0;n=k+96|0;o=k+144|0;p=k+192|0;q=k+200|0;r=k+248|0;s=k+312|0;t=k+1112|0;u=k+1912|0;v=k+1928|0;w=k+2056|0;tF(w|0,f+256|0,32)|0;x=j+8|0;y=c[x>>2]|0;z=c[y+8>>2]|0;do{if((z|0)==0){A=6}else{if(+h[z+24>>3]<+h[w>>3]){A=6;break}if(+h[w+16>>3]<+h[z+8>>3]){A=6;break}if(+h[z+32>>3]<+h[w+8>>3]){A=6;break}if(+h[w+24>>3]<+h[z+16>>3]){A=6}}}while(0);do{if((A|0)==6){z=c[y+96>>2]|0;if((z|0)==0){B=y}else{if((nn(z,w)|0)<<24>>24!=0){break}B=c[x>>2]|0}z=c[B+108>>2]|0;C=z;if((z|0)==0){i=k;return}if((a[C+81|0]|0)==0){i=k;return}if((nn(C,w)|0)<<24>>24!=0){break}i=k;return}}while(0);w=j;B=j-32|0;Hx(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0;y=f+156|0;a:do{if((c[y>>2]|0)>=2){C=Hm(j|0,c[53776]|0,213440)|0;z=f|0;D=f+160|0;if(($h(c[z>>2]|0,c[D>>2]|0,c[y>>2]|0,C)|0)<<24>>24!=0){break}if((a[C]|0)!=0){i=k;return}C=j+32|0;E=0;do{F=c[w>>2]&3;if((E|0)<1){G=(F|0)==3?j:C}else{G=(F|0)==2?j:B}F=Hm(c[G+28>>2]|0,c[53612]|0,213440)|0;if((a[F]|0)==0){break a}E=E+1|0;if(($h(c[z>>2]|0,c[D>>2]|0,c[y>>2]|0,F)|0)<<24>>24!=0){break a}}while((E|0)<2);i=k;return}}while(0);y=j+32|0;G=xF($w(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0)|0;E=dF(G+3+(xF($w(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0)|0)|0;zF(E|0,$w(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0)|0;G=(Nw(Hx(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0)==0;D=E+(xF(E|0)|0)|0;if(G){a[D]=a[91968]|0;a[D+1|0]=a[91969]|0;a[D+2|0]=a[91970]|0}else{a[D]=a[92624]|0;a[D+1|0]=a[92625]|0;a[D+2|0]=a[92626]|0}AF(E|0,$w(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0;vB(f,E);eF(E);E=j|0;D=Hm(E,c[53814]|0,213440)|0;if((a[D]|0)!=0){vB(f,D)}D=Hm(E,c[53760]|0,213440)|0;b:do{if((a[D]|0)==0){H=0}else{Yh(D)|0;G=c[44118]|0;if((G|0)==0){H=176472;break}else{I=176476;J=G}while(1){if((a[J]|0)==105){if((Ya(J|0,91128)|0)==0){break}}G=c[I>>2]|0;if((G|0)==0){H=176472;break b}else{I=I+4|0;J=G}}i=k;return}}while(0);J=v|0;v=f+152|0;I=c[v>>2]|0;D=jk(304)|0;if((D|0)==0){Fv(1,115680,(K=i,i=i+1|0,i=i+7&-8,c[K>>2]=0,K)|0)|0;i=K}G=f+16|0;z=c[G>>2]|0;c[D>>2]=z;c[G>>2]=D;if((z|0)==0){c[D+144>>2]=3;c[D+148>>2]=0;h[D+152>>3]=1.0}else{C=D+16|0;F=z+16|0;c[C>>2]=c[F>>2];c[C+4>>2]=c[F+4>>2];c[C+8>>2]=c[F+8>>2];c[C+12>>2]=c[F+12>>2];c[C+16>>2]=c[F+16>>2];c[C+20>>2]=c[F+20>>2];c[C+24>>2]=c[F+24>>2];c[C+28>>2]=c[F+28>>2];c[C+32>>2]=c[F+32>>2];c[C+36>>2]=c[F+36>>2];F=D+56|0;C=z+56|0;c[F>>2]=c[C>>2];c[F+4>>2]=c[C+4>>2];c[F+8>>2]=c[C+8>>2];c[F+12>>2]=c[C+12>>2];c[F+16>>2]=c[C+16>>2];c[F+20>>2]=c[C+20>>2];c[F+24>>2]=c[C+24>>2];c[F+28>>2]=c[C+28>>2];c[F+32>>2]=c[C+32>>2];c[F+36>>2]=c[C+36>>2];c[D+144>>2]=c[z+144>>2];c[D+148>>2]=c[z+148>>2];h[D+152>>3]=+h[z+152>>3];c[D+136>>2]=c[z+136>>2];C=D+96|0;F=z+96|0;c[C>>2]=c[F>>2];c[C+4>>2]=c[F+4>>2];c[C+8>>2]=c[F+8>>2];c[C+12>>2]=c[F+12>>2];c[C+16>>2]=c[F+16>>2];c[C+20>>2]=c[F+20>>2];c[C+24>>2]=c[F+24>>2];c[C+28>>2]=c[F+28>>2];c[C+32>>2]=c[F+32>>2];c[C+36>>2]=c[F+36>>2]}c[D+4>>2]=3;c[D+8>>2]=j;c[D+12>>2]=9;F=(H|0)==0;do{if(!F){if((c[(c[x>>2]|0)+8>>2]|0)==0){break}pB(f,H)}}while(0);C=c[53772]|0;do{if((C|0)!=0){z=fw(E,C)|0;if((z|0)==0){break}if((a[z]|0)==0){break}xB(f,+Fm(E,c[53772]|0,1.0,0.0))}}while(0);do{if((I&16777216|0)!=0){if((e[(c[(Hx(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0)+8>>2]|0)+170>>1]|0)>>>0<=2>>>0){vF(D+176|0,0,16)|0;break}L=+h[(c[(c[(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)+8>>2]|0)+132>>2]|0)+16>>3]*72.0;if(L<0.0){M=L+-.5}else{M=L+.5}h[D+176>>3]=+(~~M|0);L=+h[(c[(c[(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)+8>>2]|0)+132>>2]|0)+16>>3]*72.0;if(L<0.0){N=L+-.5}else{N=L+.5}h[D+184>>3]=+(~~N|0)}}while(0);do{if((I&32768|0)!=0){C=c[(c[x>>2]|0)+96>>2]|0;if((C|0)==0){O=c[D+192>>2]|0}else{z=c[C>>2]|0;c[D+192>>2]=z;O=z}z=D+196|0;c[z>>2]=O;C=D+204|0;c[C>>2]=O;P=D+200|0;c[P>>2]=O;Q=c[x>>2]|0;R=c[Q+108>>2]|0;if((R|0)==0){S=Q}else{c[z>>2]=c[R>>2];S=c[x>>2]|0}R=c[S+104>>2]|0;if((R|0)==0){U=S}else{c[P>>2]=c[R>>2];U=c[x>>2]|0}R=c[U+100>>2]|0;if((R|0)==0){break}c[C>>2]=c[R>>2]}}while(0);c:do{if((I&65536|0)==0){X=0}else{Iv(u,128,J);c[D+212>>2]=fk(Ih(f,E,u)|0,E)|0;Mv(u);U=ew(E,83344)|0;if((U|0)==0){A=67}else{if((a[U]|0)==0){A=67}else{Y=U;A=69}}do{if((A|0)==67){U=ew(E,82904)|0;if((U|0)==0){Z=0;break}if((a[U]|0)==0){Z=0}else{Y=U;A=69}}}while(0);if((A|0)==69){Z=fk(Y,E)|0}U=ew(E,82520)|0;if((U|0)==0){A=72}else{if((a[U]|0)==0){A=72}else{_=U;A=74}}do{if((A|0)==72){U=ew(E,81944)|0;if((U|0)!=0){if((a[U]|0)!=0){_=U;A=74;break}}if((Z|0)==0){break}c[D+208>>2]=Lb(Z|0)|0}}while(0);if((A|0)==74){c[D+208>>2]=fk(_,E)|0}U=ew(E,81232)|0;if((U|0)==0){A=79}else{if((a[U]|0)==0){A=79}else{aa=U;A=81}}do{if((A|0)==79){U=ew(E,80736)|0;if((U|0)!=0){if((a[U]|0)!=0){aa=U;A=81;break}}if((Z|0)==0){break}c[D+216>>2]=Lb(Z|0)|0}}while(0);if((A|0)==81){c[D+216>>2]=fk(aa,E)|0}U=ew(E,80256)|0;if((U|0)==0){A=86}else{if((a[U]|0)==0){A=86}else{ba=U;A=88}}do{if((A|0)==86){U=ew(E,79928)|0;if((U|0)!=0){if((a[U]|0)!=0){ba=U;A=88;break}}if((Z|0)==0){break}c[D+220>>2]=Lb(Z|0)|0}}while(0);if((A|0)==88){c[D+220>>2]=fk(ba,E)|0;U=D+260|0;b[U>>1]=b[U>>1]|128}U=ew(E,79504)|0;if((U|0)==0){A=93}else{if((a[U]|0)==0){A=93}else{ca=U}}do{if((A|0)==93){U=ew(E,79152)|0;if((U|0)!=0){if((a[U]|0)!=0){ca=U;break}}if((Z|0)==0){X=0;break c}c[D+224>>2]=Lb(Z|0)|0;X=Z;break c}}while(0);c[D+224>>2]=fk(ca,E)|0;U=D+260|0;b[U>>1]=b[U>>1]|256;X=Z}}while(0);d:do{if((I&8388608|0)==0){da=0}else{Z=ew(E,78880)|0;do{if((Z|0)==0){ea=0}else{if((a[Z]|0)==0){ea=0;break}ea=fk(Z,E)|0}}while(0);Z=ew(E,168888)|0;do{if((Z|0)==0){A=105}else{if((a[Z]|0)==0){A=105;break}ca=D+260|0;b[ca>>1]=b[ca>>1]|64;c[D+244>>2]=fk(Z,E)|0}}while(0);do{if((A|0)==105){if((ea|0)==0){break}c[D+244>>2]=Lb(ea|0)|0}}while(0);Z=ew(E,168536)|0;do{if((Z|0)==0){A=110}else{if((a[Z]|0)==0){A=110;break}c[D+248>>2]=fk(Z,E)|0}}while(0);do{if((A|0)==110){if((ea|0)==0){break}c[D+248>>2]=Lb(ea|0)|0}}while(0);Z=ew(E,168152)|0;do{if((Z|0)==0){A=115}else{if((a[Z]|0)==0){A=115;break}c[D+252>>2]=fk(Z,E)|0;ca=D+260|0;b[ca>>1]=b[ca>>1]|16}}while(0);do{if((A|0)==115){if((ea|0)==0){break}c[D+252>>2]=Lb(ea|0)|0}}while(0);Z=ew(E,167432)|0;do{if((Z|0)!=0){if((a[Z]|0)==0){break}ca=D+260|0;b[ca>>1]=b[ca>>1]|32;c[D+256>>2]=fk(Z,E)|0;da=ea;break d}}while(0);if((ea|0)==0){da=0;break}c[D+256>>2]=Lb(ea|0)|0;da=ea}}while(0);e:do{if((I&4194304|0)!=0){ea=ew(E,166968)|0;if((ea|0)==0){A=125}else{if((a[ea]|0)==0){A=125}else{fa=ea;A=127}}do{if((A|0)==125){ea=ew(E,166528)|0;if((ea|0)!=0){if((a[ea]|0)!=0){fa=ea;A=127;break}}ea=c[D+192>>2]|0;if((ea|0)==0){break}c[D+228>>2]=Lb(ea|0)|0}}while(0);if((A|0)==127){c[D+228>>2]=fk(fa,E)|0;ea=D+260|0;b[ea>>1]=b[ea>>1]|1}ea=ew(E,166176)|0;do{if((ea|0)==0){A=133}else{if((a[ea]|0)==0){A=133;break}c[D+232>>2]=fk(ea,E)|0;Z=D+260|0;b[Z>>1]=b[Z>>1]|8}}while(0);do{if((A|0)==133){ea=c[D+192>>2]|0;if((ea|0)==0){break}c[D+232>>2]=Lb(ea|0)|0}}while(0);ea=ew(E,165800)|0;do{if((ea|0)==0){A=138}else{if((a[ea]|0)==0){A=138;break}c[D+236>>2]=fk(ea,E)|0;Z=D+260|0;b[Z>>1]=b[Z>>1]|2}}while(0);do{if((A|0)==138){ea=c[D+200>>2]|0;if((ea|0)==0){break}c[D+236>>2]=Lb(ea|0)|0}}while(0);ea=ew(E,165472)|0;do{if((ea|0)!=0){if((a[ea]|0)==0){break}c[D+240>>2]=fk(ea,E)|0;Z=D+260|0;b[Z>>1]=b[Z>>1]|4;break e}}while(0);ea=c[D+204>>2]|0;if((ea|0)==0){break}c[D+240>>2]=Lb(ea|0)|0}}while(0);eF(X);eF(da);do{if((I&4259840|0)!=0){da=c[(c[x>>2]|0)+8>>2]|0;if((da|0)==0){break}if((c[D+208>>2]|0)==0){if((c[D+228>>2]|0)==0){break}}if((I&524288|0)==0){break}N=+h[(c[G>>2]|0)+152>>3]*.5;M=N>2.0?N:2.0;X=c[da+4>>2]|0;if((X|0)>0){fa=da|0;da=r;ea=s;Z=t;ca=r|0;ba=r+16|0;aa=r+32|0;_=r+48|0;Y=0;u=0;J=0;U=0;while(1){S=c[fa>>2]|0;O=kk(24)|0;R=O;c[O+16>>2]=1;C=(c[S+(U*48|0)+4>>2]|0)-1|0;P=(C|0)/3|0;if((C|0)>2){C=S+(U*48|0)|0;S=R;z=0;do{Q=z*3|0;ga=c[C>>2]|0;ha=ga+(Q<<4)|0;c[da>>2]=c[ha>>2];c[da+4>>2]=c[ha+4>>2];c[da+8>>2]=c[ha+8>>2];c[da+12>>2]=c[ha+12>>2];ha=ga+(Q+1<<4)|0;c[ba>>2]=c[ha>>2];c[ba+4>>2]=c[ha+4>>2];c[ba+8>>2]=c[ha+8>>2];c[ba+12>>2]=c[ha+12>>2];ha=ga+(Q+2<<4)|0;c[aa>>2]=c[ha>>2];c[aa+4>>2]=c[ha+4>>2];c[aa+8>>2]=c[ha+8>>2];c[aa+12>>2]=c[ha+12>>2];ha=ga+(Q+3<<4)|0;c[_>>2]=c[ha>>2];c[_+4>>2]=c[ha+4>>2];c[_+8>>2]=c[ha+8>>2];c[_+12>>2]=c[ha+12>>2];S=ki(ca,S)|0;z=z+1|0;}while((z|0)<(P|0))}if((O|0)==0){ia=J;ja=u;ka=Y}else{P=0;z=R;S=0;C=J;ha=u;Q=Y;while(1){ga=c[z+16>>2]|0;la=s+(S<<4)|0;ma=t+(S<<4)|0;N=+h[z>>3];L=+h[z+8>>3];do{if((P|0)==0){na=+h[ga>>3];oa=+h[ga+8>>3];pa=na;qa=oa;ra=N*2.0-na;sa=L*2.0-oa}else{oa=+h[P>>3];na=+h[P+8>>3];if((ga|0)==0){pa=N*2.0-oa;qa=L*2.0-na;ra=oa;sa=na;break}else{pa=+h[ga>>3];qa=+h[ga+8>>3];ra=oa;sa=na;break}}}while(0);na=+$(+(sa-L),+(ra-N));oa=+$(+(qa-L),+(pa-N))-na;if(oa>0.0){ta=oa+ -6.283185307179586}else{ta=oa}oa=na+ta*.5;na=M*+V(oa);ua=M*+W(oa);h[la>>3]=N+na;h[s+(S<<4)+8>>3]=L+ua;h[ma>>3]=N-na;h[t+(S<<4)+8>>3]=L-ua;va=S+1|0;wa=(ga|0)==0;if(wa|(va|0)==50){xa=va<<1;ya=xa-1|0;if((C|0)>0){za=0;Aa=0;do{za=(c[ha+(Aa<<2)>>2]|0)+za|0;Aa=Aa+1|0;}while((Aa|0)<(C|0));Ba=za;Ca=(C|0)>1?C:1}else{Ba=0;Ca=0}Aa=C+1|0;Da=mk(ha,Aa<<2)|0;c[Da+(Ca<<2)>>2]=xa;Ea=mk(Q,Ba+xa<<4)|0;do{if((S|0)>-1){Fa=ya+Ba|0;Ga=Ea+(Ba<<4)|0;c[Ga>>2]=c[ea>>2];c[Ga+4>>2]=c[ea+4>>2];c[Ga+8>>2]=c[ea+8>>2];c[Ga+12>>2]=c[ea+12>>2];Ga=Ea+(Fa<<4)|0;c[Ga>>2]=c[Z>>2];c[Ga+4>>2]=c[Z+4>>2];c[Ga+8>>2]=c[Z+8>>2];c[Ga+12>>2]=c[Z+12>>2];if((S|0)>0){Ha=1}else{break}do{Ga=Ea+(Ha+Ba<<4)|0;Ia=s+(Ha<<4)|0;c[Ga>>2]=c[Ia>>2];c[Ga+4>>2]=c[Ia+4>>2];c[Ga+8>>2]=c[Ia+8>>2];c[Ga+12>>2]=c[Ia+12>>2];Ia=Ea+(Fa-Ha<<4)|0;Ga=t+(Ha<<4)|0;c[Ia>>2]=c[Ga>>2];c[Ia+4>>2]=c[Ga+4>>2];c[Ia+8>>2]=c[Ga+8>>2];c[Ia+12>>2]=c[Ga+12>>2];Ha=Ha+1|0;}while((Ha|0)<(va|0))}}while(0);ya=la;c[ea>>2]=c[ya>>2];c[ea+4>>2]=c[ya+4>>2];c[ea+8>>2]=c[ya+8>>2];c[ea+12>>2]=c[ya+12>>2];ya=ma;c[Z>>2]=c[ya>>2];c[Z+4>>2]=c[ya+4>>2];c[Z+8>>2]=c[ya+8>>2];c[Z+12>>2]=c[ya+12>>2];Ja=1;Ka=Aa;Ma=Da;Na=Ea}else{Ja=va;Ka=C;Ma=ha;Na=Q}if(wa){Oa=R;break}else{P=z;z=ga;S=Ja;C=Ka;ha=Ma;Q=Na}}while(1){Q=c[Oa+16>>2]|0;eF(Oa);if((Q|0)==0){ia=Ka;ja=Ma;ka=Na;break}else{Oa=Q}}}Q=U+1|0;if((Q|0)<(X|0)){Y=ka;u=ja;J=ia;U=Q}else{Pa=ka;Qa=ja;Ra=ia;break}}}else{Pa=0;Qa=0;Ra=0}c[D+276>>2]=Ra;c[D+280>>2]=Qa;if((I&8192|0)==0){if((Ra|0)>0){U=0;J=0;while(1){u=(c[Qa+(U<<2)>>2]|0)+J|0;Y=U+1|0;if((Y|0)<(Ra|0)){U=Y;J=u}else{Sa=u;break}}}else{Sa=0}RA(f,Pa,Pa,Sa)|0}c[D+284>>2]=Pa;c[D+264>>2]=2;c[D+272>>2]=Pa;c[D+268>>2]=c[Qa>>2]}}while(0);eB(f,j);Qa=c[D+208>>2]|0;if((Qa|0)==0){if((b[D+260>>1]&1)!=0){A=181}}else{A=181}if((A|0)==181){gB(f,Qa,c[D+228>>2]|0,c[D+244>>2]|0,c[D+212>>2]|0)}D=q;ta=+h[(c[G>>2]|0)+152>>3];Ch(ew(E,148552)|0);f:do{if((c[(c[x>>2]|0)+8>>2]|0)!=0){pa=+Fm(E,c[53820]|0,1.0,0.0);Qa=Hm(E,c[53816]|0,213440)|0;Pa=(H|0)!=0;g:do{if(Pa){Sa=c[H>>2]|0;if((Sa|0)==0){Ta=0;break}else{Ua=H;Va=Sa}while(1){Sa=Ua+4|0;if((a[Va]|0)==116){if((Ya(Va|0,87744)|0)==0){Ta=1;break g}}Ra=c[Sa>>2]|0;if((Ra|0)==0){Ta=0;break}else{Ua=Sa;Va=Ra}}}else{Ta=0}}while(0);Ra=Qa;Sa=0;I=0;while(1){ia=a[Ra]|0;if((ia<<24>>24|0)==58){Wa=Sa+1|0;Xa=I}else if((ia<<24>>24|0)==59){Wa=Sa;Xa=I+1|0}else if((ia<<24>>24|0)==0){break}else{Wa=Sa;Xa=I}Ra=Ra+1|0;Sa=Wa;I=Xa}Ra=(Sa|0)==0;do{if((I|0)==0|Ra){Za=Qa}else{ia=l;ja=m;ka=o;Oa=Lh(Qa,Sa+1|0,p)|0;if((Oa|0)>1){Na=Hx(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0;Ma=$w(c[((c[w>>2]&3|0)==3?j:y)+28>>2]|0)|0;Ka=(Nw(Na)|0)!=0;Na=$w(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0;Fv(3,84552,(K=i,i=i+24|0,c[K>>2]=Ma,c[K+8>>2]=Ka?84144:83704,c[K+16>>2]=Na,K)|0)|0;i=K;if((Oa|0)==2){Za=159752;break}}else{if((Oa|0)==1){Za=159752;break}}Oa=c[(c[x>>2]|0)+8>>2]|0;if((c[Oa+4>>2]|0)>0){Na=l+8|0;Ka=l+12|0;Ma=l+32|0;Ja=l+4|0;Ha=l|0;t=l+16|0;s=m|0;Ba=n|0;Ca=n+4|0;r=o|0;J=o+4|0;U=c[p>>2]|0;u=U+8|0;Y=0;X=0;Z=Oa;while(1){Oa=(c[Z>>2]|0)+(Y*48|0)|0;c[ia>>2]=c[Oa>>2];c[ia+4>>2]=c[Oa+4>>2];c[ia+8>>2]=c[Oa+8>>2];c[ia+12>>2]=c[Oa+12>>2];c[ia+16>>2]=c[Oa+16>>2];c[ia+20>>2]=c[Oa+20>>2];c[ia+24>>2]=c[Oa+24>>2];c[ia+28>>2]=c[Oa+28>>2];c[ia+32>>2]=c[Oa+32>>2];c[ia+36>>2]=c[Oa+36>>2];c[ia+40>>2]=c[Oa+40>>2];c[ia+44>>2]=c[Oa+44>>2];Oa=c[u>>2]|0;ea=c[Oa>>2]|0;h:do{if((ea|0)==0){_a=X}else{ca=X;qa=1.0;_=1;aa=Oa;ba=ea;i:while(1){da=aa+4|0;ra=+g[da>>2];do{if(ra<1.0e-5&ra>-1.0e-5){$a=_;ab=qa;bb=ca}else{lB(f,ba);sa=+g[da>>2];M=qa-sa;cb=c[aa>>2]|0;if((_|0)!=0){ji(l,sa,n,o);fa=c[Ba>>2]|0;tB(f,fa,c[Ca>>2]|0,0,0,0);eF(fa);if(M<1.0e-5&M>-1.0e-5){A=204;break i}else{$a=0;ab=M;bb=cb;break}}if(M<1.0e-5&M>-1.0e-5){A=206;break i}c[ja>>2]=c[ka>>2];c[ja+4>>2]=c[ka+4>>2];c[ja+8>>2]=c[ka+8>>2];c[ja+12>>2]=c[ka+12>>2];c[ja+16>>2]=c[ka+16>>2];c[ja+20>>2]=c[ka+20>>2];c[ja+24>>2]=c[ka+24>>2];c[ja+28>>2]=c[ka+28>>2];c[ja+32>>2]=c[ka+32>>2];c[ja+36>>2]=c[ka+36>>2];c[ja+40>>2]=c[ka+40>>2];c[ja+44>>2]=c[ka+44>>2];sa=+g[da>>2];ji(m,sa/(M+sa),n,o);eF(c[s>>2]|0);fa=c[Ba>>2]|0;tB(f,fa,c[Ca>>2]|0,0,0,0);eF(fa);$a=0;ab=M;bb=cb}}while(0);da=aa+12|0;fa=c[da>>2]|0;if((fa|0)==0){_a=bb;break h}else{ca=bb;qa=ab;_=$a;aa=da;ba=fa}}if((A|0)==204){A=0;eF(c[r>>2]|0);_a=cb;break}else if((A|0)==206){A=0;ba=c[r>>2]|0;tB(f,ba,c[J>>2]|0,0,0,0);eF(ba);_a=cb;break}}}while(0);if((c[Na>>2]|0)!=0){lB(f,c[c[u>>2]>>2]|0);nB(f,c[c[u>>2]>>2]|0);qh(f,2,t,c[Ha>>2]|0,pa,ta,c[Na>>2]|0)}if((c[Ka>>2]|0)!=0){lB(f,_a);nB(f,_a);qh(f,3,Ma,(c[Ha>>2]|0)+((c[Ja>>2]|0)-1<<4)|0,pa,ta,c[Ka>>2]|0)}ea=c[(c[x>>2]|0)+8>>2]|0;Oa=c[ea+4>>2]|0;do{if((Oa|0)>1){if((c[Na>>2]|0)==0){if((c[Ka>>2]|0)==0|F){db=ea;eb=Oa;break}}else{if(F){db=ea;eb=Oa;break}}pB(f,H);ga=c[(c[x>>2]|0)+8>>2]|0;db=ga;eb=c[ga+4>>2]|0}else{db=ea;eb=Oa}}while(0);Oa=Y+1|0;if((Oa|0)<(eb|0)){Y=Oa;X=_a;Z=db}else{fb=U;break}}}else{fb=c[p>>2]|0}eF(fb);break f}}while(0);Qa=d[(c[x>>2]|0)+115|0]|0;do{if((Qa&1|0)==0){if((Qa&2|0)!=0){I=c[53764]|0;U=Im(E,I,ei(Za,139280)|0)|0;gb=U;hb=Im(E,c[53766]|0,136712)|0;A=229;break}if((Qa&8|0)!=0){U=c[53806]|0;I=Im(E,U,ei(Za,133792)|0)|0;gb=I;hb=Im(E,c[53808]|0,131744)|0;A=229;break}if((Qa&4|0)==0){ib=Im(E,c[53802]|0,Za)|0;jb=Za;break}else{I=c[53752]|0;U=Im(E,I,ei(Za,129560)|0)|0;gb=U;hb=Im(E,c[53754]|0,126280)|0;A=229;break}}else{U=c[53824]|0;I=Im(E,U,ei(Za,145328)|0)|0;gb=I;hb=Im(E,c[53826]|0,142384)|0;A=229}}while(0);do{if((A|0)==229){if((gb|0)==(Za|0)){ib=hb;jb=Za;break}lB(f,gb);ib=hb;jb=gb}}while(0);if((ib|0)!=(Za|0)){nB(f,ib)}if(Ta<<24>>24!=0){Qa=(a[jb]|0)==0?159752:jb;I=(a[ib]|0)==0?159752:ib;lB(f,118712);nB(f,Qa);U=c[c[(c[x>>2]|0)+8>>2]>>2]|0;c[D>>2]=c[U>>2];c[D+4>>2]=c[U+4>>2];c[D+8>>2]=c[U+8>>2];c[D+12>>2]=c[U+12>>2];c[D+16>>2]=c[U+16>>2];c[D+20>>2]=c[U+20>>2];c[D+24>>2]=c[U+24>>2];c[D+28>>2]=c[U+28>>2];c[D+32>>2]=c[U+32>>2];c[D+36>>2]=c[U+36>>2];c[D+40>>2]=c[U+40>>2];c[D+44>>2]=c[U+44>>2];U=c[53804]|0;do{if((U|0)==0){A=240}else{Z=fw(E,U)|0;X=a[Z]|0;if((X<<24>>24|0)==102){if((Ya(Z|0,86688)|0)==0){kb=6;break}else{A=240;break}}else if((X<<24>>24|0)==98){if((Ya(Z|0,85856)|0)==0){kb=8;break}if((Ya(Z|0,85384)|0)==0){kb=4;break}else{A=240;break}}else if((X<<24>>24|0)==110){if((Ya(Z|0,84920)|0)==0){kb=2;break}else{A=240;break}}else{A=240;break}}}while(0);if((A|0)==240){U=(Nw(Hx(c[((c[w>>2]&3|0)==2?j:B)+28>>2]|0)|0)|0)!=0;kb=U?6:2}U=rm(q,kb,ta,0,0)|0;Z=U+8|0;rB(f,c[Z>>2]|0,c[U>>2]|0,1);if((U|0)!=0){eF(c[Z>>2]|0);eF(U)}lB(f,Qa);if((I|0)!=(Qa|0)){nB(f,I)}U=c[q+8>>2]|0;if((U|0)!=0){qh(f,2,q+16|0,c[q>>2]|0,pa,ta,U)}U=c[q+12>>2]|0;if((U|0)==0){break}qh(f,3,q+32|0,(c[q>>2]|0)+((c[q+4>>2]|0)-1<<4)|0,pa,ta,U);break}U=c[x>>2]|0;if(Ra){do{if((a[U+115|0]&3)==0){if((a[jb]|0)!=0){lB(f,jb);nB(f,ib);break}lB(f,159752);if((a[ib]|0)==0){nB(f,159752);break}else{nB(f,ib);break}}}while(0);Ra=c[(c[x>>2]|0)+8>>2]|0;if((c[Ra+4>>2]|0)<=0){break}I=q|0;Qa=q+4|0;Z=q+8|0;X=q+12|0;Y=Pa^1;Ka=q+32|0;Na=q+16|0;if(Pa){Ja=0;Ha=Ra;while(1){Ma=(c[Ha>>2]|0)+(Ja*48|0)|0;c[D>>2]=c[Ma>>2];c[D+4>>2]=c[Ma+4>>2];c[D+8>>2]=c[Ma+8>>2];c[D+12>>2]=c[Ma+12>>2];c[D+16>>2]=c[Ma+16>>2];c[D+20>>2]=c[Ma+20>>2];c[D+24>>2]=c[Ma+24>>2];c[D+28>>2]=c[Ma+28>>2];c[D+32>>2]=c[Ma+32>>2];c[D+36>>2]=c[Ma+36>>2];c[D+40>>2]=c[Ma+40>>2];c[D+44>>2]=c[Ma+44>>2];Ma=c[I>>2]|0;t=c[Qa>>2]|0;do{if((c[v>>2]&16384|0)==0){tB(f,Ma,t,0,0,0);u=c[Z>>2]|0;if((u|0)!=0){qh(f,2,Na,c[I>>2]|0,pa,ta,u)}u=c[X>>2]|0;if((u|0)!=0){qh(f,3,Ka,(c[I>>2]|0)+((c[Qa>>2]|0)-1<<4)|0,pa,ta,u)}if((c[(c[(c[x>>2]|0)+8>>2]|0)+4>>2]|0)<=1){break}if((c[Z>>2]|0)==0){if((c[X>>2]|0)==0|Y){break}}pB(f,H)}else{tB(f,Ma,t,c[Z>>2]|0,c[X>>2]|0,0)}}while(0);Ja=Ja+1|0;Ha=c[(c[x>>2]|0)+8>>2]|0;if((Ja|0)>=(c[Ha+4>>2]|0)){break f}}}else{Ha=0;Ja=Ra;while(1){Pa=(c[Ja>>2]|0)+(Ha*48|0)|0;c[D>>2]=c[Pa>>2];c[D+4>>2]=c[Pa+4>>2];c[D+8>>2]=c[Pa+8>>2];c[D+12>>2]=c[Pa+12>>2];c[D+16>>2]=c[Pa+16>>2];c[D+20>>2]=c[Pa+20>>2];c[D+24>>2]=c[Pa+24>>2];c[D+28>>2]=c[Pa+28>>2];c[D+32>>2]=c[Pa+32>>2];c[D+36>>2]=c[Pa+36>>2];c[D+40>>2]=c[Pa+40>>2];c[D+44>>2]=c[Pa+44>>2];Pa=c[I>>2]|0;t=c[Qa>>2]|0;do{if((c[v>>2]&16384|0)==0){tB(f,Pa,t,0,0,0);Ma=c[Z>>2]|0;if((Ma|0)!=0){qh(f,2,Na,c[I>>2]|0,pa,ta,Ma)}Ma=c[X>>2]|0;if((Ma|0)!=0){qh(f,3,Ka,(c[I>>2]|0)+((c[Qa>>2]|0)-1<<4)|0,pa,ta,Ma)}if((c[(c[(c[x>>2]|0)+8>>2]|0)+4>>2]|0)<=1){break}if((c[Z>>2]|0)!=0){break}if((c[X>>2]|0)==0|Y){break}pB(f,0)}else{tB(f,Pa,t,c[Z>>2]|0,c[X>>2]|0,0)}}while(0);Ha=Ha+1|0;Ja=c[(c[x>>2]|0)+8>>2]|0;if((Ha|0)>=(c[Ja+4>>2]|0)){break f}}}}Ja=U+8|0;Ha=c[Ja>>2]|0;X=c[Ha+4>>2]|0;Z=X*48|0;Y=dF(Z)|0;Qa=Y;I=dF(Z)|0;Z=I;qa=+(Sa+2|0)*.5;Ka=(X|0)>0;j:do{if(Ka){Na=q+4|0;Ra=q|0;ra=0.0;M=0.0;t=0;Pa=Ha;while(1){Ma=(c[Pa>>2]|0)+(t*48|0)|0;c[D>>2]=c[Ma>>2];c[D+4>>2]=c[Ma+4>>2];c[D+8>>2]=c[Ma+8>>2];c[D+12>>2]=c[Ma+12>>2];c[D+16>>2]=c[Ma+16>>2];c[D+20>>2]=c[Ma+20>>2];c[D+24>>2]=c[Ma+24>>2];c[D+28>>2]=c[Ma+28>>2];c[D+32>>2]=c[Ma+32>>2];c[D+36>>2]=c[Ma+36>>2];c[D+40>>2]=c[Ma+40>>2];c[D+44>>2]=c[Ma+44>>2];Ma=c[Na>>2]|0;c[Qa+(t*48|0)+4>>2]=Ma;c[Z+(t*48|0)+4>>2]=Ma;u=Ma<<4;J=dF(u)|0;r=J;c[Qa+(t*48|0)>>2]=r;Ca=dF(u)|0;c[Z+(t*48|0)>>2]=Ca;u=c[Ra>>2]|0;sa=+h[u>>3];L=+h[u+8>>3];Ba=Ma-1|0;if((Ba|0)>0){Ma=J+8|0;N=ra;ua=M;na=L;oa=sa;J=0;while(1){s=J+1|0;lb=+h[u+(s<<4)>>3];mb=+h[u+(s<<4)+8>>3];ka=r+(J<<4)|0;if((J|0)==0){nb=oa-lb;ob=na-mb;pb=2.0/+T(nb*nb+ob*ob+1.0e-4);qb=ob*pb;h[ka>>3]=qb;h[Ma>>3]=-0.0-nb*pb;rb=qb}else{qb=ua-lb;pb=N-mb;nb=2.0/+T(qb*qb+pb*pb+1.0e-4);ob=pb*nb;h[ka>>3]=ob;h[r+(J<<4)+8>>3]=-0.0-qb*nb;rb=ob}ka=J+2|0;ob=+h[u+(ka<<4)>>3];nb=+h[u+(ka<<4)+8>>3];ja=J+3|0;qb=+h[u+(ja<<4)>>3];pb=+h[u+(ja<<4)+8>>3];ia=r+(s<<4)|0;Oa=r+(ka<<4)|0;sb=lb-ob;tb=mb-nb;ub=+T(sb*sb+tb*tb);if(ub<1.0e-4){vb=oa-qb;wb=na-pb;xb=wb;yb=vb;zb=+T(vb*vb+wb*wb+1.0e-4)}else{xb=tb;yb=sb;zb=ub}ub=2.0/zb;sb=xb*ub;tb=-0.0-yb*ub;ea=Oa;h[Oa>>3]=sb;h[r+(ka<<4)+8>>3]=tb;Oa=ia;c[Oa>>2]=c[ea>>2];c[Oa+4>>2]=c[ea+4>>2];c[Oa+8>>2]=c[ea+8>>2];c[Oa+12>>2]=c[ea+12>>2];h[Ca+(J<<4)>>3]=oa-qa*rb;h[Ca+(J<<4)+8>>3]=na-qa*+h[r+(J<<4)+8>>3];h[Ca+(s<<4)>>3]=lb-qa*+h[ia>>3];h[Ca+(s<<4)+8>>3]=mb-qa*+h[r+(s<<4)+8>>3];h[Ca+(ka<<4)>>3]=ob-qa*sb;h[Ca+(ka<<4)+8>>3]=nb-qa*tb;if((ja|0)<(Ba|0)){N=nb;ua=ob;na=pb;oa=qb;J=ja}else{Ab=nb;Bb=ob;Cb=pb;Db=qb;Eb=ja;break}}}else{Ab=ra;Bb=M;Cb=L;Db=sa;Eb=0}oa=Bb-Db;na=Ab-Cb;ua=2.0/+T(oa*oa+na*na+1.0e-4);N=na*ua;na=-0.0-oa*ua;h[r+(Eb<<4)>>3]=N;h[r+(Eb<<4)+8>>3]=na;h[Ca+(Eb<<4)>>3]=Db-qa*N;h[Ca+(Eb<<4)+8>>3]=Cb-qa*na;J=t+1|0;if((J|0)>=(X|0)){break j}ra=Ab;M=Bb;t=J;Pa=c[Ja>>2]|0}}}while(0);Ja=Lb(jb|0)|0;Ha=La(Ja|0,87264)|0;if((Ha|0)==0){Fb=jb;Gb=jb}else{Sa=jb;U=jb;Pa=jb;t=Ha;Ha=0;while(1){Ra=(a[t]|0)==0?159752:t;do{if((Ra|0)==(Pa|0)){Hb=Pa}else{if((a[(c[x>>2]|0)+115|0]&3)!=0){Hb=Ra;break}lB(f,Ra);nB(f,Ra);Hb=Ra}}while(0);Na=(Ha|0)==0;J=Na?Ra:Sa;Ba=(Ha|0)==1?Ra:Na?Ra:U;if(Ka){Na=0;do{u=c[Z+(Na*48|0)>>2]|0;Ma=c[Qa+(Na*48|0)>>2]|0;ja=c[Z+(Na*48|0)+4>>2]|0;if((ja|0)>0){ka=0;do{s=u+(ka<<4)|0;h[s>>3]=+h[Ma+(ka<<4)>>3]+ +h[s>>3];s=u+(ka<<4)+8|0;h[s>>3]=+h[Ma+(ka<<4)+8>>3]+ +h[s>>3];ka=ka+1|0;}while((ka|0)<(ja|0))}tB(f,u,ja,0,0,0);Na=Na+1|0;}while((Na|0)<(X|0))}Na=La(0,87264)|0;if((Na|0)==0){Fb=J;Gb=Ba;break}else{Sa=J;U=Ba;Pa=Hb;t=Na;Ha=Ha+1|0}}}Ha=q+8|0;t=c[Ha>>2]|0;if((t|0)==0){Ib=0}else{do{if((Gb|0)==0){Jb=0;Kb=t}else{if((a[(c[x>>2]|0)+115|0]&3)!=0){Jb=Gb;Kb=t;break}lB(f,Gb);nB(f,Gb);Jb=Gb;Kb=c[Ha>>2]|0}}while(0);qh(f,2,q+16|0,c[q>>2]|0,pa,ta,Kb);Ib=Jb}Ha=q+12|0;t=c[Ha>>2]|0;if((t|0)!=0){do{if((Ib|0)==(Fb|0)){Mb=t}else{if((a[(c[x>>2]|0)+115|0]&3)!=0){Mb=t;break}lB(f,Fb);nB(f,Fb);Mb=c[Ha>>2]|0}}while(0);qh(f,3,q+32|0,(c[q>>2]|0)+((c[q+4>>2]|0)-1<<4)|0,pa,ta,Mb)}eF(Ja);if(Ka){Ha=0;do{eF(c[Qa+(Ha*48|0)>>2]|0);eF(c[Z+(Ha*48|0)>>2]|0);Ha=Ha+1|0;}while((Ha|0)<(X|0))}eF(Y);eF(I)}}while(0);Mb=c[G>>2]|0;G=c[Mb+8>>2]|0;q=Mb+208|0;if((c[q>>2]|0)==0){if((b[Mb+260>>1]&1)!=0){A=316}}else{A=316}do{if((A|0)==316){hB(f);Fb=Mb+276|0;x=c[Fb>>2]|0;if((x|0)==0){break}Ib=Mb+280|0;if((x|0)<=1){break}x=c[Ib>>2]|0;Jb=Mb+268|0;Kb=Mb+284|0;Gb=Mb+272|0;Hb=Mb+228|0;jb=Mb+244|0;Eb=Mb+212|0;D=1;v=c[x>>2]|0;H=x;do{c[Jb>>2]=c[H+(D<<2)>>2];c[Gb>>2]=(c[Kb>>2]|0)+(v<<4);gB(f,c[q>>2]|0,c[Hb>>2]|0,c[jb>>2]|0,c[Eb>>2]|0);hB(f);H=c[Ib>>2]|0;v=(c[H+(D<<2)>>2]|0)+v|0;D=D+1|0;}while((D|0)<(c[Fb>>2]|0))}}while(0);c[Mb+268>>2]=0;c[Mb+272>>2]=0;q=G+8|0;A=c[q>>2]|0;Fb=c[A+8>>2]|0;if((Fb|0)==0){Nb=A;Ob=Mb+260|0}else{A=c[Fb>>2]|0;Fb=c[A>>2]|0;if((c[A+8>>2]|0)==0){Pb=Fb|0;Qb=Fb+8|0}else{Pb=A+16|0;Qb=A+24|0}A=Mb+260|0;Fb=b[A>>1]|0;bi(f,+h[Pb>>3],+h[Qb>>3],Fb<<8<<16>>16>>15&255,c[Mb+220>>2]|0,Fb<<14<<16>>16>>15&255,Fb<<11<<16>>16>>15&255);Fb=c[(c[q>>2]|0)+8>>2]|0;Qb=(c[Fb+4>>2]|0)-1|0;Pb=c[Fb>>2]|0;Fb=Pb+(Qb*48|0)+16|0;if((c[Pb+(Qb*48|0)+12>>2]|0)==0){D=c[Pb+(Qb*48|0)>>2]|0;v=(c[Pb+(Qb*48|0)+4>>2]|0)-1|0;Rb=D+(v<<4)|0;Sb=D+(v<<4)+8|0}else{Rb=Fb+16|0;Sb=Fb+24|0}Fb=b[A>>1]|0;bi(f,+h[Rb>>3],+h[Sb>>3],Fb<<7<<16>>16>>15&255,c[Mb+224>>2]|0,Fb<<13<<16>>16>>15&255,Fb<<10<<16>>16>>15&255);Nb=c[q>>2]|0;Ob=A}A=c[Nb+96>>2]|0;Nb=b[Ob>>1]<<12<<16>>16>>15<<16>>16;Fb=Mb+216|0;Sb=c[Fb>>2]|0;Rb=Mb+232|0;v=c[Rb>>2]|0;D=Mb+248|0;Qb=c[D>>2]|0;Pb=Mb+212|0;H=c[Pb>>2]|0;Ib=G|0;if((Km(Hm(Ib,c[53810]|0,90608)|0)|0)<<24>>24==0){Tb=0}else{Tb=c[(c[q>>2]|0)+8>>2]|0}ci(f,A,11,Nb,Sb,v,Qb,H,Tb);Tb=c[(c[q>>2]|0)+108>>2]|0;H=b[Ob>>1]<<12<<16>>16>>15<<16>>16;Qb=c[Fb>>2]|0;Fb=c[Rb>>2]|0;Rb=c[D>>2]|0;D=c[Pb>>2]|0;if((Km(Hm(Ib,c[53810]|0,90608)|0)|0)<<24>>24==0){Ub=0}else{Ub=c[(c[q>>2]|0)+8>>2]|0}ci(f,Tb,11,H,Qb,Fb,Rb,D,Ub);ci(f,c[(c[q>>2]|0)+100>>2]|0,7,b[Ob>>1]<<13<<16>>16>>15<<16>>16,c[Mb+224>>2]|0,c[Mb+240>>2]|0,c[Mb+256>>2]|0,c[Pb>>2]|0,0);ci(f,c[(c[q>>2]|0)+104>>2]|0,6,b[Ob>>1]<<14<<16>>16>>15<<16>>16,c[Mb+220>>2]|0,c[Mb+236>>2]|0,c[Mb+252>>2]|0,c[Pb>>2]|0,0);fB(f);Gh(f);i=k;return}function Yh(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;d=i;i=i+144|0;e=d+128|0;if(!(a[14792]|0)){Iv(175216,128,176872);a[14792]=1}Iv(e,128,d|0);f=e+4|0;g=e+8|0;h=e|0;j=0;k=0;l=b;a:while(1){m=j;n=l;while(1){o=a[n]|0;b:do{if(o<<24>>24==0){p=n;q=0}else{r=n;s=o;while(1){if((Qa(s<<24>>24|0)|0)==0){t=a[r]|0;if(t<<24>>24!=44){p=r;q=t;break b}}t=r+1|0;u=a[t]|0;if(u<<24>>24==0){p=t;q=0;break}else{r=t;s=u}}}}while(0);o=q<<24>>24;if((o|0)==0){v=30;break a}else if(!((o|0)==40|(o|0)==41)){w=p;x=q;v=10;break}s=p+1|0;if((o|0)==40){if(m<<24>>24==0){m=1;n=s;continue}else{v=16;break a}}else if((o|0)==41){if(m<<24>>24==0){v=18;break a}else{m=0;n=s;continue}}else{y=s;break}}c:do{if((v|0)==10){while(1){v=0;n=x<<24>>24;if((n|0)==40|(n|0)==41|(n|0)==44|(n|0)==0){y=w;break c}n=c[f>>2]|0;if(n>>>0<(c[g>>2]|0)>>>0){z=n}else{Jv(e,1)|0;z=c[f>>2]|0}c[f>>2]=z+1;a[z]=x;n=w+1|0;w=n;x=a[n]|0;v=10}}}while(0);if(m<<24>>24==0){if((k|0)==63){v=21;break}n=c[43805]|0;if(n>>>0<(c[43806]|0)>>>0){A=n}else{Jv(175216,1)|0;A=c[43805]|0}c[43805]=A+1;a[A]=0;c[176472+(k<<2)>>2]=c[43805];B=k+1|0}else{B=k}n=c[f>>2]|0;if(n>>>0<(c[g>>2]|0)>>>0){C=n}else{Jv(e,1)|0;C=c[f>>2]|0}a[C]=0;n=c[h>>2]|0;c[f>>2]=n;Lv(175216,n)|0;n=c[43805]|0;if(n>>>0<(c[43806]|0)>>>0){D=n}else{Jv(175216,1)|0;D=c[43805]|0}c[43805]=D+1;a[D]=0;j=m;k=B;l=y}if((v|0)==16){Fv(1,116872,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44118]=0;Mv(e);i=d;return 176472}else if((v|0)==18){Fv(1,115968,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44118]=0;Mv(e);i=d;return 176472}else if((v|0)==21){Fv(0,114648,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44181]=0;Mv(e);i=d;return 176472}else if((v|0)==30){if(m<<24>>24!=0){Fv(1,113800,(E=i,i=i+8|0,c[E>>2]=b,E)|0)|0;i=E;c[44118]=0;Mv(e);i=d;return 176472}c[176472+(k<<2)>>2]=0;Mv(e);e=c[43805]|0;if(e>>>0<(c[43806]|0)>>>0){F=e}else{Jv(175216,1)|0;F=c[43805]|0}a[F]=0;c[43805]=c[43804];i=d;return 176472}return 0}function Zh(a){a=a|0;var b=0;b=c[44736]|0;if((a|0)!=0){c[44736]=b+1;if((b|0)!=0){return}c[44734]=Lb(Ab(1,0)|0)|0;Ab(1,113248)|0;return}if((b|0)<=0){return}a=b-1|0;c[44736]=a;if((a|0)!=0){return}Ab(1,c[44734]|0)|0;eF(c[44734]|0);return}function _h(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0.0,ba=0.0,ca=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,Ma=0,Na=0,Oa=0,Pa=0.0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0,Va=0,Wa=0.0,Xa=0.0,Za=0.0,_a=0.0,$a=0,ab=0,bb=0.0,cb=0.0,db=0.0,eb=0.0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0.0,ob=0.0,pb=0.0,qb=0.0,rb=0.0,sb=0.0,tb=0.0;e=i;i=i+232|0;f=e|0;g=e+8|0;j=e+16|0;k=e+24|0;l=e+32|0;m=e+40|0;n=e+48|0;p=e+56|0;q=e+104|0;r=e+136|0;s=e+168|0;t=e+200|0;if((a[213992]|0)!=0){ym()}u=d+8|0;if((c[(c[u>>2]|0)+8>>2]|0)==0){Fv(1,112688,(v=i,i=i+1|0,i=i+7&-8,c[v>>2]=0,v)|0)|0;i=v;if((a[213992]|0)==0){w=-1;i=e;return w|0}x=c[o>>2]|0;y=$w(d|0)|0;z=+zm();gc(x|0,112248,(v=i,i=i+16|0,c[v>>2]=y,h[v+8>>3]=z,v)|0)|0;i=v;w=-1;i=e;return w|0}y=ux(d)|0;a:do{if((y|0)!=0){x=p;A=q|0;B=q+8|0;C=q+16|0;D=q+24|0;E=r|0;F=r+8|0;G=r+16|0;H=r+24|0;I=p+8|0;J=p+12|0;K=p+32|0;L=p+4|0;M=p|0;N=t|0;O=t+8|0;P=t+16|0;Q=t+24|0;R=p+16|0;S=s|0;T=s+8|0;U=s+16|0;V=s+24|0;W=y;b:while(1){X=W+8|0;Y=c[X>>2]|0;h[Y+48>>3]=+h[Y+16>>3]- +h[Y+88>>3];Y=c[X>>2]|0;h[Y+56>>3]=+h[Y+24>>3]- +h[Y+80>>3]*.5;Y=c[X>>2]|0;h[Y+64>>3]=+h[Y+16>>3]+ +h[Y+96>>3];Y=c[X>>2]|0;h[Y+72>>3]=+h[Y+24>>3]+ +h[Y+80>>3]*.5;Y=mw(d,W)|0;if((Y|0)!=0){X=Y;do{Y=c[(c[X+8>>2]|0)+8>>2]|0;if((Y|0)!=0){Z=Y+4|0;if((c[Z>>2]|0)<=0){break b}_=Y|0;$=c[_>>2]|0;c[x>>2]=c[$>>2];c[x+4>>2]=c[$+4>>2];c[x+8>>2]=c[$+8>>2];c[x+12>>2]=c[$+12>>2];c[x+16>>2]=c[$+16>>2];c[x+20>>2]=c[$+20>>2];c[x+24>>2]=c[$+24>>2];c[x+28>>2]=c[$+28>>2];c[x+32>>2]=c[$+32>>2];c[x+36>>2]=c[$+36>>2];c[x+40>>2]=c[$+40>>2];c[x+44>>2]=c[$+44>>2];ai(q,p);z=+h[A>>3];aa=+h[B>>3];ba=+h[C>>3];ca=+h[D>>3];if((c[Z>>2]|0)>0){$=0;ea=ca;fa=ba;ga=aa;ha=z;while(1){if(($|0)>0){ia=(c[_>>2]|0)+($*48|0)|0;c[x>>2]=c[ia>>2];c[x+4>>2]=c[ia+4>>2];c[x+8>>2]=c[ia+8>>2];c[x+12>>2]=c[ia+12>>2];c[x+16>>2]=c[ia+16>>2];c[x+20>>2]=c[ia+20>>2];c[x+24>>2]=c[ia+24>>2];c[x+28>>2]=c[ia+28>>2];c[x+32>>2]=c[ia+32>>2];c[x+36>>2]=c[ia+36>>2];c[x+40>>2]=c[ia+40>>2];c[x+44>>2]=c[ia+44>>2];ai(r,p);ja=+h[E>>3];ka=+h[F>>3];la=+h[G>>3];ma=+h[H>>3];na=ha<ja?ha:ja;oa=ga<ka?ga:ka;pa=fa>la?fa:la;qa=ea>ma?ea:ma}else{na=ha;oa=ga;pa=fa;qa=ea}ia=c[I>>2]|0;if((ia|0)==0){ra=na;sa=oa;ta=pa;ua=qa}else{ph(s,R,c[M>>2]|0,1.0,ia);ma=+h[S>>3];la=+h[T>>3];ka=+h[U>>3];ja=+h[V>>3];ra=na<ma?na:ma;sa=oa<la?oa:la;ta=pa>ka?pa:ka;ua=qa>ja?qa:ja}ia=c[J>>2]|0;if((ia|0)==0){va=ra;wa=sa;xa=ta;ya=ua}else{ph(t,K,(c[M>>2]|0)+((c[L>>2]|0)-1<<4)|0,1.0,ia);ja=+h[N>>3];ka=+h[O>>3];la=+h[P>>3];ma=+h[Q>>3];va=ra<ja?ra:ja;wa=sa<ka?sa:ka;xa=ta>la?ta:la;ya=ua>ma?ua:ma}ia=$+1|0;if((ia|0)<(c[Z>>2]|0)){$=ia;ea=ya;fa=xa;ga=wa;ha=va}else{za=ya;Aa=xa;Ba=wa;Ca=va;break}}}else{za=ca;Aa=ba;Ba=aa;Ca=z}h[Y+8>>3]=Ca;h[Y+16>>3]=Ba;h[Y+24>>3]=Aa;h[Y+32>>3]=za;}X=ow(d,X)|0;}while((X|0)!=0)}W=vx(d,W)|0;if((W|0)==0){break a}}cc(94032,102832,3891,170496);return 0}}while(0);c[b+168>>2]=d;t=b+293|0;a[t]=0;s=d|0;p=ew(s,99560)|0;do{if((p|0)!=0){r=ac(p|0,99168,(v=i,i=i+16|0,c[v>>2]=m,c[v+8>>2]=n,v)|0)|0;i=v;if((r|0)<=0){break}za=+h[m>>3]*72.0;q=b+208|0;h[q>>3]=za;h[b+200>>3]=za;if((r|0)>1){h[q>>3]=+h[n>>3]*72.0}a[t]=1}}while(0);t=b+292|0;a[t]=0;p=ew(s,98736)|0;do{if((p|0)!=0){q=ac(p|0,99168,(v=i,i=i+16|0,c[v>>2]=m,c[v+8>>2]=n,v)|0)|0;i=v;if((q|0)<=0){break}za=+h[m>>3]*72.0;r=b+224|0;h[r>>3]=za;h[b+216>>3]=za;if((q|0)>1){h[r>>3]=+h[n>>3]*72.0}a[t]=1}}while(0);t=b+294|0;a[t]=0;n=b+232|0;m=(c[(c[u>>2]|0)+8>>2]|0)+48|0;c[n>>2]=c[m>>2];c[n+4>>2]=c[m+4>>2];c[n+8>>2]=c[m+8>>2];c[n+12>>2]=c[m+12>>2];m=c[(c[u>>2]|0)+8>>2]|0;do{if(+h[m+48>>3]>.001){if(+h[m+56>>3]<=.001){Da=m;break}a[t]=1;Da=c[(c[u>>2]|0)+8>>2]|0}else{Da=m}}while(0);c[b+288>>2]=(a[Da+81|0]|0)==0?0:90;Da=b+196|0;c[Da>>2]=98168;m=ew(s,97472)|0;do{if((m|0)!=0){if((a[m]|0)==0){break}c[Da>>2]=m}}while(0);m=b+256|0;Da=(c[u>>2]|0)+16|0;c[m>>2]=c[Da>>2];c[m+4>>2]=c[Da+4>>2];c[m+8>>2]=c[Da+8>>2];c[m+12>>2]=c[Da+12>>2];c[m+16>>2]=c[Da+16>>2];c[m+20>>2]=c[Da+20>>2];c[m+24>>2]=c[Da+24>>2];c[m+28>>2]=c[Da+28>>2];c[53714]=Wv(d,0,96360,0)|0;c[53716]=Wv(d,0,95840,0)|0;c[b+320>>2]=Im(0,c[53626]|0,95312)|0;h[b+328>>3]=+Fm(0,c[53624]|0,14.0,1.0);c[b+336>>2]=29704;c[b+188>>2]=$w(s)|0;Da=b+304|0;m=c[Da>>2]|0;if((m|0)!=0){eF(m);c[Da>>2]=0}m=b+308|0;t=c[m>>2]|0;if((t|0)!=0){eF(t);c[m>>2]=0}t=b+316|0;n=c[t>>2]|0;if((n|0)!=0){eF(n);c[t>>2]=0}n=ew(s,104872)|0;do{if((n|0)==0){c[m>>2]=0;c[b+312>>2]=1}else{p=ew(s,102120)|0;r=b+296|0;c[r>>2]=(p|0)==0?101368:p;p=ew(s,100968)|0;q=b+300|0;y=(p|0)==0?100504:p;c[q>>2]=y;p=sc(c[r>>2]|0,y|0)|0;if((p|0)!=0){Fv(0,99976,(v=i,i=i+8|0,c[v>>2]=a[p]|0,v)|0)|0;i=v;c[q>>2]=213440}q=Lb(n|0)|0;c[Da>>2]=q;p=La(q|0,c[r>>2]|0)|0;do{if((p|0)==0){Ea=0}else{q=0;y=p;W=0;while(1){Fa=q+1|0;if((q|0)<(W|0)){Ga=W;Ha=c[m>>2]|0}else{Q=W+128|0;P=c[m>>2]|0;if((P|0)==0){Ia=kk(Q<<2)|0}else{Ia=mk(P,Q<<2)|0}P=Ia;c[m>>2]=P;Ga=Q;Ha=P}c[Ha+(Fa<<2)>>2]=y;P=La(0,c[r>>2]|0)|0;if((P|0)==0){break}else{q=Fa;y=P;W=Ga}}if((Fa|0)==0){Ea=0;break}W=mk(c[m>>2]|0,(Fa<<2)+8|0)|0;c[m>>2]=W;c[W>>2]=0;c[(c[m>>2]|0)+(q+2<<2)>>2]=0;Ea=Fa}}while(0);r=b+312|0;c[r>>2]=Ea;p=ew(s,104368)|0;if((p|0)==0){break}if((a[p]|0)==0){break}W=kk((c[r>>2]<<2)+8|0)|0;y=W;P=c[r>>2]|0;do{if((P|0)<1){Ja=66}else{Q=1;O=0;N=P;while(1){if(($h(b,Q,N,p)|0)<<24>>24==0){Ka=O}else{L=O+1|0;c[y+(L<<2)>>2]=Q;Ka=L}L=c[r>>2]|0;if((Q|0)<(L|0)){Q=Q+1|0;O=Ka;N=L}else{break}}if((Ka|0)==0){Ja=66;break}c[y>>2]=Ka;c[y+(Ka+1<<2)>>2]=(c[r>>2]|0)+1;Ma=y}}while(0);if((Ja|0)==66){Fv(0,103720,(v=i,i=i+8|0,c[v>>2]=p,v)|0)|0;i=v;eF(W);Ma=0}c[t>>2]=Ma}}while(0);Ma=c[44736]|0;c[44736]=Ma+1;if((Ma|0)==0){c[44734]=Lb(Ab(1,0)|0)|0;Ab(1,113248)|0}Ma=DA(b)|0;c:do{if((Ma|0)!=0){t=b+56|0;Ka=b|0;Ea=b+184|0;Fa=b+192|0;m=d+48|0;Ga=b+28|0;Ha=Ma;while(1){Ia=c[t>>2]|0;if((Ia|0)==0){c[Ha+20>>2]=0;c[Ha+24>>2]=0}else{c[Ha+20>>2]=c[Ia+8>>2];c[Ha+24>>2]=c[(c[t>>2]|0)+12>>2]}c[Ha+12>>2]=Ka;c[Ha+28>>2]=c[Ea>>2];c[Ha+620>>2]=24632;c[Ha+624>>2]=c[6156];if((c[(c[u>>2]|0)+8>>2]|0)==0){Ja=77;break}Na=Ha+52|0;Ia=OA(Ha,c[Na>>2]|0)|0;Da=Ha+56|0;c[Da>>2]=Ia;if((Ia|0)==24){n=Ha+152|0;c[n>>2]=c[n>>2]|520}else if((Ia|0)==21){n=Ha+152|0;c[n>>2]=c[n>>2]|1}else if((Ia|0)==999){Ja=83;break}else{Ia=ew(s,106184)|0;do{if((Ia|0)==0){Ja=94}else{n=a[Ia]|0;if((n<<24>>24|0)==101){if((Ya(Ia+1|0,105256)|0)==0){Oa=16;break}else{Ja=94;break}}else if((n<<24>>24|0)==110){if((Ya(Ia+1|0,105664)|0)==0){Oa=1;break}else{Ja=94;break}}else{Ja=94;break}}}while(0);if((Ja|0)==94){Ja=0;Oa=0}Ia=Ha+152|0;c[Ia>>2]=c[Ia>>2]|Oa}Ia=c[Fa>>2]|0;d:do{if((Ia|0)==0){c[44738]=0;Ja=103}else{do{if((c[Ia+152>>2]&32|0)!=0){if((Ya(c[Na>>2]|0,c[Ia+52>>2]|0)|0)!=0){break}n=c[44738]|0;if((n|0)==0){Ja=103;break d}c[n+8>>2]=Ha;c[Ha+36>>2]=c[(c[44738]|0)+36>>2];Ja=105;break d}}while(0);QA(Ia);c[Fa>>2]=0;c[Ga>>2]=0;c[44738]=0;Ja=103}}while(0);do{if((Ja|0)==103){Ja=0;if((PA(Ha)|0)!=0){break}c[Fa>>2]=Ha;Ja=105}}while(0);if((Ja|0)==105){Ja=0;c[Ha+8>>2]=0;c[Ha+104>>2]=25400;Ia=Ha|0;Y=c[Ia>>2]|0;do{if((a[Y+292|0]|0)==0){if((c[Da>>2]|0)==300){z=+h[(c[Ha+68>>2]|0)+8>>3];h[Ha+248>>3]=z;h[Ha+240>>3]=z;break}else{h[Ha+248>>3]=4.0;h[Ha+240>>3]=4.0;break}}else{n=Ha+240|0;y=Y+216|0;c[n>>2]=c[y>>2];c[n+4>>2]=c[y+4>>2];c[n+8>>2]=c[y+8>>2];c[n+12>>2]=c[y+12>>2]}}while(0);e:do{if((a[Y+293|0]|0)==0){switch(c[Da>>2]|0){case 2:case 3:case 4:case 22:case 21:case 30:{h[Ha+424>>3]=36.0;h[Ha+416>>3]=36.0;break e;break};case 300:{y=Ha+416|0;n=(c[Ha+84>>2]|0)+8|0;c[y>>2]=c[n>>2];c[y+4>>2]=c[n+4>>2];c[y+8>>2]=c[n+8>>2];c[y+12>>2]=c[n+12>>2];break e;break};default:{vF(Ha+416|0,0,16)|0;break e}}}else{n=Ha+416|0;y=Y+200|0;c[n>>2]=c[y>>2];c[n+4>>2]=c[y+4>>2];c[n+8>>2]=c[y+8>>2];c[n+12>>2]=c[y+12>>2]}}while(0);y=c[Y+192>>2]|0;z=+h[(c[(c[u>>2]|0)+8>>2]|0)+24>>3];f:do{if(z!=0.0){h[Ha+440>>3]=z;h[Ha+432>>3]=z}else{do{if((y|0)!=0){if((a[y+128|0]|0)==0){break}n=Ha+432|0;r=y+112|0;c[n>>2]=c[r>>2];c[n+4>>2]=c[r+4>>2];c[n+8>>2]=c[r+8>>2];c[n+12>>2]=c[r+12>>2];break f}}while(0);r=Ha+432|0;if((c[Da>>2]|0)==300){n=r;P=(c[Ha+84>>2]|0)+40|0;c[n>>2]=c[P>>2];c[n+4>>2]=c[P+4>>2];c[n+8>>2]=c[P+8>>2];c[n+12>>2]=c[P+12>>2];break}else{h[Ha+440>>3]=96.0;h[r>>3]=96.0;break}}}while(0);z=+h[Y+272>>3];aa=+h[Y+280>>3];ba=+h[Y+256>>3];ca=+h[Y+264>>3];za=+h[Ha+240>>3];Aa=ba-za;h[Ha+208>>3]=Aa;Ba=+h[Ha+248>>3];Ca=ca-Ba;h[Ha+216>>3]=Ca;va=z+za;h[Ha+224>>3]=va;za=aa+Ba;h[Ha+232>>3]=za;Ba=va-Aa;Aa=za-Ca;h[j>>3]=1.0;Da=c[(c[u>>2]|0)+8>>2]|0;Ca=+h[Da+64>>3];do{if(Ca>.001){za=+h[Da+72>>3];if(za<=.001){Pa=Aa;Qa=Ba;Ra=1.0;break}va=Ba==0.0?Ca:Ba;wa=Aa==0.0?za:Aa;if(!(Ca<va|za<wa)){if(!((a[Da+80|0]|0)!=0&Ca>va&za>wa)){Pa=wa;Qa=va;Ra=1.0;break}}xa=Ca/va;ya=za/wa;za=xa<ya?xa:ya;h[j>>3]=za;Pa=wa;Qa=va;Ra=za}else{Pa=Aa;Qa=Ba;Ra=1.0}}while(0);Ba=(z+ba)*.5;h[k>>3]=Ba;Aa=(aa+ca)*.5;h[l>>3]=Aa;Da=Ha+360|0;c[Da>>2]=c[Y+288>>2];h[f>>3]=Ra*Qa;h[g>>3]=Ra*Pa;y=ew(s,108712)|0;if((y|0)==0){Sa=Ba;Ta=Aa}else{r=dF((xF(y|0)|0)+1|0)|0;P=dF((xF(y|0)|0)+1|0)|0;n=ac(y|0,107704,(v=i,i=i+32|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,c[v+24>>2]=r,v)|0)|0;i=v;do{if((n|0)==4){N=Ax(c[m>>2]|0,r,0)|0;if((N|0)==0){break}O=N+8|0;h[k>>3]=+h[(c[O>>2]|0)+16>>3];h[l>>3]=+h[(c[O>>2]|0)+24>>3]}else{O=ac(y|0,107056,(v=i,i=i+40|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,c[v+24>>2]=r,c[v+32>>2]=P,v)|0)|0;i=v;if((O|0)!=4){ac(y|0,106592,(v=i,i=i+40|0,c[v>>2]=f,c[v+8>>2]=g,c[v+16>>2]=j,c[v+24>>2]=k,c[v+32>>2]=l,v)|0)|0;i=v;break}O=Ax(c[m>>2]|0,r,0)|0;if((O|0)==0){break}N=O+8|0;h[k>>3]=+h[(c[N>>2]|0)+16>>3];h[l>>3]=+h[(c[N>>2]|0)+24>>3]}}while(0);eF(r);eF(P);Sa=+h[k>>3];Ta=+h[l>>3]}y=Ha+368|0;h[y>>3]=+h[f>>3];n=Ha+376|0;h[n>>3]=+h[g>>3];Y=Ha+352|0;h[Y>>3]=+h[j>>3];h[Ha+336>>3]=Sa;h[Ha+344>>3]=Ta;N=c[Ia>>2]|0;ca=+h[y>>3];aa=+h[n>>3];n=(c[Da>>2]|0)==0;ba=n?aa:ca;z=n?ca:aa;aa=+h[Ha+416>>3];ca=+h[Ha+424>>3];do{if((a[N+294|0]|0)==0){Ja=149}else{if((c[Ha+152>>2]&32|0)==0){Ja=149;break}Aa=+h[N+232>>3]-aa*2.0;Ba=+h[N+240>>3]-ca*2.0;do{if(Aa<1.0e-4){c[Ha+164>>2]=1;Ua=1}else{n=~~(z/Aa);y=Ha+164|0;c[y>>2]=n;if(z-Aa*+(n|0)<=1.0e-4){Ua=n;break}O=n+1|0;c[y>>2]=O;Ua=O}}while(0);do{if(Ba<1.0e-4){c[Ha+168>>2]=1;Va=1}else{O=~~(ba/Ba);y=Ha+168|0;c[y>>2]=O;if(ba-Ba*+(O|0)<=1.0e-4){Va=O;break}n=O+1|0;c[y>>2]=n;Va=n}}while(0);c[Ha+204>>2]=da(Va,Ua)|0;Wa=z<Aa?z:Aa;Xa=ba<Ba?ba:Ba;Za=Aa;_a=Ba;$a=Va;ab=Ua}}while(0);do{if((Ja|0)==149){Ja=0;do{if((c[Ha+68>>2]|0)==0){bb=0.0;cb=0.0}else{Ia=c[Ha+84>>2]|0;Ca=+h[Ia+24>>3]-aa*2.0;za=Ca<0.0?0.0:Ca;Ca=+h[Ia+32>>3]-ca*2.0;if(Ca>=0.0){bb=za;cb=Ca;break}bb=za;cb=0.0}}while(0);c[Ha+204>>2]=1;c[Ha+168>>2]=1;c[Ha+164>>2]=1;Ba=bb<z?z:bb;if(cb>=ba){Wa=z;Xa=ba;Za=Ba;_a=cb;$a=1;ab=1;break}Wa=z;Xa=ba;Za=Ba;_a=ba;$a=1;ab=1}}while(0);Ia=Ha+432|0;ba=(aa*2.0+Za)*+h[Ia>>3]/72.0;if(ba<0.0){db=ba+-.5}else{db=ba+.5}c[Ha+448>>2]=~~db;P=Ha+440|0;ba=(ca*2.0+_a)*+h[P>>3]/72.0;if(ba<0.0){eb=ba+-.5}else{eb=ba+.5}c[Ha+452>>2]=~~eb;r=Ha+188|0;n=Ha+180|0;y=Ha+176|0;O=Ha+172|0;Q=N+196|0;vF(O|0,0,24)|0;q=a[c[Q>>2]|0]|0;if((q|0)==66){fb=0;gb=0;hb=1;ib=0}else if((q|0)==76){fb=0;gb=1;hb=0;ib=0}else if((q|0)==82){c[O>>2]=ab-1;fb=0;gb=-1;hb=0;ib=0}else if((q|0)==84){c[y>>2]=$a-1;fb=0;gb=0;hb=-1;ib=0}else{fb=0;gb=0;hb=0;ib=0}q=n;c[q>>2]=gb|ib;c[q+4>>2]=fb|hb;n=a[(c[Q>>2]|0)+1|0]|0;L=gb;M=hb;if((n|0)==66){jb=0;kb=0;lb=1;mb=0}else if((n|0)==76){jb=0;kb=1;lb=0;mb=0}else if((n|0)==82){c[O>>2]=ab-1;jb=0;kb=-1;lb=0;mb=0}else if((n|0)==84){c[y>>2]=$a-1;jb=0;kb=0;lb=-1;mb=0}else{jb=0;kb=0;lb=0;mb=0}y=r;c[y>>2]=kb|mb;c[y+4>>2]=jb|lb;r=kb+L|0;if((((r|0)>-1?r:-r|0)|0)==1){r=lb+M|0;if((((r|0)>-1?r:-r|0)|0)!=1){Ja=172}}else{Ja=172}if((Ja|0)==172){Ja=0;c[q>>2]=0;c[q+4>>2]=1;c[y>>2]=1;c[y+4>>2]=0;Fv(0,109544,(v=i,i=i+8|0,c[v>>2]=c[Q>>2],v)|0)|0;i=v}do{if((a[(c[(c[u>>2]|0)+8>>2]|0)+82|0]|0)==0){nb=0.0;ob=0.0}else{if(Za>Wa){pb=(Za-Wa)*.5}else{pb=0.0}if(_a<=Xa){nb=pb;ob=0.0;break}nb=pb;ob=(_a-Xa)*.5}}while(0);N=(c[Da>>2]|0)==0;ba=N?Xa:Wa;z=N?Wa:Xa;Ba=(N?aa:ca)+(N?nb:ob);h[Ha+384>>3]=Ba;Aa=(N?ca:aa)+(N?ob:nb);h[Ha+392>>3]=Aa;za=z+Ba;h[Ha+400>>3]=za;Ca=ba+Aa;h[Ha+408>>3]=Ca;va=+h[Y>>3];h[Ha+320>>3]=z/va;h[Ha+328>>3]=ba/va;va=+h[Ia>>3];ba=Ba*va/72.0;if(ba<0.0){qb=ba+-.5}else{qb=ba+.5}Q=~~qb;y=Ha+456|0;c[y>>2]=Q;ba=+h[P>>3];Ba=Aa*ba/72.0;if(Ba<0.0){rb=Ba+-.5}else{rb=Ba+.5}q=~~rb;c[Ha+460>>2]=q;Ba=za*va/72.0;if(Ba<0.0){sb=Ba+-.5}else{sb=Ba+.5}r=~~sb;M=Ha+464|0;c[M>>2]=r;Ba=Ca*ba/72.0;if(Ba<0.0){tb=Ba+-.5}else{tb=Ba+.5}L=~~tb;c[Ha+468>>2]=L;if(!N){N=y;c[N>>2]=q;c[N+4>>2]=Q;Q=M;c[Q>>2]=L;c[Q+4>>2]=r}if((c[Ha+152>>2]&128|0)==0){Rh(Ha,d)}c[44738]=Ha}Ha=EA(b)|0;if((Ha|0)==0){break c}}if((Ja|0)==77){Fv(1,111648,(v=i,i=i+1|0,i=i+7&-8,c[v>>2]=0,v)|0)|0;i=v;Ha=c[44736]|0;do{if((Ha|0)>0){m=Ha-1|0;c[44736]=m;if((m|0)!=0){break}Ab(1,c[44734]|0)|0;eF(c[44734]|0)}}while(0);if((a[213992]|0)==0){w=-1;i=e;return w|0}Ha=c[o>>2]|0;m=$w(s)|0;Ba=+zm();gc(Ha|0,112248,(v=i,i=i+16|0,c[v>>2]=m,h[v+8>>3]=Ba,v)|0)|0;i=v;w=-1;i=e;return w|0}else if((Ja|0)==83){Fv(1,111e3,(v=i,i=i+8|0,c[v>>2]=c[Na>>2],v)|0)|0;i=v;m=c[44736]|0;do{if((m|0)>0){Ha=m-1|0;c[44736]=Ha;if((Ha|0)!=0){break}Ab(1,c[44734]|0)|0;eF(c[44734]|0)}}while(0);if((a[213992]|0)==0){w=-1;i=e;return w|0}m=c[o>>2]|0;Ha=$w(s)|0;Ba=+zm();gc(m|0,112248,(v=i,i=i+16|0,c[v>>2]=Ha,h[v+8>>3]=Ba,v)|0)|0;i=v;w=-1;i=e;return w|0}}}while(0);Na=c[44736]|0;do{if((Na|0)>0){Ja=Na-1|0;c[44736]=Ja;if((Ja|0)!=0){break}Ab(1,c[44734]|0)|0;eF(c[44734]|0)}}while(0);if((a[213992]|0)==0){w=0;i=e;return w|0}Na=c[o>>2]|0;Ja=$w(s)|0;tb=+zm();gc(Na|0,112248,(v=i,i=i+16|0,c[v>>2]=Ja,h[v+8>>3]=tb,v)|0)|0;i=v;w=0;i=e;return w|0}function $h(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;g=i;i=i+160|0;h=g+128|0;j=g+136|0;k=g+144|0;c[h>>2]=0;c[j>>2]=0;Iv(k,128,g|0);Lv(k,f)|0;f=k+4|0;l=c[f>>2]|0;if(l>>>0<(c[k+8>>2]|0)>>>0){m=l}else{Jv(k,1)|0;m=c[f>>2]|0}a[m]=0;m=c[k>>2]|0;c[f>>2]=m;f=b+300|0;l=b+296|0;n=b+308|0;o=b+312|0;b=m;while(1){m=ec(b|0,c[f>>2]|0,h|0)|0;if((m|0)==0){p=0;q=43;break}r=ec(m|0,c[l>>2]|0,j|0)|0;m=(r|0)!=0;if(m){s=ec(0,c[l>>2]|0,j|0)|0}else{s=0}t=((s|0)!=0)+(m&1)|0;if((t|0)==1){m=a[r]|0;if((m<<24>>24|0)==0){q=12}else if((m<<24>>24|0)==97){if((Ya(r|0,103064)|0)==0){u=d}else{v=97;w=r;q=10}}else{v=m;w=r;q=10}a:do{if((q|0)==10){while(1){q=0;x=w+1|0;if(((v&255)-48|0)>>>0>=10>>>0){break}y=a[x]|0;if(y<<24>>24==0){q=12;break a}else{v=y;w=x;q=10}}x=c[n>>2]|0;if((x|0)==0){u=-1;break}y=c[o>>2]|0;if((y|0)<1){u=-1;break}else{z=1}while(1){A=c[x+(z<<2)>>2]|0;if(m<<24>>24==(a[A]|0)){if((Ya(r|0,A|0)|0)==0){u=z;break a}}if((z|0)<(y|0)){z=z+1|0}else{u=-1;break}}}}while(0);if((q|0)==12){q=0;u=Rb(r|0)|0}B=(u|0)==(d|0)}else if((t|0)==2){m=a[r]|0;if((m<<24>>24|0)==97){if((Ya(r|0,103064)|0)==0){C=0}else{D=97;E=r;q=21}}else if((m<<24>>24|0)==0){q=23}else{D=m;E=r;q=21}b:do{if((q|0)==21){while(1){q=0;y=E+1|0;if(((D&255)-48|0)>>>0>=10>>>0){break}x=a[y]|0;if(x<<24>>24==0){q=23;break b}else{D=x;E=y;q=21}}y=c[n>>2]|0;if((y|0)==0){C=-1;break}x=c[o>>2]|0;if((x|0)<1){C=-1;break}else{F=1}while(1){A=c[y+(F<<2)>>2]|0;if(m<<24>>24==(a[A]|0)){if((Ya(r|0,A|0)|0)==0){C=F;break b}}if((F|0)<(x|0)){F=F+1|0}else{C=-1;break}}}}while(0);if((q|0)==23){q=0;C=Rb(r|0)|0}m=a[s]|0;if((m<<24>>24|0)==97){if((Ya(s|0,103064)|0)==0){G=e}else{H=97;I=s;q=31}}else if((m<<24>>24|0)==0){q=33}else{H=m;I=s;q=31}c:do{if((q|0)==31){while(1){q=0;t=I+1|0;if(((H&255)-48|0)>>>0>=10>>>0){break}x=a[t]|0;if(x<<24>>24==0){q=33;break c}else{H=x;I=t;q=31}}t=c[n>>2]|0;if((t|0)==0){G=-1;break}x=c[o>>2]|0;if((x|0)<1){G=-1;break}else{J=1}while(1){y=c[t+(J<<2)>>2]|0;if(m<<24>>24==(a[y]|0)){if((Ya(s|0,y|0)|0)==0){G=J;break c}}if((J|0)<(x|0)){J=J+1|0}else{G=-1;break}}}}while(0);if((q|0)==33){q=0;G=Rb(s|0)|0}if((G&C|0)<=-1){b=0;continue}m=(C|0)>(G|0);if(((m?G:C)|0)>(d|0)){b=0;continue}B=((m?C:G)|0)>=(d|0)}else{b=0;continue}if(B){p=B&1;q=43;break}else{b=0}}if((q|0)==43){Mv(k);i=g;return p|0}return 0}function ai(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;d=i;e=b;b=i;i=i+48|0;tF(b,e,48)|0;e=c[b+4>>2]|0;if((e|0)<=0){cc(93584,102832,3865,171016)}if(((e|0)%3|0|0)!=1){cc(93080,102832,3866,171016)}f=c[b>>2]|0;g=+h[f>>3];j=+h[f+8>>3];if((e|0)>1){k=1;l=j;m=g;n=j;o=g}else{p=j;q=g;r=j;s=g;t=a|0;h[t>>3]=q;u=a+8|0;h[u>>3]=p;v=a+16|0;h[v>>3]=s;w=a+24|0;h[w>>3]=r;i=d;return}while(1){b=k+1|0;x=k+2|0;g=(+h[f+(k<<4)>>3]+ +h[f+(b<<4)>>3])*.5;j=(+h[f+(k<<4)+8>>3]+ +h[f+(b<<4)+8>>3])*.5;y=m<g?m:g;z=l<j?l:j;A=o>g?o:g;g=n>j?n:j;j=+h[f+(x<<4)>>3];B=+h[f+(x<<4)+8>>3];C=y<j?y:j;y=z<B?z:B;z=A>j?A:j;j=g>B?g:B;x=k+3|0;if((x|0)<(e|0)){k=x;l=y;m=C;n=j;o=z}else{p=y;q=C;r=j;s=z;break}}t=a|0;h[t>>3]=q;u=a+8|0;h[u>>3]=p;v=a+16|0;h[v>>3]=s;w=a+24|0;h[w>>3]=r;i=d;return}function bi(a,d,e,f,g,i,j){a=a|0;d=+d;e=+e;f=f|0;g=g|0;i=i|0;j=j|0;var k=0;j=c[a+16>>2]|0;if(f<<24>>24==0){k=c[j+208>>2]|0}else{k=g}do{if(i<<24>>24==0){if(!((k|0)==0&(b[j+260>>1]&1)==0)){break}return}}while(0);k=c[a+152>>2]|0;if((k&4259840|0)==0){return}i=(k&131072|0)!=0;g=j+264|0;if(i){c[g>>2]=0;c[j+268>>2]=2}else{c[g>>2]=2;c[j+268>>2]=4}g=j+272|0;eF(c[g>>2]|0);f=jk(c[j+268>>2]<<4)|0;j=f;c[g>>2]=j;h[f>>3]=d+-3.0;h[f+8>>3]=e+-3.0;h[f+16>>3]=d+3.0;h[f+24>>3]=e+3.0;if((k&8192|0)==0){RA(a,j,j,2)|0}if(i){return}qi(j);return}function ci(b,d,e,f,g,j,k,l,m){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;l=l|0;m=m|0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0;n=i;i=i+64|0;o=n|0;p=n+48|0;q=c[b+152>>2]|0;if((d|0)==0){i=n;return}if((a[d+81|0]|0)==0){i=n;return}if((l|0)==0){r=0}else{s=jk((xF(l|0)|0)+11|0)|0;if((e|0)==7){t=89496}else if((e|0)==11){t=90024}else if((e|0)==6){t=89080}else{cc(88624,102832,2642,170728)}nb(s|0,88176,(u=i,i=i+16|0,c[u>>2]=l,c[u+8>>2]=t,u)|0)|0;i=u;r=s}s=b+16|0;u=(c[s>>2]|0)+12|0;t=c[u>>2]|0;c[u>>2]=e;u=(g|0)==0&(f|0)==0;do{if(!u){if((q&4|0)!=0){break}di(b,d);gB(b,g,j,k,r)}}while(0);ek(b,e,d);a:do{if((m|0)!=0){e=p;f=c[d>>2]|0;l=a[f]|0;if(l<<24>>24==0){break}else{v=f;w=l}while(1){l=v+1|0;if((Qa(w&255|0)|0)==0){break}f=a[l]|0;if(f<<24>>24==0){break a}else{v=l;w=f}}if((a[v]|0)==0){break}x=+h[d+24>>3];f=d+56|0;y=x*.5+ +h[f>>3];z=+h[d+64>>3]- +h[d+32>>3]*.5;h[o>>3]=y;h[o+8>>3]=z;h[o+16>>3]=y-x;h[o+24>>3]=z;Wm(p,m,f);f=o+32|0;c[f>>2]=c[e>>2];c[f+4>>2]=c[e+4>>2];c[f+8>>2]=c[e+8>>2];c[f+12>>2]=c[e+12>>2];pB(b,c[(c[b>>2]|0)+336>>2]|0);lB(b,c[d+8>>2]|0);uB(b,o|0,3)}}while(0);if(!u){if((q&4|0)!=0){di(b,d);gB(b,g,j,k,r)}hB(b)}if((r|0)!=0){eF(r)}c[(c[s>>2]|0)+12>>2]=t;i=n;return}function di(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0;d=c[a+16>>2]|0;e=c[a+152>>2]|0;if((e&4259840|0)==0){return}f=(e&131072|0)!=0;g=d+264|0;if(f){c[g>>2]=0;c[d+268>>2]=2}else{c[g>>2]=2;c[d+268>>2]=4}g=d+272|0;eF(c[g>>2]|0);i=jk(c[d+268>>2]<<4)|0;d=i;c[g>>2]=d;g=b+56|0;j=b+24|0;h[i>>3]=+h[g>>3]- +h[j>>3]*.5;k=b+64|0;l=b+32|0;h[i+8>>3]=+h[k>>3]- +h[l>>3]*.5;h[i+16>>3]=+h[g>>3]+ +h[j>>3]*.5;h[i+24>>3]=+h[k>>3]+ +h[l>>3]*.5;if((e&8192|0)==0){RA(a,d,d,2)|0}if(f){return}qi(d);return}function ei(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=1;f=b;while(1){b=a[f]|0;if((b<<24>>24|0)==0){break}else if((b<<24>>24|0)==58){g=e+1|0}else{g=e}e=g;f=f+1|0}f=da((xF(d|0)|0)+1|0,e)|0;if((c[45192]|0)<(f|0)){g=f+10|0;c[45192]=g;c[45194]=gF(c[45194]|0,g)|0}zF(c[45194]|0,d|0)|0;g=e-1|0;e=c[45194]|0;if((g|0)==0){h=e;return h|0}else{i=g;j=e}while(1){e=j+(xF(j|0)|0)|0;z=58;a[e]=z;z=z>>8;a[e+1|0]=z;AF(c[45194]|0,d|0)|0;e=i-1|0;g=c[45194]|0;if((e|0)==0){h=g;break}else{i=e;j=g}}return h|0}function fi(a,b,c){a=+a;b=+b;c=+c;return+((1.0-a/b)*c*.5)}function gi(a,b,c){a=+a;b=+b;c=+c;return+(a/b*c*.5)}function hi(a,b,c){a=+a;b=+b;c=+c;var d=0.0,e=0.0;d=a/b;if(d>.5){e=1.0-d}else{e=d}return+(e*c)}function ii(a,b,c){a=+a;b=+b;c=+c;return+(c*.5)}function ji(a,b,d,e){a=a|0;b=+b;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0,y=0.0,z=0,A=0.0,B=0,C=0.0,D=0;f=i;i=i+32|0;g=f+16|0;j=c[a+4>>2]|0;k=j-1|0;l=(k|0)/3|0;if((j-4|0)>>>0<3>>>0){c[d+4>>2]=4;j=d|0;c[j>>2]=jk(64)|0;c[e+4>>2]=4;m=jk(64)|0;c[e>>2]=m;Qm(f|0,c[a>>2]|0,3,b,c[j>>2]|0,m);i=f;return}m=jk(l<<3)|0;j=m;n=a|0;a=(k|0)>2;a:do{if(a){o=0.0;k=c[n>>2]|0;p=0;while(1){q=+h[k+16>>3];r=+h[k>>3]-q;s=+h[k+24>>3];t=+h[k+8>>3]-s;u=+T(r*r+t*t);t=+h[k+32>>3];r=q-t;q=+h[k+40>>3];v=s-q;s=u+ +T(r*r+v*v);v=t- +h[k+48>>3];t=q- +h[k+56>>3];q=s+ +T(v*v+t*t);h[j+(p<<3)>>3]=q;w=o+q;x=p+1|0;if((x|0)<(l|0)){o=w;k=k+48|0;p=x}else{break}}o=b*w;if(a){y=0.0;z=0}else{A=0.0;B=0;C=o;break}while(1){q=y+ +h[j+(z<<3)>>3];p=z+1|0;if(q>=o){A=q;B=z;C=o;break a}if((p|0)<(l|0)){y=q;z=p}else{A=q;B=p;C=o;break}}}else{A=0.0;B=0;C=b*0.0}}while(0);z=B*3|0;a=z+4|0;p=d+4|0;c[p>>2]=a;k=d|0;c[k>>2]=jk(a<<4)|0;a=((l-B|0)*3|0)+1|0;l=e+4|0;c[l>>2]=a;d=e|0;c[d>>2]=jk(a<<4)|0;if((c[p>>2]|0)>0){a=0;while(1){e=(c[k>>2]|0)+(a<<4)|0;x=(c[n>>2]|0)+(a<<4)|0;c[e>>2]=c[x>>2];c[e+4>>2]=c[x+4>>2];c[e+8>>2]=c[x+8>>2];c[e+12>>2]=c[x+12>>2];x=a+1|0;if((x|0)<(c[p>>2]|0)){a=x}else{break}}D=a-3|0}else{D=-4}b:do{if((c[l>>2]|0)>0){a=D;p=0;while(1){x=(c[d>>2]|0)+(p<<4)|0;e=(c[n>>2]|0)+(a<<4)|0;c[x>>2]=c[e>>2];c[x+4>>2]=c[e+4>>2];c[x+8>>2]=c[e+8>>2];c[x+12>>2]=c[e+12>>2];e=p+1|0;if((e|0)>=(c[l>>2]|0)){break b}a=a+1|0;p=e}}}while(0);b=+h[j+(B<<3)>>3];Qm(g,(c[n>>2]|0)+(z<<4)|0,3,(C-(A-b))/b,(c[k>>2]|0)+(z<<4)|0,c[d>>2]|0);eF(m);i=f;return}function ki(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0,j=0,k=0,l=0.0;d=i;i=i+144|0;e=a+48|0;f=+ui(a,e,a+16|0);if(!(f<4.0&+ui(a,e,a+32|0)<4.0)){g=d|0;j=d+64|0;Qm(d+128|0,a,3,.5,g,j);k=ki(j,ki(g,b)|0)|0;i=d;return k|0}g=b+16|0;if((c[g>>2]|0)==1){c[g>>2]=0;j=b;b=a;c[j>>2]=c[b>>2];c[j+4>>2]=c[b+4>>2];c[j+8>>2]=c[b+8>>2];c[j+12>>2]=c[b+12>>2]}f=+h[e>>3];l=+h[a+56>>3];a=kk(24)|0;e=a;c[a+16>>2]=0;h[a>>3]=f;h[a+8>>3]=l;c[g>>2]=e;k=e;i=d;return k|0}function li(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=b+156|0;if((c[f>>2]|0)<2){g=1;return g|0}h=Hm(e|0,c[53612]|0,213440)|0;i=b|0;j=b+160|0;if(($h(c[i>>2]|0,c[j>>2]|0,c[f>>2]|0,h)|0)<<24>>24!=0){g=1;return g|0}if((a[h]|0)!=0){g=0;return g|0}if((rw(d,e)|0)==0){g=1;return g|0}h=rw(d,e)|0;if((h|0)==0){g=0;return g|0}else{k=h}while(1){h=Hm(k|0,c[53776]|0,213440)|0;if((a[h]|0)==0){g=1;l=9;break}if(($h(c[i>>2]|0,c[j>>2]|0,c[f>>2]|0,h)|0)<<24>>24!=0){g=1;l=9;break}h=sw(d,k,e)|0;if((h|0)==0){g=0;l=9;break}else{k=h}}if((l|0)==9){return g|0}return 0}function mi(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+144|0;g=f+128|0;h=ew(e,83344)|0;j=ew(e,166968)|0;k=ew(e,78880)|0;Iv(g,128,f|0);if((d|0)==0){l=0}else{l=c[d>>2]|0}if((h|0)==0){m=5}else{if((a[h]|0)==0){m=5}else{n=h}}if((m|0)==5){n=ew(e,82904)|0}Hh(b,l,n,j,k,Ih(b,e,g)|0,e)|0;Mv(g);i=f;return}function ni(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function oi(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=d+8|0;d=c[e>>2]|0;if((c[d+172>>2]|0)<1){return}else{f=1;g=d}while(1){d=c[(c[g+176>>2]|0)+(f<<2)>>2]|0;oi(b,d);h=d|0;d=ew(h,123768)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=ew(h,121832)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=ew(h,120224)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=ew(h,121048)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}nB(b,d)}}while(0);d=ew(h,160752)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}lB(b,d)}}while(0);d=c[e>>2]|0;if((f|0)<(c[d+172>>2]|0)){f=f+1|0;g=d}else{break}}return}function pi(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0,l=0.0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+32|0;tF(d,f,32)|0;g=+h[a>>3];j=+h[d>>3];f=g<j;do{if(f){k=0}else{if(g>+h[d+16>>3]){k=0;break}l=+h[a+8>>3];if(l<+h[d+8>>3]){k=0;break}k=l<=+h[d+24>>3]|0}}while(0);l=+h[b>>3];do{if(l<j){m=0}else{if(l>+h[d+16>>3]){m=0;break}n=+h[b+8>>3];if(n<+h[d+8>>3]){m=0;break}m=n<=+h[d+24>>3]|0}}while(0);if((k|0)!=(m|0)){o=0;i=e;return o|0}if((k|0)!=0){o=1;i=e;return o|0}n=+h[a+8>>3];do{if(g==l){p=+h[d+8>>3];if(f|n>=p^+h[b+8>>3]>=p^1){break}if(g>+h[d+16>>3]){break}else{o=0}i=e;return o|0}else{p=+h[b+8>>3];if(n==p){if(!(g>=j^l>=j)){break}if(n<+h[d+8>>3]){break}if(n>+h[d+24>>3]){break}else{o=0}i=e;return o|0}q=(p-n)/(l-g);a=g<l;r=a?g:l;s=a?l:g;t=n+q*(j-g);u=+h[d+8>>3];do{if(!(j<r|j>s|t<u)){if(t>+h[d+24>>3]){break}else{o=0}i=e;return o|0}}while(0);v=+h[d+16>>3];w=t+q*(v-j);do{if(w>=u){if(w>+h[d+24>>3]|v<r|v>s){break}else{o=0}i=e;return o|0}}while(0);a=n<p;s=a?n:p;r=a?p:n;w=g+(u-n)/q;do{if(w>=j){if(w>v|u<s|u>r){break}else{o=0}i=e;return o|0}}while(0);p=+h[d+24>>3];t=w+(p-u)/q;if(t<j){break}if(t>v|p<s|p>r){break}else{o=0}i=e;return o|0}}while(0);o=-1;i=e;return o|0}function qi(a){a=a|0;var b=0,c=0.0;b=a+16|0;c=+h[b>>3];h[a+32>>3]=c;h[a+48>>3]=c;h[a+40>>3]=+h[a+24>>3];h[a+56>>3]=+h[a+8>>3];h[b>>3]=+h[a>>3];return}function ri(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=b|0;g=+h[f>>3];j=b+8|0;k=+h[j>>3];l=d;while(1){if((l|0)==0){break}else if((l|0)==270){m=5;break}else if((l|0)==90){m=3;break}else if((l|0)==180){m=4;break}if((l|0)<0){m=7;break}if((l|0)<=360){m=10;break}l=(l|0)%360|0}if((m|0)==3){h[f>>3]=k;h[j>>3]=-0.0-g}else if((m|0)==4){h[f>>3]=g;h[j>>3]=-0.0-k}else if((m|0)==5){h[f>>3]=k;h[j>>3]=g}else if((m|0)==7){si(a,b,-l|0);i=e;return}else if((m|0)==10){if((c[43782]|0)==(l|0)){n=+h[1491];o=+h[1490]}else{p=+(l|0)/6.283185307179586;q=+W(p);h[1490]=q;r=+V(p);h[1491]=r;c[43782]=l;n=r;o=q}h[a>>3]=g*n-k*o;h[a+8>>3]=g*o+k*n;i=e;return}l=a;a=b;c[l>>2]=c[a>>2];c[l+4>>2]=c[a+4>>2];c[l+8>>2]=c[a+8>>2];c[l+12>>2]=c[a+12>>2];i=e;return}function si(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;e=i;f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=b|0;g=+h[f>>3];j=b+8|0;k=+h[j>>3];l=d;while(1){if((l|0)==90){m=3;break}else if((l|0)==0){break}else if((l|0)==270){m=5;break}else if((l|0)==180){m=4;break}if((l|0)<0){m=7;break}if((l|0)<=360){m=10;break}l=(l|0)%360|0}if((m|0)==3){h[f>>3]=-0.0-k;h[j>>3]=g}else if((m|0)==4){h[f>>3]=g;h[j>>3]=-0.0-k}else if((m|0)==5){h[f>>3]=k;h[j>>3]=g}else if((m|0)==7){ri(a,b,-l|0);i=e;return}else if((m|0)==10){m=360-l|0;if((c[43782]|0)==(m|0)){n=+h[1491];o=+h[1490]}else{p=+(m|0)/6.283185307179586;q=+W(p);h[1490]=q;r=+V(p);h[1491]=r;c[43782]=m;n=r;o=q}h[a>>3]=g*n-k*o;h[a+8>>3]=g*o+k*n;i=e;return}m=a;a=b;c[m>>2]=c[a>>2];c[m+4>>2]=c[a+4>>2];c[m+8>>2]=c[a+8>>2];c[m+12>>2]=c[a+12>>2];i=e;return}function ti(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0;e=i;f=b;b=i;i=i+32|0;tF(b,f,32)|0;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[d>>3];j=+h[d+8>>3];k=+h[b>>3]+j;l=+h[b+24>>3]+g;m=+h[b+16>>3]+j;h[a>>3]=+h[b+8>>3]+g;h[a+8>>3]=k;h[a+16>>3]=l;h[a+24>>3]=m;i=e;return}function ui(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0;e=i;f=a;a=i;i=i+16|0;c[a>>2]=c[f>>2];c[a+4>>2]=c[f+4>>2];c[a+8>>2]=c[f+8>>2];c[a+12>>2]=c[f+12>>2];f=b;b=i;i=i+16|0;c[b>>2]=c[f>>2];c[b+4>>2]=c[f+4>>2];c[b+8>>2]=c[f+8>>2];c[b+12>>2]=c[f+12>>2];f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];g=+h[a>>3];j=+h[b>>3]-g;k=+h[a+8>>3];l=+h[b+8>>3]-k;m=j*(+h[d+8>>3]-k)-l*(+h[d>>3]-g);g=m*m;if(g<1.0e-10){n=0.0;i=e;return+n}n=g/(j*j+l*l);i=e;return+n}function vi(b){b=b|0;var d=0,e=0,f=0;d=i;if((a[174897]|0)!=0){i=d;return}a[174897]=1;e=zd(c[43716]|0)|0;Fv(1,120352,(f=i,i=i+16|0,c[f>>2]=b,c[f+8>>2]=e,f)|0)|0;i=f;wi();i=d;return}function wi(){var b=0,d=0,e=0,f=0,g=0;b=i;d=c[43719]|0;c[d+4>>2]=c[d>>2];d=c[43728]|0;if((d|0)>0){Kv(c[43719]|0,c[43726]|0,d)|0}Kv(c[43719]|0,c[43725]|0,c[43727]|0)|0;d=c[43719]|0;e=c[d+4>>2]|0;if(e>>>0<(c[d+8>>2]|0)>>>0){f=d;g=e}else{Jv(d,1)|0;d=c[43719]|0;f=d;g=c[d+4>>2]|0}c[f+4>>2]=g+1;a[g]=0;g=c[43719]|0;f=c[g>>2]|0;c[g+4>>2]=f;Fv(3,79472,(g=i,i=i+8|0,c[g>>2]=f,g)|0)|0;i=g;i=b;return}function xi(b,e,f){b=b|0;e=e|0;f=f|0;c[43719]=e;Iv(174880,128,0);c[43717]=b;a[174899]=0;a[174896]=0;a[174897]=0;c[43727]=0;c[43728]=0;a[174898]=1;b=f+52|0;f=md(Tj(d[(c[(c[b>>2]|0)+8>>2]|0)+115|0]|0)|0)|0;c[43716]=f;rd(f,c[(c[(c[b>>2]|0)+8>>2]|0)+136>>2]|0);sd(c[43716]|0,98,8);td(c[43716]|0,70);return 0}function yi(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;j=i;i=i+264|0;k=j|0;l=j+8|0;m=j+16|0;n=j+24|0;o=j+56|0;p=j+88|0;q=j+120|0;r=j+152|0;s=j+184|0;t=j+216|0;u=j+248|0;v=j+256|0;if((pm(f,97048)|0)==0){w=jk(120)|0;c[w+100>>2]=-1;a[w+88|0]=-1;x=v;y=c[g>>2]|0;if((y|0)!=0){z=v|0;v=g;A=y;while(1){y=v+8|0;B=c[v+4>>2]|0;c[z>>2]=A;C=vb(x|0,3264,21,8,28)|0;if((C|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=A,c[D+8>>2]=82896,D)|0)|0;i=D;E=1}else{F=Oc[c[C+4>>2]&255](w,B)|0;E=(d[174896]|0|F)&255}a[174896]=E;F=c[y>>2]|0;if((F|0)==0){break}else{v=y;A=F}}}c[44692]=w;a[174898]=0;c[43718]=285;i=j;return}do{if((pm(f,91560)|0)!=0){if((pm(f,86296)|0)==0){break}if((pm(f,81584)|0)==0){a[174898]=1;w=jk(104)|0;b[w+80>>1]=1;b[w+82>>1]=1;A=u;v=c[g>>2]|0;if((v|0)!=0){E=u|0;x=g;z=v;while(1){v=x+8|0;F=c[x+4>>2]|0;c[E>>2]=z;y=vb(A|0,70864,21,8,28)|0;if((y|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=z,c[D+8>>2]=109488,D)|0)|0;i=D;G=1}else{B=Oc[c[y+4>>2]&255](w,F)|0;G=(d[174896]|0|B)&255}a[174896]=G;B=c[v>>2]|0;if((B|0)==0){break}else{x=v;z=B}}}c[44692]=w;c[43718]=286;i=j;return}if((pm(f,163664)|0)==0){z=t;c[z>>2]=c[4952];c[z+4>>2]=c[4953];c[z+8>>2]=c[4954];c[z+12>>2]=c[4955];c[z+16>>2]=c[4956];c[z+20>>2]=c[4957];c[z+24>>2]=c[4958];c[z+28>>2]=c[4959];h[t+16>>3]=-1.0;c[t+24>>2]=0;do{if((g|0)!=0){x=k;A=c[g>>2]|0;if((A|0)==0){break}E=k|0;B=g;v=A;while(1){A=B+8|0;F=c[B+4>>2]|0;c[E>>2]=v;y=vb(x|0,25920,3,8,28)|0;if((y|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=v,c[D+8>>2]=114616,D)|0)|0;i=D;H=1}else{C=Oc[c[y+4>>2]&255](z,F)|0;H=(d[174896]|0|C)&255}a[174896]=H;C=c[A>>2]|0;if((C|0)==0){break}else{B=A;v=C}}}}while(0);w=c[e+144>>2]|0;c[44692]=Hc[c[w>>2]&63](w,z,1)|0;c[43718]=287;i=j;return}if((pm(f,159656)|0)==0){w=s;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[s+16>>3]=-1.0;c[s+24>>2]=1;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=289;i=j;return}if((pm(f,142280)|0)==0){w=r;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[r+16>>3]=-1.0;c[r+24>>2]=32;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=293;i=j;return}if((pm(f,154648)|0)==0){w=q;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[q+16>>3]=-1.0;c[q+24>>2]=4;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=290;i=j;return}if((pm(f,151360)|0)==0){w=p;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[p+16>>3]=-1.0;c[p+24>>2]=2;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=288;i=j;return}if((pm(f,148472)|0)==0){w=o;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[o+16>>3]=-1.0;c[o+24>>2]=8;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=291;i=j;return}if((pm(f,145248)|0)==0){w=n;c[w>>2]=c[4952];c[w+4>>2]=c[4953];c[w+8>>2]=c[4954];c[w+12>>2]=c[4955];c[w+16>>2]=c[4956];c[w+20>>2]=c[4957];c[w+24>>2]=c[4958];c[w+28>>2]=c[4959];h[n+16>>3]=-1.0;c[n+24>>2]=16;v=c[e+144>>2]|0;c[44692]=Hc[c[v>>2]&63](v,w,1)|0;c[43718]=292;i=j;return}if((pm(f,139176)|0)==0){c[44692]=0;w=m;v=c[g>>2]|0;if((v|0)!=0){B=m|0;x=g;E=v;while(1){v=x+8|0;C=c[x+4>>2]|0;c[B>>2]=E;A=vb(w|0,71320,1,8,28)|0;if((A|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=E,c[D+8>>2]=120184,D)|0)|0;i=D;I=1}else{F=Oc[c[A+4>>2]&255](178768,C)|0;I=(d[174896]|0|F)&255}a[174896]=I;F=c[v>>2]|0;if((F|0)==0){break}else{x=v;E=F}}}c[43718]=282;i=j;return}if((pm(f,136632)|0)==0){c[43718]=276;i=j;return}if((pm(f,133736)|0)==0){c[43718]=279;i=j;return}if((pm(f,131648)|0)!=0){if((pm(f,167840)|0)==0){c[43718]=262;i=j;return}else{c[43718]=268;a[174897]=1;E=zd(c[43716]|0)|0;Fv(1,129424,(D=i,i=i+16|0,c[D>>2]=f,c[D+8>>2]=E,D)|0)|0;i=D;i=j;return}}E=jk(40)|0;x=l;w=c[g>>2]|0;if((w|0)!=0){B=l|0;z=g;F=w;while(1){w=z+8|0;v=c[z+4>>2]|0;c[B>>2]=F;C=vb(x|0,21624,2,8,28)|0;if((C|0)==0){Fv(0,120960,(D=i,i=i+16|0,c[D>>2]=F,c[D+8>>2]=126216,D)|0)|0;i=D;J=1}else{A=Oc[c[C+4>>2]&255](E,v)|0;J=(d[174896]|0|A)&255}a[174896]=J;A=c[w>>2]|0;if((A|0)==0){break}else{z=w;F=A}}}c[44692]=E;c[43718]=284;i=j;return}}while(0);a[174898]=0;c[43718]=260;i=j;return}function zi(b,d){b=b|0;d=d|0;var e=0,f=0;b=i;if((pm(d,97048)|0)==0){c[43718]=264;a[174898]=1;i=b;return}do{if((pm(d,91560)|0)!=0){if((pm(d,86296)|0)==0){break}if((pm(d,81584)|0)==0){c[43718]=265;a[174898]=0;i=b;return}if((pm(d,167840)|0)==0){c[43718]=263;i=b;return}if((pm(d,163664)|0)==0){c[43718]=266;i=b;return}if((pm(d,159656)|0)==0){c[43718]=270;i=b;return}if((pm(d,154648)|0)==0){c[43718]=271;i=b;return}if((pm(d,151360)|0)==0){c[43718]=269;i=b;return}if((pm(d,148472)|0)==0){c[43718]=272;i=b;return}if((pm(d,145248)|0)==0){c[43718]=273;i=b;return}if((pm(d,142280)|0)==0){c[43718]=274;i=b;return}if((pm(d,139176)|0)==0){if((c[43718]|0)==282){c[43718]=281;i=b;return}else{c[43718]=258;i=b;return}}if((pm(d,136632)|0)==0){if((c[43718]|0)==276){c[43718]=275;i=b;return}else{c[43718]=277;i=b;return}}if((pm(d,133736)|0)==0){if((c[43718]|0)==279){c[43718]=278;i=b;return}else{c[43718]=280;i=b;return}}if((pm(d,131648)|0)!=0){c[43718]=268;a[174897]=1;e=zd(c[43716]|0)|0;Fv(1,129424,(f=i,i=i+16|0,c[f>>2]=d,c[f+8>>2]=e,f)|0)|0;i=f;i=b;return}if((c[43718]|0)==284){c[43718]=283;i=b;return}else{c[43718]=259;i=b;return}}}while(0);c[43718]=261;i=b;return}function Ai(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((a[174898]|0)==0|(e|0)==0){return}else{f=e;g=0;h=d}while(1){d=h+1|0;e=a[h]|0;if((e&255)>>>0>31>>>0){b=c[43719]|0;i=c[b+4>>2]|0;if(i>>>0<(c[b+8>>2]|0)>>>0){j=b;k=i}else{Jv(b,1)|0;b=c[43719]|0;j=b;k=c[b+4>>2]|0}c[j+4>>2]=k+1;a[k]=e;l=g+1|0}else{l=g}e=f-1|0;if((e|0)==0){break}else{f=e;g=l;h=d}}if((l|0)==0){return}c[43718]=267;return}function Bi(){var b=0;b=(a[174897]|a[174896])<<24>>24;qd(c[43716]|0);Mv(174880);return b|0}function Ci(){var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;b=i;c[43718]=0;d=0;a:while(1){e=a[174899]|0;do{if((e<<24>>24|0)==2){f=-1;g=41;break a}else if((e<<24>>24|0)==0){a[174899]=1;h=6;j=0;k=157976}else{l=c[43717]|0;m=a[l]|0;if(m<<24>>24==0){a[174899]=2;h=7;j=d;k=127960;break}n=l+1|0;b:do{if(m<<24>>24==60){o=a[n]|0;c:do{if(o<<24>>24==33){if((Za(l+2|0,115392,2)|0)!=0){p=n;q=33;g=18;break}r=l+4|0;s=r;t=1;while(1){u=s;while(1){v=u+1|0;w=a[u]|0;if((w<<24>>24|0)==0){x=u;break c}else if((w<<24>>24|0)==62){g=14;break}else if((w<<24>>24|0)==60){g=12;break}else{u=v}}if((g|0)==12){g=0;y=t+1|0;z=60}else if((g|0)==14){g=0;y=t-1|0;z=62}if((y|0)==0){break}else{s=v;t=y}}t=u-2|0;if(t>>>0>=r>>>0){if((Za(t|0,115392,2)|0)==0){A=u;B=z;g=20;break}}Fv(0,102712,(C=i,i=i+1|0,i=i+7&-8,c[C>>2]=0,C)|0)|0;i=C;a[174896]=1;A=u;B=a[u]|0;g=20}else{p=n;q=o;g=18}}while(0);d:do{if((g|0)==18){while(1){g=0;if((q<<24>>24|0)==0|(q<<24>>24|0)==62){A=p;B=q;g=20;break d}o=p+1|0;p=o;q=a[o]|0;g=18}}}while(0);do{if((g|0)==20){g=0;if(B<<24>>24!=62){x=A;break}D=A+1|0;break b}}while(0);Fv(0,108288,(C=i,i=i+1|0,i=i+7&-8,c[C>>2]=0,C)|0)|0;i=C;a[174896]=1;D=x}else{r=l;o=m;while(1){do{if((o<<24>>24|0)==38){t=r+1|0;if((a[t]|0)==35){g=26;break}E=fn(t,174880)|0}else if((o<<24>>24|0)==0|(o<<24>>24|0)==60){D=r;break b}else{g=26}}while(0);if((g|0)==26){g=0;t=c[43721]|0;if(t>>>0<(c[43722]|0)>>>0){F=t}else{Jv(174880,1)|0;F=c[43721]|0}c[43721]=F+1;a[F]=o;E=r+1|0}r=E;o=a[E]|0}}}while(0);h=D-l|0;j=D;k=l}}while(0);c[43726]=c[43725];c[43728]=c[43727];c[43725]=k;c[43727]=h;e=c[43721]|0;m=c[43720]|0;n=e-m|0;o=c[43716]|0;if((e|0)==(m|0)){G=ud(o,k,h,(h|0)==0|0)|0}else{if(e>>>0<(c[43722]|0)>>>0){H=e}else{Jv(174880,1)|0;H=c[43721]|0}a[H]=0;e=c[43720]|0;c[43721]=e;G=ud(o,e,n,0)|0}if(!((G|0)!=0|(a[174897]|0)!=0)){n=Ad(yd(c[43716]|0)|0)|0;e=zd(c[43716]|0)|0;Fv(1,120352,(C=i,i=i+16|0,c[C>>2]=n,c[C+8>>2]=e,C)|0)|0;i=C;wi();a[174897]=1;c[43718]=268}if((j|0)!=0){c[43717]=j}e=c[43718]|0;if((e|0)==0){d=j}else{f=e;g=41;break}}if((g|0)==41){i=b;return f|0}return 0}function Di(a,b){a=a|0;b=b|0;c[a+36>>2]=Lb(b|0)|0;return 0}function Ei(a,b){a=a|0;b=b|0;c[a+32>>2]=Lb(b|0)|0;return 0}function Fi(a,b){a=a|0;b=b|0;return pm(c[a>>2]|0,c[b>>2]|0)|0}function Gi(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;f=(Cb(a[d]|0)|0)<<24>>24;do{if((f|0)==82){g=d+1|0;if((pm(g,118688)|0)!=0){h=g;j=5;break}c[b>>2]=114;k=0;i=e;return k|0}else if((f|0)!=76){h=d+1|0;j=5}}while(0);do{if((j|0)==5){if((pm(h,117768)|0)==0){break}do{if((f|0)!=67){if((pm(h,116848)|0)!=0){break}Fv(0,115896,(g=i,i=i+8|0,c[g>>2]=d,g)|0)|0;i=g;k=1;i=e;return k|0}}while(0);c[b>>2]=110;k=0;i=e;return k|0}}while(0);c[b>>2]=108;k=0;i=e;return k|0}function Hi(a,b){a=a|0;b=b|0;c[a+4>>2]=b;return 0}function Ii(a,b){a=a|0;b=b|0;c[a>>2]=b;return 0}function Ji(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0;d=i;i=i+8|0;e=d|0;f=Ja(b|0,e|0,10)|0;if((c[e>>2]|0)==(b|0)){Fv(0,111576,(g=i,i=i+16|0,c[g>>2]=112168,c[g+8>>2]=b,g)|0)|0;i=g;j=1;i=d;return j|0}if((f|0)>255){Fv(0,110912,(g=i,i=i+24|0,c[g>>2]=112168,c[g+8>>2]=b,c[g+16>>2]=255,g)|0)|0;i=g;j=1;i=d;return j|0}if((f|0)<0){Fv(0,110160,(g=i,i=i+24|0,c[g>>2]=112168,c[g+8>>2]=b,c[g+16>>2]=0,g)|0)|0;i=g;j=1;i=d;return j|0}else{h[a+16>>3]=+(f|0);j=0;i=d;return j|0}return 0}function Ki(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==67){if((pm(e+1|0,116848)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==82){if((pm(e+1|0,118688)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|2;h=0;i=f;return h|0}else if((g|0)==76){if((pm(e+1|0,117768)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|4;h=0;i=f;return h|0}else if((g|0)==84){if((pm(e+1|0,83696)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|6;h=0;i=f;return h|0}}while(0);Fv(0,83296,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;h=1;i=f;return h|0}function Li(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==76){if((pm(e+1|0,117768)|0)!=0){break}h=d+36|0;b[h>>1]=b[h>>1]|512;j=0;i=f;return j|0}else if((g|0)==67){if((pm(e+1|0,116848)|0)==0){j=0}else{break}i=f;return j|0}else if((g|0)==82){if((pm(e+1|0,118688)|0)!=0){break}h=d+36|0;b[h>>1]=b[h>>1]|256;j=0;i=f;return j|0}}while(0);Fv(0,84096,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;j=1;i=f;return j|0}function Mi(a,b){a=a|0;b=b|0;c[a+20>>2]=Lb(b|0)|0;return 0}function Ni(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=Ja(e|0,g|0,10)|0;if((c[g>>2]|0)==(e|0)){Fv(0,111576,(j=i,i=i+16|0,c[j>>2]=84544,c[j+8>>2]=e,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)>255){Fv(0,110912,(j=i,i=i+24|0,c[j>>2]=84544,c[j+8>>2]=e,c[j+16>>2]=255,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)<0){Fv(0,110160,(j=i,i=i+24|0,c[j>>2]=84544,c[j+8>>2]=e,c[j+16>>2]=0,j)|0)|0;i=j;k=1;i=f;return k|0}else{a[d+33|0]=h;h=d+36|0;b[h>>1]=b[h>>1]|32;k=0;i=f;return k|0}return 0}function Oi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=Ja(e|0,g|0,10)|0;if((c[g>>2]|0)==(e|0)){Fv(0,111576,(j=i,i=i+16|0,c[j>>2]=84904,c[j+8>>2]=e,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)>255){Fv(0,110912,(j=i,i=i+24|0,c[j>>2]=84904,c[j+8>>2]=e,c[j+16>>2]=255,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)<0){Fv(0,110160,(j=i,i=i+24|0,c[j>>2]=84904,c[j+8>>2]=e,c[j+16>>2]=0,j)|0)|0;i=j;k=1;i=f;return k|0}else{a[d+34|0]=h;h=d+36|0;b[h>>1]=b[h>>1]|64;k=0;i=f;return k|0}return 0}function Pi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0;f=i;i=i+8|0;g=f|0;h=Ja(e|0,g|0,10)|0;if((c[g>>2]|0)==(e|0)){Fv(0,111576,(j=i,i=i+16|0,c[j>>2]=85368,c[j+8>>2]=e,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)>127){Fv(0,110912,(j=i,i=i+24|0,c[j>>2]=85368,c[j+8>>2]=e,c[j+16>>2]=127,j)|0)|0;i=j;k=1;i=f;return k|0}if((h|0)<-128){Fv(0,110160,(j=i,i=i+24|0,c[j>>2]=85368,c[j+8>>2]=e,c[j+16>>2]=-128,j)|0)|0;i=j;k=1;i=f;return k|0}else{a[d+32|0]=h;h=d+36|0;b[h>>1]=b[h>>1]|128;k=0;i=f;return k|0}return 0}function Qi(a,b){a=a|0;b=b|0;c[a+24>>2]=Lb(b|0)|0;return 0}function Ri(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=86680,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=86680,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=86680,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)==0){Fv(0,85816,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+80>>1]=g;j=0;i=e;return j|0}return 0}function Si(a,e){a=a|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(d[e]|0|0)|0)<<24>>24;do{if((g|0)==70){if((pm(e+1|0,87736)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==84){if((pm(e+1|0,88168)|0)!=0){break}j=a+36|0;b[j>>1]=b[j>>1]|1;h=0;i=f;return h|0}}while(0);Fv(0,87216,(a=i,i=i+8|0,c[a>>2]=e,a)|0)|0;i=a;h=1;i=f;return h|0}function Ti(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+8|0;e=d|0;f=Ja(b|0,e|0,10)|0;if((c[e>>2]|0)==(b|0)){Fv(0,111576,(g=i,i=i+16|0,c[g>>2]=88608,c[g+8>>2]=b,g)|0)|0;i=g;h=1;i=d;return h|0}if((f|0)>360){Fv(0,110912,(g=i,i=i+24|0,c[g>>2]=88608,c[g+8>>2]=b,c[g+16>>2]=360,g)|0)|0;i=g;h=1;i=d;return h|0}if((f|0)<0){Fv(0,110160,(g=i,i=i+24|0,c[g>>2]=88608,c[g+8>>2]=b,c[g+16>>2]=0,g)|0)|0;i=g;h=1;i=d;return h|0}else{c[a+28>>2]=f&65535;h=0;i=d;return h|0}return 0}function Ui(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=89072,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=89072,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=89072,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+40>>1]=g;j=0;i=e;return j|0}return 0}function Vi(a,b){a=a|0;b=b|0;c[a>>2]=Lb(b|0)|0;return 0}function Wi(a,b){a=a|0;b=b|0;c[a+16>>2]=Lb(b|0)|0;return 0}function Xi(a,b){a=a|0;b=b|0;c[a+4>>2]=Lb(b|0)|0;return 0}function Yi(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=90016,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=90016,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=90016,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)==0){Fv(0,89456,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+82>>1]=g;j=0;i=e;return j|0}return 0}function Zi(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=Lb(e|0)|0;e=La(g|0,94896)|0;if((e|0)==0){h=0;eF(g);i=f;return h|0}j=d+42|0;d=e;e=0;while(1){a:do{if(((Cb(a[d]|0)|0)&255|0)==82){k=d+1|0;if((pm(k,94416)|0)==0){b[j>>1]=b[j>>1]|4;l=e;break}if((pm(k,94024)|0)==0){b[j>>1]=b[j>>1]|2;l=e;break}else{Fv(0,93544,(m=i,i=i+8|0,c[m>>2]=d,m)|0)|0;i=m;l=1;break}}else{if((pm(d,93072)|0)==0){b[j>>1]=b[j>>1]&-385;l=e;break}do{if((pm(d,92608)|0)!=0){if((pm(d,91960)|0)==0){break}if((pm(d,91120)|0)==0){b[j>>1]=b[j>>1]|128;l=e;break a}if((pm(d,90600)|0)==0){b[j>>1]=b[j>>1]|256;l=e;break a}else{Fv(0,93544,(m=i,i=i+8|0,c[m>>2]=d,m)|0)|0;i=m;l=1;break a}}}while(0);b[j>>1]=b[j>>1]|32;l=e}}while(0);k=La(0,94896)|0;if((k|0)==0){h=l;break}else{d=k;e=l}}eF(g);i=f;return h|0}function _i(a,b){a=a|0;b=b|0;c[a+8>>2]=Lb(b|0)|0;return 0}function $i(a,b){a=a|0;b=b|0;c[a+12>>2]=Lb(b|0)|0;return 0}function aj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==77){if((pm(e+1|0,95816)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==66){if((pm(e+1|0,97464)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|16;h=0;i=f;return h|0}else if((g|0)==84){if((pm(e+1|0,96352)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|8;h=0;i=f;return h|0}}while(0);Fv(0,95272,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;h=1;i=f;return h|0}function bj(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=98160,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>65535){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=98160,c[h+8>>2]=d,c[h+16>>2]=65535,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=98160,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{b[a+38>>1]=g;j=0;i=e;return j|0}return 0}function cj(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;g=(Cb(a[e]|0)|0)<<24>>24;do{if((g|0)==67){if((pm(e+1|0,116848)|0)==0){h=0}else{break}i=f;return h|0}else if((g|0)==76){if((pm(e+1|0,117768)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|4;h=0;i=f;return h|0}else if((g|0)==82){if((pm(e+1|0,118688)|0)!=0){break}j=d+36|0;b[j>>1]=b[j>>1]|2;h=0;i=f;return h|0}}while(0);Fv(0,115896,(d=i,i=i+8|0,c[d>>2]=e,d)|0)|0;i=d;h=1;i=f;return h|0}function dj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Ja(d|0,f|0,10)|0;if((c[f>>2]|0)==(d|0)){Fv(0,111576,(h=i,i=i+16|0,c[h>>2]=79912,c[h+8>>2]=d,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)>127){Fv(0,110912,(h=i,i=i+24|0,c[h>>2]=79912,c[h+8>>2]=d,c[h+16>>2]=127,h)|0)|0;i=h;j=1;i=e;return j|0}if((g|0)<0){Fv(0,110160,(h=i,i=i+24|0,c[h>>2]=79912,c[h+8>>2]=d,c[h+16>>2]=0,h)|0)|0;i=h;j=1;i=e;return j|0}else{a[b+88|0]=g;j=0;i=e;return j|0}return 0}function ej(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a[d]|0)==42){f=b+112|0;a[f]=a[f]|1;g=0;i=e;return g|0}else{Fv(0,80216,(f=i,i=i+8|0,c[f>>2]=d,f)|0)|0;i=f;g=1;i=e;return g|0}return 0}function fj(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=i;if((a[d]|0)==42){f=b+112|0;a[f]=a[f]|2;g=0;i=e;return g|0}else{Fv(0,80672,(f=i,i=i+8|0,c[f>>2]=d,f)|0)|0;i=f;g=1;i=e;return g|0}return 0}
+
+
+
+function eD(b){b=b|0;var d=0;_z(b,122952)|0;d=ew(c[(c[b>>2]|0)+168>>2]|0,122800)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}_z(b,122592)|0;_z(b,d)|0;_z(b,122416)|0}}while(0);_z(b,122224)|0;_z(b,122040)|0;_z(b,121976)|0;d=b+12|0;_z(b,gk(c[c[c[d>>2]>>2]>>2]|0)|0)|0;_z(b,121864)|0;_z(b,gk(c[(c[c[d>>2]>>2]|0)+4>>2]|0)|0)|0;_z(b,121640)|0;_z(b,gk(c[(c[c[d>>2]>>2]|0)+8>>2]|0)|0)|0;_z(b,121592)|0;_z(b,148920)|0;return}function fD(b){b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0;d=i;e=c[b+16>>2]|0;_z(b,124800)|0;f=e+8|0;if((a[$w(c[f>>2]|0)|0]|0)!=0){_z(b,124616)|0;_z(b,gk($w(c[f>>2]|0)|0)|0)|0}f=da(c[b+168>>2]|0,c[b+164>>2]|0)|0;dA(b,124384,(e=i,i=i+8|0,c[e>>2]=f,e)|0);i=e;f=c[b+452>>2]|0;dA(b,124120,(e=i,i=i+16|0,c[e>>2]=c[b+448>>2],c[e+8>>2]=f,e)|0);i=e;g=+h[b+432>>3]/72.0;j=+h[b+440>>3]/72.0;k=+h[b+392>>3]*j;l=g*+h[b+400>>3];m=j*+h[b+408>>3];dA(b,123832,(e=i,i=i+32|0,h[e>>3]=+h[b+384>>3]*g,h[e+8>>3]=k,h[e+16>>3]=l,h[e+24>>3]=m,e)|0);i=e;_z(b,123456)|0;_z(b,123208)|0;_z(b,128448)|0;i=d;return}function gD(a){a=a|0;_z(a,124920)|0;return}function hD(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;_z(a,128192)|0;_z(a,gk(b)|0)|0;_z(a,125096)|0;return}function iD(a){a=a|0;_z(a,130512)|0;return}function jD(b){b=b|0;var d=0,e=0,f=0.0,g=0,j=0.0,k=0.0,l=0;d=i;e=c[b+16>>2]|0;_z(b,128192)|0;_z(b,gk(c[e+212>>2]|0)|0)|0;_z(b,125592)|0;f=+h[b+496>>3];g=-(c[b+360>>2]|0)|0;j=+h[b+504>>3];k=-0.0- +h[b+512>>3];dA(b,125320,(l=i,i=i+40|0,h[l>>3]=+h[b+488>>3],h[l+8>>3]=f,c[l+16>>2]=g,h[l+24>>3]=j,h[l+32>>3]=k,l)|0);i=l;l=e+8|0;if((a[$w(c[l>>2]|0)|0]|0)==0){i=d;return}_z(b,127488)|0;_z(b,gk($w(c[l>>2]|0)|0)|0)|0;_z(b,126984)|0;i=d;return}function kD(a){a=a|0;_z(a,130512)|0;return}function lD(a){a=a|0;var b=0;b=c[a+16>>2]|0;_z(a,128192)|0;_z(a,gk(c[b+212>>2]|0)|0)|0;_z(a,125880)|0;_z(a,127488)|0;_z(a,gk($w(c[b+8>>2]|0)|0)|0)|0;_z(a,126984)|0;return}function mD(a){a=a|0;_z(a,130512)|0;return}function nD(a){a=a|0;var b=0,d=0,e=0,f=0;b=i;d=c[a+16>>2]|0;_z(a,128192)|0;_z(a,gk(c[d+212>>2]|0)|0)|0;e=c[a+160>>2]|0;if((e|0)>1){f=gk(c[(c[(c[a>>2]|0)+308>>2]|0)+(e<<2)>>2]|0)|0;dA(a,126656,(e=i,i=i+8|0,c[e>>2]=f,e)|0);i=e}_z(a,126312)|0;_z(a,127488)|0;_z(a,gk($w(c[d+8>>2]|0)|0)|0)|0;_z(a,126984)|0;i=b;return}function oD(a){a=a|0;_z(a,130512)|0;return}function pD(a){a=a|0;var b=0,d=0;b=c[a+16>>2]|0;_z(a,128192)|0;_z(a,gk(c[b+212>>2]|0)|0)|0;_z(a,127832)|0;_z(a,127488)|0;d=fk(127272,c[b+8>>2]|0)|0;_z(a,gk(d)|0)|0;eF(d);_z(a,126984)|0;return}function qD(a){a=a|0;_z(a,130512)|0;return}function rD(b,c,d,e,f){b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0;_z(b,130304)|0;if((f|0)!=0){_z(b,130072)|0;_z(b,gk(f)|0)|0;_z(b,144328)|0}_z(b,130984)|0;_z(b,129896)|0;do{if((c|0)!=0){if((a[c]|0)==0){break}_z(b,129608)|0;_z(b,c)|0;_z(b,144328)|0}}while(0);do{if((d|0)!=0){if((a[d]|0)==0){break}_z(b,129104)|0;_z(b,gk(d)|0)|0;_z(b,144328)|0}}while(0);if((e|0)==0){g=_z(b,128448)|0;return}if((a[e]|0)==0){g=_z(b,128448)|0;return}_z(b,128728)|0;_z(b,gk(e)|0)|0;_z(b,144328)|0;g=_z(b,128448)|0;return}function sD(a){a=a|0;_z(a,130696)|0;_z(a,130512)|0;return}function tD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;g=i;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=c[b+16>>2]|0;_z(b,136736)|0;k=a[f+48|0]|0;if((k|0)==114){_z(b,135944)|0}else if((k|0)==108){_z(b,136200)|0}else{_z(b,135672)|0}k=e+8|0;l=+h[f+24>>3]+ +h[k>>3];h[k>>3]=l;dA(b,135392,(k=i,i=i+16|0,h[k>>3]=+h[e>>3],h[k+8>>3]=-0.0-l,k)|0);i=k;e=f+4|0;m=c[e>>2]|0;n=c[m+8>>2]|0;do{if((n|0)==0){dA(b,133808,(k=i,i=i+8|0,c[k>>2]=c[m>>2],k)|0);i=k;o=0;p=0}else{q=c[(c[(c[(c[b>>2]|0)+168>>2]|0)+8>>2]|0)+232>>2]|0;if((q|0)==2){r=n+24|0;s=n+32|0;t=n+28|0}else if((q|0)==1){r=n|0;s=n+16|0;t=n+8|0}else{r=n+4|0;s=n+16|0;t=n+8|0}q=c[s>>2]|0;u=c[t>>2]|0;v=c[n+12>>2]|0;dA(b,135008,(k=i,i=i+8|0,c[k>>2]=c[r>>2],k)|0);i=k;w=c[n+24>>2]|0;if((w|0)!=0){dA(b,134752,(k=i,i=i+8|0,c[k>>2]=w,k)|0);i=k}_z(b,144328)|0;if((u|0)!=0){dA(b,134552,(k=i,i=i+8|0,c[k>>2]=u,k)|0);i=k}if((v|0)!=0){dA(b,134344,(k=i,i=i+8|0,c[k>>2]=v,k)|0);i=k}if((q|0)==0){o=0;p=u;break}dA(b,134096,(k=i,i=i+8|0,c[k>>2]=q,k)|0);i=k;o=q;p=u}}while(0);n=c[e>>2]|0;do{if((n|0)!=0){r=c[n+24>>2]<<25>>25;if((r|0)==0){break}if((r&1|0)!=0&(p|0)==0){dA(b,133496,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&2|0)!=0&(o|0)==0){dA(b,133328,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&36|0)!=0){dA(b,133152,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k;if((r&4|0)==0){x=0}else{dA(b,133016,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k;x=1}if((r&32|0)!=0){dA(b,132832,(k=i,i=i+8|0,c[k>>2]=(x|0)!=0?132712:213408,k)|0);i=k}dA(b,144328,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&8|0)!=0){dA(b,132376,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}if((r&16|0)==0){break}dA(b,132136,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0);i=k}}while(0);dA(b,131760,(k=i,i=i+8|0,h[k>>3]=+h[(c[e>>2]|0)+16>>3],k)|0);i=k;e=j+16|0;x=c[j+48>>2]|0;if((x|0)==5){j=c[e>>2]|0;if((pm(j,168168)|0)==0){y=_z(b,130984)|0;z=f|0;A=c[z>>2]|0;B=hk(A,1)|0;C=_z(b,B)|0;D=_z(b,130832)|0;i=g;return}dA(b,131400,(k=i,i=i+8|0,c[k>>2]=j,k)|0);i=k;y=_z(b,130984)|0;z=f|0;A=c[z>>2]|0;B=hk(A,1)|0;C=_z(b,B)|0;D=_z(b,130832)|0;i=g;return}else if((x|0)==1){x=e;j=d[x+1|0]|0;o=d[x+2|0]|0;dA(b,131112,(k=i,i=i+24|0,c[k>>2]=d[e]|0,c[k+8>>2]=j,c[k+16>>2]=o,k)|0);i=k;y=_z(b,130984)|0;z=f|0;A=c[z>>2]|0;B=hk(A,1)|0;C=_z(b,B)|0;D=_z(b,130832)|0;i=g;return}else{cc(143376,143104,436,169944)}}function uD(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0,g=0;d=i;if((c|0)==3){e=BD(a)|0}else if((c|0)==2){e=AD(a,b,2)|0}else{e=0}_z(a,137720)|0;zD(a,c,e);e=b|0;c=b+8|0;f=-0.0- +h[c>>3];dA(a,137472,(g=i,i=i+16|0,h[g>>3]=+h[e>>3],h[g+8>>3]=f,g)|0);i=g;f=+h[b+24>>3]- +h[c>>3];dA(a,137240,(g=i,i=i+16|0,h[g>>3]=+h[b+16>>3]- +h[e>>3],h[g+8>>3]=f,g)|0);i=g;_z(a,137008)|0;i=d;return}function vD(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0.0,j=0;e=i;if((d|0)==2){f=AD(a,b,c)|0}else if((d|0)==3){f=BD(a)|0}else{f=0}_z(a,138128)|0;zD(a,d,f);_z(a,148072)|0;if((c|0)>0){f=0;do{g=-0.0- +h[b+(f<<4)+8>>3];dA(a,147760,(j=i,i=i+16|0,h[j>>3]=+h[b+(f<<4)>>3],h[j+8>>3]=g,j)|0);i=j;f=f+1|0;}while((f|0)<(c|0))}g=-0.0- +h[b+8>>3];dA(a,137944,(j=i,i=i+16|0,h[j>>3]=+h[b>>3],h[j+8>>3]=g,j)|0);i=j;_z(a,147496)|0;i=e;return}function wD(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0;f=i;if((g|0)==2){j=AD(a,b,d)|0}else if((g|0)==3){j=BD(a)|0}else{j=0}_z(a,142760)|0;zD(a,g,j);_z(a,142424)|0;if((d|0)>0){k=0;l=77}else{m=_z(a,147496)|0;i=f;return}do{n=+h[b+(k<<4)>>3];o=-0.0- +h[b+(k<<4)+8>>3];dA(a,141960,(j=i,i=i+24|0,c[j>>2]=l&255,h[j+8>>3]=n,h[j+16>>3]=o,j)|0);i=j;l=(k|0)==0?67:32;k=k+1|0;}while((k|0)<(d|0));m=_z(a,147496)|0;i=f;return}function xD(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0.0,j=0;d=i;_z(a,148624)|0;zD(a,0,0);_z(a,148072)|0;if((c|0)>0){e=0}else{f=_z(a,147496)|0;i=d;return}do{g=-0.0- +h[b+(e<<4)+8>>3];dA(a,147760,(j=i,i=i+16|0,h[j>>3]=+h[b+(e<<4)>>3],h[j+8>>3]=g,j)|0);i=j;e=e+1|0;}while((e|0)<(c|0));f=_z(a,147496)|0;i=d;return}function yD(a,b){a=a|0;b=b|0;_z(a,149224)|0;_z(a,gk(b)|0)|0;_z(a,148920)|0;return}function zD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0;g=i;j=c[b+16>>2]|0;_z(b,147208)|0;do{if((e|0)==2){dA(b,146920,(k=i,i=i+8|0,c[k>>2]=f,k)|0);i=k}else if((e|0)==0){_z(b,146088)|0}else if((e|0)==3){dA(b,146680,(k=i,i=i+8|0,c[k>>2]=f,k)|0);i=k}else{l=j+56|0;m=l;n=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;m=j+88|0;o=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;do{if((o|0)==5){_z(b,n)|0}else if((o|0)==1){p=n;if(n>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(k=i,i=i+24|0,c[k>>2]=p&255,c[k+8>>2]=p>>>8&255,c[k+16>>2]=p>>>16&255,k)|0);i=k;break}}else{cc(143376,143104,83,169960)}}while(0);if((c[m>>2]|0)!=1){break}n=a[l+3|0]|0;if((n<<24>>24|0)==0|(n<<24>>24|0)==(-1|0)){break}dA(b,146408,(k=i,i=i+8|0,h[k>>3]=+((n&255)>>>0)/255.0,k)|0);i=k}}while(0);_z(b,145776)|0;f=j+16|0;e=f;n=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;e=j+48|0;o=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;do{if((o|0)==1){p=n;if(n>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(k=i,i=i+24|0,c[k>>2]=p&255,c[k+8>>2]=p>>>8&255,c[k+16>>2]=p>>>16&255,k)|0);i=k;break}}else if((o|0)==5){_z(b,n)|0}else{cc(143376,143104,83,169960)}}while(0);q=+h[j+152>>3];if(q!=1.0){dA(b,145368,(k=i,i=i+8|0,h[k>>3]=q,k)|0);i=k}n=c[j+144>>2]|0;if((n|0)==1){dA(b,144880,(k=i,i=i+8|0,c[k>>2]=143816,k)|0);i=k}else if((n|0)==2){dA(b,144880,(k=i,i=i+8|0,c[k>>2]=144088,k)|0);i=k}if((c[e>>2]|0)!=1){r=_z(b,144328)|0;i=g;return}e=a[f+3|0]|0;if((e<<24>>24|0)==0|(e<<24>>24|0)==(-1|0)){r=_z(b,144328)|0;i=g;return}dA(b,144616,(k=i,i=i+8|0,h[k>>3]=+((e&255)>>>0)/255.0,k)|0);i=k;r=_z(b,144328)|0;i=g;return}function AD(b,e,f){b=b|0;e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0;j=i;i=i+32|0;k=j|0;l=c[43700]|0;c[43700]=l+1;m=c[b+16>>2]|0;n=+(c[m+136>>2]|0)*3.141592653589793/180.0;vF(k|0,0,32)|0;rn(e,k|0,f,n,0);dA(b,139320,(f=i,i=i+8|0,c[f>>2]=l,f)|0);i=f;n=+h[k+8>>3];o=+h[k+16>>3];p=+h[k+24>>3];dA(b,138784,(f=i,i=i+32|0,h[f>>3]=+h[k>>3],h[f+8>>3]=n,h[f+16>>3]=o,h[f+24>>3]=p,f)|0);i=f;k=m+140|0;p=+g[k>>2];if(p>0.0){dA(b,138496,(f=i,i=i+8|0,h[f>>3]=p+-.001,f)|0);i=f}else{_z(b,141248)|0}e=m+56|0;q=e;r=d[q]|d[q+1|0]<<8|d[q+2|0]<<16|d[q+3|0]<<24|0;q=m+88|0;s=d[q]|d[q+1|0]<<8|d[q+2|0]<<16|d[q+3|0]<<24|0;do{if((s|0)==1){t=r;if(r>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(f=i,i=i+24|0,c[f>>2]=t&255,c[f+8>>2]=t>>>8&255,c[f+16>>2]=t>>>16&255,f)|0);i=f;break}}else if((s|0)==5){_z(b,r)|0}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[q>>2]|0)==1){r=a[e+3|0]|0;if((r<<24>>24|0)==0|(r<<24>>24|0)==(-1|0)){u=13;break}dA(b,140760,(f=i,i=i+8|0,h[f>>3]=+((r&255)>>>0)/255.0,f)|0);i=f}else{u=13}}while(0);if((u|0)==13){_z(b,140536)|0}_z(b,140288)|0;p=+g[k>>2];if(p>0.0){dA(b,138496,(f=i,i=i+8|0,h[f>>3]=p,f)|0);i=f}else{_z(b,139976)|0}k=m+96|0;u=k;e=d[u]|d[u+1|0]<<8|d[u+2|0]<<16|d[u+3|0]<<24|0;u=m+128|0;m=d[u]|d[u+1|0]<<8|d[u+2|0]<<16|d[u+3|0]<<24|0;do{if((m|0)==1){q=e;if(e>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(f=i,i=i+24|0,c[f>>2]=q&255,c[f+8>>2]=q>>>8&255,c[f+16>>2]=q>>>16&255,f)|0);i=f;break}}else if((m|0)==5){_z(b,e)|0}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[u>>2]|0)==1){e=a[k+3|0]|0;if((e<<24>>24|0)==0|(e<<24>>24|0)==(-1|0)){break}dA(b,140760,(f=i,i=i+8|0,h[f>>3]=+((e&255)>>>0)/255.0,f)|0);i=f;v=_z(b,138280)|0;i=j;return l|0}}while(0);_z(b,140536)|0;v=_z(b,138280)|0;i=j;return l|0}function BD(b){b=b|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;e=i;f=c[43698]|0;c[43698]=f+1;g=c[b+16>>2]|0;j=+(c[g+136>>2]|0)*3.141592653589793/180.0;k=j;if(j==0.0){l=50;m=50}else{l=~~((+V(k)+1.0)*50.0);m=~~((1.0- +W(k))*50.0)}dA(b,141568,(n=i,i=i+24|0,c[n>>2]=f,c[n+8>>2]=l,c[n+16>>2]=m,n)|0);i=n;_z(b,141248)|0;m=g+56|0;l=m;o=d[l]|d[l+1|0]<<8|d[l+2|0]<<16|d[l+3|0]<<24|0;l=g+88|0;p=d[l]|d[l+1|0]<<8|d[l+2|0]<<16|d[l+3|0]<<24|0;do{if((p|0)==1){q=o;if(o>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(n=i,i=i+24|0,c[n>>2]=q&255,c[n+8>>2]=q>>>8&255,c[n+16>>2]=q>>>16&255,n)|0);i=n;break}}else if((p|0)==5){_z(b,o)|0}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[l>>2]|0)==1){o=a[m+3|0]|0;if((o<<24>>24|0)==0|(o<<24>>24|0)==(-1|0)){r=12;break}dA(b,140760,(n=i,i=i+8|0,h[n>>3]=+((o&255)>>>0)/255.0,n)|0);i=n}else{r=12}}while(0);if((r|0)==12){_z(b,140536)|0}_z(b,140288)|0;_z(b,139976)|0;r=g+96|0;m=r;l=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;m=g+128|0;g=d[m]|d[m+1|0]<<8|d[m+2|0]<<16|d[m+3|0]<<24|0;do{if((g|0)==5){_z(b,l)|0}else if((g|0)==1){o=l;if(l>>>0<16777216>>>0){_z(b,146088)|0;break}else{dA(b,143600,(n=i,i=i+24|0,c[n>>2]=o&255,c[n+8>>2]=o>>>8&255,c[n+16>>2]=o>>>16&255,n)|0);i=n;break}}else{cc(143376,143104,83,169960);return 0}}while(0);_z(b,141008)|0;do{if((c[m>>2]|0)==1){l=a[r+3|0]|0;if((l<<24>>24|0)==0|(l<<24>>24|0)==(-1|0)){break}dA(b,140760,(n=i,i=i+8|0,h[n>>3]=+((l&255)>>>0)/255.0,n)|0);i=n;s=_z(b,139672)|0;i=e;return f|0}}while(0);_z(b,140536)|0;s=_z(b,139672)|0;i=e;return f|0}function CD(a){a=a|0;var b=0;_z(a,113040)|0;b=a+12|0;_z(a,c[c[c[b>>2]>>2]>>2]|0)|0;_z(a,112536)|0;_z(a,c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0;_z(a,111984)|0;_z(a,c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0;_z(a,111408)|0;return}function DD(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b+16>>2]|0;_z(b,115728)|0;f=e+8|0;if((a[$w(c[f>>2]|0)|0]|0)!=0){_z(b,114328)|0;_z(b,$w(c[f>>2]|0)|0)|0}f=da(c[b+168>>2]|0,c[b+164>>2]|0)|0;dA(b,113600,(b=i,i=i+8|0,c[b>>2]=f,b)|0);i=b;i=d;return}function ED(a){a=a|0;c[44760]=1;return}function FD(a){a=a|0;c[44760]=-1;return}function GD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=b+16|0;k=c[j>>2]|0;if((c[k+144>>2]|0)==0){i=g;return}l=f+4|0;m=~~(+h[(c[l>>2]|0)+16>>3]*+h[b+352>>3]);if((m|0)==0){i=g;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,123160)|0;n=e+8|0;h[n>>3]=+h[n>>3]- +(m|0)*.55;fA(b,e);_z(b,121576)|0;_z(b,c[f>>2]|0)|0;_z(b,120744)|0;_z(b,101232)|0;e=k+16|0;n=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;e=k+48|0;k=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;do{if((k|0)==5){_z(b,n)|0}else if((k|0)==1){e=n;if(n>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(o=i,i=i+24|0,c[o>>2]=e&255,c[o+8>>2]=e>>>8&255,c[o+16>>2]=e>>>16&255,o)|0);i=o;break}}else{cc(158736,153704,51,169904)}}while(0);_z(b,119984)|0;n=c[l>>2]|0;l=c[n+8>>2]|0;k=c[((l|0)==0?n|0:l+4|0)>>2]|0;_z(b,119152)|0;_z(b,k)|0;_z(b,119152)|0;dA(b,118496,(o=i,i=i+8|0,c[o>>2]=m,o)|0);i=o;m=a[f+48|0]|0;if((m|0)==114){_z(b,116632)|0}else if((m|0)==108){_z(b,117568)|0}m=c[j>>2]|0;switch(c[m+12>>2]|0){case 1:{p=1;q=166792;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{p=0;q=80504;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 8:{p=1;q=85248;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 0:{p=1;q=166792;r=-1;break};case 5:{p=0;q=166792;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 10:{p=0;q=85248;r=(c[c[m+8>>2]>>2]|0)>>>4;break};case 4:{p=0;q=162648;r=-1;break};case 9:case 2:case 3:{p=1;q=80504;r=(c[c[m+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(o=i,i=i+24|0,c[o>>2]=p,c[o+8>>2]=q,c[o+16>>2]=r,o)|0);i=o;_z(b,113632)|0;i=g;return}function HD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0;g=i;j=b+16|0;k=c[j>>2]|0;l=k+144|0;if((c[l>>2]|0)==0){i=g;return}m=e|0;n=+h[m>>3];o=e+8|0;p=+h[o>>3];q=+h[e+24>>3]-p;h[m>>3]=n-(+h[e+16>>3]-n);h[o>>3]=p-q;if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,125560)|0;gA(b,e,2);_z(b,101232)|0;do{if((f|0)==0){if((c[44760]|0)==0){_z(b,147720)|0;break}else{_z(b,131088)|0;break}}else{e=k+56|0;o=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;e=k+88|0;m=d[e]|d[e+1|0]<<8|d[e+2|0]<<16|d[e+3|0]<<24|0;if((m|0)==1){e=o;if(o>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(r=i,i=i+24|0,c[r>>2]=e&255,c[r+8>>2]=e>>>8&255,c[r+16>>2]=e>>>16&255,r)|0);i=r;break}}else if((m|0)==5){_z(b,o)|0;break}else{cc(158736,153704,51,169904)}}}while(0);if((c[44760]|0)==1){c[44760]=0}_z(b,138464)|0;eA(b,+h[k+152>>3]);_z(b,128648)|0;f=k+16|0;o=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=k+48|0;k=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((k|0)==1){f=o;if(o>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(r=i,i=i+24|0,c[r>>2]=f&255,c[r+8>>2]=f>>>8&255,c[r+16>>2]=f>>>16&255,r)|0);i=r;break}}else if((k|0)==5){_z(b,o)|0}else{cc(158736,153704,51,169904)}}while(0);o=c[l>>2]|0;if((o|0)==1){_z(b,95704)|0;s=c[l>>2]|0}else{s=o}if((s|0)==2){_z(b,90464)|0}s=c[j>>2]|0;switch(c[s+12>>2]|0){case 5:{t=0;u=166792;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 8:{t=1;u=85248;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 9:case 2:case 3:{t=1;u=80504;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{t=0;u=80504;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 0:{t=1;u=166792;v=-1;break};case 4:{t=0;u=162648;v=-1;break};case 1:{t=1;u=166792;v=(c[c[s+8>>2]>>2]|0)>>>4;break};case 10:{t=0;u=85248;v=(c[c[s+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(r=i,i=i+24|0,c[r>>2]=t,c[r+8>>2]=u,c[r+16>>2]=v,r)|0);i=r;_z(b,113632)|0;i=g;return}function ID(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;j=i;k=b+16|0;l=c[k>>2]|0;m=l+144|0;if((c[m>>2]|0)==0){i=j;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,133296)|0;gA(b,e,f);_z(b,101232)|0;do{if((g|0)==0){if((c[44760]|0)==0){_z(b,147720)|0;break}else{_z(b,131088)|0;break}}else{f=l+56|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=l+88|0;n=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;if((n|0)==1){f=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(o=i,i=i+24|0,c[o>>2]=f&255,c[o+8>>2]=f>>>8&255,c[o+16>>2]=f>>>16&255,o)|0);i=o;break}}else if((n|0)==5){_z(b,e)|0;break}else{cc(158736,153704,51,169904)}}}while(0);if((c[44760]|0)==1){c[44760]=0}_z(b,138464)|0;eA(b,+h[l+152>>3]);_z(b,128648)|0;g=l+16|0;e=d[g]|d[g+1|0]<<8|d[g+2|0]<<16|d[g+3|0]<<24|0;g=l+48|0;l=d[g]|d[g+1|0]<<8|d[g+2|0]<<16|d[g+3|0]<<24|0;do{if((l|0)==1){g=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(o=i,i=i+24|0,c[o>>2]=g&255,c[o+8>>2]=g>>>8&255,c[o+16>>2]=g>>>16&255,o)|0);i=o;break}}else if((l|0)==5){_z(b,e)|0}else{cc(158736,153704,51,169904)}}while(0);e=c[m>>2]|0;if((e|0)==1){_z(b,95704)|0;p=c[m>>2]|0}else{p=e}if((p|0)==2){_z(b,90464)|0}p=c[k>>2]|0;switch(c[p+12>>2]|0){case 4:{q=0;r=162648;s=-1;break};case 0:{q=1;r=166792;s=-1;break};case 10:{q=0;r=85248;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 9:case 2:case 3:{q=1;r=80504;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 5:{q=0;r=166792;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 1:{q=1;r=166792;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{q=0;r=80504;s=(c[c[p+8>>2]>>2]|0)>>>4;break};case 8:{q=1;r=85248;s=(c[c[p+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(o=i,i=i+24|0,c[o>>2]=q,c[o+8>>2]=r,c[o+16>>2]=s,o)|0);i=o;_z(b,113632)|0;i=j;return}function JD(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0;k=i;j=b+16|0;g=c[j>>2]|0;l=g+144|0;if((c[l>>2]|0)==0){i=k;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,106864)|0;gA(b,e,f);_z(b,101232)|0;f=g+16|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=g+48|0;m=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((m|0)==5){_z(b,e)|0}else if((m|0)==1){f=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(n=i,i=i+24|0,c[n>>2]=f&255,c[n+8>>2]=f>>>8&255,c[n+16>>2]=f>>>16&255,n)|0);i=n;break}}else{cc(158736,153704,51,169904)}}while(0);_z(b,138464)|0;eA(b,+h[g+152>>3]);g=c[l>>2]|0;if((g|0)==1){_z(b,95704)|0;o=c[l>>2]|0}else{o=g}if((o|0)==2){_z(b,90464)|0}_z(b,135904)|0;o=c[j>>2]|0;switch(c[o+12>>2]|0){case 10:{p=0;q=85248;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 9:case 2:case 3:{p=1;q=80504;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 5:{p=0;q=166792;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 1:{p=1;q=166792;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 0:{p=1;q=166792;r=-1;break};case 11:case 6:case 7:{p=0;q=80504;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 8:{p=1;q=85248;r=(c[c[o+8>>2]>>2]|0)>>>4;break};case 4:{p=0;q=162648;r=-1;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(n=i,i=i+24|0,c[n>>2]=p,c[n+8>>2]=q,c[n+16>>2]=r,n)|0);i=n;_z(b,113632)|0;i=k;return}function KD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;h=b+16|0;j=c[h>>2]|0;k=j+144|0;if((c[k>>2]|0)==0){i=g;return}if((a[b+144|0]|0)==0){_z(b,141528)|0}else{_z(b,c[b+148>>2]|0)|0}_z(b,106864)|0;gA(b,e,f);_z(b,101232)|0;f=j+16|0;e=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=j+48|0;j=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((j|0)==5){_z(b,e)|0}else if((j|0)==1){f=e;if(e>>>0<16777216>>>0){_z(b,147720)|0;break}else{dA(b,144560,(l=i,i=i+24|0,c[l>>2]=f&255,c[l+8>>2]=f>>>8&255,c[l+16>>2]=f>>>16&255,l)|0);i=l;break}}else{cc(158736,153704,51,169904)}}while(0);e=c[k>>2]|0;if((e|0)==1){_z(b,95704)|0;m=c[k>>2]|0}else{m=e}if((m|0)==2){_z(b,90464)|0}m=c[h>>2]|0;switch(c[m+12>>2]|0){case 9:case 2:case 3:{n=1;o=80504;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 11:case 6:case 7:{n=0;o=80504;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 4:{n=0;o=162648;p=-1;break};case 8:{n=1;o=85248;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 0:{n=1;o=166792;p=-1;break};case 10:{n=0;o=85248;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 5:{n=0;o=166792;p=(c[c[m+8>>2]>>2]|0)>>>4;break};case 1:{n=1;o=166792;p=(c[c[m+8>>2]>>2]|0)>>>4;break};default:{cc(158736,153704,108,169880)}}dA(b,150608,(l=i,i=i+24|0,c[l>>2]=n,c[l+8>>2]=o,c[l+16>>2]=p,l)|0);i=l;_z(b,113632)|0;i=g;return}function LD(a,b){a=a|0;b=b|0;_z(a,123360)|0;_z(a,b)|0;_z(a,113632)|0;return}function MD(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;d=i;i=i+16|0;e=d|0;f=c[44698]|0;if((f|0)==0){c[44696]=64;g=kk(64)|0;c[44698]=g;h=g}else{h=f}if((b|0)==0){j=h;a[j]=0;k=c[44698]|0;i=d;return k|0}f=e+15|0;g=e+14|0;e=h;h=0;l=0;m=b;b=0;n=0;a:while(1){b:do{if((h|0)==0){p=e;q=m;r=b;s=n;while(1){t=a[q]|0;if(t<<24>>24==0){j=p;u=67;break a}v=c[44696]|0;if((l|0)>(v-8|0)){w=v<<1;c[44696]=w;v=mk(c[44698]|0,w)|0;c[44698]=v;x=v+l|0;y=a[q]|0}else{x=p;y=t}if((y<<24>>24|0)==62){z=x;A=q;B=122560;C=4;D=r;E=s;u=62;break b}else if((y<<24>>24|0)==38){t=a[q+1|0]|0;c:do{if(t<<24>>24==35){v=a[q+2|0]|0;if((v<<24>>24|0)==120|(v<<24>>24|0)==88){w=q+3|0;while(1){F=a[w]|0;if((F-48&255)>>>0<10>>>0|(F-97&255)>>>0<6>>>0|(F-65&255)>>>0<6>>>0){w=w+1|0}else{G=F;break c}}}if((v-48&255)>>>0>=10>>>0){G=v;break}w=q+3|0;while(1){F=a[w]|0;if((F-48&255)>>>0<10>>>0){w=w+1|0}else{G=F;break}}}else{if(!((t-97&255)>>>0<26>>>0|(t-65&255)>>>0<26>>>0)){G=t;break}w=q+2|0;while(1){v=a[w]|0;if((v-97&255)>>>0<26>>>0|(v-65&255)>>>0<26>>>0){w=w+1|0}else{G=v;break}}}}while(0);if(G<<24>>24!=59){H=5;I=105552;J=q;K=r;L=s;M=x;u=60;break b}if((y<<24>>24|0)==62){z=x;A=q;B=122560;C=4;D=r;E=s;u=62;break b}else if((y<<24>>24|0)==45){N=q;O=r;P=s;Q=x;u=47;break b}else if((y<<24>>24|0)==60){H=4;I=149904;J=q;K=r;L=s;M=x;u=60;break b}}else if((y<<24>>24|0)==45){N=q;O=r;P=s;Q=x;u=47;break b}else if((y<<24>>24|0)==60){H=4;I=149904;J=q;K=r;L=s;M=x;u=60;break b}if((y<<24>>24|0)==39){z=x;A=q;B=95432;C=5;D=r;E=s;u=62;break b}else if((y<<24>>24|0)==34){H=6;I=101104;J=q;K=r;L=s;M=x;u=60;break b}if(y<<24>>24>=0){H=1;I=q;J=q;K=r;L=s;M=x;u=60;break b}t=0;w=127;v=y&255;while(1){R=t+1|0;S=v&w;F=w>>>1;if(F>>>0<S>>>0){t=R;w=F;v=S}else{break}}if((t|0)>0){T=S;U=R}else{T=S+(s<<6)|0;U=r}v=U-1|0;if((v|0)<=0){V=q;W=x;X=T;Y=v;u=56;break b}p=x;q=q+1|0;r=v;s=T}}else{s=e;r=m;q=b;p=n;d:while(1){v=a[r]|0;if(v<<24>>24==0){j=s;u=67;break a}w=c[44696]|0;if((l|0)>(w-8|0)){F=w<<1;c[44696]=F;w=mk(c[44698]|0,F)|0;c[44698]=w;Z=w+l|0;_=a[r]|0}else{Z=s;_=v}switch(_<<24>>24){case 62:{z=Z;A=r;B=122560;C=4;D=q;E=p;u=62;break b;break};case 45:{N=r;O=q;P=p;Q=Z;u=47;break b;break};case 38:{v=a[r+1|0]|0;e:do{if(v<<24>>24==35){w=a[r+2|0]|0;if((w<<24>>24|0)==120|(w<<24>>24|0)==88){F=r+3|0;while(1){$=a[F]|0;if(($-48&255)>>>0<10>>>0|($-97&255)>>>0<6>>>0|($-65&255)>>>0<6>>>0){F=F+1|0}else{aa=$;break e}}}if((w-48&255)>>>0>=10>>>0){aa=w;break}F=r+3|0;while(1){$=a[F]|0;if(($-48&255)>>>0<10>>>0){F=F+1|0}else{aa=$;break}}}else{if(!((v-97&255)>>>0<26>>>0|(v-65&255)>>>0<26>>>0)){aa=v;break}F=r+2|0;while(1){w=a[F]|0;if((w-97&255)>>>0<26>>>0|(w-65&255)>>>0<26>>>0){F=F+1|0}else{aa=w;break}}}}while(0);if(aa<<24>>24!=59){H=5;I=105552;J=r;K=q;L=p;M=Z;u=60;break b}if((_<<24>>24|0)==62){z=Z;A=r;B=122560;C=4;D=q;E=p;u=62;break b}else if((_<<24>>24|0)==45){N=r;O=q;P=p;Q=Z;u=47;break b}else if((_<<24>>24|0)==60){H=4;I=149904;J=r;K=q;L=p;M=Z;u=60;break b}else if((_<<24>>24|0)==32){break d}break};case 60:{H=4;I=149904;J=r;K=q;L=p;M=Z;u=60;break b;break};case 32:{break d;break};default:{}}if((_<<24>>24|0)==39){z=Z;A=r;B=95432;C=5;D=q;E=p;u=62;break b}else if((_<<24>>24|0)==34){H=6;I=101104;J=r;K=q;L=p;M=Z;u=60;break b}if(_<<24>>24>=0){H=1;I=r;J=r;K=q;L=p;M=Z;u=60;break b}v=0;t=127;F=_&255;while(1){ba=v+1|0;ca=F&t;w=t>>>1;if(w>>>0<ca>>>0){v=ba;t=w;F=ca}else{break}}if((v|0)>0){da=ca;ea=ba}else{da=ca+(p<<6)|0;ea=q}F=ea-1|0;if((F|0)<=0){V=r;W=Z;X=da;Y=F;u=56;break b}s=Z;r=r+1|0;q=F;p=da}s=(a[h]|0)==32;H=s?6:1;I=s?106736:r;J=r;K=q;L=p;M=Z;u=60}}while(0);if((u|0)==47){u=0;z=Q;A=N;B=113480;C=5;D=O;E=P;u=62}else if((u|0)==56){u=0;a[f]=59;s=X;F=3;t=g;while(1){fa=t-1|0;a[t]=(s>>>0)%10|0|48;ga=(s>>>0)/10|0;ha=F+1|0;if((F|0)>11){u=58;break a}if(s>>>0>9>>>0){s=ga;F=ha;t=fa}else{break}}F=t-2|0;a[fa]=35;a[F]=38;if((ha|0)==0){ia=W;ja=l;ka=V;la=Y;ma=ga}else{z=W;A=V;B=F;C=ha;D=Y;E=ga;u=62}}else if((u|0)==60){u=0;z=M;A=J;B=I;C=H;D=K;E=L;u=62}if((u|0)==62){u=0;F=C+l|0;s=z;w=B;$=C;while(1){na=$-1|0;a[s]=a[w]|0;if((na|0)==0){break}s=s+1|0;w=w+1|0;$=na}ia=z+C|0;ja=F;ka=A;la=D;ma=E}e=ia;h=ka;l=ja;m=ka+1|0;b=la;n=ma}if((u|0)==58){Ma(90208,46,1,c[o>>2]|0)|0;mb(1);return 0}else if((u|0)==67){a[j]=0;k=c[44698]|0;i=d;return k|0}return 0}function ND(a){a=a|0;var b=0;_z(a,152832)|0;_z(a,152536)|0;b=a+12|0;_z(a,MD(c[c[c[b>>2]>>2]>>2]|0)|0)|0;_z(a,152296)|0;_z(a,MD(c[(c[c[b>>2]>>2]|0)+4>>2]|0)|0)|0;_z(a,151992)|0;_z(a,MD(c[(c[c[b>>2]>>2]|0)+8>>2]|0)|0)|0;_z(a,151680)|0;return}function OD(b){b=b|0;var d=0,e=0,f=0;d=i;e=c[b+16>>2]|0;c[44746]=~~(+h[b+232>>3]- +h[b+216>>3]);c[44742]=~~(+h[b+224>>3]- +h[b+208>>3]);_z(b,80072)|0;_z(b,79648)|0;f=$w(c[e+8>>2]|0)|0;if((a[f]|0)!=0){_z(b,79296)|0;_z(b,MD(f)|0)|0;_z(b,79024)|0}f=da(c[b+168>>2]|0,c[b+164>>2]|0)|0;dA(b,78744,(e=i,i=i+8|0,c[e>>2]=f,e)|0);i=e;_z(b,168704)|0;_z(b,168328)|0;_z(b,167920)|0;_z(b,167168)|0;_z(b,166728)|0;_z(b,166328)|0;_z(b,165944)|0;_z(b,165624)|0;_z(b,165320)|0;_z(b,164952)|0;_z(b,164584)|0;_z(b,164200)|0;_z(b,163744)|0;_z(b,162960)|0;_z(b,162576)|0;_z(b,162264)|0;_z(b,161896)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,160920)|0;_z(b,160600)|0;_z(b,162264)|0;_z(b,160208)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,159720)|0;_z(b,162960)|0;_z(b,162576)|0;_z(b,162264)|0;_z(b,160208)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,160920)|0;_z(b,160600)|0;_z(b,162264)|0;_z(b,161896)|0;_z(b,161592)|0;_z(b,161248)|0;_z(b,158952)|0;_z(b,158696)|0;_z(b,158352)|0;_z(b,158064)|0;_z(b,157728)|0;_z(b,157128)|0;f=(c[44746]|0)+10|0;dA(b,156816,(e=i,i=i+16|0,c[e>>2]=c[44742],c[e+8>>2]=f,e)|0);i=e;_z(b,156496)|0;_z(b,155096)|0;_z(b,154704)|0;_z(b,153936)|0;_z(b,153632)|0;f=c[44746]|0;dA(b,153336,(e=i,i=i+16|0,c[e>>2]=c[44742],c[e+8>>2]=f,e)|0);i=e;f=c[44746]|0;dA(b,153048,(e=i,i=i+16|0,c[e>>2]=c[44742],c[e+8>>2]=f,e)|0);i=e;i=d;return}function PD(a){a=a|0;_z(a,84768)|0;_z(a,84376)|0;_z(a,83904)|0;_z(a,83544)|0;_z(a,84376)|0;_z(a,83120)|0;_z(a,82704)|0;_z(a,82200)|0;_z(a,84376)|0;_z(a,81632)|0;_z(a,80920)|0;_z(a,84376)|0;_z(a,80464)|0;return}function QD(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0;g=i;_z(b,87568)|0;do{if((d|0)!=0){if((a[d]|0)==0){break}h=MD(d)|0;dA(b,87040,(j=i,i=i+8|0,c[j>>2]=h,j)|0);i=j}}while(0);do{if((e|0)!=0){if((a[e]|0)==0){break}d=MD(e)|0;dA(b,86448,(j=i,i=i+8|0,c[j>>2]=d,j)|0);i=j}}while(0);if((f|0)==0){k=_z(b,85224)|0;i=g;return}if((a[f]|0)==0){k=_z(b,85224)|0;i=g;return}e=MD(f)|0;dA(b,85608,(j=i,i=i+8|0,c[j>>2]=e,j)|0);i=j;k=_z(b,85224)|0;i=g;return}function RD(a){a=a|0;_z(a,88048)|0;return}function SD(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;g=i;j=e;e=i;i=i+16|0;c[e>>2]=c[j>>2];c[e+4>>2]=c[j+4>>2];c[e+8>>2]=c[j+8>>2];c[e+12>>2]=c[j+12>>2];j=c[b+16>>2]|0;k=a[f+48|0]|0;if((k|0)==108){l=+h[e>>3];m=+h[f+32>>3]}else if((k|0)==114){n=+h[f+32>>3];l=+h[e>>3]-n;m=n}else{n=+h[f+32>>3];l=+h[e>>3]-n*.5;m=n}k=f+40|0;n=+h[k>>3];o=f+4|0;p=(c[o>>2]|0)+16|0;q=+h[p>>3];if(n<q){r=q*1.1+1.0;h[k>>3]=r;s=r;t=+h[p>>3]}else{s=n;t=q}q=l+-8.0;n=+((c[44746]|0)>>>0>>>0)- +h[e+8>>3];r=t/5.0;if(t<12.0){u=r+1.4}else{u=r+2.0}r=n-s+u;dA(b,94736,(e=i,i=i+1|0,i=i+7&-8,c[e>>2]=0,e)|0);i=e;dA(b,96112,(e=i,i=i+16|0,h[e>>3]=q,h[e+8>>3]=r,e)|0);i=e;dA(b,95648,(e=i,i=i+16|0,h[e>>3]=l+m+8.0-q,h[e+8>>3]=n+u-r,e)|0);i=e;_z(b,94264)|0;_z(b,93808)|0;p=c[o>>2]|0;k=c[p+8>>2]|0;do{if((k|0)==0){dA(b,93384,(e=i,i=i+8|0,c[e>>2]=c[p>>2],e)|0);i=e}else{dA(b,93384,(e=i,i=i+8|0,c[e>>2]=c[k+4>>2],e)|0);i=e;v=c[k+8>>2]|0;if((v|0)!=0){dA(b,92904,(e=i,i=i+8|0,c[e>>2]=v,e)|0);i=e}v=c[k+12>>2]|0;if((v|0)!=0){dA(b,92288,(e=i,i=i+8|0,c[e>>2]=v,e)|0);i=e}v=c[k+16>>2]|0;if((v|0)==0){break}dA(b,91720,(e=i,i=i+8|0,c[e>>2]=v,e)|0);i=e}}while(0);dA(b,90888,(e=i,i=i+8|0,h[e>>3]=+h[(c[o>>2]|0)+16>>3],e)|0);i=e;o=j+16|0;k=c[j+48>>2]|0;if((k|0)==5){j=c[o>>2]|0;if((pm(j,158656)|0)==0){w=_z(b,89320)|0;x=f|0;y=c[x>>2]|0;z=MD(y)|0;A=_z(b,z)|0;B=_z(b,88912)|0;C=_z(b,88456)|0;i=g;return}dA(b,90432,(e=i,i=i+8|0,c[e>>2]=j,e)|0);i=e;w=_z(b,89320)|0;x=f|0;y=c[x>>2]|0;z=MD(y)|0;A=_z(b,z)|0;B=_z(b,88912)|0;C=_z(b,88456)|0;i=g;return}else if((k|0)==1){k=o;j=d[k+1|0]|0;p=d[k+2|0]|0;dA(b,89832,(e=i,i=i+24|0,c[e>>2]=d[o]|0,c[e+8>>2]=j,c[e+16>>2]=p,e)|0);i=e;w=_z(b,89320)|0;x=f|0;y=c[x>>2]|0;z=MD(y)|0;A=_z(b,z)|0;B=_z(b,88912)|0;C=_z(b,88456)|0;i=g;return}else{cc(106400,105968,439,169832)}}function TD(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0;f=i;_z(a,97208)|0;g=+h[b>>3];j=+h[b+16>>3]-g;k=+h[b+8>>3];l=+h[b+24>>3]-k;m=+((c[44746]|0)>>>0>>>0)-(k+l);dA(a,96112,(b=i,i=i+16|0,h[b>>3]=g-j,h[b+8>>3]=m,b)|0);i=b;dA(a,95648,(b=i,i=i+16|0,h[b>>3]=j*2.0,h[b+8>>3]=l*2.0,b)|0);i=b;if((e|0)==0){_z(a,99360)|0;n=_z(a,105056)|0;YD(a);o=_z(a,95136)|0;i=f;return}e=c[a+16>>2]|0;_z(a,100312)|0;p=e+56|0;q=d[p]|d[p+1|0]<<8|d[p+2|0]<<16|d[p+3|0]<<24|0;p=e+88|0;e=d[p]|d[p+1|0]<<8|d[p+2|0]<<16|d[p+3|0]<<24|0;do{if((e|0)==5){_z(a,q)|0}else if((e|0)==1){p=q;if(q>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(b=i,i=i+24|0,c[b>>2]=p&255,c[b+8>>2]=p>>>8&255,c[b+16>>2]=p>>>16&255,b)|0);i=b;break}}else{cc(106400,105968,95,169848)}}while(0);_z(a,99776)|0;n=_z(a,105056)|0;YD(a);o=_z(a,95136)|0;i=f;return}function UD(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0;g=i;_z(a,118440)|0;j=c[44746]|0;dA(a,105448,(k=i,i=i+16|0,c[k>>2]=c[44742],c[k+8>>2]=j,k)|0);i=k;if((f|0)==0){_z(a,99360)|0}else{f=c[a+16>>2]|0;_z(a,100312)|0;j=f+56|0;l=d[j]|d[j+1|0]<<8|d[j+2|0]<<16|d[j+3|0]<<24|0;j=f+88|0;f=d[j]|d[j+1|0]<<8|d[j+2|0]<<16|d[j+3|0]<<24|0;do{if((f|0)==1){j=l;if(l>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(k=i,i=i+24|0,c[k>>2]=j&255,c[k+8>>2]=j>>>8&255,c[k+16>>2]=j>>>16&255,k)|0);i=k;break}}else if((f|0)==5){_z(a,l)|0}else{cc(106400,105968,95,169848)}}while(0);_z(a,99776)|0}_z(a,105056)|0;YD(a);_z(a,104616)|0;if((e|0)<=0){m=_z(a,111952)|0;i=g;return}l=e-1|0;f=0;do{n=+h[b+(f<<4)>>3];o=+((c[44746]|0)>>>0>>>0)- +h[b+(f<<4)+8>>3];if((f|0)==0){_z(a,103368)|0;dA(a,98960,(k=i,i=i+16|0,h[k>>3]=n,h[k+8>>3]=o,k)|0);i=k;_z(a,98544)|0}else{dA(a,98960,(k=i,i=i+16|0,h[k>>3]=n,h[k+8>>3]=o,k)|0);i=k}if((f|0)==(l|0)){_z(a,97832)|0}f=f+1|0;}while((f|0)<(e|0));m=_z(a,111952)|0;i=g;return}function VD(a,b,e,f,g,j){a=a|0;b=b|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;g=i;_z(a,118440)|0;f=c[44746]|0;dA(a,105448,(k=i,i=i+16|0,c[k>>2]=c[44742],c[k+8>>2]=f,k)|0);i=k;if((j|0)==0){_z(a,99360)|0}else{j=c[a+16>>2]|0;_z(a,100312)|0;f=j+56|0;l=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=j+88|0;j=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((j|0)==1){f=l;if(l>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(k=i,i=i+24|0,c[k>>2]=f&255,c[k+8>>2]=f>>>8&255,c[k+16>>2]=f>>>16&255,k)|0);i=k;break}}else if((j|0)==5){_z(a,l)|0}else{cc(106400,105968,95,169848)}}while(0);_z(a,99776)|0}_z(a,105056)|0;YD(a);_z(a,104616)|0;if((e|0)>0){m=0;n=103368}else{o=_z(a,100744)|0;p=_z(a,104128)|0;i=g;return}do{q=+h[b+(m<<4)>>3];r=+((c[44746]|0)>>>0>>>0)- +h[b+(m<<4)+8>>3];dA(a,102816,(k=i,i=i+24|0,c[k>>2]=n,h[k+8>>3]=q,h[k+16>>3]=r,k)|0);i=k;n=(m|0)==0?101736:213360;m=m+1|0;}while((m|0)<(e|0));o=_z(a,100744)|0;p=_z(a,104128)|0;i=g;return}function WD(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0.0;e=i;_z(a,118440)|0;f=c[44746]|0;dA(a,117512,(g=i,i=i+16|0,c[g>>2]=c[44742],c[g+8>>2]=f,g)|0);i=g;_z(a,116472)|0;if((d|0)<=0){j=_z(a,112512)|0;YD(a);k=_z(a,111952)|0;i=e;return}f=d-1|0;l=0;do{if((l|0)==0){_z(a,115672)|0;m=+((c[44746]|0)>>>0>>>0)- +h[b+8>>3];dA(a,114272,(g=i,i=i+16|0,h[g>>3]=+h[b>>3],h[g+8>>3]=m,g)|0);i=g;_z(a,113576)|0}else{m=+((c[44746]|0)>>>0>>>0)- +h[b+(l<<4)+8>>3];dA(a,114272,(g=i,i=i+16|0,h[g>>3]=+h[b+(l<<4)>>3],h[g+8>>3]=m,g)|0);i=g}if((l|0)==(f|0)){_z(a,113016)|0}l=l+1|0;}while((l|0)<(d|0));j=_z(a,112512)|0;YD(a);k=_z(a,111952)|0;i=e;return}function XD(a,b){a=a|0;b=b|0;_z(a,119952)|0;_z(a,MD(b)|0)|0;_z(a,119128)|0;return}function YD(a){a=a|0;var b=0,e=0,f=0,g=0,j=0,k=0,l=0.0,m=0;b=i;e=c[a+16>>2]|0;_z(a,111360)|0;f=e+16|0;g=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;f=e+48|0;j=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24|0;do{if((j|0)==5){_z(a,g)|0}else if((j|0)==1){f=g;if(g>>>0<16777216>>>0){_z(a,107320)|0;break}else{dA(a,106800,(k=i,i=i+24|0,c[k>>2]=f&255,c[k+8>>2]=f>>>8&255,c[k+16>>2]=f>>>16&255,k)|0);i=k;break}}else{cc(106400,105968,95,169848)}}while(0);l=+h[e+152>>3];if(l!=1.0){dA(a,110648,(k=i,i=i+8|0,h[k>>3]=l,k)|0);i=k}k=c[e+144>>2]|0;if((k|0)==1){_z(a,11e4)|0;m=_z(a,108488)|0;i=b;return}else if((k|0)==2){_z(a,109232)|0;m=_z(a,108488)|0;i=b;return}else{m=_z(a,108488)|0;i=b;return}}function ZD(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=c[a+16>>2]|0;e=c[c[a+12>>2]>>2]|0;f=c[e>>2]|0;g=c[e+4>>2]|0;h=c[e+8>>2]|0;dA(a,83056,(e=i,i=i+32|0,c[e>>2]=112680,c[e+8>>2]=f,c[e+16>>2]=g,c[e+24>>2]=h,e)|0);i=e;h=$w(c[d+8>>2]|0)|0;dA(a,82656,(e=i,i=i+16|0,c[e>>2]=112680,c[e+8>>2]=h,e)|0);i=e;dA(a,82104,(e=i,i=i+8|0,c[e>>2]=112680,e)|0);i=e;i=b;return}function _D(a){a=a|0;var b=0;b=i;dA(a,83456,(a=i,i=i+8|0,c[a>>2]=112680,a)|0);i=a;i=b;return}function $D(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0;d=i;e=c[b+456>>2]|0;f=c[b+460>>2]|0;g=c[b+464>>2]|0;j=c[b+468>>2]|0;k=b+360|0;do{if(!(a[17808]|0)){l=c[k>>2]|0;if((l|0)==0|(l|0)==90){break}Fv(0,83856,(m=i,i=i+16|0,c[m>>2]=14536,c[m+8>>2]=103320,m)|0)|0;i=m;a[17808]=1}}while(0);n=(+(j|0)- +(f|0))/72.0;o=(+(g|0)- +(e|0))/72.0;e=(c[k>>2]|0)==90;p=e?n:o;q=e?o:n;dA(b,102752,(m=i,i=i+16|0,h[m>>3]=p,h[m+8>>3]=q,m)|0);i=m;dA(b,101536,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;if(p>0.0){n=+Mb(+p);r=n+(3.0- +(~~n|0))}else{r=3.0}h[21655]=r;n=+U(+10.0,+r);h[21655]=n;dA(b,101128,(m=i,i=i+16|0,h[m>>3]=n,h[m+8>>3]=n,m)|0);i=m;dA(b,100648,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,100232,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,99704,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,99304,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,98888,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,98464,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,97688,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,97056,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,96024,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,95552,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,95080,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,94592,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,94216,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,93752,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,93272,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,92824,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,92128,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,91584,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,90776,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,90296,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,89736,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,89264,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,88768,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,88376,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,87920,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,87488,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,86912,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,86304,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,85512,(m=i,i=i+8|0,c[m>>2]=112680,m)|0);i=m;dA(b,85160,(m=i,i=i+16|0,h[m>>3]=q,h[m+8>>3]=p,m)|0);i=m;dA(b,84720,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;dA(b,84248,(m=i,i=i+1|0,i=i+7&-8,c[m>>2]=0,m)|0);i=m;i=d;return}function aE(a){a=a|0;var b=0;b=i;dA(a,104104,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0);i=a;i=b;return}function bE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;f=i;g=d;d=i;i=i+16|0;c[d>>2]=c[g>>2];c[d+4>>2]=c[g+4>>2];c[d+8>>2]=c[g+8>>2];c[d+12>>2]=c[g+12>>2];g=a[e+48|0]|0;if((g|0)==108){j=+h[e+32>>3];k=+h[d>>3]}else if((g|0)==114){l=+h[e+32>>3];g=d|0;m=+h[g>>3]-l;h[g>>3]=m;j=l;k=m}else{m=+h[e+32>>3];g=d|0;l=+h[g>>3]-m*.5;h[g>>3]=l;j=m;k=l}g=e+4|0;n=c[g>>2]|0;o=d+8|0;h[o>>3]=+h[n+16>>3]/216.0+ +h[o>>3];p=d|0;h[p>>3]=j/144.0+k;d=c[n>>2]|0;do{if((d|0)!=0){n=c[44108]|0;if((n|0)==0){q=25648}else{if((Ya(n|0,d|0)|0)==0){break}else{q=25648}}while(1){n=c[q+4>>2]|0;if((n|0)==0){Fv(1,147152,(r=i,i=i+16|0,c[r>>2]=14536,c[r+8>>2]=d,r)|0)|0;i=r;s=ob(d|0,45)|0;if((s|0)==0){t=144080;break}a[s]=0;q=25648;continue}else{if((Ya(n|0,d|0)|0)==0){u=11;break}q=q+8|0;continue}}if((u|0)==11){t=q|0}dA(b,162024,(r=i,i=i+8|0,c[r>>2]=t,r)|0);i=r;c[44108]=c[c[g>>2]>>2]}}while(0);if(!(a[14560]|0)){k=+h[21655];dA(b,158160,(r=i,i=i+16|0,c[r>>2]=1,h[r+8>>3]=k,r)|0);i=r;a[14560]=1}g=c[e>>2]|0;e=c[44112]|0;if((e|0)==0){c[44110]=64;t=dF(64)|0;c[44112]=t;v=t}else{v=e}e=a[g]|0;if(e<<24>>24==0){w=v;a[w]=0;x=c[44112]|0;y=+h[p>>3];z=+h[o>>3];dA(b,153160,(r=i,i=i+24|0,c[r>>2]=x,h[r+8>>3]=y,h[r+16>>3]=z,r)|0);i=r;i=f;return}else{A=0;B=v;C=g;D=e}while(1){e=C+1|0;g=c[44110]|0;if((A|0)>(g-8|0)){v=g<<1;c[44110]=v;g=gF(c[44112]|0,v)|0;c[44112]=g;E=g+A|0}else{E=B}if(D<<24>>24>-1){if(D<<24>>24==92){a[E]=92;F=E+1|0;G=A+1|0}else{F=E;G=A}a[F]=D;H=F+1|0;I=G+1|0}else{a[E]=92;nb(E+1|0,150176,(r=i,i=i+8|0,c[r>>2]=D&255,r)|0)|0;i=r;H=E+4|0;I=A+4|0}g=a[e]|0;if(g<<24>>24==0){w=H;break}else{A=I;B=H;C=e;D=g}}a[w]=0;x=c[44112]|0;y=+h[p>>3];z=+h[o>>3];dA(b,153160,(r=i,i=i+24|0,c[r>>2]=x,h[r+8>>3]=y,h[r+16>>3]=z,r)|0);i=r;i=f;return}function cE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0.0,g=0.0,j=0.0,k=0.0;e=i;f=+h[b>>3];g=(+h[b+16>>3]-f)*2.0/72.0;j=+h[b+8>>3];k=(+h[b+24>>3]-j)*2.0/72.0;dA(a,84448,(a=i,i=i+48|0,c[a>>2]=1,c[a+8>>2]=(d|0)!=0?79808:213480,h[a+16>>3]=g,h[a+24>>3]=k,h[a+32>>3]=f/72.0,h[a+40>>3]=j/72.0,a)|0);i=a;i=e;return}function dE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;hE(a,b,c,1);return}function eE(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0.0,D=0,E=0,F=0;g=i;i=i+80|0;f=g|0;e=g+64|0;j=dF((d*140|0)+140|0)|0;k=+h[b>>3];l=f+48|0;h[l>>3]=k;m=+h[b+8>>3];n=f+56|0;h[n>>3]=m;if(k<0.0){o=k+-.5}else{o=k+.5}if(m<0.0){p=m+-.5}else{p=m+.5}q=nb(j|0,106168,(r=i,i=i+16|0,c[r>>2]=~~o,c[r+8>>2]=~~p,r)|0)|0;i=r;if((d|0)>3){s=f|0;t=f;u=l;l=e|0;v=e+8|0;w=0;x=1;y=j+q|0;q=3;while(1){c[t>>2]=c[u>>2];c[t+4>>2]=c[u+4>>2];c[t+8>>2]=c[u+8>>2];c[t+12>>2]=c[u+12>>2];z=w+1|0;h[f+16>>3]=+h[b+(z<<4)>>3];h[f+24>>3]=+h[b+(z<<4)+8>>3];z=w+2|0;h[f+32>>3]=+h[b+(z<<4)>>3];h[f+40>>3]=+h[b+(z<<4)+8>>3];z=w+3|0;h[f+48>>3]=+h[b+(z<<4)>>3];h[n>>3]=+h[b+(z<<4)+8>>3];z=1;A=y;do{Qm(e,s,3,+(z|0)/6.0,0,0);p=+h[l>>3];o=+h[v>>3];if(p<0.0){B=p+-.5}else{B=p+.5}if(o<0.0){C=o+-.5}else{C=o+.5}D=nb(A|0,106168,(r=i,i=i+16|0,c[r>>2]=~~B,c[r+8>>2]=~~C,r)|0)|0;i=r;A=A+D|0;z=z+1|0;}while((z|0)<7);z=x+6|0;D=q+3|0;if((D|0)<(d|0)){w=q;x=z;y=A;q=D}else{E=z;break}}}else{E=1}dA(a,94872,(r=i,i=i+8|0,c[r>>2]=j,r)|0);i=r;eF(j);if((E|0)<=0){F=_z(a,100464)|0;i=g;return}j=E-1|0;q=0;do{dA(a,89408,(r=i,i=i+8|0,c[r>>2]=((q|0)%(j|0)|0|0)!=0,r)|0);i=r;q=q+1|0;}while((q|0)<(E|0));F=_z(a,100464)|0;i=g;return}function fE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0.0,k=0.0,l=0.0,m=0;e=i;if((d|0)>0){f=0}else{g=_z(a,100464)|0;i=e;return}do{j=+h[b+(f<<4)>>3];if(j<0.0){k=j+-.5}else{k=j+.5}j=+h[b+(f<<4)+8>>3];if(j<0.0){l=j+-.5}else{l=j+.5}dA(a,106168,(m=i,i=i+16|0,c[m>>2]=~~k,c[m+8>>2]=~~l,m)|0);i=m;f=f+1|0;}while((f|0)<(d|0));g=_z(a,100464)|0;i=e;return}function gE(a,b){a=a|0;b=b|0;var d=0;d=i;dA(a,121064,(a=i,i=i+16|0,c[a>>2]=112680,c[a+8>>2]=b,a)|0);i=a;i=d;return}function hE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;f=i;if((d|0)>0){g=0;do{j=+h[b+(g<<4)>>3];if(j<0.0){k=j+-.5}else{k=j+.5}j=+h[b+(g<<4)+8>>3];if(j<0.0){l=j+-.5}else{l=j+.5}dA(a,106168,(m=i,i=i+16|0,c[m>>2]=~~k,c[m+8>>2]=~~l,m)|0);i=m;g=g+1|0;}while((g|0)<(d|0))}if((e|0)==0){n=_z(a,100464)|0;i=f;return}l=+h[b>>3];if(l<0.0){o=l+-.5}else{o=l+.5}l=+h[b+8>>3];if(l<0.0){p=l+-.5}else{p=l+.5}dA(a,106168,(m=i,i=i+16|0,c[m>>2]=~~o,c[m+8>>2]=~~p,m)|0);i=m;n=_z(a,100464)|0;i=f;return}function iE(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=i;b=c;c=i;i=i+32|0;tF(c,b,32)|0;i=d;return}function jE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0.0,k=0.0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;f=b+8|0;b=c[f>>2]|0;dA(a,104488,(g=i,i=i+16|0,c[g>>2]=b,c[g+8>>2]=b,g)|0);i=g;j=(+h[d+16>>3]+ +h[d>>3])*.5;k=(+h[d+24>>3]+ +h[d+8>>3])*.5;dA(a,104008,(g=i,i=i+24|0,c[g>>2]=c[f>>2],h[g+8>>3]=j,h[g+16>>3]=k,g)|0);i=g;i=e;return}function kE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;g=+h[d>>3];j=+h[d+16>>3]-g;k=+h[d+24>>3];l=k- +h[d+8>>3];m=+(~~(+h[a+232>>3]- +h[a+216>>3])>>>0>>>0)-k;dA(a,103144,(d=i,i=i+40|0,c[d>>2]=c[b+8>>2],h[d+8>>3]=j,h[d+16>>3]=l,h[d+24>>3]=g,h[d+32>>3]=m,d)|0);i=d;_z(a,102528)|0;i=e;return}function lE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0.0;f=i;i=i+64|0;g=d;d=i;i=i+32|0;tF(d,g,32)|0;g=f|0;if((a|0)==0){cc(101464,101048,216,170880)}if((b|0)==0){cc(100576,101048,217,170880)}j=b+8|0;if((c[j>>2]|0)==0){cc(100144,101048,218,170880)}if((c[b+52>>2]|0)==0){i=f;return}b=g;k=d;c[b>>2]=c[k>>2];c[b+4>>2]=c[k+4>>2];c[b+8>>2]=c[k+8>>2];c[b+12>>2]=c[k+12>>2];k=g+32|0;b=k;l=d+16|0;c[b>>2]=c[l>>2];c[b+4>>2]=c[l+4>>2];c[b+8>>2]=c[l+8>>2];c[b+12>>2]=c[l+12>>2];l=g|0;m=+h[l>>3];b=g+16|0;h[b>>3]=m;n=+h[g+40>>3];d=g+24|0;h[d>>3]=n;o=+h[k>>3];h[g+48>>3]=o;k=g+8|0;p=+h[k>>3];h[g+56>>3]=p;if(e<<24>>24==0){q=g+32|0}else{dA(a,99632,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=p,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=n,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=o,h[r+8>>3]=n,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=o,h[r+8>>3]=p,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=p,r)|0);i=r;e=c[j>>2]|0;dA(a,98824,(r=i,i=i+16|0,c[r>>2]=4,c[r+8>>2]=e,r)|0);i=r;q=g+32|0}dA(a,99632,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0);i=r;m=+h[l>>3];s=+h[k>>3];dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=s,r)|0);i=r;t=+h[d>>3];dA(a,99240,(r=i,i=i+16|0,h[r>>3]=+h[b>>3],h[r+8>>3]=t,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=+h[q>>3],h[r+8>>3]=n,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=o,h[r+8>>3]=p,r)|0);i=r;dA(a,99240,(r=i,i=i+16|0,h[r>>3]=m,h[r+8>>3]=s,r)|0);i=r;q=c[j>>2]|0;dA(a,98400,(r=i,i=i+16|0,c[r>>2]=4,c[r+8>>2]=q,r)|0);i=r;i=f;return}function mE(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;f=i;i=i+80|0;g=e;e=i;i=i+32|0;tF(e,g,32)|0;g=f|0;if((b|0)==0){cc(101464,101048,157,170904)}if((d|0)==0){cc(100576,101048,158,170904)}if((c[d+8>>2]|0)==0){cc(100144,101048,159,170904)}j=d+52|0;do{if((c[j>>2]|0)==0){k=10}else{l=d+60|0;m=c[l>>2]|0;if((m|0)==156){break}Cc[m&255](d);c[j>>2]=0;c[l>>2]=0;c[d+56>>2]=0;k=10}}while(0);do{if((k|0)==10){if((CB(d)|0)<<24>>24==0){i=f;return}l=Ta(c[d+20>>2]|0)|0;if(((c[d+24>>2]|0)-6|0)>>>0<2>>>0){Xb(l|0,g|0)|0;m=c[g+36>>2]|0;c[d+56>>2]=m;n=dF(m)|0;c[j>>2]=n;Ra(l|0,n|0,m|0)|0;a[d+16|0]=1}if((c[j>>2]|0)!=0){c[d+60>>2]=156}DB(d);if((c[j>>2]|0)!=0){break}i=f;return}}while(0);o=+h[e+8>>3]- +(c[d+36>>2]|0);dA(b,97560,(j=i,i=i+16|0,h[j>>3]=+h[e>>3]- +(c[d+32>>2]|0),h[j+8>>3]=o,j)|0);i=j;if((a[d+16|0]|0)==0){dA(b,96824,(j=i,i=i+8|0,c[j>>2]=c[d+12>>2],j)|0);i=j}else{bl(b,d)}dA(b,95920,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0);i=j;i=f;return}function nE(a){a=a|0;eF(c[a+52>>2]|0);return}function oE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;if((a|0)==0){cc(101464,101048,125,170832)}f=c[a+16>>2]|0;if((f|0)==0){cc(95392,101048,127,170832)}if((b|0)==0){cc(100576,101048,128,170832)}d=b+8|0;if((c[d>>2]|0)==0){cc(100144,101048,129,170832)}if((c[f+8>>2]|0)==0){cc(95008,101048,132,170832)}else{dA(a,94528,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,94136,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,93664,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,93192,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,92744,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,92048,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,91416,(f=i,i=i+8|0,c[f>>2]=c[d>>2],f)|0);i=f;dA(a,90696,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;dA(a,90096,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0);i=f;i=e;return}}function pE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0,p=0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;if((a|0)==0){cc(101464,101048,101,170928)}if((b|0)==0){cc(100576,101048,102,170928)}f=c[b+8>>2]|0;if((f|0)==0){cc(100144,101048,103,170928)}g=+h[d>>3];if(g<0.0){j=g+-.5}else{j=g+.5}b=~~j;j=+h[d+8>>3];if(j<0.0){k=j+-.5}else{k=j+.5}l=~~k;k=+h[d+16>>3];if(k<0.0){m=k+-.5}else{m=k+.5}n=~~m;m=+h[d+24>>3];if(m<0.0){o=m+-.5}else{o=m+.5}d=~~o;dA(a,89608,(p=i,i=i+144|0,c[p>>2]=2,c[p+8>>2]=5,c[p+16>>2]=0,c[p+24>>2]=0,c[p+32>>2]=0,c[p+40>>2]=-1,c[p+48>>2]=1,c[p+56>>2]=-1,c[p+64>>2]=0,h[p+72>>3]=0.0,c[p+80>>2]=0,c[p+88>>2]=0,c[p+96>>2]=0,c[p+104>>2]=0,c[p+112>>2]=0,c[p+120>>2]=5,c[p+128>>2]=0,c[p+136>>2]=f,p)|0);i=p;dA(a,89184,(p=i,i=i+80|0,c[p>>2]=b,c[p+8>>2]=l,c[p+16>>2]=b,c[p+24>>2]=d,c[p+32>>2]=n,c[p+40>>2]=d,c[p+48>>2]=n,c[p+56>>2]=l,c[p+64>>2]=b,c[p+72>>2]=l,p)|0);i=p;i=e;return}function qE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0,q=0;e=i;f=d;d=i;i=i+32|0;tF(d,f,32)|0;g=+h[d+16>>3];j=+h[d>>3];k=(g-j)*72.0/96.0;l=+h[d+24>>3];m=+h[d+8>>3];n=(l-m)*72.0/96.0;o=(g+j-k)*.5;if((a|0)==0){cc(101464,101048,57,170856)}if((b|0)==0){cc(100576,101048,58,170856)}d=b+8|0;if((c[d>>2]|0)==0){cc(100144,101048,59,170856)}_z(a,88712)|0;_z(a,c[d>>2]|0)|0;d=a+360|0;j=-0.0-(l+m+n)*.5;if((c[d>>2]|0)==0){dA(a,87376,(p=i,i=i+32|0,h[p>>3]=k,h[p+8>>3]=n,h[p+16>>3]=o,h[p+24>>3]=j,p)|0);i=p;q=_z(a,86816)|0;i=e;return}else{dA(a,88248,(p=i,i=i+32|0,h[p>>3]=n,h[p+8>>3]=k,h[p+16>>3]=o,h[p+24>>3]=j,p)|0);i=p;dA(a,87832,(p=i,i=i+24|0,c[p>>2]=c[d>>2],h[p+8>>3]=o,h[p+16>>3]=j,p)|0);i=p;q=_z(a,86816)|0;i=e;return}}function rE(a){a=a|0;c[53566]=1;xt(a);c[53566]=0;return}function sE(a){a=a|0;c[53566]=2;xt(a);c[53566]=0;return}function tE(a){a=a|0;var b=0;if((zE(a)|0)!=0){b=1;return b|0}b=(uE(a)|0)!=0|0;return b|0}function uE(a){a=a|0;var b=0;if(a>>>0<131072>>>0){b=(d[3432+((d[3432+(a>>>8)|0]|0)<<5|a>>>3&31)|0]|0)>>>((a&7)>>>0)&1;return b|0}else{b=a>>>0<196606>>>0|0;return b|0}return 0}function vE(a){a=a|0;return Wa(a|0)|0}function wE(a){a=a|0;var b=0;if(a>>>0<32>>>0|(a-127|0)>>>0<33>>>0|(a-8232|0)>>>0<2>>>0){b=1;return b|0}b=(a-65529|0)>>>0<3>>>0|0;return b|0}function xE(a,b){a=a|0;b=b|0;var c=0;switch(b|0){case 6:{c=AE(a)|0;break};case 1:{c=tE(a)|0;break};case 8:{c=CE(a)|0;break};case 2:{c=uE(a)|0;break};case 4:{c=wE(a)|0;break};case 11:{c=FE(a)|0;break};case 12:{c=GE(a)|0;break};case 3:{c=vE(a)|0;break};case 10:{c=EE(a)|0;break};case 5:{c=zE(a)|0;break};case 9:{c=DE(a)|0;break};case 7:{c=BE(a)|0;break};default:{c=0}}return c|0}function yE(b){b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;c=a[b]|0;d=1;e=336;f=97;while(1){if(c<<24>>24==f<<24>>24){if((Ya(b|0,e|0)|0)==0){g=d;h=5;break}}i=e+6|0;j=a[i]|0;if(j<<24>>24==0){g=0;h=5;break}else{d=d+1|0;e=i;f=j}}if((h|0)==5){return g|0}return 0}function zE(a){a=a|0;return(a-48|0)>>>0<10>>>0|0}function AE(a){a=a|0;var b=0;if((EE(a)|0)!=0){b=0;return b|0}b=(CE(a)|0)!=0|0;return b|0}function BE(a){a=a|0;var b=0;if((HE(a)|0)!=(a|0)){b=1;return b|0}b=(a|0)==223|0;return b|0}function CE(a){a=a|0;var b=0;if(a>>>0<255>>>0){b=(a+1&127)>>>0>32>>>0|0;return b|0}if(a>>>0<8232>>>0|(a-8234|0)>>>0<47062>>>0|(a-57344|0)>>>0<8185>>>0){b=1;return b|0}else{return((a-65532|0)>>>0>1048579>>>0|(a&65534|0)==65534)&1^1|0}return 0}function DE(a){a=a|0;var b=0;if(a>>>0>=131072>>>0){b=0;return b|0}b=(d[6408+((d[6408+(a>>>8)|0]|0)<<5|a>>>3&31)|0]|0)>>>((a&7)>>>0)&1;return b|0}function EE(a){a=a|0;return(bF(20968,a)|0)!=0|0}function FE(a){a=a|0;return(JE(a)|0)!=(a|0)|0}function GE(a){a=a|0;var b=0;if((a-48|0)>>>0<10>>>0){b=1;return b|0}b=((a|32)-97|0)>>>0<6>>>0|0;return b|0}function HE(a){a=a|0;return IE(a,0)|0}function IE(c,f){c=c|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;g=(f<<1)-1|0;h=f-1|0;if((uE(c)|0)==0|(c-1536|0)>>>0<2560>>>0|(c-11776|0)>>>0<30784>>>0|(c-43008|0)>>>0<22272>>>0){i=c;return i|0}do{if((f|0)==0){if((c-11520|0)>>>0>=38>>>0){j=0;break}i=c-7264|0;return i|0}else{if((c-4256|0)>>>0>=46>>>0){j=0;break}do{if((c|0)>4293){if((c|0)==4301|(c|0)==4295){break}else{i=c}return i|0}}while(0);i=c+7264|0;return i|0}}while(0);while(1){k=a[71074+(j<<2)|0]|0;l=k<<24>>24;m=c-(e[71072+(j<<2)>>1]|0)|0;n=j+1|0;if((m-(l&h)|0)>>>0<(d[71075+(j<<2)|0]|0)>>>0){o=12;break}if((n|0)==61){break}else{j=n}}if((o|0)==12){if(k<<24>>24==1){i=f+c-(m&1)|0;return i|0}else{i=(da(l,g)|0)+c|0;return i|0}}g=1-f|0;l=b[14808+(g<<1)>>1]|0;a:do{if(l<<16>>16!=0){m=0;k=l;while(1){o=m+1|0;if((k&65535|0)==(c|0)){break}j=b[14808+(o<<2)+(g<<1)>>1]|0;if(j<<16>>16==0){break a}else{m=o;k=j}}i=e[14808+(m<<2)+(f<<1)>>1]|0;return i|0}}while(0);if((c-66600+(f*40|0)|0)>>>0>=40>>>0){i=c;return i|0}i=c-40+(f*80|0)|0;return i|0}function JE(a){a=a|0;return IE(a,1)|0}function KE(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0;g=i;i=i+8|0;h=g|0;c[h>>2]=b;if((e|0)==0){j=0;i=g;return j|0}do{if((f|0)!=0){if((b|0)==0){k=h;c[h>>2]=k;l=k}else{l=b}k=a[e]|0;m=k&255;if(k<<24>>24>-1){c[l>>2]=m;j=k<<24>>24!=0|0;i=g;return j|0}k=m-194|0;if(k>>>0>50>>>0){break}m=e+1|0;n=c[r+(k<<2)>>2]|0;if(f>>>0<4>>>0){if((n&-2147483648>>>(((f*6|0)-6|0)>>>0)|0)!=0){break}}k=d[m]|0;m=k>>>3;if((m-16|m+(n>>26))>>>0>7>>>0){break}m=k-128|n<<6;if((m|0)>=0){c[l>>2]=m;j=2;i=g;return j|0}n=(d[e+2|0]|0)-128|0;if(n>>>0>63>>>0){break}k=n|m<<6;if((k|0)>=0){c[l>>2]=k;j=3;i=g;return j|0}m=(d[e+3|0]|0)-128|0;if(m>>>0>63>>>0){break}c[l>>2]=m|k<<6;j=4;i=g;return j|0}}while(0);c[(Vb()|0)>>2]=84;j=-1;i=g;return j|0}function LE(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;f=i;i=i+104|0;g=f|0;h=f+8|0;j=f+16|0;k=f+24|0;l=f+32|0;m=f+40|0;n=f+48|0;o=f+56|0;p=dF(20)|0;q=p;if((p|0)==0){r=12;i=f;return r|0}s=dF(2048)|0;c[p+16>>2]=s;if((s|0)==0){eF(p);r=12;i=f;return r|0}c[p>>2]=512;c[p+4>>2]=10240;c[p+8>>2]=128;c[p+12>>2]=0;s=_E(0,0)|0;if((s|0)==0){eF(c[p+16>>2]|0);eF(p);r=12;i=f;return r|0}vF(o|0,0,44)|0;c[o>>2]=s;c[o+4>>2]=q;c[o+12>>2]=d;c[o+36>>2]=e;d=o+28|0;c[d>>2]=-1;t=ME(o)|0;a:do{if((t|0)==0){u=o+20|0;v=c[u>>2]|0;w=v-1|0;c[b>>2]=w;x=c[o+8>>2]|0;y=c[d>>2]|0;if((y|0)>-1){if((c[o+32>>2]|0)!=0){z=2;A=0;B=0;C=0;break}}if((y|0)>(w|0)){z=6;A=0;B=0;C=0;break}w=fF(1,68)|0;D=w;if((w|0)==0){z=12;A=D;B=0;C=0;break}E=y>>>31;c[w+60>>2]=E^1;c[w+64>>2]=c[o+32>>2];c[w+28>>2]=v;if((E|0)==1){if((e&8|0)==0){F=13}else{G=0}}else{F=13}if((F|0)==13){E=NE(0,q,x,D)|0;if((E|0)!=0){z=E;A=D;B=0;C=0;break}E=c[w+40>>2]|0;if((E|0)>0){v=(E<<2)+4|0;y=dF(v)|0;H=y;if((y|0)==0){z=12;A=D;B=0;C=0;break}c[w+32>>2]=H;vF(y|0,-1|0,v|0)|0;I=H}else{I=0}H=fF(E<<1|1,4)|0;c[w+36>>2]=H;if((H|0)==0){z=12;A=D;B=0;C=0;break}H=fF(c[u>>2]|0,12)|0;if((H|0)==0){z=12;A=D;B=0;C=0;break}c[w+16>>2]=H;H=NE(s,q,x,D)|0;if((H|0)==0){G=I}else{z=H;A=D;B=0;C=0;break}}H=o+24|0;u=p+12|0;E=c[u>>2]|0;c[j>>2]=0;c[k>>2]=0;v=TE(q,x)|0;b:do{if((v|0)==0){y=TE(q,0)|0;if((y|0)!=0){J=y;break}y=p+16|0;K=c[u>>2]|0;c:do{if((K|0)>(E|0)){L=0;M=0;N=0;O=K;d:while(1){P=O-1|0;c[u>>2]=P;Q=c[y>>2]|0;R=c[Q+(P<<2)>>2]|0;P=O-2|0;c[u>>2]=P;S=c[Q+(P<<2)>>2]|0;do{if((R|0)==0){P=c[S>>2]|0;if((P|0)==2){T=c[S+4>>2]|0;U=TE(q,L)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,S)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,1)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,c[T>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,0)|0;if((U|0)!=0){V=U;W=M;break c}if((c[T+4>>2]|0)>1){F=45}else{if((c[T+8>>2]|0)>1){F=45}else{X=L}}if((F|0)==45){F=0;c[j>>2]=0;X=0}Y=N+1|0;Z=M;_=X;break}else if((P|0)==0){T=c[S+4>>2]|0;U=c[T>>2]|0;if(!((U|0)>-1|(U|0)==-4)){Y=N;Z=M;_=L;break}U=T+8|0;T=(c[U>>2]|0)+L|0;c[U>>2]=T;if((T|0)<=(c[k>>2]|0)){Y=N;Z=M;_=L;break}c[k>>2]=T;Y=N;Z=M;_=L;break}else if((P|0)==1){T=c[S+4>>2]|0;U=TE(q,c[T+4>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,c[T>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}$=TE(q,0)|0}else if((P|0)==3){P=c[S+4>>2]|0;U=TE(q,c[P+4>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,0)|0;if((U|0)!=0){V=U;W=M;break c}U=TE(q,c[P>>2]|0)|0;if((U|0)!=0){V=U;W=M;break c}$=TE(q,0)|0}else{Y=N;Z=M;_=L;break}if(($|0)==0){Y=N;Z=M;_=L}else{V=$;W=M;break c}}else if((R|0)==1){U=S+4|0;P=c[U>>2]|0;T=O-3|0;c[u>>2]=T;aa=c[Q+(T<<2)>>2]|0;c[j>>2]=aa;T=P+4|0;ba=c[T>>2]|0;do{if((ba|0)>1){c[l>>2]=0;ca=P;F=51}else{if((c[P+8>>2]|0)<=1){da=aa;break}c[l>>2]=0;ea=P;if((ba|0)>0){ca=ea;F=51}else{fa=ba;ga=0;ha=aa;ia=ea;F=60}}}while(0);e:do{if((F|0)==51){F=0;ea=ba;ja=0;ka=1;la=aa;while(1){ma=UE(s,q,c[ca>>2]|0,(ka|0)<(ea|0)?1:2,j,G,m,k)|0;if((ma|0)!=0){J=ma;break b}ma=c[m>>2]|0;if((ja|0)==0){na=ma}else{oa=aF(s,0,0,1,32)|0;if((oa|0)==0){J=12;break b}pa=aF(s,0,0,1,8)|0;qa=oa+4|0;c[qa>>2]=pa;if((pa|0)==0){J=12;break b}c[oa>>2]=1;c[oa+8>>2]=-1;c[oa+12>>2]=-1;c[pa>>2]=ja;c[(c[qa>>2]|0)+4>>2]=ma;c[oa+16>>2]=(c[ma+16>>2]|0)+(c[ja+16>>2]|0);na=oa}if((na|0)==0){J=12;break b}oa=c[T>>2]|0;if((ka|0)>=(oa|0)){fa=oa;ga=na;ha=la;ia=ca;F=60;break e}ea=oa;ja=na;ka=ka+1|0;la=c[j>>2]|0}}}while(0);if((F|0)==60){F=0;T=P+8|0;ba=c[T>>2]|0;do{if((ba|0)==-1){la=c[j>>2]|0;ka=UE(s,q,c[ia>>2]|0,0,j,0,l,k)|0;if((ka|0)!=0){J=ka;break b}ka=c[l>>2]|0;ja=aF(s,0,0,1,32)|0;ea=ja;if((ja|0)==0){F=65;break d}oa=aF(s,0,0,1,16)|0;c[ja+4>>2]=oa;if((oa|0)==0){F=65;break d}c[ja>>2]=2;c[ja+8>>2]=-1;c[ja+12>>2]=-1;c[oa>>2]=ka;c[oa+4>>2]=0;c[oa+8>>2]=-1;ma=oa+12|0;a[ma]=a[ma]&-2;c[ja+16>>2]=c[ka+16>>2];c[l>>2]=ea;ra=la;sa=ea}else{if((fa|0)<(ba|0)){ta=fa;ua=0}else{ra=ha;sa=0;break}while(1){ea=c[j>>2]|0;la=UE(s,q,c[ia>>2]|0,0,j,0,n,k)|0;if((la|0)!=0){J=la;break b}la=c[n>>2]|0;if((ua|0)==0){va=la}else{ka=aF(s,0,0,1,32)|0;if((ka|0)==0){F=73;break d}ja=aF(s,0,0,1,8)|0;ma=ka+4|0;c[ma>>2]=ja;if((ja|0)==0){F=73;break d}c[ka>>2]=1;c[ka+8>>2]=-1;c[ka+12>>2]=-1;c[ja>>2]=la;c[(c[ma>>2]|0)+4>>2]=ua;c[ka+16>>2]=(c[ua+16>>2]|0)+(c[la+16>>2]|0);va=ka}c[l>>2]=va;if((va|0)==0){J=12;break b}ka=aF(s,0,0,1,32)|0;if((ka|0)==0){J=12;break b}la=aF(s,0,0,1,20)|0;c[ka+4>>2]=la;if((la|0)==0){J=12;break b}c[ka>>2]=0;c[ka+8>>2]=-1;c[ka+12>>2]=-1;c[la>>2]=-1;c[la+4>>2]=-1;c[la+8>>2]=-1;la=aF(s,0,0,1,32)|0;ma=la;if((la|0)==0){F=79;break d}ja=aF(s,0,0,1,8)|0;oa=la+4|0;c[oa>>2]=ja;if((ja|0)==0){F=79;break d}c[la>>2]=3;c[la+8>>2]=-1;c[la+12>>2]=-1;c[ja>>2]=ka;c[(c[oa>>2]|0)+4>>2]=va;c[la+16>>2]=(c[va+16>>2]|0)+(c[ka+16>>2]|0);c[l>>2]=ma;ka=ta+1|0;if((ka|0)<(c[T>>2]|0)){ta=ka;ua=ma}else{ra=ea;sa=ma;break}}}}while(0);c[j>>2]=ra;do{if((ga|0)==0){wa=sa;F=85}else{if((sa|0)==0){xa=ga;break}T=aF(s,0,0,1,32)|0;if((T|0)==0){J=12;break b}ba=aF(s,0,0,1,8)|0;P=T+4|0;c[P>>2]=ba;if((ba|0)==0){J=12;break b}c[T>>2]=1;c[T+8>>2]=-1;c[T+12>>2]=-1;c[ba>>2]=ga;c[(c[P>>2]|0)+4>>2]=sa;c[T+16>>2]=(c[sa+16>>2]|0)+(c[ga+16>>2]|0);wa=T;F=85}}while(0);if((F|0)==85){F=0;if((wa|0)==0){J=12;break b}else{xa=wa}}c[U>>2]=c[xa+4>>2];c[S>>2]=c[xa>>2];da=ra}T=N-1|0;P=da-aa+M|0;if((T|0)!=0){Y=T;Z=P;_=da;break}c[j>>2]=P;Y=0;Z=P;_=P}else{Y=N;Z=M;_=L}}while(0);S=c[u>>2]|0;if((S|0)>(E|0)){L=_;M=Z;N=Y;O=S}else{V=0;W=Z;break c}}if((F|0)==65){c[l>>2]=0;J=12;break b}else if((F|0)==73){c[l>>2]=0;J=12;break b}else if((F|0)==79){c[l>>2]=0;J=12;break b}}else{V=0;W=0}}while(0);y=(c[H>>2]|0)+W|0;K=c[k>>2]|0;c[H>>2]=(K|0)>(y|0)?K:y;J=V}else{J=v}}while(0);if((J|0)!=0){z=J;A=D;B=0;C=0;break}v=c[H>>2]|0;c[H>>2]=v+1;E=aF(s,0,0,1,32)|0;if((E|0)==0){z=12;A=D;B=0;C=0;break}y=aF(s,0,0,1,20)|0;c[E+4>>2]=y;if((y|0)==0){z=12;A=D;B=0;C=0;break}c[E>>2]=0;c[E+8>>2]=-1;c[E+12>>2]=-1;c[y>>2]=0;c[y+4>>2]=0;c[y+8>>2]=v;v=aF(s,0,0,1,32)|0;y=v;if((v|0)==0){z=12;A=D;B=0;C=0;break}K=aF(s,0,0,1,8)|0;O=v+4|0;c[O>>2]=K;if((K|0)==0){z=12;A=D;B=0;C=0;break}c[v>>2]=1;c[v+8>>2]=-1;c[v+12>>2]=-1;c[K>>2]=x;c[(c[O>>2]|0)+4>>2]=E;c[v+16>>2]=(c[E+16>>2]|0)+(c[x+16>>2]|0);E=c[u>>2]|0;O=TE(q,v)|0;if((O|0)!=0){z=O;A=D;B=0;C=0;break}O=TE(q,0)|0;if((O|0)!=0){z=O;A=D;B=0;C=0;break}O=c[u>>2]|0;f:do{if((O|0)>(E|0)){K=p+16|0;N=O;g:while(1){M=N-1|0;c[u>>2]=M;L=c[K>>2]|0;S=c[L+(M<<2)>>2]|0;M=N-2|0;c[u>>2]=M;ya=c[L+(M<<2)>>2]|0;do{if((S|0)==3){M=c[ya+4>>2]|0;L=M;do{if((c[M+4>>2]|0)==0){F=141}else{if((c[(c[L>>2]|0)+8>>2]|0)!=0){F=141;break}c[ya+8>>2]=0}}while(0);if((F|0)==141){F=0;c[ya+8>>2]=1}c[ya+24>>2]=c[(c[L>>2]|0)+24>>2];c[ya+28>>2]=c[(c[L>>2]|0)+28>>2]}else if((S|0)==2){M=c[ya+4>>2]|0;Q=M;if((c[(c[Q>>2]|0)+8>>2]|0)==0){za=0}else{za=(c[(c[M+4>>2]|0)+8>>2]|0)!=0|0}c[ya+8>>2]=za;R=c[Q>>2]|0;if((c[R+8>>2]|0)==0){c[ya+24>>2]=c[R+24>>2];Aa=M+4|0}else{P=SE(q,R,0,0,g)|0;if((P|0)!=0){z=P;A=D;B=0;C=0;break a}Ba=dF((c[g>>2]<<2)+4|0)|0;P=Ba;if((Ba|0)==0){z=12;A=D;B=0;C=0;break a}c[P>>2]=-1;c[h>>2]=0;Ca=SE(q,c[Q>>2]|0,P,h,0)|0;if((Ca|0)!=0){F=150;break g}R=M+4|0;M=ya+24|0;c[M>>2]=RE(s,c[(c[R>>2]|0)+24>>2]|0,c[(c[Q>>2]|0)+24>>2]|0,P,c[h>>2]|0)|0;eF(Ba);if((c[M>>2]|0)==0){z=12;A=D;B=0;C=0;break a}else{Aa=R}}R=c[Aa>>2]|0;if((c[R+8>>2]|0)==0){c[ya+28>>2]=c[R+28>>2];break}M=SE(q,R,0,0,g)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}Da=dF((c[g>>2]<<2)+4|0)|0;M=Da;if((Da|0)==0){z=12;A=D;B=0;C=0;break a}c[M>>2]=-1;c[h>>2]=0;Ea=SE(q,c[Aa>>2]|0,M,h,0)|0;if((Ea|0)!=0){F=157;break g}R=ya+28|0;c[R>>2]=RE(s,c[(c[Q>>2]|0)+28>>2]|0,c[(c[Aa>>2]|0)+28>>2]|0,M,c[h>>2]|0)|0;eF(Da);if((c[R>>2]|0)==0){z=12;A=D;B=0;C=0;break a}}else if((S|0)==1){R=c[ya+4>>2]|0;M=R;Q=R+4|0;if((c[(c[M>>2]|0)+8>>2]|0)==0){Fa=(c[(c[Q>>2]|0)+8>>2]|0)!=0|0}else{Fa=1}c[ya+8>>2]=Fa;R=RE(s,c[(c[M>>2]|0)+24>>2]|0,c[(c[Q>>2]|0)+24>>2]|0,0,0)|0;c[ya+24>>2]=R;if((R|0)==0){z=12;A=D;B=0;C=0;break a}R=RE(s,c[(c[M>>2]|0)+28>>2]|0,c[(c[Q>>2]|0)+28>>2]|0,0,0)|0;c[ya+28>>2]=R;if((R|0)==0){z=12;A=D;B=0;C=0;break a}}else if((S|0)==0){R=c[ya>>2]|0;if((R|0)==1){Q=TE(q,ya)|0;if((Q|0)!=0){z=Q;A=D;B=0;C=0;break a}Q=TE(q,2)|0;if((Q|0)!=0){z=Q;A=D;B=0;C=0;break a}Q=ya+4|0;M=TE(q,c[(c[Q>>2]|0)+4>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,c[c[Q>>2]>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)==0){break}else{z=M;A=D;B=0;C=0;break a}}else if((R|0)==2){M=TE(q,ya)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,3)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,c[c[ya+4>>2]>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)==0){break}else{z=M;A=D;B=0;C=0;break a}}else if((R|0)==0){M=c[ya+4>>2]|0;Q=M;P=c[Q>>2]|0;if((P|0)==-4){c[ya+8>>2]=0;T=M+8|0;ba=c[T>>2]|0;ma=aF(s,0,0,1,64)|0;if((ma|0)==0){F=104;break g}c[ma>>2]=ba;c[ma+4>>2]=0;c[ma+8>>2]=1114111;c[ma+20>>2]=0;c[ma+24>>2]=0;vF(ma+28|0,-1|0,16)|0;c[ya+24>>2]=ma;ma=c[T>>2]|0;T=c[M+4>>2]|0;ba=aF(s,0,0,1,64)|0;if((ba|0)==0){F=106;break g}c[ba>>2]=ma;c[ba+4>>2]=0;c[ba+8>>2]=1114111;c[ba+20>>2]=0;c[ba+24>>2]=0;c[ba+28>>2]=T;c[ba+32>>2]=-1;c[ba+36>>2]=-1;c[ba+40>>2]=-1;c[ya+28>>2]=ba;break}ba=ya+8|0;if((P|0)<0){c[ba>>2]=1;P=aF(s,0,0,1,32)|0;if((P|0)==0){F=110;break g}c[P>>2]=-1;c[P+4>>2]=-1;c[P+8>>2]=-1;c[ya+24>>2]=P;P=aF(s,0,0,1,32)|0;if((P|0)==0){F=112;break g}c[P>>2]=-1;c[P+4>>2]=-1;c[P+8>>2]=-1;c[ya+28>>2]=P;break}else{c[ba>>2]=0;ba=M+8|0;P=c[ba>>2]|0;T=c[Q>>2]|0;ma=M+4|0;ea=c[ma>>2]|0;ka=aF(s,0,0,1,64)|0;if((ka|0)==0){F=115;break g}c[ka>>2]=P;c[ka+4>>2]=T;c[ka+8>>2]=ea;c[ka+20>>2]=0;c[ka+24>>2]=0;vF(ka+28|0,-1|0,16)|0;c[ya+24>>2]=ka;ka=c[ba>>2]|0;ba=c[Q>>2]|0;Q=c[ma>>2]|0;ma=c[M+12>>2]|0;ea=c[M+16>>2]|0;M=aF(s,0,0,1,64)|0;if((M|0)==0){F=117;break g}c[M>>2]=ka;c[M+4>>2]=ba;c[M+8>>2]=Q;c[M+20>>2]=ma;c[M+24>>2]=ea;vF(M+28|0,-1|0,16)|0;c[ya+28>>2]=M;break}}else if((R|0)==3){R=TE(q,ya)|0;if((R|0)!=0){z=R;A=D;B=0;C=0;break a}R=TE(q,1)|0;if((R|0)!=0){z=R;A=D;B=0;C=0;break a}R=ya+4|0;M=TE(q,c[(c[R>>2]|0)+4>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,c[c[R>>2]>>2]|0)|0;if((M|0)!=0){z=M;A=D;B=0;C=0;break a}M=TE(q,0)|0;if((M|0)==0){break}else{z=M;A=D;B=0;C=0;break a}}else{break}}}while(0);N=c[u>>2]|0;if((N|0)<=(E|0)){break f}}if((F|0)==104){c[ya+24>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==106){c[ya+28>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==110){c[ya+24>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==112){c[ya+28>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==115){c[ya+24>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==117){c[ya+28>>2]=0;z=12;A=D;B=0;C=0;break a}else if((F|0)==150){eF(Ba);z=Ca;A=D;B=0;C=0;break a}else if((F|0)==157){eF(Da);z=Ea;A=D;B=0;C=0;break a}}}while(0);E=c[H>>2]|0;u=E<<2;O=dF(u)|0;x=O;if((O|0)==0){z=12;A=D;B=x;C=0;break}N=dF(u)|0;u=N;if((N|0)==0){z=12;A=D;B=x;C=u;break}if((E|0)>0){vF(O|0,0,((E|0)>1?E<<2:4)|0)|0}OE(y,0,x,0)|0;E=c[H>>2]|0;if((E|0)>0){K=0;S=0;while(1){c[u+(K<<2)>>2]=S;M=x+(K<<2)|0;R=S+1+(c[M>>2]|0)|0;c[M>>2]=0;M=K+1|0;if((M|0)<(E|0)){K=M;S=R}else{Ga=R;break}}}else{Ga=0}S=fF(Ga+1|0,32)|0;K=S;if((S|0)==0){z=12;A=D;B=x;C=u;break}c[w>>2]=K;S=w+4|0;c[S>>2]=Ga;E=OE(y,K,x,u)|0;if((E|0)!=0){z=E;A=D;B=x;C=u;break}c[w+20>>2]=0;E=v+24|0;R=c[E>>2]|0;if((c[R>>2]|0)>-1){M=1;ea=R;while(1){R=ea+32|0;ma=M+1|0;if((c[R>>2]|0)>-1){M=ma;ea=R}else{Ha=ma;break}}}else{Ha=1}ea=fF(Ha,32)|0;M=ea;if((ea|0)==0){z=12;A=D;B=x;C=u;break}c[w+8>>2]=M;ea=c[E>>2]|0;y=c[ea>>2]|0;if((y|0)>-1){ma=0;R=ea;ea=y;while(1){c[M+(ma<<5)+8>>2]=K+(c[u+(ea<<2)>>2]<<5);c[M+(ma<<5)+12>>2]=c[R>>2];y=M+(ma<<5)+16|0;c[y>>2]=0;Q=R+12|0;ba=c[Q>>2]|0;if((ba|0)!=0){ka=0;while(1){Ia=ka+1|0;if((c[ba+(ka<<2)>>2]|0)>-1){ka=Ia}else{break}}ka=Ia<<2;ba=dF(ka)|0;c[y>>2]=ba;if((ba|0)==0){z=12;A=D;B=x;C=u;break a}tF(ba|0,c[Q>>2]|0,ka)|0}c[M+(ma<<5)+20>>2]=c[R+16>>2];ka=ma+1|0;ba=R+32|0;T=c[ba>>2]|0;if((T|0)>-1){ma=ka;R=ba;ea=T}else{Ja=ka;break}}}else{Ja=0}c[M+(Ja<<5)+8>>2]=0;c[S>>2]=Ga;c[w+12>>2]=K+(c[u+(c[c[v+28>>2]>>2]<<2)>>2]<<5);c[w+52>>2]=c[H>>2];c[w+56>>2]=e;$E(s);eF(c[p+16>>2]|0);eF(p);eF(O);eF(N);c[b+4>>2]=w;r=0;i=f;return r|0}else{z=t;A=0;B=0;C=0}}while(0);$E(s);eF(c[p+16>>2]|0);eF(p);if((B|0)!=0){eF(B)}if((C|0)!=0){eF(C)}c[b+4>>2]=A;PE(b);r=z;i=f;return r|0}function ME(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0;d=i;i=i+424|0;e=d|0;f=d+8|0;g=d+72|0;h=d+328|0;j=d+336|0;k=d+384|0;l=d+392|0;m=c[b+4>>2]|0;n=m+12|0;o=c[n>>2]|0;if((c[b+40>>2]|0)==0){p=b+20|0;TE(m,c[p>>2]|0)|0;TE(m,2)|0;c[p>>2]=(c[p>>2]|0)+1}p=TE(m,0)|0;q=b+12|0;r=b+16|0;c[r>>2]=c[q>>2];s=c[n>>2]|0;t=(p|0)==0;a:do{if((s|0)>(o|0)&t){u=m+16|0;v=b+36|0;w=b|0;x=b+24|0;y=b+20|0;z=f|0;A=b+28|0;B=l|0;C=k|0;D=k+1|0;E=j;F=b;G=j+12|0;H=j+40|0;I=j+24|0;J=j+8|0;K=0;L=0;M=s;b:while(1){N=M-1|0;c[n>>2]=N;O=c[u>>2]|0;c:do{switch(c[O+(N<<2)>>2]|0){case 7:{P=c[q>>2]|0;Q=a[P]|0;if((Q|0)==41){c[q>>2]=P+1;R=0;S=L;T=K;break c}else if((Q|0)!=124){R=0;S=L;T=K;break c}Q=TE(m,7)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}Q=TE(m,K)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}Q=TE(m,8)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}Q=TE(m,3)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=K;break};case 4:{Q=TE(m,9)|0;if((Q|0)!=0){U=Q;V=L;W=6;break b}R=TE(m,1)|0;S=L;T=K;break};case 5:{Q=c[q>>2]|0;P=a[Q]|0;if(P<<24>>24==0){R=0;S=L;T=K;break c}X=c[v>>2]&1;Y=(X|0)!=0;if(Y&P<<24>>24==124){R=0;S=L;T=K;break c}do{if(!(Y&P<<24>>24==41&(L|0)>0)){if((X|0)==0&P<<24>>24==92){if((a[Q+1|0]|0)==41){break}}Z=TE(m,5)|0;if((Z|0)!=0){U=Z;V=L;W=6;break b}Z=TE(m,K)|0;if((Z|0)!=0){U=Z;V=L;W=6;break b}Z=TE(m,6)|0;if((Z|0)!=0){U=Z;V=L;W=6;break b}R=TE(m,4)|0;S=L;T=K;break c}}while(0);P=(X|L|0)==0?8:0;Y=L-1|0;if((X|0)!=0){R=P;S=Y;T=K;break c}c[q>>2]=Q+2;R=P;S=Y;T=K;break};case 1:{Y=c[q>>2]|0;d:do{switch(a[Y]|0){case 91:{P=Y+1|0;c[q>>2]=P;Z=dF(128)|0;if((Z|0)==0){_=12;W=297;break b}if((a[P]|0)==94){$=Y+2|0;c[q>>2]=$;aa=1;ba=$}else{aa=0;ba=P}P=(aa|0)==0;$=ba;ca=32;da=0;ea=0;fa=Z;e:while(1){Z=a[$]|0;if((Z<<24>>24|0)==0){ga=$;ha=7;ia=fa;W=140;break}else if((Z<<24>>24|0)==93){if($>>>0>(c[q>>2]|0)>>>0){W=85;break}}Z=KE(e,$,-1)|0;if((Z|0)<0){c[e>>2]=-1;ja=1}else{ja=Z}Z=$+ja|0;do{if((a[Z]|0)==45){ka=ja+1|0;la=$+ka|0;if((a[la]|0)==93){W=94;break}ma=c[e>>2]|0;na=KE(e,la,-1)|0;if((na|0)<0){c[e>>2]=-1;oa=1;pa=-1}else{oa=na;pa=c[e>>2]|0}qa=$+(oa+ka)|0;ra=pa;sa=ma;ta=ma>>>0>pa>>>0?11:0;ua=0}else{W=94}}while(0);f:do{if((W|0)==94){W=0;ma=a[$]|0;do{if((ma<<24>>24|0)==91){ka=a[$+1|0]|0;if((ka<<24>>24|0)==46|(ka<<24>>24|0)==61){ga=$;ha=3;ia=fa;W=140;break e}else if((ka<<24>>24|0)!=58){va=0;break}ka=$+2|0;na=ka;while(1){la=a[na]|0;wa=la<<24>>24==0;if(la<<24>>24!=58&(wa^1)){na=na+1|0}else{break}}if(wa){ga=$;ha=4;ia=fa;W=140;break e}la=na-$-2|0;xa=(la|0)>63?63:la;DF(z|0,ka|0,xa|0)|0;a[f+xa|0]=0;xa=yE(z)|0;qa=na+2|0;ra=1114111;sa=0;ta=(xa|0)==0?4:0;ua=xa;break f}else if((ma<<24>>24|0)==45){if((a[$+1|0]|0)==93){va=0;break}va=(c[q>>2]|0)==($|0)?0:11}else{va=0}}while(0);ma=c[e>>2]|0;qa=Z;ra=ma;sa=ma;ta=va;ua=0}}while(0);if((ta|0)!=0){ga=qa;ha=ta;ia=fa;W=140;break}Z=(ua|0)!=0;do{if(P|Z^1){ma=c[w>>2]|0;if((da|0)<(ca|0)){ya=ca;za=fa}else{if((ca|0)>1024){ga=qa;ha=12;ia=fa;W=140;break e}xa=gF(fa,ca<<3)|0;if((xa|0)==0){ga=qa;ha=12;ia=fa;W=140;break e}else{ya=ca<<1;za=xa}}xa=aF(ma,0,0,1,32)|0;if((xa|0)==0){W=112;break e}la=aF(ma,0,0,1,20)|0;ma=xa+4|0;c[ma>>2]=la;if((la|0)==0){W=112;break e}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[la>>2]=sa;c[la+4>>2]=ra;c[la+8>>2]=-1;c[za+(da<<2)>>2]=xa;c[(c[ma>>2]|0)+12>>2]=ua;Aa=0;Ba=ya;Ca=da+1|0;Da=ea;Ea=za}else{if((ea|0)>63){Aa=12;Ba=ca;Ca=da;Da=ea;Ea=fa;break}c[g+(ea<<2)>>2]=ua;Aa=0;Ba=ca;Ca=da;Da=ea+1|0;Ea=fa}}while(0);ma=(Aa|0)==0;if(ma&(((c[v>>2]&2|0)==0|Z)^1)){Fa=sa;Ga=Ba;Ha=Ca;Ia=Ea}else{if(ma){$=qa;ca=Ba;da=Ca;ea=Da;fa=Ea;continue}else{ga=qa;ha=Aa;ia=Ea;W=140;break}}while(1){ma=Fa;while(1){if(ma>>>0>ra>>>0){$=qa;ca=Ga;da=Ha;ea=Da;fa=Ia;continue e}if((BE(ma)|0)!=0){W=118;break}Ka=ma+1|0;if((FE(ma)|0)==0){ma=Ka}else{W=129;break}}if((W|0)==118){W=0;xa=HE(ma)|0;la=ma+1|0;g:do{if((BE(la)|0)==0){La=xa;Ma=la}else{Na=xa;Oa=la;while(1){if((HE(Oa)|0)!=(Na+1|0)|Oa>>>0>ra>>>0){La=Na;Ma=Oa;break g}Pa=HE(Oa)|0;Qa=Oa+1|0;if((BE(Qa)|0)==0){La=Pa;Ma=Qa;break}else{Na=Pa;Oa=Qa}}}}while(0);la=c[w>>2]|0;if((Ha|0)<(Ga|0)){Ra=Ga;Sa=Ia}else{if((Ga|0)>1024){ga=qa;ha=12;ia=Ia;W=140;break e}Oa=gF(Ia,Ga<<3)|0;if((Oa|0)==0){ga=qa;ha=12;ia=Ia;W=140;break e}else{Ra=Ga<<1;Sa=Oa}}Oa=aF(la,0,0,1,32)|0;Na=Oa;do{if((Oa|0)==0){Ta=0}else{na=aF(la,0,0,1,20)|0;c[Oa+4>>2]=na;if((na|0)==0){Ta=0;break}c[Oa>>2]=0;c[Oa+8>>2]=-1;c[Oa+12>>2]=-1;c[na>>2]=xa;c[na+4>>2]=La;c[na+8>>2]=-1;Ta=Na}}while(0);c[Sa+(Ha<<2)>>2]=Ta;Ua=Ma;Va=Ra;Wa=Ta;Xa=Sa}else if((W|0)==129){W=0;Na=JE(ma)|0;h:do{if((FE(Ka)|0)==0){Ya=Ka;Za=Na}else{xa=Ka;Oa=Na;while(1){if((JE(xa)|0)!=(Oa+1|0)|xa>>>0>ra>>>0){Ya=xa;Za=Oa;break h}la=xa+1|0;na=JE(xa)|0;if((FE(la)|0)==0){Ya=la;Za=na;break}else{xa=la;Oa=na}}}}while(0);ma=c[w>>2]|0;if((Ha|0)<(Ga|0)){_a=Ga;$a=Ia}else{if((Ga|0)>1024){ga=qa;ha=12;ia=Ia;W=140;break e}Oa=gF(Ia,Ga<<3)|0;if((Oa|0)==0){ga=qa;ha=12;ia=Ia;W=140;break e}else{_a=Ga<<1;$a=Oa}}Oa=aF(ma,0,0,1,32)|0;xa=Oa;do{if((Oa|0)==0){ab=0}else{na=aF(ma,0,0,1,20)|0;c[Oa+4>>2]=na;if((na|0)==0){ab=0;break}c[Oa>>2]=0;c[Oa+8>>2]=-1;c[Oa+12>>2]=-1;c[na>>2]=Na;c[na+4>>2]=Za;c[na+8>>2]=-1;ab=xa}}while(0);c[$a+(Ha<<2)>>2]=ab;Ua=Ya;Va=_a;Wa=ab;Xa=$a}if((Wa|0)==0){W=141;break e}else{Fa=Ua;Ga=Va;Ha=Ha+1|0;Ia=Xa}}}i:do{if((W|0)==85){W=0;c[q>>2]=$+1;ca=(aa|0)!=0;if(ca){Jb(fa|0,da|0,4,148)}j:do{if((da|0)>0){P=(ea|0)>0;Z=(ea<<2)+4|0;if(ca){bb=0;cb=0;db=0;eb=0}else{xa=0;Na=0;while(1){Oa=fa+(xa<<2)|0;ma=c[(c[Oa>>2]|0)+4>>2]|0;do{if((ma|0)==0){fb=Na;gb=0}else{c[ma+8>>2]=c[x>>2];if(P){na=aF(c[w>>2]|0,0,0,0,Z)|0;la=na;ka=ma+16|0;c[ka>>2]=la;if((na|0)==0){hb=Na;ib=12;jb=fa;break i}else{kb=0;lb=la}do{c[lb+(kb<<2)>>2]=c[g+(kb<<2)>>2];kb=kb+1|0;lb=c[ka>>2]|0}while((kb|0)<(ea|0));c[lb+(ea<<2)>>2]=0}else{c[ma+16>>2]=0}if((Na|0)==0){fb=c[Oa>>2]|0;gb=0;break}ka=c[w>>2]|0;la=c[Oa>>2]|0;na=aF(ka,0,0,1,32)|0;Qa=na;do{if((na|0)==0){mb=0}else{Pa=aF(ka,0,0,1,8)|0;nb=na+4|0;c[nb>>2]=Pa;if((Pa|0)==0){mb=0;break}c[na>>2]=3;c[na+8>>2]=-1;c[na+12>>2]=-1;c[Pa>>2]=Na;c[(c[nb>>2]|0)+4>>2]=la;c[na+16>>2]=(c[la+16>>2]|0)+(c[Na+16>>2]|0);mb=Qa}}while(0);fb=mb;gb=(mb|0)==0?12:0}}while(0);Oa=xa+1|0;if((Oa|0)<(da|0)&(gb|0)==0){xa=Oa;Na=fb}else{ob=gb;pb=0;qb=fb;break j}}}while(1){Na=fa+(bb<<2)|0;xa=c[(c[Na>>2]|0)+4>>2]|0;Oa=xa;ma=c[Oa>>2]|0;Qa=xa+4|0;la=c[Qa>>2]|0;do{if((ma|0)<(cb|0)){na=la+1|0;rb=eb;sb=0;tb=(na|0)<(cb|0)?cb:na;ub=db}else{if((ma|0)<=(db|0)){na=la+1|0;rb=eb;sb=0;tb=na;ub=na;break}c[Oa>>2]=db;c[Qa>>2]=ma-1;na=la+1|0;if((xa|0)==0){rb=eb;sb=0;tb=na;ub=na;break}c[xa+8>>2]=c[x>>2];if(P){ka=aF(c[w>>2]|0,0,0,0,Z)|0;nb=ka;Pa=xa+16|0;c[Pa>>2]=nb;if((ka|0)==0){hb=eb;ib=12;jb=fa;break i}else{vb=0;wb=nb}do{c[wb+(vb<<2)>>2]=c[g+(vb<<2)>>2];vb=vb+1|0;wb=c[Pa>>2]|0}while((vb|0)<(ea|0));c[wb+(ea<<2)>>2]=0}else{c[xa+16>>2]=0}if((eb|0)==0){rb=c[Na>>2]|0;sb=0;tb=na;ub=na;break}Pa=c[w>>2]|0;nb=c[Na>>2]|0;ka=aF(Pa,0,0,1,32)|0;xb=ka;do{if((ka|0)==0){yb=0}else{zb=aF(Pa,0,0,1,8)|0;Ab=ka+4|0;c[Ab>>2]=zb;if((zb|0)==0){yb=0;break}c[ka>>2]=3;c[ka+8>>2]=-1;c[ka+12>>2]=-1;c[zb>>2]=eb;c[(c[Ab>>2]|0)+4>>2]=nb;c[ka+16>>2]=(c[nb+16>>2]|0)+(c[eb+16>>2]|0);yb=xb}}while(0);rb=yb;sb=(yb|0)==0?12:0;tb=na;ub=na}}while(0);Na=bb+1|0;if((Na|0)<(da|0)&(sb|0)==0){bb=Na;cb=tb;db=ub;eb=rb}else{ob=sb;pb=ub;qb=rb;break}}}else{ob=0;pb=0;qb=0}}while(0);if((ob|0)!=0|ca^1){hb=qb;ib=ob;jb=fa;break}Z=c[w>>2]|0;P=c[x>>2]|0;Na=aF(Z,0,0,1,32)|0;xa=Na;if((Na|0)==0){hb=qb;ib=12;jb=fa;break}la=aF(Z,0,0,1,20)|0;Z=Na+4|0;c[Z>>2]=la;if((la|0)==0){hb=qb;ib=12;jb=fa;break}c[Na>>2]=0;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[la>>2]=pb;c[la+4>>2]=1114111;c[la+8>>2]=P;P=c[Z>>2]|0;if((ea|0)>0){Z=aF(c[w>>2]|0,0,0,0,(ea<<2)+4|0)|0;la=Z;ma=P+16|0;c[ma>>2]=la;if((Z|0)==0){hb=qb;ib=12;jb=fa;break}else{Bb=0;Cb=la}do{c[Cb+(Bb<<2)>>2]=c[g+(Bb<<2)>>2];Bb=Bb+1|0;Cb=c[ma>>2]|0}while((Bb|0)<(ea|0));c[Cb+(ea<<2)>>2]=0}else{c[P+16>>2]=0}if((qb|0)==0){hb=xa;ib=0;jb=fa;break}ma=c[w>>2]|0;ca=aF(ma,0,0,1,32)|0;la=ca;do{if((ca|0)==0){Db=0}else{Z=aF(ma,0,0,1,8)|0;Qa=ca+4|0;c[Qa>>2]=Z;if((Z|0)==0){Db=0;break}c[ca>>2]=3;c[ca+8>>2]=-1;c[ca+12>>2]=-1;c[Z>>2]=qb;c[(c[Qa>>2]|0)+4>>2]=xa;c[ca+16>>2]=(c[Na+16>>2]|0)+(c[qb+16>>2]|0);Db=la}}while(0);hb=Db;ib=(Db|0)==0?12:0;jb=fa}else if((W|0)==112){W=0;c[za+(da<<2)>>2]=0;ga=qa;ha=12;ia=za;W=140}else if((W|0)==141){W=0;c[q>>2]=qa;hb=0;ib=12;jb=Xa}}while(0);if((W|0)==140){W=0;c[q>>2]=ga;hb=0;ib=ha;jb=ia}eF(jb);c[x>>2]=(c[x>>2]|0)+1;if((ib|0)==0){R=0;S=L;T=hb;break c}else{_=ib;W=297;break b}break};case 40:{if((c[v>>2]&1|0)!=0){Eb=Y;W=74}break};case 46:{da=(c[v>>2]&4|0)==0;fa=c[w>>2]|0;ea=c[x>>2]|0;$=aF(fa,0,0,1,32)|0;la=$;Na=($|0)==0;if(da){if(Na){_=12;W=297;break b}da=aF(fa,0,0,1,20)|0;c[$+4>>2]=da;if((da|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[da>>2]=0;c[da+4>>2]=1114111;c[da+8>>2]=ea;Fb=(c[x>>2]|0)+1|0;Gb=la}else{if(Na){_=12;W=297;break b}Na=aF(fa,0,0,1,20)|0;c[$+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[Na>>2]=0;c[Na+4>>2]=9;c[Na+8>>2]=ea;ea=c[w>>2]|0;Na=(c[x>>2]|0)+1|0;fa=aF(ea,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}da=aF(ea,0,0,1,20)|0;c[fa+4>>2]=da;if((da|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[da>>2]=11;c[da+4>>2]=1114111;c[da+8>>2]=Na;Na=c[w>>2]|0;da=aF(Na,0,0,1,32)|0;if((da|0)==0){_=12;W=297;break b}ea=aF(Na,0,0,1,8)|0;Na=da+4|0;c[Na>>2]=ea;if((ea|0)==0){_=12;W=297;break b}c[da>>2]=3;c[da+8>>2]=-1;c[da+12>>2]=-1;c[ea>>2]=la;c[(c[Na>>2]|0)+4>>2]=fa;c[da+16>>2]=(c[fa+16>>2]|0)+(c[$+16>>2]|0);Fb=(c[x>>2]|0)+2|0;Gb=da}c[x>>2]=Fb;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=Gb;break c;break};case 94:{if((c[v>>2]&1|0)==0){if((Y|0)!=(c[r>>2]|0)){break d}da=TE(m,5)|0;if((da|0)!=0){U=da;V=L;W=6;break b}}da=c[w>>2]|0;$=aF(da,0,0,1,32)|0;if(($|0)==0){_=12;W=297;break b}fa=aF(da,0,0,1,20)|0;c[$+4>>2]=fa;if((fa|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[fa>>2]=-2;c[fa+4>>2]=1;c[fa+8>>2]=-1;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=$;break c;break};case 36:{if((c[v>>2]&1|0)==0){if((a[Y+1|0]|0)!=0){break d}}$=c[w>>2]|0;fa=aF($,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}da=aF($,0,0,1,20)|0;c[fa+4>>2]=da;if((da|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[da>>2]=-2;c[da+4>>2]=2;c[da+8>>2]=-1;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=fa;break c;break};case 92:{fa=Y+1|0;da=a[fa]|0;do{if((c[v>>2]&1|0)==0){if(da<<24>>24==40){c[q>>2]=fa;Eb=fa;W=74;break d}else{$=a[Y+1|0]|0;if($<<24>>24==41){W=268;break d}else{Hb=$;break}}}else{Hb=da}}while(0);da=Y+1|0;fa=Hb<<24>>24==0;if(fa){_=5;W=297;break b}else{Ib=0;Kb=996}while(1){$=Ib+1|0;if((a[992+(Ib<<3)|0]|0)==Hb<<24>>24){Lb=Kb;break}Na=996+($<<3)|0;if(($|0)==12){Lb=Na;break}else{Ib=$;Kb=Na}}Na=c[Lb>>2]|0;if((Na|0)!=0){tF(E|0,F|0,40)|0;c[G>>2]=Na;c[H>>2]=1;Na=ME(j)|0;if((Na|0)!=0){_=Na;W=297;break b}c[q>>2]=(c[q>>2]|0)+2;c[x>>2]=c[I>>2];R=0;S=L;T=c[J>>2]|0;break c}if(fa){_=5;W=297;break b}c[q>>2]=da;Na=a[da]|0;k:do{switch(Na|0){case 60:{$=c[w>>2]|0;la=aF($,0,0,1,32)|0;ea=la;do{if((la|0)==0){Mb=0}else{ca=aF($,0,0,1,20)|0;c[la+4>>2]=ca;if((ca|0)==0){Mb=0;break}c[la>>2]=0;c[la+8>>2]=-1;c[la+12>>2]=-1;c[ca>>2]=-2;c[ca+4>>2]=16;c[ca+8>>2]=-1;Mb=ea}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Mb;break};case 62:{ea=c[w>>2]|0;la=aF(ea,0,0,1,32)|0;$=la;do{if((la|0)==0){Ob=0}else{ca=aF(ea,0,0,1,20)|0;c[la+4>>2]=ca;if((ca|0)==0){Ob=0;break}c[la>>2]=0;c[la+8>>2]=-1;c[la+12>>2]=-1;c[ca>>2]=-2;c[ca+4>>2]=32;c[ca+8>>2]=-1;Ob=$}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Ob;break};case 120:{$=Y+2|0;c[q>>2]=$;la=a[$]|0;if(la<<24>>24==123){$=Y+3|0;c[q>>2]=$;ea=0;ca=$;while(1){$=a[ca]|0;if(($<<24>>24|0)==125|($<<24>>24|0)==0){Pb=ca;Qb=ea;break}if((GE($<<24>>24)|0)==0){_=9;W=297;break b}$=c[q>>2]|0;a[l+ea|0]=a[$]|0;xa=ea+1|0;ma=$+1|0;c[q>>2]=ma;if(xa>>>0>31>>>0){Pb=ma;Qb=xa;break}else{ea=xa;ca=ma}}c[q>>2]=Pb+1;a[l+Qb|0]=0;ca=Ja(B|0,0,16)|0;ea=c[w>>2]|0;ma=c[x>>2]|0;xa=aF(ea,0,0,1,32)|0;$=xa;do{if((xa|0)==0){Rb=0}else{P=aF(ea,0,0,1,20)|0;c[xa+4>>2]=P;if((P|0)==0){Rb=0;break}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[P>>2]=ca;c[P+4>>2]=ca;c[P+8>>2]=ma;Rb=$}}while(0);c[x>>2]=(c[x>>2]|0)+1;Nb=Rb;break k}else{vF(C|0,0,3)|0;$=(GE(la<<24>>24)|0)==0;ma=c[q>>2]|0;if($){Sb=ma}else{a[C]=a[ma]|0;$=ma+1|0;c[q>>2]=$;Sb=$}if((GE(a[Sb]|0)|0)!=0){$=c[q>>2]|0;a[D]=a[$]|0;c[q>>2]=$+1}$=Ja(C|0,0,16)|0;ma=c[w>>2]|0;ca=c[x>>2]|0;xa=aF(ma,0,0,1,32)|0;ea=xa;do{if((xa|0)==0){Tb=0}else{P=aF(ma,0,0,1,20)|0;c[xa+4>>2]=P;if((P|0)==0){Tb=0;break}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[P>>2]=$;c[P+4>>2]=$;c[P+8>>2]=ca;Tb=ea}}while(0);c[x>>2]=(c[x>>2]|0)+1;Nb=Tb;break k}break};case 98:{ea=c[w>>2]|0;ca=aF(ea,0,0,1,32)|0;$=ca;do{if((ca|0)==0){Ub=0}else{xa=aF(ea,0,0,1,20)|0;c[ca+4>>2]=xa;if((xa|0)==0){Ub=0;break}c[ca>>2]=0;c[ca+8>>2]=-1;c[ca+12>>2]=-1;c[xa>>2]=-2;c[xa+4>>2]=64;c[xa+8>>2]=-1;Ub=$}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Ub;break};case 66:{$=c[w>>2]|0;ca=aF($,0,0,1,32)|0;ea=ca;do{if((ca|0)==0){Vb=0}else{xa=aF($,0,0,1,20)|0;c[ca+4>>2]=xa;if((xa|0)==0){Vb=0;break}c[ca>>2]=0;c[ca+8>>2]=-1;c[ca+12>>2]=-1;c[xa>>2]=-2;c[xa+4>>2]=128;c[xa+8>>2]=-1;Vb=ea}}while(0);c[q>>2]=(c[q>>2]|0)+1;Nb=Vb;break};default:{if((zE(Na)|0)!=0){ea=(a[c[q>>2]|0]|0)-48|0;ca=c[w>>2]|0;$=c[x>>2]|0;xa=aF(ca,0,0,1,32)|0;if((xa|0)==0){_=12;W=297;break b}ma=aF(ca,0,0,1,20)|0;c[xa+4>>2]=ma;if((ma|0)==0){_=12;W=297;break b}c[xa>>2]=0;c[xa+8>>2]=-1;c[xa+12>>2]=-1;c[ma>>2]=-4;c[ma+4>>2]=ea;c[ma+8>>2]=$;c[x>>2]=(c[x>>2]|0)+1;$=c[A>>2]|0;c[A>>2]=(ea|0)<($|0)?$:ea;c[q>>2]=(c[q>>2]|0)+1;R=0;S=L;T=xa;break c}xa=c[w>>2]|0;ea=a[c[q>>2]|0]|0;$=c[x>>2]|0;ma=aF(xa,0,0,1,32)|0;ca=ma;do{if((ma|0)==0){Wb=0}else{la=aF(xa,0,0,1,20)|0;c[ma+4>>2]=la;if((la|0)==0){Wb=0;break}c[ma>>2]=0;c[ma+8>>2]=-1;c[ma+12>>2]=-1;c[la>>2]=ea;c[la+4>>2]=ea;c[la+8>>2]=$;Wb=ca}}while(0);c[x>>2]=(c[x>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+1;Nb=Wb}}}while(0);if((Nb|0)==0){_=12;W=297;break b}else{R=0;S=L;T=Nb;break c}break};case 41:{if((L|0)!=0){W=267}break};case 42:case 124:case 123:case 43:case 63:{W=267;break};case 0:{W=268;break};default:{}}}while(0);if((W|0)==74){W=0;Q=L+1|0;c[q>>2]=Eb+1;X=TE(m,c[y>>2]|0)|0;if((X|0)!=0){U=X;V=Q;W=6;break b}X=TE(m,2)|0;if((X|0)!=0){U=X;V=Q;W=6;break b}X=TE(m,0)|0;if((X|0)!=0){U=X;V=Q;W=6;break b}c[y>>2]=(c[y>>2]|0)+1;R=0;S=Q;T=K;break c}else if((W|0)==267){W=0;if((c[v>>2]&1|0)!=0){W=268}}if((W|0)==268){W=0;Q=c[w>>2]|0;X=aF(Q,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}Na=aF(Q,0,0,1,20)|0;c[X+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[X>>2]=0;c[X+8>>2]=-1;c[X+12>>2]=-1;c[Na>>2]=-1;c[Na+4>>2]=-1;c[Na+8>>2]=-1;R=0;S=L;T=X;break c}X=KE(h,Y,-1)|0;if((X|0)<0){c[h>>2]=-1;Xb=1}else{Xb=X}do{if((c[v>>2]&2|0)==0){W=283}else{if((FE(c[h>>2]|0)|0)==0){if((BE(c[h>>2]|0)|0)==0){W=283;break}}X=c[w>>2]|0;Na=HE(c[h>>2]|0)|0;Q=HE(c[h>>2]|0)|0;da=c[x>>2]|0;fa=aF(X,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}ca=aF(X,0,0,1,20)|0;c[fa+4>>2]=ca;if((ca|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[ca>>2]=Na;c[ca+4>>2]=Q;c[ca+8>>2]=da;da=c[w>>2]|0;ca=JE(c[h>>2]|0)|0;Q=JE(c[h>>2]|0)|0;Na=c[x>>2]|0;X=aF(da,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}$=aF(da,0,0,1,20)|0;c[X+4>>2]=$;if(($|0)==0){_=12;W=297;break b}c[X>>2]=0;c[X+8>>2]=-1;c[X+12>>2]=-1;c[$>>2]=ca;c[$+4>>2]=Q;c[$+8>>2]=Na;Na=c[w>>2]|0;$=aF(Na,0,0,1,32)|0;if(($|0)==0){_=12;W=297;break b}Q=aF(Na,0,0,1,8)|0;Na=$+4|0;c[Na>>2]=Q;if((Q|0)==0){_=12;W=297;break b}c[$>>2]=3;c[$+8>>2]=-1;c[$+12>>2]=-1;c[Q>>2]=fa;c[(c[Na>>2]|0)+4>>2]=X;c[$+16>>2]=(c[X+16>>2]|0)+(c[fa+16>>2]|0);Yb=$}}while(0);if((W|0)==283){W=0;Y=c[w>>2]|0;$=c[h>>2]|0;fa=c[x>>2]|0;X=aF(Y,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}Na=aF(Y,0,0,1,20)|0;c[X+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[X>>2]=0;c[X+8>>2]=-1;c[X+12>>2]=-1;c[Na>>2]=$;c[Na+4>>2]=$;c[Na+8>>2]=fa;Yb=X}c[x>>2]=(c[x>>2]|0)+1;c[q>>2]=(c[q>>2]|0)+Xb;R=0;S=L;T=Yb;break};case 3:{X=TE(m,5)|0;if((X|0)!=0){U=X;V=L;W=6;break b}R=TE(m,4)|0;S=L;T=K;break};case 0:{if((c[v>>2]&1|0)!=0){X=TE(m,7)|0;if((X|0)!=0){U=X;V=L;W=6;break b}}R=TE(m,3)|0;S=L;T=K;break};case 8:{X=M-2|0;c[n>>2]=X;fa=c[O+(X<<2)>>2]|0;X=c[w>>2]|0;Na=aF(X,0,0,1,32)|0;if((Na|0)==0){_=12;W=297;break b}$=aF(X,0,0,1,8)|0;X=Na+4|0;c[X>>2]=$;if(($|0)==0){_=12;W=297;break b}c[Na>>2]=3;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[$>>2]=fa;c[(c[X>>2]|0)+4>>2]=K;c[Na+16>>2]=(c[K+16>>2]|0)+(c[fa+16>>2]|0);R=0;S=L;T=Na;break};case 9:{Na=c[q>>2]|0;fa=a[Na]|0;switch(fa<<24>>24|0){case 43:case 63:{if((c[v>>2]&1|0)==0){R=0;S=L;T=K;break c}else{W=41}break};case 42:{W=41;break};case 92:{X=c[v>>2]|0;if((X&1|0)!=0){R=0;S=L;T=K;break c}$=Na+1|0;if((a[$]|0)!=123){R=0;S=L;T=K;break c}c[q>>2]=$;Zb=$;_b=X;break};case 123:{X=c[v>>2]|0;if((X&1|0)==0){R=0;S=L;T=K;break c}else{Zb=Na;_b=X}break};default:{R=0;S=L;T=K;break c}}if((W|0)==41){W=0;c[q>>2]=Na+1;Na=c[w>>2]|0;X=aF(Na,0,0,1,32)|0;if((X|0)==0){_=12;W=297;break b}$=aF(Na,0,0,1,16)|0;c[X+4>>2]=$;if(($|0)==0){_=12;W=297;break b}c[X>>2]=2;c[X+8>>2]=-1;c[X+12>>2]=-1;c[$>>2]=K;c[$+4>>2]=fa<<24>>24==43;c[$+8>>2]=fa<<24>>24==63?1:-1;fa=$+12|0;a[fa]=a[fa]&-2;c[X+16>>2]=c[K+16>>2];R=TE(m,9)|0;S=L;T=X;break c}X=Zb+1|0;c[q>>2]=X;fa=a[X]|0;if((fa-48&255)>>>0<10>>>0){$=fa<<24>>24;if(($-48|0)>>>0<10>>>0){$b=-1;ac=X;bc=$}else{_=10;W=297;break b}while(1){$=(($b|0)<0?-48:($b*10|0)-48|0)+bc|0;Na=ac+1|0;Y=a[Na]|0;Q=Y<<24>>24;if((Q-48|0)>>>0<10>>>0){$b=$;ac=Na;bc=Q}else{cc=$;dc=Na;ec=Y;break}}}else{cc=-1;dc=X;ec=fa}do{if(ec<<24>>24==44){Y=dc+1|0;Na=a[Y]|0;$=Na<<24>>24;if(($-48|0)>>>0<10>>>0){fc=-1;gc=Y;hc=$}else{ic=Y;jc=-1;kc=Na;break}while(1){Na=((fc|0)<0?-48:(fc*10|0)-48|0)+hc|0;Y=gc+1|0;$=a[Y]|0;Q=$<<24>>24;if((Q-48|0)>>>0<10>>>0){fc=Na;gc=Y;hc=Q}else{lc=Na;mc=Y;nc=$;W=54;break}}}else{lc=cc;mc=dc;nc=ec;W=54}}while(0);do{if((W|0)==54){W=0;if((lc|0)<=-1){ic=mc;jc=lc;kc=nc;break}if((cc|0)>(lc|0)|(lc|0)>255){_=10;W=297;break b}else{ic=mc;jc=lc;kc=nc}}}while(0);if(kc<<24>>24==0){_=9;W=297;break b}if((ic|0)==(X|0)){_=10;W=297;break b}if((_b&1|0)==0){if(kc<<24>>24!=92){_=10;W=297;break b}if((a[ic+1|0]|0)!=125){_=10;W=297;break b}oc=ic+2|0}else{if(kc<<24>>24!=125){_=10;W=297;break b}oc=ic+1|0}if((jc|cc|0)==0){fa=c[w>>2]|0;$=aF(fa,0,0,1,32)|0;if(($|0)==0){_=12;W=297;break b}Y=aF(fa,0,0,1,20)|0;c[$+4>>2]=Y;if((Y|0)==0){_=12;W=297;break b}c[$>>2]=0;c[$+8>>2]=-1;c[$+12>>2]=-1;c[Y>>2]=-1;c[Y+4>>2]=-1;c[Y+8>>2]=-1;pc=$}else{$=(jc&cc|0)<0;Y=c[w>>2]|0;fa=aF(Y,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}Na=aF(Y,0,0,1,16)|0;c[fa+4>>2]=Na;if((Na|0)==0){_=12;W=297;break b}c[fa>>2]=2;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[Na>>2]=K;c[Na+4>>2]=$?1:cc;c[Na+8>>2]=$?1:jc;$=Na+12|0;a[$]=a[$]&-2;c[fa+16>>2]=c[K+16>>2];pc=fa}c[q>>2]=oc;R=TE(m,9)|0;S=L;T=pc;break};case 6:{fa=M-2|0;c[n>>2]=fa;$=c[O+(fa<<2)>>2]|0;fa=c[w>>2]|0;Na=aF(fa,0,0,1,32)|0;if((Na|0)==0){_=12;W=297;break b}Y=aF(fa,0,0,1,8)|0;fa=Na+4|0;c[fa>>2]=Y;if((Y|0)==0){_=12;W=297;break b}c[Na>>2]=1;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[Y>>2]=$;c[(c[fa>>2]|0)+4>>2]=K;c[Na+16>>2]=(c[K+16>>2]|0)+(c[$+16>>2]|0);R=0;S=L;T=Na;break};case 2:{Na=M-2|0;c[n>>2]=Na;$=c[O+(Na<<2)>>2]|0;if((c[K+12>>2]|0)>-1){Na=c[w>>2]|0;fa=aF(Na,0,0,1,32)|0;if((fa|0)==0){_=12;W=297;break b}Y=aF(Na,0,0,1,20)|0;c[fa+4>>2]=Y;if((Y|0)==0){_=12;W=297;break b}c[fa>>2]=0;c[fa+8>>2]=-1;c[fa+12>>2]=-1;c[Y>>2]=-1;c[Y+4>>2]=-1;c[Y+8>>2]=-1;Y=c[w>>2]|0;Na=aF(Y,0,0,1,32)|0;if((Na|0)==0){_=12;W=297;break b}Q=aF(Y,0,0,1,8)|0;Y=Na+4|0;c[Y>>2]=Q;if((Q|0)==0){_=12;W=297;break b}c[Na>>2]=1;c[Na+8>>2]=-1;c[Na+12>>2]=-1;c[Q>>2]=fa;c[(c[Y>>2]|0)+4>>2]=K;Y=K+16|0;Q=Na+16|0;c[Q>>2]=(c[Y>>2]|0)+(c[fa+16>>2]|0);c[Q>>2]=c[Y>>2];qc=Na}else{qc=K}c[qc+12>>2]=$;$=qc+16|0;c[$>>2]=(c[$>>2]|0)+1;R=0;S=L;T=qc;break};case 10:{$=M-2|0;c[n>>2]=$;c[v>>2]=c[O+($<<2)>>2];R=0;S=L;T=K;break};default:{R=0;S=L;T=K}}}while(0);O=c[n>>2]|0;N=(R|0)==0;if((O|0)>(o|0)&N){K=T;L=S;M=O}else{rc=T;sc=S;tc=R;uc=N;break a}}if((W|0)==6){rc=K;sc=V;tc=U;uc=(U|0)==0;break}else if((W|0)==297){i=d;return _|0}}else{rc=0;sc=0;tc=p;uc=t}}while(0);t=(sc|0)>0;if(t|uc^1){_=t?8:tc;i=d;return _|0}c[b+8>>2]=rc;_=0;i=d;return _|0}function NE(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0;g=d+12|0;h=c[g>>2]|0;i=(b|0)==0|(f|0)==0;if(!i){c[f+48>>2]=0;c[c[f+36>>2]>>2]=-1}j=c[f+28>>2]|0;k=dF((j<<3)+8|0)|0;l=k;if((k|0)==0){m=12;return m|0}c[l>>2]=-1;n=dF((j<<2)+4|0)|0;o=n;if((n|0)==0){eF(k);m=12;return m|0}c[o>>2]=-1;p=0;while(1){if(p>>>0>j>>>0){break}else{p=p+1|0}}TE(d,e)|0;e=TE(d,0)|0;p=c[g>>2]|0;a:do{if((p|0)>(h|0)&(e|0)==0){j=d+16|0;q=f+32|0;r=f+16|0;s=f+36|0;t=0;u=-1;v=1;w=0;x=0;y=0;z=l;A=p;while(1){B=A-1|0;c[g>>2]=B;C=c[j>>2]|0;b:do{switch(c[C+(B<<2)>>2]|0){case 1:{D=A-2|0;c[g>>2]=D;E=c[C+(D<<2)>>2]|0;if(i){D=c[(c[c[E+4>>2]>>2]|0)+20>>2]|0;F=A-3|0;c[g>>2]=F;c[E+20>>2]=(c[C+(F<<2)>>2]|0)+D;G=0;H=z;I=y;J=x;K=w;L=v;M=-1;N=t;break b}else{D=A-3|0;c[g>>2]=D;F=c[C+(D<<2)>>2]|0;D=A-4|0;c[g>>2]=D;E=(F|0)==0;G=0;H=z;I=y;J=x;K=w;L=v;M=E?u:c[C+(D<<2)>>2]|0;N=E&1;break b}break};case 6:{E=A-2|0;c[g>>2]=E;D=c[C+(E<<2)>>2]|0;E=0;do{O=z+(E<<2)|0;E=E+1|0}while((c[O>>2]|0)>-1);c[O>>2]=D<<1|1;c[z+(E<<2)>>2]=-1;F=0;while(1){if((c[o+(F<<2)>>2]|0)>-1){F=F+1|0}else{break}}c[o+(F-1<<2)>>2]=-1;G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t;break};case 0:{E=A-2|0;c[g>>2]=E;D=c[C+(E<<2)>>2]|0;E=D;P=D+12|0;Q=c[P>>2]|0;if((Q|0)>-1){R=0;do{S=z+(R<<2)|0;R=R+1|0}while((c[S>>2]|0)>-1);c[S>>2]=Q<<1;c[z+(R<<2)>>2]=-1;do{if(!i){F=0;while(1){if((c[o+(F<<2)>>2]|0)>-1){F=F+1|0}else{break}}c[(c[r>>2]|0)+(Q*12|0)+8>>2]=0;if((F|0)<=0){break}T=dF((F<<2)+4|0)|0;U=T;if((T|0)==0){V=u;W=w;X=x;Y=y;Z=z;_=12;break a}c[(c[r>>2]|0)+(Q*12|0)+8>>2]=U;T=c[o>>2]|0;if((T|0)>-1){$=0;aa=T;T=U;while(1){c[T>>2]=aa;ba=$+1|0;ca=c[o+(ba<<2)>>2]|0;da=U+(ba<<2)|0;if((ca|0)>-1){$=ba;aa=ca;T=da}else{ea=da;break}}}else{ea=U}c[ea>>2]=-1}}while(0);Q=TE(d,c[P>>2]|0)|0;if((Q|0)!=0){V=u;W=w;X=x;Y=y;Z=z;_=Q;break a}Q=TE(d,6)|0;if((Q|0)!=0){V=u;W=w;X=x;Y=y;Z=z;_=Q;break a}}Q=c[D>>2]|0;do{if((Q|0)==3){R=c[D+4>>2]|0;T=c[R>>2]|0;aa=c[R+4>>2]|0;R=(c[z>>2]|0)>-1;$=v+1|0;F=TE(d,R?$:v)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,R?v:w)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,z)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,(c[z>>2]|0)>>>31^1)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=TE(d,D)|0;if((F|0)!=0){fa=F;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}F=aa;aa=TE(d,F)|0;if((aa|0)!=0){fa=aa;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}aa=T;T=TE(d,aa)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,3)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,F)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,0)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,2)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,aa)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}T=TE(d,0)|0;if((T|0)!=0){fa=T;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[z>>2]|0)>-1){if(i){ma=0;na=x;oa=u}else{T=VE(b,E,w)|0;c[(c[q>>2]|0)+(w<<2)>>2]=t;if((u|0)>-1){aa=c[s>>2]|0;F=0;while(1){pa=aa+(F<<2)|0;qa=F+1|0;if((c[pa>>2]|0)>-1){F=qa}else{break}}c[pa>>2]=w;c[(c[s>>2]|0)+(qa<<2)>>2]=u;c[(c[s>>2]|0)+(F+2<<2)>>2]=-1;ra=x+1|0;sa=-1}else{ra=x;sa=u}aa=c[z>>2]|0;if((aa|0)>-1){U=0;R=aa;do{aa=(R|0)/2|0;da=c[r>>2]|0;if((R&1|0)==0){c[da+(aa*12|0)>>2]=w}else{c[da+(aa*12|0)+4>>2]=w}U=U+1|0;R=c[z+(U<<2)>>2]|0;}while((R|0)>-1)}c[z>>2]=-1;ma=T;na=ra;oa=sa}c[z>>2]=-1;ta=ma;ua=y+1|0;va=na;wa=v;xa=$;ya=oa}else{ta=0;ua=y;va=x;wa=w;xa=v;ya=u}if((c[D+16>>2]|0)<=0){fa=ta;ga=ua;ha=va;ia=wa;ja=xa;ka=ya;la=t;break}fa=ta;ga=ua;ha=va;ia=xa+1|0;ja=xa+2|0;ka=ya;la=t}else if((Q|0)==2){R=c[D+4>>2]|0;if(i){if((c[z>>2]|0)>-1){za=1}else{za=a[R+12|0]&1}U=TE(d,za)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}}else{U=TE(d,w)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,a[R+12|0]&1)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}}U=TE(d,D)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,1)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,c[R>>2]|0)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}U=TE(d,0)|0;if((U|0)!=0){fa=U;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[z>>2]|0)<=-1){if((a[R+12|0]&1)==0){fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=0;break}}if(i){Aa=0;Ba=x;Ca=u}else{U=VE(b,E,w)|0;c[(c[q>>2]|0)+(w<<2)>>2]=(a[R+12|0]&1)==0?t:1;if((u|0)>-1){R=c[s>>2]|0;F=0;while(1){Da=R+(F<<2)|0;Ea=F+1|0;if((c[Da>>2]|0)>-1){F=Ea}else{break}}c[Da>>2]=w;c[(c[s>>2]|0)+(Ea<<2)>>2]=u;c[(c[s>>2]|0)+(F+2<<2)>>2]=-1;Fa=x+1|0;Ga=-1}else{Fa=x;Ga=u}R=c[z>>2]|0;if((R|0)>-1){$=0;T=R;do{R=(T|0)/2|0;aa=c[r>>2]|0;if((T&1|0)==0){c[aa+(R*12|0)>>2]=w}else{c[aa+(R*12|0)+4>>2]=w}$=$+1|0;T=c[z+($<<2)>>2]|0;}while((T|0)>-1)}c[z>>2]=-1;Aa=U;Ba=Fa;Ca=Ga}c[z>>2]=-1;fa=Aa;ga=y+1|0;ha=Ba;ia=v;ja=v+1|0;ka=Ca;la=0}else if((Q|0)==0){T=c[c[D+4>>2]>>2]|0;if(!((T|0)>-1|(T|0)==-4)){fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[z>>2]|0)<=-1){fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if(i){c[D+20>>2]=1;Ha=0;Ia=x;Ja=u}else{T=VE(b,E,w)|0;c[(c[q>>2]|0)+(w<<2)>>2]=t;if((u|0)>-1){$=c[s>>2]|0;F=0;while(1){Ka=$+(F<<2)|0;La=F+1|0;if((c[Ka>>2]|0)>-1){F=La}else{break}}c[Ka>>2]=w;c[(c[s>>2]|0)+(La<<2)>>2]=u;c[(c[s>>2]|0)+(F+2<<2)>>2]=-1;Ma=x+1|0;Na=-1}else{Ma=x;Na=u}$=c[z>>2]|0;if(($|0)>-1){U=0;R=$;do{$=(R|0)/2|0;aa=c[r>>2]|0;if((R&1|0)==0){c[aa+($*12|0)>>2]=w}else{c[aa+($*12|0)+4>>2]=w}U=U+1|0;R=c[z+(U<<2)>>2]|0;}while((R|0)>-1)}c[z>>2]=-1;Ha=T;Ia=Ma;Ja=Na}c[z>>2]=-1;fa=Ha;ga=y+1|0;ha=Ia;ia=v;ja=v+1|0;ka=Ja;la=t}else if((Q|0)==1){R=c[D+4>>2]|0;U=c[R>>2]|0;F=c[R+4>>2]|0;R=TE(d,D)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=TE(d,5)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=TE(d,F)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=TE(d,0)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}R=U+20|0;$=TE(d,(c[R>>2]|0)+v|0)|0;if(($|0)!=0){fa=$;ga=y;ha=x;ia=w;ja=v;ka=u;la=t;break}if((c[R>>2]|0)>0){R=(c[F+20>>2]|0)>0;Oa=(R&1)+v|0;Pa=R?v:-1}else{Oa=v;Pa=-1}R=TE(d,Pa)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t;break}R=TE(d,4)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t;break}R=TE(d,U)|0;if((R|0)!=0){fa=R;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t;break}fa=TE(d,0)|0;ga=y;ha=x;ia=w;ja=Oa;ka=u;la=t}else{fa=0;ga=y;ha=x;ia=w;ja=v;ka=u;la=t}}while(0);D=c[P>>2]|0;if((D|0)>-1){Qa=0}else{G=fa;H=z;I=ga;J=ha;K=ia;L=ja;M=ka;N=la;break b}do{Ra=o+(Qa<<2)|0;Qa=Qa+1|0}while((c[Ra>>2]|0)>-1);c[Ra>>2]=D;c[o+(Qa<<2)>>2]=-1;G=fa;H=z;I=ga;J=ha;K=ia;L=ja;M=ka;N=la;break};case 4:{P=A-2|0;c[g>>2]=P;Q=c[C+(P<<2)>>2]|0;P=A-3|0;c[g>>2]=P;G=0;H=z;I=y;J=x;K=(Q|0)>-1?Q:w;L=c[C+(P<<2)>>2]|0;M=u;N=t;break};case 5:{P=A-2|0;c[g>>2]=P;Q=c[C+(P<<2)>>2]|0;if(!i){G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t;break b}P=c[Q+4>>2]|0;c[Q+20>>2]=(c[(c[P+4>>2]|0)+20>>2]|0)+(c[(c[P>>2]|0)+20>>2]|0);G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t;break};case 2:{P=z;while(1){if((c[P>>2]|0)>-1){P=P+4|0}else{G=0;H=P;I=y;J=x;K=w;L=v;M=u;N=t;break}}break};case 3:{P=A-2|0;c[g>>2]=P;D=c[C+(P<<2)>>2]|0;P=A-3|0;c[g>>2]=P;Q=c[C+(P<<2)>>2]|0;P=A-4|0;c[g>>2]=P;E=c[C+(P<<2)>>2]|0;P=A-5|0;c[g>>2]=P;if(i){R=c[E+4>>2]|0;U=E+16|0;c[E+20>>2]=(c[(c[R>>2]|0)+20>>2]|0)+(c[C+(P<<2)>>2]|0)+(c[(c[R+4>>2]|0)+20>>2]|0)+((c[U>>2]|0)>0?2:0);Sa=c[g>>2]|0;Ta=c[j>>2]|0;Ua=U}else{Sa=P;Ta=C;Ua=E+16|0}E=Sa-1|0;c[g>>2]=E;P=c[Ta+(E<<2)>>2]|0;E=Sa-2|0;c[g>>2]=E;U=c[Ta+(E<<2)>>2]|0;E=Sa-3|0;c[g>>2]=E;R=c[Ta+(E<<2)>>2]|0;if((c[Ua>>2]|0)<=0){G=0;H=P;I=y;J=x;K=w;L=v;M=u;N=1;break b}if(i){Va=0}else{WE(b,D,U)|0;c[(c[q>>2]|0)+(U<<2)>>2]=1;U=WE(b,Q,R)|0;c[(c[q>>2]|0)+(R<<2)>>2]=1;Va=U}G=Va;H=P;I=y+2|0;J=x;K=w;L=v;M=u;N=1;break};default:{G=0;H=z;I=y;J=x;K=w;L=v;M=u;N=t}}}while(0);C=c[g>>2]|0;if((C|0)>(h|0)&(G|0)==0){t=N;u=M;v=L;w=K;x=J;y=I;z=H;A=C}else{V=M;W=K;X=J;Y=I;Z=H;_=G;break a}}}else{V=-1;W=0;X=0;Y=0;Z=l;_=e}}while(0);do{if(i){Wa=X}else{e=c[Z>>2]|0;if((e|0)>-1){l=f+16|0;G=0;H=e;do{e=(H|0)/2|0;I=c[l>>2]|0;if((H&1|0)==0){c[I+(e*12|0)>>2]=W}else{c[I+(e*12|0)+4>>2]=W}G=G+1|0;H=c[Z+(G<<2)>>2]|0;}while((H|0)>-1)}c[Z>>2]=-1;if((V|0)<=-1){Wa=X;break}H=f+36|0;G=c[H>>2]|0;l=0;while(1){Xa=G+(l<<2)|0;Ya=l+1|0;if((c[Xa>>2]|0)>-1){l=Ya}else{break}}c[Xa>>2]=W;c[(c[H>>2]|0)+(Ya<<2)>>2]=V;c[(c[H>>2]|0)+(l+2<<2)>>2]=-1;Wa=X+1|0}}while(0);c[f+48>>2]=Y;c[f+40>>2]=Y;c[f+44>>2]=Wa;eF(k);eF(n);m=_;return m|0}function OE(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;f=a;a:while(1){a=c[f>>2]|0;do{if((a|0)==1){g=c[f+4>>2]|0;h=g;i=g+4|0;g=QE(c[(c[h>>2]|0)+28>>2]|0,c[(c[i>>2]|0)+24>>2]|0,b,d,e)|0;if((g|0)!=0){j=g;k=10;break a}g=OE(c[h>>2]|0,b,d,e)|0;if((g|0)==0){l=i}else{j=g;k=10;break a}}else if((a|0)==3){g=c[f+4>>2]|0;i=OE(c[g>>2]|0,b,d,e)|0;if((i|0)!=0){j=i;k=10;break a}l=g+4|0}else if((a|0)==2){g=c[f+4>>2]|0;i=g;if((c[g+8>>2]|0)!=-1){l=i;break}g=c[i>>2]|0;h=QE(c[g+28>>2]|0,c[g+24>>2]|0,b,d,e)|0;if((h|0)==0){l=i}else{j=h;k=10;break a}}else{j=0;k=10;break a}}while(0);f=c[l>>2]|0}if((k|0)==10){return j|0}return 0}function PE(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;b=c[a+4>>2]|0;if((b|0)==0){return}a=b+4|0;d=b;e=c[d>>2]|0;if((c[a>>2]|0)==0){f=e}else{g=0;h=e;while(1){do{if((c[h+(g<<5)+8>>2]|0)==0){i=h}else{e=c[h+(g<<5)+16>>2]|0;if((e|0)==0){j=h}else{eF(e);j=c[d>>2]|0}e=c[j+(g<<5)+28>>2]|0;if((e|0)==0){i=j;break}eF(e);i=c[d>>2]|0}}while(0);e=g+1|0;if(e>>>0<(c[a>>2]|0)>>>0){g=e;h=i}else{f=i;break}}}if((f|0)!=0){eF(f)}f=b+8|0;i=c[f>>2]|0;if((i|0)!=0){if((c[i+8>>2]|0)==0){k=i}else{h=i;while(1){i=c[h+16>>2]|0;if((i|0)!=0){eF(i)}if((c[h+40>>2]|0)==0){break}else{h=h+32|0}}k=c[f>>2]|0}eF(k)}k=b+16|0;f=c[k>>2]|0;if((f|0)!=0){h=b+28|0;i=c[h>>2]|0;if((i|0)==0){l=f}else{g=0;a=f;f=i;while(1){i=c[a+(g*12|0)+8>>2]|0;if((i|0)==0){m=f;n=a}else{eF(i);m=c[h>>2]|0;n=c[k>>2]|0}i=g+1|0;if(i>>>0<m>>>0){g=i;a=n;f=m}else{l=n;break}}}eF(l)}l=c[b+32>>2]|0;if((l|0)!=0){eF(l)}l=c[b+20>>2]|0;if((l|0)!=0){eF(l)}l=c[b+36>>2]|0;if((l|0)!=0){eF(l)}eF(b);return}function QE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0;g=a|0;a=c[g>>2]|0;h=(a|0)>-1;if((d|0)==0){if(!h){i=0;return i|0}j=b|0;k=g;l=a;while(1){a:do{if((c[j>>2]|0)>-1){a=b;m=l;while(1){n=e+(m<<2)|0;c[n>>2]=(c[n>>2]|0)+1;n=a+32|0;if((c[n>>2]|0)<=-1){break a}a=n;m=c[k>>2]|0}}}while(0);m=k+32|0;a=c[m>>2]|0;if((a|0)>-1){k=m;l=a}else{i=0;break}}return i|0}if(!h){i=0;return i|0}h=b|0;l=g;b:while(1){g=c[h>>2]|0;c:do{if((g|0)>-1){k=l+4|0;e=l+8|0;j=l+16|0;a=l+20|0;m=l+24|0;n=l+28|0;o=l+12|0;p=b;q=-1;r=h;s=g;while(1){t=p;u=r;v=s;while(1){w=t+32|0;if((v|0)!=(q|0)){break}x=w|0;y=c[x>>2]|0;if((y|0)>-1){t=w;u=x;v=y}else{break c}}y=d+(c[f+(c[l>>2]<<2)>>2]<<5)|0;while(1){z=y+8|0;if((c[z>>2]|0)==0){break}else{y=y+32|0}}c[y+40>>2]=0;c[y>>2]=c[k>>2];c[y+4>>2]=c[e>>2];c[z>>2]=d+(c[f+(c[u>>2]<<2)>>2]<<5);c[y+12>>2]=c[u>>2];x=c[t+16>>2]|c[j>>2]|((c[a>>2]|0)!=0?4:0)|((c[m>>2]|0)!=0?8:0);A=y+20|0;c[A>>2]=x;B=c[n>>2]|0;if((B|0)>-1){c[y+24>>2]=B;c[A>>2]=x|256}else{c[y+24>>2]=c[a>>2]}x=c[m>>2]|0;if((x|0)==0){c[y+28>>2]=0}else{A=0;while(1){C=A+1|0;if((c[x+(A<<2)>>2]|0)==0){break}else{A=C}}A=dF(C<<2)|0;x=A;u=y+28|0;c[u>>2]=x;if((A|0)==0){i=12;D=50;break b}A=c[c[m>>2]>>2]|0;if((A|0)==0){E=x}else{B=0;F=A;A=x;while(1){c[A>>2]=F;x=B+1|0;G=c[(c[m>>2]|0)+(x<<2)>>2]|0;H=(c[u>>2]|0)+(x<<2)|0;if((G|0)==0){E=H;break}else{B=x;F=G;A=H}}}c[E>>2]=0}A=c[o>>2]|0;if((A|0)==0){I=0}else{F=0;while(1){if((c[A+(F<<2)>>2]|0)>-1){F=F+1|0}else{I=F;break}}}F=t+12|0;A=c[F>>2]|0;if((A|0)==0){J=0}else{B=0;while(1){if((c[A+(B<<2)>>2]|0)>-1){B=B+1|0}else{J=B;break}}}B=y+16|0;A=c[B>>2]|0;if((A|0)!=0){eF(A)}c[B>>2]=0;A=J+I|0;if((A|0)>0){t=dF((A<<2)+4|0)|0;A=t;c[B>>2]=A;if((t|0)==0){i=12;D=50;break b}t=c[o>>2]|0;d:do{if((t|0)==0){K=0}else{u=c[t>>2]|0;if((u|0)>-1){L=0;M=u;N=A}else{K=0;break}while(1){c[N+(L<<2)>>2]=M;u=L+1|0;H=c[(c[o>>2]|0)+(u<<2)>>2]|0;if((H|0)<=-1){K=u;break d}L=u;M=H;N=c[B>>2]|0}}}while(0);A=c[F>>2]|0;do{if((A|0)==0){O=K}else{t=c[A>>2]|0;if((t|0)<=-1){O=K;break}y=(K|0)>0;H=0;u=K;G=A;x=t;while(1){t=c[B>>2]|0;e:do{if(y){P=0;while(1){Q=P+1|0;if((c[t+(P<<2)>>2]|0)==(x|0)){R=u;S=G;break e}if((Q|0)<(K|0)){P=Q}else{D=41;break}}}else{D=41}}while(0);if((D|0)==41){D=0;c[t+(u<<2)>>2]=x;R=u+1|0;S=c[F>>2]|0}P=H+1|0;Q=c[S+(P<<2)>>2]|0;if((Q|0)>-1){H=P;u=R;G=S;x=Q}else{O=R;break}}}}while(0);c[(c[B>>2]|0)+(O<<2)>>2]=-1}F=w|0;A=c[F>>2]|0;if((A|0)>-1){p=w;q=v;r=F;s=A}else{break}}}}while(0);g=l+32|0;if((c[g>>2]|0)>-1){l=g}else{i=0;D=50;break}}if((D|0)==50){return i|0}return 0}function RE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;g=(e|0)==0;a:do{if(g){h=0}else{i=0;while(1){if((c[e+(i<<2)>>2]|0)<=-1){h=i;break a}i=i+1|0}}}while(0);i=0;while(1){if((c[b+(i<<5)>>2]|0)>-1){i=i+1|0}else{j=0;break}}while(1){if((c[d+(j<<5)>>2]|0)>-1){j=j+1|0}else{break}}k=aF(a,0,0,1,(j+i<<5)+32|0)|0;i=k;if((k|0)==0){l=0;return l|0}k=c[b>>2]|0;b:do{if((k|0)>-1){j=(h|0)>0;m=0;n=k;while(1){c[i+(m<<5)>>2]=n;c[i+(m<<5)+4>>2]=c[b+(m<<5)+4>>2];c[i+(m<<5)+8>>2]=c[b+(m<<5)+8>>2];c[i+(m<<5)+16>>2]=c[b+(m<<5)+16>>2]|f;c[i+(m<<5)+20>>2]=c[b+(m<<5)+20>>2];c[i+(m<<5)+24>>2]=c[b+(m<<5)+24>>2];c[i+(m<<5)+28>>2]=c[b+(m<<5)+28>>2];o=b+(m<<5)+12|0;p=c[o>>2]|0;q=(p|0)==0;if(q&g){c[i+(m<<5)+12>>2]=0}else{c:do{if(q){r=0}else{s=0;while(1){if((c[p+(s<<2)>>2]|0)<=-1){r=s;break c}s=s+1|0}}}while(0);p=aF(a,0,0,0,(r+h<<2)+4|0)|0;q=p;if((p|0)==0){l=0;break}if((r|0)>0){p=0;while(1){c[q+(p<<2)>>2]=c[(c[o>>2]|0)+(p<<2)>>2];s=p+1|0;if((s|0)<(r|0)){p=s}else{t=r;break}}}else{t=0}if(j){p=0;while(1){c[q+(p+t<<2)>>2]=c[e+(p<<2)>>2];o=p+1|0;if((o|0)<(h|0)){p=o}else{u=h;break}}}else{u=0}c[q+(u+t<<2)>>2]=-1;c[i+(m<<5)+12>>2]=q}p=m+1|0;o=c[b+(p<<5)>>2]|0;if((o|0)>-1){m=p;n=o}else{v=p;break b}}return l|0}else{v=0}}while(0);b=c[d>>2]|0;t=i+(v<<5)|0;d:do{if((b|0)>-1){u=0;h=b;e=v;r=t;while(1){c[r>>2]=h;c[i+(e<<5)+4>>2]=c[d+(u<<5)+4>>2];c[i+(e<<5)+8>>2]=c[d+(u<<5)+8>>2];c[i+(e<<5)+16>>2]=c[d+(u<<5)+16>>2];c[i+(e<<5)+20>>2]=c[d+(u<<5)+20>>2];c[i+(e<<5)+24>>2]=c[d+(u<<5)+24>>2];c[i+(e<<5)+28>>2]=c[d+(u<<5)+28>>2];g=d+(u<<5)+12|0;f=c[g>>2]|0;if((f|0)==0){c[i+(e<<5)+12>>2]=0}else{k=0;while(1){if((c[f+(k<<2)>>2]|0)>-1){k=k+1|0}else{break}}f=aF(a,0,0,0,(k<<2)+4|0)|0;q=f;if((f|0)==0){l=0;break}if((k|0)>0){f=0;while(1){c[q+(f<<2)>>2]=c[(c[g>>2]|0)+(f<<2)>>2];n=f+1|0;if((n|0)<(k|0)){f=n}else{w=k;break}}}else{w=0}c[q+(w<<2)>>2]=-1;c[i+(e<<5)+12>>2]=q}k=u+1|0;f=c[d+(k<<5)>>2]|0;g=k+v|0;n=i+(g<<5)|0;if((f|0)>-1){u=k;h=f;e=g;r=n}else{x=n;break d}}return l|0}else{x=t}}while(0);c[x>>2]=-1;l=i;return l|0}function SE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;g=a+12|0;h=c[g>>2]|0;i=(f|0)!=0;if(i){c[f>>2]=0}j=TE(a,b)|0;if((j|0)!=0){k=j;return k|0}j=a+16|0;b=(d|0)==0;l=(e|0)==0;a:while(1){m=c[g>>2]|0;if((m|0)<=(h|0)){k=0;n=28;break}o=m-1|0;c[g>>2]=o;m=c[(c[j>>2]|0)+(o<<2)>>2]|0;o=c[m>>2]|0;do{if((o|0)==1){p=c[m+4>>2]|0;q=TE(a,c[p>>2]|0)|0;if((q|0)!=0){k=q;n=28;break a}r=TE(a,c[p+4>>2]|0)|0}else if((o|0)==3){p=c[m+4>>2]|0;q=c[p>>2]|0;if((c[q+8>>2]|0)!=0){r=TE(a,q)|0;break}q=c[p+4>>2]|0;if((c[q+8>>2]|0)==0){continue a}r=TE(a,q)|0}else if((o|0)==0){q=c[m+4>>2]|0;p=c[q>>2]|0;if((p|0)==(-2|0)){if(l){continue a}c[e>>2]=c[e>>2]|c[q+4>>2];continue a}else if((p|0)!=(-3|0)){continue a}p=c[q+4>>2]|0;if((p|0)<=-1){continue a}b:do{if(!b){q=c[d>>2]|0;c:do{if((q|0)>-1){s=0;t=d;u=q;while(1){v=s+1|0;if((u|0)==(p|0)){break}w=d+(v<<2)|0;x=c[w>>2]|0;if((x|0)>-1){s=v;t=w;u=x}else{y=v;z=w;break c}}if((p|0)<0){y=s;z=t}else{break b}}else{y=0;z=d}}while(0);c[z>>2]=p;c[d+(y+1<<2)>>2]=-1}}while(0);if(!i){continue a}c[f>>2]=(c[f>>2]|0)+1;continue a}else if((o|0)==2){p=c[c[m+4>>2]>>2]|0;if((c[p+8>>2]|0)==0){continue a}r=TE(a,p)|0}else{continue a}}while(0);if((r|0)!=0){k=r;n=28;break}}if((n|0)==28){return k|0}return 0}function TE(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=a+12|0;e=c[d>>2]|0;f=a|0;g=c[f>>2]|0;if((e|0)<(g|0)){c[(c[a+16>>2]|0)+(e<<2)>>2]=b;c[d>>2]=(c[d>>2]|0)+1;h=0;return h|0}d=c[a+4>>2]|0;if((g|0)>=(d|0)){h=12;return h|0}e=(c[a+8>>2]|0)+g|0;g=(e|0)>(d|0)?d:e;e=a+16|0;d=gF(c[e>>2]|0,g<<2)|0;if((d|0)==0){h=12;return h|0}else{c[f>>2]=g;c[e>>2]=d;TE(a,b)|0;return 0}return 0}function UE(b,d,e,f,g,h,i,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;k=d+12|0;l=c[k>>2]|0;TE(d,e)|0;e=TE(d,0)|0;a:do{if((e|0)==0){m=d+16|0;n=(f&1|0)==0;o=(f&2|0)==0;p=i;q=1;r=0;b:while(1){s=c[k>>2]|0;if((s|0)<=(l|0)){t=r;u=0;break a}v=s-1|0;c[k>>2]=v;w=c[m>>2]|0;x=c[w+(v<<2)>>2]|0;if((x|0)==1){v=s-2|0;c[k>>2]=v;p=c[w+(v<<2)>>2]|0;q=q;r=r;continue}else if((x|0)!=0){p=p;q=q;r=r;continue}x=s-2|0;c[k>>2]=x;s=c[w+(x<<2)>>2]|0;x=c[s>>2]|0;do{if((x|0)==0){w=c[s+4>>2]|0;v=c[w+8>>2]|0;y=c[w>>2]|0;z=c[w+4>>2]|0;do{if((y|0)>-1|(y|0)==-4){A=r+1|0;B=q;C=z;D=y;E=(c[g>>2]|0)+v|0}else{if((y|0)!=-3){A=r;B=q;C=z;D=y;E=v;break}if(!n){A=r;B=q;C=-1;D=-1;E=-1;break}if(o|(q|0)==0){A=r;B=q;C=z;D=-3;E=v;break}c[h+(z<<2)>>2]=1;A=r;B=0;C=z;D=-3;E=v}}while(0);v=aF(b,0,0,1,32)|0;z=v;do{if((v|0)==0){F=0}else{y=aF(b,0,0,1,20)|0;c[v+4>>2]=y;if((y|0)==0){F=0;break}c[v>>2]=0;c[v+8>>2]=-1;c[v+12>>2]=-1;c[y>>2]=D;c[y+4>>2]=C;c[y+8>>2]=E;F=z}}while(0);c[p>>2]=F;z=(F|0)==0?12:0;if((E|0)<=(c[j>>2]|0)){G=z;H=A;I=B;J=p;break}c[j>>2]=E;G=z;H=A;I=B;J=p}else if((x|0)==1){z=c[s+4>>2]|0;v=z;y=c[v>>2]|0;w=z+4|0;z=c[w>>2]|0;K=aF(b,0,0,1,32)|0;if((K|0)==0){L=29;break b}M=aF(b,0,0,1,8)|0;N=K+4|0;c[N>>2]=M;if((M|0)==0){L=29;break b}c[K>>2]=1;c[K+8>>2]=-1;c[K+12>>2]=-1;c[M>>2]=y;c[(c[N>>2]|0)+4>>2]=z;c[K+16>>2]=(c[z+16>>2]|0)+(c[y+16>>2]|0);c[p>>2]=K;K=c[N>>2]|0;N=K;c[N>>2]=0;y=K+4|0;c[y>>2]=0;K=TE(d,c[w>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,y)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,1)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,c[v>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}G=TE(d,0)|0;H=r;I=q;J=N}else if((x|0)==2){N=c[s+4>>2]|0;K=N;v=TE(d,c[K>>2]|0)|0;if((v|0)!=0){t=r;u=v;break a}v=TE(d,0)|0;if((v|0)!=0){t=r;u=v;break a}v=c[K>>2]|0;K=c[N+4>>2]|0;y=c[N+8>>2]|0;w=a[N+12|0]|0;N=aF(b,0,0,1,32)|0;if((N|0)==0){L=40;break b}z=aF(b,0,0,1,16)|0;M=N+4|0;c[M>>2]=z;if((z|0)==0){L=40;break b}c[N>>2]=2;c[N+8>>2]=-1;c[N+12>>2]=-1;c[z>>2]=v;c[z+4>>2]=K;c[z+8>>2]=y;y=z+12|0;a[y]=a[y]&-2|w&1;c[N+16>>2]=c[v+16>>2];c[p>>2]=N;p=c[M>>2]|0;q=q;r=r;continue b}else if((x|0)==3){M=c[s+4>>2]|0;N=M;v=c[N>>2]|0;w=M+4|0;M=c[w>>2]|0;y=aF(b,0,0,1,32)|0;if((y|0)==0){L=20;break b}z=aF(b,0,0,1,8)|0;K=y+4|0;c[K>>2]=z;if((z|0)==0){L=20;break b}c[y>>2]=3;c[y+8>>2]=-1;c[y+12>>2]=-1;c[z>>2]=v;c[(c[K>>2]|0)+4>>2]=M;c[y+16>>2]=(c[M+16>>2]|0)+(c[v+16>>2]|0);c[p>>2]=y;y=c[K>>2]|0;K=TE(d,c[w>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,y+4|0)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,1)|0;if((K|0)!=0){t=r;u=K;break a}K=TE(d,c[N>>2]|0)|0;if((K|0)!=0){t=r;u=K;break a}G=TE(d,0)|0;H=r;I=q;J=y}else{p=p;q=q;r=r;continue b}}while(0);if((G|0)==0){p=J;q=I;r=H}else{t=H;u=G;break a}}if((L|0)==20){c[p>>2]=0;t=r;u=12;break}else if((L|0)==29){c[p>>2]=0;t=r;u=12;break}else if((L|0)==40){c[p>>2]=0;t=r;u=12;break}}else{t=0;u=e}}while(0);c[g>>2]=(c[g>>2]|0)+t;return u|0}function VE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=aF(a,0,0,0,8)|0;if((e|0)==0){f=12;return f|0}g=aF(a,0,0,1,32)|0;h=g;do{if((g|0)!=0){i=aF(a,0,0,1,20)|0;c[g+4>>2]=i;if((i|0)==0){break}c[g>>2]=0;c[g+8>>2]=-1;c[g+12>>2]=-1;c[i>>2]=-3;c[i+4>>2]=d;c[i+8>>2]=-1;c[e>>2]=h;i=aF(a,0,0,0,32)|0;j=e+4|0;c[j>>2]=i;if((i|0)==0){f=12;return f|0}k=b+4|0;c[i+4>>2]=c[k>>2];i=b|0;c[c[j>>2]>>2]=c[i>>2];c[(c[j>>2]|0)+8>>2]=-1;c[(c[j>>2]|0)+12>>2]=-1;c[(c[j>>2]|0)+24>>2]=0;c[(c[j>>2]|0)+28>>2]=0;c[(c[j>>2]|0)+20>>2]=0;c[k>>2]=e;c[i>>2]=1;f=0;return f|0}}while(0);c[e>>2]=0;f=12;return f|0}function WE(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=aF(a,0,0,0,8)|0;if((e|0)==0){f=12;return f|0}g=aF(a,0,0,1,32)|0;h=g;do{if((g|0)!=0){i=aF(a,0,0,1,20)|0;c[g+4>>2]=i;if((i|0)==0){break}c[g>>2]=0;c[g+8>>2]=-1;c[g+12>>2]=-1;c[i>>2]=-3;c[i+4>>2]=d;c[i+8>>2]=-1;c[e+4>>2]=h;i=aF(a,0,0,0,32)|0;j=e;c[j>>2]=i;if((i|0)==0){f=12;return f|0}k=b+4|0;c[i+4>>2]=c[k>>2];i=b|0;c[c[j>>2]>>2]=c[i>>2];c[(c[j>>2]|0)+8>>2]=-1;c[(c[j>>2]|0)+12>>2]=-1;c[(c[j>>2]|0)+24>>2]=0;c[(c[j>>2]|0)+28>>2]=0;c[(c[j>>2]|0)+20>>2]=0;c[k>>2]=e;c[i>>2]=1;f=0;return f|0}}while(0);c[e+4>>2]=0;f=12;return f|0}function XE(a,b){a=a|0;b=b|0;var d=0,e=0;d=c[c[(c[a>>2]|0)+4>>2]>>2]|0;a=c[c[(c[b>>2]|0)+4>>2]>>2]|0;if((d|0)<(a|0)){e=-1;return e|0}e=(d|0)>(a|0)|0;return e|0}function YE(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Ec=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0;g=i;i=i+16|0;h=g|0;j=g+8|0;k=c[a+4>>2]|0;a=k;l=k+40|0;m=c[l>>2]|0;do{if((m|0)<1|(d|0)==0){n=0}else{o=dF(m<<2)|0;if((o|0)==0){p=12}else{n=o;break}i=g;return p|0}}while(0);m=n;a:do{if((c[k+60>>2]|0)==0){c[h>>2]=0;o=f&1;q=f&2;r=k+56|0;s=c[r>>2]&4;if((n|0)==0){t=0}else{t=c[l>>2]|0}u=t<<2;v=c[k+52>>2]|0;w=v<<3;x=w+8|0;y=u+12+w+(x+(da(u,v)|0)<<1)|0;z=dF(y)|0;if((z|0)==0){A=12;break}vF(z|0,0,y|0)|0;y=z;B=z+u&3;C=((B|0)==0?0:4-B|0)+u|0;B=z+C|0;D=C+x|0;C=z+D&3;E=((C|0)==0?0:4-C|0)+D|0;D=z+E|0;C=E+x|0;x=z+C&3;E=((x|0)==0?0:4-x|0)+C|0;C=z+E|0;x=E+w|0;w=z+x&3;if((v|0)>0){E=t<<3;F=0;G=z+(((w|0)==0?0:4-w|0)+x)|0;while(1){c[D+(F<<3)+4>>2]=G;c[B+(F<<3)+4>>2]=G+u;x=F+1|0;if((x|0)<(v|0)){F=x;G=G+E|0}else{H=0;break}}do{c[C+(H<<3)>>2]=-1;H=H+1|0;}while((H|0)<(v|0))}v=KE(h,b,4)|0;if((v|0)<1){if((v|0)<0){A=1;break}I=v+1|0}else{I=v}v=k+8|0;E=(s|0)==0;G=(o|0)==0;F=(t|0)>0;u=k+12|0;x=k+44|0;w=k+32|0;J=k+36|0;K=(t|0)==0;L=F^1;M=0;N=b+I|0;O=0;P=I;Q=D;R=y;S=0;T=-1;U=B;V=B;while(1){if((T|0)<0){W=c[v>>2]|0;X=W+8|0;b:do{if((c[X>>2]|0)==0){Y=V;Z=T;_=S}else{$=(O|0)==0;aa=(M|0)==95;ba=(O|0)<1&G;ca=((M|0)!=10|E)^1;ea=V;fa=T;ga=S;ha=W;ia=X;while(1){ja=ha;ka=ia;c:while(1){la=ja+12|0;if((c[C+(c[la>>2]<<3)>>2]|0)>=(O|0)){ma=ga;na=fa;oa=ea;break}pa=ja+20|0;qa=c[pa>>2]|0;if((qa|0)==0){ra=260;break}d:do{if((qa&1|0)==0|ba|ca){if((qa&2|0)!=0){sa=c[h>>2]|0;if((sa|q|0)!=0&((sa|0)!=10|E)){break}}do{if((qa&16|0)!=0){if(aa){break d}if((tE(M)|0)!=0){break d}sa=c[h>>2]|0;if((sa|0)==95){break}if((tE(sa)|0)==0){break d}}}while(0);sa=c[pa>>2]|0;if((sa&32|0)==0){ta=sa}else{if(!aa){if((tE(M)|0)==0){break}}sa=c[h>>2]|0;if((sa|0)==95){break}if((tE(sa)|0)!=0){break}ta=c[pa>>2]|0}do{if((ta&64|0)==0|$){ua=ta}else{sa=c[h>>2]|0;if((sa|0)==0){ua=ta;break}if(aa){va=1;wa=sa}else{sa=(tE(M)|0)!=0|0;va=sa;wa=c[h>>2]|0}if((wa|0)==95){xa=1}else{xa=(tE(wa)|0)!=0|0}if((va|0)==(xa|0)){break d}ua=c[pa>>2]|0}}while(0);if((ua&128|0)==0){ra=260;break c}if($){break}sa=c[h>>2]|0;if((sa|0)==0){break}if(aa){ya=1;za=sa}else{sa=(tE(M)|0)!=0|0;ya=sa;za=c[h>>2]|0}if((za|0)==95){Aa=1}else{Aa=(tE(za)|0)!=0|0}if((ya|0)==(Aa|0)){ra=260;break c}}}while(0);pa=ja+40|0;if((c[pa>>2]|0)==0){Y=ea;Z=fa;_=ga;break b}else{ja=ja+32|0;ka=pa}}if((ra|0)==260){ra=0;pa=ea|0;c[pa>>2]=c[ka>>2];if(F){qa=ea+4|0;sa=0;do{c[(c[qa>>2]|0)+(sa<<2)>>2]=-1;sa=sa+1|0;}while((sa|0)<(t|0))}sa=c[ja+16>>2]|0;do{if((sa|0)!=0){qa=c[sa>>2]|0;if((qa|0)<=-1){break}ka=ea+4|0;Ba=sa;Ca=qa;do{if((Ca|0)<(t|0)){c[(c[ka>>2]|0)+(Ca<<2)>>2]=O}Ba=Ba+4|0;Ca=c[Ba>>2]|0;}while((Ca|0)>-1)}}while(0);sa=(c[pa>>2]|0)!=(c[u>>2]|0);if(sa|L){Da=sa?ga:1;Ea=sa?fa:O;Fa=ea+4|0}else{sa=ea+4|0;Ca=0;while(1){c[n+(Ca<<2)>>2]=c[(c[sa>>2]|0)+(Ca<<2)>>2];Ba=Ca+1|0;if((Ba|0)<(t|0)){Ca=Ba}else{Da=1;Ea=O;Fa=sa;break}}}c[C+(c[la>>2]<<3)>>2]=O;c[C+(c[la>>2]<<3)+4>>2]=Fa;ma=Da;na=Ea;oa=ea+8|0}sa=ja+40|0;if((c[sa>>2]|0)==0){Y=oa;Z=na;_=ma;break}else{ea=oa;fa=na;ga=ma;ha=ja+32|0;ia=sa}}}}while(0);c[Y>>2]=0;Ga=_;Ha=Z}else{if(K|(V|0)==(U|0)){Ia=T;break}else{Ga=S;Ha=T}}X=c[h>>2]|0;if((X|0)==0){Ia=Ha;break}W=O+P|0;ia=KE(h,N,4)|0;if((ia|0)<1){if((ia|0)<0){A=1;break a}Ja=ia+1|0}else{Ja=ia}ia=N+Ja|0;if((c[x>>2]|0)==0|(Ga|0)==0){Ka=U;La=Ga;Ma=Q}else{ha=U|0;ga=c[ha>>2]|0;if((ga|0)==0){Na=Q}else{fa=Q;ea=ha;ha=ga;while(1){ga=c[J>>2]|0;aa=c[ga>>2]|0;$=ea+4|0;e:do{if((aa|0)>-1){ca=0;ba=aa;while(1){sa=c[ga+((ca|1)<<2)>>2]|0;if((ba|0)>=(t|0)){Oa=fa;break e}Ca=c[$>>2]|0;if((c[Ca+(sa<<2)>>2]|0)==(c[n+(sa<<2)>>2]|0)){if((c[Ca+(ba<<2)>>2]|0)<(c[n+(ba<<2)>>2]|0)){Oa=fa;break e}}Ca=ca+2|0;sa=c[ga+(Ca<<2)>>2]|0;if((sa|0)>-1){ca=Ca;ba=sa}else{ra=288;break}}}else{ra=288}}while(0);if((ra|0)==288){ra=0;c[fa>>2]=ha;ga=fa+4|0;aa=c[ga>>2]|0;c[ga>>2]=c[$>>2];c[$>>2]=aa;Oa=fa+8|0}aa=ea+8|0;ga=c[aa>>2]|0;if((ga|0)==0){Na=Oa;break}else{fa=Oa;ea=aa;ha=ga}}}c[Na>>2]=0;Ka=Q;La=0;Ma=U}ha=c[Ka>>2]|0;if((ha|0)==0){Pa=Ma;Qa=Ha;Ra=La;Sa=R}else{ea=(W|0)==0;fa=(X|0)==95;ga=(W|0)<1&G;aa=((X|0)!=10|E)^1;ba=Ka;ca=Ma;ja=Ha;sa=La;Ca=R;pa=ha;while(1){ha=pa+8|0;if((c[ha>>2]|0)==0){Ta=ca;Ua=ja;Va=sa;Wa=Ca}else{Ba=ba+4|0;ka=ca;qa=ja;Xa=sa;Ya=Ca;_a=pa;$a=ha;while(1){f:do{if((c[_a>>2]|0)>>>0>X>>>0){ab=Ya;bb=Xa;cb=qa;db=ka}else{if((c[_a+4>>2]|0)>>>0<X>>>0){ab=Ya;bb=Xa;cb=qa;db=ka;break}ha=_a+20|0;eb=c[ha>>2]|0;g:do{if((eb|0)!=0){if(!((eb&1|0)==0|ga|aa)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if((eb&2|0)!=0){fb=c[h>>2]|0;if((fb|q|0)!=0&((fb|0)!=10|E)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}do{if((eb&16|0)!=0){if(fa){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if((tE(X)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}fb=c[h>>2]|0;if((fb|0)==95){break}if((tE(fb)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}}while(0);fb=c[ha>>2]|0;if((fb&32|0)==0){gb=fb}else{if(!fa){if((tE(X)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}fb=c[h>>2]|0;if((fb|0)==95){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if((tE(fb)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}gb=c[ha>>2]|0}do{if((gb&64|0)==0|ea){hb=gb}else{fb=c[h>>2]|0;if((fb|0)==0){hb=gb;break}if(fa){ib=1;jb=fb}else{fb=(tE(X)|0)!=0|0;ib=fb;jb=c[h>>2]|0}if((jb|0)==95){kb=1}else{kb=(tE(jb)|0)!=0|0}if((ib|0)==(kb|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}hb=c[ha>>2]|0}}while(0);if((hb&128|0)==0){lb=hb}else{if(ea){ab=Ya;bb=Xa;cb=qa;db=ka;break f}fb=c[h>>2]|0;if((fb|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}if(fa){mb=1;nb=fb}else{fb=(tE(X)|0)!=0|0;mb=fb;nb=c[h>>2]|0}if((nb|0)==95){ob=1}else{ob=(tE(nb)|0)!=0|0}if((mb|0)!=(ob|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}lb=c[ha>>2]|0}do{if((lb&4|0)==0){pb=lb}else{if((c[r>>2]&2|0)!=0){pb=lb;break}if((xE(X,c[_a+24>>2]|0)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}pb=c[ha>>2]|0}}while(0);do{if((pb&4|0)!=0){if((c[r>>2]&2|0)==0){break}fb=JE(X)|0;qb=_a+24|0;if((xE(fb,c[qb>>2]|0)|0)!=0){break}fb=HE(X)|0;if((xE(fb,c[qb>>2]|0)|0)==0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}}while(0);if((c[ha>>2]&8|0)==0){break}qb=c[_a+28>>2]|0;fb=c[qb>>2]|0;if((fb|0)==0){break}if((c[r>>2]&2|0)==0){rb=qb;sb=fb;while(1){if((xE(X,sb)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}rb=rb+4|0;sb=c[rb>>2]|0;if((sb|0)==0){break g}}}else{tb=qb}do{sb=HE(X)|0;if((xE(sb,c[tb>>2]|0)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}sb=JE(X)|0;if((xE(sb,c[tb>>2]|0)|0)!=0){ab=Ya;bb=Xa;cb=qa;db=ka;break f}tb=tb+4|0;}while((c[tb>>2]|0)!=0)}}while(0);if(F){ha=0;do{c[Ya+(ha<<2)>>2]=c[(c[Ba>>2]|0)+(ha<<2)>>2];ha=ha+1|0;}while((ha|0)<(t|0))}ha=c[_a+16>>2]|0;do{if((ha|0)!=0){eb=c[ha>>2]|0;if((eb|0)>-1){ub=ha;vb=eb}else{break}do{if((vb|0)<(t|0)){c[Ya+(vb<<2)>>2]=W}ub=ub+4|0;vb=c[ub>>2]|0;}while((vb|0)>-1)}}while(0);ha=_a+12|0;eb=c[ha>>2]|0;if((c[C+(eb<<3)>>2]|0)<(W|0)){qb=ka|0;c[qb>>2]=c[$a>>2];sb=ka+4|0;rb=c[sb>>2]|0;c[sb>>2]=Ya;c[C+(c[ha>>2]<<3)>>2]=W;c[C+(c[ha>>2]<<3)+4>>2]=sb;do{if((c[qb>>2]|0)==(c[u>>2]|0)){if((qa|0)==-1){if(F){wb=0}else{xb=1;yb=W;break}}else{if(!F){xb=Xa;yb=qa;break}if((c[c[sb>>2]>>2]|0)>(c[n>>2]|0)){xb=Xa;yb=qa;break}else{wb=0}}while(1){c[n+(wb<<2)>>2]=c[(c[sb>>2]|0)+(wb<<2)>>2];ha=wb+1|0;if((ha|0)<(t|0)){wb=ha}else{xb=1;yb=W;break}}}else{xb=Xa;yb=qa}}while(0);ab=rb;bb=xb;cb=yb;db=ka+8|0;break}sb=c[w>>2]|0;qb=c[C+(eb<<3)+4>>2]|0;ha=c[qb>>2]|0;if(F){zb=0}else{ab=Ya;bb=Xa;cb=qa;db=ka;break}while(1){fb=c[Ya+(zb<<2)>>2]|0;Ab=c[ha+(zb<<2)>>2]|0;if((c[sb+(zb<<2)>>2]|0)==0){if((fb|0)<(Ab|0)){break}if((fb|0)>(Ab|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}else{if((fb|0)>(Ab|0)){break}if((fb|0)<(Ab|0)){ab=Ya;bb=Xa;cb=qa;db=ka;break f}}Ab=zb+1|0;if((Ab|0)<(t|0)){zb=Ab}else{ab=Ya;bb=Xa;cb=qa;db=ka;break f}}c[qb>>2]=Ya;if((c[$a>>2]|0)==(c[u>>2]|0)){Bb=0}else{ab=ha;bb=Xa;cb=qa;db=ka;break}while(1){c[n+(Bb<<2)>>2]=c[Ya+(Bb<<2)>>2];sb=Bb+1|0;if((sb|0)<(t|0)){Bb=sb}else{ab=ha;bb=1;cb=W;db=ka;break}}}}while(0);ha=_a+40|0;if((c[ha>>2]|0)==0){Ta=db;Ua=cb;Va=bb;Wa=ab;break}else{ka=db;qa=cb;Xa=bb;Ya=ab;_a=_a+32|0;$a=ha}}}$a=ba+8|0;_a=c[$a>>2]|0;if((_a|0)==0){Pa=Ta;Qa=Ua;Ra=Va;Sa=Wa;break}else{ba=$a;ca=Ta;ja=Ua;sa=Va;Ca=Wa;pa=_a}}}c[Pa>>2]=0;M=X;N=ia;O=W;P=Ja;Q=Ka;R=Sa;S=Ra;T=Qa;U=Ma;V=Pa}eF(z);Cb=Ia>>>31;Db=Ia;ra=373}else{c[j>>2]=0;V=f&1;U=f&2;T=k+56|0;S=c[T>>2]&4;R=_E(0,0)|0;if((R|0)==0){A=12;break}Q=aF(R,0,0,0,32)|0;P=Q;if((Q|0)==0){$E(R);A=12;break}c[Q+24>>2]=0;c[Q+28>>2]=0;Q=c[l>>2]|0;if((Q|0)==0){Eb=0;ra=9}else{O=dF(Q<<2)|0;N=O;if((O|0)==0){Fb=12;Gb=0;Hb=0;Ib=N;Jb=0}else{Eb=N;ra=9}}do{if((ra|0)==9){N=Eb;O=c[k+28>>2]|0;if((O|0)==0){Kb=0}else{M=dF(O<<3)|0;O=M;if((M|0)==0){Fb=12;Gb=O;Hb=0;Ib=Eb;Jb=0;break}else{Kb=O}}O=k+52|0;M=c[O>>2]|0;if((M|0)==0){Lb=0}else{u=dF(M<<2)|0;M=u;if((u|0)==0){Fb=12;Gb=Kb;Hb=M;Ib=Eb;Jb=0;break}else{Lb=M}}M=Lb;u=(n|0)==0;F=k+8|0;C=k+12|0;w=k+32|0;r=(S|0)==0;E=(V|0)==0;q=b;G=1;J=-1;x=-1;K=P;L=Q;h:while(1){do{if((L|0)>0){if(u){vF(N|0,-1|0,L<<2|0)|0;break}else{v=0;do{c[Eb+(v<<2)>>2]=-1;c[n+(v<<2)>>2]=-1;v=v+1|0;}while((v|0)<(c[l>>2]|0))}}}while(0);v=c[O>>2]|0;if((v|0)>0){vF(M|0,0,v<<2|0)|0}v=c[j>>2]|0;B=G+J|0;y=KE(j,q,4)|0;if((y|0)<1){if((y|0)<0){A=1;break a}Mb=y+1|0}else{Mb=y}y=q+Mb|0;D=c[j>>2]|0;o=c[F>>2]|0;s=o+8|0;if((c[s>>2]|0)==0){Nb=Mb;Ob=x;Pb=K;Qb=0;ra=195}else{pa=(B|0)==0;Ca=(v|0)==95;sa=(B|0)<1&E;ja=((v|0)!=10|r)^1;ca=0;ba=0;fa=K;ea=o;o=s;while(1){s=ea+20|0;aa=c[s>>2]|0;i:do{if((aa|0)==0){ra=56}else{if(!((aa&1|0)==0|sa|ja)){Rb=fa;Sb=ba;Tb=ca;break}if((aa&2|0)!=0){ga=c[j>>2]|0;if((ga|U|0)!=0&((ga|0)!=10|r)){Rb=fa;Sb=ba;Tb=ca;break}}do{if((aa&16|0)!=0){if(Ca){Rb=fa;Sb=ba;Tb=ca;break i}if((tE(v)|0)!=0){Rb=fa;Sb=ba;Tb=ca;break i}ga=c[j>>2]|0;if((ga|0)==95){break}if((tE(ga)|0)==0){Rb=fa;Sb=ba;Tb=ca;break i}}}while(0);ga=c[s>>2]|0;if((ga&32|0)==0){Ub=ga}else{if(!Ca){if((tE(v)|0)==0){Rb=fa;Sb=ba;Tb=ca;break}}ga=c[j>>2]|0;if((ga|0)==95){Rb=fa;Sb=ba;Tb=ca;break}if((tE(ga)|0)!=0){Rb=fa;Sb=ba;Tb=ca;break}Ub=c[s>>2]|0}do{if((Ub&64|0)==0|pa){Vb=Ub}else{ga=c[j>>2]|0;if((ga|0)==0){Vb=Ub;break}if(Ca){Wb=1;Xb=ga}else{ga=(tE(v)|0)!=0|0;Wb=ga;Xb=c[j>>2]|0}if((Xb|0)==95){Yb=1}else{Yb=(tE(Xb)|0)!=0|0}if((Wb|0)==(Yb|0)){Rb=fa;Sb=ba;Tb=ca;break i}Vb=c[s>>2]|0}}while(0);if((Vb&128|0)==0){ra=56;break}if(pa){Rb=fa;Sb=ba;Tb=ca;break}ga=c[j>>2]|0;if((ga|0)==0){Rb=fa;Sb=ba;Tb=ca;break}if(Ca){Zb=1;_b=ga}else{ga=(tE(v)|0)!=0|0;Zb=ga;_b=c[j>>2]|0}if((_b|0)==95){$b=1}else{$b=(tE(_b)|0)!=0|0}if((Zb|0)==($b|0)){ra=56}else{Rb=fa;Sb=ba;Tb=ca}}}while(0);do{if((ra|0)==56){ra=0;if((ca|0)==0){Rb=fa;Sb=c[ea+16>>2]|0;Tb=c[o>>2]|0;break}s=fa+28|0;aa=c[s>>2]|0;if((aa|0)==0){ga=aF(R,0,0,0,32)|0;_a=ga;if((ga|0)==0){ra=60;break h}c[ga+24>>2]=fa;c[ga+28>>2]=0;$a=aF(R,0,0,0,c[l>>2]<<2)|0;c[ga+20>>2]=$a;if(($a|0)==0){ra=67;break h}c[s>>2]=_a;ac=_a}else{ac=aa}c[ac>>2]=B;c[ac+4>>2]=y;c[ac+8>>2]=c[o>>2];c[ac+12>>2]=c[ea+12>>2];c[ac+16>>2]=c[j>>2];if((c[l>>2]|0)>0){aa=ac+20|0;_a=0;do{c[(c[aa>>2]|0)+(_a<<2)>>2]=c[Eb+(_a<<2)>>2];_a=_a+1|0;}while((_a|0)<(c[l>>2]|0))}_a=c[ea+16>>2]|0;if((_a|0)==0){Rb=ac;Sb=ba;Tb=ca;break}aa=c[_a>>2]|0;if((aa|0)<=-1){Rb=ac;Sb=ba;Tb=ca;break}s=ac+20|0;$a=_a;_a=aa;while(1){aa=$a+4|0;c[(c[s>>2]|0)+(_a<<2)>>2]=B;ga=c[aa>>2]|0;if((ga|0)>-1){$a=aa;_a=ga}else{Rb=ac;Sb=ba;Tb=ca;break}}}}while(0);_a=ea+40|0;if((c[_a>>2]|0)==0){break}else{ca=Tb;ba=Sb;fa=Rb;ea=ea+32|0;o=_a}}do{if((Sb|0)==0){bc=0}else{o=c[Sb>>2]|0;if((o|0)>-1){cc=Sb;dc=o}else{bc=Sb;break}while(1){c[Eb+(dc<<2)>>2]=B;o=cc+4|0;ea=c[o>>2]|0;if((ea|0)>-1){cc=o;dc=ea}else{bc=o;break}}}}while(0);if((Tb|0)==0){Nb=Mb;Ob=x;Pb=Rb;Qb=bc;ra=195}else{ec=y;fc=B;gc=Mb;hc=x;ic=Rb;jc=bc;kc=Tb}}j:while(1){if((ra|0)==195){ra=0;o=Pb+24|0;if((c[o>>2]|0)==0){break}ea=Pb+8|0;fa=c[ea>>2]|0;if((c[fa+20>>2]&256|0)==0){lc=fa}else{c[Lb+(c[Pb+12>>2]<<2)>>2]=0;lc=c[ea>>2]|0}ea=c[Pb>>2]|0;fa=c[Pb+4>>2]|0;c[j>>2]=c[Pb+16>>2];ba=c[l>>2]|0;if((ba|0)>0){ca=Pb+20|0;v=0;do{c[Eb+(v<<2)>>2]=c[(c[ca>>2]|0)+(v<<2)>>2];v=v+1|0;}while((v|0)<(ba|0))}ec=fa;fc=ea;gc=Nb;hc=Ob;ic=c[o>>2]|0;jc=Qb;kc=lc}if((kc|0)==(c[C>>2]|0)){mc=jc;nc=ic;oc=gc;pc=fc}else{ba=kc;v=jc;ca=ic;Ca=gc;pa=fc;ja=ec;while(1){sa=ba+8|0;do{if((c[sa>>2]|0)==0){ra=109}else{if((c[ba+20>>2]&256|0)==0){ra=109;break}_a=c[ba+24>>2]|0;ZE(_a+1|0,Kb,c[T>>2]&-9,a,Eb,pa);$a=c[Kb+(_a<<3)>>2]|0;s=c[Kb+(_a<<3)+4>>2]|0;_a=s-$a|0;if((Za(b+$a|0,ja-1|0,_a|0)|0)!=0){Nb=Ca;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}ga=(s|0)==($a|0);$a=ga&1;s=Lb+(c[ba+12>>2]<<2)|0;if(ga){if((c[s>>2]|0)!=0){Nb=Ca;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}}c[s>>2]=$a;$a=_a-1|0;_a=$a+pa|0;s=c[j>>2]|0;ga=KE(j,ja+$a|0,4)|0;if((ga|0)<1){if((ga|0)<0){A=1;break a}qc=ga+1|0}else{qc=ga}rc=s;sc=qc+$a|0;tc=_a;uc=qc}}while(0);do{if((ra|0)==109){ra=0;_a=c[j>>2]|0;if((_a|0)==0){Nb=Ca;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}$a=KE(j,ja,4)|0;if(($a|0)>=1){rc=_a;sc=$a;tc=pa;uc=$a;break}if(($a|0)<0){A=1;break a}s=$a+1|0;rc=_a;sc=s;tc=pa;uc=s}}while(0);s=ja+sc|0;_a=tc+Ca|0;if((c[sa>>2]|0)==0){Nb=uc;Ob=hc;Pb=ca;Qb=v;ra=195;continue j}$a=(_a|0)==0;ga=(rc|0)==95;aa=(_a|0)<1&E;Ya=((rc|0)!=10|r)^1;Xa=v;qa=ca;ka=ba;Ba=0;$=sa;while(1){k:do{if((c[ka>>2]|0)>>>0>rc>>>0){vc=Ba;wc=qa;xc=Xa}else{if((c[ka+4>>2]|0)>>>0<rc>>>0){vc=Ba;wc=qa;xc=Xa;break}ha=ka+20|0;qb=c[ha>>2]|0;l:do{if((qb|0)!=0){if(!((qb&1|0)==0|aa|Ya)){vc=Ba;wc=qa;xc=Xa;break k}if((qb&2|0)!=0){sb=c[j>>2]|0;if((sb|U|0)!=0&((sb|0)!=10|r)){vc=Ba;wc=qa;xc=Xa;break k}}do{if((qb&16|0)!=0){if(ga){vc=Ba;wc=qa;xc=Xa;break k}if((tE(rc)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}sb=c[j>>2]|0;if((sb|0)==95){break}if((tE(sb)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}}}while(0);sb=c[ha>>2]|0;if((sb&32|0)==0){yc=sb}else{if(!ga){if((tE(rc)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}}sb=c[j>>2]|0;if((sb|0)==95){vc=Ba;wc=qa;xc=Xa;break k}if((tE(sb)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}yc=c[ha>>2]|0}do{if((yc&64|0)==0|$a){zc=yc}else{sb=c[j>>2]|0;if((sb|0)==0){zc=yc;break}if(ga){Ac=1;Bc=sb}else{sb=(tE(rc)|0)!=0|0;Ac=sb;Bc=c[j>>2]|0}if((Bc|0)==95){Cc=1}else{Cc=(tE(Bc)|0)!=0|0}if((Ac|0)==(Cc|0)){vc=Ba;wc=qa;xc=Xa;break k}zc=c[ha>>2]|0}}while(0);if((zc&128|0)==0){Dc=zc}else{if($a){vc=Ba;wc=qa;xc=Xa;break k}sb=c[j>>2]|0;if((sb|0)==0){vc=Ba;wc=qa;xc=Xa;break k}if(ga){Ec=1;Fc=sb}else{sb=(tE(rc)|0)!=0|0;Ec=sb;Fc=c[j>>2]|0}if((Fc|0)==95){Gc=1}else{Gc=(tE(Fc)|0)!=0|0}if((Ec|0)!=(Gc|0)){vc=Ba;wc=qa;xc=Xa;break k}Dc=c[ha>>2]|0}do{if((Dc&4|0)==0){Hc=Dc}else{if((c[T>>2]&2|0)!=0){Hc=Dc;break}if((xE(rc,c[ka+24>>2]|0)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}Hc=c[ha>>2]|0}}while(0);do{if((Hc&4|0)!=0){if((c[T>>2]&2|0)==0){break}sb=JE(rc)|0;eb=ka+24|0;if((xE(sb,c[eb>>2]|0)|0)!=0){break}sb=HE(rc)|0;if((xE(sb,c[eb>>2]|0)|0)==0){vc=Ba;wc=qa;xc=Xa;break k}}}while(0);if((c[ha>>2]&8|0)==0){break}eb=c[ka+28>>2]|0;sb=c[eb>>2]|0;if((sb|0)==0){break}if((c[T>>2]&2|0)==0){rb=eb;Ab=sb;while(1){if((xE(rc,Ab)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}rb=rb+4|0;Ab=c[rb>>2]|0;if((Ab|0)==0){break l}}}else{Ic=eb}do{Ab=HE(rc)|0;if((xE(Ab,c[Ic>>2]|0)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}Ab=JE(rc)|0;if((xE(Ab,c[Ic>>2]|0)|0)!=0){vc=Ba;wc=qa;xc=Xa;break k}Ic=Ic+4|0;}while((c[Ic>>2]|0)!=0)}}while(0);if((Ba|0)==0){vc=c[$>>2]|0;wc=qa;xc=c[ka+16>>2]|0;break}ha=qa+28|0;qb=c[ha>>2]|0;if((qb|0)==0){eb=aF(R,0,0,0,32)|0;Ab=eb;if((eb|0)==0){ra=169;break h}c[eb+24>>2]=qa;c[eb+28>>2]=0;rb=aF(R,0,0,0,c[l>>2]<<2)|0;c[eb+20>>2]=rb;if((rb|0)==0){ra=176;break h}c[ha>>2]=Ab;Jc=Ab}else{Jc=qb}c[Jc>>2]=_a;c[Jc+4>>2]=s;c[Jc+8>>2]=c[$>>2];c[Jc+12>>2]=c[ka+12>>2];c[Jc+16>>2]=c[j>>2];if((c[l>>2]|0)>0){qb=Jc+20|0;Ab=0;do{c[(c[qb>>2]|0)+(Ab<<2)>>2]=c[Eb+(Ab<<2)>>2];Ab=Ab+1|0;}while((Ab|0)<(c[l>>2]|0))}Ab=c[ka+16>>2]|0;if((Ab|0)==0){vc=Ba;wc=Jc;xc=Xa;break}qb=Jc+20|0;ha=c[Ab>>2]|0;if((ha|0)>-1){Kc=Ab;Lc=ha}else{vc=Ba;wc=Jc;xc=Xa;break}while(1){c[(c[qb>>2]|0)+(Lc<<2)>>2]=_a;ha=Kc+4|0;Ab=c[ha>>2]|0;if((Ab|0)>-1){Kc=ha;Lc=Ab}else{vc=Ba;wc=Jc;xc=Xa;break}}}}while(0);qb=ka+40|0;if((c[qb>>2]|0)==0){break}else{Xa=xc;qa=wc;ka=ka+32|0;Ba=vc;$=qb}}if((vc|0)==0){Nb=uc;Ob=hc;Pb=wc;Qb=xc;ra=195;continue j}do{if((xc|0)==0){Mc=0}else{$=c[xc>>2]|0;if(($|0)>-1){Nc=xc;Oc=$}else{Mc=xc;break}while(1){$=Nc+4|0;c[Eb+(Oc<<2)>>2]=_a;Ba=c[$>>2]|0;if((Ba|0)>-1){Nc=$;Oc=Ba}else{Mc=$;break}}}}while(0);if((vc|0)==(c[C>>2]|0)){mc=Mc;nc=wc;oc=uc;pc=_a;break}else{ba=vc;v=Mc;ca=wc;Ca=uc;pa=_a;ja=s}}}m:do{if((hc|0)<(pc|0)){ra=96}else{if((hc|0)!=(pc|0)|u){Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}ja=c[l>>2]|0;pa=c[w>>2]|0;if((ja|0)>0){Pc=0}else{Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}while(1){Ca=c[Eb+(Pc<<2)>>2]|0;ca=c[n+(Pc<<2)>>2]|0;if((c[pa+(Pc<<2)>>2]|0)==0){if((Ca|0)<(ca|0)){ra=96;break m}if((Ca|0)>(ca|0)){Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}}else{if((Ca|0)>(ca|0)){Qc=ja;break m}if((Ca|0)<(ca|0)){Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}}ca=Pc+1|0;if((ca|0)<(ja|0)){Pc=ca}else{Nb=oc;Ob=hc;Pb=nc;Qb=mc;ra=195;continue j}}}}while(0);if((ra|0)==96){ra=0;if(u){Nb=oc;Ob=pc;Pb=nc;Qb=mc;ra=195;continue}Qc=c[l>>2]|0}if((Qc|0)>0){Rc=0}else{Nb=oc;Ob=pc;Pb=nc;Qb=mc;ra=195;continue}while(1){c[n+(Rc<<2)>>2]=c[Eb+(Rc<<2)>>2];ja=Rc+1|0;if((ja|0)<(c[l>>2]|0)){Rc=ja}else{Nb=oc;Ob=pc;Pb=nc;Qb=mc;ra=195;continue j}}}if((Ob|0)>=0){ra=205;break}if((c[j>>2]|0)==0){ra=205;break}c[j>>2]=D;q=y;G=Nb;J=B;x=Ob;K=Pb;L=c[l>>2]|0}if((ra|0)==60){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==67){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==169){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==176){$E(R);if((Eb|0)!=0){eF(N)}if((Kb|0)!=0){eF(Kb)}if((Lb|0)==0){A=12;break a}eF(M);A=12;break a}else if((ra|0)==205){Fb=Ob>>>31;Gb=Kb;Hb=Lb;Ib=Eb;Jb=Ob;break}}}while(0);$E(R);if((Ib|0)!=0){eF(Ib)}if((Gb|0)!=0){eF(Gb)}if((Hb|0)==0){Cb=Fb;Db=Jb;ra=373;break}eF(Hb);Cb=Fb;Db=Jb;ra=373}}while(0);do{if((ra|0)==373){if((Cb|0)!=0){A=Cb;break}ZE(d,e,c[k+56>>2]|0,a,n,Db);A=0}}while(0);if((n|0)==0){p=A;i=g;return p|0}eF(m);p=A;i=g;return p|0}function ZE(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;do{if((g|0)>-1){if((d&8|0)!=0){h=0;break}i=c[e+16>>2]|0;j=e+28|0;k=c[j>>2]|0;l=(a|0)!=0;if((k|0)!=0&l){m=e+48|0;n=0;while(1){o=c[i+(n*12|0)>>2]|0;if((o|0)==(c[m>>2]|0)){c[b+(n<<3)>>2]=g;p=g}else{q=c[f+(o<<2)>>2]|0;c[b+(n<<3)>>2]=q;p=q}q=c[i+(n*12|0)+4>>2]|0;if((q|0)==(c[m>>2]|0)){c[b+(n<<3)+4>>2]=g;r=g}else{o=c[f+(q<<2)>>2]|0;c[b+(n<<3)+4>>2]=o;r=o}if((p|0)==-1|(r|0)==-1){c[b+(n<<3)+4>>2]=-1;c[b+(n<<3)>>2]=-1}o=n+1|0;q=c[j>>2]|0;if(o>>>0<q>>>0&o>>>0<a>>>0){n=o}else{s=q;break}}}else{s=k}if((s|0)!=0&l){t=0;u=s}else{h=0;break}while(1){n=b+(t<<3)+4|0;m=c[i+(t*12|0)+8>>2]|0;do{if((m|0)==0){v=u}else{q=c[m>>2]|0;if((q|0)<=-1){v=u;break}o=b+(t<<3)|0;w=0;x=q;q=c[o>>2]|0;while(1){if((q|0)<(c[b+(x<<3)>>2]|0)){y=21}else{if((c[n>>2]|0)>(c[b+(x<<3)+4>>2]|0)){y=21}else{z=q}}if((y|0)==21){y=0;c[n>>2]=-1;c[o>>2]=-1;z=-1}A=w+1|0;B=c[m+(A<<2)>>2]|0;if((B|0)>-1){w=A;x=B;q=z}else{break}}v=c[j>>2]|0}}while(0);m=t+1|0;if(m>>>0<v>>>0&m>>>0<a>>>0){t=m;u=v}else{h=m;break}}}else{h=0}}while(0);if(h>>>0<a>>>0){C=h}else{return}do{c[b+(C<<3)>>2]=-1;c[b+(C<<3)+4>>2]=-1;C=C+1|0;}while(C>>>0<a>>>0);return}function _E(a,b){a=a|0;b=b|0;var c=0,d=0;if((a|0)==0){c=fF(1,24)|0}else{vF(b|0,0,24)|0;c=b}if((c|0)==0){d=0;return d|0}d=c;return d|0}function $E(a){a=a|0;var b=0,d=0,e=0;b=c[a>>2]|0;if((b|0)==0){d=a;eF(d);return}else{e=b}while(1){eF(c[e>>2]|0);b=c[e+4>>2]|0;eF(e);if((b|0)==0){break}else{e=b}}d=a;eF(d);return}function aF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;g=a+16|0;if((c[g>>2]|0)!=0){h=0;return h|0}i=a+12|0;j=c[i>>2]|0;do{if(j>>>0<f>>>0){if((b|0)!=0){if((d|0)!=0){c[a+8>>2]=d;c[i>>2]=1024;k=1024;l=d;break}c[g>>2]=1;h=0;return h|0}m=f<<3;n=m>>>0>1024>>>0?m:1024;m=dF(8)|0;o=m;if((m|0)==0){c[g>>2]=1;h=0;return h|0}p=dF(n)|0;q=m;c[q>>2]=p;if((p|0)==0){eF(m);c[g>>2]=1;h=0;return h|0}c[m+4>>2]=0;m=a+4|0;p=c[m>>2]|0;if((p|0)!=0){c[p+4>>2]=o}p=a|0;if((c[p>>2]|0)==0){c[p>>2]=o}c[m>>2]=o;o=c[q>>2]|0;c[a+8>>2]=o;c[i>>2]=n;k=n;l=o}else{k=j;l=c[a+8>>2]|0}}while(0);j=l+f&3;g=((j|0)==0?0:4-j|0)+f|0;c[a+8>>2]=l+g;c[i>>2]=k-g;if((e|0)==0){h=l;return h|0}vF(l|0,0,g|0)|0;h=l;return h|0}function bF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((b|0)==0){d=a+((cF(a)|0)<<2)|0;return d|0}else{e=a}while(1){f=c[e>>2]|0;if((f|0)==0|(f|0)==(b|0)){break}else{e=e+4|0}}d=(f|0)!=0?e:0;return d|0}function cF(a){a=a|0;var b=0;b=a;while(1){if((c[b>>2]|0)==0){break}else{b=b+4|0}}return b-a>>2|0}function dF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0;do{if(a>>>0<245>>>0){if(a>>>0<11>>>0){b=16}else{b=a+11&-8}d=b>>>3;e=c[53374]|0;f=e>>>(d>>>0);if((f&3|0)!=0){g=(f&1^1)+d|0;h=g<<1;i=213536+(h<<2)|0;j=213536+(h+2<<2)|0;h=c[j>>2]|0;k=h+8|0;l=c[k>>2]|0;do{if((i|0)==(l|0)){c[53374]=e&~(1<<g)}else{if(l>>>0<(c[53378]|0)>>>0){fc();return 0}m=l+12|0;if((c[m>>2]|0)==(h|0)){c[m>>2]=i;c[j>>2]=l;break}else{fc();return 0}}}while(0);l=g<<3;c[h+4>>2]=l|3;j=h+(l|4)|0;c[j>>2]=c[j>>2]|1;n=k;return n|0}if(b>>>0<=(c[53376]|0)>>>0){o=b;break}if((f|0)!=0){j=2<<d;l=f<<d&(j|-j);j=(l&-l)-1|0;l=j>>>12&16;i=j>>>(l>>>0);j=i>>>5&8;m=i>>>(j>>>0);i=m>>>2&4;p=m>>>(i>>>0);m=p>>>1&2;q=p>>>(m>>>0);p=q>>>1&1;r=(j|l|i|m|p)+(q>>>(p>>>0))|0;p=r<<1;q=213536+(p<<2)|0;m=213536+(p+2<<2)|0;p=c[m>>2]|0;i=p+8|0;l=c[i>>2]|0;do{if((q|0)==(l|0)){c[53374]=e&~(1<<r)}else{if(l>>>0<(c[53378]|0)>>>0){fc();return 0}j=l+12|0;if((c[j>>2]|0)==(p|0)){c[j>>2]=q;c[m>>2]=l;break}else{fc();return 0}}}while(0);l=r<<3;m=l-b|0;c[p+4>>2]=b|3;q=p;e=q+b|0;c[q+(b|4)>>2]=m|1;c[q+l>>2]=m;l=c[53376]|0;if((l|0)!=0){q=c[53379]|0;d=l>>>3;l=d<<1;f=213536+(l<<2)|0;k=c[53374]|0;h=1<<d;do{if((k&h|0)==0){c[53374]=k|h;s=f;t=213536+(l+2<<2)|0}else{d=213536+(l+2<<2)|0;g=c[d>>2]|0;if(g>>>0>=(c[53378]|0)>>>0){s=g;t=d;break}fc();return 0}}while(0);c[t>>2]=q;c[s+12>>2]=q;c[q+8>>2]=s;c[q+12>>2]=f}c[53376]=m;c[53379]=e;n=i;return n|0}l=c[53375]|0;if((l|0)==0){o=b;break}h=(l&-l)-1|0;l=h>>>12&16;k=h>>>(l>>>0);h=k>>>5&8;p=k>>>(h>>>0);k=p>>>2&4;r=p>>>(k>>>0);p=r>>>1&2;d=r>>>(p>>>0);r=d>>>1&1;g=c[213800+((h|l|k|p|r)+(d>>>(r>>>0))<<2)>>2]|0;r=g;d=g;p=(c[g+4>>2]&-8)-b|0;while(1){g=c[r+16>>2]|0;if((g|0)==0){k=c[r+20>>2]|0;if((k|0)==0){break}else{u=k}}else{u=g}g=(c[u+4>>2]&-8)-b|0;k=g>>>0<p>>>0;r=u;d=k?u:d;p=k?g:p}r=d;i=c[53378]|0;if(r>>>0<i>>>0){fc();return 0}e=r+b|0;m=e;if(r>>>0>=e>>>0){fc();return 0}e=c[d+24>>2]|0;f=c[d+12>>2]|0;do{if((f|0)==(d|0)){q=d+20|0;g=c[q>>2]|0;if((g|0)==0){k=d+16|0;l=c[k>>2]|0;if((l|0)==0){v=0;break}else{w=l;x=k}}else{w=g;x=q}while(1){q=w+20|0;g=c[q>>2]|0;if((g|0)!=0){w=g;x=q;continue}q=w+16|0;g=c[q>>2]|0;if((g|0)==0){break}else{w=g;x=q}}if(x>>>0<i>>>0){fc();return 0}else{c[x>>2]=0;v=w;break}}else{q=c[d+8>>2]|0;if(q>>>0<i>>>0){fc();return 0}g=q+12|0;if((c[g>>2]|0)!=(d|0)){fc();return 0}k=f+8|0;if((c[k>>2]|0)==(d|0)){c[g>>2]=f;c[k>>2]=q;v=f;break}else{fc();return 0}}}while(0);a:do{if((e|0)!=0){f=d+28|0;i=213800+(c[f>>2]<<2)|0;do{if((d|0)==(c[i>>2]|0)){c[i>>2]=v;if((v|0)!=0){break}c[53375]=c[53375]&~(1<<c[f>>2]);break a}else{if(e>>>0<(c[53378]|0)>>>0){fc();return 0}q=e+16|0;if((c[q>>2]|0)==(d|0)){c[q>>2]=v}else{c[e+20>>2]=v}if((v|0)==0){break a}}}while(0);if(v>>>0<(c[53378]|0)>>>0){fc();return 0}c[v+24>>2]=e;f=c[d+16>>2]|0;do{if((f|0)!=0){if(f>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[v+16>>2]=f;c[f+24>>2]=v;break}}}while(0);f=c[d+20>>2]|0;if((f|0)==0){break}if(f>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[v+20>>2]=f;c[f+24>>2]=v;break}}}while(0);if(p>>>0<16>>>0){e=p+b|0;c[d+4>>2]=e|3;f=r+(e+4)|0;c[f>>2]=c[f>>2]|1}else{c[d+4>>2]=b|3;c[r+(b|4)>>2]=p|1;c[r+(p+b)>>2]=p;f=c[53376]|0;if((f|0)!=0){e=c[53379]|0;i=f>>>3;f=i<<1;q=213536+(f<<2)|0;k=c[53374]|0;g=1<<i;do{if((k&g|0)==0){c[53374]=k|g;y=q;z=213536+(f+2<<2)|0}else{i=213536+(f+2<<2)|0;l=c[i>>2]|0;if(l>>>0>=(c[53378]|0)>>>0){y=l;z=i;break}fc();return 0}}while(0);c[z>>2]=e;c[y+12>>2]=e;c[e+8>>2]=y;c[e+12>>2]=q}c[53376]=p;c[53379]=m}n=d+8|0;return n|0}else{if(a>>>0>4294967231>>>0){o=-1;break}f=a+11|0;g=f&-8;k=c[53375]|0;if((k|0)==0){o=g;break}r=-g|0;i=f>>>8;do{if((i|0)==0){A=0}else{if(g>>>0>16777215>>>0){A=31;break}f=(i+1048320|0)>>>16&8;l=i<<f;h=(l+520192|0)>>>16&4;j=l<<h;l=(j+245760|0)>>>16&2;B=14-(h|f|l)+(j<<l>>>15)|0;A=g>>>((B+7|0)>>>0)&1|B<<1}}while(0);i=c[213800+(A<<2)>>2]|0;b:do{if((i|0)==0){C=0;D=r;E=0}else{if((A|0)==31){F=0}else{F=25-(A>>>1)|0}d=0;m=r;p=i;q=g<<F;e=0;while(1){B=c[p+4>>2]&-8;l=B-g|0;if(l>>>0<m>>>0){if((B|0)==(g|0)){C=p;D=l;E=p;break b}else{G=p;H=l}}else{G=d;H=m}l=c[p+20>>2]|0;B=c[p+16+(q>>>31<<2)>>2]|0;j=(l|0)==0|(l|0)==(B|0)?e:l;if((B|0)==0){C=G;D=H;E=j;break}else{d=G;m=H;p=B;q=q<<1;e=j}}}}while(0);if((E|0)==0&(C|0)==0){i=2<<A;r=k&(i|-i);if((r|0)==0){o=g;break}i=(r&-r)-1|0;r=i>>>12&16;e=i>>>(r>>>0);i=e>>>5&8;q=e>>>(i>>>0);e=q>>>2&4;p=q>>>(e>>>0);q=p>>>1&2;m=p>>>(q>>>0);p=m>>>1&1;I=c[213800+((i|r|e|q|p)+(m>>>(p>>>0))<<2)>>2]|0}else{I=E}if((I|0)==0){J=D;K=C}else{p=I;m=D;q=C;while(1){e=(c[p+4>>2]&-8)-g|0;r=e>>>0<m>>>0;i=r?e:m;e=r?p:q;r=c[p+16>>2]|0;if((r|0)!=0){p=r;m=i;q=e;continue}r=c[p+20>>2]|0;if((r|0)==0){J=i;K=e;break}else{p=r;m=i;q=e}}}if((K|0)==0){o=g;break}if(J>>>0>=((c[53376]|0)-g|0)>>>0){o=g;break}q=K;m=c[53378]|0;if(q>>>0<m>>>0){fc();return 0}p=q+g|0;k=p;if(q>>>0>=p>>>0){fc();return 0}e=c[K+24>>2]|0;i=c[K+12>>2]|0;do{if((i|0)==(K|0)){r=K+20|0;d=c[r>>2]|0;if((d|0)==0){j=K+16|0;B=c[j>>2]|0;if((B|0)==0){L=0;break}else{M=B;N=j}}else{M=d;N=r}while(1){r=M+20|0;d=c[r>>2]|0;if((d|0)!=0){M=d;N=r;continue}r=M+16|0;d=c[r>>2]|0;if((d|0)==0){break}else{M=d;N=r}}if(N>>>0<m>>>0){fc();return 0}else{c[N>>2]=0;L=M;break}}else{r=c[K+8>>2]|0;if(r>>>0<m>>>0){fc();return 0}d=r+12|0;if((c[d>>2]|0)!=(K|0)){fc();return 0}j=i+8|0;if((c[j>>2]|0)==(K|0)){c[d>>2]=i;c[j>>2]=r;L=i;break}else{fc();return 0}}}while(0);c:do{if((e|0)!=0){i=K+28|0;m=213800+(c[i>>2]<<2)|0;do{if((K|0)==(c[m>>2]|0)){c[m>>2]=L;if((L|0)!=0){break}c[53375]=c[53375]&~(1<<c[i>>2]);break c}else{if(e>>>0<(c[53378]|0)>>>0){fc();return 0}r=e+16|0;if((c[r>>2]|0)==(K|0)){c[r>>2]=L}else{c[e+20>>2]=L}if((L|0)==0){break c}}}while(0);if(L>>>0<(c[53378]|0)>>>0){fc();return 0}c[L+24>>2]=e;i=c[K+16>>2]|0;do{if((i|0)!=0){if(i>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[L+16>>2]=i;c[i+24>>2]=L;break}}}while(0);i=c[K+20>>2]|0;if((i|0)==0){break}if(i>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[L+20>>2]=i;c[i+24>>2]=L;break}}}while(0);d:do{if(J>>>0<16>>>0){e=J+g|0;c[K+4>>2]=e|3;i=q+(e+4)|0;c[i>>2]=c[i>>2]|1}else{c[K+4>>2]=g|3;c[q+(g|4)>>2]=J|1;c[q+(J+g)>>2]=J;i=J>>>3;if(J>>>0<256>>>0){e=i<<1;m=213536+(e<<2)|0;r=c[53374]|0;j=1<<i;do{if((r&j|0)==0){c[53374]=r|j;O=m;P=213536+(e+2<<2)|0}else{i=213536+(e+2<<2)|0;d=c[i>>2]|0;if(d>>>0>=(c[53378]|0)>>>0){O=d;P=i;break}fc();return 0}}while(0);c[P>>2]=k;c[O+12>>2]=k;c[q+(g+8)>>2]=O;c[q+(g+12)>>2]=m;break}e=p;j=J>>>8;do{if((j|0)==0){Q=0}else{if(J>>>0>16777215>>>0){Q=31;break}r=(j+1048320|0)>>>16&8;i=j<<r;d=(i+520192|0)>>>16&4;B=i<<d;i=(B+245760|0)>>>16&2;l=14-(d|r|i)+(B<<i>>>15)|0;Q=J>>>((l+7|0)>>>0)&1|l<<1}}while(0);j=213800+(Q<<2)|0;c[q+(g+28)>>2]=Q;c[q+(g+20)>>2]=0;c[q+(g+16)>>2]=0;m=c[53375]|0;l=1<<Q;if((m&l|0)==0){c[53375]=m|l;c[j>>2]=e;c[q+(g+24)>>2]=j;c[q+(g+12)>>2]=e;c[q+(g+8)>>2]=e;break}l=c[j>>2]|0;if((Q|0)==31){R=0}else{R=25-(Q>>>1)|0}e:do{if((c[l+4>>2]&-8|0)==(J|0)){S=l}else{j=l;m=J<<R;while(1){T=j+16+(m>>>31<<2)|0;i=c[T>>2]|0;if((i|0)==0){break}if((c[i+4>>2]&-8|0)==(J|0)){S=i;break e}else{j=i;m=m<<1}}if(T>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[T>>2]=e;c[q+(g+24)>>2]=j;c[q+(g+12)>>2]=e;c[q+(g+8)>>2]=e;break d}}}while(0);l=S+8|0;m=c[l>>2]|0;i=c[53378]|0;if(S>>>0<i>>>0){fc();return 0}if(m>>>0<i>>>0){fc();return 0}else{c[m+12>>2]=e;c[l>>2]=e;c[q+(g+8)>>2]=m;c[q+(g+12)>>2]=S;c[q+(g+24)>>2]=0;break}}}while(0);n=K+8|0;return n|0}}while(0);K=c[53376]|0;if(o>>>0<=K>>>0){S=K-o|0;T=c[53379]|0;if(S>>>0>15>>>0){J=T;c[53379]=J+o;c[53376]=S;c[J+(o+4)>>2]=S|1;c[J+K>>2]=S;c[T+4>>2]=o|3}else{c[53376]=0;c[53379]=0;c[T+4>>2]=K|3;S=T+(K+4)|0;c[S>>2]=c[S>>2]|1}n=T+8|0;return n|0}T=c[53377]|0;if(o>>>0<T>>>0){S=T-o|0;c[53377]=S;T=c[53380]|0;K=T;c[53380]=K+o;c[K+(o+4)>>2]=S|1;c[T+4>>2]=o|3;n=T+8|0;return n|0}do{if((c[44322]|0)==0){T=Hb(30)|0;if((T-1&T|0)==0){c[44324]=T;c[44323]=T;c[44325]=-1;c[44326]=-1;c[44327]=0;c[53485]=0;c[44322]=(zc(0)|0)&-16^1431655768;break}else{fc();return 0}}}while(0);T=o+48|0;S=c[44324]|0;K=o+47|0;J=S+K|0;R=-S|0;S=J&R;if(S>>>0<=o>>>0){n=0;return n|0}Q=c[53484]|0;do{if((Q|0)!=0){O=c[53482]|0;P=O+S|0;if(P>>>0<=O>>>0|P>>>0>Q>>>0){n=0}else{break}return n|0}}while(0);f:do{if((c[53485]&4|0)==0){Q=c[53380]|0;g:do{if((Q|0)==0){U=182}else{P=Q;O=213944;while(1){V=O|0;L=c[V>>2]|0;if(L>>>0<=P>>>0){W=O+4|0;if((L+(c[W>>2]|0)|0)>>>0>P>>>0){break}}L=c[O+8>>2]|0;if((L|0)==0){U=182;break g}else{O=L}}if((O|0)==0){U=182;break}P=J-(c[53377]|0)&R;if(P>>>0>=2147483647>>>0){X=0;break}e=Ub(P|0)|0;L=(e|0)==((c[V>>2]|0)+(c[W>>2]|0)|0);Y=L?e:-1;Z=L?P:0;_=e;$=P;U=191}}while(0);do{if((U|0)==182){Q=Ub(0)|0;if((Q|0)==-1){X=0;break}P=Q;e=c[44323]|0;L=e-1|0;if((L&P|0)==0){aa=S}else{aa=S-P+(L+P&-e)|0}e=c[53482]|0;P=e+aa|0;if(!(aa>>>0>o>>>0&aa>>>0<2147483647>>>0)){X=0;break}L=c[53484]|0;if((L|0)!=0){if(P>>>0<=e>>>0|P>>>0>L>>>0){X=0;break}}L=Ub(aa|0)|0;P=(L|0)==(Q|0);Y=P?Q:-1;Z=P?aa:0;_=L;$=aa;U=191}}while(0);h:do{if((U|0)==191){L=-$|0;if((Y|0)!=-1){ba=Z;ca=Y;U=202;break f}do{if((_|0)!=-1&$>>>0<2147483647>>>0&$>>>0<T>>>0){P=c[44324]|0;Q=K-$+P&-P;if(Q>>>0>=2147483647>>>0){da=$;break}if((Ub(Q|0)|0)==-1){Ub(L|0)|0;X=Z;break h}else{da=Q+$|0;break}}else{da=$}}while(0);if((_|0)==-1){X=Z}else{ba=da;ca=_;U=202;break f}}}while(0);c[53485]=c[53485]|4;ea=X;U=199}else{ea=0;U=199}}while(0);do{if((U|0)==199){if(S>>>0>=2147483647>>>0){break}X=Ub(S|0)|0;_=Ub(0)|0;if(!((_|0)!=-1&(X|0)!=-1&X>>>0<_>>>0)){break}da=_-X|0;_=da>>>0>(o+40|0)>>>0;if(_){ba=_?da:ea;ca=X;U=202}}}while(0);do{if((U|0)==202){ea=(c[53482]|0)+ba|0;c[53482]=ea;if(ea>>>0>(c[53483]|0)>>>0){c[53483]=ea}ea=c[53380]|0;i:do{if((ea|0)==0){S=c[53378]|0;if((S|0)==0|ca>>>0<S>>>0){c[53378]=ca}c[53486]=ca;c[53487]=ba;c[53489]=0;c[53383]=c[44322];c[53382]=-1;S=0;do{X=S<<1;da=213536+(X<<2)|0;c[213536+(X+3<<2)>>2]=da;c[213536+(X+2<<2)>>2]=da;S=S+1|0;}while(S>>>0<32>>>0);S=ca+8|0;if((S&7|0)==0){fa=0}else{fa=-S&7}S=ba-40-fa|0;c[53380]=ca+fa;c[53377]=S;c[ca+(fa+4)>>2]=S|1;c[ca+(ba-36)>>2]=40;c[53381]=c[44326]}else{S=213944;while(1){ga=c[S>>2]|0;ha=S+4|0;ia=c[ha>>2]|0;if((ca|0)==(ga+ia|0)){U=214;break}da=c[S+8>>2]|0;if((da|0)==0){break}else{S=da}}do{if((U|0)==214){if((c[S+12>>2]&8|0)!=0){break}da=ea;if(!(da>>>0>=ga>>>0&da>>>0<ca>>>0)){break}c[ha>>2]=ia+ba;da=c[53380]|0;X=(c[53377]|0)+ba|0;_=da;Z=da+8|0;if((Z&7|0)==0){ja=0}else{ja=-Z&7}Z=X-ja|0;c[53380]=_+ja;c[53377]=Z;c[_+(ja+4)>>2]=Z|1;c[_+(X+4)>>2]=40;c[53381]=c[44326];break i}}while(0);if(ca>>>0<(c[53378]|0)>>>0){c[53378]=ca}S=ca+ba|0;X=213944;while(1){ka=X|0;if((c[ka>>2]|0)==(S|0)){U=224;break}_=c[X+8>>2]|0;if((_|0)==0){break}else{X=_}}do{if((U|0)==224){if((c[X+12>>2]&8|0)!=0){break}c[ka>>2]=ca;S=X+4|0;c[S>>2]=(c[S>>2]|0)+ba;S=ca+8|0;if((S&7|0)==0){la=0}else{la=-S&7}S=ca+(ba+8)|0;if((S&7|0)==0){ma=0}else{ma=-S&7}S=ca+(ma+ba)|0;_=S;Z=la+o|0;da=ca+Z|0;$=da;K=S-(ca+la)-o|0;c[ca+(la+4)>>2]=o|3;j:do{if((_|0)==(c[53380]|0)){T=(c[53377]|0)+K|0;c[53377]=T;c[53380]=$;c[ca+(Z+4)>>2]=T|1}else{if((_|0)==(c[53379]|0)){T=(c[53376]|0)+K|0;c[53376]=T;c[53379]=$;c[ca+(Z+4)>>2]=T|1;c[ca+(T+Z)>>2]=T;break}T=ba+4|0;Y=c[ca+(T+ma)>>2]|0;if((Y&3|0)==1){aa=Y&-8;W=Y>>>3;k:do{if(Y>>>0<256>>>0){V=c[ca+((ma|8)+ba)>>2]|0;R=c[ca+(ba+12+ma)>>2]|0;J=213536+(W<<1<<2)|0;do{if((V|0)!=(J|0)){if(V>>>0<(c[53378]|0)>>>0){fc();return 0}if((c[V+12>>2]|0)==(_|0)){break}fc();return 0}}while(0);if((R|0)==(V|0)){c[53374]=c[53374]&~(1<<W);break}do{if((R|0)==(J|0)){na=R+8|0}else{if(R>>>0<(c[53378]|0)>>>0){fc();return 0}L=R+8|0;if((c[L>>2]|0)==(_|0)){na=L;break}fc();return 0}}while(0);c[V+12>>2]=R;c[na>>2]=V}else{J=S;L=c[ca+((ma|24)+ba)>>2]|0;O=c[ca+(ba+12+ma)>>2]|0;do{if((O|0)==(J|0)){Q=ma|16;P=ca+(T+Q)|0;e=c[P>>2]|0;if((e|0)==0){M=ca+(Q+ba)|0;Q=c[M>>2]|0;if((Q|0)==0){oa=0;break}else{pa=Q;qa=M}}else{pa=e;qa=P}while(1){P=pa+20|0;e=c[P>>2]|0;if((e|0)!=0){pa=e;qa=P;continue}P=pa+16|0;e=c[P>>2]|0;if((e|0)==0){break}else{pa=e;qa=P}}if(qa>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[qa>>2]=0;oa=pa;break}}else{P=c[ca+((ma|8)+ba)>>2]|0;if(P>>>0<(c[53378]|0)>>>0){fc();return 0}e=P+12|0;if((c[e>>2]|0)!=(J|0)){fc();return 0}M=O+8|0;if((c[M>>2]|0)==(J|0)){c[e>>2]=O;c[M>>2]=P;oa=O;break}else{fc();return 0}}}while(0);if((L|0)==0){break}O=ca+(ba+28+ma)|0;V=213800+(c[O>>2]<<2)|0;do{if((J|0)==(c[V>>2]|0)){c[V>>2]=oa;if((oa|0)!=0){break}c[53375]=c[53375]&~(1<<c[O>>2]);break k}else{if(L>>>0<(c[53378]|0)>>>0){fc();return 0}R=L+16|0;if((c[R>>2]|0)==(J|0)){c[R>>2]=oa}else{c[L+20>>2]=oa}if((oa|0)==0){break k}}}while(0);if(oa>>>0<(c[53378]|0)>>>0){fc();return 0}c[oa+24>>2]=L;J=ma|16;O=c[ca+(J+ba)>>2]|0;do{if((O|0)!=0){if(O>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[oa+16>>2]=O;c[O+24>>2]=oa;break}}}while(0);O=c[ca+(T+J)>>2]|0;if((O|0)==0){break}if(O>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[oa+20>>2]=O;c[O+24>>2]=oa;break}}}while(0);ra=ca+((aa|ma)+ba)|0;sa=aa+K|0}else{ra=_;sa=K}T=ra+4|0;c[T>>2]=c[T>>2]&-2;c[ca+(Z+4)>>2]=sa|1;c[ca+(sa+Z)>>2]=sa;T=sa>>>3;if(sa>>>0<256>>>0){W=T<<1;Y=213536+(W<<2)|0;O=c[53374]|0;L=1<<T;do{if((O&L|0)==0){c[53374]=O|L;ta=Y;ua=213536+(W+2<<2)|0}else{T=213536+(W+2<<2)|0;V=c[T>>2]|0;if(V>>>0>=(c[53378]|0)>>>0){ta=V;ua=T;break}fc();return 0}}while(0);c[ua>>2]=$;c[ta+12>>2]=$;c[ca+(Z+8)>>2]=ta;c[ca+(Z+12)>>2]=Y;break}W=da;L=sa>>>8;do{if((L|0)==0){va=0}else{if(sa>>>0>16777215>>>0){va=31;break}O=(L+1048320|0)>>>16&8;aa=L<<O;T=(aa+520192|0)>>>16&4;V=aa<<T;aa=(V+245760|0)>>>16&2;R=14-(T|O|aa)+(V<<aa>>>15)|0;va=sa>>>((R+7|0)>>>0)&1|R<<1}}while(0);L=213800+(va<<2)|0;c[ca+(Z+28)>>2]=va;c[ca+(Z+20)>>2]=0;c[ca+(Z+16)>>2]=0;Y=c[53375]|0;R=1<<va;if((Y&R|0)==0){c[53375]=Y|R;c[L>>2]=W;c[ca+(Z+24)>>2]=L;c[ca+(Z+12)>>2]=W;c[ca+(Z+8)>>2]=W;break}R=c[L>>2]|0;if((va|0)==31){wa=0}else{wa=25-(va>>>1)|0}l:do{if((c[R+4>>2]&-8|0)==(sa|0)){xa=R}else{L=R;Y=sa<<wa;while(1){ya=L+16+(Y>>>31<<2)|0;aa=c[ya>>2]|0;if((aa|0)==0){break}if((c[aa+4>>2]&-8|0)==(sa|0)){xa=aa;break l}else{L=aa;Y=Y<<1}}if(ya>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[ya>>2]=W;c[ca+(Z+24)>>2]=L;c[ca+(Z+12)>>2]=W;c[ca+(Z+8)>>2]=W;break j}}}while(0);R=xa+8|0;Y=c[R>>2]|0;J=c[53378]|0;if(xa>>>0<J>>>0){fc();return 0}if(Y>>>0<J>>>0){fc();return 0}else{c[Y+12>>2]=W;c[R>>2]=W;c[ca+(Z+8)>>2]=Y;c[ca+(Z+12)>>2]=xa;c[ca+(Z+24)>>2]=0;break}}}while(0);n=ca+(la|8)|0;return n|0}}while(0);X=ea;Z=213944;while(1){za=c[Z>>2]|0;if(za>>>0<=X>>>0){Aa=c[Z+4>>2]|0;Ba=za+Aa|0;if(Ba>>>0>X>>>0){break}}Z=c[Z+8>>2]|0}Z=za+(Aa-39)|0;if((Z&7|0)==0){Ca=0}else{Ca=-Z&7}Z=za+(Aa-47+Ca)|0;da=Z>>>0<(ea+16|0)>>>0?X:Z;Z=da+8|0;$=ca+8|0;if(($&7|0)==0){Da=0}else{Da=-$&7}$=ba-40-Da|0;c[53380]=ca+Da;c[53377]=$;c[ca+(Da+4)>>2]=$|1;c[ca+(ba-36)>>2]=40;c[53381]=c[44326];c[da+4>>2]=27;c[Z>>2]=c[53486];c[Z+4>>2]=c[53487];c[Z+8>>2]=c[53488];c[Z+12>>2]=c[53489];c[53486]=ca;c[53487]=ba;c[53489]=0;c[53488]=Z;Z=da+28|0;c[Z>>2]=7;if((da+32|0)>>>0<Ba>>>0){$=Z;while(1){Z=$+4|0;c[Z>>2]=7;if(($+8|0)>>>0<Ba>>>0){$=Z}else{break}}}if((da|0)==(X|0)){break}$=da-ea|0;Z=X+($+4)|0;c[Z>>2]=c[Z>>2]&-2;c[ea+4>>2]=$|1;c[X+$>>2]=$;Z=$>>>3;if($>>>0<256>>>0){K=Z<<1;_=213536+(K<<2)|0;S=c[53374]|0;j=1<<Z;do{if((S&j|0)==0){c[53374]=S|j;Ea=_;Fa=213536+(K+2<<2)|0}else{Z=213536+(K+2<<2)|0;Y=c[Z>>2]|0;if(Y>>>0>=(c[53378]|0)>>>0){Ea=Y;Fa=Z;break}fc();return 0}}while(0);c[Fa>>2]=ea;c[Ea+12>>2]=ea;c[ea+8>>2]=Ea;c[ea+12>>2]=_;break}K=ea;j=$>>>8;do{if((j|0)==0){Ga=0}else{if($>>>0>16777215>>>0){Ga=31;break}S=(j+1048320|0)>>>16&8;X=j<<S;da=(X+520192|0)>>>16&4;Z=X<<da;X=(Z+245760|0)>>>16&2;Y=14-(da|S|X)+(Z<<X>>>15)|0;Ga=$>>>((Y+7|0)>>>0)&1|Y<<1}}while(0);j=213800+(Ga<<2)|0;c[ea+28>>2]=Ga;c[ea+20>>2]=0;c[ea+16>>2]=0;_=c[53375]|0;Y=1<<Ga;if((_&Y|0)==0){c[53375]=_|Y;c[j>>2]=K;c[ea+24>>2]=j;c[ea+12>>2]=ea;c[ea+8>>2]=ea;break}Y=c[j>>2]|0;if((Ga|0)==31){Ha=0}else{Ha=25-(Ga>>>1)|0}m:do{if((c[Y+4>>2]&-8|0)==($|0)){Ia=Y}else{j=Y;_=$<<Ha;while(1){Ja=j+16+(_>>>31<<2)|0;X=c[Ja>>2]|0;if((X|0)==0){break}if((c[X+4>>2]&-8|0)==($|0)){Ia=X;break m}else{j=X;_=_<<1}}if(Ja>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[Ja>>2]=K;c[ea+24>>2]=j;c[ea+12>>2]=ea;c[ea+8>>2]=ea;break i}}}while(0);$=Ia+8|0;Y=c[$>>2]|0;_=c[53378]|0;if(Ia>>>0<_>>>0){fc();return 0}if(Y>>>0<_>>>0){fc();return 0}else{c[Y+12>>2]=K;c[$>>2]=K;c[ea+8>>2]=Y;c[ea+12>>2]=Ia;c[ea+24>>2]=0;break}}}while(0);ea=c[53377]|0;if(ea>>>0<=o>>>0){break}Y=ea-o|0;c[53377]=Y;ea=c[53380]|0;$=ea;c[53380]=$+o;c[$+(o+4)>>2]=Y|1;c[ea+4>>2]=o|3;n=ea+8|0;return n|0}}while(0);c[(Vb()|0)>>2]=12;n=0;return n|0}function eF(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;if((a|0)==0){return}b=a-8|0;d=b;e=c[53378]|0;if(b>>>0<e>>>0){fc()}f=c[a-4>>2]|0;g=f&3;if((g|0)==1){fc()}h=f&-8;i=a+(h-8)|0;j=i;a:do{if((f&1|0)==0){k=c[b>>2]|0;if((g|0)==0){return}l=-8-k|0;m=a+l|0;n=m;o=k+h|0;if(m>>>0<e>>>0){fc()}if((n|0)==(c[53379]|0)){p=a+(h-4)|0;if((c[p>>2]&3|0)!=3){q=n;r=o;break}c[53376]=o;c[p>>2]=c[p>>2]&-2;c[a+(l+4)>>2]=o|1;c[i>>2]=o;return}p=k>>>3;if(k>>>0<256>>>0){k=c[a+(l+8)>>2]|0;s=c[a+(l+12)>>2]|0;t=213536+(p<<1<<2)|0;do{if((k|0)!=(t|0)){if(k>>>0<e>>>0){fc()}if((c[k+12>>2]|0)==(n|0)){break}fc()}}while(0);if((s|0)==(k|0)){c[53374]=c[53374]&~(1<<p);q=n;r=o;break}do{if((s|0)==(t|0)){u=s+8|0}else{if(s>>>0<e>>>0){fc()}v=s+8|0;if((c[v>>2]|0)==(n|0)){u=v;break}fc()}}while(0);c[k+12>>2]=s;c[u>>2]=k;q=n;r=o;break}t=m;p=c[a+(l+24)>>2]|0;v=c[a+(l+12)>>2]|0;do{if((v|0)==(t|0)){w=a+(l+20)|0;x=c[w>>2]|0;if((x|0)==0){y=a+(l+16)|0;z=c[y>>2]|0;if((z|0)==0){A=0;break}else{B=z;C=y}}else{B=x;C=w}while(1){w=B+20|0;x=c[w>>2]|0;if((x|0)!=0){B=x;C=w;continue}w=B+16|0;x=c[w>>2]|0;if((x|0)==0){break}else{B=x;C=w}}if(C>>>0<e>>>0){fc()}else{c[C>>2]=0;A=B;break}}else{w=c[a+(l+8)>>2]|0;if(w>>>0<e>>>0){fc()}x=w+12|0;if((c[x>>2]|0)!=(t|0)){fc()}y=v+8|0;if((c[y>>2]|0)==(t|0)){c[x>>2]=v;c[y>>2]=w;A=v;break}else{fc()}}}while(0);if((p|0)==0){q=n;r=o;break}v=a+(l+28)|0;m=213800+(c[v>>2]<<2)|0;do{if((t|0)==(c[m>>2]|0)){c[m>>2]=A;if((A|0)!=0){break}c[53375]=c[53375]&~(1<<c[v>>2]);q=n;r=o;break a}else{if(p>>>0<(c[53378]|0)>>>0){fc()}k=p+16|0;if((c[k>>2]|0)==(t|0)){c[k>>2]=A}else{c[p+20>>2]=A}if((A|0)==0){q=n;r=o;break a}}}while(0);if(A>>>0<(c[53378]|0)>>>0){fc()}c[A+24>>2]=p;t=c[a+(l+16)>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[A+16>>2]=t;c[t+24>>2]=A;break}}}while(0);t=c[a+(l+20)>>2]|0;if((t|0)==0){q=n;r=o;break}if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[A+20>>2]=t;c[t+24>>2]=A;q=n;r=o;break}}else{q=d;r=h}}while(0);d=q;if(d>>>0>=i>>>0){fc()}A=a+(h-4)|0;e=c[A>>2]|0;if((e&1|0)==0){fc()}do{if((e&2|0)==0){if((j|0)==(c[53380]|0)){B=(c[53377]|0)+r|0;c[53377]=B;c[53380]=q;c[q+4>>2]=B|1;if((q|0)!=(c[53379]|0)){return}c[53379]=0;c[53376]=0;return}if((j|0)==(c[53379]|0)){B=(c[53376]|0)+r|0;c[53376]=B;c[53379]=q;c[q+4>>2]=B|1;c[d+B>>2]=B;return}B=(e&-8)+r|0;C=e>>>3;b:do{if(e>>>0<256>>>0){u=c[a+h>>2]|0;g=c[a+(h|4)>>2]|0;b=213536+(C<<1<<2)|0;do{if((u|0)!=(b|0)){if(u>>>0<(c[53378]|0)>>>0){fc()}if((c[u+12>>2]|0)==(j|0)){break}fc()}}while(0);if((g|0)==(u|0)){c[53374]=c[53374]&~(1<<C);break}do{if((g|0)==(b|0)){D=g+8|0}else{if(g>>>0<(c[53378]|0)>>>0){fc()}f=g+8|0;if((c[f>>2]|0)==(j|0)){D=f;break}fc()}}while(0);c[u+12>>2]=g;c[D>>2]=u}else{b=i;f=c[a+(h+16)>>2]|0;t=c[a+(h|4)>>2]|0;do{if((t|0)==(b|0)){p=a+(h+12)|0;v=c[p>>2]|0;if((v|0)==0){m=a+(h+8)|0;k=c[m>>2]|0;if((k|0)==0){E=0;break}else{F=k;G=m}}else{F=v;G=p}while(1){p=F+20|0;v=c[p>>2]|0;if((v|0)!=0){F=v;G=p;continue}p=F+16|0;v=c[p>>2]|0;if((v|0)==0){break}else{F=v;G=p}}if(G>>>0<(c[53378]|0)>>>0){fc()}else{c[G>>2]=0;E=F;break}}else{p=c[a+h>>2]|0;if(p>>>0<(c[53378]|0)>>>0){fc()}v=p+12|0;if((c[v>>2]|0)!=(b|0)){fc()}m=t+8|0;if((c[m>>2]|0)==(b|0)){c[v>>2]=t;c[m>>2]=p;E=t;break}else{fc()}}}while(0);if((f|0)==0){break}t=a+(h+20)|0;u=213800+(c[t>>2]<<2)|0;do{if((b|0)==(c[u>>2]|0)){c[u>>2]=E;if((E|0)!=0){break}c[53375]=c[53375]&~(1<<c[t>>2]);break b}else{if(f>>>0<(c[53378]|0)>>>0){fc()}g=f+16|0;if((c[g>>2]|0)==(b|0)){c[g>>2]=E}else{c[f+20>>2]=E}if((E|0)==0){break b}}}while(0);if(E>>>0<(c[53378]|0)>>>0){fc()}c[E+24>>2]=f;b=c[a+(h+8)>>2]|0;do{if((b|0)!=0){if(b>>>0<(c[53378]|0)>>>0){fc()}else{c[E+16>>2]=b;c[b+24>>2]=E;break}}}while(0);b=c[a+(h+12)>>2]|0;if((b|0)==0){break}if(b>>>0<(c[53378]|0)>>>0){fc()}else{c[E+20>>2]=b;c[b+24>>2]=E;break}}}while(0);c[q+4>>2]=B|1;c[d+B>>2]=B;if((q|0)!=(c[53379]|0)){H=B;break}c[53376]=B;return}else{c[A>>2]=e&-2;c[q+4>>2]=r|1;c[d+r>>2]=r;H=r}}while(0);r=H>>>3;if(H>>>0<256>>>0){d=r<<1;e=213536+(d<<2)|0;A=c[53374]|0;E=1<<r;do{if((A&E|0)==0){c[53374]=A|E;I=e;J=213536+(d+2<<2)|0}else{r=213536+(d+2<<2)|0;h=c[r>>2]|0;if(h>>>0>=(c[53378]|0)>>>0){I=h;J=r;break}fc()}}while(0);c[J>>2]=q;c[I+12>>2]=q;c[q+8>>2]=I;c[q+12>>2]=e;return}e=q;I=H>>>8;do{if((I|0)==0){K=0}else{if(H>>>0>16777215>>>0){K=31;break}J=(I+1048320|0)>>>16&8;d=I<<J;E=(d+520192|0)>>>16&4;A=d<<E;d=(A+245760|0)>>>16&2;r=14-(E|J|d)+(A<<d>>>15)|0;K=H>>>((r+7|0)>>>0)&1|r<<1}}while(0);I=213800+(K<<2)|0;c[q+28>>2]=K;c[q+20>>2]=0;c[q+16>>2]=0;r=c[53375]|0;d=1<<K;c:do{if((r&d|0)==0){c[53375]=r|d;c[I>>2]=e;c[q+24>>2]=I;c[q+12>>2]=q;c[q+8>>2]=q}else{A=c[I>>2]|0;if((K|0)==31){L=0}else{L=25-(K>>>1)|0}d:do{if((c[A+4>>2]&-8|0)==(H|0)){M=A}else{J=A;E=H<<L;while(1){N=J+16+(E>>>31<<2)|0;h=c[N>>2]|0;if((h|0)==0){break}if((c[h+4>>2]&-8|0)==(H|0)){M=h;break d}else{J=h;E=E<<1}}if(N>>>0<(c[53378]|0)>>>0){fc()}else{c[N>>2]=e;c[q+24>>2]=J;c[q+12>>2]=q;c[q+8>>2]=q;break c}}}while(0);A=M+8|0;B=c[A>>2]|0;E=c[53378]|0;if(M>>>0<E>>>0){fc()}if(B>>>0<E>>>0){fc()}else{c[B+12>>2]=e;c[A>>2]=e;c[q+8>>2]=B;c[q+12>>2]=M;c[q+24>>2]=0;break}}}while(0);q=(c[53382]|0)-1|0;c[53382]=q;if((q|0)==0){O=213952}else{return}while(1){q=c[O>>2]|0;if((q|0)==0){break}else{O=q+8|0}}c[53382]=-1;return}function fF(a,b){a=a|0;b=b|0;var d=0,e=0;do{if((a|0)==0){d=0}else{e=da(b,a)|0;if((b|a)>>>0<=65535>>>0){d=e;break}d=((e>>>0)/(a>>>0)|0|0)==(b|0)?e:-1}}while(0);b=dF(d)|0;if((b|0)==0){return b|0}if((c[b-4>>2]&3|0)==0){return b|0}vF(b|0,0,d|0)|0;return b|0}function gF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;if((a|0)==0){d=dF(b)|0;return d|0}if(b>>>0>4294967231>>>0){c[(Vb()|0)>>2]=12;d=0;return d|0}if(b>>>0<11>>>0){e=16}else{e=b+11&-8}f=hF(a-8|0,e)|0;if((f|0)!=0){d=f+8|0;return d|0}f=dF(b)|0;if((f|0)==0){d=0;return d|0}e=c[a-4>>2]|0;g=(e&-8)-((e&3|0)==0?8:4)|0;tF(f|0,a|0,g>>>0<b>>>0?g:b)|0;eF(a);d=f;return d|0}function hF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=a+4|0;e=c[d>>2]|0;f=e&-8;g=a;h=g+f|0;i=h;j=c[53378]|0;if(g>>>0<j>>>0){fc();return 0}k=e&3;if(!((k|0)!=1&g>>>0<h>>>0)){fc();return 0}l=g+(f|4)|0;m=c[l>>2]|0;if((m&1|0)==0){fc();return 0}if((k|0)==0){if(b>>>0<256>>>0){n=0;return n|0}do{if(f>>>0>=(b+4|0)>>>0){if((f-b|0)>>>0>c[44324]<<1>>>0){break}else{n=a}return n|0}}while(0);n=0;return n|0}if(f>>>0>=b>>>0){k=f-b|0;if(k>>>0<=15>>>0){n=a;return n|0}c[d>>2]=e&1|b|2;c[g+(b+4)>>2]=k|3;c[l>>2]=c[l>>2]|1;iF(g+b|0,k);n=a;return n|0}if((i|0)==(c[53380]|0)){k=(c[53377]|0)+f|0;if(k>>>0<=b>>>0){n=0;return n|0}l=k-b|0;c[d>>2]=e&1|b|2;c[g+(b+4)>>2]=l|1;c[53380]=g+b;c[53377]=l;n=a;return n|0}if((i|0)==(c[53379]|0)){l=(c[53376]|0)+f|0;if(l>>>0<b>>>0){n=0;return n|0}k=l-b|0;if(k>>>0>15>>>0){c[d>>2]=e&1|b|2;c[g+(b+4)>>2]=k|1;c[g+l>>2]=k;o=g+(l+4)|0;c[o>>2]=c[o>>2]&-2;p=g+b|0;q=k}else{c[d>>2]=e&1|l|2;e=g+(l+4)|0;c[e>>2]=c[e>>2]|1;p=0;q=0}c[53376]=q;c[53379]=p;n=a;return n|0}if((m&2|0)!=0){n=0;return n|0}p=(m&-8)+f|0;if(p>>>0<b>>>0){n=0;return n|0}q=p-b|0;e=m>>>3;a:do{if(m>>>0<256>>>0){l=c[g+(f+8)>>2]|0;k=c[g+(f+12)>>2]|0;o=213536+(e<<1<<2)|0;do{if((l|0)!=(o|0)){if(l>>>0<j>>>0){fc();return 0}if((c[l+12>>2]|0)==(i|0)){break}fc();return 0}}while(0);if((k|0)==(l|0)){c[53374]=c[53374]&~(1<<e);break}do{if((k|0)==(o|0)){r=k+8|0}else{if(k>>>0<j>>>0){fc();return 0}s=k+8|0;if((c[s>>2]|0)==(i|0)){r=s;break}fc();return 0}}while(0);c[l+12>>2]=k;c[r>>2]=l}else{o=h;s=c[g+(f+24)>>2]|0;t=c[g+(f+12)>>2]|0;do{if((t|0)==(o|0)){u=g+(f+20)|0;v=c[u>>2]|0;if((v|0)==0){w=g+(f+16)|0;x=c[w>>2]|0;if((x|0)==0){y=0;break}else{z=x;A=w}}else{z=v;A=u}while(1){u=z+20|0;v=c[u>>2]|0;if((v|0)!=0){z=v;A=u;continue}u=z+16|0;v=c[u>>2]|0;if((v|0)==0){break}else{z=v;A=u}}if(A>>>0<j>>>0){fc();return 0}else{c[A>>2]=0;y=z;break}}else{u=c[g+(f+8)>>2]|0;if(u>>>0<j>>>0){fc();return 0}v=u+12|0;if((c[v>>2]|0)!=(o|0)){fc();return 0}w=t+8|0;if((c[w>>2]|0)==(o|0)){c[v>>2]=t;c[w>>2]=u;y=t;break}else{fc();return 0}}}while(0);if((s|0)==0){break}t=g+(f+28)|0;l=213800+(c[t>>2]<<2)|0;do{if((o|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[53375]=c[53375]&~(1<<c[t>>2]);break a}else{if(s>>>0<(c[53378]|0)>>>0){fc();return 0}k=s+16|0;if((c[k>>2]|0)==(o|0)){c[k>>2]=y}else{c[s+20>>2]=y}if((y|0)==0){break a}}}while(0);if(y>>>0<(c[53378]|0)>>>0){fc();return 0}c[y+24>>2]=s;o=c[g+(f+16)>>2]|0;do{if((o|0)!=0){if(o>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[y+16>>2]=o;c[o+24>>2]=y;break}}}while(0);o=c[g+(f+20)>>2]|0;if((o|0)==0){break}if(o>>>0<(c[53378]|0)>>>0){fc();return 0}else{c[y+20>>2]=o;c[o+24>>2]=y;break}}}while(0);if(q>>>0<16>>>0){c[d>>2]=p|c[d>>2]&1|2;y=g+(p|4)|0;c[y>>2]=c[y>>2]|1;n=a;return n|0}else{c[d>>2]=c[d>>2]&1|b|2;c[g+(b+4)>>2]=q|3;d=g+(p|4)|0;c[d>>2]=c[d>>2]|1;iF(g+b|0,q);n=a;return n|0}return 0}
+
+
+
+function ol(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0,C=0,D=0,E=0,F=0,G=0.0,H=0,I=0.0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0,Q=0,R=0;g=i;i=i+80|0;j=g|0;k=e&2130706432;if((e&8|0)==0){l=(k|0)==0?4:k}else{l=8}m=jk((d<<6)+64|0)|0;n=m;o=(d|0)>0;a:do{if(o){p=d-1|0;q=b+8|0;r=0;s=12.0;while(1){t=r+1|0;if((r|0)<(p|0)){u=b+(t<<4)|0;v=b+(t<<4)+8|0}else{u=b;v=q}w=+h[u>>3]- +h[b+(r<<4)>>3];x=+h[v>>3]- +h[b+(r<<4)+8>>3];y=+T(w*w+x*x)/3.0;z=s<y?s:y;if((t|0)<(d|0)){r=t;s=z}else{break}}if(!o){A=0;break}r=d-1|0;q=(l|0)==4;p=(k|0)==16777216;t=b+8|0;if((e&2113929216|0)==67108864){B=0;C=0;while(1){s=+h[b+(C<<4)>>3];y=+h[b+(C<<4)+8>>3];if((C|0)<(r|0)){D=C+1|0;E=b+(D<<4)|0;F=b+(D<<4)+8|0}else{E=b;F=t}x=+h[E>>3]-s;w=+h[F>>3]-y;G=z/+T(x*x+w*w)/3.0;D=B+1|0;H=n+(B<<4)|0;if(q){I=G*.5;h[H>>3]=s+x*I;h[n+(B<<4)+8>>3]=y+w*I}else{h[H>>3]=s;h[n+(B<<4)+8>>3]=y}H=B+2|0;h[n+(D<<4)>>3]=s+x*G;h[n+(D<<4)+8>>3]=y+w*G;D=B+3|0;I=1.0-G;h[n+(H<<4)>>3]=s+x*I;h[n+(H<<4)+8>>3]=y+w*I;if(q){I=1.0-G*.5;h[n+(D<<4)>>3]=s+x*I;h[n+(D<<4)+8>>3]=y+w*I;J=B+4|0}else{J=D}D=C+1|0;if((D|0)<(d|0)){B=J;C=D}else{A=J;break a}}}else{K=0;L=0}while(1){I=+h[b+(L<<4)>>3];w=+h[b+(L<<4)+8>>3];if((L|0)<(r|0)){C=L+1|0;M=b+(C<<4)|0;N=b+(C<<4)+8|0}else{M=b;N=t}y=+h[M>>3]-I;x=+h[N>>3]-w;s=z/+T(y*y+x*x);if(p){O=s*.5}else{O=s}C=K+1|0;B=n+(K<<4)|0;if(q){s=O*.5;h[B>>3]=I+y*s;h[n+(K<<4)+8>>3]=w+x*s}else{h[B>>3]=I;h[n+(K<<4)+8>>3]=w}B=K+2|0;h[n+(C<<4)>>3]=I+y*O;h[n+(C<<4)+8>>3]=w+x*O;C=K+3|0;s=1.0-O;h[n+(B<<4)>>3]=I+y*s;h[n+(B<<4)+8>>3]=w+x*s;if(q){s=1.0-O*.5;h[n+(C<<4)>>3]=I+y*s;h[n+(C<<4)+8>>3]=w+x*s;P=K+4|0}else{P=C}C=L+1|0;if((C|0)<(d|0)){K=P;L=C}else{A=P;break}}}else{A=0}}while(0);P=n+(A<<4)|0;c[P>>2]=c[m>>2];c[P+4>>2]=c[m+4>>2];c[P+8>>2]=c[m+8>>2];c[P+12>>2]=c[m+12>>2];P=m+16|0;L=n+(A+1<<4)|0;c[L>>2]=c[P>>2];c[L+4>>2]=c[P+4>>2];c[L+8>>2]=c[P+8>>2];c[L+12>>2]=c[P+12>>2];L=m+32|0;K=n+(A+2<<4)|0;c[K>>2]=c[L>>2];c[K+4>>2]=c[L+4>>2];c[K+8>>2]=c[L+8>>2];c[K+12>>2]=c[L+12>>2];if((l|0)==4){K=d*96|0;A=kk(K+32|0)|0;N=A;if(o){M=A+K|0;K=d*6|0;J=0;F=0;E=1;e=N;while(1){k=F<<2;v=e;u=n+(k<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];u=N+(E<<4)|0;v=n+((k|1)<<4)|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];u=N+(J+2<<4)|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];v=N+(J+3<<4)|0;u=n+((k|2)<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];v=N+(J+4<<4)|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];u=J+6|0;v=N+(J+5<<4)|0;q=n+((k|3)<<4)|0;c[v>>2]=c[q>>2];c[v+4>>2]=c[q+4>>2];c[v+8>>2]=c[q+8>>2];c[v+12>>2]=c[q+12>>2];q=F+1|0;if((q|0)<(d|0)){J=u;F=q;E=u|1;e=N+(u<<4)|0}else{break}}Q=K|1;R=M}else{Q=1;R=N}M=R;c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];M=A+16|0;R=N+(Q<<4)|0;c[R>>2]=c[M>>2];c[R+4>>2]=c[M+4>>2];c[R+8>>2]=c[M+8>>2];c[R+12>>2]=c[M+12>>2];tB(a,M,Q,0,0,f&255);eF(A);eF(m);i=g;return}else if((l|0)==8){rB(a,b,d,f);if(!o){eF(m);i=g;return}o=j|0;A=j;Q=j+16|0;M=0;do{R=M*3|0;N=n+(R+2<<4)|0;c[A>>2]=c[N>>2];c[A+4>>2]=c[N+4>>2];c[A+8>>2]=c[N+8>>2];c[A+12>>2]=c[N+12>>2];N=n+(R+4<<4)|0;c[Q>>2]=c[N>>2];c[Q+4>>2]=c[N+4>>2];c[Q+8>>2]=c[N+8>>2];c[Q+12>>2]=c[N+12>>2];uB(a,o,2);M=M+1|0;}while((M|0)<(d|0));eF(m);i=g;return}else if((l|0)==16777216){M=d+1|0;o=jk(M<<4)|0;Q=o;if((d|0)>1){A=1;do{N=Q+(A<<4)|0;R=b+(A<<4)|0;c[N>>2]=c[R>>2];c[N+4>>2]=c[R+4>>2];c[N+8>>2]=c[R+8>>2];c[N+12>>2]=c[R+12>>2];A=A+1|0;}while((A|0)<(d|0))}A=d*3|0;R=n+(A+1<<4)|0;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];N=Q+(d<<4)|0;K=n+(A-1<<4)|0;c[N>>2]=c[K>>2];c[N+4>>2]=c[K+4>>2];c[N+8>>2]=c[K+8>>2];c[N+12>>2]=c[K+12>>2];rB(a,Q,M,f);eF(o);o=j;c[o>>2]=c[K>>2];c[o+4>>2]=c[K+4>>2];c[o+8>>2]=c[K+8>>2];c[o+12>>2]=c[K+12>>2];K=j+16|0;o=K;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];R=j+32|0;h[R>>3]=+h[K>>3]+(+h[j>>3]- +h[n+(A<<4)>>3]);h[j+40>>3]=+h[j+24>>3]+(+h[j+8>>3]- +h[n+(A<<4)+8>>3]);uB(a,K,2);K=R;c[o>>2]=c[K>>2];c[o+4>>2]=c[K+4>>2];c[o+8>>2]=c[K+8>>2];c[o+12>>2]=c[K+12>>2];uB(a,j|0,2);eF(m);i=g;return}else if((l|0)==33554432){K=d+2|0;o=jk(K<<4)|0;R=o;A=b;c[o>>2]=c[A>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];A=o+16|0;c[A>>2]=c[L>>2];c[A+4>>2]=c[L+4>>2];c[A+8>>2]=c[L+8>>2];c[A+12>>2]=c[L+12>>2];A=m+48|0;n=A;M=m+64|0;h[o+32>>3]=+h[L>>3]+(+h[n>>3]- +h[M>>3])/3.0;Q=m+56|0;N=m+72|0;h[o+40>>3]=+h[m+40>>3]+(+h[Q>>3]- +h[N>>3])/3.0;O=+h[n>>3];h[o+48>>3]=O+(O- +h[M>>3])/3.0;O=+h[Q>>3];h[o+56>>3]=O+(O- +h[N>>3])/3.0;if((K|0)>4){N=4;do{Q=R+(N<<4)|0;M=b+(N-2<<4)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];N=N+1|0;}while((N|0)<(K|0))}rB(a,R,K,f);eF(o);o=j;c[o>>2]=c[A>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];A=j+16|0;c[A>>2]=c[L>>2];c[A+4>>2]=c[L+4>>2];c[A+8>>2]=c[L+8>>2];c[A+12>>2]=c[L+12>>2];uB(a,j|0,2);eF(m);i=g;return}else if((l|0)==50331648){A=d+3|0;o=jk(A<<4)|0;K=o;R=b;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];R=b|0;O=+h[R>>3];N=P;h[o+16>>3]=O-(O- +h[N>>3])*.25;M=m+56|0;O=+h[b+8>>3]+(+h[M>>3]- +h[m+72>>3])/3.0;h[o+24>>3]=O;z=+h[R>>3];h[o+32>>3]=z-(z- +h[N>>3])*2.0;h[o+40>>3]=O;O=+h[R>>3];h[o+48>>3]=O-(O- +h[N>>3])*2.25;h[o+56>>3]=+h[M>>3];h[o+64>>3]=+h[m+48>>3];h[o+72>>3]=+h[M>>3];if((A|0)>4){M=4;do{N=K+(M<<4)|0;R=b+(M-3<<4)|0;c[N>>2]=c[R>>2];c[N+4>>2]=c[R+4>>2];c[N+8>>2]=c[R+8>>2];c[N+12>>2]=c[R+12>>2];M=M+1|0;}while((M|0)<(A|0))}rB(a,K,A,f);eF(o);eF(m);i=g;return}else if((l|0)==67108864){if((d|0)!=4){cc(155064,126504,688,169992)}o=jk(96)|0;A=b;c[o>>2]=c[A>>2];c[o+4>>2]=c[A+4>>2];c[o+8>>2]=c[A+8>>2];c[o+12>>2]=c[A+12>>2];A=o+16|0;c[A>>2]=c[L>>2];c[A+4>>2]=c[L+4>>2];c[A+8>>2]=c[L+8>>2];c[A+12>>2]=c[L+12>>2];A=o+32|0;K=m+64|0;c[A>>2]=c[K>>2];c[A+4>>2]=c[K+4>>2];c[A+8>>2]=c[K+8>>2];c[A+12>>2]=c[K+12>>2];A=o+48|0;M=b+32|0;c[A>>2]=c[M>>2];c[A+4>>2]=c[M+4>>2];c[A+8>>2]=c[M+8>>2];c[A+12>>2]=c[M+12>>2];M=o+64|0;A=m+128|0;c[M>>2]=c[A>>2];c[M+4>>2]=c[A+4>>2];c[M+8>>2]=c[A+8>>2];c[M+12>>2]=c[A+12>>2];M=o+80|0;R=m+160|0;c[M>>2]=c[R>>2];c[M+4>>2]=c[R+4>>2];c[M+8>>2]=c[R+8>>2];c[M+12>>2]=c[R+12>>2];rB(a,o,6,f);eF(o);o=j|0;h[j>>3]=+h[P>>3]+(+h[m+176>>3]- +h[m>>3]);h[j+8>>3]=+h[m+24>>3]+(+h[m+184>>3]- +h[m+8>>3]);R=j+16|0;c[R>>2]=c[K>>2];c[R+4>>2]=c[K+4>>2];c[R+8>>2]=c[K+8>>2];c[R+12>>2]=c[K+12>>2];uB(a,o,2);c[R>>2]=c[A>>2];c[R+4>>2]=c[A+4>>2];c[R+8>>2]=c[A+8>>2];c[R+12>>2]=c[A+12>>2];uB(a,o,2);c[R>>2]=c[m>>2];c[R+4>>2]=c[m+4>>2];c[R+8>>2]=c[m+8>>2];c[R+12>>2]=c[m+12>>2];uB(a,o,2);eF(m);i=g;return}else if((l|0)==83886080){if((d|0)!=4){cc(155064,126504,711,169992)}o=jk(192)|0;R=b;c[o>>2]=c[R>>2];c[o+4>>2]=c[R+4>>2];c[o+8>>2]=c[R+8>>2];c[o+12>>2]=c[R+12>>2];R=o+16|0;A=b+16|0;c[R>>2]=c[A>>2];c[R+4>>2]=c[A+4>>2];c[R+8>>2]=c[A+8>>2];c[R+12>>2]=c[A+12>>2];A=m+48|0;O=+h[A>>3];R=m+64|0;z=O+(+h[R>>3]-O);K=o+32|0;M=K;h[M>>3]=z;N=m+56|0;O=+h[N>>3];Q=m+72|0;s=O+(+h[Q>>3]-O);n=o+40|0;h[n>>3]=s;O=z+(+h[A>>3]- +h[L>>3]);e=o+48|0;h[e>>3]=O;x=s+(+h[N>>3]- +h[m+40>>3]);E=o+56|0;h[E>>3]=x;w=O+(+h[R>>3]- +h[A>>3]);A=o+64|0;h[A>>3]=w;y=x+(+h[Q>>3]- +h[N>>3]);N=o+72|0;h[N>>3]=y;Q=o+80|0;h[Q>>3]=w+(z-O);h[o+88>>3]=y+(s-x);R=m+96|0;x=+h[R>>3];F=m+80|0;s=x+(+h[F>>3]-x);J=o+144|0;h[J>>3]=s;u=m+104|0;x=+h[u>>3];q=m+88|0;y=x+(+h[q>>3]-x);h[o+152>>3]=y;x=s+(+h[R>>3]- +h[m+112>>3]);v=o+128|0;h[v>>3]=x;O=y+(+h[u>>3]- +h[m+120>>3]);k=o+136|0;h[k>>3]=O;z=x+(+h[F>>3]- +h[R>>3]);R=o+112|0;h[R>>3]=z;w=O+(+h[q>>3]- +h[u>>3]);u=o+120|0;h[u>>3]=w;q=o+96|0;F=q;h[F>>3]=z+(s-x);p=o+104|0;h[p>>3]=w+(y-O);t=o+160|0;r=b+32|0;c[t>>2]=c[r>>2];c[t+4>>2]=c[r+4>>2];c[t+8>>2]=c[r+8>>2];c[t+12>>2]=c[r+12>>2];r=o+176|0;t=b+48|0;c[r>>2]=c[t>>2];c[r+4>>2]=c[t+4>>2];c[r+8>>2]=c[t+8>>2];c[r+12>>2]=c[t+12>>2];rB(a,o,12,f);t=j|0;r=j;c[r>>2]=c[K>>2];c[r+4>>2]=c[K+4>>2];c[r+8>>2]=c[K+8>>2];c[r+12>>2]=c[K+12>>2];O=+h[M>>3];y=O-(+h[e>>3]-O);M=j+16|0;h[M>>3]=y;O=+h[n>>3];w=O-(+h[E>>3]-O);n=j+24|0;h[n>>3]=w;K=j+32|0;h[K>>3]=y+(+h[A>>3]- +h[e>>3]);e=j+40|0;h[e>>3]=w+(+h[N>>3]- +h[E>>3]);E=j+48|0;c[E>>2]=c[Q>>2];c[E+4>>2]=c[Q+4>>2];c[E+8>>2]=c[Q+8>>2];c[E+12>>2]=c[Q+12>>2];uB(a,t,4);c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];w=+h[F>>3];y=w-(+h[R>>3]-w);h[M>>3]=y;w=+h[p>>3];O=w-(+h[u>>3]-w);h[n>>3]=O;h[K>>3]=y+(+h[v>>3]- +h[R>>3]);h[e>>3]=O+(+h[k>>3]- +h[u>>3]);c[E>>2]=c[J>>2];c[E+4>>2]=c[J+4>>2];c[E+8>>2]=c[J+8>>2];c[E+12>>2]=c[J+12>>2];uB(a,t,4);eF(o);eF(m);i=g;return}else if((l|0)==100663296){o=d+5|0;t=jk(o<<4)|0;J=b+16|0;O=+h[J>>3];E=b|0;y=+h[E>>3]-O;w=y*.125+(O+y*.5);u=t;h[u>>3]=w;k=b+40|0;y=+h[k>>3];e=b+24|0;R=m+56|0;v=m+72|0;O=y+(+h[e>>3]-y)*.5+(+h[R>>3]- +h[v>>3])*3.0*.5;h[t+8>>3]=O;y=+h[J>>3];x=+h[E>>3]-y;s=y+x*.5-x*.25;h[t+16>>3]=s;h[t+24>>3]=O;h[t+32>>3]=s;x=+h[k>>3];h[t+40>>3]=x+(+h[e>>3]-x)*.5;K=L;n=m+48|0;x=s+(+h[K>>3]- +h[n>>3])*.5;h[t+48>>3]=x;s=+h[k>>3];h[t+56>>3]=s+(+h[e>>3]-s)*.5;h[t+64>>3]=x;x=+h[k>>3];s=x+(+h[e>>3]-x)*.5+(+h[R>>3]- +h[v>>3]);h[t+72>>3]=s;h[t+80>>3]=w;h[t+88>>3]=s;h[t+96>>3]=w;x=s-(+h[R>>3]- +h[v>>3])*.25;h[t+104>>3]=x;h[t+112>>3]=w+(+h[K>>3]- +h[n>>3]);h[t+120>>3]=x+(+h[R>>3]- +h[v>>3])*.5;h[t+128>>3]=+h[u>>3];h[t+136>>3]=O+(+h[R>>3]- +h[v>>3])*.25;rB(a,t,o,f);h[j>>3]=+h[J>>3];O=+h[k>>3];h[j+8>>3]=O+(+h[e>>3]-O)*.5;h[j+16>>3]=+h[E>>3];h[j+24>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(t);eF(m);i=g;return}else if((l|0)==117440512){t=d+1|0;E=jk(t<<4)|0;e=P;h[E>>3]=+h[e>>3];k=m+56|0;J=m+72|0;h[E+8>>3]=+h[m+24>>3]-(+h[k>>3]- +h[J>>3])*.5;h[E+16>>3]=+h[m+48>>3];O=+h[k>>3];h[E+24>>3]=O-(O- +h[J>>3])*.5;h[E+32>>3]=+h[b+32>>3];o=b+40|0;h[E+40>>3]=+h[o>>3]+(+h[k>>3]- +h[J>>3])*.5;h[E+48>>3]=+h[e>>3];h[E+56>>3]=+h[o>>3]+(+h[k>>3]- +h[J>>3])*.5;O=+h[b+8>>3];h[E+72>>3]=O-(O- +h[b+56>>3])*.5;h[E+64>>3]=+h[b>>3];rB(a,E,t,f);eF(E);eF(m);i=g;return}else if((l|0)==134217728){E=d+4|0;t=jk(E<<4)|0;J=b+16|0;O=+h[J>>3];k=b|0;o=L;e=m+48|0;x=O+(+h[k>>3]-O)*.5+(+h[o>>3]- +h[e>>3])*.25;h[t>>3]=x;v=b+40|0;O=+h[v>>3];R=b+24|0;w=O+(+h[R>>3]-O)*.5;h[t+8>>3]=w;h[t+16>>3]=x;u=m+56|0;n=m+72|0;O=w+(+h[u>>3]- +h[n>>3])*.5;h[t+24>>3]=O;s=x+(+h[o>>3]- +h[e>>3])*.5;h[t+32>>3]=s;h[t+40>>3]=O;h[t+48>>3]=s;s=O+(+h[u>>3]- +h[n>>3])*.5;h[t+56>>3]=s;x=+h[J>>3];y=x+(+h[k>>3]-x)*.5-(+h[o>>3]- +h[e>>3])*3.0*.25;h[t+64>>3]=y;h[t+72>>3]=s;h[t+80>>3]=y;h[t+88>>3]=O;y=+h[J>>3];s=y+(+h[k>>3]-y)*.5-(+h[o>>3]- +h[e>>3])*.25;h[t+96>>3]=s;h[t+104>>3]=O;h[t+112>>3]=s;h[t+120>>3]=w;rB(a,t,E,f);h[j>>3]=+h[J>>3];w=+h[v>>3];h[j+8>>3]=w+(+h[R>>3]-w)*.5;h[j+16>>3]=+h[k>>3];h[j+24>>3]=w+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(t);eF(m);i=g;return}else if((l|0)==150994944){t=d+2|0;k=jk(t<<4)|0;R=b+16|0;w=+h[R>>3];v=b|0;J=L;E=m+48|0;s=w+(+h[v>>3]-w)*.5+(+h[J>>3]- +h[E>>3])*3.0*.25;h[k>>3]=s;e=b+40|0;w=+h[e>>3];o=b+24|0;O=w+(+h[o>>3]-w)*.5;h[k+8>>3]=O;h[k+16>>3]=s;n=m+56|0;u=m+72|0;s=O+(+h[n>>3]- +h[u>>3])*.25;h[k+24>>3]=s;w=+h[R>>3];h[k+32>>3]=w+(+h[v>>3]-w)*.5+(+h[J>>3]- +h[E>>3])*.25;w=s+(+h[n>>3]- +h[u>>3])*.5;h[k+40>>3]=w;y=+h[R>>3];h[k+48>>3]=y+(+h[v>>3]-y)*.5-(+h[J>>3]- +h[E>>3])*.25;h[k+56>>3]=w;w=+h[R>>3];y=w+(+h[v>>3]-w)*.5-(+h[J>>3]- +h[E>>3])*3.0*.25;h[k+64>>3]=y;h[k+72>>3]=s;h[k+80>>3]=y;h[k+88>>3]=O;rB(a,k,t,f);h[j>>3]=+h[R>>3];O=+h[e>>3];h[j+8>>3]=O+(+h[o>>3]-O)*.5;h[j+16>>3]=+h[v>>3];h[j+24>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(k);eF(m);i=g;return}else if((l|0)==167772160){k=d+1|0;v=jk(k<<4)|0;o=b+16|0;O=+h[o>>3];e=b|0;R=L;t=m+48|0;y=O+(+h[e>>3]-O)*.5+(+h[R>>3]- +h[t>>3]);h[v>>3]=y;E=b+40|0;O=+h[E>>3];J=b+24|0;u=m+56|0;n=m+72|0;s=O+(+h[J>>3]-O)*.5+(+h[u>>3]- +h[n>>3])*.25;h[v+8>>3]=s;O=y-(+h[R>>3]- +h[t>>3]);h[v+16>>3]=O;h[v+24>>3]=s+(+h[u>>3]- +h[n>>3]);h[v+32>>3]=O;O=s+(+h[u>>3]- +h[n>>3])*.5;h[v+40>>3]=O;y=+h[o>>3];w=+h[e>>3]-y;x=y+w*.5-w*.25;h[v+48>>3]=x;h[v+56>>3]=O;h[v+64>>3]=x;h[v+72>>3]=s;rB(a,v,k,f);h[j>>3]=+h[o>>3];s=+h[E>>3];h[j+8>>3]=s+(+h[J>>3]-s)*.5;h[j+16>>3]=+h[e>>3];h[j+24>>3]=s+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(v);eF(m);i=g;return}else if((l|0)==184549376){v=d+4|0;e=jk(v<<4)|0;J=b+16|0;s=+h[J>>3];E=b|0;x=+h[E>>3]-s;o=L;k=m+48|0;O=x*.125+(s+x*.5)+(+h[o>>3]- +h[k>>3])*.5;h[e>>3]=O;n=b+40|0;x=+h[n>>3];u=b+24|0;t=m+56|0;R=m+72|0;s=x+(+h[u>>3]-x)*.5+(+h[t>>3]- +h[R>>3])*.25;h[e+8>>3]=s;x=+h[J>>3];w=+h[E>>3]-x;y=x+w*.5-w*.125;h[e+16>>3]=y;h[e+24>>3]=s;h[e+32>>3]=y;w=s+(+h[t>>3]- +h[R>>3])*.5;h[e+40>>3]=w;s=y-(+h[o>>3]- +h[k>>3])*.5;h[e+48>>3]=s;h[e+56>>3]=w;K=e+64|0;h[K>>3]=s;s=+h[n>>3];w=s+(+h[u>>3]-s)*.5-(+h[t>>3]- +h[R>>3])*.25;h[e+72>>3]=w;s=O-(+h[o>>3]- +h[k>>3])*.5;h[e+80>>3]=s;h[e+88>>3]=w;h[e+96>>3]=s;s=w-(+h[t>>3]- +h[R>>3])*.5;h[e+104>>3]=s;R=e+112|0;h[R>>3]=O;h[e+120>>3]=s;rB(a,e,v,f);v=j|0;t=j|0;h[t>>3]=+h[J>>3];s=+h[n>>3];J=j+8|0;h[J>>3]=s+(+h[u>>3]-s)*.5;k=j+16|0;h[k>>3]=+h[K>>3];K=b+8|0;o=b+56|0;p=j+24|0;h[p>>3]=s+(+h[K>>3]- +h[o>>3])*.5;uB(a,v,2);h[t>>3]=+h[R>>3];s=+h[n>>3];h[J>>3]=s+(+h[u>>3]-s)*.5;h[k>>3]=+h[E>>3];h[p>>3]=s+(+h[K>>3]- +h[o>>3])*.5;uB(a,v,2);eF(e);eF(m);i=g;return}else if((l|0)==201326592){e=d<<4;v=jk(e)|0;o=b+16|0;s=+h[o>>3];h[v>>3]=s;K=b+40|0;O=+h[K>>3];p=b+24|0;E=m+56|0;k=m+72|0;w=O+(+h[p>>3]-O)*.5+(+h[E>>3]- +h[k>>3])*.125;h[v+8>>3]=w;u=L;J=m+48|0;O=s+(+h[u>>3]- +h[J>>3])*2.0;h[v+16>>3]=O;h[v+24>>3]=w;h[v+32>>3]=O;O=w+(+h[E>>3]- +h[k>>3])*.5;h[v+40>>3]=O;h[v+48>>3]=s;h[v+56>>3]=O;rB(a,v,d,f);eF(v);v=jk(e)|0;O=+h[o>>3]+(+h[u>>3]- +h[J>>3]);h[v>>3]=O;s=+h[K>>3];w=s+(+h[p>>3]-s)*.5-(+h[E>>3]- +h[k>>3])*5.0*.125;h[v+8>>3]=w;s=O+(+h[u>>3]- +h[J>>3]);J=v+16|0;h[J>>3]=s;h[v+24>>3]=w;h[v+32>>3]=s;s=w+(+h[E>>3]- +h[k>>3])*.5;h[v+40>>3]=s;h[v+48>>3]=O;h[v+56>>3]=s;rB(a,v,d,f);h[j>>3]=+h[J>>3];s=+h[K>>3];h[j+8>>3]=s+(+h[p>>3]-s)*.5;h[j+16>>3]=+h[b>>3];h[j+24>>3]=s+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(v);eF(m);i=g;return}else if((l|0)==218103808){v=d<<4;p=jk(v)|0;K=b|0;s=+h[K>>3];h[p>>3]=s;J=b+40|0;O=+h[J>>3];k=b+24|0;E=m+56|0;u=m+72|0;w=O+(+h[k>>3]-O)*.5+(+h[E>>3]- +h[u>>3])*.125;h[p+8>>3]=w;h[p+16>>3]=s;O=w+(+h[E>>3]- +h[u>>3])*.5;h[p+24>>3]=O;y=s-(+h[E>>3]- +h[u>>3])*2.0;h[p+32>>3]=y;h[p+40>>3]=O;h[p+48>>3]=y;h[p+56>>3]=w;rB(a,p,d,f);eF(p);p=jk(v)|0;w=+h[K>>3]-(+h[L>>3]- +h[m+48>>3]);h[p>>3]=w;y=+h[J>>3];O=y+(+h[k>>3]-y)*.5-(+h[E>>3]- +h[u>>3])*5.0*.125;h[p+8>>3]=O;h[p+16>>3]=w;y=O+(+h[E>>3]- +h[u>>3])*.5;h[p+24>>3]=y;s=w-(+h[E>>3]- +h[u>>3]);h[p+32>>3]=s;h[p+40>>3]=y;u=p+48|0;h[u>>3]=s;h[p+56>>3]=O;rB(a,p,d,f);h[j>>3]=+h[b+16>>3];O=+h[J>>3];h[j+8>>3]=O+(+h[k>>3]-O)*.5;h[j+16>>3]=+h[u>>3];h[j+24>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,j|0,2);eF(p);eF(m);i=g;return}else if((l|0)==234881024){p=d<<4;u=jk(p)|0;k=b+16|0;O=+h[k>>3];J=b|0;E=L;K=m+48|0;s=O+(+h[J>>3]-O)*.5-(+h[E>>3]- +h[K>>3])*9.0*.125;h[u>>3]=s;v=b+40|0;O=+h[v>>3];o=b+24|0;e=m+56|0;n=m+72|0;y=O+(+h[o>>3]-O)*.5+(+h[e>>3]- +h[n>>3])*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);h[u+16>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);eF(u);u=jk(p)|0;O=+h[k>>3];s=O+(+h[J>>3]-O)*.5-(+h[E>>3]- +h[K>>3])*9.0*.125;h[u>>3]=s;O=+h[v>>3];y=O+(+h[o>>3]-O)*.5-(+h[e>>3]- +h[n>>3])*5.0*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);h[u+16>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);eF(u);u=jk(p)|0;O=+h[k>>3];s=O+(+h[J>>3]-O)*.5+(+h[E>>3]- +h[K>>3])*.125;h[u>>3]=s;O=+h[v>>3];y=O+(+h[o>>3]-O)*.5-(+h[e>>3]- +h[n>>3])*5.0*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);h[u+16>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);eF(u);u=jk(p)|0;O=+h[k>>3];s=O+(+h[J>>3]-O)*.5+(+h[E>>3]- +h[K>>3])*.125;h[u>>3]=s;O=+h[v>>3];y=O+(+h[o>>3]-O)*.5+(+h[e>>3]- +h[n>>3])*.125;h[u+8>>3]=y;O=s+(+h[E>>3]- +h[K>>3]);p=u+16|0;h[p>>3]=O;h[u+24>>3]=y;h[u+32>>3]=O;O=y+(+h[e>>3]- +h[n>>3])*.5;h[u+40>>3]=O;h[u+48>>3]=s;h[u+56>>3]=O;rB(a,u,d,f);n=j|0;e=j|0;h[e>>3]=+h[p>>3];O=+h[v>>3];p=j+8|0;h[p>>3]=O+(+h[o>>3]-O)*.5;R=j+16|0;h[R>>3]=+h[J>>3];t=b+8|0;M=b+56|0;F=j+24|0;h[F>>3]=O+(+h[t>>3]- +h[M>>3])*.5;uB(a,n,2);O=+h[k>>3];h[e>>3]=O+(+h[J>>3]-O)*.5-(+h[E>>3]- +h[K>>3])*9.0*.125;s=+h[v>>3];h[p>>3]=s+(+h[o>>3]-s)*.5;h[R>>3]=O;h[F>>3]=s+(+h[t>>3]- +h[M>>3])*.5;uB(a,n,2);eF(u);eF(m);i=g;return}else if((l|0)==251658240){u=d<<4;n=jk(u)|0;M=b+16|0;s=+h[M>>3];t=b|0;F=L;R=m+48|0;O=s+(+h[t>>3]-s)*.5-(+h[F>>3]- +h[R>>3]);h[n>>3]=O;o=b+40|0;s=+h[o>>3];p=b+24|0;v=m+56|0;K=m+72|0;y=s+(+h[p>>3]-s)*.5+(+h[v>>3]- +h[K>>3])*.125;h[n+8>>3]=y;s=O+(+h[F>>3]- +h[R>>3])*2.0;h[n+16>>3]=s;h[n+24>>3]=y;h[n+32>>3]=s;s=y+(+h[v>>3]- +h[K>>3])*.5;h[n+40>>3]=s;h[n+48>>3]=O;h[n+56>>3]=s;rB(a,n,d,f);eF(n);n=jk(u)|0;s=+h[M>>3];O=s+(+h[t>>3]-s)*.5-(+h[F>>3]- +h[R>>3]);u=n;h[u>>3]=O;s=+h[o>>3];y=s+(+h[p>>3]-s)*.5-(+h[v>>3]- +h[K>>3])*5.0*.125;h[n+8>>3]=y;s=O+(+h[F>>3]- +h[R>>3])*2.0;R=n+16|0;h[R>>3]=s;h[n+24>>3]=y;h[n+32>>3]=s;s=y+(+h[v>>3]- +h[K>>3])*.5;h[n+40>>3]=s;h[n+48>>3]=O;h[n+56>>3]=s;rB(a,n,d,f);K=j|0;v=j|0;h[v>>3]=+h[R>>3];s=+h[o>>3];R=j+8|0;h[R>>3]=s+(+h[p>>3]-s)*.5;F=j+16|0;h[F>>3]=+h[t>>3];t=b+8|0;E=b+56|0;J=j+24|0;h[J>>3]=s+(+h[t>>3]- +h[E>>3])*.5;uB(a,K,2);h[v>>3]=+h[M>>3];s=+h[o>>3];h[R>>3]=s+(+h[p>>3]-s)*.5;h[F>>3]=+h[u>>3];h[J>>3]=s+(+h[t>>3]- +h[E>>3])*.5;uB(a,K,2);eF(n);eF(m);i=g;return}else if((l|0)==268435456){n=jk(d<<4)|0;K=b|0;h[n>>3]=+h[K>>3];E=m+56|0;t=m+72|0;h[n+8>>3]=+h[m+24>>3]-(+h[E>>3]- +h[t>>3])*.5;J=m+48|0;h[n+16>>3]=+h[J>>3];s=+h[E>>3];h[n+24>>3]=s-(s- +h[t>>3])*.5;h[n+32>>3]=+h[b+32>>3];u=b+40|0;h[n+40>>3]=+h[u>>3]+(+h[E>>3]- +h[t>>3])*.5;h[n+48>>3]=+h[K>>3];h[n+56>>3]=+h[u>>3]+(+h[E>>3]- +h[t>>3])*.5;rB(a,n,d,f);F=b+16|0;p=L;s=+h[F>>3]+(+h[p>>3]- +h[J>>3])*.25;R=j|0;o=j|0;h[o>>3]=s;O=+h[u>>3];M=b+24|0;y=O+(+h[M>>3]-O)*.5+(+h[E>>3]- +h[t>>3])*.125;v=j+8|0;h[v>>3]=y;e=j+16|0;h[e>>3]=s+(+h[p>>3]- +h[J>>3])*.25;k=j+24|0;h[k>>3]=y-(+h[E>>3]- +h[t>>3])*.25;uB(a,R,2);y=+h[F>>3]+(+h[p>>3]- +h[J>>3])*.25;h[o>>3]=y;s=+h[u>>3];O=s+(+h[M>>3]-s)*.5-(+h[E>>3]- +h[t>>3])*.125;h[v>>3]=O;h[e>>3]=y+(+h[p>>3]- +h[J>>3])*.25;h[k>>3]=O+(+h[E>>3]- +h[t>>3])*.25;uB(a,R,2);h[o>>3]=+h[F>>3]+(+h[p>>3]- +h[J>>3])*.25;O=+h[u>>3]+(+h[E>>3]- +h[t>>3])*3.0*.25;h[v>>3]=O;h[e>>3]=+h[K>>3]-(+h[p>>3]- +h[J>>3])*.25;h[k>>3]=O;uB(a,R,2);eF(n);eF(m);i=g;return}else if((l|0)==285212672){n=jk(d<<4)|0;R=b+16|0;O=+h[R>>3];k=b|0;J=L;p=m+48|0;y=O+(+h[k>>3]-O)*.5+(+h[J>>3]- +h[p>>3])*.5;h[n>>3]=y;K=b+40|0;O=+h[K>>3];e=b+24|0;s=O+(+h[e>>3]-O)*.5+(+h[J>>3]- +h[p>>3])*.5;h[n+8>>3]=s;h[n+16>>3]=y;y=+h[K>>3];O=y+(+h[e>>3]-y)*.5-(+h[J>>3]- +h[p>>3])*.5;h[n+24>>3]=O;y=+h[R>>3];w=y+(+h[k>>3]-y)*.5-(+h[J>>3]- +h[p>>3])*.5;h[n+32>>3]=w;h[n+40>>3]=O;h[n+48>>3]=w;h[n+56>>3]=s;rB(a,n,d,f);eF(n);s=+h[R>>3];w=s+(+h[k>>3]-s)*.5;s=w+(+h[J>>3]- +h[p>>3])*3.0*.25;n=j|0;v=j|0;h[v>>3]=s;O=+h[K>>3];y=O+(+h[e>>3]-O)*.5;O=y+(+h[J>>3]- +h[p>>3])*3.0*.25;t=j+8|0;h[t>>3]=O;E=j+16|0;h[E>>3]=s;s=y-(+h[J>>3]- +h[p>>3])*3.0*.25;u=j+24|0;h[u>>3]=s;y=w-(+h[J>>3]- +h[p>>3])*3.0*.25;h[j+32>>3]=y;h[j+40>>3]=s;h[j+48>>3]=y;h[j+56>>3]=O;F=j+64|0;o=j;c[F>>2]=c[o>>2];c[F+4>>2]=c[o+4>>2];c[F+8>>2]=c[o+8>>2];c[F+12>>2]=c[o+12>>2];uB(a,n,5);O=+h[R>>3];y=+h[k>>3];h[v>>3]=O+(y-O)*.5+(+h[J>>3]- +h[p>>3])*3.0*.25;O=+h[K>>3];h[t>>3]=O+(+h[e>>3]-O)*.5;h[E>>3]=y;o=b+8|0;F=b+56|0;h[u>>3]=O+(+h[o>>3]- +h[F>>3])*.5;uB(a,n,2);O=+h[R>>3];h[v>>3]=O;y=+h[K>>3];h[t>>3]=y+(+h[e>>3]-y)*.5;h[E>>3]=O+(+h[k>>3]-O)*.5-(+h[J>>3]- +h[p>>3])*3.0*.25;h[u>>3]=y+(+h[o>>3]- +h[F>>3])*.5;uB(a,n,2);eF(m);i=g;return}else if((l|0)==301989888){n=d+12|0;F=jk(n<<4)|0;o=b+16|0;y=+h[o>>3];u=b|0;p=L;J=m+48|0;O=y+(+h[u>>3]-y)*.5+(+h[p>>3]- +h[J>>3])*.25;h[F>>3]=O;k=b+40|0;y=+h[k>>3];E=b+24|0;e=m+56|0;t=m+72|0;s=y+(+h[E>>3]-y)*.5+(+h[e>>3]- +h[t>>3])*.5;K=F+8|0;h[K>>3]=s;h[F+16>>3]=O;y=s+(+h[e>>3]- +h[t>>3])*.125;v=F+24|0;h[v>>3]=y;s=O-(+h[p>>3]- +h[J>>3])*.125;R=F+32|0;h[R>>3]=s;w=y+(+h[e>>3]- +h[t>>3])*.125;h[F+40>>3]=w;h[F+48>>3]=O;x=w+(+h[e>>3]- +h[t>>3])*.125;h[F+56>>3]=x;h[F+64>>3]=O;O=x+(+h[e>>3]- +h[t>>3])*.125;h[F+72>>3]=O;h[F+80>>3]=s;h[F+88>>3]=O;s=+h[o>>3];z=s+(+h[u>>3]-s)*.5;h[F+96>>3]=z;h[F+104>>3]=x;s=z-(+h[p>>3]- +h[J>>3])*.125;h[F+112>>3]=s;h[F+120>>3]=O;I=s-(+h[p>>3]- +h[J>>3])*.125;h[F+128>>3]=I;h[F+136>>3]=O;h[F+144>>3]=I;h[F+152>>3]=x;x=I+(+h[p>>3]- +h[J>>3])*.125;h[F+160>>3]=x;h[F+168>>3]=w;h[F+176>>3]=I;h[F+184>>3]=y;h[F+192>>3]=I;I=+h[K>>3];h[F+200>>3]=I;h[F+208>>3]=x;h[F+216>>3]=I;K=F+224|0;h[K>>3]=z;h[F+232>>3]=+h[v>>3];h[F+240>>3]=+h[R>>3];h[F+248>>3]=I;rB(a,F,n,f);I=+h[K>>3];n=j|0;R=j|0;h[R>>3]=I;z=+h[k>>3];x=z+(+h[E>>3]-z)*.5;v=j+8|0;h[v>>3]=x;J=j+16|0;h[J>>3]=I;p=j+24|0;h[p>>3]=x+(+h[e>>3]- +h[t>>3])*.125;uB(a,n,2);x=+h[K>>3];h[R>>3]=x;I=+h[k>>3];z=I+(+h[E>>3]-I)*.5+(+h[e>>3]- +h[t>>3])*.25;h[v>>3]=z;h[J>>3]=x;h[p>>3]=z+(+h[e>>3]- +h[t>>3])*.125;uB(a,n,2);h[R>>3]=+h[o>>3];z=+h[k>>3];h[v>>3]=z+(+h[E>>3]-z)*.5;h[J>>3]=+h[u>>3];h[p>>3]=z+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,n,2);eF(F);eF(m);i=g;return}else if((l|0)==318767104){F=d+4|0;n=jk(F<<4)|0;p=b+16|0;z=+h[p>>3];u=b|0;J=L;E=m+48|0;x=z+(+h[u>>3]-z)*.5+(+h[J>>3]- +h[E>>3])*.125;h[n>>3]=x;v=b+40|0;z=+h[v>>3];k=b+24|0;o=m+56|0;R=m+72|0;I=z+(+h[k>>3]-z)*.5+(+h[o>>3]- +h[R>>3])*.5;h[n+8>>3]=I;z=x+(+h[J>>3]- +h[E>>3])*.125;h[n+16>>3]=z;y=I+(+h[o>>3]- +h[R>>3])*.125;h[n+24>>3]=y;h[n+32>>3]=z;z=y+(+h[o>>3]- +h[R>>3])*.25;h[n+40>>3]=z;h[n+48>>3]=x;w=z+(+h[o>>3]- +h[R>>3])*.125;h[n+56>>3]=w;O=x-(+h[J>>3]- +h[E>>3])*.25;h[n+64>>3]=O;h[n+72>>3]=w;w=O-(+h[J>>3]- +h[E>>3])*.125;h[n+80>>3]=w;h[n+88>>3]=z;h[n+96>>3]=w;h[n+104>>3]=y;h[n+112>>3]=O;h[n+120>>3]=I;rB(a,n,F,f);I=+h[p>>3];O=I+(+h[u>>3]-I)*.5;F=j|0;E=j|0;h[E>>3]=O;I=+h[v>>3];y=I+(+h[k>>3]-I)*.5;J=j+8|0;h[J>>3]=y;t=j+16|0;h[t>>3]=O;e=j+24|0;h[e>>3]=y+(+h[o>>3]- +h[R>>3])*.125;uB(a,F,2);y=+h[p>>3];O=y+(+h[u>>3]-y)*.5;h[E>>3]=O;y=+h[v>>3];I=y+(+h[k>>3]-y)*.5+(+h[o>>3]- +h[R>>3])*.25;h[J>>3]=I;h[t>>3]=O;h[e>>3]=I+(+h[o>>3]- +h[R>>3])*.125;uB(a,F,2);h[E>>3]=+h[p>>3];I=+h[v>>3];h[J>>3]=I+(+h[k>>3]-I)*.5;h[t>>3]=+h[u>>3];h[e>>3]=I+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,F,2);eF(n);eF(m);i=g;return}else if((l|0)==335544320){n=d+12|0;F=jk(n<<4)|0;e=b+16|0;I=+h[e>>3];u=b|0;t=L;k=m+48|0;O=I+(+h[u>>3]-I)*.5+(+h[t>>3]- +h[k>>3])*.25;h[F>>3]=O;J=b+40|0;I=+h[J>>3];v=b+24|0;p=m+56|0;E=m+72|0;y=I+(+h[v>>3]-I)*.5+(+h[p>>3]- +h[E>>3])*.5;R=F+8|0;h[R>>3]=y;h[F+16>>3]=O;I=y+(+h[p>>3]- +h[E>>3])*.125;o=F+24|0;h[o>>3]=I;y=O-(+h[t>>3]- +h[k>>3])*.125;K=F+32|0;h[K>>3]=y;w=I+(+h[p>>3]- +h[E>>3])*.125;h[F+40>>3]=w;h[F+48>>3]=O;z=w+(+h[p>>3]- +h[E>>3])*.125;h[F+56>>3]=z;h[F+64>>3]=O;O=z+(+h[p>>3]- +h[E>>3])*.125;h[F+72>>3]=O;h[F+80>>3]=y;h[F+88>>3]=O;y=+h[e>>3];x=y+(+h[u>>3]-y)*.5;h[F+96>>3]=x;h[F+104>>3]=z;y=x-(+h[t>>3]- +h[k>>3])*.125;h[F+112>>3]=y;h[F+120>>3]=O;s=y-(+h[t>>3]- +h[k>>3])*.125;h[F+128>>3]=s;h[F+136>>3]=O;h[F+144>>3]=s;h[F+152>>3]=z;z=s+(+h[t>>3]- +h[k>>3])*.125;h[F+160>>3]=z;h[F+168>>3]=w;h[F+176>>3]=s;h[F+184>>3]=I;h[F+192>>3]=s;s=+h[R>>3];h[F+200>>3]=s;h[F+208>>3]=z;h[F+216>>3]=s;R=F+224|0;h[R>>3]=x;h[F+232>>3]=+h[o>>3];h[F+240>>3]=+h[K>>3];h[F+248>>3]=s;rB(a,F,n,f);n=j|0;K=j;c[K>>2]=c[R>>2];c[K+4>>2]=c[R+4>>2];c[K+8>>2]=c[R+8>>2];c[K+12>>2]=c[R+12>>2];R=j|0;K=j+16|0;h[K>>3]=+h[R>>3];s=+h[J>>3];o=j+24|0;h[o>>3]=s+(+h[v>>3]-s)*.5;uB(a,n,2);h[R>>3]=+h[e>>3];s=+h[J>>3];h[j+8>>3]=s+(+h[v>>3]-s)*.5;h[K>>3]=+h[u>>3];h[o>>3]=s+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,n,2);eF(F);eF(m);i=g;return}else if((l|0)==352321536){F=d+4|0;n=jk(F<<4)|0;o=b+16|0;s=+h[o>>3];u=b|0;K=L;v=m+48|0;x=s+(+h[u>>3]-s)*.5+(+h[K>>3]- +h[v>>3])*.125;h[n>>3]=x;J=b+40|0;s=+h[J>>3];e=b+24|0;R=m+56|0;k=m+72|0;z=s+(+h[e>>3]-s)*.5+(+h[R>>3]- +h[k>>3])*.5;t=n+8|0;h[t>>3]=z;s=x+(+h[K>>3]- +h[v>>3])*.125;h[n+16>>3]=s;I=z+(+h[R>>3]- +h[k>>3])*.125;h[n+24>>3]=I;h[n+32>>3]=s;s=I+(+h[R>>3]- +h[k>>3])*.25;h[n+40>>3]=s;h[n+48>>3]=x;w=s+(+h[R>>3]- +h[k>>3])*.125;h[n+56>>3]=w;O=x-(+h[K>>3]- +h[v>>3])*.25;h[n+64>>3]=O;h[n+72>>3]=w;w=O-(+h[K>>3]- +h[v>>3])*.125;h[n+80>>3]=w;h[n+88>>3]=s;h[n+96>>3]=w;h[n+104>>3]=I;h[n+112>>3]=O;h[n+120>>3]=z;rB(a,n,F,f);z=+h[o>>3];O=z+(+h[u>>3]-z)*.5;F=j|0;v=j|0;h[v>>3]=O;K=j+8|0;h[K>>3]=+h[t>>3];t=j+16|0;h[t>>3]=O;O=+h[J>>3];k=j+24|0;h[k>>3]=O+(+h[e>>3]-O)*.5;uB(a,F,2);h[v>>3]=+h[o>>3];O=+h[J>>3];h[K>>3]=O+(+h[e>>3]-O)*.5;h[t>>3]=+h[u>>3];h[k>>3]=O+(+h[b+8>>3]- +h[b+56>>3])*.5;uB(a,F,2);eF(n);eF(m);i=g;return}else if((l|0)==369098752){n=d+5|0;F=jk(n<<4)|0;k=P;u=L;t=m+48|0;h[F>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;e=m+56|0;K=m+72|0;h[F+8>>3]=+h[m+24>>3]-(+h[e>>3]- +h[K>>3])*.5;h[F+16>>3]=+h[t>>3];O=+h[e>>3];h[F+24>>3]=O-(O- +h[K>>3])*.5;h[F+32>>3]=+h[b+32>>3];J=b+40|0;h[F+40>>3]=+h[J>>3];O=+h[u>>3];h[F+48>>3]=O+(O- +h[t>>3])*.5;h[F+56>>3]=+h[J>>3];O=+h[u>>3];h[F+64>>3]=O+(O- +h[t>>3])*.5;h[F+72>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[F+80>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;h[F+88>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[F+96>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;K=b+56|0;h[F+104>>3]=+h[K>>3];e=b+8|0;O=+h[e>>3];h[F+120>>3]=O-(O- +h[K>>3])*.5;h[F+112>>3]=+h[b>>3];h[F+136>>3]=+h[e>>3];h[F+128>>3]=+h[k>>3]-(+h[u>>3]- +h[t>>3])*.5;rB(a,F,n,f);eF(F);eF(m);i=g;return}else if((l|0)==385875968){F=d+3|0;n=jk(F<<4)|0;t=P;u=L;k=m+48|0;h[n>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;e=m+56|0;K=m+72|0;h[n+8>>3]=+h[m+24>>3]-(+h[e>>3]- +h[K>>3])*.5;h[n+16>>3]=+h[k>>3];O=+h[e>>3];h[n+24>>3]=O-(O- +h[K>>3])*.5;h[n+32>>3]=+h[b+32>>3];J=b+40|0;h[n+40>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[n+48>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;h[n+56>>3]=+h[J>>3]+(+h[e>>3]- +h[K>>3])*.5;h[n+64>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;K=b+56|0;h[n+72>>3]=+h[K>>3];e=b+8|0;O=+h[e>>3];h[n+88>>3]=O-(O- +h[K>>3])*.5;h[n+80>>3]=+h[b>>3];h[n+104>>3]=+h[e>>3];h[n+96>>3]=+h[t>>3]-(+h[u>>3]- +h[k>>3])*.5;rB(a,n,F,f);eF(n);eF(m);i=g;return}else if((l|0)==402653184){n=d+3|0;F=jk(n<<4)|0;k=b|0;h[F>>3]=+h[k>>3];u=b+8|0;t=m+56|0;e=m+72|0;h[F+8>>3]=+h[u>>3]-(+h[t>>3]- +h[e>>3])*.5;K=L;O=+h[K>>3];J=m+48|0;h[F+16>>3]=O+(O- +h[J>>3])*.5;h[F+24>>3]=+h[u>>3]-(+h[t>>3]- +h[e>>3])*.5;O=+h[K>>3];h[F+32>>3]=O+(O- +h[J>>3])*.5;h[F+40>>3]=+h[m+40>>3];h[F+48>>3]=+h[b+16>>3];O=+h[b+24>>3];u=b+40|0;h[F+56>>3]=O-(O- +h[u>>3])*.5;O=+h[K>>3];h[F+64>>3]=O+(O- +h[J>>3])*.5;h[F+72>>3]=+h[u>>3];h[F+88>>3]=+h[u>>3]+(+h[t>>3]- +h[e>>3])*.5;O=+h[K>>3];h[F+80>>3]=O+(O- +h[J>>3])*.5;h[F+104>>3]=+h[b+56>>3]+(+h[t>>3]- +h[e>>3])*.5;h[F+96>>3]=+h[k>>3];rB(a,F,n,f);eF(F);eF(m);i=g;return}else if((l|0)==419430400){l=d+5|0;d=jk(l<<4)|0;h[d>>3]=+h[b>>3];F=b+8|0;n=m+56|0;k=m+72|0;h[d+8>>3]=+h[F>>3]-(+h[n>>3]- +h[k>>3])*.5;e=L;O=+h[e>>3];L=m+48|0;h[d+16>>3]=O+(O- +h[L>>3])*.5;h[d+24>>3]=+h[F>>3]-(+h[n>>3]- +h[k>>3])*.5;O=+h[e>>3];h[d+32>>3]=O+(O- +h[L>>3])*.5;h[d+40>>3]=+h[m+40>>3];h[d+48>>3]=+h[b+16>>3];O=+h[b+24>>3];F=b+40|0;h[d+56>>3]=O-(O- +h[F>>3])*.5;O=+h[e>>3];h[d+64>>3]=O+(O- +h[L>>3])*.5;h[d+72>>3]=+h[F>>3];h[d+88>>3]=+h[F>>3]+(+h[n>>3]- +h[k>>3])*.5;O=+h[e>>3];h[d+80>>3]=O+(O- +h[L>>3])*.5;F=b+56|0;h[d+104>>3]=+h[F>>3]+(+h[n>>3]- +h[k>>3])*.5;k=P;h[d+96>>3]=+h[k>>3]-(+h[e>>3]- +h[L>>3])*.5;h[d+112>>3]=+h[k>>3]-(+h[e>>3]- +h[L>>3])*.5;h[d+120>>3]=+h[F>>3];h[d+128>>3]=+h[b+48>>3];h[d+136>>3]=+h[F>>3];rB(a,d,l,f);eF(d);eF(m);i=g;return}else{eF(m);i=g;return}}function pl(a){a=a|0;var b=0,d=0;b=c[(c[a+8>>2]|0)+8>>2]|0;do{if((b|0)==0){d=0}else{a=c[c[b+4>>2]>>2]|0;if((a|0)==80){d=1;break}if((a|0)==56){d=2;break}if((a|0)==4){d=3;break}d=(a|0)==76?4:0}}while(0);return d|0}function ql(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0.0,K=0.0,L=0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,U=0.0,X=0.0,Y=0,Z=0,_=0,aa=0,ba=0.0,ca=0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0,na=0,oa=0.0,pa=0,qa=0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0;d=i;i=i+64|0;e=d|0;f=d+16|0;g=d+24|0;j=d+32|0;k=d+40|0;l=d+48|0;m=jk(48)|0;n=b+8|0;o=c[(c[(c[n>>2]|0)+8>>2]|0)+8>>2]|0;p=c[o>>2]|0;q=c[o+4>>2]|0;r=c[o+8>>2]|0;s=+h[o+16>>3];t=+h[o+32>>3];u=+h[o+24>>3];o=b|0;b=(Km(ew(o,168440)|0)|0)&255|p;p=(b|0)!=0;do{if(p){v=+Fm(o,c[53574]|0,0.0,.01);w=+Fm(o,c[53618]|0,0.0,.02);x=(v>w?v:w)*72.0;if(x<0.0){y=x+-.5}else{y=x+.5}z=~~y;x=+(z|0);if((z|0)>0){A=x;B=x;break}z=c[n>>2]|0;x=+h[z+32>>3];w=+h[z+40>>3];v=(x<w?x:w)*72.0;if(v<0.0){C=v+-.5}else{C=v+.5}v=+(~~C|0);A=v;B=v}else{z=c[n>>2]|0;v=+h[z+32>>3]*72.0;if(v<0.0){D=v+-.5}else{D=v+.5}v=+h[z+40>>3]*72.0;if(v<0.0){E=v+-.5}else{E=v+.5}A=+(~~E|0);B=+(~~D|0)}}while(0);z=Em(o,c[53598]|0,q,0)|0;D=s+ +Fm(o,c[53602]|0,0.0,-360.0);if((r|0)==0){s=+Fm(o,c[53584]|0,0.0,-100.0);q=Em(o,c[53586]|0,4,0)|0;F=q;G=s;H=+Fm(o,c[53636]|0,0.0,-100.0)}else{F=r;G=t;H=u}r=c[(c[n>>2]|0)+104>>2]|0;u=+h[r+24>>3];t=+h[r+32>>3];r=~~u;q=(r|0)>-1?r:-r|0;s=+(q|0);if((q|0)>-1){if((~~(s+.5)|0)==0){I=22}else{I=25}}else{if((~~(s+-.5)|0)==0){I=22}else{I=25}}do{if((I|0)==22){q=~~t;r=(q|0)>-1?q:-q|0;s=+(r|0);if((r|0)>-1){if((~~(s+.5)|0)==0){J=t;K=u;break}else{I=25;break}}else{if((~~(s+-.5)|0)==0){J=t;K=u;break}else{I=25;break}}}}while(0);do{if((I|0)==25){r=ew(o,78824)|0;if((r|0)==0){J=t+8.0;K=u+16.0;break}q=ac(r|0,168832,(L=i,i=i+16|0,c[L>>2]=f,c[L+8>>2]=g,L)|0)|0;i=L;s=+h[f>>3];if(s<0.0){h[f>>3]=0.0;M=0.0}else{M=s}s=+h[g>>3];if(s<0.0){h[g>>3]=0.0;N=0.0}else{N=s}if((q|0)<=0){J=t+8.0;K=u+16.0;break}s=M*72.0;r=s<0.0;if(r){O=s+-.5}else{O=s+.5}E=u+ +(~~O<<1|0);if((q|0)>1){C=N*72.0;if(C<0.0){P=C+-.5}else{P=C+.5}J=t+ +(~~P<<1|0);K=E;break}else{if(r){Q=s+-.5}else{Q=s+.5}J=t+ +(~~Q<<1|0);K=E;break}}}while(0);Q=K- +h[(c[(c[n>>2]|0)+104>>2]|0)+24>>3];t=+h[c[(c[(Hx(o)|0)+8>>2]|0)+8>>2]>>3];if(t>0.0){P=t*72.0;if(P<0.0){R=P+-.5}else{R=P+.5}P=+(~~R|0);g=~~(K/P);f=~~(J/P);U=P*+((P*+(f|0)+1.0e-5<J)+f|0);X=P*+((P*+(g|0)+1.0e-5<K)+g|0)}else{U=J;X=K}g=c[(c[n>>2]|0)+8>>2]|0;do{if((a[g+12|0]|0)==0){f=ew(o,87160)|0;if((f|0)==0){Y=0;Z=0;break}if((a[f]|0)==0){Y=0;Z=0;break}FB(k,Hx(o)|0,f);r=c[k>>2]|0;q=c[k+4>>2]|0;if((r|0)==-1&(q|0)==-1){_=$w(o)|0;Fv(0,166888,(L=i,i=i+16|0,c[L>>2]=f,c[L+8>>2]=_,L)|0)|0;i=L;Y=0;Z=0;break}else{a[(c[(Hx(o)|0)+8>>2]|0)+114|0]=1;Y=q+2|0;Z=r+2|0;break}}else{r=c[g>>2]|0;if((a[r]|0)!=99){Y=0;Z=0;break}if((Ya(r|0,102208)|0)!=0){Y=0;Z=0;break}r=ew(o,114736)|0;FB(j,Hx(o)|0,r);q=c[j>>2]|0;_=c[j+4>>2]|0;if((q|0)==-1&(_|0)==-1){f=$w(o)|0;Fv(0,168056,(L=i,i=i+16|0,c[L>>2]=(r|0)!=0?r:167344,c[L+8>>2]=f,L)|0)|0;i=L;Y=0;Z=0;break}else{a[(c[(Hx(o)|0)+8>>2]|0)+114|0]=1;Y=_+2|0;Z=q+2|0;break}}}while(0);K=+(Z|0);Z=e|0;h[Z>>3]=X>K?X:K;K=+(Y|0);Y=e+8|0;h[Y>>3]=U>K?U:K;if((F|0)<3){aa=H!=0.0|G!=0.0?120:F}else{aa=F}F=ew(o,166472)|0;do{if((F|0)==0){I=66}else{j=a[F]|0;if(!((j<<24>>24|0)==116|(j<<24>>24|0)==98)){I=66;break}a[(c[(c[n>>2]|0)+104>>2]|0)+80|0]=j}}while(0);if((I|0)==66){a[(c[(c[n>>2]|0)+104>>2]|0)+80|0]=99}if((aa|0)==4){if(D<0.0){ba=D+-.5}else{ba=D+.5}if(((~~ba|0)%90|0|0)==0&H==0.0&G==0.0){ca=1}else{I=72}}else{I=72}do{if((I|0)==72){F=c[n>>2]|0;j=c[(c[(c[F+8>>2]|0)+8>>2]|0)+44>>2]|0;if((j|0)!=0){Dc[c[j>>2]&63](l,e);j=e;g=l;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];ca=0;break}ba=+h[Y>>3];J=ba*1.4142135623730951;do{if(A>J){if((a[(c[F+104>>2]|0)+80|0]|0)!=99){I=77;break}P=ba/A;R=+T(1.0/(1.0-P*P));P=R*+h[Z>>3];h[Z>>3]=P;ea=P;fa=ba}else{I=77}}while(0);if((I|0)==77){ba=+h[Z>>3]*1.4142135623730951;h[Z>>3]=ba;h[Y>>3]=J;ea=ba;fa=J}if((aa|0)<=2){ca=0;break}ba=+V(3.141592653589793/+(aa|0));h[Z>>3]=ea/ba;h[Y>>3]=fa/ba;ca=0}}while(0);fa=+h[Y>>3];if((Km(Hm(o,c[53630]|0,86632)|0)|0)<<24>>24==0){ea=+h[Z>>3];ba=B>ea?B:ea;h[Z>>3]=ba;ea=+h[Y>>3];ga=ba;ha=A>ea?A:ea}else{l=c[(c[n>>2]|0)+104>>2]|0;if(B<+h[l+24>>3]){I=83}else{if(A<+h[l+32>>3]){I=83}}if((I|0)==83){I=$w(o)|0;l=$w(Hx(o)|0)|0;Fv(0,166096,(L=i,i=i+16|0,c[L>>2]=I,c[L+8>>2]=l,L)|0)|0;i=L}h[Z>>3]=B;ga=B;ha=A}h[Y>>3]=ha;if(p){A=ga>ha?ga:ha;h[Y>>3]=A;h[Z>>3]=A;ia=A;ja=A}else{ia=ha;ja=ga}do{if((Km(Hm(o,c[53606]|0,86632)|0)|0)<<24>>24==0){if(ca){ga=+h[Z>>3];h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=(X>ga?X:ga)-Q;break}ga=+h[Y>>3];if(U<ga){ha=+h[Z>>3]*+T(1.0-U*U/(ga*ga));h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=(X>ha?X:ha)-Q;break}else{h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=X-Q;break}}else{h[(c[(c[n>>2]|0)+104>>2]|0)+40>>3]=X-Q}}while(0);Q=+h[Y>>3]-fa;if(U<K){ka=K-U+Q}else{ka=Q}h[(c[(c[n>>2]|0)+104>>2]|0)+48>>3]=U+ka;o=(z|0)<1?1:z;do{if((aa|0)<3){p=jk(o<<5)|0;L=p;ka=+h[Z>>3]*.5;U=+h[Y>>3]*.5;h[p>>3]=-0.0-ka;h[p+8>>3]=-0.0-U;h[p+16>>3]=ka;h[p+24>>3]=U;if((z|0)>1){la=ka;ma=2;na=1;oa=U}else{pa=2;qa=L;break}while(1){ra=la+4.0;sa=oa+4.0;h[L+(ma<<4)>>3]=-0.0-ra;h[L+(ma<<4)+8>>3]=-0.0-sa;p=ma|1;h[L+(p<<4)>>3]=ra;h[L+(p<<4)+8>>3]=sa;p=na+1|0;if((p|0)<(z|0)){la=ra;ma=ma+2|0;na=p;oa=sa}else{break}}h[Z>>3]=ra*2.0;h[Y>>3]=sa*2.0;pa=2;qa=L}else{p=jk(da(o<<4,aa)|0)|0;l=p;I=c[(c[(c[(c[n>>2]|0)+8>>2]|0)+8>>2]|0)+44>>2]|0;do{if((I|0)==0){J=6.283185307179586/+(aa|0);U=J*.5;ka=+W(U);Q=+cb(+(+S(+H)+ +S(+G)),+1.0);K=H*1.4142135623730951/+V(U);U=G*.5;fa=(J+ -3.141592653589793)*.5;X=+V(fa)*.5;ha=+W(fa)*.5;ga=fa+(3.141592653589793-J)*.5;if((aa|0)<=0){ta=0.0;ua=0.0;break}fa=D/180.0*3.141592653589793;if(ca){A=J+ga;B=ha+ka*+W(A);ea=U*B+(X+ka*+V(A))*(Q+K*B);A=fa+ +$(+B,+ea);ba=+W(A);P=+V(A);A=+cb(+ea,+B);B=P*A*+h[Z>>3];P=ba*A*+h[Y>>3];h[p>>3]=B;h[p+8>>3]=P;A=+S(+P);ba=+S(+B);ea=-0.0-B;h[p+16>>3]=ea;h[p+24>>3]=P;h[p+32>>3]=ea;ea=-0.0-P;h[p+40>>3]=ea;h[p+48>>3]=B;h[p+56>>3]=ea;ta=P!=0.0?A:0.0;ua=B!=0.0?ba:0.0;break}else{ba=X;X=ha;ha=ga;ga=0.0;B=0.0;F=0;while(1){A=J+ha;P=ba+ka*+V(A);ea=X+ka*+W(A);R=U*ea+P*(Q+K*ea);t=fa+ +$(+ea,+R);N=+W(t);O=+V(t);t=+cb(+R,+ea);R=O*t*+h[Z>>3];O=N*t*+h[Y>>3];t=+S(+R);N=t>ga?t:ga;t=+S(+O);u=t>B?t:B;h[l+(F<<4)>>3]=R;h[l+(F<<4)+8>>3]=O;g=F+1|0;if((g|0)<(aa|0)){ba=P;X=ea;ha=A;ga=N;B=u;F=g}else{ta=u;ua=N;break}}}}else{Dc[c[I+4>>2]&63](l,e);ta=+h[Y>>3]*.5;ua=+h[Z>>3]*.5}}while(0);B=ua*2.0;ga=ta*2.0;ha=ja>B?ja:B;h[Z>>3]=ha;X=ia>ga?ia:ga;h[Y>>3]=X;ba=ha/B;B=X/ga;I=(aa|0)>0;if(I){L=0;do{F=l+(L<<4)|0;g=l+(L<<4)+8|0;ga=B*+h[g>>3];h[F>>3]=ba*+h[F>>3];h[g>>3]=ga;L=L+1|0;}while((L|0)<(aa|0))}if((z|0)<=1){pa=aa;qa=l;break}L=aa-1|0;ba=+h[p>>3];B=+h[p+8>>3];ga=+$(+(B- +h[l+(L<<4)+8>>3]),+(ba- +h[l+(L<<4)>>3]));if(I){va=ga;wa=ba;xa=B;ya=0}else{pa=aa;qa=l;break}while(1){L=ya+1|0;g=(L|0)==(aa|0)?0:L;B=+h[l+(g<<4)>>3];ba=+h[l+(g<<4)+8>>3];ga=+$(+(ba-xa),+(B-wa));X=(va+3.141592653589793-ga)*.5;ha=4.0/+W(X);fa=va-X;X=ha*+W(fa);K=ha*+V(fa);fa=wa;ha=xa;g=1;do{fa=K+fa;ha=X+ha;F=(da(g,aa)|0)+ya|0;h[l+(F<<4)>>3]=fa;h[l+(F<<4)+8>>3]=ha;g=g+1|0;}while((g|0)<(z|0));if((L|0)<(aa|0)){va=ga;wa=B;xa=ba;ya=L}else{break}}if(!I){pa=aa;qa=l;break}p=da(aa,z-1|0)|0;g=0;ha=+h[Z>>3];fa=+h[Y>>3];while(1){F=g+p|0;X=+h[l+(F<<4)+8>>3];K=+S(+(+h[l+(F<<4)>>3]))*2.0;Q=K>ha?K:ha;h[Z>>3]=Q;K=+S(+X)*2.0;X=K>fa?K:fa;h[Y>>3]=X;F=g+1|0;if((F|0)<(aa|0)){g=F;ha=Q;fa=X}else{pa=aa;qa=l;break}}}}while(0);c[m>>2]=b;c[m+4>>2]=z;c[m+8>>2]=pa;h[m+16>>3]=D;h[m+32>>3]=G;h[m+24>>3]=H;c[m+44>>2]=qa;h[(c[n>>2]|0)+32>>3]=+h[Z>>3]/72.0;h[(c[n>>2]|0)+40>>3]=+h[Y>>3]/72.0;c[(c[n>>2]|0)+12>>2]=m;i=d;return}function rl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0;b=i;i=i+16|0;d=a|0;e=(c[(c[(Hx(d)|0)+8>>2]|0)+116>>2]|0)>>>2&1^1;f=a+8|0;g=c[c[(c[f>>2]|0)+104>>2]>>2]|0;c[43784]=g;j=xF(g|0)|0;g=jk((j|0)>1?j+1|0:2)|0;j=Wl(a,e,1,g)|0;if((j|0)==0){Fv(1,79400,(k=i,i=i+8|0,c[k>>2]=c[c[(c[f>>2]|0)+104>>2]>>2],k)|0)|0;i=k;c[43784]=79104;l=Wl(a,e,1,g)|0}else{l=j}eF(g);Xl(b|0,a,l);a=c[f>>2]|0;m=+h[a+32>>3]*72.0;if(m<0.0){n=m+-.5}else{n=m+.5}m=+(~~n|0);n=+h[a+40>>3]*72.0;if(n<0.0){o=n+-.5}else{o=n+.5}n=+(~~o|0);a=l|0;if((Km(Hm(d,c[53630]|0,86632)|0)|0)<<24>>24==0){o=+h[a>>3];g=l+8|0;p=+h[g>>3];q=o>m?o:m;r=p>n?p:n;s=g}else{q=m;r=n;s=l+8|0}Yl(l,q,r,(Km(Hm(d,c[53606]|0,86632)|0)|0)&255);Zl(l,q*-.5,r*.5,15);h[(c[f>>2]|0)+32>>3]=+h[a>>3]/72.0;h[(c[f>>2]|0)+40>>3]=(+h[s>>3]+1.0)/72.0;c[(c[f>>2]|0)+12>>2]=l;i=b;return}function sl(a){a=a|0;var b=0,d=0,e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0,m=0.0,n=0,o=0.0;b=jk(48)|0;d=a+8|0;e=c[(c[(c[(c[d>>2]|0)+8>>2]|0)+8>>2]|0)+4>>2]|0;f=a|0;g=+Fm(f,c[53574]|0,1.7976931348623157e+308,0.0);i=+Fm(f,c[53618]|0,1.7976931348623157e+308,0.0);j=g<i?g:i;if(j==1.7976931348623157e+308&i==1.7976931348623157e+308){h[(c[d>>2]|0)+40>>3]=.05;h[(c[d>>2]|0)+32>>3]=.05}else{if(j>0.0){k=j>3.0e-4?j:3.0e-4}else{k=j}h[(c[d>>2]|0)+40>>3]=k;h[(c[d>>2]|0)+32>>3]=k}k=+h[(c[d>>2]|0)+32>>3]*72.0;a=Em(f,c[53598]|0,e,0)|0;e=jk((a|0)<1?32:a<<5)|0;f=e;j=k*.5;i=-0.0-j;h[e>>3]=i;h[e+8>>3]=i;h[e+16>>3]=j;h[e+24>>3]=j;if((a|0)>1){i=j;g=j;e=2;l=1;while(1){m=g+4.0;j=i+4.0;h[f+(e<<4)>>3]=-0.0-m;h[f+(e<<4)+8>>3]=-0.0-j;n=e|1;h[f+(n<<4)>>3]=m;h[f+(n<<4)+8>>3]=j;n=l+1|0;if((n|0)<(a|0)){i=j;g=m;e=e+2|0;l=n}else{break}}o=m*2.0}else{o=k}c[b>>2]=1;c[b+4>>2]=a;c[b+8>>2]=2;vF(b+16|0,0,24)|0;c[b+44>>2]=f;k=o/72.0;h[(c[d>>2]|0)+32>>3]=k;h[(c[d>>2]|0)+40>>3]=k;c[(c[d>>2]|0)+12>>2]=b;return}function tl(a){a=a|0;var b=0,d=0;b=c[(c[a+8>>2]|0)+8>>2]|0;if((b|0)==0){d=0;return d|0}d=(c[c[b+4>>2]>>2]|0)==80|0;return d|0}function ul(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=c[53500]|0;if((d|0)==0){e=0;return e|0}f=c[53650]|0;if((f|0)<=0){e=0;return e|0}g=a[b]|0;h=0;while(1){i=c[d+(h<<2)>>2]|0;j=c[i>>2]|0;if((a[j]|0)==g<<24>>24){if((Ya(j|0,b|0)|0)==0){e=i;k=7;break}}i=h+1|0;if((i|0)<(f|0)){h=i}else{e=0;k=7;break}}if((k|0)==7){return e|0}return 0}function vl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;do{if((Sm(ew(d|0,114736)|0)|0)==0){f=b}else{if((a[b]|0)==101){if((Ya(b|0,107896)|0)==0){f=b;break}}f=102208}}while(0);b=a[f]|0;if(b<<24>>24==99){if((Ya(f|0,102208)|0)==0){g=99}else{h=7}}else{h=7}a:do{if((h|0)==7){d=c[42902]|0;if((d|0)==0){g=b;break}else{j=171608;k=d}while(1){if((a[k]|0)==b<<24>>24){if((Ya(k|0,f|0)|0)==0){l=j;break}}d=j+16|0;m=c[d>>2]|0;if((m|0)==0){g=b;break a}else{j=d;k=m}}i=e;return l|0}}while(0);k=c[53500]|0;j=c[53650]|0;if((k|0)==0){b=j+1|0;c[53650]=b;n=kk(b<<2)|0}else{b:do{if((j|0)>0){b=0;while(1){o=c[k+(b<<2)>>2]|0;h=c[o>>2]|0;if((a[h]|0)==g<<24>>24){if((Ya(h|0,f|0)|0)==0){break}}b=b+1|0;if((b|0)>=(j|0)){break b}}if((o|0)==0){break}else{l=o}i=e;return l|0}}while(0);o=j+1|0;c[53650]=o;n=mk(k,o<<2)|0}c[53500]=n;n=jk(16)|0;o=n;c[(c[53500]|0)+(j<<2)>>2]=o;c[n>>2]=c[42902];c[n+4>>2]=c[42903];c[n+8>>2]=c[42904];c[n+12>>2]=c[42905];j=Lb(f|0)|0;c[n>>2]=j;do{if((c[53666]|0)==0){if((a[f]|0)==99){if((Ya(f|0,102208)|0)==0){break}}Fv(0,167480,(k=i,i=i+16|0,c[k>>2]=c[42902],c[k+8>>2]=j,k)|0)|0;i=k;a[n+12|0]=0;l=o;i=e;return l|0}}while(0);a[n+12|0]=1;l=o;i=e;return l|0}function wl(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;j=i;i=i+40|0;k=j|0;l=e|0;m=c[(c[(c[(Hx(l)|0)+48>>2]|0)+8>>2]|0)+116>>2]&3;n=e+8|0;o=c[n>>2]|0;p=+h[o+16>>3];q=+h[o+24>>3];if((m|0)==3){r=p;s=q;t=5}else if((m|0)==0){r=q;s=p;t=5}else if((m|0)==1){r=p;s=-0.0-q;t=5}else if((m|0)==2){r=-0.0-q;s=p;t=5}else{u=0.0;v=0.0;t=6}do{if((t|0)==5){if(s>=0.0){u=s;v=r;t=6;break}w=s+-.5;x=r}}while(0);if((t|0)==6){w=u+.5;x=v}o=~~w;if(x<0.0){y=x+-.5}else{y=x+.5}z=~~y;A=c[f+8>>2]|0;y=+h[A+16>>3];x=+h[A+24>>3];if((m|0)==2){B=-0.0-x;C=y;t=15}else if((m|0)==1){B=y;C=-0.0-x;t=15}else if((m|0)==3){B=y;C=x;t=15}else if((m|0)==0){B=x;C=y;t=15}else{D=0.0;E=0.0;t=16}do{if((t|0)==15){if(C>=0.0){D=C;E=B;t=16;break}F=C+-.5;G=B}}while(0);if((t|0)==16){F=D+.5;G=E}t=~~F;if(G<0.0){H=G+-.5}else{H=G+.5}m=~~H;A=g+33|0;f=a[A]|0;I=f&255;do{if((f<<24>>24|0)==15|(f<<24>>24|0)==0){J=0}else{K=c[g+24>>2]|0;if((K|0)==0){L=(c[(c[(Hx(l)|0)+8>>2]|0)+116>>2]&1|0)==0;M=c[n>>2]|0;H=+h[M+80>>3]*.5;G=-0.0-H;F=+h[M+88>>3];E=-0.0-F;N=L?H:F;O=L?F:H;P=L?E:G;Q=L?G:E}else{N=+h[K+24>>3];O=+h[K+16>>3];P=+h[K>>3];Q=+h[K+8>>3]}K=~~((P+O)*.5);L=~~((Q+N)*.5);if((I&1|0)==0){R=0;S=0}else{M=o-t+K|0;T=z-m+~~Q|0;R=(da(M,M)|0)+(da(T,T)|0)|0;S=96440}if((I&2|0)==0){U=R;V=S}else{T=o-t+~~O|0;M=z-m+L|0;W=(da(M,M)|0)+(da(T,T)|0)|0;T=(S|0)==0|(W|0)<(R|0);U=T?W:R;V=T?91152:S}if((I&4|0)==0){X=U;Y=V}else{T=o-t+K|0;K=z-m+~~N|0;W=(da(T,T)|0)+(da(K,K)|0)|0;K=(V|0)==0|(W|0)<(U|0);X=K?W:U;Y=K?85880:V}if((I&8|0)==0){J=Y;break}K=o-t+~~P|0;W=z-m+L|0;L=(Y|0)==0|((da(W,W)|0)+(da(K,K)|0)|0)<(X|0);J=L?81272:Y}}while(0);c[k+36>>2]=c[g+36>>2];xl(e,c[g+24>>2]|0,k,J,d[A]|0,0)|0;A=b;b=k;c[A>>2]=c[b>>2];c[A+4>>2]=c[b+4>>2];c[A+8>>2]=c[b+8>>2];c[A+12>>2]=c[b+12>>2];c[A+16>>2]=c[b+16>>2];c[A+20>>2]=c[b+20>>2];c[A+24>>2]=c[b+24>>2];c[A+28>>2]=c[b+28>>2];c[A+32>>2]=c[b+32>>2];c[A+36>>2]=c[b+36>>2];i=j;return}function xl(b,d,e,f,g,j){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;j=j|0;var k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0,O=0,P=0.0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0.0,Z=0,_=0,aa=0,ba=0,ca=0.0;k=i;i=i+160|0;l=k|0;m=k+16|0;n=k+32|0;o=k+48|0;p=k+64|0;q=k+80|0;r=k+96|0;s=k+112|0;t=k+128|0;u=k+144|0;if((d|0)==0){vF(l|0,0,16)|0;v=(c[(c[(Hx(b|0)|0)+8>>2]|0)+116>>2]&1|0)==0;w=c[b+8>>2]|0;x=+h[w+80>>3]*.5;y=+h[w+88>>3];z=v?y:x;A=v?x:y;B=0;C=A;D=-0.0-z;E=-0.0-A;F=z;G=+h[l>>3];H=+h[l+8>>3]}else{z=+h[d>>3];A=+h[d+8>>3];y=+h[d+16>>3];x=+h[d+24>>3];I=(z+y)*.5;J=(A+x)*.5;h[l>>3]=I;h[l+8>>3]=J;B=1;C=x;D=z;E=A;F=y;G=I;H=J}J=(F>C?F:C)*4.0;v=l|0;w=l+8|0;a:do{if((f|0)==0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=0}else{R=a[f]|0;if(R<<24>>24==0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=0;break}S=f+1|0;switch(R<<24>>24|0){case 101:{if((a[S]|0)!=0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}if((j|0)==0){h[v>>3]=F}else{zl(m,j,H,J);R=l;T=m;c[R>>2]=c[T>>2];c[R+4>>2]=c[T+4>>2];c[R+8>>2]=c[T+8>>2];c[R+12>>2]=c[T+12>>2]}K=1;L=0;M=g&2;N=0;O=1;P=0.0;Q=0;break a;break};case 115:{h[w>>3]=E;T=a[S]|0;if((T|0)==0){if((j|0)==0){h[v>>3]=G}else{zl(n,j,-0.0-J,G);R=l;U=n;c[R>>2]=c[U>>2];c[R+4>>2]=c[U+4>>2];c[R+8>>2]=c[U+8>>2];c[R+12>>2]=c[U+12>>2]}K=1;L=0;M=g&1;N=0;O=1;P=-1.5707963267948966;Q=0;break a}else if((T|0)==101){if((j|0)==0){h[v>>3]=F}else{zl(o,j,-0.0-J,J);U=l;R=o;c[U>>2]=c[R>>2];c[U+4>>2]=c[R+4>>2];c[U+8>>2]=c[R+8>>2];c[U+12>>2]=c[R+12>>2]}K=1;L=0;M=g&3;N=0;O=1;P=-.7853981633974483;Q=0;break a}else if((T|0)==119){if((j|0)==0){h[v>>3]=D}else{I=-0.0-J;zl(p,j,I,I);T=l;R=p;c[T>>2]=c[R>>2];c[T+4>>2]=c[R+4>>2];c[T+8>>2]=c[R+8>>2];c[T+12>>2]=c[R+12>>2]}K=1;L=0;M=g&9;N=0;O=1;P=-2.356194490192345;Q=0;break a}else{h[w>>3]=H;K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}break};case 119:{if((a[S]|0)!=0){K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}if((j|0)==0){h[v>>3]=D}else{zl(q,j,H,-0.0-J);R=l;T=q;c[R>>2]=c[T>>2];c[R+4>>2]=c[T+4>>2];c[R+8>>2]=c[T+8>>2];c[R+12>>2]=c[T+12>>2]}K=1;L=0;M=g&8;N=0;O=1;P=3.141592653589793;Q=0;break a;break};case 110:{h[w>>3]=C;T=a[S]|0;if((T|0)==0){if((j|0)==0){h[v>>3]=G}else{zl(r,j,J,G);S=l;R=r;c[S>>2]=c[R>>2];c[S+4>>2]=c[R+4>>2];c[S+8>>2]=c[R+8>>2];c[S+12>>2]=c[R+12>>2]}K=1;L=0;M=g&4;N=0;O=1;P=1.5707963267948966;Q=0;break a}else if((T|0)==101){if((j|0)==0){h[v>>3]=F}else{zl(s,j,J,J);R=l;S=s;c[R>>2]=c[S>>2];c[R+4>>2]=c[S+4>>2];c[R+8>>2]=c[S+8>>2];c[R+12>>2]=c[S+12>>2]}K=1;L=0;M=g&6;N=0;O=1;P=.7853981633974483;Q=0;break a}else if((T|0)==119){if((j|0)==0){h[v>>3]=D}else{zl(t,j,J,-0.0-J);T=l;S=t;c[T>>2]=c[S>>2];c[T+4>>2]=c[S+4>>2];c[T+8>>2]=c[S+8>>2];c[T+12>>2]=c[S+12>>2]}K=1;L=0;M=g&12;N=0;O=1;P=2.356194490192345;Q=0;break a}else{h[w>>3]=H;K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}break};case 95:{K=B;L=1;M=g;N=1;O=0;P=0.0;Q=0;break a;break};case 99:{K=B;L=1;M=0;N=0;O=0;P=0.0;Q=0;break a;break};default:{K=B;L=1;M=0;N=0;O=0;P=0.0;Q=1;break a}}}}while(0);B=b|0;ri(u,l,(c[(c[(Hx(B)|0)+8>>2]|0)+116>>2]&3)*90|0);b=l;l=u;c[b>>2]=c[l>>2];c[b+4>>2]=c[l+4>>2];c[b+8>>2]=c[l+8>>2];c[b+12>>2]=c[l+12>>2];if(N<<24>>24==0){l=c[(c[(Hx(B)|0)+8>>2]|0)+116>>2]&3;b=M&255;do{if((l|0)==2){if((M|0)==4){V=1;break}else if((M|0)==1){V=4;break}else{V=b;break}}else if((l|0)==1){if((M|0)==4){V=2;break}else if((M|0)==1){V=8;break}else if((M|0)==8){V=4;break}else if((M|0)==2){V=1;break}else{V=b;break}}else if((l|0)==3){if((M|0)==4){V=2;break}else if((M|0)==1){V=8;break}else if((M|0)==8){V=1;break}else if((M|0)==2){V=4;break}else{V=b;break}}else{V=b}}while(0);a[e+33|0]=V}else{a[e+33|0]=M}c[e+24>>2]=d;H=+h[v>>3];if(H<0.0){W=H+-.5}else{W=H+.5}h[e>>3]=+(~~W|0);W=+h[w>>3];if(W<0.0){X=W+-.5}else{X=W+.5}h[e+8>>3]=+(~~X|0);d=c[(c[(Hx(B)|0)+8>>2]|0)+116>>2]&3;do{if((d|0)==2){Y=P*-1.0}else if((d|0)==1){Y=P+ -1.5707963267948966}else if((d|0)==3){if(P==3.141592653589793){Y=-1.5707963267948966;break}if(P==2.356194490192345){Y=-.7853981633974483;break}if(P==1.5707963267948966){Y=0.0;break}if(P==0.0){Y=1.5707963267948966;break}if(P==-.7853981633974483){Y=2.356194490192345;break}if(P!=-1.5707963267948966){Y=P;break}Y=3.141592653589793}else{Y=P}}while(0);h[e+16>>3]=Y;Y=+h[v>>3];P=+h[w>>3];if(Y==0.0&P==0.0){a[e+32|0]=-128;Z=e+29|0;a[Z]=O;_=e+28|0;a[_]=K;aa=e+30|0;a[aa]=L;ba=e+31|0;a[ba]=N;i=k;return Q|0}X=+$(+P,+Y)+4.71238898038469;if(X<6.283185307179586){ca=X}else{ca=X+ -6.283185307179586}a[e+32|0]=~~(ca*256.0/6.283185307179586);Z=e+29|0;a[Z]=O;_=e+28|0;a[_]=K;aa=e+30|0;a[aa]=L;ba=e+31|0;a[ba]=N;i=k;return Q|0}function yl(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+80|0;e=d|0;f=d+40|0;g=b+8|0;h=c[g>>2]|0;j=h+16|0;k=j;if((a[k+31|0]|0)==0){l=h}else{h=c[b>>2]&3;wl(e,c[((h|0)==3?b:b+32|0)+28>>2]|0,c[((h|0)==2?b:b-32|0)+28>>2]|0,k);k=j;j=e;c[k>>2]=c[j>>2];c[k+4>>2]=c[j+4>>2];c[k+8>>2]=c[j+8>>2];c[k+12>>2]=c[j+12>>2];c[k+16>>2]=c[j+16>>2];c[k+20>>2]=c[j+20>>2];c[k+24>>2]=c[j+24>>2];c[k+28>>2]=c[j+28>>2];c[k+32>>2]=c[j+32>>2];c[k+36>>2]=c[j+36>>2];l=c[g>>2]|0}g=l+56|0;l=g;if((a[l+31|0]|0)==0){i=d;return}j=c[b>>2]&3;wl(f,c[((j|0)==2?b:b-32|0)+28>>2]|0,c[((j|0)==3?b:b+32|0)+28>>2]|0,l);l=g;g=f;c[l>>2]=c[g>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[l+12>>2]=c[g+12>>2];c[l+16>>2]=c[g+16>>2];c[l+20>>2]=c[g+20>>2];c[l+24>>2]=c[g+24>>2];c[l+28>>2]=c[g+28>>2];c[l+32>>2]=c[g+32>>2];c[l+36>>2]=c[g+36>>2];i=d;return}function zl(a,b,d,e){a=a|0;b=b|0;d=+d;e=+e;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+112|0;g=f|0;j=f+64|0;k=f+80|0;l=f+96|0;m=c[b>>2]|0;n=c[(c[(Hx(m|0)|0)+8>>2]|0)+116>>2]&3;h[j>>3]=e;h[j+8>>3]=d;o=(n|0)!=0;if(o){ri(k,j,n*90|0);p=j;q=k;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];r=p}else{r=j}j=g|0;p=g+16|0;q=g;vF(g|0,0,16)|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];p=g+32|0;c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];p=g+48|0;c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];_l(b,c[(c[(c[(c[m+8>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]|0,j,1);if(!o){s=a;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=f;return}si(l,j,n*90|0);n=l;c[q>>2]=c[n>>2];c[q+4>>2]=c[n+4>>2];c[q+8>>2]=c[n+8>>2];c[q+12>>2]=c[n+12>>2];s=a;c[s>>2]=c[q>>2];c[s+4>>2]=c[q+4>>2];c[s+8>>2]=c[q+8>>2];c[s+12>>2]=c[q+12>>2];i=f;return}function Al(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0.0;d=i;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];f=+h[b>>3]/1.902113032590307;g=+h[b+8>>3]/1.1180339887498947;j=(f>g?f:g)*.9510565162951535*.8090169943749475/.29389262614623657;h[a>>3]=j*2.0*.9510565162951535;h[a+8>>3]=j*1.8090169943749475;i=d;return}function Bl(a,b){a=a|0;b=b|0;var c=0,d=0.0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0;c=b|0;d=+h[c>>3];e=b+8|0;f=+h[e>>3];g=f/d;do{if(g>.9510565162951536){i=f;j=f/.9510565162951536}else{if(g>=.9510565162951536){i=f;j=d;break}i=d*.9510565162951536;j=d}}while(0);d=j/1.902113032590307;f=d*.9510565162951535;g=f*.30901699437494745/.7694208842938134;k=d*.19098300562505266*.5;h[a>>3]=f;h[a+8>>3]=d*.3090169943749474-k;h[a+16>>3]=g*.5877852522924732;h[a+24>>3]=g*.8090169943749473-k;h[a+32>>3]=d*6.123233995736766e-17;h[a+40>>3]=d-k;h[a+48>>3]=g*-.587785252292473;h[a+56>>3]=g*.8090169943749475-k;h[a+64>>3]=d*-.9510565162951535;h[a+72>>3]=d*.3090169943749475-k;h[a+80>>3]=g*-.9510565162951536;h[a+88>>3]=g*-.3090169943749473-k;h[a+96>>3]=d*-.5877852522924732;h[a+104>>3]=d*-.8090169943749473-k;h[a+112>>3]=g*-1.8369701987210297e-16;h[a+120>>3]=g*-1.0-k;h[a+128>>3]=d*.5877852522924729;h[a+136>>3]=d*-.8090169943749476-k;h[a+144>>3]=g*.9510565162951535;h[a+152>>3]=g*-.3090169943749476-k;h[c>>3]=j;h[e>>3]=i;return}function Cl(a){a=a|0;var b=0;b=c[(c[a+8>>2]|0)+12>>2]|0;if((b|0)==0){return}eF(c[b+44>>2]|0);eF(b);return}function Dl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+56|0;h=g|0;j=g+40|0;k=g+48|0;if((a[e]|0)==0){l=b;c[l>>2]=c[43356];c[l+4>>2]=c[43357];c[l+8>>2]=c[43358];c[l+12>>2]=c[43359];c[l+16>>2]=c[43360];c[l+20>>2]=c[43361];c[l+24>>2]=c[43362];c[l+28>>2]=c[43363];c[l+32>>2]=c[43364];c[l+36>>2]=c[43365];i=g;return}l=(f|0)==0?82448:f;c[j>>2]=15;f=d+8|0;m=c[f>>2]|0;do{if((a[(c[m+104>>2]|0)+82|0]|0)==0){n=m;o=8}else{p=xj(d,e,j)|0;if((p|0)==0){n=c[f>>2]|0;o=8;break}if((xl(d,p,h,l,c[j>>2]|0,0)|0)==0){break}p=$w(d|0)|0;Fv(0,81824,(q=i,i=i+24|0,c[q>>2]=p,c[q+8>>2]=e,c[q+16>>2]=l,q)|0)|0;i=q}}while(0);do{if((o|0)==8){if((c[(c[n+8>>2]|0)+8>>2]|0)==17560){r=0}else{c[k>>2]=d;c[k+4>>2]=0;r=k}if((xl(d,0,h,e,c[j>>2]|0,r)|0)==0){break}l=$w(d|0)|0;Fv(0,81120,(q=i,i=i+16|0,c[q>>2]=l,c[q+8>>2]=e,q)|0)|0;i=q}}while(0);q=b;b=h;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[q+16>>2]=c[b+16>>2];c[q+20>>2]=c[b+20>>2];c[q+24>>2]=c[b+24>>2];c[q+28>>2]=c[b+28>>2];c[q+32>>2]=c[b+32>>2];c[q+36>>2]=c[b+36>>2];i=g;return}function El(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a+4>>2]|0;g=c[a>>2]|0;si(e,b,(c[(c[(Hx(g|0)|0)+8>>2]|0)+116>>2]&3)*90|0);j=+h[e>>3];k=+h[e+8>>3];if((f|0)!=0){if(+h[f>>3]>j){l=0;i=d;return l|0}if(j>+h[f+16>>3]|+h[f+8>>3]>k){l=0;i=d;return l|0}l=k<=+h[f+24>>3]|0;i=d;return l|0}if((g|0)==(c[43740]|0)){m=c[43734]|0}else{f=c[(c[g+8>>2]|0)+12>>2]|0;c[43736]=f;c[43732]=c[f+44>>2];e=c[f+8>>2]|0;c[43734]=e;b=da((c[f+4>>2]|0)-1|0,e)|0;c[43738]=(b|0)<0?0:b;c[43740]=g;m=e}if((m|0)<=0){l=1;i=d;return l|0}e=c[43738]|0;g=c[43732]|0;n=+h[21871];o=+h[21872];b=0;f=0;while(1){a=e+f|0;p=+h[g+(a<<4)>>3];q=+h[g+(a<<4)+8>>3];a=((f+4|0)%(m|0)|0)+e|0;r=-0.0-(+h[g+(a<<4)+8>>3]-q);s=+h[g+(a<<4)>>3]-p;t=q*s+p*r;a=((k*s+j*r-t>=0.0^s*o+n*r-t>=0.0)&1)+b|0;u=f+2|0;if((a|0)==2){l=0;v=12;break}if((u|0)<(m|0)){b=a;f=u}else{l=1;v=12;break}}if((v|0)==12){i=d;return l|0}return 0}function Fl(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0;e=c[b+8>>2]|0;if((a[(c[e+104>>2]|0)+82|0]|0)==0){h=0;return h|0}if((a[e+145|0]|0)==0){h=0;return h|0}h=zj(b,d,0,f,g)|0;return h|0}function Gl(e,f){e=e|0;f=f|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0.0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0,ca=0;j=i;i=i+48|0;k=j|0;l=j+32|0;m=j+40|0;n=c[e+16>>2]|0;o=n+208|0;p=c[o>>2]|0;if((p|0)==0){if((b[n+260>>1]&1)==0){q=0}else{r=3}}else{r=3}do{if((r|0)==3){if((c[e+152>>2]&4|0)!=0){q=1;break}gB(e,p,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0);q=1}}while(0);p=f+8|0;s=c[p>>2]|0;t=c[s+12>>2]|0;u=c[t+44>>2]|0;v=c[t+8>>2]|0;w=c[t+4>>2]|0;if((c[44090]|0)<(v|0)){t=v+5|0;c[44090]=t;x=c[44092]|0;if((x|0)==0){y=kk(t<<4)|0}else{y=mk(x,t<<4)|0}c[44092]=y;z=c[p>>2]|0}else{z=s}s=(c[z+104>>2]|0)+56|0;y=z+16|0;c[s>>2]=c[y>>2];c[s+4>>2]=c[y+4>>2];c[s+8>>2]=c[y+8>>2];c[s+12>>2]=c[y+12>>2];y=c[p>>2]|0;A=+h[y+32>>3]*72.0;if(A<0.0){B=A+-.5}else{B=A+.5}A=(+h[y+88>>3]+ +h[y+96>>3])/+(~~B|0);B=+h[y+40>>3]*72.0;if(B<0.0){C=B+-.5}else{C=B+.5}B=+h[y+80>>3]/+(~~C|0);y=Hl(e,f)|0;s=l|0;c[s>>2]=0;z=d[(c[p>>2]|0)+117|0]|0;do{if((z&1|0)==0){if((z&2|0)!=0){t=f|0;x=Im(t,c[53592]|0,91912)|0;lB(e,x);nB(e,Im(t,c[53594]|0,91048)|0);D=x;E=0;F=1;break}if((z&8|0)!=0){x=f|0;t=Im(x,c[53638]|0,90552)|0;lB(e,t);nB(e,Im(x,c[53640]|0,89960)|0);D=t;E=0;F=1;break}if((z&4|0)!=0){t=f|0;x=Im(t,c[53576]|0,89400)|0;lB(e,x);nB(e,Im(t,c[53578]|0,89016)|0);D=x;E=0;F=1;break}do{if((y&1|0)==0){x=f|0;if((y&576|0)==0){G=0;H=0;I=x;break}t=Im(x,c[53632]|0,213320)|0;if((a[t]|0)!=0){G=t;H=1;I=x;break}t=Im(x,c[53644]|0,213320)|0;G=(a[t]|0)==0?116344:t;H=1;I=x}else{x=f|0;t=Im(x,c[53632]|0,213320)|0;if((a[t]|0)==0){J=Im(x,c[53644]|0,213320)|0;K=(a[J]|0)==0?116344:J}else{K=t}if((Vh(K,s,m)|0)<<24>>24==0){nB(e,K);G=K;H=1;I=x;break}nB(e,c[s>>2]|0);t=c[l+4>>2]|0;J=Em(x,c[53622]|0,0,0)|0;C=+g[m>>2];if((t|0)==0){oB(e,88552,J,C)}else{oB(e,t,J,C)}G=K;H=(y&2|0)==0?2:3;I=x}}while(0);x=Im(I,c[53644]|0,213320)|0;J=(a[x]|0)!=0?x:88552;lB(e,J);D=J;E=G;F=H}else{J=f|0;x=Im(J,c[53646]|0,93016)|0;lB(e,x);nB(e,Im(J,c[53648]|0,92528)|0);D=x;E=0;F=1}}while(0);H=c[(c[p>>2]|0)+8>>2]|0;do{if((a[H+12|0]|0)==0){L=0;r=40}else{G=c[H>>2]|0;if((a[G]|0)!=99){M=1;r=42;break}L=(Ya(G|0,102208)|0)!=0;r=40}}while(0);do{if((r|0)==40){if((w|0)!=0|F<<24>>24==0|L){M=L;r=42;break}lB(e,88104);N=0;O=1;r=43}}while(0);if((r|0)==42){if((w|0)>0){N=M;O=w;r=43}else{P=F;Q=0;R=M}}if((r|0)==43){M=(v|0)>0;w=(v|0)<3;L=(y&512|0)!=0;H=f|0;G=(y&8|0)==0;I=k|0;K=k|0;m=k+8|0;l=k+24|0;z=k+16|0;x=(y&64|0)==0;J=(y&1024|0)==0;t=(y&2130706444|0)==0;S=F;F=0;while(1){if(M){T=da(F,v)|0;U=c[44092]|0;V=0;do{W=V+T|0;C=+h[u+(W<<4)+8>>3];h[U+(V<<4)>>3]=A*+h[u+(W<<4)>>3]+ +h[(c[p>>2]|0)+16>>3];h[U+(V<<4)+8>>3]=B*C+ +h[(c[p>>2]|0)+24>>3];V=V+1|0;}while((V|0)<(v|0))}do{if(w){do{if(L&(F|0)==0){if((gb(E|0,58)|0)==0){X=S;break}if((Kh(e,c[44092]|0,E)|0)<=1){X=0;break}V=$w(H)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=V,Y)|0)|0;i=Y;X=0}else{X=S}}while(0);qB(e,c[44092]|0,v,X&255);if(G){break}V=c[p>>2]|0;C=+h[V+80>>3]*.75*.5;Z=+h[V+96>>3]*.6614;_=Z+ +h[V+16>>3];$=C+ +h[V+24>>3];h[K>>3]=_;h[m>>3]=$;h[l>>3]=$;h[z>>3]=_-Z*2.0;uB(e,I,2);Z=+h[m>>3]-C*2.0;h[m>>3]=Z;h[l>>3]=Z;uB(e,I,2);}else{if(!x){do{if((F|0)==0){if((Mh(e,c[44092]|0,E,1)|0)<=1){break}V=$w(H)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=V,Y)|0)|0;i=Y}}while(0);rB(e,c[44092]|0,v,0);break}if(!J){lB(e,88104);rB(e,c[44092]|0,v,S&255);lB(e,D);uB(e,(c[44092]|0)+32|0,2);break}V=c[44092]|0;U=S&255;if(t){rB(e,V,v,U);break}else{ol(e,V,v,y,U);break}}}while(0);U=F+1|0;if((U|0)<(O|0)){S=0;F=U}else{P=0;Q=O;R=N;break}}}N=c[(c[p>>2]|0)+8>>2]|0;do{if((a[N+12|0]|0)==0){O=ew(f|0,87160)|0;if((O|0)!=0){aa=O;r=70}}else{O=c[N>>2]|0;if((a[O]|0)!=99){aa=O;r=70;break}if((Ya(O|0,102208)|0)!=0){aa=O;r=70;break}aa=ew(f|0,114736)|0;r=70}}while(0);if((r|0)==70){if((v|0)>0){r=c[44092]|0;N=0;do{Z=+h[u+(N<<4)+8>>3];h[r+(N<<4)>>3]=A*+h[u+(N<<4)>>3]+ +h[(c[p>>2]|0)+16>>3];h[r+(N<<4)+8>>3]=B*Z+ +h[(c[p>>2]|0)+24>>3];N=N+1|0;}while((N|0)<(v|0))}N=P&255;do{if(P<<24>>24==0|R){ba=P}else{if((v|0)<3){do{if((y&512|0)!=0&(Q|0)==0){if((gb(E|0,58)|0)==0){ca=P;break}if((Kh(e,c[44092]|0,E)|0)<=1){ca=0;break}r=$w(f|0)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=r,Y)|0)|0;i=Y;ca=0}else{ca=P}}while(0);qB(e,c[44092]|0,v,ca&255);if((y&8|0)==0){ba=ca;break}r=c[p>>2]|0;B=+h[r+80>>3]*.75*.5;A=+h[r+96>>3]*.6614;u=k|0;Z=A+ +h[r+16>>3];C=B+ +h[r+24>>3];h[k>>3]=Z;r=k+8|0;h[r>>3]=C;O=k+24|0;h[O>>3]=C;h[k+16>>3]=Z-A*2.0;uB(e,u,2);A=+h[r>>3]-B*2.0;h[r>>3]=A;h[O>>3]=A;uB(e,u,2);ba=ca;break}if((y&64|0)==0){u=c[44092]|0;if((y&12|0)==0){rB(e,u,v,N);ba=P;break}else{ol(e,u,v,y,N);ba=P;break}}else{if((Mh(e,c[44092]|0,E,1)|0)>1){u=$w(f|0)|0;Fv(3,87648,(Y=i,i=i+8|0,c[Y>>2]=u,Y)|0)|0;i=Y}rB(e,c[44092]|0,v,0);ba=P;break}}}while(0);P=c[44092]|0;wB(e,aa,P,v,ba,Hm(f|0,c[53616]|0,86632)|0)}eF(c[s>>2]|0);ek(e,10,c[(c[p>>2]|0)+104>>2]|0);if(!q){i=j;return}if((c[e+152>>2]&4|0)!=0){gB(e,c[o>>2]|0,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0)}hB(e);i=j;return}function Hl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+8|0;f=e|0;g=Il(d,f)|0;if((g|0)!=0){pB(b,g)}g=c[53600]|0;do{if((g|0)!=0){h=d|0;j=fw(h,g)|0;if((j|0)==0){break}if((a[j]|0)==0){break}xB(b,+Fm(h,c[53600]|0,1.0,0.0))}}while(0);i=e;return c[f>>2]|0}function Il(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0,z=0,A=0;e=Im(b|0,c[53582]|0,213320)|0;a:do{if((a[e]|0)==0){f=0;g=0}else{i=Yh(e)|0;j=c[i>>2]|0;if((j|0)==0){f=i;g=0;break}k=b+8|0;l=0;m=i;n=j;while(1){j=a[n]|0;b:do{switch(j<<24>>24){case 114:{if((Ya(n|0,84864)|0)==0){o=m;while(1){p=o+4|0;q=c[p>>2]|0;c[o>>2]=q;if((q|0)==0){break}else{o=p}}r=m;s=l|4;break b}if((Ya(n|0,83656)|0)==0){t=m}else{u=21;break b}while(1){o=t+4|0;p=c[o>>2]|0;c[t>>2]=p;if((p|0)==0){break}else{t=o}}r=m;s=l|3;break};case 100:{if((Ya(n|0,84432)|0)==0){v=m}else{u=37;break b}while(1){o=v+4|0;p=c[o>>2]|0;c[v>>2]=p;if((p|0)==0){break}else{v=o}}r=m;s=l|8;break};case 105:{if((Ya(n|0,84048)|0)!=0){u=21;break b}r=m+4|0;s=l|32;break};case 115:{u=22;break};case 119:{u=33;break};case 102:{if((Ya(n|0,85312)|0)!=0){u=21;break b}r=m+4|0;s=l|1;break};default:{u=37}}}while(0);if((u|0)==21){u=0;if((j<<24>>24|0)==115){u=22}else if((j<<24>>24|0)==119){u=33}else{u=37}}c:do{if((u|0)==22){u=0;if((Ya(n|0,83248)|0)!=0){u=37;break}o=c[(c[(c[k>>2]|0)+8>>2]|0)+8>>2]|0;do{if((o|0)!=0){if((c[o+8>>2]|0)!=4){break}w=+h[o+16>>3];if(w<0.0){x=w+-.5}else{x=w+.5}if(((~~x|0)%90|0|0)!=0){break}if(+h[o+24>>3]!=0.0){break}if(+h[o+32>>3]==0.0){y=m}else{break}while(1){p=y+4|0;q=c[p>>2]|0;c[y>>2]=q;if((q|0)==0){break}else{y=p}}r=m;s=l|64;break c}}while(0);if(j<<24>>24==119){u=33}else{u=37}}}while(0);do{if((u|0)==33){u=0;if((Ya(n|0,82832)|0)!=0){u=37;break}j=c[(c[(c[k>>2]|0)+8>>2]|0)+8>>2]|0;if((j|0)==0){u=37;break}if((c[j+8>>2]|0)<3){z=m}else{u=37;break}while(1){j=z+4|0;o=c[j>>2]|0;c[z>>2]=o;if((o|0)==0){break}else{z=j}}r=m;s=l|512}}while(0);if((u|0)==37){u=0;r=m+4|0;s=l}j=c[r>>2]|0;if((j|0)==0){f=i;g=s;break a}else{l=s;m=r;n=j}}}}while(0);r=c[(c[(c[b+8>>2]|0)+8>>2]|0)+8>>2]|0;if((r|0)==0){A=g;c[d>>2]=A;return f|0}A=c[r+40>>2]|g;c[d>>2]=A;return f|0}function Jl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a>>2]|0;si(e,b,(c[(c[(Hx(f|0)|0)+8>>2]|0)+116>>2]&3)*90|0);g=+h[e>>3];j=+h[e+8>>3];e=c[f+8>>2]|0;k=+h[e+80>>3]*.5;if(j<-0.0-k|j>k){l=0;i=d;return l|0}if(g<-0.0- +h[e+88>>3]){l=0;i=d;return l|0}l=g<=+h[e+96>>3]|0;i=d;return l|0}function Kl(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0;e=i;f=c[a+16>>2]|0;g=f+208|0;j=c[g>>2]|0;if((j|0)==0){k=(b[f+260>>1]&1)!=0}else{k=1}l=d+8|0;d=c[l>>2]|0;m=c[d+12>>2]|0;if((m|0)==0){i=e;return}if(k){if((c[a+152>>2]&4|0)==0){gB(a,j,c[f+228>>2]|0,c[f+244>>2]|0,c[f+212>>2]|0)}n=c[l>>2]|0}else{n=d}d=m+4|0;o=+h[n+24>>3]+ +(c[d+4>>2]|0);j=c[m>>2]|0;gc(c[a+36>>2]|0,80576,(m=i,i=i+24|0,h[m>>3]=+h[n+16>>3]+ +(c[d>>2]|0),h[m+8>>3]=o,c[m+16>>2]=j,m)|0)|0;i=m;m=c[l>>2]|0;j=(c[m+104>>2]|0)+56|0;d=m+16|0;c[j>>2]=c[d>>2];c[j+4>>2]=c[d+4>>2];c[j+8>>2]=c[d+8>>2];c[j+12>>2]=c[d+12>>2];ek(a,10,c[(c[l>>2]|0)+104>>2]|0);if(!k){i=e;return}if((c[a+152>>2]&4|0)!=0){gB(a,c[g>>2]|0,c[f+228>>2]|0,c[f+244>>2]|0,c[f+212>>2]|0)}hB(a);i=e;return}function Ll(a){a=a|0;Sl(c[(c[a+8>>2]|0)+12>>2]|0);return}function Ml(b,e,f,g){b=b|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0;h=i;i=i+40|0;j=h|0;if((a[f]|0)==0){k=b;c[k>>2]=c[43356];c[k+4>>2]=c[43357];c[k+8>>2]=c[43358];c[k+12>>2]=c[43359];c[k+16>>2]=c[43360];c[k+20>>2]=c[43361];c[k+24>>2]=c[43362];c[k+28>>2]=c[43363];c[k+32>>2]=c[43364];c[k+36>>2]=c[43365];i=h;return}k=(g|0)==0?82448:g;g=c[(c[e+8>>2]|0)+12>>2]|0;l=Rl(g,f)|0;do{if((l|0)==0){if((xl(e,g+16|0,j,f,15,0)|0)==0){break}m=$w(e|0)|0;Fv(0,81120,(n=i,i=i+16|0,c[n>>2]=m,c[n+8>>2]=f,n)|0)|0;i=n}else{if((xl(e,l+16|0,j,k,d[l+65|0]|0,0)|0)==0){break}m=$w(e|0)|0;Fv(0,81824,(n=i,i=i+24|0,c[n>>2]=m,c[n+8>>2]=f,c[n+16>>2]=k,n)|0)|0;i=n}}while(0);n=b;b=j;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];c[n+16>>2]=c[b+16>>2];c[n+20>>2]=c[b+20>>2];c[n+24>>2]=c[b+24>>2];c[n+28>>2]=c[b+28>>2];c[n+32>>2]=c[b+32>>2];c[n+36>>2]=c[b+36>>2];i=h;return}function Nl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a+4>>2]|0;g=c[a>>2]|0;si(e,b,(c[(c[(Hx(g|0)|0)+8>>2]|0)+116>>2]&3)*90|0);a=b;j=e;c[a>>2]=c[j>>2];c[a+4>>2]=c[j+4>>2];c[a+8>>2]=c[j+8>>2];c[a+12>>2]=c[j+12>>2];if((f|0)==0){j=c[(c[g+8>>2]|0)+12>>2]|0;k=j+16|0;l=j+24|0;m=j+32|0;n=j+40|0}else{k=f;l=f+8|0;m=f+16|0;n=f+24|0}o=+h[b>>3];if(+h[k>>3]>o){p=0;i=d;return p|0}if(o>+h[m>>3]){p=0;i=d;return p|0}o=+h[b+8>>3];if(+h[l>>3]>o){p=0;i=d;return p|0}p=o<=+h[n>>3]|0;i=d;return p|0}function Ol(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0.0,v=0.0,w=0;j=i;i=i+32|0;k=j|0;if((a[d+28|0]|0)==0){l=0;i=j;return l|0}m=+h[d>>3];d=b+8|0;n=c[(c[d>>2]|0)+12>>2]|0;o=n+48|0;if((c[o>>2]|0)<=0){l=e;i=j;return l|0}p=b|0;b=n+56|0;n=0;while(1){q=(c[(c[(Hx(p)|0)+8>>2]|0)+116>>2]&1|0)==0;r=c[(c[b>>2]|0)+(n<<2)>>2]|0;if(q){s=r+16|0;t=r+32|0}else{s=r+24|0;t=r+40|0}u=+(~~+h[s>>3]|0);if(u<=m){v=+(~~+h[t>>3]|0);if(m<=v){break}}r=n+1|0;if((r|0)<(c[o>>2]|0)){n=r}else{l=e;w=14;break}}if((w|0)==14){i=j;return l|0}if((c[(c[(Hx(p)|0)+8>>2]|0)+116>>2]&1|0)==0){h[f>>3]=u+ +h[(c[d>>2]|0)+16>>3];p=c[d>>2]|0;h[f+8>>3]=+h[p+24>>3]- +h[p+80>>3]*.5;h[f+16>>3]=v+ +h[(c[d>>2]|0)+16>>3]}else{ti(k,(c[(c[b>>2]|0)+(n<<2)>>2]|0)+16|0,(c[d>>2]|0)+16|0);n=f;b=k;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=c[b+8>>2];c[n+12>>2]=c[b+12>>2];c[n+16>>2]=c[b+16>>2];c[n+20>>2]=c[b+20>>2];c[n+24>>2]=c[b+24>>2];c[n+28>>2]=c[b+28>>2]}b=c[d>>2]|0;h[f+24>>3]=+h[b+24>>3]+ +h[b+80>>3]*.5;c[g>>2]=1;l=e;i=j;return l|0}function Pl(d,e){d=d|0;e=e|0;var f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0.0,C=0;f=i;i=i+112|0;j=f|0;k=f+32|0;l=f+96|0;m=f+104|0;n=c[d+16>>2]|0;o=n+208|0;if((c[o>>2]|0)==0){p=(b[n+260>>1]&1)!=0}else{p=1}q=e+8|0;r=c[q>>2]|0;s=c[r+12>>2]|0;t=s;u=j;v=s+16|0;c[u>>2]=c[v>>2];c[u+4>>2]=c[v+4>>2];c[u+8>>2]=c[v+8>>2];c[u+12>>2]=c[v+12>>2];c[u+16>>2]=c[v+16>>2];c[u+20>>2]=c[v+20>>2];c[u+24>>2]=c[v+24>>2];c[u+28>>2]=c[v+28>>2];v=r+16|0;s=j|0;h[s>>3]=+h[v>>3]+ +h[s>>3];s=r+24|0;r=j+8|0;h[r>>3]=+h[s>>3]+ +h[r>>3];r=j+16|0;w=r|0;h[w>>3]=+h[v>>3]+ +h[w>>3];w=j+24|0;h[w>>3]=+h[s>>3]+ +h[w>>3];do{if(p){if((c[d+152>>2]&4|0)!=0){break}gB(d,c[o>>2]|0,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0)}}while(0);w=Hl(d,e)|0;s=e|0;v=Im(s,c[53644]|0,213320)|0;lB(d,(a[v]|0)!=0?v:88552);do{if((w&1|0)==0){x=0}else{v=Im(s,c[53632]|0,213320)|0;if((a[v]|0)==0){y=Im(s,c[53644]|0,213320)|0;z=(a[y]|0)==0?116344:y}else{z=v}v=l|0;if((Vh(z,v,m)|0)<<24>>24==0){nB(d,z);x=1;break}nB(d,c[v>>2]|0);y=c[l+4>>2]|0;A=Em(s,c[53622]|0,0,0)|0;B=+g[m>>2];if((y|0)==0){oB(d,88552,A,B)}else{oB(d,y,A,B)}eF(c[v>>2]|0);x=w>>>1&1|2}}while(0);m=c[c[(c[q>>2]|0)+8>>2]>>2]|0;if((a[m]|0)==77){q=(Ya(m|0,93976)|0)==0;C=q?w|4:w}else{C=w}if((C&2130706444|0)==0){sB(d,j,x)}else{j=k;c[j>>2]=c[u>>2];c[j+4>>2]=c[u+4>>2];c[j+8>>2]=c[u+8>>2];c[j+12>>2]=c[u+12>>2];u=k+32|0;j=u;w=r;c[j>>2]=c[w>>2];c[j+4>>2]=c[w+4>>2];c[j+8>>2]=c[w+8>>2];c[j+12>>2]=c[w+12>>2];h[k+16>>3]=+h[u>>3];h[k+24>>3]=+h[k+8>>3];h[k+48>>3]=+h[k>>3];h[k+56>>3]=+h[k+40>>3];ol(d,k|0,4,C,x)}Ql(d,e,t);if(!p){i=f;return}if((c[d+152>>2]&4|0)!=0){gB(d,c[o>>2]|0,c[n+228>>2]|0,c[n+244>>2]|0,c[n+212>>2]|0)}hB(d);i=f;return}function Ql(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0;f=i;i=i+32|0;g=f|0;j=e+52|0;k=c[j>>2]|0;if((k|0)==0){l=d+8|0}else{m=d+8|0;n=c[m>>2]|0;o=(+h[e+24>>3]+ +h[e+40>>3])*.5+ +h[n+24>>3];h[k+56>>3]=(+h[e+16>>3]+ +h[e+32>>3])*.5+ +h[n+16>>3];h[k+64>>3]=o;ek(b,10,c[j>>2]|0);j=Im(d|0,c[53644]|0,213320)|0;lB(b,(a[j]|0)!=0?j:88552);l=m}m=c[l>>2]|0;o=+h[m+16>>3];p=+h[m+24>>3];m=e+48|0;if((c[m>>2]|0)<=0){i=f;return}l=e+64|0;j=e+56|0;e=g+16|0;k=g|0;n=g+24|0;q=g+8|0;r=g|0;s=g+16|0;t=g;g=0;do{if((g|0)>0){u=(c[j>>2]|0)+(g<<2)|0;v=c[u>>2]|0;if((a[l]|0)==0){w=v+32|0;c[e>>2]=c[w>>2];c[e+4>>2]=c[w+4>>2];c[e+8>>2]=c[w+8>>2];c[e+12>>2]=c[w+12>>2];x=+h[(c[u>>2]|0)+16>>3];h[k>>3]=x;y=+h[n>>3];h[q>>3]=y;z=x;A=y;B=+h[s>>3];C=y}else{w=v+16|0;c[t>>2]=c[w>>2];c[t+4>>2]=c[w+4>>2];c[t+8>>2]=c[w+8>>2];c[t+12>>2]=c[w+12>>2];y=+h[k>>3];h[s>>3]=y;x=+h[(c[u>>2]|0)+40>>3];h[n>>3]=x;z=y;A=+h[q>>3];B=y;C=x}h[k>>3]=o+z;h[q>>3]=p+A;h[s>>3]=o+B;h[n>>3]=p+C;uB(b,r,2)}Ql(b,d,c[(c[j>>2]|0)+(g<<2)>>2]|0);g=g+1|0;}while((g|0)<(c[m>>2]|0));i=f;return}function Rl(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=c[b+60>>2]|0;do{if((e|0)!=0){if((a[e]|0)!=(a[d]|0)){break}if((Ya(e|0,d|0)|0)==0){f=b}else{break}return f|0}}while(0);e=c[b+48>>2]|0;if((e|0)<=0){f=0;return f|0}g=c[b+56>>2]|0;b=0;while(1){h=Rl(c[g+(b<<2)>>2]|0,d)|0;i=b+1|0;if((h|0)!=0){f=h;j=8;break}if((i|0)<(e|0)){b=i}else{f=0;j=8;break}}if((j|0)==8){return f|0}return 0}function Sl(a){a=a|0;var b=0,d=0,e=0;b=a+48|0;d=a+56|0;if((c[b>>2]|0)>0){e=0;do{Sl(c[(c[d>>2]|0)+(e<<2)>>2]|0);e=e+1|0;}while((e|0)<(c[b>>2]|0))}eF(c[a+60>>2]|0);dk(c[a+52>>2]|0);eF(c[d>>2]|0);eF(a);return}function Tl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0.0,k=0.0,l=0.0,m=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a>>2]|0;si(e,b,(c[(c[(Hx(f|0)|0)+8>>2]|0)+116>>2]&3)*90|0);g=+h[e>>3];j=+h[e+8>>3];if((f|0)==(c[44094]|0)){k=+h[1813]}else{e=c[(c[f+8>>2]|0)+12>>2]|0;b=(c[e+4>>2]<<1)-2|0;l=+h[(c[e+44>>2]|0)+(((b|0)<0?1:b|1)<<4)>>3];h[1813]=l;c[44094]=f;k=l}if(+S(+g)>k){m=0;i=d;return m|0}if(+S(+j)>k){m=0;i=d;return m|0}k=+cb(+g,+j);m=k<=+h[1813]|0;i=d;return m|0}function Ul(e,f){e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0.0,z=0;g=i;i=i+8|0;j=g|0;k=c[e+16>>2]|0;l=k+208|0;m=c[l>>2]|0;if((m|0)==0){if((b[k+260>>1]&1)==0){n=0}else{o=3}}else{o=3}do{if((o|0)==3){if((c[e+152>>2]&4|0)!=0){n=1;break}gB(e,m,c[k+228>>2]|0,c[k+244>>2]|0,c[k+212>>2]|0);n=1}}while(0);m=f+8|0;p=c[(c[m>>2]|0)+12>>2]|0;q=c[p+44>>2]|0;r=c[p+8>>2]|0;s=c[p+4>>2]|0;if((c[44096]|0)<(r|0)){p=r+2|0;c[44096]=p;t=c[44098]|0;if((t|0)==0){u=kk(p<<4)|0}else{u=mk(t,p<<4)|0}c[44098]=u}Il(f,j)|0;if((c[j>>2]&32|0)==0){pB(e,14492)}else{pB(e,14488)}j=d[(c[m>>2]|0)+117|0]|0;do{if((j&1|0)==0){if((j&2|0)!=0){u=f|0;lB(e,Im(u,c[53592]|0,91912)|0);p=Im(u,c[53594]|0,91048)|0;nB(e,p);v=p;break}if((j&8|0)!=0){p=f|0;lB(e,Im(p,c[53638]|0,90552)|0);u=Im(p,c[53640]|0,89960)|0;nB(e,u);v=u;break}u=f|0;if((j&4|0)!=0){lB(e,Im(u,c[53576]|0,89400)|0);p=Im(u,c[53578]|0,89016)|0;nB(e,p);v=p;break}p=Im(u,c[53632]|0,213320)|0;if((a[p]|0)==0){t=Im(u,c[53644]|0,213320)|0;w=(a[t]|0)==0?88552:t}else{w=p}nB(e,w);p=Im(u,c[53644]|0,213320)|0;lB(e,(a[p]|0)!=0?p:88552);v=w}else{p=f|0;lB(e,Im(p,c[53646]|0,93016)|0);u=Im(p,c[53648]|0,92528)|0;nB(e,u);v=u}}while(0);do{if((s|0)==0){if((a[v]|0)==0){x=1;o=28;break}lB(e,v);x=1;o=28}else{if((s|0)>0){x=s;o=28}}}while(0);if((o|0)==28){o=(r|0)>0;s=0;v=1;while(1){if(o){f=da(s,r)|0;w=c[44098]|0;j=0;while(1){u=j+f|0;y=+h[q+(u<<4)+8>>3];h[w+(j<<4)>>3]=+h[q+(u<<4)>>3]+ +h[(c[m>>2]|0)+16>>3];h[w+(j<<4)+8>>3]=y+ +h[(c[m>>2]|0)+24>>3];u=j+1|0;if((u|0)<(r|0)){j=u}else{z=w;break}}}else{z=c[44098]|0}qB(e,z,r,v);w=s+1|0;if((w|0)<(x|0)){s=w;v=0}else{break}}}if(!n){i=g;return}if((c[e+152>>2]&4|0)!=0){gB(e,c[l>>2]|0,c[k+228>>2]|0,c[k+244>>2]|0,c[k+212>>2]|0)}hB(e);i=g;return}function Vl(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0;d=i;i=i+16|0;e=b;b=i;i=i+16|0;c[b>>2]=c[e>>2];c[b+4>>2]=c[e+4>>2];c[b+8>>2]=c[e+8>>2];c[b+12>>2]=c[e+12>>2];e=d|0;f=c[a+4>>2]|0;g=c[a>>2]|0;a=g|0;si(e,b,(c[(c[(Hx(a)|0)+8>>2]|0)+116>>2]&3)*90|0);j=+h[e>>3];k=+h[e+8>>3];if((f|0)!=0){if(+h[f>>3]>j){l=0;i=d;return l|0}if(j>+h[f+16>>3]|+h[f+8>>3]>k){l=0;i=d;return l|0}l=k<=+h[f+24>>3]|0;i=d;return l|0}if((g|0)==(c[44082]|0)){m=+h[1805];n=+h[1804];o=+h[1807]}else{f=g+8|0;e=c[(c[f>>2]|0)+12>>2]|0;c[44078]=e;c[44074]=c[e+44>>2];c[44076]=c[e+8>>2];e=(c[(c[(Hx(a)|0)+8>>2]|0)+116>>2]&1|0)==0;a=c[f>>2]|0;p=+h[a+88>>3]+ +h[a+96>>3];if(e){h[1803]=p;q=+h[(c[f>>2]|0)+80>>3];h[1802]=q;r=p;s=q}else{h[1802]=p;q=+h[(c[f>>2]|0)+80>>3];h[1803]=q;r=q;s=p}if(r==0.0){h[1803]=1.0;t=1.0}else{t=r}if(s==0.0){h[1802]=1.0;u=1.0}else{u=s}s=+h[(c[f>>2]|0)+32>>3]*72.0;if(s<0.0){v=s+-.5}else{v=s+.5}s=+(~~v|0)/t;h[1805]=s;t=+h[(c[f>>2]|0)+40>>3]*72.0;if(t<0.0){w=t+-.5}else{w=t+.5}t=+(~~w|0)/u;h[1804]=t;u=+h[(c[f>>2]|0)+32>>3]*72.0;if(u<0.0){x=u+-.5}else{x=u+.5}u=+(~~x|0)*.5;h[1807]=u;x=+h[(c[f>>2]|0)+40>>3]*72.0;if(x<0.0){y=x+-.5}else{y=x+.5}h[1806]=+(~~y|0)*.5;f=da((c[(c[44078]|0)+4>>2]|0)-1|0,c[44076]|0)|0;c[44080]=(f|0)<0?0:f;c[44082]=g;m=s;n=t;o=u}u=j*m;m=k*n;if(+S(+u)>o){l=0;i=d;return l|0}n=+S(+m);k=+h[1806];if(n>k){l=0;i=d;return l|0}g=c[44076]|0;if((g|0)<3){l=+cb(+(u/o),+(m/k))<1.0|0;i=d;return l|0}f=(c[44084]|0)%(g|0)|0;e=(f+1|0)%(g|0)|0;a=c[44080]|0;b=a+f|0;z=c[44074]|0;k=+h[z+(b<<4)>>3];o=+h[z+(b<<4)+8>>3];b=a+e|0;n=+h[z+(b<<4)>>3];j=+h[z+(b<<4)+8>>3];t=+h[22043];s=+h[22044];y=-0.0-(j-o);x=n-k;w=o*x+k*y;if(m*x+u*y-w>=0.0^x*s+t*y-w>=0.0){l=0;i=d;return l|0}w=-0.0-(s-j);y=t-n;x=j*y+n*w;b=m*y+u*w-x>=0.0^o*y+k*w-x>=0.0;do{if(!b){x=-0.0-(o-s);w=k-t;y=w*s+t*x;if(m*w+u*x-y>=0.0^j*w+n*x-y>=0.0){break}else{l=1}i=d;return l|0}}while(0);a:do{if((g|0)>1){A=1;B=e;C=f;while(1){if(b){D=(C-1+g|0)%(g|0)|0;E=C}else{D=B;E=(B+1|0)%(g|0)|0}F=a+D|0;G=a+E|0;n=+h[z+(F<<4)>>3];j=+h[z+(F<<4)+8>>3];k=-0.0-(+h[z+(G<<4)+8>>3]-j);o=+h[z+(G<<4)>>3]-n;y=j*o+n*k;G=A+1|0;if(m*o+u*k-y>=0.0^s*o+t*k-y>=0.0){break}if((G|0)<(g|0)){A=G;B=E;C=D}else{H=D;break a}}c[44084]=D;l=0;i=d;return l|0}else{H=f}}while(0);c[44084]=H;l=1;i=d;return l|0}function Wl(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0;g=jk(72)|0;i=g;j=c[(c[b+8>>2]|0)+104>>2]|0;k=0;l=1;m=c[43784]|0;while(1){n=a[m]|0;if((n<<24>>24|0)==92){o=m+1|0;p=a[o]|0;if((p<<24>>24|0)==92|(p<<24>>24|0)==123|(p<<24>>24|0)==125|(p<<24>>24|0)==124){q=k;r=l;s=o}else{t=o;u=p;v=4}}else if((n<<24>>24|0)==0){w=l;break}else{t=m;u=n;v=4}if((v|0)==4){v=0;if((u<<24>>24|0)==123){x=k+1|0;y=l}else if((u<<24>>24|0)==124){x=k;y=((k|0)==0)+l|0}else if((u<<24>>24|0)==125){x=k-1|0;y=l}else{x=k;y=l}if((x|0)<0){w=y;break}else{q=x;r=y;s=t}}k=q;l=r;m=s+1|0}s=g+56|0;c[s>>2]=jk(w<<2)|0;a[g+64|0]=d;w=(d|0)==0|0;d=j+82|0;m=f+1|0;r=(e|0)==0;e=b|0;l=j+16|0;q=j+4|0;k=j+8|0;j=0;t=0;y=0;x=0;u=0;n=f;p=0;o=f;z=0;a:while(1){A=j;B=t;C=x;D=u;E=n;F=p;G=o;H=z;while(1){I=A;J=B;K=C;L=0;M=D;N=E;O=F;P=G;b:while(1){Q=I;R=K;S=L;T=M;U=O;c:while(1){V=Q;W=R;X=S;Y=U;d:while(1){Z=V;_=W;e:while(1){if(y){v=81;break a}$=c[43784]|0;aa=a[$]|0;switch(aa<<24>>24|0){case 92:{v=56;break c;break};case 60:{break d;break};case 125:case 124:case 0:{break b;break};case 123:{break};case 62:{break e;break};default:{ba=J;ca=_;da=P;ea=$;break c}}fa=$+1|0;c[43784]=fa;if((_|0)!=0){v=33;break a}if((a[fa]|0)==0){v=33;break a}fa=Wl(b,w,0,f)|0;c[(c[s>>2]|0)+(Z<<2)>>2]=fa;if((fa|0)==0){v=36;break a}else{Z=Z+1|0;_=4}}if((a[d]|0)!=0){ba=J;ca=_;da=P;ea=$;break c}if((_&16|0)==0){v=25;break a}do{if(Y>>>0>m>>>0){fa=Y-1|0;if((fa|0)==(T|0)){ga=Y;break}ga=(a[fa]|0)==32?fa:Y}else{ga=Y}}while(0);a[ga]=0;fa=Lb(f|0)|0;c[43784]=(c[43784]|0)+1;V=Z;W=_&-17;X=fa;Y=ga}if((_&6|0)!=0){v=19;break a}if((a[d]|0)!=0){ba=J;ca=_;da=P;ea=$;break}c[43784]=$+1;Q=Z;R=_|18;S=X;T=f;U=f}f:do{if((v|0)==56){v=0;U=$+1|0;switch(a[U]|0){case 123:case 125:case 124:case 60:case 62:{c[43784]=U;ba=J;ca=_;da=P;ea=U;break f;break};case 32:{v=58;break};case 0:{ba=J;ca=_;da=P;ea=$;break f;break};default:{}}do{if((v|0)==58){v=0;if((a[d]|0)!=0){break}c[43784]=U;ba=1;ca=_;da=P;ea=U;break f}}while(0);a[P]=92;U=(c[43784]|0)+1|0;c[43784]=U;ba=J;ca=_|9;da=P+1|0;ea=U}}while(0);if((ca&4|0)!=0){if((a[ea]|0)!=32){v=63;break a}}if((ca&24|0)==0){ha=(a[ea]|0)==32?ca:ca|9}else{ha=ca}do{if((ha&8|0)==0){if((ha&16|0)==0){ia=T;ja=N;ka=Y;la=da;break}U=a[ea]|0;S=(ba|0)==0;do{if(U<<24>>24==32&S){if((Y|0)==(f|0)){ma=f;break}if((a[Y-1|0]|0)==32){ma=Y}else{v=77}}else{v=77}}while(0);if((v|0)==77){v=0;a[Y]=U;ma=Y+1|0}ia=S?T:ma-1|0;ja=N;ka=ma;la=da}else{R=a[ea]|0;Q=(ba|0)==0;do{if(R<<24>>24==32&Q){if((a[da-1|0]|0)!=32){v=71;break}if((a[d]|0)==0){na=da}else{v=71}}else{v=71}}while(0);if((v|0)==71){v=0;a[da]=R;na=da+1|0}ia=T;ja=Q?N:na-1|0;ka=Y;la=na}}while(0);S=(c[43784]|0)+1|0;c[43784]=S;if((a[S]|0)<0){oa=la;pa=S}else{I=Z;J=ba;K=ha;L=X;M=ia;N=ja;O=ka;P=la;continue}while(1){c[43784]=pa+1;S=oa+1|0;a[oa]=a[pa]|0;U=c[43784]|0;if((a[U]|0)<0){oa=S;pa=U}else{I=Z;J=ba;K=ha;L=X;M=ia;N=ja;O=ka;P=S;continue b}}}if(aa<<24>>24==0&r){v=40;break a}if((_&16|0)!=0){v=40;break a}if((_&4|0)==0){O=jk(72)|0;c[(c[s>>2]|0)+(Z<<2)>>2]=O;qa=Z+1|0;ra=O}else{qa=Z;ra=H}if((X|0)!=0){c[ra+60>>2]=X}if((_&5|0)==0){a[P]=32;sa=_|1;ta=P+1|0}else{sa=_;ta=P}if((sa&1|0)==0){ua=N;va=ta}else{do{if(ta>>>0>m>>>0){O=ta-1|0;if((O|0)==(N|0)){wa=ta;break}wa=(a[O]|0)==32?O:ta}else{wa=ta}}while(0);a[wa]=0;N=Lb(f|0)|0;c[ra+52>>2]=ak(e,N,(a[d]|0)!=0?2:0,+h[l>>3],c[q>>2]|0,c[k>>2]|0)|0;a[ra+64|0]=1;ua=f;va=f}xa=c[43784]|0;N=a[xa]|0;if((N<<24>>24|0)==0){j=qa;t=J;y=1;x=sa;u=T;n=ua;p=Y;o=va;z=ra;continue a}else if((N<<24>>24|0)==125){v=54;break a}c[43784]=xa+1;A=qa;B=J;C=0;D=T;E=ua;F=Y;G=va;H=ra}}if((v|0)==19){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==25){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==33){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==36){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==40){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==54){c[43784]=xa+1;c[g+48>>2]=qa;ya=i;return ya|0}else if((v|0)==63){Sl(i);if((X|0)==0){ya=0;return ya|0}eF(X);ya=0;return ya|0}else if((v|0)==81){c[g+48>>2]=Z;ya=i;return ya|0}return 0}function Xl(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0;f=i;i=i+32|0;g=f|0;j=f+8|0;k=f+16|0;l=c[e+52>>2]|0;do{if((l|0)==0){m=e+48|0;if((c[m>>2]|0)<=0){n=0.0;o=0.0;break}p=e+56|0;q=k|0;r=k+8|0;s=e+64|0;t=0.0;u=0.0;v=0;while(1){Xl(k,d,c[(c[p>>2]|0)+(v<<2)>>2]|0);w=+h[q>>3];x=+h[r>>3];if((a[s]|0)==0){y=u+x;z=t>w?t:w}else{y=u>x?u:x;z=t+w}A=v+1|0;if((A|0)<(c[m>>2]|0)){t=z;u=y;v=A}else{n=y;o=z;break}}}else{u=+h[l+24>>3];t=+h[l+32>>3];if(!(u>0.0|t>0.0)){n=t;o=u;break}v=ew(d|0,78824)|0;if((v|0)==0){n=t+8.0;o=u+16.0;break}m=ac(v|0,168832,(v=i,i=i+16|0,c[v>>2]=g,c[v+8>>2]=j,v)|0)|0;i=v;if((m|0)<=0){n=t+8.0;o=u+16.0;break}w=+h[g>>3]*72.0;if(w<0.0){B=w+-.5}else{B=w+.5}w=u+ +(~~B<<1|0);u=+h[j>>3]*72.0;v=u>=0.0;if((m|0)>1){if(v){C=u+.5}else{C=u+-.5}n=t+ +(~~C<<1|0);o=w;break}else{if(v){D=u+.5}else{D=u+-.5}n=t+ +(~~D<<1|0);o=w;break}}}while(0);h[e>>3]=o;h[e+8>>3]=n;h[b>>3]=o;h[b+8>>3]=n;i=f;return}function Yl(b,d,e,f){b=b|0;d=+d;e=+e;f=f|0;var g=0,i=0.0,j=0,k=0.0,l=0,m=0,n=0.0,o=0,p=0,q=0,r=0.0,s=0.0;g=b|0;i=d- +h[g>>3];j=b+8|0;k=e- +h[j>>3];h[g>>3]=d;h[j>>3]=e;j=b+52|0;g=c[j>>2]|0;if((g|0)!=0&(f|0)==0){l=g+40|0;h[l>>3]=i+ +h[l>>3];l=(c[j>>2]|0)+48|0;h[l>>3]=k+ +h[l>>3]}l=b+48|0;j=c[l>>2]|0;if((j|0)==0){return}g=b+64|0;m=a[g]|0;n=(m<<24>>24==0?k:i)/+(j|0);if((j|0)<=0){return}j=b+56|0;b=0;o=m;while(1){m=c[(c[j>>2]|0)+(b<<2)>>2]|0;p=b+1|0;q=~~(n*+(p|0))-~~(n*+(b|0))|0;if(o<<24>>24==0){r=d;s=+(q|0)+ +h[m+8>>3]}else{r=+(q|0)+ +h[m>>3];s=e}Yl(m,r,s,f);if((p|0)>=(c[l>>2]|0)){break}b=p;o=a[g]|0}return}function Zl(b,d,e,f){b=b|0;d=+d;e=+e;f=f|0;var g=0.0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0;a[b+65|0]=f;g=e- +h[b+8>>3];h[b+16>>3]=d;h[b+24>>3]=g;h[b+32>>3]=+h[b>>3]+d;h[b+40>>3]=e;i=c[b+48>>2]|0;j=i-1|0;if((i|0)<1){return}i=(f|0)==0;k=b+56|0;l=b+64|0;g=e;e=d;b=0;while(1){do{if(i){m=0}else{n=(b|0)==0;o=(b|0)==(j|0);if((a[l]|0)==0){if(n){m=o?15:14;break}else{m=o?11:10;break}}else{if(n){m=o?15:13;break}else{m=o?7:5;break}}}}while(0);Zl(c[(c[k>>2]|0)+(b<<2)>>2]|0,e,g,m&f);o=c[(c[k>>2]|0)+(b<<2)>>2]|0;if((a[l]|0)==0){p=e;q=g- +h[o+8>>3]}else{p=e+ +h[o>>3];q=g}if((b|0)<(j|0)){g=q;e=p;b=b+1|0}else{break}}return}function _l(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0;f=i;i=i+176|0;g=f|0;j=f+64|0;k=f+128|0;l=f+144|0;m=f+152|0;n=f+160|0;o=g|0;if(e<<24>>24==0){e=k;p=d+48|0;c[e>>2]=c[p>>2];c[e+4>>2]=c[p+4>>2];c[e+8>>2]=c[p+8>>2];c[e+12>>2]=c[p+12>>2];q=l;r=m;s=o;t=0}else{p=k;e=d;c[p>>2]=c[e>>2];c[p+4>>2]=c[e+4>>2];c[p+8>>2]=c[e+8>>2];c[p+12>>2]=c[e+12>>2];q=m;r=l;s=0;t=o}h[l>>3]=0.0;h[m>>3]=1.0;o=k|0;e=k+8|0;p=k;u=n;v=0;w=+h[o>>3];x=1.0;y=0.0;while(1){z=+h[e>>3];A=(x+y)*.5;Qm(n,d,3,A,s,t);c[p>>2]=c[u>>2];c[p+4>>2]=c[u+4>>2];c[p+8>>2]=c[u+8>>2];c[p+12>>2]=c[u+12>>2];if((Oc[b&255](a,k)|0)<<24>>24==0){B=j;C=g;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];C=j+16|0;B=g+16|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];B=j+32|0;C=g+32|0;c[B>>2]=c[C>>2];c[B+4>>2]=c[C+4>>2];c[B+8>>2]=c[C+8>>2];c[B+12>>2]=c[C+12>>2];C=j+48|0;B=g+48|0;c[C>>2]=c[B>>2];c[C+4>>2]=c[B+4>>2];c[C+8>>2]=c[B+8>>2];c[C+12>>2]=c[B+12>>2];h[q>>3]=A;D=1}else{h[r>>3]=A;D=v}A=+h[o>>3];E=w-A;if(E<0.0){F=-0.0-E}else{F=E}if(F<=.5){E=z- +h[e>>3];if(E<0.0){G=-0.0-E}else{G=E}if(G<=.5){break}}v=D;w=A;x=+h[m>>3];y=+h[l>>3]}l=d;if(D<<24>>24==0){D=g;c[l>>2]=c[D>>2];c[l+4>>2]=c[D+4>>2];c[l+8>>2]=c[D+8>>2];c[l+12>>2]=c[D+12>>2];D=d+16|0;m=g+16|0;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];m=d+32|0;D=g+32|0;c[m>>2]=c[D>>2];c[m+4>>2]=c[D+4>>2];c[m+8>>2]=c[D+8>>2];c[m+12>>2]=c[D+12>>2];D=d+48|0;m=g+48|0;c[D>>2]=c[m>>2];c[D+4>>2]=c[m+4>>2];c[D+8>>2]=c[m+8>>2];c[D+12>>2]=c[m+12>>2];i=f;return}else{m=j;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];m=d+16|0;l=j+16|0;c[m>>2]=c[l>>2];c[m+4>>2]=c[l+4>>2];c[m+8>>2]=c[l+8>>2];c[m+12>>2]=c[l+12>>2];l=d+32|0;m=j+32|0;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];m=d+48|0;d=j+48|0;c[m>>2]=c[d>>2];c[m+4>>2]=c[d+4>>2];c[m+8>>2]=c[d+8>>2];c[m+12>>2]=c[d+12>>2];i=f;return}}function $l(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0;d=i;i=i+24|0;e=d|0;f=d+16|0;g=a+8|0;j=c[g>>2]|0;k=j+8|0;l=c[k>>2]|0;if((l|0)==0){i=d;return}if((c[(c[l+4>>2]|0)+12>>2]|0)==0){i=d;return}c[f>>2]=a;c[f+4>>2]=0;m=+h[j+96>>3];h[e>>3]=+h[b>>3]- +h[j+16>>3];h[e+8>>3]=+h[b+8>>3]- +h[j+24>>3];j=Oc[c[(c[(c[k>>2]|0)+4>>2]|0)+12>>2]&255](f,e)|0;h[(c[g>>2]|0)+96>>3]=m;am(f,a,b,j);i=d;return}function am(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;f=i;i=i+64|0;g=f|0;j=b+8|0;b=c[j>>2]|0;k=+h[b+96>>3];l=d|0;m=b+16|0;n=g|0;h[n>>3]=+h[l>>3]- +h[m>>3];o=d+8|0;p=b+24|0;q=g+8|0;h[q>>3]=+h[o>>3]- +h[p>>3];r=d+16|0;s=g+16|0;h[s>>3]=+h[r>>3]- +h[m>>3];t=d+24|0;u=g+24|0;h[u>>3]=+h[t>>3]- +h[p>>3];v=d+32|0;w=g+32|0;h[w>>3]=+h[v>>3]- +h[m>>3];x=d+40|0;y=g+40|0;h[y>>3]=+h[x>>3]- +h[p>>3];z=d+48|0;A=g+48|0;h[A>>3]=+h[z>>3]- +h[m>>3];m=d+56|0;d=g+56|0;h[d>>3]=+h[m>>3]- +h[p>>3];_l(a,c[(c[(c[b+8>>2]|0)+4>>2]|0)+12>>2]|0,g|0,e);h[l>>3]=+h[n>>3]+ +h[(c[j>>2]|0)+16>>3];h[o>>3]=+h[q>>3]+ +h[(c[j>>2]|0)+24>>3];h[r>>3]=+h[s>>3]+ +h[(c[j>>2]|0)+16>>3];h[t>>3]=+h[u>>3]+ +h[(c[j>>2]|0)+24>>3];h[v>>3]=+h[w>>3]+ +h[(c[j>>2]|0)+16>>3];h[x>>3]=+h[y>>3]+ +h[(c[j>>2]|0)+24>>3];h[z>>3]=+h[A>>3]+ +h[(c[j>>2]|0)+16>>3];h[m>>3]=+h[d>>3]+ +h[(c[j>>2]|0)+24>>3];h[(c[j>>2]|0)+96>>3]=k;i=f;return}function bm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=b+8|0;b=c[e>>2]|0;if((a[b+112|0]|0)==0){f=e;g=b}else{e=b;while(1){b=(c[e+116>>2]|0)+8|0;h=c[b>>2]|0;if((a[h+112|0]|0)==0){f=b;g=h;break}else{e=h}}}if((c[g+8>>2]|0)==0){e=jk(40)|0;c[(c[f>>2]|0)+8>>2]=e;i=c[f>>2]|0}else{i=g}g=c[i+8>>2]|0;i=c[g>>2]|0;if((i|0)==0){j=kk(((c[g+4>>2]|0)*48|0)+48|0)|0}else{j=mk(i,((c[g+4>>2]|0)*48|0)+48|0)|0}c[c[(c[f>>2]|0)+8>>2]>>2]=j;j=(c[(c[f>>2]|0)+8>>2]|0)+4|0;g=c[j>>2]|0;c[j>>2]=g+1;j=c[c[(c[f>>2]|0)+8>>2]>>2]|0;f=j+(g*48|0)|0;c[f>>2]=jk(d<<4)|0;c[j+(g*48|0)+4>>2]=d;vF(j+(g*48|0)+8|0,0,40)|0;return f|0}function cm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0.0,M=0.0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0;j=i;i=i+104|0;k=j|0;l=j+8|0;m=j+16|0;n=j+32|0;o=j+40|0;p=b;q=b+32|0;r=c[((c[p>>2]&3|0)==3?b:q)+28>>2]|0;s=Hx(r|0)|0;t=bm(b,f)|0;u=b+8|0;v=c[u>>2]|0;if((a[v+112|0]|0)==0){w=b;x=v}else{y=v;do{z=c[y+116>>2]|0;y=c[z+8>>2]|0;}while((a[y+112|0]|0)!=0);w=z;x=y}y=g+8|0;do{if((a[y]|0)==0){z=c[r+8>>2]|0;v=c[d+8>>2]|0;if((c[z+232>>2]|0)!=(c[v+232>>2]|0)){A=d;B=r;break}C=(c[z+236>>2]|0)>(c[v+236>>2]|0);A=C?r:d;B=C?d:r}else{A=d;B=r}}while(0);if((B|0)==(c[((c[w>>2]&3|0)==3?w:w+32|0)+28>>2]|0)){D=x+80|0;E=x+40|0;F=x+56|0;G=x+16|0}else{D=x+40|0;E=x+80|0;F=x+16|0;G=x+56|0}x=a[F+30|0]|0;F=c[D>>2]|0;D=c[E>>2]|0;do{if((a[G+30|0]|0)==0){H=0}else{E=B+8|0;w=c[(c[E>>2]|0)+8>>2]|0;if((w|0)==0){H=0;break}if((c[(c[w+4>>2]|0)+12>>2]|0)==0){H=0;break}c[n>>2]=B;c[n+4>>2]=D;w=f-4|0;r=m|0;d=m+8|0;C=0;while(1){if((C|0)>=(w|0)){break}v=C+3|0;h[r>>3]=+h[e+(v<<4)>>3]- +h[(c[E>>2]|0)+16>>3];h[d>>3]=+h[e+(v<<4)+8>>3]- +h[(c[E>>2]|0)+24>>3];if((Oc[c[(c[(c[(c[E>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]&255](n,m)|0)<<24>>24==0){break}else{C=v}}am(n,B,e+(C<<4)|0,1);H=C}}while(0);do{if(x<<24>>24==0){I=25}else{B=A+8|0;D=c[(c[B>>2]|0)+8>>2]|0;if((D|0)==0){I=25;break}if((c[(c[D+4>>2]|0)+12>>2]|0)==0){I=25;break}c[n>>2]=A;c[n+4>>2]=F;D=f-4|0;a:do{if((D|0)>0){G=m|0;E=m+8|0;d=D;while(1){h[G>>3]=+h[e+(d<<4)>>3]- +h[(c[B>>2]|0)+16>>3];h[E>>3]=+h[e+(d<<4)+8>>3]- +h[(c[B>>2]|0)+24>>3];r=d-3|0;if((Oc[c[(c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]|0)+12>>2]&255](n,m)|0)<<24>>24==0){J=d;break a}if((r|0)>0){d=r}else{J=r;break}}}else{J=D}}while(0);am(n,A,e+(J<<4)|0,0);K=J}}while(0);if((I|0)==25){K=f-4|0}J=f-4|0;f=H;while(1){if((f|0)>=(J|0)){break}H=f+3|0;L=+h[e+(f<<4)>>3]- +h[e+(H<<4)>>3];M=+h[e+(f<<4)+8>>3]- +h[e+(H<<4)+8>>3];if(L*L+M*M<1.0e-6){f=H}else{break}}b:do{if((K|0)>0){J=K;while(1){H=J+3|0;M=+h[e+(J<<4)>>3]- +h[e+(H<<4)>>3];L=+h[e+(J<<4)+8>>3]- +h[e+(H<<4)+8>>3];H=J-3|0;if(M*M+L*L>=1.0e-6){N=J;break b}if((H|0)>0){J=H}else{N=H;break}}}else{N=K}}while(0);K=c[(c[u>>2]|0)+116>>2]|0;if((K|0)==0){O=b}else{u=K;while(1){K=c[(c[u+8>>2]|0)+116>>2]|0;if((K|0)==0){break}else{u=K}}O=u}if((a[y]|0)==0){P=(Ec[c[g>>2]&63](O)|0)&255}else{P=0}ih(O,k,l);y=g+4|0;if((Ec[c[y>>2]&63](A)|0)<<24>>24!=0){c[l>>2]=0}if((Ec[c[y>>2]&63](c[((c[p>>2]&3|0)==3?b:q)+28>>2]|0)|0)<<24>>24!=0){c[k>>2]=0}if((P|0)!=0){P=c[k>>2]|0;c[k>>2]=c[l>>2];c[l>>2]=P}do{if((a[g+9|0]|0)==0){P=c[k>>2]|0;if((P|0)==0){Q=f}else{Q=nh(O,e,f,N,t,P)|0}P=c[l>>2]|0;if((P|0)==0){R=N;S=Q;break}R=lh(O,e,Q,N,t,P)|0;S=Q}else{P=c[l>>2]|0;q=c[k>>2]|0;if((q|P|0)==0){R=N;S=f;break}oh(O,e,f,N,t,q,P);R=N;S=f}}while(0);f=R+4|0;if((S|0)>=(f|0)){T=4-S|0;U=T+R|0;V=t+4|0;c[V>>2]=U;i=j;return}N=t|0;O=o;k=R+3|0;l=o|0;Q=o+16|0;g=o+32|0;P=o+48|0;o=s+8|0;s=S;while(1){q=(c[N>>2]|0)+(s-S<<4)|0;b=e+(s<<4)|0;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[O>>2]=c[b>>2];c[O+4>>2]=c[b+4>>2];c[O+8>>2]=c[b+8>>2];c[O+12>>2]=c[b+12>>2];b=s+1|0;if((s|0)>=(k|0)){I=54;break}q=(c[N>>2]|0)+(b-S<<4)|0;p=e+(b<<4)|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];c[Q>>2]=c[p>>2];c[Q+4>>2]=c[p+4>>2];c[Q+8>>2]=c[p+8>>2];c[Q+12>>2]=c[p+12>>2];p=s+2|0;q=(c[N>>2]|0)+(p-S<<4)|0;b=e+(p<<4)|0;c[q>>2]=c[b>>2];c[q+4>>2]=c[b+4>>2];c[q+8>>2]=c[b+8>>2];c[q+12>>2]=c[b+12>>2];c[g>>2]=c[b>>2];c[g+4>>2]=c[b+4>>2];c[g+8>>2]=c[b+8>>2];c[g+12>>2]=c[b+12>>2];b=s+3|0;q=e+(b<<4)|0;c[P>>2]=c[q>>2];c[P+4>>2]=c[q+4>>2];c[P+8>>2]=c[q+8>>2];c[P+12>>2]=c[q+12>>2];Oh((c[o>>2]|0)+16|0,l);if((b|0)<(f|0)){s=b}else{I=54;break}}if((I|0)==54){T=4-S|0;U=T+R|0;V=t+4|0;c[V>>2]=U;i=j;return}}function dm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=i;e=b;b=i;i=i+32|0;tF(b,e,32)|0;if(+h[b>>3]>=+h[b+16>>3]){i=d;return}if(+h[b+8>>3]>=+h[b+24>>3]){i=d;return}e=a+80|0;f=c[e>>2]|0;c[e>>2]=f+1;e=(c[a+84>>2]|0)+(f<<5)|0;f=b;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];c[e+16>>2]=c[f+16>>2];c[e+20>>2]=c[f+20>>2];c[e+24>>2]=c[f+24>>2];c[e+28>>2]=c[f+28>>2];i=d;return}function em(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0,Z=0,_=0,$=0,aa=0;j=i;i=i+40|0;k=j|0;l=d;m=c[l>>2]&3;n=d+32|0;o=c[((m|0)==3?d:n)+28>>2]|0;p=d+8|0;q=(c[p>>2]|0)+16|0;r=q;if((a[r+31|0]|0)!=0){wl(k,o,c[((m|0)==2?d:d-32|0)+28>>2]|0,r);r=q;q=k;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];c[r+16>>2]=c[q+16>>2];c[r+20>>2]=c[q+20>>2];c[r+24>>2]=c[q+24>>2];c[r+28>>2]=c[q+28>>2];c[r+32>>2]=c[q+32>>2];c[r+36>>2]=c[q+36>>2]}q=o+8|0;r=c[q>>2]|0;k=c[r+8>>2]|0;if((k|0)==0){s=0}else{s=c[(c[k+4>>2]|0)+16>>2]|0}k=c[p>>2]|0;t=+h[r+24>>3]+ +h[k+24>>3];m=b;u=b|0;h[u>>3]=+h[r+16>>3]+ +h[k+16>>3];k=b+8|0;h[k>>3]=t;do{if(g<<24>>24==0){r=c[p>>2]|0;if((a[r+45|0]|0)==0){a[b+29|0]=0;break}else{h[b+16>>3]=+h[r+32>>3];a[b+29|0]=1;break}}else{h[b+16>>3]=+fm(c[((c[l>>2]&3|0)==3?d:n)+28>>2]|0);a[b+29|0]=1}}while(0);c[b+80>>2]=0;c[b+88>>2]=d;b=f+32|0;c[b>>2]=c[m>>2];c[b+4>>2]=c[m+4>>2];c[b+8>>2]=c[m+8>>2];c[b+12>>2]=c[m+12>>2];m=(e|0)==1;do{if(m){if((a[(c[q>>2]|0)+156|0]|0)!=0){v=1;break}b=a[(c[p>>2]|0)+49|0]|0;n=b&255;if(b<<24>>24==0){w=47;break}t=+h[f>>3];x=+h[f+8>>3];y=+h[f+16>>3];z=+h[f+24>>3];do{if((n&4|0)==0){if((n&1|0)!=0){c[f+48>>2]=1;A=+h[k>>3];h[f+56>>3]=t;h[f+64>>3]=x;h[f+72>>3]=y;h[f+80>>3]=z>A?z:A;c[f+52>>2]=1;h[k>>3]=+h[k>>3]+-1.0;break}b=f+48|0;if((n&8|0)==0){c[b>>2]=2;l=c[q>>2]|0;A=+h[l+80>>3];if(A<0.0){B=A+-.5}else{B=A+.5}A=+h[l+24>>3]- +((~~B+1|0)/2|0|0);C=+h[k>>3];h[f+56>>3]=+h[u>>3];h[f+64>>3]=A;h[f+72>>3]=y;h[f+80>>3]=C;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+1.0;break}else{c[b>>2]=8;C=+h[u>>3];b=c[q>>2]|0;A=+h[b+80>>3];if(A<0.0){D=A+-.5}else{D=A+.5}A=+h[b+24>>3]- +((~~D+1|0)/2|0|0);E=+h[k>>3];h[f+56>>3]=t;h[f+64>>3]=A;h[f+72>>3]=C;h[f+80>>3]=E;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+-1.0;break}}else{c[f+48>>2]=4;b=c[q>>2]|0;if(+h[u>>3]<+h[b+16>>3]){E=t+-1.0;C=+h[k>>3];A=+h[b+80>>3];if(A<0.0){F=A+-.5}else{F=A+.5}A=+h[b+24>>3]+ +((~~F+1|0)/2|0|0);G=A+ +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);l=c[q>>2]|0;A=+h[l+16>>3]- +h[l+88>>3];H=+h[l+80>>3];if(H<0.0){I=H+-.5}else{I=H+.5}H=+h[l+24>>3]- +((~~I+1|0)/2|0|0);h[f+56>>3]=E;h[f+64>>3]=C;h[f+72>>3]=y;h[f+80>>3]=G;h[f+88>>3]=E;h[f+96>>3]=H;h[f+104>>3]=A;h[f+112>>3]=C}else{C=+h[k>>3];A=y+1.0;H=+h[b+80>>3];if(H<0.0){J=H+-.5}else{J=H+.5}H=+h[b+24>>3]+ +((~~J+1|0)/2|0|0);E=H+ +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);b=c[q>>2]|0;H=+h[b+16>>3]+ +h[b+96>>3]+0.0;G=+h[b+80>>3];if(G<0.0){K=G+-.5}else{K=G+.5}G=+h[b+24>>3]- +((~~K+1|0)/2|0|0);h[f+56>>3]=t;h[f+64>>3]=C;h[f+72>>3]=A;h[f+80>>3]=E;h[f+88>>3]=H;h[f+96>>3]=G;h[f+104>>3]=A;h[f+112>>3]=C}h[k>>3]=+h[k>>3]+1.0;c[f+52>>2]=2}}while(0);n=c[p>>2]|0;if((a[n+112|0]|0)==0){L=d;M=n}else{b=n;do{N=c[b+116>>2]|0;b=c[N+8>>2]|0;}while((a[b+112|0]|0)!=0);L=N;M=b}if((o|0)==(c[((c[L>>2]&3|0)==3?L:L+32|0)+28>>2]|0)){a[M+46|0]=0;i=j;return}else{a[M+86|0]=0;i=j;return}}else{w=47}}while(0);do{if((w|0)==47){do{if((e|0)==2){M=a[(c[p>>2]|0)+49|0]|0;L=M&255;if(M<<24>>24==0){break}K=+h[f>>3];J=+h[f+8>>3];I=+h[f+16>>3];F=+h[f+24>>3];do{if((L&4|0)==0){if((L&1|0)!=0){if((c[f+48>>2]|0)==4){M=c[q>>2]|0;D=+h[M+80>>3];if(D<0.0){O=D+-.5}else{O=D+.5}D=+h[M+24>>3]- +((~~O+1|0)/2|0|0);B=I+1.0;t=+h[u>>3];y=D- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);M=c[q>>2]|0;z=+h[M+16>>3]+ +h[M+96>>3]+0.0;x=+h[M+80>>3];if(x<0.0){P=x+-.5}else{P=x+.5}x=+h[M+24>>3]+ +((~~P+1|0)/2|0|0);h[f+56>>3]=t;h[f+64>>3]=y;h[f+72>>3]=B;h[f+80>>3]=D;h[f+88>>3]=z;h[f+96>>3]=D;h[f+104>>3]=B;h[f+112>>3]=x;c[f+52>>2]=2}else{x=+h[k>>3];h[f+56>>3]=K;h[f+64>>3]=J;h[f+72>>3]=I;h[f+80>>3]=F>x?F:x;c[f+52>>2]=1}h[k>>3]=+h[k>>3]+-1.0;break}x=+h[u>>3];if((L&8|0)==0){M=c[q>>2]|0;B=+h[M+24>>3];D=+h[M+80>>3];M=D>=0.0;if((c[f+48>>2]|0)==4){if(M){Q=D+.5}else{Q=D+-.5}R=+h[k>>3];S=B+ +((~~Q+1|0)/2|0|0)}else{if(M){T=D+.5}else{T=D+-.5}R=B- +((~~T+1|0)/2|0|0);S=+h[k>>3]+1.0}h[f+56>>3]=x;h[f+64>>3]=R;h[f+72>>3]=I;h[f+80>>3]=S;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+1.0;break}else{B=x+1.0;M=c[q>>2]|0;x=+h[M+24>>3];D=+h[M+80>>3];M=D>=0.0;if((c[f+48>>2]|0)==4){if(M){U=D+.5}else{U=D+-.5}V=+h[k>>3]+-1.0;W=x+ +((~~U+1|0)/2|0|0)}else{if(M){X=D+.5}else{X=D+-.5}V=x- +((~~X+1|0)/2|0|0);W=+h[k>>3]+1.0}h[f+56>>3]=K;h[f+64>>3]=V;h[f+72>>3]=B;h[f+80>>3]=W;c[f+52>>2]=1;h[u>>3]=+h[u>>3]+-1.0;break}}else{B=+h[k>>3];h[f+56>>3]=K;h[f+64>>3]=J<B?J:B;h[f+72>>3]=I;h[f+80>>3]=F;c[f+52>>2]=1;h[k>>3]=+h[k>>3]+1.0}}while(0);M=c[p>>2]|0;if((a[M+112|0]|0)==0){Y=d;Z=M}else{N=M;do{_=c[N+116>>2]|0;N=c[_+8>>2]|0;}while((a[N+112|0]|0)!=0);Y=_;Z=N}if((o|0)==(c[((c[Y>>2]&3|0)==3?Y:Y+32|0)+28>>2]|0)){a[Z+46|0]=0}else{a[Z+86|0]=0}c[f+48>>2]=L;i=j;return}}while(0);if(m){v=1;break}v=c[f+48>>2]|0}}while(0);do{if((s|0)==0){$=f+56|0;aa=f+52|0}else{m=f+56|0;Z=f+52|0;Y=Gc[s&127](o,(c[p>>2]|0)+16|0,v,m,Z)|0;if((Y|0)==0){$=m;aa=Z;break}c[f+48>>2]=Y;i=j;return}}while(0);v=$;$=f;c[v>>2]=c[$>>2];c[v+4>>2]=c[$+4>>2];c[v+8>>2]=c[$+8>>2];c[v+12>>2]=c[$+12>>2];c[v+16>>2]=c[$+16>>2];c[v+20>>2]=c[$+20>>2];c[v+24>>2]=c[$+24>>2];c[v+28>>2]=c[$+28>>2];c[aa>>2]=1;if((e|0)==8){cc(115336,154560,571,171032)}else if((e|0)==2){W=+h[k>>3];if((c[f+48>>2]|0)==4){h[f+64>>3]=W;i=j;return}else{h[f+80>>3]=W;i=j;return}}else if((e|0)==1){h[f+80>>3]=+h[k>>3];c[f+48>>2]=1;h[k>>3]=+h[k>>3]+-1.0;i=j;return}else{i=j;return}}function fm(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0,i=0.0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0;b=c[a+8>>2]|0;a=c[b+172>>2]|0;d=c[a>>2]|0;if((d|0)==0){e=0.0;f=0.0}else{g=0;i=0.0;j=d;do{i=i+ +h[(c[(c[((c[j>>2]&3|0)==3?j:j+32|0)+28>>2]|0)+8>>2]|0)+16>>3];g=g+1|0;j=c[a+(g<<2)>>2]|0;}while((j|0)!=0);e=+(g|0);f=i}g=c[b+180>>2]|0;j=c[g>>2]|0;if((j|0)==0){k=0.0;l=0.0;m=0}else{a=0;i=0.0;n=j;do{i=i+ +h[(c[(c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0)+8>>2]|0)+16>>3];a=a+1|0;n=c[g+(a<<2)>>2]|0;}while((n|0)!=0);k=+(a|0);l=i;m=j}i=+h[b+16>>3];o=+h[b+24>>3];p=+$(+(o- +h[(c[(c[((c[d>>2]&3|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0)+24>>3]),+(i-f/e));return+((p+ +$(+(+h[(c[(c[((c[m>>2]&3|0)==2?m:m-32|0)+28>>2]|0)+8>>2]|0)+24>>3]-o),+(l/k-i)))*.5)}function gm(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0,L=0,M=0,N=0.0,O=0.0,P=0.0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0.0,W=0.0,X=0,Y=0,Z=0,_=0,$=0;j=i;i=i+40|0;k=j|0;l=d;m=c[l>>2]&3;n=d-32|0;o=c[((m|0)==2?d:n)+28>>2]|0;p=d+8|0;q=(c[p>>2]|0)+56|0;r=q;if((a[r+31|0]|0)!=0){wl(k,o,c[((m|0)==3?d:d+32|0)+28>>2]|0,r);r=q;q=k;c[r>>2]=c[q>>2];c[r+4>>2]=c[q+4>>2];c[r+8>>2]=c[q+8>>2];c[r+12>>2]=c[q+12>>2];c[r+16>>2]=c[q+16>>2];c[r+20>>2]=c[q+20>>2];c[r+24>>2]=c[q+24>>2];c[r+28>>2]=c[q+28>>2];c[r+32>>2]=c[q+32>>2];c[r+36>>2]=c[q+36>>2]}q=o+8|0;r=c[q>>2]|0;k=c[r+8>>2]|0;if((k|0)==0){s=0}else{s=c[(c[k+4>>2]|0)+16>>2]|0}k=b+40|0;m=c[p>>2]|0;t=+h[r+24>>3]+ +h[m+64>>3];u=k;h[b+40>>3]=+h[r+16>>3]+ +h[m+56>>3];m=b+48|0;h[m>>3]=t;do{if(g<<24>>24==0){r=c[p>>2]|0;if((a[r+85|0]|0)==0){a[b+69|0]=0;break}else{h[b+56>>3]=+h[r+72>>3];a[b+69|0]=1;break}}else{t=+fm(c[((c[l>>2]&3|0)==2?d:n)+28>>2]|0)+3.141592653589793;h[b+56>>3]=t;if(t<6.283185307179586){a[b+69|0]=1;break}else{cc(126168,154560,608,170720)}}}while(0);n=f+32|0;c[n>>2]=c[u>>2];c[n+4>>2]=c[u+4>>2];c[n+8>>2]=c[u+8>>2];c[n+12>>2]=c[u+12>>2];u=(e|0)==1;do{if(u){if((a[(c[q>>2]|0)+156|0]|0)!=0){v=4;break}n=a[(c[p>>2]|0)+89|0]|0;l=n&255;if(n<<24>>24==0){w=50;break}t=+h[f>>3];x=+h[f+8>>3];y=+h[f+16>>3];do{if((l&4|0)==0){if((l&1|0)==0){n=f+48|0;if((l&8|0)==0){c[n>>2]=2;g=k|0;r=c[q>>2]|0;z=+h[r+80>>3];if(z<0.0){A=z+-.5}else{A=z+.5}z=+h[r+24>>3]+ +((~~A+1|0)/2|0|0);B=+h[m>>3];h[f+56>>3]=+h[g>>3];h[f+64>>3]=B;h[f+72>>3]=y;h[f+80>>3]=z;c[f+52>>2]=1;h[g>>3]=+h[g>>3]+1.0;break}else{c[n>>2]=8;n=k|0;z=+h[n>>3];g=c[q>>2]|0;B=+h[g+80>>3];if(B<0.0){C=B+-.5}else{C=B+.5}B=+h[g+24>>3]+ +((~~C+1|0)/2|0|0);D=+h[m>>3];h[f+56>>3]=t;h[f+64>>3]=D;h[f+72>>3]=z;h[f+80>>3]=B;c[f+52>>2]=1;h[n>>3]=+h[n>>3]+-1.0;break}}c[f+48>>2]=1;n=c[q>>2]|0;if(+h[k>>3]<+h[n+16>>3]){B=t+-1.0;z=+h[m>>3];D=+h[n+80>>3];if(D<0.0){E=D+-.5}else{E=D+.5}D=+h[n+24>>3]- +((~~E+1|0)/2|0|0);F=D- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);g=c[q>>2]|0;D=+h[g+16>>3]- +h[g+88>>3];G=+h[g+80>>3];if(G<0.0){H=G+-.5}else{H=G+.5}G=+h[g+24>>3]+ +((~~H+1|0)/2|0|0);h[f+56>>3]=B;h[f+64>>3]=F;h[f+72>>3]=y;h[f+80>>3]=z;h[f+88>>3]=B;h[f+96>>3]=z;h[f+104>>3]=D;h[f+112>>3]=G}else{G=+h[m>>3];D=y+1.0;z=+h[n+80>>3];if(z<0.0){I=z+-.5}else{I=z+.5}z=+h[n+24>>3]- +((~~I+1|0)/2|0|0);B=z- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);n=c[q>>2]|0;z=+h[n+16>>3]+ +h[n+96>>3]+0.0;F=+h[n+80>>3];if(F<0.0){J=F+-.5}else{J=F+.5}F=+h[n+24>>3]+ +((~~J+1|0)/2|0|0);h[f+56>>3]=t;h[f+64>>3]=B;h[f+72>>3]=D;h[f+80>>3]=G;h[f+88>>3]=z;h[f+96>>3]=G;h[f+104>>3]=D;h[f+112>>3]=F}c[f+52>>2]=2;h[m>>3]=+h[m>>3]+-1.0}else{F=+h[f+24>>3];c[f+48>>2]=4;D=+h[m>>3];h[f+56>>3]=t;h[f+64>>3]=x<D?x:D;h[f+72>>3]=y;h[f+80>>3]=F;c[f+52>>2]=1;h[m>>3]=+h[m>>3]+1.0}}while(0);n=c[p>>2]|0;if((a[n+112|0]|0)==0){K=d;L=n}else{g=n;do{M=c[g+116>>2]|0;g=c[M+8>>2]|0;}while((a[g+112|0]|0)!=0);K=M;L=g}if((o|0)==(c[((c[K>>2]&3|0)==2?K:K-32|0)+28>>2]|0)){a[L+86|0]=0}else{a[L+46|0]=0}c[f+48>>2]=l;i=j;return}else{w=50}}while(0);do{if((w|0)==50){do{if((e|0)==2){L=a[(c[p>>2]|0)+89|0]|0;K=L&255;if(L<<24>>24==0){break}J=+h[f>>3];I=+h[f+8>>3];H=+h[f+16>>3];E=+h[f+24>>3];do{if((K&4|0)==0){if((K&1|0)!=0){if((c[f+48>>2]|0)==4){C=J+-1.0;L=c[q>>2]|0;A=+h[L+80>>3];if(A<0.0){N=A+-.5}else{N=A+.5}A=+h[L+24>>3]- +((~~N+1|0)/2|0|0);y=+h[k>>3];x=A- +((c[(c[(Hx(o|0)|0)+8>>2]|0)+240>>2]|0)/2|0|0);L=c[q>>2]|0;t=+h[L+16>>3]- +h[L+88>>3]+-2.0;F=+h[L+80>>3];if(F<0.0){O=F+-.5}else{O=F+.5}F=+h[L+24>>3]+ +((~~O+1|0)/2|0|0);h[f+56>>3]=C;h[f+64>>3]=x;h[f+72>>3]=y;h[f+80>>3]=A;h[f+88>>3]=C;h[f+96>>3]=A;h[f+104>>3]=t;h[f+112>>3]=F;c[f+52>>2]=2}else{F=+h[b+8>>3];h[f+56>>3]=J;h[f+64>>3]=I;h[f+72>>3]=H;h[f+80>>3]=E>F?E:F;c[f+52>>2]=1}h[m>>3]=+h[m>>3]+-1.0;break}L=k|0;F=+h[L>>3];if((K&8|0)==0){t=F+-1.0;M=c[q>>2]|0;A=+h[M+24>>3];C=+h[M+80>>3];M=C>=0.0;if((c[f+48>>2]|0)==4){if(M){P=C+.5}else{P=C+-.5}Q=+h[m>>3]+-1.0;R=A+ +((~~P+1|0)/2|0|0)}else{if(M){S=C+.5}else{S=C+-.5}Q=A- +((~~S+1|0)/2|0|0);R=+h[m>>3]}h[f+56>>3]=t;h[f+64>>3]=Q;h[f+72>>3]=H;h[f+80>>3]=R;c[f+52>>2]=1;h[L>>3]=+h[L>>3]+1.0;break}else{t=F+1.0;M=c[q>>2]|0;F=+h[M+24>>3];A=+h[M+80>>3];M=A>=0.0;if((c[f+48>>2]|0)==4){if(M){T=A+.5}else{T=A+-.5}U=+h[m>>3]+-1.0;V=F+ +((~~T+1|0)/2|0|0)}else{if(M){W=A+.5}else{W=A+-.5}U=F- +((~~W+1|0)/2|0|0);V=+h[m>>3]+1.0}h[f+56>>3]=J;h[f+64>>3]=U;h[f+72>>3]=t;h[f+80>>3]=V;c[f+52>>2]=1;h[L>>3]=+h[L>>3]+-1.0;break}}else{t=+h[m>>3];h[f+56>>3]=J;h[f+64>>3]=I<t?I:t;h[f+72>>3]=H;h[f+80>>3]=E;c[f+52>>2]=1;h[m>>3]=+h[m>>3]+1.0}}while(0);L=c[p>>2]|0;if((a[L+112|0]|0)==0){X=d;Y=L}else{M=L;do{Z=c[M+116>>2]|0;M=c[Z+8>>2]|0;}while((a[M+112|0]|0)!=0);X=Z;Y=M}if((o|0)==(c[((c[X>>2]&3|0)==2?X:X-32|0)+28>>2]|0)){a[Y+86|0]=0}else{a[Y+46|0]=0}c[f+48>>2]=K;i=j;return}}while(0);if(u){v=4;break}v=c[f+48>>2]|0}}while(0);do{if((s|0)==0){_=f+56|0;$=f+52|0}else{u=f+56|0;Y=f+52|0;X=Gc[s&127](o,(c[p>>2]|0)+56|0,v,u,Y)|0;if((X|0)==0){_=u;$=Y;break}c[f+48>>2]=X;i=j;return}}while(0);v=_;_=f;c[v>>2]=c[_>>2];c[v+4>>2]=c[_+4>>2];c[v+8>>2]=c[_+8>>2];c[v+12>>2]=c[_+12>>2];c[v+16>>2]=c[_+16>>2];c[v+20>>2]=c[_+20>>2];c[v+24>>2]=c[_+24>>2];c[v+28>>2]=c[_+28>>2];c[$>>2]=1;if((e|0)==8){cc(115336,154560,767,170720)}else if((e|0)==2){V=+h[m>>3];if((c[f+48>>2]|0)==4){h[f+64>>3]=V;i=j;return}else{h[f+80>>3]=V;i=j;return}}else if((e|0)==1){h[f+64>>3]=+h[m>>3];c[f+48>>2]=4;h[m>>3]=+h[m>>3]+1.0;i=j;return}else{i=j;return}}function hm(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0;d=c[b+8>>2]|0;e=c[d+96>>2]|0;if((a[d+44|0]|0)==0){if((a[d+84|0]|0)!=0){f=3}}else{f=3}do{if((f|0)==3){g=a[d+49|0]|0;i=g&255;if((i&8|0)!=0){j=0;return j|0}k=a[d+89|0]|0;if((k&8)!=0){j=0;return j|0}if(g<<24>>24!=k<<24>>24){break}if((i&5|0)==0){break}else{j=0}return j|0}}while(0);if((e|0)==0){j=18;return j|0}d=(c[(c[(Hx(c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;j=~~(+h[(d?e+24|0:e+32|0)>>3]+18.0);return j|0}function im(b,d,e,f,g,j,k){b=b|0;d=d|0;e=e|0;f=f|0;g=+g;j=+j;k=k|0;var l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0,A=0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0.0,M=0,N=0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0.0,aa=0.0,ba=0,ca=0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0,la=0.0,ma=0,na=0,oa=0,pa=0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0,va=0,wa=0.0;b=i;i=i+16e3|0;l=b|0;m=c[d+(e<<2)>>2]|0;n=c[m+8>>2]|0;do{if((a[n+44|0]|0)==0){if((a[n+84|0]|0)!=0){o=4;break}p=a[n+49|0]|0;q=a[n+89|0]|0}else{o=4}}while(0);a:do{if((o|0)==4){r=n+16|0;s=a[r+33|0]|0;t=s&255;u=(t&8|0)==0;do{if(u){v=a[n+89|0]|0;if((v&8)==0){if(s<<24>>24!=v<<24>>24){p=s;q=v;break a}if((t&5|0)==0){p=s;q=s;break a}if(!u){break}}v=n+56|0;w=a[v+33|0]|0;if((w&8)!=0){break}if((t&4|0)!=0){jm(d,e,f,g,j,k);i=b;return}if((t&1|0)==0){cc(115336,154560,1233,170392)}x=g*.5/+(f|0);y=x>2.0?x:2.0;z=(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0)+8|0;A=c[z>>2]|0;x=+h[A+16>>3];B=+h[A+24>>3];C=x+ +h[r>>3];D=B+ +h[n+24>>3];E=x+ +h[v>>3];x=B+ +h[n+64>>3];v=C<E?-1:1;F=+h[A+80>>3]*.5;A=w&255;w=0;while(1){G=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(A|0)){H=w;break}if((G|0)<8){w=G}else{H=-1;break}}w=0;while(1){A=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(t|0)){o=56;break}if((A|0)<8){w=A}else{I=0;break}}do{if((o|0)==56){if((w|H|0)<0){I=0;break}I=(c[40032+(w<<5)+(H<<2)>>2]|0)==67}}while(0);J=(D+F-B)*3.0;K=(x+F-B)*3.0;if((f|0)<=0){i=b;return}L=y*+((I?-v|0:v)|0);w=l|0;A=l|0;G=l+8|0;M=l+16|0;N=l+24|0;O=l+32|0;P=l+40|0;Q=(C+E)*.5;R=l+48|0;S=l+56|0;T=l+64|0;U=l+72|0;V=l+80|0;W=l+88|0;X=l+96|0;Y=l+104|0;Z=1;_=e;$=F<K?F:K;K=F<J?F:J;J=0.0;aa=F;ba=m;while(1){ca=_+1|0;da=aa+j;ea=K+j;fa=$+j;ga=L+J;h[A>>3]=C;h[G>>3]=D;ha=C+ga;h[M>>3]=ha;h[N>>3]=D-ea/3.0;ia=B-da;h[O>>3]=ha;h[P>>3]=ia;h[R>>3]=Q;h[S>>3]=ia;ha=E-ga;h[T>>3]=ha;h[U>>3]=ia;h[V>>3]=ha;h[W>>3]=x-fa/3.0;h[X>>3]=E;h[Y>>3]=x;ja=ba+8|0;ka=ba;do{if((c[(c[ja>>2]|0)+96>>2]|0)==0){la=da}else{ma=(c[(c[(Hx(c[((c[ka>>2]&3|0)==3?ba:ba+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;na=c[(c[ja>>2]|0)+96>>2]|0;ha=+h[(ma?na+32|0:na+24|0)>>3];h[na+64>>3]=+h[(c[z>>2]|0)+24>>3]-da-ha*.5;h[(c[(c[ja>>2]|0)+96>>2]|0)+56>>3]=+h[(c[z>>2]|0)+16>>3];a[(c[(c[ja>>2]|0)+96>>2]|0)+81|0]=1;if(ha<=j){la=da;break}la=da+(ha-j)}}while(0);cm(ba,c[((c[ka>>2]&3|0)==2?ba:ba-32|0)+28>>2]|0,w,7,k);if((Z|0)>=(f|0)){break}Z=Z+1|0;_=ca;$=fa;K=ea;J=ga;aa=la;ba=c[d+(ca<<2)>>2]|0}i=b;return}}while(0);do{if((s&2)==0){u=n+56|0;ba=a[u+33|0]|0;if((ba&2)!=0){break}aa=j*.5/+(f|0);J=aa>2.0?aa:2.0;_=(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0)+8|0;Z=c[_>>2]|0;aa=+h[Z+16>>3];K=+h[Z+24>>3];$=aa+ +h[r>>3];x=K+ +h[n+24>>3];E=aa+ +h[u>>3];Q=K+ +h[n+64>>3];u=x<Q?-1:1;K=+h[Z+88>>3];Z=ba&255;ba=0;while(1){w=ba+1|0;if((c[4e4+(ba<<2)>>2]|0)==(Z|0)){oa=ba;break}if((w|0)<8){ba=w}else{oa=-1;break}}ba=0;while(1){Z=ba+1|0;if((c[4e4+(ba<<2)>>2]|0)==(t|0)){o=36;break}if((Z|0)<8){ba=Z}else{pa=u;break}}do{if((o|0)==36){if((ba|oa|0)<0){pa=u;break}Z=c[40032+(ba<<5)+(oa<<2)>>2]|0;if(!((Z|0)==12|(Z|0)==67)){pa=u;break}if(x!=Q){pa=u;break}pa=-u|0}}while(0);B=($+K-aa)*3.0;D=(E+K-aa)*3.0;if((f|0)<=0){i=b;return}C=J*+(pa|0);u=l|0;ba=l|0;Z=l+8|0;w=l+16|0;z=l+24|0;Y=l+32|0;X=l+40|0;L=(x+Q)*.5;W=l+48|0;V=l+56|0;U=l+64|0;T=l+72|0;S=l+80|0;R=l+88|0;P=l+96|0;O=l+104|0;F=K<D?K:D;D=K<B?K:B;B=K;y=0.0;N=1;M=e;G=m;while(1){A=M+1|0;da=B+g;ha=D+g;ia=F+g;qa=C+y;h[ba>>3]=$;h[Z>>3]=x;ra=x+qa;h[w>>3]=$-ha/3.0;h[z>>3]=ra;sa=aa-da;h[Y>>3]=sa;h[X>>3]=ra;h[W>>3]=sa;h[V>>3]=L;ra=Q-qa;h[U>>3]=sa;h[T>>3]=ra;h[S>>3]=E-ia/3.0;h[R>>3]=ra;h[P>>3]=E;h[O>>3]=Q;v=G+8|0;ja=G;do{if((c[(c[v>>2]|0)+96>>2]|0)==0){ta=da}else{na=(c[(c[(Hx(c[((c[ja>>2]&3|0)==3?G:G+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;ma=c[(c[v>>2]|0)+96>>2]|0;ra=+h[(na?ma+24|0:ma+32|0)>>3];h[ma+56>>3]=+h[(c[_>>2]|0)+16>>3]-da-ra*.5;h[(c[(c[v>>2]|0)+96>>2]|0)+64>>3]=+h[(c[_>>2]|0)+24>>3];a[(c[(c[v>>2]|0)+96>>2]|0)+81|0]=1;if(ra<=g){ta=da;break}ta=da+(ra-g)}}while(0);cm(G,c[((c[ja>>2]&3|0)==2?G:G-32|0)+28>>2]|0,u,7,k);if((N|0)>=(f|0)){break}F=ia;D=ha;B=ta;y=qa;N=N+1|0;M=A;G=c[d+(A<<2)>>2]|0}i=b;return}}while(0);jm(d,e,f,g,j,k);i=b;return}}while(0);ta=j*.5/+(f|0);j=ta>2.0?ta:2.0;pa=(c[((c[m>>2]&3|0)==3?m:m+32|0)+28>>2]|0)+8|0;oa=c[pa>>2]|0;ta=+h[oa+16>>3];la=+h[oa+24>>3];y=ta+ +h[n+16>>3];B=la+ +h[n+24>>3];D=ta+ +h[n+56>>3];F=la+ +h[n+64>>3];n=B<F?-1:1;la=+h[oa+96>>3];oa=p&255;p=q&255;q=0;while(1){I=q+1|0;if((c[4e4+(q<<2)>>2]|0)==(p|0)){ua=q;break}if((I|0)<8){q=I}else{ua=-1;break}}q=0;while(1){p=q+1|0;if((c[4e4+(q<<2)>>2]|0)==(oa|0)){o=14;break}if((p|0)<8){q=p}else{va=n;break}}do{if((o|0)==14){if((q|ua|0)<0){va=n;break}oa=c[40032+(q<<5)+(ua<<2)>>2]|0;if(!((oa|0)==32|(oa|0)==65)){va=n;break}if(B!=F){va=n;break}va=-n|0}}while(0);Q=ta+la;E=(Q-y)*3.0;L=(Q-D)*3.0;if((f|0)<=0){i=b;return}Q=j*+(va|0);va=l|0;n=l|0;ua=l+8|0;q=l+16|0;o=l+24|0;oa=l+32|0;p=l+40|0;j=(B+F)*.5;I=l+48|0;H=l+56|0;t=l+64|0;r=l+72|0;s=l+80|0;G=l+88|0;M=l+96|0;N=l+104|0;aa=la<L?la:L;L=la<E?la:E;E=la;la=0.0;l=1;u=e;e=m;while(1){m=u+1|0;$=E+g;x=L+g;C=aa+g;K=Q+la;h[n>>3]=y;h[ua>>3]=B;J=B+K;h[q>>3]=y+x/3.0;h[o>>3]=J;da=ta+$;h[oa>>3]=da;h[p>>3]=J;h[I>>3]=da;h[H>>3]=j;J=F-K;h[t>>3]=da;h[r>>3]=J;h[s>>3]=D+C/3.0;h[G>>3]=J;h[M>>3]=D;h[N>>3]=F;_=e+8|0;O=e;do{if((c[(c[_>>2]|0)+96>>2]|0)==0){wa=$}else{P=(c[(c[(Hx(c[((c[O>>2]&3|0)==3?e:e+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;R=c[(c[_>>2]|0)+96>>2]|0;J=+h[(P?R+24|0:R+32|0)>>3];h[R+56>>3]=J*.5+($+ +h[(c[pa>>2]|0)+16>>3]);h[(c[(c[_>>2]|0)+96>>2]|0)+64>>3]=+h[(c[pa>>2]|0)+24>>3];a[(c[(c[_>>2]|0)+96>>2]|0)+81|0]=1;if(J<=g){wa=$;break}wa=$+(J-g)}}while(0);cm(e,c[((c[O>>2]&3|0)==2?e:e-32|0)+28>>2]|0,va,7,k);if((l|0)>=(f|0)){break}aa=C;L=x;E=wa;la=K;l=l+1|0;u=m;e=c[d+(m<<2)>>2]|0}i=b;return}function jm(b,e,f,g,j,k){b=b|0;e=e|0;f=f|0;g=+g;j=+j;k=k|0;var l=0,m=0,n=0,o=0.0,p=0,q=0,r=0.0,s=0,t=0,u=0.0,v=0.0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0.0,Y=0,Z=0;l=i;i=i+16e3|0;m=l|0;n=c[b+(e<<2)>>2]|0;o=g*.5/+(f|0);g=o>2.0?o:2.0;p=(c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0)+8|0;q=c[p>>2]|0;o=+h[q+16>>3];r=+h[q+24>>3];s=c[n+8>>2]|0;t=s+16|0;u=o+ +h[t>>3];v=r+ +h[s+24>>3];w=s+56|0;x=o+ +h[w>>3];y=r+ +h[s+64>>3];z=u<x?-1.0:1.0;A=+h[q+80>>3]*.5;s=d[t+33|0]|0;t=d[w+33|0]|0;w=0;while(1){B=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(t|0)){C=w;break}if((B|0)<8){w=B}else{C=-1;break}}w=0;while(1){t=w+1|0;if((c[4e4+(w<<2)>>2]|0)==(s|0)){D=7;break}if((t|0)<8){w=t}else{E=0.0;break}}a:do{if((D|0)==7){if((w|C|0)<0){E=0.0;break}switch(c[40032+(w<<5)+(C<<2)>>2]|0){case 74:case 75:case 85:{E=z*(g*2.0+(+h[q+88>>3]-(o-u)+(+h[q+96>>3]-(x-o)))*.5);break a;break};case 41:{E=z*(g+(+h[q+96>>3]-(u-o)));break a;break};case 83:{E=z*(+h[q+88>>3]-(o-u));break a;break};case 15:{E=z*(g+(+h[q+96>>3]-(x-o)));break a;break};case 48:{E=z*(g+(+h[q+96>>3]-(u-o)));break a;break};case 14:case 37:case 47:case 51:case 57:case 58:{E=z*((+h[q+88>>3]-(o-u)+(+h[q+96>>3]-(x-o)))/3.0);break a;break};case 84:{E=z*(g+(+h[q+88>>3]-(o-u)+(+h[q+96>>3]-(x-o)))*.5);break a;break};case 38:{E=z*(g+(+h[q+88>>3]-(o-x)));break a;break};case 73:{E=z*(g+(+h[q+88>>3]-(o-u)));break a;break};default:{E=0.0;break a}}}}while(0);o=r+A;F=(o-v)*3.0;G=(o-y)*3.0;if((f|0)<=0){i=l;return}o=g*z;q=m|0;C=m|0;w=m+8|0;D=m+16|0;s=m+24|0;t=m+32|0;B=m+40|0;z=(u+x)*.5;H=m+48|0;I=m+56|0;J=m+64|0;K=m+72|0;L=m+80|0;M=m+88|0;N=m+96|0;O=m+104|0;g=A<G?A:G;G=A<F?A:F;F=E;E=A;m=1;P=e;e=n;while(1){n=P+1|0;A=E+j;Q=G+j;R=g+j;S=o+F;h[C>>3]=u;h[w>>3]=v;T=u+S;h[D>>3]=T;h[s>>3]=v+Q/3.0;U=r+A;h[t>>3]=T;h[B>>3]=U;h[H>>3]=z;h[I>>3]=U;T=x-S;h[J>>3]=T;h[K>>3]=U;h[L>>3]=T;h[M>>3]=y+R/3.0;h[N>>3]=x;h[O>>3]=y;V=e+8|0;W=e;do{if((c[(c[V>>2]|0)+96>>2]|0)==0){X=A}else{Y=(c[(c[(Hx(c[((c[W>>2]&3|0)==3?e:e+32|0)+28>>2]|0)|0)+8>>2]|0)+116>>2]&1|0)==0;Z=c[(c[V>>2]|0)+96>>2]|0;T=+h[(Y?Z+32|0:Z+24|0)>>3];h[Z+64>>3]=T*.5+(A+ +h[(c[p>>2]|0)+24>>3]);h[(c[(c[V>>2]|0)+96>>2]|0)+56>>3]=+h[(c[p>>2]|0)+16>>3];a[(c[(c[V>>2]|0)+96>>2]|0)+81|0]=1;if(T<=j){X=A;break}X=A+(T-j)}}while(0);cm(e,c[((c[W>>2]&3|0)==2?e:e-32|0)+28>>2]|0,q,7,k);if((m|0)>=(f|0)){break}g=R;G=Q;F=S;E=X;m=m+1|0;P=n;e=c[b+(n<<2)>>2]|0}i=l;return}function km(b){b=b|0;var d=0,e=0,f=0;if(!((c[53786]|0)!=0|(c[53784]|0)!=0)){return}d=b+8|0;e=c[(c[d>>2]|0)+100>>2]|0;do{if((e|0)!=0){if((a[e+81|0]|0)!=0){break}if((lm(b,1)|0)==0){break}f=Hx(c[((c[b>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;_m(f,c[(c[d>>2]|0)+100>>2]|0)}}while(0);e=c[(c[d>>2]|0)+104>>2]|0;if((e|0)==0){return}if((a[e+81|0]|0)!=0){return}if((lm(b,0)|0)==0){return}e=Hx(c[((c[b>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;_m(e,c[(c[d>>2]|0)+104>>2]|0);return}function lm(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0;e=i;i=i+96|0;f=e|0;g=e+64|0;j=e+80|0;k=b+8|0;if((a[(c[k>>2]|0)+112|0]|0)==6){l=0;i=e;return l|0}m=c[53786]|0;if((m|0)==0){n=4}else{if((a[fw(b|0,m)|0]|0)==0){n=4}}do{if((n|0)==4){m=c[53784]|0;if((m|0)==0){l=0;i=e;return l|0}if((a[fw(b|0,m)|0]|0)==0){l=0}else{break}i=e;return l|0}}while(0);n=d<<24>>24==0;d=c[k>>2]|0;if(n){o=d+104|0}else{o=d+100|0}k=c[o>>2]|0;o=c[d+8>>2]|0;a:do{if((o|0)==0){m=d;while(1){if((a[m+112|0]|0)==0){break}p=c[(c[m+116>>2]|0)+8>>2]|0;q=c[p+8>>2]|0;if((q|0)==0){m=p}else{r=q;break a}}m=b;q=$w(c[((c[m>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;p=$w(c[((c[m>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;Fv(1,114544,(m=i,i=i+16|0,c[m>>2]=q,c[m+8>>2]=p,m)|0)|0;i=m;l=0;i=e;return l|0}else{r=o}}while(0);do{if(n){o=c[r>>2]|0;if((c[o+8>>2]|0)==0){d=o|0;m=c[d>>2]|0;s=+h[m>>3];t=+h[m+8>>3];p=f;q=m;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];q=f+16|0;p=(c[d>>2]|0)+16|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];p=f+32|0;q=(c[d>>2]|0)+32|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];q=f+48|0;p=(c[d>>2]|0)+48|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];Qm(g,f|0,3,.1,0,0);u=+h[g>>3];v=+h[g+8>>3];w=s;x=t;break}else{p=c[o>>2]|0;u=+h[p>>3];v=+h[p+8>>3];w=+h[o+16>>3];x=+h[o+24>>3];break}}else{o=(c[r+4>>2]|0)-1|0;p=c[r>>2]|0;q=p+(o*48|0)|0;if((c[p+(o*48|0)+12>>2]|0)==0){d=p+(o*48|0)+4|0;m=c[d>>2]|0;y=m-1|0;z=q|0;A=c[z>>2]|0;t=+h[A+(y<<4)>>3];s=+h[A+(y<<4)+8>>3];y=f;B=A+(m-4<<4)|0;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];B=f+16|0;y=(c[z>>2]|0)+((c[d>>2]|0)-3<<4)|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];y=f+32|0;B=(c[z>>2]|0)+((c[d>>2]|0)-2<<4)|0;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];B=f+48|0;y=(c[z>>2]|0)+((c[d>>2]|0)-1<<4)|0;c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];Qm(j,f|0,3,.9,0,0);u=+h[j>>3];v=+h[j+8>>3];w=t;x=s;break}else{y=(c[p+(o*48|0)+4>>2]|0)-1|0;B=c[q>>2]|0;u=+h[B+(y<<4)>>3];v=+h[B+(y<<4)+8>>3];w=+h[p+(o*48|0)+32>>3];x=+h[p+(o*48|0)+40>>3];break}}}while(0);s=+$(+(v-x),+(u-w));j=b|0;u=s+ +Fm(j,c[53786]|0,-25.0,-180.0)/180.0*3.141592653589793;s=+Fm(j,c[53784]|0,1.0,0.0)*10.0;h[k+56>>3]=w+s*+V(u);h[k+64>>3]=x+s*+W(u);a[k+81|0]=1;l=1;i=e;return l|0}function mm(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0;f=i;i=i+32|0;g=f|0;j=f+16|0;k=b[(c[d+8>>2]|0)+128>>1]&14;d=(c[e+8>>2]|0)+8|0;e=c[d>>2]|0;l=c[e>>2]|0;m=c[l>>2]|0;if((c[l+8>>2]|0)==0){n=m|0;o=m+8|0}else{n=l+16|0;o=l+24|0}p=+h[n>>3];q=+h[o>>3];o=c[e+4>>2]|0;e=o-1|0;n=l+(e*48|0)+16|0;if((c[l+(e*48|0)+12>>2]|0)==0){r=c[l+(e*48|0)>>2]|0;s=(c[l+(e*48|0)+4>>2]|0)-1|0;t=r+(s<<4)|0;u=r+(s<<4)+8|0}else{t=n+16|0;u=n+24|0}v=+h[t>>3];w=+h[u>>3];x=p-v;y=q-w;if(x*x+y*y<1.0e-6){z=p;A=q;B=a|0;h[B>>3]=z;C=a+8|0;h[C>>3]=A;i=f;return}if((k|0)==10|(k|0)==4){h[g>>3]=(p+v)*.5;h[g+8>>3]=(q+w)*.5;Wm(j,c[d>>2]|0,g);z=+h[j>>3];A=+h[j+8>>3];B=a|0;h[B>>3]=z;C=a+8|0;h[C>>3]=A;i=f;return}if((o|0)>0){D=0;E=0.0;F=m}else{cc(107648,154560,1318,170104)}while(1){j=c[l+(D*48|0)+4>>2]|0;if((j|0)>3){g=0;d=3;w=E;while(1){q=+h[F+(g<<4)>>3]- +h[F+(d<<4)>>3];v=+h[F+(g<<4)+8>>3]- +h[F+(d<<4)+8>>3];p=w+ +T(q*q+v*v);k=d+3|0;if((k|0)<(j|0)){g=g+3|0;d=k;w=p}else{G=p;break}}}else{G=E}d=D+1|0;if((d|0)>=(o|0)){break}D=d;E=G;F=c[l+(d*48|0)>>2]|0}F=0;E=G*.5;D=m;a:while(1){m=c[l+(F*48|0)+4>>2]|0;if((m|0)>3){d=0;g=3;H=E;while(1){I=+h[D+(d<<4)>>3];J=+h[D+(d<<4)+8>>3];K=+h[D+(g<<4)>>3];L=+h[D+(g<<4)+8>>3];G=I-K;w=J-L;M=+T(G*G+w*w);if(M>=H){break a}w=H-M;j=g+3|0;if((j|0)<(m|0)){d=d+3|0;g=j;H=w}else{N=w;break}}}else{N=E}g=F+1|0;if((g|0)>=(o|0)){O=19;break}F=g;E=N;D=c[l+(g*48|0)>>2]|0}if((O|0)==19){cc(107648,154560,1318,170104)}N=M-H;z=(H*K+I*N)/M;A=(H*L+J*N)/M;B=a|0;h[B>>3]=z;C=a+8|0;h[C>>3]=A;i=f;return}function nm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;a=i;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];f=e;e=i;i=i+16|0;c[e>>2]=c[f>>2];c[e+4>>2]=c[f+4>>2];c[e+8>>2]=c[f+8>>2];c[e+12>>2]=c[f+12>>2];km(b);i=a;return}function om(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0;d=i;e=c[b+8>>2]|0;f=c[e+8>>2]|0;if((f|0)==0){g=e}else{h=f;i=d;return h|0}while(1){if((a[g+112|0]|0)==0){break}f=c[(c[g+116>>2]|0)+8>>2]|0;e=c[f+8>>2]|0;if((e|0)==0){g=f}else{h=e;j=5;break}}if((j|0)==5){i=d;return h|0}j=b;g=$w(c[((c[j>>2]&3|0)==3?b:b+32|0)+28>>2]|0)|0;e=$w(c[((c[j>>2]&3|0)==2?b:b-32|0)+28>>2]|0)|0;Fv(1,114544,(b=i,i=i+16|0,c[b>>2]=g,c[b+8>>2]=e,b)|0)|0;i=b;h=0;i=d;return h|0}function pm(b,c){b=b|0;c=c|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;e=a[b]|0;a:do{if(e<<24>>24==0){f=c;g=0}else{h=b;i=c;j=e;while(1){k=yF(j&255|0)|0;if((k|0)!=(yF(d[i]|0|0)|0)){break}k=h+1|0;l=i+1|0;m=a[k]|0;if(m<<24>>24==0){f=l;g=0;break a}else{h=k;i=l;j=m}}f=i;g=d[h]|0}}while(0);e=yF(g|0)|0;return e-(yF(d[f]|0|0)|0)|0}function qm(b,c,e){b=b|0;c=c|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if((e|0)==0){f=0;return f|0}else{g=b;h=c;i=e}while(1){e=i-1|0;c=yF(d[g]|0)|0;if((c|0)!=(yF(d[h]|0)|0)){j=7;break}if((e|0)==0){f=0;j=8;break}if((a[g]|0)==0){f=0;j=8;break}if((a[h]|0)==0){f=0;j=8;break}g=g+1|0;h=h+1|0;i=e}if((j|0)==7){i=yF(d[g]|0)|0;f=i-(yF(d[h]|0)|0)|0;return f|0}else if((j|0)==8){return f|0}return 0}function rm(b,d,e,f,g){b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0.0,w=0.0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0.0,Q=0.0,S=0.0,U=0.0,X=0,Y=0.0,Z=0.0,_=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0.0,ra=0,sa=0,ta=0.0,ua=0,va=0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0.0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0.0,Xa=0.0,Ya=0,Za=0,_a=0.0,$a=0.0,ab=0.0,bb=0.0,cb=0,db=0,eb=0,fb=0,gb=0.0,hb=0.0,ib=0,jb=0;j=i;i=i+80|0;k=j|0;l=j+64|0;m=k;n=jk(12)|0;o=n+4|0;c[o>>2]=0;p=n+8|0;c[p>>2]=2e3;q=jk(128e3)|0;r=q;s=n;c[s>>2]=r;t=c[b+4>>2]|0;u=c[b>>2]|0;v=+h[u>>3];w=+h[u+8>>3];b=c[o>>2]|0;x=c[p>>2]|0;if((b|0)<(x|0)){y=b;z=r}else{c[p>>2]=x<<1;r=mk(q,x<<7)|0;c[s>>2]=r;y=c[o>>2]|0;z=r}h[z+(y<<6)>>3]=v;h[(c[s>>2]|0)+(c[o>>2]<<6)+8>>3]=w;y=c[o>>2]|0;c[o>>2]=y+1;h[(c[s>>2]|0)+(y<<6)+16>>3]=0.0;y=k+48|0;z=u;c[y>>2]=c[z>>2];c[y+4>>2]=c[z+4>>2];c[y+8>>2]=c[z+8>>2];c[y+12>>2]=c[z+12>>2];if((t|0)>3){z=k|0;r=k|0;x=k+8|0;q=l|0;b=l+8|0;A=k+16|0;B=k+32|0;w=0.0;k=0;C=3;while(1){c[m>>2]=c[y>>2];c[m+4>>2]=c[y+4>>2];c[m+8>>2]=c[y+8>>2];c[m+12>>2]=c[y+12>>2];D=u+(k+1<<4)|0;c[A>>2]=c[D>>2];c[A+4>>2]=c[D+4>>2];c[A+8>>2]=c[D+8>>2];c[A+12>>2]=c[D+12>>2];D=u+(k+2<<4)|0;c[B>>2]=c[D>>2];c[B+4>>2]=c[D+4>>2];c[B+8>>2]=c[D+8>>2];c[B+12>>2]=c[D+12>>2];D=u+(k+3<<4)|0;c[y>>2]=c[D>>2];c[y+4>>2]=c[D+4>>2];c[y+8>>2]=c[D+8>>2];c[y+12>>2]=c[D+12>>2];v=+h[x>>3];E=+h[r>>3];F=w;D=1;while(1){Qm(l,z,3,+(D|0)/20.0,0,0);G=+h[q>>3];H=+h[b>>3];I=E-G;J=v-H;K=F+ +T(I*I+J*J);L=c[o>>2]|0;M=c[p>>2]|0;if((L|0)<(M|0)){N=L;O=c[s>>2]|0}else{c[p>>2]=M<<1;L=mk(c[s>>2]|0,M<<7)|0;c[s>>2]=L;N=c[o>>2]|0;O=L}h[O+(N<<6)>>3]=G;h[(c[s>>2]|0)+(c[o>>2]<<6)+8>>3]=H;L=c[o>>2]|0;c[o>>2]=L+1;h[(c[s>>2]|0)+(L<<6)+16>>3]=K;L=D+1|0;if((L|0)<21){v=H;E=G;F=K;D=L}else{break}}D=C+3|0;if((D|0)<(t|0)){w=K;k=C;C=D}else{break}}}C=c[o>>2]|0;if((c[p>>2]|0)>(C|0)){c[s>>2]=mk(c[s>>2]|0,C<<6)|0}C=c[o>>2]|0;o=c[s>>2]|0;p=C-1|0;K=+h[o+(p<<6)+16>>3];k=(C|0)>0;do{if(k){w=+(C|0);t=(g|0)==2;N=(f|0)==0;O=0;while(1){F=+(O-1|0);if((O|0)>0&F<w){P=F}else{P=F-w*+R(F/w)}b=~~P;q=O+1|0;F=+(q|0);if(F<w){Q=F}else{Q=F-w*+R(F/w)}z=~~Q;l=o+(O<<6)|0;F=+h[l>>3];r=o+(O<<6)+8|0;E=+h[r>>3];x=o+(O<<6)+16|0;v=+h[x>>3];y=o+(O<<6)+24|0;u=o+(O<<6)+32|0;B=o+(O<<6)+40|0;A=o+(O<<6)+48|0;m=o+(O<<6)+56|0;G=+h[o+(z<<6)+8>>3]-E;H=+h[o+(z<<6)>>3]-F;do{if(H==0.0&G==0.0){S=0.0}else{J=+$(+G,+H);if(J>=0.0){S=J;break}S=J+6.283185307179586}}while(0);H=+h[o+(b<<6)+8>>3]-E;G=+h[o+(b<<6)>>3]-F;do{if(G==0.0&H==0.0){U=0.0}else{J=+$(+H,+G);if(J>=0.0){U=J;break}U=J+6.283185307179586}}while(0);G=+Mc[d&15](v,K,e);do{if((O|0)==0){H=S+1.5707963267948966;if(!t){X=0;Y=G;Z=H;_=H;aa=E;ba=F;break}X=0;Y=G;Z=H;_=H;aa=E-G*+W(S);ba=F-G*+V(S)}else{if((O|0)==(p|0)){H=U+ -1.5707963267948966;if(!t){X=0;Y=G;Z=H;_=H;aa=E;ba=F;break}X=0;Y=G;Z=H;_=H;aa=E-G*+W(U);ba=F-G*+V(U);break}H=S-U;if(H<0.0){ca=H+6.283185307179586}else{ca=H}H=1.5707963267948966-ca*.5;J=+V(H);if(J==0.0){da=0.0}else{da=G/J}J=S+1.5707963267948966;I=J+H;if(N){if(da<=G*10.0){X=0;Y=da;Z=I;_=I;aa=E;ba=F;break}}I=U+ -1.5707963267948966;if(I>=0.0&I<6.283185307179586){ea=I}else{ea=I- +R(I/6.283185307179586)*6.283185307179586}if(J>=0.0&J<6.283185307179586){X=1;Y=G;Z=ea;_=J;aa=E;ba=F;break}X=1;Y=G;Z=ea;_=J- +R(J/6.283185307179586)*6.283185307179586;aa=E;ba=F}}while(0);h[l>>3]=ba;h[r>>3]=aa;h[x>>3]=v;a[y]=108;h[u>>3]=Z;h[B>>3]=Y;c[A>>2]=X;h[m>>3]=_;if((q|0)<(C|0)){O=q}else{break}}O=jk(12)|0;N=O;if(!k){fa=ba;ga=aa;ha=Z;ia=Y;ja=O;ka=N;break}t=O;b=O+4|0;z=O+8|0;D=(f|0)==1;L=0;while(1){w=+h[o+(L<<6)>>3];F=+h[o+(L<<6)+8>>3];E=+h[o+(L<<6)+32>>3];G=+h[o+(L<<6)+40>>3];M=c[o+(L<<6)+48>>2]|0;J=+h[o+(L<<6)+56>>3];I=w+G*+V(E);H=F+G*+W(E);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){ma=la;na=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;ma=c[t>>2]|0;na=la}c[t>>2]=ma+1;h[na+(ma<<4)>>3]=I;h[na+(ma<<4)+8>>3]=H;do{if((M|0)!=0){if(!D){H=w+G*+V(J);I=w+G*+W(J);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){oa=la;pa=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;oa=c[t>>2]|0;pa=la}c[t>>2]=oa+1;h[pa+(oa<<4)>>3]=H;h[pa+(oa<<4)+8>>3]=I;break}I=E-J;if(I>.0017453292519943296){qa=I}else{qa=I+6.283185307179586}if(qa>=3.141592653589793){I=w+G*+V(J);H=w+G*+W(J);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){ra=la;sa=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;ra=c[t>>2]|0;sa=la}c[t>>2]=ra+1;h[sa+(ra<<4)>>3]=I;h[sa+(ra<<4)+8>>3]=H;break}H=J+qa;I=w+G*+V(H);ta=F+G*+W(H);la=c[t>>2]|0;if((la|0)<(c[b>>2]|0)){ua=la;va=c[z>>2]|0}else{c[b>>2]=2e3;la=mk(c[z>>2]|0,32e3)|0;c[z>>2]=la;ua=c[t>>2]|0;va=la}c[t>>2]=ua+1;h[va+(ua<<4)>>3]=I;h[va+(ua<<4)+8>>3]=ta;if(G==0.0){break}if(J>H){ta=J;while(1){I=ta+ -6.283185307179586;if(I>H){ta=I}else{wa=I;break}}}else{wa=J}ta=H-wa;if(ta>6.283185307179586){I=ta;while(1){xa=I+ -6.283185307179586;if(xa>6.283185307179586){I=xa}else{ya=xa;break}}}else{ya=ta}I=ya/19.0;la=1;do{xa=H-I*+(la|0);za=w+G*+V(xa);Aa=F+G*+W(xa);Ba=c[t>>2]|0;if((Ba|0)<(c[b>>2]|0)){Ca=Ba;Da=c[z>>2]|0}else{c[b>>2]=2e3;Ba=mk(c[z>>2]|0,32e3)|0;c[z>>2]=Ba;Ca=c[t>>2]|0;Da=Ba}c[t>>2]=Ca+1;h[Da+(Ca<<4)>>3]=za;h[Da+(Ca<<4)+8>>3]=Aa;la=la+1|0;}while((la|0)<20)}}while(0);M=L+1|0;if((M|0)<(C|0)){L=M}else{fa=w;ga=F;ha=E;ia=G;ja=O;ka=N;break}}}else{N=jk(12)|0;fa=0.0;ga=0.0;ha=0.0;ia=0.0;ja=N;ka=N}}while(0);Ca=(g|0)==1;ya=ha+3.141592653589793;do{if(Ca){wa=fa+ia*+V(ha);qa=ga+ia*+W(ha);g=ja;Da=c[g>>2]|0;ua=ja+4|0;if((Da|0)<(c[ua>>2]|0)){Ea=Da;Fa=c[ja+8>>2]|0}else{c[ua>>2]=2e3;Da=ja+8|0;va=mk(c[Da>>2]|0,32e3)|0;c[Da>>2]=va;Ea=c[g>>2]|0;Fa=va}c[g>>2]=Ea+1;h[Fa+(Ea<<4)>>3]=wa;h[Fa+(Ea<<4)+8>>3]=qa;if(ia==0.0){Ga=ha;break}if(ya>ha){qa=ya;while(1){wa=qa+ -6.283185307179586;if(wa>ha){qa=wa}else{Ha=wa;break}}}else{Ha=ya}qa=ha-Ha;if(qa>6.283185307179586){wa=qa;while(1){Y=wa+ -6.283185307179586;if(Y>6.283185307179586){wa=Y}else{Ia=Y;break}}}else{Ia=qa}wa=Ia/19.0;va=ja+8|0;Da=1;while(1){Y=ha-wa*+(Da|0);Z=fa+ia*+V(Y);aa=ga+ia*+W(Y);ra=c[g>>2]|0;if((ra|0)<(c[ua>>2]|0)){Ja=ra;Ka=c[va>>2]|0}else{c[ua>>2]=2e3;ra=mk(c[va>>2]|0,32e3)|0;c[va>>2]=ra;Ja=c[g>>2]|0;Ka=ra}c[g>>2]=Ja+1;h[Ka+(Ja<<4)>>3]=Z;h[Ka+(Ja<<4)+8>>3]=aa;ra=Da+1|0;if((ra|0)<20){Da=ra}else{Ga=ha;break}}}else{wa=fa+ia*+V(ya);qa=ga+ia*+W(ya);Da=ja;g=c[Da>>2]|0;va=ja+4|0;if((g|0)<(c[va>>2]|0)){La=g;Ma=c[ja+8>>2]|0}else{c[va>>2]=2e3;va=ja+8|0;g=mk(c[va>>2]|0,32e3)|0;c[va>>2]=g;La=c[Da>>2]|0;Ma=g}c[Da>>2]=La+1;h[Ma+(La<<4)>>3]=wa;h[Ma+(La<<4)+8>>3]=qa;Ga=ya}}while(0);La=C-2|0;if((La|0)>-1){C=ja;Ma=ja+4|0;Ja=ja+8|0;Ka=(f|0)==1;f=La;while(1){ya=+h[o+(f<<6)>>3];ha=+h[o+(f<<6)+8>>3];Ia=+h[o+(f<<6)+40>>3];La=c[o+(f<<6)+48>>2]|0;Ha=+h[o+(f<<6)+32>>3]+3.141592653589793;qa=+h[o+(f<<6)+56>>3]+3.141592653589793;wa=ya+Ia*+V(qa);aa=ha+Ia*+W(qa);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Na=Ea;Oa=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Na=c[C>>2]|0;Oa=Ea}c[C>>2]=Na+1;h[Oa+(Na<<4)>>3]=wa;h[Oa+(Na<<4)+8>>3]=aa;do{if((La|0)!=0){if(!Ka){aa=ya+Ia*+V(Ha);wa=ya+Ia*+W(Ha);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Pa=Ea;Qa=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Pa=c[C>>2]|0;Qa=Ea}c[C>>2]=Pa+1;h[Qa+(Pa<<4)>>3]=aa;h[Qa+(Pa<<4)+8>>3]=wa;break}wa=qa-Ha;if(wa>.0017453292519943296){Ra=wa}else{Ra=wa+6.283185307179586}if(Ra>=3.141592653589793){wa=ya+Ia*+V(Ha);aa=ya+Ia*+W(Ha);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Sa=Ea;Ta=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Sa=c[C>>2]|0;Ta=Ea}c[C>>2]=Sa+1;h[Ta+(Sa<<4)>>3]=wa;h[Ta+(Sa<<4)+8>>3]=aa;break}aa=Ha+Ra;wa=ya+Ia*+V(aa);Z=ha+Ia*+W(aa);Ea=c[C>>2]|0;if((Ea|0)<(c[Ma>>2]|0)){Ua=Ea;Va=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Ea=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Ea;Ua=c[C>>2]|0;Va=Ea}c[C>>2]=Ua+1;h[Va+(Ua<<4)>>3]=wa;h[Va+(Ua<<4)+8>>3]=Z;if(Ia==0.0){break}if(Ha>aa){Z=Ha;while(1){wa=Z+ -6.283185307179586;if(wa>aa){Z=wa}else{Wa=wa;break}}}else{Wa=Ha}Z=aa-Wa;if(Z>6.283185307179586){G=Z;while(1){E=G+ -6.283185307179586;if(E>6.283185307179586){G=E}else{Xa=E;break}}}else{Xa=Z}G=Xa/19.0;Ea=1;do{E=aa-G*+(Ea|0);F=ya+Ia*+V(E);w=ha+Ia*+W(E);Fa=c[C>>2]|0;if((Fa|0)<(c[Ma>>2]|0)){Ya=Fa;Za=c[Ja>>2]|0}else{c[Ma>>2]=2e3;Fa=mk(c[Ja>>2]|0,32e3)|0;c[Ja>>2]=Fa;Ya=c[C>>2]|0;Za=Fa}c[C>>2]=Ya+1;h[Za+(Ya<<4)>>3]=F;h[Za+(Ya<<4)+8>>3]=w;Ea=Ea+1|0;}while((Ea|0)<20)}}while(0);if((f|0)>0){f=f-1|0}else{_a=ya;$a=ha;ab=Ha;bb=Ia;break}}}else{_a=fa;$a=ga;ab=Ga;bb=ia}if(!Ca){cb=c[s>>2]|0;db=cb;eF(db);eF(n);i=j;return ka|0}ia=ab+3.141592653589793;Ga=_a+bb*+V(ab);ga=$a+bb*+W(ab);Ca=ja;f=c[Ca>>2]|0;Ya=ja+4|0;if((f|0)<(c[Ya>>2]|0)){eb=f;fb=c[ja+8>>2]|0}else{c[Ya>>2]=2e3;f=ja+8|0;Za=mk(c[f>>2]|0,32e3)|0;c[f>>2]=Za;eb=c[Ca>>2]|0;fb=Za}c[Ca>>2]=eb+1;h[fb+(eb<<4)>>3]=Ga;h[fb+(eb<<4)+8>>3]=ga;if(bb==0.0){cb=c[s>>2]|0;db=cb;eF(db);eF(n);i=j;return ka|0}if(ia>ab){ga=ia;while(1){Ga=ga+ -6.283185307179586;if(Ga>ab){ga=Ga}else{gb=Ga;break}}}else{gb=ia}ia=ab-gb;if(ia>6.283185307179586){gb=ia;while(1){ga=gb+ -6.283185307179586;if(ga>6.283185307179586){gb=ga}else{hb=ga;break}}}else{hb=ia}ia=hb/19.0;eb=ja+8|0;ja=1;do{hb=ab-ia*+(ja|0);gb=_a+bb*+V(hb);ga=$a+bb*+W(hb);fb=c[Ca>>2]|0;if((fb|0)<(c[Ya>>2]|0)){ib=fb;jb=c[eb>>2]|0}else{c[Ya>>2]=2e3;fb=mk(c[eb>>2]|0,32e3)|0;c[eb>>2]=fb;ib=c[Ca>>2]|0;jb=fb}c[Ca>>2]=ib+1;h[jb+(ib<<4)>>3]=gb;h[jb+(ib<<4)+8>>3]=ga;ja=ja+1|0;}while((ja|0)<20);cb=c[s>>2]|0;db=cb;eF(db);eF(n);i=j;return ka|0}function sm(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0.0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0;f=i;i=i+8|0;g=f|0;c[g>>2]=0;j=e+4|0;k=c[j>>2]|0;if((k|0)==0){cc(115016,154384,202,169928)}l=k|0;m=c[l>>2]|0;if((m|0)==0){cc(126064,154384,205,169928)}n=k+8|0;if((c[n>>2]|0)==0){k=c[43664]|0;do{if((k|0)==0){p=9}else{if((pm(k,m)|0)!=0){p=9;break}q=c[43662]|0}}while(0);if((p|0)==9){c[43664]=m;m=vb(174656,13152,35,36,48)|0;c[43662]=m;q=m}c[n>>2]=q}if((a[213992]|0)==0){r=0}else{q=(Sh(c[l>>2]|0)|0)==0;r=q?0:g}do{if((AB(d,e,r)|0)<<24>>24==0){q=c[j>>2]|0;n=c[q>>2]|0;s=+h[q+16>>3];q=e+32|0;h[q>>3]=0.0;h[e+40>>3]=s*1.2;h[e+16>>3]=0.0;h[e+24>>3]=s*.1;c[e+8>>2]=0;c[e+12>>2]=0;do{if((qm(n,102048,4)|0)==0){t=37952;u=96296}else{if((qm(n,91056,5)|0)==0){t=72360;u=81152;break}if((qm(n,85760,9)|0)==0){t=72360;u=81152;break}t=1216;u=167368}}while(0);if((r|0)!=0){c[r>>2]=u}n=c[e>>2]|0;if((n|0)==0){break}m=a[n]|0;if(m<<24>>24==0){v=0.0}else{p=n;n=m;w=0.0;while(1){m=p+1|0;x=w+ +h[t+((n&255)<<3)>>3];h[q>>3]=x;k=a[m]|0;if(k<<24>>24==0){v=x;break}else{p=m;n=k;w=x}}}h[q>>3]=s*v}}while(0);if((r|0)==0){y=e+32|0;z=b;A=y;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=f;return}r=c[g>>2]|0;g=c[o>>2]|0;t=c[l>>2]|0;if((r|0)==0){gc(g|0,107584,(B=i,i=i+8|0,c[B>>2]=t,B)|0)|0;i=B;y=e+32|0;z=b;A=y;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=f;return}else{gc(g|0,114456,(B=i,i=i+16|0,c[B>>2]=t,c[B+8>>2]=r,B)|0)|0;i=B;y=e+32|0;z=b;A=y;c[z>>2]=c[A>>2];c[z+4>>2]=c[A+4>>2];c[z+8>>2]=c[A+8>>2];c[z+12>>2]=c[A+12>>2];i=f;return}}function tm(a){a=a|0;var b=0,d=0;b=a+108|0;c[b>>2]=0;c[a+112>>2]=32;c[a+116>>2]=-1;c[a+120>>2]=44;c[a+124>>2]=6;c[a+128>>2]=72;c[a+132>>2]=0;c[a+136>>2]=0;c[a+140>>2]=0;d=$g(b,c[43330]|0)|0;c[a+144>>2]=d;return d|0}function um(a,b,d){a=a|0;b=b|0;d=d|0;d=fF(1,32)|0;a=c[b>>2]|0;if((a|0)!=0){c[d>>2]=Lb(a|0)|0}a=c[b+4>>2]|0;if((a|0)!=0){c[d+4>>2]=Lb(a|0)|0}a=d+24|0;c[a>>2]=c[a>>2]&-128|c[b+24>>2]&127;h[d+16>>3]=+h[b+16>>3];c[d+8>>2]=c[b+8>>2];return d|0}function vm(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b>>2]|0;if((d|0)!=0){eF(d)}d=c[b+4>>2]|0;if((d|0)==0){eF(b);return}eF(d);eF(b);return}function wm(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0.0;e=c[b>>2]|0;a=c[d>>2]|0;f=(a|0)==0;do{if((e|0)==0){if(f){g=5}else{i=-1}}else{if(f){i=1;break}j=Ya(e|0,a|0)|0;if((j|0)==0){g=5}else{i=j}}}while(0);do{if((g|0)==5){a=c[b+4>>2]|0;e=c[d+4>>2]|0;f=(e|0)==0;if((a|0)==0){if(!f){i=-1;break}}else{if(f){i=1;break}f=Ya(a|0,e|0)|0;if((f|0)!=0){i=f;break}}f=c[b+24>>2]<<25>>25;e=c[d+24>>2]<<25>>25;if((f|0)!=(e|0)){i=f-e|0;break}k=+h[b+16>>3];l=+h[d+16>>3];if(k<l){i=-1;break}i=k>l|0}}while(0);return i|0}function xm(a,b){a=a|0;b=b|0;return pm(c[a>>2]|0,c[b>>2]|0)|0}function ym(){ub(214072)|0;return}function zm(){var a=0,b=0;a=i;i=i+16|0;b=a|0;ub(b|0)|0;i=a;return+(+((c[b+4>>2]|0)+(c[b>>2]|0)-(c[53518]|0)-(c[53519]|0)|0)/60.0)}function Am(a){a=a|0;var b=0,d=0;b=jk(16)|0;d=(a|0)<2?2:a;a=jk(d<<2)|0;c[b>>2]=a;c[b+12>>2]=a;c[b+8>>2]=a;c[b+4>>2]=a+(d<<2);return b|0}function Bm(a){a=a|0;eF(c[a>>2]|0);eF(a);return}function Cm(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+12|0;e=c[d>>2]|0;c[d>>2]=e+4;c[e>>2]=b;if((c[d>>2]|0)>>>0<(c[a+4>>2]|0)>>>0){return}c[d>>2]=c[a>>2];return}function Dm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+8|0;d=c[b>>2]|0;if((d|0)==(c[a+12>>2]|0)){e=0;return e|0}f=d+4|0;c[b>>2]=f;g=c[d>>2]|0;if(f>>>0<(c[a+4>>2]|0)>>>0){e=g;return e|0}c[b>>2]=c[a>>2];e=g;return e|0}function Em(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0;g=i;i=i+8|0;h=g|0;do{if((d|0)==0){j=e}else{k=fw(b,d)|0;if((k|0)==0){j=e;break}if((a[k]|0)==0){j=e;break}l=Ja(k|0,h|0,10)|0;if((k|0)==(c[h>>2]|0)){j=e;break}j=(l|0)<(f|0)?f:l}}while(0);i=g;return j|0}function Fm(b,d,e,f){b=b|0;d=d|0;e=+e;f=+f;var g=0,h=0,j=0.0,k=0,l=0.0;g=i;i=i+8|0;h=g|0;do{if((d|0)==0|(b|0)==0){j=e}else{k=fw(b,d)|0;if((k|0)==0){j=e;break}if((a[k]|0)==0){j=e;break}l=+sF(k,h);if((k|0)==(c[h>>2]|0)){j=e;break}j=l<f?f:l}}while(0);i=g;return+j}function Gm(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,j=0,k=0.0,l=0;d=i;i=i+8|0;e=d|0;f=+h[21580];if(f>0.0){g=f;i=d;return+g}j=Wv(b,0,114184,0)|0;do{if((j|0)==0|(b|0)==0){k=-1.0}else{l=fw(b|0,j)|0;if((l|0)==0){k=-1.0;break}if((a[l]|0)==0){k=-1.0;break}f=+sF(l,e);if((l|0)==(c[e>>2]|0)){k=-1.0;break}k=f<0.0?0.0:f}}while(0);g=k==0.0?72.0:k;i=d;return+g}function Hm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)==0|(a|0)==0){d=c;return d|0}d=fw(a,b)|0;return d|0}function Im(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;if((c|0)==0|(b|0)==0){e=d}else{e=fw(b,c)|0}do{if((e|0)!=0){if((a[e]|0)==0){break}else{f=e}return f|0}}while(0);f=d;return f|0}function Jm(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((b|0)==0){d=c&255;return d|0}else{d=Vm(fw(a,b)|0,0)|0;return d|0}return 0}function Km(a){a=a|0;return Vm(a,0)|0}function Lm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;b=a+8|0;d=c[b>>2]|0;e=d+220|0;f=c[e>>2]|0;if((f|0)!=0&(f|0)!=(a|0)){g=b;h=e;i=f;j=d}else{k=a;return k|0}do{a=c[(c[i+8>>2]|0)+220>>2]|0;if((a|0)==0){l=j}else{c[h>>2]=a;l=c[g>>2]|0}m=c[l+220>>2]|0;g=m+8|0;j=c[g>>2]|0;h=j+220|0;i=c[h>>2]|0;}while((i|0)!=0&(i|0)!=(m|0));k=m;return k|0}function Mm(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;if((a|0)==(b|0)){d=a;return d|0}e=a+8|0;f=c[e>>2]|0;g=f+220|0;h=c[g>>2]|0;do{if((h|0)==0){c[g>>2]=a;c[(c[e>>2]|0)+216>>2]=1;i=a}else{if((h|0)==(a|0)){i=a;break}else{j=e;k=g;l=h;m=f}do{n=c[(c[l+8>>2]|0)+220>>2]|0;if((n|0)==0){o=m}else{c[k>>2]=n;o=c[j>>2]|0}p=c[o+220>>2]|0;j=p+8|0;m=c[j>>2]|0;k=m+220|0;l=c[k>>2]|0;}while((l|0)!=0&(l|0)!=(p|0));i=p}}while(0);p=b+8|0;l=c[p>>2]|0;k=l+220|0;m=c[k>>2]|0;do{if((m|0)==0){c[k>>2]=b;c[(c[p>>2]|0)+216>>2]=1;q=b}else{if((m|0)==(b|0)){q=b;break}else{r=p;s=k;t=m;u=l}do{j=c[(c[t+8>>2]|0)+220>>2]|0;if((j|0)==0){v=u}else{c[s>>2]=j;v=c[r>>2]|0}w=c[v+220>>2]|0;r=w+8|0;u=c[r>>2]|0;s=u+220|0;t=c[s>>2]|0;}while((t|0)!=0&(t|0)!=(w|0));q=w}}while(0);w=i+8|0;t=c[w>>2]|0;s=q+8|0;u=c[s>>2]|0;if((c[t+120>>2]|0)>(c[u+120>>2]|0)){c[t+220>>2]=q;t=(c[s>>2]|0)+216|0;c[t>>2]=(c[t>>2]|0)+(c[(c[w>>2]|0)+216>>2]|0);d=q;return d|0}else{c[u+220>>2]=i;u=(c[w>>2]|0)+216|0;c[u>>2]=(c[u>>2]|0)+(c[(c[s>>2]|0)+216>>2]|0);d=i;return d|0}return 0}function Nm(b){b=b|0;var d=0;d=b+8|0;c[(c[d>>2]|0)+216>>2]=1;c[(c[d>>2]|0)+220>>2]=0;a[(c[d>>2]|0)+159|0]=0;return}function Om(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;d=a+8|0;e=c[d>>2]|0;f=e+220|0;g=c[f>>2]|0;do{if((g|0)!=0&(g|0)!=(a|0)){h=d;i=f;j=g;k=e;do{l=c[(c[j+8>>2]|0)+220>>2]|0;if((l|0)==0){m=k}else{c[i>>2]=l;m=c[h>>2]|0}n=c[m+220>>2]|0;h=n+8|0;k=c[h>>2]|0;i=k+220|0;j=c[i>>2]|0;}while((j|0)!=0&(j|0)!=(n|0));if((n|0)==(a|0)){o=c[d>>2]|0;break}else{cc(114360,125704,195,171112)}}else{o=e}}while(0);c[o+220>>2]=b;o=(c[b+8>>2]|0)+216|0;c[o>>2]=(c[o>>2]|0)+(c[(c[d>>2]|0)+216>>2]|0);return}function Pm(a,b){a=a|0;b=b|0;var d=0,e=0.0;d=c[(c[b+8>>2]|0)+132>>2]|0;e=+h[d+8>>3]*72.0;h[a>>3]=+h[d>>3]*72.0;h[a+8>>3]=e;return}function Qm(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=+e;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0.0,q=0,r=0.0,s=0.0,t=0,u=0.0,v=0.0,w=0,x=0,y=0,z=0;j=i;i=i+576|0;k=j|0;l=(d|0)<0;do{if(!l){m=0;while(1){n=k+(m<<4)|0;o=b+(m<<4)|0;c[n>>2]=c[o>>2];c[n+4>>2]=c[o+4>>2];c[n+8>>2]=c[o+8>>2];c[n+12>>2]=c[o+12>>2];if((m|0)<(d|0)){m=m+1|0}else{break}}if((d|0)<1){break}p=1.0-e;m=1;while(1){o=d-m|0;if((o|0)>=0){n=m-1|0;q=0;r=+h[k+(n*96|0)>>3];s=+h[k+(n*96|0)+8>>3];while(1){t=q+1|0;u=+h[k+(n*96|0)+(t<<4)>>3];h[k+(m*96|0)+(q<<4)>>3]=p*r+u*e;v=+h[k+(n*96|0)+(t<<4)+8>>3];h[k+(m*96|0)+(q<<4)+8>>3]=p*s+v*e;if((q|0)<(o|0)){q=t;r=u;s=v}else{break}}}if((m|0)<(d|0)){m=m+1|0}else{break}}}}while(0);if(!((f|0)==0|l)){b=0;while(1){m=f+(b<<4)|0;q=k+(b*96|0)|0;c[m>>2]=c[q>>2];c[m+4>>2]=c[q+4>>2];c[m+8>>2]=c[q+8>>2];c[m+12>>2]=c[q+12>>2];if((b|0)<(d|0)){b=b+1|0}else{break}}}if((g|0)==0|l){w=k+(d*96|0)|0;x=a;y=w;c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];i=j;return}else{z=0}while(1){l=g+(z<<4)|0;b=k+((d-z|0)*96|0)+(z<<4)|0;c[l>>2]=c[b>>2];c[l+4>>2]=c[b+4>>2];c[l+8>>2]=c[b+8>>2];c[l+12>>2]=c[b+12>>2];if((z|0)<(d|0)){z=z+1|0}else{break}}w=k+(d*96|0)|0;x=a;y=w;c[x>>2]=c[y>>2];c[x+4>>2]=c[y+4>>2];c[x+8>>2]=c[y+8>>2];c[x+12>>2]=c[y+12>>2];i=j;return}function Rm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=0;while(1){e=c[53742]|0;if((e-d|0)<1024){f=e+1024|0;c[53742]=f;g=mk(c[53740]|0,f)|0;c[53740]=g;h=c[53742]|0;i=g}else{h=e;i=c[53740]|0}e=db(i+d|0,h-d|0,b|0)|0;if((e|0)==0){break}g=(xF(e|0)|0)+d|0;e=c[53740]|0;if((a[e+(g-1)|0]|0)==10){j=g;k=e;l=8;break}else{d=g}}if((l|0)==8){m=(j|0)>0;n=m?k:0;return n|0}j=d;k=c[53740]|0;m=(j|0)>0;n=m?k:0;return n|0}function Sm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;d=i;if((b|0)==0){e=0;i=d;return e|0}if((a[b]|0)==0){e=0;i=d;return e|0}f=c[53686]|0;if((f|0)==0){g=c[53702]|0;h=c[43778]|0;do{if((c[43774]|0)==(g|0)){j=h}else{if((h|0)==0){k=g}else{eF(c[h>>2]|0);eF(c[43778]|0);c[43778]=0;k=c[53702]|0}c[43774]=k;if((k|0)==0){e=b;i=d;return e|0}if((a[k]|0)==0){e=b;i=d;return e|0}else{l=Tm(k)|0;c[43778]=l;j=l;break}}}while(0);if(!((a[b]|0)!=47&(j|0)!=0)){e=b;i=d;return e|0}k=c[43776]|0;h=c[44762]|0;g=gF(h,k+2+(xF(b|0)|0)|0)|0;c[44762]=g;k=c[j>>2]|0;if((k|0)==0){e=0;i=d;return e|0}nb(g|0,117488,(m=i,i=i+24|0,c[m>>2]=k,c[m+8>>2]=96224,c[m+16>>2]=b,m)|0)|0;i=m;a:do{if((kb(c[44762]|0,4)|0)!=0){k=j;while(1){k=k+4|0;g=c[k>>2]|0;if((g|0)==0){e=0;break}nb(c[44762]|0,117488,(m=i,i=i+24|0,c[m>>2]=g,c[m+8>>2]=96224,c[m+16>>2]=b,m)|0)|0;i=m;if((kb(c[44762]|0,4)|0)==0){break a}}i=d;return e|0}}while(0);e=c[44762]|0;i=d;return e|0}else{j=c[53704]|0;do{if((j|0)!=0){if((a[j]|0)==0){break}if((c[43774]|0)==0){c[43778]=Tm(j)|0;k=c[53704]|0;c[43774]=k;n=k}else{n=j}k=ob(b|0,47)|0;g=(k|0)==0?b:k+1|0;k=ob(g|0,92)|0;h=(k|0)==0?g:k+1|0;k=ob(h|0,58)|0;g=(k|0)==0?h:k+1|0;if(!(a[11872]|(g|0)==(b|0))){Fv(0,101800,(m=i,i=i+16|0,c[m>>2]=b,c[m+8>>2]=n,m)|0)|0;i=m;a[11872]=1}k=c[43778]|0;h=c[43776]|0;l=c[44762]|0;o=gF(l,h+2+(xF(g|0)|0)|0)|0;c[44762]=o;h=c[k>>2]|0;if((h|0)==0){e=0;i=d;return e|0}nb(o|0,117488,(m=i,i=i+24|0,c[m>>2]=h,c[m+8>>2]=96224,c[m+16>>2]=g,m)|0)|0;i=m;b:do{if((kb(c[44762]|0,4)|0)!=0){h=k;while(1){h=h+4|0;o=c[h>>2]|0;if((o|0)==0){e=0;break}nb(c[44762]|0,117488,(m=i,i=i+24|0,c[m>>2]=o,c[m+8>>2]=96224,c[m+16>>2]=g,m)|0)|0;i=m;if((kb(c[44762]|0,4)|0)==0){break b}}i=d;return e|0}}while(0);e=c[44762]|0;i=d;return e|0}}while(0);if(a[11872]|0){e=0;i=d;return e|0}Fv(0,107392,(m=i,i=i+8|0,c[m>>2]=f,m)|0)|0;i=m;a[11872]=1;e=0;i=d;return e|0}return 0}function Tm(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=0;d=La(Lb(a|0)|0,117440)|0;a=0;e=0;while(1){if((a|0)==0){f=kk((b<<2)+8|0)|0}else{f=mk(a,(b<<2)+8|0)|0}g=f;h=b+1|0;c[g+(b<<2)>>2]=d;i=xF(d|0)|0;j=e>>>0>i>>>0?e:i;i=La(0,117440)|0;if((i|0)==0){break}else{b=h;d=i;a=g;e=j}}c[g+(h<<2)>>2]=0;c[43776]=j;return g|0}function Um(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=c[d>>2]|0;a:do{if((f|0)==0){g=0}else{if((b|0)==0){h=0;while(1){i=h+1|0;if((c[d+(i<<2)>>2]|0)==0){g=i;break a}else{h=i}}}else{j=0;k=f}while(1){if((a[b]|0)==(a[k]|0)){if((Ya(b|0,k|0)|0)==0){g=j;break a}}h=j+1|0;i=c[d+(h<<2)>>2]|0;if((i|0)==0){g=h;break}else{j=h;k=i}}}}while(0);return c[e+(g<<2)>>2]|0}function Vm(b,c){b=b|0;c=c|0;var d=0,e=0;do{if((b|0)==0){d=c}else{e=a[b]|0;if(e<<24>>24==0){d=c;break}if((pm(b,90984)|0)==0){d=0;break}if((pm(b,85704)|0)==0){d=0;break}if((pm(b,81088)|0)==0){d=1;break}if((pm(b,167288)|0)==0){d=1;break}if(((e<<24>>24)-48|0)>>>0>=10>>>0){d=c;break}d=(Rb(b|0)|0)&255}}while(0);return d|0}function Wm(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0,r=0.0,s=0,t=0,u=0,v=0.0,w=0.0,x=0.0,y=0,z=0,A=0,B=0.0,C=0,D=0,E=0,F=0,G=0.0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0;e=i;i=i+640|0;f=d;d=i;i=i+16|0;c[d>>2]=c[f>>2];c[d+4>>2]=c[f+4>>2];c[d+8>>2]=c[f+8>>2];c[d+12>>2]=c[f+12>>2];f=e|0;g=e+576|0;j=c[b+4>>2]|0;k=c[b>>2]|0;l=+h[d>>3];m=+h[d+8>>3];if((j|0)>0){n=1.0e+38;d=-1;b=-1;o=0;while(1){p=c[k+(o*48|0)>>2]|0;q=c[k+(o*48|0)+4>>2]|0;if((q|0)>0){r=n;s=d;t=b;u=0;while(1){v=+h[p+(u<<4)>>3]-l;w=+h[p+(u<<4)+8>>3]-m;x=v*v+w*w;y=(s|0)==-1|x<r;w=y?x:r;z=y?u:s;A=y?o:t;y=u+1|0;if((y|0)<(q|0)){r=w;s=z;t=A;u=y}else{B=w;C=z;D=A;break}}}else{B=n;C=d;D=b}u=o+1|0;if((u|0)<(j|0)){n=B;d=C;b=D;o=u}else{E=C;F=D;break}}}else{E=-1;F=-1}D=c[k+(F*48|0)>>2]|0;C=(((E|0)==((c[k+(F*48|0)+4>>2]|0)-1|0))<<31>>31)+E|0;E=C-((C|0)%3|0)|0;B=+h[D+(E<<4)>>3];h[g>>3]=B;n=+h[D+(E<<4)+8>>3];h[g+8>>3]=n;C=E+1|0;h[g+16>>3]=+h[D+(C<<4)>>3];h[g+24>>3]=+h[D+(C<<4)+8>>3];C=E+2|0;h[g+32>>3]=+h[D+(C<<4)>>3];h[g+40>>3]=+h[D+(C<<4)+8>>3];C=E+3|0;r=+h[D+(C<<4)>>3];h[g+48>>3]=r;w=+h[D+(C<<4)+8>>3];h[g+56>>3]=w;x=B-l;B=n-m;n=r-l;r=w-m;C=f+288|0;w=1.0;v=0.0;G=n*n+r*r;r=x*x+B*B;while(1){D=f;E=g;c[D>>2]=c[E>>2];c[D+4>>2]=c[E+4>>2];c[D+8>>2]=c[E+8>>2];c[D+12>>2]=c[E+12>>2];E=f+16|0;D=g+16|0;c[E>>2]=c[D>>2];c[E+4>>2]=c[D+4>>2];c[E+8>>2]=c[D+8>>2];c[E+12>>2]=c[D+12>>2];D=f+32|0;E=g+32|0;c[D>>2]=c[E>>2];c[D+4>>2]=c[E+4>>2];c[D+8>>2]=c[E+8>>2];c[D+12>>2]=c[E+12>>2];E=f+48|0;D=g+48|0;c[E>>2]=c[D>>2];c[E+4>>2]=c[D+4>>2];c[E+8>>2]=c[D+8>>2];c[E+12>>2]=c[D+12>>2];B=(v+w)*.5;x=1.0-B;D=0;n=+h[f>>3];H=+h[f+8>>3];while(1){E=D+1|0;I=+h[f+(E<<4)>>3];h[f+96+(D<<4)>>3]=x*n+B*I;J=+h[f+(E<<4)+8>>3];h[f+96+(D<<4)+8>>3]=x*H+B*J;if((D|0)<2){D=E;n=I;H=J}else{break}}D=0;H=+h[f+96>>3];n=+h[f+104>>3];while(1){E=D+1|0;J=+h[f+96+(E<<4)>>3];h[f+192+(D<<4)>>3]=x*H+B*J;I=+h[f+96+(E<<4)+8>>3];h[f+192+(D<<4)+8>>3]=x*n+B*I;if((D|0)<1){D=E;H=J;n=I}else{break}}n=+h[f+200>>3];h[f+288>>3]=x*+h[f+192>>3]+B*+h[f+208>>3];K=x*n+B*+h[f+216>>3];h[f+296>>3]=K;L=+h[C>>3];if(+S(+(r-G))<1.0){M=10;break}if(+S(+(w-v))<1.0e-5){M=10;break}D=r<G;n=L-l;H=K-m;I=n*n+H*H;w=D?B:w;v=D?v:B;G=D?I:G;r=D?r:I}if((M|0)==10){h[a>>3]=L;h[a+8>>3]=K;i=e;return}}function Xm(){return c[53510]|0}function Ym(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0.0,o=0,p=0.0,q=0.0,r=0,s=0,t=0,u=0.0,v=0,w=0,x=0,y=0,z=0;d=i;i=i+32|0;e=d|0;f=d+8|0;g=d+16|0;j=d+24|0;k=b|0;l=c[53574]|0;m=(b|0)==0;do{if((l|0)==0|m){n=.75}else{o=fw(k,l)|0;if((o|0)==0){n=.75;break}if((a[o]|0)==0){n=.75;break}p=+sF(o,j);if((o|0)==(c[j>>2]|0)){n=.75;break}n=p<.01?.01:p}}while(0);j=b+8|0;h[(c[j>>2]|0)+32>>3]=n;l=c[53618]|0;do{if((l|0)==0|m){q=.5}else{o=fw(k,l)|0;if((o|0)==0){q=.5;break}if((a[o]|0)==0){q=.5;break}n=+sF(o,g);if((o|0)==(c[g>>2]|0)){q=.5;break}q=n<.02?.02:n}}while(0);h[(c[j>>2]|0)+40>>3]=q;g=c[53590]|0;if((g|0)==0|m){r=159064;s=13}else{l=fw(k,g)|0;if((l|0)==0){s=14}else{r=l;s=13}}if((s|0)==13){if((a[r]|0)==0){s=14}else{t=r}}if((s|0)==14){t=159064}r=vl(t,b)|0;c[(c[j>>2]|0)+8>>2]=r;r=fw(k,c[53614]|0)|0;t=c[53624]|0;do{if((t|0)==0|m){u=14.0}else{l=fw(k,t)|0;if((l|0)==0){u=14.0;break}if((a[l]|0)==0){u=14.0;break}q=+sF(l,f);if((l|0)==(c[f>>2]|0)){u=14.0;break}u=q<1.0?1.0:q}}while(0);f=c[53626]|0;if((f|0)==0|m){v=154088;s=22}else{t=fw(k,f)|0;if((t|0)==0){s=23}else{v=t;s=22}}if((s|0)==22){if((a[v]|0)==0){s=23}else{w=v}}if((s|0)==23){w=154088}v=c[53628]|0;if((v|0)==0|m){x=150904;s=26}else{m=fw(k,v)|0;if((m|0)==0){s=27}else{x=m;s=26}}if((s|0)==26){if((a[x]|0)==0){s=27}else{y=x}}if((s|0)==27){y=150904}s=(gy(r)|0)!=0;x=(pl(b)|0)==2;m=ak(k,r,(x?4:0)|(s?2:0),u,w,y)|0;c[(c[j>>2]|0)+104>>2]=m;m=c[53572]|0;do{if((m|0)!=0){s=fw(k,m)|0;if((s|0)==0){break}if((a[s]|0)==0){break}x=(gy(s)|0)!=0;r=ak(k,s,x?2:0,u,w,y)|0;c[(c[j>>2]|0)+108>>2]=r;r=(c[(Hx(k)|0)+8>>2]|0)+113|0;a[r]=a[r]|16}}while(0);y=c[53588]|0;do{if((y|0)==0){z=0}else{w=fw(k,y)|0;if((w|0)==0){z=0;break}if((a[w]|0)==0){z=0;break}m=Ja(w|0,e|0,10)|0;if((w|0)==(c[e>>2]|0)){z=0;break}z=(m|0)<0?0:m&255}}while(0);a[(c[j>>2]|0)+144|0]=z;Cc[c[c[(c[(c[j>>2]|0)+8>>2]|0)+4>>2]>>2]&255](b);i=d;return}function Zm(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0,z=0,A=0,B=0,C=0,D=0,E=0.0,F=0,G=0.0,H=0,I=0,J=0,K=0,L=0,M=0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0.0,V=0,W=0,X=0.0,Y=0,Z=0,_=0.0,$=0,aa=0,ba=0.0,ca=0,da=0,ea=0,fa=0.0,ga=0,ha=0,ia=0.0,ja=0,ka=0,la=0,ma=0,na=0.0,oa=0,pa=0,qa=0,ra=0.0,sa=0,ta=0,ua=0.0,va=0,wa=0,xa=0,ya=0.0,za=0,Aa=0,Ba=0;d=i;i=i+328|0;e=d|0;f=d+8|0;g=d+16|0;h=d+24|0;j=d+32|0;k=d+72|0;l=d+112|0;m=d+152|0;n=d+192|0;o=d+232|0;p=d+240|0;q=d+248|0;r=d+288|0;s=b;t=b+32|0;u=Hx(c[((c[s>>2]&3|0)==3?b:t)+28>>2]|0)|0;v=c[53790]|0;do{if((v|0)==0){w=0;x=0.0;y=0;z=0}else{A=b|0;B=fw(A,v)|0;if((B|0)==0){w=0;x=0.0;y=0;z=0;break}if((a[B]|0)==0){w=0;x=0.0;y=0;z=0;break}C=c[53796]|0;D=(b|0)==0;do{if((C|0)==0|D){E=14.0}else{F=fw(A,C)|0;if((F|0)==0){E=14.0;break}if((a[F]|0)==0){E=14.0;break}G=+sF(F,p);if((F|0)==(c[p>>2]|0)){E=14.0;break}E=G<1.0?1.0:G}}while(0);C=c[53798]|0;if((C|0)==0|D){H=154088;I=11}else{F=fw(A,C)|0;if((F|0)==0){I=12}else{H=F;I=11}}if((I|0)==11){if((a[H]|0)==0){I=12}else{J=H}}if((I|0)==12){J=154088}F=c[53800]|0;if((F|0)==0|D){K=150904;I=15}else{C=fw(A,F)|0;if((C|0)==0){I=16}else{K=C;I=15}}if((I|0)==15){if((a[K]|0)==0){I=16}else{L=K}}if((I|0)==16){L=150904}C=(gy(B)|0)!=0;F=ak(A,B,C?2:0,E,J,L)|0;C=b+8|0;c[(c[C>>2]|0)+96>>2]=F;F=(c[u+8>>2]|0)+113|0;a[F]=a[F]|1;F=c[53788]|0;if((F|0)==0|D){M=90984}else{M=fw(A,F)|0}F=Vm(M,0)|0;a[(c[C>>2]|0)+114|0]=F;w=1;x=E;y=J;z=L}}while(0);L=c[53748]|0;do{if((L|0)==0){N=x;O=y;P=z}else{J=b|0;M=fw(J,L)|0;if((M|0)==0){N=x;O=y;P=z;break}if((a[M]|0)==0){N=x;O=y;P=z;break}do{if((y|0)==0){K=c[53796]|0;H=(b|0)==0;do{if((K|0)==0|H){Q=14.0}else{p=fw(J,K)|0;if((p|0)==0){Q=14.0;break}if((a[p]|0)==0){Q=14.0;break}E=+sF(p,o);if((p|0)==(c[o>>2]|0)){Q=14.0;break}Q=E<1.0?1.0:E}}while(0);K=c[53798]|0;if((K|0)==0|H){R=154088;I=31}else{p=fw(J,K)|0;if((p|0)==0){I=32}else{R=p;I=31}}if((I|0)==31){if((a[R]|0)==0){I=32}else{S=R}}if((I|0)==32){S=154088}p=c[53800]|0;if((p|0)==0|H){T=150904;I=35}else{K=fw(J,p)|0;if((K|0)!=0){T=K;I=35}}if((I|0)==35){if((a[T]|0)!=0){U=Q;V=S;W=T;break}}U=Q;V=S;W=150904}else{U=x;V=y;W=z}}while(0);A=(gy(M)|0)!=0;D=ak(J,M,A?2:0,U,V,W)|0;c[(c[b+8>>2]|0)+108>>2]=D;D=(c[u+8>>2]|0)+113|0;a[D]=a[D]|32;N=U;O=V;P=W}}while(0);W=c[53792]|0;do{if((W|0)==0){X=0.0;Y=0;Z=0;_=N;$=O;aa=P}else{V=b|0;z=fw(V,W)|0;if((z|0)==0){X=0.0;Y=0;Z=0;_=N;$=O;aa=P;break}if((a[z]|0)==0){X=0.0;Y=0;Z=0;_=N;$=O;aa=P;break}do{if((O|0)==0){y=c[53796]|0;S=(b|0)==0;do{if((y|0)==0|S){ba=14.0}else{T=fw(V,y)|0;if((T|0)==0){ba=14.0;break}if((a[T]|0)==0){ba=14.0;break}U=+sF(T,h);if((T|0)==(c[h>>2]|0)){ba=14.0;break}ba=U<1.0?1.0:U}}while(0);y=c[53798]|0;if((y|0)==0|S){ca=154088;I=49}else{H=fw(V,y)|0;if((H|0)==0){I=50}else{ca=H;I=49}}if((I|0)==49){if((a[ca]|0)==0){I=50}else{da=ca}}if((I|0)==50){da=154088}H=c[53800]|0;if((H|0)==0|S){ea=150904;I=53}else{y=fw(V,H)|0;if((y|0)!=0){ea=y;I=53}}if((I|0)==53){if((a[ea]|0)!=0){fa=ba;ga=da;ha=ea;break}}fa=ba;ga=da;ha=150904}else{fa=N;ga=O;ha=P}}while(0);M=c[53778]|0;J=(b|0)==0;do{if((M|0)==0|J){ia=fa}else{y=fw(V,M)|0;if((y|0)==0){ia=fa;break}if((a[y]|0)==0){ia=fa;break}U=+sF(y,g);if((y|0)==(c[g>>2]|0)){ia=fa;break}ia=U<1.0?1.0:U}}while(0);M=c[53780]|0;if((M|0)==0|J){ja=ga}else{ja=fw(V,M)|0}if((ja|0)==0){I=64}else{if((a[ja]|0)==0){I=64}else{ka=ja}}if((I|0)==64){ka=ga}M=c[53782]|0;if((M|0)==0|J){la=ha}else{la=fw(V,M)|0}if((la|0)==0){I=69}else{if((a[la]|0)==0){I=69}else{ma=la}}if((I|0)==69){ma=ha}M=(gy(z)|0)!=0;y=ak(V,z,M?2:0,ia,ka,ma)|0;c[(c[b+8>>2]|0)+100>>2]=y;y=(c[u+8>>2]|0)+113|0;a[y]=a[y]|2;X=ia;Y=ka;Z=ma;_=fa;$=ga;aa=ha}}while(0);ha=c[53756]|0;ga=b|0;do{if((ha|0)!=0){ma=fw(ga,ha)|0;if((ma|0)==0){break}if((a[ma]|0)==0){break}do{if((Y|0)==0){do{if(($|0)==0){ka=c[53796]|0;la=(b|0)==0;do{if((ka|0)==0|la){na=14.0}else{ja=fw(ga,ka)|0;if((ja|0)==0){na=14.0;break}if((a[ja]|0)==0){na=14.0;break}fa=+sF(ja,f);if((ja|0)==(c[f>>2]|0)){na=14.0;break}na=fa<1.0?1.0:fa}}while(0);ka=c[53798]|0;if((ka|0)==0|la){oa=154088;I=83}else{ja=fw(ga,ka)|0;if((ja|0)==0){I=84}else{oa=ja;I=83}}if((I|0)==83){if((a[oa]|0)==0){I=84}else{pa=oa}}if((I|0)==84){pa=154088}ja=c[53800]|0;if((ja|0)==0|la){qa=150904;I=87}else{ka=fw(ga,ja)|0;if((ka|0)!=0){qa=ka;I=87}}if((I|0)==87){if((a[qa]|0)!=0){ra=na;sa=pa;ta=qa;break}}ra=na;sa=pa;ta=150904}else{ra=_;sa=$;ta=aa}}while(0);S=c[53778]|0;ka=(b|0)==0;do{if((S|0)==0|ka){ua=ra}else{ja=fw(ga,S)|0;if((ja|0)==0){ua=ra;break}if((a[ja]|0)==0){ua=ra;break}fa=+sF(ja,e);if((ja|0)==(c[e>>2]|0)){ua=ra;break}ua=fa<1.0?1.0:fa}}while(0);S=c[53780]|0;if((S|0)==0|ka){va=sa}else{va=fw(ga,S)|0}if((va|0)==0){I=98}else{if((a[va]|0)==0){I=98}else{wa=va}}if((I|0)==98){wa=sa}S=c[53782]|0;if((S|0)==0|ka){xa=ta}else{xa=fw(ga,S)|0}if((xa|0)!=0){if((a[xa]|0)!=0){ya=ua;za=wa;Aa=xa;break}}ya=ua;za=wa;Aa=ta}else{ya=X;za=Y;Aa=Z}}while(0);z=(gy(ma)|0)!=0;V=ak(ga,ma,z?2:0,ya,za,Aa)|0;c[(c[b+8>>2]|0)+104>>2]=V;V=(c[u+8>>2]|0)+113|0;a[V]=a[V]|4}}while(0);u=ew(ga,148040)|0;Aa=(u|0)!=0?u:213424;if((a[Aa]|0)!=0){a[(c[(c[((c[s>>2]&3|0)==3?b:t)+28>>2]|0)+8>>2]|0)+145|0]=1}u=b+8|0;za=c[u>>2]|0;Z=za+16|0;Y=c[((c[s>>2]&3|0)==3?b:t)+28>>2]|0;t=c[(c[(c[(c[Y+8>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0;ta=l|0;l=m;wa=n;do{if((Aa|0)==0){I=110}else{xa=gb(Aa|0,58)|0;if((xa|0)==0){I=110;break}a[xa]=0;Vc[t&63](m,Y,Aa,xa+1|0);c[ta>>2]=c[l>>2];c[ta+4>>2]=c[l+4>>2];c[ta+8>>2]=c[l+8>>2];c[ta+12>>2]=c[l+12>>2];c[ta+16>>2]=c[l+16>>2];c[ta+20>>2]=c[l+20>>2];c[ta+24>>2]=c[l+24>>2];c[ta+28>>2]=c[l+28>>2];c[ta+32>>2]=c[l+32>>2];a[xa]=58}}while(0);if((I|0)==110){Vc[t&63](n,Y,Aa,0);c[ta>>2]=c[wa>>2];c[ta+4>>2]=c[wa+4>>2];c[ta+8>>2]=c[wa+8>>2];c[ta+12>>2]=c[wa+12>>2];c[ta+16>>2]=c[wa+16>>2];c[ta+20>>2]=c[wa+20>>2];c[ta+24>>2]=c[wa+24>>2];c[ta+28>>2]=c[wa+28>>2];c[ta+32>>2]=c[wa+32>>2]}wa=q|0;c[wa>>2]=c[ta>>2];c[wa+4>>2]=c[ta+4>>2];c[wa+8>>2]=c[ta+8>>2];c[wa+12>>2]=c[ta+12>>2];c[wa+16>>2]=c[ta+16>>2];c[wa+20>>2]=c[ta+20>>2];c[wa+24>>2]=c[ta+24>>2];c[wa+28>>2]=c[ta+28>>2];c[wa+32>>2]=c[ta+32>>2];q=Z;c[q>>2]=c[wa>>2];c[q+4>>2]=c[wa+4>>2];c[q+8>>2]=c[wa+8>>2];c[q+12>>2]=c[wa+12>>2];c[q+16>>2]=c[wa+16>>2];c[q+20>>2]=c[wa+20>>2];c[q+24>>2]=c[wa+24>>2];c[q+28>>2]=c[wa+28>>2];c[q+32>>2]=c[wa+32>>2];c[za+52>>2]=Aa;Aa=c[53758]|0;do{if((Aa|0)!=0){za=fw(ga,Aa)|0;if((za|0)==0){break}if((a[za]|0)==0){break}if((Vm(za,0)|0)<<24>>24!=0){break}a[(c[u>>2]|0)+46|0]=0}}while(0);Aa=ew(ga,141944)|0;za=(Aa|0)!=0?Aa:213424;if((a[za]|0)==0){Ba=b-32|0}else{Aa=b-32|0;a[(c[(c[((c[s>>2]&3|0)==2?b:Aa)+28>>2]|0)+8>>2]|0)+145|0]=1;Ba=Aa}Aa=c[u>>2]|0;wa=Aa+56|0;q=c[((c[s>>2]&3|0)==2?b:Ba)+28>>2]|0;Ba=c[(c[(c[(c[q+8>>2]|0)+8>>2]|0)+4>>2]|0)+8>>2]|0;b=j;s=k;do{if((za|0)==0){I=122}else{Z=gb(za|0,58)|0;if((Z|0)==0){I=122;break}a[Z]=0;Vc[Ba&63](j,q,za,Z+1|0);c[ta>>2]=c[b>>2];c[ta+4>>2]=c[b+4>>2];c[ta+8>>2]=c[b+8>>2];c[ta+12>>2]=c[b+12>>2];c[ta+16>>2]=c[b+16>>2];c[ta+20>>2]=c[b+20>>2];c[ta+24>>2]=c[b+24>>2];c[ta+28>>2]=c[b+28>>2];c[ta+32>>2]=c[b+32>>2];a[Z]=58}}while(0);if((I|0)==122){Vc[Ba&63](k,q,za,0);c[ta>>2]=c[s>>2];c[ta+4>>2]=c[s+4>>2];c[ta+8>>2]=c[s+8>>2];c[ta+12>>2]=c[s+12>>2];c[ta+16>>2]=c[s+16>>2];c[ta+20>>2]=c[s+20>>2];c[ta+24>>2]=c[s+24>>2];c[ta+28>>2]=c[s+28>>2];c[ta+32>>2]=c[s+32>>2]}s=r|0;c[s>>2]=c[ta>>2];c[s+4>>2]=c[ta+4>>2];c[s+8>>2]=c[ta+8>>2];c[s+12>>2]=c[ta+12>>2];c[s+16>>2]=c[ta+16>>2];c[s+20>>2]=c[ta+20>>2];c[s+24>>2]=c[ta+24>>2];c[s+28>>2]=c[ta+28>>2];c[s+32>>2]=c[ta+32>>2];ta=wa;c[ta>>2]=c[s>>2];c[ta+4>>2]=c[s+4>>2];c[ta+8>>2]=c[s+8>>2];c[ta+12>>2]=c[s+12>>2];c[ta+16>>2]=c[s+16>>2];c[ta+20>>2]=c[s+20>>2];c[ta+24>>2]=c[s+24>>2];c[ta+28>>2]=c[s+28>>2];c[ta+32>>2]=c[s+32>>2];c[Aa+92>>2]=za;za=c[53794]|0;if((za|0)==0){i=d;return w|0}Aa=fw(ga,za)|0;if((Aa|0)==0){i=d;return w|0}if((a[Aa]|0)==0){i=d;return w|0}if((Vm(Aa,0)|0)<<24>>24!=0){i=d;return w|0}a[(c[u>>2]|0)+86|0]=0;i=d;return w|0}function _m(a,b){a=a|0;b=b|0;var e=0,f=0,g=0.0,i=0,j=0.0,l=0,m=0.0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0;e=c[a+8>>2]|0;a=c[e+116>>2]|0;f=e+16|0;g=(c[k>>2]=d[f]|d[f+1|0]<<8|d[f+2|0]<<16|d[f+3|0]<<24,c[k+4>>2]=d[f+4|0]|d[f+5|0]<<8|d[f+6|0]<<16|d[f+7|0]<<24,+h[k>>3]);i=e+24|0;j=(c[k>>2]=d[i]|d[i+1|0]<<8|d[i+2|0]<<16|d[i+3|0]<<24,c[k+4>>2]=d[i+4|0]|d[i+5|0]<<8|d[i+6|0]<<16|d[i+7|0]<<24,+h[k>>3]);l=e+32|0;m=(c[k>>2]=d[l]|d[l+1|0]<<8|d[l+2|0]<<16|d[l+3|0]<<24,c[k+4>>2]=d[l+4|0]|d[l+5|0]<<8|d[l+6|0]<<16|d[l+7|0]<<24,+h[k>>3]);n=e+40|0;o=(c[k>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24,c[k+4>>2]=d[n+4|0]|d[n+5|0]<<8|d[n+6|0]<<16|d[n+7|0]<<24,+h[k>>3]);p=+h[b+56>>3];q=+h[b+64>>3];e=(a&1|0)==0;r=+h[b+24>>3];s=+h[b+32>>3];t=(e?r:s)*.5;u=p-t;v=p+t;t=(e?s:r)*.5;r=q-t;s=q+t;h[f>>3]=u<g?u:g;h[i>>3]=r<j?r:j;h[l>>3]=v>m?v:m;h[n>>3]=s>o?s:o;return}function $m(b){b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0.0,v=0.0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0.0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0,R=0,S=0,T=0.0,U=0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0,$=0.0,aa=0.0,ba=0.0,ca=0.0,da=0.0,ea=0.0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0.0,ka=0.0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0.0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0.0;do{if((Lw(b)|0)==0){if((c[(c[b+8>>2]|0)+172>>2]|0)!=0){break}return}}while(0);d=ux(b)|0;e=b+8|0;if((d|0)==0){f=-2147483647.0;g=-2147483647.0;i=2147483647.0;j=2147483647.0}else{k=-2147483647.0;l=-2147483647.0;m=2147483647.0;n=2147483647.0;o=d;while(1){d=c[o+8>>2]|0;p=c[d+132>>2]|0;q=+h[p>>3]*72.0;r=+h[p+8>>3]*72.0;s=(+h[d+88>>3]+ +h[d+96>>3])*.5;t=+h[d+80>>3]*.5;u=q-s;v=r-t;w=q+s;s=r+t;t=n<u?n:u;u=m<v?m:v;v=l>w?l:w;w=k>s?k:s;p=c[d+108>>2]|0;do{if((p|0)==0){x=t;y=u;z=v;A=w}else{if((a[p+81|0]|0)==0){x=t;y=u;z=v;A=w;break}s=+h[p+56>>3];r=+h[p+64>>3];d=(c[(c[e>>2]|0)+116>>2]&1|0)==0;q=+h[p+24>>3];B=+h[p+32>>3];C=(d?q:B)*.5;D=s-C;E=s+C;C=D<t?D:t;D=E>v?E:v;E=(d?B:q)*.5;q=r-E;B=r+E;E=q<u?q:u;if(B<=w){x=C;y=E;z=D;A=w;break}x=C;y=E;z=D;A=B}}while(0);p=mw(b,o)|0;if((p|0)==0){F=A;G=z;H=y;I=x}else{w=A;u=z;v=y;t=x;d=p;while(1){p=c[d+8>>2]|0;J=c[p+8>>2]|0;do{if((J|0)==0){K=t;L=v;M=u;N=w}else{O=c[J+4>>2]|0;if((O|0)>0){P=c[J>>2]|0;B=w;D=u;E=v;C=t;Q=0;while(1){R=c[P+(Q*48|0)+4>>2]|0;if((R|0)>0){S=c[P+(Q*48|0)>>2]|0;q=B;r=D;s=E;T=C;U=0;while(1){V=+h[S+(U<<4)>>3];W=+h[S+(U<<4)+8>>3];X=T<V?T:V;Y=s<W?s:W;Z=r>V?r:V;V=q>W?q:W;_=U+1|0;if((_|0)<(R|0)){q=V;r=Z;s=Y;T=X;U=_}else{$=V;aa=Z;ba=Y;ca=X;break}}}else{$=B;aa=D;ba=E;ca=C}U=Q+1|0;if((U|0)<(O|0)){B=$;D=aa;E=ba;C=ca;Q=U}else{da=$;ea=aa;fa=ba;ga=ca;break}}}else{da=w;ea=u;fa=v;ga=t}Q=c[p+96>>2]|0;do{if((Q|0)==0){ha=ga;ia=fa;ja=ea;ka=da}else{if((a[Q+81|0]|0)==0){ha=ga;ia=fa;ja=ea;ka=da;break}C=+h[Q+56>>3];E=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;D=+h[Q+24>>3];B=+h[Q+32>>3];T=(O?D:B)*.5;s=C-T;r=C+T;T=s<ga?s:ga;s=r>ea?r:ea;r=(O?B:D)*.5;D=E-r;B=E+r;r=D<fa?D:fa;if(B<=da){ha=T;ia=r;ja=s;ka=da;break}ha=T;ia=r;ja=s;ka=B}}while(0);Q=c[p+100>>2]|0;do{if((Q|0)==0){la=ha;ma=ia;na=ja;oa=ka}else{if((a[Q+81|0]|0)==0){la=ha;ma=ia;na=ja;oa=ka;break}B=+h[Q+56>>3];s=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;r=+h[Q+24>>3];T=+h[Q+32>>3];D=(O?r:T)*.5;E=B-D;C=B+D;D=E<ha?E:ha;E=C>ja?C:ja;C=(O?T:r)*.5;r=s-C;T=s+C;C=r<ia?r:ia;if(T<=ka){la=D;ma=C;na=E;oa=ka;break}la=D;ma=C;na=E;oa=T}}while(0);Q=c[p+104>>2]|0;do{if((Q|0)==0){pa=la;qa=ma;ra=na;sa=oa}else{if((a[Q+81|0]|0)==0){pa=la;qa=ma;ra=na;sa=oa;break}T=+h[Q+56>>3];E=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;C=+h[Q+24>>3];D=+h[Q+32>>3];r=(O?C:D)*.5;s=T-r;B=T+r;r=s<la?s:la;s=B>na?B:na;B=(O?D:C)*.5;C=E-B;D=E+B;B=C<ma?C:ma;if(D<=oa){pa=r;qa=B;ra=s;sa=oa;break}pa=r;qa=B;ra=s;sa=D}}while(0);Q=c[p+108>>2]|0;if((Q|0)==0){K=pa;L=qa;M=ra;N=sa;break}if((a[Q+81|0]|0)==0){K=pa;L=qa;M=ra;N=sa;break}D=+h[Q+56>>3];s=+h[Q+64>>3];O=(c[(c[e>>2]|0)+116>>2]&1|0)==0;B=+h[Q+24>>3];r=+h[Q+32>>3];C=(O?B:r)*.5;E=D-C;T=D+C;C=E<pa?E:pa;E=T>ra?T:ra;T=(O?r:B)*.5;B=s-T;r=s+T;T=B<qa?B:qa;if(r<=sa){K=C;L=T;M=E;N=sa;break}K=C;L=T;M=E;N=r}}while(0);p=ow(b,d)|0;if((p|0)==0){F=N;G=M;H=L;I=K;break}else{w=N;u=M;v=L;t=K;d=p}}}d=vx(b,o)|0;if((d|0)==0){f=F;g=G;i=H;j=I;break}else{k=F;l=G;m=H;n=I;o=d}}}o=c[e>>2]|0;e=c[o+172>>2]|0;if((e|0)<1){ta=f;ua=g;va=i;wa=j}else{b=c[o+176>>2]|0;I=f;f=g;g=i;i=j;d=1;while(1){p=c[(c[b+(d<<2)>>2]|0)+8>>2]|0;j=+h[p+16>>3];n=+h[p+24>>3];H=+h[p+32>>3];m=+h[p+40>>3];G=i<j?i:j;j=g<n?g:n;n=f>H?f:H;H=I>m?I:m;if((d|0)<(e|0)){I=H;f=n;g=j;i=G;d=d+1|0}else{ta=H;ua=n;va=j;wa=G;break}}}d=c[o+12>>2]|0;do{if((d|0)==0){xa=wa;ya=va;za=ua;Aa=ta}else{if((a[d+81|0]|0)==0){xa=wa;ya=va;za=ua;Aa=ta;break}i=+h[d+56>>3];g=+h[d+64>>3];e=(c[o+116>>2]&1|0)==0;f=+h[d+24>>3];I=+h[d+32>>3];G=(e?f:I)*.5;j=i-G;n=i+G;G=j<wa?j:wa;j=n>ua?n:ua;n=(e?I:f)*.5;f=g-n;I=g+n;n=f<va?f:va;if(I<=ta){xa=G;ya=n;za=j;Aa=ta;break}xa=G;ya=n;za=j;Aa=I}}while(0);h[o+16>>3]=xa;h[o+24>>3]=ya;h[o+32>>3]=za;h[o+40>>3]=Aa;return}function an(a){a=a|0;var b=0;if((c[a+48>>2]|0)==(a|0)){b=1;return b|0}b=(qm($w(a|0)|0,138824,7)|0)==0|0;return b|0}
+
+
+
+function bn(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+224|0;f=e|0;g=e+24|0;h=e+48|0;j=e+72|0;k=e+80|0;l=$g(10368,c[43330]|0)|0;xn(d,l);m=$g(20008,c[43330]|0)|0;n=ry(d,136240,1)|0;Wx(n|0,133528,272,1)|0;Iv(k,128,e+96|0);o=ux(d)|0;if((o|0)!=0){p=l|0;q=j;r=j|0;s=j+4|0;j=m|0;t=f;u=f+8|0;v=f+12|0;w=f+16|0;x=f+20|0;f=h;y=h+8|0;z=h+12|0;A=h+16|0;B=h+20|0;h=g;C=g+8|0;D=g+12|0;E=g+16|0;F=g+20|0;g=o;do{do{if((a[(c[g+8>>2]|0)+118|0]|0)==0){o=mw(d,g)|0;if((o|0)==0){break}else{G=o}do{o=G;H=c[o>>2]&3;I=G+32|0;J=c[((H|0)==3?G:I)+28>>2]|0;K=G-32|0;L=c[((H|0)==2?G:K)+28>>2]|0;do{if((a[(c[L+8>>2]|0)+118|0]|0)==0){H=J|0;do{if((Za($w(H)|0,138824,7)|0)==0){M=$w(H)|0;N=Hc[c[p>>2]&63](l,M,512)|0;if((N|0)==0){O=0;break}O=c[N+12>>2]|0}else{O=0}}while(0);N=L|0;do{if((Za($w(N)|0,138824,7)|0)==0){M=$w(N)|0;P=Hc[c[p>>2]&63](l,M,512)|0;if((P|0)==0){Q=0;break}Q=c[P+12>>2]|0}else{Q=0}}while(0);P=(O|0)!=0;M=(Q|0)==0;if(M&(P^1)){break}if((O|0)==(Q|0)){R=$w(H)|0;S=$w(H)|0;Fv(0,118504,(T=i,i=i+16|0,c[T>>2]=R,c[T+8>>2]=S,T)|0)|0;i=T;break}S=c[o>>2]&3;c[r>>2]=c[((S|0)==3?G:I)+28>>2];c[s>>2]=c[((S|0)==2?G:K)+28>>2];S=Hc[c[j>>2]&63](m,q,512)|0;if((S|0)!=0){R=c[S+16>>2]|0;U=c[S+20>>2]|0;S=uw(Hx(R|0)|0,R,U,0,1)|0;Wx(S,112056,176,1)|0;jw(G|0,S)|0;break}if(M){if((Rx(O,N)|0)==0){M=Bn(J,O,k,n)|0;S=uw(Hx(M|0)|0,M,L,0,1)|0;M=S|0;Wx(M,112056,176,1)|0;jw(G|0,M)|0;c[u>>2]=H;c[v>>2]=N;M=S;U=c[M>>2]&3;R=S+32|0;c[w>>2]=c[((U|0)==3?S:R)+28>>2];V=S-32|0;c[x>>2]=c[((U|0)==2?S:V)+28>>2];Hc[c[j>>2]&63](m,t,1)|0;c[u>>2]=N;c[v>>2]=H;U=c[M>>2]&3;c[w>>2]=c[((U|0)==2?S:V)+28>>2];c[x>>2]=c[((U|0)==3?S:R)+28>>2];Hc[c[j>>2]&63](m,t,1)|0;break}else{R=$w(N)|0;S=$w(O|0)|0;Fv(0,118128,(T=i,i=i+16|0,c[T>>2]=R,c[T+8>>2]=S,T)|0)|0;i=T;break}}if(!P){if((Rx(Q,H)|0)==0){P=Bn(L,Q,k,n)|0;S=uw(Hx(H)|0,J,P,0,1)|0;P=S|0;Wx(P,112056,176,1)|0;jw(G|0,P)|0;c[C>>2]=H;c[D>>2]=N;P=S;R=c[P>>2]&3;U=S+32|0;c[E>>2]=c[((R|0)==3?S:U)+28>>2];V=S-32|0;c[F>>2]=c[((R|0)==2?S:V)+28>>2];Hc[c[j>>2]&63](m,h,1)|0;c[C>>2]=N;c[D>>2]=H;R=c[P>>2]&3;c[E>>2]=c[((R|0)==2?S:V)+28>>2];c[F>>2]=c[((R|0)==3?S:U)+28>>2];Hc[c[j>>2]&63](m,h,1)|0;break}else{U=$w(H)|0;S=$w(Q|0)|0;Fv(0,118208,(T=i,i=i+16|0,c[T>>2]=U,c[T+8>>2]=S,T)|0)|0;i=T;break}}S=O|0;if((Rx(Q,S)|0)!=0){U=$w(S)|0;R=$w(Q|0)|0;Fv(0,118368,(T=i,i=i+16|0,c[T>>2]=U,c[T+8>>2]=R,T)|0)|0;i=T;break}R=Q|0;if((Rx(O,R)|0)==0){U=Bn(J,O,k,n)|0;V=Bn(L,Q,k,n)|0;P=uw(Hx(U|0)|0,U,V,0,1)|0;V=P|0;Wx(V,112056,176,1)|0;jw(G|0,V)|0;c[y>>2]=H;c[z>>2]=N;V=P;U=c[V>>2]&3;M=P+32|0;c[A>>2]=c[((U|0)==3?P:M)+28>>2];W=P-32|0;c[B>>2]=c[((U|0)==2?P:W)+28>>2];Hc[c[j>>2]&63](m,f,1)|0;c[y>>2]=N;c[z>>2]=H;U=c[V>>2]&3;c[A>>2]=c[((U|0)==2?P:W)+28>>2];c[B>>2]=c[((U|0)==3?P:M)+28>>2];Hc[c[j>>2]&63](m,f,1)|0;break}else{M=$w(R)|0;R=$w(S)|0;Fv(0,118288,(T=i,i=i+16|0,c[T>>2]=M,c[T+8>>2]=R,T)|0)|0;i=T;break}}}while(0);G=ow(d,G)|0;}while((G|0)!=0)}}while(0);g=vx(d,g)|0;}while((g|0)!=0)}Mv(k);Vg(m)|0;m=Lw(n)|0;k=ux(n)|0;if((k|0)!=0){g=k;while(1){k=vx(n,g)|0;Gx(d,g|0)|0;if((k|0)==0){break}else{g=k}}}Kw(n)|0;if((m|0)==0){X=Vg(l)|0;i=e;return m|0}n=(c[d+8>>2]|0)+128|0;b[n>>1]=b[n>>1]|1;X=Vg(l)|0;i=e;return m|0}function cn(a){a=a|0;var b=0;b=$g(10368,c[43330]|0)|0;xn(a,b);return b|0}function dn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=ry(b,136240,1)|0;Wx(d|0,133528,272,1)|0;e=ux(b)|0;if((e|0)!=0){f=e;do{e=mw(b,f)|0;if((e|0)!=0){g=e;do{e=c[g>>2]&3;h=c[((e|0)==3?g:g+32|0)+28>>2]|0;i=c[((e|0)==2?g:g-32|0)+28>>2]|0;if((a[(c[h+8>>2]|0)+118|0]|0)==0){if((a[(c[i+8>>2]|0)+118|0]|0)!=0){j=5}}else{j=5}if((j|0)==5){j=0;e=An(h,d)|0;h=An(i,d)|0;i=uw(Hx(e|0)|0,e,h,0,1)|0;Wx(i,112056,176,1)|0;jw(g|0,i)|0}g=ow(b,g)|0;}while((g|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0)}f=ux(d)|0;if((f|0)==0){k=Kw(d)|0;return}else{l=f}do{Gx(b,l|0)|0;l=vx(d,l)|0;}while((l|0)!=0);k=Kw(d)|0;return}function en(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=Wv(a,b,c,0)|0;if((e|0)!=0){f=e;return f|0}f=Wv(a,b,c,d)|0;return f|0}function fn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;i=i+24|0;f=e|0;g=e+8|0;h=gb(b|0,59)|0;j=d+4|0;k=c[j>>2]|0;l=d+8|0;if(k>>>0<(c[l>>2]|0)>>>0){m=k}else{Jv(d,1)|0;m=c[j>>2]|0}c[j>>2]=m+1;a[m]=38;if((h|0)==0){n=b;i=e;return n|0}m=h-b|0;if((m-2|0)>>>0>6>>>0){n=b;i=e;return n|0}k=g|0;DF(k|0,b|0,m|0)|0;a[g+m|0]=0;c[f>>2]=k;m=vb(f|0,26544,252,8,120)|0;if((m|0)==0){n=b;i=e;return n|0}nb(k|0,131392,(b=i,i=i+8|0,c[b>>2]=c[m+4>>2],b)|0)|0;i=b;b=c[j>>2]|0;if(b>>>0<(c[l>>2]|0)>>>0){o=b}else{Jv(d,1)|0;o=c[j>>2]|0}c[j>>2]=o+1;a[o]=35;Lv(d,k)|0;k=c[j>>2]|0;if(k>>>0<(c[l>>2]|0)>>>0){p=k}else{Jv(d,1)|0;p=c[j>>2]|0}c[j>>2]=p+1;a[p]=59;n=h+1|0;i=e;return n|0}function gn(a,b){a=a|0;b=b|0;return Ya(c[a>>2]|0,c[b>>2]|0)|0}function hn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;e=i;i=i+1056|0;f=e|0;g=e+8|0;h=e+16|0;c[g>>2]=b;if((c[44702]|0)!=(d|0)){c[44702]=d;a[23e3]=0}Iv(h,1024,e+32|0);j=b+1|0;c[g>>2]=j;k=a[b]|0;b=h+4|0;l=h+8|0;if(k<<24>>24!=0){m=f|0;n=f+1|0;f=d|0;d=k;k=j;do{a:do{if((d&255)>>>0<192>>>0){if(d<<24>>24!=38){o=d;break}j=jn(g)|0;if((j|0)==0){o=38;break}if(j>>>0<127>>>0){o=j&255;break}p=c[b>>2]|0;q=p>>>0>=(c[l>>2]|0)>>>0;if(j>>>0<2047>>>0){if(q){Jv(h,1)|0;r=c[b>>2]|0}else{r=p}c[b>>2]=r+1;a[r]=j>>>6|192;o=(j&63|128)&255;break}if(q){Jv(h,1)|0;s=c[b>>2]|0}else{s=p}c[b>>2]=s+1;a[s]=j>>>12|224;p=c[b>>2]|0;if(p>>>0<(c[l>>2]|0)>>>0){t=p}else{Jv(h,1)|0;t=c[b>>2]|0}c[b>>2]=t+1;a[t]=j>>>6&63|128;o=(j&63|128)&255}else{do{if((d&255)>>>0<224>>>0){u=1}else{if((d&255)>>>0<240>>>0){u=2;break}if((d&255)>>>0<248>>>0){u=3;break}if(!(a[23e3]|0)){j=$w(f)|0;Fv(0,128976,(v=i,i=i+8|0,c[v>>2]=j,v)|0)|0;i=v;a[23e3]=1}a[m]=d;a[n]=0;j=kn(m)|0;p=xF(j|0)|0;if((p|0)>1){q=j;w=p;while(1){x=w-1|0;y=c[b>>2]|0;if(y>>>0<(c[l>>2]|0)>>>0){z=y}else{Jv(h,1)|0;z=c[b>>2]|0}y=a[q]|0;c[b>>2]=z+1;a[z]=y;if((x|0)>1){q=q+1|0;w=x}else{break}}A=j+(p-1)|0}else{A=j}w=a[A]|0;eF(j);o=w;break a}}while(0);w=d;q=0;x=k;while(1){if((a[x]&-64)<<24>>24!=-128){break}y=c[b>>2]|0;if(y>>>0<(c[l>>2]|0)>>>0){B=y}else{Jv(h,1)|0;B=c[b>>2]|0}c[b>>2]=B+1;a[B]=w;y=x+1|0;c[g>>2]=y;C=a[x]|0;D=q+1|0;if((D|0)<(u|0)){w=C;q=D;x=y}else{o=C;break a}}if(!(a[23e3]|0)){x=$w(f)|0;Fv(0,125768,(v=i,i=i+16|0,c[v>>2]=u+1,c[v+8>>2]=x,v)|0)|0;i=v;a[23e3]=1}a[m]=w;a[n]=0;x=kn(m)|0;q=xF(x|0)|0;if((q|0)>1){C=x;y=q;while(1){D=y-1|0;E=c[b>>2]|0;if(E>>>0<(c[l>>2]|0)>>>0){F=E}else{Jv(h,1)|0;F=c[b>>2]|0}E=a[C]|0;c[b>>2]=F+1;a[F]=E;if((D|0)>1){C=C+1|0;y=D}else{break}}G=x+(q-1)|0}else{G=x}y=a[G]|0;eF(x);o=y}}while(0);y=c[b>>2]|0;if(y>>>0<(c[l>>2]|0)>>>0){H=y}else{Jv(h,1)|0;H=c[b>>2]|0}c[b>>2]=H+1;a[H]=o;y=c[g>>2]|0;k=y+1|0;c[g>>2]=k;d=a[y]|0;}while(d<<24>>24!=0)}d=c[b>>2]|0;if(d>>>0<(c[l>>2]|0)>>>0){I=d;a[I]=0;J=h|0;K=c[J>>2]|0;c[b>>2]=K;L=Lb(K|0)|0;Mv(h);i=e;return L|0}Jv(h,1)|0;I=c[b>>2]|0;a[I]=0;J=h|0;K=c[J>>2]|0;c[b>>2]=K;L=Lb(K|0)|0;Mv(h);i=e;return L|0}function jn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+24|0;e=d|0;f=c[b>>2]|0;if((a[f]|0)!=35){g=d+8|0;c[e>>2]=g;h=g;g=0;while(1){j=a[f+g|0]|0;if((j<<24>>24|0)==59){k=17;break}else if((j<<24>>24|0)==0){l=0;m=f;k=20;break}a[h]=j;j=g+1|0;if((j|0)<8){h=h+1|0;g=j}else{l=0;m=f;k=20;break}}if((k|0)==17){a[h]=0;h=vb(e|0,26544,252,8,120)|0;if((h|0)==0){l=0;m=f;c[b>>2]=m;i=d;return l|0}l=c[h+4>>2]|0;m=f+(g+1)|0;c[b>>2]=m;i=d;return l|0}else if((k|0)==20){c[b>>2]=m;i=d;return l|0}}k=a[f+1|0]|0;a:do{if((k&-33)<<24>>24==88){g=2;h=0;while(1){e=a[f+g|0]|0;j=e&255;do{if((e-65&255)>>>0<6>>>0){n=j-55|0}else{if((e-97&255)>>>0<6>>>0){n=j-87|0;break}if((e-48&255)>>>0>=10>>>0){o=h;p=g;q=j;break a}n=j-48|0}}while(0);j=n+(h<<4)|0;e=g+1|0;if((e|0)<8){g=e;h=j}else{o=j;p=e;q=n;break}}}else{h=1;g=0;e=k;while(1){j=e&255;if((e-48&255)>>>0>=10>>>0){o=g;p=h;q=j;break a}r=(g*10|0)-48+j|0;s=h+1|0;if((s|0)>=8){o=r;p=s;q=j;break a}h=s;g=r;e=a[f+s|0]|0}}}while(0);if((q|0)!=59){l=0;m=f;c[b>>2]=m;i=d;return l|0}l=o;m=f+(p+1)|0;c[b>>2]=m;i=d;return l|0}function kn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;d=i;i=i+1048|0;e=d|0;f=d+8|0;Iv(f,1024,d+24|0);c[e>>2]=b+1;g=a[b]|0;b=f+4|0;h=f+8|0;if(g<<24>>24!=0){j=g;do{if(j<<24>>24==38){g=jn(e)|0;k=(g|0)!=0?g:38}else{k=j&255}do{if(k>>>0<127>>>0){g=c[b>>2]|0;if(g>>>0<(c[h>>2]|0)>>>0){l=g}else{Jv(f,1)|0;l=c[b>>2]|0}c[b>>2]=l+1;a[l]=k}else{g=c[b>>2]|0;m=g>>>0>=(c[h>>2]|0)>>>0;if(k>>>0<2047>>>0){if(m){Jv(f,1)|0;n=c[b>>2]|0}else{n=g}c[b>>2]=n+1;a[n]=k>>>6|192;o=c[b>>2]|0;if(o>>>0<(c[h>>2]|0)>>>0){p=o}else{Jv(f,1)|0;p=c[b>>2]|0}c[b>>2]=p+1;a[p]=k&63|128;break}if(m){Jv(f,1)|0;q=c[b>>2]|0}else{q=g}c[b>>2]=q+1;a[q]=k>>>12|224;g=c[b>>2]|0;if(g>>>0<(c[h>>2]|0)>>>0){r=g}else{Jv(f,1)|0;r=c[b>>2]|0}c[b>>2]=r+1;a[r]=k>>>6&63|128;g=c[b>>2]|0;if(g>>>0<(c[h>>2]|0)>>>0){s=g}else{Jv(f,1)|0;s=c[b>>2]|0}c[b>>2]=s+1;a[s]=k&63|128}}while(0);g=c[e>>2]|0;c[e>>2]=g+1;j=a[g]|0;}while(j<<24>>24!=0)}j=c[b>>2]|0;if(j>>>0<(c[h>>2]|0)>>>0){t=j;a[t]=0;u=f|0;v=c[u>>2]|0;c[b>>2]=v;w=Lb(v|0)|0;Mv(f);i=d;return w|0}Jv(f,1)|0;t=c[b>>2]|0;a[t]=0;u=f|0;v=c[u>>2]|0;c[b>>2]=v;w=Lb(v|0)|0;Mv(f);i=d;return w|0}function ln(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;d=i;i=i+1040|0;e=d|0;Iv(e,1024,d+16|0);f=a[b]|0;g=e+4|0;h=e+8|0;if(f<<24>>24!=0){j=b;b=f;while(1){f=j+1|0;if((b&255)>>>0<127>>>0){k=c[g>>2]|0;if(k>>>0<(c[h>>2]|0)>>>0){l=k}else{Jv(e,1)|0;l=c[g>>2]|0}c[g>>2]=l+1;a[l]=b;m=f}else{k=a[f]&63|b<<6;f=c[g>>2]|0;if(f>>>0<(c[h>>2]|0)>>>0){n=f}else{Jv(e,1)|0;n=c[g>>2]|0}c[g>>2]=n+1;a[n]=k;m=j+2|0}k=a[m]|0;if(k<<24>>24==0){break}else{j=m;b=k}}}b=c[g>>2]|0;if(b>>>0<(c[h>>2]|0)>>>0){o=b;a[o]=0;p=e|0;q=c[p>>2]|0;c[g>>2]=q;r=Lb(q|0)|0;Mv(e);i=d;return r|0}Jv(e,1)|0;o=c[g>>2]|0;a[o]=0;p=e|0;q=c[p>>2]|0;c[g>>2]=q;r=Lb(q|0)|0;Mv(e);i=d;return r|0}function mn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0;d=i;i=i+24|0;e=b;b=i;i=i+32|0;tF(b,e,32)|0;e=d|0;f=d+8|0;g=+h[b+16>>3];j=c[a+8>>2]|0;if(g<+h[j+48>>3]){k=0;i=d;return k|0}l=+h[b>>3];if(+h[j+64>>3]<l){k=0;i=d;return k|0}m=+h[b+24>>3];if(m<+h[j+56>>3]){k=0;i=d;return k|0}n=+h[b+8>>3];if(+h[j+72>>3]<n){k=0;i=d;return k|0}o=+h[j+24>>3]-(m+n)*.5;h[f>>3]=+h[j+16>>3]-(g+l)*.5;h[f+8>>3]=o;c[e>>2]=a;c[e+4>>2]=0;k=Oc[c[(c[(c[j+8>>2]|0)+4>>2]|0)+12>>2]&255](e,f)|0;i=d;return k|0}function nn(a,b){a=a|0;b=b|0;var c=0,d=0,e=0.0,f=0.0,g=0.0,j=0.0,k=0;c=i;d=b;b=i;i=i+32|0;tF(b,d,32)|0;e=+h[a+24>>3]*.5;f=+h[a+32>>3]*.5;g=+h[a+56>>3];j=+h[a+64>>3];if(+h[b+16>>3]<g-e){k=0;i=c;return k|0}if(e+g<+h[b>>3]){k=0;i=c;return k|0}if(+h[b+24>>3]<j-f){k=0;i=c;return k|0}k=f+j>=+h[b+8>>3]|0;i=c;return k|0}function on(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0.0,ga=0.0,ha=0.0,ia=0.0,ja=0,ka=0,la=0.0,ma=0.0,na=0.0,oa=0.0,pa=0.0;e=i;i=i+384|0;f=b;b=i;i=i+32|0;tF(b,f,32)|0;f=e|0;g=e+16|0;j=e+32|0;l=e+64|0;m=e+96|0;n=e+128|0;o=e+160|0;p=e+176|0;q=e+192|0;r=e+224|0;s=e+256|0;t=e+288|0;u=e+320|0;v=e+336|0;w=e+352|0;x=a+8|0;a=c[x>>2]|0;y=c[a+8>>2]|0;do{if((y|0)==0){z=a}else{if(+h[y+24>>3]<+h[b>>3]){z=a;break}if(+h[b+16>>3]<+h[y+8>>3]){z=a;break}if(+h[y+32>>3]<+h[b+8>>3]){z=a;break}if(+h[b+24>>3]<+h[y+16>>3]){z=a;break}A=y+4|0;if((c[A>>2]|0)<=0){z=a;break}B=y|0;C=w;D=b;E=u;F=v;G=w|0;H=w+8|0;I=w+16|0;J=w+24|0;K=f|0;L=f+8|0;M=g|0;N=g+8|0;O=j|0;P=l+16|0;Q=m+8|0;R=n+24|0;S=o|0;T=o+8|0;U=p|0;V=p+8|0;W=q|0;X=r+16|0;Y=s+8|0;Z=t+24|0;_=0;a:while(1){$=c[B>>2]|0;aa=$+(_*48|0)|0;ba=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+4|0;ca=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+8|0;da=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+12|0;ea=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24|0;aa=$+(_*48|0)+16|0;fa=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);aa=$+(_*48|0)+24|0;ga=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);aa=$+(_*48|0)+32|0;ha=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);aa=$+(_*48|0)+40|0;ia=(c[k>>2]=d[aa]|d[aa+1|0]<<8|d[aa+2|0]<<16|d[aa+3|0]<<24,c[k+4>>2]=d[aa+4|0]|d[aa+5|0]<<8|d[aa+6|0]<<16|d[aa+7|0]<<24,+h[k>>3]);tF(C|0,D|0,32)|0;if((ca|0)==0){ja=9;break}aa=ba;c[F>>2]=c[aa>>2];c[F+4>>2]=c[aa+4>>2];c[F+8>>2]=c[aa+8>>2];c[F+12>>2]=c[aa+12>>2];if((ca|0)>1){aa=1;do{$=ba+(aa<<4)|0;c[E>>2]=c[$>>2];c[E+4>>2]=c[$+4>>2];c[E+8>>2]=c[$+8>>2];c[E+12>>2]=c[$+12>>2];if((pi(u,v,w)|0)!=-1){ka=1;ja=31;break a}c[F>>2]=c[E>>2];c[F+4>>2]=c[E+4>>2];c[F+8>>2]=c[E+8>>2];c[F+12>>2]=c[E+12>>2];aa=aa+1|0;}while((aa|0)<(ca|0))}do{if((da|0)!=0){la=+h[ba+8>>3];ma=+h[G>>3];na=+h[H>>3];oa=+h[I>>3];pa=+h[J>>3];h[S>>3]=+h[ba>>3];h[T>>3]=la;h[U>>3]=fa;h[V>>3]=ga;ph(q,p,o,1.0,da);if(oa<+h[W>>3]){break}ph(r,p,o,1.0,da);if(+h[X>>3]<ma){break}ph(s,p,o,1.0,da);if(pa<+h[Y>>3]){break}ph(t,p,o,1.0,da);if(+h[Z>>3]>=na){ka=1;ja=31;break a}}}while(0);do{if((ea|0)!=0){da=ca-1|0;ga=+h[ba+(da<<4)+8>>3];fa=+h[G>>3];na=+h[H>>3];pa=+h[I>>3];ma=+h[J>>3];h[K>>3]=+h[ba+(da<<4)>>3];h[L>>3]=ga;h[M>>3]=ha;h[N>>3]=ia;ph(j,g,f,1.0,ea);if(pa<+h[O>>3]){break}ph(l,g,f,1.0,ea);if(+h[P>>3]<fa){break}ph(m,g,f,1.0,ea);if(ma<+h[Q>>3]){break}ph(n,g,f,1.0,ea);if(+h[R>>3]>=na){ka=1;ja=31;break a}}}while(0);ea=_+1|0;if((ea|0)<(c[A>>2]|0)){_=ea}else{ja=24;break}}if((ja|0)==9){cc(110072,125704,1607,170152);return 0}else if((ja|0)==24){z=c[x>>2]|0;break}else if((ja|0)==31){i=e;return ka|0}}}while(0);ja=c[z+96>>2]|0;do{if((ja|0)!=0){ia=+h[ja+24>>3]*.5;ha=+h[ja+32>>3]*.5;na=+h[ja+56>>3];ma=+h[ja+64>>3];if(+h[b+16>>3]<na-ia){break}if(ia+na<+h[b>>3]){break}if(+h[b+24>>3]<ma-ha){break}if(ha+ma<+h[b+8>>3]){break}else{ka=1}i=e;return ka|0}}while(0);ka=0;i=e;return ka|0}function pn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0;e=i;a:do{if((b|0)==0){f=d}else{g=a[b]|0;if(g<<24>>24==0){f=d;break}switch(g<<24>>24|0){case 121:case 89:{g=(pm(b+1|0,113648)|0)==0;h=g?10:0;j=16;break};case 116:case 84:{g=(pm(b+1|0,114392)|0)==0;h=g?10:0;j=16;break};case 111:case 79:{g=(pm(b+1|0,117616)|0)==0;h=g?8:0;j=16;break};case 108:case 76:{g=(pm(b+1|0,120032)|0)==0;h=g?2:0;j=16;break};case 102:case 70:{g=(pm(b+1|0,120800)|0)==0;h=g?2:0;j=16;break};case 110:case 78:{g=b+1|0;if((pm(g,119232)|0)==0){f=0;break a}if((pm(g,118568)|0)==0){f=2;break a}break};case 99:case 67:{g=b+1|0;if((pm(g,123448)|0)==0){f=4;break a}k=(pm(g,121632)|0)==0;h=k?12:0;j=16;break};case 112:case 80:{k=(pm(b+1|0,116696)|0)==0;h=k?6:0;j=16;break};case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:{f=10;break a;break};case 48:{f=2;break a;break};case 115:case 83:{k=(pm(b+1|0,115760)|0)==0;h=k?10:0;j=16;break};default:{}}if((j|0)==16){if((h|0)!=0){f=h;break}}Fv(0,113096,(k=i,i=i+8|0,c[k>>2]=b,k)|0)|0;i=k;f=d}}while(0);i=e;return f|0}function qn(d,f){d=d|0;f=f|0;var g=0,h=0;g=ew(d|0,112576)|0;do{if((g|0)==0){h=f}else{if((a[g]|0)==0){h=0;break}h=pn(g,f)|0}}while(0);f=(c[d+8>>2]|0)+128|0;b[f>>1]=e[f>>1]|h;return}function rn(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=e|0;var f=0,g=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0.0,y=0.0;f=e&1;g=e&2;a:do{if((c|0)==2){i=+h[a>>3];j=+h[a+16>>3]-i;k=+h[a+8>>3];l=+h[a+24>>3]-k;m=k-l;n=i-j;o=k+l;p=i+j}else{j=+h[a>>3];i=+h[a+8>>3];if((c|0)>0){q=j;r=i;s=j;t=i;u=1;v=j;w=i}else{m=i;n=j;o=i;p=j;break}while(1){j=v<s?v:s;i=w<t?w:t;l=v>q?v:q;k=w>r?w:r;if((u|0)>=(c|0)){m=i;n=j;o=k;p=l;break a}x=+h[a+(u<<4)>>3];y=+h[a+(u<<4)+8>>3];q=l;r=k;s=j;t=i;u=u+1|0;v=x;w=y}}}while(0);w=n+(p-n)*.5;v=m+(o-m)*.5;if((f|0)==0){t=o-v;o=d;d=+W(o);s=+V(o);if((g|0)==0){h[b+8>>3]=t*d-v;h[b+24>>3]=-0.0-v-(v-m)*d}else{o=t*d;h[b+8>>3]=v-o;h[b+24>>3]=v+o}o=(p-w)*s;h[b>>3]=w-o;h[b+16>>3]=w+o;return}else{o=w-n;n=v-m;m=+T(o*o+n*n);if((g|0)==0){h[b+8>>3]=-0.0-v}else{h[b+8>>3]=v}h[b>>3]=w;h[b+16>>3]=m*.25;h[b+24>>3]=m;return}}function sn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;a=c[b>>2]|0;d=c[a+8>>2]|0;if((d|0)==0){e=a;f=e+8|0;c[f>>2]=0;return}a=c[d>>2]|0;if((c[d+4>>2]|0)>0){d=0;g=a;while(1){eF(c[g+(d*48|0)>>2]|0);h=d+1|0;i=c[(c[b>>2]|0)+8>>2]|0;j=c[i>>2]|0;if((h|0)<(c[i+4>>2]|0)){d=h;g=j}else{k=j;break}}}else{k=a}eF(k);eF(c[(c[b>>2]|0)+8>>2]|0);e=c[b>>2]|0;f=e+8|0;c[f>>2]=0;return}function tn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=a+8|0;eF(c[(c[b>>2]|0)+144>>2]|0);d=c[b>>2]|0;e=c[d+8>>2]|0;if((e|0)==0){f=d}else{d=c[e>>2]|0;if((c[e+4>>2]|0)>0){e=0;g=d;while(1){eF(c[g+(e*48|0)>>2]|0);h=e+1|0;i=c[(c[b>>2]|0)+8>>2]|0;j=c[i>>2]|0;if((h|0)<(c[i+4>>2]|0)){e=h;g=j}else{k=j;break}}}else{k=d}eF(k);eF(c[(c[b>>2]|0)+8>>2]|0);f=c[b>>2]|0}c[f+8>>2]=0;dk(c[(c[b>>2]|0)+96>>2]|0);dk(c[(c[b>>2]|0)+108>>2]|0);dk(c[(c[b>>2]|0)+100>>2]|0);dk(c[(c[b>>2]|0)+104>>2]|0);Xx(a|0,112056)|0;return}function un(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a+8|0;d=c[b>>2]|0;e=c[d+132>>2]|0;if((e|0)==0){f=d}else{eF(e);f=c[b>>2]|0}e=c[f+8>>2]|0;if((e|0)==0){g=f}else{Cc[c[(c[e+4>>2]|0)+4>>2]&255](a);g=c[b>>2]|0}dk(c[g+104>>2]|0);dk(c[(c[b>>2]|0)+108>>2]|0);Xx(a|0,111456)|0;return}function vn(a,b){a=a|0;b=b|0;var d=0,e=0.0;d=a+8|0;a=c[d>>2]|0;if(b<<24>>24==0){e=+h[a+32>>3]*72.0*.5;h[a+96>>3]=e;h[(c[d>>2]|0)+88>>3]=e;b=c[d>>2]|0;h[b+80>>3]=+h[b+40>>3]*72.0;return}else{e=+h[a+40>>3]*72.0*.5;h[a+96>>3]=e;h[(c[d>>2]|0)+88>>3]=e;a=c[d>>2]|0;h[a+80>>3]=+h[a+32>>3]*72.0;return}}function wn(){return+(+(yb()|0)/2147483647.0)}function xn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+8|0;e=d|0;f=a+8|0;a=c[f>>2]|0;if((c[a+172>>2]|0)<1){i=d;return}g=b|0;h=e;j=1;k=a;while(1){a=c[(c[k+176>>2]|0)+(j<<2)>>2]|0;c[e>>2]=$w(a|0)|0;if((Hc[c[g>>2]&63](b,h,512)|0)==0){l=jk(16)|0;c[l+8>>2]=c[e>>2];c[l+12>>2]=a;Hc[c[g>>2]&63](b,l,1)|0}else{Fv(0,110752,(l=i,i=i+8|0,c[l>>2]=c[e>>2],l)|0)|0;i=l}xn(a,b);a=c[f>>2]|0;if((j|0)<(c[a+172>>2]|0)){j=j+1|0;k=a}else{break}}i=d;return}function yn(a,b){a=a|0;b=b|0;var d=0,e=0;d=Hc[c[a>>2]&63](a,b,512)|0;if((d|0)==0){e=0;return e|0}e=c[d+12>>2]|0;return e|0}function zn(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function An(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b|0;f=Hx(e)|0;if((a[(c[b+8>>2]|0)+118|0]|0)==0){g=b;return g|0}zx(d,b,1)|0;b=gb($w(e)|0,58)|0;if((b|0)==0){cc(118576,125704,1203,170336);return 0}e=b+1|0;b=Ax(f,e,0)|0;if((b|0)!=0){g=b;return g|0}b=Ax(f,e,1)|0;e=b|0;Wx(e,111456,304,1)|0;d=Xv(f,1,0)|0;if((d|0)==0){g=b;return g|0}else{h=d}while(1){d=fw(e,h)|0;i=c[h+12>>2]|0;if((d|0)!=(i|0)){hw(e,h,i)|0}i=Xv(f,1,h)|0;if((i|0)==0){g=b;break}else{h=i}}return g|0}function Bn(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;g=i;i=i+104|0;Lv(e,118056)|0;h=g|0;j=c[45212]|0;c[45212]=j+1;nb(h|0,131392,(k=i,i=i+8|0,c[k>>2]=j,k)|0)|0;i=k;Lv(e,h)|0;h=e+4|0;k=c[h>>2]|0;j=e+8|0;if(k>>>0<(c[j>>2]|0)>>>0){l=k}else{Jv(e,1)|0;l=c[h>>2]|0}c[h>>2]=l+1;a[l]=58;l=d|0;Lv(e,$w(l)|0)|0;k=Ix(l)|0;l=c[h>>2]|0;if(l>>>0<(c[j>>2]|0)>>>0){m=l}else{Jv(e,1)|0;m=c[h>>2]|0}a[m]=0;m=c[e>>2]|0;c[h>>2]=m;h=Ax(k,m,1)|0;m=h|0;Wx(m,111456,304,1)|0;a[(c[h+8>>2]|0)+118|0]=1;zx(d,h,1)|0;zx(f,b,1)|0;b=Hx(m)|0;f=c[53614]|0;do{if((f|0)==0){d=Sx(m)|0;if((d|0)==2){n=Wv(b,2,117960,213424)|0;break}else if((d|0)==1){n=Wv(b,1,117960,213424)|0;break}else if((d|0)==0){n=Wv(b,0,117960,213424)|0;break}else{n=0;break}}else{n=f}}while(0);hw(m,n,213424)|0;c[53614]=n;n=Hx(m)|0;f=c[53582]|0;do{if((f|0)==0){b=Sx(m)|0;if((b|0)==2){o=Wv(n,2,117928,213424)|0;break}else if((b|0)==1){o=Wv(n,1,117928,213424)|0;break}else if((b|0)==0){o=Wv(n,0,117928,213424)|0;break}else{o=0;break}}else{o=f}}while(0);hw(m,o,117840)|0;c[53582]=o;o=Hx(m)|0;f=c[53590]|0;do{if((f|0)==0){n=Sx(m)|0;if((n|0)==1){p=Wv(o,1,117624,213424)|0;break}else if((n|0)==2){p=Wv(o,2,117624,213424)|0;break}else if((n|0)==0){p=Wv(o,0,117624,213424)|0;break}else{p=0;break}}else{p=f}}while(0);hw(m,p,117584)|0;c[53590]=p;i=g;return h|0}function Cn(a,b,d){a=a|0;b=b|0;d=d|0;d=jk(24)|0;c[d+8>>2]=c[b+8>>2];c[d+12>>2]=c[b+12>>2];c[d+16>>2]=c[b+16>>2];c[d+20>>2]=c[b+20>>2];return d|0}function Dn(a,b,c){a=a|0;b=b|0;c=c|0;eF(b);return}function En(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=c[b>>2]|0;a=c[d>>2]|0;do{if(e>>>0<a>>>0){f=-1}else{if(e>>>0>a>>>0){f=1;break}g=c[b+4>>2]|0;h=c[d+4>>2]|0;if(g>>>0<h>>>0){f=-1;break}f=g>>>0>h>>>0|0}}while(0);return f|0}function Fn(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ka=0,La=0.0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0;g=i;i=i+264|0;j=g|0;k=g+8|0;l=g+16|0;m=g+24|0;n=g+32|0;o=g+40|0;p=g+48|0;q=g+56|0;r=g+64|0;s=g+72|0;t=g+80|0;u=g+88|0;v=g+96|0;w=g+104|0;x=g+112|0;y=g+120|0;z=g+184|0;if((b|0)==0){A=f;i=g;return A|0}if((f|0)==0){B=fF(1,20)|0;c[B+4>>2]=e>>>0>80>>>0?e:80;C=B}else{C=f}f=C|0;B=c[f>>2]|0;e=c[C+4>>2]|0;if((B|0)==0){D=100;E=fF(100,e)|0}else{F=B+100|0;G=gF(c[C+8>>2]|0,da(F,e)|0)|0;vF(G+(da(e,B)|0)|0,0,e*100|0|0)|0;D=F;E=G}G=y;F=z|0;B=z+8|0;H=B;I=z+16|0;J=z+24|0;K=z+32|0;L=(d|0)==0;M=z+72|0;N=z;O=B;B=d+4|0;P=d+8|0;Q=y|0;R=y+8|0;S=z+8|0;T=d+24|0;U=z+8|0;V=d+40|0;W=d+20|0;X=d+12|0;Y=J;Z=z+40|0;_=d+16|0;$=z+16|0;z=d+28|0;aa=d+32|0;ba=d+36|0;ca=d+44|0;ea=D;D=b;b=E;a:while(1){E=D;while(1){fa=E+1|0;if((Qa(a[E]|0)|0)==0){break}else{E=fa}}b:do{switch(a[E]|0){case 76:{c[F>>2]=6;ga=Jn(fa,O)|0;if((ga|0)==0){ha=125;break a}if(L){ia=ga;break b}c[M>>2]=c[X>>2];ja=ga;ha=121;break};case 112:{c[F>>2]=3;ga=Jn(fa,O)|0;if((ga|0)==0){ha=125;break a}if(L){ia=ga;break b}c[M>>2]=c[B>>2];ja=ga;ha=121;break};case 99:{ga=Ja(fa|0,v|0,10)|0;ka=c[v>>2]|0;la=(ka|0)==(fa|0)?0:ka;if((la|0)==0|(ga|0)<1){ha=125;break a}else{ma=la}do{la=a[ma]|0;na=la<<24>>24==0;ma=ma+1|0}while(la<<24>>24!=45&(na^1));if(na){ha=125;break a}oa=fF(ga+1|0,1)|0;if((ga|0)>0){la=ga;ka=oa;pa=ma;while(1){qa=a[pa]|0;if(qa<<24>>24==0){ha=41;break a}ra=ka+1|0;a[ka]=qa;qa=la-1|0;sa=pa+1|0;if((qa|0)>0){la=qa;ka=ra;pa=sa}else{ta=ra;ua=sa;break}}}else{ta=oa;ua=ma}a[ta]=0;if((In(oa,y)|0)==0){ha=125;break a}if((c[Q>>2]|0)==0){c[F>>2]=9;c[S>>2]=c[R>>2];if(L){ia=ua;break b}c[M>>2]=c[T>>2];ia=ua;break b}else{c[F>>2]=14;tF(U|0,G|0,64)|0;if(L){ia=ua;break b}c[M>>2]=c[V>>2];ia=ua;break b}break};case 83:{c[F>>2]=11;pa=Ja(fa|0,m|0,10)|0;ka=c[m>>2]|0;la=(ka|0)==(fa|0)?0:ka;if((la|0)==0|(pa|0)<1){ha=125;break a}else{va=la}do{la=a[va]|0;wa=la<<24>>24==0;va=va+1|0}while(la<<24>>24!=45&(wa^1));if(wa){ha=125;break a}xa=fF(pa+1|0,1)|0;if((pa|0)>0){la=pa;ka=xa;ga=va;while(1){sa=a[ga]|0;if(sa<<24>>24==0){ha=102;break a}ra=ka+1|0;a[ka]=sa;sa=la-1|0;qa=ga+1|0;if((sa|0)>0){la=sa;ka=ra;ga=qa}else{ya=ra;za=qa;break}}}else{ya=xa;za=va}a[ya]=0;c[S>>2]=xa;if(L){ia=za;break b}c[M>>2]=c[aa>>2];ia=za;break};case 73:{c[F>>2]=12;h[H>>3]=+sF(fa,l);ga=c[l>>2]|0;if((ga|0)==(fa|0)){ha=125;break a}h[I>>3]=+sF(ga,l);ka=c[l>>2]|0;if((ga|0)==(ka|0)){ha=125;break a}h[J>>3]=+sF(ka,l);ga=c[l>>2]|0;if((ka|0)==(ga|0)){ha=125;break a}h[K>>3]=+sF(ga,l);ka=c[l>>2]|0;la=(ga|0)==(ka|0)?0:ka;if((la|0)==0){ha=125;break a}ka=Ja(la|0,k|0,10)|0;ga=c[k>>2]|0;pa=(ga|0)==(la|0)?0:ga;if((pa|0)==0|(ka|0)<1){ha=125;break a}else{Aa=pa}do{pa=a[Aa]|0;Ba=pa<<24>>24==0;Aa=Aa+1|0}while(pa<<24>>24!=45&(Ba^1));if(Ba){ha=125;break a}Ca=fF(ka+1|0,1)|0;if((ka|0)>0){pa=ka;ga=Ca;la=Aa;while(1){qa=a[la]|0;if(qa<<24>>24==0){ha=115;break a}ra=ga+1|0;a[ga]=qa;qa=pa-1|0;sa=la+1|0;if((qa|0)>0){pa=qa;ga=ra;la=sa}else{Da=ra;Ea=sa;break}}}else{Da=Ca;Ea=Aa}a[Da]=0;c[Z>>2]=Ca;if(L){ia=Ea;break b}c[M>>2]=c[ba>>2];ia=Ea;break};case 101:{c[F>>2]=1;h[H>>3]=+sF(fa,w);la=c[w>>2]|0;if((la|0)==(fa|0)){ha=125;break a}h[I>>3]=+sF(la,w);ga=c[w>>2]|0;if((la|0)==(ga|0)){ha=125;break a}h[J>>3]=+sF(ga,w);la=c[w>>2]|0;if((ga|0)==(la|0)){ha=125;break a}h[K>>3]=+sF(la,w);ga=c[w>>2]|0;pa=(la|0)==(ga|0)?0:ga;if((pa|0)==0){ha=125;break a}if(L){ia=pa;break b}c[M>>2]=c[d>>2];ja=pa;ha=121;break};case 67:{pa=Ja(fa|0,u|0,10)|0;ga=c[u>>2]|0;la=(ga|0)==(fa|0)?0:ga;if((la|0)==0|(pa|0)<1){ha=125;break a}else{Fa=la}do{la=a[Fa]|0;Ga=la<<24>>24==0;Fa=Fa+1|0}while(la<<24>>24!=45&(Ga^1));if(Ga){ha=125;break a}Ha=fF(pa+1|0,1)|0;if((pa|0)>0){la=pa;ga=Ha;ka=Fa;while(1){sa=a[ka]|0;if(sa<<24>>24==0){ha=54;break a}ra=ga+1|0;a[ga]=sa;sa=la-1|0;qa=ka+1|0;if((sa|0)>0){la=sa;ga=ra;ka=qa}else{Ia=ra;Ka=qa;break}}}else{Ia=Ha;Ka=Fa}a[Ia]=0;if((In(Ha,y)|0)==0){ha=125;break a}if((c[Q>>2]|0)==0){c[F>>2]=8;c[S>>2]=c[R>>2];if(L){ia=Ka;break b}c[M>>2]=c[W>>2];ia=Ka;break b}else{c[F>>2]=13;tF(U|0,G|0,64)|0;if(L){ia=Ka;break b}c[M>>2]=c[V>>2];ia=Ka;break b}break};case 70:{c[F>>2]=10;La=+sF(fa,o);ka=c[o>>2]|0;if((ka|0)==(fa|0)){ha=125;break a}h[H>>3]=La;if((ka|0)==0){ha=125;break a}ga=Ja(ka|0,n|0,10)|0;la=c[n>>2]|0;pa=(la|0)==(ka|0)?0:la;if((pa|0)==0|(ga|0)<1){ha=125;break a}else{Ma=pa}do{pa=a[Ma]|0;Na=pa<<24>>24==0;Ma=Ma+1|0}while(pa<<24>>24!=45&(Na^1));if(Na){ha=125;break a}Oa=fF(ga+1|0,1)|0;if((ga|0)>0){pa=ga;la=Oa;ka=Ma;while(1){qa=a[ka]|0;if(qa<<24>>24==0){ha=93;break a}ra=la+1|0;a[la]=qa;qa=pa-1|0;sa=ka+1|0;if((qa|0)>0){pa=qa;la=ra;ka=sa}else{Pa=ra;Ra=sa;break}}}else{Pa=Oa;Ra=Ma}a[Pa]=0;c[$>>2]=Oa;if(L){ia=Ra;break b}c[M>>2]=c[z>>2];ia=Ra;break};case 116:{c[F>>2]=15;c[S>>2]=Ja(fa|0,j|0,10)|0;ka=c[j>>2]|0;la=(ka|0)==(fa|0)?0:ka;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[ca>>2];ja=la;ha=121;break};case 66:{c[F>>2]=5;la=Jn(fa,O)|0;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[P>>2];ja=la;ha=121;break};case 80:{c[F>>2]=2;la=Jn(fa,O)|0;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[B>>2];ja=la;ha=121;break};case 0:{break a;break};case 98:{c[F>>2]=4;la=Jn(fa,O)|0;if((la|0)==0){ha=125;break a}if(L){ia=la;break b}c[M>>2]=c[P>>2];ja=la;ha=121;break};case 84:{c[F>>2]=7;La=+sF(fa,t);la=c[t>>2]|0;if((la|0)==(fa|0)){ha=125;break a}h[H>>3]=La;if((la|0)==0){ha=125;break a}La=+sF(la,s);ka=c[s>>2]|0;if((ka|0)==(la|0)){ha=125;break a}h[I>>3]=La;if((ka|0)==0){ha=125;break a}la=Ja(ka|0,r|0,10)|0;pa=c[r>>2]|0;ga=(pa|0)==(ka|0)?0:pa;do{if((la|0)<0){c[Y>>2]=0}else{if((la|0)>0){c[Y>>2]=2;break}else{c[Y>>2]=1;break}}}while(0);if((ga|0)==0){ha=125;break a}La=+sF(ga,q);la=c[q>>2]|0;if((la|0)==(ga|0)){ha=125;break a}h[K>>3]=La;if((la|0)==0){ha=125;break a}pa=Ja(la|0,p|0,10)|0;ka=c[p>>2]|0;sa=(ka|0)==(la|0)?0:ka;if((sa|0)==0|(pa|0)<1){ha=125;break a}else{Sa=sa}do{sa=a[Sa]|0;Ta=sa<<24>>24==0;Sa=Sa+1|0}while(sa<<24>>24!=45&(Ta^1));if(Ta){ha=125;break a}Ua=fF(pa+1|0,1)|0;if((pa|0)>0){ga=pa;sa=Ua;ka=Sa;while(1){la=a[ka]|0;if(la<<24>>24==0){ha=82;break a}ra=sa+1|0;a[sa]=la;la=ga-1|0;qa=ka+1|0;if((la|0)>0){ga=la;sa=ra;ka=qa}else{Va=ra;Wa=qa;break}}}else{Va=Ua;Wa=Sa}a[Va]=0;c[Z>>2]=Ua;if(L){ia=Wa;break b}c[M>>2]=c[_>>2];ia=Wa;break};case 69:{c[F>>2]=0;h[H>>3]=+sF(fa,x);ka=c[x>>2]|0;if((ka|0)==(fa|0)){ha=125;break a}h[I>>3]=+sF(ka,x);sa=c[x>>2]|0;if((ka|0)==(sa|0)){ha=125;break a}h[J>>3]=+sF(sa,x);ka=c[x>>2]|0;if((sa|0)==(ka|0)){ha=125;break a}h[K>>3]=+sF(ka,x);sa=c[x>>2]|0;ga=(ka|0)==(sa|0)?0:sa;if((ga|0)==0){ha=125;break a}if(L){ia=ga;break b}c[M>>2]=c[d>>2];ja=ga;ha=121;break};default:{ha=125;break a}}}while(0);if((ha|0)==121){ha=0;if((ja|0)==0){break}else{ia=ja}}E=c[f>>2]|0;if((E|0)==(ea|0)){ga=ea<<1;sa=gF(b,da(ga,e)|0)|0;ka=da(ea,e)|0;vF(sa+ka|0,0,ka|0)|0;Xa=ga;Ya=sa;Za=c[f>>2]|0}else{Xa=ea;Ya=b;Za=E}tF(Ya+(da(Za,e)|0)|0,N|0,80)|0;c[f>>2]=(c[f>>2]|0)+1;ea=Xa;D=ia;b=Ya}if((ha|0)==41){eF(oa);ha=125}else if((ha|0)==54){eF(Ha);ha=125}else if((ha|0)==82){eF(Ua);ha=125}else if((ha|0)==93){eF(Oa);ha=125}else if((ha|0)==102){eF(xa);ha=125}else if((ha|0)==115){eF(Ca);ha=125}if((ha|0)==125){ha=C+16|0;c[ha>>2]=c[ha>>2]|1}ha=c[f>>2]|0;if((ha|0)==0){eF(b);eF(C);A=0;i=g;return A|0}else{c[C+8>>2]=gF(b,da(ha,e)|0)|0;A=C;i=g;return A|0}return 0}function Gn(a,b,c){a=a|0;b=b|0;c=c|0;return Fn(a,b,c,0)|0}function Hn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;b=c[a+12>>2]|0;if((a|0)==0){return}d=c[a+8>>2]|0;e=a|0;a:do{if((c[e>>2]|0)>0){f=a+4|0;g=(b|0)==0;h=0;while(1){i=da(c[f>>2]|0,h)|0;j=d+i|0;if(!g){Cc[b&255](j)}b:do{switch(c[j>>2]|0){case 13:case 14:{k=c[d+(i+8)>>2]|0;if((k|0)==1){l=d+(i+48)|0;m=d+(i+52)|0;n=c[m>>2]|0;if((c[l>>2]|0)>0){o=0;p=n;while(1){eF(c[p+(o<<3)+4>>2]|0);q=o+1|0;r=c[m>>2]|0;if((q|0)<(c[l>>2]|0)){o=q;p=r}else{s=r;break}}}else{s=n}eF(s);break b}else if((k|0)==2){p=d+(i+64)|0;o=d+(i+68)|0;l=c[o>>2]|0;if((c[p>>2]|0)>0){m=0;r=l;while(1){eF(c[r+(m<<3)+4>>2]|0);q=m+1|0;t=c[o>>2]|0;if((q|0)<(c[p>>2]|0)){m=q;r=t}else{u=t;break}}}else{u=l}eF(u);break b}else{break b}break};case 8:case 9:{eF(c[d+(i+8)>>2]|0);break};case 4:case 5:{eF(c[d+(i+12)>>2]|0);break};case 6:{eF(c[d+(i+12)>>2]|0);break};case 2:case 3:{eF(c[d+(i+12)>>2]|0);break};case 7:{eF(c[d+(i+40)>>2]|0);break};case 10:{eF(c[d+(i+16)>>2]|0);break};case 11:{eF(c[d+(i+8)>>2]|0);break};case 12:{eF(c[d+(i+40)>>2]|0);break};default:{}}}while(0);h=h+1|0;if((h|0)>=(c[e>>2]|0)){break a}}}}while(0);eF(d);eF(a);return}function In(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0.0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0;e=i;i=i+128|0;f=e|0;j=e+8|0;k=e+16|0;l=e+24|0;m=e+32|0;n=e+40|0;o=e+48|0;p=e+56|0;q=e+64|0;r=e+72|0;s=e+80|0;t=e+88|0;u=e+96|0;v=e+104|0;w=e+112|0;x=e+120|0;y=a[b]|0;if((y|0)==91){z=b+1|0;c[d>>2]=1;A=d+8|0;B=A;C=+sF(z,x);D=c[x>>2]|0;if((D|0)==(z|0)){E=0;i=e;return E|0}h[A>>3]=C;if((D|0)==0){E=0;i=e;return E|0}C=+sF(D,w);A=c[w>>2]|0;if((A|0)==(D|0)){E=0;i=e;return E|0}h[d+16>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,v);D=c[v>>2]|0;if((D|0)==(A|0)){E=0;i=e;return E|0}h[d+24>>3]=C;if((D|0)==0){E=0;i=e;return E|0}C=+sF(D,u);A=c[u>>2]|0;if((A|0)==(D|0)){E=0;i=e;return E|0}h[d+32>>3]=C;if((A|0)==0){E=0;i=e;return E|0}D=d+40|0;u=Ja(A|0,t|0,10)|0;c[D>>2]=u;v=c[t>>2]|0;t=(v|0)==(A|0)?0:v;if((t|0)==0){E=0;i=e;return E|0}v=fF(u,8)|0;A=v;a:do{if((u|0)>0){w=t;x=0;b:while(1){C=+sF(w,s);F=c[s>>2]|0;if((F|0)==(w|0)|(F|0)==0){G=14;break}g[A+(x<<3)>>2]=C;H=A+(x<<3)+4|0;I=Ja(F|0,r|0,10)|0;J=c[r>>2]|0;K=(J|0)==(F|0)?0:J;if((K|0)==0|(I|0)<1){break}else{L=K}do{K=a[L]|0;M=K<<24>>24==0;L=L+1|0}while(K<<24>>24!=45&(M^1));if(M){break}N=fF(I+1|0,1)|0;if((I|0)>0){K=I;J=N;F=L;while(1){O=a[F]|0;if(O<<24>>24==0){G=21;break b}P=J+1|0;a[J]=O;O=K-1|0;Q=F+1|0;if((O|0)>0){K=O;J=P;F=Q}else{R=P;S=Q;break}}}else{R=N;S=L}a[R]=0;c[H>>2]=N;F=x+1|0;if((F|0)<(c[D>>2]|0)){w=S;x=F}else{break a}}if((G|0)==14){eF(v);E=0;i=e;return E|0}else if((G|0)==21){eF(N)}eF(v);E=0;i=e;return E|0}}while(0);c[B+36>>2]=A;E=z;i=e;return E|0}else if((y|0)==40){z=b+1|0;c[d>>2]=2;C=+sF(z,q);A=c[q>>2]|0;if((A|0)==(z|0)){E=0;i=e;return E|0}h[d+8>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,p);q=c[p>>2]|0;if((q|0)==(A|0)){E=0;i=e;return E|0}h[d+16>>3]=C;if((q|0)==0){E=0;i=e;return E|0}C=+sF(q,o);A=c[o>>2]|0;if((A|0)==(q|0)){E=0;i=e;return E|0}h[d+24>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,n);q=c[n>>2]|0;if((q|0)==(A|0)){E=0;i=e;return E|0}h[d+32>>3]=C;if((q|0)==0){E=0;i=e;return E|0}C=+sF(q,m);A=c[m>>2]|0;if((A|0)==(q|0)){E=0;i=e;return E|0}h[d+40>>3]=C;if((A|0)==0){E=0;i=e;return E|0}C=+sF(A,l);q=c[l>>2]|0;if((q|0)==(A|0)){E=0;i=e;return E|0}h[d+48>>3]=C;if((q|0)==0){E=0;i=e;return E|0}A=d+56|0;l=Ja(q|0,k|0,10)|0;c[A>>2]=l;m=c[k>>2]|0;k=(m|0)==(q|0)?0:m;if((k|0)==0){E=0;i=e;return E|0}m=fF(l,8)|0;q=m;c:do{if((l|0)>0){n=k;o=0;d:while(1){C=+sF(n,j);p=c[j>>2]|0;if((p|0)==(n|0)|(p|0)==0){G=41;break}g[q+(o<<3)>>2]=C;B=q+(o<<3)+4|0;v=Ja(p|0,f|0,10)|0;N=c[f>>2]|0;S=(N|0)==(p|0)?0:N;if((S|0)==0|(v|0)<1){break}else{T=S}do{S=a[T]|0;U=S<<24>>24==0;T=T+1|0}while(S<<24>>24!=45&(U^1));if(U){break}V=fF(v+1|0,1)|0;if((v|0)>0){H=v;S=V;N=T;while(1){p=a[N]|0;if(p<<24>>24==0){G=48;break d}D=S+1|0;a[S]=p;p=H-1|0;R=N+1|0;if((p|0)>0){H=p;S=D;N=R}else{W=D;X=R;break}}}else{W=V;X=T}a[W]=0;c[B>>2]=V;N=o+1|0;if((N|0)<(c[A>>2]|0)){n=X;o=N}else{break c}}if((G|0)==41){eF(m);E=0;i=e;return E|0}else if((G|0)==48){eF(V)}eF(m);E=0;i=e;return E|0}}while(0);c[d+60>>2]=q;E=z;i=e;return E|0}else if((y|0)==35|(y|0)==47){c[d>>2]=0;c[d+8>>2]=b;E=b;i=e;return E|0}else{if((tb(y|0)|0)==0){E=0;i=e;return E|0}c[d>>2]=0;c[d+8>>2]=b;E=b;i=e;return E|0}return 0}function Jn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;i=i+16|0;e=d|0;f=d+8|0;g=Ja(a|0,e|0,10)|0;j=c[e>>2]|0;e=(j|0)==(a|0)?0:j;if((e|0)==0){k=0;i=d;return k|0}j=fF(g,24)|0;a=j;l=b|0;c[l>>2]=g;a:do{if((g|0)>0){m=0;n=e;o=a;while(1){h[o>>3]=+sF(n,f);p=c[f>>2]|0;if((n|0)==(p|0)){q=4;break}h[o+8>>3]=+sF(p,f);r=c[f>>2]|0;if((p|0)==(r|0)){q=6;break}h[o+16>>3]=0.0;p=m+1|0;if((p|0)<(c[l>>2]|0)){m=p;n=r;o=o+24|0}else{s=r;break a}}if((q|0)==4){eF(j);k=0;i=d;return k|0}else if((q|0)==6){eF(j);k=0;i=d;return k|0}}else{s=e}}while(0);c[b+4>>2]=a;k=s;i=d;return k|0}function Kn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;Vo(a);b=a;d=c[b>>2]&3;e=a-32|0;f=a+32|0;g=So(c[((d|0)==2?a:e)+28>>2]|0,c[((d|0)==3?a:f)+28>>2]|0)|0;if((g|0)==0){d=c[b>>2]&3;Zo(c[((d|0)==2?a:e)+28>>2]|0,c[((d|0)==3?a:f)+28>>2]|0,a)|0;return}else{ep(a,g);return}}function Ln(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b+8|0;b=c[d>>2]|0;e=b+204|0;if((c[e+4>>2]|0)>0){f=0;g=b;h=e}else{return}while(1){c[g+180>>2]=c[(c[h>>2]|0)+(f<<2)>>2];e=c[d>>2]|0;b=c[e+180>>2]|0;do{if((b|0)==0){i=e}else{j=b;do{k=j+8|0;a[(c[k>>2]|0)+157|0]=0;j=c[(c[k>>2]|0)+164>>2]|0;}while((j|0)!=0);j=c[d>>2]|0;k=c[j+180>>2]|0;if((k|0)==0){i=j;break}else{l=k}do{Mn(l);l=c[(c[l+8>>2]|0)+164>>2]|0;}while((l|0)!=0);i=c[d>>2]|0}}while(0);b=f+1|0;e=i+204|0;if((b|0)<(c[e+4>>2]|0)){f=b;g=i;h=e}else{break}}return}function Mn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=b+8|0;b=(c[d>>2]|0)+157|0;if((a[b]|0)!=0){return}a[b]=1;a[(c[d>>2]|0)+158|0]=1;b=c[d>>2]|0;e=c[c[b+180>>2]>>2]|0;if((e|0)==0){f=b}else{b=0;g=e;while(1){e=g;h=g-32|0;i=c[((c[e>>2]&3|0)==2?g:h)+28>>2]|0;j=c[i+8>>2]|0;do{if((a[j+158|0]|0)==0){if((a[j+157|0]|0)!=0){k=b;break}Mn(i);k=b}else{Vo(g);l=c[e>>2]&3;m=g+32|0;n=So(c[((l|0)==2?g:h)+28>>2]|0,c[((l|0)==3?g:m)+28>>2]|0)|0;if((n|0)==0){l=c[e>>2]&3;Zo(c[((l|0)==2?g:h)+28>>2]|0,c[((l|0)==3?g:m)+28>>2]|0,g)|0}else{ep(g,n)}k=b-1|0}}while(0);h=k+1|0;e=c[d>>2]|0;i=c[(c[e+180>>2]|0)+(h<<2)>>2]|0;if((i|0)==0){f=e;break}else{b=h;g=i}}}a[f+158|0]=0;return}function Nn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=ux(a)|0;if((b|0)==0){d=0;return d|0}else{e=0;f=b}while(1){b=mw(a,f)|0;if((b|0)==0){g=e}else{h=e;i=b;while(1){b=c[i>>2]&3;j=c[(c[(c[((b|0)==2?i:i-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;k=c[(c[(c[((b|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;if((j|0)==(k|0)){l=h}else{b=j-k|0;l=h-1+((b|0)>-1?b:-b|0)|0}b=ow(a,i)|0;if((b|0)==0){g=l;break}else{h=l;i=b}}}i=vx(a,f)|0;if((i|0)==0){d=g;break}else{e=g;f=i}}return d|0}function On(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=ux(b)|0;if((d|0)==0){return}else{e=d}do{d=e+8|0;f=(c[d>>2]|0)+172|0;if((c[f+4>>2]|0)>0){g=0;h=f;do{a[(c[(c[(c[h>>2]|0)+(g<<2)>>2]|0)+8>>2]|0)+112|0]=0;g=g+1|0;h=(c[d>>2]|0)+172|0;}while((g|0)<(c[h+4>>2]|0))}e=vx(b,e)|0;}while((e|0)!=0);return}function Pn(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0.0,s=0.0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0,B=0.0,C=0.0,D=0.0,E=0,F=0.0,G=0,H=0,I=0,J=0.0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0.0,qa=0.0,ra=0.0,sa=0;e=i;f=c[d+24>>2]|0;c[44276]=kk((Lw(b)|0)*24|0)|0;c[44318]=0;g=ux(b)|0;if((g|0)!=0){j=g;do{c[(c[j+8>>2]|0)+120>>2]=-1;j=vx(b,j)|0;}while((j|0)!=0)}j=ux(b)|0;if((j|0)!=0){g=j;do{j=g+8|0;do{if((c[(c[j>>2]|0)+216>>2]|0)==0){k=jk(4)|0;c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]=k;c[c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]>>2]=g;c[(c[44276]|0)+((c[44318]|0)*24|0)+4>>2]=1;k=c[44318]|0;l=c[44276]|0;h[l+(k*24|0)+8>>3]=+h[(c[j>>2]|0)+32>>3];h[l+(k*24|0)+16>>3]=+h[(c[j>>2]|0)+40>>3];c[(c[j>>2]|0)+120>>2]=k;c[44318]=(c[44318]|0)+1}else{k=Lm(g)|0;l=k+8|0;m=c[l>>2]|0;n=c[m+120>>2]|0;if((n|0)>-1){p=(c[44276]|0)+(n*24|0)+4|0;q=c[p>>2]|0;c[p>>2]=q+1;c[(c[(c[44276]|0)+(n*24|0)>>2]|0)+(q<<2)>>2]=g;q=c[44276]|0;p=q+(n*24|0)+8|0;h[p>>3]=+h[(c[j>>2]|0)+32>>3]+ +h[p>>3];p=q+(n*24|0)+16|0;r=+h[p>>3];s=+h[(c[j>>2]|0)+40>>3];h[p>>3]=r<s?s:r;c[(c[j>>2]|0)+120>>2]=n;break}n=jk(c[m+216>>2]<<2)|0;c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]=n;c[c[(c[44276]|0)+((c[44318]|0)*24|0)>>2]>>2]=k;n=c[44318]|0;m=c[44276]|0;if((k|0)==(g|0)){c[m+(n*24|0)+4>>2]=1;k=c[44318]|0;p=c[44276]|0;h[p+(k*24|0)+8>>3]=+h[(c[l>>2]|0)+32>>3];h[p+(k*24|0)+16>>3]=+h[(c[l>>2]|0)+40>>3];t=k}else{c[(c[m+(n*24|0)>>2]|0)+4>>2]=g;c[(c[44276]|0)+((c[44318]|0)*24|0)+4>>2]=2;n=c[44318]|0;m=c[44276]|0;h[m+(n*24|0)+8>>3]=+h[(c[l>>2]|0)+32>>3]+ +h[(c[j>>2]|0)+32>>3];r=+h[(c[l>>2]|0)+40>>3];s=+h[(c[j>>2]|0)+40>>3];h[m+(n*24|0)+16>>3]=r<s?s:r;t=n}c[(c[l>>2]|0)+120>>2]=t;c[(c[j>>2]|0)+120>>2]=c[44318];c[44318]=(c[44318]|0)+1}}while(0);g=vx(b,g)|0;}while((g|0)!=0)}g=(f|0)==-1;a:do{if((f|0)>0|g){t=b+8|0;j=d+8|0;l=d|0;n=g^1;m=c[o>>2]|0;k=0;r=1.7976931348623157e+308;while(1){p=ux(b)|0;if((p|0)!=0){q=p;do{c[(c[q+8>>2]|0)+232>>2]=0;q=vx(b,q)|0;}while((q|0)!=0)}Yp(b);Qn(b);q=c[44320]|0;p=c[t>>2]|0;s=+(da(c[p+240>>2]|0,q-1|0)|0);if((q|0)>0){u=c[44394]|0;v=c[p+236>>2]|0;w=0.0;x=s;p=0;while(1){y=+h[u+(p*40|0)+24>>3]+ +(da(c[u+(p*40|0)+16>>2]|0,v)|0);z=w<y?y:w;y=x+ +h[u+(p*40|0)+32>>3];A=p+1|0;if((A|0)<(q|0)){w=z;x=y;p=A}else{B=z;C=y;break}}}else{B=0.0;C=s}x=B/C;h[j>>3]=x;if((a[213992]|0)==0){D=x}else{gc(m|0,121560,(p=i,i=i+8|0,h[p>>3]=x,p)|0)|0;i=p;D=+h[j>>3]}if(D<=+h[l>>3]){break}if(!(r>D|n)){break}c[43750]=jk((Lw(b)|0)<<2)|0;if((Lw(b)|0)>0){p=0;do{c[(c[43750]|0)+(p<<2)>>2]=p;p=p+1|0;}while((p|0)<(Lw(b)|0))}Qn(b);p=c[43750]|0;Jb(p|0,Lw(b)|0,4,166);p=c[44320]|0;q=c[43750]|0;u=c[44394]|0;v=0;while(1){if((v|0)>=(p|0)){E=0;F=0.0;break}G=c[q+(v<<2)>>2]|0;H=v+1|0;if((c[u+(G*40|0)+12>>2]|0)<2){v=H}else{I=30;break}}do{if((I|0)==30){I=0;if((p|0)<=(H|0)){E=G;F=0.0;break}E=G;F=+h[u+((c[q+(H<<2)>>2]|0)*40|0)+24>>3]}}while(0);do{if((v|0)!=(p|0)){Jb(c[u+(E*40|0)+4>>2]|0,c[u+(E*40|0)+12>>2]|0,4,104);q=c[44394]|0;s=+h[q+(E*40|0)+24>>3];if(F>s*.25){if(F<s*3.0*.25){J=F}else{I=35}}else{I=35}if((I|0)==35){I=0;J=s*.5}A=c[q+(E*40|0)+12>>2]|0;if((A|0)>0){K=0.0;L=0;M=0;N=0;O=0;P=q}else{break}while(1){q=c[P+(E*40|0)+8>>2]|0;do{if((c[q+(O<<2)>>2]|0)==0){Q=c[(c[P+(E*40|0)+4>>2]|0)+(O<<2)>>2]|0;R=Q+8|0;s=+h[R>>3]*72.0;x=K>0.0?+(c[(c[t>>2]|0)+236>>2]|0):0.0;S=(L|0)==0;if(K+s+x<=J|S){T=N;U=S?Q:M;V=S?1:L;W=K+(s+x);X=P;break}S=M+4|0;Y=c[S>>2]|0;if((Y|0)>0){Z=Q+4|0;_=M|0;$=Q|0;Q=0;aa=c[Z>>2]|0;ba=Y;while(1){if((aa|0)>0){Y=0;do{a[(c[(Zo(c[(c[_>>2]|0)+(Q<<2)>>2]|0,c[(c[$>>2]|0)+(Y<<2)>>2]|0,0)|0)+8>>2]|0)+112|0]=1;Y=Y+1|0;ca=c[Z>>2]|0;}while((Y|0)<(ca|0));ea=ca;fa=c[S>>2]|0}else{ea=aa;fa=ba}Y=Q+1|0;if((Y|0)<(fa|0)){Q=Y;aa=ea;ba=fa}else{break}}ga=c[(c[44394]|0)+(E*40|0)+8>>2]|0}else{ga=q}c[ga+(O<<2)>>2]=1;ba=(c[44394]|0)+(E*40|0)+12|0;c[ba>>2]=(c[ba>>2]|0)-1;ba=(c[44394]|0)+(E*40|0)+16|0;c[ba>>2]=(c[ba>>2]|0)+1;ba=c[44394]|0;aa=ba+(E*40|0)+24|0;h[aa>>3]=+h[aa>>3]-(+h[R>>3]*72.0+ +(c[(c[t>>2]|0)+236>>2]|0));T=N;U=M;V=L;W=K;X=ba}else{T=N+1|0;U=M;V=L;W=K;X=P}}while(0);q=O+1|0;if((q|0)<(T+A|0)){K=W;L=V;M=U;N=T;O=q;P=X}else{break}}}}while(0);u=k+1|0;if((u|0)<(f|0)|g){k=u;r=D}else{break a}}t=d+20|0;c[d+16>>2]=c[t>>2];c[t>>2]=k}}while(0);Yp(b);Qn(b);g=c[44320]|0;if((g|0)>0){f=0;X=0;P=0;O=c[44394]|0;T=g;while(1){g=O+(P*40|0)|0;N=c[O+(P*40|0)+12>>2]|0;U=(X|0)==0;do{if((N|0)==0){if(U){ha=c[g>>2]|0}else{ha=f}ia=X+1|0;ja=ha;ka=O;la=T}else{if(U){ia=0;ja=f;ka=O;la=T;break}if((c[g>>2]|0)>(f|0)&(N|0)>0){ma=0;na=O}else{ia=X;ja=f;ka=O;la=T;break}while(1){M=c[(c[na+(P*40|0)+4>>2]|0)+(ma<<2)>>2]|0;V=M+4|0;if((c[V>>2]|0)>0){L=M|0;M=0;do{E=(c[(c[(c[L>>2]|0)+(M<<2)>>2]|0)+8>>2]|0)+232|0;c[E>>2]=(c[E>>2]|0)-X;M=M+1|0;}while((M|0)<(c[V>>2]|0));oa=c[44394]|0}else{oa=na}V=ma+1|0;if((V|0)<(c[oa+(P*40|0)+12>>2]|0)){ma=V;na=oa}else{break}}ia=X;ja=f;ka=oa;la=c[44320]|0}}while(0);N=P+1|0;if((N|0)<(la|0)){f=ja;X=ia;P=N;O=ka;T=la}else{break}}}Qn(b);la=c[44320]|0;T=c[b+8>>2]|0;D=+(da(c[T+240>>2]|0,la-1|0)|0);if((la|0)<=0){pa=0.0;qa=D;ra=pa/qa;sa=d+8|0;h[sa>>3]=ra;i=e;return}b=c[44394]|0;ka=c[T+236>>2]|0;W=0.0;K=D;T=0;while(1){D=+h[b+(T*40|0)+24>>3]+ +(da(c[b+(T*40|0)+16>>2]|0,ka)|0);J=W<D?D:W;D=K+ +h[b+(T*40|0)+32>>3];O=T+1|0;if((O|0)<(la|0)){W=J;K=D;T=O}else{pa=J;qa=D;break}}ra=pa/qa;sa=d+8|0;h[sa>>3]=ra;i=e;return}function Qn(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0;c[44320]=0;b=c[44394]|0;if((b|0)!=0){if((c[44318]|0)>0){d=0;e=b;while(1){f=c[e+(d*40|0)+4>>2]|0;if((f|0)==0){g=e}else{eF(f);g=c[44394]|0}f=c[g+(d*40|0)+8>>2]|0;if((f|0)==0){i=g}else{eF(f);i=c[44394]|0}f=d+1|0;if((f|0)<(c[44318]|0)){d=f;e=i}else{j=i;break}}}else{j=b}eF(j)}c[44394]=jk((c[44318]|0)*40|0)|0;j=c[44318]|0;if((j|0)>0){b=0;i=j;while(1){j=jk(i<<2)|0;c[(c[44394]|0)+(b*40|0)+4>>2]=j;j=jk(c[44318]<<2)|0;c[(c[44394]|0)+(b*40|0)+8>>2]=j;c[(c[44394]|0)+(b*40|0)>>2]=b;c[(c[44394]|0)+(b*40|0)+12>>2]=0;c[(c[44394]|0)+(b*40|0)+16>>2]=0;j=b+1|0;vF((c[44394]|0)+(b*40|0)+24|0,0,16)|0;e=c[44318]|0;if((j|0)<(e|0)){b=j;i=e}else{break}}}i=ux(a)|0;if((i|0)!=0){b=i;do{i=mw(a,b)|0;if((i|0)!=0){e=i;do{i=e;j=c[i>>2]&3;d=(c[(c[(c[((j|0)==3?e:e+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)+1|0;g=e-32|0;if((d|0)<(c[(c[(c[((j|0)==2?e:g)+28>>2]|0)+8>>2]|0)+232>>2]|0)){j=d;do{d=(c[44394]|0)+(j*40|0)+16|0;c[d>>2]=(c[d>>2]|0)+1;j=j+1|0;}while((j|0)<(c[(c[(c[((c[i>>2]&3|0)==2?e:g)+28>>2]|0)+8>>2]|0)+232>>2]|0))}e=ow(a,e)|0;}while((e|0)!=0)}b=vx(a,b)|0;}while((b|0)!=0)}if((c[44318]|0)<=0){return}b=a+8|0;a=0;do{e=c[44276]|0;g=(c[c[e+(a*24|0)>>2]>>2]|0)+8|0;i=c[(c[g>>2]|0)+232>>2]|0;if((i|0)<(c[44320]|0)){k=i}else{c[44320]=i+1;k=c[(c[g>>2]|0)+232>>2]|0}i=c[44394]|0;j=i+(k*40|0)+24|0;l=+h[j>>3];h[j>>3]=l+(+h[e+(a*24|0)+8>>3]*72.0+(l>0.0?+(c[(c[b>>2]|0)+236>>2]|0):0.0));j=c[(c[g>>2]|0)+232>>2]|0;d=i+(j*40|0)+32|0;l=+h[e+(a*24|0)+16>>3]*72.0;if(+h[d>>3]<l){h[d>>3]=l;m=c[(c[g>>2]|0)+232>>2]|0}else{m=j}c[(c[i+(m*40|0)+4>>2]|0)+(c[i+(m*40|0)+12>>2]<<2)>>2]=e+(a*24|0);e=(c[44394]|0)+((c[(c[g>>2]|0)+232>>2]|0)*40|0)+12|0;c[e>>2]=(c[e>>2]|0)+1;a=a+1|0;}while((a|0)<(c[44318]|0));return}function Rn(a){a=a|0;var b=0,d=0;b=ux(a)|0;if((b|0)==0){return}else{d=b}do{c[(c[d+8>>2]|0)+216>>2]=0;d=vx(a,d)|0;}while((d|0)!=0);return}function Sn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;i=i+16|0;e=d+8|0;c[e>>2]=5;f=ew(a|0,158384)|0;do{if((f|0)!=0){a=ac(f|0,128368,(g=i,i=i+16|0,c[g>>2]=d,c[g+8>>2]=e,g)|0)|0;i=g;if((a|0)<1){break}Fv(0,115472,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;c[b+24>>2]=0;c[b+32>>2]=0;i=d;return 0}}while(0);c[b+24>>2]=0;c[b+32>>2]=0;i=d;return 0}function Tn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=b;b=c[a>>2]|0;a=b+4|0;if((c[a>>2]|0)>0){e=b|0;b=0;f=0;while(1){g=c[(c[e>>2]|0)+(f<<2)>>2]|0;h=Hx(g|0)|0;i=mw(h,g)|0;if((i|0)==0){j=b}else{g=b;k=i;while(1){i=g+1|0;l=ow(h,k)|0;if((l|0)==0){j=i;break}else{g=i;k=l}}}k=f+1|0;if((k|0)<(c[a>>2]|0)){b=j;f=k}else{m=j;break}}}else{m=0}j=c[d>>2]|0;d=j+4|0;if((c[d>>2]|0)<=0){n=0;o=(n|0)<(m|0);p=o&1;q=(n|0)>(m|0);r=q&1;s=p-r|0;return s|0}f=j|0;j=0;b=0;while(1){a=c[(c[f>>2]|0)+(b<<2)>>2]|0;e=Hx(a|0)|0;k=mw(e,a)|0;if((k|0)==0){t=j}else{a=j;g=k;while(1){k=a+1|0;h=ow(e,g)|0;if((h|0)==0){t=k;break}else{a=k;g=h}}}g=b+1|0;if((g|0)<(c[d>>2]|0)){j=t;b=g}else{n=t;break}}o=(n|0)<(m|0);p=o&1;q=(n|0)>(m|0);r=q&1;s=p-r|0;return s|0}function Un(a,b){a=a|0;b=b|0;var d=0,e=0.0,f=0.0;d=c[44394]|0;e=+h[d+((c[b>>2]|0)*40|0)+24>>3];f=+h[d+((c[a>>2]|0)*40|0)+24>>3];return(e>f)-(e<f)|0}function Vn(b){b=b|0;var d=0,e=0,f=0;d=c[53812]|0;do{if((d|0)!=0){e=fw(b|0,d)|0;if((e|0)==0){break}if((a[e]|0)==0){break}if((Km(e)|0)<<24>>24==0){f=1}else{break}return f|0}}while(0);f=0;return f|0}function Wn(b){b=b|0;var d=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0;co(b);d=ux(b)|0;if((d|0)==0){return}else{f=d}do{d=mw(b,f)|0;if((d|0)!=0){g=d;do{d=g+8|0;a:do{if((c[(c[d>>2]|0)+172>>2]|0)==0){h=c[53812]|0;do{if((h|0)!=0){i=fw(g|0,h)|0;if((i|0)==0){break}if((a[i]|0)==0){break}if((Km(i)|0)<<24>>24==0){break a}}}while(0);h=g;i=g+32|0;j=Lm(c[((c[h>>2]&3|0)==3?g:i)+28>>2]|0)|0;k=g-32|0;l=Lm(c[((c[h>>2]&3|0)==2?g:k)+28>>2]|0)|0;if((j|0)==(l|0)){break}do{if((c[(c[j+8>>2]|0)+212>>2]|0)==0){if((c[(c[l+8>>2]|0)+212>>2]|0)!=0){break}m=So(j,l)|0;if((m|0)==0){Zo(j,l,g)|0;break a}else{ep(g,m);break a}}}while(0);l=c[h>>2]&3;j=c[((l|0)==3?g:i)+28>>2]|0;m=c[((l|0)==2?g:k)+28>>2]|0;l=c[j+8>>2]|0;n=c[l+212>>2]|0;if((n|0)==0){o=0}else{o=(c[l+232>>2]|0)-(c[(c[(c[(c[n+8>>2]|0)+252>>2]|0)+8>>2]|0)+232>>2]|0)|0}n=c[m+8>>2]|0;l=c[n+212>>2]|0;if((l|0)==0){p=0}else{p=(c[n+232>>2]|0)-(c[(c[(c[(c[l+8>>2]|0)+252>>2]|0)+8>>2]|0)+232>>2]|0)|0}l=(e[(c[d>>2]|0)+170>>1]|0)+(o-p)|0;if((l|0)>0){q=0.0;r=+(l|0)}else{q=+(-l|0);r=0.0}l=bp(b)|0;a[(c[l+8>>2]|0)+156|0]=2;n=Lm(j)|0;j=Lm(m)|0;m=Jp(l,n,q,(c[(c[d>>2]|0)+156>>2]|0)*10|0)|0;n=g;c[(c[(Jp(l,j,r,c[(c[d>>2]|0)+156>>2]|0)|0)+8>>2]|0)+116>>2]=n;c[(c[m+8>>2]|0)+116>>2]=n}}while(0);g=ow(b,g)|0;}while((g|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0);return}function Xn(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0.0,o=0;g=c[d>>2]&3;i=c[(c[(c[((g|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;j=c[(c[(c[((g|0)==2?d:d-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;g=(i|0)>(j|0)?i:j;j=d+8|0;d=(c[j>>2]|0)+172|0;if((c[d>>2]|0)!=0){cc(108464,148536,149,170280)}c[d>>2]=e;d=a+8|0;if((f|0)==0){f=e;while(1){a=f+8|0;i=(c[a>>2]|0)+154|0;b[i>>1]=(b[i>>1]|0)+(b[(c[j>>2]|0)+154>>1]|0);i=(c[a>>2]|0)+156|0;c[i>>2]=(c[i>>2]|0)+(c[(c[j>>2]|0)+156>>2]|0);i=f;a=f-32|0;k=(c[((c[i>>2]&3|0)==2?f:a)+28>>2]|0)+8|0;l=c[k>>2]|0;if((c[l+232>>2]|0)==(g|0)){m=8;break}n=+((c[(c[d>>2]|0)+236>>2]|0)/2|0|0);o=l+88|0;h[o>>3]=n+ +h[o>>3];o=(c[k>>2]|0)+96|0;h[o>>3]=n+ +h[o>>3];o=c[c[(c[(c[((c[i>>2]&3|0)==2?f:a)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((o|0)==0){m=8;break}else{f=o}}if((m|0)==8){return}}else{f=e;while(1){e=f+8|0;o=(c[e>>2]|0)+168|0;b[o>>1]=(b[o>>1]|0)+(b[(c[j>>2]|0)+168>>1]|0);o=(c[e>>2]|0)+154|0;b[o>>1]=(b[o>>1]|0)+(b[(c[j>>2]|0)+154>>1]|0);o=(c[e>>2]|0)+156|0;c[o>>2]=(c[o>>2]|0)+(c[(c[j>>2]|0)+156>>2]|0);o=f;e=f-32|0;a=(c[((c[o>>2]&3|0)==2?f:e)+28>>2]|0)+8|0;i=c[a>>2]|0;if((c[i+232>>2]|0)==(g|0)){m=8;break}n=+((c[(c[d>>2]|0)+236>>2]|0)/2|0|0);k=i+88|0;h[k>>3]=n+ +h[k>>3];k=(c[a>>2]|0)+96|0;h[k>>3]=n+ +h[k>>3];k=c[c[(c[(c[((c[o>>2]&3|0)==2?f:e)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((k|0)==0){m=8;break}else{f=k}}if((m|0)==8){return}}}function Yn(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;do{if(!((a|0)==0|(b|0)==0)){d=c[a>>2]&3;e=c[b>>2]&3;if((c[((d|0)==3?a:a+32|0)+28>>2]|0)!=(c[((e|0)==3?b:b+32|0)+28>>2]|0)){break}if((c[((d|0)==2?a:a-32|0)+28>>2]|0)!=(c[((e|0)==2?b:b-32|0)+28>>2]|0)){break}if((c[(c[a+8>>2]|0)+96>>2]|0)!=(c[(c[b+8>>2]|0)+96>>2]|0)){break}if((Kp(a,b)|0)==0){break}else{f=1}return f|0}}while(0);f=0;return f|0}function Zn(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=b+8|0;c[(c[d>>2]|0)+180>>2]=0;c[(c[d>>2]|0)+220>>2]=0;co(b);e=c[d>>2]|0;if((c[e+172>>2]|0)>=1){f=1;g=e;while(1){eo(b,c[(c[g+176>>2]|0)+(f<<2)>>2]|0);e=c[d>>2]|0;if((f|0)<(c[e+172>>2]|0)){f=f+1|0;g=e}else{break}}}g=ux(b)|0;if((g|0)!=0){f=g;do{g=mw(b,f)|0;if((g|0)!=0){e=g;do{g=e;h=c[g>>2]|0;i=(c[(c[((h&3|0)==2?e:e-32|0)+28>>2]|0)+8>>2]|0)+160|0;j=a[i]|0;if(j<<24>>24<3){a[i]=j+1;k=c[g>>2]|0}else{k=h}h=(c[(c[((k&3|0)==3?e:e+32|0)+28>>2]|0)+8>>2]|0)+160|0;g=a[h]|0;if(g<<24>>24<3){a[h]=g+1}e=ow(b,e)|0;}while((e|0)!=0)}f=vx(b,f)|0;}while((f|0)!=0)}f=ux(b)|0;if((f|0)!=0){k=f;do{do{if((c[(c[k+8>>2]|0)+212>>2]|0)==0){if((k|0)!=(Lm(k)|0)){break}_o(b,k);f=(c[d>>2]|0)+220|0;c[f>>2]=(c[f>>2]|0)+1}}while(0);f=mw(b,k)|0;if((f|0)!=0){e=f;f=0;while(1){g=e+8|0;h=c[g>>2]|0;a:do{if((c[h+172>>2]|0)==0){j=e;i=c[j>>2]|0;l=i&3;m=e+32|0;n=c[((l|0)==3?e:m)+28>>2]|0;o=c[n+8>>2]|0;do{if((a[o+159|0]|0)!=7){p=e-32|0;q=c[((l|0)==2?e:p)+28>>2]|0;r=c[q+8>>2]|0;if((a[r+159|0]|0)==7){break}do{if((f|0)==0){s=i}else{t=c[f>>2]&3;if((n|0)!=(c[((t|0)==3?f:f+32|0)+28>>2]|0)){s=i;break}if((q|0)!=(c[((t|0)==2?f:f-32|0)+28>>2]|0)){s=i;break}if((c[o+232>>2]|0)==(c[r+232>>2]|0)){ep(e,f);Wo(e);u=f;break a}if((c[h+96>>2]|0)!=0){s=i;break}t=f+8|0;if((c[(c[t>>2]|0)+96>>2]|0)!=0){s=i;break}if((Kp(e,f)|0)==0){s=c[j>>2]|0;break}if((a[215376]|0)==0){Xn(b,e,c[(c[t>>2]|0)+172>>2]|0,1);Wo(e);u=f;break a}else{a[(c[g>>2]|0)+112|0]=6;u=f;break a}}}while(0);r=s&3;q=c[((r|0)==3?e:m)+28>>2]|0;if((q|0)==(c[((r|0)==2?e:p)+28>>2]|0)){Wo(e);u=e;break a}r=Lm(q)|0;q=Lm(c[((c[j>>2]&3|0)==2?e:p)+28>>2]|0)|0;t=c[j>>2]&3;if((c[((t|0)==3?e:m)+28>>2]|0)!=(r|0)){u=f;break a}if((c[((t|0)==2?e:p)+28>>2]|0)!=(q|0)){u=f;break a}t=c[(c[r+8>>2]|0)+232>>2]|0;v=c[(c[q+8>>2]|0)+232>>2]|0;if((t|0)==(v|0)){cp(b,e);u=e;break a}if((v|0)>(t|0)){_n(b,r,q,e);u=e;break a}t=uw(b,q,r,0,0)|0;do{if((t|0)!=0){r=c[t>>2]&3;q=c[((r|0)==2?t:t-32|0)+28>>2]|0;if((q|0)==(c[((c[j>>2]&3|0)==2?e:p)+28>>2]|0)){break}v=t+8|0;if((c[(c[v>>2]|0)+172>>2]|0)==0){_n(b,c[((r|0)==3?t:t+32|0)+28>>2]|0,q,t)}if((c[(c[g>>2]|0)+96>>2]|0)!=0){break}if((c[(c[v>>2]|0)+96>>2]|0)!=0){break}if((Kp(e,t)|0)==0){break}if((a[215376]|0)==0){Wo(e);Xn(b,e,c[(c[v>>2]|0)+172>>2]|0,1);u=f;break a}else{a[(c[g>>2]|0)+112|0]=6;a[(c[v>>2]|0)+153|0]=1;u=f;break a}}}while(0);t=c[j>>2]&3;_n(b,c[((t|0)==2?e:p)+28>>2]|0,c[((t|0)==3?e:m)+28>>2]|0,e);u=e;break a}}while(0);do{if((f|0)==0){w=i}else{o=c[f>>2]&3;if((c[((o|0)==3?f:f+32|0)+28>>2]|0)!=(n|0)){w=i;break}t=e-32|0;if((c[((o|0)==2?f:f-32|0)+28>>2]|0)!=(c[((l|0)==2?e:t)+28>>2]|0)){w=i;break}o=f+8|0;if((c[(c[o>>2]|0)+96>>2]|0)!=(c[h+96>>2]|0)){w=i;break}if((Kp(f,e)|0)==0){w=c[j>>2]|0;break}v=c[(c[o>>2]|0)+172>>2]|0;if((v|0)!=0){Xn(b,e,v,0);Wo(e);u=f;break a}v=c[j>>2]&3;if((c[(c[(c[((v|0)==3?e:m)+28>>2]|0)+8>>2]|0)+232>>2]|0)!=(c[(c[(c[((v|0)==2?e:t)+28>>2]|0)+8>>2]|0)+232>>2]|0)){u=f;break a}ep(e,f);Wo(e);u=f;break a}}while(0);i=c[((w&3|0)==3?e:m)+28>>2]|0;l=c[i+8>>2]|0;if((a[l+159|0]|0)==7){x=c[(c[(c[(c[l+212>>2]|0)+8>>2]|0)+256>>2]|0)+(c[l+232>>2]<<2)>>2]|0;y=w}else{l=Lm(i)|0;x=l;y=c[j>>2]|0}l=c[((y&3|0)==2?e:e-32|0)+28>>2]|0;i=c[l+8>>2]|0;if((a[i+159|0]|0)==7){z=c[(c[(c[(c[i+212>>2]|0)+8>>2]|0)+256>>2]|0)+(c[i+232>>2]<<2)>>2]|0}else{z=Lm(l)|0}l=(c[(c[x+8>>2]|0)+232>>2]|0)>(c[(c[z+8>>2]|0)+232>>2]|0);i=l?x:z;n=l?z:x;l=n+8|0;t=i+8|0;if((c[(c[l>>2]|0)+212>>2]|0)==(c[(c[t>>2]|0)+212>>2]|0)){u=e;break}v=So(n,i)|0;if((v|0)!=0){Xn(b,e,v,1);u=e;break}if((c[(c[l>>2]|0)+232>>2]|0)==(c[(c[t>>2]|0)+232>>2]|0)){u=e;break}_n(b,n,i,e);i=c[(c[g>>2]|0)+172>>2]|0;if((i|0)==0){u=e;break}n=i;while(1){i=n;l=n-32|0;if((c[(c[(c[((c[i>>2]&3|0)==2?n:l)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(c[(c[t>>2]|0)+232>>2]|0)){u=e;break a}a[(c[n+8>>2]|0)+112|0]=5;v=c[c[(c[(c[((c[i>>2]&3|0)==2?n:l)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((v|0)==0){u=e;break}else{n=v}}}else{u=e}}while(0);g=ow(b,e)|0;if((g|0)==0){break}else{e=g;f=u}}}k=vx(b,k)|0;}while((k|0)!=0)}if((Ix(b|0)|0)==(b|0)){return}b=c[(c[d>>2]|0)+204>>2]|0;if((b|0)==0){A=kk(4)|0}else{A=mk(b,4)|0}c[(c[d>>2]|0)+204>>2]=A;A=c[d>>2]|0;c[c[A+204>>2]>>2]=c[A+180>>2];return}function _n(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0,t=0.0,u=0,v=0,w=0,x=0;g=f+8|0;i=c[g>>2]|0;if((c[i+96>>2]|0)==0){j=-1}else{j=((c[(c[e+8>>2]|0)+232>>2]|0)+(c[(c[d+8>>2]|0)+232>>2]|0)|0)/2|0}if((c[i+172>>2]|0)!=0){cc(121016,148536,90,170360)}i=c[(c[d+8>>2]|0)+232>>2]|0;k=e+8|0;l=c[(c[k>>2]|0)+232>>2]|0;if((i|0)>=(l|0)){cc(112216,148536,104,170360)}m=b|0;n=b+8|0;o=d;d=i;i=l;while(1){l=d+1|0;if((l|0)<(i|0)){do{if((l|0)==(j|0)){p=c[(c[g>>2]|0)+96>>2]|0;q=+h[p+24>>3];r=+h[p+32>>3];p=bp(b)|0;s=p+8|0;c[(c[s>>2]|0)+104>>2]=c[(c[g>>2]|0)+96>>2];t=+(c[(c[(Ix(Hx(p|0)|0)|0)+8>>2]|0)+236>>2]|0);h[(c[s>>2]|0)+88>>3]=t;if((a[(c[g>>2]|0)+114|0]|0)!=0){u=p;break}v=(c[(c[(Ix(m)|0)+8>>2]|0)+116>>2]&1|0)==0;w=(c[s>>2]|0)+80|0;if(v){h[w>>3]=r;h[(c[s>>2]|0)+96>>3]=q;u=p;break}else{h[w>>3]=q;h[(c[s>>2]|0)+96>>3]=r;u=p;break}}else{p=bp(b)|0;r=+((c[(c[n>>2]|0)+236>>2]|0)/2|0|0);s=p+8|0;w=(c[s>>2]|0)+88|0;h[w>>3]=r+ +h[w>>3];w=(c[s>>2]|0)+96|0;h[w>>3]=r+ +h[w>>3];u=p}}while(0);c[(c[u+8>>2]|0)+232>>2]=l;x=u}else{x=e}wp(Zo(o,x,f)|0);p=c[(c[k>>2]|0)+232>>2]|0;if((l|0)<(p|0)){o=x;d=l;i=p}else{break}}if((c[(c[g>>2]|0)+172>>2]|0)==0){cc(112216,148536,104,170360)}else{return}}function $n(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;b=a|0;d=Ix(b)|0;e=ux(a)|0;if((e|0)==0){return}else{f=e}do{e=rw(Ix(b)|0,f)|0;if((e|0)!=0){g=0;h=e;while(1){e=sw(Ix(b)|0,h,f)|0;do{if((Rx(a,h|0)|0)==0){i=(c[h>>2]&3|0)==2?h:h-32|0;j=(Yn(g,i)|0)==0;k=c[i>>2]&3;l=c[((k|0)==3?i:i+32|0)+28>>2]|0;m=c[(c[l+8>>2]|0)+232>>2]|0;n=c[((k|0)==2?i:i-32|0)+28>>2]|0;k=c[(c[n+8>>2]|0)+232>>2]|0;o=(m|0)==(k|0);if(!j){if(o){p=g}else{p=0}c[(c[i+8>>2]|0)+172>>2]=p;j=c[(c[g+8>>2]|0)+172>>2]|0;if((j|0)==0){q=g;break}Xn(a,i,j,0);Xo(i);q=g;break}if(!o){if((k|0)>(m|0)){ao(l,n,i);q=i;break}else{ao(n,l,i);q=i;break}}m=To(l,n)|0;if((m|0)==0){cp(d,i);q=i;break}if((i|0)==(m|0)){q=g;break}Xo(i);if((c[(c[i+8>>2]|0)+172>>2]|0)!=0){q=g;break}ep(i,m);q=g}else{q=g}}while(0);if((e|0)==0){break}else{g=q;h=e}}}f=vx(a,f)|0;}while((f|0)!=0);return}function ao(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;g=c[d+8>>2]|0;i=c[g+212>>2]|0;do{if((i|0)==0){j=d}else{k=c[i+8>>2]|0;if((a[k+260|0]|0)!=0){j=d;break}j=c[(c[k+256>>2]|0)+(c[g+232>>2]<<2)>>2]|0}}while(0);g=c[e+8>>2]|0;i=c[g+212>>2]|0;do{if((i|0)==0){l=e;m=g}else{k=c[i+8>>2]|0;if((a[k+260|0]|0)!=0){l=e;m=g;break}n=c[(c[k+256>>2]|0)+(c[g+232>>2]<<2)>>2]|0;l=n;m=c[n+8>>2]|0}}while(0);g=(j|0)==(d|0)&(l|0)==(e|0)?1:5;e=f+8|0;d=(c[e>>2]|0)+172|0;i=c[d>>2]|0;n=i;k=j+8|0;o=c[(c[k>>2]|0)+232>>2]|0;p=l+8|0;q=c[m+232>>2]|0;if((o|0)>=(q|0)){cc(136680,132440,81,170296)}m=c[i>>2]&3;do{if((c[((m|0)==3?n:i+32|0)+28>>2]|0)==(j|0)){if((c[((m|0)==2?n:i-32|0)+28>>2]|0)!=(l|0)){break}return}}while(0);if((b[(c[i+8>>2]|0)+168>>1]|0)<=1){a:do{if((q-o|0)==1){i=So(j,l)|0;do{if((i|0)!=0){if((Kp(f,i)|0)==0){break}c[(c[e>>2]|0)+172>>2]=i;m=i+8|0;a[(c[m>>2]|0)+112|0]=g;r=(c[m>>2]|0)+168|0;b[r>>1]=(b[r>>1]|0)+1;if((a[(c[k>>2]|0)+156|0]|0)!=0){s=i;break a}if((a[(c[p>>2]|0)+156|0]|0)!=0){s=i;break a}Wo(f);s=i;break a}}while(0);c[(c[e>>2]|0)+172>>2]=0;i=Zo(j,l,f)|0;a[(c[i+8>>2]|0)+112|0]=g;s=i}else{s=n}}while(0);o=c[(c[p>>2]|0)+232>>2]|0;if((o-(c[(c[k>>2]|0)+232>>2]|0)|0)<=1){return}q=s;i=c[q>>2]|0;if((c[((i&3|0)==3?s:s+32|0)+28>>2]|0)==(j|0)){t=s;u=i;v=o}else{c[(c[e>>2]|0)+172>>2]=0;o=Zo(j,c[((c[q>>2]&3|0)==2?s:s-32|0)+28>>2]|0,f)|0;c[(c[e>>2]|0)+172>>2]=o;Vo(s);t=o;u=c[o>>2]|0;v=c[(c[p>>2]|0)+232>>2]|0}o=u&3;u=c[((o|0)==2?t:t-32|0)+28>>2]|0;s=c[u+8>>2]|0;if((c[s+232>>2]|0)==(v|0)){w=t;x=o;y=u}else{u=s;while(1){s=c[c[u+180>>2]>>2]|0;o=c[s>>2]&3;t=c[((o|0)==2?s:s-32|0)+28>>2]|0;e=c[t+8>>2]|0;if((c[e+232>>2]|0)==(v|0)){w=s;x=o;y=t;break}else{u=e}}}if((y|0)==(l|0)){return}a[(c[(Zo(c[((x|0)==3?w:w+32|0)+28>>2]|0,l,f)|0)+8>>2]|0)+112|0]=g;Vo(w);return}c[d>>2]=0;do{if(((c[(c[p>>2]|0)+232>>2]|0)-(c[(c[k>>2]|0)+232>>2]|0)|0)==1){d=So(j,l)|0;if((d|0)==0){break}if((Kp(f,d)|0)==0){break}ep(f,d);if((a[(c[k>>2]|0)+156|0]|0)!=0){return}if((a[(c[p>>2]|0)+156|0]|0)!=0){return}Wo(f);return}}while(0);d=c[(c[k>>2]|0)+232>>2]|0;k=c[(c[p>>2]|0)+232>>2]|0;if((d|0)>=(k|0)){return}w=j|0;x=g&255;g=n;n=d;d=j;j=k;while(1){if((n|0)<(j-1|0)){k=Hx(w)|0;y=g;u=g-32|0;v=(c[((c[y>>2]&3|0)==2?g:u)+28>>2]|0)+8|0;e=c[v>>2]|0;t=c[e+232>>2]|0;o=c[e+236>>2]|0;e=k+8|0;s=c[(c[e>>2]|0)+184>>2]|0;q=c[s+(t*44|0)+4>>2]|0;i=(c[s+(t*44|0)>>2]|0)-1|0;if((i|0)>(o|0)){s=i;do{i=c[q+(s<<2)>>2]|0;r=i+8|0;c[(c[r>>2]|0)+236>>2]=s+1;c[q+(c[(c[r>>2]|0)+236>>2]<<2)>>2]=i;s=s-1|0;}while((s|0)>(o|0))}s=o+1|0;if((s|0)<(o+2|0)){c[q+(s<<2)>>2]=0}s=(c[(c[e>>2]|0)+184>>2]|0)+(t*44|0)|0;c[s>>2]=(c[s>>2]|0)+1;s=bp(k)|0;i=s+8|0;h[(c[i>>2]|0)+88>>3]=+h[(c[v>>2]|0)+88>>3];h[(c[i>>2]|0)+96>>3]=+h[(c[v>>2]|0)+96>>3];c[(c[i>>2]|0)+232>>2]=c[(c[v>>2]|0)+232>>2];c[(c[i>>2]|0)+236>>2]=(c[(c[v>>2]|0)+236>>2]|0)+1;c[(c[(c[(c[e>>2]|0)+184>>2]|0)+(t*44|0)+4>>2]|0)+(c[(c[i>>2]|0)+236>>2]<<2)>>2]=s;z=s;A=y;B=u}else{z=l;A=g;B=g-32|0}a[(c[(Zo(d,z,f)|0)+8>>2]|0)+112|0]=x;s=(c[g+8>>2]|0)+168|0;b[s>>1]=(b[s>>1]|0)-1;s=n+1|0;i=c[(c[p>>2]|0)+232>>2]|0;if((s|0)<(i|0)){g=c[c[(c[(c[((c[A>>2]&3|0)==2?g:B)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;n=s;d=z;j=i}else{break}}return}function bo(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;Zn(d);e=d+8|0;c[(c[e>>2]|0)+208>>2]=1;f=c[e>>2]|0;c[c[f+204>>2]>>2]=c[f+180>>2];qp(d);sp(d,0);f=d|0;g=Ix(f)|0;h=c[e>>2]|0;i=b[h+224>>1]|0;if(i<<16>>16>0){j=g+8|0;a[(c[(c[j>>2]|0)+184>>2]|0)+(((i<<16>>16)-1|0)*44|0)+33|0]=0;k=c[e>>2]|0;l=k;m=b[k+224>>1]|0;n=j}else{l=h;m=i;n=g+8|0}i=m<<16>>16;if(m<<16>>16>(b[l+226>>1]|0)){o=i;p=l}else{m=i;i=l;while(1){l=c[(c[i+184>>2]|0)+(m*44|0)>>2]|0;h=c[(c[(c[(c[i+256>>2]|0)+(m<<2)>>2]|0)+8>>2]|0)+236>>2]|0;j=c[n>>2]|0;k=c[j+184>>2]|0;q=c[k+(m*44|0)+4>>2]|0;do{if((l|0)<1){r=h-l|0;s=r+1|0;t=c[k+(m*44|0)>>2]|0;if((s|0)<(t|0)){u=r;r=s;while(1){s=c[q+(r<<2)>>2]|0;v=s+8|0;c[(c[v>>2]|0)+236>>2]=u+l;c[q+(c[(c[v>>2]|0)+236>>2]<<2)>>2]=s;s=r+1|0;v=c[n>>2]|0;w=c[(c[v+184>>2]|0)+(m*44|0)>>2]|0;if((s|0)<(w|0)){u=r;r=s}else{x=v;y=w;break}}}else{x=j;y=t}r=l-1|0;u=y+r|0;if((u|0)<(y|0)){z=u}else{A=x;B=r;break}while(1){c[q+(z<<2)>>2]=0;u=z+1|0;w=c[n>>2]|0;if((u|0)<(c[(c[w+184>>2]|0)+(m*44|0)>>2]|0)){z=u}else{A=w;B=r;break}}}else{r=(c[k+(m*44|0)>>2]|0)-1|0;if((r|0)>(h|0)){t=l-1|0;w=r;do{r=c[q+(w<<2)>>2]|0;u=r+8|0;c[(c[u>>2]|0)+236>>2]=t+w;c[q+(c[(c[u>>2]|0)+236>>2]<<2)>>2]=r;w=w-1|0;}while((w|0)>(h|0))}w=h+1|0;if((w|0)<(h+l|0)){vF(q+(w<<2)|0,0,(l<<2)-4|0)|0}A=c[n>>2]|0;B=l-1|0}}while(0);l=(c[A+184>>2]|0)+(m*44|0)|0;c[l>>2]=(c[l>>2]|0)+B;l=c[(c[e>>2]|0)+184>>2]|0;if((c[l+(m*44|0)>>2]|0)>0){q=h;k=0;j=l;while(1){w=c[(c[j+(m*44|0)+4>>2]|0)+(k<<2)>>2]|0;c[(c[(c[(c[n>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0)+(q<<2)>>2]=w;t=w+8|0;c[(c[t>>2]|0)+236>>2]=q;if((a[(c[t>>2]|0)+156|0]|0)==1){c[w+12>>2]=g}ap(d,w);_o(Ix(f)|0,w);w=(c[(Ix(f)|0)+8>>2]|0)+220|0;c[w>>2]=(c[w>>2]|0)+1;w=k+1|0;t=c[(c[e>>2]|0)+184>>2]|0;if((w|0)<(c[t+(m*44|0)>>2]|0)){q=q+1|0;k=w;j=t}else{C=t;break}}}else{C=l}c[C+(m*44|0)+4>>2]=(c[(c[(c[n>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0)+(h<<2);a[(c[(c[n>>2]|0)+184>>2]|0)+(m*44|0)+33|0]=0;j=m+1|0;k=c[e>>2]|0;if((m|0)<(b[k+226>>1]|0)){m=j;i=k}else{o=j;p=k;break}}}i=c[n>>2]|0;if((o|0)<(b[i+226>>1]|0)){a[(c[i+184>>2]|0)+(o*44|0)+33|0]=0;D=c[e>>2]|0}else{D=p}a[D+260|0]=1;$n(d);d=c[e>>2]|0;D=b[d+224>>1]|0;if(D<<16>>16>(b[d+226>>1]|0)){return}p=D<<16>>16;D=d;while(1){d=c[(c[D+256>>2]|0)+(p<<2)>>2]|0;o=d+8|0;i=c[o>>2]|0;n=c[c[i+180>>2]>>2]|0;if((n|0)==0){E=i}else{i=n;while(1){Vo(i);n=c[o>>2]|0;m=c[c[n+180>>2]>>2]|0;if((m|0)==0){E=n;break}else{i=m}}}i=c[c[E+172>>2]>>2]|0;if((i|0)!=0){h=i;do{Vo(h);h=c[c[(c[o>>2]|0)+172>>2]>>2]|0;}while((h|0)!=0)}ap(Ix(f)|0,d);c[(c[(c[e>>2]|0)+256>>2]|0)+(p<<2)>>2]=0;h=c[e>>2]|0;if((p|0)<(b[h+226>>1]|0)){p=p+1|0;D=h}else{break}}return}function co(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;d=i;e=ux(b)|0;if((e|0)!=0){f=e;do{e=f+8|0;g=c[e>>2]|0;if((a[g+159|0]|0)==7){Nm(f);h=c[e>>2]|0}else{h=g}c[h+212>>2]=0;f=vx(b,f)|0;}while((f|0)!=0)}f=b+8|0;h=c[f>>2]|0;if((c[h+172>>2]|0)<1){i=d;return}g=b|0;b=1;e=h;while(1){h=c[(c[e+176>>2]|0)+(b<<2)>>2]|0;j=ux(h)|0;if((j|0)!=0){k=h+8|0;l=h;m=j;while(1){j=vx(h,m)|0;n=m+8|0;do{if((a[(c[n>>2]|0)+159|0]|0)==0){Om(m,c[(c[k>>2]|0)+252>>2]|0);c[(c[n>>2]|0)+212>>2]=l;a[(c[n>>2]|0)+159|0]=7;o=mw(h,m)|0;if((o|0)==0){break}else{p=o}do{o=c[(c[p+8>>2]|0)+172>>2]|0;a:do{if((o|0)!=0){q=o;do{r=q;s=q-32|0;t=c[(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)+8>>2]|0;if((a[t+156|0]|0)!=1){break a}c[t+212>>2]=l;q=c[c[(c[(c[((c[r>>2]&3|0)==2?q:s)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;}while((q|0)!=0)}}while(0);p=ow(h,p)|0;}while((p|0)!=0)}else{o=m|0;q=$w(o)|0;s=$w(g)|0;Fv(0,86464,(r=i,i=i+16|0,c[r>>2]=q,c[r+8>>2]=s,r)|0)|0;i=r;Gx(h,o)|0}}while(0);if((j|0)==0){break}else{m=j}}}m=c[f>>2]|0;if((b|0)<(c[m+172>>2]|0)){b=b+1|0;e=m}else{break}}i=d;return}function eo(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;f=e+8|0;g=jk((b[(c[f>>2]|0)+226>>1]<<2)+8|0)|0;c[(c[f>>2]|0)+256>>2]=g;g=c[f>>2]|0;h=b[g+224>>1]|0;if(h<<16>>16<=(b[g+226>>1]|0)){g=e;i=h<<16>>16;h=0;while(1){j=bp(d)|0;c[(c[(c[f>>2]|0)+256>>2]|0)+(i<<2)>>2]=j;k=j+8|0;c[(c[k>>2]|0)+232>>2]=i;a[(c[k>>2]|0)+159|0]=7;c[(c[k>>2]|0)+212>>2]=g;if((h|0)!=0){k=(c[(Zo(h,j,0)|0)+8>>2]|0)+154|0;b[k>>1]=(b[k>>1]|0)*1e3}if((i|0)<(b[(c[f>>2]|0)+226>>1]|0)){i=i+1|0;h=j}else{break}}}h=ux(e)|0;if((h|0)!=0){i=h;do{h=(c[(c[(c[f>>2]|0)+256>>2]|0)+(c[(c[i+8>>2]|0)+232>>2]<<2)>>2]|0)+8|0;g=(c[h>>2]|0)+216|0;c[g>>2]=(c[g>>2]|0)+1;g=mw(e,i)|0;if((g|0)!=0){d=g;do{g=d;j=c[g>>2]&3;k=c[(c[(c[((j|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;l=d-32|0;if((k|0)<(c[(c[(c[((j|0)==2?d:l)+28>>2]|0)+8>>2]|0)+232>>2]|0)){j=k;do{k=(c[(c[c[(c[h>>2]|0)+180>>2]>>2]|0)+8>>2]|0)+168|0;b[k>>1]=(b[k>>1]|0)+1;j=j+1|0;}while((j|0)<(c[(c[(c[((c[g>>2]&3|0)==2?d:l)+28>>2]|0)+8>>2]|0)+232>>2]|0))}d=ow(e,d)|0;}while((d|0)!=0)}i=vx(e,i)|0;}while((i|0)!=0)}i=c[f>>2]|0;e=b[i+224>>1]|0;if(e<<16>>16>(b[i+226>>1]|0)){return}d=e<<16>>16;e=i;while(1){i=(c[(c[(c[e+256>>2]|0)+(d<<2)>>2]|0)+8>>2]|0)+216|0;h=c[i>>2]|0;if((h|0)>1){c[i>>2]=h-1;m=c[f>>2]|0}else{m=e}if((d|0)<(b[m+226>>1]|0)){d=d+1|0;e=m}else{break}}return}function fo(d,e,f,g){d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=(c[(c[e+8>>2]|0)+212>>2]|0)+8|0;e=c[h>>2]|0;i=e;j=f+1|0;if((a[i+261|0]|0)==(j|0)){return}k=b[e+224>>1]|0;l=b[i+226>>1]|0;if(k<<16>>16>l<<16>>16){m=k;n=e;o=l}else{l=k<<16>>16;k=e;while(1){rp(d,c[(c[k+256>>2]|0)+(l<<2)>>2]|0);p=c[h>>2]|0;q=b[p+226>>1]|0;if((l|0)<(q<<16>>16|0)){l=l+1|0;k=p}else{break}}m=b[p+224>>1]|0;n=p;o=q}if(m<<16>>16>o<<16>>16){r=n}else{o=m<<16>>16;m=n;while(1){tp(g,c[(c[m+256>>2]|0)+(o<<2)>>2]|0,f);n=c[h>>2]|0;q=n;if((o|0)<(b[q+226>>1]|0)){o=o+1|0;m=n}else{r=q;break}}}a[r+261|0]=j;return}function go(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=ux(b)|0;if((d|0)==0){ho(b);return}else{e=d}do{c[(c[e+8>>2]|0)+212>>2]=0;d=mw(b,e)|0;if((d|0)!=0){f=d;do{d=c[(c[f+8>>2]|0)+172>>2]|0;a:do{if((d|0)!=0){g=d;do{h=g;i=g-32|0;j=c[(c[((c[h>>2]&3|0)==2?g:i)+28>>2]|0)+8>>2]|0;if((a[j+156|0]|0)!=1){break a}c[j+212>>2]=0;g=c[c[(c[(c[((c[h>>2]&3|0)==2?g:i)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;}while((g|0)!=0)}}while(0);f=ow(b,f)|0;}while((f|0)!=0)}e=vx(b,e)|0;}while((e|0)!=0);ho(b);return}function ho(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=b+8|0;e=c[d>>2]|0;if((c[e+172>>2]|0)>=1){f=1;g=e;while(1){ho(c[(c[g+176>>2]|0)+(f<<2)>>2]|0);e=c[d>>2]|0;if((f|0)<(c[e+172>>2]|0)){f=f+1|0;g=e}else{break}}}g=ux(b)|0;if((g|0)==0){return}f=b;d=g;do{g=(c[d+8>>2]|0)+212|0;if((c[g>>2]|0)==0){c[g>>2]=f}g=mw(b,d)|0;if((g|0)!=0){e=g;do{g=c[(c[e+8>>2]|0)+172>>2]|0;a:do{if((g|0)!=0){h=g;do{i=h;j=c[i>>2]|0;k=h-32|0;l=c[(c[((j&3|0)==2?h:k)+28>>2]|0)+8>>2]|0;if((a[l+156|0]|0)!=1){break a}m=l+212|0;if((c[m>>2]|0)==0){c[m>>2]=f;n=c[i>>2]|0}else{n=j}h=c[c[(c[(c[((n&3|0)==2?h:k)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;}while((h|0)!=0)}}while(0);e=ow(b,e)|0;}while((e|0)!=0)}d=vx(b,d)|0;}while((d|0)!=0);return}function io(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0,da=0.0,ea=0.0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0;d=i;i=i+128|0;e=d|0;f=d+64|0;g=d+80|0;j=d+96|0;k=d+112|0;l=cn(b)|0;m=ux(b)|0;if((m|0)==0){n=Vg(l)|0;i=d;return}o=e;p=g;q=k;r=e|0;s=e+16|0;t=e+32|0;u=e+48|0;e=j|0;v=j+8|0;w=f|0;x=f+8|0;y=m;a:while(1){m=mw(b,y)|0;if((m|0)!=0){z=m;do{m=z|0;A=ew(m,145320)|0;do{if((A|0)==0){B=0}else{if((a[A]|0)==0){B=0;break}C=yn(l,A)|0;if((C|0)!=0){B=C;break}Fv(0,154736,(D=i,i=i+8|0,c[D>>2]=A,D)|0)|0;i=D;B=0}}while(0);A=ew(m,161760)|0;do{if((A|0)==0){E=13}else{if((a[A]|0)==0){E=13;break}C=yn(l,A)|0;if((C|0)==0){Fv(0,154736,(D=i,i=i+8|0,c[D>>2]=A,D)|0)|0;i=D;E=13;break}else{F=C;G=1;H=(B|0)==0;E=14;break}}}while(0);if((E|0)==13){E=0;if((B|0)!=0){F=0;G=0;H=0;E=14}}do{if((E|0)==14){E=0;A=z+8|0;C=c[(c[A>>2]|0)+8>>2]|0;if((C|0)==0){break}if((c[C+4>>2]|0)>1){I=z;J=$w(c[((c[I>>2]&3|0)==3?z:z+32|0)+28>>2]|0)|0;K=$w(c[((c[I>>2]&3|0)==2?z:z-32|0)+28>>2]|0)|0;Fv(0,130536,(D=i,i=i+16|0,c[D>>2]=J,c[D+8>>2]=K,D)|0)|0;i=D;break}K=c[C>>2]|0;C=c[K+4>>2]|0;J=z;I=c[J>>2]&3;L=z-32|0;M=c[((I|0)==2?z:L)+28>>2]|0;N=z+32|0;O=c[((I|0)==3?z:N)+28>>2]|0;I=kk(48)|0;P=I;Q=K+12|0;c[I+12>>2]=c[Q>>2];R=K+8|0;c[I+8>>2]=c[R>>2];b:do{if(H){E=41}else{S=c[B+8>>2]|0;T=S+16|0;U=T;V=c[M+8>>2]|0;W=+h[V+16>>3];X=+h[V+24>>3];Y=+h[T>>3];do{if(Y<=W){Z=+h[S+32>>3];if(Z<W){break}_=+h[S+24>>3];if(_>X){break}$=+h[S+40>>3];if($<X){break}T=K|0;V=c[T>>2]|0;aa=+h[V>>3];ba=+h[V+8>>3];if(!(Y>aa|Z<aa|_>ba|$<ba)){ca=c[O+8>>2]|0;da=+h[ca+16>>3];ea=+h[ca+24>>3];if(!(Y>da|Z<da|_>ea|$<ea)){ca=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;fa=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;ga=ew(m,145320)|0;Fv(0,108904,(D=i,i=i+24|0,c[D>>2]=ca,c[D+8>>2]=fa,c[D+16>>2]=ga,D)|0)|0;i=D;E=41;break b}if((c[R>>2]|0)==0){E=29;break a}ga=K+16|0;fa=K+24|0;jo(f,aa,ba,+h[ga>>3],+h[fa>>3],U);ba=+h[w>>3];aa=+h[x>>3];ca=c[T>>2]|0;h[ca+48>>3]=ba;h[ca+56>>3]=aa;ca=c[T>>2]|0;ea=(aa+ +h[fa>>3])*.5;h[ca+16>>3]=(ba+ +h[ga>>3])*.5;h[ca+24>>3]=ea;ca=c[T>>2]|0;ea=(+h[ca+24>>3]+ +h[fa>>3])*.5;h[ca>>3]=(+h[ca+16>>3]+ +h[ga>>3])*.5;h[ca+8>>3]=ea;ca=c[T>>2]|0;ea=(aa+ +h[ca+24>>3])*.5;h[ca+32>>3]=(ba+ +h[ca+16>>3])*.5;h[ca+40>>3]=ea;ca=c[Q>>2]|0;if((ca|0)==0){ha=3;break b}ha=(lh(z,c[T>>2]|0,0,0,P,ca)|0)+3|0;break b}ca=C-1|0;c:do{if((ca|0)>0){if((ko(V,U)|0)==0){ia=3}else{ja=0;break}while(1){if((ia|0)>=(ca|0)){ja=ia;break c}if((ko((c[T>>2]|0)+(ia<<4)|0,U)|0)==0){ia=ia+3|0}else{ja=ia;break}}}else{ja=0}}while(0);V=c[Q>>2]|0;ga=(V|0)!=0;if((ja|0)==(ca|0)){if(!ga){E=36;break a}fa=I+32|0;ka=c[T>>2]|0;jo(g,+h[K+32>>3],+h[K+40>>3],+h[ka+(ca<<4)>>3],+h[ka+(ca<<4)+8>>3],U);c[fa>>2]=c[p>>2];c[fa+4>>2]=c[p+4>>2];c[fa+8>>2]=c[p+8>>2];c[fa+12>>2]=c[p+12>>2];ha=ca;break b}if(ga){la=lh(z,c[T>>2]|0,0,ja,P,V)|0}else{la=ja}ha=la+3|0;break b}}while(0);U=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;S=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;V=ew(m,145320)|0;Fv(0,116216,(D=i,i=i+24|0,c[D>>2]=U,c[D+8>>2]=S,c[D+16>>2]=V,D)|0)|0;i=D;E=41}}while(0);do{if((E|0)==41){E=0;V=C-1|0;if((c[Q>>2]|0)==0){ha=V;break}S=I+32|0;U=K+32|0;c[S>>2]=c[U>>2];c[S+4>>2]=c[U+4>>2];c[S+8>>2]=c[U+8>>2];c[S+12>>2]=c[U+12>>2];ha=V}}while(0);d:do{if(G){C=c[F+8>>2]|0;V=C+16|0;U=V;S=c[O+8>>2]|0;Y=+h[S+16>>3];X=+h[S+24>>3];W=+h[V>>3];do{if(W<=Y){ea=+h[C+32>>3];if(ea<Y){break}ba=+h[C+24>>3];if(ba>X){break}aa=+h[C+40>>3];if(aa<X){break}V=K|0;S=c[V>>2]|0;$=+h[S+(ha<<4)>>3];_=+h[S+(ha<<4)+8>>3];if(!(W>$|ea<$|ba>_|aa<_)){ga=c[M+8>>2]|0;da=+h[ga+16>>3];Z=+h[ga+24>>3];if(!(W>da|ea<da|ba>Z|aa<Z)){ga=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;fa=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;ka=ew(m,161760)|0;Fv(0,81688,(D=i,i=i+24|0,c[D>>2]=ga,c[D+8>>2]=fa,c[D+16>>2]=ka,D)|0)|0;i=D;E=67;break d}if((c[Q>>2]|0)==0){E=54;break a}ka=I+32|0;fa=I+40|0;jo(j,$,_,+h[ka>>3],+h[fa>>3],U);_=+h[e>>3];$=+h[v>>3];ga=ha-3|0;ma=c[V>>2]|0;h[ma+(ga<<4)>>3]=_;h[ma+(ga<<4)+8>>3]=$;ma=ha-1|0;na=c[V>>2]|0;Z=($+ +h[fa>>3])*.5;h[na+(ma<<4)>>3]=(_+ +h[ka>>3])*.5;h[na+(ma<<4)+8>>3]=Z;na=c[V>>2]|0;Z=(+h[na+(ma<<4)+8>>3]+ +h[fa>>3])*.5;h[na+(ha<<4)>>3]=(+h[na+(ma<<4)>>3]+ +h[ka>>3])*.5;h[na+(ha<<4)+8>>3]=Z;na=ha-2|0;ka=c[V>>2]|0;Z=($+ +h[ka+(ma<<4)+8>>3])*.5;h[ka+(na<<4)>>3]=(_+ +h[ka+(ma<<4)>>3])*.5;h[ka+(na<<4)+8>>3]=Z;na=c[R>>2]|0;if((na|0)==0){oa=ga;break d}oa=nh(z,c[V>>2]|0,ga,ga,P,na)|0;break d}e:do{if((ha|0)>0){na=ha;ga=S;while(1){ka=ga+(na<<4)|0;c[o>>2]=c[ka>>2];c[o+4>>2]=c[ka+4>>2];c[o+8>>2]=c[ka+8>>2];c[o+12>>2]=c[ka+12>>2];pa=na-1|0;ka=(c[V>>2]|0)+(pa<<4)|0;c[s>>2]=c[ka>>2];c[s+4>>2]=c[ka+4>>2];c[s+8>>2]=c[ka+8>>2];c[s+12>>2]=c[ka+12>>2];qa=na-2|0;ka=(c[V>>2]|0)+(qa<<4)|0;c[t>>2]=c[ka>>2];c[t+4>>2]=c[ka+4>>2];c[t+8>>2]=c[ka+8>>2];c[t+12>>2]=c[ka+12>>2];ra=na-3|0;ka=(c[V>>2]|0)+(ra<<4)|0;c[u>>2]=c[ka>>2];c[u+4>>2]=c[ka+4>>2];c[u+8>>2]=c[ka+8>>2];c[u+12>>2]=c[ka+12>>2];if((ko(r,U)|0)!=0){break}if((ra|0)<=0){sa=ra;break e}na=ra;ga=c[V>>2]|0}ga=(c[V>>2]|0)+(na<<4)|0;c[ga>>2]=c[o>>2];c[ga+4>>2]=c[o+4>>2];c[ga+8>>2]=c[o+8>>2];c[ga+12>>2]=c[o+12>>2];ga=(c[V>>2]|0)+(pa<<4)|0;c[ga>>2]=c[s>>2];c[ga+4>>2]=c[s+4>>2];c[ga+8>>2]=c[s+8>>2];c[ga+12>>2]=c[s+12>>2];ga=(c[V>>2]|0)+(qa<<4)|0;c[ga>>2]=c[t>>2];c[ga+4>>2]=c[t+4>>2];c[ga+8>>2]=c[t+8>>2];c[ga+12>>2]=c[t+12>>2];ga=(c[V>>2]|0)+(ra<<4)|0;c[ga>>2]=c[u>>2];c[ga+4>>2]=c[u+4>>2];c[ga+8>>2]=c[u+8>>2];c[ga+12>>2]=c[u+12>>2];sa=na}else{sa=ha}}while(0);if((sa|0)==0){if((c[R>>2]|0)==0){E=63;break a}S=I+16|0;T=c[V>>2]|0;jo(k,+h[K+16>>3],+h[K+24>>3],+h[T>>3],+h[T+8>>3],U);c[S>>2]=c[q>>2];c[S+4>>2]=c[q+4>>2];c[S+8>>2]=c[q+8>>2];c[S+12>>2]=c[q+12>>2];oa=0;break d}else{S=sa-3|0;T=c[R>>2]|0;if((T|0)==0){oa=S;break d}oa=nh(z,c[V>>2]|0,S,ha-3|0,P,T)|0;break d}}}while(0);U=$w(c[((c[J>>2]&3|0)==3?z:N)+28>>2]|0)|0;C=$w(c[((c[J>>2]&3|0)==2?z:L)+28>>2]|0)|0;T=ew(m,161760)|0;Fv(0,86720,(D=i,i=i+24|0,c[D>>2]=U,c[D+8>>2]=C,c[D+16>>2]=T,D)|0)|0;i=D;E=67}else{E=67}}while(0);do{if((E|0)==67){E=0;if((c[R>>2]|0)==0){oa=0;break}L=I+16|0;J=K+16|0;c[L>>2]=c[J>>2];c[L+4>>2]=c[J+4>>2];c[L+8>>2]=c[J+8>>2];c[L+12>>2]=c[J+12>>2];oa=0}}while(0);R=ha-oa+1|0;J=I+4|0;c[J>>2]=R;L=kk(R<<4)|0;R=I;c[R>>2]=L;N=K|0;do{if((c[J>>2]|0)>0){Q=(c[N>>2]|0)+(oa<<4)|0;c[L>>2]=c[Q>>2];c[L+4>>2]=c[Q+4>>2];c[L+8>>2]=c[Q+8>>2];c[L+12>>2]=c[Q+12>>2];if((c[J>>2]|0)>1){ta=oa;ua=1}else{break}do{ta=ta+1|0;Q=(c[R>>2]|0)+(ua<<4)|0;M=(c[N>>2]|0)+(ta<<4)|0;c[Q>>2]=c[M>>2];c[Q+4>>2]=c[M+4>>2];c[Q+8>>2]=c[M+8>>2];c[Q+12>>2]=c[M+12>>2];ua=ua+1|0;}while((ua|0)<(c[J>>2]|0))}}while(0);eF(c[N>>2]|0);eF(K);c[c[(c[A>>2]|0)+8>>2]>>2]=P}}while(0);z=ow(b,z)|0;}while((z|0)!=0)}z=vx(b,y)|0;if((z|0)==0){E=75;break}else{y=z}}if((E|0)==29){cc(102800,97192,361,170424)}else if((E|0)==36){cc(91704,97192,379,170424)}else if((E|0)==54){cc(91704,97192,421,170424)}else if((E|0)==63){cc(102800,97192,444,170424)}else if((E|0)==75){n=Vg(l)|0;i=d;return}}function jo(a,b,d,e,f,g){a=a|0;b=+b;d=+d;e=+e;f=+f;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0;j=i;i=i+416|0;k=j|0;l=j+104|0;m=j+208|0;n=j+312|0;o=+h[g>>3];p=+h[g+8>>3];q=+h[g+16>>3];r=+h[g+24>>3];do{if(o>e){s=+(~~((d-f)*(o-b)/(b-e))|0)+d;if(s<p|s>r){break}h[a>>3]=o;h[a+8>>3]=s;i=j;return}}while(0);do{if(q<e){s=+(~~((d-f)*(q-b)/(b-e))|0)+d;if(s<p|s>r){break}h[a>>3]=q;h[a+8>>3]=s;i=j;return}}while(0);do{if(p>f){s=+(~~((b-e)*(p-d)/(d-f))|0)+b;if(s<o|s>q){break}h[a>>3]=s;h[a+8>>3]=p;i=j;return}}while(0);do{if(r<f){s=+(~~((b-e)*(r-d)/(d-f))|0)+b;if(s<o|s>q){break}h[a>>3]=s;h[a+8>>3]=r;i=j;return}}while(0);j=k|0;nb(j|0,159736,(k=i,i=i+16|0,h[k>>3]=b,h[k+8>>3]=d,k)|0)|0;i=k;a=l|0;nb(a|0,159736,(k=i,i=i+16|0,h[k>>3]=e,h[k+8>>3]=f,k)|0)|0;i=k;l=m|0;nb(l|0,159736,(k=i,i=i+16|0,h[k>>3]=o,h[k+8>>3]=p,k)|0)|0;i=k;m=n|0;nb(m|0,159736,(k=i,i=i+16|0,h[k>>3]=q,h[k+8>>3]=r,k)|0)|0;i=k;Fv(1,167928,(k=i,i=i+32|0,c[k>>2]=j,c[k+8>>2]=a,c[k+16>>2]=l,c[k+24>>2]=m,k)|0)|0;i=k;cc(163768,97192,78,171e3)}function ko(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0.0,o=0.0,p=0.0,q=0,r=0;d=i;i=i+128|0;e=d|0;f=e|0;g=e;j=a;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];j=e+16|0;g=a+16|0;c[j>>2]=c[g>>2];c[j+4>>2]=c[g+4>>2];c[j+8>>2]=c[g+8>>2];c[j+12>>2]=c[g+12>>2];g=e+32|0;j=a+32|0;c[g>>2]=c[j>>2];c[g+4>>2]=c[j+4>>2];c[g+8>>2]=c[j+8>>2];c[g+12>>2]=c[j+12>>2];j=e+48|0;e=a+48|0;c[j>>2]=c[e>>2];c[j+4>>2]=c[e+4>>2];c[j+8>>2]=c[e+8>>2];c[j+12>>2]=c[e+12>>2];e=b|0;j=b+8|0;g=b+24|0;k=+lo(a,0.0,1.0,+h[e>>3],+h[j>>3],+h[g>>3]);if(k>=0.0&k<2.0){Qm(d+64|0,f,3,k,a,0);l=k}else{l=2.0}m=b+16|0;k=+lo(a,0.0,l>1.0?1.0:l,+h[m>>3],+h[j>>3],+h[g>>3]);if(k>=0.0&k<l){Qm(d+80|0,f,3,k,a,0);n=k}else{n=l}l=+mo(a,0.0,n>1.0?1.0:n,+h[j>>3],+h[e>>3],+h[m>>3]);if(l>=0.0&l<n){Qm(d+96|0,f,3,l,a,0);o=l}else{o=n}n=+mo(a,0.0,o>1.0?1.0:o,+h[g>>3],+h[e>>3],+h[m>>3]);if(!(n>=0.0&n<o)){p=o;q=p<2.0;r=q&1;i=d;return r|0}Qm(d+112|0,f,3,n,a,0);p=n;q=p<2.0;r=q&1;i=d;return r|0}function lo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0,u=0.0,v=0.0,w=0.0;g=i;i=i+144|0;j=g|0;k=g+64|0;l=g+128|0;m=+h[a>>3];if(m<d){n=-1}else{n=m>d|0}m=+h[a+16>>3];if(m<d){o=-1}else{o=m>d|0}m=+h[a+32>>3];if(m<d){p=-1}else{p=m>d|0}m=+h[a+48>>3];if(m<d){q=-1}else{q=m>d|0}r=((o|0)!=(n|0)&(n|0)!=0&1)+((n|0)==0)+((p|0)!=(o|0)&(o|0)!=0&1)+((q|0)!=(p|0)&(p|0)!=0&1)|0;if((r|0)==0){s=-1.0;i=g;return+s}else if((r|0)==1){t=10}do{if((t|0)==10){if(m<0.0){u=m+-.5}else{u=m+.5}if(d<0.0){v=d+-.5}else{v=d+.5}if((~~u|0)!=(~~v|0)){break}w=+h[a+56>>3];i=g;return+(w<e|w>f?-1.0:c)}}while(0);t=j|0;j=k|0;Qm(l,a,3,.5,t,j);v=(b+c)*.5;u=+lo(t,b,v,d,e,f);if(u>=0.0){s=u;i=g;return+s}s=+lo(j,v,c,d,e,f);i=g;return+s}function mo(a,b,c,d,e,f){a=a|0;b=+b;c=+c;d=+d;e=+e;f=+f;var g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0,q=0,r=0,s=0,t=0.0,u=0.0,v=0.0,w=0.0;g=i;i=i+144|0;j=g|0;k=g+64|0;l=g+128|0;m=+h[a+8>>3];if(m<d){n=-1}else{n=m>d|0}m=+h[a+24>>3];if(m<d){o=-1}else{o=m>d|0}m=+h[a+40>>3];if(m<d){p=-1}else{p=m>d|0}m=+h[a+56>>3];if(m<d){q=-1}else{q=m>d|0}r=((o|0)!=(n|0)&(n|0)!=0&1)+((n|0)==0)+((p|0)!=(o|0)&(o|0)!=0&1)+((q|0)!=(p|0)&(p|0)!=0&1)|0;if((r|0)==1){s=10}else if((r|0)==0){t=-1.0;i=g;return+t}do{if((s|0)==10){if(m<0.0){u=m+-.5}else{u=m+.5}if(d<0.0){v=d+-.5}else{v=d+.5}if((~~u|0)!=(~~v|0)){break}w=+h[a+48>>3];i=g;return+(w<e|w>f?-1.0:c)}}while(0);s=j|0;j=k|0;Qm(l,a,3,.5,s,j);v=(b+c)*.5;u=+mo(s,b,v,d,e,f);if(u>=0.0){t=u;i=g;return+t}t=+mo(j,v,c,d,e,f);i=g;return+t}function no(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,la=0,ma=0,na=0,oa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;e=i;f=1;g=0;h=i;i=i+168|0;c[h>>2]=0;while(1)switch(f|0){case 1:j=d+8|0;k=c[j>>2]|0;if(((b[k+226>>1]|0)-(b[k+224>>1]|0)|0)<2){f=60;break}else{f=2;break};case 2:l=c[k+184>>2]|0;if((c[l+88>>2]|0)==0){m=1;n=k;f=30;break}else{o=1;p=2;q=k;r=l;f=4;break};case 3:l=p+1|0;if((c[s+(l*44|0)>>2]|0)==0){f=5;break}else{o=p;p=l;q=t;r=s;f=4;break};case 4:if((c[r+(o*44|0)>>2]|0)>0){w=0;x=r;y=q;f=6;break}else{t=q;s=r;f=3;break};case 5:if((p|0)>0){m=p;n=t;f=30;break}else{f=56;break};case 6:z=(c[(c[x+(o*44|0)+4>>2]|0)+(w<<2)>>2]|0)+8|0;A=c[z>>2]|0;if((a[A+156|0]|0)==1){f=7;break}else{f=29;break};case 7:if((c[A+176>>2]|0)==1){f=8;break}else{f=29;break};case 8:if((c[A+184>>2]|0)==1){f=9;break}else{f=29;break};case 9:if((c[A+104>>2]|0)==0){B=w;C=y;f=10;break}else{f=29;break};case 10:D=B+1|0;E=c[C+184>>2]|0;if((D|0)<(c[E+(o*44|0)>>2]|0)){f=11;break}else{f=27;break};case 11:F=c[(c[(c[E+(o*44|0)+4>>2]|0)+(D<<2)>>2]|0)+8>>2]|0;G=c[c[(c[z>>2]|0)+172>>2]>>2]|0;H=F+172|0;I=c[c[H>>2]>>2]|0;if((a[F+156|0]|0)==1){f=12;break}else{f=27;break};case 12:if((c[H+4>>2]|0)==1){f=13;break}else{f=27;break};case 13:if((c[F+184>>2]|0)==1){f=14;break}else{f=27;break};case 14:if((c[F+104>>2]|0)==0){f=15;break}else{f=27;break};case 15:if((c[((c[G>>2]&3|0)==3?G:G+32|0)+28>>2]|0)==(c[((c[I>>2]&3|0)==3?I:I+32|0)+28>>2]|0)){f=16;break}else{f=27;break};case 16:J=c[G+8>>2]|0;if((a[J+112|0]|0)==0){K=G;L=J;f=18;break}else{M=J;f=19;break};case 17:K=N;L=O;f=18;break;case 18:P=c[I+8>>2]|0;if((a[P+112|0]|0)==0){Q=I;R=P;f=22;break}else{S=P;f=20;break};case 19:N=c[M+116>>2]|0;O=c[N+8>>2]|0;if((a[O+112|0]|0)==0){f=17;break}else{M=O;f=19;break};case 20:T=c[S+116>>2]|0;U=c[T+8>>2]|0;if((a[U+112|0]|0)==0){f=21;break}else{S=U;f=20;break};case 21:Q=T;R=U;f=22;break;case 22:if((a[L+153|0]|0)==0){f=23;break}else{f=27;break};case 23:if((a[R+153|0]|0)==0){f=24;break}else{f=27;break};case 24:l=c[Q>>2]&3;V=c[K>>2]&3;if((da((c[(c[(c[((V|0)==3?K:K+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((V|0)==2?K:K-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0,(c[(c[(c[((l|0)==3?Q:Q+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((l|0)==2?Q:Q-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)|0)>0){f=25;break}else{f=27;break};case 25:l=wa(26,J+16|0,P+16|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;if((l|0)==0){f=26;break}else{f=27;break};case 26:B=D;C=c[j>>2]|0;f=10;break;case 27:if((D-w|0)>1){f=28;break}else{f=29;break};case 28:ja(8,d|0,o|0,w|0,B|0,1);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;f=29;break;case 29:l=w+1|0;V=c[j>>2]|0;W=c[V+184>>2]|0;if((l|0)<(c[W+(o*44|0)>>2]|0)){w=l;x=W;y=V;f=6;break}else{t=V;s=W;f=3;break};case 30:W=c[n+184>>2]|0;if((c[W+(m*44|0)>>2]|0)>0){X=0;Y=W;Z=n;f=31;break}else{_=n;f=55;break};case 31:$=(c[(c[Y+(m*44|0)+4>>2]|0)+(X<<2)>>2]|0)+8|0;aa=c[$>>2]|0;if((a[aa+156|0]|0)==1){f=32;break}else{f=54;break};case 32:if((c[aa+184>>2]|0)==1){f=33;break}else{f=54;break};case 33:if((c[aa+176>>2]|0)==1){f=34;break}else{f=54;break};case 34:if((c[aa+104>>2]|0)==0){ba=X;ca=Z;f=35;break}else{f=54;break};case 35:ea=ba+1|0;fa=c[ca+184>>2]|0;if((ea|0)<(c[fa+(m*44|0)>>2]|0)){f=36;break}else{f=52;break};case 36:ga=c[(c[(c[fa+(m*44|0)+4>>2]|0)+(ea<<2)>>2]|0)+8>>2]|0;ha=c[c[(c[$>>2]|0)+180>>2]>>2]|0;ia=ga+180|0;la=c[c[ia>>2]>>2]|0;if((a[ga+156|0]|0)==1){f=37;break}else{f=52;break};case 37:if((c[ia+4>>2]|0)==1){f=38;break}else{f=52;break};case 38:if((c[ga+176>>2]|0)==1){f=39;break}else{f=52;break};case 39:if((c[ga+104>>2]|0)==0){f=40;break}else{f=52;break};case 40:if((c[((c[ha>>2]&3|0)==2?ha:ha-32|0)+28>>2]|0)==(c[((c[la>>2]&3|0)==2?la:la-32|0)+28>>2]|0)){f=41;break}else{f=52;break};case 41:ma=c[ha+8>>2]|0;if((a[ma+112|0]|0)==0){na=ha;oa=ma;f=43;break}else{qa=ma;f=44;break};case 42:na=ra;oa=sa;f=43;break;case 43:ta=c[la+8>>2]|0;if((a[ta+112|0]|0)==0){ua=la;va=ta;f=47;break}else{xa=ta;f=45;break};case 44:ra=c[qa+116>>2]|0;sa=c[ra+8>>2]|0;if((a[sa+112|0]|0)==0){f=42;break}else{qa=sa;f=44;break};case 45:ya=c[xa+116>>2]|0;za=c[ya+8>>2]|0;if((a[za+112|0]|0)==0){f=46;break}else{xa=za;f=45;break};case 46:ua=ya;va=za;f=47;break;case 47:if((a[oa+153|0]|0)==0){f=48;break}else{f=52;break};case 48:if((a[va+153|0]|0)==0){f=49;break}else{f=52;break};case 49:W=c[ua>>2]&3;V=c[na>>2]&3;if((da((c[(c[(c[((V|0)==3?na:na+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((V|0)==2?na:na-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0,(c[(c[(c[((W|0)==3?ua:ua+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((W|0)==2?ua:ua-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0)|0)>0){f=50;break}else{f=52;break};case 50:W=wa(26,ma+56|0,ta+56|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;if((W|0)==0){f=51;break}else{f=52;break};case 51:ba=ea;ca=c[j>>2]|0;f=35;break;case 52:if((ea-X|0)>1){f=53;break}else{f=54;break};case 53:ja(8,d|0,m|0,X|0,ba|0,0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;f=54;break;case 54:W=X+1|0;V=c[j>>2]|0;l=c[V+184>>2]|0;if((W|0)<(c[l+(m*44|0)>>2]|0)){X=W;Y=l;Z=V;f=31;break}else{_=V;f=55;break};case 55:V=m-1|0;if((V|0)>0){m=V;n=_;f=30;break}else{f=56;break};case 56:Aa=BF(178392,f,h)|0;f=61;break;case 61:if((Aa|0)==0){f=57;break}else{f=58;break};case 57:V=c[j>>2]|0;if((c[V+172>>2]|0)<1){f=60;break}else{Ba=1;Ca=V;f=59;break};case 58:pa(16,3,129512,(V=i,i=i+1|0,i=i+7&-8,c[V>>2]=0,V)|0)|0;if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;i=V;f=60;break;case 59:ka(106,c[(c[Ca+176>>2]|0)+(Ba<<2)>>2]|0);if((u|0)!=0&(v|0)!=0){g=CF(c[u>>2]|0,h)|0;if((g|0)>0){f=-1;break}else return}u=v=0;V=c[j>>2]|0;if((Ba|0)<(c[V+172>>2]|0)){Ba=Ba+1|0;Ca=V;f=59;break}else{f=60;break};case 60:i=e;return;case-1:if((g|0)==56){Aa=v;f=61}u=v=0;break}}function oo(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;g=a+8|0;h=c[(c[g>>2]|0)+184>>2]|0;i=c[h+(b*44|0)+4>>2]|0;j=c[i+(d<<2)>>2]|0;k=d+1|0;do{if((d|0)<(e|0)){l=(f|0)==1;m=j+8|0;n=k;o=i;while(1){p=c[o+(n<<2)>>2]|0;q=p+8|0;r=c[q>>2]|0;do{if(l){s=c[c[r+180>>2]>>2]|0;if((s|0)==0){t=r;break}else{u=s;v=r}while(1){s=c[(c[m>>2]|0)+180>>2]|0;w=c[s>>2]|0;x=c[u>>2]|0;a:do{if((w|0)==0){y=u-32|0;z=14}else{A=u-32|0;B=c[((x&3|0)==2?u:A)+28>>2]|0;C=0;D=w;while(1){E=C+1|0;if((c[((c[D>>2]&3|0)==2?D:D-32|0)+28>>2]|0)==(B|0)){break}F=c[s+(E<<2)>>2]|0;if((F|0)==0){y=A;z=14;break a}else{C=E;D=F}}if((D|0)==0){y=A;z=14}else{G=D;H=v}}}while(0);if((z|0)==14){z=0;s=Zo(j,c[((x&3|0)==2?u:y)+28>>2]|0,u)|0;G=s;H=c[q>>2]|0}s=c[c[H+172>>2]>>2]|0;if((s|0)!=0){w=s;do{ep(w,G);Vo(w);w=c[c[(c[q>>2]|0)+172>>2]>>2]|0;}while((w|0)!=0)}Vo(u);w=c[q>>2]|0;x=c[c[w+180>>2]>>2]|0;if((x|0)==0){t=w;break}else{u=x;v=w}}}else{w=c[c[r+172>>2]>>2]|0;if((w|0)==0){t=r;break}else{I=w;J=r}while(1){w=c[(c[m>>2]|0)+172>>2]|0;x=c[w>>2]|0;s=c[I>>2]|0;b:do{if((x|0)==0){K=I+32|0;z=24}else{C=I+32|0;B=c[((s&3|0)==3?I:C)+28>>2]|0;F=0;E=x;while(1){L=F+1|0;if((c[((c[E>>2]&3|0)==3?E:E+32|0)+28>>2]|0)==(B|0)){break}M=c[w+(L<<2)>>2]|0;if((M|0)==0){K=C;z=24;break b}else{F=L;E=M}}if((E|0)==0){K=C;z=24}else{N=E;O=J}}}while(0);if((z|0)==24){z=0;w=Zo(c[((s&3|0)==3?I:K)+28>>2]|0,j,I)|0;N=w;O=c[q>>2]|0}w=c[c[O+180>>2]>>2]|0;if((w|0)!=0){x=w;do{ep(x,N);Vo(x);x=c[c[(c[q>>2]|0)+180>>2]>>2]|0;}while((x|0)!=0)}Vo(I);x=c[q>>2]|0;s=c[c[x+172>>2]>>2]|0;if((s|0)==0){t=x;break}else{I=s;J=x}}}}while(0);if((c[t+176>>2]|0)!=(-(c[t+184>>2]|0)|0)){z=29;break}ap(a,p);if((n|0)>=(e|0)){z=3;break}n=n+1|0;o=c[(c[(c[g>>2]|0)+184>>2]|0)+(b*44|0)+4>>2]|0}if((z|0)==3){P=c[(c[g>>2]|0)+184>>2]|0;break}else if((z|0)==29){cc(115624,108424,115,170248)}}else{P=h}}while(0);h=e+1|0;e=P+(b*44|0)|0;if((h|0)<(c[e>>2]|0)){Q=k;R=h;S=P}else{T=k;U=e;c[U>>2]=T;V=c[g>>2]|0;W=V+184|0;X=W;Y=c[X>>2]|0;Z=Y+(b*44|0)+4|0;_=c[Z>>2]|0;$=_+(T<<2)|0;c[$>>2]=0;return}while(1){e=c[S+(b*44|0)+4>>2]|0;k=c[e+(R<<2)>>2]|0;c[e+(Q<<2)>>2]=k;c[(c[k+8>>2]|0)+236>>2]=Q;k=Q+1|0;e=R+1|0;P=c[(c[g>>2]|0)+184>>2]|0;h=P+(b*44|0)|0;if((e|0)<(c[h>>2]|0)){Q=k;R=e;S=P}else{T=k;U=h;break}}c[U>>2]=T;V=c[g>>2]|0;W=V+184|0;X=W;Y=c[X>>2]|0;Z=Y+(b*44|0)+4|0;_=c[Z>>2]|0;$=_+(T<<2)|0;c[$>>2]=0;return}function po(d){d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0;e=i;f=d+8|0;g=c[f>>2]|0;h=b[g+224>>1]|0;if(h<<16>>16<=(b[g+226>>1]|0)){j=h<<16>>16;h=g;while(1){c[(c[h+256>>2]|0)+(j<<2)>>2]=0;g=c[f>>2]|0;if((j|0)<(b[g+226>>1]|0)){j=j+1|0;h=g}else{break}}}Xp(d);h=ux(d)|0;if((h|0)!=0){j=h;do{h=c[j+8>>2]|0;g=(c[(c[f>>2]|0)+256>>2]|0)+(c[h+232>>2]<<2)|0;k=c[g>>2]|0;if((k|0)==0){l=7}else{if((c[(c[k+8>>2]|0)+236>>2]|0)>(c[h+236>>2]|0)){l=7}}if((l|0)==7){l=0;c[g>>2]=j}g=mw(d,j)|0;if((g|0)!=0){h=g;do{g=c[(c[h+8>>2]|0)+172>>2]|0;if((g|0)==0){m=h}else{k=g;while(1){g=c[(c[k+8>>2]|0)+172>>2]|0;if((g|0)==0){break}else{k=g}}m=k}g=m;n=c[g>>2]|0;o=m-32|0;p=c[((n&3|0)==2?m:o)+28>>2]|0;q=c[p+8>>2]|0;r=c[q+232>>2]|0;s=h;t=c[s>>2]|0;u=h-32|0;if((r|0)<(c[(c[(c[((t&3|0)==2?h:u)+28>>2]|0)+8>>2]|0)+232>>2]|0)){v=m;w=g;g=o;o=p;p=q;q=r;r=n;n=t;while(1){t=(c[(c[f>>2]|0)+256>>2]|0)+(q<<2)|0;x=c[t>>2]|0;if((x|0)==0){l=15}else{if((c[(c[x+8>>2]|0)+236>>2]|0)>(c[p+236>>2]|0)){l=15}else{y=r;z=n}}if((l|0)==15){l=0;c[t>>2]=o;y=c[w>>2]|0;z=c[s>>2]|0}t=c[c[(c[(c[((y&3|0)==2?v:g)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;x=t;A=c[x>>2]|0;B=t-32|0;C=c[((A&3|0)==2?t:B)+28>>2]|0;D=c[C+8>>2]|0;E=c[D+232>>2]|0;if((E|0)<(c[(c[(c[((z&3|0)==2?h:u)+28>>2]|0)+8>>2]|0)+232>>2]|0)){v=t;w=x;g=B;o=C;p=D;q=E;r=A;n=z}else{break}}}h=ow(d,h)|0;}while((h|0)!=0)}j=vx(d,j)|0;}while((j|0)!=0)}j=c[f>>2]|0;z=b[j+224>>1]|0;a:do{if(z<<16>>16>(b[j+226>>1]|0)){F=j}else{y=d|0;m=z<<16>>16;h=j;while(1){G=c[(c[h+256>>2]|0)+(m<<2)>>2]|0;H=G+8|0;n=c[(c[H>>2]|0)+236>>2]|0;if((c[(c[(c[(c[(Ix(y)|0)+8>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0)+(n<<2)>>2]|0)!=(G|0)){break}n=c[(c[(c[(Ix(y)|0)+8>>2]|0)+184>>2]|0)+(m*44|0)+4>>2]|0;r=c[f>>2]|0;c[(c[r+184>>2]|0)+(m*44|0)+4>>2]=n+(c[(c[(c[(c[r+256>>2]|0)+(m<<2)>>2]|0)+8>>2]|0)+236>>2]<<2);r=c[(c[f>>2]|0)+184>>2]|0;if((c[r+(m*44|0)>>2]|0)>0){n=0;q=-1;p=r;b:while(1){r=c[(c[p+(m*44|0)+4>>2]|0)+(n<<2)>>2]|0;if((r|0)==0){I=q;break}o=c[r+8>>2]|0;do{if((a[o+156|0]|0)==0){if((Rx(d,r|0)|0)==0){I=q;break b}else{J=n}}else{g=c[c[o+172>>2]>>2]|0;if((g|0)==0){J=q;break}else{K=g}while(1){g=c[(c[K+8>>2]|0)+116>>2]|0;if((g|0)==0){break}K=g}g=K;if((Rx(d,c[((c[g>>2]&3|0)==3?K:K+32|0)+28>>2]|0)|0)==0){J=q;break}w=(Rx(d,c[((c[g>>2]&3|0)==2?K:K-32|0)+28>>2]|0)|0)==0;J=w?q:n}}while(0);o=n+1|0;r=c[(c[f>>2]|0)+184>>2]|0;if((o|0)<(c[r+(m*44|0)>>2]|0)){n=o;q=J;p=r}else{I=J;break}}if((I|0)==-1){l=35}else{L=I}}else{l=35}if((l|0)==35){l=0;p=$w(y)|0;Fv(0,128768,(M=i,i=i+16|0,c[M>>2]=p,c[M+8>>2]=m,M)|0)|0;i=M;L=-1}c[(c[(c[f>>2]|0)+184>>2]|0)+(m*44|0)>>2]=L+1;p=c[f>>2]|0;if((m|0)<(b[p+226>>1]|0)){m=m+1|0;h=p}else{F=p;break a}}h=$w(G|0)|0;y=c[(c[H>>2]|0)+236>>2]|0;Fv(1,159192,(M=i,i=i+24|0,c[M>>2]=h,c[M+8>>2]=y,c[M+16>>2]=m,M)|0)|0;i=M;rc(178392,1)}}while(0);if((c[F+172>>2]|0)<1){i=e;return}else{N=1;O=F}while(1){po(c[(c[O+176>>2]|0)+(N<<2)>>2]|0);F=c[f>>2]|0;if((N|0)<(c[F+172>>2]|0)){N=N+1|0;O=F}else{break}}i=e;return}function qo(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[53734]=b;e=(a[215384]|0)+1&255;a[215384]=e<<24>>24==0?1:e;e=b+8|0;c[(c[e>>2]|0)+208>>2]=0;c[(c[e>>2]|0)+220>>2]=0;e=ux(b)|0;if((e|0)==0){return}if((d|0)>0){f=e}else{d=e;do{do{if((d|0)==(Lm(d)|0)){if((a[(c[d+8>>2]|0)+157|0]|0)==(a[215384]|0)){break}c[(c[(c[53734]|0)+8>>2]|0)+180>>2]=0;c[53672]=0;ro(d);e=(c[(c[53734]|0)+8>>2]|0)+208|0;g=c[e>>2]|0;c[e>>2]=g+1;e=(c[(c[53734]|0)+8>>2]|0)+204|0;h=c[e>>2]|0;if((h|0)==0){i=kk(c[e+4>>2]<<2)|0}else{i=mk(h,c[e+4>>2]<<2)|0}c[(c[(c[53734]|0)+8>>2]|0)+204>>2]=i;e=c[(c[53734]|0)+8>>2]|0;c[(c[e+204>>2]|0)+(g<<2)>>2]=c[e+180>>2]}}while(0);d=vx(b,d)|0;}while((d|0)!=0);return}do{d=c[f+8>>2]|0;i=c[d+212>>2]|0;if((i|0)==0){if((f|0)==(Lm(f)|0)){j=f;k=6}}else{j=c[(c[(c[i+8>>2]|0)+256>>2]|0)+(c[d+232>>2]<<2)>>2]|0;k=6}do{if((k|0)==6){k=0;if((a[(c[j+8>>2]|0)+157|0]|0)==(a[215384]|0)){break}c[(c[(c[53734]|0)+8>>2]|0)+180>>2]=0;c[53672]=0;ro(j);d=(c[(c[53734]|0)+8>>2]|0)+208|0;i=c[d>>2]|0;c[d>>2]=i+1;d=(c[(c[53734]|0)+8>>2]|0)+204|0;e=c[d>>2]|0;if((e|0)==0){l=kk(c[d+4>>2]<<2)|0}else{l=mk(e,c[d+4>>2]<<2)|0}c[(c[(c[53734]|0)+8>>2]|0)+204>>2]=l;d=c[(c[53734]|0)+8>>2]|0;c[(c[d+204>>2]|0)+(i<<2)>>2]=c[d+180>>2]}}while(0);f=vx(b,f)|0;}while((f|0)!=0);return}function ro(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;d=i;i=i+32|0;e=d|0;f=(c[(c[53734]|0)+8>>2]|0)+220|0;c[f>>2]=(c[f>>2]|0)+1;f=b+8|0;a[(c[f>>2]|0)+157|0]=a[215384]|0;g=c[53672]|0;h=(c[f>>2]|0)+168|0;if((g|0)==0){c[h>>2]=0;c[(c[(c[53734]|0)+8>>2]|0)+180>>2]=b}else{c[h>>2]=g;c[(c[(c[53672]|0)+8>>2]|0)+164>>2]=b}c[53672]=b;c[(c[f>>2]|0)+164>>2]=0;g=c[f>>2]|0;f=g+180|0;h=e;j=c[f+4>>2]|0;c[h>>2]=c[f>>2];c[h+4>>2]=j;j=g+172|0;h=e+8|0;f=c[j+4>>2]|0;c[h>>2]=c[j>>2];c[h+4>>2]=f;f=g+188|0;h=e+16|0;j=c[f+4>>2]|0;c[h>>2]=c[f>>2];c[h+4>>2]=j;j=g+196|0;g=e+24|0;h=c[j+4>>2]|0;c[g>>2]=c[j>>2];c[g+4>>2]=h;h=0;do{g=c[e+(h<<3)>>2]|0;do{if((g|0)!=0){j=c[g>>2]|0;if((j|0)==0){break}else{k=0;l=j}do{j=c[l>>2]&3;f=c[((j|0)==2?l:l-32|0)+28>>2]|0;if((f|0)==(b|0)){m=c[((j|0)==3?l:l+32|0)+28>>2]|0}else{m=f}do{if((a[(c[m+8>>2]|0)+157|0]|0)!=(a[215384]|0)){if((m|0)!=(Lm(m)|0)){break}ro(m)}}while(0);k=k+1|0;l=c[g+(k<<2)>>2]|0;}while((l|0)!=0)}}while(0);h=h+1|0;}while((h|0)<4);i=d;return}function so(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=ux(d)|0;if((e|0)!=0){f=e;do{e=f|0;Wx(e,162896,304,1)|0;Ym(f);vn(f,c[(c[(Hx(e)|0)+8>>2]|0)+116>>2]&1);e=f+8|0;c[(c[e>>2]|0)+176>>2]=0;g=jk(20)|0;c[(c[e>>2]|0)+172>>2]=g;c[(c[e>>2]|0)+184>>2]=0;g=jk(20)|0;c[(c[e>>2]|0)+180>>2]=g;c[(c[e>>2]|0)+200>>2]=0;g=jk(12)|0;c[(c[e>>2]|0)+196>>2]=g;c[(c[e>>2]|0)+192>>2]=0;g=jk(12)|0;c[(c[e>>2]|0)+188>>2]=g;c[(c[e>>2]|0)+208>>2]=0;g=jk(12)|0;c[(c[e>>2]|0)+204>>2]=g;c[(c[e>>2]|0)+216>>2]=1;f=vx(d,f)|0;}while((f|0)!=0)}f=ux(d)|0;if((f|0)==0){return}else{h=f}do{f=mw(d,h)|0;if((f|0)!=0){e=f;do{f=e|0;Wx(f,158888,176,1)|0;Zm(e)|0;g=Em(f,c[53750]|0,1,0)|0;i=e+8|0;c[(c[i>>2]|0)+156>>2]=g;g=e;j=Hm(c[((c[g>>2]&3|0)==3?e:e+32|0)+28>>2]|0,c[53620]|0,213336)|0;k=Hm(c[((c[g>>2]&3|0)==2?e:e-32|0)+28>>2]|0,c[53620]|0,213336)|0;b[(c[i>>2]|0)+154>>1]=1;b[(c[i>>2]|0)+168>>1]=1;if((a[j]|0)!=0&(j|0)==(k|0)){b[(c[i>>2]|0)+154>>1]=1e3;k=(c[i>>2]|0)+156|0;c[k>>2]=(c[k>>2]|0)*100|0}if((Vn(e)|0)!=0){b[(c[i>>2]|0)+154>>1]=0;c[(c[i>>2]|0)+156>>2]=0}k=(Em(f,c[53762]|0,0,0)|0)&255;a[(c[i>>2]|0)+152|0]=k;k=(Em(f,c[53774]|0,1,0)|0)&65535;b[(c[i>>2]|0)+170>>1]=k;e=ow(d,e)|0;}while((e|0)!=0)}h=vx(d,h)|0;}while((h|0)!=0);return}function to(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[(c[b+8>>2]|0)+180>>2]|0;if((d|0)!=0){e=d;while(1){d=e+8|0;f=c[d>>2]|0;g=c[f+164>>2]|0;h=c[f+176>>2]|0;if((h|0)>0){i=h;h=f;while(1){j=i-1|0;k=c[(c[h+172>>2]|0)+(j<<2)>>2]|0;Vo(k);eF(c[k+8>>2]|0);eF(k|0);k=c[d>>2]|0;if((j|0)>0){i=j;h=k}else{l=k;break}}}else{l=f}h=l+180|0;i=c[h+4>>2]|0;if((i|0)>0){k=i-1|0;i=c[(c[h>>2]|0)+(k<<2)>>2]|0;Vo(i);eF(c[i+8>>2]|0);eF(i|0);if((k|0)>0){i=k;do{i=i-1|0;k=c[(c[(c[d>>2]|0)+180>>2]|0)+(i<<2)>>2]|0;Vo(k);eF(c[k+8>>2]|0);eF(k|0);}while((i|0)>0)}m=c[d>>2]|0}else{m=l}if((a[m+156|0]|0)==1){i=c[m+180>>2]|0;if((i|0)==0){n=m}else{eF(i);n=c[d>>2]|0}i=c[n+172>>2]|0;if((i|0)==0){o=n}else{eF(i);o=c[d>>2]|0}eF(o);eF(e)}if((g|0)==0){break}else{e=g}}}e=ux(b)|0;if((e|0)==0){vo(b);return}else{p=e}do{e=mw(b,p)|0;if((e|0)!=0){o=e;do{tn(o);o=ow(b,o)|0;}while((o|0)!=0)}uo(p);p=vx(b,p)|0;}while((p|0)!=0);vo(b);return}function uo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;b=a+8|0;d=c[b>>2]|0;e=c[d+172>>2]|0;if((e|0)==0){f=d}else{eF(e);f=c[b>>2]|0}e=c[f+180>>2]|0;if((e|0)==0){g=f}else{eF(e);g=c[b>>2]|0}e=c[g+188>>2]|0;if((e|0)==0){h=g}else{eF(e);h=c[b>>2]|0}e=c[h+196>>2]|0;if((e|0)==0){i=h}else{eF(e);i=c[b>>2]|0}e=c[i+204>>2]|0;if((e|0)==0){j=i}else{eF(e);j=c[b>>2]|0}dk(c[j+104>>2]|0);j=c[(c[b>>2]|0)+8>>2]|0;if((j|0)==0){k=a|0;l=Xx(k,162896)|0;return}Cc[c[(c[j+4>>2]|0)+4>>2]&255](a);k=a|0;l=Xx(k,162896)|0;return}function vo(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=sy(a)|0;if((d|0)!=0){e=d;do{vo(e);e=ty(e)|0;}while((e|0)!=0)}e=a+8|0;d=c[e>>2]|0;f=c[d+176>>2]|0;if((f|0)==0){g=d}else{eF(f);g=c[e>>2]|0}f=c[g+256>>2]|0;if((f|0)==0){h=g}else{eF(f);h=c[e>>2]|0}f=c[h+204>>2]|0;if((f|0)==0){i=h}else{eF(f);i=c[e>>2]|0}f=c[i+184>>2]|0;do{if((f|0)!=0){h=b[i+224>>1]|0;if(h<<16>>16>(b[i+226>>1]|0)){j=h;k=f}else{g=h<<16>>16;h=f;while(1){eF(c[h+(g*44|0)+12>>2]|0);l=c[e>>2]|0;if((g|0)>=(b[l+226>>1]|0)){break}g=g+1|0;h=c[l+184>>2]|0}j=b[l+224>>1]|0;k=c[l+184>>2]|0}if(j<<16>>16==-1){eF(k-44|0);break}else{eF(k);break}}}while(0);k=a|0;if((Ix(k)|0)==(a|0)){return}Xx(k,167088)|0;return}function wo(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0;d=i;i=i+40|0;e=d|0;f=a|0;g=Em(f,Wv(a,0,120216,0)|0,-1,1)|0;qn(a,10);h=Sn(a,e)|0;xo(a);so(a);j=e+32|0;k=(g|0)==2;l=(g|0)==3;m=e+28|0;n=e+24|0;if((g|0)==1){Zp(a,h);yo(a,1);i=d;return}else{o=h}while(1){Zp(a,o);if((c[j>>2]|0)==0){p=o}else{Fv(0,157336,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;c[n>>2]=0;p=0}jp(a,(p|0)!=0|0);if(k){q=6;break}Hp(a,p);if(l){q=8;break}h=(c[m>>2]|0)-1|0;c[m>>2]=h;if((c[n>>2]|0)==0|(h|0)==0){q=10;break}else{o=p}}if((q|0)==6){yo(a,2);i=d;return}else if((q|0)==8){yo(a,2);i=d;return}else if((q|0)==10){p=a+8|0;do{if((b[(c[p>>2]|0)+128>>1]&16)!=0){o=ry(a,115032,0)|0;if((o|0)==0){break}n=ux(o)|0;a:do{if((n|0)!=0){m=n;while(1){l=vx(o,m)|0;ap(a,m);k=c[(c[m+8>>2]|0)+232>>2]|0;j=c[(c[p>>2]|0)+184>>2]|0;h=j+(k*44|0)|0;g=c[h>>2]|0;e=j+(k*44|0)+4|0;j=0;r=0;while(1){if((r|0)>=(g|0)){q=20;break}s=c[e>>2]|0;t=s+(r<<2)|0;u=c[t>>2]|0;v=r+1|0;if((u|0)==(m|0)){q=16;break}else{j=u;r=v}}if((q|0)==16){q=0;do{if((v|0)<(g|0)){c[t>>2]=c[s+(v<<2)>>2];e=r+2|0;u=c[(c[p>>2]|0)+184>>2]|0;w=u+(k*44|0)|0;x=c[w>>2]|0;if((e|0)<(x|0)){y=e;z=u}else{A=w;B=x;break}while(1){x=c[z+(k*44|0)+4>>2]|0;c[x+(y-1<<2)>>2]=c[x+(y<<2)>>2];x=y+1|0;w=c[(c[p>>2]|0)+184>>2]|0;u=w+(k*44|0)|0;e=c[u>>2]|0;if((x|0)<(e|0)){y=x;z=w}else{A=u;B=e;break}}}else{A=h;B=g}}while(0);c[A>>2]=B-1}else if((q|0)==20){q=0;if((j|0)!=(m|0)){break}}uo(m);Cx(a,m)|0;if((l|0)==0){break a}else{m=l}}cc(107992,102136,238,170008)}}while(0);vy(a,o)|0}}while(0);pq(a);Ao(a);if((Km(ew(f,127320)|0)|0)<<24>>24!=0){io(a)}Xk(a);i=d;return}}function xo(a){a=a|0;var b=0,c=0;b=a|0;if((Ix(b)|0)!=(a|0)){Wx(b,167088,272,1)|0}b=sy(a)|0;if((b|0)==0){return}else{c=b}do{xo(c);c=ty(c)|0;}while((c|0)!=0);return}function yo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;i=i+1024|0;e=Wv(a,1,96272,213336)|0;f=Wv(a,1,85640,213336)|0;g=ux(a)|0;if((g|0)==0){i=d;return}h=d|0;if((b|0)<=0){j=g;do{j=vx(a,j)|0;}while((j|0)!=0);i=d;return}if((b|0)>1){b=g;do{j=b+8|0;nb(h|0,80896,(k=i,i=i+8|0,c[k>>2]=c[(c[j>>2]|0)+232>>2],k)|0)|0;i=k;l=b|0;hw(l,e,h)|0;nb(h|0,80896,(k=i,i=i+8|0,c[k>>2]=c[(c[j>>2]|0)+236>>2],k)|0)|0;i=k;hw(l,f,h)|0;b=vx(a,b)|0;}while((b|0)!=0);i=d;return}else{b=g;do{nb(h|0,80896,(k=i,i=i+8|0,c[k>>2]=c[(c[b+8>>2]|0)+232>>2],k)|0)|0;i=k;hw(b|0,e,h)|0;b=vx(a,b)|0;}while((b|0)!=0);i=d;return}}function zo(b,c){b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=i;e=b;b=i;i=i+40|0;tF(b,e,40)|0;e=c;c=i;i=i+40|0;tF(c,e,40)|0;e=a[b+28|0]|0;do{if((a[c+28|0]|0)==0){f=e<<24>>24!=0|0}else{if(e<<24>>24==0){f=-1;break}g=~~(+h[b>>3]- +h[c>>3]);if((g|0)!=0){f=g;break}f=~~(+h[b+8>>3]- +h[c+8>>3])}}while(0);i=d;return f|0}function Ao(a){a=a|0;Bo(a,1);return}function Bo(d,e){d=d|0;e=e|0;var f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0.0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0.0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Vb=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0,xc=0,yc=0,zc=0,Ac=0,Bc=0,Cc=0,Dc=0,Fc=0,Gc=0,Hc=0,Ic=0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0,Pc=0,Qc=0,Rc=0,Sc=0,Tc=0,Uc=0,Vc=0,Wc=0,Xc=0,Yc=0,Zc=0,_c=0,$c=0,ad=0,bd=0,cd=0,dd=0,ed=0,fd=0,gd=0.0,hd=0.0,id=0.0,jd=0,kd=0,ld=0.0,md=0,nd=0.0,od=0,pd=0.0,qd=0.0,rd=0,sd=0.0,td=0,ud=0,vd=0,wd=0,xd=0,yd=0,zd=0,Ad=0,Bd=0,Cd=0,Dd=0,Ed=0,Fd=0.0,Gd=0.0,Hd=0.0,Id=0.0,Jd=0,Kd=0,Ld=0,Md=0,Nd=0.0,Od=0.0,Pd=0,Qd=0,Rd=0,Sd=0,Td=0,Ud=0,Vd=0,Wd=0,Xd=0,Yd=0,Zd=0,_d=0,$d=0,ae=0,be=0,ce=0,de=0,ee=0,fe=0,ge=0,he=0,ie=0,je=0,ke=0,le=0,me=0,ne=0.0,oe=0.0,pe=0.0,qe=0.0,re=0.0,se=0.0,te=0.0,ue=0,ve=0,we=0,xe=0,ye=0,ze=0,Ae=0,Be=0,Ce=0,De=0,Ee=0,Fe=0,Ge=0,He=0,Ie=0,Je=0,Ke=0.0,Le=0.0,Me=0.0,Ne=0.0,Oe=0,Pe=0,Qe=0,Re=0,Se=0,Te=0,Ue=0,Ve=0,We=0,Xe=0,Ye=0,Ze=0,_e=0,$e=0,af=0,bf=0,cf=0,df=0;f=i;i=i+7336|0;g=f|0;j=f+8|0;k=f+704|0;l=f+1400|0;m=f+2096|0;n=f+2792|0;o=f+2800|0;p=f+2912|0;q=f+3088|0;r=f+3152|0;s=f+3160|0;t=f+3856|0;u=f+4552|0;v=f+4728|0;w=f+4904|0;x=f+5080|0;y=f+5144|0;z=f+5208|0;A=f+5272|0;B=f+5968|0;C=f+6664|0;D=f+6672|0;E=f+6704|0;F=f+6736|0;G=f+6768|0;H=f+6800|0;I=f+7184|0;J=f+7248|0;K=f+7312|0;L=d+8|0;M=b[(c[L>>2]|0)+128>>1]&14;N=I|0;O=I+8|0;c[O>>2]=f+6832;P=J|0;Q=J+8|0;c[Q>>2]=f+7008;do{if((M|0)==4){R=ux(d)|0;if((R|0)!=0){S=R;do{R=S+8|0;T=c[R>>2]|0;if((c[T+204>>2]|0)!=0){U=T+96|0;V=+h[U>>3];h[U>>3]=+(c[T+240>>2]|0);c[(c[R>>2]|0)+240>>2]=~~V}S=vx(d,S)|0;}while((S|0)!=0)}if((a[(c[L>>2]|0)+113|0]&1)!=0){Fv(0,110208,(S=i,i=i+1|0,i=i+7&-8,c[S>>2]=0,S)|0)|0;i=S}S=ux(d)|0;if((S|0)==0){W=0;X=0;break}else{Y=S}while(1){S=mw(d,Y)|0;if((S|0)!=0){R=S;do{ll(d,R,4,11848);R=ow(d,R)|0;}while((R|0)!=0)}R=vx(d,Y)|0;if((R|0)==0){W=0;X=0;break}else{Y=R}}}else if((M|0)==0){i=f;return}else{go(d);if((gl()|0)!=0){i=f;return}R=jk(96)|0;S=R;T=c[(c[L>>2]|0)+236>>2]|0;c[K+8>>2]=(T|0)/4|0;U=K+12|0;c[U>>2]=T;T=jk(512)|0;Z=K+4|0;c[Z>>2]=0;_=K|0;c[_>>2]=0;$=c[L>>2]|0;aa=b[$+224>>1]|0;ba=aa<<16>>16;do{if(aa<<16>>16>(b[$+226>>1]|0)){ca=T;ea=0;fa=11520;ga=ba}else{ha=T;ia=0;ja=0;ka=ba;la=$;a:while(1){ma=c[la+184>>2]|0;na=c[ma+(ka*44|0)>>2]|0;oa=na+ja|0;pa=c[ma+(ka*44|0)+4>>2]|0;ma=c[pa>>2]|0;if((ma|0)!=0){V=+(c[_>>2]|0);qa=c[ma+8>>2]|0;ra=+h[qa+16>>3]- +h[qa+88>>3];c[_>>2]=~~(V<ra?V:ra)}do{if((na|0)!=0){qa=c[pa+(na-1<<2)>>2]|0;if((qa|0)==0){break}ra=+(c[Z>>2]|0);sa=c[qa+8>>2]|0;V=+h[sa+16>>3]+ +h[sa+96>>3];c[Z>>2]=~~(ra>V?ra:V)}}while(0);c[_>>2]=(c[_>>2]|0)-16;c[Z>>2]=(c[Z>>2]|0)+16;b:do{if((na|0)>0){pa=ha;sa=ia;qa=1;ta=ma;while(1){ua=ta+8|0;va=c[ua>>2]|0;wa=c[va+112>>2]|0;if((wa|0)==0){xa=va}else{ya=wa+8|0;wa=c[(c[ya>>2]|0)+96>>2]|0;if((wa|0)==0){za=22;break a}Aa=wa+56|0;wa=va+16|0;c[Aa>>2]=c[wa>>2];c[Aa+4>>2]=c[wa+4>>2];c[Aa+8>>2]=c[wa+8>>2];c[Aa+12>>2]=c[wa+12>>2];a[(c[(c[ya>>2]|0)+96>>2]|0)+81|0]=1;xa=c[ua>>2]|0}do{if((a[xa+156|0]|0)==0){Ba=xa;za=27}else{if((Ec[c[2963]&63](ta)|0)<<24>>24==0){Ca=sa;Da=pa;break}Ba=c[ua>>2]|0;za=27}}while(0);do{if((za|0)==27){za=0;ya=c[c[Ba+180>>2]>>2]|0;if((ya|0)==0){Ea=pa;Fa=sa;Ga=Ba}else{wa=pa;Aa=sa;va=0;Ha=ya;while(1){ya=c[Ha+8>>2]|0;Ia=a[ya+112|0]|0;do{if((Ia<<24>>24|0)==4|(Ia<<24>>24|0)==6){Ja=Aa;Ka=wa}else{c[ya+164>>2]=81;La=Aa+1|0;c[wa+(Aa<<2)>>2]=Ha;if((La&127|0)!=0){Ja=La;Ka=wa;break}if((wa|0)==0){Ma=kk((Aa<<2)+516|0)|0}else{Ma=mk(wa,(Aa<<2)+516|0)|0}Ja=La;Ka=Ma}}while(0);ya=va+1|0;Ia=c[ua>>2]|0;La=c[(c[Ia+180>>2]|0)+(ya<<2)>>2]|0;if((La|0)==0){Ea=Ka;Fa=Ja;Ga=Ia;break}else{wa=Ka;Aa=Ja;va=ya;Ha=La}}}do{if((c[Ga+188>>2]|0)==0){Na=Fa;Oa=Ea;Pa=Ga}else{Ha=c[c[Ga+188>>2]>>2]|0;if((Ha|0)==0){Na=Fa;Oa=Ea;Pa=Ga;break}else{Qa=Ea;Ra=Fa;Sa=0;Ta=Ha}while(1){Ha=c[Ta>>2]&3;c[(c[Ta+8>>2]|0)+164>>2]=(c[(c[(c[((Ha|0)==3?Ta:Ta+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)<(c[(c[(c[((Ha|0)==2?Ta:Ta-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)?146:162;Ha=Ra+1|0;c[Qa+(Ra<<2)>>2]=Ta;if((Ha&127|0)==0){if((Qa|0)==0){Ua=kk((Ra<<2)+516|0)|0}else{Ua=mk(Qa,(Ra<<2)+516|0)|0}Va=Ua}else{Va=Qa}va=Sa+1|0;Aa=c[ua>>2]|0;wa=c[(c[Aa+188>>2]|0)+(va<<2)>>2]|0;if((wa|0)==0){Na=Ha;Oa=Va;Pa=Aa;break}else{Qa=Va;Ra=Ha;Sa=va;Ta=wa}}}}while(0);wa=c[Pa+204>>2]|0;if((wa|0)==0){Ca=Na;Da=Oa;break}if((a[Pa+156|0]|0)==0){va=Pa+96|0;V=+h[va>>3];h[va>>3]=+(c[Pa+240>>2]|0);c[(c[ua>>2]|0)+240>>2]=~~V;Wa=c[(c[ua>>2]|0)+204>>2]|0}else{Wa=wa}wa=c[Wa>>2]|0;if((wa|0)==0){Ca=Na;Da=Oa;break}else{Xa=Oa;Ya=Na;Za=0;_a=wa}while(1){wa=c[_a>>2]&3;va=c[((wa|0)==3?_a:_a+32|0)+28>>2]|0;Ha=c[((wa|0)==2?_a:_a-32|0)+28>>2]|0;do{if((va|0)==(Ha|0)){wa=c[_a+8>>2]|0;if((a[wa+44|0]|0)!=0){$a=16;ab=4;break}bb=(a[wa+84|0]|0)==0?8:4;za=51}else{bb=(c[(c[va+8>>2]|0)+232>>2]|0)==(c[(c[Ha+8>>2]|0)+232>>2]|0)?2:1;za=51}}while(0);do{if((za|0)==51){za=0;if((bb|0)==1){$a=(c[(c[va+8>>2]|0)+232>>2]|0)<(c[(c[Ha+8>>2]|0)+232>>2]|0)?16:32;ab=1;break}else if((bb|0)==2){$a=(c[(c[va+8>>2]|0)+236>>2]|0)<(c[(c[Ha+8>>2]|0)+236>>2]|0)?16:32;ab=2;break}else{$a=16;ab=bb;break}}}while(0);c[(c[_a+8>>2]|0)+164>>2]=ab|$a|128;Ha=Ya+1|0;c[Xa+(Ya<<2)>>2]=_a;if((Ha&127|0)==0){if((Xa|0)==0){cb=kk((Ya<<2)+516|0)|0}else{cb=mk(Xa,(Ya<<2)+516|0)|0}db=cb}else{db=Xa}va=Za+1|0;wa=c[(c[(c[ua>>2]|0)+204>>2]|0)+(va<<2)>>2]|0;if((wa|0)==0){Ca=Ha;Da=db;break}else{Xa=db;Ya=Ha;Za=va;_a=wa}}}}while(0);ua=c[L>>2]|0;wa=c[ua+184>>2]|0;if((qa|0)>=(c[wa+(ka*44|0)>>2]|0)){eb=Da;fb=Ca;gb=ua;break b}ua=c[(c[wa+(ka*44|0)+4>>2]|0)+(qa<<2)>>2]|0;pa=Da;sa=Ca;qa=qa+1|0;ta=ua}}else{eb=ha;fb=ia;gb=la}}while(0);hb=ka+1|0;if((ka|0)<(b[gb+226>>1]|0)){ha=eb;ia=fb;ja=oa;ka=hb;la=gb}else{za=63;break}}if((za|0)==22){cc(151800,123888,319,171096)}else if((za|0)==63){ca=eb;ea=fb;fa=(oa<<5)+11520|0;ga=hb;break}}}while(0);Jb(ca|0,ea|0,4,194);c[R+84>>2]=jk(fa)|0;$=K+16|0;c[$>>2]=jk(ga<<5)|0;ba=(M|0)==2;do{if(ba){T=c[(c[L>>2]|0)+180>>2]|0;if((T|0)==0){break}else{ib=T}do{T=ib+8|0;aa=c[T>>2]|0;do{if((a[aa+156|0]|0)==1){if((c[aa+104>>2]|0)==0){jb=aa;break}if((c[aa+176>>2]|0)==0){jb=aa;break}la=(c[c[aa+180>>2]>>2]|0)+8|0;ka=c[la>>2]|0;if((a[ka+112|0]|0)==0){kb=la;lb=ka}else{la=ka;while(1){ka=(c[la+116>>2]|0)+8|0;ja=c[ka>>2]|0;if((a[ja+112|0]|0)==0){kb=ka;lb=ja;break}else{la=ja}}}la=c[lb+96>>2]|0;V=+h[la+24>>3];ra=+h[la+32>>3];la=(c[(c[(Hx(ib)|0)+8>>2]|0)+116>>2]&1|0)==0;h[(c[(c[kb>>2]|0)+96>>2]|0)+56>>3]=+h[(c[T>>2]|0)+16>>3]+(la?V:ra)*.5;h[(c[(c[kb>>2]|0)+96>>2]|0)+64>>3]=+h[(c[T>>2]|0)+24>>3];a[(c[(c[kb>>2]|0)+96>>2]|0)+81|0]=1;jb=c[T>>2]|0}else{jb=aa}}while(0);ib=c[jb+164>>2]|0;}while((ib|0)!=0)}}while(0);if((ea|0)>0){aa=p;T=q|0;la=p|0;ja=q|0;ka=q+8|0;ia=s+52|0;ha=t+52|0;ma=(M|0)==10;na=R+80|0;ta=j+52|0;qa=k+52|0;sa=o;pa=o|0;ua=o|0;wa=o+8|0;va=o+16|0;Ha=o+64|0;Aa=o+72|0;La=o+48|0;ya=o+64|0;Ia=o+32|0;mb=o+96|0;nb=o+96|0;ob=o+104|0;pb=o+80|0;qb=l+52|0;rb=m+52|0;sb=q;tb=ja+32|0;ub=ja-32|0;vb=u;wb=v;xb=x|0;yb=y|0;zb=z|0;Ab=A;Bb=B;Cb=D;Db=E;Eb=F;Fb=G;Gb=H;Hb=u|0;Ib=x|0;Kb=x+8|0;Lb=v|0;Mb=y|0;Nb=y+8|0;Ob=w|0;Pb=z|0;Qb=z+8|0;Rb=x;Sb=Ib+32|0;Tb=Ib-32|0;Ub=y;Vb=Mb+32|0;Wb=Mb-32|0;Xb=z;Yb=Pb+32|0;Zb=Pb-32|0;_b=A|0;$b=A+16|0;ac=A+52|0;bc=B+52|0;dc=R+56|0;ec=R+69|0;fc=R+16|0;gc=R+29|0;hc=B|0;ic=B+16|0;jc=J|0;kc=J;lc=P+32|0;mc=P-32|0;nc=I|0;oc=I;pc=N+32|0;qc=N-32|0;rc=0;while(1){sc=ca+(rc<<2)|0;tc=c[sc>>2]|0;uc=tc+8|0;vc=c[uc>>2]|0;wc=c[vc+172>>2]|0;if((wc|0)==0){xc=tc;yc=vc}else{zc=wc;while(1){Ac=c[zc+8>>2]|0;wc=c[Ac+172>>2]|0;if((wc|0)==0){break}else{zc=wc}}xc=zc;yc=Ac}wc=c[yc+116>>2]|0;if((wc|0)==0){Bc=xc}else{Cc=wc;while(1){wc=c[(c[Cc+8>>2]|0)+116>>2]|0;if((wc|0)==0){break}else{Cc=wc}}Bc=Cc}if((a[vc+44|0]|0)==0){zc=(a[vc+84|0]|0)==0?Bc:tc;Dc=zc;Fc=c[zc+8>>2]|0}else{Dc=tc;Fc=vc}zc=Dc+8|0;if((c[Fc+164>>2]&32|0)==0){Gc=Dc}else{wc=c[O>>2]|0;tF(wc|0,Fc|0,176)|0;tF(nc|0,Dc|0,32)|0;c[O>>2]=wc;wc=Dc;c[((c[oc>>2]&3|0)==3?N:pc)+28>>2]=c[((c[wc>>2]&3|0)==2?Dc:Dc-32|0)+28>>2];c[((c[oc>>2]&3|0)==2?N:qc)+28>>2]=c[((c[wc>>2]&3|0)==3?Dc:Dc+32|0)+28>>2];wc=c[O>>2]|0;Hc=wc+16|0;Ic=(c[zc>>2]|0)+56|0;c[Hc>>2]=c[Ic>>2];c[Hc+4>>2]=c[Ic+4>>2];c[Hc+8>>2]=c[Ic+8>>2];c[Hc+12>>2]=c[Ic+12>>2];c[Hc+16>>2]=c[Ic+16>>2];c[Hc+20>>2]=c[Ic+20>>2];c[Hc+24>>2]=c[Ic+24>>2];c[Hc+28>>2]=c[Ic+28>>2];c[Hc+32>>2]=c[Ic+32>>2];c[Hc+36>>2]=c[Ic+36>>2];Ic=wc+56|0;Hc=(c[zc>>2]|0)+16|0;c[Ic>>2]=c[Hc>>2];c[Ic+4>>2]=c[Hc+4>>2];c[Ic+8>>2]=c[Hc+8>>2];c[Ic+12>>2]=c[Hc+12>>2];c[Ic+16>>2]=c[Hc+16>>2];c[Ic+20>>2]=c[Hc+20>>2];c[Ic+24>>2]=c[Hc+24>>2];c[Ic+28>>2]=c[Hc+28>>2];c[Ic+32>>2]=c[Hc+32>>2];c[Ic+36>>2]=c[Hc+36>>2];a[wc+112|0]=1;c[wc+116>>2]=Dc;Gc=N}wc=rc+1|0;c:do{if((wc|0)<(ea|0)){Hc=Gc+8|0;Ic=1;zc=wc;while(1){Jc=ca+(zc<<2)|0;Kc=c[Jc>>2]|0;Lc=Kc+8|0;Mc=c[Lc>>2]|0;Nc=c[Mc+172>>2]|0;if((Nc|0)==0){Oc=Kc;Pc=Mc}else{Qc=Nc;while(1){Rc=c[Qc+8>>2]|0;Nc=c[Rc+172>>2]|0;if((Nc|0)==0){break}else{Qc=Nc}}Oc=Qc;Pc=Rc}Nc=c[Pc+116>>2]|0;if((Nc|0)==0){Sc=Oc}else{Tc=Nc;while(1){Nc=c[(c[Tc+8>>2]|0)+116>>2]|0;if((Nc|0)==0){break}else{Tc=Nc}}Sc=Tc}if((Bc|0)!=(Sc|0)){Uc=Ic;Vc=zc;break c}if((a[(c[uc>>2]|0)+113|0]|0)==0){if((a[Mc+44|0]|0)==0){Qc=(a[Mc+84|0]|0)==0?Bc:Kc;Wc=Qc;Xc=c[Qc+8>>2]|0}else{Wc=Kc;Xc=Mc}Qc=Wc+8|0;if((c[Xc+164>>2]&32|0)==0){Yc=Xc}else{Nc=c[Q>>2]|0;tF(Nc|0,Xc|0,176)|0;tF(jc|0,Wc|0,32)|0;c[Q>>2]=Nc;Nc=Wc;c[((c[kc>>2]&3|0)==3?P:lc)+28>>2]=c[((c[Nc>>2]&3|0)==2?Wc:Wc-32|0)+28>>2];c[((c[kc>>2]&3|0)==2?P:mc)+28>>2]=c[((c[Nc>>2]&3|0)==3?Wc:Wc+32|0)+28>>2];Nc=c[Q>>2]|0;Zc=Nc+16|0;_c=(c[Qc>>2]|0)+56|0;c[Zc>>2]=c[_c>>2];c[Zc+4>>2]=c[_c+4>>2];c[Zc+8>>2]=c[_c+8>>2];c[Zc+12>>2]=c[_c+12>>2];c[Zc+16>>2]=c[_c+16>>2];c[Zc+20>>2]=c[_c+20>>2];c[Zc+24>>2]=c[_c+24>>2];c[Zc+28>>2]=c[_c+28>>2];c[Zc+32>>2]=c[_c+32>>2];c[Zc+36>>2]=c[_c+36>>2];_c=Nc+56|0;Zc=(c[Qc>>2]|0)+16|0;c[_c>>2]=c[Zc>>2];c[_c+4>>2]=c[Zc+4>>2];c[_c+8>>2]=c[Zc+8>>2];c[_c+12>>2]=c[Zc+12>>2];c[_c+16>>2]=c[Zc+16>>2];c[_c+20>>2]=c[Zc+20>>2];c[_c+24>>2]=c[Zc+24>>2];c[_c+28>>2]=c[Zc+28>>2];c[_c+32>>2]=c[Zc+32>>2];c[_c+36>>2]=c[Zc+36>>2];a[Nc+112|0]=1;c[Nc+116>>2]=Wc;Yc=Nc}Nc=c[Hc>>2]|0;Zc=Nc+16|0;_c=Yc+16|0;Qc=a[Nc+44|0]|0;if((a[Yc+44|0]|0)==0){$c=Qc<<24>>24!=0|0}else{if(Qc<<24>>24==0){Uc=Ic;Vc=zc;break c}if((~~(+h[Zc>>3]- +h[_c>>3])|0)!=0){Uc=Ic;Vc=zc;break c}$c=~~(+h[Nc+24>>3]- +h[Yc+24>>3])}if(($c|0)!=0){Uc=Ic;Vc=zc;break c}_c=Nc+56|0;Zc=Yc+56|0;Qc=a[Nc+84|0]|0;if((a[Yc+84|0]|0)==0){ad=Qc<<24>>24!=0|0}else{if(Qc<<24>>24==0){Uc=Ic;Vc=zc;break c}if((~~(+h[_c>>3]- +h[Zc>>3])|0)!=0){Uc=Ic;Vc=zc;break c}ad=~~(+h[Nc+64>>3]- +h[Yc+64>>3])}if((ad|0)!=0){Uc=Ic;Vc=zc;break c}Nc=c[uc>>2]|0;if((c[Nc+164>>2]&15|0)==2){if((c[Nc+96>>2]|0)!=(c[(c[Lc>>2]|0)+96>>2]|0)){Uc=Ic;Vc=zc;break c}}if((c[(c[(c[Jc>>2]|0)+8>>2]|0)+164>>2]&64|0)!=0){Uc=Ic;Vc=zc;break c}}Nc=Ic+1|0;Zc=zc+1|0;if((Zc|0)<(ea|0)){Ic=Nc;zc=Zc}else{Uc=Nc;Vc=Zc;break}}}else{Uc=1;Vc=wc}}while(0);wc=c[tc>>2]&3;uc=c[((wc|0)==3?tc:tc+32|0)+28>>2]|0;vc=c[((wc|0)==2?tc:tc-32|0)+28>>2]|0;wc=c[uc+8>>2]|0;Cc=c[wc+232>>2]|0;d:do{if((uc|0)==(vc|0)){zc=c[L>>2]|0;do{if((Cc|0)==(b[zc+226>>1]|0)){if((Cc|0)>0){bd=~~(+h[(c[(c[c[(c[zc+184>>2]|0)+((Cc-1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +h[wc+24>>3]);break}else{bd=~~+h[wc+80>>3];break}}else{if((Cc|0)==(b[zc+224>>1]|0)){bd=~~(+h[wc+24>>3]- +h[(c[(c[c[(c[zc+184>>2]|0)+((Cc+1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]);break}else{Ic=c[zc+184>>2]|0;ra=+h[wc+24>>3];Hc=~~(+h[(c[(c[c[Ic+((Cc-1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]-ra);Zc=~~(ra- +h[(c[(c[c[Ic+((Cc+1|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]);bd=(Hc|0)<(Zc|0)?Hc:Zc;break}}}while(0);im(S,ca,rc,Uc,+(c[U>>2]|0),+((bd|0)/2|0|0),11848);if((Uc|0)>0){cd=0}else{break}do{zc=c[(c[(c[ca+(cd+rc<<2)>>2]|0)+8>>2]|0)+96>>2]|0;if((zc|0)!=0){_m(d,zc)}cd=cd+1|0;}while((cd|0)<(Uc|0))}else{if((Cc|0)==(c[(c[vc+8>>2]|0)+232>>2]|0)){c[ka>>2]=la;zc=c[sc>>2]|0;Zc=zc+8|0;Hc=c[Zc>>2]|0;Ic=a[Hc+113|0]|0;if((c[Hc+164>>2]&32|0)==0){dd=zc}else{tF(aa|0,Hc|0,176)|0;tF(T|0,zc|0,32)|0;c[ka>>2]=la;Hc=zc;c[((c[sb>>2]&3|0)==3?ja:tb)+28>>2]=c[((c[Hc>>2]&3|0)==2?zc:zc-32|0)+28>>2];c[((c[sb>>2]&3|0)==2?ja:ub)+28>>2]=c[((c[Hc>>2]&3|0)==3?zc:zc+32|0)+28>>2];Hc=(c[ka>>2]|0)+16|0;Nc=(c[Zc>>2]|0)+56|0;c[Hc>>2]=c[Nc>>2];c[Hc+4>>2]=c[Nc+4>>2];c[Hc+8>>2]=c[Nc+8>>2];c[Hc+12>>2]=c[Nc+12>>2];c[Hc+16>>2]=c[Nc+16>>2];c[Hc+20>>2]=c[Nc+20>>2];c[Hc+24>>2]=c[Nc+24>>2];c[Hc+28>>2]=c[Nc+28>>2];c[Hc+32>>2]=c[Nc+32>>2];c[Hc+36>>2]=c[Nc+36>>2];Nc=(c[ka>>2]|0)+56|0;Hc=(c[Zc>>2]|0)+16|0;c[Nc>>2]=c[Hc>>2];c[Nc+4>>2]=c[Hc+4>>2];c[Nc+8>>2]=c[Hc+8>>2];c[Nc+12>>2]=c[Hc+12>>2];c[Nc+16>>2]=c[Hc+16>>2];c[Nc+20>>2]=c[Hc+20>>2];c[Nc+24>>2]=c[Hc+24>>2];c[Nc+28>>2]=c[Hc+28>>2];c[Nc+32>>2]=c[Hc+32>>2];c[Nc+36>>2]=c[Hc+36>>2];a[(c[ka>>2]|0)+112|0]=1;c[(c[ka>>2]|0)+116>>2]=zc;dd=ja}e:do{if((Uc|0)>1){zc=1;while(1){Hc=zc+1|0;if((a[(c[(c[ca+(zc+rc<<2)>>2]|0)+8>>2]|0)+113|0]|0)!=0){break e}if((Hc|0)<(Uc|0)){zc=Hc}else{za=133;break}}}else{za=133}}while(0);do{if((za|0)==133){za=0;if(Ic<<24>>24!=0){break}zc=dd+8|0;Jc=c[zc>>2]|0;if((c[Jc+96>>2]|0)!=0){Lc=dd;Mc=c[Lc>>2]&3;Kc=c[((Mc|0)==3?dd:dd+32|0)+28>>2]|0;Tc=dd-32|0;Hc=c[((Mc|0)==2?dd:Tc)+28>>2]|0;Mc=Hx(Kc|0)|0;Nc=c[zc>>2]|0;Zc=c[Nc+172>>2]|0;while(1){_c=c[(c[Zc+8>>2]|0)+172>>2]|0;if((_c|0)==0){break}else{Zc=_c}}_c=(c[((c[Zc>>2]&3|0)==3?Zc:Zc+32|0)+28>>2]|0)+8|0;Qc=(c[Nc+96>>2]|0)+56|0;ed=(c[_c>>2]|0)+16|0;c[Qc>>2]=c[ed>>2];c[Qc+4>>2]=c[ed+4>>2];c[Qc+8>>2]=c[ed+8>>2];c[Qc+12>>2]=c[ed+12>>2];a[(c[(c[zc>>2]|0)+96>>2]|0)+81|0]=1;if(ba){ed=c[Kc+8>>2]|0;Qc=c[zc>>2]|0;ra=+h[ed+24>>3]+ +h[Qc+24>>3];fd=c[Hc+8>>2]|0;V=+h[fd+16>>3]+ +h[Qc+56>>3];gd=+h[fd+24>>3]+ +h[Qc+64>>3];fd=c[Qc+96>>2]|0;hd=+h[fd+56>>3];id=+h[fd+64>>3]- +h[fd+32>>3]*.5;h[ua>>3]=+h[ed+16>>3]+ +h[Qc+16>>3];h[wa>>3]=ra;c[va>>2]=c[sa>>2];c[va+4>>2]=c[sa+4>>2];c[va+8>>2]=c[sa+8>>2];c[va+12>>2]=c[sa+12>>2];h[Ha>>3]=hd;h[Aa>>3]=id;c[La>>2]=c[ya>>2];c[La+4>>2]=c[ya+4>>2];c[La+8>>2]=c[ya+8>>2];c[La+12>>2]=c[ya+12>>2];c[Ia>>2]=c[ya>>2];c[Ia+4>>2]=c[ya+4>>2];c[Ia+8>>2]=c[ya+8>>2];c[Ia+12>>2]=c[ya+12>>2];h[nb>>3]=V;h[ob>>3]=gd;c[pb>>2]=c[mb>>2];c[pb+4>>2]=c[mb+4>>2];c[pb+8>>2]=c[mb+8>>2];c[pb+12>>2]=c[mb+12>>2];c[n>>2]=7;jd=pa;kd=7}else{Qc=c[_c>>2]|0;gd=+h[Qc+16>>3];V=gd- +h[Qc+88>>3];id=gd+ +h[Qc+96>>3];gd=+h[Qc+24>>3];hd=gd+ +h[Qc+80>>3]*.5;Qc=c[Kc+8>>2]|0;_c=c[Qc+232>>2]|0;ed=c[(c[Mc+8>>2]|0)+184>>2]|0;fd=~~(+(~~(gd- +(c[ed+(_c*44|0)+16>>2]|0)- +h[Qc+24>>3]+ +(c[ed+(_c*44|0)+20>>2]|0))|0)/6.0);if((fd|0)<5){ld=5.0}else{ld=+(fd|0)}gd=hd-ld;No(K,S,Kc,dd,l,1);No(K,S,Hc,dd,m,0);fd=c[qb>>2]|0;_c=fd-1|0;ra=+h[l+56+(_c<<5)>>3];h[22617]=ra;h[22618]=+h[l+56+(_c<<5)+24>>3];h[22619]=V;h[22620]=gd;h[22621]=ra;h[22622]=gd;_c=(c[rb>>2]|0)-1|0;ra=+h[m+56+(_c<<5)+16>>3];h[22623]=ra;h[22624]=hd;h[22625]=id;h[22628]=gd;h[22626]=+h[m+56+(_c<<5)+24>>3];h[22627]=ra;if((fd|0)>0){fd=0;do{dm(S,l+56+(fd<<5)|0);fd=fd+1|0;}while((fd|0)<(c[qb>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);fd=c[rb>>2]|0;if((fd|0)>0){Hc=fd;do{Hc=Hc-1|0;dm(S,m+56+(Hc<<5)|0);}while((Hc|0)>0)}if(ma){md=il(S,n)|0}else{md=kl(S,n)|0}Hc=c[n>>2]|0;if((Hc|0)==0){break d}else{jd=md;kd=Hc}}cm(dd,c[((c[Lc>>2]&3|0)==2?dd:Tc)+28>>2]|0,jd,kd,11848);break d}if(ba){Hc=c[dd>>2]&3;Mo(c[(c[((Hc|0)==3?dd:dd+32|0)+28>>2]|0)+8>>2]|0,c[(c[((Hc|0)==2?dd:dd-32|0)+28>>2]|0)+8>>2]|0,ca,rc,Uc,2);break d}Hc=a[Jc+49|0]|0;fd=a[Jc+89|0]|0;do{if(Hc<<24>>24!=1|fd<<24>>24==4){if(!(fd<<24>>24!=1|Hc<<24>>24==4)){break}Kc=c[dd>>2]&3;Mc=c[((Kc|0)==3?dd:dd+32|0)+28>>2]|0;zc=c[((Kc|0)==2?dd:dd-32|0)+28>>2]|0;Kc=Hx(Mc|0)|0;Nc=c[Mc+8>>2]|0;Zc=c[Nc+232>>2]|0;_c=c[Kc+8>>2]|0;if((Zc|0)>0){Kc=c[_c+184>>2]|0;ed=((a[_c+113|0]&1)==0?-1:-2)+Zc|0;nd=+h[(c[(c[c[Kc+(ed*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[Kc+(ed*44|0)+16>>2]|0)- +h[Nc+24>>3]- +(c[Kc+(Zc*44|0)+20>>2]|0)}else{nd=+(c[_c+240>>2]|0)}ra=+(Uc+1|0);gd=+(c[U>>2]|0)/ra;id=nd/ra;No(K,S,Mc,dd,s,1);No(K,S,zc,dd,t,0);if((Uc|0)>0){od=0}else{break d}while(1){zc=c[ca+(od+rc<<2)>>2]|0;Mc=c[ia>>2]|0;_c=Mc-1|0;ra=+h[s+56+(_c<<5)>>3];hd=+h[s+56+(_c<<5)+16>>3];V=+h[s+56+(_c<<5)+24>>3];h[22617]=ra;h[22618]=V;od=od+1|0;pd=+(od|0);qd=gd*pd;h[22619]=qd+hd;hd=id*pd+V;h[22620]=hd;h[22621]=ra;h[22622]=hd;_c=(c[ha>>2]|0)-1|0;ra=+h[t+56+(_c<<5)+16>>3];h[22623]=ra;h[22624]=id+hd;V=+h[t+56+(_c<<5)>>3];pd=+h[t+56+(_c<<5)+24>>3];h[22627]=ra;h[22626]=pd;h[22625]=V-qd;h[22628]=hd;if((Mc|0)>0){Mc=0;do{dm(S,s+56+(Mc<<5)|0);Mc=Mc+1|0;}while((Mc|0)<(c[ia>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);Mc=c[ha>>2]|0;if((Mc|0)>0){_c=Mc;do{_c=_c-1|0;dm(S,t+56+(_c<<5)|0);}while((_c|0)>0)}if(ma){rd=il(S,r)|0}else{rd=kl(S,r)|0}_c=c[r>>2]|0;if((_c|0)==0){break d}cm(zc,c[((c[zc>>2]&3|0)==2?zc:zc-32|0)+28>>2]|0,rd,_c,11848);c[na>>2]=0;if((od|0)>=(Uc|0)){break d}}}}while(0);Hc=c[dd>>2]&3;fd=c[((Hc|0)==3?dd:dd+32|0)+28>>2]|0;Jc=c[((Hc|0)==2?dd:dd-32|0)+28>>2]|0;Hc=Hx(fd|0)|0;Tc=c[fd+8>>2]|0;Lc=c[Tc+232>>2]|0;_c=c[Hc+8>>2]|0;if((Lc|0)<(b[_c+226>>1]|0)){Hc=c[_c+184>>2]|0;Mc=Lc+1|0;sd=+h[Tc+24>>3]- +(c[Hc+(Lc*44|0)+24>>2]|0)-(+h[(c[(c[c[Hc+(Mc*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[Hc+(Mc*44|0)+28>>2]|0))}else{sd=+(c[_c+240>>2]|0)}id=+(Uc+1|0);gd=+(c[U>>2]|0)/id;hd=sd/id;Oo(K,S,fd,dd,j,1);Oo(K,S,Jc,dd,k,0);if((Uc|0)<=0){break d}if(ma){Jc=0;while(1){fd=c[ca+(Jc+rc<<2)>>2]|0;_c=c[ta>>2]|0;Mc=_c-1|0;id=+h[j+56+(Mc<<5)>>3];qd=+h[j+56+(Mc<<5)+8>>3];V=+h[j+56+(Mc<<5)+16>>3];h[22617]=id;h[22620]=qd;Jc=Jc+1|0;pd=+(Jc|0);ra=gd*pd;h[22619]=ra+V;V=qd-hd*pd;h[22618]=V;h[22621]=id;h[22624]=V;Mc=(c[qa>>2]|0)-1|0;id=+h[k+56+(Mc<<5)+16>>3];h[22623]=id;h[22622]=V-hd;pd=+h[k+56+(Mc<<5)>>3];qd=+h[k+56+(Mc<<5)+8>>3];h[22627]=id;h[22628]=qd;h[22625]=pd-ra;h[22626]=V;if((_c|0)>0){_c=0;do{dm(S,j+56+(_c<<5)|0);_c=_c+1|0;}while((_c|0)<(c[ta>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);_c=c[qa>>2]|0;if((_c|0)>0){Mc=_c;do{Mc=Mc-1|0;dm(S,k+56+(Mc<<5)|0);}while((Mc|0)>0)}Mc=il(S,g)|0;_c=c[g>>2]|0;if((_c|0)==0){break d}cm(fd,c[((c[fd>>2]&3|0)==2?fd:fd-32|0)+28>>2]|0,Mc,_c,11848);c[na>>2]=0;if((Jc|0)>=(Uc|0)){break d}}}else{Jc=0;while(1){_c=c[ca+(Jc+rc<<2)>>2]|0;Mc=c[ta>>2]|0;Hc=Mc-1|0;V=+h[j+56+(Hc<<5)>>3];ra=+h[j+56+(Hc<<5)+8>>3];pd=+h[j+56+(Hc<<5)+16>>3];h[22617]=V;h[22620]=ra;Jc=Jc+1|0;qd=+(Jc|0);id=gd*qd;h[22619]=id+pd;pd=ra-hd*qd;h[22618]=pd;h[22621]=V;h[22624]=pd;Hc=(c[qa>>2]|0)-1|0;V=+h[k+56+(Hc<<5)+16>>3];h[22623]=V;h[22622]=pd-hd;qd=+h[k+56+(Hc<<5)>>3];ra=+h[k+56+(Hc<<5)+8>>3];h[22627]=V;h[22628]=ra;h[22625]=qd-id;h[22626]=pd;if((Mc|0)>0){Mc=0;do{dm(S,j+56+(Mc<<5)|0);Mc=Mc+1|0;}while((Mc|0)<(c[ta>>2]|0))}dm(S,180936);dm(S,180968);dm(S,181e3);Mc=c[qa>>2]|0;if((Mc|0)>0){fd=Mc;do{fd=fd-1|0;dm(S,k+56+(fd<<5)|0);}while((fd|0)>0)}fd=kl(S,g)|0;Mc=c[g>>2]|0;if((Mc|0)==0){break d}cm(_c,c[((c[_c>>2]&3|0)==2?_c:_c-32|0)+28>>2]|0,fd,Mc,11848);c[na>>2]=0;if((Jc|0)>=(Uc|0)){break d}}}}}while(0);Lo(ca,rc,Uc,dd,M);break}c[Kb>>2]=Hb;c[Nb>>2]=Lb;c[Qb>>2]=Ob;if((c[44380]|0)==0){c[44380]=kk(32e3)|0;c[44378]=kk(32e3)|0;c[44384]=2e3;c[44382]=2e3}Ic=c[sc>>2]|0;Jc=Ic;Mc=Ic+32|0;fd=Hx(c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2]|0)|0;Hc=c[Jc>>2]&3;Lc=Ic-32|0;Tc=(c[(c[(c[((Hc|0)==3?Ic:Mc)+28>>2]|0)+8>>2]|0)+232>>2]|0)-(c[(c[(c[((Hc|0)==2?Ic:Lc)+28>>2]|0)+8>>2]|0)+232>>2]|0)|0;Hc=Ic+8|0;Zc=c[Hc>>2]|0;do{if((((Tc|0)>-1?Tc:-Tc|0)|0)>1){tF(vb|0,Zc|0,176)|0;Kc=Ic|0;tF(xb|0,Kc|0,32)|0;c[Kb>>2]=Hb;Nc=c[Hc>>2]|0;if((c[Nc+164>>2]&32|0)==0){tF(wb|0,Nc|0,176)|0;tF(yb|0,Kc|0,32)|0;c[Nb>>2]=Lb;c[((c[Rb>>2]&3|0)==3?Ib:Sb)+28>>2]=c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2]}else{ed=c[Nb>>2]|0;tF(ed|0,Nc|0,176)|0;tF(yb|0,Kc|0,32)|0;c[Nb>>2]=ed;c[((c[Ub>>2]&3|0)==3?Mb:Vb)+28>>2]=c[((c[Jc>>2]&3|0)==2?Ic:Lc)+28>>2];c[((c[Ub>>2]&3|0)==2?Mb:Wb)+28>>2]=c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2];ed=(c[Nb>>2]|0)+16|0;Kc=(c[Hc>>2]|0)+56|0;c[ed>>2]=c[Kc>>2];c[ed+4>>2]=c[Kc+4>>2];c[ed+8>>2]=c[Kc+8>>2];c[ed+12>>2]=c[Kc+12>>2];c[ed+16>>2]=c[Kc+16>>2];c[ed+20>>2]=c[Kc+20>>2];c[ed+24>>2]=c[Kc+24>>2];c[ed+28>>2]=c[Kc+28>>2];c[ed+32>>2]=c[Kc+32>>2];c[ed+36>>2]=c[Kc+36>>2];Kc=(c[Nb>>2]|0)+56|0;ed=(c[Hc>>2]|0)+16|0;c[Kc>>2]=c[ed>>2];c[Kc+4>>2]=c[ed+4>>2];c[Kc+8>>2]=c[ed+8>>2];c[Kc+12>>2]=c[ed+12>>2];c[Kc+16>>2]=c[ed+16>>2];c[Kc+20>>2]=c[ed+20>>2];c[Kc+24>>2]=c[ed+24>>2];c[Kc+28>>2]=c[ed+28>>2];c[Kc+32>>2]=c[ed+32>>2];c[Kc+36>>2]=c[ed+36>>2];a[(c[Nb>>2]|0)+112|0]=1;c[(c[Nb>>2]|0)+116>>2]=Ic;c[((c[Rb>>2]&3|0)==3?Ib:Sb)+28>>2]=c[((c[Jc>>2]&3|0)==2?Ic:Lc)+28>>2];ed=(c[Kb>>2]|0)+16|0;Kc=(c[Hc>>2]|0)+56|0;c[ed>>2]=c[Kc>>2];c[ed+4>>2]=c[Kc+4>>2];c[ed+8>>2]=c[Kc+8>>2];c[ed+12>>2]=c[Kc+12>>2];c[ed+16>>2]=c[Kc+16>>2];c[ed+20>>2]=c[Kc+20>>2];c[ed+24>>2]=c[Kc+24>>2];c[ed+28>>2]=c[Kc+28>>2];c[ed+32>>2]=c[Kc+32>>2];c[ed+36>>2]=c[Kc+36>>2]}Kc=c[Hc>>2]|0;ed=c[Kc+172>>2]|0;if((ed|0)==0){td=Ic;ud=Kc}else{Kc=ed;while(1){vd=c[Kc+8>>2]|0;ed=c[vd+172>>2]|0;if((ed|0)==0){break}else{Kc=ed}}td=Kc;ud=vd}ed=c[ud+116>>2]|0;if((ed|0)==0){wd=td}else{Nc=ed;while(1){ed=c[(c[Nc+8>>2]|0)+116>>2]|0;if((ed|0)==0){break}else{Nc=ed}}wd=Nc}Kc=c[(c[wd+8>>2]|0)+172>>2]|0;if((Kc|0)==0){xd=wd}else{ed=Kc;while(1){Kc=c[(c[ed+8>>2]|0)+172>>2]|0;if((Kc|0)==0){break}else{ed=Kc}}xd=ed}c[((c[Rb>>2]&3|0)==2?Ib:Tb)+28>>2]=c[((c[xd>>2]&3|0)==2?xd:xd-32|0)+28>>2];a[(c[Kb>>2]|0)+84|0]=0;a[(c[Kb>>2]|0)+112|0]=1;h[(c[Kb>>2]|0)+64>>3]=0.0;h[(c[Kb>>2]|0)+56>>3]=0.0;c[(c[Kb>>2]|0)+116>>2]=Ic;yd=Ib;zd=1}else{if((c[Zc+164>>2]&32|0)==0){yd=Ic;zd=0;break}Nc=c[Kb>>2]|0;tF(Nc|0,Zc|0,176)|0;tF(xb|0,Ic|0,32)|0;c[Kb>>2]=Nc;c[((c[Rb>>2]&3|0)==3?Ib:Sb)+28>>2]=c[((c[Jc>>2]&3|0)==2?Ic:Lc)+28>>2];c[((c[Rb>>2]&3|0)==2?Ib:Tb)+28>>2]=c[((c[Jc>>2]&3|0)==3?Ic:Mc)+28>>2];Nc=(c[Kb>>2]|0)+16|0;Kc=(c[Hc>>2]|0)+56|0;c[Nc>>2]=c[Kc>>2];c[Nc+4>>2]=c[Kc+4>>2];c[Nc+8>>2]=c[Kc+8>>2];c[Nc+12>>2]=c[Kc+12>>2];c[Nc+16>>2]=c[Kc+16>>2];c[Nc+20>>2]=c[Kc+20>>2];c[Nc+24>>2]=c[Kc+24>>2];c[Nc+28>>2]=c[Kc+28>>2];c[Nc+32>>2]=c[Kc+32>>2];c[Nc+36>>2]=c[Kc+36>>2];Kc=(c[Kb>>2]|0)+56|0;Nc=(c[Hc>>2]|0)+16|0;c[Kc>>2]=c[Nc>>2];c[Kc+4>>2]=c[Nc+4>>2];c[Kc+8>>2]=c[Nc+8>>2];c[Kc+12>>2]=c[Nc+12>>2];c[Kc+16>>2]=c[Nc+16>>2];c[Kc+20>>2]=c[Nc+20>>2];c[Kc+24>>2]=c[Nc+24>>2];c[Kc+28>>2]=c[Nc+28>>2];c[Kc+32>>2]=c[Nc+32>>2];c[Kc+36>>2]=c[Nc+36>>2];a[(c[Kb>>2]|0)+112|0]=1;c[(c[Kb>>2]|0)+116>>2]=Ic;yd=Ib;zd=0}}while(0);do{if(ba){Ic=c[44380]|0;Hc=yd+8|0;Mc=c[Hc>>2]|0;if((a[Mc+112|0]|0)==0){Ad=yd;Bd=Hc}else{Hc=Mc;do{Cd=c[Hc+116>>2]|0;Dd=Cd+8|0;Hc=c[Dd>>2]|0;}while((a[Hc+112|0]|0)!=0);Ad=Cd;Bd=Dd}Hc=Ad;ed=c[Hc>>2]|0;Mc=ed&3;Jc=c[((Mc|0)==2?Ad:Ad-32|0)+28>>2]|0;Lc=Ad+32|0;Zc=c[((Mc|0)==3?Ad:Lc)+28>>2]|0;Mc=Jc+8|0;Tc=Zc+8|0;Nc=(c[(c[Mc>>2]|0)+232>>2]|0)-(c[(c[Tc>>2]|0)+232>>2]|0)|0;Kc=(Nc|0)>-1?Nc:-Nc|0;if((Kc|0)==2){if((a[(c[(Hx(Jc|0)|0)+8>>2]|0)+113|0]&1)!=0){za=220;break}Ed=c[Hc>>2]|0}else if((Kc|0)==1){za=220;break}else{Ed=ed}if((c[((c[yd>>2]&3|0)==3?yd:yd+32|0)+28>>2]|0)==(c[((Ed&3|0)==3?Ad:Lc)+28>>2]|0)){Lc=c[Tc>>2]|0;ed=c[Bd>>2]|0;Kc=c[Mc>>2]|0;Fd=+h[Kc+16>>3]+ +h[ed+56>>3];Gd=+h[Kc+24>>3]+ +h[ed+64>>3];Hd=+h[Lc+16>>3]+ +h[ed+16>>3];Id=+h[Lc+24>>3]+ +h[ed+24>>3];Jd=ed;Kd=Jc}else{ed=c[Mc>>2]|0;Mc=c[Bd>>2]|0;Lc=c[Tc>>2]|0;Fd=+h[Lc+16>>3]+ +h[Mc+16>>3];Gd=+h[Lc+24>>3]+ +h[Mc+24>>3];Hd=+h[ed+16>>3]+ +h[Mc+56>>3];Id=+h[ed+24>>3]+ +h[Mc+64>>3];Jd=Mc;Kd=Zc}Zc=c[Jd+96>>2]|0;if((Zc|0)==0){Mc=Ic;h[Ic>>3]=Hd;h[Ic+8>>3]=Id;ed=Ic+16|0;c[ed>>2]=c[Mc>>2];c[ed+4>>2]=c[Mc+4>>2];c[ed+8>>2]=c[Mc+8>>2];c[ed+12>>2]=c[Mc+12>>2];Mc=Ic+32|0;h[Ic+32>>3]=Fd;h[Ic+40>>3]=Gd;ed=Ic+48|0;c[ed>>2]=c[Mc>>2];c[ed+4>>2]=c[Mc+4>>2];c[ed+8>>2]=c[Mc+8>>2];c[ed+12>>2]=c[Mc+12>>2];Ld=4;Md=Kd;break}hd=+h[Zc+24>>3];gd=+h[Zc+32>>3];Zc=(c[(c[(Hx(Jc|0)|0)+8>>2]|0)+116>>2]&1|0)==0;pd=Zc?gd:hd;Jc=c[(c[Bd>>2]|0)+96>>2]|0;id=+h[Jc+56>>3];qd=+h[Jc+64>>3];ra=(Zc?hd:gd)*.5;if((~~((Gd-Id)*(id-Hd)-(Fd-Hd)*(qd-Id))|0)>0){Nd=id+ra;Od=qd-pd*.5}else{Nd=id-ra;Od=qd+pd*.5}Zc=Ic;h[Ic>>3]=Hd;h[Ic+8>>3]=Id;Jc=Ic+16|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Zc=Ic+64|0;h[Ic+64>>3]=Nd;h[Ic+72>>3]=Od;Jc=Ic+48|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Jc=Ic+32|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Zc=Ic+96|0;h[Ic+96>>3]=Fd;h[Ic+104>>3]=Gd;Jc=Ic+80|0;c[Jc>>2]=c[Zc>>2];c[Jc+4>>2]=c[Zc+4>>2];c[Jc+8>>2]=c[Zc+8>>2];c[Jc+12>>2]=c[Zc+12>>2];Ld=7;Md=Kd}else{za=220}}while(0);if((za|0)==220){za=0;Zc=c[yd>>2]&3;Jc=c[((Zc|0)==3?yd:yd+32|0)+28>>2]|0;Mc=c[((Zc|0)==2?yd:yd-32|0)+28>>2]|0;Do(D,K,Jc,0,yd);c[Ab>>2]=c[Cb>>2];c[Ab+4>>2]=c[Cb+4>>2];c[Ab+8>>2]=c[Cb+8>>2];c[Ab+12>>2]=c[Cb+12>>2];c[Ab+16>>2]=c[Cb+16>>2];c[Ab+20>>2]=c[Cb+20>>2];c[Ab+24>>2]=c[Cb+24>>2];c[Ab+28>>2]=c[Cb+28>>2];pd=+h[_b>>3];qd=+h[$b>>3];Zc=Jc+8|0;ed=c[Zc>>2]|0;do{if((a[ed+156|0]|0)==1){if((c[ed+176>>2]|0)>1){Pd=1;break}Pd=(c[ed+184>>2]|0)>1|0}else{Pd=0}}while(0);em(S,yd,1,A,Pd);ra=+h[A+56+((c[ac>>2]|0)-1<<5)+8>>3];ed=c[Zc>>2]|0;id=+h[ed+24>>3];Lc=c[ed+232>>2]|0;gd=+(~~(id- +(c[(c[(c[(Hx(Jc|0)|0)+8>>2]|0)+184>>2]|0)+(Lc*44|0)+16>>2]|0))|0);if(pd<qd&gd<ra){Lc=c[ac>>2]|0;c[ac>>2]=Lc+1;h[A+56+(Lc<<5)>>3]=pd;h[A+56+(Lc<<5)+8>>3]=gd;h[A+56+(Lc<<5)+16>>3]=qd;h[A+56+(Lc<<5)+24>>3]=ra}Lc=Mc+8|0;f:do{if((a[(c[Lc>>2]|0)+156|0]|0)==1){ed=fd+8|0;Tc=Mc;Kc=0;Hc=-1;Nc=0;Qc=yd;Qd=Jc;Rd=Lc;while(1){Sd=Tc;Td=0;Ud=Hc;Vd=Nc;Wd=0;Xd=Qc;Yd=Qd;Zd=Rd;while(1){if((Ec[c[2963]&63](Sd)|0)<<24>>24!=0){_d=Sd;$d=Wd;ae=Xd;be=Yd;ce=Zd;de=Kc;ee=Qc;break f}fe=Wd|1;ge=c[(c[Yd+8>>2]|0)+232>>2]|0;he=c[$>>2]|0;ie=he+(ge<<5)|0;ra=+h[ie>>3];je=he+(ge<<5)+8|0;gd=+h[je>>3];ke=he+(ge<<5)+16|0;id=+h[ke>>3];le=he+(ge<<5)+24|0;hd=+h[le>>3];if(ra==id){he=c[(c[ed>>2]|0)+184>>2]|0;me=ge+1|0;V=+(c[_>>2]|0);ne=+h[(c[(c[c[he+(me*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[he+(me*44|0)+20>>2]|0);oe=+(c[Z>>2]|0);pe=+h[(c[(c[c[he+(ge*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[he+(ge*44|0)+16>>2]|0);h[ie>>3]=V;h[je>>3]=ne;h[ke>>3]=oe;h[le>>3]=pe;qe=pe;re=oe;se=V;te=ne}else{qe=hd;re=id;se=ra;te=gd}h[180936+(Wd<<5)>>3]=se;h[180944+(Wd<<5)>>3]=te;h[180952+(Wd<<5)>>3]=re;h[180960+(Wd<<5)>>3]=qe;if((Td|0)==0){le=c[Zd>>2]|0;ke=c[c[le+180>>2]>>2]|0;je=c[(c[((c[ke>>2]&3|0)==2?ke:ke-32|0)+28>>2]|0)+8>>2]|0;g:do{if((a[je+156|0]|0)==1){ke=le+16|0;ie=0;ge=je;while(1){he=ge+180|0;if((c[he+4>>2]|0)!=1){ue=ie;break g}if((c[ge+176>>2]|0)!=1){ue=ie;break g}me=ie+1|0;if(+h[ge+16>>3]!=+h[ke>>3]){ue=ie;break g}ve=c[c[he>>2]>>2]|0;he=c[(c[((c[ve>>2]&3|0)==2?ve:ve-32|0)+28>>2]|0)+8>>2]|0;if((a[he+156|0]|0)==1){ie=me;ge=he}else{ue=me;break}}}else{ue=0}}while(0);je=(ue|0)<(((a[(c[ed>>2]|0)+113|0]&1)!=0?5:3)|0);we=je?ue:ue-2|0;xe=je?Ud:1;ye=je&1^1}else{we=Vd;xe=Ud;ye=Td}if(!((ye|0)==0|(xe|0)>0)){break}je=Wd+2|0;Do(E,K,Sd,Xd,c[c[(c[Zd>>2]|0)+180>>2]>>2]|0);le=180936+(fe<<5)|0;c[le>>2]=c[Db>>2];c[le+4>>2]=c[Db+4>>2];c[le+8>>2]=c[Db+8>>2];c[le+12>>2]=c[Db+12>>2];c[le+16>>2]=c[Db+16>>2];c[le+20>>2]=c[Db+20>>2];c[le+24>>2]=c[Db+24>>2];c[le+28>>2]=c[Db+28>>2];le=c[c[(c[Zd>>2]|0)+180>>2]>>2]|0;zc=c[le>>2]&3;ge=c[((zc|0)==3?le:le+32|0)+28>>2]|0;ie=c[((zc|0)==2?le:le-32|0)+28>>2]|0;zc=ie+8|0;if((a[(c[zc>>2]|0)+156|0]|0)==1){Sd=ie;Td=ye;Ud=xe-1|0;Vd=we;Wd=je;Xd=le;Yd=ge;Zd=zc}else{_d=ie;$d=je;ae=le;be=ge;ce=zc;de=Kc;ee=Qc;break f}}Do(F,K,Sd,Xd,c[c[(c[Zd>>2]|0)+180>>2]>>2]|0);c[Bb>>2]=c[Eb>>2];c[Bb+4>>2]=c[Eb+4>>2];c[Bb+8>>2]=c[Eb+8>>2];c[Bb+12>>2]=c[Eb+12>>2];c[Bb+16>>2]=c[Eb+16>>2];c[Bb+20>>2]=c[Eb+20>>2];c[Bb+24>>2]=c[Eb+24>>2];c[Bb+28>>2]=c[Eb+28>>2];Yd=c[(c[((c[Xd>>2]&3|0)==2?Xd:Xd-32|0)+28>>2]|0)+8>>2]|0;do{if((a[Yd+156|0]|0)==1){if((c[Yd+176>>2]|0)>1){ze=1;break}ze=(c[Yd+184>>2]|0)>1|0}else{ze=0}}while(0);gm(S,Xd,1,B,ze);Yd=(c[bc>>2]|0)-1|0;Wd=c[Zd>>2]|0;gd=+h[Wd+24>>3];Vd=c[Wd+232>>2]|0;Wd=~~(gd+ +(c[(c[(c[(Hx(Sd|0)|0)+8>>2]|0)+184>>2]|0)+(Vd*44|0)+20>>2]|0));gd=+h[B+56+(Yd<<5)>>3];ra=+h[B+56+(Yd<<5)+16>>3];id=+h[B+56+(Yd<<5)+24>>3];hd=+(Wd|0);if(gd<ra&id<hd){Wd=c[bc>>2]|0;c[bc>>2]=Wd+1;h[B+56+(Wd<<5)>>3]=gd;h[B+56+(Wd<<5)+8>>3]=id;h[B+56+(Wd<<5)+16>>3]=ra;h[B+56+(Wd<<5)+24>>3]=hd}h[dc>>3]=1.5707963267948966;a[ec]=1;Fo(S,Qc,Xd,A,B,fe);do{if(ma){Ae=il(S,C)|0;za=251}else{Wd=kl(S,C)|0;if(!ba){Ae=Wd;za=251;break}Yd=c[C>>2]|0;if((Yd|0)<=4){Be=Wd;Ce=Yd;za=252;break}Vd=Wd+16|0;Ud=Wd;c[Vd>>2]=c[Ud>>2];c[Vd+4>>2]=c[Ud+4>>2];c[Vd+8>>2]=c[Ud+8>>2];c[Vd+12>>2]=c[Ud+12>>2];Ud=Wd+32|0;Vd=Wd+(Yd-1<<4)|0;c[Ud>>2]=c[Vd>>2];c[Ud+4>>2]=c[Vd+4>>2];c[Ud+8>>2]=c[Vd+8>>2];c[Ud+12>>2]=c[Vd+12>>2];uF(Wd+48|0,Vd|0,16)|0;c[C>>2]=4;De=4;Ee=Wd}}while(0);if((za|0)==251){za=0;Be=Ae;Ce=c[C>>2]|0;za=252}if((za|0)==252){za=0;if((Ce|0)==0){break d}else{De=Ce;Ee=Be}}Xd=De+Kc|0;if((Xd|0)>(c[44384]|0)){c[44384]=Xd<<1;Sd=mk(c[44380]|0,Xd<<5)|0;c[44380]=Sd;Fe=c[C>>2]|0;Ge=Sd}else{Fe=De;Ge=c[44380]|0}if((Fe|0)>0){Sd=(Fe|0)>1;Xd=Kc;Wd=0;while(1){Vd=Ge+(Xd<<4)|0;Ud=Ee+(Wd<<4)|0;c[Vd>>2]=c[Ud>>2];c[Vd+4>>2]=c[Ud+4>>2];c[Vd+8>>2]=c[Ud+8>>2];c[Vd+12>>2]=c[Ud+12>>2];Ud=Wd+1|0;if((Ud|0)<(Fe|0)){Xd=Xd+1|0;Wd=Ud}else{break}}He=(Sd?Fe:1)+Kc|0}else{He=Kc}Wd=c[c[(c[Zd>>2]|0)+180>>2]>>2]|0;if((we|0)==0){Ie=Wd}else{Xd=we;Ud=Wd;while(1){Wd=Xd-1|0;Vd=c[c[(c[(c[((c[Ud>>2]&3|0)==2?Ud:Ud-32|0)+28>>2]|0)+8>>2]|0)+180>>2]>>2]|0;if((Wd|0)==0){Ie=Vd;break}else{Xd=Wd;Ud=Vd}}}Ud=Ge+(He<<4)|0;Xd=Ge+(He-1<<4)|0;c[Ud>>2]=c[Xd>>2];c[Ud+4>>2]=c[Xd+4>>2];c[Ud+8>>2]=c[Xd+8>>2];c[Ud+12>>2]=c[Xd+12>>2];Ud=He+2|0;Zd=Ge+(He+1<<4)|0;c[Zd>>2]=c[Xd>>2];c[Zd+4>>2]=c[Xd+4>>2];c[Zd+8>>2]=c[Xd+8>>2];c[Zd+12>>2]=c[Xd+12>>2];Xd=Ie;Zd=Ie+32|0;Sd=Ge+(Ud<<4)|0;Vd=(c[(c[((c[Xd>>2]&3|0)==3?Ie:Zd)+28>>2]|0)+8>>2]|0)+16|0;c[Sd>>2]=c[Vd>>2];c[Sd+4>>2]=c[Vd+4>>2];c[Sd+8>>2]=c[Vd+8>>2];c[Sd+12>>2]=c[Vd+12>>2];Go(Qc,S);Vd=c[Xd>>2]&3;Xd=c[((Vd|0)==3?Ie:Zd)+28>>2]|0;Zd=c[((Vd|0)==2?Ie:Ie-32|0)+28>>2]|0;Vd=Xd+8|0;Do(G,K,Xd,c[c[(c[Vd>>2]|0)+172>>2]>>2]|0,Ie);c[Ab>>2]=c[Fb>>2];c[Ab+4>>2]=c[Fb+4>>2];c[Ab+8>>2]=c[Fb+8>>2];c[Ab+12>>2]=c[Fb+12>>2];c[Ab+16>>2]=c[Fb+16>>2];c[Ab+20>>2]=c[Fb+20>>2];c[Ab+24>>2]=c[Fb+24>>2];c[Ab+28>>2]=c[Fb+28>>2];Sd=c[Vd>>2]|0;do{if((a[Sd+156|0]|0)==1){if((c[Sd+176>>2]|0)>1){Je=1;break}Je=(c[Sd+184>>2]|0)>1|0}else{Je=0}}while(0);em(S,Ie,1,A,Je);Sd=(c[ac>>2]|0)-1|0;Wd=c[Vd>>2]|0;hd=+h[Wd+24>>3];Yd=c[Wd+232>>2]|0;Wd=~~(hd- +(c[(c[(c[(Hx(Xd|0)|0)+8>>2]|0)+184>>2]|0)+(Yd*44|0)+16>>2]|0));hd=+h[A+56+(Sd<<5)>>3];ra=+h[A+56+(Sd<<5)+8>>3];id=+h[A+56+(Sd<<5)+16>>3];gd=+(Wd|0);if(hd<id&gd<ra){Wd=c[ac>>2]|0;c[ac>>2]=Wd+1;h[A+56+(Wd<<5)>>3]=hd;h[A+56+(Wd<<5)+8>>3]=gd;h[A+56+(Wd<<5)+16>>3]=id;h[A+56+(Wd<<5)+24>>3]=ra}h[fc>>3]=-1.5707963267948966;a[gc]=1;Wd=Zd+8|0;if((a[(c[Wd>>2]|0)+156|0]|0)==1){Tc=Zd;Kc=Ud;Hc=xe;Nc=we;Qc=Ie;Qd=Xd;Rd=Wd}else{_d=Zd;$d=0;ae=Ie;be=Xd;ce=Wd;de=Ud;ee=Ie;break}}}else{_d=Mc;$d=0;ae=yd;be=Jc;ce=Lc;de=0;ee=yd}}while(0);Lc=$d+1|0;Jc=c[(c[be+8>>2]|0)+232>>2]|0;Mc=c[$>>2]|0;Zc=Mc+(Jc<<5)|0;qd=+h[Zc>>3];Rd=Mc+(Jc<<5)+8|0;pd=+h[Rd>>3];Qd=Mc+(Jc<<5)+16|0;ra=+h[Qd>>3];Qc=Mc+(Jc<<5)+24|0;id=+h[Qc>>3];if(qd==ra){Mc=c[(c[fd+8>>2]|0)+184>>2]|0;Nc=Jc+1|0;gd=+(c[_>>2]|0);hd=+h[(c[(c[c[Mc+(Nc*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[Mc+(Nc*44|0)+20>>2]|0);ne=+(c[Z>>2]|0);V=+h[(c[(c[c[Mc+(Jc*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[Mc+(Jc*44|0)+16>>2]|0);h[Zc>>3]=gd;h[Rd>>3]=hd;h[Qd>>3]=ne;h[Qc>>3]=V;Ke=V;Le=ne;Me=gd;Ne=hd}else{Ke=id;Le=ra;Me=qd;Ne=pd}h[180936+($d<<5)>>3]=Me;h[180944+($d<<5)>>3]=Ne;h[180952+($d<<5)>>3]=Le;h[180960+($d<<5)>>3]=Ke;Do(H,K,_d,ae,0);c[Bb>>2]=c[Gb>>2];c[Bb+4>>2]=c[Gb+4>>2];c[Bb+8>>2]=c[Gb+8>>2];c[Bb+12>>2]=c[Gb+12>>2];c[Bb+16>>2]=c[Gb+16>>2];c[Bb+20>>2]=c[Gb+20>>2];c[Bb+24>>2]=c[Gb+24>>2];c[Bb+28>>2]=c[Gb+28>>2];pd=+h[hc>>3];qd=+h[ic>>3];Qc=(zd|0)!=0;Qd=Qc?Mb:ae;Rd=ae;Zc=ae-32|0;Jc=c[(c[((c[Rd>>2]&3|0)==2?ae:Zc)+28>>2]|0)+8>>2]|0;do{if((a[Jc+156|0]|0)==1){if((c[Jc+176>>2]|0)>1){Oe=1;break}Oe=(c[Jc+184>>2]|0)>1|0}else{Oe=0}}while(0);gm(S,Qd,1,B,Oe);ra=+h[B+56+((c[bc>>2]|0)-1<<5)+24>>3];Jc=c[ce>>2]|0;id=+h[Jc+24>>3];fd=c[Jc+232>>2]|0;hd=+(~~(id+ +(c[(c[(c[(Hx(_d|0)|0)+8>>2]|0)+184>>2]|0)+(fd*44|0)+20>>2]|0))|0);if(pd<qd&ra<hd){fd=c[bc>>2]|0;c[bc>>2]=fd+1;h[B+56+(fd<<5)>>3]=pd;h[B+56+(fd<<5)+8>>3]=ra;h[B+56+(fd<<5)+16>>3]=qd;h[B+56+(fd<<5)+24>>3]=hd}Fo(S,ee,ae,A,B,Lc);if(ma){Pe=il(S,C)|0}else{Pe=kl(S,C)|0}fd=c[C>>2]|0;if(ba&(fd|0)>4){Jc=Pe+16|0;Mc=Pe;c[Jc>>2]=c[Mc>>2];c[Jc+4>>2]=c[Mc+4>>2];c[Jc+8>>2]=c[Mc+8>>2];c[Jc+12>>2]=c[Mc+12>>2];Mc=Pe+32|0;Jc=Pe+(fd-1<<4)|0;c[Mc>>2]=c[Jc>>2];c[Mc+4>>2]=c[Jc+4>>2];c[Mc+8>>2]=c[Jc+8>>2];c[Mc+12>>2]=c[Jc+12>>2];uF(Pe+48|0,Jc|0,16)|0;c[C>>2]=4;Qe=4}else{if((fd|0)==0){break}else{Qe=fd}}fd=Qe+de|0;if((fd|0)>(c[44384]|0)){c[44384]=fd<<1;c[44380]=mk(c[44380]|0,fd<<5)|0;Re=c[C>>2]|0}else{Re=Qe}if((Re|0)>0){fd=c[44380]|0;Jc=(Re|0)>1;Mc=de;Nc=0;while(1){Hc=fd+(Mc<<4)|0;Kc=Pe+(Nc<<4)|0;c[Hc>>2]=c[Kc>>2];c[Hc+4>>2]=c[Kc+4>>2];c[Hc+8>>2]=c[Kc+8>>2];c[Hc+12>>2]=c[Kc+12>>2];Kc=Nc+1|0;if((Kc|0)<(Re|0)){Mc=Mc+1|0;Nc=Kc}else{break}}Se=(Jc?Re:1)+de|0}else{Se=de}Go(ee,S);if(Qc){Te=(c[Ub>>2]&3|0)==2?Mb:Wb}else{Te=(c[Rd>>2]&3|0)==2?ae:Zc}Ld=Se;Md=c[Te+28>>2]|0}if((Uc|0)==1){cm(yd,Md,c[44380]|0,Ld,11848);break}Nc=Ld-1|0;Mc=(Nc|0)>1;if(Mc){qd=+((da(c[U>>2]|0,Uc-1|0)|0)/2|0|0);fd=c[44380]|0;Lc=1;do{Qd=fd+(Lc<<4)|0;h[Qd>>3]=+h[Qd>>3]-qd;Lc=Lc+1|0;}while((Lc|0)<(Nc|0))}Lc=c[44384]|0;if((Lc|0)>(c[44382]|0)){c[44382]=Lc;fd=mk(c[44378]|0,Lc<<4)|0;c[44378]=fd;Ue=fd}else{Ue=c[44378]|0}fd=(Ld|0)>0;if(fd){Lc=c[44380]|0;Zc=0;do{Rd=Ue+(Zc<<4)|0;Qc=Lc+(Zc<<4)|0;c[Rd>>2]=c[Qc>>2];c[Rd+4>>2]=c[Qc+4>>2];c[Rd+8>>2]=c[Qc+8>>2];c[Rd+12>>2]=c[Qc+12>>2];Zc=Zc+1|0;}while((Zc|0)<(Ld|0))}cm(yd,Md,Ue,Ld,11848);if((Uc|0)>1){Ve=1}else{break}do{Zc=c[ca+(Ve+rc<<2)>>2]|0;Lc=Zc+8|0;Qc=c[Lc>>2]|0;if((c[Qc+164>>2]&32|0)==0){We=Zc}else{Rd=c[Qb>>2]|0;tF(Rd|0,Qc|0,176)|0;tF(zb|0,Zc|0,32)|0;c[Qb>>2]=Rd;Rd=Zc;c[((c[Xb>>2]&3|0)==3?Pb:Yb)+28>>2]=c[((c[Rd>>2]&3|0)==2?Zc:Zc-32|0)+28>>2];c[((c[Xb>>2]&3|0)==2?Pb:Zb)+28>>2]=c[((c[Rd>>2]&3|0)==3?Zc:Zc+32|0)+28>>2];Rd=(c[Qb>>2]|0)+16|0;Qc=(c[Lc>>2]|0)+56|0;c[Rd>>2]=c[Qc>>2];c[Rd+4>>2]=c[Qc+4>>2];c[Rd+8>>2]=c[Qc+8>>2];c[Rd+12>>2]=c[Qc+12>>2];c[Rd+16>>2]=c[Qc+16>>2];c[Rd+20>>2]=c[Qc+20>>2];c[Rd+24>>2]=c[Qc+24>>2];c[Rd+28>>2]=c[Qc+28>>2];c[Rd+32>>2]=c[Qc+32>>2];c[Rd+36>>2]=c[Qc+36>>2];Qc=(c[Qb>>2]|0)+56|0;Rd=(c[Lc>>2]|0)+16|0;c[Qc>>2]=c[Rd>>2];c[Qc+4>>2]=c[Rd+4>>2];c[Qc+8>>2]=c[Rd+8>>2];c[Qc+12>>2]=c[Rd+12>>2];c[Qc+16>>2]=c[Rd+16>>2];c[Qc+20>>2]=c[Rd+20>>2];c[Qc+24>>2]=c[Rd+24>>2];c[Qc+28>>2]=c[Rd+28>>2];c[Qc+32>>2]=c[Rd+32>>2];c[Qc+36>>2]=c[Rd+36>>2];a[(c[Qb>>2]|0)+112|0]=1;c[(c[Qb>>2]|0)+116>>2]=Zc;We=Pb}if(Mc){Zc=c[44380]|0;qd=+(c[U>>2]|0);Rd=1;do{Qc=Zc+(Rd<<4)|0;h[Qc>>3]=qd+ +h[Qc>>3];Rd=Rd+1|0;}while((Rd|0)<(Nc|0))}Rd=c[44378]|0;if(fd){Zc=c[44380]|0;Qc=0;do{Lc=Rd+(Qc<<4)|0;Jc=Zc+(Qc<<4)|0;c[Lc>>2]=c[Jc>>2];c[Lc+4>>2]=c[Jc+4>>2];c[Lc+8>>2]=c[Jc+8>>2];c[Lc+12>>2]=c[Jc+12>>2];Qc=Qc+1|0;}while((Qc|0)<(Ld|0))}cm(We,c[((c[We>>2]&3|0)==2?We:We-32|0)+28>>2]|0,Rd,Ld,11848);Ve=Ve+1|0;}while((Ve|0)<(Uc|0))}}while(0);if((Vc|0)<(ea|0)){rc=Vc}else{break}}}rc=c[(c[L>>2]|0)+180>>2]|0;if((rc|0)!=0){U=rc;do{rc=U+8|0;Pb=c[rc>>2]|0;do{if((a[Pb+156|0]|0)==1){Qb=c[Pb+104>>2]|0;if((Qb|0)==0){Xe=Pb;break}if((c[Pb+176>>2]|0)==0){Ye=Qb}else{Qb=(c[c[Pb+180>>2]>>2]|0)+8|0;Zb=c[Qb>>2]|0;if((a[Zb+112|0]|0)==0){Ze=Qb;_e=Zb}else{Qb=Zb;while(1){Zb=(c[Qb+116>>2]|0)+8|0;Xb=c[Zb>>2]|0;if((a[Xb+112|0]|0)==0){Ze=Zb;_e=Xb;break}else{Qb=Xb}}}Qb=c[_e+96>>2]|0;qd=+h[Qb+24>>3];pd=+h[Qb+32>>3];Qb=(c[(c[(Hx(U)|0)+8>>2]|0)+116>>2]&1|0)==0;h[(c[(c[Ze>>2]|0)+96>>2]|0)+56>>3]=+h[(c[rc>>2]|0)+16>>3]+(Qb?qd:pd)*.5;h[(c[(c[Ze>>2]|0)+96>>2]|0)+64>>3]=+h[(c[rc>>2]|0)+24>>3];a[(c[(c[Ze>>2]|0)+96>>2]|0)+81|0]=1;Ye=c[(c[rc>>2]|0)+104>>2]|0}_m(d,Ye);Xe=c[rc>>2]|0}else{Xe=Pb}}while(0);U=c[Xe+164>>2]|0;}while((U|0)!=0)}if((e|0)==0){W=S;X=ca;break}U=ux(d)|0;if((U|0)==0){W=S;X=ca;break}else{$e=U}while(1){U=mw(d,$e)|0;if((U|0)!=0){Pb=U;do{do{if((Ec[c[2962]&63](Pb)|0)<<24>>24!=0){U=c[(c[Pb+8>>2]|0)+8>>2]|0;if((U|0)==0){break}rc=c[U+4>>2]|0;Qb=kk(rc*48|0)|0;Xb=U|0;if((rc|0)>0){U=(c[Xb>>2]|0)+((rc-1|0)*48|0)|0;Zb=0;Yb=Qb;while(1){zb=U-48|0;Wb=Yb+48|0;Mb=c[U+4>>2]|0;Ub=kk(Mb<<4)|0;if((Mb|0)>0){ba=(c[U>>2]|0)+(Mb-1<<4)|0;ma=0;bc=Ub;while(1){ic=bc;hc=ba;c[ic>>2]=c[hc>>2];c[ic+4>>2]=c[hc+4>>2];c[ic+8>>2]=c[hc+8>>2];c[ic+12>>2]=c[hc+12>>2];hc=ma+1|0;if((hc|0)<(Mb|0)){ba=ba-16|0;ma=hc;bc=bc+16|0}else{break}}}c[Yb>>2]=Ub;c[Yb+4>>2]=Mb;c[Yb+8>>2]=c[U+12>>2];c[Yb+12>>2]=c[U+8>>2];bc=Yb+16|0;ma=U+32|0;c[bc>>2]=c[ma>>2];c[bc+4>>2]=c[ma+4>>2];c[bc+8>>2]=c[ma+8>>2];c[bc+12>>2]=c[ma+12>>2];ma=Yb+32|0;bc=U+16|0;c[ma>>2]=c[bc>>2];c[ma+4>>2]=c[bc+4>>2];c[ma+8>>2]=c[bc+8>>2];c[ma+12>>2]=c[bc+12>>2];bc=Zb+1|0;if((bc|0)<(rc|0)){U=zb;Zb=bc;Yb=Wb}else{break}}Yb=0;Zb=c[Xb>>2]|0;while(1){eF(c[Zb+(Yb*48|0)>>2]|0);U=Yb+1|0;Rd=c[Xb>>2]|0;if((U|0)<(rc|0)){Yb=U;Zb=Rd}else{af=Rd;break}}}else{af=c[Xb>>2]|0}eF(af);c[Xb>>2]=Qb}}while(0);Pb=ow(d,Pb)|0;}while((Pb|0)!=0)}Pb=vx(d,$e)|0;if((Pb|0)==0){W=S;X=ca;break}else{$e=Pb}}}}while(0);do{if((c[53792]|0)!=0|(c[53756]|0)!=0){if(!((c[53786]|0)!=0|(c[53784]|0)!=0)){break}$e=ux(d)|0;if(($e|0)==0){break}else{bf=$e}do{do{if((c[53792]|0)!=0){$e=pw(d,bf)|0;if(($e|0)==0){break}else{cf=$e}do{$e=cf;ca=cf-32|0;af=(c[$e>>2]&3|0)==2?cf:ca;if((c[(c[af+8>>2]|0)+100>>2]|0)!=0){lm(af,1)|0;_m(d,c[(c[((c[$e>>2]&3|0)==2?cf:ca)+8>>2]|0)+100>>2]|0)}cf=qw(d,cf)|0;}while((cf|0)!=0)}}while(0);do{if((c[53756]|0)!=0){ca=mw(d,bf)|0;if((ca|0)==0){break}else{df=ca}do{ca=df+8|0;do{if((c[(c[ca>>2]|0)+104>>2]|0)!=0){if((lm(df,0)|0)==0){break}_m(d,c[(c[ca>>2]|0)+104>>2]|0)}}while(0);df=ow(d,df)|0;}while((df|0)!=0)}}while(0);bf=vx(d,bf)|0;}while((bf|0)!=0)}}while(0);if((M|0)!=4){eF(X);eF(c[W+84>>2]|0);eF(W);eF(c[K+16>>2]|0);hl()}c[53522]=1;c[53746]=1;i=f;return}function Co(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;e=i;i=i+480|0;f=e|0;g=e+176|0;j=e+352|0;k=e+416|0;l=f|0;m=j|0;n=j+8|0;c[n>>2]=l;o=g|0;p=k|0;q=k+8|0;c[q>>2]=o;r=c[b>>2]|0;b=c[d>>2]|0;d=r+8|0;s=c[d>>2]|0;t=c[s+164>>2]|0;u=t&15;v=b+8|0;w=c[v>>2]|0;x=c[w+164>>2]&15;if((u|0)!=(x|0)){y=x-u|0;i=e;return y|0}u=c[s+172>>2]|0;if((u|0)==0){z=r;A=s}else{x=u;while(1){B=c[x+8>>2]|0;u=c[B+172>>2]|0;if((u|0)==0){break}else{x=u}}z=x;A=B}B=c[A+116>>2]|0;if((B|0)==0){C=z}else{z=B;while(1){B=c[(c[z+8>>2]|0)+116>>2]|0;if((B|0)==0){break}else{z=B}}C=z}z=c[w+172>>2]|0;if((z|0)==0){D=b;E=w}else{B=z;while(1){F=c[B+8>>2]|0;z=c[F+172>>2]|0;if((z|0)==0){break}else{B=z}}D=B;E=F}F=c[E+116>>2]|0;if((F|0)==0){G=D}else{D=F;while(1){F=c[(c[D+8>>2]|0)+116>>2]|0;if((F|0)==0){break}else{D=F}}G=D}D=c[C>>2]|0;F=D&3;E=c[(c[((F|0)==3?C:C+32|0)+28>>2]|0)+8>>2]|0;B=c[(c[((F|0)==2?C:C-32|0)+28>>2]|0)+8>>2]|0;F=(c[E+232>>2]|0)-(c[B+232>>2]|0)|0;z=c[G>>2]|0;A=z&3;x=c[(c[((A|0)==3?G:G+32|0)+28>>2]|0)+8>>2]|0;u=c[(c[((A|0)==2?G:G-32|0)+28>>2]|0)+8>>2]|0;A=(c[x+232>>2]|0)-(c[u+232>>2]|0)|0;H=(F|0)>-1?F:-F|0;F=(A|0)>-1?A:-A|0;if((H|0)!=(F|0)){y=H-F|0;i=e;return y|0}F=~~(+h[E+16>>3]- +h[B+16>>3]);B=(F|0)>-1?F:-F|0;F=~~(+h[x+16>>3]- +h[u+16>>3]);u=(F|0)>-1?F:-F|0;if((B|0)!=(u|0)){y=B-u|0;i=e;return y|0}u=D>>>4;D=z>>>4;if((u|0)!=(D|0)){y=u-D|0;i=e;return y|0}if((a[s+44|0]|0)==0){D=(a[s+84|0]|0)==0?C:r;C=c[D+8>>2]|0;I=D;J=C;K=c[C+164>>2]|0}else{I=r;J=s;K=t}t=I+8|0;if((K&32|0)==0){L=I;M=w}else{tF(f|0,J|0,176)|0;tF(j|0,I|0,32)|0;c[n>>2]=l;l=I;J=j;c[((c[J>>2]&3|0)==3?m:m+32|0)+28>>2]=c[((c[l>>2]&3|0)==2?I:I-32|0)+28>>2];c[((c[J>>2]&3|0)==2?m:m-32|0)+28>>2]=c[((c[l>>2]&3|0)==3?I:I+32|0)+28>>2];l=c[n>>2]|0;n=l+16|0;J=(c[t>>2]|0)+56|0;c[n>>2]=c[J>>2];c[n+4>>2]=c[J+4>>2];c[n+8>>2]=c[J+8>>2];c[n+12>>2]=c[J+12>>2];c[n+16>>2]=c[J+16>>2];c[n+20>>2]=c[J+20>>2];c[n+24>>2]=c[J+24>>2];c[n+28>>2]=c[J+28>>2];c[n+32>>2]=c[J+32>>2];c[n+36>>2]=c[J+36>>2];J=l+56|0;n=(c[t>>2]|0)+16|0;c[J>>2]=c[n>>2];c[J+4>>2]=c[n+4>>2];c[J+8>>2]=c[n+8>>2];c[J+12>>2]=c[n+12>>2];c[J+16>>2]=c[n+16>>2];c[J+20>>2]=c[n+20>>2];c[J+24>>2]=c[n+24>>2];c[J+28>>2]=c[n+28>>2];c[J+32>>2]=c[n+32>>2];c[J+36>>2]=c[n+36>>2];a[l+112|0]=1;c[l+116>>2]=I;L=m;M=c[v>>2]|0}if((a[M+44|0]|0)==0){m=(a[M+84|0]|0)==0?G:b;N=m;O=c[m+8>>2]|0}else{N=b;O=M}M=N+8|0;if((c[O+164>>2]&32|0)==0){P=O}else{tF(g|0,O|0,176)|0;tF(k|0,N|0,32)|0;c[q>>2]=o;o=N;O=k;c[((c[O>>2]&3|0)==3?p:p+32|0)+28>>2]=c[((c[o>>2]&3|0)==2?N:N-32|0)+28>>2];c[((c[O>>2]&3|0)==2?p:p-32|0)+28>>2]=c[((c[o>>2]&3|0)==3?N:N+32|0)+28>>2];o=c[q>>2]|0;q=o+16|0;p=(c[M>>2]|0)+56|0;c[q>>2]=c[p>>2];c[q+4>>2]=c[p+4>>2];c[q+8>>2]=c[p+8>>2];c[q+12>>2]=c[p+12>>2];c[q+16>>2]=c[p+16>>2];c[q+20>>2]=c[p+20>>2];c[q+24>>2]=c[p+24>>2];c[q+28>>2]=c[p+28>>2];c[q+32>>2]=c[p+32>>2];c[q+36>>2]=c[p+36>>2];p=o+56|0;q=(c[M>>2]|0)+16|0;c[p>>2]=c[q>>2];c[p+4>>2]=c[q+4>>2];c[p+8>>2]=c[q+8>>2];c[p+12>>2]=c[q+12>>2];c[p+16>>2]=c[q+16>>2];c[p+20>>2]=c[q+20>>2];c[p+24>>2]=c[q+24>>2];c[p+28>>2]=c[q+28>>2];c[p+32>>2]=c[q+32>>2];c[p+36>>2]=c[q+36>>2];a[o+112|0]=1;c[o+116>>2]=N;P=o}o=c[L+8>>2]|0;L=o+16|0;N=P+16|0;q=a[o+44|0]|0;do{if((a[P+44|0]|0)==0){Q=q<<24>>24!=0|0}else{if(q<<24>>24==0){y=-1;i=e;return y|0}p=~~(+h[L>>3]- +h[N>>3]);if((p|0)==0){Q=~~(+h[o+24>>3]- +h[P+24>>3]);break}else{y=p;i=e;return y|0}}}while(0);if((Q|0)!=0){y=Q;i=e;return y|0}Q=o+56|0;N=P+56|0;L=a[o+84|0]|0;do{if((a[P+84|0]|0)==0){R=L<<24>>24!=0|0}else{if(L<<24>>24==0){y=-1;i=e;return y|0}q=~~(+h[Q>>3]- +h[N>>3]);if((q|0)==0){R=~~(+h[o+64>>3]- +h[P+64>>3]);break}else{y=q;i=e;return y|0}}}while(0);if((R|0)!=0){y=R;i=e;return y|0}R=c[(c[d>>2]|0)+164>>2]&192;d=c[(c[v>>2]|0)+164>>2]&192;if((R|0)==(d|0)){y=((c[r>>2]|0)>>>4)-((c[b>>2]|0)>>>4)|0;i=e;return y|0}else{y=R-d|0;i=e;return y|0}return 0}function Do(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0,q=0.0,r=0.0,s=0.0,t=0.0,u=0,v=0.0,w=0.0,x=0,y=0.0,z=0.0,A=0.0,B=0.0;i=Hx(e|0)|0;j=e+8|0;k=c[j>>2]|0;l=+h[k+16>>3]- +h[k+88>>3]+-4.0;k=Jo(e,f,g,-1)|0;do{if((k|0)==0){m=l>=0.0;if(m){n=l+.5}else{n=l+-.5}o=c[d>>2]|0;if((~~n|0)>=(o|0)){p=o;break}if(m){q=l+.5}else{q=l+-.5}p=~~q}else{m=Ko(c[j>>2]|0,k)|0;do{if((m|0)==0){o=c[k+8>>2]|0;r=+h[o+16>>3]+ +(c[o+240>>2]|0);if((a[o+156|0]|0)==0){s=r+ +(c[(c[i+8>>2]|0)+236>>2]|0)*.5;break}else{s=r+ +(c[d+8>>2]|0);break}}else{s=+h[(c[m+8>>2]|0)+32>>3]+ +(c[d+8>>2]|0)}}while(0);r=s<l?s:l;if(r<0.0){t=r+-.5}else{t=r+.5}p=~~t}}while(0);t=+(p|0);p=c[j>>2]|0;do{if((a[p+156|0]|0)==1){if((c[p+104>>2]|0)==0){u=22;break}v=+h[p+16>>3]+10.0}else{u=22}}while(0);if((u|0)==22){v=+h[p+16>>3]+ +h[p+96>>3]+4.0}p=Jo(e,f,g,1)|0;do{if((p|0)==0){g=v>=0.0;if(g){w=v+.5}else{w=v+-.5}f=c[d+4>>2]|0;if((~~w|0)<=(f|0)){x=f;break}if(g){y=v+.5}else{y=v+-.5}x=~~y}else{g=Ko(c[j>>2]|0,p)|0;do{if((g|0)==0){f=c[p+8>>2]|0;l=+h[f+16>>3]- +h[f+88>>3];if((a[f+156|0]|0)==0){z=l- +(c[(c[i+8>>2]|0)+236>>2]|0)*.5;break}else{z=l- +(c[d+8>>2]|0);break}}else{z=+h[(c[g+8>>2]|0)+16>>3]- +(c[d+8>>2]|0)}}while(0);l=z>v?z:v;if(l<0.0){A=l+-.5}else{A=l+.5}x=~~A}}while(0);A=+(x|0);x=c[j>>2]|0;do{if((a[x+156|0]|0)==1){if((c[x+104>>2]|0)==0){B=A;break}v=A- +h[x+96>>3];if(v>=t){B=v;break}B=+h[x+16>>3]}else{B=A}}while(0);A=+h[x+24>>3];j=c[x+232>>2]|0;x=c[(c[i+8>>2]|0)+184>>2]|0;v=A- +(c[x+(j*44|0)+16>>2]|0);z=A+ +(c[x+(j*44|0)+20>>2]|0);h[b>>3]=t;h[b+8>>3]=v;h[b+16>>3]=B;h[b+24>>3]=z;return}function Eo(b){b=b|0;var d=0,e=0;d=c[b+8>>2]|0;if((a[d+156|0]|0)!=1){e=0;return e|0}if((c[d+176>>2]|0)>1){e=1;return e|0}e=(c[d+184>>2]|0)>1|0;return e|0}function Fo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var i=0,j=0,k=0,l=0.0,m=0,n=0.0,o=0,p=0;i=Ho(b,-1)|0;j=Ho(b,1)|0;do{if((i|0)!=0){if((om(i)|0)!=0){break}return}}while(0);do{if((j|0)!=0){if((om(j)|0)!=0){break}return}}while(0);j=Io(d,-1)|0;i=Io(d,1)|0;do{if((j|0)!=0){if((om(j)|0)!=0){break}return}}while(0);do{if((i|0)!=0){if((om(i)|0)!=0){break}return}}while(0);i=e+52|0;if((c[i>>2]|0)>0){j=0;do{dm(a,e+56+(j<<5)|0);j=j+1|0;}while((j|0)<(c[i>>2]|0))}i=a+80|0;j=c[i>>2]|0;e=j+1|0;d=e+g|0;b=d-3|0;if((g|0)>0){k=0;do{dm(a,180936+(k<<5)|0);k=k+1|0;}while((k|0)<(g|0))}g=c[f+52>>2]|0;if((g|0)>0){k=g;do{k=k-1|0;dm(a,f+56+(k<<5)|0);}while((k|0)>0)}k=d-2|0;if((k|0)>=(e|0)){d=a+84|0;f=j;do{j=c[d>>2]|0;g=j+(f<<5)|0;l=+h[g>>3];do{if((f-e&1|0)==0){m=j+(f<<5)+16|0;n=+h[m>>3];if(l<n){break}o=~~((l+n)*.5);h[g>>3]=+(o-8|0);h[m>>3]=+(o+8|0)}else{o=j+(f<<5)+16|0;n=+h[o>>3];if(l+16.0<=n){break}m=~~((l+n)*.5);h[g>>3]=+(m-8|0);h[o>>3]=+(m+8|0)}}while(0);f=f+1|0;}while((f|0)<(k|0))}if(((c[i>>2]|0)-1|0)<=0){return}k=a+84|0;a=0;while(1){f=c[k>>2]|0;d=f+(a<<5)|0;g=a+1|0;j=f+(g<<5)|0;do{if((a|0)<(e|0)|(a|0)>(b|0)){p=31}else{if((a-e&1|0)!=0){p=31;break}l=+h[d>>3]+16.0;m=f+(g<<5)+16|0;if(l>+h[m>>3]){h[m>>3]=l}l=+h[f+(a<<5)+16>>3]+-16.0;m=j|0;if(l>=+h[m>>3]){break}h[m>>3]=l}}while(0);do{if((p|0)==31){p=0;if(!((g|0)>=(e|0)&(a|0)<(b|0))){break}if((g-e&1|0)!=0){break}m=d|0;l=+h[f+(g<<5)+16>>3];if(+h[m>>3]+16.0>l){h[m>>3]=l+-16.0}m=f+(a<<5)+16|0;l=+h[j>>3];if(+h[m>>3]+-16.0>=l){break}h[m>>3]=l+16.0}}while(0);if((g|0)<((c[i>>2]|0)-1|0)){a=g}else{break}}return}function Go(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0.0,q=0,r=0;e=c[((c[b>>2]&3|0)==2?b:b-32|0)+28>>2]|0;b=e+8|0;if((a[(c[b>>2]|0)+156|0]|0)!=1){return}f=d+84|0;g=d+80|0;d=0;i=e;e=b;while(1){if((Ec[c[2963]&63](i)|0)<<24>>24!=0){j=14;break}b=c[g>>2]|0;a:do{if((d|0)<(b|0)){k=c[f>>2]|0;l=+h[(c[e>>2]|0)+24>>3];m=d;while(1){n=m+1|0;if(+h[k+(m<<5)+8>>3]<=l){o=m;break a}if((n|0)<(b|0)){m=n}else{o=n;break}}}else{o=d}}while(0);if((o|0)>=(b|0)){j=14;break}m=c[f>>2]|0;k=c[e>>2]|0;do{if(+h[m+(o<<5)+24>>3]>=+h[k+24>>3]){l=+h[m+(o<<5)>>3];n=~~l;p=+h[m+(o<<5)+16>>3];if((c[k+104>>2]|0)==0){q=~~((l+p)*.5);h[k+16>>3]=+(q|0);h[(c[e>>2]|0)+88>>3]=+(q-n|0);h[(c[e>>2]|0)+96>>3]=+(~~p-q|0);break}else{q=~~p;r=~~(p+ +h[k+96>>3]);h[k+16>>3]=+(q|0);h[(c[e>>2]|0)+88>>3]=+(q-n|0);h[(c[e>>2]|0)+96>>3]=+(r-q|0);break}}}while(0);k=c[c[(c[e>>2]|0)+180>>2]>>2]|0;m=c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0;k=m+8|0;if((a[(c[k>>2]|0)+156|0]|0)==1){d=o;i=m;e=k}else{j=14;break}}if((j|0)==14){return}}function Ho(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c[a>>2]&3;e=c[(c[(c[((d|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+180>>2]|0;f=c[e>>2]|0;if((f|0)==0){g=0;return g|0}h=a-32|0;i=0;j=0;k=f;while(1){f=c[(c[(c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((da(f-(c[(c[(c[((d|0)==2?a:h)+28>>2]|0)+8>>2]|0)+236>>2]|0)|0,b)|0)<1){l=i}else{m=c[k+8>>2]|0;if((c[m+8>>2]|0)==0){n=c[m+116>>2]|0;if((n|0)==0){l=i;break}if((c[(c[n+8>>2]|0)+8>>2]|0)==0){l=i;break}}if((i|0)!=0){if((da((c[(c[(c[((c[i>>2]&3|0)==2?i:i-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-f|0,b)|0)<=0){l=i;break}}l=k}}while(0);f=j+1|0;n=c[e+(f<<2)>>2]|0;if((n|0)==0){g=l;break}else{i=l;j=f;k=n}}return g|0}function Io(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=c[a>>2]&3;e=c[(c[(c[((d|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+172>>2]|0;f=c[e>>2]|0;if((f|0)==0){g=0;return g|0}h=a+32|0;i=0;j=0;k=f;while(1){f=c[(c[(c[((c[k>>2]&3|0)==3?k:k+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((da(f-(c[(c[(c[((d|0)==3?a:h)+28>>2]|0)+8>>2]|0)+236>>2]|0)|0,b)|0)<1){l=i}else{m=c[k+8>>2]|0;if((c[m+8>>2]|0)==0){n=c[m+116>>2]|0;if((n|0)==0){l=i;break}if((c[(c[n+8>>2]|0)+8>>2]|0)==0){l=i;break}}if((i|0)!=0){if((da((c[(c[(c[((c[i>>2]&3|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-f|0,b)|0)<=0){l=i;break}}l=k}}while(0);f=j+1|0;n=c[e+(f<<2)>>2]|0;if((n|0)==0){g=l;break}else{i=l;j=f;k=n}}return g|0}function Jo(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;g=b+8|0;h=c[(c[g>>2]|0)+232>>2]|0;i=c[(c[(Hx(b|0)|0)+8>>2]|0)+184>>2]|0;b=c[(c[g>>2]|0)+236>>2]|0;g=b+f|0;if((g|0)<=-1){j=0;return j|0}k=c[i+(h*44|0)>>2]|0;l=i+(h*44|0)+4|0;h=(e|0)==0;i=(d|0)==0;m=g;a:while(1){if((m|0)>=(k|0)){j=0;n=26;break}g=c[(c[l>>2]|0)+(m<<2)>>2]|0;o=c[g+8>>2]|0;p=a[o+156|0]|0;if((p<<24>>24|0)==0){j=g;n=26;break}else if((p<<24>>24|0)==1){if((c[o+104>>2]|0)!=0){j=g;n=26;break}}p=(c[o+236>>2]|0)>(b|0);q=o+180|0;if((c[q+4>>2]|0)!=1){j=g;n=26;break}b:do{if(h){n=17}else{r=c[c[q>>2]>>2]|0;s=e;t=0;while(1){u=c[((c[r>>2]&3|0)==2?r:r-32|0)+28>>2]|0;v=c[((c[s>>2]&3|0)==2?s:s-32|0)+28>>2]|0;if((u|0)==(v|0)){n=17;break b}w=c[u+8>>2]|0;u=c[v+8>>2]|0;if(p^(c[w+236>>2]|0)>(c[u+236>>2]|0)){break b}v=w+180|0;if((c[v+4>>2]|0)!=1){n=17;break b}if((a[w+156|0]|0)==0){n=17;break b}w=u+180|0;if((c[w+4>>2]|0)!=1){n=17;break b}if((a[u+156|0]|0)==0){n=17;break b}u=t+1|0;if((u|0)<2){r=c[c[v>>2]>>2]|0;s=c[c[w>>2]>>2]|0;t=u}else{n=17;break}}}}while(0);c:do{if((n|0)==17){n=0;q=o+172|0;if((c[q+4>>2]|0)!=1|i){j=g;n=26;break a}t=c[c[q>>2]>>2]|0;q=d;s=0;while(1){r=c[((c[t>>2]&3|0)==3?t:t+32|0)+28>>2]|0;u=c[((c[q>>2]&3|0)==3?q:q+32|0)+28>>2]|0;if((r|0)==(u|0)){j=g;n=26;break a}w=c[r+8>>2]|0;r=c[u+8>>2]|0;if(p^(c[w+236>>2]|0)>(c[r+236>>2]|0)){break c}u=w+172|0;if((c[u+4>>2]|0)!=1){j=g;n=26;break a}if((a[w+156|0]|0)==0){j=g;n=26;break a}w=r+172|0;if((c[w+4>>2]|0)!=1){j=g;n=26;break a}if((a[r+156|0]|0)==0){j=g;n=26;break a}r=s+1|0;if((r|0)<2){t=c[c[u>>2]>>2]|0;q=c[c[w>>2]>>2]|0;s=r}else{j=g;n=26;break a}}}}while(0);g=m+f|0;if((g|0)>-1){m=g}else{j=0;n=26;break}}if((n|0)==26){return j|0}return 0}function Ko(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0;if((a[b+156|0]|0)==0){e=c[b+212>>2]|0;f=e;g=e}else{e=c[(c[(c[c[b+180>>2]>>2]|0)+8>>2]|0)+116>>2]|0;b=e;i=c[e>>2]&3;f=c[(c[(c[((i|0)==2?b:e-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0;g=c[(c[(c[((i|0)==3?b:e+32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0}e=d+8|0;b=c[e>>2]|0;if((a[b+156|0]|0)==0){i=c[b+212>>2]|0;if((i|0)==(Hx(d|0)|0)){j=0;k=(j|0)==0;l=(j|0)==(g|0);m=k|l;n=(j|0)==(f|0);o=m|n;p=o?0:j;return p|0}j=c[(c[e>>2]|0)+212>>2]|0;k=(j|0)==0;l=(j|0)==(g|0);m=k|l;n=(j|0)==(f|0);o=m|n;p=o?0:j;return p|0}p=c[(c[(c[c[b+180>>2]>>2]|0)+8>>2]|0)+116>>2]|0;b=p;j=p;o=p+32|0;n=c[((c[j>>2]&3|0)==3?b:o)+28>>2]|0;m=c[(c[n+8>>2]|0)+212>>2]|0;l=(m|0)==(Hx(n|0)|0);n=c[j>>2]|0;do{if(!l){m=c[(c[(c[((n&3|0)==3?b:o)+28>>2]|0)+8>>2]|0)+212>>2]|0;k=m;if((m|0)==0|(k|0)==(g|0)|(k|0)==(f|0)){break}d=c[m+8>>2]|0;m=c[e>>2]|0;q=+h[m+16>>3];if(+h[d+16>>3]>q){break}if(q>+h[d+32>>3]){break}q=+h[m+24>>3];if(+h[d+24>>3]>q){break}if(q>+h[d+40>>3]){break}else{r=k}return r|0}}while(0);o=p-32|0;p=c[((n&3|0)==2?b:o)+28>>2]|0;n=c[(c[p+8>>2]|0)+212>>2]|0;if((n|0)==(Hx(p|0)|0)){r=0;return r|0}p=c[(c[(c[((c[j>>2]&3|0)==2?b:o)+28>>2]|0)+8>>2]|0)+212>>2]|0;o=p;if((p|0)==0|(o|0)==(g|0)|(o|0)==(f|0)){r=0;return r|0}f=c[p+8>>2]|0;p=c[e>>2]|0;q=+h[p+16>>3];if(+h[f+16>>3]>q){r=0;return r|0}if(q>+h[f+32>>3]){r=0;return r|0}q=+h[p+24>>3];if(+h[f+24>>3]>q){r=0;return r|0}r=q>+h[f+40>>3]?0:o;return r|0}
+
+
+
+function ww(b,e){b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;f=i;i=i+72|0;g=f|0;h=f+40|0;j=(c[e>>2]&3|0)==2?e:e-32|0;e=j|0;k=c[j>>2]&3;l=c[((k|0)==3?j:j+32|0)+28>>2]|0;m=c[((k|0)==2?j:j-32|0)+28>>2]|0;k=j;n=k|0;o=k+4|0;k=d[o]|d[o+1|0]<<8|d[o+2|0]<<16|d[o+3|0]<<24|0;o=h|0;if((l|0)==0|(m|0)==0){p=-1;i=f;return p|0}q=h;c[q>>2]=d[n]|d[n+1|0]<<8|d[n+2|0]<<16|d[n+3|0]<<24;c[q+4>>2]=k;c[h+28>>2]=l;do{if((c[m+12>>2]|0)==(b|0)){r=m+16|0}else{c[g+16>>2]=m;l=c[b+28>>2]|0;h=Hc[c[l>>2]&63](l,g,4)|0;if((h|0)==0){p=-1}else{r=h;break}i=f;return p|0}}while(0);g=b+36|0;m=r+20|0;ah(c[g>>2]|0,c[m>>2]|0)|0;r=c[g>>2]|0;h=Hc[c[r>>2]&63](r,o,4)|0;c[m>>2]=Yg(c[g>>2]|0)|0;if((h|0)==0){p=-1;i=f;return p|0}h=b|0;if((Ix(h)|0)==(b|0)){if((a[b+12|0]&64)!=0){dw(j)}Nx(b,j|0);ay(e);_w(b,2,c[j+4>>2]|0)}if((Ov(b,e,36,0,0)|0)!=0){p=-1;i=f;return p|0}if((Ix(h)|0)!=(b|0)){p=0;i=f;return p|0}tx(b,j|0);p=0;i=f;return p|0}function xw(a,b,e){a=a|0;b=b|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;f=i;i=i+72|0;g=f|0;h=f+40|0;j=b;k=zx(a,c[((c[j>>2]&3|0)==3?b:b+32|0)+28>>2]|0,e)|0;l=zx(a,c[((c[j>>2]&3|0)==2?b:b-32|0)+28>>2]|0,e)|0;if((k|0)==0|(l|0)==0){m=0;i=f;return m|0}n=b;o=n|0;p=n+4|0;n=d[p]|d[p+1|0]<<8|d[p+2|0]<<16|d[p+3|0]<<24|0;p=h|0;q=h;c[q>>2]=d[o]|d[o+1|0]<<8|d[o+2|0]<<16|d[o+3|0]<<24;c[q+4>>2]=n;c[h+28>>2]=k;if((c[l+12>>2]|0)==(a|0)){r=l+16|0;s=5}else{c[g+16>>2]=l;l=c[a+28>>2]|0;k=Hc[c[l>>2]&63](l,g,4)|0;if((k|0)==0){t=0}else{r=k;s=5}}if((s|0)==5){s=a+36|0;k=r+20|0;ah(c[s>>2]|0,c[k>>2]|0)|0;r=c[s>>2]|0;g=Hc[c[r>>2]&63](r,p,4)|0;c[k>>2]=Yg(c[s>>2]|0)|0;t=g}if((e|0)!=0&(t|0)==0){yw(a,b);u=b}else{u=t}if((u|0)==0){m=0;i=f;return m|0}t=c[u>>2]&3;if((t|0)==(c[j>>2]&3|0)){m=u;i=f;return m|0}m=(t|0)==3?u-32|0:u+32|0;i=f;return m|0}function yw(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;e=i;i=i+152|0;f=e|0;g=e+40|0;h=e+80|0;j=e+120|0;k=c[b>>2]&3;l=(k|0)==2?b:b-32|0;m=(k|0)==3?b:b+32|0;k=c[m+28>>2]|0;n=c[l+28>>2]|0;if((a|0)==0){i=e;return}o=b;b=j|0;p=g;q=k+12|0;r=k+16|0;s=l|0;l=f;t=n+12|0;u=n+16|0;v=m|0;m=f+16|0;f=g+16|0;g=j;w=j+28|0;j=h;x=h+16|0;if((k|0)==0|(n|0)==0){h=a;do{if((c[q>>2]|0)==(h|0)){y=r}else{c[f>>2]=k;z=c[h+28>>2]|0;y=Hc[c[z>>2]&63](z,p,4)|0}z=h+32|0;A=c[z>>2]|0;B=y+32|0;ah(A,c[B>>2]|0)|0;Hc[c[A>>2]&63](A,s,1)|0;c[B>>2]=Yg(A)|0;A=h+36|0;B=c[A>>2]|0;C=y+24|0;ah(B,c[C>>2]|0)|0;Hc[c[B>>2]&63](B,s,1)|0;c[C>>2]=Yg(B)|0;if((c[t>>2]|0)==(h|0)){D=u}else{c[m>>2]=n;B=c[h+28>>2]|0;D=Hc[c[B>>2]&63](B,l,4)|0}B=c[z>>2]|0;z=D+28|0;ah(B,c[z>>2]|0)|0;Hc[c[B>>2]&63](B,v,1)|0;c[z>>2]=Yg(B)|0;B=c[A>>2]|0;A=D+20|0;ah(B,c[A>>2]|0)|0;Hc[c[B>>2]&63](B,v,1)|0;c[A>>2]=Yg(B)|0;h=uy(h)|0;}while((h|0)!=0);i=e;return}else{E=a}while(1){a=o|0;h=o+4|0;D=d[h]|d[h+1|0]<<8|d[h+2|0]<<16|d[h+3|0]<<24|0;c[g>>2]=d[a]|d[a+1|0]<<8|d[a+2|0]<<16|d[a+3|0]<<24;c[g+4>>2]=D;c[w>>2]=k;if((c[t>>2]|0)==(E|0)){F=u;G=10}else{c[x>>2]=n;D=c[E+28>>2]|0;a=Hc[c[D>>2]&63](D,j,4)|0;if((a|0)!=0){F=a;G=10}}if((G|0)==10){G=0;a=E+36|0;D=F+20|0;ah(c[a>>2]|0,c[D>>2]|0)|0;h=c[a>>2]|0;y=Hc[c[h>>2]&63](h,b,4)|0;c[D>>2]=Yg(c[a>>2]|0)|0;if((y|0)!=0){G=16;break}}if((c[q>>2]|0)==(E|0)){H=r}else{c[f>>2]=k;y=c[E+28>>2]|0;H=Hc[c[y>>2]&63](y,p,4)|0}y=E+32|0;a=c[y>>2]|0;D=H+32|0;ah(a,c[D>>2]|0)|0;Hc[c[a>>2]&63](a,s,1)|0;c[D>>2]=Yg(a)|0;a=E+36|0;D=c[a>>2]|0;h=H+24|0;ah(D,c[h>>2]|0)|0;Hc[c[D>>2]&63](D,s,1)|0;c[h>>2]=Yg(D)|0;if((c[t>>2]|0)==(E|0)){I=u}else{c[m>>2]=n;D=c[E+28>>2]|0;I=Hc[c[D>>2]&63](D,l,4)|0}D=c[y>>2]|0;y=I+28|0;ah(D,c[y>>2]|0)|0;Hc[c[D>>2]&63](D,v,1)|0;c[y>>2]=Yg(D)|0;D=c[a>>2]|0;a=I+20|0;ah(D,c[a>>2]|0)|0;Hc[c[D>>2]&63](D,v,1)|0;c[a>>2]=Yg(D)|0;D=uy(E)|0;if((D|0)==0){G=16;break}else{E=D}}if((G|0)==16){i=e;return}}function zw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;e=c[(c[b+28>>2]|0)+4>>2]|0;a=c[(c[d+28>>2]|0)+4>>2]|0;f=e-a|0;do{if((e|0)==(a|0)){if((c[b>>2]&3|0)==0){g=0;return g|0}if((c[d>>2]&3|0)==0){g=0;return g|0}else{h=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;break}}else{h=f}}while(0);if((h|0)==0){g=0;return g|0}g=h>>31|1;return g|0}function Aw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;e=c[b+28>>2]|0;a=c[d+28>>2]|0;if((e|0)==(a|0)){f=((c[b>>2]|0)>>>4)-((c[d>>2]|0)>>>4)|0}else{f=((c[e>>2]|0)>>>4)-((c[a>>2]|0)>>>4)|0}if((f|0)==0){g=0;return g|0}g=f>>31|1;return g|0}function Bw(){var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0;e=i;i=i+2224|0;f=e+1024|0;g=e+1424|0;c[53298]=0;c[53306]=-2;h=e|0;j=0;k=0;l=f;m=f;n=200;o=g;p=g;a:while(1){b[m>>1]=j;if((l+(n-1<<1)|0)>>>0>m>>>0){q=l;r=m;s=n;t=o;u=p}else{g=m-l>>1;v=g+1|0;if(n>>>0>9999>>>0){w=152;break}x=n<<1;y=x>>>0>1e4>>>0?1e4:x;x=dF(y*6|0|3)|0;if((x|0)==0){w=152;break}z=x;A=l;tF(x|0,A|0,v<<1)|0;B=x+((y>>>1&1073741823)<<2)|0;tF(B|0,p|0,v<<2)|0;if((l|0)!=(f|0)){eF(A)}if((y-1|0)>(g|0)){q=z;r=z+(g<<1)|0;s=y;t=B+(g<<2)|0;u=B}else{C=z;D=1;break}}if((j|0)==6){C=q;D=0;break}z=a[75496+j|0]|0;B=z<<24>>24;do{if(z<<24>>24==-18){w=22}else{g=c[53306]|0;if((g|0)==-2){y=jy()|0;c[53306]=y;E=y}else{E=g}do{if((E|0)<1){c[53306]=0;F=0}else{if(E>>>0>=269>>>0){F=2;break}F=d[74992+E|0]|0}}while(0);g=F+B|0;if(g>>>0>59>>>0){w=22;break}if((d[75696+g|0]|0)!=(F|0)){w=22;break}y=a[75264+g|0]|0;g=y<<24>>24;if(y<<24>>24<1){G=-g|0;w=23;break}else{c[53306]=-2;y=t+4|0;c[y>>2]=c[53300];H=g;I=(k|0)==0?0:k-1|0;J=r;K=y;break}}}while(0);do{if((w|0)==22){w=0;B=a[75616+j|0]|0;if(B<<24>>24!=0){G=B&255;w=23;break}B=c[53306]|0;do{if((k|0)==0){c[53298]=(c[53298]|0)+1;oy(148320);L=r;M=t;N=z}else if((k|0)==3){if((B|0)<1){if((B|0)==0){C=q;D=1;break a}else{L=r;M=t;N=z;break}}else{c[53306]=-2;L=r;M=t;N=z;break}}else{L=r;M=t;N=z}}while(0);while(1){if(N<<24>>24!=-18){B=(N<<24>>24)+1|0;if(N<<24>>24>-2&(B|0)<60&(B|0)==19){break}}if((L|0)==(q|0)){C=q;D=1;break a}B=L-2|0;L=B;M=M-4|0;N=a[75496+(b[B>>1]|0)|0]|0}B=M+4|0;c[B>>2]=c[53300];H=1;I=3;J=L;K=B}}while(0);b:do{if((w|0)==23){w=0;z=d[75328+G|0]|0;B=1-z|0;y=t+(B<<2)|0;g=c[y>>2]|0;c:do{switch(G|0){case 32:{A=c[t-16>>2]|0;v=c[t-8>>2]|0;x=c[t>>2]|0;do{if((x|0)==0){O=v}else{P=xF(v|0)|0;Q=P+2+(xF(x|0)|0)|0;if((Q|0)<1025){R=h}else{R=dF(Q)|0}nb(R|0,81472,(Q=i,i=i+16|0,c[Q>>2]=v,c[Q+8>>2]=x,Q)|0)|0;i=Q;Q=dy(c[53732]|0,R)|0;fy(c[53732]|0,v)|0;fy(c[53732]|0,x)|0;if((R|0)==(h|0)){O=Q;break}eF(R);O=Q}}while(0);x=Ax(c[c[53540]>>2]|0,A,1)|0;v=sx(c[53732]|0,16)|0;Q=v;c[v>>2]=259;c[v+4>>2]=x;c[v+8>>2]=O;v=c[53540]|0;x=v+12|0;P=c[x>>2]|0;if((P|0)!=0){c[P+12>>2]=Q}c[x>>2]=Q;x=v+8|0;if((c[x>>2]|0)==0){c[x>>2]=Q}fy(c[53732]|0,A)|0;S=g;break};case 12:{S=1;break};case 21:{if((c[t-4>>2]|0)==0){Q=c[53540]|0;x=c[Q+24>>2]|0;if((x|0)==0){T=Q}else{v=x;x=Q;while(1){Q=v+4|0;P=c[Q>>2]|0;U=Wv(c[x>>2]|0,1,P,0)|0;V=Q|0;c[V>>2]=U;if((U|0)==0){c[V>>2]=Wv(c[c[53540]>>2]|0,1,P,213328)|0}c[v>>2]=266;fy(c[53732]|0,P)|0;P=c[v+12>>2]|0;V=c[53540]|0;if((P|0)==0){T=V;break}else{v=P;x=V}}}x=c[T+8>>2]|0;if((x|0)==0){W=T;X=0}else{v=x;x=T;while(1){A=c[v+4>>2]|0;V=c[x+24>>2]|0;if((V|0)==0){Y=x}else{P=V;do{do{if((c[P>>2]|0)==266){V=c[P+4>>2]|0;if((V|0)==0){break}hw(A,V,c[P+8>>2]|0)|0}}while(0);P=c[P+12>>2]|0;}while((P|0)!=0);Y=c[53540]|0}P=c[v+12>>2]|0;if((P|0)==0){break}else{v=P;x=Y}}W=Y;X=c[Y+8>>2]|0}Gw(X);c[W+12>>2]=0;c[W+8>>2]=0;x=c[53540]|0;v=x+24|0;Gw(c[v>>2]|0);c[x+28>>2]=0;c[v>>2]=0;v=c[53540]|0;x=v+16|0;Gw(c[x>>2]|0);c[v+20>>2]=0;c[x>>2]=0;c[(c[53540]|0)+4>>2]=0;S=g;break c}Ew(2);x=c[53540]|0;v=c[x+24>>2]|0;if((v|0)==0){Z=0}else{P=a[172752]|0;A=0;V=v;while(1){do{if((c[V>>2]|0)==267){v=c[V+4>>2]|0;if((a[v]|0)!=P<<24>>24){_=A;break}if((Ya(v|0,172752)|0)!=0){_=A;break}_=c[V+8>>2]|0}else{_=A}}while(0);v=c[V+12>>2]|0;if((v|0)==0){Z=_;break}else{A=_;V=v}}}V=c[x+16>>2]|0;A=V+12|0;P=c[A>>2]|0;if((P|0)==0){$=x}else{v=V;V=A;A=P;do{P=v+4|0;do{if((c[v>>2]|0)==262){U=c[P>>2]|0;Q=ux(U)|0;if((Q|0)==0){break}else{aa=Q}do{Q=zx(c[c[53540]>>2]|0,aa,0)|0;Fw(Q,0,c[V>>2]|0,Z);aa=vx(U,aa)|0;}while((aa|0)!=0)}else{U=c[P>>2]|0;if((U|0)==0){break}Fw(c[U+4>>2]|0,c[U+8>>2]|0,A,Z);Q=c[U+12>>2]|0;if((Q|0)==0){break}else{ba=Q}do{Fw(c[ba+4>>2]|0,c[ba+8>>2]|0,c[V>>2]|0,Z);ba=c[ba+12>>2]|0;}while((ba|0)!=0)}}while(0);v=c[V>>2]|0;V=v+12|0;A=c[V>>2]|0;}while((A|0)!=0);$=c[53540]|0}A=$+8|0;Gw(c[A>>2]|0);c[$+12>>2]=0;c[A>>2]=0;A=c[53540]|0;V=A+16|0;Gw(c[V>>2]|0);c[A+20>>2]=0;c[V>>2]=0;V=c[53540]|0;A=V+24|0;Gw(c[A>>2]|0);c[V+28>>2]=0;c[A>>2]=0;c[(c[53540]|0)+4>>2]=0;S=g;break};case 34:{Cw(258,0);S=g;break};case 35:{S=258;break};case 36:{S=259;break};case 37:{S=260;break};case 38:{S=c[t-4>>2]|0;break};case 39:{S=0;break};case 48:{A=c[t-8>>2]|0;V=c[t>>2]|0;v=sx(c[53732]|0,16)|0;x=v;c[v>>2]=267;c[v+4>>2]=A;c[v+8>>2]=V;V=c[53540]|0;v=V+28|0;A=c[v>>2]|0;if((A|0)!=0){c[A+12>>2]=x}c[v>>2]=x;v=V+24|0;if((c[v>>2]|0)!=0){S=g;break c}c[v>>2]=x;S=g;break};case 2:{py();fx(c[53732]|0);S=g;break};case 25:{x=c[53540]|0;v=c[x+8>>2]|0;if((v|0)==0){V=c[x+4>>2]|0;if((V|0)==0){ca=0;da=x}else{x=sx(c[53732]|0,16)|0;c[x>>2]=262;c[x+4>>2]=V;c[x+8>>2]=0;ca=x;da=c[53540]|0}c[da+4>>2]=0;ea=ca}else{x=sx(c[53732]|0,16)|0;c[x>>2]=265;c[x+4>>2]=v;c[x+8>>2]=0;c[(c[53540]|0)+12>>2]=0;c[(c[53540]|0)+8>>2]=0;ea=x}if((ea|0)==0){S=g;break c}x=c[53540]|0;v=x+20|0;V=c[v>>2]|0;if((V|0)!=0){c[V+12>>2]=ea}c[v>>2]=ea;v=x+16|0;if((c[v>>2]|0)!=0){S=g;break c}c[v>>2]=ea;S=g;break};case 3:{v=c[53732]|0;if((v|0)==0){S=g;break c}Kw(v)|0;c[53854]=0;c[53732]=0;S=g;break};case 6:{v=c[t>>2]|0;x=c[53732]|0;if((x|0)==0){a[174920]=(c[t-8>>2]&255)<<1&2|c[t-4>>2]&1|a[174920]&-12|8;V=Hw(v,174920,c[53840]|0)|0;c[53732]=V;fa=V}else{fa=x}c[53854]=fa;x=c[53540]|0;V=sx(fa,36)|0;c[V+32>>2]=x;c[V>>2]=fa;c[53540]=V;fy(0,v)|0;S=g;break};case 55:{S=0;break};case 59:{S=c[t>>2]|0;break};case 60:{S=c[t>>2]|0;break};case 61:{S=c[t>>2]|0;break};case 62:{v=c[t-8>>2]|0;V=c[t>>2]|0;x=xF(v|0)|0;A=x+1+(xF(V|0)|0)|0;if((A|0)<1025){ga=h}else{ga=dF(A)|0}zF(ga|0,v|0)|0;AF(ga|0,V|0)|0;A=dy(c[53732]|0,ga)|0;fy(c[53732]|0,v)|0;fy(c[53732]|0,V)|0;if((ga|0)!=(h|0)){eF(ga)}S=A;break};case 8:{S=0;break};case 9:{S=1;break};case 7:{S=c[t>>2]|0;break};case 49:{A=c[t>>2]|0;V=sx(c[53732]|0,16)|0;v=V;c[V>>2]=267;c[V+4>>2]=A;c[V+8>>2]=0;V=c[53540]|0;A=V+28|0;x=c[A>>2]|0;if((x|0)!=0){c[x+12>>2]=v}c[A>>2]=v;A=V+24|0;if((c[A>>2]|0)!=0){S=g;break c}c[A>>2]=v;S=g;break};case 51:{v=c[t>>2]|0;A=c[53540]|0;V=ry(c[A>>2]|0,v,1)|0;x=sx(c[53732]|0,36)|0;c[x+32>>2]=A;c[x>>2]=V;c[53540]=x;fy(c[53732]|0,v)|0;S=g;break};case 52:{v=c[53540]|0;x=c[v>>2]|0;V=c[v+32>>2]|0;tx(c[53732]|0,v);c[53540]=V;c[V+4>>2]=x;S=g;break};case 53:{S=c[t>>2]|0;break};case 54:{S=0;break};case 26:{S=1;break};case 27:{S=0;break};case 30:{x=c[t>>2]|0;V=Ax(c[c[53540]>>2]|0,x,1)|0;v=sx(c[53732]|0,16)|0;A=v;c[v>>2]=259;c[v+4>>2]=V;c[v+8>>2]=0;v=c[53540]|0;V=v+12|0;P=c[V>>2]|0;if((P|0)!=0){c[P+12>>2]=A}c[V>>2]=A;V=v+8|0;if((c[V>>2]|0)==0){c[V>>2]=A}fy(c[53732]|0,x)|0;S=g;break};case 10:{S=0;break};case 11:{S=0;break};case 24:{x=c[53540]|0;A=c[x+8>>2]|0;if((A|0)==0){V=c[x+4>>2]|0;if((V|0)==0){ha=0;ia=x}else{x=sx(c[53732]|0,16)|0;c[x>>2]=262;c[x+4>>2]=V;c[x+8>>2]=0;ha=x;ia=c[53540]|0}c[ia+4>>2]=0;ja=ha}else{x=sx(c[53732]|0,16)|0;c[x>>2]=265;c[x+4>>2]=A;c[x+8>>2]=0;c[(c[53540]|0)+12>>2]=0;c[(c[53540]|0)+8>>2]=0;ja=x}if((ja|0)==0){S=g;break c}x=c[53540]|0;A=x+20|0;V=c[A>>2]|0;if((V|0)!=0){c[V+12>>2]=ja}c[A>>2]=ja;A=x+16|0;if((c[A>>2]|0)!=0){S=g;break c}c[A>>2]=ja;S=g;break};case 31:{A=c[t-8>>2]|0;x=c[t>>2]|0;V=Ax(c[c[53540]>>2]|0,A,1)|0;v=sx(c[53732]|0,16)|0;P=v;c[v>>2]=259;c[v+4>>2]=V;c[v+8>>2]=x;x=c[53540]|0;v=x+12|0;V=c[v>>2]|0;if((V|0)!=0){c[V+12>>2]=P}c[v>>2]=P;v=x+8|0;if((c[v>>2]|0)==0){c[v>>2]=P}fy(c[53732]|0,A)|0;S=g;break};case 33:{Cw(c[t-8>>2]|0,c[t-4>>2]|0);S=g;break};default:{S=g}}}while(0);g=r+(-z<<1)|0;A=t+(B<<2)|0;c[y>>2]=S;P=(d[75392+G|0]|0)-24|0;v=b[g>>1]|0;x=v+(a[75456+P|0]|0)|0;do{if(x>>>0<60>>>0){if((d[75696+x|0]|0)!=(v|0)){break}H=a[75264+x|0]|0;I=k;J=g;K=A;break b}}while(0);H=a[75576+P|0]|0;I=k;J=g;K=A}}while(0);j=H;k=I;l=q;m=J+2|0;n=s;o=K;p=u}if((w|0)==152){oy(116392);C=l;D=2}if((C|0)==(f|0)){i=e;return D|0}eF(C);i=e;return D|0}function Cw(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;e=i;if((d|0)!=0){Fv(0,167720,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f}d=c[(c[53540]|0)+24>>2]|0;if((d|0)!=0){g=d;do{if((c[g+8>>2]|0)==0){Fv(0,167720,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f}g=c[g+12>>2]|0;}while((g|0)!=0)}if((b|0)==260){h=2}else if((b|0)==258){h=0}else if((b|0)==259){h=1}else{h=0}Ew(h);b=c[53540]|0;g=c[b+24>>2]|0;if((g|0)==0){j=b;k=0;l=j+24|0;Gw(k);m=j+28|0;c[m>>2]=0;c[l>>2]=0;i=e;return}else{n=g}do{g=c[n+4>>2]|0;b=c[c[53540]>>2]|0;if((a[g+21|0]|0)!=0&(b|0)==(c[53732]|0)){o=g;p=14}else{f=Wv(b,h,c[g+8>>2]|0,c[n+8>>2]|0)|0;if((c[c[53540]>>2]|0)==(c[53732]|0)){o=f;p=14}}if((p|0)==14){p=0;a[o+22|0]=1}n=c[n+12>>2]|0;}while((n|0)!=0);n=c[53540]|0;j=n;k=c[n+24>>2]|0;l=j+24|0;Gw(k);m=j+28|0;c[m>>2]=0;c[l>>2]=0;i=e;return}function Dw(a,b){a=a|0;b=b|0;var d=0,e=0;c[53304]=a;c[53732]=0;c[53854]=0;d=(b|0)!=0?b:174304;c[53840]=d;iy(d,a);Bw()|0;a=c[53854]|0;if((a|0)!=0){e=a;return e|0}qy();e=c[53854]|0;return e|0}function Ew(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=c[(c[53540]|0)+24>>2]|0;if((d|0)==0){return}if((b|0)==2){e=d}else{f=d;do{d=f+4|0;g=c[d>>2]|0;h=Wv(c[c[53540]>>2]|0,b,g,0)|0;i=d|0;c[i>>2]=h;if((h|0)==0){c[i>>2]=Wv(c[c[53540]>>2]|0,b,g,213328)|0}c[f>>2]=266;fy(c[53732]|0,g)|0;f=c[f+12>>2]|0;}while((f|0)!=0);return}do{f=e+4|0;b=c[f>>2]|0;if((a[b]|0)==(a[172752]|0)){if((Ya(b|0,172752)|0)!=0){j=5}}else{j=5}if((j|0)==5){j=0;g=Wv(c[c[53540]>>2]|0,2,b,0)|0;i=f|0;c[i>>2]=g;if((g|0)==0){c[i>>2]=Wv(c[c[53540]>>2]|0,2,b,213328)|0}c[e>>2]=266;fy(c[53732]|0,b)|0}e=c[e+12>>2]|0;}while((e|0)!=0);return}function Fw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;f=d+4|0;if((c[d>>2]|0)==262){d=c[f>>2]|0;g=ux(d)|0;if((g|0)==0){return}else{h=g}do{g=zx(c[c[53540]>>2]|0,h,0)|0;i=uw(c[c[53540]>>2]|0,a,g,e,1)|0;do{if((i|0)!=0){g=c[i>>2]&3;j=c[((g|0)==2?i:i-32|0)+28>>2]|0;k=(c[((g|0)==3?i:i+32|0)+28>>2]|0)!=(j|0)&(j|0)==(a|0);j=k?b:0;g=k?0:b;if((g|0)!=0){k=Wv(c[c[53540]>>2]|0,2,97656,0)|0;if((k|0)==0){l=Wv(c[c[53540]>>2]|0,2,97656,213328)|0}else{l=k}hw(i|0,l,g)|0}if((j|0)==0){m=i|0}else{g=Wv(c[c[53540]>>2]|0,2,91384,0)|0;if((g|0)==0){n=Wv(c[c[53540]>>2]|0,2,91384,213328)|0}else{n=g}g=i|0;hw(g,n,j)|0;m=g}g=c[(c[53540]|0)+24>>2]|0;if((g|0)==0){break}else{o=g}do{do{if((c[o>>2]|0)==266){g=c[o+4>>2]|0;if((g|0)==0){break}hw(m,g,c[o+8>>2]|0)|0}}while(0);o=c[o+12>>2]|0;}while((o|0)!=0)}}while(0);h=vx(d,h)|0;}while((h|0)!=0);return}else{h=c[f>>2]|0;if((h|0)==0){return}else{p=h}do{h=zx(c[c[53540]>>2]|0,c[p+4>>2]|0,0)|0;f=c[p+8>>2]|0;d=uw(c[c[53540]>>2]|0,a,h,e,1)|0;do{if((d|0)!=0){h=c[d>>2]&3;o=c[((h|0)==2?d:d-32|0)+28>>2]|0;m=(c[((h|0)==3?d:d+32|0)+28>>2]|0)!=(o|0)&(o|0)==(a|0);o=m?b:f;h=m?f:b;if((h|0)!=0){m=Wv(c[c[53540]>>2]|0,2,97656,0)|0;if((m|0)==0){q=Wv(c[c[53540]>>2]|0,2,97656,213328)|0}else{q=m}hw(d|0,q,h)|0}if((o|0)==0){r=d|0}else{h=Wv(c[c[53540]>>2]|0,2,91384,0)|0;if((h|0)==0){s=Wv(c[c[53540]>>2]|0,2,91384,213328)|0}else{s=h}h=d|0;hw(h,s,o)|0;r=h}h=c[(c[53540]|0)+24>>2]|0;if((h|0)==0){break}else{t=h}do{do{if((c[t>>2]|0)==266){h=c[t+4>>2]|0;if((h|0)==0){break}hw(r,h,c[t+8>>2]|0)|0}}while(0);t=c[t+12>>2]|0;}while((t|0)!=0)}}while(0);p=c[p+12>>2]|0;}while((p|0)!=0);return}}function Gw(a){a=a|0;var b=0,d=0;if((a|0)==0){return}else{b=a}while(1){a=c[b+12>>2]|0;d=c[b>>2]|0;if((d|0)==267|(d|0)==266){fy(c[53732]|0,c[b+8>>2]|0)|0}else if((d|0)==265){Gw(c[b+4>>2]|0)}tx(c[53732]|0,b);if((a|0)==0){break}else{b=a}}return}function Hw(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;f=i;i=i+8|0;g=d;d=i;i=i+4|0;i=i+7&-8;c[d>>2]=c[g>>2];g=f|0;h=(e|0)!=0;if(h){j=c[e>>2]|0;k=(j|0)==0?174232:j}else{k=174232}j=Ec[c[k>>2]&63](e)|0;l=k+4|0;m=Oc[c[l>>2]&255](j,68)|0;c[m>>2]=k;c[m+12>>2]=j;if(h){h=c[e+4>>2]|0;c[m+4>>2]=(h|0)==0?174272:h;h=c[e+8>>2]|0;n=(h|0)==0?174256:h}else{c[m+4>>2]=174272;n=174256}c[m+8>>2]=n;a[m+40|0]=1;n=Oc[c[l>>2]&255](j,56)|0;j=n;l=n;c[l>>2]=c[l>>2]&-4;l=n+52|0;c[l>>2]=m;h=n+12|0;k=c[d>>2]|0;c[h>>2]=k;a[h]=k&255|8;c[n+48>>2]=j;k=Oc[c[c[m+4>>2]>>2]&255](j,e)|0;c[(c[l>>2]|0)+16>>2]=k;if((Yw(j,0,b,g,1)|0)==0){o=Iw(j)|0;p=o|0;ax(o,0,p);i=f;return o|0}c[n+4>>2]=c[g>>2];o=Iw(j)|0;p=o|0;ax(o,0,p);i=f;return o|0}function Iw(b){b=b|0;var d=0,e=0,f=0,g=0;c[b+24>>2]=yy(b,173952,c[43326]|0)|0;c[b+28>>2]=yy(b,173992,c[43326]|0)|0;d=b|0;e=(Ix(d)|0)==(b|0);c[b+32>>2]=yy(b,e?174152:174072,c[43326]|0)|0;e=(Ix(d)|0)==(b|0);c[b+36>>2]=yy(b,e?174192:174112,c[43326]|0)|0;c[b+40>>2]=yy(b,174032,c[43326]|0)|0;e=uy(b)|0;do{if((e|0)!=0){f=(c[e+52>>2]|0)+24|0;g=(c[f>>2]|0)+1|0;c[f>>2]=g;f=b;c[f>>2]=c[f>>2]&15|g<<4;g=c[e+40>>2]|0;Hc[c[g>>2]&63](g,d,1)|0;if((a[e+12|0]&64)!=0){break}Jx(b,d);return b|0}}while(0);Yv(b);Jx(b,d);return b|0}function Jw(a,b){a=a|0;b=b|0;var d=0;d=(c[a+52>>2]|0)+24+(b<<2)|0;b=(c[d>>2]|0)+1|0;c[d>>2]=b;return b|0}function Kw(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0;d=uy(b)|0;e=(d|0)==0;do{if(e){f=b+52|0;if((c[(c[c[f>>2]>>2]|0)+16>>2]|0)==0){break}Nx(b,b|0);_w(b,0,c[b+4>>2]|0);g=c[f>>2]|0;Cc[c[(c[g>>2]|0)+16>>2]&255](c[g+12>>2]|0);h=0;return h|0}}while(0);g=sy(b)|0;if((g|0)!=0){f=g;while(1){g=ty(f)|0;Kw(f)|0;if((g|0)==0){break}else{f=g}}}f=ux(b)|0;if((f|0)!=0){g=f;while(1){f=vx(b,g)|0;Cx(b,g)|0;if((f|0)==0){break}else{g=f}}}gx(b);g=b|0;Nx(b,g);if((Ay(b,c[b+28>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+24>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+36>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+32>>2]|0)|0)!=0){h=-1;return h|0}if((Ay(b,c[b+40>>2]|0)|0)!=0){h=-1;return h|0}do{if((a[b+12|0]&64)!=0){if((_v(b)|0)==0){break}else{h=-1}return h|0}}while(0);ay(b|0);_w(b,0,c[b+4>>2]|0);if(!e){vy(d,b)|0;tx(d,g);h=0;return h|0}d=b+52|0;e=c[d>>2]|0;f=c[e+36>>2]|0;if((f|0)==0){i=e}else{e=f;while(1){Qx(b,c[e>>2]|0)|0;f=c[d>>2]|0;j=c[f+36>>2]|0;if((j|0)==0){i=f;break}else{e=j}}}Cc[c[(c[i+4>>2]|0)+20>>2]&255](c[i+16>>2]|0);if((by(b)|0)!=0){h=-1;return h|0}b=c[d>>2]|0;d=c[b+12>>2]|0;i=(c[b>>2]|0)+12|0;Dc[c[i>>2]&63](d,g);Dc[c[i>>2]&63](d,b);h=0;return h|0}function Lw(a){a=a|0;return bh(c[a+28>>2]|0)|0}function Mw(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;b=ux(a)|0;if((b|0)==0){d=0;return d|0}e=a+32|0;f=b;b=0;while(1){g=nw(a,f)|0;if((g|0)==0){h=0}else{i=c[e>>2]|0;j=g+32|0;ah(i,c[j>>2]|0)|0;g=bh(i)|0;c[j>>2]=Yg(i)|0;h=g}g=h+b|0;i=vx(a,f)|0;if((i|0)==0){d=g;break}else{f=i;b=g}}return d|0}function Nw(b){b=b|0;return a[b+12|0]&1|0}function Ow(b){b=b|0;return(a[b+12|0]&1^1)&255|0}function Pw(a){a=a|0;return(d[a+12|0]|0)>>>1&1|0}function Qw(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b+4>>2]|0;b=c[d+4>>2]|0;if((e|0)==(b|0)){f=0;return f|0}f=e-b>>31|1;return f|0}function Rw(a,b){a=a|0;b=b|0;return a|0}function Sw(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0;if((d|0)==0){c[e>>2]=c[5410];c[5410]=(c[5410]|0)+2;return 1}b=a;if((f|0)==0){g=cy(b,d)|0}else{g=dy(b,d)|0}c[e>>2]=g;return 1}function Tw(a,b,c){a=a|0;b=b|0;c=c|0;return 0}function Uw(a,b,c){a=a|0;b=b|0;c=c|0;if((c&1|0)!=0){return}fy(a,c)|0;return}function Vw(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((c&1|0)==0){d=c}else{d=0}return d|0}function Ww(a){a=a|0;return}function Xw(a,b,c){a=a|0;b=b|0;c=c|0;return}function Yw(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0;h=(e|0)!=0;do{if(h){do{if((a[e]|0)!=37){i=c[b+52>>2]|0;j=Gc[c[(c[i+4>>2]|0)+4>>2]&127](c[i+16>>2]|0,d,e,f,g)|0;if((j|0)==0){break}else{k=j}return k|0}}while(0);j=bx(b,d,e,f)|0;if((j|0)==0){break}else{k=j}return k|0}}while(0);if((g|0)==0){k=0;return k|0}j=c[b+52>>2]|0;i=Gc[c[(c[j+4>>2]|0)+4>>2]&127](c[j+16>>2]|0,d,0,f,g)|0;if((i|0)==0|h^1){k=i;return k|0}cx(b,d,e,c[f>>2]|0);k=i;return k|0}function Zw(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+52>>2]|0;return Hc[c[(c[e+4>>2]|0)+8>>2]&63](c[e+16>>2]|0,b,d)|0}function _w(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;ex(a,b,d)|0;e=c[a+52>>2]|0;Tc[c[(c[e+4>>2]|0)+12>>2]&127](c[e+16>>2]|0,b,d);return}function $w(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=i;d=Hx(a)|0;e=a;f=a+4|0;a=dx(d,c[e>>2]&3,c[f>>2]|0)|0;if((a|0)!=0){g=a;i=b;return g|0}a=c[d+52>>2]|0;d=c[(c[a+4>>2]|0)+16>>2]|0;do{if((d|0)!=0){h=Hc[d&63](c[a+16>>2]|0,c[e>>2]&3,c[f>>2]|0)|0;if((h|0)==0){break}else{g=h}i=b;return g|0}}while(0);if((c[e>>2]&3|0)==2){g=0;i=b;return g|0}e=c[f>>2]|0;nb(212968,113184,(f=i,i=i+16|0,c[f>>2]=37,c[f+8>>2]=e,f)|0)|0;i=f;g=212968;i=b;return g|0}function ax(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=c[a+52>>2]|0;Tc[c[(c[e+4>>2]|0)+24>>2]&127](c[e+16>>2]|0,b,d);return}function bx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;f=i;i=i+24|0;g=f|0;h=c[(c[a+52>>2]|0)+44+(((b|0)==3?2:b)<<2)>>2]|0;if((h|0)==0){j=0;i=f;return j|0}b=cy(a,d)|0;if((b|0)==0){j=0;i=f;return j|0}c[g+20>>2]=b;b=Hc[c[h>>2]&63](h,g,4)|0;if((b|0)==0){j=0;i=f;return j|0}c[e>>2]=c[b+16>>2];j=1;i=f;return j|0}function cx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0;f=sx(a,24)|0;c[f+16>>2]=e;c[f+20>>2]=dy(a,d)|0;d=(b|0)==3?2:b;b=a+52|0;e=c[b>>2]|0;g=c[e+44+(d<<2)>>2]|0;if((g|0)==0){h=yy(a,172656,c[43326]|0)|0;c[(c[b>>2]|0)+44+(d<<2)>>2]=h;i=h;j=c[b>>2]|0}else{i=g;j=e}e=c[j+56+(d<<2)>>2]|0;if((e|0)==0){j=yy(a,172696,c[43326]|0)|0;c[(c[b>>2]|0)+56+(d<<2)>>2]=j;k=j}else{k=e}Hc[c[i>>2]&63](i,f,1)|0;Hc[c[k>>2]&63](k,f,1)|0;return}function dx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=i;i=i+24|0;f=e|0;g=c[(c[a+52>>2]|0)+56+(((b|0)==3?2:b)<<2)>>2]|0;if((g|0)==0){h=0;i=e;return h|0}c[f+16>>2]=d;d=Hc[c[g>>2]&63](g,f,4)|0;if((d|0)==0){h=0;i=e;return h|0}h=c[d+20>>2]|0;i=e;return h|0}function ex(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0;e=i;i=i+24|0;f=e|0;g=(b|0)==3?2:b;b=a+52|0;h=c[(c[b>>2]|0)+56+(g<<2)>>2]|0;if((h|0)==0){j=0;i=e;return j|0}c[f+16>>2]=d;d=Hc[c[h>>2]&63](h,f,4)|0;if((d|0)==0){j=0;i=e;return j|0}f=c[(c[b>>2]|0)+44+(g<<2)>>2]|0;Hc[c[f>>2]&63](f,d,2)|0;f=c[(c[b>>2]|0)+56+(g<<2)>>2]|0;Hc[c[f>>2]&63](f,d,2)|0;fy(a,c[d+20>>2]|0)|0;tx(a,d);j=1;i=e;return j|0}function fx(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=i;i=i+24|0;e=d|0;c[53854]=b;f=b+52|0;g=c[f>>2]|0;h=e;j=e+16|0;e=0;do{k=g+44+(e<<2)|0;l=c[k>>2]|0;do{if((l|0)!=0){m=Hc[c[l>>2]&63](l,0,128)|0;if((m|0)==0){break}else{n=m}while(1){m=c[k>>2]|0;o=Hc[c[m>>2]&63](m,n,8)|0;do{if((a[c[n+20>>2]|0]|0)==37){m=c[(c[f>>2]|0)+56+(e<<2)>>2]|0;if((m|0)==0){break}c[j>>2]=c[n+16>>2];p=Hc[c[m>>2]&63](m,h,4)|0;if((p|0)==0){break}m=c[(c[f>>2]|0)+44+(e<<2)>>2]|0;Hc[c[m>>2]&63](m,p,2)|0;m=c[(c[f>>2]|0)+56+(e<<2)>>2]|0;Hc[c[m>>2]&63](m,p,2)|0;fy(b,c[p+20>>2]|0)|0;tx(b,p)}}while(0);if((o|0)==0){break}else{n=o}}}}while(0);e=e+1|0;}while((e|0)<3);i=d;return}function gx(a){a=a|0;var b=0,d=0,e=0;c[53854]=a;b=a+52|0;a=c[b>>2]|0;d=a+44|0;e=c[d>>2]|0;if((e|0)!=0){Vg(e)|0;c[d>>2]=0}d=a+48|0;e=c[d>>2]|0;if((e|0)!=0){Vg(e)|0;c[d>>2]=0}d=a+52|0;a=c[d>>2]|0;if((a|0)!=0){Vg(a)|0;c[d>>2]=0}d=c[b>>2]|0;b=d+56|0;a=c[b>>2]|0;if((a|0)!=0){Vg(a)|0;c[b>>2]=0}b=d+60|0;a=c[b>>2]|0;if((a|0)!=0){Vg(a)|0;c[b>>2]=0}b=d+64|0;d=c[b>>2]|0;if((d|0)==0){return}Vg(d)|0;c[b>>2]=0;return}function hx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b+16>>2]|0)-(c[d+16>>2]|0)|0}function ix(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b+20>>2]|0)-(c[d+20>>2]|0)|0}function jx(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if((db(b|0,c|0,a|0)|0)==0){d=0;return d|0}d=xF(b|0)|0;return d|0}function kx(a,b){a=a|0;b=b|0;return Oa(b|0,a|0)|0}function lx(a){a=a|0;return Ia(a|0)|0}function mx(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+32|0;d=b|0;e=b+16|0;c[4961]=c[43565];c[4962]=c[43566];c[d>>2]=a;c[d+4>>2]=xF(a|0)|0;c[d+8>>2]=0;c[e>>2]=174232;c[e+4>>2]=174272;c[e+8>>2]=19840;a=Dw(d,e)|0;i=b;return a|0}function nx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;if((e|0)==0){f=0;return f|0}g=b+8|0;h=c[g>>2]|0;if((h|0)>=(c[b+4>>2]|0)){f=0;return f|0}i=c[b>>2]|0;b=0;j=a[i+h|0]|0;k=d;d=i+(h+1)|0;while(1){a[k]=j;l=b+1|0;if(!(j<<24>>24!=10&(l|0)<(e|0))){break}h=a[d]|0;if(h<<24>>24==0){break}else{b=l;j=h;k=k+1|0;d=d+1|0}}c[g>>2]=(c[g>>2]|0)+l;f=l;return f|0}function ox(a){a=a|0;return 0}function px(a,b){a=a|0;b=b|0;a=dF(b)|0;vF(a|0,0,b|0)|0;return a|0}function qx(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;a=gF(b,d)|0;if(d>>>0<=c>>>0){return a|0}vF(a+c|0,0,d-c|0)|0;return a|0}function rx(a,b){a=a|0;b=b|0;eF(b);return}function sx(a,b){a=a|0;b=b|0;var d=0,e=0;d=i;e=c[a+52>>2]|0;a=Oc[c[(c[e>>2]|0)+4>>2]&255](c[e+12>>2]|0,b)|0;if((a|0)!=0){i=d;return a|0}Fv(1,98640,(b=i,i=i+1|0,i=i+7&-8,c[b>>2]=0,b)|0)|0;i=b;i=d;return a|0}function tx(a,b){a=a|0;b=b|0;var d=0;if((b|0)==0){return}d=c[a+52>>2]|0;Dc[c[(c[d>>2]|0)+12>>2]&63](c[d+12>>2]|0,b);return}function ux(a){a=a|0;var b=0,d=0;b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,0,128)|0;if((a|0)==0){d=0;return d|0}d=c[a+16>>2]|0;return d|0}function vx(a,b){a=a|0;b=b|0;var d=0,e=0;d=nw(a,b)|0;if((d|0)==0){e=0;return e|0}b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,d,8)|0;if((a|0)==0){e=0;return e|0}e=c[a+16>>2]|0;return e|0}function wx(a){a=a|0;var b=0,d=0;b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,0,256)|0;if((a|0)==0){d=0;return d|0}d=c[a+16>>2]|0;return d|0}function xx(a,b){a=a|0;b=b|0;var d=0,e=0;d=nw(a,b)|0;if((d|0)==0){e=0;return e|0}b=c[a+24>>2]|0;a=Hc[c[b>>2]&63](b,d,16)|0;if((a|0)==0){e=0;return e|0}e=c[a+16>>2]|0;return e|0}function yx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0;c[53265]=d;c[53258]=213056;f=c[b+28>>2]|0;g=Hc[c[f>>2]&63](f,213016,4)|0;if((g|0)==0){h=0}else{h=c[g+16>>2]|0}if((h|0)!=0|(e|0)==0){i=h;return i|0}h=b|0;e=Ix(h)|0;do{if((e|0)!=(b|0)){c[53265]=d;c[53258]=213056;g=c[e+28>>2]|0;f=Hc[c[g>>2]&63](g,213016,4)|0;if((f|0)==0){break}g=c[f+16>>2]|0;if((g|0)==0){break}zx(b,g,1)|0;i=g;return i|0}}while(0);if((Zw(b,1,d)|0)==0){i=0;return i|0}e=Jw(b,1)|0;g=sx(b,52)|0;f=g;j=g;k=c[j>>2]|0;c[g+4>>2]=d;c[j>>2]=e<<4|k&12|1;c[g+12>>2]=Ix(h)|0;if((a[(Ix(h)|0)+12|0]&64)!=0){Wx(g,c[43580]|0,16,0)|0}k=g+16|0;e=b;do{j=e+28|0;bh(c[j>>2]|0)|0;if((Ix(e|0)|0)==(e|0)){l=k}else{l=sx(e,36)|0}c[l+16>>2]=f;d=c[j>>2]|0;Hc[c[d>>2]&63](d,l,1)|0;d=c[e+24>>2]|0;Hc[c[d>>2]&63](d,l,1)|0;e=uy(e)|0;}while((e|0)!=0);if((a[(Ix(h)|0)+12|0]&64)!=0){aw(b,f)}Jx(b,g);i=f;return i|0}function zx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0;e=a|0;f=Ix(e)|0;if((f|0)!=(c[b+12>>2]|0)){g=0;return g|0}c[53265]=c[b+4>>2];c[53258]=213056;f=a+28|0;h=c[f>>2]|0;i=Hc[c[h>>2]&63](h,213016,4)|0;if((i|0)==0){j=0}else{j=c[i+16>>2]|0}if((j|0)!=0|(d|0)==0){g=j;return g|0}j=uy(a)|0;if((j|0)==0){g=0;return g|0}i=zx(j,b,d)|0;bh(c[f>>2]|0)|0;if((Ix(e)|0)==(a|0)){k=i+16|0}else{k=sx(a,36)|0}c[k+16>>2]=i;e=c[f>>2]|0;f=k;Hc[c[e>>2]&63](e,f,1)|0;e=c[a+24>>2]|0;Hc[c[e>>2]&63](e,f,1)|0;g=i;return g|0}function Ax(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+8|0;g=f|0;h=b|0;j=Ix(h)|0;do{if((Yw(b,1,d,g,0)|0)!=0){c[53265]=c[g>>2];c[53258]=213056;k=c[b+28>>2]|0;l=Hc[c[k>>2]&63](k,213016,4)|0;do{if((l|0)!=0){k=c[l+16>>2]|0;if((k|0)==0){break}else{m=k}i=f;return m|0}}while(0);if((e|0)==0|(j|0)==(b|0)){break}c[53265]=c[g>>2];c[53258]=213056;l=c[j+28>>2]|0;k=Hc[c[l>>2]&63](l,213016,4)|0;if((k|0)==0){break}l=c[k+16>>2]|0;if((l|0)==0){break}m=zx(b,l,1)|0;i=f;return m|0}}while(0);if((e|0)==0){m=0;i=f;return m|0}if((Yw(b,1,d,g,1)|0)==0){m=0;i=f;return m|0}d=c[g>>2]|0;g=Jw(b,1)|0;e=sx(b,52)|0;j=e;l=e;k=c[l>>2]|0;c[e+4>>2]=d;c[l>>2]=g<<4|k&12|1;c[e+12>>2]=Ix(h)|0;if((a[(Ix(h)|0)+12|0]&64)!=0){Wx(e,c[43580]|0,16,0)|0}k=e+16|0;g=b;do{l=g+28|0;bh(c[l>>2]|0)|0;if((Ix(g|0)|0)==(g|0)){n=k}else{n=sx(g,36)|0}c[n+16>>2]=j;d=c[l>>2]|0;Hc[c[d>>2]&63](d,n,1)|0;d=c[g+24>>2]|0;Hc[c[d>>2]&63](d,n,1)|0;g=uy(g)|0;}while((g|0)!=0);if((a[(Ix(h)|0)+12|0]&64)!=0){aw(b,j)}Jx(b,e);ax(b,1,e);m=j;i=f;return m|0}function Bx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;c[53288]=b;d=rw(a,b)|0;if((d|0)!=0){e=d;while(1){d=sw(a,e,b)|0;vw(a,e,0);if((d|0)==0){break}else{e=d}}}e=c[a+28>>2]|0;Hc[c[e>>2]&63](e,213136,2)|0;e=c[a+24>>2]|0;Hc[c[e>>2]&63](e,213136,2)|0;return}function Cx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=d|0;f=d+4|0;c[53265]=c[f>>2];c[53258]=213056;g=c[b+28>>2]|0;h=Hc[c[g>>2]&63](g,213016,4)|0;if((h|0)==0){i=-1;return i|0}if((c[h+16>>2]|0)==0){i=-1;return i|0}h=b|0;if((Ix(h)|0)==(b|0)){g=rw(b,d)|0;if((g|0)!=0){j=g;while(1){g=sw(b,j,d)|0;ww(b,j)|0;if((g|0)==0){break}else{j=g}}}if((a[b+12|0]&64)!=0){bw(d)}Nx(b,d|0);ay(e);_w(b,1,c[f>>2]|0)}if((Ov(b,e,10,0,0)|0)!=0){i=-1;return i|0}if((Ix(h)|0)!=(b|0)){i=0;return i|0}tx(b,d|0);i=0;return i|0}function Dx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[(c[b+16>>2]|0)+4>>2]|0;b=c[(c[d+16>>2]|0)+4>>2]|0;if((e|0)==(b|0)){f=0;return f|0}f=e-b>>31|1;return f|0}function Ex(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=(c[c[b+16>>2]>>2]|0)>>>4;b=(c[c[d+16>>2]>>2]|0)>>>4;if((e|0)==(b|0)){f=0;return f|0}f=e-b>>31|1;return f|0}function Fx(a,b,d){a=a|0;b=b|0;d=d|0;d=c[b+16>>2]|0;if((d+16|0)==(b|0)){return}tx(c[d+12>>2]|0,b);return}function Gx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0;d=i;e=b;f=c[e>>2]|0;do{if((f&3|0)==0){if((uy(b)|0)==(a|0)){g=c[e>>2]|0;h=5;break}else{Fv(1,87664,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0)|0;i=j;k=-1;break}}else{g=f;h=5}}while(0);do{if((h|0)==5){f=g&3;if((f|0)==3|(f|0)==2){k=ww(a,b)|0;break}else if((f|0)==1){k=Cx(a,b)|0;break}else if((f|0)==0){k=Kw(b)|0;break}else{Fv(1,139728,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0)|0;i=j;k=0;break}}}while(0);i=d;return k|0}function Hx(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]&3;if((d|0)==1){e=c[a+12>>2]|0}else if((d|0)==3|(d|0)==2){e=c[(c[a+28>>2]|0)+12>>2]|0}else if((d|0)==0){e=a}else{Fv(1,111488,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0)|0;i=a;e=0}i=b;return e|0}function Ix(a){a=a|0;var b=0,d=0,e=0;b=i;d=c[a>>2]&3;if((d|0)==1){e=c[a+12>>2]|0}else if((d|0)==3|(d|0)==2){e=c[(c[a+28>>2]|0)+12>>2]|0}else if((d|0)==0){e=c[a+48>>2]|0}else{Fv(1,119456,(a=i,i=i+1|0,i=i+7&-8,c[a>>2]=0,a)|0)|0;i=a;e=0}i=b;return e|0}function Jx(b,d){b=b|0;d=d|0;var e=0;e=c[b+52>>2]|0;if((a[e+40|0]|0)==0){Tx(b,d,100,0);return}else{Kx(b,d,c[e+36>>2]|0);return}}function Kx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((d|0)==0){return}Kx(a,b,c[d+8>>2]|0);e=b;f=c[b>>2]&3;if((f|0)==0){g=c[d>>2]|0}else if((f|0)==1){g=(c[d>>2]|0)+12|0}else if((f|0)==2){g=(c[d>>2]|0)+24|0}else{return}f=c[g>>2]|0;if((f|0)==0){return}Tc[f&127](a,e,c[d+4>>2]|0);return}function Lx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=c[b+52>>2]|0;if((a[f+40|0]|0)==0){Tx(b,d,101,e);return}else{Mx(b,d,e,c[f+36>>2]|0);return}}function Mx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0;if((e|0)==0){return}Mx(a,b,d,c[e+8>>2]|0);f=b;g=c[b>>2]&3;if((g|0)==2){h=(c[e>>2]|0)+28|0}else if((g|0)==0){h=(c[e>>2]|0)+4|0}else if((g|0)==1){h=(c[e>>2]|0)+16|0}else{return}g=c[h>>2]|0;if((g|0)==0){return}Vc[g&63](a,f,c[e+4>>2]|0,d);return}function Nx(b,d){b=b|0;d=d|0;var e=0;e=c[b+52>>2]|0;if((a[e+40|0]|0)==0){Tx(b,d,102,0);return}else{Ox(b,d,c[e+36>>2]|0);return}}function Ox(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;if((d|0)==0){return}Ox(a,b,c[d+8>>2]|0);e=b;f=c[b>>2]&3;if((f|0)==2){g=(c[d>>2]|0)+32|0}else if((f|0)==0){g=(c[d>>2]|0)+8|0}else if((f|0)==1){g=(c[d>>2]|0)+20|0}else{return}f=c[g>>2]|0;if((f|0)==0){return}Tc[f&127](a,e,c[d+4>>2]|0);return}function Px(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;e=sx(a,12)|0;c[e>>2]=b;c[e+4>>2]=d;d=a+52|0;c[e+8>>2]=c[(c[d>>2]|0)+36>>2];c[(c[d>>2]|0)+36>>2]=e;return}function Qx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=(c[a+52>>2]|0)+36|0;e=c[d>>2]|0;if((e|0)==0){f=-1;return f|0}do{if((c[e>>2]|0)==(b|0)){c[d>>2]=c[e+8>>2];g=e;h=8}else{i=e;while(1){if((i|0)==0){f=-1;h=10;break}j=i+8|0;k=c[j>>2]|0;if((c[k>>2]|0)==(b|0)){break}else{i=k}}if((h|0)==10){return f|0}if((k|0)==0){l=i;break}c[j>>2]=c[k+8>>2];g=i;h=8}}while(0);do{if((h|0)==8){if((g|0)==0){f=-1}else{l=g;break}return f|0}}while(0);tx(a,l);f=0;return f|0}function Rx(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[a>>2]&3;if((e|0)==3|(e|0)==2){f=c[(c[a+28>>2]|0)+12>>2]|0}else if((e|0)==1){f=c[a+12>>2]|0}else if((e|0)==0){f=c[a+48>>2]|0}else{Fv(1,119456,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;f=0}e=b;h=c[e>>2]&3;if((h|0)==0){j=c[b+48>>2]|0}else if((h|0)==3|(h|0)==2){j=c[(c[b+28>>2]|0)+12>>2]|0}else if((h|0)==1){j=c[b+12>>2]|0}else{Fv(1,119456,(g=i,i=i+1|0,i=i+7&-8,c[g>>2]=0,g)|0)|0;i=g;j=0}if((f|0)!=(j|0)){k=0;i=d;return k|0}j=c[e>>2]&3;if((j|0)==1){k=(yx(a,c[b+4>>2]|0,0)|0)!=0|0;i=d;return k|0}else if((j|0)==0){j=b;while(1){if((j|0)==(a|0)){k=1;l=18;break}e=uy(j)|0;if((e|0)==0){k=0;l=18;break}else{j=e}}if((l|0)==18){i=d;return k|0}}else{k=(xw(a,b,0)|0)!=0|0;i=d;return k|0}return 0}function Sx(a){a=a|0;return c[a>>2]&3|0}function Tx(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;f=i;i=i+168|0;g=f|0;h=f+24|0;j=f+48|0;k=f+72|0;l=f+96|0;m=f+120|0;n=f+144|0;o=Wx(a|0,173400,44,0)|0;if((d|0)==100){p=c[b>>2]&3;if((p|0)==1){q=o+12|0}else if((p|0)==2){q=o+16|0}else if((p|0)==0){q=o+8|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;q=0}p=c[q>>2]|0;if((p|0)==0){s=Hx(b|0)|0;t=yy(s,173336,c[43326]|0)|0;c[q>>2]=t;u=t}else{u=p}p=b+4|0;c[n+8>>2]=c[p>>2];t=u|0;if((Hc[c[t>>2]&63](u,n,4)|0)!=0){i=f;return}n=sx(Hx(b|0)|0,24)|0;c[n+16>>2]=b;c[n+8>>2]=c[p>>2];c[n+12>>2]=a;if((e|0)!=0){p=sx(a,8)|0;c[n+20>>2]=p;c[p>>2]=e}Hc[c[t>>2]&63](u,n,1)|0;i=f;return}else if((d|0)==101){n=b;u=c[n>>2]&3;if((u|0)==0){v=o+8|0}else if((u|0)==1){v=o+12|0}else if((u|0)==2){v=o+16|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;v=0}u=c[v>>2]|0;if((u|0)==0){t=Hx(b|0)|0;p=yy(t,173336,c[43326]|0)|0;c[v>>2]=p;w=p}else{w=u}u=b+4|0;c[m+8>>2]=c[u>>2];if((Hc[c[w>>2]&63](w,m,4)|0)!=0){i=f;return}m=c[n>>2]&3;if((m|0)==2){x=o+40|0}else if((m|0)==0){x=o+32|0}else if((m|0)==1){x=o+36|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;x=0}m=c[x>>2]|0;if((m|0)==0){w=Hx(b|0)|0;p=yy(w,173336,c[43326]|0)|0;c[x>>2]=p;y=p}else{y=m}c[l+8>>2]=c[u>>2];if((Hc[c[y>>2]&63](y,l,4)|0)!=0){i=f;return}l=c[n>>2]&3;if((l|0)==0){z=o+20|0}else if((l|0)==1){z=o+24|0}else if((l|0)==2){z=o+28|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;z=0}l=c[z>>2]|0;if((l|0)==0){n=Hx(b|0)|0;y=yy(n,173336,c[43326]|0)|0;c[z>>2]=y;A=y}else{A=l}c[k+8>>2]=c[u>>2];l=A|0;y=Hc[c[l>>2]&63](A,k,4)|0;if((y|0)==0){k=sx(Hx(b|0)|0,24)|0;c[k+16>>2]=b;c[k+8>>2]=c[u>>2];c[k+12>>2]=a;if((e|0)!=0){u=sx(a,8)|0;c[k+20>>2]=u;c[u>>2]=e}Hc[c[l>>2]&63](A,k,1)|0;B=k}else{B=y}y=c[B+20>>2]|0;if((y|0)==0){i=f;return}else{C=y}while(1){if((c[C>>2]|0)==(e|0)){D=73;break}y=c[C+4>>2]|0;if((y|0)==0){D=73;break}else{C=y}}if((D|0)==73){i=f;return}}else if((d|0)==102){d=b;D=c[d>>2]&3;if((D|0)==0){E=o+8|0}else if((D|0)==1){E=o+12|0}else if((D|0)==2){E=o+16|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;E=0}D=c[E>>2]|0;if((D|0)==0){C=Hx(b|0)|0;y=yy(C,173336,c[43326]|0)|0;c[E>>2]=y;F=y}else{F=D}D=b+4|0;c[j+8>>2]=c[D>>2];y=F|0;E=Hc[c[y>>2]&63](F,j,4)|0;if((E|0)!=0){Hc[c[y>>2]&63](F,E,2)|0}E=c[d>>2]&3;if((E|0)==0){G=o+20|0}else if((E|0)==1){G=o+24|0}else if((E|0)==2){G=o+28|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;G=0}E=c[G>>2]|0;if((E|0)==0){F=Hx(b|0)|0;y=yy(F,173336,c[43326]|0)|0;c[G>>2]=y;H=y}else{H=E}c[h+8>>2]=c[D>>2];E=H|0;y=Hc[c[E>>2]&63](H,h,4)|0;if((y|0)!=0){Hc[c[E>>2]&63](H,y,2)|0}y=c[d>>2]&3;if((y|0)==0){I=o+32|0}else if((y|0)==1){I=o+36|0}else if((y|0)==2){I=o+40|0}else{Fv(1,135120,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;I=0}o=c[I>>2]|0;if((o|0)==0){y=Hx(b|0)|0;d=yy(y,173336,c[43326]|0)|0;c[I>>2]=d;J=d}else{J=o}c[g+8>>2]=c[D>>2];o=J|0;if((Hc[c[o>>2]&63](J,g,4)|0)!=0){i=f;return}g=sx(Hx(b|0)|0,24)|0;c[g+16>>2]=b;c[g+8>>2]=c[D>>2];c[g+12>>2]=a;if((e|0)!=0){D=sx(a,8)|0;c[g+20>>2]=D;c[D>>2]=e}Hc[c[o>>2]&63](J,g,1)|0;i=f;return}else{Fv(1,79840,(r=i,i=i+1|0,i=i+7&-8,c[r>>2]=0,r)|0)|0;i=r;i=f;return}}function Ux(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;d=c[b+20>>2]|0;a=b+12|0;if((d|0)==0){e=c[a>>2]|0;tx(e,b);return}else{f=d}while(1){d=c[f+4>>2]|0;tx(c[a>>2]|0,f);if((d|0)==0){break}else{f=d}}e=c[a>>2]|0;tx(e,b);return}function Vx(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;g=b+8|0;h=c[g>>2]|0;j=h;while(1){if((j|0)==0){k=0;l=14;break}m=c[j>>2]|0;if((m|0)==(d|0)){l=7;break}if((a[d]|0)==(a[m]|0)){if((Ya(d|0,m|0)|0)==0){l=7;break}}m=c[j+4>>2]|0;if((m|0)==(h|0)){k=0;l=14;break}else{j=m}}if((l|0)==7){d=b;m=c[d>>2]|0;if((m&4|0)==0){if((j|0)==(h|0)&(e|0)==0){k=h;i=f;return k|0}c[g>>2]=j;g=e<<2&4;c[d>>2]=m&-5|g;d=m&3;if((d-2|0)>>>0>=2>>>0){k=j;i=f;return k|0}m=(d|0)==3?b-32|0:b+32|0;c[m+8>>2]=j;b=m;c[b>>2]=c[b>>2]&-5|g;k=j;i=f;return k|0}else{if((e|0)==0){k=j;i=f;return k|0}if((h|0)==(j|0)){k=h;i=f;return k|0}Fv(1,168464,(h=i,i=i+1|0,i=i+7&-8,c[h>>2]=0,h)|0)|0;i=h;k=j;i=f;return k|0}}else if((l|0)==14){i=f;return k|0}return 0}function Wx(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=Hx(b)|0;h=b+8|0;i=c[h>>2]|0;j=i;while(1){if((j|0)==0){k=0;break}l=c[j>>2]|0;if((l|0)==(d|0)){m=7;break}if((a[d]|0)==(a[l]|0)){if((Ya(d|0,l|0)|0)==0){m=7;break}}l=c[j+4>>2]|0;if((l|0)==(i|0)){k=0;break}else{j=l}}do{if((m|0)==7){l=b;n=c[l>>2]|0;if((n&4|0)!=0){k=j;break}if((j|0)==(i|0)){k=i;break}c[h>>2]=j;c[l>>2]=n&-5;l=n&3;if((l-2|0)>>>0>=2>>>0){k=j;break}n=(l|0)==3?b-32|0:b+32|0;c[n+8>>2]=j;l=n;c[l>>2]=c[l>>2]&-5;k=j}}while(0);do{if((k|0)!=0|(e|0)==0){o=k}else{j=sx(g,e)|0;i=j;c[j>>2]=dy(g,d)|0;m=b;l=c[m>>2]&3;if((l|0)==1){n=c[h>>2]|0;do{if((n|0)==0){c[j+4>>2]=i}else{p=n+4|0;q=c[p>>2]|0;if((q|0)==(n|0)){c[p>>2]=i;c[j+4>>2]=n;break}else{c[j+4>>2]=q;c[p>>2]=i;break}}}while(0);n=c[m>>2]|0;if((n&4|0)!=0){o=i;break}c[h>>2]=i;c[m>>2]=n&-5;p=n&3;if((p-2|0)>>>0>=2>>>0){o=i;break}n=(p|0)==3?b-32|0:b+32|0;c[n+8>>2]=i;p=n;c[p>>2]=c[p>>2]&-5;o=i;break}else if((l|0)==3|(l|0)==2){p=c[h>>2]|0;do{if((p|0)==0){c[j+4>>2]=i}else{n=p+4|0;q=c[n>>2]|0;if((q|0)==(p|0)){c[n>>2]=i;c[j+4>>2]=p;break}else{c[j+4>>2]=q;c[n>>2]=i;break}}}while(0);p=c[m>>2]|0;if((p&4|0)!=0){o=i;break}c[h>>2]=i;c[m>>2]=p&-5;n=p&3;if((n-2|0)>>>0>=2>>>0){o=i;break}p=(n|0)==3?b-32|0:b+32|0;c[p+8>>2]=i;n=p;c[n>>2]=c[n>>2]&-5;o=i;break}else if((l|0)==0){n=c[h>>2]|0;do{if((n|0)==0){c[j+4>>2]=i}else{p=n+4|0;q=c[p>>2]|0;if((q|0)==(n|0)){c[p>>2]=i;c[j+4>>2]=n;break}else{c[j+4>>2]=q;c[p>>2]=i;break}}}while(0);j=c[m>>2]|0;if((j&4|0)!=0){o=i;break}c[h>>2]=i;c[m>>2]=j&-5;n=j&3;if((n-2|0)>>>0>=2>>>0){o=i;break}j=(n|0)==3?b-32|0:b+32|0;c[j+8>>2]=i;n=j;c[n>>2]=c[n>>2]&-5;o=i;break}else{o=i;break}}}while(0);if((f|0)==0){r=o;return r|0}Vx(b,d,1)|0;r=o;return r|0}function Xx(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=b;f=Hx(b)|0;g=b+8|0;h=c[g>>2]|0;i=h;while(1){if((i|0)==0){j=-1;k=18;break}l=c[i>>2]|0;if((l|0)==(d|0)){k=7;break}if((a[d]|0)==(a[l]|0)){if((Ya(d|0,l|0)|0)==0){k=7;break}}l=c[i+4>>2]|0;if((l|0)==(h|0)){j=-1;k=18;break}else{i=l}}if((k|0)==7){d=b;l=c[d>>2]|0;do{if((l&4|0)==0){if((i|0)==(h|0)){m=h;n=h;break}c[g>>2]=i;c[d>>2]=l&-5;o=l&3;if((o-2|0)>>>0>=2>>>0){m=i;n=i;break}p=(o|0)==3?b-32|0:b+32|0;c[p+8>>2]=i;o=p;c[o>>2]=c[o>>2]&-5;m=i;n=i}else{m=i;n=h}}while(0);if((m|0)==0){j=-1;return j|0}else{q=n}do{r=q+4|0;q=c[r>>2]|0;}while((q|0)!=(m|0));q=m+4|0;c[r>>2]=c[q>>2];r=c[d>>2]|0;n=r&3;do{if((n|0)==1|(n|0)==3|(n|0)==2){Ov(Ix(f|0)|0,e,26,m,0)|0}else if((n|0)==0){if((c[g>>2]|0)!=(m|0)){break}h=c[q>>2]|0;c[g>>2]=(h|0)==(m|0)?0:h;c[d>>2]=r&-5}}while(0);fy(f,c[m>>2]|0)|0;tx(f,m);j=0;return j|0}else if((k|0)==18){return j|0}return 0}function Yx(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;a=d;e=b+8|0;if((c[e>>2]|0)!=(a|0)){return}f=c[d+4>>2]|0;d=(f|0)==(a|0)?0:f;c[e>>2]=d;e=b;f=c[e>>2]|0;c[e>>2]=f&-5;e=f&3;if((e-2|0)>>>0>=2>>>0){return}f=(e|0)==3?b-36+4|0:b+32|0;c[f+8>>2]=d;d=f;c[d>>2]=c[d>>2]&-5;return}function Zx(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=(d|0)<0?-d|0:d;if((b|0)==0){Wx(a|0,c,f,e)|0;if((d|0)>-1){return}g=sy(a)|0;if((g|0)==0){return}else{h=g}do{Zx(h,0,c,d,e);h=ty(h)|0;}while((h|0)!=0);return}else if((b|0)==1|(b|0)==2|(b|0)==3){h=ux(a)|0;if((h|0)==0){return}if((b|0)==1){b=h;do{Wx(b|0,c,f,e)|0;b=vx(a,b)|0;}while((b|0)!=0);return}else{i=h}do{h=mw(a,i)|0;if((h|0)!=0){b=h;do{Wx(b|0,c,f,e)|0;b=ow(a,b)|0;}while((b|0)!=0)}i=vx(a,i)|0;}while((i|0)!=0);return}else{return}}function _x(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;if((b|0)==0){Ov(a,a|0,92,c,1)|0;return}else if((b|0)==1|(b|0)==2|(b|0)==3){d=ux(a)|0;if((d|0)==0){return}if((b|0)==1){b=d;do{Xx(b|0,c)|0;b=vx(a,b)|0;}while((b|0)!=0);return}else{e=d}do{d=mw(a,e)|0;if((d|0)!=0){b=d;do{Xx(b|0,c)|0;b=ow(a,b)|0;}while((b|0)!=0)}e=vx(a,e)|0;}while((e|0)!=0);return}else{return}}function $x(a,b,c){a=a|0;b=b|0;c=c|0;Xx(b|0,c)|0;return}function ay(a){a=a|0;var b=0,d=0,e=0;b=Hx(a|0)|0;d=a+8|0;a=c[d>>2]|0;if((a|0)==0){c[d>>2]=0;return}else{e=a}while(1){a=c[e+4>>2]|0;fy(b,c[e>>2]|0)|0;tx(b,e);if((a|0)==(c[d>>2]|0)){break}else{e=a}}c[d>>2]=0;return}function by(b){b=b|0;var d=0,e=0,f=0,g=0;if((b|0)==0){d=214176}else{d=(c[b+52>>2]|0)+20|0}e=c[d>>2]|0;if((e|0)!=0){f=e;g=Ay(b,f)|0;return g|0}e=yy(b,172584,c[43326]|0)|0;c[d>>2]=e;a[173232]=1;a[173464]=1;f=e;g=Ay(b,f)|0;return g|0}function cy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+24|0;f=e|0;if((b|0)==0){g=214176}else{g=(c[b+52>>2]|0)+20|0}h=c[g>>2]|0;if((h|0)==0){j=yy(b,172584,c[43326]|0)|0;c[g>>2]=j;a[173232]=1;a[173464]=1;k=j}else{k=h}c[f+12>>2]=d;d=Hc[c[k>>2]&63](k,f,4)|0;if((d|0)==0){l=0;i=e;return l|0}l=c[d+12>>2]|0;i=e;return l|0}function dy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+24|0;f=e|0;if((d|0)==0){g=0;i=e;return g|0}h=(b|0)==0;if(h){j=214176}else{j=(c[b+52>>2]|0)+20|0}k=c[j>>2]|0;if((k|0)==0){l=yy(b,172584,c[43326]|0)|0;c[j>>2]=l;a[173232]=1;a[173464]=1;m=l}else{m=k}c[f+12>>2]=d;k=m|0;l=Hc[c[k>>2]&63](m,f,4)|0;if((l|0)==0){f=(xF(d|0)|0)+20|0;if(h){n=dF(f)|0}else{n=sx(b,f)|0}c[n+8>>2]=1;f=n+16|0;zF(f|0,d|0)|0;c[n+12>>2]=f;Hc[c[k>>2]&63](m,n,1)|0;o=n}else{n=l+8|0;c[n>>2]=(c[n>>2]|0)+1;o=l}g=c[o+12>>2]|0;i=e;return g|0}function ey(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0;e=i;i=i+24|0;f=e|0;if((d|0)==0){g=0;i=e;return g|0}h=(b|0)==0;if(h){j=214176}else{j=(c[b+52>>2]|0)+20|0}k=c[j>>2]|0;if((k|0)==0){l=yy(b,172584,c[43326]|0)|0;c[j>>2]=l;a[173232]=1;a[173464]=1;m=l}else{m=k}c[f+12>>2]=d;k=m|0;l=Hc[c[k>>2]&63](m,f,4)|0;if((l|0)==0){f=(xF(d|0)|0)+20|0;if(h){n=dF(f)|0}else{n=sx(b,f)|0}c[n+8>>2]=a[173232]|0?-2147483647:1;f=n+16|0;zF(f|0,d|0)|0;c[n+12>>2]=f;Hc[c[k>>2]&63](m,n,1)|0;o=n}else{n=l+8|0;c[n>>2]=(c[n>>2]|0)+1;o=l}g=c[o+12>>2]|0;i=e;return g|0}function fy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0;e=i;i=i+24|0;f=e|0;if((d|0)==0){g=-1;i=e;return g|0}if((b|0)==0){h=214176}else{h=(c[b+52>>2]|0)+20|0}j=c[h>>2]|0;if((j|0)==0){k=yy(b,172584,c[43326]|0)|0;c[h>>2]=k;a[173232]=1;a[173464]=1;l=k}else{l=j}c[f+12>>2]=d;j=Hc[c[l>>2]&63](l,f,4)|0;if((j|0)==0){g=-1;i=e;return g|0}if((c[j+12>>2]|0)!=(d|0)){g=0;i=e;return g|0}d=j+8|0;f=(c[d>>2]|0)-1|0;c[d>>2]=f;if(!((f|0)==0|a[173464]^1)){g=0;i=e;return g|0}zy(b,l,j)|0;g=0;i=e;return g|0}function gy(b){b=b|0;var d=0;if((b|0)==0){d=0;return d|0}d=(a[173232]|0?-2147483648:0)&c[b-8>>2];return d|0}function hy(b){b=b|0;var d=0;if((b|0)==0){return}d=b-8|0;c[d>>2]=c[d>>2]|(a[173232]|0?-2147483648:0);return}function iy(a,b){a=a|0;b=b|0;c[53838]=a;c[53678]=b;c[44744]=0;return}function jy(){var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,_a=0,$a=0,ab=0,bb=0;e=i;i=i+2088|0;f=e|0;g=e+1024|0;h=e+2048|0;j=e+2064|0;k=e+2072|0;l=e+2080|0;if(!(a[76488]|0)){a[76488]=1;if((c[53308]|0)==0){c[53308]=1}if((c[53304]|0)==0){c[53304]=c[q>>2]}if((c[53296]|0)==0){c[53296]=c[p>>2]}m=c[53324]|0;if((m|0)==0){n=10}else{o=c[53320]|0;r=c[m+(o<<2)>>2]|0;if((r|0)==0){n=10}else{s=o;t=m;u=r}}if((n|0)==10){ky();r=ly(c[53304]|0,16384)|0;c[(c[53324]|0)+(c[53320]<<2)>>2]=r;r=c[53320]|0;m=c[53324]|0;s=r;t=m;u=c[m+(r<<2)>>2]|0}r=t+(s<<2)|0;c[53310]=c[u+16>>2];u=c[(c[r>>2]|0)+8>>2]|0;c[53318]=u;c[53294]=u;c[53304]=c[c[r>>2]>>2];a[213264]=a[u]|0}u=l|0;a:while(1){l=c[53318]|0;a[l]=a[213264]|0;r=(c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]|0)+(c[53308]|0)|0;s=l;t=l;b:while(1){l=r;m=s;while(1){o=c[76496+(d[m]<<2)>>2]&255;if((b[78488+(l<<1)>>1]|0)==0){v=l;w=o}else{c[53312]=l;c[53314]=m;v=l;w=o}c:while(1){o=w&255;x=v;do{y=(b[78280+(x<<1)>>1]|0)+o|0;if((b[77736+(y<<1)>>1]|0)==(x|0)){break c}z=b[77528+(x<<1)>>1]|0;x=z<<16>>16;}while(z<<16>>16<=88);v=x;w=c[76304+(o<<2)>>2]&255}z=b[75760+(y<<1)>>1]|0;A=m+1|0;if((b[78280+(z<<1)>>1]|0)==224){B=z;C=A;D=t;break}else{l=z;m=A}}d:while(1){m=D;l=B;A=C;e:while(1){z=b[78488+(l<<1)>>1]|0;if(z<<16>>16==0){E=c[53314]|0;F=b[78488+(c[53312]<<1)>>1]|0}else{E=A;F=z}c[53294]=D;z=E;c[53302]=z-m;a[213264]=a[E]|0;a[E]=0;c[53318]=E;G=F<<16>>16;f:while(1){switch(G|0){case 4:{n=36;break b;break};case 18:{n=83;break a;break};case 19:{n=86;break a;break};case 5:{n=38;break b;break};case 21:{n=96;break b;break};case 3:{n=33;break b;break};case 15:{n=76;break a;break};case 16:{n=78;break a;break};case 17:{n=80;break a;break};case 2:{n=30;break b;break};case 0:{break f;break};case 14:{n=72;break a;break};case 11:{n=64;break a;break};case 12:{n=66;break a;break};case 24:{n=111;break b;break};case 25:{n=114;break b;break};case 1:{n=28;break a;break};case 9:{n=60;break b;break};case 30:{n=154;break b;break};case 31:{n=162;break a;break};case 32:{n=165;break b;break};case 29:{n=145;break b;break};case 33:{break};case 10:{n=62;break b;break};case 20:{n=89;break a;break};case 6:{n=40;break b;break};case 7:{n=43;break b;break};case 8:{n=45;break b;break};case 28:{n=137;break b;break};case 26:{n=122;break b;break};case 27:{n=127;break b;break};case 13:{n=68;break a;break};case 22:{n=101;break a;break};case 23:{n=104;break b;break};case 34:case 35:case 36:case 37:{H=0;n=238;break a;break};default:{n=237;break a}}I=z-(c[53294]|0)|0;J=I-1|0;a[E]=a[213264]|0;K=c[53320]|0;L=c[53324]|0;M=L+(K<<2)|0;N=c[M>>2]|0;if((c[N+44>>2]|0)==0){c[53310]=c[N+16>>2];c[c[M>>2]>>2]=c[53304];c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+44>>2]=1;M=c[53320]|0;O=c[53324]|0;P=M;Q=O;R=c[O+(M<<2)>>2]|0}else{P=K;Q=L;R=N}N=c[53318]|0;L=c[53310]|0;K=c[R+4>>2]|0;S=c[53294]|0;if(N>>>0<=(K+L|0)>>>0){break e}if(N>>>0>(K+(L+1)|0)>>>0){n=188;break a}L=N-S|0;if((c[R+40>>2]|0)==0){T=(L|0)==1?1:2;U=S;V=P;W=Q}else{N=L-1|0;if((N|0)>0){L=0;M=S;O=K;while(1){a[O]=a[M]|0;K=L+1|0;if((K|0)<(N|0)){L=K;M=M+1|0;O=O+1|0}else{break}}O=c[53320]|0;M=c[53324]|0;X=O;Y=M;Z=c[M+(O<<2)>>2]|0}else{X=P;Y=Q;Z=R}if((c[Z+44>>2]|0)==2){c[53310]=0;c[(c[Y+(X<<2)>>2]|0)+16>>2]=0}else{O=c[Z+12>>2]|0;M=O-N-1|0;if((M|0)==0){L=Z;K=c[53318]|0;_=O;while(1){$=L+4|0;O=c[$>>2]|0;if((c[L+20>>2]|0)==0){n=199;break a}aa=_<<1;if((aa|0)==0){ba=(_>>>3)+_|0}else{ba=aa}c[L+12>>2]=ba;aa=gF(O,ba+2|0)|0;c[$>>2]=aa;if((aa|0)==0){n=203;break a}ca=aa+(K-O)|0;c[53318]=ca;O=c[(c[53324]|0)+(c[53320]<<2)>>2]|0;aa=c[O+12>>2]|0;da=aa-N-1|0;if((da|0)==0){L=O;K=ca;_=aa}else{ea=da;fa=O;break}}}else{ea=M;fa=Z}_=Hc[c[c[(c[53838]|0)+8>>2]>>2]&63](c[53678]|0,(c[fa+4>>2]|0)+N|0,ea>>>0>8192>>>0?8192:ea)|0;c[53310]=_;c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+16>>2]=_}do{if((c[53310]|0)==0){if((N|0)==0){my(c[53304]|0);ga=1;break}else{c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+44>>2]=2;ga=2;break}}else{ga=0}}while(0);M=c[53310]|0;_=M+N|0;K=c[53320]|0;L=c[53324]|0;O=c[L+(K<<2)>>2]|0;if(_>>>0>(c[O+12>>2]|0)>>>0){da=gF(c[O+4>>2]|0,_+(M>>>1)|0)|0;c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+4>>2]=da;da=c[53320]|0;_=c[53324]|0;if((c[(c[_+(da<<2)>>2]|0)+4>>2]|0)==0){n=213;break a}ha=da;ia=_;ja=c[53310]|0}else{ha=K;ia=L;ja=M}M=ja+N|0;c[53310]=M;a[(c[(c[ia+(ha<<2)>>2]|0)+4>>2]|0)+M|0]=0;a[(c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+4>>2]|0)+((c[53310]|0)+1)|0]=0;M=c[53320]|0;L=c[53324]|0;K=c[(c[L+(M<<2)>>2]|0)+4>>2]|0;c[53294]=K;T=ga;U=K;V=M;W=L}if((T|0)==0){break d}else if((T|0)==2){n=227;break e}else if((T|0)!=1){continue a}a[77520]=0;c[53318]=U;G=(((c[53308]|0)-1|0)/2|0)+34|0}a[E]=a[213264]|0;l=c[53312]|0;A=c[53314]|0}if((n|0)==227){n=0;A=W+(V<<2)|0;l=(c[(c[A>>2]|0)+4>>2]|0)+(c[53310]|0)|0;c[53318]=l;m=(c[(c[A>>2]|0)+28>>2]|0)+(c[53308]|0)|0;if(U>>>0<l>>>0){ka=m;la=U}else{B=m;C=l;D=U;continue}while(1){m=a[la]|0;if(m<<24>>24==0){ma=1}else{ma=c[76496+((m&255)<<2)>>2]&255}if((b[78488+(ka<<1)>>1]|0)==0){na=ma;oa=ka}else{c[53312]=ka;c[53314]=la;na=ma;oa=ka}g:while(1){m=na&255;A=oa;do{pa=(b[78280+(A<<1)>>1]|0)+m|0;if((b[77736+(pa<<1)>>1]|0)==(A|0)){break g}G=b[77528+(A<<1)>>1]|0;A=G<<16>>16;}while(G<<16>>16<=88);na=c[76304+(m<<2)>>2]&255;oa=A}N=b[75760+(pa<<1)>>1]|0;G=la+1|0;if(G>>>0<l>>>0){ka=N;la=G}else{B=N;C=l;D=U;continue d}}}l=S+J|0;c[53318]=l;N=(c[(c[Q+(P<<2)>>2]|0)+28>>2]|0)+(c[53308]|0)|0;if((J|0)>0){G=N;z=S;while(1){o=a[z]|0;if(o<<24>>24==0){qa=1}else{qa=c[76496+((o&255)<<2)>>2]&255}if((b[78488+(G<<1)>>1]|0)==0){ra=qa;sa=G}else{c[53312]=G;c[53314]=z;ra=qa;sa=G}h:while(1){o=ra&255;x=sa;do{ta=(b[78280+(x<<1)>>1]|0)+o|0;if((b[77736+(ta<<1)>>1]|0)==(x|0)){break h}L=b[77528+(x<<1)>>1]|0;x=L<<16>>16;}while(L<<16>>16<=88);ra=c[76304+(o<<2)>>2]&255;sa=x}A=b[75760+(ta<<1)>>1]|0;m=z+1|0;if(m>>>0<l>>>0){G=A;z=m}else{ua=A;break}}}else{ua=N}if((b[78488+(ua<<1)>>1]|0)!=0){c[53312]=ua;c[53314]=l}z=b[78280+(ua<<1)>>1]|0;if((b[77736+(z+1<<1)>>1]|0)==(ua|0)){va=z}else{z=ua;while(1){G=b[77528+(z<<1)>>1]|0;A=G<<16>>16;m=b[78280+(A<<1)>>1]|0;if((b[77736+(m+1<<1)>>1]|0)==G<<16>>16){va=m;break}else{z=A}}}z=b[75760+(va+1<<1)>>1]|0;wa=z<<16>>16==88?0:z<<16>>16;if((wa|0)==0){B=ua;C=l;D=S}else{n=186;break}}if((n|0)==186){n=0;z=S+I|0;c[53318]=z;r=wa;s=z;t=S;continue}z=U+J|0;c[53318]=z;N=(c[(c[W+(V<<2)>>2]|0)+28>>2]|0)+(c[53308]|0)|0;if((J|0)>0){xa=N;ya=U}else{r=N;s=z;t=U;continue}while(1){N=a[ya]|0;if(N<<24>>24==0){za=1}else{za=c[76496+((N&255)<<2)>>2]&255}if((b[78488+(xa<<1)>>1]|0)==0){Aa=za;Ba=xa}else{c[53312]=xa;c[53314]=ya;Aa=za;Ba=xa}i:while(1){N=Aa&255;A=Ba;do{Ca=(b[78280+(A<<1)>>1]|0)+N|0;if((b[77736+(Ca<<1)>>1]|0)==(A|0)){break i}m=b[77528+(A<<1)>>1]|0;A=m<<16>>16;}while(m<<16>>16<=88);Aa=c[76304+(N<<2)>>2]&255;Ba=A}l=b[75760+(Ca<<1)>>1]|0;m=ya+1|0;if(m>>>0<z>>>0){xa=l;ya=m}else{r=l;s=z;t=U;continue b}}}if((n|0)==30){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[5104]=(c[5104]|0)+1;continue}else if((n|0)==33){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[53308]=3;continue}else if((n|0)==36){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==38){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==40){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[53308]=1;continue}else if((n|0)==43){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==45){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}t=c[53294]|0;s=t+1|0;r=(Za(s|0,134168,4)|0)==0;z=r?t+5|0:s;s=ac(z|0,131560,(Da=i,i=i+24|0,c[Da>>2]=k,c[Da+8>>2]=u,c[Da+16>>2]=j,Da)|0)|0;i=Da;if((s|0)<=0){continue}c[5104]=(c[k>>2]|0)-1;if((s|0)<=1){continue}s=z+(c[j>>2]|0)|0;z=s;while(1){t=a[z]|0;if((t<<24>>24|0)==34|(t<<24>>24|0)==0){break}z=z+1|0}if((z|0)==(s|0)){continue}a[z]=0;t=z-s|0;r=c[43712]|0;if((r|0)<(t|0)){if((r|0)==0){Ea=dF(t+1|0)|0}else{Ea=gF(c[43714]|0,t+1|0)|0}c[43714]=Ea;c[43712]=t;Fa=Ea}else{Fa=c[43714]|0}zF(Fa|0,s|0)|0;c[53674]=c[43714];continue}else if((n|0)==60){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==62){n=0;t=c[53302]|0;if((t|0)==0){continue}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10;continue}else if((n|0)==96){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}c[53308]=5;t=c[53536]|0;if((t|0)==0){r=dF(1024)|0;c[53536]=r;c[53532]=r+1024;Ga=r}else{Ga=t}c[53526]=Ga;a[Ga]=0;continue}else if((n|0)==104){n=0;t=c[53302]|0;if((t|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(t-1)|0]|0)==10}t=c[53526]|0;if(t>>>0>(c[53536]|0)>>>0){r=t-1|0;c[53526]=r;Ha=r}else{Ha=t}c[53526]=Ha+1;a[Ha]=34;t=c[53526]|0;r=c[53532]|0;if(t>>>0<r>>>0){Ia=t}else{l=c[53536]|0;m=l;G=r-m<<1;r=gF(l,G)|0;c[53536]=r;c[53532]=r+G;G=r+(t-m)|0;c[53526]=G;Ia=G}c[53526]=Ia+1;a[Ia]=0;continue}else if((n|0)==111){n=0;G=c[53302]|0;if((G|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(G-1)|0]|0)==10}c[5104]=(c[5104]|0)+1;continue}else if((n|0)==114){n=0;G=c[53302]|0;if((G|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(G-1)|0]|0)==10}G=c[53294]|0;m=c[53526]|0;if(m>>>0>(c[53536]|0)>>>0){t=m-1|0;c[53526]=t;Ja=t}else{Ja=m}m=a[G]|0;c[53526]=Ja+1;a[Ja]=m;if(m<<24>>24==0){continue}else{Ka=G}while(1){G=Ka+1|0;m=c[53526]|0;t=c[53532]|0;if(m>>>0<t>>>0){La=m}else{r=c[53536]|0;l=r;L=t-l<<1;t=gF(r,L)|0;c[53536]=t;c[53532]=t+L;L=t+(m-l)|0;c[53526]=L;La=L}L=a[G]|0;c[53526]=La+1;a[La]=L;if(L<<24>>24==0){continue a}else{Ka=G}}}else if((n|0)==122){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}c[53308]=7;c[44700]=1;s=c[53536]|0;if((s|0)==0){z=dF(1024)|0;c[53536]=z;c[53532]=z+1024;Na=z}else{Na=s}c[53526]=Na;a[Na]=0;continue}else if((n|0)==127){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}s=(c[44700]|0)-1|0;c[44700]=s;if((s|0)==0){n=136;break}s=c[53294]|0;z=c[53526]|0;if(z>>>0>(c[53536]|0)>>>0){G=z-1|0;c[53526]=G;Oa=G}else{Oa=z}z=a[s]|0;c[53526]=Oa+1;a[Oa]=z;if(z<<24>>24==0){continue}else{Pa=s}while(1){s=Pa+1|0;z=c[53526]|0;G=c[53532]|0;if(z>>>0<G>>>0){Qa=z}else{L=c[53536]|0;l=L;m=G-l<<1;G=gF(L,m)|0;c[53536]=G;c[53532]=G+m;m=G+(z-l)|0;c[53526]=m;Qa=m}m=a[s]|0;c[53526]=Qa+1;a[Qa]=m;if(m<<24>>24==0){continue a}else{Pa=s}}}else if((n|0)==137){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}c[44700]=(c[44700]|0)+1;s=c[53294]|0;m=c[53526]|0;if(m>>>0>(c[53536]|0)>>>0){l=m-1|0;c[53526]=l;Ra=l}else{Ra=m}m=a[s]|0;c[53526]=Ra+1;a[Ra]=m;if(m<<24>>24==0){continue}else{Sa=s}while(1){s=Sa+1|0;m=c[53526]|0;l=c[53532]|0;if(m>>>0<l>>>0){Ta=m}else{z=c[53536]|0;G=z;L=l-G<<1;l=gF(z,L)|0;c[53536]=l;c[53532]=l+L;L=l+(m-G)|0;c[53526]=L;Ta=L}L=a[s]|0;c[53526]=Ta+1;a[Ta]=L;if(L<<24>>24==0){continue a}else{Sa=s}}}else if((n|0)==145){n=0;s=c[53302]|0;if((s|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(s-1)|0]|0)==10}s=c[53294]|0;L=c[53526]|0;if(L>>>0>(c[53536]|0)>>>0){G=L-1|0;c[53526]=G;Ua=G}else{Ua=L}L=a[s]|0;c[53526]=Ua+1;a[Ua]=L;if(L<<24>>24!=0){L=s;do{L=L+1|0;s=c[53526]|0;G=c[53532]|0;if(s>>>0<G>>>0){Va=s}else{m=c[53536]|0;l=m;z=G-l<<1;G=gF(m,z)|0;c[53536]=G;c[53532]=G+z;z=G+(s-l)|0;c[53526]=z;Va=z}z=a[L]|0;c[53526]=Va+1;a[Va]=z;}while(z<<24>>24!=0)}c[5104]=(c[5104]|0)+1;continue}else if((n|0)==154){n=0;L=c[53302]|0;if((L|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(L-1)|0]|0)==10}L=c[53294]|0;z=c[53526]|0;if(z>>>0>(c[53536]|0)>>>0){l=z-1|0;c[53526]=l;Wa=l}else{Wa=z}z=a[L]|0;c[53526]=Wa+1;a[Wa]=z;if(z<<24>>24==0){continue}else{Xa=L}while(1){L=Xa+1|0;z=c[53526]|0;l=c[53532]|0;if(z>>>0<l>>>0){Ya=z}else{s=c[53536]|0;G=s;m=l-G<<1;l=gF(s,m)|0;c[53536]=l;c[53532]=l+m;m=l+(z-G)|0;c[53526]=m;Ya=m}m=a[L]|0;c[53526]=Ya+1;a[Ya]=m;if(m<<24>>24==0){continue a}else{Xa=L}}}else if((n|0)==165){n=0;L=c[53302]|0;if((L|0)==0){_a=0}else{c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(L-1)|0]|0)==10;_a=c[53302]|0}Ma(c[53294]|0,_a|0,1,c[53296]|0)|0;continue}}if((n|0)==28){_a=c[53302]|0;if((_a|0)==0){H=-1;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=-1;i=e;return H|0}else if((n|0)==64){_a=c[53302]|0;if((_a|0)==0){H=259;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=259;i=e;return H|0}else if((n|0)==66){_a=c[53302]|0;if((_a|0)==0){H=260;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=260;i=e;return H|0}else if((n|0)==68){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}if((c[44744]|0)!=0){H=258;i=e;return H|0}c[44744]=258;H=258;i=e;return H|0}else if((n|0)==72){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}if((c[44744]|0)!=0){H=261;i=e;return H|0}c[44744]=261;H=261;i=e;return H|0}else if((n|0)==76){_a=c[53302]|0;if((_a|0)==0){H=263;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=263;i=e;return H|0}else if((n|0)==78){_a=c[53302]|0;if((_a|0)==0){H=262;i=e;return H|0}c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;H=262;i=e;return H|0}else if((n|0)==80){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}H=(c[44744]|0)==261?264:45;i=e;return H|0}else if((n|0)==83){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}H=(c[44744]|0)==258?264:45;i=e;return H|0}else if((n|0)==86){_a=c[53302]|0;if((_a|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10}c[53300]=dy(c[53854]|0,c[53294]|0)|0;H=267;i=e;return H|0}else if((n|0)==89){_a=c[53302]|0;if((_a|0)==0){$a=-1}else{c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(_a-1)|0]|0)==10;$a=(c[53302]|0)-1|0}_a=g|0;g=c[53294]|0;Xa=a[g+$a|0]|0;if(((Xa&255)-48|0)>>>0<10>>>0|Xa<<24>>24==46){ab=g}else{g=c[53674]|0;Iv(h,1024,f|0);Lv(h,142776)|0;Lv(h,c[53294]|0)|0;nb(_a|0,139064,(Da=i,i=i+8|0,c[Da>>2]=c[5104],Da)|0)|0;i=Da;Lv(h,_a)|0;Lv(h,(g|0)==0?145136:g)|0;Lv(h,136512)|0;g=h+4|0;_a=c[g>>2]|0;if(_a>>>0<(c[h+8>>2]|0)>>>0){bb=_a}else{Jv(h,1)|0;bb=c[g>>2]|0}a[bb]=0;bb=c[h>>2]|0;c[g>>2]=bb;Fv(0,bb,(Da=i,i=i+1|0,i=i+7&-8,c[Da>>2]=0,Da)|0)|0;i=Da;Mv(h);h=(c[53302]|0)-1|0;a[E]=a[213264]|0;E=D+h|0;c[53318]=E;c[53294]=D;c[53302]=h;a[213264]=a[E]|0;a[E]=0;c[53318]=E;ab=c[53294]|0}c[53300]=dy(c[53854]|0,ab)|0;H=267;i=e;return H|0}else if((n|0)==101){ab=c[53302]|0;if((ab|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(ab-1)|0]|0)==10}c[53308]=1;c[53300]=dy(c[53854]|0,c[53536]|0)|0;H=268;i=e;return H|0}else if((n|0)==136){c[53308]=1;c[53300]=ey(c[53854]|0,c[53536]|0)|0;H=268;i=e;return H|0}else if((n|0)==162){ab=c[53302]|0;if((ab|0)!=0){c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+28>>2]=(a[(c[53294]|0)+(ab-1)|0]|0)==10}H=a[c[53294]|0]|0;i=e;return H|0}else if((n|0)==188){ny(159416);return 0}else if((n|0)==199){c[$>>2]=0;ny(154408);return 0}else if((n|0)==203){ny(154408);return 0}else if((n|0)==213){ny(148936);return 0}else if((n|0)==237){ny(163776);return 0}else if((n|0)==238){i=e;return H|0}return 0}function ky(){var a=0,b=0,d=0;a=c[53324]|0;if((a|0)==0){b=dF(4)|0;d=b;c[53324]=d;if((b|0)==0){ny(163504)}c[d>>2]=0;c[53322]=1;c[53320]=0;return}d=c[53322]|0;if((c[53320]|0)>>>0<(d-1|0)>>>0){return}b=d+8|0;d=gF(a,b<<2)|0;a=d;c[53324]=a;if((d|0)==0){ny(163504)}vF(a+(c[53322]<<2)|0,0,32)|0;c[53322]=b;return}function ly(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=dF(48)|0;f=e;if((e|0)==0){ny(131672);return 0}c[e+12>>2]=d;g=dF(d+2|0)|0;c[e+4>>2]=g;if((g|0)==0){ny(131672);return 0}c[e+20>>2]=1;d=Vb()|0;h=c[d>>2]|0;c[e+16>>2]=0;a[g]=0;a[g+1|0]=0;c[e+8>>2]=g;c[e+28>>2]=1;c[e+44>>2]=0;g=c[53324]|0;if((g|0)==0){i=0}else{i=c[g+(c[53320]<<2)>>2]|0}if((i|0)==(f|0)){i=g+(c[53320]<<2)|0;c[53310]=c[(c[i>>2]|0)+16>>2];j=c[(c[i>>2]|0)+8>>2]|0;c[53318]=j;c[53294]=j;c[53304]=c[c[i>>2]>>2];a[213264]=a[j]|0;c[e>>2]=b;c[e+40>>2]=1;k=10}else{c[e>>2]=b;c[e+40>>2]=1;if((g|0)==0){l=0}else{k=10}}if((k|0)==10){l=c[g+(c[53320]<<2)>>2]|0}if((l|0)!=(f|0)){c[e+32>>2]=1;c[e+36>>2]=0}if((b|0)==0){m=0;n=e+24|0;o=n;c[o>>2]=m;c[d>>2]=h;return f|0}m=(Ob(Ta(b|0)|0)|0)>0|0;n=e+24|0;o=n;c[o>>2]=m;c[d>>2]=h;return f|0}function my(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;d=c[53324]|0;if((d|0)==0){e=3}else{if((c[d+(c[53320]<<2)>>2]|0)==0){e=3}else{f=d;e=5}}do{if((e|0)==3){ky();d=ly(c[53304]|0,16384)|0;c[(c[53324]|0)+(c[53320]<<2)>>2]=d;d=c[53324]|0;if((d|0)!=0){f=d;e=5;break}d=Vb()|0;g=0;h=d;i=c[d>>2]|0}}while(0);do{if((e|0)==5){d=c[f+(c[53320]<<2)>>2]|0;j=Vb()|0;k=c[j>>2]|0;if((d|0)==0){g=0;h=j;i=k;break}c[d+16>>2]=0;l=d+4|0;a[c[l>>2]|0]=0;a[(c[l>>2]|0)+1|0]=0;c[d+8>>2]=c[l>>2];c[d+28>>2]=1;c[d+44>>2]=0;l=c[53324]|0;if((l|0)==0){m=0}else{m=c[l+(c[53320]<<2)>>2]|0}if((m|0)!=(d|0)){g=d;h=j;i=k;break}n=l+(c[53320]<<2)|0;c[53310]=c[(c[n>>2]|0)+16>>2];l=c[(c[n>>2]|0)+8>>2]|0;c[53318]=l;c[53294]=l;c[53304]=c[c[n>>2]>>2];a[213264]=a[l]|0;g=d;h=j;i=k}}while(0);c[g>>2]=b;c[g+40>>2]=1;m=c[53324]|0;if((m|0)==0){o=0}else{o=c[m+(c[53320]<<2)>>2]|0}if((o|0)!=(g|0)){c[g+32>>2]=1;c[g+36>>2]=0}if((b|0)==0){p=0}else{p=(Ob(Ta(b|0)|0)|0)>0|0}c[g+24>>2]=p;c[h>>2]=i;i=(c[53324]|0)+(c[53320]<<2)|0;c[53310]=c[(c[i>>2]|0)+16>>2];h=c[(c[i>>2]|0)+8>>2]|0;c[53318]=h;c[53294]=h;c[53304]=c[c[i>>2]>>2];a[213264]=a[h]|0;return}function ny(a){a=a|0;var b=0;gc(c[o>>2]|0,168432,(b=i,i=i+8|0,c[b>>2]=a,b)|0)|0;i=b;mb(2)}function oy(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=i;i=i+2064|0;e=d+2048|0;Iv(e,1024,d|0);f=c[53674]|0;if((f|0)!=0){Lv(e,f)|0;Lv(e,98096)|0}Lv(e,b)|0;b=d+1024|0;nb(b|0,92536,(f=i,i=i+8|0,c[f>>2]=c[5104],f)|0)|0;i=f;Lv(e,b)|0;Lv(e,c[53294]|0)|0;Lv(e,87168)|0;b=e+4|0;g=c[b>>2]|0;if(g>>>0<(c[e+8>>2]|0)>>>0){h=g}else{Jv(e,1)|0;h=c[b>>2]|0}a[h]=0;h=c[e>>2]|0;c[b>>2]=h;Fv(0,h,(f=i,i=i+1|0,i=i+7&-8,c[f>>2]=0,f)|0)|0;i=f;Mv(e);i=d;return}function py(){var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;b=c[53294]|0;d=c[53318]|0;a[d]=a[213264]|0;e=c[53320]|0;f=c[53324]|0;g=c[f+(e<<2)>>2]|0;h=c[g+4>>2]|0;if(d>>>0>=(h+2|0)>>>0){i=b;j=d;k=j-1|0;a[k]=64;c[53294]=i;l=a[k]|0;a[213264]=l;c[53318]=k;return}m=(c[53310]|0)+2|0;n=c[g+12>>2]|0;g=h+(n+2)|0;o=h+m|0;if((m|0)>0){m=g;h=o;do{h=h-1|0;m=m-1|0;a[m]=a[h]|0;p=c[53320]|0;q=c[53324]|0;r=c[q+(p<<2)>>2]|0;}while(h>>>0>(c[r+4>>2]|0)>>>0);s=m;t=h;u=c[r+12>>2]|0;v=p;w=q}else{s=g;t=o;u=n;v=e;w=f}f=s-t|0;t=d+f|0;c[53310]=u;c[(c[w+(v<<2)>>2]|0)+16>>2]=u;if(t>>>0<((c[(c[(c[53324]|0)+(c[53320]<<2)>>2]|0)+4>>2]|0)+2|0)>>>0){ny(82416)}else{i=b+f|0;j=t;k=j-1|0;a[k]=64;c[53294]=i;l=a[k]|0;a[213264]=l;c[53318]=k;return}}function qy(){var b=0,d=0,e=0;b=c[53324]|0;if((b|0)==0){return}d=c[b+(c[53320]<<2)>>2]|0;if((d|0)==0){return}c[d+16>>2]=0;b=d+4|0;a[c[b>>2]|0]=0;a[(c[b>>2]|0)+1|0]=0;c[d+8>>2]=c[b>>2];c[d+28>>2]=1;c[d+44>>2]=0;b=c[53324]|0;if((b|0)==0){e=0}else{e=c[b+(c[53320]<<2)>>2]|0}if((e|0)!=(d|0)){return}d=b+(c[53320]<<2)|0;c[53310]=c[(c[d>>2]|0)+16>>2];b=c[(c[d>>2]|0)+8>>2]|0;c[53318]=b;c[53294]=b;c[53304]=c[c[d>>2]>>2];a[213264]=a[b]|0;return}function ry(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;f=i;i=i+120|0;g=f|0;h=f+56|0;j=f+112|0;do{if((d|0)!=0){if((Yw(b,0,d,j,0)|0)==0){break}k=c[j>>2]|0;l=b+40|0;By(b,c[l>>2]|0,174032);c[h+4>>2]=k;k=c[l>>2]|0;l=Hc[c[k>>2]&63](k,h|0,4)|0;if((l|0)==0){break}else{m=l}i=f;return m|0}}while(0);if((e|0)==0){m=0;i=f;return m|0}if((Yw(b,0,d,j,1)|0)==0){m=0;i=f;return m|0}d=c[j>>2]|0;j=b+40|0;By(b,c[j>>2]|0,174032);c[g+4>>2]=d;e=c[j>>2]|0;j=Hc[c[e>>2]&63](e,g|0,4)|0;if((j|0)==0){g=sx(b,56)|0;c[g+52>>2]=c[b+52>>2];e=g+12|0;h=c[b+12>>2]|0;c[e>>2]=h;a[e]=h&255&-9;c[g+44>>2]=b;c[g+48>>2]=c[b+48>>2];c[g+4>>2]=d;n=Iw(g)|0}else{n=j}ax(b,0,n|0);m=n;i=f;return m|0}function sy(a){a=a|0;var b=0;b=c[a+40>>2]|0;return Hc[c[b>>2]&63](b,0,128)|0}function ty(a){a=a|0;var b=0,d=0,e=0;b=c[a+44>>2]|0;if((b|0)==0){d=0;return d|0}e=c[b+40>>2]|0;d=Hc[c[e>>2]&63](e,a|0,8)|0;return d|0}function uy(a){a=a|0;return c[a+44>>2]|0}function vy(a,b){a=a|0;b=b|0;var d=0;d=c[a+40>>2]|0;return Hc[c[d>>2]&63](d,b|0,2)|0}function wy(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[53852]|0;a=(b|0)!=0;do{if((e|0)==0){if(a){eF(b);f=0;break}else{f=dF(d)|0;break}}else{if(a){tx(e,b);f=0;break}else{f=sx(e,d)|0;break}}}while(0);return f|0}function xy(a,b,d){a=a|0;b=b|0;d=d|0;d=c[53852]|0;if((d|0)==0){eF(b);return}else{tx(d,b);return}}function yy(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=b+28|0;f=c[e>>2]|0;c[e>>2]=114;c[53852]=a;a=$g(b,d)|0;c[e>>2]=f;c[53852]=0;return a|0}function zy(a,b,d){a=a|0;b=b|0;d=d|0;c[53852]=a;return Hc[c[b>>2]&63](b,d,2)|0}function Ay(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=(Wg(b,0,0)|0)+28|0;e=c[d>>2]|0;c[d>>2]=114;c[53852]=a;if((Vg(b)|0)!=0){f=1;return f|0}c[d>>2]=e;c[53852]=0;f=0;return f|0}function By(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)==0){return}if((Wg(b,0,0)|0)==(c|0)){return}Wg(b,c,0)|0;return}function Cy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0;if((b|0)==0){e=117688;return e|0}if((a[b]|0)==0){e=117688;return e|0}f=d+1|0;a[d]=34;g=a[b]|0;if(((g&255)-48|0)>>>0<10>>>0|g<<24>>24==46){h=1}else{h=g<<24>>24==45|0}do{if(g<<24>>24==0){a[f]=34;a[d+2|0]=0;i=169768;j=126080}else{k=b+1|0;l=f;m=g;n=0;o=0;p=0;q=h;r=0;a:while(1){b:do{if((r|0)==0){s=k;t=l;u=m;v=n;w=o;x=p;y=q;while(1){z=u&255;do{if(u<<24>>24==34){a[t]=92;A=y;B=1;C=w;D=t+1|0}else{if((y|0)==0){E=u<<24>>24!=95&(tb(z|0)|0)==0&u<<24>>24>-1;A=0;B=E?1:x;C=w;D=t;break}if((u<<24>>24|0)==46){E=(w|0)==0;A=E?y:0;B=E?x:1;C=w+1|0;D=t;break}else if((u<<24>>24|0)==45){E=(v|0)==0;A=E?y:0;B=E?x:1;C=w;D=t;break}else{E=(z-48|0)>>>0<10>>>0;A=E?y:0;B=E?x:1;C=w;D=t;break}}}while(0);z=D+1|0;a[D]=u;E=s+1|0;F=a[s]|0;G=v+1|0;H=c[43162]|0;do{if((H|0)==0){I=B;J=G;K=z}else{if(F<<24>>24==0|(G|0)<(H|0)){I=B;J=G;K=z;break}if((tb(u<<24>>24|0)|0)!=0){L=1;M=A;N=B;O=C;P=G;Q=F;R=z;S=E;break b}T=a[D]|0;if(T<<24>>24<0|(T-45&255)>>>0<2>>>0|T<<24>>24==92){L=1;M=A;N=B;O=C;P=G;Q=F;R=z;S=E;break b}if(F<<24>>24>-1&(((tb(F&255|0)|0)!=0|F<<24>>24==46|F<<24>>24==45)^1)){L=1;M=A;N=B;O=C;P=G;Q=F;R=z;S=E;break b}a[z]=92;a[D+2|0]=10;I=1;J=0;K=D+3|0}}while(0);if(F<<24>>24==0){U=K;V=J;W=I;break a}else{s=E;t=K;u=F;v=J;w=C;x=I;y=A}}}else{y=k;x=l;w=m;v=n;u=o;t=p;s=q;c:while(1){z=w&255;do{if(w<<24>>24==34){a[x]=92;X=s;Y=1;Z=u;_=x+1|0}else{if((s|0)==0){G=w<<24>>24!=95&(tb(z|0)|0)==0&w<<24>>24>-1;X=0;Y=G?1:t;Z=u;_=x;break}if((w<<24>>24|0)==45){G=(v|0)==0;X=G?s:0;Y=G?t:1;Z=u;_=x;break}else if((w<<24>>24|0)==46){G=(u|0)==0;X=G?s:0;Y=G?t:1;Z=u+1|0;_=x;break}else{G=(z-48|0)>>>0<10>>>0;X=G?s:0;Y=G?t:1;Z=u;_=x;break}}}while(0);$=_+1|0;a[_]=w;aa=y+1|0;ba=a[y]|0;z=v+1|0;do{if((c[43162]|0)==0){ca=Y;da=z;ea=$}else{F=ba&255;E=ba<<24>>24==0;if(E){U=$;V=z;W=Y;break a}do{if((tb(w<<24>>24|0)|0)==0){G=a[_]|0;if(G<<24>>24<0|(G-45&255)>>>0<2>>>0|G<<24>>24==92){break}if(!(ba<<24>>24>-1&(((tb(F|0)|0)!=0|ba<<24>>24==46|ba<<24>>24==45)^1))){break c}}}while(0);if(E|(z|0)<(c[43162]|0)){ca=Y;da=z;ea=$;break}if((tb(a[_]|0)|0)!=0){L=1;M=X;N=Y;O=Z;P=z;Q=ba;R=$;S=aa;break b}G=a[_]|0;if(G<<24>>24<0|(G-45&255)>>>0<2>>>0|G<<24>>24==92){L=1;M=X;N=Y;O=Z;P=z;Q=ba;R=$;S=aa;break b}if(ba<<24>>24>-1&(((tb(F|0)|0)!=0|ba<<24>>24==46|ba<<24>>24==45)^1)){L=1;M=X;N=Y;O=Z;P=z;Q=ba;R=$;S=aa;break b}a[$]=92;a[_+2|0]=10;ca=1;da=0;ea=_+3|0}}while(0);if(ba<<24>>24==0){U=ea;V=da;W=ca;break a}else{y=aa;x=ea;w=ba;v=da;u=Z;t=ca;s=X}}a[$]=92;a[_+2|0]=10;L=0;M=X;N=1;O=Z;P=0;Q=ba;R=_+3|0;S=aa}}while(0);if(Q<<24>>24==0){U=R;V=P;W=N;break}else{k=S;l=R;m=Q;n=P;o=O;p=N;q=M;r=L}}a[U]=34;a[U+1|0]=0;if((W|0)!=0){e=d;return e|0}if((V|0)!=1){i=169768;j=126080;break}if(((a[b]|0)-45&255)>>>0<2>>>0){e=d}else{i=169768;j=126080;break}return e|0}}while(0);while(1){V=i+4|0;if((pm(j,b)|0)==0){e=d;fa=49;break}W=c[V>>2]|0;if((W|0)==0){e=b;fa=49;break}else{i=V;j=W}}if((fa|0)==49){return e|0}return 0}function Dy(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=((xF(b|0)|0)<<1)+2|0;e=d>>>0>1024>>>0?d:1024;d=c[44748]|0;if((e|0)>(c[44750]|0)){if((d|0)==0){f=dF(e)|0}else{f=gF(d,e)|0}c[44748]=f;c[44750]=e;g=f}else{g=d}if((gy(b)|0)==0){h=Cy(b,g)|0;return h|0}a[g]=60;d=g+1|0;f=a[b]|0;if(f<<24>>24==0){i=g;j=d}else{e=b;b=d;d=f;while(1){f=e+1|0;a[b]=d;k=b+1|0;l=a[f]|0;if(l<<24>>24==0){i=b;j=k;break}else{e=f;b=k;d=l}}}a[j]=62;a[i+2|0]=0;h=g;return h|0}function Ey(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;d=b|0;e=$w(d)|0;do{if((e|0)!=0){if((a[e]|0)==37){break}else{f=0}return f|0}}while(0);e=Vv(d)|0;a:do{if((e|0)!=0){g=Vv(uy(b)|0)|0;if((g|0)==0){break}h=bh(c[(Vv(Ix(d)|0)|0)+8>>2]|0)|0;if((h|0)<=0){break}i=c[e+12>>2]|0;j=g+12|0;g=0;b:while(1){k=c[i+(g<<2)>>2]|0;do{if((k|0)!=0){l=c[(c[j>>2]|0)+(g<<2)>>2]|0;if((l|0)==0){break}if((Ya(k|0,l|0)|0)!=0){f=0;break b}}}while(0);g=g+1|0;if((g|0)>=(h|0)){break a}}return f|0}}while(0);e=Uv(b,0)|0;if((e|0)==0){f=1;return f|0}if((bh(c[e+8>>2]|0)|0)>0){f=0;return f|0}else{return(bh(c[e+12>>2]|0)|0)<1|0}return 0}function Fy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;c[53668]=0;e=ew(b|0,141056)|0;do{if((e|0)!=0){if(((a[e]|0)-48|0)>>>0>=10>>>0){break}f=Ja(e|0,0,10)|0;if(!((f|0)==0|(f|0)>59)){break}c[43162]=f}}while(0);Gy(b,1);if((Hy(b,d,1)|0)==-1){g=-1;return g|0}if((Iy(b,d)|0)==-1){g=-1;return g|0}e=(c[53668]|0)-1|0;c[53668]=e;f=b+52|0;a:do{if((e|0)>0){b=e;while(1){b=b-1|0;if((Oc[c[(c[(c[f>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){g=-1;break}if((b|0)<=0){break a}}return g|0}}while(0);if((Oc[c[(c[(c[f>>2]|0)+8>>2]|0)+4>>2]&255](d,161536)|0)==-1){g=-1;return g|0}c[43162]=128;g=Ec[c[(c[(c[f>>2]|0)+8>>2]|0)+8>>2]&63](d)|0;return g|0}function Gy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a;c[d>>2]=c[d>>2]&-9;d=sy(a)|0;if((d|0)!=0){e=d;do{Gy(e,0);e=ty(e)|0;}while((e|0)!=0)}if((b|0)==0){return}b=ux(a)|0;if((b|0)==0){return}else{f=b}do{b=f;c[b>>2]=c[b>>2]&-9;b=mw(a,f)|0;if((b|0)!=0){e=b;do{b=e;c[b>>2]=c[b>>2]&-9;e=ow(a,e)|0;}while((e|0)!=0)}f=vx(a,f)|0;}while((f|0)!=0);return}function Hy(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;f=b;if((e|0)==0){if((uy(b)|0)==0){g=3}else{h=0;i=213448;j=151608}}else{g=3}if((g|0)==3){k=(a[b+12|0]&1)==0?213448:148768;l=(Pw(b)|0)==0;c[53512]=Wv(b,2,142576,0)|0;c[53684]=Wv(b,2,139520,0)|0;h=1;i=l?213448:145552;j=k}k=$w(b|0)|0;if((k|0)==0){g=6}else{if((a[k]|0)==37){g=6}else{m=136888;n=k}}if((g|0)==6){m=213448;n=213448}g=c[53668]|0;k=b+52|0;a:do{if((g|0)>0){l=g;while(1){l=l-1|0;if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){o=-1;break}if((l|0)<=0){break a}}return o|0}}while(0);if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,i)|0)==-1){o=-1;return o|0}do{if(!((a[n]|0)==0&(h|0)==0)){if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,j)|0)==-1){o=-1;return o|0}if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,133952)|0)==-1){o=-1;return o|0}if((a[n]|0)==0){break}i=Dy(n)|0;if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,i)|0)==-1){o=-1}else{break}return o|0}}while(0);if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,m)|0)==-1){o=-1;return o|0}if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](d,131968)|0)==-1){o=-1;return o|0}c[53668]=(c[53668]|0)+1;k=Uv(b,0)|0;do{if((k|0)!=0){if((Oy(b,d,129280,c[k+16>>2]|0,e)|0)==-1){o=-1;return o|0}if((Oy(b,d,126080,c[k+8>>2]|0,e)|0)==-1){o=-1;return o|0}if((Oy(b,d,123600,c[k+12>>2]|0,e)|0)==-1){o=-1}else{break}return o|0}}while(0);c[f>>2]=c[f>>2]|8;o=0;return o|0}function Iy(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0;e=i;i=i+24|0;if((Jy(b,d)|0)==-1){f=-1;i=e;return f|0}g=Uv(Ix(b|0)|0,0)|0;h=ux(b)|0;if((h|0)==0){f=0;i=e;return f|0}j=(g|0)==0;k=e|0;l=g+12|0;m=g+8|0;g=h;a:while(1){h=g;if((Ky(b,g,(c[h>>2]|0)>>>4)|0)!=0){if(j){n=0}else{n=c[m>>2]|0}if((Ly(g,d,n)|0)==-1){f=-1;o=43;break}}p=mw(b,g)|0;if((p|0)!=0){q=g;r=p;while(1){p=r;s=r-32|0;t=c[((c[p>>2]&3|0)==2?r:s)+28>>2]|0;do{if((q|0)==(t|0)){u=q}else{if((Ky(b,t,(c[h>>2]|0)>>>4)|0)==0){u=q;break}if(j){v=0}else{v=c[m>>2]|0}if((Ly(c[((c[p>>2]&3|0)==2?r:s)+28>>2]|0,d,v)|0)==-1){f=-1;o=43;break a}u=c[((c[p>>2]&3|0)==2?r:s)+28>>2]|0}}while(0);t=sy(b)|0;b:do{if((t|0)==0){o=19}else{w=t;while(1){if((Ey(w)|0)==0){if((xw(w,r,0)|0)!=0){break b}}x=ty(w)|0;if((x|0)==0){o=19;break}else{w=x}}}}while(0);if((o|0)==19){o=0;if(j){y=0}else{y=c[l>>2]|0}t=c[p>>2]&3;w=c[((t|0)==3?r:r+32|0)+28>>2]|0;x=c[((t|0)==2?r:s)+28>>2]|0;t=w|0;z=Hx(t)|0;A=c[53668]|0;B=z+52|0;if((A|0)>0){z=A;do{z=z-1|0;if((Oc[c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){f=-1;o=43;break a}}while((z|0)>0)}z=$w(t)|0;s=Hx(t)|0;if((z|0)==0){nb(k|0,160056,(C=i,i=i+8|0,c[C>>2]=c[w+4>>2],C)|0)|0;i=C;if((Oc[c[(c[(c[s+52>>2]|0)+8>>2]|0)+4>>2]&255](d,k)|0)==-1){f=-1;o=43;break a}}else{A=Dy(z)|0;if((Oc[c[(c[(c[s+52>>2]|0)+8>>2]|0)+4>>2]&255](d,A)|0)==-1){f=-1;o=43;break a}}if((My(r,d,c[53512]|0)|0)==-1){f=-1;o=43;break a}A=(Nw(Hx(t)|0)|0)!=0;if((Oc[c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]&255](d,A?116312:109e3)|0)==-1){f=-1;o=43;break a}A=x|0;s=$w(A)|0;z=Hx(A)|0;if((s|0)==0){nb(k|0,160056,(C=i,i=i+8|0,c[C>>2]=c[x+4>>2],C)|0)|0;i=C;if((Oc[c[(c[(c[z+52>>2]|0)+8>>2]|0)+4>>2]&255](d,k)|0)==-1){f=-1;o=43;break a}}else{A=Dy(s)|0;if((Oc[c[(c[(c[z+52>>2]|0)+8>>2]|0)+4>>2]&255](d,A)|0)==-1){f=-1;o=43;break a}}if((My(r,d,c[53684]|0)|0)==-1){f=-1;o=43;break a}A=r|0;do{if((c[p>>2]&8|0)==0){if((Ny(A,d,y)|0)==-1){f=-1;o=43;break a}}else{z=$w(A)|0;s=Hx(A)|0;if((z|0)==0){break}if((a[z]|0)==0){break}D=s+52|0;if((Oc[c[(c[(c[D>>2]|0)+8>>2]|0)+4>>2]&255](d,97624)|0)==-1){f=-1;o=43;break a}s=Dy(z)|0;if((Oc[c[(c[(c[D>>2]|0)+8>>2]|0)+4>>2]&255](d,s)|0)==-1){f=-1;o=43;break a}if((Oc[c[(c[(c[D>>2]|0)+8>>2]|0)+4>>2]&255](d,92088)|0)==-1){f=-1;o=43;break a}}}while(0);if((Oc[c[(c[(c[B>>2]|0)+8>>2]|0)+4>>2]&255](d,103256)|0)==-1){f=-1;o=43;break a}}A=ow(b,r)|0;if((A|0)==0){break}else{q=u;r=A}}}r=vx(b,g)|0;if((r|0)==0){f=0;o=43;break}else{g=r}}if((o|0)==43){i=e;return f|0}return 0}function Jy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;d=sy(a)|0;if((d|0)==0){e=0;return e|0}else{f=d}a:while(1){if((Ey(f)|0)==0){if((Hy(f,b,0)|0)==-1){e=-1;g=11;break}if((Iy(f,b)|0)==-1){e=-1;g=11;break}d=(c[53668]|0)-1|0;c[53668]=d;a=f+52|0;if((d|0)>0){h=d;do{h=h-1|0;if((Oc[c[(c[(c[a>>2]|0)+8>>2]|0)+4>>2]&255](b,130632)|0)==-1){e=-1;g=11;break a}}while((h|0)>0)}if((Oc[c[(c[(c[a>>2]|0)+8>>2]|0)+4>>2]&255](b,161536)|0)==-1){e=-1;g=11;break}}else{Jy(f,b)|0}h=ty(f)|0;if((h|0)==0){e=0;g=11;break}else{f=h}}if((g|0)==11){return e|0}return 0}function Ky(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0;e=sy(a)|0;a:do{if((e|0)!=0){f=e;while(1){if((Ey(f)|0)==0){if((zx(f,b,0)|0)!=0){g=0;break}}f=ty(f)|0;if((f|0)==0){break a}}return g|0}}while(0);if((c[b>>2]|0)>>>4>>>0<d>>>0){g=0;return g|0}e=pw(a,b)|0;b:do{if((e|0)!=0){f=e;while(1){if((c[c[f+28>>2]>>2]|0)>>>4>>>0<d>>>0){g=0;break}f=qw(a,f)|0;if((f|0)==0){break b}}return g|0}}while(0);do{if((pw(a,b)|0)==0){if((mw(a,b)|0)==0){g=1}else{break}return g|0}}while(0);a=Vv(b|0)|0;if((a|0)==0){g=0;return g|0}b=a+8|0;d=c[b>>2]|0;e=Hc[c[d>>2]&63](d,0,128)|0;if((e|0)==0){g=0;return g|0}d=a+12|0;a=e;while(1){if((c[(c[d>>2]|0)+(c[a+16>>2]<<2)>>2]|0)!=(c[a+12>>2]|0)){g=1;h=16;break}e=c[b>>2]|0;f=Hc[c[e>>2]&63](e,a,8)|0;if((f|0)==0){g=0;h=16;break}else{a=f}}if((h|0)==16){return g|0}return 0}function Ly(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+24|0;f=e|0;g=a|0;h=Hx(g)|0;j=c[53668]|0;k=h+52|0;a:do{if((j|0)>0){h=j;while(1){h=h-1|0;if((Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](b,130632)|0)==-1){l=-1;break}if((h|0)<=0){break a}}i=e;return l|0}}while(0);j=f|0;f=$w(g)|0;h=Hx(g)|0;do{if((f|0)==0){nb(j|0,160056,(m=i,i=i+8|0,c[m>>2]=c[a+4>>2],m)|0)|0;i=m;if((Oc[c[(c[(c[h+52>>2]|0)+8>>2]|0)+4>>2]&255](b,j)|0)==-1){l=-1}else{break}i=e;return l|0}else{m=Dy(f)|0;if((Oc[c[(c[(c[h+52>>2]|0)+8>>2]|0)+4>>2]&255](b,m)|0)==-1){l=-1}else{break}i=e;return l|0}}while(0);do{if((c[a>>2]&8|0)==0){if((Ny(g,b,d)|0)==-1){l=-1}else{break}i=e;return l|0}}while(0);l=Oc[c[(c[(c[k>>2]|0)+8>>2]|0)+4>>2]&255](b,103256)|0;i=e;return l|0}function My(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0;if((e|0)==0){f=0;return f|0}g=b|0;b=Hx(g)|0;h=fw(g,e)|0;if((a[h]|0)==0){f=0;return f|0}e=b+52|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,164120)|0)==-1){f=-1;return f|0}do{if((gy(h)|0)==0){b=gb(h|0,58)|0;if((b|0)==0){g=((xF(h|0)|0)<<1)+2|0;i=g>>>0>1024>>>0?g:1024;g=c[44748]|0;if((i|0)>(c[44750]|0)){if((g|0)==0){j=dF(i)|0}else{j=gF(g,i)|0}c[44748]=j;c[44750]=i;k=j}else{k=g}g=Cy(h,k)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,g)|0)==-1){f=-1}else{break}return f|0}a[b]=0;g=((xF(h|0)|0)<<1)+2|0;i=g>>>0>1024>>>0?g:1024;g=c[44748]|0;if((i|0)>(c[44750]|0)){if((g|0)==0){l=dF(i)|0}else{l=gF(g,i)|0}c[44748]=l;c[44750]=i;m=l}else{m=g}g=Cy(h,m)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,g)|0)==-1){f=-1;return f|0}if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,164120)|0)==-1){f=-1;return f|0}g=b+1|0;i=((xF(g|0)|0)<<1)+2|0;n=i>>>0>1024>>>0?i:1024;i=c[44748]|0;if((n|0)>(c[44750]|0)){if((i|0)==0){o=dF(n)|0}else{o=gF(i,n)|0}c[44748]=o;c[44750]=n;p=o}else{p=i}i=Cy(g,p)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,i)|0)==-1){f=-1;return f|0}else{a[b]=58;break}}else{b=Dy(h)|0;if((Oc[c[(c[(c[e>>2]|0)+8>>2]|0)+4>>2]&255](d,b)|0)==-1){f=-1}else{break}return f|0}}while(0);f=0;return f|0}function Ny(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=b;do{if(((c[f>>2]&3)-2|0)>>>0<2>>>0){g=$w(b)|0;h=Hx(b)|0;if((g|0)==0){i=0;break}if((a[g]|0)==0){i=0;break}j=h+52|0;if((Oc[c[(c[(c[j>>2]|0)+8>>2]|0)+4>>2]&255](d,97624)|0)==-1){k=-1;return k|0}h=Dy(g)|0;if((Oc[c[(c[(c[j>>2]|0)+8>>2]|0)+4>>2]&255](d,h)|0)==-1){k=-1}else{i=1;break}return k|0}else{i=0}}while(0);h=Vv(b)|0;j=Hx(b)|0;a:do{if((h|0)==0){l=i}else{b=e|0;g=Hc[c[b>>2]&63](e,0,128)|0;if((g|0)==0){l=i;break}m=h+12|0;n=j+52|0;o=g;g=i;b:while(1){do{if(((c[f>>2]&3)-2|0)>>>0<2>>>0){p=c[53512]|0;if((p|0)!=0){if((c[o+16>>2]|0)==(c[p+16>>2]|0)){q=g;break}}p=c[53684]|0;if((p|0)==0){r=14;break}if((c[o+16>>2]|0)==(c[p+16>>2]|0)){q=g}else{r=14}}else{r=14}}while(0);do{if((r|0)==14){r=0;p=o+16|0;if((c[(c[m>>2]|0)+(c[p>>2]<<2)>>2]|0)==(c[o+12>>2]|0)){q=g;break}s=g+1|0;do{if((g|0)==0){t=c[53668]|0;if((t|0)>0){u=t;do{u=u-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){k=-1;r=33;break b}}while((u|0)>0)}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,86840)|0)==-1){k=-1;r=33;break b}c[53668]=(c[53668]|0)+1}else{if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,82040)|0)==-1){k=-1;r=33;break b}u=c[53668]|0;if((u|0)>0){v=u}else{break}do{v=v-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){k=-1;r=33;break b}}while((v|0)>0)}}while(0);u=Dy(c[o+8>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){k=-1;r=33;break b}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,168256)|0)==-1){k=-1;r=33;break b}u=Dy(c[(c[m>>2]|0)+(c[p>>2]<<2)>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){k=-1;r=33;break b}else{q=s}}}while(0);u=Hc[c[b>>2]&63](e,o,8)|0;if((u|0)==0){l=q;break a}else{o=u;g=q}}if((r|0)==33){return k|0}}}while(0);do{if((l|0)>0){if((Oc[c[(c[(c[j+52>>2]|0)+8>>2]|0)+4>>2]&255](d,92088)|0)==-1){k=-1;return k|0}else{c[53668]=(c[53668]|0)-1;break}}}while(0);c[f>>2]=c[f>>2]|8;k=0;return k|0}function Oy(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;h=(g|0)!=0;if(h){i=0}else{i=fh(f,0)|0}g=f|0;j=Hc[c[g>>2]&63](f,0,128)|0;do{if((j|0)==0){k=34}else{l=(i|0)==0;m=i|0;n=b+52|0;o=0;p=j;a:while(1){q=p+12|0;r=c[q>>2]|0;if((r|0)==0){k=7}else{if((a[r]|0)==0){k=7}else{k=12}}do{if((k|0)==7){k=0;if((a[p+22|0]|0)!=0){k=12;break}if(l){s=o;break}r=Hc[c[m>>2]&63](i,p,4)|0;t=c[r+12>>2]|0;if((t|0)!=0){if((a[t]|0)!=0){k=12;break}}if((a[r+22|0]|0)==0){k=12}else{s=o}}}while(0);if((k|0)==12){k=0;r=o+1|0;do{if((o|0)==0){t=c[53668]|0;if((t|0)>0){u=t;do{u=u-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){v=-1;k=36;break a}}while((u|0)>0)}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,e)|0)==-1){v=-1;k=36;break a}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,86840)|0)==-1){v=-1;k=36;break a}c[53668]=(c[53668]|0)+1}else{if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,82040)|0)==-1){v=-1;k=36;break a}u=c[53668]|0;if((u|0)>0){w=u}else{break}do{w=w-1|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){v=-1;k=36;break a}}while((w|0)>0)}}while(0);u=Dy(c[p+8>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){v=-1;k=36;break}if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,168256)|0)==-1){v=-1;k=36;break}u=Dy(c[q>>2]|0)|0;if((Oc[c[(c[(c[n>>2]|0)+8>>2]|0)+4>>2]&255](d,u)|0)==-1){v=-1;k=36;break}else{s=r}}u=Hc[c[g>>2]&63](f,p,8)|0;if((u|0)==0){k=27;break}else{o=s;p=u}}if((k|0)==27){if((s|0)<=0){k=34;break}c[53668]=(c[53668]|0)-1;p=b+52|0;b:do{if((s|0)>1){if((Oc[c[(c[(c[p>>2]|0)+8>>2]|0)+4>>2]&255](d,121736)|0)==-1){v=-1;return v|0}o=c[53668]|0;if((o|0)>0){x=o}else{break}while(1){x=x-1|0;if((Oc[c[(c[(c[p>>2]|0)+8>>2]|0)+4>>2]&255](d,130632)|0)==-1){v=-1;break}if((x|0)<=0){break b}}return v|0}}while(0);r=(Oc[c[(c[(c[p>>2]|0)+8>>2]|0)+4>>2]&255](d,120864)|0)==-1;if(r|h){v=r<<31>>31}else{break}return v|0}else if((k|0)==36){return v|0}}}while(0);do{if((k|0)==34){if(h){v=0}else{break}return v|0}}while(0);fh(f,i)|0;v=0;return v|0}function Py(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0;f=i;i=i+8|0;g=f|0;h=g;j=ux(d)|0;if((j|0)==0){k=0;i=f;return k|0}l=d+8|0;m=c[o>>2]|0;n=0;p=0;q=j;j=0;while(1){r=mw(d,q)|0;if((r|0)==0){s=n;t=p;u=j}else{v=r;r=n;w=p;x=j;while(1){y=c[v>>2]&3;z=c[((y|0)==2?v:v-32|0)+28>>2]|0;A=(b[(c[v+8>>2]|0)+168>>1]|0)==0;do{if((q|0)==(z|0)){if(A){B=x;C=w;D=r;break}if((w|0)==0){E=jk(96)|0;c[E+84>>2]=jk(((Lw(d)|0)<<5)+11520|0)|0;F=E}else{F=w}Gt(F,v,c[(c[l>>2]|0)+236>>2]|0);B=x;C=F;D=r}else{if(A){B=x;C=w;D=r;break}E=c[((y|0)==3?v:v+32|0)+28>>2]|0;G=z+8|0;H=c[(c[G>>2]|0)+212>>2]|0;I=E+8|0;J=c[(c[I>>2]|0)+212>>2]|0;K=jk(12)|0;L=K;if((a[(c[G>>2]|0)+118|0]|0)==0){M=z|0;N=H}else{M=H;N=c[(c[(c[H+8>>2]|0)+132>>2]|0)+48>>2]|0}if((a[(c[I>>2]|0)+118|0]|0)==0){O=E|0;P=J}else{O=J;P=c[(c[(c[J+8>>2]|0)+132>>2]|0)+48>>2]|0}J=c[(c[(c[N+8>>2]|0)+132>>2]|0)+44>>2]|0;E=c[(c[(c[P+8>>2]|0)+132>>2]|0)+44>>2]|0;do{if((J|0)>(E|0)){I=M;H=J;G=N;while(1){Qy(L,G,I,0,e);Q=G|0;R=H-1|0;S=c[(c[(c[G+8>>2]|0)+132>>2]|0)+48>>2]|0;if((R|0)>(E|0)){I=Q;H=R;G=S}else{T=Q;U=O;V=S;W=P;break}}}else{if((E|0)>(J|0)){X=O;Y=E;Z=P}else{T=M;U=O;V=N;W=P;break}while(1){Qy(L,Z,X,0,e);G=Z|0;H=Y-1|0;I=c[(c[(c[Z+8>>2]|0)+132>>2]|0)+48>>2]|0;if((H|0)>(J|0)){X=G;Y=H;Z=I}else{T=M;U=G;V=N;W=I;break}}}}while(0);if((V|0)==(W|0)){_=U;$=T;aa=W}else{J=U;E=T;I=W;G=V;while(1){Qy(L,G,0,E,e);Qy(L,I,J,0,e);H=G|0;S=c[(c[(c[G+8>>2]|0)+132>>2]|0)+48>>2]|0;Q=I|0;R=c[(c[(c[I+8>>2]|0)+132>>2]|0)+48>>2]|0;if((S|0)==(R|0)){_=Q;$=H;aa=S;break}else{J=Q;E=H;I=R;G=S}}}Qy(L,aa,_,$,e);G=K+8|0;I=K;if((Hs(c[G>>2]|0,c[I>>2]|0)|0)==0){if((a[213992]|0)==0){B=1;C=w;D=L;break}Ma(155176,50,1,m|0)|0;B=1;C=w;D=L;break}E=IB(c[G>>2]|0,c[I>>2]|0)|0;if((E|0)==0){Fv(0,116504,(J=i,i=i+1|0,i=i+7&-8,c[J>>2]=0,J)|0)|0;i=J;B=1;C=w;D=L;break}if((v|0)!=0){J=v;do{S=J+8|0;R=(c[S>>2]|0)+144|0;It(h,J,E,0,c[G>>2]|0,c[I>>2]|0);H=R;R=c[g+4>>2]|0;c[H>>2]=c[g>>2];c[H+4>>2]=R;Jt(d,J,c[G>>2]|0,c[I>>2]|0,0);J=c[(c[S>>2]|0)+172>>2]|0;}while((J|0)!=0)}c[I>>2]=0;B=x;C=w;D=L}}while(0);z=ow(d,v)|0;if((z|0)==0){s=D;t=C;u=B;break}else{v=z;r=D;w=C;x=B}}}x=vx(d,q)|0;if((x|0)==0){break}else{n=s;p=t;q=x;j=u}}if((s|0)!=0){eF(c[s+8>>2]|0);eF(s)}if((t|0)==0){k=u;i=f;return k|0}eF(c[t+84>>2]|0);eF(t);k=u;i=f;return k|0}function Qy(b,d,e,f,i){b=b|0;d=d|0;e=e|0;f=f|0;i=i|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0.0,G=0.0,H=0.0,I=0;j=ux(d)|0;if((j|0)!=0){k=e;l=f;m=b+4|0;n=b|0;o=b+8|0;p=j;do{j=c[p+8>>2]|0;do{if(!((c[j+212>>2]|0)!=(d|0)|(p|0)==(k|0)|(p|0)==(l|0))){if((a[j+118|0]|0)!=0){break}q=Ht(p,i,0)|0;r=c[m>>2]|0;s=c[o>>2]|0;do{if((r|0)==(c[n>>2]|0)){if((s|0)==0){t=kk(400)|0;c[o>>2]=t;c[m>>2]=100;u=t;break}else{c[m>>2]=r<<1;t=mk(s,r<<3)|0;c[o>>2]=t;u=t;break}}else{u=s}}while(0);s=c[n>>2]|0;c[n>>2]=s+1;c[u+(s<<2)>>2]=q}}while(0);p=vx(d,p)|0;}while((p|0)!=0)}p=d+8|0;d=c[p>>2]|0;if((c[d+172>>2]|0)<1){return}u=e;e=f;f=i+8|0;n=i|0;o=i+4|0;i=b+4|0;m=b|0;l=b+8|0;b=1;k=d;while(1){d=c[(c[k+176>>2]|0)+(b<<2)>>2]|0;if((d|0)==(u|0)|(d|0)==(e|0)){v=k}else{j=jk(8)|0;s=j;r=c[d+8>>2]|0;w=+h[r+16>>3];x=+h[r+24>>3];y=+h[r+32>>3];z=+h[r+40>>3];c[j+4>>2]=4;r=jk(64)|0;d=j;c[d>>2]=r;if((a[f]|0)==0){A=+g[n>>2];B=+g[o>>2];C=(w+y)*.5*(A+-1.0);D=(x+z)*.5*(B+-1.0);E=z*B-D;F=y*A-C;G=x*B-D;H=w*A-C}else{C=+g[n>>2];A=+g[o>>2];E=z+A;F=y+C;G=x-A;H=w-C}h[r>>3]=H;h[(c[d>>2]|0)+8>>3]=G;h[(c[d>>2]|0)+16>>3]=H;h[(c[d>>2]|0)+24>>3]=E;h[(c[d>>2]|0)+32>>3]=F;h[(c[d>>2]|0)+40>>3]=E;h[(c[d>>2]|0)+48>>3]=F;h[(c[d>>2]|0)+56>>3]=G;d=c[i>>2]|0;r=c[l>>2]|0;do{if((d|0)==(c[m>>2]|0)){if((r|0)==0){j=kk(400)|0;c[l>>2]=j;c[i>>2]=100;I=j;break}else{c[i>>2]=d<<1;j=mk(r,d<<3)|0;c[l>>2]=j;I=j;break}}else{I=r}}while(0);r=c[m>>2]|0;c[m>>2]=r+1;c[I+(r<<2)>>2]=s;v=c[p>>2]|0}if((b|0)<(c[v+172>>2]|0)){b=b+1|0;k=v}else{break}}return}function Ry(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;f=i;i=i+128|0;g=f|0;h=jk(Lw(b)|0)|0;j=b+8|0;k=c[c[(c[j>>2]|0)+132>>2]>>2]|0;do{if((k|0)==0){l=0;m=0}else{n=g|0;o=$w(b|0)|0;p=c[53848]|0;nb(n|0,126592,(q=i,i=i+16|0,c[q>>2]=o,c[q+8>>2]=p,q)|0)|0;i=q;p=ry(b,n,1)|0;Wx(p|0,154280,272,1)|0;n=jk(56)|0;o=p+8|0;c[(c[o>>2]|0)+132>>2]=n;c[c[(c[o>>2]|0)+132>>2]>>2]=k;c[(c[(c[o>>2]|0)+132>>2]|0)+4>>2]=c[(c[(c[j>>2]|0)+132>>2]|0)+4>>2];o=c[k+4>>2]|0;if((o|0)==0){l=p;m=1;break}else{r=k;s=o}while(1){if((a[h+(c[(c[s+8>>2]|0)+120>>2]|0)|0]|0)==0){Sy(b,s,p,h)}o=c[r+20>>2]|0;if((o|0)==0){l=p;m=1;break}else{r=r+16|0;s=o}}}}while(0);s=ux(b)|0;if((s|0)==0){t=m;u=l;v=0}else{r=g|0;k=b|0;j=m;m=l;l=s;s=0;while(1){p=c[l+8>>2]|0;do{if((a[h+(c[p+120>>2]|0)|0]|0)==0){if((a[p+119|0]|0)!=3){w=s;x=m;y=j;break}if((m|0)==0){o=$w(k)|0;n=(c[53848]|0)+j|0;nb(r|0,126592,(q=i,i=i+16|0,c[q>>2]=o,c[q+8>>2]=n,q)|0)|0;i=q;n=ry(b,r,1)|0;Wx(n|0,154280,272,1)|0;o=jk(56)|0;c[(c[n+8>>2]|0)+132>>2]=o;z=n;A=j+1|0}else{z=m;A=j}Sy(b,l,z,h);w=1;x=z;y=A}else{w=s;x=m;y=j}}while(0);p=vx(b,l)|0;if((p|0)==0){t=y;u=x;v=w;break}else{j=y;m=x;l=p;s=w}}}if((u|0)!=0){jv(u)|0}u=ux(b)|0;if((u|0)==0){B=t}else{w=g|0;g=b|0;s=t;t=u;while(1){if((a[h+(c[(c[t+8>>2]|0)+120>>2]|0)|0]|0)==0){u=$w(g)|0;l=(c[53848]|0)+s|0;nb(w|0,123560,(q=i,i=i+16|0,c[q>>2]=u,c[q+8>>2]=l,q)|0)|0;i=q;l=ry(b,w,1)|0;Wx(l|0,154280,272,1)|0;u=jk(56)|0;c[(c[l+8>>2]|0)+132>>2]=u;Sy(b,t,l,h);jv(l)|0;C=s+1|0}else{C=s}l=vx(b,t)|0;if((l|0)==0){B=C;break}else{s=C;t=l}}}eF(h);c[53848]=(c[53848]|0)+B;if((d|0)!=0){c[d>>2]=B}if((e|0)!=0){c[e>>2]=v}v=jk((B<<2)+4|0)|0;e=sy(b)|0;if((e|0)==0){D=B;E=v}else{b=B;B=e;e=v;while(1){d=e+4|0;c[e>>2]=B;h=b-1|0;t=ty(B)|0;if((t|0)==0){D=h;E=d;break}else{b=h;B=t;e=d}}}if((D|0)==0){c[E>>2]=0;i=f;return v|0}else{cc(114768,107904,134,170616);return 0}return 0}function Sy(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0;a[f+(c[(c[d+8>>2]|0)+120>>2]|0)|0]=1;zx(e,d,1)|0;g=rw(b,d)|0;if((g|0)==0){return}else{h=g}do{g=c[h>>2]&3;i=c[((g|0)==3?h:h+32|0)+28>>2]|0;if((i|0)==(d|0)){j=c[((g|0)==2?h:h-32|0)+28>>2]|0}else{j=i}if((a[f+(c[(c[j+8>>2]|0)+120>>2]|0)|0]|0)==0){Sy(b,j,e,f)}h=sw(b,h,d)|0;}while((h|0)!=0);return}function Ty(b){b=b|0;var d=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,p=0.0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=i;i=i+8|0;f=d|0;Zx(b,1,102216,304,1);bn(b)|0;g=jk(((Lw(b)|0)<<2)+4|0)|0;j=b+8|0;c[(c[j>>2]|0)+144>>2]=g;g=ux(b)|0;if((g|0)!=0){k=g;g=0;while(1){Ym(k);l=k|0;m=jk(e[(c[(Hx(l)|0)+8>>2]|0)+168>>1]<<3)|0;n=k+8|0;c[(c[n>>2]|0)+132>>2]=m;vn(k,c[(c[(Hx(l)|0)+8>>2]|0)+116>>2]&1);c[(c[(c[j>>2]|0)+144>>2]|0)+(g<<2)>>2]=k;c[(c[n>>2]|0)+120>>2]=g;n=vx(b,k)|0;if((n|0)==0){break}else{k=n;g=g+1|0}}}g=Wv(b,2,145056,0)|0;k=ux(b)|0;if((k|0)!=0){n=k;do{k=mw(b,n)|0;if((k|0)!=0){l=k;do{k=l|0;Wx(k,91160,176,1)|0;p=+Fm(k,c[53750]|0,1.0,0.0);m=l+8|0;h[(c[m>>2]|0)+128>>3]=p;p=+Fm(k,g,+h[(c[6536]|0)+32>>3],0.0);h[(c[m>>2]|0)+136>>3]=p;Zm(l)|0;l=ow(b,l)|0;}while((l|0)!=0)}n=vx(b,n)|0;}while((n|0)!=0)}n=Wv(b,1,111528,0)|0;if((n|0)==0){q=1;r=0;i=d;return}g=Wv(b,1,104752,0)|0;b=c[c[(c[j>>2]|0)+144>>2]>>2]|0;if((b|0)==0){q=1;r=0;i=d;return}l=c[o>>2]|0;if((g|0)==0){m=0;k=b;do{s=k|0;t=fw(s,n)|0;do{if((a[t]|0)!=0){u=k+8|0;v=c[(c[u>>2]|0)+132>>2]|0;a[f]=0;w=v+8|0;x=ac(t|0,103888,(y=i,i=i+24|0,c[y>>2]=v,c[y+8>>2]=w,c[y+16>>2]=f,y)|0)|0;i=y;if((x|0)<=1){x=$w(s)|0;gc(l|0,96448,(y=i,i=i+16|0,c[y>>2]=x,c[y+8>>2]=t,y)|0)|0;i=y;break}p=+h[21580];if(p>0.0){x=v;h[x>>3]=+h[x>>3]/p;x=w;h[x>>3]=+h[x>>3]/+h[21580]}a[(c[u>>2]|0)+119|0]=1;if((a[f]|0)!=33){break}a[(c[u>>2]|0)+119|0]=3}}while(0);m=m+1|0;k=c[(c[(c[j>>2]|0)+144>>2]|0)+(m<<2)>>2]|0;}while((k|0)!=0);q=1;r=0;i=d;return}else{z=0;A=b}do{b=A|0;k=fw(b,n)|0;do{if((a[k]|0)!=0){m=A+8|0;t=c[(c[m>>2]|0)+132>>2]|0;a[f]=0;s=t+8|0;u=ac(k|0,103888,(y=i,i=i+24|0,c[y>>2]=t,c[y+8>>2]=s,c[y+16>>2]=f,y)|0)|0;i=y;if((u|0)<=1){u=$w(b)|0;gc(l|0,96448,(y=i,i=i+16|0,c[y>>2]=u,c[y+8>>2]=k,y)|0)|0;i=y;break}p=+h[21580];if(p>0.0){u=t;h[u>>3]=+h[u>>3]/p;u=s;h[u>>3]=+h[u>>3]/+h[21580]}a[(c[m>>2]|0)+119|0]=1;if((a[f]|0)!=33){if((Km(fw(b,g)|0)|0)<<24>>24==0){break}}a[(c[m>>2]|0)+119|0]=3}}while(0);z=z+1|0;A=c[(c[(c[j>>2]|0)+144>>2]|0)+(z<<2)>>2]|0;}while((A|0)!=0);q=1;r=0;i=d;return}function Uy(a){a=a|0;var b=0,d=0,e=0;b=ux(a)|0;if((b|0)!=0){d=b;do{b=mw(a,d)|0;if((b|0)!=0){e=b;do{tn(e);e=ow(a,e)|0;}while((e|0)!=0)}un(d);d=vx(a,d)|0;}while((d|0)!=0)}Vy(a);d=a+8|0;eF(c[(c[d>>2]|0)+144>>2]|0);eF(c[(c[d>>2]|0)+132>>2]|0);return}function Vy(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0;b=a+8|0;d=c[b>>2]|0;e=c[d+176>>2]|0;if((c[d+172>>2]|0)<1){f=e}else{d=1;g=e;while(1){e=c[g+(d<<2)>>2]|0;h=e+8|0;dk(c[(c[h>>2]|0)+12>>2]|0);i=c[(c[h>>2]|0)+132>>2]|0;if((i|0)!=0){eF(c[i>>2]|0);eF(c[(c[h>>2]|0)+132>>2]|0)}Vy(e);e=c[b>>2]|0;h=c[e+176>>2]|0;if((d|0)<(c[e+172>>2]|0)){d=d+1|0;g=h}else{f=h;break}}}eF(f);f=a|0;if((Ix(f)|0)==(a|0)){return}Xx(f,120088)|0;return}function Wy(a){a=a|0;var b=0,d=0,e=0,f=0;b=kk(24)|0;d=b;c[53372]=d;c[b>>2]=$g(25440,c[43330]|0)|0;c[b+16>>2]=0;c[b+12>>2]=0;e=kk(16)|0;c[e+12>>2]=0;f=kk(a*20|0)|0;c[e>>2]=f;c[e+8>>2]=f+(a*20|0);c[e+4>>2]=f;c[b+4>>2]=e;return d|0}function Xy(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;d=a+12|0;e=c[d>>2]|0;if((e|0)>=(b|0)){return}f=e<<1;e=(f|0)<(b|0)?b:f;f=a+16|0;a=c[f>>2]|0;if((a|0)!=0){eF(a)}c[f>>2]=kk(e<<3)|0;c[d>>2]=e;return}function Yy(a){a=a|0;var b=0;b=c[a>>2]|0;Hc[c[b>>2]&63](b,0,64)|0;c[a+20>>2]=c[a+16>>2];b=c[a+4>>2]|0;c[a+8>>2]=b;c[b+4>>2]=c[b>>2];return}function Zy(a){a=a|0;var b=0,d=0;Vg(c[a>>2]|0)|0;b=c[a+4>>2]|0;if((b|0)!=0){d=b;while(1){b=c[d+12>>2]|0;eF(c[d>>2]|0);eF(d);if((b|0)==0){break}else{d=b}}}eF(c[a+16>>2]|0);eF(a);return}function _y(a,b,e,f){a=a|0;b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0;g=i;i=i+24|0;h=g|0;c[h>>2]=b;c[h+4>>2]=e;j=c[a>>2]|0;k=(Hc[c[j>>2]&63](j,h,1)|0)+8|0;h=c[k>>2]|0;j=a+20|0;a=c[j>>2]|0;c[j>>2]=a+8;c[a>>2]=f;c[a+4>>2]=h;c[k>>2]=a;if((d[213992]|0)>>>0<=2>>>0){i=g;return}a=c[o>>2]|0;k=$w(f|0)|0;gc(a|0,163312,(a=i,i=i+24|0,c[a>>2]=b,c[a+8>>2]=e,c[a+16>>2]=k,a)|0)|0;i=a;i=g;return}function $y(a,b){a=a|0;b=b|0;hh(c[a>>2]|0,b,a)|0;return}function az(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0;e=i;i=i+24|0;f=e|0;c[f>>2]=b;c[f+4>>2]=d;d=c[a>>2]|0;a=Hc[c[d>>2]&63](d,f,4)|0;i=e;return a|0}function bz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[53372]|0)+8|0;a=c[d>>2]|0;e=c[a+4>>2]|0;if((e|0)==(c[a+8>>2]|0)){f=a+12|0;g=c[f>>2]|0;if((g|0)==0){h=(e-(c[a>>2]|0)|0)/20|0;i=kk(16)|0;j=i;c[i+12>>2]=0;k=kk(h*40|0)|0;c[i>>2]=k;c[i+8>>2]=k+((h<<1)*20|0);c[i+4>>2]=k;c[f>>2]=j;l=j}else{l=g}c[d>>2]=l;d=c[l>>2]|0;c[l+4>>2]=d;m=l;n=d}else{m=a;n=e}c[m+4>>2]=n+20;c[n>>2]=c[b>>2];c[n+4>>2]=c[b+4>>2];c[n+8>>2]=0;return n|0}function cz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0;e=c[b>>2]|0;a=c[d>>2]|0;if((e|0)==(a|0)){f=(c[b+4>>2]|0)-(c[d+4>>2]|0)|0;return f|0}else{f=e-a|0;return f|0}return 0}function dz(a,d,e){a=a|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;f=i;i=i+16|0;g=f|0;h=(d|0)==0;if(h){c[g>>2]=0;c[g+4>>2]=0;c[g+8>>2]=0;j=g}else{j=d}d=sy(a)|0;if((d|0)!=0){k=e+8|0;l=e|0;m=j+8|0;n=j+4|0;o=j|0;p=d;do{d=p|0;if((Za($w(d)|0,123792,7)|0)==0){Wx(d,92056,272,1)|0;d=jk(56)|0;q=p+8|0;c[(c[q>>2]|0)+132>>2]=d;b[(c[q>>2]|0)+168>>1]=b[(c[k>>2]|0)+168>>1]|0;c[(c[(c[q>>2]|0)+132>>2]|0)+44>>2]=(c[(c[(c[k>>2]|0)+132>>2]|0)+44>>2]|0)+1;c[(c[(c[q>>2]|0)+132>>2]|0)+48>>2]=l;q=(c[m>>2]|0)+1|0;c[m>>2]=q;d=c[n>>2]|0;if((q|0)<(d|0)){r=q;s=c[o>>2]|0}else{q=d+10|0;c[n>>2]=q;d=mk(c[o>>2]|0,q<<2)|0;c[o>>2]=d;r=c[m>>2]|0;s=d}c[s+(r<<2)>>2]=p;dz(p,0,p)}else{dz(p,j,e)}p=ty(p)|0;}while((p|0)!=0)}if(!h){i=f;return}h=g+8|0;p=a+8|0;c[(c[p>>2]|0)+172>>2]=c[h>>2];a=c[h>>2]|0;if((a|0)==0){i=f;return}h=mk(c[g>>2]|0,(a<<2)+4|0)|0;c[(c[p>>2]|0)+176>>2]=h;i=f;return}function ez(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0;d=i;i=i+56|0;e=d|0;c[e+4>>2]=Wv(b,0,159312,0)|0;c[e+8>>2]=Wv(b,0,163152,0)|0;c[e+12>>2]=Wv(b,0,131152,0)|0;c[e>>2]=b;c[e+16>>2]=0;c[e+36>>2]=tv(b,2,4,e+20|0)|0;fz(b,e);e=ux(b)|0;if((e|0)==0){gz(b,b);hz(b);i=d;return}else{f=e}do{e=f+8|0;g=c[e>>2]|0;if((a[g+118|0]|0)!=0){j=c[(c[(c[g+212>>2]|0)+8>>2]|0)+132>>2]|0;k=+h[j+24>>3]- +h[j+8>>3];l=+h[j+32>>3]- +h[j+16>>3];m=k*.5;n=l*.5;o=m*72.0;p=n*72.0;h[c[g+132>>2]>>3]=m;h[(c[(c[e>>2]|0)+132>>2]|0)+8>>3]=n;h[(c[e>>2]|0)+32>>3]=k;h[(c[e>>2]|0)+40>>3]=l;h[(c[e>>2]|0)+96>>3]=o;h[(c[e>>2]|0)+88>>3]=o;h[(c[e>>2]|0)+80>>3]=l*72.0;g=c[e>>2]|0;j=c[(c[g+12>>2]|0)+44>>2]|0;h[j>>3]=+h[g+96>>3];h[j+8>>3]=p;h[j+16>>3]=-0.0- +h[(c[e>>2]|0)+88>>3];h[j+24>>3]=p;h[j+32>>3]=-0.0- +h[(c[e>>2]|0)+88>>3];l=-0.0-p;h[j+40>>3]=l;h[j+48>>3]=+h[(c[e>>2]|0)+96>>3];h[j+56>>3]=l}f=vx(b,f)|0;}while((f|0)!=0);gz(b,b);hz(b);i=d;return}function fz(f,g){f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0.0,L=0.0,M=0.0,N=0.0,O=0,P=0,Q=0.0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0.0,ma=0.0,na=0,oa=0,pa=0.0,qa=0,ra=0,sa=0,ta=0.0,ua=0.0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0.0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0.0,Ra=0.0,Sa=0.0,Ta=0.0,Ua=0,Va=0,Wa=0,Xa=0.0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0;j=i;i=i+200|0;k=j|0;l=j+32|0;m=j+40|0;n=j+144|0;p=j+152|0;q=j+160|0;if((a[213992]|0)!=0){r=c[o>>2]|0;s=$w(f|0)|0;gc(r|0,103288,(t=i,i=i+8|0,c[t>>2]=s,t)|0)|0;i=t}s=ux(f)|0;if((s|0)!=0){r=s;do{c[(c[r+8>>2]|0)+164>>2]=0;r=vx(f,r)|0;}while((r|0)!=0)}r=m|0;m=g+16|0;s=c[m>>2]|0;c[m>>2]=s+1;nb(r|0,154944,(t=i,i=i+8|0,c[t>>2]=s,t)|0)|0;i=t;if((d[213992]|0)>>>0>1>>>0){s=c[o>>2]|0;m=$w(f|0)|0;gc(s|0,151080,(t=i,i=i+16|0,c[t>>2]=r,c[t+8>>2]=m,t)|0)|0;i=t}m=Hw(148168,173936,0)|0;r=m|0;Wx(r,92056,272,1)|0;s=jk(56)|0;u=m+8|0;c[(c[u>>2]|0)+132>>2]=s;s=f+8|0;b[(c[u>>2]|0)+168>>1]=b[(c[s>>2]|0)+168>>1]|0;v=Wv(f,0,145432,0)|0;do{if((v|0)!=0){w=fw(f|0,v)|0;x=Wv(m,0,145432,0)|0;if((x|0)==0){Wv(m,0,145432,w)|0;break}else{hw(r,x,w)|0;break}}}while(0);v=Wv(f,0,142080,0)|0;do{if((v|0)!=0){w=fw(f|0,v)|0;x=Wv(m,0,142080,0)|0;if((x|0)==0){Wv(m,0,142080,w)|0;break}else{hw(r,x,w)|0;break}}}while(0);v=Wv(f,0,138944,0)|0;do{if((v|0)!=0){w=fw(f|0,v)|0;x=Wv(m,0,138944,0)|0;if((x|0)==0){Wv(m,0,138944,w)|0;break}else{hw(r,x,w)|0;break}}}while(0);v=c[s>>2]|0;if((c[v+172>>2]|0)<1){y=0}else{w=g+4|0;x=g|0;z=k|0;A=k+8|0;B=k+16|0;C=k+24|0;k=1;D=0;E=v;while(1){v=c[(c[E+176>>2]|0)+(k<<2)>>2]|0;Rj(v);F=v|0;G=Ax(m,$w(F)|0,1)|0;Wx(G|0,81280,304,1)|0;H=jk(32)|0;I=G+8|0;c[(c[I>>2]|0)+112>>2]=H;H=kk(e[(c[u>>2]|0)+168>>1]<<3)|0;c[(c[I>>2]|0)+132>>2]=H;c[(c[I>>2]|0)+212>>2]=v;H=D+1|0;c[(c[I>>2]|0)+120>>2]=D;J=c[w>>2]|0;do{if((J|0)==0){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308}else{O=fw(F,J)|0;if((a[O]|0)==0){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}if((c[x>>2]|0)!=(v|0)){P=fw(uy(v)|0,J)|0;if((P|0)==(O|0)){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}if((Ya(O|0,P|0)|0)==0){K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}}a[l]=0;P=ac(O|0,129200,(t=i,i=i+40|0,c[t>>2]=z,c[t+8>>2]=A,c[t+16>>2]=B,c[t+24>>2]=C,c[t+32>>2]=l,t)|0)|0;i=t;if((P|0)<=3){P=$w(F)|0;Fv(0,125976,(t=i,i=i+16|0,c[t>>2]=P,c[t+8>>2]=O,t)|0)|0;i=t;K=1.7976931348623157e+308;L=1.7976931348623157e+308;M=-1.7976931348623157e+308;N=-1.7976931348623157e+308;break}Q=+h[21580];if(Q>0.0){h[z>>3]=+h[z>>3]/Q;h[A>>3]=+h[A>>3]/Q;h[B>>3]=+h[B>>3]/Q;h[C>>3]=+h[C>>3]/Q}O=a[l]|0;do{if(O<<24>>24==33){a[(c[I>>2]|0)+119|0]=3}else{P=(c[I>>2]|0)+119|0;if(O<<24>>24==63){a[P]=2;break}else{a[P]=1;break}}}while(0);K=+h[z>>3];L=+h[A>>3];M=+h[B>>3];N=+h[C>>3]}}while(0);F=ux(v)|0;if((F|0)!=0){J=G;O=F;do{c[(c[O+8>>2]|0)+164>>2]=J;O=vx(v,O)|0;}while((O|0)!=0)}O=c[I>>2]|0;if((a[O+119|0]|0)!=0){h[c[O+132>>2]>>3]=(M+K)*.5;h[(c[(c[I>>2]|0)+132>>2]|0)+8>>3]=(N+L)*.5}O=c[s>>2]|0;if((k|0)<(c[O+172>>2]|0)){k=k+1|0;D=H;E=O}else{y=H;break}}}E=ux(f)|0;a:do{if((E|0)==0){R=y}else{D=f;k=y;C=E;b:while(1){S=C+8|0;B=c[S>>2]|0;do{if((c[B+164>>2]|0)==0){A=B+212|0;z=c[A>>2]|0;if((z|0)!=0){if((z|0)!=(c[(c[(c[s>>2]|0)+132>>2]|0)+48>>2]|0)){break b}}c[A>>2]=D;if((a[(c[S>>2]|0)+118|0]|0)!=0){T=k;break}A=Ax(m,$w(C|0)|0,1)|0;Wx(A|0,81280,304,1)|0;z=jk(32)|0;l=A+8|0;c[(c[l>>2]|0)+112>>2]=z;z=kk(e[(c[u>>2]|0)+168>>1]<<3)|0;c[(c[l>>2]|0)+132>>2]=z;c[(c[S>>2]|0)+164>>2]=A;c[(c[l>>2]|0)+120>>2]=k;h[(c[l>>2]|0)+32>>3]=+h[(c[S>>2]|0)+32>>3];h[(c[l>>2]|0)+40>>3]=+h[(c[S>>2]|0)+40>>3];h[(c[l>>2]|0)+88>>3]=+h[(c[S>>2]|0)+88>>3];h[(c[l>>2]|0)+96>>3]=+h[(c[S>>2]|0)+96>>3];h[(c[l>>2]|0)+80>>3]=+h[(c[S>>2]|0)+80>>3];c[(c[l>>2]|0)+8>>2]=c[(c[S>>2]|0)+8>>2];c[(c[l>>2]|0)+12>>2]=c[(c[S>>2]|0)+12>>2];A=c[S>>2]|0;if((a[A+119|0]|0)!=0){h[c[(c[l>>2]|0)+132>>2]>>3]=+h[c[A+132>>2]>>3];h[(c[(c[l>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[S>>2]|0)+132>>2]|0)+8>>3];a[(c[l>>2]|0)+119|0]=a[(c[S>>2]|0)+119|0]|0}c[(c[(c[l>>2]|0)+112>>2]|0)+8>>2]=C;T=k+1|0}else{T=k}}while(0);B=vx(f,C)|0;if((B|0)==0){R=T;break a}else{k=T;C=B}}k=$w(C|0)|0;D=$w(f|0)|0;H=$w(c[(c[S>>2]|0)+212>>2]|0)|0;Fv(1,136344,(t=i,i=i+24|0,c[t>>2]=k,c[t+8>>2]=D,c[t+16>>2]=H,t)|0)|0;i=t;rc(177912,1)}}while(0);S=ux(f)|0;if((S|0)!=0){T=S;do{S=c[(c[T+8>>2]|0)+164>>2]|0;E=S;y=mw(f,T)|0;if((y|0)!=0){H=S+8|0;D=y;do{y=c[(c[(c[((c[D>>2]&3|0)==2?D:D-32|0)+28>>2]|0)+8>>2]|0)+164>>2]|0;k=y;if((y|0)!=(S|0)){if(y>>>0>S>>>0){U=uw(m,E,k,0,1)|0}else{U=uw(m,k,E,0,1)|0}Wx(U|0,85888,176,1)|0;k=D+8|0;I=U+8|0;h[(c[I>>2]|0)+136>>3]=+h[(c[k>>2]|0)+136>>3];h[(c[I>>2]|0)+128>>3]=+h[(c[k>>2]|0)+128>>3];k=y+8|0;y=(c[(c[k>>2]|0)+112>>2]|0)+4|0;c[y>>2]=(c[y>>2]|0)+1;y=(c[(c[H>>2]|0)+112>>2]|0)+4|0;c[y>>2]=(c[y>>2]|0)+1;y=c[I>>2]|0;B=c[y+172>>2]|0;do{if((B|0)==0){l=c[(c[k>>2]|0)+112>>2]|0;c[l>>2]=(c[l>>2]|0)+1;l=c[(c[H>>2]|0)+112>>2]|0;c[l>>2]=(c[l>>2]|0)+1;l=c[I>>2]|0;A=c[l+172>>2]|0;z=b[l+168>>1]|0;if((A|0)!=0){V=A;W=z;X=63;break}Y=kk((z<<16>>16<<2)+4|0)|0;Z=z}else{V=B;W=b[y+168>>1]|0;X=63}}while(0);if((X|0)==63){X=0;Y=mk(V,(W<<16>>16<<2)+4|0)|0;Z=W}c[Y+(Z<<16>>16<<2)>>2]=D;c[(c[I>>2]|0)+172>>2]=Y;y=(c[I>>2]|0)+168|0;b[y>>1]=(b[y>>1]|0)+1}D=ow(f,D)|0;}while((D|0)!=0)}T=vx(f,T)|0;}while((T|0)!=0)}T=c[(c[s>>2]|0)+132>>2]|0;Y=c[T>>2]|0;if((Y|0)!=0){Z=jk((c[T+4>>2]<<4)+16|0)|0;c[c[(c[u>>2]|0)+132>>2]>>2]=Z;T=Y|0;Y=c[T>>2]|0;if((Y|0)==0){_=0}else{W=f|0;V=R;R=Z;Z=0;U=T;T=Y;while(1){Y=c[(c[(c[U+4>>2]|0)+8>>2]|0)+164>>2]|0;D=Y;if((Y|0)==0){aa=Z;ba=R;ca=V}else{H=T;E=c[H>>2]&3;S=c[((E|0)==2?T:T-32|0)+28>>2]|0;C=c[((E|0)==3?T:T+32|0)+28>>2]|0;E=xF($w(W)|0)|0;y=S|0;B=xF($w(y)|0)|0;k=C|0;z=(E+8+B+(xF($w(k)|0)|0)|0)>999;B=$w(W)|0;if(z){z=$w(k)|0;k=$w(y)|0;y=(c[H>>2]|0)>>>4;nb(175272,133608,(t=i,i=i+32|0,c[t>>2]=B,c[t+8>>2]=z,c[t+16>>2]=k,c[t+24>>2]=y,t)|0)|0;i=t}else{y=c[(c[C+8>>2]|0)+120>>2]|0;C=c[(c[S+8>>2]|0)+120>>2]|0;S=(c[H>>2]|0)>>>4;nb(175272,131488,(t=i,i=i+32|0,c[t>>2]=B,c[t+8>>2]=y,c[t+16>>2]=C,c[t+24>>2]=S,t)|0)|0;i=t}S=Ax(m,175272,1)|0;Wx(S|0,81280,304,1)|0;C=jk(32)|0;y=S+8|0;c[(c[y>>2]|0)+112>>2]=C;C=kk(e[(c[u>>2]|0)+168>>1]<<3)|0;c[(c[y>>2]|0)+132>>2]=C;c[(c[y>>2]|0)+120>>2]=V;if(S>>>0>D>>>0){da=uw(m,D,S,0,1)|0}else{da=uw(m,S,D,0,1)|0}Wx(da|0,85888,176,1)|0;D=da+8|0;h[(c[D>>2]|0)+136>>3]=+h[(c[(c[U>>2]|0)+8>>2]|0)+136>>3];h[(c[D>>2]|0)+128>>3]=+h[(c[(c[U>>2]|0)+8>>2]|0)+128>>3];C=c[U>>2]|0;B=c[D>>2]|0;H=b[B+168>>1]|0;k=c[B+172>>2]|0;if((k|0)==0){ea=kk((H<<16>>16<<2)+4|0)|0}else{ea=mk(k,(H<<16>>16<<2)+4|0)|0}c[ea+(H<<16>>16<<2)>>2]=C;c[(c[D>>2]|0)+172>>2]=ea;C=(c[D>>2]|0)+168|0;b[C>>1]=(b[C>>1]|0)+1;C=(c[(c[y>>2]|0)+112>>2]|0)+4|0;c[C>>2]=(c[C>>2]|0)+1;C=Y+8|0;Y=(c[(c[C>>2]|0)+112>>2]|0)+4|0;c[Y>>2]=(c[Y>>2]|0)+1;Y=c[(c[y>>2]|0)+112>>2]|0;c[Y>>2]=(c[Y>>2]|0)+1;Y=c[(c[C>>2]|0)+112>>2]|0;c[Y>>2]=(c[Y>>2]|0)+1;c[R+4>>2]=S;h[R+8>>3]=+h[U+8>>3];c[R>>2]=da;aa=Z+1|0;ba=R+16|0;ca=V+1|0}S=U+16|0;Y=c[S>>2]|0;if((Y|0)==0){_=aa;break}else{V=ca;R=ba;Z=aa;U=S;T=Y}}}c[(c[(c[u>>2]|0)+132>>2]|0)+4>>2]=_}_=Ry(m,n,p)|0;T=c[_>>2]|0;c:do{if((T|0)!=0){U=g|0;aa=_;Z=T;d:while(1){aa=aa+4|0;lz(Z,q);ba=ux(Z)|0;if((ba|0)!=0){R=ba;do{ba=R+8|0;ca=c[ba>>2]|0;V=c[ca+212>>2]|0;do{if((V|0)==0){if((c[(c[ca+112>>2]|0)+8>>2]|0)!=0){break}Gx(Z,R|0)|0}else{da=V;ea=c[(c[ca+112>>2]|0)+4>>2]|0;if((ea|0)==0){fa=V+8|0}else{W=jk((ea<<4)+16|0)|0;Y=W;S=c[c[(c[ba>>2]|0)+112>>2]>>2]|0;C=jk((S*24|0)+24|0)|0;y=C;D=rw(Z,R)|0;if((D|0)==0){ga=0}else{H=D;D=0;while(1){k=c[H>>2]&3;B=c[((k|0)==2?H:H-32|0)+28>>2]|0;if((B|0)==(R|0)){ha=c[((k|0)==3?H:H+32|0)+28>>2]|0}else{ha=B}B=c[(c[ha+8>>2]|0)+132>>2]|0;k=c[(c[ba>>2]|0)+132>>2]|0;L=+h[B>>3]- +h[k>>3];N=+h[B+8>>3]- +h[k+8>>3];c[y+(D*24|0)>>2]=H;h[y+(D*24|0)+8>>3]=+$(+N,+L);h[y+(D*24|0)+16>>3]=L*L+N*N;k=D+1|0;B=sw(Z,H,R)|0;if((B|0)==0){ga=k;break}else{H=B;D=k}}}if((ga|0)!=(S|0)){X=95;break d}Jb(C|0,S|0,24,16);do{if((S|0)>1){D=S-1|0;if((D|0)>0){ia=0}else{break}while(1){H=y+(ia*24|0)+8|0;N=+h[H>>3];k=ia+1|0;do{if((k|0)<(S|0)){B=k;while(1){z=B+1|0;if(+h[y+(B*24|0)+8>>3]!=N){ja=B;break}if((z|0)<(S|0)){B=z}else{ja=z;break}}if((ja|0)==(k|0)){ka=k;break}if((ja|0)==(S|0)){la=3.141592653589793}else{la=+h[y+(ja*24|0)+8>>3]}L=(la-N)/+(ja-ia|0);K=L>.03490658503988659?.03490658503988659:L;if((ia|0)>=(ja|0)){ka=ia;break}h[H>>3]=N+0.0;if((k|0)<(ja|0)){ma=0.0;na=k}else{ka=ja;break}while(1){L=K+ma;B=y+(na*24|0)+8|0;h[B>>3]=+h[B>>3]+L;B=na+1|0;if((B|0)<(ja|0)){ma=L;na=B}else{ka=ja;break}}}else{ka=k}}while(0);if((ka|0)<(D|0)){ia=ka}else{break}}}}while(0);y=C;S=c[y>>2]|0;if((S|0)==0){oa=0}else{D=C+8|0;k=0;H=y;y=S;while(1){S=H+24|0;B=c[S>>2]|0;if((B|0)==0){pa=+h[D>>3]+6.283185307179586}else{pa=+h[H+32>>3]}z=y+8|0;E=c[z>>2]|0;A=b[E+168>>1]|0;l=A<<16>>16;x=c[y>>2]&3;w=c[((x|0)==2?y:y-32|0)+28>>2]|0;if((w|0)==(R|0)){qa=c[((x|0)==3?y:y+32|0)+28>>2]|0}else{qa=w}N=+h[H+8>>3];K=(pa-N)/+(A<<16>>16|0);L=K>.03490658503988659?.03490658503988659:K;if(qa>>>0>R>>>0){ra=1;sa=k;ta=L;ua=N}else{ra=-1;sa=k-1+l|0;ta=-0.0-L;ua=N+ +(l-1|0)*L}if(A<<16>>16>0){A=c[E+172>>2]|0;L=ua;E=sa;w=0;while(1){x=c[A>>2]|0;c[Y+(E<<4)>>2]=x;O=c[x>>2]&3;v=c[((O|0)==3?x:x+32|0)+28>>2]|0;if((c[(c[v+8>>2]|0)+164>>2]|0)==(R|0)){va=v}else{va=c[((O|0)==2?x:x-32|0)+28>>2]|0}c[Y+(E<<4)+4>>2]=va;h[Y+(E<<4)+8>>3]=L;x=w+1|0;if((x|0)<(b[(c[z>>2]|0)+168>>1]|0)){A=A+4|0;L=ta+L;E=E+ra|0;w=x}else{break}}wa=c[S>>2]|0}else{wa=B}w=l+k|0;if((wa|0)==0){oa=w;break}else{k=w;H=S;y=wa}}}if((oa|0)!=(ea|0)){X=125;break d}y=V+8|0;c[c[(c[y>>2]|0)+132>>2]>>2]=W;c[(c[(c[y>>2]|0)+132>>2]|0)+4>>2]=ea;eF(C);fa=y}fz(da,g);h[(c[ba>>2]|0)+32>>3]=+h[(c[(c[fa>>2]|0)+132>>2]|0)+24>>3];h[(c[ba>>2]|0)+40>>3]=+h[(c[(c[fa>>2]|0)+132>>2]|0)+32>>3];y=c[(c[fa>>2]|0)+132>>2]|0;L=+h[y+32>>3]*72.0;N=+h[y+24>>3]*72.0*.5;h[(c[ba>>2]|0)+88>>3]=N;h[(c[ba>>2]|0)+96>>3]=N;h[(c[ba>>2]|0)+80>>3]=L}}while(0);R=vx(Z,R)|0;}while((R|0)!=0)}if((Lw(Z)|0)>1){if((c[U>>2]|0)==(f|0)){ir(Z)|0}qz(Z,q)}Z=c[aa>>2]|0;if((Z|0)==0){break c}}if((X|0)==95){cc(159976,164056,643,170568)}else if((X|0)==125){cc(167512,164056,767,170704)}}}while(0);X=c[n>>2]|0;do{if((X|0)>1){if((c[p>>2]|0)==0){xa=0;ya=X}else{q=jk(X)|0;a[q]=1;xa=q;ya=c[n>>2]|0}c[g+40>>2]=xa;q=mv(ya,_,0,g+20|0)|0;if((xa|0)==0){za=q;break}eF(xa);za=q}else{if((X|0)!=1){za=0;break}$m(c[_>>2]|0);za=0}}while(0);X=c[n>>2]|0;n=(c[g>>2]|0)!=(f|0);xa=(X|0)!=0;do{if(xa){ya=c[(c[_>>2]|0)+8>>2]|0;ta=+h[ya+16>>3];if(ta<0.0){Aa=ta+-.5}else{Aa=ta+.5}p=~~Aa;ta=+h[ya+24>>3];if(ta<0.0){Ba=ta+-.5}else{Ba=ta+.5}q=~~Ba;ta=+h[ya+32>>3];if(ta<0.0){Ca=ta+-.5}else{Ca=ta+.5}fa=~~Ca;ta=+h[ya+40>>3];if(ta<0.0){Da=ta+-.5}else{Da=ta+.5}ya=~~Da;if((X|0)<=1){Ea=0;Fa=ya;Ga=fa;Ha=q;Ia=p;break}oa=c[za>>2]|0;wa=c[za+4>>2]|0;ra=oa+p|0;p=wa+q|0;q=oa+fa|0;fa=wa+ya|0;ya=_+4|0;wa=c[ya>>2]|0;if((wa|0)==0){Ea=0;Fa=fa;Ga=q;Ha=p;Ia=ra;break}else{Ja=ra;Ka=p;La=q;Ma=fa;Na=za;Oa=ya;Pa=wa}while(1){wa=Na+8|0;ya=c[Pa+8>>2]|0;ta=+h[ya+16>>3];if(ta<0.0){Qa=ta+-.5}else{Qa=ta+.5}ta=+h[ya+24>>3];if(ta<0.0){Ra=ta+-.5}else{Ra=ta+.5}ta=+h[ya+32>>3];if(ta<0.0){Sa=ta+-.5}else{Sa=ta+.5}ta=+h[ya+40>>3];if(ta<0.0){Ta=ta+-.5}else{Ta=ta+.5}ya=c[wa>>2]|0;fa=c[Na+12>>2]|0;q=ya+~~Qa|0;p=fa+~~Ra|0;ra=ya+~~Sa|0;ya=fa+~~Ta|0;fa=(Ja|0)<(q|0)?Ja:q;q=(Ka|0)<(p|0)?Ka:p;p=(La|0)>(ra|0)?La:ra;ra=(Ma|0)>(ya|0)?Ma:ya;ya=Oa+4|0;oa=c[ya>>2]|0;if((oa|0)==0){Ea=0;Fa=ra;Ga=p;Ha=q;Ia=fa;break}else{Ja=fa;Ka=q;La=p;Ma=ra;Na=wa;Oa=ya;Pa=oa}}}else{oa=c[g+12>>2]|0;ya=f|0;wa=Em(ya,c[g+8>>2]|0,54,3)|0;Ea=1;Fa=Em(ya,oa,36,3)|0;Ga=wa;Ha=0;Ia=0}}while(0);g=c[s>>2]|0;Pa=c[g+12>>2]|0;do{if((Pa|0)==0){Ua=Ea;Va=Ga;Wa=Ia}else{Ta=+h[Pa+24>>3];if(Ta<0.0){Xa=Ta+-.5}else{Xa=Ta+.5}Oa=~~Xa+(Ia-Ga)|0;if((Oa|0)<=0){Ua=0;Va=Ga;Wa=Ia;break}Na=(Oa|0)/2|0;Ua=0;Va=Na+Ga|0;Wa=Ia-Na|0}}while(0);if(n&(Ua|0)==0){Ua=Em(r,c[53720]|0,8,0)|0;Za=Ua;_a=c[s>>2]|0}else{Za=0;_a=g}g=Za-Wa|0;Wa=~~(+h[_a+56>>3]+ +(Za-Ha|0));Ha=Za+Va+g|0;Va=~~(+(Fa|0)+(+h[_a+88>>3]+ +(Wa+Za|0)));do{if(xa){Za=c[_>>2]|0;if((Za|0)==0){break}else{$a=za;ab=_;bb=Za}while(1){Za=ab+4|0;if(($a|0)==0){cb=g;db=Wa;eb=0}else{cb=(c[$a>>2]|0)+g|0;db=(c[$a+4>>2]|0)+Wa|0;eb=$a+8|0}Xa=+(cb|0)/72.0;Ta=+(db|0)/72.0;_a=ux(bb)|0;if((_a|0)!=0){Fa=_a;do{_a=Fa+8|0;Ua=c[(c[_a>>2]|0)+132>>2]|0;h[Ua>>3]=Xa+ +h[Ua>>3];Ua=(c[(c[_a>>2]|0)+132>>2]|0)+8|0;h[Ua>>3]=Ta+ +h[Ua>>3];Fa=vx(bb,Fa)|0;}while((Fa|0)!=0)}Fa=c[Za>>2]|0;if((Fa|0)==0){break}else{$a=eb;ab=Za;bb=Fa}}}}while(0);bb=c[(c[u>>2]|0)+132>>2]|0;vF(bb+8|0,0,16)|0;h[bb+24>>3]=+(Ha|0)/72.0;h[bb+32>>3]=+(Va|0)/72.0;eF(za);za=ux(m)|0;if((za|0)!=0){Va=za;do{za=Va+8|0;bb=c[za>>2]|0;Ha=c[bb+212>>2]|0;do{if((Ha|0)==0){ab=c[(c[bb+112>>2]|0)+8>>2]|0;if((ab|0)==0){break}eb=ab+8|0;h[c[(c[eb>>2]|0)+132>>2]>>3]=+h[c[bb+132>>2]>>3];h[(c[(c[eb>>2]|0)+132>>2]|0)+8>>3]=+h[(c[(c[za>>2]|0)+132>>2]|0)+8>>3]}else{eb=Ha+8|0;h[(c[(c[eb>>2]|0)+132>>2]|0)+8>>3]=+h[c[bb+132>>2]>>3]- +h[bb+32>>3]*.5;ab=c[za>>2]|0;h[(c[(c[eb>>2]|0)+132>>2]|0)+16>>3]=+h[(c[ab+132>>2]|0)+8>>3]- +h[ab+40>>3]*.5;ab=c[(c[eb>>2]|0)+132>>2]|0;h[ab+24>>3]=+h[ab+8>>3]+ +h[(c[za>>2]|0)+32>>3];ab=c[(c[eb>>2]|0)+132>>2]|0;h[ab+32>>3]=+h[ab+16>>3]+ +h[(c[za>>2]|0)+40>>3]}}while(0);Va=vx(m,Va)|0;}while((Va|0)!=0)}Va=(c[(c[s>>2]|0)+132>>2]|0)+8|0;s=(c[(c[u>>2]|0)+132>>2]|0)+8|0;c[Va>>2]=c[s>>2];c[Va+4>>2]=c[s+4>>2];c[Va+8>>2]=c[s+8>>2];c[Va+12>>2]=c[s+12>>2];c[Va+16>>2]=c[s+16>>2];c[Va+20>>2]=c[s+20>>2];c[Va+24>>2]=c[s+24>>2];c[Va+28>>2]=c[s+28>>2];s=c[_>>2]|0;if((s|0)!=0){Va=_;za=s;do{Va=Va+4|0;eF(c[(c[za+8>>2]|0)+132>>2]|0);Xx(za|0,92056)|0;za=c[Va>>2]|0;}while((za|0)!=0)}za=c[(c[u>>2]|0)+132>>2]|0;Va=c[za>>2]|0;if((Va|0)==0){fb=za}else{eF(Va);fb=c[(c[u>>2]|0)+132>>2]|0}eF(fb);Xx(r,92056)|0;r=ux(m)|0;if((r|0)!=0){fb=r;while(1){r=vx(m,fb)|0;u=mw(m,fb)|0;if((u|0)!=0){Va=u;do{eF(c[(c[Va+8>>2]|0)+172>>2]|0);Xx(Va|0,85888)|0;Va=ow(m,Va)|0;}while((Va|0)!=0)}Va=fb+8|0;eF(c[(c[Va>>2]|0)+112>>2]|0);eF(c[(c[Va>>2]|0)+132>>2]|0);Xx(fb|0,81280)|0;if((r|0)==0){break}else{fb=r}}}Kw(m)|0;eF(_);if((a[213992]|0)==0){i=j;return}_=c[o>>2]|0;m=$w(f|0)|0;gc(_|0,97616,(t=i,i=i+8|0,c[t>>2]=m,t)|0)|0;i=t;i=j;return}function gz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0.0,i=0.0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0.0,r=0.0,s=0.0;d=a+8|0;e=c[d>>2]|0;f=c[e+132>>2]|0;g=+h[f+8>>3];i=+h[f+16>>3];f=(a|0)!=(b|0);if(f){j=ux(a)|0;if((j|0)!=0){k=j;do{j=k+8|0;l=c[j>>2]|0;if((c[l+212>>2]|0)==(a|0)){m=c[l+132>>2]|0;h[m>>3]=g+ +h[m>>3];m=(c[(c[j>>2]|0)+132>>2]|0)+8|0;h[m>>3]=i+ +h[m>>3]}k=vx(a,k)|0;}while((k|0)!=0)}n=c[d>>2]|0}else{n=e}if((c[n+172>>2]|0)<1){return}if(f){f=1;e=n;while(1){k=c[(c[e+176>>2]|0)+(f<<2)>>2]|0;m=c[(c[k+8>>2]|0)+132>>2]|0;j=m+8|0;l=m+16|0;o=m+24|0;p=m+32|0;q=i+ +h[l>>3];r=g+ +h[o>>3];s=i+ +h[p>>3];h[j>>3]=g+ +h[j>>3];h[l>>3]=q;h[o>>3]=r;h[p>>3]=s;gz(k,b);k=c[d>>2]|0;if((f|0)<(c[k+172>>2]|0)){f=f+1|0;e=k}else{break}}return}else{e=1;f=n;while(1){gz(c[(c[f+176>>2]|0)+(e<<2)>>2]|0,a);n=c[d>>2]|0;if((e|0)<(c[n+172>>2]|0)){e=e+1|0;f=n}else{break}}return}}function hz(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0,i=0,j=0;b=a+8|0;a=c[b>>2]|0;d=c[a+132>>2]|0;e=+h[d+16>>3]*72.0;f=+h[d+24>>3]*72.0;g=+h[d+32>>3]*72.0;h[a+16>>3]=+h[d+8>>3]*72.0;h[a+24>>3]=e;h[a+32>>3]=f;h[a+40>>3]=g;a=c[b>>2]|0;if((c[a+172>>2]|0)<1){return}else{i=1;j=a}while(1){hz(c[(c[j+176>>2]|0)+(i<<2)>>2]|0);a=c[b>>2]|0;if((i|0)<(c[a+172>>2]|0)){i=i+1|0;j=a}else{break}}return}function iz(a){a=a|0;var d=0,e=0,f=0,g=0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;d=i;e=1;f=0;g=i;i=i+168|0;c[g>>2]=0;while(1)switch(e|0){case 1:j=+h[21580];k=+sa(2,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;h[21580]=k;la(16,a|0,2);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;l=ma(12,56)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;m=a+8|0;c[(c[m>>2]|0)+132>>2]=l;l=a|0;n=Aa(56,a|0,0,116440,0)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;o=Aa(52,l|0,n|0,2,2)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;b[(c[m>>2]|0)+168>>1]=o;o=(c[m>>2]|0)+168|0;n=b[o>>1]|0;l=(n&65535)>>>0<10>>>0?n:10;b[o>>1]=l;c[53568]=l&65535;Ba(100,a|0,0,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;ka(90,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;ka(92,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;p=BF(177912,e,g)|0;e=14;break;case 14:if((p|0)==0){e=2;break}else{e=13;break};case 2:ka(132,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;ka(86,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;q=b[(c[m>>2]|0)+128>>1]|0;if((q&14)==0){e=12;break}else{e=3;break};case 3:r=q&14;if((r|0)==2){e=10;break}else if((r|0)==12){e=4;break}else{s=q;e=6;break};case 4:l=pa(58,a|0,12,10)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;if((l|0)==0){e=9;break}else{e=5;break};case 5:c[53566]=2;s=b[(c[m>>2]|0)+128>>1]|0;e=6;break;case 6:if((s&1)==0){e=8;break}else{e=7;break};case 7:pa(16,0,109112,(l=i,i=i+1|0,i=i+7&-8,c[l>>2]=0,l)|0)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;i=l;e=9;break;case 8:wa(50,a|0,r|0)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;e=9;break;case 9:c[53566]=0;e=10;break;case 10:if((c[53522]|0)<1){e=11;break}else{e=12;break};case 11:wa(50,a|0,2)|0;if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;e=12;break;case 12:ka(44,a|0);if((u|0)!=0&(v|0)!=0){f=CF(c[u>>2]|0,g)|0;if((f|0)>0){e=-1;break}else return}u=v=0;h[21580]=j;e=13;break;case 13:i=d;return;case-1:if((f|0)==1){p=v;e=14}u=v=0;break}}function jz(a,b){a=a|0;b=b|0;var c=0.0,d=0.0,e=0,f=0.0,g=0.0;c=+h[a+8>>3];d=+h[b+8>>3];do{if(c>d){e=1}else{if(c<d){e=-1;break}f=+h[a+16>>3];g=+h[b+16>>3];if(f>g){e=1;break}e=(f<g)<<31>>31}}while(0);return e|0}function kz(a){a=a|0;var b=0,d=0,e=0.0,f=0.0,g=0.0;b=i;d=c[6536]|0;c[44182]=c[d>>2];c[44183]=c[d+4>>2];c[44185]=c[d+8>>2];c[44187]=c[d+12>>2];h[22099]=0.0;h[22094]=+h[d+16>>3];h[22095]=+h[d+24>>3];d=a|0;c[44186]=Em(d,Wv(a,0,121720,0)|0,600,0)|0;e=+Fm(d,Wv(a,0,158192,0)|0,.3,0.0);h[22096]=e;h[(c[6536]|0)+32>>3]=e;e=+h[(c[6536]|0)+40>>3];if(e==-1.0){f=+Fm(d,Wv(a,0,127856,0)|0,-1.0,0.0)}else{f=e}h[22097]=f;c[44184]=1;d=vt(a,2,176736)|0;c[44196]=d;if((d|0)==0){Fv(0,115224,(d=i,i=i+1|0,i=i+7&-8,c[d>>2]=0,d)|0)|0;i=d;c[44184]=2}c[44212]=(da(c[44186]|0,c[44187]|0)|0)/100|0;f=+h[22096];h[22101]=f*f;if((c[44182]|0)==0){i=b;return}e=+h[22099];if(e>0.0){g=e}else{e=f*3.0;h[22099]=e;g=e}h[22100]=g*g;i=b;return}function lz(b,d){b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0,j=0.0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0.0,L=0.0,M=0.0,N=0.0,O=0.0,P=0.0,Q=0.0,S=0.0,U=0.0,X=0.0,Y=0,Z=0,_=0,aa=0,ba=0,ca=0.0,da=0.0,ea=0,fa=0,ga=0,ha=0,ia=0;e=b+8|0;f=c[c[(c[e>>2]|0)+132>>2]>>2]|0;g=+h[22097];if(g==-1.0){i=Lw(b)|0;j=+h[22095]*+h[22096]*+T(+(i|0))/5.0;h[22097]=j;k=1;l=j}else{k=0;l=g}i=c[44186]|0;h[d+8>>3]=l*+(i-(c[44212]|0)|0)/+(i|0);h[d+16>>3]=+h[22096];h[d+24>>3]=+h[22094];i=d|0;c[i>>2]=(c[44186]|0)-(c[44212]|0);m=c[44185]|0;n=c[44212]|0;do{if((m|0)>-1){if((m|0)<=(n|0)){c[44213]=m;c[d+32>>2]=0;break}if((m|0)>(c[44186]|0)){break}c[44213]=n;c[d+32>>2]=m-n}else{c[44213]=n;c[d+32>>2]=c[i>>2]}}while(0);i=Lw(b)|0;d=i-(c[(c[(c[e>>2]|0)+132>>2]|0)+4>>2]|0)|0;e=ux(b)|0;if((e|0)==0){o=0;p=0;q=0;r=0;s=0}else{i=0;n=0;m=0;t=0;u=0;v=e;while(1){e=c[v+8>>2]|0;if((a[e+119|0]|0)==0){w=u;x=t;y=m;z=n;A=i}else{B=c[e+132>>2]|0;l=+h[B>>3];if((u|0)==0){e=~~l;C=~~+h[B+8>>3];D=C;E=e;F=C;G=e}else{g=+(i|0);j=+h[B+8>>3];H=+(n|0);I=+(m|0);J=+(t|0);D=~~(j>J?j:J);E=~~(l>I?l:I);F=~~(j<H?j:H);G=~~(l<g?l:g)}w=u+1|0;x=D;y=E;z=F;A=G}B=vx(b,v)|0;if((B|0)==0){o=A;p=z;q=y;r=x;s=w;break}else{i=A;n=z;m=y;t=x;u=w;v=B}}}g=+h[22096]*(+T(+(d|0))+1.0)*.5*1.2;h[22103]=g;h[22102]=g;do{if((s|0)==1){K=+(o|0);L=+(p|0);M=g;N=g}else{if((s|0)<=1){K=0.0;L=0.0;M=g;N=g;break}l=+(o+q|0)*.5;H=+(p+r|0)*.5;j=+(q-o|0)*1.2;I=+(r-p|0)*1.2;J=g*g*4.0;O=I*j/J;do{if(O<1.0){if(O>0.0){P=+T(O)*2.0;Q=j/P;h[22102]=Q;S=I/P;h[22103]=S;U=S;X=Q;break}if(j>0.0){Q=j*.5;h[22102]=Q;S=J/j*.5;h[22103]=S;U=S;X=Q;break}if(I<=0.0){U=g;X=g;break}Q=J/I*.5;h[22102]=Q;S=I*.5;h[22103]=S;U=S;X=Q}else{Q=j*.5;h[22102]=Q;S=I*.5;h[22103]=S;U=S;X=Q}}while(0);I=+$(+U,+X);j=X/+V(I);h[22102]=j;J=U/+W(I);h[22103]=J;K=l;L=H;M=j;N=J}}while(0);h[22104]=M*M;h[22105]=N*N;if((c[44196]|0)==2){Y=c[44184]|0}else{p=fb()|0;Y=(zc(0)|0)^p}dc(Y|0);a:do{if((f|0)==0){Y=ux(b)|0;p=(Y|0)==0;if((s|0)==0){if(p){break}else{Z=Y}while(1){N=+h[22102];M=N*(+wn()*2.0+-1.0);r=Z+8|0;h[c[(c[r>>2]|0)+132>>2]>>3]=M;M=+h[22103];N=M*(+wn()*2.0+-1.0);h[(c[(c[r>>2]|0)+132>>2]|0)+8>>3]=N;Z=vx(b,Z)|0;if((Z|0)==0){break a}}}if(p){break}else{_=Y}do{r=_+8|0;o=c[r>>2]|0;if((a[o+119|0]|0)==0){H=+h[22102];l=H*(+wn()*2.0+-1.0);h[c[(c[r>>2]|0)+132>>2]>>3]=l;l=+h[22103];H=l*(+wn()*2.0+-1.0);h[(c[(c[r>>2]|0)+132>>2]|0)+8>>3]=H}else{q=c[o+132>>2]|0;h[q>>3]=+h[q>>3]-K;q=(c[(c[r>>2]|0)+132>>2]|0)+8|0;h[q>>3]=+h[q>>3]-L}_=vx(b,_)|0;}while((_|0)!=0)}else{if((c[f>>2]|0)!=0){Y=f;do{p=Y+8|0;H=K+ +h[22102]*+V(+h[p>>3]);q=(c[Y+4>>2]|0)+8|0;h[c[(c[q>>2]|0)+132>>2]>>3]=H;H=L+ +h[22103]*+W(+h[p>>3]);h[(c[(c[q>>2]|0)+132>>2]|0)+8>>3]=H;a[(c[q>>2]|0)+119|0]=1;Y=Y+16|0;}while((c[Y>>2]|0)!=0)}Y=ux(b)|0;if((Y|0)==0){break}H=K*.1;l=L*.1;q=Y;do{Y=q+8|0;p=c[Y>>2]|0;if((c[(c[p+112>>2]|0)+8>>2]|0)==0){if((c[p+212>>2]|0)!=0){aa=38}}else{aa=38}do{if((aa|0)==38){aa=0;if((a[p+119|0]|0)!=0){r=c[p+132>>2]|0;h[r>>3]=+h[r>>3]-K;r=(c[(c[Y>>2]|0)+132>>2]|0)+8|0;h[r>>3]=+h[r>>3]-L;break}r=rw(b,q)|0;do{if((r|0)==0){aa=51}else{N=0.0;M=0.0;o=0;d=r;while(1){v=c[d>>2]&3;w=c[((v|0)==2?d:d-32|0)+28>>2]|0;u=c[((v|0)==3?d:d+32|0)+28>>2]|0;do{if((w|0)==(u|0)){ba=o;ca=M;da=N}else{v=c[((w|0)==(q|0)?u:w)+8>>2]|0;if((a[v+119|0]|0)==0){ba=o;ca=M;da=N;break}if((o|0)==0){x=c[v+132>>2]|0;ba=1;ca=+h[x>>3];da=+h[x+8>>3];break}else{U=+(o|0);x=c[v+132>>2]|0;v=o+1|0;X=+(v|0);ba=v;ca=(M*U+ +h[x>>3])/X;da=(U*N+ +h[x+8>>3])/X;break}}}while(0);w=sw(b,d,q)|0;if((w|0)==0){break}else{N=da;M=ca;o=ba;d=w}}if((ba|0)>1){h[c[(c[Y>>2]|0)+132>>2]>>3]=ca;h[(c[(c[Y>>2]|0)+132>>2]|0)+8>>3]=da;break}if((ba|0)!=1){aa=51;break}h[c[(c[Y>>2]|0)+132>>2]>>3]=H+ca*.98;h[(c[(c[Y>>2]|0)+132>>2]|0)+8>>3]=l+da*.9}}while(0);if((aa|0)==51){aa=0;M=+wn()*6.283185307179586;N=+wn()*.9;X=N*+h[22102]*+V(M);h[c[(c[Y>>2]|0)+132>>2]>>3]=X;X=N*+h[22103]*+W(M);h[(c[(c[Y>>2]|0)+132>>2]|0)+8>>3]=X}a[(c[Y>>2]|0)+119|0]=1}}while(0);q=vx(b,q)|0;}while((q|0)!=0)}}while(0);do{if((c[44182]|0)==0){aa=c[44213]|0;if((aa|0)>0){ea=0;fa=aa}else{break}while(1){aa=c[44186]|0;da=+h[22097]*+(aa-ea|0)/+(aa|0);if(da>0.0){aa=ux(b)|0;if((aa|0)!=0){ba=aa;do{aa=ba+8|0;h[(c[(c[aa>>2]|0)+112>>2]|0)+24>>3]=0.0;h[(c[(c[aa>>2]|0)+112>>2]|0)+16>>3]=0.0;ba=vx(b,ba)|0;}while((ba|0)!=0)}ba=ux(b)|0;if((ba|0)!=0){aa=ba;do{ba=vx(b,aa)|0;if((ba|0)!=0){_=aa+8|0;Z=ba;do{ba=c[(c[Z+8>>2]|0)+132>>2]|0;s=c[(c[_>>2]|0)+132>>2]|0;ca=+h[ba>>3]- +h[s>>3];l=+h[ba+8>>3]- +h[s+8>>3];oz(aa,Z,ca,l,ca*ca+l*l);Z=vx(b,Z)|0;}while((Z|0)!=0)}Z=mw(b,aa)|0;if((Z|0)!=0){_=Z;do{Z=c[((c[_>>2]&3|0)==2?_:_-32|0)+28>>2]|0;if((aa|0)!=(Z|0)){mz(aa,Z,_)}_=ow(b,_)|0;}while((_|0)!=0)}aa=vx(b,aa)|0;}while((aa|0)!=0)}nz(b,da,f);ga=c[44213]|0}else{ga=fa}aa=ea+1|0;if((aa|0)<(ga|0)){ea=aa;fa=ga}else{break}}}else{aa=Wy(Lw(b)|0)|0;Xy(aa,Lw(b)|0);_=c[44213]|0;if((_|0)>0){Z=0;s=_;while(1){_=c[44186]|0;l=+h[22097]*+(_-Z|0)/+(_|0);if(l>0.0){Yy(aa);_=ux(b)|0;if((_|0)!=0){ba=_;do{_=ba+8|0;h[(c[(c[_>>2]|0)+112>>2]|0)+24>>3]=0.0;h[(c[(c[_>>2]|0)+112>>2]|0)+16>>3]=0.0;q=c[(c[_>>2]|0)+132>>2]|0;ca=+h[22099];_=~~+R(+h[q>>3]/ca);_y(aa,_,~~+R(+h[q+8>>3]/ca),ba);ba=vx(b,ba)|0;}while((ba|0)!=0)}ba=ux(b)|0;if((ba|0)!=0){q=ba;do{ba=mw(b,q)|0;if((ba|0)!=0){_=ba;do{ba=c[((c[_>>2]&3|0)==2?_:_-32|0)+28>>2]|0;if((q|0)!=(ba|0)){mz(q,ba,_)}_=ow(b,_)|0;}while((_|0)!=0)}q=vx(b,q)|0;}while((q|0)!=0)}$y(aa,8);nz(b,l,f);ha=c[44213]|0}else{ha=s}q=Z+1|0;if((q|0)<(ha|0)){Z=q;s=ha}else{break}}}Zy(aa)}}while(0);do{if(K!=0.0|L!=0.0){ha=ux(b)|0;if((ha|0)==0){break}else{ia=ha}do{ha=ia+8|0;f=c[(c[ha>>2]|0)+132>>2]|0;h[f>>3]=K+ +h[f>>3];f=(c[(c[ha>>2]|0)+132>>2]|0)+8|0;h[f>>3]=L+ +h[f>>3];ia=vx(b,ia)|0;}while((ia|0)!=0)}}while(0);if((k|0)==0){return}h[22097]=-1.0;return}function mz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0;e=b+8|0;b=c[(c[e>>2]|0)+132>>2]|0;f=a+8|0;a=c[(c[f>>2]|0)+132>>2]|0;g=+h[b>>3]- +h[a>>3];i=+h[b+8>>3]- +h[a+8>>3];j=g*g+i*i;if(j==0.0){while(1){k=+(5-((yb()|0)%10|0)|0);l=+(5-((yb()|0)%10|0)|0);m=k*k+l*l;if(m!=0.0){n=l;o=k;p=m;break}}}else{n=i;o=g;p=j}j=+T(p);a=c[d+8>>2]|0;p=+h[a+128>>3];if((c[44183]|0)==0){q=j*p/+h[a+136>>3]}else{q=p*(j- +h[a+136>>3])/j}j=o*q;a=(c[(c[e>>2]|0)+112>>2]|0)+16|0;h[a>>3]=+h[a>>3]-j;o=n*q;a=(c[(c[e>>2]|0)+112>>2]|0)+24|0;h[a>>3]=+h[a>>3]-o;a=(c[(c[f>>2]|0)+112>>2]|0)+16|0;h[a>>3]=j+ +h[a>>3];a=(c[(c[f>>2]|0)+112>>2]|0)+24|0;h[a>>3]=o+ +h[a>>3];return}function nz(b,d,e){b=b|0;d=+d;e=e|0;var f=0.0,g=0,i=0,j=0,k=0,l=0.0,m=0.0,n=0.0,o=0.0,p=0.0,q=0,r=0.0,s=0,t=0.0,u=0.0,v=0;f=d*d;g=ux(b)|0;if((g|0)==0){return}if((e|0)==0){e=g;do{i=e+8|0;j=c[i>>2]|0;if((a[j+119|0]&2)==0){k=c[j+112>>2]|0;l=+h[k+16>>3];m=+h[k+24>>3];n=l*l+m*m;if(n<f){k=c[j+132>>2]|0;o=l+ +h[k>>3];p=m+ +h[k+8>>3];q=k}else{r=d/+T(n);k=c[j+132>>2]|0;o=l*r+ +h[k>>3];p=m*r+ +h[k+8>>3];q=k}h[q>>3]=o;h[(c[(c[i>>2]|0)+132>>2]|0)+8>>3]=p}e=vx(b,e)|0;}while((e|0)!=0);return}else{s=g}do{g=s+8|0;e=c[g>>2]|0;a:do{if((a[e+119|0]&2)==0){q=c[e+112>>2]|0;p=+h[q+16>>3];o=+h[q+24>>3];r=p*p+o*o;if(r<f){i=c[e+132>>2]|0;t=p+ +h[i>>3];u=o+ +h[i+8>>3];v=i}else{m=d/+T(r);i=c[e+132>>2]|0;t=p*m+ +h[i>>3];u=o*m+ +h[i+8>>3];v=i}m=+T(t*t/+h[22104]+u*u/+h[22105]);do{if((c[q+8>>2]|0)==0){if((c[e+212>>2]|0)!=0){break}h[v>>3]=t/m;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=u/m;break a}}while(0);if(m<1.0){h[v>>3]=t;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=u;break}else{h[v>>3]=t*.95/m;h[(c[(c[g>>2]|0)+132>>2]|0)+8>>3]=u*.95/m;break}}}while(0);s=vx(b,s)|0;}while((s|0)!=0);return}function oz(a,b,d,e,f){a=a|0;b=b|0;d=+d;e=+e;f=+f;var g=0.0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0;if(f==0.0){while(1){g=+(5-((yb()|0)%10|0)|0);i=+(5-((yb()|0)%10|0)|0);j=g*g+i*i;if(j!=0.0){k=i;l=j;m=g;break}}}else{k=e;l=f;m=d}if((c[44183]|0)==0){n=+h[22101]/l}else{d=+T(l);n=+h[22101]/(l*d)}o=a+8|0;a=c[o>>2]|0;do{if((c[(c[a+112>>2]|0)+8>>2]|0)==0){if((c[a+212>>2]|0)!=0){p=n;break}q=c[b+8>>2]|0;if((c[(c[q+112>>2]|0)+8>>2]|0)!=0){p=n;break}if((c[q+212>>2]|0)!=0){p=n;break}p=n*10.0}else{p=n}}while(0);n=m*p;a=b+8|0;b=(c[(c[a>>2]|0)+112>>2]|0)+16|0;h[b>>3]=n+ +h[b>>3];m=k*p;b=(c[(c[a>>2]|0)+112>>2]|0)+24|0;h[b>>3]=m+ +h[b>>3];b=(c[(c[o>>2]|0)+112>>2]|0)+16|0;h[b>>3]=+h[b>>3]-n;b=(c[(c[o>>2]|0)+112>>2]|0)+24|0;h[b>>3]=+h[b>>3]-m;return}function pz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0,t=0.0;a=c[b+8>>2]|0;e=c[b>>2]|0;f=c[b+4>>2]|0;b=(a|0)==0;if(!b){g=a;do{i=g|0;j=a;do{if((g|0)!=(j|0)){k=c[i>>2]|0;l=c[j>>2]|0;m=c[(c[l+8>>2]|0)+132>>2]|0;n=c[(c[k+8>>2]|0)+132>>2]|0;o=+h[m>>3]- +h[n>>3];p=+h[m+8>>3]- +h[n+8>>3];oz(k,l,o,p,o*o+p*p)}j=c[j+4>>2]|0;}while((j|0)!=0);g=c[g+4>>2]|0;}while((g|0)!=0)}g=e-1|0;j=f-1|0;i=az(d,g,j)|0;if(!((i|0)==0|b)){l=i+8|0;i=a;do{k=c[i>>2]|0;n=c[l>>2]|0;if((n|0)!=0){m=k+8|0;q=n;do{n=c[q>>2]|0;r=c[(c[n+8>>2]|0)+132>>2]|0;s=c[(c[m>>2]|0)+132>>2]|0;p=+h[r>>3]- +h[s>>3];o=+h[r+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(k,n,p,o,t)}q=c[q+4>>2]|0;}while((q|0)!=0)}i=c[i+4>>2]|0;}while((i|0)!=0)}i=az(d,g,f)|0;if(!((i|0)==0|b)){l=i+8|0;i=a;do{q=c[i>>2]|0;k=c[l>>2]|0;if((k|0)!=0){m=q+8|0;n=k;do{k=c[n>>2]|0;s=c[(c[k+8>>2]|0)+132>>2]|0;r=c[(c[m>>2]|0)+132>>2]|0;t=+h[s>>3]- +h[r>>3];o=+h[s+8>>3]- +h[r+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(q,k,t,o,p)}n=c[n+4>>2]|0;}while((n|0)!=0)}i=c[i+4>>2]|0;}while((i|0)!=0)}i=f+1|0;l=az(d,g,i)|0;if(!((l|0)==0|b)){g=l+8|0;l=a;do{n=c[l>>2]|0;q=c[g>>2]|0;if((q|0)!=0){m=n+8|0;k=q;do{q=c[k>>2]|0;r=c[(c[q+8>>2]|0)+132>>2]|0;s=c[(c[m>>2]|0)+132>>2]|0;p=+h[r>>3]- +h[s>>3];o=+h[r+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(n,q,p,o,t)}k=c[k+4>>2]|0;}while((k|0)!=0)}l=c[l+4>>2]|0;}while((l|0)!=0)}l=az(d,e,j)|0;if(!((l|0)==0|b)){g=l+8|0;l=a;do{k=c[l>>2]|0;n=c[g>>2]|0;if((n|0)!=0){m=k+8|0;q=n;do{n=c[q>>2]|0;s=c[(c[n+8>>2]|0)+132>>2]|0;r=c[(c[m>>2]|0)+132>>2]|0;t=+h[s>>3]- +h[r>>3];o=+h[s+8>>3]- +h[r+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(k,n,t,o,p)}q=c[q+4>>2]|0;}while((q|0)!=0)}l=c[l+4>>2]|0;}while((l|0)!=0)}l=az(d,e,i)|0;if(!((l|0)==0|b)){g=l+8|0;l=a;do{q=c[l>>2]|0;k=c[g>>2]|0;if((k|0)!=0){m=q+8|0;n=k;do{k=c[n>>2]|0;r=c[(c[k+8>>2]|0)+132>>2]|0;s=c[(c[m>>2]|0)+132>>2]|0;p=+h[r>>3]- +h[s>>3];o=+h[r+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(q,k,p,o,t)}n=c[n+4>>2]|0;}while((n|0)!=0)}l=c[l+4>>2]|0;}while((l|0)!=0)}l=e+1|0;e=az(d,l,j)|0;if(!((e|0)==0|b)){j=e+8|0;e=a;do{g=c[e>>2]|0;n=c[j>>2]|0;if((n|0)!=0){q=g+8|0;m=n;do{n=c[m>>2]|0;k=c[(c[n+8>>2]|0)+132>>2]|0;s=c[(c[q>>2]|0)+132>>2]|0;t=+h[k>>3]- +h[s>>3];o=+h[k+8>>3]- +h[s+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(g,n,t,o,p)}m=c[m+4>>2]|0;}while((m|0)!=0)}e=c[e+4>>2]|0;}while((e|0)!=0)}e=az(d,l,f)|0;if(!((e|0)==0|b)){f=e+8|0;e=a;do{j=c[e>>2]|0;m=c[f>>2]|0;if((m|0)!=0){g=j+8|0;q=m;do{m=c[q>>2]|0;n=c[(c[m+8>>2]|0)+132>>2]|0;s=c[(c[g>>2]|0)+132>>2]|0;p=+h[n>>3]- +h[s>>3];o=+h[n+8>>3]- +h[s+8>>3];t=p*p+o*o;if(t<+h[22100]){oz(j,m,p,o,t)}q=c[q+4>>2]|0;}while((q|0)!=0)}e=c[e+4>>2]|0;}while((e|0)!=0)}e=az(d,l,i)|0;if((e|0)==0|b){return 0}b=e+8|0;e=a;do{a=c[e>>2]|0;i=c[b>>2]|0;if((i|0)!=0){l=a+8|0;d=i;do{i=c[d>>2]|0;f=c[(c[i+8>>2]|0)+132>>2]|0;q=c[(c[l>>2]|0)+132>>2]|0;t=+h[f>>3]- +h[q>>3];o=+h[f+8>>3]- +h[q+8>>3];p=t*t+o*o;if(p<+h[22100]){oz(a,i,t,o,p)}d=c[d+4>>2]|0;}while((d|0)!=0)}e=c[e+4>>2]|0;}while((e|0)!=0);return 0}function qz(b,d){b=b|0;d=d|0;var e=0,f=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0.0,y=0.0,z=0.0,A=0.0,B=0.0,C=0.0,D=0.0,E=0.0,F=0,G=0,H=0.0,I=0.0,J=0.0,K=0,L=0.0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,U=0,V=0,W=0,X=0,Y=0,Z=0.0,_=0.0,$=0.0,aa=0.0,ba=0.0,ca=0.0,ea=0.0,fa=0,ga=0,ha=0.0,ia=0.0,ja=0.0,ka=0,la=0,ma=0.0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0.0,va=0;e=i;i=i+16|0;f=e|0;j=ew(b|0,124936)|0;if((a[213992]|0)!=0){Ma(114144,8,1,c[o>>2]|0)|0}if((j|0)==0){k=5}else{if((a[j]|0)==0){k=5}else{l=j}}if((k|0)==5){l=107192}j=gb(l|0,58)|0;do{if((j|0)==0){m=l;n=0}else{if((j|0)!=(l|0)){if(((a[l]|0)-48|0)>>>0>=10>>>0){m=l;n=0;break}}p=Rb(l|0)|0;m=j+1|0;n=(p|0)<0?0:p}}while(0);if((a[213992]|0)!=0){gc(c[o>>2]|0,101408,(j=i,i=i+16|0,c[j>>2]=n,c[j+8>>2]=m,j)|0)|0;i=j}do{if((n|0)!=0){j=f;l=Lw(b)|0;p=Mw(b)|0;or(f,b);c[53494]=c[j>>2];c[53495]=c[j+4>>2];c[53496]=c[j+8>>2];if((a[213984]|0)!=0){g[53494]=+g[53494]/72.0;g[53495]=+g[53495]/72.0}j=ux(b)|0;if((j|0)==0){i=e;return}else{q=j;r=0}while(1){j=vx(b,q)|0;if((j|0)==0){s=r}else{t=q+8|0;u=j;j=r;while(1){v=(rz(c[t>>2]|0,c[u+8>>2]|0)|0)+j|0;w=vx(b,u)|0;if((w|0)==0){s=v;break}else{u=w;j=v}}}j=vx(b,q)|0;if((j|0)==0){break}else{q=j;r=s}}if((s|0)==0){i=e;return}j=c[d>>2]|0;x=+h[d+8>>3];y=+h[d+16>>3];z=+h[d+24>>3];u=c[d+32>>2]|0;a:do{if((n|0)>0){t=z>0.0;v=x==0.0;A=+(l|0);B=+(p|0);C=+(da(l-1|0,l)|0);w=(u|0)>0;D=+(j|0);E=y;F=s;G=0;b:while(1){h[39]=E;c[74]=j;h[38]=x;c[82]=u;if(t){h[40]=z}H=E*E;h[21637]=H;if(v){I=E*+T(A)/5.0;h[38]=I;J=I}else{J=x}I=H*+h[40];h[21428]=I;h[21429]=B*I*2.0/C;c:do{if(w){I=J*D/D;if(I>0.0){K=0;L=I}else{M=F;break}while(1){N=ux(b)|0;if((N|0)!=0){O=N;do{N=O+8|0;h[(c[(c[N>>2]|0)+112>>2]|0)+24>>3]=0.0;h[(c[(c[N>>2]|0)+112>>2]|0)+16>>3]=0.0;O=vx(b,O)|0;}while((O|0)!=0)}O=ux(b)|0;if((O|0)==0){k=62;break b}else{P=O;Q=0}while(1){O=vx(b,P)|0;if((O|0)==0){R=Q}else{N=P+8|0;S=O;O=Q;while(1){U=S+8|0;V=c[U>>2]|0;W=c[V+132>>2]|0;X=c[N>>2]|0;Y=c[X+132>>2]|0;I=+h[W>>3]- +h[Y>>3];H=+h[W+8>>3]- +h[Y+8>>3];Z=I*I+H*H;if(Z==0.0){do{_=+(5-((yb()|0)%10|0)|0);$=+(5-((yb()|0)%10|0)|0);aa=_*_+$*$;}while(aa==0.0);ba=$;ca=aa;ea=_;fa=c[N>>2]|0;ga=c[U>>2]|0}else{ba=H;ca=Z;ea=I;fa=X;ga=V}Y=rz(fa,ga)|0;ha=((Y|0)==0?+h[21429]:+h[21428])/ca;ia=ea*ha;W=(c[ga+112>>2]|0)+16|0;h[W>>3]=ia+ +h[W>>3];ja=ba*ha;W=(c[(c[U>>2]|0)+112>>2]|0)+24|0;h[W>>3]=ja+ +h[W>>3];W=(c[(c[N>>2]|0)+112>>2]|0)+16|0;h[W>>3]=+h[W>>3]-ia;W=(c[(c[N>>2]|0)+112>>2]|0)+24|0;h[W>>3]=+h[W>>3]-ja;W=Y+O|0;Y=vx(b,S)|0;if((Y|0)==0){R=W;break}else{S=Y;O=W}}}O=mw(b,P)|0;if((O|0)!=0){S=P+8|0;N=O;do{O=c[S>>2]|0;W=(c[((c[N>>2]&3|0)==2?N:N-32|0)+28>>2]|0)+8|0;Y=c[W>>2]|0;if((rz(O,Y)|0)==0){ka=c[Y+132>>2]|0;la=c[O+132>>2]|0;ja=+h[ka>>3]- +h[la>>3];ia=+h[ka+8>>3]- +h[la+8>>3];ha=+T(ja*ja+ia*ia);la=(a[213984]|0)==0;ma=+h[O+32>>3];if(la){na=+g[53494];oa=+g[53495];pa=+h[O+40>>3]*oa*.5;qa=ma*na*.5;ra=na;sa=oa}else{oa=+g[53494];na=+g[53495];pa=+h[O+40>>3]*.5+na;qa=ma*.5+oa;ra=oa;sa=na}na=+T(qa*qa+pa*pa);oa=+h[Y+32>>3];if(la){ta=sa*+h[Y+40>>3]*.5;ua=ra*oa*.5}else{ta=sa+ +h[Y+40>>3]*.5;ua=ra+oa*.5}oa=na+ +T(ua*ua+ta*ta);na=ha-oa;ma=na*na/(ha*(+h[39]+oa));oa=ja*ma;la=(c[Y+112>>2]|0)+16|0;h[la>>3]=+h[la>>3]-oa;ja=ia*ma;la=(c[(c[W>>2]|0)+112>>2]|0)+24|0;h[la>>3]=+h[la>>3]-ja;la=(c[(c[S>>2]|0)+112>>2]|0)+16|0;h[la>>3]=oa+ +h[la>>3];la=(c[(c[S>>2]|0)+112>>2]|0)+24|0;h[la>>3]=ja+ +h[la>>3]}N=ow(b,N)|0;}while((N|0)!=0)}N=vx(b,P)|0;if((N|0)==0){break}else{P=N;Q=R}}if((R|0)==0){k=62;break b}ja=L*L;N=ux(b)|0;if((N|0)!=0){S=N;do{N=S+8|0;la=c[N>>2]|0;do{if((a[la+119|0]|0)!=3){W=c[la+112>>2]|0;oa=+h[W+16>>3];ma=+h[W+24>>3];ia=oa*oa+ma*ma;if(ia<ja){W=c[la+132>>2]|0;h[W>>3]=oa+ +h[W>>3];W=(c[(c[N>>2]|0)+132>>2]|0)+8|0;h[W>>3]=ma+ +h[W>>3];break}else{ha=+T(ia);W=c[la+132>>2]|0;h[W>>3]=L*oa/ha+ +h[W>>3];W=(c[(c[N>>2]|0)+132>>2]|0)+8|0;h[W>>3]=L*ma/ha+ +h[W>>3];break}}}while(0);S=vx(b,S)|0;}while((S|0)!=0)}S=K+1|0;if((S|0)>=(c[82]|0)){M=R;break c}N=c[74]|0;ja=+h[38]*+(N-S|0)/+(N|0);if(ja>0.0){K=S;L=ja}else{M=R;break}}}else{M=F}}while(0);S=G+1|0;if((M|0)!=0&(S|0)<(n|0)){E=y+E;F=M;G=S}else{va=M;break a}}if((k|0)==62){i=e;return}}else{va=s}}while(0);if((va|0)!=0){break}i=e;return}}while(0);mr(b,m)|0;i=e;return}function rz(b,d){b=b|0;d=d|0;var e=0,f=0,i=0.0,j=0.0,k=0.0,l=0.0,m=0.0,n=0.0,o=0,p=0.0,q=0.0;e=c[d+132>>2]|0;f=c[b+132>>2]|0;i=+h[e>>3]- +h[f>>3];if(i<0.0){j=-0.0-i}else{j=i}i=+h[e+8>>3]- +h[f+8>>3];if(i<0.0){k=-0.0-i}else{k=i}f=(a[213984]|0)==0;i=+h[b+32>>3];if(f){l=+g[53494];m=+h[d+32>>3]*l*.5;n=i*l*.5}else{l=+g[53494];m=+h[d+32>>3]*.5+l;n=i*.5+l}if(j>n+m){o=0;return o|0}m=+h[b+40>>3];if(f){n=+g[53495];p=+h[d+40>>3]*n*.5;q=m*n*.5}else{n=+g[53495];p=+h[d+40>>3]*.5+n;q=m*.5+n}o=k<=q+p|0;return o|0}function sz(a){a=a|0;var b=0;b=a;while(1){a=c[b>>2]|0;eF(b);if((a|0)==0){break}else{b=a}}return}function tz(){var a=0,b=0,d=0,e=0;a=jk(1992)|0;b=a;if((a|0)==0){return b|0}d=zz(b)|0;c[d+4>>2]=0;e=a+1972|0;c[e>>2]=(c[e>>2]|0)+1;c[a>>2]=d;return b|0}function uz(a){a=a|0;var b=0;b=a|0;vz(a,c[b>>2]|0);eF(c[b>>2]|0);eF(a);return 0}function vz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+1980|0;e=a+1912|0;f=a+1936|0;if((c[b+4>>2]|0)>0){g=0;do{h=b+8+(g*20|0)+16|0;i=c[h>>2]|0;do{if((i|0)!=0){vz(a,i);eF(c[h>>2]|0);Ez(b,g);c[d>>2]=(c[d>>2]|0)-1;if((c[e>>2]|0)==0){break}c[f>>2]=(c[f>>2]|0)+1}}while(0);g=g+1|0;}while((g|0)<64);return}else{g=0;do{do{if((c[b+8+(g*20|0)+16>>2]|0)!=0){Ez(b,g);c[d>>2]=(c[d>>2]|0)-1;if((c[e>>2]|0)==0){break}c[f>>2]=(c[f>>2]|0)+1}}while(0);g=g+1|0;}while((g|0)<64);return}}function wz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((b|0)==0){cc(116120,154984,194,171160);return 0}e=b+4|0;if((c[e>>2]|0)<=-1){cc(126392,154984,195,171160);return 0}if((d|0)==0){cc(114696,154984,196,171160);return 0}f=a+1952|0;c[f>>2]=(c[f>>2]|0)+1;if((c[e>>2]|0)>0){g=0;h=0}else{e=0;f=0;while(1){i=b+8+(f*20|0)|0;do{if((c[b+8+(f*20|0)+16>>2]|0)==0){j=e}else{if((Jz(d,i|0)|0)==0){j=e;break}k=jk(8)|0;c[k+4>>2]=i;c[k>>2]=e;j=k}}while(0);i=f+1|0;if((i|0)<64){e=j;f=i}else{l=j;break}}return l|0}while(1){j=b+8+(h*20|0)+16|0;do{if((c[j>>2]|0)==0){m=g}else{if((Jz(d,b+8+(h*20|0)|0)|0)==0){m=g;break}f=wz(a,c[j>>2]|0,d)|0;if((g|0)==0){m=f;break}else{n=g}do{o=n|0;n=c[o>>2]|0;}while((n|0)!=0);c[o>>2]=f;m=g}}while(0);j=h+1|0;if((j|0)<64){g=m;h=j}else{l=m;break}}return l|0}function xz(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=i;i=i+48|0;h=g|0;j=g+8|0;k=g+32|0;c[h>>2]=0;if((b|0)==0|(e|0)==0){cc(107824,154984,247,171192);return 0}if((f|0)<=-1){cc(102152,154984,248,171192);return 0}if((c[(c[e>>2]|0)+4>>2]|0)<(f|0)){cc(102152,154984,248,171192);return 0}else{l=0}while(1){m=l+1|0;if((c[b+(l<<2)>>2]|0)>(c[b+(l+2<<2)>>2]|0)){n=8;break}if((m|0)<2){l=m}else{break}}if((n|0)==8){cc(96376,154984,250,171192);return 0}l=a+1912|0;m=c[a+1908>>2]|0;do{if((c[l>>2]|0)==0){o=a+1908|0;if((m|0)==0){p=o;n=14}else{q=o}}else{if((m|0)==0){o=a+1916|0;c[o>>2]=(c[o>>2]|0)+1;p=a+1908|0;n=14;break}else{o=a+1924|0;c[o>>2]=(c[o>>2]|0)+1;q=a+1908|0;break}}}while(0);if((n|0)==14){n=a+1964|0;c[n>>2]=(c[n>>2]|0)+1;q=p}if((yz(a,b,d,c[e>>2]|0,h,f)|0)==0){r=0;i=g;return r|0}do{if((c[l>>2]|0)!=0){if((c[q>>2]|0)==0){f=a+1944|0;c[f>>2]=(c[f>>2]|0)+1;break}else{f=a+1948|0;c[f>>2]=(c[f>>2]|0)+1;break}}}while(0);q=zz(a)|0;l=a+1976|0;c[l>>2]=(c[l>>2]|0)+1;c[q+4>>2]=(c[(c[e>>2]|0)+4>>2]|0)+1;Bz(j|0,c[e>>2]|0);l=j;f=j+16|0;c[f>>2]=c[e>>2];Dz(a,j,q,0)|0;Bz(k,c[h>>2]|0);d=k;c[l>>2]=c[d>>2];c[l+4>>2]=c[d+4>>2];c[l+8>>2]=c[d+8>>2];c[l+12>>2]=c[d+12>>2];c[f>>2]=c[h>>2];Dz(a,j,q,0)|0;c[e>>2]=q;q=a+1980|0;c[q>>2]=(c[q>>2]|0)+2;r=1;i=g;return r|0}function yz(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;h=i;i=i+80|0;j=h|0;k=h+24|0;l=h+32|0;m=h+48|0;n=h+64|0;c[k>>2]=0;if((b|0)==0|(e|0)==0|(f|0)==0){cc(163272,154984,311,171176);return 0}if((g|0)<=-1){cc(159256,154984,312,171176);return 0}o=e+4|0;if((c[o>>2]|0)<(g|0)){cc(159256,154984,312,171176);return 0}do{if((c[a+1912>>2]|0)!=0){if((c[a+1908>>2]|0)==0){p=a+1944|0;c[p>>2]=(c[p>>2]|0)+1;break}else{p=a+1948|0;c[p>>2]=(c[p>>2]|0)+1;break}}}while(0);p=c[o>>2]|0;if((p|0)<=(g|0)){if((p|0)!=(g|0)){cc(154208,154984,341,171176);return 0}p=j;o=b;c[p>>2]=c[o>>2];c[p+4>>2]=c[o+4>>2];c[p+8>>2]=c[o+8>>2];c[p+12>>2]=c[o+12>>2];c[j+16>>2]=d;o=a+1980|0;c[o>>2]=(c[o>>2]|0)+1;q=Dz(a,j,e,f)|0;i=h;return q|0}o=Cz(b,e)|0;p=e+8+(o*20|0)+16|0;r=e+8+(o*20|0)|0;if((yz(a,b,d,c[p>>2]|0,k,g)|0)==0){Iz(l,b,r);b=r;g=l;c[b>>2]=c[g>>2];c[b+4>>2]=c[g+4>>2];c[b+8>>2]=c[g+8>>2];c[b+12>>2]=c[g+12>>2];q=0;i=h;return q|0}else{Bz(m,c[p>>2]|0);p=r;r=m;c[p>>2]=c[r>>2];c[p+4>>2]=c[r+4>>2];c[p+8>>2]=c[r+8>>2];c[p+12>>2]=c[r+12>>2];r=c[k>>2]|0;c[j+16>>2]=r;Bz(n,r);r=j;k=n;c[r>>2]=c[k>>2];c[r+4>>2]=c[k+4>>2];c[r+8>>2]=c[k+8>>2];c[r+12>>2]=c[k+12>>2];k=a+1980|0;c[k>>2]=(c[k>>2]|0)+1;q=Dz(a,j,e,f)|0;i=h;return q|0}return 0}function zz(a){a=a|0;var b=0;b=a+1968|0;c[b>>2]=(c[b>>2]|0)+1;b=dF(1288)|0;a=b;c[b>>2]=0;c[b+4>>2]=-1;b=0;do{Fz(a+8+(b*20|0)|0);c[a+8+(b*20|0)+16>>2]=0;b=b+1|0;}while((b|0)<64);return a|0}function Az(a){a=a|0;var b=0;c[a>>2]=0;c[a+4>>2]=-1;b=0;do{Fz(a+8+(b*20|0)|0);c[a+8+(b*20|0)+16>>2]=0;b=b+1|0;}while((b|0)<64);return}function Bz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0;d=i;i=i+32|0;e=d|0;f=d+16|0;if((b|0)==0){cc(81248,164736,99,171248)}Fz(e);g=e;h=f;j=0;k=1;while(1){do{if((c[b+8+(j*20|0)+16>>2]|0)==0){l=k}else{m=b+8+(j*20|0)|0;if((k|0)==0){Iz(f,e,m);c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];l=0;break}else{n=m;c[g>>2]=c[n>>2];c[g+4>>2]=c[n+4>>2];c[g+8>>2]=c[n+8>>2];c[g+12>>2]=c[n+12>>2];l=0;break}}}while(0);n=j+1|0;if((n|0)<64){j=n;k=l}else{break}}l=a;c[l>>2]=c[g>>2];c[l+4>>2]=c[g+4>>2];c[l+8>>2]=c[g+8>>2];c[l+12>>2]=c[g+12>>2];i=d;return}function Cz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=i;i=i+32|0;e=d|0;f=d+16|0;if((a|0)==0|(b|0)==0){cc(132216,164736,125,171224);return 0}g=e;h=f;j=0;k=1;l=0;m=0;n=0;while(1){do{if((c[b+8+(j*20|0)+16>>2]|0)==0){o=n;p=m;q=l;r=k}else{s=b+8+(j*20|0)|0;t=Hz(s)|0;Iz(f,a,s);c[g>>2]=c[h>>2];c[g+4>>2]=c[h+4>>2];c[g+8>>2]=c[h+8>>2];c[g+12>>2]=c[h+12>>2];s=(Hz(e)|0)-t|0;if(!((s|0)>=(l|0)&(k|0)==0)){o=j;p=t;q=s;r=0;break}u=(s|0)==(l|0)&(t|0)<(m|0);o=u?j:n;p=u?t:m;q=u?s:l;r=0}}while(0);s=j+1|0;if((s|0)<64){j=s;k=r;l=q;m=p;n=o}else{break}}i=d;return o|0}function Dz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0;if((b|0)==0){cc(116928,164736,167,171360);return 0}if((d|0)==0){cc(81248,164736,168,171360);return 0}f=d|0;if((c[f>>2]|0)<64){g=0;while(1){h=g+1|0;if((c[d+8+(g*20|0)+16>>2]|0)==0){break}if((h|0)<64){g=h}else{i=9;break}}if((i|0)==9){cc(109424,164736,178,171360);return 0}i=d+8+(g*20|0)|0;g=b;c[i>>2]=c[g>>2];c[i+4>>2]=c[g+4>>2];c[i+8>>2]=c[g+8>>2];c[i+12>>2]=c[g+12>>2];c[i+16>>2]=c[g+16>>2];c[f>>2]=(c[f>>2]|0)+1;j=0;return j|0}do{if((c[a+1912>>2]|0)!=0){if((c[a+1908>>2]|0)==0){f=a+1944|0;c[f>>2]=(c[f>>2]|0)+1;break}else{f=a+1948|0;c[f>>2]=(c[f>>2]|0)+1;break}}}while(0);if((e|0)==0){cc(103392,164736,187,171360);return 0}Kz(a,d,b,e);if((c[d+4>>2]|0)==0){d=a+1972|0;c[d>>2]=(c[d>>2]|0)+1;j=1;return j|0}else{d=a+1976|0;c[d>>2]=(c[d>>2]|0)+1;j=1;return j|0}return 0}function Ez(a,b){a=a|0;b=b|0;var d=0;if(!((a|0)!=0&b>>>0<64>>>0)){cc(97840,164736,201,171312)}d=a+8+(b*20|0)+16|0;if((c[d>>2]|0)==0){cc(92240,164736,202,171312)}else{Fz(a+8+(b*20|0)|0);c[d>>2]=0;d=a|0;c[d>>2]=(c[d>>2]|0)-1;return}}function Fz(a){a=a|0;vF(a|0,0,16)|0;return}function Gz(a){a=a|0;var b=0,d=0,e=0;b=i;i=i+16|0;d=b|0;c[d>>2]=1;c[d+8>>2]=-1;c[d+12>>2]=0;c[d+4>>2]=0;e=a;a=d;c[e>>2]=c[a>>2];c[e+4>>2]=c[a+4>>2];c[e+8>>2]=c[a+8>>2];c[e+12>>2]=c[a+12>>2];i=b;return}function Hz(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;b=i;if((a|0)==0){cc(118600,156592,154,171144);return 0}d=c[a>>2]|0;if((d|0)>(c[a+8>>2]|0)){e=0;i=b;return e|0}else{f=0;g=1;h=d}while(1){d=(c[a+(f+2<<2)>>2]|0)-h|0;j=da(d,g)|0;k=f+1|0;if(((j>>>0)/(d>>>0)|0|0)!=(g|0)){break}if((k|0)>=2){e=j;l=8;break}f=k;g=j;h=c[a+(k<<2)>>2]|0}if((l|0)==8){i=b;return e|0}Fv(1,126672,(l=i,i=i+1|0,i=i+7&-8,c[l>>2]=0,l)|0)|0;i=l;e=-1;i=b;return e|0}function Iz(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0;e=i;i=i+16|0;f=e|0;if((b|0)==0|(d|0)==0){cc(114688,156592,197,171328)}g=c[b>>2]|0;h=c[b+8>>2]|0;if((g|0)>(h|0)){j=a;k=d;c[j>>2]=c[k>>2];c[j+4>>2]=c[k+4>>2];c[j+8>>2]=c[k+8>>2];c[j+12>>2]=c[k+12>>2];i=e;return}k=c[d>>2]|0;j=c[d+8>>2]|0;if((k|0)>(j|0)){l=a;m=b;c[l>>2]=c[m>>2];c[l+4>>2]=c[m+4>>2];c[l+8>>2]=c[m+8>>2];c[l+12>>2]=c[m+12>>2];i=e;return}else{c[f>>2]=(g|0)<(k|0)?g:k;c[f+8>>2]=(h|0)>(j|0)?h:j;j=c[b+4>>2]|0;h=c[d+4>>2]|0;c[f+4>>2]=(j|0)<(h|0)?j:h;h=c[b+12>>2]|0;b=c[d+12>>2]|0;c[f+12>>2]=(h|0)>(b|0)?h:b;b=a;a=f;c[b>>2]=c[a>>2];c[b+4>>2]=c[a+4>>2];c[b+8>>2]=c[a+8>>2];c[b+12>>2]=c[a+12>>2];i=e;return}}function Jz(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0;if((a|0)==0|(b|0)==0){cc(107560,156592,218,171240);return 0}else{d=0}while(1){e=d+2|0;if((c[a+(d<<2)>>2]|0)>(c[b+(e<<2)>>2]|0)){f=0;g=6;break}h=d+1|0;if((c[b+(d<<2)>>2]|0)>(c[a+(e<<2)>>2]|0)){f=0;g=6;break}if((h|0)<2){d=h}else{f=1;g=6;break}}if((g|0)==6){return f|0}return 0}function Kz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;f=i;i=i+440|0;h=f|0;j=f+16|0;k=f+32|0;l=f+48|0;m=f+64|0;n=f+328|0;o=f+344|0;p=f+360|0;q=f+376|0;r=f+392|0;s=f+408|0;t=f+424|0;if((b|0)==0){cc(108600,150992,40,171128)}if((d|0)==0){cc(123264,150992,41,171128)}u=a+1912|0;do{if((c[u>>2]|0)!=0){if((c[a+1908>>2]|0)==0){v=a+1928|0;c[v>>2]=(c[v>>2]|0)+1;break}else{v=a+1932|0;c[v>>2]=(c[v>>2]|0)+1;break}}}while(0);v=b+4|0;w=c[v>>2]|0;x=t;y=0;do{if((c[b+8+(y*20|0)+16>>2]|0)==0){z=11;break}A=a+4+(y*20|0)|0;B=b+8+(y*20|0)|0;c[A>>2]=c[B>>2];c[A+4>>2]=c[B+4>>2];c[A+8>>2]=c[B+8>>2];c[A+12>>2]=c[B+12>>2];c[A+16>>2]=c[B+16>>2];y=y+1|0;}while((y|0)<64);if((z|0)==11){cc(166560,150992,111,171296)}y=a+1284|0;B=d;c[y>>2]=c[B>>2];c[y+4>>2]=c[B+4>>2];c[y+8>>2]=c[B+8>>2];c[y+12>>2]=c[B+12>>2];c[y+16>>2]=c[B+16>>2];B=a+1304|0;y=B;d=a+4|0;c[y>>2]=c[d>>2];c[y+4>>2]=c[d+4>>2];c[y+8>>2]=c[d+8>>2];c[y+12>>2]=c[d+12>>2];d=1;do{Iz(t,B,a+4+(d*20|0)|0);c[y>>2]=c[x>>2];c[y+4>>2]=c[x+4>>2];c[y+8>>2]=c[x+8>>2];c[y+12>>2]=c[x+12>>2];d=d+1|0;}while((d|0)<65);d=a+1320|0;c[d>>2]=Hz(B)|0;Az(b);B=q;x=r;y=s;t=p;A=a+1848|0;c[A>>2]=0;C=a+1844|0;c[C>>2]=0;D=a+1868|0;Gz(p);p=D;c[p>>2]=c[t>>2];c[p+4>>2]=c[t+4>>2];c[p+8>>2]=c[t+8>>2];c[p+12>>2]=c[t+12>>2];E=a+1852|0;c[E>>2]=c[t>>2];c[E+4>>2]=c[t+4>>2];c[E+8>>2]=c[t+8>>2];c[E+12>>2]=c[t+12>>2];t=a+1888|0;c[t>>2]=0;E=a+1884|0;c[E>>2]=0;F=0;do{c[a+1584+(F<<2)>>2]=0;c[a+1324+(F<<2)>>2]=-1;F=F+1|0;}while((F|0)<65);F=n;G=o;H=0;while(1){c[m+(H<<2)>>2]=Hz(a+4+(H*20|0)|0)|0;I=H+1|0;if((I|0)<65){H=I}else{J=0;K=0;L=0;M=0;break}}while(1){H=J+1|0;I=a+4+(J*20|0)|0;N=c[m+(J<<2)>>2]|0;O=H;P=K;Q=L;R=M;do{Iz(o,I,a+4+(O*20|0)|0);c[F>>2]=c[G>>2];c[F+4>>2]=c[G+4>>2];c[F+8>>2]=c[G+8>>2];c[F+12>>2]=c[G+12>>2];S=(Hz(n)|0)-N|0;T=S-(c[m+(O<<2)>>2]|0)|0;S=T>>>0>P>>>0;P=S?T:P;Q=S?J:Q;R=S?O:R;O=O+1|0;}while((O|0)<65);if((H|0)<64){J=H;K=P;L=Q;M=R}else{break}}M=l;L=a+1584+(Q<<2)|0;if((c[L>>2]|0)!=0){cc(80304,150992,257,171344)}c[a+1324+(Q<<2)>>2]=0;c[L>>2]=1;L=a+1852|0;K=a+4+(Q*20|0)|0;if((c[C>>2]|0)==0){Q=L;J=K;c[Q>>2]=c[J>>2];c[Q+4>>2]=c[J+4>>2];c[Q+8>>2]=c[J+8>>2];c[Q+12>>2]=c[J+12>>2]}else{Iz(l,K,L);K=L;c[K>>2]=c[M>>2];c[K+4>>2]=c[M+4>>2];c[K+8>>2]=c[M+8>>2];c[K+12>>2]=c[M+12>>2]}c[E>>2]=Hz(L)|0;c[C>>2]=(c[C>>2]|0)+1;M=k;K=a+1584+(R<<2)|0;if((c[K>>2]|0)!=0){cc(80304,150992,257,171344)}c[a+1324+(R<<2)>>2]=1;c[K>>2]=1;K=a+4+(R*20|0)|0;if((c[A>>2]|0)==0){R=K;c[p>>2]=c[R>>2];c[p+4>>2]=c[R+4>>2];c[p+8>>2]=c[R+8>>2];c[p+12>>2]=c[R+12>>2]}else{Iz(k,K,D);c[p>>2]=c[M>>2];c[p+4>>2]=c[M+4>>2];c[p+8>>2]=c[M+8>>2];c[p+12>>2]=c[M+12>>2]}c[t>>2]=Hz(D)|0;M=(c[A>>2]|0)+1|0;c[A>>2]=M;p=c[C>>2]|0;a:do{if((p+M|0)<65){K=a+1892|0;k=j;R=0;l=0;J=p;Q=M;while(1){m=65-(c[K>>2]|0)|0;if((J|0)<(m|0)&(Q|0)<(m|0)){U=0;V=-1;W=R;X=l}else{Y=J;Z=Q;break a}while(1){do{if((c[a+1584+(U<<2)>>2]|0)==0){m=a+4+(U*20|0)|0;Iz(r,m,L);c[B>>2]=c[x>>2];c[B+4>>2]=c[x+4>>2];c[B+8>>2]=c[x+8>>2];c[B+12>>2]=c[x+12>>2];n=Hz(q)|0;G=c[E>>2]|0;Iz(s,m,D);c[B>>2]=c[y>>2];c[B+4>>2]=c[y+4>>2];c[B+8>>2]=c[y+8>>2];c[B+12>>2]=c[y+12>>2];m=Hz(q)|0;F=m-(c[t>>2]|0)+(G-n)|0;n=(F|0)>-1?F:-F|0;G=F>>>31;if((n|0)>(V|0)){_=G;$=U;aa=n;break}if((n|0)!=(V|0)){_=X;$=W;aa=V;break}n=(c[a+1844+(G<<2)>>2]|0)<(c[a+1844+(X<<2)>>2]|0);_=n?G:X;$=n?U:W;aa=V}else{_=X;$=W;aa=V}}while(0);n=U+1|0;if((n|0)<65){U=n;V=aa;W=$;X=_}else{break}}n=a+1584+($<<2)|0;if((c[n>>2]|0)!=0){break}c[a+1324+($<<2)>>2]=_;c[n>>2]=1;n=a+1844+(_<<2)|0;G=a+1852+(_<<4)|0;F=a+4+($*20|0)|0;if((c[n>>2]|0)==0){m=G;o=F;c[m>>2]=c[o>>2];c[m+4>>2]=c[o+4>>2];c[m+8>>2]=c[o+8>>2];c[m+12>>2]=c[o+12>>2]}else{Iz(j,F,G);F=G;c[F>>2]=c[k>>2];c[F+4>>2]=c[k+4>>2];c[F+8>>2]=c[k+8>>2];c[F+12>>2]=c[k+12>>2]}c[a+1884+(_<<2)>>2]=Hz(G)|0;c[n>>2]=(c[n>>2]|0)+1;n=c[C>>2]|0;G=c[A>>2]|0;if((G+n|0)<65){R=$;l=_;J=n;Q=G}else{Y=n;Z=G;break a}}cc(80304,150992,257,171344)}else{Y=p;Z=M}}while(0);if((Y+Z|0)<65){M=(Y|0)>=(65-(c[a+1892>>2]|0)|0)|0;p=h;_=a+1844+(M<<2)|0;$=a+1852+(M<<4)|0;j=$;X=a+1884+(M<<2)|0;W=0;do{aa=a+1584+(W<<2)|0;if((c[aa>>2]|0)==0){c[a+1324+(W<<2)>>2]=M;c[aa>>2]=1;aa=a+4+(W*20|0)|0;if((c[_>>2]|0)==0){V=aa;c[j>>2]=c[V>>2];c[j+4>>2]=c[V+4>>2];c[j+8>>2]=c[V+8>>2];c[j+12>>2]=c[V+12>>2]}else{Iz(h,aa,$);c[j>>2]=c[p>>2];c[j+4>>2]=c[p+4>>2];c[j+8>>2]=c[p+8>>2];c[j+12>>2]=c[p+12>>2]}c[X>>2]=Hz($)|0;c[_>>2]=(c[_>>2]|0)+1;}W=W+1|0;}while((W|0)<65);ba=c[C>>2]|0;ca=c[A>>2]|0}else{ba=Y;ca=Z}if((ba+ca|0)!=65){cc(90120,150992,210,171264)}Z=c[a+1892>>2]|0;if((ba|0)<(Z|0)|(ca|0)<(Z|0)){cc(84992,150992,212,171264)}Z=Hz(L)|0;L=(Hz(D)|0)+Z|0;do{if((c[u>>2]|0)!=0){if((c[a+1908>>2]|0)!=0|(L|0)==0){break}Z=a+1960|0;g[Z>>2]=+((c[d>>2]|0)>>>0>>>0)/+(L|0)+ +g[Z>>2]}}while(0);c[e>>2]=zz(a)|0;c[v>>2]=w;c[(c[e>>2]|0)+4>>2]=w;w=c[e>>2]|0;if((w|0)==0){cc(106776,150992,298,171280)}else{da=0}do{v=c[a+1324+(da<<2)>>2]|0;if(v>>>0>=2>>>0){z=65;break}if((v|0)==0){Dz(a,a+4+(da*20|0)|0,b,0)|0}else if((v|0)==1){Dz(a,a+4+(da*20|0)|0,w,0)|0}da=da+1|0;}while((da|0)<65);if((z|0)==65){cc(95440,150992,303,171280)}if(((c[c[e>>2]>>2]|0)+(c[b>>2]|0)|0)==65){i=f;return}else{cc(113536,150992,86,171128)}}function Lz(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;return(c[b>>2]|0)-(c[d>>2]|0)|0}
+
+
+
+function Lo(b,d,e,f,g){b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0.0,H=0,I=0,J=0,K=0.0,L=0,M=0,N=0,O=0,P=0,Q=0.0,R=0.0,S=0.0,T=0.0,U=0.0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0.0,ja=0,ka=0.0,la=0.0,ma=0,na=0.0,oa=0.0,pa=0.0,qa=0.0,ra=0.0,sa=0.0,ta=0.0,ua=0,va=0,wa=0.0,xa=0.0,ya=0.0,za=0.0,Aa=0,Ba=0.0,Ca=0.0,Da=0.0,Ea=0.0,Fa=0.0,Ga=0.0,Ha=0.0,Ia=0.0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0.0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0.0,sb=0.0,tb=0.0,ub=0.0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0.0,Cb=0.0,Db=0,Eb=0.0,Fb=0.0,Gb=0.0,Hb=0.0,Ib=0.0,Kb=0.0,Lb=0.0,Mb=0.0;j=i;i=i+272|0;k=j|0;l=j+8|0;m=j+16|0;n=j+176|0;o=j+192|0;p=j+208|0;q=f;r=f+32|0;s=Hx(c[((c[q>>2]&3|0)==3?f:r)+28>>2]|0)|0;t=c[q>>2]&3;q=c[((t|0)==3?f:r)+28>>2]|0;r=c[((t|0)==2?f:f-32|0)+28>>2]|0;f=(e|0)>0;do{if(f){t=0;u=0;v=0;while(1){w=c[(c[b+(t+d<<2)>>2]|0)+8>>2]|0;x=((c[w+96>>2]|0)!=0)+v|0;if((a[w+44|0]|0)==0){if((a[w+84|0]|0)==0){y=u}else{z=4}}else{z=4}if((z|0)==4){z=0;y=1}w=t+1|0;if((w|0)<(e|0)){t=w;u=y;v=x}else{break}}if((y|0)==0){if((x|0)==0){break}v=m;u=n;t=o;w=c[b+(d<<2)>>2]|0;A=jk(e<<2)|0;B=A;if(f){C=0;do{c[B+(C<<2)>>2]=c[b+(C+d<<2)>>2];C=C+1|0;}while((C|0)<(e|0))}Jb(A|0,e|0,4,152);C=c[q+8>>2]|0;D=w+8|0;E=c[D>>2]|0;F=+h[C+16>>3]+ +h[E+16>>3];G=+h[C+24>>3]+ +h[E+24>>3];E=n|0;h[E>>3]=F;H=n+8|0;h[H>>3]=G;I=c[r+8>>2]|0;J=c[D>>2]|0;G=+h[I+16>>3]+ +h[J+56>>3];K=+h[I+24>>3]+ +h[J+64>>3];J=o|0;h[J>>3]=G;D=o+8|0;h[D>>3]=K;K=F+ +h[C+96>>3];F=G- +h[I+88>>3];G=(K+F)*.5;I=c[B>>2]|0;C=m|0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];L=m+16|0;M=L;c[M>>2]=c[u>>2];c[M+4>>2]=c[u+4>>2];c[M+8>>2]=c[u+8>>2];c[M+12>>2]=c[u+12>>2];M=m+32|0;N=M;c[N>>2]=c[t>>2];c[N+4>>2]=c[t+4>>2];c[N+8>>2]=c[t+8>>2];c[N+12>>2]=c[t+12>>2];N=m+48|0;O=N;c[O>>2]=c[t>>2];c[O+4>>2]=c[t+4>>2];c[O+8>>2]=c[t+8>>2];c[O+12>>2]=c[t+12>>2];cm(I,c[((c[I>>2]&3|0)==2?I:I-32|0)+28>>2]|0,C,4,11848);P=I+8|0;h[(c[(c[P>>2]|0)+96>>2]|0)+56>>3]=G;I=c[(c[P>>2]|0)+96>>2]|0;h[I+64>>3]=+h[H>>3]+(+h[I+32>>3]+6.0)*.5;a[(c[(c[P>>2]|0)+96>>2]|0)+81|0]=1;Q=+h[H>>3]+3.0;I=c[(c[P>>2]|0)+96>>2]|0;R=Q+ +h[I+32>>3];S=+h[I+24>>3]*.5;T=G-S;U=G+S;a:do{if((x|0)>1){I=L|0;P=m+24|0;V=M|0;W=m+40|0;X=N|0;Y=m+56|0;Z=m+64|0;_=m+72|0;$=m+80|0;aa=m+88|0;ba=m+96|0;ca=m+104|0;da=m+112|0;ea=m+120|0;fa=k+4|0;ga=k|0;ha=(g|0)==6|0;S=Q;ia=R;ja=1;ka=0.0;la=0.0;while(1){ma=c[B+(ja<<2)>>2]|0;if((ja&1|0)==0){c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[I>>3]=T;h[P>>3]=+h[H>>3];h[V>>3]=T;h[W>>3]=ia;h[X>>3]=U;h[Y>>3]=ia;h[Z>>3]=U;na=+h[D>>3];h[_>>3]=na;oa=+h[J>>3];h[$>>3]=oa;h[aa>>3]=na;h[ba>>3]=oa;oa=ia+6.0;h[ca>>3]=oa;h[da>>3]=+h[E>>3];h[ea>>3]=oa;oa=+h[(c[(c[ma+8>>2]|0)+96>>2]|0)+32>>3];pa=la;qa=ka;ra=ia+(oa+6.0);sa=S;ta=ia+oa*.5+6.0}else{ua=ma+8|0;va=c[(c[ua>>2]|0)+96>>2]|0;if((ja|0)==1){oa=+h[va+24>>3]*.5;wa=G+oa;xa=G-oa}else{wa=la;xa=ka}oa=S-(+h[va+32>>3]+6.0);c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[I>>3]=+h[E>>3];na=oa+-6.0;h[P>>3]=na;h[V>>3]=+h[J>>3];h[W>>3]=na;c[O>>2]=c[t>>2];c[O+4>>2]=c[t+4>>2];c[O+8>>2]=c[t+8>>2];c[O+12>>2]=c[t+12>>2];h[Z>>3]=wa;h[_>>3]=+h[D>>3];h[$>>3]=wa;h[aa>>3]=oa;h[ba>>3]=xa;h[ca>>3]=oa;h[da>>3]=xa;h[ea>>3]=+h[H>>3];pa=wa;qa=xa;ra=ia;sa=oa;ta=oa+ +h[(c[(c[ua>>2]|0)+96>>2]|0)+32>>3]*.5}c[fa>>2]=8;c[ga>>2]=C;ua=fl(n,o,k,l,ha)|0;if((c[l>>2]|0)==0){break}va=ma+8|0;h[(c[(c[va>>2]|0)+96>>2]|0)+56>>3]=G;h[(c[(c[va>>2]|0)+96>>2]|0)+64>>3]=ta;a[(c[(c[va>>2]|0)+96>>2]|0)+81|0]=1;cm(ma,c[((c[ma>>2]&3|0)==2?ma:ma-32|0)+28>>2]|0,ua,c[l>>2]|0,11848);ua=ja+1|0;if((ua|0)<(x|0)){S=sa;ia=ra;ja=ua;ka=qa;la=pa}else{ya=sa;za=ra;Aa=ua;Ba=qa;Ca=pa;break a}}i=j;return}else{ya=Q;za=R;Aa=1;Ba=0.0;Ca=0.0}}while(0);b:do{if((Aa|0)<(e|0)){w=L|0;ja=m+24|0;ha=M|0;ga=m+40|0;fa=N|0;ea=m+56|0;da=m+64|0;ca=m+72|0;ba=m+80|0;aa=m+88|0;$=m+96|0;_=m+104|0;Z=m+112|0;W=m+120|0;V=k+4|0;P=k|0;I=(g|0)==6|0;R=(K*2.0+F)/3.0;Q=(K+F*2.0)/3.0;G=ya;la=za;Y=Aa;ka=Ba;ia=Ca;while(1){X=c[B+(Y<<2)>>2]|0;if((Y&1|0)==0){c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[w>>3]=T;h[ja>>3]=+h[H>>3];h[ha>>3]=T;h[ga>>3]=la;h[fa>>3]=U;h[ea>>3]=la;h[da>>3]=U;S=+h[D>>3];h[ca>>3]=S;oa=+h[J>>3];h[ba>>3]=oa;h[aa>>3]=S;h[$>>3]=oa;oa=la+6.0;h[_>>3]=oa;h[Z>>3]=+h[E>>3];Da=ia;Ea=ka;Fa=oa;Ga=G;Ha=oa}else{ua=(Y|0)==1;oa=ua?R:ka;S=ua?Q:ia;na=G+-6.0;c[v>>2]=c[u>>2];c[v+4>>2]=c[u+4>>2];c[v+8>>2]=c[u+8>>2];c[v+12>>2]=c[u+12>>2];h[w>>3]=+h[E>>3];Ia=na+-6.0;h[ja>>3]=Ia;h[ha>>3]=+h[J>>3];h[ga>>3]=Ia;c[O>>2]=c[t>>2];c[O+4>>2]=c[t+4>>2];c[O+8>>2]=c[t+8>>2];c[O+12>>2]=c[t+12>>2];h[da>>3]=S;h[ca>>3]=+h[D>>3];h[ba>>3]=S;h[aa>>3]=na;h[$>>3]=oa;h[_>>3]=na;h[Z>>3]=oa;Da=S;Ea=oa;Fa=la;Ga=na;Ha=+h[H>>3]}h[W>>3]=Ha;c[V>>2]=8;c[P>>2]=C;ua=fl(n,o,k,l,I)|0;ma=c[l>>2]|0;if((ma|0)==0){break}cm(X,c[((c[X>>2]&3|0)==2?X:X-32|0)+28>>2]|0,ua,ma,11848);ma=Y+1|0;if((ma|0)<(e|0)){G=Ga;la=Fa;Y=ma;ka=Ea;ia=Da}else{break b}}i=j;return}}while(0);eF(A);i=j;return}C=jk(156)|0;if((Nw(s)|0)==0){Ja=Hw(162440,173920,0)|0}else{Ja=Hw(162440,173944,0)|0}Wx(Ja|0,106832,272,1)|0;Wv(Ja,0,101184,213456)|0;H=jk(96)|0;D=Ja+8|0;c[(c[D>>2]|0)+8>>2]=H;H=s+8|0;h[c[(c[D>>2]|0)+8>>2]>>3]=+h[c[(c[H>>2]|0)+8>>2]>>3];h[(c[(c[D>>2]|0)+8>>2]|0)+24>>3]=+h[(c[(c[H>>2]|0)+8>>2]|0)+24>>3];a[(c[D>>2]|0)+115|0]=a[(c[H>>2]|0)+115|0]|0;c[(c[D>>2]|0)+116>>2]=(c[(c[H>>2]|0)+116>>2]&1|0)==0?1:0;c[(c[D>>2]|0)+236>>2]=c[(c[H>>2]|0)+236>>2];c[(c[D>>2]|0)+240>>2]=c[(c[H>>2]|0)+240>>2];t=s|0;O=Xv(Ix(t)|0,1,0)|0;J=Xv(Ix(t)|0,1,O)|0;if((J|0)!=0){O=J;do{Wv(Ja,1,c[O+8>>2]|0,c[O+12>>2]|0)|0;O=Xv(Ix(t)|0,1,O)|0;}while((O|0)!=0)}O=Xv(Ix(t)|0,2,0)|0;A=Xv(Ix(t)|0,2,O)|0;if((A|0)!=0){O=A;do{Wv(Ja,2,c[O+8>>2]|0,c[O+12>>2]|0)|0;O=Xv(Ix(t)|0,2,O)|0;}while((O|0)!=0)}if((Wv(Ja,2,153464,0)|0)==0){Wv(Ja,2,153464,213456)|0}if((Wv(Ja,2,151416,0)|0)==0){Wv(Ja,2,151416,213456)|0}O=C;c[O>>2]=c[53812];t=C+4|0;c[t>>2]=c[53770];A=C+8|0;c[A>>2]=c[53768];J=C+12|0;c[J>>2]=c[53750];E=C+16|0;c[E>>2]=c[53774];u=C+20|0;c[u>>2]=c[53800];v=C+24|0;c[v>>2]=c[53798];B=C+28|0;c[B>>2]=c[53796];N=C+32|0;c[N>>2]=c[53794];M=C+36|0;c[M>>2]=c[53792];L=C+40|0;c[L>>2]=c[53790];Y=C+44|0;c[Y>>2]=c[53788];I=C+48|0;c[I>>2]=c[53782];P=C+52|0;c[P>>2]=c[53780];V=C+56|0;c[V>>2]=c[53778];W=C+60|0;c[W>>2]=c[53758];Z=C+64|0;c[Z>>2]=c[53756];_=C+68|0;c[_>>2]=c[53748];$=C+72|0;c[$>>2]=c[53618];aa=C+76|0;c[aa>>2]=c[53574];ba=C+80|0;c[ba>>2]=c[53590];ca=C+84|0;c[ca>>2]=c[53582];da=C+88|0;c[da>>2]=c[53624];ga=C+92|0;c[ga>>2]=c[53626];ha=C+96|0;c[ha>>2]=c[53628];ja=C+100|0;c[ja>>2]=c[53614];w=C+104|0;c[w>>2]=c[53572];ea=C+108|0;c[ea>>2]=c[53588];fa=C+112|0;c[fa>>2]=c[53604];ma=C+116|0;c[ma>>2]=c[53586];ua=C+120|0;c[ua>>2]=c[53598];X=C+124|0;c[X>>2]=c[53584];va=C+128|0;c[va>>2]=c[53602];Ka=C+132|0;c[Ka>>2]=c[53636];La=C+136|0;c[La>>2]=c[53630];Ma=C+140|0;c[Ma>>2]=c[53606];Na=C+144|0;c[Na>>2]=c[53620];Oa=C+152|0;c[Oa>>2]=c[53522];Pa=C+148|0;c[Pa>>2]=c[53718];c[53812]=0;c[53770]=Wv(Ja,2,147448,0)|0;c[53768]=Wv(Ja,2,144280,0)|0;Qa=Wv(Ja,2,142360,0)|0;c[53750]=Qa;if((Qa|0)==0){c[53750]=Wv(Ja,2,142360,213456)|0}c[53774]=0;c[53800]=0;c[53798]=Wv(Ja,2,139248,0)|0;c[53796]=Wv(Ja,2,135624,0)|0;c[53794]=Wv(Ja,2,133768,0)|0;c[53792]=0;c[53790]=Wv(Ja,2,166600,0)|0;c[53788]=Wv(Ja,2,131720,0)|0;c[53782]=0;c[53780]=Wv(Ja,2,128320,0)|0;c[53778]=Wv(Ja,2,126248,0)|0;c[53758]=Wv(Ja,2,123736,0)|0;c[53756]=0;c[53748]=0;c[53618]=Wv(Ja,1,121824,0)|0;c[53574]=Wv(Ja,1,120688,0)|0;c[53590]=Wv(Ja,1,119936,0)|0;c[53582]=0;c[53624]=Wv(Ja,1,135624,0)|0;c[53626]=Wv(Ja,1,139248,0)|0;c[53628]=0;c[53614]=Wv(Ja,1,166600,0)|0;c[53572]=0;c[53588]=0;c[53604]=Wv(Ja,1,119384,0)|0;c[53586]=Wv(Ja,1,118704,0)|0;c[53598]=Wv(Ja,1,117792,0)|0;c[53584]=Wv(Ja,1,116864,0)|0;c[53602]=Wv(Ja,1,115952,0)|0;c[53636]=Wv(Ja,1,114632,0)|0;c[53630]=Wv(Ja,1,113792,0)|0;c[53606]=0;c[53620]=0;c[53718]=Wv(Ja,0,119384,0)|0;Qa=ry(Ja,113672,1)|0;Ra=Qa|0;Wx(Ra,106832,272,1)|0;gw(Ra,101184,95624)|0;Ra=~~+h[(c[r+8>>2]|0)+16>>3];Sa=~~+h[(c[q+8>>2]|0)+16>>3];Ta=(c[(c[H>>2]|0)+116>>2]&1|0)==0;Ua=Ta?r:q;Va=Ta?q:r;Ta=Po(Qa,Va)|0;Qa=Po(Ja,Ua)|0;if(f){Wa=0;Xa=0;while(1){Ya=c[b+(Wa+d<<2)>>2]|0;Za=Ya+8|0;_a=c[Za>>2]|0;if((a[_a+112|0]|0)==0){$a=Ya;ab=Za}else{Za=_a;do{bb=c[Za+116>>2]|0;cb=bb+8|0;Za=c[cb>>2]|0;}while((a[Za+112|0]|0)!=0);$a=bb;ab=cb}if((c[((c[$a>>2]&3|0)==3?$a:$a+32|0)+28>>2]|0)==(Va|0)){Za=uw(Ja,Ta,Qa,0,1)|0;jw($a|0,Za|0)|0;db=Za}else{Za=uw(Ja,Qa,Ta,0,1)|0;jw($a|0,Za|0)|0;db=Za}c[(c[ab>>2]|0)+120>>2]=db;do{if((Xa|0)==0){Za=c[ab>>2]|0;if((a[Za+44|0]|0)!=0){eb=0;break}if((a[Za+84|0]|0)!=0){eb=0;break}c[(c[db+8>>2]|0)+120>>2]=$a;eb=db}else{eb=Xa}}while(0);Za=Wa+1|0;if((Za|0)<(e|0)){Wa=Za;Xa=eb}else{break}}if((eb|0)==0){z=54}else{fb=eb}}else{z=54}if((z|0)==54){fb=uw(Ja,Ta,Qa,0,1)|0}hw(fb|0,c[53750]|0,90272)|0;c[(c[D>>2]|0)+136>>2]=c[(c[H>>2]|0)+136>>2];qn(Ja,g);so(Ja);Zp(Ja,0);jp(Ja,0);Hp(Ja,0);Xa=Va+8|0;Wa=c[Xa>>2]|0;Za=c[Ua+8>>2]|0;_a=Ta+8|0;Ya=c[(c[D>>2]|0)+180>>2]|0;if((Ya|0)!=0){U=+(Ra|0);T=+(~~((+h[(c[_a>>2]|0)+16>>3]+ +h[(c[Qa+8>>2]|0)+16>>3])*.5)|0);F=+(Sa|0);K=+(~~((+h[Wa+16>>3]- +h[Wa+96>>3]+ +h[Za+16>>3]+ +h[Za+88>>3])*.5)|0);Za=Ya;do{Ya=Za;do{if((Ya|0)==(Ta|0)){Wa=Za+8|0;h[(c[Wa>>2]|0)+24>>3]=U;h[(c[Wa>>2]|0)+16>>3]=T}else{Wa=Za+8|0;gb=(c[Wa>>2]|0)+24|0;if((Ya|0)==(Qa|0)){h[gb>>3]=F;h[(c[Wa>>2]|0)+16>>3]=T;break}else{h[gb>>3]=K;break}}}while(0);Za=c[(c[Za+8>>2]|0)+164>>2]|0;}while((Za|0)!=0)}pq(Ja);Bo(Ja,0);Xk(Ja);Za=c[Xa>>2]|0;Qa=c[_a>>2]|0;if((c[(c[H>>2]|0)+116>>2]&1|0)==0){hb=Qa+16|0;ib=+h[Za+24>>3]- +h[Qa+24>>3]}else{hb=Qa+24|0;ib=+h[Za+24>>3]+ +h[Qa+16>>3]}K=+h[Za+16>>3]- +h[hb>>3];if(f){Za=p;Qa=p|0;Ta=p+16|0;Sa=p+32|0;Ra=p+48|0;D=p+56|0;Ua=0;do{Va=c[b+(Ua+d<<2)>>2]|0;Ya=Va+8|0;gb=c[Ya>>2]|0;if((a[gb+112|0]|0)==0){jb=Va;kb=Ya;lb=gb}else{Ya=gb;do{mb=c[Ya+116>>2]|0;nb=mb+8|0;Ya=c[nb>>2]|0;}while((a[Ya+112|0]|0)!=0);jb=mb;kb=nb;lb=Ya}gb=c[lb+120>>2]|0;Va=gb+8|0;Wa=c[Va>>2]|0;do{if(!((gb|0)==(fb|0)&(c[Wa+120>>2]|0)==0)){ob=c[c[Wa+8>>2]>>2]|0;pb=ob+4|0;qb=bm(jb,c[pb>>2]|0)|0;c[qb+8>>2]=c[ob+8>>2];T=+h[ob+16>>3];F=+h[ob+24>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){rb=T;sb=F}else{rb=F;sb=-0.0-T}h[qb+16>>3]=K+rb;h[qb+24>>3]=ib+sb;c[qb+12>>2]=c[ob+12>>2];T=+h[ob+32>>3];F=+h[ob+40>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){tb=T;ub=F}else{tb=F;ub=-0.0-T}h[qb+32>>3]=K+tb;h[qb+40>>3]=ib+ub;c:do{if((c[pb>>2]|0)>0){vb=qb|0;wb=ob|0;xb=0;do{yb=c[vb>>2]|0;zb=yb+(xb<<4)|0;Ab=c[wb>>2]|0;T=+h[Ab+(xb<<4)>>3];F=+h[Ab+(xb<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Bb=T;Cb=F}else{Bb=F;Cb=-0.0-T}Ab=zb;h[zb>>3]=K+Bb;h[yb+(xb<<4)+8>>3]=ib+Cb;c[Za>>2]=c[Ab>>2];c[Za+4>>2]=c[Ab+4>>2];c[Za+8>>2]=c[Ab+8>>2];c[Za+12>>2]=c[Ab+12>>2];Ab=xb+1|0;if((Ab|0)>=(c[pb>>2]|0)){break c}yb=c[vb>>2]|0;zb=yb+(Ab<<4)|0;Db=c[wb>>2]|0;T=+h[Db+(Ab<<4)>>3];F=+h[Db+(Ab<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Eb=T;Fb=F}else{Eb=F;Fb=-0.0-T}Db=zb;h[zb>>3]=K+Eb;h[yb+(Ab<<4)+8>>3]=ib+Fb;c[Ta>>2]=c[Db>>2];c[Ta+4>>2]=c[Db+4>>2];c[Ta+8>>2]=c[Db+8>>2];c[Ta+12>>2]=c[Db+12>>2];Db=xb+2|0;Ab=c[vb>>2]|0;yb=Ab+(Db<<4)|0;zb=c[wb>>2]|0;T=+h[zb+(Db<<4)>>3];F=+h[zb+(Db<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Gb=T;Hb=F}else{Gb=F;Hb=-0.0-T}zb=yb;h[yb>>3]=K+Gb;h[Ab+(Db<<4)+8>>3]=ib+Hb;c[Sa>>2]=c[zb>>2];c[Sa+4>>2]=c[zb+4>>2];c[Sa+8>>2]=c[zb+8>>2];c[Sa+12>>2]=c[zb+12>>2];xb=xb+3|0;zb=c[wb>>2]|0;T=+h[zb+(xb<<4)>>3];F=+h[zb+(xb<<4)+8>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Ib=T;Kb=F}else{Ib=F;Kb=-0.0-T}h[Ra>>3]=K+Ib;h[D>>3]=ib+Kb;Oh((c[H>>2]|0)+16|0,Qa);}while((xb|0)<(c[pb>>2]|0))}}while(0);pb=c[(c[kb>>2]|0)+96>>2]|0;if((pb|0)==0){break}ob=c[(c[Va>>2]|0)+96>>2]|0;T=+h[ob+56>>3];F=+h[ob+64>>3];if((c[(c[H>>2]|0)+116>>2]&1|0)==0){Lb=T;Mb=F}else{Lb=F;Mb=-0.0-T}h[pb+56>>3]=K+Lb;h[pb+64>>3]=ib+Mb;a[(c[(c[kb>>2]|0)+96>>2]|0)+81|0]=1;_m(s,c[(c[kb>>2]|0)+96>>2]|0)}}while(0);Ua=Ua+1|0;}while((Ua|0)<(e|0))}c[53812]=c[O>>2];c[53770]=c[t>>2];c[53768]=c[A>>2];c[53750]=c[J>>2];c[53774]=c[E>>2];c[53800]=c[u>>2];c[53798]=c[v>>2];c[53796]=c[B>>2];c[53794]=c[N>>2];c[53792]=c[M>>2];c[53790]=c[L>>2];c[53788]=c[Y>>2];c[53782]=c[I>>2];c[53780]=c[P>>2];c[53778]=c[V>>2];c[53758]=c[W>>2];c[53756]=c[Z>>2];c[53748]=c[_>>2];c[53618]=c[$>>2];c[53574]=c[aa>>2];c[53590]=c[ba>>2];c[53582]=c[ca>>2];c[53624]=c[da>>2];c[53626]=c[ga>>2];c[53628]=c[ha>>2];c[53614]=c[ja>>2];c[53572]=c[w>>2];c[53588]=c[ea>>2];c[53604]=c[fa>>2];c[53586]=c[ma>>2];c[53598]=c[ua>>2];c[53584]=c[X>>2];c[53602]=c[va>>2];c[53636]=c[Ka>>2];c[53630]=c[La>>2];c[53606]=c[Ma>>2];c[53620]=c[Na>>2];c[53718]=c[Pa>>2];c[53522]=c[Oa>>2];eF(C);to(Ja);Kw(Ja)|0;i=j;return}}while(0);Mo(c[q+8>>2]|0,c[r+8>>2]|0,b,d,e,g);i=j;return}function Mo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0.0,n=0.0,o=0.0,p=0.0,q=0.0,r=0.0,s=0.0,t=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0.0;j=i;i=i+160|0;k=j|0;l=c[(c[d+(e<<2)>>2]|0)+8>>2]|0;m=+h[a+16>>3]+ +h[l+16>>3];n=+h[a+24>>3]+ +h[l+24>>3];o=+h[b+16>>3]+ +h[l+56>>3];p=+h[b+24>>3]+ +h[l+64>>3];do{if((f|0)>1){q=+h[a+80>>3];r=q/+(f-1|0);s=n-q*.5}else{if((f|0)>0){r=0.0;s=n;break}i=j;return}}while(0);a=k|0;l=k|0;b=k+8|0;q=(m*2.0+o)/3.0;t=k+16|0;u=k+24|0;v=(m+o*2.0)/3.0;w=k+32|0;x=k+40|0;y=k+48|0;z=k+56|0;A=k+64|0;B=k+72|0;C=k+80|0;D=k+88|0;E=k+96|0;F=k+104|0;G=k+112|0;H=k+120|0;I=k+128|0;J=k+136|0;K=k+144|0;L=k+152|0;if((g&-9|0)==2){g=0;M=s;while(1){k=c[d+(g+e<<2)>>2]|0;h[l>>3]=m;h[b>>3]=n;h[t>>3]=q;h[u>>3]=M;h[w>>3]=v;h[x>>3]=M;h[y>>3]=o;h[z>>3]=p;cm(k,c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0,a,4,11848);k=g+1|0;if((k|0)<(f|0)){g=k;M=r+M}else{break}}i=j;return}else{g=0;M=s;while(1){k=c[d+(g+e<<2)>>2]|0;h[l>>3]=m;h[b>>3]=n;h[t>>3]=m;h[u>>3]=n;h[w>>3]=q;h[x>>3]=M;h[y>>3]=q;h[z>>3]=M;h[A>>3]=q;h[B>>3]=M;h[C>>3]=v;h[D>>3]=M;h[E>>3]=v;h[F>>3]=M;h[G>>3]=v;h[H>>3]=M;h[I>>3]=o;h[J>>3]=p;h[K>>3]=o;h[L>>3]=p;cm(k,c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0,a,10,11848);k=g+1|0;if((k|0)<(f|0)){g=k;M=r+M}else{break}}i=j;return}}function No(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;j=i;i=i+32|0;k=j|0;l=Hx(d|0)|0;Do(k,a,d,0,e);a=f;m=k;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];c[a+16>>2]=c[m+16>>2];c[a+20>>2]=c[m+20>>2];c[a+24>>2]=c[m+24>>2];c[a+28>>2]=c[m+28>>2];n=+h[f>>3];o=+h[f+16>>3];c[f+48>>2]=4;if(g<<24>>24==0){gm(b,e,2,f,0)}else{em(b,e,2,f,0)}e=f+52|0;b=c[e>>2]|0;p=+h[f+56+(b-1<<5)+24>>3];g=c[d+8>>2]|0;q=+(~~(+h[g+24>>3]+ +(c[(c[(c[l+8>>2]|0)+184>>2]|0)+((c[g+232>>2]|0)*44|0)+20>>2]|0))|0);if(!(n<o&p<q)){i=j;return}c[e>>2]=b+1;h[f+56+(b<<5)>>3]=n;h[f+56+(b<<5)+8>>3]=p;h[f+56+(b<<5)+16>>3]=o;h[f+56+(b<<5)+24>>3]=q;i=j;return}function Oo(a,b,d,e,f,g){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0.0,o=0.0,p=0.0,q=0.0;j=i;i=i+32|0;k=j|0;l=Hx(d|0)|0;Do(k,a,d,0,e);a=f;m=k;c[a>>2]=c[m>>2];c[a+4>>2]=c[m+4>>2];c[a+8>>2]=c[m+8>>2];c[a+12>>2]=c[m+12>>2];c[a+16>>2]=c[m+16>>2];c[a+20>>2]=c[m+20>>2];c[a+24>>2]=c[m+24>>2];c[a+28>>2]=c[m+28>>2];n=+h[f>>3];o=+h[f+16>>3];c[f+48>>2]=1;if(g<<24>>24==0){gm(b,e,2,f,0)}else{em(b,e,2,f,0)}e=f+52|0;b=c[e>>2]|0;p=+h[f+56+(b-1<<5)+8>>3];g=c[d+8>>2]|0;q=+(~~(+h[g+24>>3]- +(c[(c[(c[l+8>>2]|0)+184>>2]|0)+((c[g+232>>2]|0)*44|0)+20>>2]|0))|0);if(!(n<o&q<p)){i=j;return}c[e>>2]=b+1;h[f+56+(b<<5)>>3]=n;h[f+56+(b<<5)+8>>3]=q;h[f+56+(b<<5)+16>>3]=o;h[f+56+(b<<5)+24>>3]=p;i=j;return}function Po(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0;d=i;e=b|0;f=Ax(a,$w(e)|0,1)|0;a=f|0;Wx(a,85112,304,1)|0;jw(e,a)|0;if((pl(b)|0)!=2){i=d;return f|0}e=b+8|0;b=kk((xF(c[c[(c[e>>2]|0)+104>>2]>>2]|0)|0)+3|0)|0;nb(b|0,80376,(g=i,i=i+8|0,c[g>>2]=c[c[(c[e>>2]|0)+104>>2]>>2],g)|0)|0;i=g;gw(a,166600,b)|0;i=d;return f|0}function Qo(a,b){a=a|0;b=b|0;var d=0,e=0,f=0.0,g=0.0,i=0.0,j=0.0;d=c[(c[(c[a>>2]|0)+8>>2]|0)+96>>2]|0;a=c[(c[(c[b>>2]|0)+8>>2]|0)+96>>2]|0;b=(a|0)!=0;if((d|0)==0){e=b&1;return e|0}if(!b){e=-1;return e|0}f=+h[d+24>>3];g=+h[d+32>>3];i=+h[a+24>>3];j=+h[a+32>>3];if(f>i){e=-1;return e|0}if(f<i){e=1;return e|0}if(g>j){e=-1;return e|0}e=g<j|0;return e|0}function Ro(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=c[(c[a+8>>2]|0)+116>>2]|0;if((b|0)==0){d=a}else{a=b;while(1){b=c[(c[a+8>>2]|0)+116>>2]|0;if((b|0)==0){break}else{a=b}}d=a}a=c[d>>2]&3;b=c[(c[((a|0)==2?d:d-32|0)+28>>2]|0)+8>>2]|0;e=c[b+232>>2]|0;f=c[(c[((a|0)==3?d:d+32|0)+28>>2]|0)+8>>2]|0;d=c[f+232>>2]|0;if((e|0)>(d|0)){g=0;return g|0}if((e|0)<(d|0)){g=1;return g|0}g=(c[b+236>>2]|0)<(c[f+236>>2]|0)|0;return g|0}function So(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[a+8>>2]|0)+180|0;e=(c[b+8>>2]|0)+172|0;f=c[d>>2]|0;g=c[d+4>>2]|0;d=c[e>>2]|0;h=c[e+4>>2]|0;if(!((g|0)>0&(h|0)>0)){i=0;return i|0}if((g|0)<(h|0)){h=c[f>>2]|0;if((h|0)==0){i=0;return i|0}else{j=0;k=h}while(1){h=j+1|0;if((c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)==(b|0)){i=k;l=9;break}g=c[f+(h<<2)>>2]|0;if((g|0)==0){i=0;l=9;break}else{j=h;k=g}}if((l|0)==9){return i|0}}else{k=c[d>>2]|0;if((k|0)==0){i=0;return i|0}else{m=0;n=k}while(1){k=m+1|0;if((c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0)==(a|0)){i=n;l=9;break}j=c[d+(k<<2)>>2]|0;if((j|0)==0){i=0;l=9;break}else{m=k;n=j}}if((l|0)==9){return i|0}}return 0}function To(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0;d=(c[a+8>>2]|0)+188|0;e=(c[b+8>>2]|0)+196|0;f=c[d>>2]|0;g=c[d+4>>2]|0;d=c[e>>2]|0;h=c[e+4>>2]|0;if(!((g|0)>0&(h|0)>0)){i=0;return i|0}if((g|0)<(h|0)){h=c[f>>2]|0;if((h|0)==0){i=0;return i|0}else{j=0;k=h}while(1){h=j+1|0;if((c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)==(b|0)){i=k;l=9;break}g=c[f+(h<<2)>>2]|0;if((g|0)==0){i=0;l=9;break}else{j=h;k=g}}if((l|0)==9){return i|0}}else{k=c[d>>2]|0;if((k|0)==0){i=0;return i|0}else{m=0;n=k}while(1){k=m+1|0;if((c[((c[n>>2]&3|0)==3?n:n+32|0)+28>>2]|0)==(a|0)){i=n;l=9;break}j=c[d+(k<<2)>>2]|0;if((j|0)==0){i=0;l=9;break}else{m=k;n=j}}if((l|0)==9){return i|0}}return 0}function Uo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;b=a;d=a+32|0;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180|0;f=c[e>>2]|0;if((f|0)==0){g=kk((c[e+4>>2]<<2)+8|0)|0}else{g=mk(f,(c[e+4>>2]<<2)+8|0)|0}c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180>>2]=g;g=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+184|0;e=c[g>>2]|0;c[g>>2]=e+1;c[(c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180>>2]|0)+(e<<2)>>2]=a;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+180|0;c[(c[e>>2]|0)+(c[e+4>>2]<<2)>>2]=0;e=a-32|0;d=(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172|0;g=c[d>>2]|0;if((g|0)==0){h=kk((c[d+4>>2]<<2)+8|0)|0}else{h=mk(g,(c[d+4>>2]<<2)+8|0)|0}c[(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172>>2]=h;h=(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+176|0;d=c[h>>2]|0;c[h>>2]=d+1;c[(c[(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(d<<2)>>2]=a;d=(c[(c[((c[b>>2]&3|0)==2?a:e)+28>>2]|0)+8>>2]|0)+172|0;c[(c[d>>2]|0)+(c[d+4>>2]<<2)>>2]=0;return a|0}function Vo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((a|0)==0){cc(95824,144408,117,170808)}b=a;d=c[b>>2]|0;e=(c[(c[((d&3|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+180|0;f=e+4|0;g=f;h=c[g>>2]|0;a:do{if((h|0)>0){i=c[e>>2]|0;j=0;while(1){k=i+(j<<2)|0;l=j+1|0;if((c[k>>2]|0)==(a|0)){break}if((l|0)<(h|0)){j=l}else{m=d;break a}}j=h-1|0;c[f>>2]=j;c[k>>2]=c[i+(j<<2)>>2];c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]=0;m=c[b>>2]|0}else{m=d}}while(0);d=(c[(c[((m&3|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+172|0;m=d+4|0;b=m;g=c[b>>2]|0;if((g|0)<=0){return}e=c[d>>2]|0;k=0;while(1){n=e+(k<<2)|0;f=k+1|0;if((c[n>>2]|0)==(a|0)){break}if((f|0)<(g|0)){k=f}else{o=13;break}}if((o|0)==13){return}o=g-1|0;c[m>>2]=o;c[n>>2]=c[e+(o<<2)>>2];c[(c[d>>2]|0)+(c[b>>2]<<2)>>2]=0;return}function Wo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0;b=a;d=a+32|0;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204|0;f=c[e>>2]|0;if((f|0)==0){g=kk((c[e+4>>2]<<2)+8|0)|0}else{g=mk(f,(c[e+4>>2]<<2)+8|0)|0}c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204>>2]=g;g=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+208|0;e=c[g>>2]|0;c[g>>2]=e+1;c[(c[(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204>>2]|0)+(e<<2)>>2]=a;e=(c[(c[((c[b>>2]&3|0)==3?a:d)+28>>2]|0)+8>>2]|0)+204|0;c[(c[e>>2]|0)+(c[e+4>>2]<<2)>>2]=0;return}function Xo(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;b=(c[(c[((c[a>>2]&3|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+204|0;d=b+4|0;e=d;f=c[e>>2]|0;g=c[b>>2]|0;h=g;a:do{if((f|0)>0){i=0;while(1){j=i+1|0;if((c[h+(i<<2)>>2]|0)==(a|0)){break}if((j|0)<(f|0)){i=j}else{break a}}return}}while(0);if((g|0)==0){k=kk((f<<2)+8|0)|0}else{k=mk(g,(f<<2)+8|0)|0}c[b>>2]=k;f=c[e>>2]|0;c[d>>2]=f+1;c[k+(f<<2)>>2]=a;c[(c[b>>2]|0)+(c[e>>2]<<2)>>2]=0;return}function Yo(d,e,f){d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;g=jk(64)|0;h=g+32|0;i=h;c[i>>2]=c[i>>2]|3;j=g;k=g;c[k>>2]=c[k>>2]&-4|2;l=g+8|0;c[l>>2]=jk(176)|0;m=h;c[((c[k>>2]&3|0)==3?j:m)+28>>2]=d;d=g-32|0;c[((c[k>>2]&3|0)==2?j:d)+28>>2]=e;a[(c[l>>2]|0)+112|0]=1;if((f|0)==0){c[(c[l>>2]|0)+156>>2]=1;b[(c[l>>2]|0)+154>>1]=1;b[(c[l>>2]|0)+168>>1]=1;b[(c[l>>2]|0)+170>>1]=1;return j|0}e=f;c[k>>2]=c[k>>2]&15|c[e>>2]&-16;c[i>>2]=c[i>>2]&15|c[e>>2]&-16;i=f+8|0;b[(c[l>>2]|0)+168>>1]=b[(c[i>>2]|0)+168>>1]|0;b[(c[l>>2]|0)+154>>1]=b[(c[i>>2]|0)+154>>1]|0;c[(c[l>>2]|0)+156>>2]=c[(c[i>>2]|0)+156>>2];b[(c[l>>2]|0)+170>>1]=b[(c[i>>2]|0)+170>>1]|0;h=c[((c[k>>2]&3|0)==3?j:m)+28>>2]|0;m=c[e>>2]&3;n=f+32|0;do{if((h|0)==(c[((m|0)==3?f:n)+28>>2]|0)){o=(c[l>>2]|0)+16|0;p=(c[i>>2]|0)+16|0;c[o>>2]=c[p>>2];c[o+4>>2]=c[p+4>>2];c[o+8>>2]=c[p+8>>2];c[o+12>>2]=c[p+12>>2];c[o+16>>2]=c[p+16>>2];c[o+20>>2]=c[p+20>>2];c[o+24>>2]=c[p+24>>2];c[o+28>>2]=c[p+28>>2];c[o+32>>2]=c[p+32>>2];c[o+36>>2]=c[p+36>>2];q=f-32|0}else{p=f-32|0;if((h|0)!=(c[((m|0)==2?f:p)+28>>2]|0)){q=p;break}o=(c[l>>2]|0)+16|0;r=(c[i>>2]|0)+56|0;c[o>>2]=c[r>>2];c[o+4>>2]=c[r+4>>2];c[o+8>>2]=c[r+8>>2];c[o+12>>2]=c[r+12>>2];c[o+16>>2]=c[r+16>>2];c[o+20>>2]=c[r+20>>2];c[o+24>>2]=c[r+24>>2];c[o+28>>2]=c[r+28>>2];c[o+32>>2]=c[r+32>>2];c[o+36>>2]=c[r+36>>2];q=p}}while(0);m=c[((c[k>>2]&3|0)==2?j:d)+28>>2]|0;d=c[e>>2]&3;do{if((m|0)==(c[((d|0)==2?f:q)+28>>2]|0)){e=(c[l>>2]|0)+56|0;k=(c[i>>2]|0)+56|0;c[e>>2]=c[k>>2];c[e+4>>2]=c[k+4>>2];c[e+8>>2]=c[k+8>>2];c[e+12>>2]=c[k+12>>2];c[e+16>>2]=c[k+16>>2];c[e+20>>2]=c[k+20>>2];c[e+24>>2]=c[k+24>>2];c[e+28>>2]=c[k+28>>2];c[e+32>>2]=c[k+32>>2];c[e+36>>2]=c[k+36>>2]}else{if((m|0)!=(c[((d|0)==3?f:n)+28>>2]|0)){break}k=(c[l>>2]|0)+56|0;e=(c[i>>2]|0)+16|0;c[k>>2]=c[e>>2];c[k+4>>2]=c[e+4>>2];c[k+8>>2]=c[e+8>>2];c[k+12>>2]=c[e+12>>2];c[k+16>>2]=c[e+16>>2];c[k+20>>2]=c[e+20>>2];c[k+24>>2]=c[e+24>>2];c[k+28>>2]=c[e+28>>2];c[k+32>>2]=c[e+32>>2];c[k+36>>2]=c[e+36>>2]}}while(0);n=(c[i>>2]|0)+172|0;if((c[n>>2]|0)==0){c[n>>2]=g}c[(c[l>>2]|0)+116>>2]=f;return j|0}function Zo(a,b,c){a=a|0;b=b|0;c=c|0;return Uo(Yo(a,b,c)|0)|0}function _o(a,b){a=a|0;b=b|0;var d=0,e=0;d=a+8|0;a=b+8|0;c[(c[a>>2]|0)+164>>2]=c[(c[d>>2]|0)+180>>2];e=c[(c[a>>2]|0)+164>>2]|0;if((e|0)!=0){c[(c[e+8>>2]|0)+168>>2]=b}c[(c[d>>2]|0)+180>>2]=b;c[(c[a>>2]|0)+168>>2]=0;if((c[(c[a>>2]|0)+164>>2]|0)==(b|0)){cc(120656,144408,215,170688)}else{return}}function $o(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;if((a|0)==(b|0)){cc(112448,144408,220,170672)}d=b+8|0;e=(c[d>>2]|0)+164|0;if((c[e>>2]|0)!=0){cc(105872,144408,221,170672)}f=a+8|0;c[e>>2]=c[(c[f>>2]|0)+164>>2];e=c[(c[f>>2]|0)+164>>2]|0;if((e|0)!=0){c[(c[e+8>>2]|0)+168>>2]=b}c[(c[d>>2]|0)+168>>2]=a;c[(c[f>>2]|0)+164>>2]=b;return}function ap(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;d=a+8|0;a=c[(c[d>>2]|0)+180>>2]|0;e=a;if((a|0)==0|(e|0)==(b|0)){f=e}else{e=a;while(1){a=c[(c[e+8>>2]|0)+164>>2]|0;g=a;if((a|0)==0|(g|0)==(b|0)){f=g;break}else{e=a}}}if((f|0)==0){cc(100160,144408,231,170784)}f=b+8|0;b=c[f>>2]|0;e=c[b+164>>2]|0;if((e|0)==0){h=b;i=0}else{c[(c[e+8>>2]|0)+168>>2]=c[b+168>>2];b=c[f>>2]|0;h=b;i=c[b+164>>2]|0}b=c[h+168>>2]|0;if((b|0)==0){c[(c[d>>2]|0)+180>>2]=i;return}else{c[(c[b+8>>2]|0)+164>>2]=i;return}}function bp(b){b=b|0;var d=0,e=0,f=0;d=jk(52)|0;e=d;c[e>>2]=c[e>>2]&-4|1;e=jk(304)|0;f=d+8|0;c[f>>2]=e;c[d+12>>2]=b;a[e+156|0]=1;h[(c[f>>2]|0)+96>>3]=1.0;h[(c[f>>2]|0)+88>>3]=1.0;h[(c[f>>2]|0)+80>>3]=1.0;c[(c[f>>2]|0)+216>>2]=1;c[(c[f>>2]|0)+176>>2]=0;e=jk(20)|0;c[(c[f>>2]|0)+172>>2]=e;c[(c[f>>2]|0)+184>>2]=0;e=jk(20)|0;c[(c[f>>2]|0)+180>>2]=e;e=b+8|0;c[(c[f>>2]|0)+164>>2]=c[(c[e>>2]|0)+180>>2];b=c[(c[f>>2]|0)+164>>2]|0;if((b|0)!=0){c[(c[b+8>>2]|0)+168>>2]=d}b=d;c[(c[e>>2]|0)+180>>2]=b;c[(c[f>>2]|0)+168>>2]=0;if((c[(c[f>>2]|0)+164>>2]|0)==(b|0)){cc(120656,144408,215,170688);return 0}else{b=(c[e>>2]|0)+220|0;c[b>>2]=(c[b>>2]|0)+1;return d|0}return 0}function cp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=d;f=d+32|0;g=(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188|0;h=c[g>>2]|0;if((h|0)==0){i=kk((c[g+4>>2]<<2)+8|0)|0}else{i=mk(h,(c[g+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188>>2]=i;i=(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+192|0;g=c[i>>2]|0;c[i>>2]=g+1;c[(c[(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188>>2]|0)+(g<<2)>>2]=d;g=(c[(c[((c[e>>2]&3|0)==3?d:f)+28>>2]|0)+8>>2]|0)+188|0;c[(c[g>>2]|0)+(c[g+4>>2]<<2)>>2]=0;g=d-32|0;f=(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196|0;i=c[f>>2]|0;if((i|0)==0){j=kk((c[f+4>>2]<<2)+8|0)|0}else{j=mk(i,(c[f+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196>>2]=j;j=(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+200|0;f=c[j>>2]|0;c[j>>2]=f+1;c[(c[(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196>>2]|0)+(f<<2)>>2]=d;f=(c[(c[((c[e>>2]&3|0)==2?d:g)+28>>2]|0)+8>>2]|0)+196|0;c[(c[f>>2]|0)+(c[f+4>>2]<<2)>>2]=0;a[(c[b+8>>2]|0)+228|0]=1;a[(c[(Ix(b|0)|0)+8>>2]|0)+228|0]=1;return}function dp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;if((a|0)==0){cc(95824,144408,269,170760)}b=c[(c[a+8>>2]|0)+116>>2]|0;do{if((b|0)!=0){d=(c[b+8>>2]|0)+172|0;if((c[d>>2]|0)!=(a|0)){break}c[d>>2]=0}}while(0);b=a;d=c[b>>2]|0;e=(c[(c[((d&3|0)==3?a:a+32|0)+28>>2]|0)+8>>2]|0)+188|0;f=e+4|0;g=f;h=c[g>>2]|0;a:do{if((h|0)>0){i=c[e>>2]|0;j=0;while(1){k=i+(j<<2)|0;l=j+1|0;if((c[k>>2]|0)==(a|0)){break}if((l|0)<(h|0)){j=l}else{m=d;break a}}j=h-1|0;c[f>>2]=j;c[k>>2]=c[i+(j<<2)>>2];c[(c[e>>2]|0)+(c[g>>2]<<2)>>2]=0;m=c[b>>2]|0}else{m=d}}while(0);d=(c[(c[((m&3|0)==2?a:a-32|0)+28>>2]|0)+8>>2]|0)+196|0;m=d+4|0;b=m;g=c[b>>2]|0;if((g|0)<=0){return}e=c[d>>2]|0;k=0;while(1){n=e+(k<<2)|0;f=k+1|0;if((c[n>>2]|0)==(a|0)){break}if((f|0)<(g|0)){k=f}else{o=16;break}}if((o|0)==16){return}o=g-1|0;c[m>>2]=o;c[n>>2]=c[e+(o<<2)>>2];c[(c[d>>2]|0)+(c[b>>2]<<2)>>2]=0;return}function ep(a,d){a=a|0;d=d|0;var f=0,g=0,h=0,j=0,k=0;f=i;g=a+8|0;a=(c[g>>2]|0)+172|0;h=c[a>>2]|0;if((h|0)==(d|0)){Fv(0,94472,(j=i,i=i+1|0,i=i+7&-8,c[j>>2]=0,j)|0)|0;i=j;i=f;return}if((h|0)!=0){cc(89112,144408,340,170264)}c[a>>2]=d;a=(c[d+8>>2]|0)+170|0;h=b[(c[g>>2]|0)+170>>1]|0;if((e[a>>1]|0)>>>0<(h&65535)>>>0){b[a>>1]=h;k=d}else{k=d}while(1){d=k+8|0;h=(c[d>>2]|0)+168|0;b[h>>1]=(b[h>>1]|0)+(b[(c[g>>2]|0)+168>>1]|0);h=(c[d>>2]|0)+154|0;b[h>>1]=(b[h>>1]|0)+(b[(c[g>>2]|0)+154>>1]|0);h=(c[d>>2]|0)+156|0;c[h>>2]=(c[h>>2]|0)+(c[(c[g>>2]|0)+156>>2]|0);h=c[(c[d>>2]|0)+172>>2]|0;if((h|0)==0){break}k=h}i=f;return}function fp(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0;e=d+8|0;d=c[e>>2]|0;f=c[d+172>>2]|0;if((f|0)==0){g=d;h=g+172|0;c[h>>2]=0;return}else{i=f;j=d}while(1){d=i;f=i+8|0;k=(c[f>>2]|0)+168|0;b[k>>1]=(b[k>>1]|0)-(b[j+168>>1]|0);k=(c[f>>2]|0)+154|0;b[k>>1]=(b[k>>1]|0)-(b[(c[e>>2]|0)+154>>1]|0);k=(c[f>>2]|0)+156|0;c[k>>2]=(c[k>>2]|0)-(c[(c[e>>2]|0)+156>>2]|0);k=c[f>>2]|0;f=c[k+172>>2]|0;do{if((b[k+168>>1]|0)==0){l=i;m=c[l>>2]|0;n=i+32|0;o=(c[(c[((m&3|0)==3?d:n)+28>>2]|0)+8>>2]|0)+180|0;p=c[o>>2]|0;q=c[p>>2]|0;if((q|0)==0){r=m}else{s=0;t=o;o=q;q=p;p=m;while(1){a:do{if((o|0)==(d|0)){m=t+4|0;u=m;v=c[u>>2]|0;if((v|0)<=0){w=p;break}x=q;y=0;while(1){z=x+(y<<2)|0;A=y+1|0;if((c[z>>2]|0)==(d|0)){break}if((A|0)<(v|0)){y=A}else{w=p;break a}}y=v-1|0;c[m>>2]=y;c[z>>2]=c[x+(y<<2)>>2];c[(c[t>>2]|0)+(c[u>>2]<<2)>>2]=0;w=c[l>>2]|0}else{w=p}}while(0);y=s+1|0;A=(c[(c[((w&3|0)==3?d:n)+28>>2]|0)+8>>2]|0)+180|0;B=c[A>>2]|0;C=c[B+(y<<2)>>2]|0;if((C|0)==0){r=w;break}else{s=y;t=A;o=C;q=B;p=w}}}p=i-32|0;q=(c[(c[((r&3|0)==2?d:p)+28>>2]|0)+8>>2]|0)+172|0;o=c[q>>2]|0;t=c[o>>2]|0;if((t|0)==0){break}else{D=0;E=q;F=t;G=o;H=r}while(1){b:do{if((F|0)==(d|0)){o=E+4|0;t=o;q=c[t>>2]|0;if((q|0)<=0){I=H;break}s=G;n=0;while(1){J=s+(n<<2)|0;B=n+1|0;if((c[J>>2]|0)==(d|0)){break}if((B|0)<(q|0)){n=B}else{I=H;break b}}n=q-1|0;c[o>>2]=n;c[J>>2]=c[s+(n<<2)>>2];c[(c[E>>2]|0)+(c[t>>2]<<2)>>2]=0;I=c[l>>2]|0}else{I=H}}while(0);n=D+1|0;u=(c[(c[((I&3|0)==2?d:p)+28>>2]|0)+8>>2]|0)+172|0;x=c[u>>2]|0;m=c[x+(n<<2)>>2]|0;if((m|0)==0){break}else{D=n;E=u;F=m;G=x;H=I}}}}while(0);c:do{if((a[(c[i+8>>2]|0)+112|0]|0)==1){k=d;do{p=c[(c[((c[k>>2]&3|0)==2?k:k-32|0)+28>>2]|0)+8>>2]|0;if((a[p+156|0]|0)!=1){break c}l=p+180|0;if((c[l+4>>2]|0)!=1){break c}k=c[c[l>>2]>>2]|0;l=k+8|0;p=(c[l>>2]|0)+168|0;b[p>>1]=(b[p>>1]|0)-(b[(c[e>>2]|0)+168>>1]|0);p=(c[l>>2]|0)+154|0;b[p>>1]=(b[p>>1]|0)-(b[(c[e>>2]|0)+154>>1]|0);p=(c[l>>2]|0)+156|0;c[p>>2]=(c[p>>2]|0)-(c[(c[e>>2]|0)+156>>2]|0);}while((a[(c[l>>2]|0)+112|0]|0)==1)}}while(0);d=c[e>>2]|0;if((f|0)==0){g=d;break}else{i=f;j=d}}h=g+172|0;c[h>>2]=0;return}function gp(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0.0,Z=0.0;e=d+8|0;f=c[e>>2]|0;g=c[f+180>>2]|0;if((g|0)==0){i=f}else{f=g;do{g=f+8|0;j=c[g>>2]|0;k=c[j+188>>2]|0;do{if((k|0)==0){l=j}else{m=c[k>>2]|0;if((m|0)==0){l=j;break}else{n=0;o=m}while(1){m=c[o>>2]&3;p=c[((m|0)==3?o:o+32|0)+28>>2]|0;q=c[p+8>>2]|0;r=c[q+236>>2]|0;s=c[(c[(c[((m|0)==2?o:o-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;m=(r|0)<(s|0);t=m?s:r;u=c[q+232>>2]|0;q=Hx(p|0)|0;p=(m?r:s)+1|0;a:do{if((p|0)<(t|0)){s=c[(c[(c[q+8>>2]|0)+184>>2]|0)+(u*44|0)+4>>2]|0;r=p;while(1){m=c[(c[s+(r<<2)>>2]|0)+8>>2]|0;v=a[m+156|0]|0;if((v<<24>>24|0)==1){if((c[m+104>>2]|0)!=0){w=r;break a}}else if((v<<24>>24|0)==0){w=r;break a}v=r+1|0;if((v|0)<(t|0)){r=v}else{w=v;break}}}else{w=p}}while(0);if((w|0)==(t|0)){p=o;do{u=p+8|0;a[(c[u>>2]|0)+113|0]=1;p=c[(c[u>>2]|0)+172>>2]|0;}while((p|0)!=0)}p=n+1|0;t=c[g>>2]|0;u=c[(c[t+188>>2]|0)+(p<<2)>>2]|0;if((u|0)==0){l=t;break}else{n=p;o=u}}}}while(0);j=l+204|0;if((c[j+4>>2]|0)>0){k=0;u=j;while(1){j=c[(c[u>>2]|0)+(k<<2)>>2]|0;p=c[j>>2]&3;t=c[(c[((p|0)==2?j:j-32|0)+28>>2]|0)+8>>2]|0;q=c[t+232>>2]|0;r=c[((p|0)==3?j:j+32|0)+28>>2]|0;p=c[r+8>>2]|0;do{if((q|0)==(c[p+232>>2]|0)){s=c[p+236>>2]|0;v=c[t+236>>2]|0;m=(s|0)<(v|0);x=m?v:s;y=Hx(r|0)|0;z=(m?s:v)+1|0;b:do{if((z|0)<(x|0)){v=c[(c[(c[y+8>>2]|0)+184>>2]|0)+(q*44|0)+4>>2]|0;s=z;while(1){m=c[(c[v+(s<<2)>>2]|0)+8>>2]|0;A=a[m+156|0]|0;if((A<<24>>24|0)==1){if((c[m+104>>2]|0)!=0){B=s;break b}}else if((A<<24>>24|0)==0){B=s;break b}A=s+1|0;if((A|0)<(x|0)){s=A}else{B=A;break}}}else{B=z}}while(0);if((B|0)==(x|0)){C=j}else{break}do{z=C+8|0;a[(c[z>>2]|0)+113|0]=1;C=c[(c[z>>2]|0)+172>>2]|0;}while((C|0)!=0)}}while(0);j=k+1|0;q=c[g>>2]|0;r=q+204|0;if((j|0)<(c[r+4>>2]|0)){k=j;u=r}else{D=q;break}}}else{D=l}f=c[D+164>>2]|0;}while((f|0)!=0);i=c[e>>2]|0}f=c[i+184>>2]|0;if((c[f+40>>2]|0)==0){if((c[i+172>>2]|0)>0){E=26}}else{E=26}c:do{if((E|0)==26){D=c[f+4>>2]|0;l=c[D>>2]|0;if((l|0)==0){break}else{F=0;G=l}d:while(1){l=c[(c[G+8>>2]|0)+196>>2]|0;C=c[l>>2]|0;if((C|0)!=0){B=0;o=C;do{C=c[o+8>>2]|0;if((c[C+96>>2]|0)!=0){if((a[C+113|0]|0)==0){break d}}B=B+1|0;o=c[l+(B<<2)>>2]|0;}while((o|0)!=0)}F=F+1|0;G=c[D+(F<<2)>>2]|0;if((G|0)==0){break c}}if((b[i+224>>1]|0)!=0){cc(118328,135760,190,171056);return 0}D=(b[i+226>>1]|0)+3|0;if((f|0)==0){H=kk(D*44|0)|0}else{H=mk(f,D*44|0)|0}c[(c[e>>2]|0)+184>>2]=H+44;D=c[e>>2]|0;o=b[D+226>>1]|0;B=o<<16>>16;l=c[D+184>>2]|0;if(o<<16>>16>-1){o=B;D=l;while(1){C=o-1|0;tF(D+(o*44|0)|0,D+(C*44|0)|0,44)|0;n=c[(c[e>>2]|0)+184>>2]|0;if((o|0)>0){o=C;D=n}else{I=-1;J=n;break}}}else{I=B;J=l}c[J+(I*44|0)+8>>2]=0;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)>>2]=0;D=jk(8)|0;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+12>>2]=D;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+4>>2]=D;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+40>>2]=0;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+20>>2]=1;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+16>>2]=1;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+28>>2]=1;c[(c[(c[e>>2]|0)+184>>2]|0)+(I*44|0)+24>>2]=1;D=(c[e>>2]|0)+224|0;b[D>>1]=(b[D>>1]|0)-1}}while(0);mp(d);I=c[(c[e>>2]|0)+180>>2]|0;if((I|0)==0){K=0;return K|0}else{L=0;M=I}while(1){I=M+8|0;J=c[I>>2]|0;H=c[J+188>>2]|0;do{if((H|0)==0){N=L;O=J}else{f=c[H>>2]|0;if((f|0)==0){P=L;Q=J}else{i=0;G=L;F=f;while(1){f=c[F+8>>2]|0;E=c[f+96>>2]|0;do{if((E|0)==0){R=G}else{if((a[f+113|0]|0)==0){hp(F);R=1;break}if((c[(c[e>>2]|0)+116>>2]&1|0)==0){h[f+136>>3]=+h[E+24>>3];R=G;break}else{h[f+136>>3]=+h[E+32>>3];R=G;break}}}while(0);E=i+1|0;f=c[I>>2]|0;D=c[(c[f+188>>2]|0)+(E<<2)>>2]|0;if((D|0)==0){P=R;Q=f;break}else{i=E;G=R;F=D}}}F=Q+204|0;if((c[F+4>>2]|0)>0){S=0;T=P;U=F}else{N=P;O=Q;break}while(1){F=c[(c[U>>2]|0)+(S<<2)>>2]|0;G=c[F>>2]&3;i=c[((G|0)==3?F:F+32|0)+28>>2]|0;D=c[((G|0)==2?F:F-32|0)+28>>2]|0;do{if((c[(c[i+8>>2]|0)+232>>2]|0)!=(c[(c[D+8>>2]|0)+232>>2]|0)|(i|0)==(D|0)){V=T}else{G=F+8|0;E=c[G>>2]|0;f=c[E+172>>2]|0;if((f|0)==0){W=G;X=E}else{o=f;while(1){f=o+8|0;n=c[f>>2]|0;C=c[n+172>>2]|0;if((C|0)==0){W=f;X=n;break}else{o=C}}}a[E+113|0]=a[X+113|0]|0;o=c[G>>2]|0;C=c[o+96>>2]|0;if((C|0)==0){V=T;break}if((a[o+113|0]|0)==0){hp(F);V=1;break}else{Y=+h[((c[(c[e>>2]|0)+116>>2]&1|0)==0?C+24|0:C+32|0)>>3];C=(c[W>>2]|0)+136|0;Z=+h[C>>3];h[C>>3]=Y>Z?Y:Z;V=T;break}}}while(0);F=S+1|0;D=c[I>>2]|0;i=D+204|0;if((F|0)<(c[i+4>>2]|0)){S=F;T=V;U=i}else{N=V;O=D;break}}}}while(0);I=c[O+164>>2]|0;if((I|0)==0){break}else{L=N;M=I}}if((N|0)==0){K=0;return K|0}np(d);K=N;return K|0}function hp(b){b=b|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0.0,G=0,H=0.0,I=0.0,J=0;d=i;i=i+16|0;e=d|0;f=b+8|0;if((c[(c[f>>2]|0)+96>>2]|0)==0){i=d;return}g=b;j=b+32|0;k=Hx(c[((c[g>>2]&3|0)==3?b:j)+28>>2]|0)|0;l=c[g>>2]&3;m=c[(c[((l|0)==3?b:j)+28>>2]|0)+8>>2]|0;n=c[m+232>>2]|0;o=k+8|0;p=n-1|0;q=c[(c[o>>2]|0)+184>>2]|0;r=c[q+(p*44|0)+4>>2]|0;s=c[q+(p*44|0)>>2]|0;q=e+8|0;c[q>>2]=-1;t=e|0;c[t>>2]=-1;u=e+12|0;c[u>>2]=s;v=e+4|0;c[v>>2]=s;e=b-32|0;w=c[m+236>>2]|0;m=c[(c[(c[((l|0)==2?b:e)+28>>2]|0)+8>>2]|0)+236>>2]|0;l=(w|0)>(m|0);x=l?w:m;y=l?m:w;w=0;m=s;l=-1;z=s;while(1){s=m-1|0;if((w|0)>(s|0)){A=l;B=z;break}ip(c[(c[r+(w<<2)>>2]|0)+8>>2]|0,t,y,x);if((w|0)!=(s|0)){ip(c[(c[r+(s<<2)>>2]|0)+8>>2]|0,t,y,x)}C=c[v>>2]|0;D=c[t>>2]|0;if((C-D|0)<2){A=D;B=C;break}else{w=w+1|0;m=s;l=D;z=C}}if((A|0)>(B|0)){E=(c[u>>2]|0)+(c[q>>2]|0)|0}else{E=A+B|0}B=(E+1|0)/2|0;E=c[o>>2]|0;A=c[E+184>>2]|0;q=c[A+(p*44|0)+4>>2]|0;u=c[q>>2]|0;if((u|0)==0){F=+h[(c[(c[c[A+(n*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[A+(n*44|0)+20>>2]|0)+ +(c[E+240>>2]|0)}else{F=+h[(c[u+8>>2]|0)+24>>3]- +(c[A+(p*44|0)+16>>2]|0)}u=~~F;E=A+(p*44|0)|0;if((q|0)==0){G=kk((c[E>>2]<<2)+8|0)|0}else{G=mk(q,(c[E>>2]<<2)+8|0)|0}E=G;c[(c[(c[o>>2]|0)+184>>2]|0)+(p*44|0)+4>>2]=E;G=c[(c[(c[o>>2]|0)+184>>2]|0)+(p*44|0)>>2]|0;if((G|0)>(B|0)){q=G;while(1){G=q-1|0;A=c[E+(G<<2)>>2]|0;c[E+(q<<2)>>2]=A;n=(c[A+8>>2]|0)+236|0;c[n>>2]=(c[n>>2]|0)+1;if((G|0)>(B|0)){q=G}else{break}}}q=bp(k)|0;k=E+(B<<2)|0;c[k>>2]=q;G=q+8|0;c[(c[G>>2]|0)+236>>2]=B;c[(c[G>>2]|0)+232>>2]=p;G=(c[(c[o>>2]|0)+184>>2]|0)+(p*44|0)|0;B=(c[G>>2]|0)+1|0;c[G>>2]=B;c[E+(B<<2)>>2]=0;B=c[k>>2]|0;k=c[(c[f>>2]|0)+96>>2]|0;F=+h[k+24>>3];H=+h[k+32>>3];k=(c[(c[o>>2]|0)+116>>2]&1|0)==0;E=B+8|0;h[(c[E>>2]|0)+80>>3]=k?H:F;G=c[E>>2]|0;q=~~(+h[G+80>>3]*.5);I=(k?F:H)*.5;h[G+96>>3]=I;h[(c[E>>2]|0)+88>>3]=I;c[(c[E>>2]|0)+104>>2]=c[(c[f>>2]|0)+96>>2];h[(c[E>>2]|0)+24>>3]=+(q+u|0);u=Zo(B,c[((c[g>>2]&3|0)==3?b:j)+28>>2]|0,b)|0;f=u+8|0;h[(c[f>>2]|0)+16>>3]=-0.0- +h[(c[E>>2]|0)+88>>3];h[(c[f>>2]|0)+56>>3]=+h[(c[(c[((c[g>>2]&3|0)==3?b:j)+28>>2]|0)+8>>2]|0)+96>>3];a[(c[f>>2]|0)+112|0]=4;f=Zo(B,c[((c[g>>2]&3|0)==2?b:e)+28>>2]|0,b)|0;B=f+8|0;h[(c[B>>2]|0)+16>>3]=+h[(c[E>>2]|0)+96>>3];h[(c[B>>2]|0)+56>>3]=+h[(c[(c[((c[g>>2]&3|0)==2?b:e)+28>>2]|0)+8>>2]|0)+88>>3];a[(c[B>>2]|0)+112|0]=4;B=c[(c[o>>2]|0)+184>>2]|0;e=B+(p*44|0)+16|0;if((c[e>>2]|0)<(q|0)){c[e>>2]=q;J=c[(c[o>>2]|0)+184>>2]|0}else{J=B}B=J+(p*44|0)+20|0;if((c[B>>2]|0)<(q|0)){c[B>>2]=q}c[(c[E>>2]|0)+112>>2]=b;i=d;return}function ip(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;if((a[b+156|0]|0)!=1){return}g=c[b+236>>2]|0;h=b+180|0;if((c[b+176>>2]|0)!=0){b=c[h>>2]|0;i=c[b>>2]|0;if((i|0)==0){return}else{j=0;k=0;l=0;m=i}while(1){i=c[(c[(c[((c[m>>2]&3|0)==2?m:m-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if((i|0)>(e|0)){n=(i|0)<(f|0)?l:1;o=k}else{n=l;o=1}i=j+1|0;p=c[b+(i<<2)>>2]|0;if((p|0)==0){break}else{j=i;k=o;l=n;m=p}}if(o<<24>>24!=0&n<<24>>24==0){c[d>>2]=g+1}if(!(n<<24>>24!=0&o<<24>>24==0)){return}c[d+4>>2]=g-1;return}if((c[h+4>>2]|0)!=2){cc(80712,135760,63,169976)}o=c[h>>2]|0;h=c[o>>2]|0;n=c[o+4>>2]|0;o=c[(c[(c[((c[h>>2]&3|0)==2?h:h-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;h=c[(c[(c[((c[n>>2]&3|0)==2?n:n-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;n=(o|0)>(h|0);m=n?o:h;l=n?h:o;if((m|0)<=(e|0)){c[d>>2]=g;c[d+8>>2]=g;return}if((l|0)>=(f|0)){c[d+4>>2]=g;c[d+12>>2]=g;return}o=(l|0)<(e|0);h=(m|0)>(f|0);if(o&h){return}if(o){q=13}else{if((l|0)==(e|0)&(m|0)<(f|0)){q=13}}if((q|0)==13){c[d+8>>2]=g}do{if(!h){if((m|0)==(f|0)&(l|0)>(e|0)){break}return}}while(0);c[d+12>>2]=g;return}function jp(d,e){d=d|0;e=e|0;var f=0,g=0,j=0,k=0.0,l=0.0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0;f=i;if((a[213992]|0)!=0){ym()}a[172624]=0;c[53542]=d;g=d|0;j=((Mw(Ix(g)|0)|0)<<2)+4|0;c[53516]=jk(j)|0;c[53514]=jk(j)|0;c[53656]=8;c[53660]=24;h[21677]=.995;j=ew(g,149032)|0;do{if((j|0)!=0){k=+rF(j);if(k<=0.0){break}l=k*+(c[53656]|0);if(l<1.0){m=1}else{m=~~l}c[53656]=m;l=k*+(c[53660]|0);if(l<1.0){n=1}else{n=~~l}c[53660]=n}}while(0);n=d+8|0;m=c[n>>2]|0;if((b[m+128>>1]&16)!=0){j=(b[m+226>>1]|0)+2|0;m=jk(j<<2)|0;Ap(d,m,j,0)|0;eF(m)}Zn(d);qo(d,1);qp(d);xp(d);c[53706]=b[(c[n>>2]|0)+224>>1]|0;c[53708]=b[(c[n>>2]|0)+226>>1]|0;m=c[n>>2]|0;j=m+204|0;do{if((c[j+4>>2]|0)>0){p=0;q=0;r=m;s=j;do{c[r+180>>2]=c[(c[s>>2]|0)+(q<<2)>>2];do{if((q|0)>0){t=c[n>>2]|0;u=b[t+224>>1]|0;if(u<<16>>16>(b[t+226>>1]|0)){break}v=u<<16>>16;u=t;while(1){t=c[u+184>>2]|0;w=t+(v*44|0)+4|0;c[w>>2]=(c[w>>2]|0)+(c[t+(v*44|0)>>2]<<2);c[(c[(c[n>>2]|0)+184>>2]|0)+(v*44|0)>>2]=0;t=c[n>>2]|0;if((v|0)<(b[t+226>>1]|0)){v=v+1|0;u=t}else{break}}}}while(0);p=(kp(d,0,e)|0)+p|0;q=q+1|0;r=c[n>>2]|0;s=r+204|0;x=c[s+4>>2]|0;}while((q|0)<(x|0));if((x|0)<2){y=r;z=p;break}else{A=0;B=0;C=s}while(1){q=c[(c[C>>2]|0)+(A<<2)>>2]|0;if((B|0)!=0){c[(c[B+8>>2]|0)+164>>2]=q}u=q+8|0;c[(c[u>>2]|0)+168>>2]=B;v=c[(c[u>>2]|0)+164>>2]|0;if((v|0)==0){D=q}else{q=v;while(1){v=c[(c[q+8>>2]|0)+164>>2]|0;if((v|0)==0){break}else{q=v}}D=q}v=A+1|0;u=(c[n>>2]|0)+204|0;E=u+4|0;if((v|0)<(c[E>>2]|0)){A=v;B=D;C=u}else{break}}c[E>>2]=1;s=c[n>>2]|0;c[s+180>>2]=c[c[s+204>>2]>>2];b[(c[n>>2]|0)+224>>1]=c[53706];b[(c[n>>2]|0)+226>>1]=c[53708];y=c[n>>2]|0;z=p}else{y=m;z=0}}while(0);m=b[y+224>>1]|0;if(m<<16>>16>(b[y+226>>1]|0)){F=y}else{E=c[o>>2]|0;C=m<<16>>16;m=y;while(1){y=c[m+184>>2]|0;c[y+(C*44|0)>>2]=c[y+(C*44|0)+8>>2];y=c[(c[n>>2]|0)+184>>2]|0;c[y+(C*44|0)+4>>2]=c[y+(C*44|0)+12>>2];y=c[n>>2]|0;D=c[y+184>>2]|0;a:do{if((c[D+(C*44|0)>>2]|0)>0){B=0;A=D;x=y;while(1){j=c[(c[A+(C*44|0)+4>>2]|0)+(B<<2)>>2]|0;if((j|0)==0){break}c[(c[j+8>>2]|0)+236>>2]=B;j=B+1|0;s=c[n>>2]|0;r=c[s+184>>2]|0;if((j|0)<(c[r+(C*44|0)>>2]|0)){B=j;A=r;x=s}else{G=s;break a}}if((a[213992]|0)==0){H=x}else{A=$w(g)|0;q=c[(c[(c[n>>2]|0)+184>>2]|0)+(C*44|0)>>2]|0;gc(E|0,137088,(I=i,i=i+32|0,c[I>>2]=A,c[I+8>>2]=C,c[I+16>>2]=B,c[I+24>>2]=q,I)|0)|0;i=I;H=c[n>>2]|0}c[(c[H+184>>2]|0)+(C*44|0)>>2]=B;G=c[n>>2]|0}else{G=y}}while(0);if((C|0)<(b[G+226>>1]|0)){C=C+1|0;m=G}else{F=G;break}}}do{if((c[F+172>>2]|0)<1){J=z}else{G=z;m=1;C=F;while(1){K=(lp(c[(c[C+176>>2]|0)+(m<<2)>>2]|0,e)|0)+G|0;H=c[n>>2]|0;L=c[H+172>>2]|0;if((m|0)<(L|0)){G=K;m=m+1|0;C=H}else{break}}if((L|0)<=0){J=K;break}C=ew(g,79488)|0;if((C|0)!=0){if((Km(C)|0)<<24>>24==0){J=K;break}}go(d);a[172624]=1;J=kp(d,2,e)|0}}while(0);e=c[53514]|0;if((e|0)!=0){eF(e);c[53514]=0}e=c[53516]|0;if((e|0)!=0){eF(e);c[53516]=0}e=c[n>>2]|0;if((c[e+172>>2]|0)<1){M=e}else{d=1;K=e;while(1){np(c[(c[K+176>>2]|0)+(d<<2)>>2]|0);e=c[n>>2]|0;if((d|0)<(c[e+172>>2]|0)){d=d+1|0;K=e}else{M=e;break}}}K=b[M+224>>1]|0;if(K<<16>>16<=(b[M+226>>1]|0)){d=K<<16>>16;K=M;while(1){M=c[K+184>>2]|0;if((c[M+(d*44|0)>>2]|0)>0){e=0;L=M;while(1){F=(c[(c[L+(d*44|0)+4>>2]|0)+(e<<2)>>2]|0)+8|0;c[(c[F>>2]|0)+236>>2]=e;z=c[F>>2]|0;C=c[z+188>>2]|0;do{if((C|0)!=0){m=c[C>>2]|0;if((m|0)==0){break}else{N=0;O=m;P=z}while(1){m=O+8|0;if((a[(c[m>>2]|0)+112|0]|0)==4){dp(O);eF(c[m>>2]|0);eF(O|0);Q=N-1|0;R=c[F>>2]|0}else{Q=N;R=P}m=Q+1|0;G=c[(c[R+188>>2]|0)+(m<<2)>>2]|0;if((G|0)==0){break}else{N=m;O=G;P=R}}}}while(0);F=e+1|0;z=c[n>>2]|0;C=c[z+184>>2]|0;if((F|0)<(c[C+(d*44|0)>>2]|0)){e=F;L=C}else{S=C;T=z;break}}}else{S=M;T=K}L=c[S+(d*44|0)+40>>2]|0;if((L|0)==0){U=T}else{eF(c[L+8>>2]|0);eF(L);U=c[n>>2]|0}if((d|0)<(b[U+226>>1]|0)){d=d+1|0;K=U}else{break}}}if((a[213992]|0)==0){i=f;return}U=c[o>>2]|0;K=$w(g)|0;l=+zm();gc(U|0,139784,(I=i,i=i+24|0,c[I>>2]=K,c[I+8>>2]=J,h[I+16>>3]=l,I)|0)|0;i=I;i=f;return}function kp(e,f,g){e=e|0;f=f|0;g=g|0;var j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Xa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,pb=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0;j=i;if((f|0)>1){k=up(0)|0;l=c[(c[e+8>>2]|0)+180>>2]|0;if((l|0)!=0){m=l;do{l=m+8|0;n=c[l>>2]|0;h[n+16>>3]=+(c[n+236>>2]|0);m=c[(c[l>>2]|0)+164>>2]|0;}while((m|0)!=0)}if((f|0)<3){p=k;q=5}else{r=k;s=k;t=0}}else{p=2147483647;q=5}a:do{if((q|0)==5){k=e|0;m=e+8|0;l=c[o>>2]|0;n=f;u=p;v=p;while(1){w=c[53660]|0;do{if((n|0)<2){x=(w|0)>4?4:w;if((Ix(k)|0)==(e|0)){sp(e,n)}if((n|0)==0){Bp(e)}Cp(e);y=up(0)|0;if((y|0)>(v|0)){z=v;A=y;B=x;break}C=c[(c[m>>2]|0)+180>>2]|0;if((C|0)==0){z=y;A=y;B=x;break}else{D=C}while(1){C=D+8|0;E=c[C>>2]|0;h[E+16>>3]=+(c[E+236>>2]|0);E=c[(c[C>>2]|0)+164>>2]|0;if((E|0)==0){z=y;A=y;B=x;break}else{D=E}}}else{if((u|0)<=(v|0)){z=v;A=v;B=w;break}x=c[m>>2]|0;y=c[x+180>>2]|0;if((y|0)==0){F=x}else{x=y;do{y=x+8|0;E=c[y>>2]|0;c[E+236>>2]=~~+h[E+16>>3];x=c[(c[y>>2]|0)+164>>2]|0;}while((x|0)!=0);F=c[m>>2]|0}x=b[F+224>>1]|0;if(x<<16>>16>(b[F+226>>1]|0)){z=v;A=v;B=w;break}y=x<<16>>16;while(1){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(y*44|0)+33|0]=0;x=c[(c[m>>2]|0)+184>>2]|0;Jb(c[x+(y*44|0)+4>>2]|0,c[x+(y*44|0)>>2]|0,4,56);if((y|0)<(b[(c[m>>2]|0)+226>>1]|0)){y=y+1|0}else{z=v;A=v;B=w;break}}}}while(0);b:do{if((B|0)>0){w=0;y=0;x=A;E=z;while(1){if((a[213992]|0)!=0){gc(l|0,134200,(C=i,i=i+40|0,c[C>>2]=n,c[C+8>>2]=w,c[C+16>>2]=y,c[C+24>>2]=x,c[C+32>>2]=E,C)|0)|0;i=C}C=y+1|0;if((y|0)>=(c[53656]|0)|(x|0)==0){G=x;H=E;break b}I=((w|0)%4|0|0)<2;J=I&1;K=c[m>>2]|0;if((w&1|0)==0){L=b[K+224>>1]|0;M=1;N=K+226|0;O=(L<<16>>16<=(b[(c[(c[53542]|0)+8>>2]|0)+224>>1]|0))+(L<<16>>16)|0}else{L=b[K+226>>1]|0;M=-1;N=K+224|0;O=((L<<16>>16>=(b[(c[(c[53542]|0)+8>>2]|0)+226>>1]|0))<<31>>31)+(L<<16>>16)|0}L=(b[N>>1]|0)+M|0;c:do{if((O|0)!=(L|0)){P=(M|0)<0;Q=I^1;R=O;S=K;while(1){T=c[53514]|0;U=c[S+184>>2]|0;V=c[U+(R*44|0)+4>>2]|0;do{if((c[U+(R*44|0)>>2]|0)>0){W=T;X=T+4|0;Y=0;do{Z=(c[V+(Y<<2)>>2]|0)+8|0;_=c[Z>>2]|0;do{if(P){$=c[c[_+180>>2]>>2]|0;if(($|0)==0){aa=_;q=44;break}else{ba=0;ca=0;ea=$;fa=_}while(1){$=c[ea+8>>2]|0;if((b[$+154>>1]|0)>0){c[T+(ca<<2)>>2]=d[$+88|0]|c[(c[(c[((c[ea>>2]&3|0)==2?ea:ea-32|0)+28>>2]|0)+8>>2]|0)+236>>2]<<8;ga=ca+1|0;ha=c[Z>>2]|0}else{ga=ca;ha=fa}$=ba+1|0;ia=c[(c[ha+180>>2]|0)+($<<2)>>2]|0;if((ia|0)==0){ja=ga;ka=ha;q=43;break}else{ba=$;ca=ga;ea=ia;fa=ha}}}else{ia=c[c[_+172>>2]>>2]|0;if((ia|0)==0){aa=_;q=44;break}else{la=0;ma=0;na=ia;oa=_}while(1){ia=c[na+8>>2]|0;if((b[ia+154>>1]|0)>0){c[T+(ma<<2)>>2]=d[ia+48|0]|c[(c[(c[((c[na>>2]&3|0)==3?na:na+32|0)+28>>2]|0)+8>>2]|0)+236>>2]<<8;pa=ma+1|0;qa=c[Z>>2]|0}else{pa=ma;qa=oa}ia=la+1|0;$=c[(c[qa+172>>2]|0)+(ia<<2)>>2]|0;if(($|0)==0){ja=pa;ka=qa;q=43;break}else{la=ia;ma=pa;na=$;oa=qa}}}}while(0);do{if((q|0)==43){q=0;if((ja|0)==2){c[ka+240>>2]=((c[X>>2]|0)+(c[T>>2]|0)|0)/2|0;break}else if((ja|0)==0){aa=ka;q=44;break}else if((ja|0)==1){c[ka+240>>2]=c[T>>2];break}else{Jb(W|0,ja|0,4,4);_=(ja|0)/2|0;if((ja&1|0)!=0){c[(c[Z>>2]|0)+240>>2]=c[T+(_<<2)>>2];break}$=c[T+(_<<2)>>2]|0;ia=(c[T+(ja-1<<2)>>2]|0)-$|0;ra=c[T+(_-1<<2)>>2]|0;_=ra-(c[T>>2]|0)|0;if((_|0)==(ia|0)){c[(c[Z>>2]|0)+240>>2]=(ra+$|0)/2|0;break}else{sa=((da(_,$)|0)+(da(ra,ia)|0)|0)/(_+ia|0)|0;c[(c[Z>>2]|0)+240>>2]=sa;break}}}}while(0);if((q|0)==44){q=0;c[aa+240>>2]=-1}Y=Y+1|0;ta=c[m>>2]|0;ua=c[(c[ta+184>>2]|0)+(R*44|0)>>2]|0;}while((Y|0)<(ua|0));if((ua|0)>0){va=0;wa=0;xa=ta}else{break}while(1){Y=c[(c[V+(wa<<2)>>2]|0)+8>>2]|0;do{if((c[Y+184>>2]|0)==0){if((c[Y+176>>2]|0)!=0){ya=va;za=xa;break}W=Y+196|0;do{if((c[W+4>>2]|0)>0){X=c[W>>2]|0;Z=X;sa=c[Z>>2]|0;ia=c[((c[sa>>2]&3|0)==3?sa:sa+32|0)+28>>2]|0;sa=c[X+4>>2]|0;if((sa|0)==0){Aa=ia}else{X=1;_=ia;ia=sa;while(1){sa=c[((c[ia>>2]&3|0)==3?ia:ia+32|0)+28>>2]|0;ra=(c[(c[sa+8>>2]|0)+236>>2]|0)>(c[(c[_+8>>2]|0)+236>>2]|0)?sa:_;sa=X+1|0;$=c[Z+(sa<<2)>>2]|0;if(($|0)==0){Aa=ra;break}else{X=sa;_=ra;ia=$}}}ia=c[(c[Aa+8>>2]|0)+240>>2]|0;if((ia|0)<=-1){Ba=1;break}c[Y+240>>2]=ia+1;Ba=0}else{ia=Y+188|0;if((c[ia+4>>2]|0)<=0){Ba=1;break}_=c[ia>>2]|0;ia=_;X=c[ia>>2]|0;Z=c[((c[X>>2]&3|0)==2?X:X-32|0)+28>>2]|0;X=c[_+4>>2]|0;if((X|0)==0){Ca=Z}else{_=1;$=Z;Z=X;while(1){X=c[((c[Z>>2]&3|0)==2?Z:Z-32|0)+28>>2]|0;ra=(c[(c[X+8>>2]|0)+236>>2]|0)<(c[(c[$+8>>2]|0)+236>>2]|0)?X:$;X=_+1|0;sa=c[ia+(X<<2)>>2]|0;if((sa|0)==0){Ca=ra;break}else{_=X;$=ra;Z=sa}}}Z=c[(c[Ca+8>>2]|0)+240>>2]|0;if((Z|0)<=0){Ba=1;break}c[Y+240>>2]=Z-1;Ba=0}}while(0);ya=Ba|va;za=c[m>>2]|0}else{ya=va;za=xa}}while(0);Y=wa+1|0;Da=c[za+184>>2]|0;Ea=c[Da+(R*44|0)>>2]|0;if((Y|0)<(Ea|0)){va=ya;wa=Y;xa=za}else{break}}Y=c[Da+(R*44|0)+4>>2]|0;if((Ea|0)<=0){break}W=(ya&255|J|0)==0;Z=Y+(Ea<<2)|0;$=0;_=Ea;while(1){ia=_-1|0;d:do{if(Y>>>0<Z>>>0){sa=a[172624]|0;ra=Y;X=$;while(1){Fa=ra;while(1){if(Fa>>>0<Z>>>0){Ga=Fa}else{Ha=X;break d}while(1){Ia=c[Ga>>2]|0;Ja=c[Ia+8>>2]|0;Ka=c[Ja+240>>2]|0;La=Ga+4|0;if((Ka|0)>=0){break}if(La>>>0<Z>>>0){Ga=La}else{Ha=X;break d}}La=Ja+212|0;Ma=Ja+232|0;Na=Ja+159|0;Oa=Ja+156|0;Pa=Ga;Qa=0;e:while(1){if(Qa<<24>>24==0){Ra=Pa+4|0;if(Ra>>>0>=Z>>>0){Ha=X;break d}Sa=c[Ra>>2]|0;Ta=c[Sa+8>>2]|0;Ua=Ra;Va=Sa;Wa=Ta;Xa=c[Ta+212>>2]|0}else{Ta=Pa;while(1){Sa=Ta+4|0;if(Sa>>>0>=Z>>>0){Ha=X;break d}Ra=c[Sa>>2]|0;Ya=c[Ra+8>>2]|0;if((c[Ya+212>>2]|0)==0){Ua=Sa;Va=Ra;Wa=Ya;Xa=0;break}else{Ta=Sa}}}Ta=c[La>>2]|0;Za=Va+8|0;Sa=(Ta|0)!=(Xa|0);do{if(sa){if(Sa){break e}else{q=90}}else{if((Ta|0)==0|Sa^1|(Xa|0)==0){q=90;break}if((a[Na]|0)==7){if((a[Oa]|0)==1){break}}if((a[Wa+159|0]|0)!=7){break e}if((a[Wa+156|0]|0)!=1){break e}}}while(0);do{if((q|0)==90){q=0;Sa=c[m>>2]|0;Ta=c[(c[Sa+184>>2]|0)+((c[Ma>>2]|0)*44|0)+40>>2]|0;if((Ta|0)==0){break}Ya=(c[Sa+116>>2]&1|0)==0;Sa=da(c[Ta+4>>2]|0,c[(c[(Ya?Ia:Va)+8>>2]|0)+280>>2]|0)|0;if((a[(c[Ta+8>>2]|0)+((c[(c[(Ya?Va:Ia)+8>>2]|0)+280>>2]|0)+Sa)|0]|0)!=0){break e}}}while(0);_a=c[Wa+240>>2]|0;if((_a|0)>-1){q=94;break}Pa=Ua;Qa=(Xa|0)==0?Qa:1}if((q|0)==94){q=0;if(!((Ka|0)<=(_a|0)&((Ka|0)!=(_a|0)|Q))){break}}if(Ua>>>0<Z>>>0){Fa=Ua}else{Ha=X;break d}}Fa=c[Ma>>2]|0;Qa=Ja+236|0;Pa=c[Qa>>2]|0;Oa=c[Wa+236>>2]|0;c[Qa>>2]=Oa;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Fa*44|0)+4>>2]|0)+(Oa<<2)>>2]=Ia;c[(c[Za>>2]|0)+236>>2]=Pa;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Fa*44|0)+4>>2]|0)+(Pa<<2)>>2]=Va;Pa=X+1|0;if(Ua>>>0<Z>>>0){ra=Ua;X=Pa}else{Ha=Pa;break}}}else{Ha=$}}while(0);if((ia|0)>0){Z=W?Z-4|0:Z;$=Ha;_=ia}else{break}}if((Ha|0)==0){break}a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(R*44|0)+33|0]=0;if((R|0)<=0){break}a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+((R-1|0)*44|0)+33|0]=0}}while(0);V=R+M|0;if((V|0)==(L|0)){break c}R=V;S=c[m>>2]|0}}}while(0);vp(e,J^1);L=up(0)|0;if((L|0)>(E|0)){$a=E;ab=C}else{K=c[(c[m>>2]|0)+180>>2]|0;if((K|0)!=0){I=K;do{K=I+8|0;S=c[K>>2]|0;h[S+16>>3]=+(c[S+236>>2]|0);I=c[(c[K>>2]|0)+164>>2]|0;}while((I|0)!=0)}$a=L;ab=+(L|0)<+(E|0)*+h[21677]?0:C}I=w+1|0;if((I|0)<(B|0)){w=I;y=ab;x=L;E=$a}else{G=L;H=$a;break}}}else{G=A;H=z}}while(0);E=n+1|0;if((G|0)==0){r=H;s=0;t=B;break a}if((E|0)<3){n=E;u=G;v=H}else{r=H;s=G;t=B;break}}}}while(0);do{if((s|0)>(r|0)){B=e+8|0;G=c[B>>2]|0;H=c[G+180>>2]|0;if((H|0)==0){bb=G}else{G=H;do{H=G+8|0;z=c[H>>2]|0;c[z+236>>2]=~~+h[z+16>>3];G=c[(c[H>>2]|0)+164>>2]|0;}while((G|0)!=0);bb=c[B>>2]|0}G=b[bb+224>>1]|0;if(G<<16>>16>(b[bb+226>>1]|0)){break}H=G<<16>>16;while(1){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(H*44|0)+33|0]=0;G=c[(c[B>>2]|0)+184>>2]|0;Jb(c[G+(H*44|0)+4>>2]|0,c[G+(H*44|0)>>2]|0,4,56);if((H|0)<(b[(c[B>>2]|0)+226>>1]|0)){H=H+1|0}else{break}}}}while(0);if((r|0)>0){vp(e,0);cb=up(0)|0}else{cb=r}if(!((g|0)!=0&(t|0)>0)){i=j;return cb|0}g=e+8|0;e=0;r=c[g>>2]|0;f:while(1){bb=b[r+226>>1]|0;if(bb<<16>>16<(b[r+224>>1]|0)){db=r}else{s=bb<<16>>16;bb=r;while(1){a[(c[bb+184>>2]|0)+(s*44|0)+32|0]=0;H=c[g>>2]|0;B=c[H+184>>2]|0;G=c[B+(s*44|0)>>2]|0;if((G-1|0)>0){z=(s|0)>0;A=s+1|0;$a=0;ab=B;B=H;M=G;while(1){G=c[ab+(s*44|0)+4>>2]|0;Ha=c[G+($a<<2)>>2]|0;Ua=$a+1|0;Va=c[G+(Ua<<2)>>2]|0;Za=Ha+8|0;Ia=c[Za>>2]|0;Wa=Ia+236|0;Ja=c[Wa>>2]|0;Ma=Va+8|0;_a=c[Ma>>2]|0;Ka=c[_a+236>>2]|0;if((Ja|0)>=(Ka|0)){q=125;break f}Xa=Ia;Ga=c[Ia+212>>2]|0;Ea=c[_a+212>>2]|0;ya=(Ga|0)!=(Ea|0);do{if(a[172624]|0){if(ya){eb=B;fb=ab;gb=M}else{q=133}}else{if((Ga|0)==0|ya^1|(Ea|0)==0){q=133;break}if((a[Xa+159|0]|0)==7){if((a[Ia+156|0]|0)==1){q=135;break}}if((a[_a+159|0]|0)!=7){eb=B;fb=ab;gb=M;break}if((a[_a+156|0]|0)==1){q=135}else{eb=B;fb=ab;gb=M}}}while(0);do{if((q|0)==133){q=0;Xa=c[ab+((c[Ia+232>>2]|0)*44|0)+40>>2]|0;if((Xa|0)==0){q=135;break}Ea=(c[B+116>>2]&1|0)==0;ya=da(c[Xa+4>>2]|0,c[(c[(Ea?Ha:Va)+8>>2]|0)+280>>2]|0)|0;if((a[(c[Xa+8>>2]|0)+((c[(c[(Ea?Va:Ha)+8>>2]|0)+280>>2]|0)+ya)|0]|0)==0){q=135}else{eb=B;fb=ab;gb=M}}}while(0);do{if((q|0)==135){q=0;g:do{if(z){ya=c[_a+172>>2]|0;Ea=c[ya>>2]|0;Xa=(Ea|0)==0;Ga=c[Ia+172>>2]|0;Da=Ga;za=c[Da>>2]|0;if(Xa){hb=0}else{if((za|0)==0){xa=ya;while(1){wa=xa+4|0;if((c[wa>>2]|0)==0){ib=0;jb=0;break g}else{xa=wa}}}else{kb=0;lb=ya;mb=Ea}while(1){xa=c[mb+8>>2]|0;wa=b[xa+154>>1]|0;va=c[(c[(c[((c[mb>>2]&3|0)==3?mb:mb+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;Ba=xa+16|0;xa=kb;Ca=Da;Aa=za;while(1){ta=c[(c[(c[((c[Aa>>2]&3|0)==3?Aa:Aa+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((ta-va|0)>0){q=143}else{if((ta|0)!=(va|0)){nb=xa;break}if(+h[(c[Aa+8>>2]|0)+16>>3]>+h[Ba>>3]){q=143}else{nb=xa}}}while(0);if((q|0)==143){q=0;nb=(da(b[(c[(c[Ca>>2]|0)+8>>2]|0)+154>>1]|0,wa)|0)+xa|0}ta=Ca+4|0;ua=c[ta>>2]|0;if((ua|0)==0){break}else{xa=nb;Ca=ta;Aa=ua}}Aa=lb+4|0;Ca=c[Aa>>2]|0;if((Ca|0)==0){hb=nb;break}else{kb=nb;lb=Aa;mb=Ca}}}Da=Ga;if((za|0)==0){ib=hb;jb=0;break}if(Xa){Ca=Da;while(1){Aa=Ca+4|0;if((c[Aa>>2]|0)==0){ib=hb;jb=0;break g}else{Ca=Aa}}}else{ob=0;pb=Da;qb=za}while(1){Ca=c[qb+8>>2]|0;Xa=b[Ca+154>>1]|0;Ga=c[(c[(c[((c[qb>>2]&3|0)==3?qb:qb+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;Aa=Ca+16|0;Ca=ob;xa=ya;wa=Ea;while(1){Ba=c[(c[(c[((c[wa>>2]&3|0)==3?wa:wa+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((Ba-Ga|0)>0){q=153}else{if((Ba|0)!=(Ga|0)){rb=Ca;break}if(+h[(c[wa+8>>2]|0)+16>>3]>+h[Aa>>3]){q=153}else{rb=Ca}}}while(0);if((q|0)==153){q=0;rb=(da(b[(c[(c[xa>>2]|0)+8>>2]|0)+154>>1]|0,Xa)|0)+Ca|0}Ba=xa+4|0;va=c[Ba>>2]|0;if((va|0)==0){break}else{Ca=rb;xa=Ba;wa=va}}wa=pb+4|0;xa=c[wa>>2]|0;if((xa|0)==0){ib=hb;jb=rb;break}else{ob=rb;pb=wa;qb=xa}}}else{ib=0;jb=0}}while(0);if((c[ab+(A*44|0)>>2]|0)>0){L=c[_a+180>>2]|0;C=c[L>>2]|0;Ea=(C|0)==0;ya=c[Ia+180>>2]|0;za=ya;Da=c[za>>2]|0;if(Ea){sb=0}else{xa=(Da|0)==0;wa=0;Ca=L;Xa=C;while(1){Aa=c[Xa+8>>2]|0;Ga=b[Aa+154>>1]|0;va=c[(c[(c[((c[Xa>>2]&3|0)==2?Xa:Xa-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(xa){tb=wa}else{Ba=Aa+56|0;Aa=wa;ua=za;ta=Da;while(1){aa=c[(c[(c[((c[ta>>2]&3|0)==2?ta:ta-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((aa-va|0)>0){q=164}else{if((aa|0)!=(va|0)){ub=Aa;break}if(+h[(c[ta+8>>2]|0)+56>>3]>+h[Ba>>3]){q=164}else{ub=Aa}}}while(0);if((q|0)==164){q=0;ub=(da(b[(c[(c[ua>>2]|0)+8>>2]|0)+154>>1]|0,Ga)|0)+Aa|0}aa=ua+4|0;ja=c[aa>>2]|0;if((ja|0)==0){tb=ub;break}else{Aa=ub;ua=aa;ta=ja}}}ta=Ca+4|0;ua=c[ta>>2]|0;if((ua|0)==0){sb=tb;break}else{wa=tb;Ca=ta;Xa=ua}}}Xa=sb+ib|0;if((Da|0)==0){vb=0}else{Ca=0;wa=ya;za=Da;while(1){xa=c[za+8>>2]|0;ua=b[xa+154>>1]|0;ta=c[(c[(c[((c[za>>2]&3|0)==2?za:za-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(Ea){wb=Ca}else{Aa=xa+56|0;xa=Ca;Ga=L;Ba=C;while(1){va=c[(c[(c[((c[Ba>>2]&3|0)==2?Ba:Ba-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((va-ta|0)>0){q=174}else{if((va|0)!=(ta|0)){xb=xa;break}if(+h[(c[Ba+8>>2]|0)+56>>3]>+h[Aa>>3]){q=174}else{xb=xa}}}while(0);if((q|0)==174){q=0;xb=(da(b[(c[(c[Ga>>2]|0)+8>>2]|0)+154>>1]|0,ua)|0)+xa|0}va=Ga+4|0;ja=c[va>>2]|0;if((ja|0)==0){wb=xb;break}else{xa=xb;Ga=va;Ba=ja}}}Ba=wa+4|0;Ga=c[Ba>>2]|0;if((Ga|0)==0){vb=wb;break}else{Ca=wb;wa=Ba;za=Ga}}}yb=Xa;zb=vb+jb|0}else{yb=ib;zb=jb}if((zb|0)>(yb|0)){eb=B;fb=ab;gb=M;break}za=a[Ia+156|0]|0;if(za<<24>>24==(a[_a+156|0]|0)){eb=B;fb=ab;gb=M;break}wa=(M|0)>0;do{if(wa){Ca=0;C=0;L=0;do{Ea=(a[(c[(c[G+(L<<2)>>2]|0)+8>>2]|0)+156|0]|0)==0|0;Ca=(Ea^1)+Ca|0;C=Ea+C|0;L=L+1|0;}while((L|0)<(M|0));L=za<<24>>24==0;if((C|0)>=(Ca|0)){Ab=L;q=186;break}Bb=L?Ha:Va}else{Ab=za<<24>>24==0;q=186}}while(0);if((q|0)==186){q=0;Bb=Ab?Va:Ha}if(wa){za=0;Xa=0;while(1){L=(c[G+(Xa<<2)>>2]|0)==(Bb|0)?Xa:za;Ea=Xa+1|0;if((Ea|0)<(M|0)){za=L;Xa=Ea}else{Cb=L;break}}}else{Cb=0}Xa=(a[(c[Bb+8>>2]|0)+156|0]|0)==0|0;h:do{if((Cb|0)>0){za=0;wa=Cb;while(1){L=wa-1|0;Ea=za+1|0;if((a[(c[(c[G+(L<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Db=za;break h}if((L|0)>0){za=Ea;wa=L}else{Db=Ea;break}}}else{Db=0}}while(0);wa=Cb+1|0;i:do{if((wa|0)<(M|0)){za=0;Ca=wa;while(1){C=za+1|0;if((a[(c[(c[G+(Ca<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Eb=za;break i}Ea=Ca+1|0;if((Ea|0)<(M|0)){za=C;Ca=Ea}else{Eb=C;break}}}else{Eb=0}}while(0);wa=c[Ia+232>>2]|0;c[Wa>>2]=Ka;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(wa*44|0)+4>>2]|0)+(Ka<<2)>>2]=Ha;c[(c[Ma>>2]|0)+236>>2]=Ja;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(wa*44|0)+4>>2]|0)+(Ja<<2)>>2]=Va;wa=c[g>>2]|0;Ca=c[wa+184>>2]|0;za=c[Ca+(s*44|0)>>2]|0;if((za|0)>0){C=c[Ca+(s*44|0)+4>>2]|0;Ea=Cb;L=0;while(1){Da=(c[C+(L<<2)>>2]|0)==(Bb|0)?L:Ea;ya=L+1|0;if((ya|0)<(za|0)){Ea=Da;L=ya}else{Fb=Da;break}}}else{Fb=Cb}j:do{if((Fb|0)>0){L=c[Ca+(s*44|0)+4>>2]|0;Ea=0;C=Fb;while(1){Da=C-1|0;ya=Ea+1|0;if((a[(c[(c[L+(Da<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Gb=Ea;break j}if((Da|0)>0){Ea=ya;C=Da}else{Gb=ya;break}}}else{Gb=0}}while(0);C=Fb+1|0;k:do{if((C|0)<(za|0)){Ea=c[Ca+(s*44|0)+4>>2]|0;L=0;ya=C;while(1){Da=L+1|0;if((a[(c[(c[Ea+(ya<<2)>>2]|0)+8>>2]|0)+156|0]|0)!=(Xa|0)){Hb=L;break k}Ga=ya+1|0;if((Ga|0)<(za|0)){L=Da;ya=Ga}else{Hb=Da;break}}}else{Hb=0}}while(0);Xa=Gb-Hb|0;C=Db-Eb|0;if((((Xa|0)>-1?Xa:-Xa|0)|0)<=(((C|0)>-1?C:-C|0)|0)){eb=wa;fb=Ca;gb=za;break}C=c[Za>>2]|0;Xa=c[C+232>>2]|0;ya=C+236|0;C=c[ya>>2]|0;L=c[(c[Ma>>2]|0)+236>>2]|0;c[ya>>2]=L;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Xa*44|0)+4>>2]|0)+(L<<2)>>2]=Ha;c[(c[Ma>>2]|0)+236>>2]=C;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(Xa*44|0)+4>>2]|0)+(C<<2)>>2]=Va;C=c[g>>2]|0;Xa=c[C+184>>2]|0;eb=C;fb=Xa;gb=c[Xa+(s*44|0)>>2]|0}}while(0);if((Ua|0)<(gb-1|0)){$a=Ua;ab=fb;B=eb;M=gb}else{Ib=eb;break}}}else{Ib=H}if((s|0)>(b[Ib+224>>1]|0)){s=s-1|0;bb=Ib}else{db=Ib;break}}}bb=e+1|0;if((bb|0)<(t|0)){e=bb;r=db}else{q=210;break}}if((q|0)==125){cc(87312,117264,465,171048);return 0}else if((q|0)==210){i=j;return cb|0}return 0}function lp(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;bo(a);xp(a);Bp(a);Cp(a);e=kp(a,2,d)|0;f=a+8|0;a=c[f>>2]|0;if((c[a+172>>2]|0)<1){g=e;h=a}else{i=1;j=e;e=a;while(1){a=(lp(c[(c[e+176>>2]|0)+(i<<2)>>2]|0,d)|0)+j|0;k=c[f>>2]|0;if((i|0)<(c[k+172>>2]|0)){i=i+1|0;j=a;e=k}else{g=a;h=k;break}}}e=c[h+256>>2]|0;if((e|0)==0){return g|0}j=b[h+224>>1]|0;if(j<<16>>16>(b[h+226>>1]|0)){return g|0}i=j<<16>>16;c[e+(i<<2)>>2]=c[c[(c[h+184>>2]|0)+(i*44|0)+4>>2]>>2];h=c[f>>2]|0;if(j<<16>>16<(b[h+226>>1]|0)){l=i;m=h}else{return g|0}do{l=l+1|0;c[(c[m+256>>2]|0)+(l<<2)>>2]=c[c[(c[m+184>>2]|0)+(l*44|0)+4>>2]>>2];m=c[f>>2]|0;}while((l|0)<(b[m+226>>1]|0));return g|0}function mp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=a+8|0;a=c[d>>2]|0;e=c[a+256>>2]|0;do{if((e|0)==0){f=a}else{g=b[a+224>>1]|0;if(g<<16>>16>(b[a+226>>1]|0)){f=a;break}h=g<<16>>16;c[e+(h<<2)>>2]=c[c[(c[a+184>>2]|0)+(h*44|0)+4>>2]>>2];i=c[d>>2]|0;if(g<<16>>16<(b[i+226>>1]|0)){j=h;k=i}else{f=i;break}while(1){i=j+1|0;c[(c[k+256>>2]|0)+(i<<2)>>2]=c[c[(c[k+184>>2]|0)+(i*44|0)+4>>2]>>2];h=c[d>>2]|0;if((i|0)<(b[h+226>>1]|0)){j=i;k=h}else{f=h;break}}}}while(0);if((c[f+172>>2]|0)<1){return}else{l=1;m=f}while(1){mp(c[(c[m+176>>2]|0)+(l<<2)>>2]|0);f=c[d>>2]|0;if((l|0)<(c[f+172>>2]|0)){l=l+1|0;m=f}else{break}}return}function np(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0;d=a+8|0;e=c[d>>2]|0;if((c[e+172>>2]|0)<1){f=e}else{g=1;h=e;while(1){np(c[(c[h+176>>2]|0)+(g<<2)>>2]|0);e=c[d>>2]|0;if((g|0)<(c[e+172>>2]|0)){g=g+1|0;h=e}else{f=e;break}}}if((c[f+256>>2]|0)==0){return}h=b[f+224>>1]|0;if(h<<16>>16>(b[f+226>>1]|0)){return}g=a|0;e=h<<16>>16;h=f;while(1){f=c[(c[h+256>>2]|0)+(e<<2)>>2]|0;i=op(a,f,-1)|0;j=op(a,f,1)|0;c[(c[(c[d>>2]|0)+256>>2]|0)+(e<<2)>>2]=i;f=c[(c[(c[(Ix(g)|0)+8>>2]|0)+184>>2]|0)+(e*44|0)+4>>2]|0;k=i+8|0;c[(c[(c[d>>2]|0)+184>>2]|0)+(e*44|0)+4>>2]=f+(c[(c[k>>2]|0)+236>>2]<<2);c[(c[(c[d>>2]|0)+184>>2]|0)+(e*44|0)>>2]=(c[(c[j+8>>2]|0)+236>>2]|0)+1-(c[(c[k>>2]|0)+236>>2]|0);k=c[d>>2]|0;if((e|0)<(b[k+226>>1]|0)){e=e+1|0;h=k}else{break}}return}function op(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;if((d|0)==0){cc(145896,117264,754,170184);return 0}f=(e|0)<0;g=d;a:while(1){d=g;while(1){h=c[d+8>>2]|0;i=c[h+236>>2]|0;if(f){if((i|0)<=0){j=22;break a}k=(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+((c[h+232>>2]|0)*44|0)+4>>2]|0)+(i-1<<2)|0}else{k=(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+((c[h+232>>2]|0)*44|0)+4>>2]|0)+(i+1<<2)|0}h=c[k>>2]|0;if((h|0)==0){j=22;break a}l=h+8|0;m=c[l>>2]|0;if((da((c[m+236>>2]|0)-i|0,e)|0)<=0){j=11;break a}i=a[m+156|0]|0;if(i<<24>>24==0){if((Rx(b,h|0)|0)!=0){g=h;continue a}n=c[l>>2]|0;o=n;p=a[n+156|0]|0}else{o=m;p=i}if(p<<24>>24!=1){d=h;continue}if((c[o+176>>2]|0)!=1){d=h;continue}i=o+180|0;if((c[i+4>>2]|0)!=1){d=h;continue}m=c[c[i>>2]>>2]|0;i=c[m+8>>2]|0;if((a[i+112|0]|0)==0){q=m}else{m=i;do{r=c[m+116>>2]|0;m=c[r+8>>2]|0;}while((a[m+112|0]|0)!=0);q=r}if((Rx(b,q|0)|0)==0){d=h}else{g=h;continue a}}}if((j|0)==11){cc(142888,117264,760,170184);return 0}else if((j|0)==22){return g|0}return 0}function pp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0;e=d;f=c[e>>2]&3;g=c[((f|0)==2?d:d-32|0)+28>>2]|0;h=c[(c[g+8>>2]|0)+188>>2]|0;a:do{if((h|0)!=0){i=h;j=c[i>>2]|0;if((j|0)==0){break}k=d+32|0;l=0;m=j;while(1){j=l+1|0;if((c[((c[m>>2]&3|0)==2?m:m-32|0)+28>>2]|0)==(c[((f|0)==3?d:k)+28>>2]|0)){break}n=c[i+(j<<2)>>2]|0;if((n|0)==0){break a}else{l=j;m=n}}ep(d,m);l=(c[d+8>>2]|0)+172|0;if((c[l>>2]|0)==0){c[l>>2]=m}l=c[m+8>>2]|0;do{if((a[l+112|0]|0)==4){i=l+116|0;if((c[i>>2]|0)!=0){break}c[i>>2]=d}}while(0);l=(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204|0;m=c[l>>2]|0;if((m|0)==0){o=kk((c[l+4>>2]<<2)+8|0)|0}else{o=mk(m,(c[l+4>>2]<<2)+8|0)|0}c[(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204>>2]=o;l=(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+208|0;m=c[l>>2]|0;c[l>>2]=m+1;c[(c[(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204>>2]|0)+(m<<2)>>2]=d;m=(c[(c[((c[e>>2]&3|0)==3?d:k)+28>>2]|0)+8>>2]|0)+204|0;c[(c[m>>2]|0)+(c[m+4>>2]<<2)>>2]=0;return}}while(0);e=Yo(g,c[((f|0)==3?d:d+32|0)+28>>2]|0,d)|0;f=d+8|0;d=e+8|0;a[(c[d>>2]|0)+112|0]=(a[(c[f>>2]|0)+112|0]|0)==4?4:3;c[(c[d>>2]|0)+96>>2]=c[(c[f>>2]|0)+96>>2];cp(b,e);return}function qp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;d=a+8|0;e=jk((b[(c[d>>2]|0)+226>>1]<<2)+8|0)|0;f=e;g=ux(a)|0;if((g|0)!=0){h=g;do{g=f+(c[(c[h+8>>2]|0)+232>>2]<<2)|0;c[g>>2]=(c[g>>2]|0)+1;g=mw(a,h)|0;if((g|0)!=0){i=g;do{g=c[i>>2]&3;j=c[(c[(c[((g|0)==3?i:i+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;k=c[(c[(c[((g|0)==2?i:i-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0;g=(j|0)>(k|0);l=g?j:k;m=(g?k:j)+1|0;if((m|0)<(l|0)){j=m;do{m=f+(j<<2)|0;c[m>>2]=(c[m>>2]|0)+1;j=j+1|0;}while((j|0)<(l|0))}i=ow(a,i)|0;}while((i|0)!=0)}h=vx(a,h)|0;}while((h|0)!=0)}h=jk(((b[(c[d>>2]|0)+226>>1]|0)*44|0)+88|0)|0;c[(c[d>>2]|0)+184>>2]=h;h=c[d>>2]|0;a=b[h+224>>1]|0;if(a<<16>>16>(b[h+226>>1]|0)){eF(e);return}i=a<<16>>16;a=h;while(1){h=f+(i<<2)|0;l=c[h>>2]|0;c[(c[a+184>>2]|0)+(i*44|0)>>2]=l;c[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+8>>2]=l;l=jk((c[h>>2]<<2)+4|0)|0;c[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+4>>2]=l;c[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+12>>2]=l;l=c[d>>2]|0;if((i|0)<(b[l+226>>1]|0)){i=i+1|0;a=l}else{break}}eF(e);return}function rp(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0;e=i;f=d+8|0;g=c[(c[f>>2]|0)+232>>2]|0;h=a+8|0;j=c[(c[h>>2]|0)+184>>2]|0;k=c[j+(g*44|0)>>2]|0;if((c[j+(g*44|0)+8>>2]|0)<1){l=$w(a|0)|0;a=$w(d|0)|0;Fv(1,134832,(m=i,i=i+40|0,c[m>>2]=1070,c[m+8>>2]=l,c[m+16>>2]=a,c[m+24>>2]=g,c[m+32>>2]=k,m)|0)|0;i=m;i=e;return}c[(c[j+(g*44|0)+4>>2]|0)+(k<<2)>>2]=d;c[(c[f>>2]|0)+236>>2]=k;k=(c[(c[h>>2]|0)+184>>2]|0)+(g*44|0)|0;c[k>>2]=(c[k>>2]|0)+1;k=c[h>>2]|0;j=c[k+184>>2]|0;if((c[j+(g*44|0)>>2]|0)>(c[j+(g*44|0)+8>>2]|0)){cc(118064,117264,1077,170464)}a=c[(c[f>>2]|0)+236>>2]|0;l=c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(g*44|0)+8>>2]|0;if((a|0)>(l|0)){n=$w(d|0)|0;o=c[(c[f>>2]|0)+236>>2]|0;p=c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(g*44|0)+8>>2]|0;Fv(1,109736,(m=i,i=i+40|0,c[m>>2]=1090,c[m+8>>2]=n,c[m+16>>2]=o,c[m+24>>2]=g,c[m+32>>2]=p,m)|0)|0;i=m;i=e;return}p=b[k+224>>1]|0;o=b[k+226>>1]|0;do{if((g|0)>=(p|0)){if((g|0)>(o<<16>>16|0)){break}if(((c[j+(g*44|0)+4>>2]|0)+(a<<2)|0)>>>0<=((c[j+(g*44|0)+12>>2]|0)+(l<<2)|0)>>>0){i=e;return}k=$w(d|0)|0;n=c[(c[h>>2]|0)+184>>2]|0;q=(c[n+(g*44|0)+4>>2]|0)+(c[(c[f>>2]|0)+236>>2]<<2)|0;r=(c[n+(g*44|0)+12>>2]|0)+(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(g*44|0)+8>>2]<<2)|0;Fv(1,98240,(m=i,i=i+56|0,c[m>>2]=1101,c[m+8>>2]=g,c[m+16>>2]=k,c[m+24>>2]=q,c[m+32>>2]=g,c[m+40>>2]=g,c[m+48>>2]=r,m)|0)|0;i=m;i=e;return}}while(0);Fv(1,103912,(m=i,i=i+32|0,c[m>>2]=1095,c[m+8>>2]=g,c[m+16>>2]=p,c[m+24>>2]=o<<16>>16,m)|0)|0;i=m;i=e;return}function sp(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;f=i;g=d+8|0;h=Am(c[(c[g>>2]|0)+220>>2]|0)|0;j=c[g>>2]|0;k=c[j+180>>2]|0;if((k|0)==0){l=j}else{j=k;do{k=j+8|0;a[(c[k>>2]|0)+157|0]=0;j=c[(c[k>>2]|0)+164>>2]|0;}while((j|0)!=0);l=c[g>>2]|0}j=b[l+224>>1]|0;if(j<<16>>16>(b[l+226>>1]|0)){m=l}else{k=j<<16>>16;j=l;while(1){c[(c[j+184>>2]|0)+(k*44|0)>>2]=0;l=c[g>>2]|0;if((k|0)<(b[l+226>>1]|0)){k=k+1|0;j=l}else{m=l;break}}}j=c[m+180>>2]|0;if((j|0)!=0){m=(e|0)==0;k=j;do{j=k;l=k+8|0;n=c[l>>2]|0;do{if((c[c[(m?n+172|0:n+180|0)>>2]>>2]|0)==0){o=n+157|0;if((a[o]|0)!=0){p=n;break}a[o]=1;Cm(h,j);o=Dm(h)|0;if((o|0)!=0){q=o;do{if((a[(c[q+8>>2]|0)+159|0]|0)==7){fo(d,q,e,h)}else{rp(d,q);tp(h,q,e)}q=Dm(h)|0;}while((q|0)!=0)}p=c[l>>2]|0}else{p=n}}while(0);k=c[p+164>>2]|0;}while((k|0)!=0)}if((Dm(h)|0)!=0){Fv(1,92696,(k=i,i=i+1|0,i=i+7&-8,c[k>>2]=0,k)|0)|0;i=k}k=c[g>>2]|0;p=b[k+224>>1]|0;if(p<<16>>16<=(b[k+226>>1]|0)){k=p<<16>>16;while(1){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(k*44|0)+33|0]=0;p=c[g>>2]|0;do{if((c[p+116>>2]&1|0)==0){r=p}else{e=c[p+184>>2]|0;m=c[e+(k*44|0)>>2]|0;if((m|0)<=0){r=p;break}n=c[e+(k*44|0)+4>>2]|0;e=m-1|0;m=(e|0)/2|0;l=0;while(1){j=c[n+(l<<2)>>2]|0;q=c[n+(e-l<<2)>>2]|0;o=c[j+8>>2]|0;s=c[o+232>>2]|0;t=o+236|0;o=c[t>>2]|0;u=q+8|0;v=c[(c[u>>2]|0)+236>>2]|0;c[t>>2]=v;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(s*44|0)+4>>2]|0)+(v<<2)>>2]=j;c[(c[u>>2]|0)+236>>2]=o;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(s*44|0)+4>>2]|0)+(o<<2)>>2]=q;if((l|0)<(m|0)){l=l+1|0}else{break}}r=c[g>>2]|0}}while(0);if((k|0)<(b[r+226>>1]|0)){k=k+1|0}else{break}}}if((Ix(d|0)|0)!=(d|0)){Bm(h);i=f;return}if((up(0)|0)<=0){Bm(h);i=f;return}vp(d,0);Bm(h);i=f;return}function tp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;f=d+8|0;d=c[f>>2]|0;if((e|0)==0){e=d+180|0;if((c[e+4>>2]|0)>0){g=0;h=e;i=d}else{return}while(1){e=c[(c[h>>2]|0)+(g<<2)>>2]|0;j=e;k=e-32|0;l=(c[(c[((c[j>>2]&3|0)==2?e:k)+28>>2]|0)+8>>2]|0)+157|0;if((a[l]|0)==0){a[l]=1;Cm(b,c[((c[j>>2]&3|0)==2?e:k)+28>>2]|0);m=c[f>>2]|0}else{m=i}k=g+1|0;e=m+180|0;if((k|0)<(c[e+4>>2]|0)){g=k;h=e;i=m}else{break}}return}else{m=d+172|0;if((c[m+4>>2]|0)>0){n=0;o=m;p=d}else{return}while(1){d=c[(c[o>>2]|0)+(n<<2)>>2]|0;m=d;i=d+32|0;h=(c[(c[((c[m>>2]&3|0)==3?d:i)+28>>2]|0)+8>>2]|0)+157|0;if((a[h]|0)==0){a[h]=1;Cm(b,c[((c[m>>2]&3|0)==3?d:i)+28>>2]|0);q=c[f>>2]|0}else{q=p}i=n+1|0;d=q+172|0;if((i|0)<(c[d+4>>2]|0)){n=i;o=d;p=q}else{break}}return}}function up(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0.0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0;d=(c[53542]|0)+8|0;e=c[d>>2]|0;f=b[e+224>>1]|0;if(f<<16>>16>=(b[e+226>>1]|0)){g=0;return g|0}i=f<<16>>16;f=0;j=e;while(1){e=c[j+184>>2]|0;if((a[e+(i*44|0)+33|0]|0)==0){k=c[e+(i*44|0)+4>>2]|0;l=i+1|0;m=c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(l*44|0)>>2]|0;if((c[43800]|0)>(m|0)){n=j;o=e}else{p=m+1|0;c[43800]=p;m=c[43798]|0;if((m|0)==0){q=kk(p<<2)|0}else{q=mk(m,p<<2)|0}c[43798]=q;p=c[d>>2]|0;n=p;o=c[p+184>>2]|0}if((c[o+(l*44|0)>>2]|0)>0){p=0;while(1){c[(c[43798]|0)+(p<<2)>>2]=0;m=p+1|0;r=c[d>>2]|0;s=c[r+184>>2]|0;if((m|0)<(c[s+(l*44|0)>>2]|0)){p=m}else{t=s;u=r;break}}}else{t=o;u=n}do{if((c[t+(i*44|0)>>2]|0)>0){p=0;r=0;s=0;m=u;v=u;while(1){w=k+(s<<2)|0;x=c[(c[(c[w>>2]|0)+8>>2]|0)+180>>2]|0;y=c[x>>2]|0;do{if((r|0)>0){if((y|0)==0){z=r;A=m;B=p;C=v;break}D=c[43798]|0;E=p;F=0;G=y;while(1){H=c[(c[(c[((c[G>>2]&3|0)==2?G:G-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if((H|0)<(r|0)){I=b[(c[G+8>>2]|0)+154>>1]|0;J=E;K=H;while(1){H=K+1|0;L=(da(c[D+(H<<2)>>2]|0,I)|0)+J|0;if((H|0)<(r|0)){J=L;K=H}else{M=L;break}}}else{M=E}K=F+1|0;J=c[x+(K<<2)>>2]|0;if((J|0)==0){N=M;O=22;break}else{E=M;F=K;G=J}}}else{N=p;O=22}}while(0);do{if((O|0)==22){O=0;if((y|0)==0){z=r;A=m;B=N;C=v;break}else{P=r;Q=1;R=y}while(1){x=c[(c[(c[((c[R>>2]&3|0)==2?R:R-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;S=(x|0)>(P|0)?x:P;G=(c[43798]|0)+(x<<2)|0;c[G>>2]=(c[G>>2]|0)+(b[(c[R+8>>2]|0)+154>>1]|0);G=c[(c[(c[(c[w>>2]|0)+8>>2]|0)+180>>2]|0)+(Q<<2)>>2]|0;if((G|0)==0){break}P=S;Q=Q+1|0;R=G}G=c[d>>2]|0;z=S;A=G;B=N;C=G}}while(0);w=s+1|0;T=c[A+184>>2]|0;U=c[T+(i*44|0)>>2]|0;if((w|0)<(U|0)){p=B;r=z;s=w;m=A;v=C}else{break}}if((U|0)<=0){V=B;W=T;X=C;break}v=c[T+(i*44|0)+4>>2]|0;m=B;s=0;while(1){r=c[(c[v+(s<<2)>>2]|0)+8>>2]|0;if((a[r+145|0]|0)==0){Y=m}else{p=c[r+180>>2]|0;r=p;w=c[r>>2]|0;do{if((w|0)==0){Z=0}else{y=c[p+4>>2]|0;if((y|0)==0){Z=0;break}G=w;x=0;F=1;E=y;while(1){y=c[(c[(c[((c[G>>2]&3|0)==2?G:G-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;D=c[G+8>>2]|0;_=+h[D+16>>3];J=D+154|0;D=F;K=x;I=E;while(1){L=c[I+8>>2]|0;if(+((c[(c[(c[((c[I>>2]&3|0)==2?I:I-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-y|0)*(+h[L+16>>3]-_)<0.0){$=(da(b[L+154>>1]|0,b[J>>1]|0)|0)+K|0}else{$=K}L=D+1|0;H=c[r+(L<<2)>>2]|0;if((H|0)==0){break}else{D=L;K=$;I=H}}I=F+1|0;K=c[r+(I<<2)>>2]|0;if((K|0)==0){Z=$;break}else{G=E;x=$;F=I;E=K}}}}while(0);Y=Z+m|0}r=s+1|0;if((r|0)<(U|0)){m=Y;s=r}else{V=Y;W=T;X=C;break}}}else{V=0;W=t;X=u}}while(0);k=c[W+(l*44|0)>>2]|0;if((k|0)>0){s=c[W+(l*44|0)+4>>2]|0;m=V;v=0;while(1){r=c[(c[s+(v<<2)>>2]|0)+8>>2]|0;if((a[r+145|0]|0)==0){aa=m}else{w=c[r+172>>2]|0;r=w;p=c[r>>2]|0;do{if((p|0)==0){ba=0}else{E=c[w+4>>2]|0;if((E|0)==0){ba=0;break}F=p;x=0;G=1;K=E;while(1){E=c[(c[(c[((c[F>>2]&3|0)==3?F:F+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;I=c[F+8>>2]|0;_=+h[I+56>>3];D=I+154|0;I=G;J=x;y=K;while(1){H=c[y+8>>2]|0;if(+((c[(c[(c[((c[y>>2]&3|0)==3?y:y+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)-E|0)*(+h[H+56>>3]-_)<0.0){ca=(da(b[H+154>>1]|0,b[D>>1]|0)|0)+J|0}else{ca=J}H=I+1|0;L=c[r+(H<<2)>>2]|0;if((L|0)==0){break}else{I=H;J=ca;y=L}}y=G+1|0;J=c[r+(y<<2)>>2]|0;if((J|0)==0){ba=ca;break}else{F=K;x=ca;G=y;K=J}}}}while(0);aa=ba+m|0}r=v+1|0;if((r|0)<(k|0)){m=aa;v=r}else{ea=aa;break}}}else{ea=V}c[(c[X+184>>2]|0)+(i*44|0)+36>>2]=ea;a[(c[(c[d>>2]|0)+184>>2]|0)+(i*44|0)+33|0]=1;fa=ea;ga=c[d>>2]|0;ha=l}else{fa=c[e+(i*44|0)+36>>2]|0;ga=j;ha=i+1|0}v=fa+f|0;if((ha|0)<(b[ga+226>>1]|0)){i=ha;f=v;j=ga}else{g=v;break}}return g|0}function vp(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0;f=d+8|0;d=c[f>>2]|0;g=b[d+224>>1]|0;if(g<<16>>16>(b[d+226>>1]|0)){i=d}else{j=g<<16>>16;g=d;while(1){a[(c[g+184>>2]|0)+(j*44|0)+32|0]=1;d=c[f>>2]|0;if((j|0)<(b[d+226>>1]|0)){j=j+1|0;g=d}else{i=d;break}}}g=(e|0)!=0;e=i;a:while(1){i=b[e+224>>1]|0;if(i<<16>>16>(b[e+226>>1]|0)){k=76;break}j=i<<16>>16;i=0;d=e;while(1){l=(c[d+184>>2]|0)+(j*44|0)+32|0;if((a[l]|0)==0){m=i;n=d}else{a[l]=0;l=c[f>>2]|0;o=c[l+184>>2]|0;p=c[o+(j*44|0)>>2]|0;b:do{if((p-1|0)>0){q=(j|0)>0;r=j+1|0;s=j-1|0;t=0;u=0;v=o;w=l;x=p;while(1){y=a[172624]|0;z=c[v+(j*44|0)+4>>2]|0;A=c[z+(u<<2)>>2]|0;B=c[A+8>>2]|0;C=x-1|0;D=w+116|0;E=v+(r*44|0)|0;F=u;G=A;A=B;H=c[B+236>>2]|0;while(1){I=F+1|0;J=c[z+(I<<2)>>2]|0;K=A+236|0;L=J+8|0;B=c[L>>2]|0;M=c[B+236>>2]|0;if((H|0)>=(M|0)){k=12;break a}N=A;O=c[A+212>>2]|0;P=c[B+212>>2]|0;Q=(O|0)!=(P|0);do{if(y){if(!Q){k=20}}else{if((O|0)==0|Q^1|(P|0)==0){k=20;break}if((a[N+159|0]|0)==7){if((a[A+156|0]|0)==1){k=22;break}}if((a[B+159|0]|0)!=7){break}if((a[B+156|0]|0)==1){k=22}}}while(0);do{if((k|0)==20){k=0;N=c[v+((c[A+232>>2]|0)*44|0)+40>>2]|0;if((N|0)==0){k=22;break}P=(c[D>>2]&1|0)==0;Q=da(c[N+4>>2]|0,c[(c[(P?G:J)+8>>2]|0)+280>>2]|0)|0;if((a[(c[N+8>>2]|0)+((c[(c[(P?J:G)+8>>2]|0)+280>>2]|0)+Q)|0]|0)==0){k=22}}}while(0);if((k|0)==22){k=0;c:do{if(q){Q=c[B+172>>2]|0;P=c[Q>>2]|0;N=(P|0)==0;O=c[A+172>>2]|0;R=O;S=c[R>>2]|0;if(N){T=0}else{if((S|0)==0){U=Q;while(1){V=U+4|0;if((c[V>>2]|0)==0){W=0;X=0;break c}else{U=V}}}else{Y=0;Z=Q;_=P}while(1){U=c[_+8>>2]|0;V=b[U+154>>1]|0;$=c[(c[(c[((c[_>>2]&3|0)==3?_:_+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;aa=U+16|0;U=Y;ba=R;ca=S;while(1){ea=c[(c[(c[((c[ca>>2]&3|0)==3?ca:ca+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((ea-$|0)>0){k=30}else{if((ea|0)!=($|0)){fa=U;break}if(+h[(c[ca+8>>2]|0)+16>>3]>+h[aa>>3]){k=30}else{fa=U}}}while(0);if((k|0)==30){k=0;fa=(da(b[(c[(c[ba>>2]|0)+8>>2]|0)+154>>1]|0,V)|0)+U|0}ea=ba+4|0;ga=c[ea>>2]|0;if((ga|0)==0){break}else{U=fa;ba=ea;ca=ga}}ca=Z+4|0;ba=c[ca>>2]|0;if((ba|0)==0){T=fa;break}else{Y=fa;Z=ca;_=ba}}}R=O;if((S|0)==0){W=T;X=0;break}if(N){ba=R;while(1){ca=ba+4|0;if((c[ca>>2]|0)==0){W=T;X=0;break c}else{ba=ca}}}else{ha=0;ia=R;ja=S}while(1){ba=c[ja+8>>2]|0;N=b[ba+154>>1]|0;O=c[(c[(c[((c[ja>>2]&3|0)==3?ja:ja+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;ca=ba+16|0;ba=ha;U=Q;V=P;while(1){aa=c[(c[(c[((c[V>>2]&3|0)==3?V:V+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((aa-O|0)>0){k=40}else{if((aa|0)!=(O|0)){ka=ba;break}if(+h[(c[V+8>>2]|0)+16>>3]>+h[ca>>3]){k=40}else{ka=ba}}}while(0);if((k|0)==40){k=0;ka=(da(b[(c[(c[U>>2]|0)+8>>2]|0)+154>>1]|0,N)|0)+ba|0}aa=U+4|0;$=c[aa>>2]|0;if(($|0)==0){break}else{ba=ka;U=aa;V=$}}V=ia+4|0;U=c[V>>2]|0;if((U|0)==0){W=T;X=ka;break}else{ha=ka;ia=V;ja=U}}}else{W=0;X=0}}while(0);if((c[E>>2]|0)>0){P=c[B+180>>2]|0;Q=c[P>>2]|0;S=(Q|0)==0;R=c[A+180>>2]|0;U=R;V=c[U>>2]|0;if(S){la=0}else{ba=(V|0)==0;N=0;ca=P;O=Q;while(1){$=c[O+8>>2]|0;aa=b[$+154>>1]|0;ga=c[(c[(c[((c[O>>2]&3|0)==2?O:O-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(ba){ma=N}else{ea=$+56|0;$=N;na=U;oa=V;while(1){pa=c[(c[(c[((c[oa>>2]&3|0)==2?oa:oa-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((pa-ga|0)>0){k=51}else{if((pa|0)!=(ga|0)){qa=$;break}if(+h[(c[oa+8>>2]|0)+56>>3]>+h[ea>>3]){k=51}else{qa=$}}}while(0);if((k|0)==51){k=0;qa=(da(b[(c[(c[na>>2]|0)+8>>2]|0)+154>>1]|0,aa)|0)+$|0}pa=na+4|0;ra=c[pa>>2]|0;if((ra|0)==0){ma=qa;break}else{$=qa;na=pa;oa=ra}}}oa=ca+4|0;na=c[oa>>2]|0;if((na|0)==0){la=ma;break}else{N=ma;ca=oa;O=na}}}O=la+W|0;if((V|0)==0){sa=0}else{ca=0;N=R;U=V;while(1){ba=c[U+8>>2]|0;na=b[ba+154>>1]|0;oa=c[(c[(c[((c[U>>2]&3|0)==2?U:U-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if(S){ta=ca}else{$=ba+56|0;ba=ca;aa=P;ea=Q;while(1){ga=c[(c[(c[((c[ea>>2]&3|0)==2?ea:ea-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;do{if((ga-oa|0)>0){k=61}else{if((ga|0)!=(oa|0)){ua=ba;break}if(+h[(c[ea+8>>2]|0)+56>>3]>+h[$>>3]){k=61}else{ua=ba}}}while(0);if((k|0)==61){k=0;ua=(da(b[(c[(c[aa>>2]|0)+8>>2]|0)+154>>1]|0,na)|0)+ba|0}ga=aa+4|0;ra=c[ga>>2]|0;if((ra|0)==0){ta=ua;break}else{ba=ua;aa=ga;ea=ra}}}ea=N+4|0;aa=c[ea>>2]|0;if((aa|0)==0){sa=ta;break}else{ca=ta;N=ea;U=aa}}}va=O;wa=sa+X|0}else{va=W;wa=X}if((wa|0)<(va|0)){break}if(g&(va|0)>0&(wa|0)==(va|0)){break}}if((I|0)<(C|0)){F=I;G=J;A=B;H=M}else{xa=t;ya=w;break b}}F=c[A+232>>2]|0;c[K>>2]=M;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(F*44|0)+4>>2]|0)+(M<<2)>>2]=G;c[(c[L>>2]|0)+236>>2]=H;c[(c[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(F*44|0)+4>>2]|0)+(H<<2)>>2]=J;F=va-wa+t|0;a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(j*44|0)+33|0]=0;a[(c[(c[f>>2]|0)+184>>2]|0)+(j*44|0)+32|0]=1;C=c[f>>2]|0;if((b[C+224>>1]|0)<(j|0)){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(s*44|0)+33|0]=0;a[(c[(c[f>>2]|0)+184>>2]|0)+(s*44|0)+32|0]=1;za=c[f>>2]|0}else{za=C}if((b[za+226>>1]|0)>(j|0)){a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(r*44|0)+33|0]=0;a[(c[(c[f>>2]|0)+184>>2]|0)+(r*44|0)+32|0]=1;Aa=c[f>>2]|0}else{Aa=za}C=c[Aa+184>>2]|0;E=c[C+(j*44|0)>>2]|0;if((I|0)<(E-1|0)){t=F;u=I;v=C;w=Aa;x=E}else{xa=F;ya=Aa;break}}}else{xa=0;ya=l}}while(0);m=xa+i|0;n=ya}if((j|0)<(b[n+226>>1]|0)){j=j+1|0;i=m;d=n}else{break}}if((m|0)>0){e=n}else{k=76;break}}if((k|0)==12){cc(87312,117264,514,169864)}else if((k|0)==76){return}}function wp(b){b=b|0;var d=0,e=0,f=0,g=0;d=c[b>>2]&3;e=c[(c[((d|0)==2?b:b-32|0)+28>>2]|0)+8>>2]|0;if((a[e+156|0]|0)==1){f=2}else{f=(a[e+160|0]|0)<2|0}e=c[(c[((d|0)==3?b:b+32|0)+28>>2]|0)+8>>2]|0;if((a[e+156|0]|0)==1){g=2}else{g=(a[e+160|0]|0)<2|0}e=(c[b+8>>2]|0)+156|0;c[e>>2]=da(c[e>>2]|0,c[9576+(g*12|0)+(f<<2)>>2]|0)|0;return}function xp(b){b=b|0;var d=0,e=0,f=0,g=0,h=0,j=0,k=0,l=0;d=i;e=c[53718]|0;if(!((e|0)!=0|(c[53604]|0)!=0)){i=d;return}f=Hm(b|0,e,0)|0;if((f|0)!=0){e=a[f]|0;do{if((e<<24>>24|0)==105){if((Ya(f|0,168592)|0)!=0){break}g=ux(b)|0;if((g|0)==0){i=d;return}else{h=g}do{yp(b,h,0);h=vx(b,h)|0;}while((h|0)!=0);i=d;return}else if((e<<24>>24|0)==111){if((Ya(f|0,82584)|0)!=0){break}g=ux(b)|0;if((g|0)==0){i=d;return}else{j=g}do{yp(b,j,1);j=vx(b,j)|0;}while((j|0)!=0);i=d;return}else if((e<<24>>24|0)==0){i=d;return}}while(0);Fv(1,164440,(k=i,i=i+8|0,c[k>>2]=f,k)|0)|0;i=k;i=d;return}f=sy(b)|0;if((f|0)!=0){e=f;do{if(($p(e)|0)==0){xp(e)}e=ty(e)|0;}while((e|0)!=0)}if((c[53604]|0)==0){i=d;return}e=ux(b)|0;if((e|0)==0){i=d;return}else{l=e}do{e=l|0;f=Hm(e,c[53604]|0,0)|0;a:do{if((f|0)!=0){j=a[f]|0;do{if((j<<24>>24|0)==111){if((Ya(f|0,82584)|0)!=0){break}yp(b,l,1);break a}else if((j<<24>>24|0)==105){if((Ya(f|0,168592)|0)!=0){break}yp(b,l,0);break a}else if((j<<24>>24|0)==0){break a}}while(0);j=$w(e)|0;Fv(1,160448,(k=i,i=i+16|0,c[k>>2]=f,c[k+8>>2]=j,k)|0)|0;i=k}}while(0);l=vx(b,l)|0;}while((l|0)!=0);i=d;return}function yp(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0;f=c[53516]|0;g=d+8|0;d=c[g>>2]|0;if((c[d+212>>2]|0)!=0){return}h=(e|0)!=0;if(h){e=c[c[d+180>>2]>>2]|0;if((e|0)==0){return}else{i=0;j=0;k=e;l=d}while(1){e=c[(c[k+8>>2]|0)+116>>2]|0;if((e|0)==0){m=k}else{n=e;while(1){e=c[(c[n+8>>2]|0)+116>>2]|0;if((e|0)==0){break}else{n=e}}m=n}e=c[m>>2]&3;if((c[(c[(c[((e|0)==3?m:m+32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)==(c[(c[(c[((e|0)==2?m:m-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)){c[f+(i<<2)>>2]=k;o=i+1|0;p=c[g>>2]|0}else{o=i;p=l}e=j+1|0;q=c[(c[p+180>>2]|0)+(e<<2)>>2]|0;if((q|0)==0){r=o;break}else{i=o;j=e;k=q;l=p}}}else{p=c[c[d+172>>2]>>2]|0;if((p|0)==0){return}else{s=0;t=0;u=p;v=d}while(1){d=c[(c[u+8>>2]|0)+116>>2]|0;if((d|0)==0){w=u}else{p=d;while(1){d=c[(c[p+8>>2]|0)+116>>2]|0;if((d|0)==0){break}else{p=d}}w=p}n=c[w>>2]&3;if((c[(c[(c[((n|0)==3?w:w+32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)==(c[(c[(c[((n|0)==2?w:w-32|0)+28>>2]|0)+8>>2]|0)+212>>2]|0)){c[f+(s<<2)>>2]=u;x=s+1|0;y=c[g>>2]|0}else{x=s;y=v}n=t+1|0;d=c[(c[y+172>>2]|0)+(n<<2)>>2]|0;if((d|0)==0){r=x;break}else{s=x;t=n;u=d;v=y}}}if((r|0)<2){return}c[f+(r<<2)>>2]=0;Jb(f|0,r|0,4,124);r=c[f+4>>2]|0;if((r|0)==0){return}if(h){h=1;y=r;while(1){v=c[f+(h-1<<2)>>2]|0;u=c[((c[v>>2]&3|0)==2?v:v-32|0)+28>>2]|0;v=c[((c[y>>2]&3|0)==2?y:y-32|0)+28>>2]|0;if((To(u,v)|0)!=0){z=24;break}t=Yo(u,v,0)|0;a[(c[t+8>>2]|0)+112|0]=4;cp(b,t);t=h+1|0;v=c[f+(t<<2)>>2]|0;if((v|0)==0){z=24;break}else{h=t;y=v}}if((z|0)==24){return}}else{y=1;h=r;while(1){r=c[f+(y-1<<2)>>2]|0;v=c[((c[r>>2]&3|0)==3?r:r+32|0)+28>>2]|0;r=c[((c[h>>2]&3|0)==3?h:h+32|0)+28>>2]|0;if((To(v,r)|0)!=0){z=24;break}t=Yo(v,r,0)|0;a[(c[t+8>>2]|0)+112|0]=4;cp(b,t);t=y+1|0;r=c[f+(t<<2)>>2]|0;if((r|0)==0){z=24;break}else{y=t;h=r}}if((z|0)==24){return}}}function zp(a,b){a=a|0;b=b|0;return((c[c[a>>2]>>2]|0)>>>4)-((c[c[b>>2]>>2]|0)>>>4)|0}function Ap(a,d,e,f){a=a|0;d=d|0;e=e|0;f=f|0;var g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0;g=a+8|0;i=c[g>>2]|0;if((c[i+172>>2]|0)<1){j=f}else{k=f;f=1;l=i;while(1){i=Ap(c[(c[l+176>>2]|0)+(f<<2)>>2]|0,d,e,k)|0;m=c[g>>2]|0;if((f|0)<(c[m+172>>2]|0)){k=i;f=f+1|0;l=m}else{j=i;break}}}l=a|0;if((Ix(l)|0)==(a|0)){n=j;return n|0}vF(d|0,0,e<<2|0)|0;e=ux(a)|0;if((e|0)!=0){f=e;do{e=f+8|0;c[d+(c[(c[e>>2]|0)+232>>2]<<2)>>2]=1;k=mw(a,f)|0;if((k|0)!=0){i=k;do{k=c[(c[e>>2]|0)+232>>2]|0;m=i;o=i-32|0;if((k|0)<(c[(c[(c[((c[m>>2]&3|0)==2?i:o)+28>>2]|0)+8>>2]|0)+232>>2]|0)){p=k;do{p=p+1|0;c[d+(p<<2)>>2]=1;}while((p|0)<(c[(c[(c[((c[m>>2]&3|0)==2?i:o)+28>>2]|0)+8>>2]|0)+232>>2]|0))}i=ow(a,i)|0;}while((i|0)!=0)}f=vx(a,f)|0;}while((f|0)!=0)}f=c[g>>2]|0;i=b[f+224>>1]|0;if(i<<16>>16>(b[f+226>>1]|0)){n=j;return n|0}e=j;j=i<<16>>16;i=f;while(1){if((c[d+(j<<2)>>2]|0)==0){if((e|0)==0){q=ry(Ix(l)|0,156320,1)|0}else{q=e}f=Ax(q,0,1)|0;Wx(f|0,151840,304,1)|0;o=f+8|0;c[(c[o>>2]|0)+232>>2]=j;h[(c[o>>2]|0)+96>>3]=.5;h[(c[o>>2]|0)+88>>3]=.5;h[(c[o>>2]|0)+80>>3]=1.0;c[(c[o>>2]|0)+216>>2]=1;c[(c[o>>2]|0)+176>>2]=0;m=jk(20)|0;c[(c[o>>2]|0)+172>>2]=m;c[(c[o>>2]|0)+184>>2]=0;m=jk(20)|0;c[(c[o>>2]|0)+180>>2]=m;zx(a,f,1)|0;r=q;s=c[g>>2]|0}else{r=e;s=i}if((j|0)<(b[s+226>>1]|0)){e=r;j=j+1|0;i=s}else{n=r;break}}return n|0}function Bp(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;e=d+8|0;f=c[e>>2]|0;g=b[f+224>>1]|0;if(g<<16>>16>(b[f+226>>1]|0)){return}h=g<<16>>16;g=f;while(1){f=c[g+184>>2]|0;do{if((c[f+(h*44|0)>>2]|0)>0){i=0;j=0;k=f;while(1){l=(c[(c[k+(h*44|0)+4>>2]|0)+(i<<2)>>2]|0)+8|0;a[(c[l>>2]|0)+158|0]=0;a[(c[l>>2]|0)+157|0]=0;c[(c[l>>2]|0)+280>>2]=i;if((c[(c[l>>2]|0)+192>>2]|0)>0&(j|0)==0){l=c[(c[(c[e>>2]|0)+184>>2]|0)+(h*44|0)>>2]|0;m=jk(12)|0;c[m>>2]=l;c[m+4>>2]=l;c[m+8>>2]=jk(da(l,l)|0)|0;c[(c[(c[e>>2]|0)+184>>2]|0)+(h*44|0)+40>>2]=m;n=1}else{n=j}m=i+1|0;o=c[e>>2]|0;p=c[o+184>>2]|0;q=c[p+(h*44|0)>>2]|0;if((m|0)<(q|0)){i=m;j=n;k=p}else{break}}if((n|0)!=0&(q|0)>0){r=0;s=p;t=o}else{u=o;break}while(1){k=c[(c[s+(h*44|0)+4>>2]|0)+(r<<2)>>2]|0;if((a[(c[k+8>>2]|0)+157|0]|0)==0){Gp(d,k);v=c[e>>2]|0}else{v=t}k=r+1|0;j=c[v+184>>2]|0;if((k|0)<(c[j+(h*44|0)>>2]|0)){r=k;s=j;t=v}else{u=v;break}}}else{u=g}}while(0);if((h|0)<(b[u+226>>1]|0)){h=h+1|0;g=u}else{break}}return}function Cp(d){d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Qa=0,Ra=0,Sa=0;e=d+8|0;f=c[e>>2]|0;if((a[f+228|0]|0)==0){return}g=b[f+224>>1]|0;if(g<<16>>16>(b[f+226>>1]|0)){return}h=g<<16>>16;g=0;i=f;a:while(1){f=c[i+184>>2]|0;j=c[f+(h*44|0)>>2]|0;if((j|0)==0){k=g;l=i}else{m=c[(c[c[f+(h*44|0)+4>>2]>>2]|0)+8>>2]|0;f=c[m+236>>2]|0;if((j|0)>0){j=1;n=m;while(1){a[n+157|0]=0;m=c[(c[e>>2]|0)+184>>2]|0;if((j|0)>=(c[m+(h*44|0)>>2]|0)){break}o=c[(c[(c[m+(h*44|0)+4>>2]|0)+(j<<2)>>2]|0)+8>>2]|0;j=j+1|0;n=o}p=(j<<2)+4|0}else{p=4}if((g|0)==0){q=kk(p)|0}else{q=mk(g,p)|0}n=q;o=c[e>>2]|0;m=c[o+184>>2]|0;r=c[m+(h*44|0)>>2]|0;do{if((r|0)>0){s=0;t=0;u=o;v=m;w=r;while(1){if((c[u+116>>2]&1|0)==0){x=(c[v+(h*44|0)+4>>2]|0)+(w+~t<<2)|0}else{x=(c[v+(h*44|0)+4>>2]|0)+(t<<2)|0}y=c[x>>2]|0;z=y+8|0;A=c[z>>2]|0;B=A+196|0;if((c[B+4>>2]|0)>0){C=0;D=0;E=B;while(1){B=c[(c[E>>2]|0)+(D<<2)>>2]|0;do{if((c[(c[B+8>>2]|0)+156>>2]|0)==0){F=0}else{G=B;H=c[((c[G>>2]&3|0)==3?B:B+32|0)+28>>2]|0;I=H+8|0;J=c[I>>2]|0;K=a[J+156|0]|0;if(K<<24>>24==0){L=(Rx(d,H|0)|0)!=0|0;H=c[I>>2]|0;M=L;N=H;O=a[H+156|0]|0}else{M=0;N=J;O=K}do{if(O<<24>>24==1){if((c[N+176>>2]|0)!=1){P=27;break}K=N+180|0;if((c[K+4>>2]|0)!=1){P=27;break}J=c[c[K>>2]>>2]|0;K=c[J+8>>2]|0;if((a[K+112|0]|0)==0){Q=J}else{J=K;do{R=c[J+116>>2]|0;J=c[R+8>>2]|0;}while((a[J+112|0]|0)!=0);Q=R}if((Rx(d,Q|0)|0)==0){P=27}else{S=1}}else{P=27}}while(0);if((P|0)==27){P=0;S=0}if((S|M|0)==0){F=0;break}J=c[((c[G>>2]&3|0)==2?B:B-32|0)+28>>2]|0;K=J+8|0;H=c[K>>2]|0;L=a[H+156|0]|0;if(L<<24>>24==0){I=(Rx(d,J|0)|0)!=0|0;J=c[K>>2]|0;T=I;U=J;V=a[J+156|0]|0}else{T=0;U=H;V=L}do{if(V<<24>>24==1){if((c[U+176>>2]|0)!=1){P=38;break}L=U+180|0;if((c[L+4>>2]|0)!=1){P=38;break}H=c[c[L>>2]>>2]|0;L=c[H+8>>2]|0;if((a[L+112|0]|0)==0){W=H}else{H=L;do{X=c[H+116>>2]|0;H=c[X+8>>2]|0;}while((a[H+112|0]|0)!=0);W=X}if((Rx(d,W|0)|0)==0){P=38}else{Y=1}}else{P=38}}while(0);if((P|0)==38){P=0;Y=0}F=Y|T}}while(0);B=F+C|0;G=D+1|0;H=c[z>>2]|0;L=H+196|0;if((G|0)<(c[L+4>>2]|0)){C=B;D=G;E=L}else{Z=B;_=H;break}}}else{Z=0;_=A}E=_+188|0;if((c[E+4>>2]|0)>0){D=0;C=0;H=E;while(1){E=c[(c[H>>2]|0)+(C<<2)>>2]|0;do{if((c[(c[E+8>>2]|0)+156>>2]|0)==0){$=0}else{B=E;L=c[((c[B>>2]&3|0)==3?E:E+32|0)+28>>2]|0;G=L+8|0;J=c[G>>2]|0;I=a[J+156|0]|0;if(I<<24>>24==0){K=(Rx(d,L|0)|0)!=0|0;L=c[G>>2]|0;aa=K;ba=L;ca=a[L+156|0]|0}else{aa=0;ba=J;ca=I}do{if(ca<<24>>24==1){if((c[ba+176>>2]|0)!=1){P=52;break}I=ba+180|0;if((c[I+4>>2]|0)!=1){P=52;break}J=c[c[I>>2]>>2]|0;I=c[J+8>>2]|0;if((a[I+112|0]|0)==0){da=J}else{J=I;do{ea=c[J+116>>2]|0;J=c[ea+8>>2]|0;}while((a[J+112|0]|0)!=0);da=ea}if((Rx(d,da|0)|0)==0){P=52}else{fa=1}}else{P=52}}while(0);if((P|0)==52){P=0;fa=0}if((fa|aa|0)==0){$=0;break}J=c[((c[B>>2]&3|0)==2?E:E-32|0)+28>>2]|0;I=J+8|0;L=c[I>>2]|0;K=a[L+156|0]|0;if(K<<24>>24==0){G=(Rx(d,J|0)|0)!=0|0;J=c[I>>2]|0;ga=G;ha=J;ia=a[J+156|0]|0}else{ga=0;ha=L;ia=K}do{if(ia<<24>>24==1){if((c[ha+176>>2]|0)!=1){P=63;break}K=ha+180|0;if((c[K+4>>2]|0)!=1){P=63;break}L=c[c[K>>2]>>2]|0;K=c[L+8>>2]|0;if((a[K+112|0]|0)==0){ja=L}else{L=K;do{ka=c[L+116>>2]|0;L=c[ka+8>>2]|0;}while((a[L+112|0]|0)!=0);ja=ka}if((Rx(d,ja|0)|0)==0){P=63}else{la=1}}else{P=63}}while(0);if((P|0)==63){P=0;la=0}$=la|ga}}while(0);E=$+D|0;B=C+1|0;L=c[z>>2]|0;K=L+188|0;if((B|0)<(c[K+4>>2]|0)){D=E;C=B;H=K}else{ma=E;na=L;break}}}else{ma=0;na=_}do{if((ma|Z|0)==0){c[n+(s<<2)>>2]=y;oa=s+1|0}else{if((a[na+157|0]|0)!=0|(Z|0)!=0){oa=s;break}oa=(Fp(d,y,n+(s<<2)|0,h)|0)+s|0}}while(0);y=t+1|0;pa=c[e>>2]|0;H=c[pa+184>>2]|0;C=c[H+(h*44|0)>>2]|0;if((y|0)<(C|0)){s=oa;t=y;u=pa;v=H;w=C}else{break}}if((oa|0)==0){break}do{if((c[pa+116>>2]&1|0)==0){w=n+(oa-1<<2)|0;if(n>>>0<w>>>0){qa=n;ra=w}else{sa=pa;break}do{w=c[qa>>2]|0;c[qa>>2]=c[ra>>2];c[ra>>2]=w;qa=qa+4|0;ra=ra-4|0;}while(qa>>>0<ra>>>0);sa=c[e>>2]|0}else{sa=pa}}while(0);w=c[sa+184>>2]|0;if((c[w+(h*44|0)>>2]|0)>0){ta=0;ua=w}else{break}do{w=c[n+(ta<<2)>>2]|0;c[(c[ua+(h*44|0)+4>>2]|0)+(ta<<2)>>2]=w;c[(c[w+8>>2]|0)+236>>2]=ta+f;ta=ta+1|0;va=c[e>>2]|0;ua=c[va+184>>2]|0;wa=c[ua+(h*44|0)>>2]|0;}while((ta|0)<(wa|0));if((wa|0)>0){xa=0;ya=ua;za=va}else{break}while(1){w=(c[(c[ya+(h*44|0)+4>>2]|0)+(xa<<2)>>2]|0)+8|0;v=c[w>>2]|0;u=c[v+188>>2]|0;do{if((u|0)==0){Aa=za}else{t=c[u>>2]|0;if((t|0)==0){Aa=za;break}else{Ba=0;Ca=t;Da=v;Ea=za}while(1){t=c[Ca>>2]|0;s=t&3;C=c[(c[(c[((s|0)==2?Ca:Ca-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;H=c[(c[(c[((s|0)==3?Ca:Ca+32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0;if((c[Ea+116>>2]&1|0)==0){if((C|0)<(H|0)){P=84}else{Fa=Ba;Ga=Da}}else{if((C|0)>(H|0)){P=84}else{Fa=Ba;Ga=Da}}if((P|0)==84){P=0;do{if((c[(c[Ca+8>>2]|0)+156>>2]|0)!=0){H=Ca;C=c[((t&3|0)==3?Ca:Ca+32|0)+28>>2]|0;s=C+8|0;y=c[s>>2]|0;D=a[y+156|0]|0;if(D<<24>>24==0){z=(Rx(d,C|0)|0)!=0|0;C=c[s>>2]|0;Ha=z;Ia=C;Ja=a[C+156|0]|0}else{Ha=0;Ia=y;Ja=D}do{if(Ja<<24>>24==1){if((c[Ia+176>>2]|0)!=1){P=94;break}D=Ia+180|0;if((c[D+4>>2]|0)!=1){P=94;break}y=c[c[D>>2]>>2]|0;D=c[y+8>>2]|0;if((a[D+112|0]|0)==0){Ka=y}else{y=D;do{La=c[y+116>>2]|0;y=c[La+8>>2]|0;}while((a[y+112|0]|0)!=0);Ka=La}if((Rx(d,Ka|0)|0)==0){P=94}else{Ma=1}}else{P=94}}while(0);if((P|0)==94){P=0;Ma=0}if((Ma|Ha|0)==0){break}y=c[((c[H>>2]&3|0)==2?Ca:Ca-32|0)+28>>2]|0;D=y+8|0;C=c[D>>2]|0;z=a[C+156|0]|0;if(z<<24>>24==0){s=(Rx(d,y|0)|0)!=0|0;y=c[D>>2]|0;Na=s;Oa=y;Pa=a[y+156|0]|0}else{Na=0;Oa=C;Pa=z}do{if(Pa<<24>>24==1){if((c[Oa+176>>2]|0)!=1){P=105;break}z=Oa+180|0;if((c[z+4>>2]|0)!=1){P=105;break}C=c[c[z>>2]>>2]|0;z=c[C+8>>2]|0;if((a[z+112|0]|0)==0){Qa=C}else{C=z;do{Ra=c[C+116>>2]|0;C=c[Ra+8>>2]|0;}while((a[C+112|0]|0)!=0);Qa=Ra}if((Rx(d,Qa|0)|0)==0){P=105}else{Sa=1}}else{P=105}}while(0);if((P|0)==105){P=0;Sa=0}if((Sa|Na|0)!=0){P=107;break a}}}while(0);dp(Ca);pp(d,Ca);Fa=Ba-1|0;Ga=c[w>>2]|0}t=Fa+1|0;H=c[(c[Ga+188>>2]|0)+(t<<2)>>2]|0;C=c[e>>2]|0;if((H|0)==0){Aa=C;break}else{Ba=t;Ca=H;Da=Ga;Ea=C}}}}while(0);w=xa+1|0;v=c[Aa+184>>2]|0;if((w|0)<(c[v+(h*44|0)>>2]|0)){xa=w;ya=v;za=Aa}else{break}}}}while(0);a[(c[(c[(c[53542]|0)+8>>2]|0)+184>>2]|0)+(h*44|0)+33|0]=0;k=n;l=c[e>>2]|0}if((h|0)<(b[l+226>>1]|0)){h=h+1|0;g=k;i=l}else{break}}if((P|0)==107){cc(132240,117264,1292,170600)}if((k|0)==0){return}eF(k);return}function Dp(a,b){a=a|0;b=b|0;return(c[a>>2]|0)-(c[b>>2]|0)|0}function Ep(a,b){a=a|0;b=b|0;return(c[(c[(c[a>>2]|0)+8>>2]|0)+236>>2]|0)-(c[(c[(c[b>>2]|0)+8>>2]|0)+236>>2]|0)|0}function Fp(b,d,e,f){b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0;g=d+8|0;a[(c[g>>2]|0)+157|0]=1;h=c[g>>2]|0;i=h+188|0;do{if((c[i+4>>2]|0)>0){j=c[c[i>>2]>>2]|0;if((j|0)==0){k=0;l=h;break}else{m=0;n=0;o=j}while(1){do{if((c[(c[o+8>>2]|0)+156>>2]|0)==0){p=n}else{j=o;q=c[((c[j>>2]&3|0)==3?o:o+32|0)+28>>2]|0;r=q+8|0;s=c[r>>2]|0;t=a[s+156|0]|0;if(t<<24>>24==0){u=(Rx(b,q|0)|0)!=0|0;q=c[r>>2]|0;v=u;w=q;x=a[q+156|0]|0}else{v=0;w=s;x=t}do{if(x<<24>>24==1){if((c[w+176>>2]|0)!=1){y=13;break}t=w+180|0;if((c[t+4>>2]|0)!=1){y=13;break}s=c[c[t>>2]>>2]|0;t=c[s+8>>2]|0;if((a[t+112|0]|0)==0){z=s}else{s=t;do{A=c[s+116>>2]|0;s=c[A+8>>2]|0;}while((a[s+112|0]|0)!=0);z=A}if((Rx(b,z|0)|0)==0){y=13}else{B=1}}else{y=13}}while(0);if((y|0)==13){y=0;B=0}if((B|v|0)==0){p=n;break}s=o-32|0;t=c[((c[j>>2]&3|0)==2?o:s)+28>>2]|0;q=t+8|0;u=c[q>>2]|0;r=a[u+156|0]|0;if(r<<24>>24==0){C=(Rx(b,t|0)|0)!=0|0;t=c[q>>2]|0;D=C;E=t;F=a[t+156|0]|0}else{D=0;E=u;F=r}do{if(F<<24>>24==1){if((c[E+176>>2]|0)!=1){y=24;break}r=E+180|0;if((c[r+4>>2]|0)!=1){y=24;break}u=c[c[r>>2]>>2]|0;r=c[u+8>>2]|0;if((a[r+112|0]|0)==0){G=u}else{u=r;do{H=c[u+116>>2]|0;u=c[H+8>>2]|0;}while((a[u+112|0]|0)!=0);G=H}if((Rx(b,G|0)|0)==0){y=24}else{I=1}}else{y=24}}while(0);if((y|0)==24){y=0;I=0}if((I|D|0)==0){p=n;break}u=c[((c[j>>2]&3|0)==2?o:s)+28>>2]|0;if((a[(c[u+8>>2]|0)+157|0]|0)!=0){p=n;break}p=(Fp(b,u,e+(n<<2)|0,f)|0)+n|0}}while(0);u=m+1|0;r=c[g>>2]|0;t=c[(c[r+188>>2]|0)+(u<<2)>>2]|0;if((t|0)==0){k=p;l=r;break}else{m=u;n=p;o=t}}}else{k=0;l=h}}while(0);if((c[l+232>>2]|0)==(f|0)){c[e+(k<<2)>>2]=d;return k+1|0}else{cc(129928,117264,1221,170048);return 0}return 0}function Gp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;e=d+8|0;d=c[e>>2]|0;f=c[(c[(c[b+8>>2]|0)+184>>2]|0)+((c[d+232>>2]|0)*44|0)+40>>2]|0;a[d+157|0]=1;a[(c[e>>2]|0)+158|0]=1;d=(c[(c[(Ix(b|0)|0)+8>>2]|0)+172>>2]|0)>0;g=c[e>>2]|0;h=c[g+188>>2]|0;if((h|0)==0){i=g;j=i;k=j+158|0;a[k]=0;return}l=c[h>>2]|0;if((l|0)==0){i=g;j=i;k=j+158|0;a[k]=0;return}g=f|0;h=f+4|0;m=f+8|0;f=0;n=l;a:while(1){do{if(d){l=n;if((Rx(b,c[((c[l>>2]&3|0)==3?n:n+32|0)+28>>2]|0)|0)==0){o=f;break}if((Rx(b,c[((c[l>>2]&3|0)==2?n:n-32|0)+28>>2]|0)|0)==0){o=f}else{p=7}}else{p=7}}while(0);do{if((p|0)==7){p=0;l=n+8|0;if((c[(c[l>>2]|0)+156>>2]|0)==0){o=f;break}q=n;r=c[q>>2]&3;s=n-32|0;t=c[(c[((r|0)==2?n:s)+28>>2]|0)+8>>2]|0;u=c[t+280>>2]|0;v=(u|0)<(c[g>>2]|0);if((a[t+158|0]|0)==1){if(!v){p=10;break a}t=c[(c[(c[((r|0)==3?n:n+32|0)+28>>2]|0)+8>>2]|0)+280>>2]|0;w=c[h>>2]|0;if((t|0)>=(w|0)){p=12;break a}x=(da(w,u)|0)+t|0;a[(c[m>>2]|0)+x|0]=1;dp(n);x=f-1|0;if((a[(c[l>>2]|0)+112|0]|0)==4){o=x;break}pp(b,n);o=x;break}else{if(!v){p=16;break a}v=c[(c[(c[((r|0)==3?n:n+32|0)+28>>2]|0)+8>>2]|0)+280>>2]|0;r=c[h>>2]|0;if((v|0)>=(r|0)){p=18;break a}x=(da(r,v)|0)+u|0;a[(c[m>>2]|0)+x|0]=1;x=c[((c[q>>2]&3|0)==2?n:s)+28>>2]|0;if((a[(c[x+8>>2]|0)+157|0]|0)!=0){o=f;break}Gp(b,x);o=f;break}}}while(0);x=o+1|0;s=c[e>>2]|0;q=c[(c[s+188>>2]|0)+(x<<2)>>2]|0;if((q|0)==0){i=s;p=22;break}else{f=x;n=q}}if((p|0)==10){cc(126736,117264,982,170584)}else if((p|0)==12){cc(124192,117264,983,170584)}else if((p|0)==16){cc(126736,117264,991,170584)}else if((p|0)==18){cc(124192,117264,992,170584)}else if((p|0)==22){j=i;k=j+158|0;a[k]=0;return}}function Hp(d,f){d=d|0;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,S=0,T=0,U=0.0,V=0.0,W=0.0,X=0.0,Y=0.0,Z=0.0,_=0.0,$=0.0,aa=0,ba=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0.0,xa=0.0,ya=0,za=0.0,Aa=0.0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0,Ha=0,Ia=0;g=i;i=i+8|0;j=g|0;k=d+8|0;if((c[(c[k>>2]|0)+180>>2]|0)==0){i=g;return}go(d);Ip(d);if((a[215376]|0)!=0){no(d)}l=c[k>>2]|0;m=b[l+224>>1]|0;if(m<<16>>16>(b[l+226>>1]|0)){n=l}else{p=m<<16>>16;m=l;q=l;while(1){l=c[m+184>>2]|0;r=c[l+(p*44|0)>>2]|0;if((r|0)>0){s=0;t=0;u=l;while(1){v=(c[(c[u+(p*44|0)+4>>2]|0)+(s<<2)>>2]|0)+8|0;c[(c[v>>2]|0)+236>>2]=t;w=c[v>>2]|0;if((a[w+159|0]|0)==6){x=c[w+216>>2]|0}else{x=1}w=x+t|0;v=s+1|0;y=c[k>>2]|0;z=c[y+184>>2]|0;A=c[z+(p*44|0)>>2]|0;if((v|0)<(A|0)){s=v;t=w;u=z}else{B=w;C=z;D=A;E=y;F=y;break}}}else{B=0;C=l;D=r;E=m;F=q}if((B|0)>(D|0)){u=c[C+(p*44|0)+4>>2]|0;if((u|0)==0){G=kk((B<<2)+4|0)|0}else{G=mk(u,(B<<2)+4|0)|0}c[(c[(c[k>>2]|0)+184>>2]|0)+(p*44|0)+4>>2]=G;u=c[(c[k>>2]|0)+184>>2]|0;t=c[u+(p*44|0)>>2]|0;if((t|0)>0){s=t;t=u;while(1){y=s-1|0;A=c[t+(p*44|0)+4>>2]|0;z=c[A+(y<<2)>>2]|0;c[A+(c[(c[z+8>>2]|0)+236>>2]<<2)>>2]=z;z=c[(c[k>>2]|0)+184>>2]|0;if((y|0)>0){s=y;t=z}else{H=z;break}}}else{H=u}c[H+(p*44|0)>>2]=B;c[(c[(c[(c[k>>2]|0)+184>>2]|0)+(p*44|0)+4>>2]|0)+(B<<2)>>2]=0;t=c[k>>2]|0;I=t;J=t}else{I=E;J=F}if((p|0)<(b[I+226>>1]|0)){p=p+1|0;m=I;q=J}else{n=J;break}}}J=c[n+180>>2]|0;if((J|0)!=0){n=J;do{J=n+8|0;q=c[J>>2]|0;I=c[q+224>>2]|0;if((I|0)==0){K=q}else{Lp(d,I);K=c[J>>2]|0}I=c[K+228>>2]|0;if((I|0)==0){L=K}else{Lp(d,I);L=c[J>>2]|0}J=c[L+204>>2]|0;if((J|0)!=0){I=J;J=0;while(1){if((c[I+(J<<2)>>2]|0)==0){break}else{J=J+1|0}}}n=c[L+164>>2]|0;}while((n|0)!=0)}if((gp(d)|0)!=0){Ip(d)}n=c[k>>2]|0;L=c[n+180>>2]|0;if((L|0)==0){M=n}else{n=L;do{L=n+8|0;K=c[L>>2]|0;J=K+172|0;I=K+244|0;K=c[J+4>>2]|0;c[I>>2]=c[J>>2];c[I+4>>2]=K;K=c[L>>2]|0;I=K+180|0;J=K+252|0;K=c[I+4>>2]|0;c[J>>2]=c[I>>2];c[J+4>>2]=K;K=c[L>>2]|0;J=c[K+180>>2]|0;I=0;while(1){if((c[J+(I<<2)>>2]|0)==0){break}else{I=I+1|0}}J=K+172|0;u=c[J>>2]|0;q=0;while(1){if((c[u+(q<<2)>>2]|0)==0){break}else{q=q+1|0}}c[J+4>>2]=0;u=jk((q+I<<2)+16|0)|0;c[(c[L>>2]|0)+172>>2]=u;c[(c[L>>2]|0)+184>>2]=0;u=jk(16)|0;c[(c[L>>2]|0)+180>>2]=u;n=c[(c[L>>2]|0)+164>>2]|0;}while((n|0)!=0);M=c[k>>2]|0}n=M;u=c[M+184>>2]|0;K=(a[n+113|0]&1)==0;m=c[M+236>>2]|0;c[j>>2]=m;c[j+4>>2]=K?m:5;m=b[M+224>>1]|0;if(m<<16>>16>(b[n+226>>1]|0)){N=M}else{M=m<<16>>16;while(1){m=u+(M*44|0)+4|0;c[(c[(c[c[m>>2]>>2]|0)+8>>2]|0)+232>>2]=0;n=u+(M*44|0)|0;if((c[n>>2]|0)>0){O=+(c[j+((M&1)<<2)>>2]|0);K=0;P=0.0;while(1){p=c[(c[m>>2]|0)+(K<<2)>>2]|0;F=p+8|0;E=c[F>>2]|0;c[E+240>>2]=~~+h[E+96>>3];E=c[F>>2]|0;B=E+204|0;if((c[B+4>>2]|0)>0){H=c[c[B>>2]>>2]|0;if((H|0)==0){Q=0;R=E}else{B=0;G=0;C=H;H=E;while(1){E=c[C>>2]&3;if((c[((E|0)==3?C:C+32|0)+28>>2]|0)==(c[((E|0)==2?C:C-32|0)+28>>2]|0)){E=(hm(C)|0)+B|0;S=E;T=c[F>>2]|0}else{S=B;T=H}E=G+1|0;D=c[(c[T+204>>2]|0)+(E<<2)>>2]|0;if((D|0)==0){Q=S;R=T;break}else{B=S;G=E;C=D;H=T}}}H=R+96|0;h[H>>3]=+(Q|0)+ +h[H>>3]}H=K+1|0;C=c[(c[m>>2]|0)+(H<<2)>>2]|0;if((C|0)==0){U=P}else{G=C+8|0;V=O+(+h[(c[F>>2]|0)+96>>3]+ +h[(c[G>>2]|0)+88>>3]);Jp(p,C,V,0)|0;C=~~(P+V);c[(c[G>>2]|0)+232>>2]=C;U=+(C|0)}C=c[F>>2]|0;G=c[C+112>>2]|0;do{if((G|0)!=0){B=c[C+252>>2]|0;D=c[B>>2]|0;E=c[B+4>>2]|0;B=E;x=(c[(c[(c[((c[D>>2]&3|0)==2?D:D-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0)>(c[(c[(c[((c[E>>2]&3|0)==2?B:E-32|0)+28>>2]|0)+8>>2]|0)+236>>2]|0);E=x?B:D;t=x?D:B;B=G+8|0;D=c[B>>2]|0;V=+((da(c[(c[k>>2]|0)+236>>2]|0,e[D+170>>1]|0)|0)/2|0|0);x=c[E>>2]&3;s=c[((x|0)==2?E:E-32|0)+28>>2]|0;r=c[((x|0)==3?E:E+32|0)+28>>2]|0;if((Wp(r,s)|0)==0){Jp(s,r,+(~~(+h[(c[r+8>>2]|0)+88>>3]+(V+ +h[(c[s+8>>2]|0)+96>>3]))|0),c[D+156>>2]|0)|0}D=c[t>>2]&3;s=c[((D|0)==3?t:t+32|0)+28>>2]|0;r=c[((D|0)==2?t:t-32|0)+28>>2]|0;if((Wp(r,s)|0)!=0){break}Jp(s,r,+(~~(+h[(c[r+8>>2]|0)+88>>3]+(V+ +h[(c[s+8>>2]|0)+96>>3]))|0),c[(c[B>>2]|0)+156>>2]|0)|0}}while(0);G=(c[F>>2]|0)+188|0;if((c[G+4>>2]|0)>0){C=0;p=G;do{G=c[(c[p>>2]|0)+(C<<2)>>2]|0;B=c[G>>2]&3;s=c[((B|0)==3?G:G+32|0)+28>>2]|0;r=c[((B|0)==2?G:G-32|0)+28>>2]|0;B=(c[(c[s+8>>2]|0)+236>>2]|0)<(c[(c[r+8>>2]|0)+236>>2]|0);t=B?s:r;D=B?r:s;V=+h[(c[t+8>>2]|0)+96>>3]+ +h[(c[D+8>>2]|0)+88>>3];s=G+8|0;G=~~(V+ +(da(c[(c[k>>2]|0)+236>>2]|0,e[(c[s>>2]|0)+170>>1]|0)|0));r=So(t,D)|0;do{if((r|0)==0){B=c[s>>2]|0;if((c[B+96>>2]|0)!=0){break}Jp(t,D,+(G|0),c[B+156>>2]|0)|0}else{W=+(G|0);X=V+ +(c[(c[k>>2]|0)+236>>2]|0);Y=+h[(c[s>>2]|0)+136>>3];B=Y<0.0;if(B){Z=Y+-.5}else{Z=Y+.5}if(W>X+ +(~~Z|0)){_=W}else{if(B){$=Y+-.5}else{$=Y+.5}_=X+ +(~~$|0)}B=~~_;if((B|0)>65535){Fv(1,92328,(aa=i,i=i+16|0,h[aa>>3]=+(B|0),c[aa+8>>2]=65535,aa)|0)|0;i=aa;ba=65535}else{ba=B}B=(c[r+8>>2]|0)+170|0;E=b[B>>1]|0;b[B>>1]=(E&65535|0)>(ba|0)?E:ba&65535}}while(0);C=C+1|0;p=(c[F>>2]|0)+188|0;}while((C|0)<(c[p+4>>2]|0))}if((H|0)<(c[n>>2]|0)){K=H;P=U}else{break}}}K=c[k>>2]|0;if((M|0)<(b[K+226>>1]|0)){M=M+1|0}else{N=K;break}}}M=c[N+180>>2]|0;if((M|0)==0){ea=N}else{N=M;do{M=N+8|0;ba=c[M>>2]|0;Q=c[ba+252>>2]|0;do{if((Q|0)==0){fa=ba}else{R=c[Q>>2]|0;if((R|0)==0){fa=ba;break}else{ga=0;ha=R}while(1){R=bp(d)|0;T=R+8|0;a[(c[T>>2]|0)+156|0]=2;S=ha+8|0;j=c[S>>2]|0;u=~~(+h[j+56>>3]- +h[j+16>>3]);K=(u|0)>0;n=K?0:-u|0;m=K?u:0;u=ha;K=ha+32|0;Jp(R,c[((c[u>>2]&3|0)==3?ha:K)+28>>2]|0,+(m+1|0),c[j+156>>2]|0)|0;j=ha-32|0;Jp(R,c[((c[u>>2]&3|0)==2?ha:j)+28>>2]|0,+(n+1|0),c[(c[S>>2]|0)+156>>2]|0)|0;S=c[u>>2]&3;u=(c[(c[(c[((S|0)==3?ha:K)+28>>2]|0)+8>>2]|0)+232>>2]|0)-m|0;m=(c[(c[(c[((S|0)==2?ha:j)+28>>2]|0)+8>>2]|0)+232>>2]|0)-n|0;c[(c[T>>2]|0)+232>>2]=((u|0)<(m|0)?u:m)-1;m=ga+1|0;u=c[M>>2]|0;T=c[(c[u+252>>2]|0)+(m<<2)>>2]|0;if((T|0)==0){fa=u;break}else{ga=m;ha=T}}}}while(0);N=c[fa+164>>2]|0;}while((N|0)!=0);ea=c[k>>2]|0}if((c[ea+172>>2]|0)>0){Sp(d);Tp(d);Up(d);Vp(d);ia=c[k>>2]|0}else{ia=ea}ea=c[ia+8>>2]|0;do{if((c[ea+84>>2]|0)==3){U=+h[ea+64>>3];_=+h[ea+72>>3];if(U*_<=1.0){break}Qp(d);ia=c[k>>2]|0;$=(c[ia+116>>2]&1|0)==0?U:_;Jp(c[ia+244>>2]|0,c[ia+248>>2]|0,$<65535.0?$:65535.0,1e3)|0}}while(0);ea=d|0;ia=ew(ea,87072)|0;if((ia|0)==0){ja=2147483647}else{$=+rF(ia);ja=~~($*+(Lw(d)|0))}do{if((ok(d,2,ja)|0)!=0){ia=c[k>>2]|0;N=b[ia+224>>1]|0;fa=b[ia+226>>1]|0;a:do{if(N<<16>>16<=fa<<16>>16){ha=N<<16>>16;ga=ia;M=fa;b:while(1){ba=c[ga+184>>2]|0;Q=c[ba+(ha*44|0)>>2]|0;c:do{if((Q|0)>0){H=c[ba+(ha*44|0)+4>>2]|0;T=0;do{ka=c[H+(T<<2)>>2]|0;m=c[ka+8>>2]|0;u=c[m+252>>2]|0;do{if((u|0)!=0){n=u;j=c[n>>2]|0;if((j|0)==0){break}else{la=0;ma=j}do{j=c[ma>>2]&3;if((c[(c[(c[((j|0)==2?ma:ma-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}la=la+1|0;if((c[(c[(c[((j|0)==3?ma:ma+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}ma=c[n+(la<<2)>>2]|0;}while((ma|0)!=0)}}while(0);u=c[m+244>>2]|0;do{if((u|0)!=0){n=u;j=c[n>>2]|0;if((j|0)==0){break}else{pa=0;qa=j}do{j=c[qa>>2]&3;if((c[(c[(c[((j|0)==3?qa:qa+32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}pa=pa+1|0;if((c[(c[(c[((j|0)==2?qa:qa-32|0)+28>>2]|0)+8>>2]|0)+232>>2]|0)>(ha|0)){na=ga;oa=M;break c}qa=c[n+(pa<<2)>>2]|0;}while((qa|0)!=0)}}while(0);T=T+1|0;}while((T|0)<(Q|0));if((ka|0)==0){na=ga;oa=M;break}T=c[H>>2]|0;u=c[c[ba+((((ha|0)<(M<<16>>16|0)?1:-1)+ha|0)*44|0)+4>>2]>>2]|0;if((u|0)==0){break b}m=bp(d)|0;n=m+8|0;a[(c[n>>2]|0)+156|0]=2;Jp(m,T,0.0,0)|0;Jp(m,u,0.0,0)|0;m=c[(c[T+8>>2]|0)+232>>2]|0;T=c[(c[u+8>>2]|0)+232>>2]|0;c[(c[n>>2]|0)+232>>2]=(m|0)<(T|0)?m:T;T=c[k>>2]|0;na=T;oa=b[T+226>>1]|0}else{na=ga;oa=M}}while(0);if((ha|0)<(oa<<16>>16|0)){ha=ha+1|0;ga=na;M=oa}else{break a}}cc(82320,162848,111,170952)}}while(0);fa=ew(ea,87072)|0;if((fa|0)==0){ra=2147483647}else{$=+rF(fa);ra=~~($*+(Lw(d)|0))}if((ok(d,2,ra)|0)==0){break}cc(152680,162848,134,170744)}}while(0);ra=c[k>>2]|0;ea=c[ra+184>>2]|0;oa=b[ra+224>>1]|0;if(oa<<16>>16<=(b[ra+226>>1]|0)){na=oa<<16>>16;oa=ra;while(1){ra=ea+(na*44|0)|0;if((c[ra>>2]|0)>0){ka=ea+(na*44|0)+4|0;qa=na;pa=0;do{ma=(c[(c[ka>>2]|0)+(pa<<2)>>2]|0)+8|0;la=c[ma>>2]|0;h[la+16>>3]=+(c[la+232>>2]|0);c[(c[ma>>2]|0)+232>>2]=qa;pa=pa+1|0;}while((pa|0)<(c[ra>>2]|0));sa=c[k>>2]|0}else{sa=oa}if((na|0)<(b[sa+226>>1]|0)){na=na+1|0;oa=sa}else{break}}}Mp(d,d);sa=c[k>>2]|0;d:do{if((b[sa+226>>1]|0)>0){oa=c[sa+8>>2]|0;na=c[oa+84>>2]|0;if((na|0)==0){break}$=+h[sa+32>>3];ea=~~($- +h[sa+16>>3]);_=+h[sa+40>>3];ra=~~(_- +h[sa+24>>3]);pa=(c[sa+116>>2]&1|0)==0;qa=pa?ra:ea;ka=pa?ea:ra;do{if((na|0)==4){U=+h[oa+48>>3];Z=+h[oa+56>>3];if(U<.001|Z<.001){break d}P=+h[oa+32>>3];O=+h[oa+40>>3];V=U-P-P;P=Z-O-O;O=V/$;Z=P/_;if(!(O<1.0|Z<1.0)){break d}U=O<Z?O:Z;Z=U>.5?U:.5;U=P*+ca(_*Z/P)/_;h[oa+64>>3]=$*(V*+ca($*Z/V)/$);h[(c[(c[k>>2]|0)+8>>2]|0)+72>>3]=_*U;ra=c[k>>2]|0;ta=c[ra+8>>2]|0;ua=ra;va=122}else if((na|0)==2){ta=oa;ua=sa;va=122}else if((na|0)==5){U=+h[oa+64>>3];if(U<=0.0){break d}V=U/$;U=+h[oa+72>>3]/_;if(!(V>1.0&U>1.0)){break d}Z=V<U?V:U;wa=Z;xa=Z;ya=sa}else if((na|0)==1){Z=+h[oa+16>>3];U=+(qa|0)/+(ka|0);if(U<Z){wa=1.0;xa=Z/U;ya=sa;break}else{wa=U/Z;xa=1.0;ya=sa;break}}else{break d}}while(0);do{if((va|0)==122){_=+h[ta+64>>3];if(_<=0.0){break d}$=_/+(ka|0);_=+h[ta+72>>3]/+(qa|0);if(!($<1.0|_<1.0)){wa=$;xa=_;ya=ua;break}if($<_){wa=1.0;xa=_/$;ya=ua;break}else{wa=$/_;xa=1.0;ya=ua;break}}}while(0);qa=(c[ya+116>>2]&1|0)==0;_=qa?xa:wa;$=qa?wa:xa;qa=c[ya+180>>2]|0;if((qa|0)!=0){ka=qa;do{qa=ka+8|0;oa=(c[qa>>2]|0)+16|0;Z=$*+h[oa>>3];if(Z<0.0){za=Z+-.5}else{za=Z+.5}h[oa>>3]=+(~~za|0);oa=(c[qa>>2]|0)+24|0;Z=_*+h[oa>>3];if(Z<0.0){Aa=Z+-.5}else{Aa=Z+.5}h[oa>>3]=+(~~Aa|0);ka=c[(c[qa>>2]|0)+164>>2]|0;}while((ka|0)!=0)}Np(d,$,_)}}while(0);e:do{if((f|0)!=0){ya=c[k>>2]|0;Aa=+h[ya+32>>3]- +h[ya+16>>3];za=+h[ya+40>>3]- +h[ya+24>>3];xa=Aa/za;if((a[213992]|0)!=0){ya=c[o>>2]|0;gc(ya|0,131256,(aa=i,i=i+16|0,h[aa>>3]=xa,h[aa+8>>3]=Aa*za/1.0e4,aa)|0)|0;i=aa;ua=Nn(d)|0;gc(ya|0,116648,(aa=i,i=i+8|0,c[aa>>2]=ua,aa)|0)|0;i=aa}za=+h[f>>3];do{if(xa>za*1.1){c[f+24>>2]=~~(za*+((c[f+20>>2]|0)-(c[f+16>>2]|0)|0)/xa)}else{ua=f+24|0;if(xa>za*.8){c[ua>>2]=0;break}c[ua>>2]=-1;if((a[213992]|0)==0){break e}Ma(109280,34,1,c[o>>2]|0)|0}}while(0);if((a[213992]|0)==0){break}gc(c[o>>2]|0,103400,(aa=i,i=i+8|0,c[aa>>2]=c[f+24>>2],aa)|0)|0;i=aa}}while(0);aa=c[(c[k>>2]|0)+180>>2]|0;f:do{if((aa|0)!=0){f=aa;do{d=f+8|0;ua=c[d>>2]|0;ya=c[ua+180>>2]|0;ta=c[ya>>2]|0;if((ta|0)==0){Ba=ya;Ca=ua}else{ua=0;ya=ta;while(1){eF(c[ya+8>>2]|0);eF(ya|0);ta=ua+1|0;va=c[d>>2]|0;sa=c[va+180>>2]|0;ka=c[sa+(ta<<2)>>2]|0;if((ka|0)==0){Ba=sa;Ca=va;break}else{ua=ta;ya=ka}}}if((Ba|0)==0){Da=Ca}else{eF(Ba);Da=c[d>>2]|0}ya=c[Da+172>>2]|0;if((ya|0)==0){Ea=Da}else{eF(ya);Ea=c[d>>2]|0}ya=Ea+252|0;ua=Ea+180|0;ka=c[ya+4>>2]|0;c[ua>>2]=c[ya>>2];c[ua+4>>2]=ka;ka=c[d>>2]|0;ua=ka+244|0;ya=ka+172|0;ka=c[ua+4>>2]|0;c[ya>>2]=c[ua>>2];c[ya+4>>2]=ka;f=c[(c[d>>2]|0)+164>>2]|0;}while((f|0)!=0);f=c[(c[k>>2]|0)+180>>2]|0;if((f|0)==0){break}else{Fa=f;Ga=0}while(1){f=Ga+8|0;g:do{if((Ga|0)==0){ka=Fa;while(1){ya=ka+8|0;ua=c[ya>>2]|0;ta=c[ua+164>>2]|0;if((a[ua+156|0]|0)!=2){Ha=ka;Ia=ta;break g}c[(c[k>>2]|0)+180>>2]=ta;eF(c[ya>>2]|0);eF(ka);if((ta|0)==0){break f}else{ka=ta}}}else{ka=Fa;while(1){ta=ka+8|0;ya=c[ta>>2]|0;ua=c[ya+164>>2]|0;if((a[ya+156|0]|0)!=2){Ha=ka;Ia=ua;break g}c[(c[f>>2]|0)+164>>2]=ua;eF(c[ta>>2]|0);eF(ka);if((ua|0)==0){break f}else{ka=ua}}}}while(0);if((Ia|0)==0){break}else{Fa=Ia;Ga=Ha}}}}while(0);c[(c[(c[(c[k>>2]|0)+180>>2]|0)+8>>2]|0)+168>>2]=0;i=g;return}function Ip(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0;e=d+8|0;f=c[e>>2]|0;g=c[f+184>>2]|0;i=b[f+224>>1]|0;if(i<<16>>16<=(b[f+226>>1]|0)){j=i<<16>>16;i=f;while(1){f=g+(j*44|0)|0;if((c[f>>2]|0)>0){k=g+(j*44|0)+4|0;l=g+(j*44|0)+28|0;m=g+(j*44|0)+20|0;n=g+(j*44|0)+24|0;o=g+(j*44|0)+16|0;p=0;do{q=(c[(c[k>>2]|0)+(p<<2)>>2]|0)+8|0;r=c[q>>2]|0;s=+h[r+80>>3];if(s<0.0){t=s+-.5}else{t=s+.5}u=(~~t+1|0)/2|0;v=c[r+204>>2]|0;do{if((v|0)==0){w=u}else{r=v;x=c[r>>2]|0;if((x|0)==0){w=u;break}else{y=u;z=0;A=x}while(1){x=c[A>>2]&3;do{if((c[((x|0)==3?A:A+32|0)+28>>2]|0)==(c[((x|0)==2?A:A-32|0)+28>>2]|0)){B=c[(c[A+8>>2]|0)+96>>2]|0;if((B|0)==0){C=y;break}s=+(y|0);D=+h[B+32>>3]*.5;C=~~(s>D?s:D)}else{C=y}}while(0);x=z+1|0;B=c[r+(x<<2)>>2]|0;if((B|0)==0){w=C;break}else{y=C;z=x;A=B}}}}while(0);if((c[l>>2]|0)<(w|0)){c[m>>2]=w;c[l>>2]=w}if((c[n>>2]|0)<(w|0)){c[o>>2]=w;c[n>>2]=w}u=c[q>>2]|0;v=c[u+212>>2]|0;do{if((v|0)!=0){if((v|0)==(d|0)){E=0;F=u}else{r=Em(v,c[53720]|0,8,0)|0;E=r;F=c[q>>2]|0}r=c[F+232>>2]|0;B=v+8|0;x=c[B>>2]|0;if((r|0)==(b[x+224>>1]|0)){G=x+124|0;H=c[G>>2]|0;I=E+w|0;c[G>>2]=(H|0)>(I|0)?H:I;J=c[(c[q>>2]|0)+232>>2]|0;K=c[B>>2]|0}else{J=r;K=x}if((J|0)!=(b[K+226>>1]|0)){break}x=c[K+120>>2]|0;r=E+w|0;c[K+120>>2]=(x|0)>(r|0)?x:r}}while(0);p=p+1|0;}while((p|0)<(c[f>>2]|0));L=c[e>>2]|0}else{L=i}if((j|0)<(b[L+226>>1]|0)){j=j+1|0;i=L}else{break}}}L=Op(d)|0;i=b[(c[e>>2]|0)+226>>1]|0;j=i<<16>>16;h[(c[(c[c[g+(j*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]=+(c[g+(j*44|0)+16>>2]|0);K=c[e>>2]|0;if(i<<16>>16>(b[K+224>>1]|0)){i=0;w=j;j=K;while(1){E=w-1|0;J=(c[g+(E*44|0)+24>>2]|0)+(c[g+(w*44|0)+28>>2]|0)+(c[j+240>>2]|0)|0;F=(c[g+(w*44|0)+20>>2]|0)+8+(c[g+(E*44|0)+16>>2]|0)|0;A=(J|0)>(F|0)?J:F;if((c[g+(E*44|0)>>2]|0)>0){h[(c[(c[c[g+(E*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]=+(A|0)+ +h[(c[(c[c[g+(w*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];M=c[e>>2]|0}else{M=j}F=(i|0)>(A|0)?i:A;if((E|0)>(b[M+224>>1]|0)){i=F;w=E;j=M}else{N=F;O=M;break}}}else{N=0;O=K}do{if((L|0)==0){P=N;Q=O}else{if((c[O+116>>2]&1|0)==0){P=N;Q=O;break}Pp(d,0);K=c[e>>2]|0;if((a[K+264|0]|0)==0){P=N;Q=K;break}M=b[K+226>>1]|0;j=M<<16>>16;w=b[K+224>>1]|0;if(M<<16>>16<=w<<16>>16){P=0;Q=K;break}M=w<<16>>16;w=~~+h[(c[(c[c[g+(j*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];i=0;F=j;while(1){j=F-1|0;E=~~+h[(c[(c[c[g+(j*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];A=E-w|0;J=(i|0)>(A|0)?i:A;if((j|0)>(M|0)){w=E;i=J;F=j}else{P=J;Q=K;break}}}}while(0);do{if((a[Q+264|0]|0)==0){R=Q}else{N=b[Q+226>>1]|0;if(N<<16>>16<=(b[Q+224>>1]|0)){R=Q;break}t=+(P|0);d=N<<16>>16;N=Q;while(1){O=d-1|0;if((c[g+(O*44|0)>>2]|0)>0){h[(c[(c[c[g+(O*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]=t+ +h[(c[(c[c[g+(d*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];S=c[e>>2]|0}else{S=N}if((O|0)>(b[S+224>>1]|0)){d=O;N=S}else{R=S;break}}}}while(0);S=c[R+180>>2]|0;if((S|0)==0){return}else{T=S}do{S=T+8|0;R=c[S>>2]|0;h[R+24>>3]=+h[(c[(c[c[g+((c[R+232>>2]|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3];T=c[(c[S>>2]|0)+164>>2]|0;}while((T|0)!=0);return}function Jp(a,d,e,f){a=a|0;d=d|0;e=+e;f=f|0;var g=0,j=0,k=0,l=0,m=0,n=0,o=0.0,p=0,q=0.0;g=i;j=jk(64)|0;k=j+32|0;l=k;c[l>>2]=c[l>>2]|3;l=j;m=j;c[m>>2]=c[m>>2]&-4|2;n=j+8|0;c[n>>2]=jk(176)|0;c[((c[m>>2]&3|0)==3?l:k)+28>>2]=a;c[((c[m>>2]&3|0)==2?l:j-32|0)+28>>2]=d;do{if(e>65535.0){Fv(1,92328,(d=i,i=i+16|0,h[d>>3]=e,c[d+8>>2]=65535,d)|0)|0;i=d;o=65535.0;p=4}else{if(e>=0.0){o=e;p=4;break}q=e+-.5}}while(0);if((p|0)==4){q=o+.5}b[(c[n>>2]|0)+170>>1]=~~q;c[(c[n>>2]|0)+156>>2]=f;Uo(l)|0;i=g;return l|0}function Kp(b,d){b=b|0;d=d|0;var e=0,f=0,g=0;e=c[b+8>>2]|0;b=a[e+84|0]|0;f=c[d+8>>2]|0;if(b<<24>>24!=(a[f+84|0]|0)){g=0;return g|0}do{if(+h[e+56>>3]==+h[f+56>>3]){if(+h[e+64>>3]==+h[f+64>>3]|b<<24>>24==0){break}else{g=0}return g|0}else{if(b<<24>>24==0){break}else{g=0}return g|0}}while(0);do{if(+h[e+16>>3]==+h[f+16>>3]){if(+h[e+24>>3]==+h[f+24>>3]){g=1}else{break}return g|0}}while(0);g=(a[e+44|0]|0)==0|0;return g|0}function Lp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,i=0.0,j=0.0,k=0.0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0;d=b+8|0;e=c[d>>2]|0;if((c[e+216>>2]|0)<2){return}f=~~(+h[e+16>>3]- +h[e+88>>3]);g=~~+h[e+24>>3];e=b|0;vn(b,c[(c[(Hx(e)|0)+8>>2]|0)+116>>2]&1);i=+(g|0);h[(c[d>>2]|0)+24>>3]=i;j=+(f|0);f=c[d>>2]|0;h[f+16>>3]=j+ +h[f+88>>3];f=c[d>>2]|0;k=j+ +h[f+88>>3]+ +h[f+96>>3];f=~~(k+ +(c[(c[(Hx(e)|0)+8>>2]|0)+236>>2]|0));e=c[d>>2]|0;d=e+180|0;if((c[d+4>>2]|0)>0){g=c[c[d>>2]>>2]|0;d=c[e+236>>2]|0;l=pw(a,c[((c[g>>2]&3|0)==2?g:g-32|0)+28>>2]|0)|0;if((l|0)==0){return}g=f;m=l;l=d+1|0;while(1){d=(c[m>>2]&3|0)==2?m:m-32|0;n=d;o=d+32|0;p=c[((c[n>>2]&3|0)==3?d:o)+28>>2]|0;do{if((p|0)==(b|0)){q=l;r=g}else{if((Lm(p)|0)!=(b|0)){q=l;r=g;break}s=c[((c[n>>2]&3|0)==3?d:o)+28>>2]|0;t=s|0;u=Hx(t)|0;v=Lm(s)|0;if((v|0)!=(s|0)){$o(v,s)}w=s+8|0;c[(c[w>>2]|0)+236>>2]=l;c[(c[w>>2]|0)+232>>2]=c[(c[v+8>>2]|0)+232>>2];v=c[w>>2]|0;c[(c[(c[(c[u+8>>2]|0)+184>>2]|0)+((c[v+232>>2]|0)*44|0)+4>>2]|0)+(c[v+236>>2]<<2)>>2]=s;vn(s,c[(c[(Hx(t)|0)+8>>2]|0)+116>>2]&1);h[(c[w>>2]|0)+24>>3]=i;k=+(g|0);s=c[w>>2]|0;h[s+16>>3]=k+ +h[s+88>>3];s=c[w>>2]|0;j=k+ +h[s+88>>3]+ +h[s+96>>3];s=~~(j+ +(c[(c[(Hx(t)|0)+8>>2]|0)+236>>2]|0));fp(d);t=d-32|0;w=(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172|0;v=c[w>>2]|0;if((v|0)==0){x=kk((c[w+4>>2]<<2)+8|0)|0}else{x=mk(v,(c[w+4>>2]<<2)+8|0)|0}c[(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172>>2]=x;w=(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+176|0;v=c[w>>2]|0;c[w>>2]=v+1;c[(c[(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(v<<2)>>2]=d;v=(c[(c[((c[n>>2]&3|0)==2?d:t)+28>>2]|0)+8>>2]|0)+172|0;c[(c[v>>2]|0)+(c[v+4>>2]<<2)>>2]=0;q=l+1|0;r=s}}while(0);d=qw(a,m)|0;if((d|0)==0){break}else{g=r;m=d;l=q}}return}else{q=c[c[e+172>>2]>>2]|0;l=c[e+236>>2]|0;e=mw(a,c[((c[q>>2]&3|0)==3?q:q+32|0)+28>>2]|0)|0;if((e|0)==0){return}q=f;f=e;e=l+1|0;while(1){l=f;m=f-32|0;r=c[((c[l>>2]&3|0)==2?f:m)+28>>2]|0;do{if((r|0)==(b|0)){y=e;z=q}else{if((Lm(r)|0)!=(b|0)){y=e;z=q;break}g=c[((c[l>>2]&3|0)==2?f:m)+28>>2]|0;x=g|0;d=Hx(x)|0;n=Lm(g)|0;if((n|0)!=(g|0)){$o(n,g)}o=g+8|0;c[(c[o>>2]|0)+236>>2]=e;c[(c[o>>2]|0)+232>>2]=c[(c[n+8>>2]|0)+232>>2];n=c[o>>2]|0;c[(c[(c[(c[d+8>>2]|0)+184>>2]|0)+((c[n+232>>2]|0)*44|0)+4>>2]|0)+(c[n+236>>2]<<2)>>2]=g;vn(g,c[(c[(Hx(x)|0)+8>>2]|0)+116>>2]&1);h[(c[o>>2]|0)+24>>3]=i;j=+(q|0);g=c[o>>2]|0;h[g+16>>3]=j+ +h[g+88>>3];g=c[o>>2]|0;k=j+ +h[g+88>>3]+ +h[g+96>>3];g=~~(k+ +(c[(c[(Hx(x)|0)+8>>2]|0)+236>>2]|0));fp(f);x=f+32|0;o=(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180|0;n=c[o>>2]|0;if((n|0)==0){A=kk((c[o+4>>2]<<2)+8|0)|0}else{A=mk(n,(c[o+4>>2]<<2)+8|0)|0}c[(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180>>2]=A;o=(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+184|0;n=c[o>>2]|0;c[o>>2]=n+1;c[(c[(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180>>2]|0)+(n<<2)>>2]=f;n=(c[(c[((c[l>>2]&3|0)==3?f:x)+28>>2]|0)+8>>2]|0)+180|0;c[(c[n>>2]|0)+(c[n+4>>2]<<2)>>2]=0;y=e+1|0;z=g}}while(0);l=ow(a,f)|0;if((l|0)==0){break}else{q=z;f=l;e=y}}return}}function Mp(d,e){d=d|0;e=e|0;var f=0,g=0,i=0,j=0,k=0.0,l=0.0,m=0,n=0,o=0.0,p=0.0,q=0,r=0,s=0.0,t=0.0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0.0,E=0.0,F=0,G=0.0,H=0.0,I=0,J=0,K=0.0,L=0.0;f=d+8|0;g=c[f>>2]|0;if((c[g+172>>2]|0)>=1){i=1;j=g;while(1){Mp(c[(c[j+176>>2]|0)+(i<<2)>>2]|0,e);g=c[f>>2]|0;if((i|0)<(c[g+172>>2]|0)){i=i+1|0;j=g}else{break}}}j=(Ix(d|0)|0)==(d|0);d=c[f>>2]|0;do{if(j){i=b[d+224>>1]|0;g=b[d+226>>1]|0;if(i<<16>>16>g<<16>>16){k=2147483647.0;l=-2147483647.0}else{m=g<<16>>16;n=c[d+184>>2]|0;o=2147483647.0;p=-2147483647.0;q=i<<16>>16;while(1){r=c[n+(q*44|0)>>2]|0;do{if((r|0)==0){s=p;t=o}else{u=c[n+(q*44|0)+4>>2]|0;v=c[u>>2]|0;if((v|0)==0){s=p;t=o;break}w=c[v+8>>2]|0;v=a[w+156|0]|0;if(v<<24>>24!=0&(r|0)>1){x=1;while(1){y=x+1|0;z=c[(c[u+(x<<2)>>2]|0)+8>>2]|0;A=a[z+156|0]|0;if(A<<24>>24!=0&(y|0)<(r|0)){x=y}else{B=z;C=A;break}}}else{B=w;C=v}if(C<<24>>24!=0){s=p;t=o;break}D=+(~~(+h[B+16>>3]- +h[B+88>>3])|0);E=o<D?o:D;x=c[(c[u+(r-1<<2)>>2]|0)+8>>2]|0;if((a[x+156|0]|0)==0){F=x}else{x=r-2|0;while(1){A=c[(c[u+(x<<2)>>2]|0)+8>>2]|0;if((a[A+156|0]|0)==0){F=A;break}else{x=x-1|0}}}D=+(~~(+h[F+16>>3]+ +h[F+96>>3])|0);s=p>D?p:D;t=E}}while(0);if((q|0)<(m|0)){o=t;p=s;q=q+1|0}else{k=t;l=s;break}}}q=c[d+172>>2]|0;if((q|0)<1){G=l;H=k;I=g;J=i;break}m=c[d+176>>2]|0;p=k;n=1;o=l;while(1){r=c[(c[m+(n<<2)>>2]|0)+8>>2]|0;D=+(~~(+h[r+16>>3]+-8.0)|0);K=p<D?p:D;D=+(~~(+h[r+32>>3]+8.0)|0);L=o>D?o:D;if((n|0)<(q|0)){p=K;n=n+1|0;o=L}else{G=L;H=K;I=g;J=i;break}}}else{G=+(c[(c[(c[d+248>>2]|0)+8>>2]|0)+232>>2]|0);H=+(c[(c[(c[d+244>>2]|0)+8>>2]|0)+232>>2]|0);I=b[d+226>>1]|0;J=b[d+224>>1]|0}}while(0);F=c[(c[e+8>>2]|0)+184>>2]|0;l=+h[(c[(c[c[F+((I<<16>>16)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +(c[d+120>>2]|0);k=+h[(c[(c[c[F+((J<<16>>16)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]+ +(c[d+124>>2]|0);h[d+16>>3]=H;h[d+24>>3]=l;d=c[f>>2]|0;h[d+32>>3]=G;h[d+40>>3]=k;return}function Np(a,b,d){a=a|0;b=+b;d=+d;var e=0,f=0,g=0,i=0;e=a+8|0;a=c[e>>2]|0;if((c[a+172>>2]|0)<1){f=a}else{g=1;i=a;while(1){Np(c[(c[i+176>>2]|0)+(g<<2)>>2]|0,b,d);a=c[e>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;i=a}else{f=a;break}}}i=f+16|0;h[i>>3]=+h[i>>3]*b;i=(c[e>>2]|0)+24|0;h[i>>3]=+h[i>>3]*d;i=(c[e>>2]|0)+32|0;h[i>>3]=+h[i>>3]*b;i=(c[e>>2]|0)+40|0;h[i>>3]=+h[i>>3]*d;return}function Op(a){a=a|0;var d=0,e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0;d=a|0;e=c[(c[(Ix(d)|0)+8>>2]|0)+184>>2]|0;if((Ix(d)|0)==(a|0)){f=8}else{f=Em(d,c[53720]|0,8,0)|0}g=a+8|0;i=c[g>>2]|0;j=c[i+120>>2]|0;k=c[i+124>>2]|0;if((c[i+172>>2]|0)<1){l=k;m=j;n=0}else{o=k;k=j;j=1;p=0;q=i;while(1){i=c[(c[q+176>>2]|0)+(j<<2)>>2]|0;r=Op(i)|0|p;s=c[i+8>>2]|0;i=c[g>>2]|0;if((b[s+226>>1]|0)==(b[i+226>>1]|0)){t=(c[s+120>>2]|0)+f|0;u=(k|0)>(t|0)?k:t}else{u=k}if((b[s+224>>1]|0)==(b[i+224>>1]|0)){t=(c[s+124>>2]|0)+f|0;v=(o|0)>(t|0)?o:t}else{v=o}if((j|0)<(c[i+172>>2]|0)){o=v;k=u;j=j+1|0;p=r;q=i}else{l=v;m=u;n=r;break}}}do{if((Ix(d)|0)==(a|0)){w=n;x=m;y=l}else{if((c[(c[g>>2]|0)+12>>2]|0)==0){w=n;x=m;y=l;break}if((c[(c[(Ix(d)|0)+8>>2]|0)+116>>2]&1|0)!=0){w=1;x=m;y=l;break}u=c[g>>2]|0;w=1;x=~~(+(m|0)+ +h[u+56>>3]);y=~~(+(l|0)+ +h[u+88>>3])}}while(0);c[(c[g>>2]|0)+120>>2]=x;c[(c[g>>2]|0)+124>>2]=y;if((Ix(d)|0)==(a|0)){return w|0}a=e+((b[(c[g>>2]|0)+224>>1]|0)*44|0)+20|0;d=c[a>>2]|0;c[a>>2]=(d|0)>(y|0)?d:y;y=e+((b[(c[g>>2]|0)+226>>1]|0)*44|0)+16|0;g=c[y>>2]|0;c[y>>2]=(g|0)>(x|0)?g:x;return w|0}function Pp(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0.0,x=0.0,y=0,z=0,A=0,B=0,C=0;e=a|0;f=c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0;if((Ix(e)|0)==(a|0)){g=0}else{g=Em(e,c[53720]|0,8,0)|0}i=a+8|0;j=c[i>>2]|0;k=c[j+120>>2]|0;l=c[j+124>>2]|0;if((c[j+172>>2]|0)<1){m=k;n=l;o=j}else{p=g+d|0;q=k;k=l;l=1;r=j;while(1){j=c[(c[r+176>>2]|0)+(l<<2)>>2]|0;Pp(j,p);s=c[j+8>>2]|0;j=c[i>>2]|0;if((b[s+226>>1]|0)==(b[j+226>>1]|0)){t=(c[s+120>>2]|0)+g|0;u=(q|0)>(t|0)?q:t}else{u=q}if((b[s+224>>1]|0)==(b[j+224>>1]|0)){t=(c[s+124>>2]|0)+g|0;v=(k|0)>(t|0)?k:t}else{v=k}if((l|0)<(c[j+172>>2]|0)){q=u;k=v;l=l+1|0;r=j}else{m=u;n=v;o=j;break}}}c[o+120>>2]=m;c[(c[i>>2]|0)+124>>2]=n;do{if((Ix(e)|0)!=(a|0)){o=c[i>>2]|0;if((c[o+12>>2]|0)==0){break}w=+h[o+104>>3];x=+h[o+72>>3];v=~~(w>x?w:x)-(n+m)-~~(+h[(c[(c[c[f+((b[o+224>>1]|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3]- +h[(c[(c[c[f+((b[o+226>>1]|0)*44|0)+4>>2]>>2]|0)+8>>2]|0)+24>>3])|0;if((v|0)<=0){break}o=(Ix(e)|0)+8|0;u=c[(c[o>>2]|0)+184>>2]|0;r=c[i>>2]|0;l=b[r+226>>1]|0;k=l<<16>>16;q=b[r+224>>1]|0;g=q<<16>>16;p=(v+1|0)/2|0;j=(c[r+120>>2]|0)+p+(d-(c[u+(k*44|0)+16>>2]|0))|0;if((j|0)>0){if(l<<16>>16<q<<16>>16){y=r}else{x=+(j|0);l=k;while(1){if((c[u+(l*44|0)>>2]|0)>0){k=(c[(c[c[u+(l*44|0)+4>>2]>>2]|0)+8>>2]|0)+24|0;h[k>>3]=x+ +h[k>>3]}if((l|0)>(g|0)){l=l-1|0}else{break}}y=c[i>>2]|0}z=v+d-p+j+(c[y+124>>2]|0)-(c[u+(g*44|0)+20>>2]|0)|0;A=y}else{z=v+d-p+(c[r+124>>2]|0)-(c[u+(g*44|0)+20>>2]|0)|0;A=r}do{if((z|0)>0){l=c[o>>2]|0;if(q<<16>>16<=(b[l+224>>1]|0)){B=A;break}x=+(z|0);k=g;t=l;while(1){l=k-1|0;if((c[u+(l*44|0)>>2]|0)>0){s=(c[(c[c[u+(l*44|0)+4>>2]>>2]|0)+8>>2]|0)+24|0;h[s>>3]=x+ +h[s>>3];C=c[o>>2]|0}else{C=t}if((l|0)>(b[C+224>>1]|0)){k=l;t=C}else{break}}B=c[i>>2]|0}else{B=A}}while(0);o=B+124|0;c[o>>2]=v-p+(c[o>>2]|0);o=(c[i>>2]|0)+120|0;c[o>>2]=(c[o>>2]|0)+p}}while(0);if((Ix(e)|0)==(a|0)){return}a=c[i>>2]|0;e=f+((b[a+224>>1]|0)*44|0)+20|0;B=c[e>>2]|0;A=c[a+124>>2]|0;c[e>>2]=(B|0)>(A|0)?B:A;A=c[i>>2]|0;i=f+((b[A+226>>1]|0)*44|0)+16|0;f=c[i>>2]|0;B=c[A+120>>2]|0;c[i>>2]=(f|0)>(B|0)?f:B;return}function Qp(a){a=a|0;var d=0,e=0,f=0,g=0,j=0,k=0,l=0,m=0.0,n=0,o=0,p=0;d=i;e=a|0;f=Em(e,c[53720]|0,8,0)|0;Rp(a);g=a+8|0;a=c[g>>2]|0;j=c[a+244>>2]|0;k=c[a+248>>2]|0;l=b[a+224>>1]|0;if(l<<16>>16>(b[a+226>>1]|0)){i=d;return}m=+(f|0);f=l<<16>>16;l=a;while(1){a=c[l+184>>2]|0;do{if((c[a+(f*44|0)>>2]|0)!=0){n=c[c[a+(f*44|0)+4>>2]>>2]|0;if((n|0)==0){o=$w(e)|0;Fv(1,97888,(p=i,i=i+16|0,c[p>>2]=o,c[p+8>>2]=f,p)|0)|0;i=p;break}else{Jp(j,n,m+ +h[(c[n+8>>2]|0)+88>>3]+ +h[l+96>>3],0)|0;n=c[g>>2]|0;p=c[n+184>>2]|0;o=c[(c[p+(f*44|0)+4>>2]|0)+((c[p+(f*44|0)>>2]|0)-1<<2)>>2]|0;Jp(o,k,m+ +h[(c[o+8>>2]|0)+96>>3]+ +h[n+64>>3],0)|0;break}}}while(0);a=c[g>>2]|0;if((f|0)<(b[a+226>>1]|0)){f=f+1|0;l=a}else{break}}i=d;return}function Rp(b){b=b|0;var d=0,e=0,f=0,g=0,i=0,j=0.0,k=0.0;d=b+8|0;if((c[(c[d>>2]|0)+244>>2]|0)!=0){return}e=b|0;f=bp(Ix(e)|0)|0;a[(c[f+8>>2]|0)+156|0]=2;g=bp(Ix(e)|0)|0;a[(c[g+8>>2]|0)+156|0]=2;do{if((c[(c[d>>2]|0)+12>>2]|0)!=0){if((Ix(e)|0)==(b|0)){break}if((c[(c[(Ix(e)|0)+8>>2]|0)+116>>2]&1|0)!=0){break}i=c[d>>2]|0;j=+h[i+48>>3];k=+h[i+80>>3];Jp(f,g,+(~~(j>k?j:k)|0),0)|0}}while(0);c[(c[d>>2]|0)+244>>2]=f;c[(c[d>>2]|0)+248>>2]=g;return}function Sp(a){a=a|0;var b=0,d=0,e=0,f=0,g=0,h=0;do{if((Ix(a|0)|0)==(a|0)){b=a+8|0}else{Qp(a);d=a+8|0;e=c[d>>2]|0;f=So(c[e+244>>2]|0,c[e+248>>2]|0)|0;if((f|0)==0){e=c[d>>2]|0;Jp(c[e+244>>2]|0,c[e+248>>2]|0,1.0,128)|0;b=d;break}else{e=(c[f+8>>2]|0)+156|0;c[e>>2]=(c[e>>2]|0)+128;b=d;break}}}while(0);a=c[b>>2]|0;if((c[a+172>>2]|0)<1){return}else{g=1;h=a}while(1){Sp(c[(c[h+176>>2]|0)+(g<<2)>>2]|0);a=c[b>>2]|0;if((g|0)<(c[a+172>>2]|0)){g=g+1|0;h=a}else{break}}return}function Tp(d){d=d|0;var e=0,f=0,g=0,i=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;e=d|0;f=Em(e,c[53720]|0,8,0)|0;g=d+8|0;i=c[g>>2]|0;j=b[i+224>>1]|0;if(j<<16>>16>(b[i+226>>1]|0)){k=i}else{l=+(f|0);f=j<<16>>16;j=i;while(1){i=c[j+184>>2]|0;a:do{if((c[i+(f*44|0)>>2]|0)!=0){m=c[c[i+(f*44|0)+4>>2]>>2]|0;if((m|0)==0){break}n=m+8|0;m=c[(c[n>>2]|0)+236>>2]|0;b:do{if((m|0)>0){o=m;c:while(1){o=o-1|0;p=c[(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)+4>>2]|0)+(o<<2)>>2]|0;q=p+8|0;r=c[q>>2]|0;s=a[r+156|0]|0;do{if((s<<24>>24|0)==1){t=c[c[r+252>>2]>>2]|0;u=c[(c[t+8>>2]|0)+116>>2]|0;if((u|0)==0){v=t}else{t=u;while(1){u=c[(c[t+8>>2]|0)+116>>2]|0;if((u|0)==0){break}else{t=u}}v=t}u=v;if((Rx(d,c[((c[u>>2]&3|0)==3?v:v+32|0)+28>>2]|0)|0)!=0){break}if((Rx(d,c[((c[u>>2]&3|0)==2?v:v-32|0)+28>>2]|0)|0)==0){w=14;break c}}else if((s<<24>>24|0)==0){x=r;break c}}while(0);if((o|0)<=0){break b}}if((w|0)==14){w=0;x=c[q>>2]|0}Jp(p,c[(c[g>>2]|0)+244>>2]|0,l+ +h[x+96>>3],0)|0}}while(0);m=(c[(c[(c[g>>2]|0)+184>>2]|0)+(f*44|0)>>2]|0)+(c[(c[n>>2]|0)+236>>2]|0)|0;if((m|0)<(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)>>2]|0)){y=m}else{break}d:while(1){z=c[(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)+4>>2]|0)+(y<<2)>>2]|0;A=z+8|0;m=c[A>>2]|0;o=a[m+156|0]|0;do{if((o<<24>>24|0)==1){r=c[c[m+252>>2]>>2]|0;s=c[(c[r+8>>2]|0)+116>>2]|0;if((s|0)==0){B=r}else{r=s;while(1){s=c[(c[r+8>>2]|0)+116>>2]|0;if((s|0)==0){break}else{r=s}}B=r}s=B;if((Rx(d,c[((c[s>>2]&3|0)==3?B:B+32|0)+28>>2]|0)|0)!=0){break}if((Rx(d,c[((c[s>>2]&3|0)==2?B:B-32|0)+28>>2]|0)|0)==0){w=23;break d}}else if((o<<24>>24|0)==0){C=m;break d}}while(0);y=y+1|0;if((y|0)>=(c[(c[(c[(Ix(e)|0)+8>>2]|0)+184>>2]|0)+(f*44|0)>>2]|0)){break a}}if((w|0)==23){w=0;C=c[A>>2]|0}Jp(c[(c[g>>2]|0)+248>>2]|0,z,l+ +h[C+88>>3],0)|0}}while(0);i=c[g>>2]|0;if((f|0)<(b[i+226>>1]|0)){f=f+1|0;j=i}else{k=i;break}}}if((c[k+172>>2]|0)<1){return}else{D=1;E=k}while(1){Tp(c[(c[E+176>>2]|0)+(D<<2)>>2]|0);k=c[g>>2]|0;if((D|0)<(c[k+172>>2]|0)){D=D+1|0;E=k}else{break}}return}function Up(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0,i=0;b=Em(a|0,c[53720]|0,8,0)|0;Rp(a);d=a+8|0;a=c[d>>2]|0;if((c[a+172>>2]|0)<1){return}e=+(b|0);b=1;f=a;while(1){a=c[(c[f+176>>2]|0)+(b<<2)>>2]|0;Rp(a);g=c[d>>2]|0;i=a+8|0;Jp(c[g+244>>2]|0,c[(c[i>>2]|0)+244>>2]|0,e+ +h[g+96>>3],0)|0;g=c[d>>2]|0;Jp(c[(c[i>>2]|0)+248>>2]|0,c[g+248>>2]|0,e+ +h[g+64>>3],0)|0;Up(a);a=c[d>>2]|0;if((b|0)<(c[a+172>>2]|0)){b=b+1|0;f=a}else{break}}return}function Vp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0.0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;d=Em(a|0,c[53720]|0,8,0)|0;e=a+8|0;a=c[e>>2]|0;if((c[a+172>>2]|0)<1){return}else{f=1;g=a}while(1){Rp(c[(c[g+176>>2]|0)+(f<<2)>>2]|0);h=c[e>>2]|0;i=c[h+172>>2]|0;if((f|0)<(i|0)){f=f+1|0;g=h}else{break}}if((i|0)<1){return}j=+(d|0);d=1;g=h;h=i;while(1){i=d+1|0;f=c[g+176>>2]|0;a=c[f+(d<<2)>>2]|0;if((d|0)<(h|0)){k=i;l=f;f=a;m=g;while(1){n=c[l+(k<<2)>>2]|0;o=(b[(c[f+8>>2]|0)+224>>1]|0)>(b[(c[n+8>>2]|0)+224>>1]|0);p=o?n:f;q=o?f:n;n=c[p+8>>2]|0;o=c[q+8>>2]|0;r=b[o+224>>1]|0;s=r<<16>>16;if((b[n+226>>1]|0)<r<<16>>16){t=m}else{r=(c[(c[(c[c[(c[n+184>>2]|0)+(s*44|0)+4>>2]>>2]|0)+8>>2]|0)+236>>2]|0)<(c[(c[(c[c[(c[o+184>>2]|0)+(s*44|0)+4>>2]>>2]|0)+8>>2]|0)+236>>2]|0);Jp(c[(c[(r?p:q)+8>>2]|0)+248>>2]|0,c[(c[(r?q:p)+8>>2]|0)+244>>2]|0,j,0)|0;t=c[e>>2]|0}p=c[t+176>>2]|0;q=c[p+(d<<2)>>2]|0;if((k|0)<(c[t+172>>2]|0)){k=k+1|0;l=p;f=q;m=t}else{u=q;break}}}else{u=a}Vp(u);m=c[e>>2]|0;f=c[m+172>>2]|0;if((d|0)<(f|0)){d=i;g=m;h=f}else{break}}return}function Wp(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0;if((a|0)==(b|0)){d=1;return d|0}e=c[(c[a+8>>2]|0)+180>>2]|0;a=c[e>>2]|0;if((a|0)==0){d=0;return d|0}else{f=0;g=a}while(1){a=f+1|0;if((Wp(c[((c[g>>2]&3|0)==2?g:g-32|0)+28>>2]|0,b)|0)!=0){d=1;h=5;break}i=c[e+(a<<2)>>2]|0;if((i|0)==0){d=0;h=5;break}else{f=a;g=i}}if((h|0)==5){return d|0}return 0}function Xp(a){a=a|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0;d=a+8|0;b[(c[d>>2]|0)+224>>1]=32767;b[(c[d>>2]|0)+226>>1]=-1;e=ux(a)|0;f=c[d>>2]|0;if((e|0)==0){g=0;h=f;i=h+252|0;j=g;c[i>>2]=j;return}else{k=e;l=0;m=f}while(1){f=m+226|0;e=k+8|0;n=c[(c[e>>2]|0)+232>>2]|0;if((b[f>>1]|0)<(n|0)){b[f>>1]=n;o=c[d>>2]|0;p=c[(c[e>>2]|0)+232>>2]|0}else{o=m;p=n}n=o+224|0;if((b[n>>1]|0)>(p|0)){b[n>>1]=p}if((l|0)==0){q=k}else{q=(c[(c[e>>2]|0)+232>>2]|0)<(c[(c[l+8>>2]|0)+232>>2]|0)?k:l}e=vx(a,k)|0;n=c[d>>2]|0;if((e|0)==0){g=q;h=n;break}else{k=e;l=q;m=n}}i=h+252|0;j=g;c[i>>2]=j;return}function Yp(a){a=a|0;var b=0,d=0,e=0.0,f=0,g=0,h=0,i=0,j=0;b=ew(a|0,147792)|0;if((b|0)==0){d=2147483647}else{e=+rF(b);d=~~(e*+(Lw(a)|0))}b=a+8|0;f=c[b>>2]|0;g=f+204|0;if((c[g+4>>2]|0)>0){h=0;i=f;j=g}else{return}do{c[i+180>>2]=c[(c[j>>2]|0)+(h<<2)>>2];ok(a,(c[(c[b>>2]|0)+172>>2]|0)==0|0,d)|0;h=h+1|0;i=c[b>>2]|0;j=i+204|0;}while((h|0)<(c[j+4>>2]|0));return}function Zp(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,p=0,q=0.0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0;f=i;i=i+104|0;g=f|0;h=d|0;if((ew(h,162288)|0)==0){_p(d,e)}else{j=d+8|0;k=(c[j>>2]|0)+128|0;b[k>>1]=b[k>>1]|16;c[53670]=0;k=Hw(109200,173936,0)|0;Wx(k|0,103336,272,1)|0;Px(k,19768,21560);if((a[(c[j>>2]|0)+113|0]&1)!=0){l=ux(d)|0;if((l|0)!=0){m=l;do{l=mw(d,m)|0;if((l|0)!=0){n=l;do{l=(c[n+8>>2]|0)+170|0;b[l>>1]=b[l>>1]<<1;n=ow(d,n)|0;}while((n|0)!=0)}m=vx(d,m)|0;}while((m|0)!=0)}m=(c[j>>2]|0)+240|0;c[m>>2]=((c[m>>2]|0)+1|0)/2|0}m=ew(h,147792)|0;if((m|0)==0){p=2147483647}else{q=+rF(m);p=~~(q*+(Lw(d)|0))}aq(d,0);c[53670]=0;m=ux(d)|0;if((m|0)!=0){n=k+8|0;l=m;do{if((cq(l)|0)==(l|0)){m=Ax(k,$w(l|0)|0,1)|0;r=m+8|0;c[(c[r>>2]|0)+176>>2]=0;s=jk(20)|0;c[(c[r>>2]|0)+172>>2]=s;c[(c[r>>2]|0)+184>>2]=0;s=jk(20)|0;c[(c[r>>2]|0)+180>>2]=s;s=c[53670]|0;t=(c[r>>2]|0)+168|0;if((s|0)==0){c[t>>2]=0;c[(c[n>>2]|0)+180>>2]=m}else{c[t>>2]=s;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=m}c[53670]=m;c[(c[r>>2]|0)+164>>2]=0;c[(c[l+8>>2]|0)+148>>2]=m}l=vx(d,l)|0;}while((l|0)!=0)}l=ux(d)|0;if((l|0)!=0){n=l;do{l=n+8|0;if((c[(c[l>>2]|0)+148>>2]|0)==0){m=c[(c[(cq(n)|0)+8>>2]|0)+148>>2]|0;c[(c[l>>2]|0)+148>>2]=m}n=vx(d,n)|0;}while((n|0)!=0)}n=ux(d)|0;if((n|0)!=0){m=g|0;g=k+8|0;l=n;do{n=c[(c[l+8>>2]|0)+148>>2]|0;r=mw(d,l)|0;if((r|0)!=0){s=n;n=r;while(1){r=c[53812]|0;do{if((r|0)==0){u=30}else{t=fw(n|0,r)|0;if((t|0)==0){u=30;break}if((a[t]|0)==0){u=30;break}if((Km(t)|0)<<24>>24==0){v=s}else{u=30}}}while(0);a:do{if((u|0)==30){u=0;r=n;t=n-32|0;w=c[(c[(cq(c[((c[r>>2]&3|0)==2?n:t)+28>>2]|0)|0)+8>>2]|0)+148>>2]|0;if((s|0)==(w|0)){v=s;break}x=c[r>>2]&3;y=n+32|0;z=c[((x|0)==3?n:y)+28>>2]|0;A=c[(c[z+8>>2]|0)+212>>2]|0;B=c[(c[(c[((x|0)==2?n:t)+28>>2]|0)+8>>2]|0)+212>>2]|0;x=B;C=A;do{if((A|0)!=(B|0)){D=C;E=x;b:while(1){F=c[D+8>>2]|0;G=c[F+192>>2]|0;H=E;while(1){I=c[H+8>>2]|0;if((G|0)>=(c[I+192>>2]|0)){break}J=c[I+188>>2]|0;if((D|0)==(J|0)){K=D;break b}else{H=J}}G=c[F+188>>2]|0;if((G|0)==(H|0)){K=H;break}else{D=G;E=H}}if((K|0)==(C|0)|(K|0)==(x|0)){break}do{if((Vm(ew(A,168304)|0,0)|0)<<24>>24==0){if((Vm(ew(B,168304)|0,0)|0)<<24>>24!=0){break}gq(k,s,w,n);v=s;break a}}while(0);E=pw(k,s)|0;if((E|0)!=0){D=E;do{E=mw(k,c[((c[D>>2]&3|0)==3?D:D+32|0)+28>>2]|0)|0;if((E|0)!=0){if((c[((c[E>>2]&3|0)==2?E:E-32|0)+28>>2]|0)==(w|0)){v=s;break a}}D=qw(k,D)|0;}while((D|0)!=0)}D=c[43648]|0;c[43648]=D+1;nb(m|0,164168,(L=i,i=i+8|0,c[L>>2]=D,L)|0)|0;i=L;D=Ax(k,m,1)|0;E=D+8|0;c[(c[E>>2]|0)+176>>2]=0;G=jk(20)|0;c[(c[E>>2]|0)+172>>2]=G;c[(c[E>>2]|0)+184>>2]=0;G=jk(20)|0;c[(c[E>>2]|0)+180>>2]=G;G=c[53670]|0;J=(c[E>>2]|0)+168|0;if((G|0)==0){c[J>>2]=0;c[(c[g>>2]|0)+180>>2]=D}else{c[J>>2]=G;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=D}c[53670]=D;c[(c[E>>2]|0)+164>>2]=0;E=uw(k,D,s,0,1)|0;G=uw(k,D,w,0,1)|0;D=n+8|0;J=(c[E+8>>2]|0)+156|0;c[J>>2]=(c[J>>2]|0)+((c[(c[D>>2]|0)+156>>2]|0)*1e3|0);J=G+8|0;G=(c[J>>2]|0)+170|0;E=b[G>>1]|0;I=b[(c[D>>2]|0)+170>>1]|0;b[G>>1]=(E&65535)>>>0>(I&65535)>>>0?E:I;I=(c[J>>2]|0)+156|0;c[I>>2]=(c[I>>2]|0)+(c[(c[D>>2]|0)+156>>2]|0);v=s;break a}}while(0);B=cq(z)|0;A=c[r>>2]&3;if((B|0)==(c[(c[(c[(c[(c[((A|0)==3?n:y)+28>>2]|0)+8>>2]|0)+212>>2]|0)+8>>2]|0)+200>>2]|0)){u=39}else{B=cq(c[((A|0)==2?n:t)+28>>2]|0)|0;if((B|0)==(c[(c[(c[(c[(c[((c[r>>2]&3|0)==2?n:t)+28>>2]|0)+8>>2]|0)+212>>2]|0)+8>>2]|0)+196>>2]|0)){u=39}else{M=s;N=w}}if((u|0)==39){u=0;M=w;N=s}gq(k,M,N,n);v=M}}while(0);B=ow(d,n)|0;if((B|0)==0){break}else{s=v;n=B}}}l=vx(d,l)|0;}while((l|0)!=0)}bq(d,k,0,0);l=ux(k)|0;if((l|0)!=0){v=l;do{l=v+8|0;a[(c[l>>2]|0)+158|0]=0;a[(c[l>>2]|0)+157|0]=0;v=vx(k,v)|0;}while((v|0)!=0)}v=ux(k)|0;if((v|0)!=0){l=v;do{fq(k,l);l=vx(k,l)|0;}while((l|0)!=0)}l=ux(k)|0;if((l|0)!=0){v=l;do{c[(c[v+8>>2]|0)+128>>2]=0;v=vx(k,v)|0;}while((v|0)!=0)}v=ux(k)|0;do{if((v|0)==0){O=0}else{l=v;M=0;while(1){if((c[(c[l+8>>2]|0)+128>>2]|0)==0){N=M+1|0;eq(k,l,N);P=N}else{P=M}N=vx(k,l)|0;if((N|0)==0){break}else{l=N;M=P}}if((P|0)<=1){O=P;break}M=Ax(k,92264,1)|0;l=M+8|0;c[(c[l>>2]|0)+176>>2]=0;N=jk(20)|0;c[(c[l>>2]|0)+172>>2]=N;c[(c[l>>2]|0)+184>>2]=0;N=jk(20)|0;c[(c[l>>2]|0)+180>>2]=N;N=c[53670]|0;u=(c[l>>2]|0)+168|0;if((N|0)==0){c[u>>2]=0;c[(c[k+8>>2]|0)+180>>2]=M}else{c[u>>2]=N;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=M}c[53670]=M;c[(c[l>>2]|0)+164>>2]=0;l=ux(k)|0;if((l|0)==0){O=P;break}else{Q=l;R=1}while(1){if((c[(c[Q+8>>2]|0)+128>>2]|0)==(R|0)){uw(k,M,Q,0,1)|0;S=R+1|0}else{S=R}l=vx(k,Q)|0;if((l|0)==0){O=P;break}else{Q=l;R=S}}}}while(0);S=ux(k)|0;if((S|0)!=0){R=S;do{S=mw(k,R)|0;if((S|0)!=0){Q=R+8|0;P=S;do{S=(c[Q>>2]|0)+180|0;v=c[S>>2]|0;if((v|0)==0){T=kk((c[S+4>>2]<<2)+8|0)|0}else{T=mk(v,(c[S+4>>2]<<2)+8|0)|0}c[(c[Q>>2]|0)+180>>2]=T;S=(c[Q>>2]|0)+184|0;v=c[S>>2]|0;c[S>>2]=v+1;c[(c[(c[Q>>2]|0)+180>>2]|0)+(v<<2)>>2]=P;v=(c[Q>>2]|0)+180|0;c[(c[v>>2]|0)+(c[v+4>>2]<<2)>>2]=0;v=P;S=P-32|0;M=(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172|0;l=c[M>>2]|0;if((l|0)==0){U=kk((c[M+4>>2]<<2)+8|0)|0}else{U=mk(l,(c[M+4>>2]<<2)+8|0)|0}c[(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172>>2]=U;M=(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+176|0;l=c[M>>2]|0;c[M>>2]=l+1;c[(c[(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172>>2]|0)+(l<<2)>>2]=P;l=(c[(c[((c[v>>2]&3|0)==2?P:S)+28>>2]|0)+8>>2]|0)+172|0;c[(c[l>>2]|0)+(c[l+4>>2]<<2)>>2]=0;P=ow(k,P)|0;}while((P|0)!=0)}R=vx(k,R)|0;}while((R|0)!=0)}if((e|0)!=0){Rn(k);On(k)}e=ew(h,97800)|0;if((e|0)==0){V=-1}else{V=Rb(e|0)|0}nk(k,1,p,V)|0;b[(c[j>>2]|0)+224>>1]=32767;b[(c[j>>2]|0)+226>>1]=-1;if((O|0)>1){V=jk((O<<2)+4|0)|0;p=1;while(1){c[V+(p<<2)>>2]=32767;if((p|0)<(O|0)){p=p+1|0}else{W=V;break}}}else{W=0}V=ux(d)|0;if((V|0)!=0){if((W|0)==0){p=V;do{O=c[(c[(c[(c[(cq(p)|0)+8>>2]|0)+148>>2]|0)+8>>2]|0)+232>>2]|0;e=p+8|0;c[(c[e>>2]|0)+232>>2]=O;O=c[j>>2]|0;h=O+226|0;R=c[(c[e>>2]|0)+232>>2]|0;if((b[h>>1]|0)<(R|0)){b[h>>1]=R;X=c[j>>2]|0;Y=c[(c[e>>2]|0)+232>>2]|0}else{X=O;Y=R}R=X+224|0;if((b[R>>1]|0)>(Y|0)){b[R>>1]=Y}p=vx(d,p)|0;}while((p|0)!=0)}else{p=V;do{V=(c[(c[(cq(p)|0)+8>>2]|0)+148>>2]|0)+8|0;Y=p+8|0;c[(c[Y>>2]|0)+232>>2]=c[(c[V>>2]|0)+232>>2];X=c[j>>2]|0;R=X+226|0;O=c[Y>>2]|0;e=c[O+232>>2]|0;if((b[R>>1]|0)<(e|0)){b[R>>1]=e;R=c[Y>>2]|0;Z=c[j>>2]|0;_=c[R+232>>2]|0;$=R}else{Z=X;_=e;$=O}O=Z+224|0;if((b[O>>1]|0)>(_|0)){b[O>>1]=_;aa=c[Y>>2]|0}else{aa=$}c[aa+128>>2]=c[(c[V>>2]|0)+128>>2];V=c[Y>>2]|0;Y=W+(c[V+128>>2]<<2)|0;O=c[Y>>2]|0;e=c[V+232>>2]|0;c[Y>>2]=(O|0)<(e|0)?O:e;p=vx(d,p)|0;}while((p|0)!=0)}}p=(W|0)!=0;do{if(p){aa=ux(d)|0;if((aa|0)==0){ba=1;break}else{ca=aa}while(1){aa=c[ca+8>>2]|0;$=aa+232|0;c[$>>2]=(c[$>>2]|0)-(c[W+(c[aa+128>>2]<<2)>>2]|0);aa=vx(d,ca)|0;if((aa|0)==0){ba=1;break}else{ca=aa}}}else{aa=b[(c[j>>2]|0)+224>>1]|0;$=aa<<16>>16;if(aa<<16>>16<=0){ba=0;break}_=ux(d)|0;if((_|0)!=0){Z=_;do{_=(c[Z+8>>2]|0)+232|0;c[_>>2]=(c[_>>2]|0)-$;Z=vx(d,Z)|0;}while((Z|0)!=0)}Z=(c[j>>2]|0)+224|0;b[Z>>1]=(b[Z>>1]|0)-aa;Z=(c[j>>2]|0)+226|0;b[Z>>1]=(b[Z>>1]|0)-aa;ba=0}}while(0);dq(d,ba);ba=ux(k)|0;if((ba|0)!=0){j=ba;do{ba=j+8|0;ca=c[ba>>2]|0;Z=c[ca+172>>2]|0;if((Z|0)==0){da=ca}else{eF(Z);da=c[ba>>2]|0}ba=c[da+180>>2]|0;if((ba|0)!=0){eF(ba)}j=vx(k,j)|0;}while((j|0)!=0)}eF(c[(c[(ux(d)|0)+8>>2]|0)+112>>2]|0);j=ux(d)|0;if((j|0)!=0){da=j;do{c[(c[da+8>>2]|0)+112>>2]=0;da=vx(d,da)|0;}while((da|0)!=0)}if(p){eF(W)}Kw(k)|0}if((a[213992]|0)==0){i=f;return}k=c[d+8>>2]|0;d=b[k+224>>1]|0;gc(c[o>>2]|0,130928,(L=i,i=i+16|0,c[L>>2]=b[k+226>>1]|0,c[L+8>>2]=d,L)|0)|0;i=L;i=f;return}function _p(d,e){d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0.0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0;f=i;i=i+8|0;g=f|0;h=g;j=d+8|0;if((a[(c[j>>2]|0)+113|0]&1)!=0){k=ux(d)|0;if((k|0)!=0){l=k;do{k=mw(d,l)|0;if((k|0)!=0){m=k;do{k=(c[m+8>>2]|0)+170|0;b[k>>1]=b[k>>1]<<1;m=ow(d,m)|0;}while((m|0)!=0)}l=vx(d,l)|0;}while((l|0)!=0)}l=(c[j>>2]|0)+240|0;c[l>>2]=((c[l>>2]|0)+1|0)/2|0}do{if((e|0)==0){lq(d,d);Wn(d);mq(h,d);l=c[g>>2]|0;m=c[g+4>>2]|0;qo(d,0);n=0;o=l&65535;p=m&65535}else{Rn(d);On(d);lq(d,d);Wn(d);mq(h,d);m=c[g>>2]|0;l=c[g+4>>2]|0;qo(d,0);k=c[j>>2]|0;if((c[k+208>>2]|0)>1){q=l&65535;r=m&65535}else{s=l&65535;l=m&65535;if((c[k+172>>2]|0)>0){q=s;r=l}else{n=e;o=l;p=s;break}}c[e+32>>2]=1;n=0;o=r;p=q}}while(0);Ln(d);q=c[j>>2]|0;if((c[q+216>>2]|0)==0){if((c[q+212>>2]|0)!=0){t=15}}else{t=15}do{if((t|0)==15){q=ux(d)|0;if((q|0)==0){break}else{u=q;v=0}while(1){do{if((u|0)==(Lm(u)|0)){q=u+8|0;r=c[q>>2]|0;do{if((c[r+184>>2]|0)==0){e=c[(c[j>>2]|0)+216>>2]|0;if((e|0)==0|(u|0)==(e|0)){w=v;x=r;break}g=Zo(u,e,0)|0;e=g+8|0;b[(c[e>>2]|0)+170>>1]=p;c[(c[e>>2]|0)+156>>2]=0;w=g;x=c[q>>2]|0}else{w=v;x=r}}while(0);if((c[x+176>>2]|0)!=0){y=w;break}r=c[(c[j>>2]|0)+212>>2]|0;q=r;if((r|0)==0|(u|0)==(q|0)){y=w;break}r=Zo(q,u,0)|0;q=r+8|0;b[(c[q>>2]|0)+170>>1]=o;c[(c[q>>2]|0)+156>>2]=0;y=r}else{y=v}}while(0);r=vx(d,u)|0;if((r|0)==0){break}else{u=r;v=y}}if((y|0)==0){break}qo(d,0)}}while(0);y=(n|0)==0;do{if(y){v=ew(d|0,147792)|0;if((v|0)==0){z=2147483647}else{A=+rF(v);z=~~(A*+(Lw(d)|0))}v=c[j>>2]|0;u=v+204|0;if((c[u+4>>2]|0)>0){B=0;C=v;D=u}else{break}do{c[C+180>>2]=c[(c[D>>2]|0)+(B<<2)>>2];ok(d,(c[(c[j>>2]|0)+172>>2]|0)==0|0,z)|0;B=B+1|0;C=c[j>>2]|0;D=C+204|0;}while((B|0)<(c[D+4>>2]|0))}else{Pn(d,n)}}while(0);n=ux(d)|0;D=c[j>>2]|0;a:do{if((n|0)==0){b[D+226>>1]=0;b[(c[j>>2]|0)+224>>1]=0}else{b[D+224>>1]=32767;b[(c[j>>2]|0)+226>>1]=-1;B=n;do{C=Lm(B)|0;z=B+8|0;do{if((C|0)==(B|0)){E=z}else{u=c[z>>2]|0;v=c[u+232>>2]|0;if(y){F=v}else{if((v|0)==0){F=0}else{E=z;break}}c[u+232>>2]=F+(c[(c[C+8>>2]|0)+232>>2]|0);E=B+8|0}}while(0);C=c[j>>2]|0;z=C+226|0;u=c[E>>2]|0;v=c[u+232>>2]|0;if((b[z>>1]|0)<(v|0)){b[z>>1]=v;z=c[E>>2]|0;G=c[j>>2]|0;H=z;I=c[z+232>>2]|0}else{G=C;H=u;I=v}v=G+224|0;if((b[v>>1]|0)>(I|0)){b[v>>1]=I;J=c[E>>2]|0}else{J=H}v=a[J+159|0]|0;if(!((v<<24>>24|0)==0|(v<<24>>24|0)==6)){Nm(B)}B=vx(d,B)|0;}while((B|0)!=0);B=d|0;if((Ix(B)|0)!=(d|0)){break}if((c[53850]|0)==100){v=c[j>>2]|0;if((c[v+172>>2]|0)<1){break}else{K=1;L=v}while(1){nq(c[(c[L+176>>2]|0)+(K<<2)>>2]|0);v=c[j>>2]|0;if((K|0)<(c[v+172>>2]|0)){K=K+1|0;L=v}else{break a}}}v=sy(Ix(B)|0)|0;if((v|0)==0){break}else{M=v}do{if((a[(c[M+8>>2]|0)+262|0]|0)==7){oq(d,M)}M=ty(M)|0;}while((M|0)!=0)}}while(0);M=c[j>>2]|0;L=M+204|0;if((c[L+4>>2]|0)>0){K=0;J=M;M=L;while(1){c[J+180>>2]=c[(c[M>>2]|0)+(K<<2)>>2];L=c[j>>2]|0;H=c[L+180>>2]|0;if((H|0)==0){N=L}else{L=H;do{H=L+8|0;E=(c[H>>2]|0)+172|0;I=E+4|0;G=c[I>>2]|0;if((G|0)>-1){F=G;while(1){c[(c[E>>2]|0)+(F<<2)>>2]=0;if((F|0)>0){F=F-1|0}else{break}}}c[I>>2]=0;F=(c[H>>2]|0)+180|0;E=F+4|0;G=c[E>>2]|0;if((G|0)>-1){y=G;while(1){c[(c[F>>2]|0)+(y<<2)>>2]=0;if((y|0)>0){y=y-1|0}else{break}}}c[E>>2]=0;a[(c[H>>2]|0)+157|0]=0;L=c[(c[H>>2]|0)+164>>2]|0;}while((L|0)!=0);N=c[j>>2]|0}L=K+1|0;y=N+204|0;if((L|0)<(c[y+4>>2]|0)){K=L;J=N;M=y}else{break}}}M=ux(d)|0;if((M|0)==0){O=c[j>>2]|0;P=O+204|0;Q=c[P>>2]|0;R=Q;eF(R);S=c[j>>2]|0;T=S+204|0;c[T>>2]=0;U=c[j>>2]|0;V=U+204|0;W=V+4|0;c[W>>2]=0;i=f;return}else{X=M}do{M=mw(d,X)|0;if((M|0)!=0){N=M;do{M=N+8|0;J=c[M>>2]|0;K=c[J+172>>2]|0;do{if((K|0)==0){Y=J}else{y=K+8|0;if((N|0)!=(c[(c[y>>2]|0)+116>>2]|0)){Y=J;break}L=ux(d)|0;if((L|0)!=0){F=L;do{L=mw(d,F)|0;if((L|0)!=0){I=L;do{do{if((N|0)!=(I|0)){L=(c[I+8>>2]|0)+172|0;G=c[L>>2]|0;if(!((G|0)!=0&(K|0)==(G|0))){break}c[L>>2]=0}}while(0);I=ow(d,I)|0;}while((I|0)!=0)}F=vx(d,F)|0;}while((F|0)!=0)}eF(c[y>>2]|0);eF(K);Y=c[M>>2]|0}}while(0);c[Y+172>>2]=0;N=ow(d,N)|0;}while((N|0)!=0)}X=vx(d,X)|0;}while((X|0)!=0);O=c[j>>2]|0;P=O+204|0;Q=c[P>>2]|0;R=Q;eF(R);S=c[j>>2]|0;T=S+204|0;c[T>>2]=0;U=c[j>>2]|0;V=U+204|0;W=V+4|0;c[W>>2]=0;i=f;return}function $p(a){a=a|0;return(Za($w(a|0)|0,116432,7)|0)==0|0}function aq(b,d){b=b|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0;if((ux(b)|0)==0){return}do{if((an(b)|0)==0){e=d}else{if((d|0)==0){c[(c[b+8>>2]|0)+192>>2]=0;e=b;break}f=d+8|0;g=b+8|0;c[(c[g>>2]|0)+192>>2]=(c[(c[f>>2]|0)+192>>2]|0)+1;c[(c[g>>2]|0)+188>>2]=d;g=(c[f>>2]|0)+172|0;h=c[g>>2]|0;i=h+1|0;c[g>>2]=i;g=c[f>>2]|0;j=c[g+176>>2]|0;if((j|0)==0){k=jk((h<<2)+8|0)|0}else{k=lk(j,h+2|0,4,c[g+172>>2]|0)|0}c[(c[f>>2]|0)+176>>2]=k;c[(c[(c[f>>2]|0)+176>>2]|0)+(i<<2)>>2]=b;Rj(b);hq(d,b);e=b}}while(0);d=sy(b)|0;if((d|0)!=0){k=d;do{aq(k,e);k=ty(k)|0;}while((k|0)!=0)}do{if((an(b)|0)!=0){k=ux(b)|0;if((k|0)==0){break}d=b;i=k;do{k=(c[i+8>>2]|0)+212|0;if((c[k>>2]|0)==0){c[k>>2]=d}i=vx(b,i)|0;}while((i|0)!=0)}}while(0);i=ew(b|0,151672)|0;a:do{if((i|0)!=0){if((a[i]|0)==0){break}do{if((Ya(i|0,148832)|0)!=0){if((Ya(i|0,145656)|0)==0){a[(c[e+8>>2]|0)+229|0]=1;break}do{if((Ya(i|0,142656)|0)!=0){if((Ya(i|0,139584)|0)==0){a[(c[e+8>>2]|0)+230|0]=1;break}if((Ya(i|0,136936)|0)!=0){break a}d=ux(b)|0;if((d|0)==0){break a}k=cq(d)|0;f=vx(b,d)|0;if((f|0)==0){break a}else{l=f}while(1){f=cq(k)|0;c[(c[(cq(l)|0)+8>>2]|0)+152>>2]=f;l=vx(b,l)|0;if((l|0)==0){break a}}}}while(0);k=ux(b)|0;do{if((k|0)==0){m=0}else{f=cq(k)|0;d=vx(b,k)|0;if((d|0)==0){m=f;break}else{n=d}while(1){d=cq(f)|0;c[(c[(cq(n)|0)+8>>2]|0)+152>>2]=d;d=vx(b,n)|0;if((d|0)==0){m=f;break}else{n=d}}}}while(0);k=e+8|0;f=c[k>>2]|0;d=c[f+200>>2]|0;if((d|0)==0){o=m;p=f}else{f=cq(m)|0;c[(c[(cq(d)|0)+8>>2]|0)+152>>2]=f;o=f;p=c[k>>2]|0}c[p+200>>2]=o;break a}}while(0);k=ux(b)|0;do{if((k|0)==0){q=0}else{f=cq(k)|0;d=vx(b,k)|0;if((d|0)==0){q=f;break}else{r=d}while(1){d=cq(f)|0;c[(c[(cq(r)|0)+8>>2]|0)+152>>2]=d;d=vx(b,r)|0;if((d|0)==0){q=f;break}else{r=d}}}}while(0);k=e+8|0;f=c[k>>2]|0;d=c[f+196>>2]|0;if((d|0)==0){s=q;t=f}else{f=cq(q)|0;c[(c[(cq(d)|0)+8>>2]|0)+152>>2]=f;s=f;t=c[k>>2]|0}c[t+196>>2]=s}}while(0);if((an(b)|0)==0){return}s=b+8|0;t=c[s>>2]|0;q=c[t+196>>2]|0;if((q|0)==0){return}if((q|0)!=(c[t+200>>2]|0)){return}t=ux(b)|0;do{if((t|0)==0){u=0}else{q=cq(t)|0;e=vx(b,t)|0;if((e|0)==0){u=q;break}else{v=e}while(1){e=cq(q)|0;c[(c[(cq(v)|0)+8>>2]|0)+152>>2]=e;e=vx(b,v)|0;if((e|0)==0){u=q;break}else{v=e}}}}while(0);c[(c[s>>2]|0)+196>>2]=u;c[(c[s>>2]|0)+200>>2]=u;return}function bq(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;do{if((an(a)|0)==0){f=d;g=e}else{if((Vm(ew(a|0,168304)|0,0)|0)<<24>>24==0){f=d;g=e;break}h=ux(a)|0;if((h|0)==0){i=e;j=d}else{k=b+8|0;l=e;m=h;h=d;while(1){if((pw(a,m)|0)==0){n=c[(c[(cq(m)|0)+8>>2]|0)+148>>2]|0;if((h|0)==0){o=Ax(b,87016,1)|0;p=o+8|0;c[(c[p>>2]|0)+176>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+172>>2]=q;c[(c[p>>2]|0)+184>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+180>>2]=q;q=c[53670]|0;r=(c[p>>2]|0)+168|0;if((q|0)==0){c[r>>2]=0;c[(c[k>>2]|0)+180>>2]=o}else{c[r>>2]=q;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=o}c[53670]=o;c[(c[p>>2]|0)+164>>2]=0;s=o}else{s=h}uw(b,s,n,0,1)|0;t=s}else{t=h}if((mw(a,m)|0)==0){n=c[(c[(cq(m)|0)+8>>2]|0)+148>>2]|0;if((l|0)==0){o=Ax(b,82176,1)|0;p=o+8|0;c[(c[p>>2]|0)+176>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+172>>2]=q;c[(c[p>>2]|0)+184>>2]=0;q=jk(20)|0;c[(c[p>>2]|0)+180>>2]=q;q=c[53670]|0;r=(c[p>>2]|0)+168|0;if((q|0)==0){c[r>>2]=0;c[(c[k>>2]|0)+180>>2]=o}else{c[r>>2]=q;c[(c[(c[53670]|0)+8>>2]|0)+164>>2]=o}c[53670]=o;c[(c[p>>2]|0)+164>>2]=0;u=o}else{u=l}uw(b,n,u,0,1)|0;v=u}else{v=l}n=vx(a,m)|0;if((n|0)==0){i=v;j=t;break}else{l=v;m=n;h=t}}}if((j|0)==0|(i|0)==0){f=j;g=i;break}h=(c[(uw(b,j,i,0,1)|0)+8>>2]|0)+156|0;c[h>>2]=(c[h>>2]|0)+1e3;f=j;g=i}}while(0);i=sy(a)|0;if((i|0)==0){return}else{w=i}do{bq(w,b,f,g);w=ty(w)|0;}while((w|0)!=0);return}function cq(a){a=a|0;var b=0,d=0,e=0;b=a+8|0;d=(c[b>>2]|0)+152|0;e=c[d>>2]|0;if((e|0)==0){c[d>>2]=a;return a|0}if((e|0)==(a|0)){return a|0}else{a=cq(e)|0;c[(c[b>>2]|0)+152>>2]=a;return a|0}return 0}function dq(a,d){a=a|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=a+8|0;f=c[e>>2]|0;if((c[f+172>>2]|0)<1){g=f}else{h=1;i=f;while(1){dq(c[(c[i+176>>2]|0)+(h<<2)>>2]|0,0);f=c[e>>2]|0;if((h|0)<(c[f+172>>2]|0)){h=h+1|0;i=f}else{g=f;break}}}if((c[g+188>>2]|0)==0&(d|0)==0){return}b[g+224>>1]=32767;b[(c[e>>2]|0)+226>>1]=-1;g=ux(a)|0;if((g|0)==0){j=0}else{d=g;g=0;while(1){i=c[(c[d+8>>2]|0)+232>>2]|0;h=c[e>>2]|0;f=h+226|0;if((b[f>>1]|0)<(i|0)){b[f>>1]=i;k=c[e>>2]|0}else{k=h}h=k+224|0;if((b[h>>1]|0)>(i|0)){b[h>>1]=i;l=d}else{l=g}i=vx(a,d)|0;if((i|0)==0){j=l;break}else{d=i;g=l}}}c[(c[e>>2]|0)+252>>2]=j;return}function eq(a,b,d){a=a|0;b=b|0;d=d|0;var e=0,f=0,g=0;e=(c[b+8>>2]|0)+128|0;if((c[e>>2]|0)!=0){return}c[e>>2]=d;e=mw(a,b)|0;if((e|0)!=0){f=e;do{eq(a,c[((c[f>>2]&3|0)==2?f:f-32|0)+28>>2]|0,d);f=ow(a,f)|0;}while((f|0)!=0)}f=pw(a,b)|0;if((f|0)==0){return}else{g=f}do{eq(a,c[((c[g>>2]&3|0)==3?g:g+32|0)+28>>2]|0,d);g=qw(a,g)|0;}while((g|0)!=0);return}
+
+
+
+function iF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;d=a;e=d+b|0;f=e;g=c[a+4>>2]|0;a:do{if((g&1|0)==0){h=c[a>>2]|0;if((g&3|0)==0){return}i=d+(-h|0)|0;j=i;k=h+b|0;l=c[53378]|0;if(i>>>0<l>>>0){fc()}if((j|0)==(c[53379]|0)){m=d+(b+4)|0;if((c[m>>2]&3|0)!=3){n=j;o=k;break}c[53376]=k;c[m>>2]=c[m>>2]&-2;c[d+(4-h)>>2]=k|1;c[e>>2]=k;return}m=h>>>3;if(h>>>0<256>>>0){p=c[d+(8-h)>>2]|0;q=c[d+(12-h)>>2]|0;r=213536+(m<<1<<2)|0;do{if((p|0)!=(r|0)){if(p>>>0<l>>>0){fc()}if((c[p+12>>2]|0)==(j|0)){break}fc()}}while(0);if((q|0)==(p|0)){c[53374]=c[53374]&~(1<<m);n=j;o=k;break}do{if((q|0)==(r|0)){s=q+8|0}else{if(q>>>0<l>>>0){fc()}t=q+8|0;if((c[t>>2]|0)==(j|0)){s=t;break}fc()}}while(0);c[p+12>>2]=q;c[s>>2]=p;n=j;o=k;break}r=i;m=c[d+(24-h)>>2]|0;t=c[d+(12-h)>>2]|0;do{if((t|0)==(r|0)){u=16-h|0;v=d+(u+4)|0;w=c[v>>2]|0;if((w|0)==0){x=d+u|0;u=c[x>>2]|0;if((u|0)==0){y=0;break}else{z=u;A=x}}else{z=w;A=v}while(1){v=z+20|0;w=c[v>>2]|0;if((w|0)!=0){z=w;A=v;continue}v=z+16|0;w=c[v>>2]|0;if((w|0)==0){break}else{z=w;A=v}}if(A>>>0<l>>>0){fc()}else{c[A>>2]=0;y=z;break}}else{v=c[d+(8-h)>>2]|0;if(v>>>0<l>>>0){fc()}w=v+12|0;if((c[w>>2]|0)!=(r|0)){fc()}x=t+8|0;if((c[x>>2]|0)==(r|0)){c[w>>2]=t;c[x>>2]=v;y=t;break}else{fc()}}}while(0);if((m|0)==0){n=j;o=k;break}t=d+(28-h)|0;l=213800+(c[t>>2]<<2)|0;do{if((r|0)==(c[l>>2]|0)){c[l>>2]=y;if((y|0)!=0){break}c[53375]=c[53375]&~(1<<c[t>>2]);n=j;o=k;break a}else{if(m>>>0<(c[53378]|0)>>>0){fc()}i=m+16|0;if((c[i>>2]|0)==(r|0)){c[i>>2]=y}else{c[m+20>>2]=y}if((y|0)==0){n=j;o=k;break a}}}while(0);if(y>>>0<(c[53378]|0)>>>0){fc()}c[y+24>>2]=m;r=16-h|0;t=c[d+r>>2]|0;do{if((t|0)!=0){if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[y+16>>2]=t;c[t+24>>2]=y;break}}}while(0);t=c[d+(r+4)>>2]|0;if((t|0)==0){n=j;o=k;break}if(t>>>0<(c[53378]|0)>>>0){fc()}else{c[y+20>>2]=t;c[t+24>>2]=y;n=j;o=k;break}}else{n=a;o=b}}while(0);a=c[53378]|0;if(e>>>0<a>>>0){fc()}y=d+(b+4)|0;z=c[y>>2]|0;do{if((z&2|0)==0){if((f|0)==(c[53380]|0)){A=(c[53377]|0)+o|0;c[53377]=A;c[53380]=n;c[n+4>>2]=A|1;if((n|0)!=(c[53379]|0)){return}c[53379]=0;c[53376]=0;return}if((f|0)==(c[53379]|0)){A=(c[53376]|0)+o|0;c[53376]=A;c[53379]=n;c[n+4>>2]=A|1;c[n+A>>2]=A;return}A=(z&-8)+o|0;s=z>>>3;b:do{if(z>>>0<256>>>0){g=c[d+(b+8)>>2]|0;t=c[d+(b+12)>>2]|0;h=213536+(s<<1<<2)|0;do{if((g|0)!=(h|0)){if(g>>>0<a>>>0){fc()}if((c[g+12>>2]|0)==(f|0)){break}fc()}}while(0);if((t|0)==(g|0)){c[53374]=c[53374]&~(1<<s);break}do{if((t|0)==(h|0)){B=t+8|0}else{if(t>>>0<a>>>0){fc()}m=t+8|0;if((c[m>>2]|0)==(f|0)){B=m;break}fc()}}while(0);c[g+12>>2]=t;c[B>>2]=g}else{h=e;m=c[d+(b+24)>>2]|0;l=c[d+(b+12)>>2]|0;do{if((l|0)==(h|0)){i=d+(b+20)|0;p=c[i>>2]|0;if((p|0)==0){q=d+(b+16)|0;v=c[q>>2]|0;if((v|0)==0){C=0;break}else{D=v;E=q}}else{D=p;E=i}while(1){i=D+20|0;p=c[i>>2]|0;if((p|0)!=0){D=p;E=i;continue}i=D+16|0;p=c[i>>2]|0;if((p|0)==0){break}else{D=p;E=i}}if(E>>>0<a>>>0){fc()}else{c[E>>2]=0;C=D;break}}else{i=c[d+(b+8)>>2]|0;if(i>>>0<a>>>0){fc()}p=i+12|0;if((c[p>>2]|0)!=(h|0)){fc()}q=l+8|0;if((c[q>>2]|0)==(h|0)){c[p>>2]=l;c[q>>2]=i;C=l;break}else{fc()}}}while(0);if((m|0)==0){break}l=d+(b+28)|0;g=213800+(c[l>>2]<<2)|0;do{if((h|0)==(c[g>>2]|0)){c[g>>2]=C;if((C|0)!=0){break}c[53375]=c[53375]&~(1<<c[l>>2]);break b}else{if(m>>>0<(c[53378]|0)>>>0){fc()}t=m+16|0;if((c[t>>2]|0)==(h|0)){c[t>>2]=C}else{c[m+20>>2]=C}if((C|0)==0){break b}}}while(0);if(C>>>0<(c[53378]|0)>>>0){fc()}c[C+24>>2]=m;h=c[d+(b+16)>>2]|0;do{if((h|0)!=0){if(h>>>0<(c[53378]|0)>>>0){fc()}else{c[C+16>>2]=h;c[h+24>>2]=C;break}}}while(0);h=c[d+(b+20)>>2]|0;if((h|0)==0){break}if(h>>>0<(c[53378]|0)>>>0){fc()}else{c[C+20>>2]=h;c[h+24>>2]=C;break}}}while(0);c[n+4>>2]=A|1;c[n+A>>2]=A;if((n|0)!=(c[53379]|0)){F=A;break}c[53376]=A;return}else{c[y>>2]=z&-2;c[n+4>>2]=o|1;c[n+o>>2]=o;F=o}}while(0);o=F>>>3;if(F>>>0<256>>>0){z=o<<1;y=213536+(z<<2)|0;C=c[53374]|0;b=1<<o;do{if((C&b|0)==0){c[53374]=C|b;G=y;H=213536+(z+2<<2)|0}else{o=213536+(z+2<<2)|0;d=c[o>>2]|0;if(d>>>0>=(c[53378]|0)>>>0){G=d;H=o;break}fc()}}while(0);c[H>>2]=n;c[G+12>>2]=n;c[n+8>>2]=G;c[n+12>>2]=y;return}y=n;G=F>>>8;do{if((G|0)==0){I=0}else{if(F>>>0>16777215>>>0){I=31;break}H=(G+1048320|0)>>>16&8;z=G<<H;b=(z+520192|0)>>>16&4;C=z<<b;z=(C+245760|0)>>>16&2;o=14-(b|H|z)+(C<<z>>>15)|0;I=F>>>((o+7|0)>>>0)&1|o<<1}}while(0);G=213800+(I<<2)|0;c[n+28>>2]=I;c[n+20>>2]=0;c[n+16>>2]=0;o=c[53375]|0;z=1<<I;if((o&z|0)==0){c[53375]=o|z;c[G>>2]=y;c[n+24>>2]=G;c[n+12>>2]=n;c[n+8>>2]=n;return}z=c[G>>2]|0;if((I|0)==31){J=0}else{J=25-(I>>>1)|0}c:do{if((c[z+4>>2]&-8|0)==(F|0)){K=z}else{I=z;G=F<<J;while(1){L=I+16+(G>>>31<<2)|0;o=c[L>>2]|0;if((o|0)==0){break}if((c[o+4>>2]&-8|0)==(F|0)){K=o;break c}else{I=o;G=G<<1}}if(L>>>0<(c[53378]|0)>>>0){fc()}c[L>>2]=y;c[n+24>>2]=I;c[n+12>>2]=n;c[n+8>>2]=n;return}}while(0);L=K+8|0;F=c[L>>2]|0;J=c[53378]|0;if(K>>>0<J>>>0){fc()}if(F>>>0<J>>>0){fc()}c[F+12>>2]=y;c[L>>2]=y;c[n+8>>2]=F;c[n+12>>2]=K;c[n+24>>2]=0;return}function jF(b,e,f){b=b|0;e=e|0;f=f|0;var g=0,h=0,j=0,k=0,l=0.0,m=0,n=0,o=0,p=0,q=0,r=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0.0,P=0.0,Q=0,R=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,ea=0.0,fa=0.0,ga=0,ha=0,ia=0.0,ja=0.0,ka=0,la=0.0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0.0,va=0,wa=0.0,xa=0,ya=0.0,za=0,Aa=0,Ba=0,Ca=0.0,Da=0,Ea=0.0,Fa=0.0,Ga=0,Ha=0,Ia=0,Ja=0,Ka=0,La=0,Ma=0,Na=0,Oa=0,Pa=0,Ra=0,Sa=0,Ta=0,Ua=0,Va=0,Wa=0,Ya=0,Za=0,_a=0,$a=0,ab=0,bb=0,cb=0,db=0,eb=0,fb=0,gb=0,hb=0,ib=0,jb=0,kb=0,lb=0,mb=0,nb=0,ob=0,qb=0,rb=0,sb=0,tb=0,ub=0,vb=0,wb=0,xb=0,yb=0,zb=0,Ab=0,Bb=0,Cb=0,Db=0,Eb=0,Fb=0,Gb=0,Hb=0,Ib=0,Jb=0,Kb=0,Lb=0,Mb=0,Nb=0,Ob=0,Pb=0,Qb=0,Rb=0,Sb=0,Tb=0,Ub=0,Wb=0,Xb=0,Yb=0,Zb=0,_b=0,$b=0,ac=0,bc=0,cc=0,dc=0,ec=0,fc=0,gc=0,hc=0,ic=0,jc=0,kc=0,lc=0,mc=0,nc=0,oc=0,pc=0,qc=0,rc=0,sc=0,tc=0,uc=0,vc=0,wc=0.0,xc=0,yc=0,zc=0.0,Ac=0.0,Bc=0.0,Cc=0.0,Dc=0.0,Ec=0.0,Fc=0.0,Gc=0,Hc=0,Ic=0.0,Jc=0,Kc=0,Lc=0,Mc=0,Nc=0,Oc=0;g=i;i=i+512|0;h=g|0;if((e|0)==1){j=-1074;k=53}else if((e|0)==0){j=-149;k=24}else if((e|0)==2){j=-1074;k=53}else{l=0.0;i=g;return+l}e=b+4|0;m=b+100|0;do{n=c[e>>2]|0;if(n>>>0<(c[m>>2]|0)>>>0){c[e>>2]=n+1;o=d[n]|0}else{o=mF(b)|0}}while((Qa(o|0)|0)!=0);do{if((o|0)==45|(o|0)==43){n=1-(((o|0)==45)<<1)|0;p=c[e>>2]|0;if(p>>>0<(c[m>>2]|0)>>>0){c[e>>2]=p+1;q=d[p]|0;r=n;break}else{q=mF(b)|0;r=n;break}}else{q=o;r=1}}while(0);o=0;n=q;while(1){if((n|32|0)!=(a[95936+o|0]|0)){u=o;v=n;break}do{if(o>>>0<7>>>0){q=c[e>>2]|0;if(q>>>0<(c[m>>2]|0)>>>0){c[e>>2]=q+1;w=d[q]|0;break}else{w=mF(b)|0;break}}else{w=n}}while(0);q=o+1|0;if(q>>>0<8>>>0){o=q;n=w}else{u=q;v=w;break}}do{if((u|0)==3){x=23}else if((u|0)!=8){w=(f|0)==0;if(!(u>>>0<4>>>0|w)){if((u|0)==8){break}else{x=23;break}}a:do{if((u|0)==0){n=0;o=v;while(1){if((o|32|0)!=(a[141816+n|0]|0)){y=o;z=n;break a}do{if(n>>>0<2>>>0){q=c[e>>2]|0;if(q>>>0<(c[m>>2]|0)>>>0){c[e>>2]=q+1;A=d[q]|0;break}else{A=mF(b)|0;break}}else{A=o}}while(0);q=n+1|0;if(q>>>0<3>>>0){n=q;o=A}else{y=A;z=q;break}}}else{y=v;z=u}}while(0);if((z|0)==0){do{if((y|0)==48){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;B=d[o]|0}else{B=mF(b)|0}if((B|32|0)!=120){if((c[m>>2]|0)==0){C=48;break}c[e>>2]=(c[e>>2]|0)-1;C=48;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0;E=0}else{D=mF(b)|0;E=0}while(1){if((D|0)==46){x=70;break}else if((D|0)!=48){F=D;G=0;I=0;J=0;K=0;L=E;M=0;N=0;O=1.0;P=0.0;Q=0;break}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;D=d[o]|0;E=1;continue}else{D=mF(b)|0;E=1;continue}}b:do{if((x|0)==70){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;R=d[o]|0}else{R=mF(b)|0}if((R|0)==48){T=-1;U=-1}else{F=R;G=0;I=0;J=0;K=0;L=E;M=1;N=0;O=1.0;P=0.0;Q=0;break}while(1){o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;V=d[o]|0}else{V=mF(b)|0}if((V|0)!=48){F=V;G=0;I=0;J=T;K=U;L=1;M=1;N=0;O=1.0;P=0.0;Q=0;break b}o=EF(U,T,-1,-1)|0;T=H;U=o}}}while(0);c:while(1){o=F-48|0;do{if(o>>>0<10>>>0){W=o;x=84}else{n=F|32;q=(F|0)==46;if(!((n-97|0)>>>0<6>>>0|q)){X=F;break c}if(q){if((M|0)==0){Y=G;Z=I;_=G;$=I;aa=L;ba=1;ca=N;ea=O;fa=P;ga=Q;break}else{X=46;break c}}else{W=(F|0)>57?n-87|0:o;x=84;break}}}while(0);if((x|0)==84){x=0;o=0;do{if((G|0)<(o|0)|(G|0)==(o|0)&I>>>0<8>>>0){ha=N;ia=O;ja=P;ka=W+(Q<<4)|0}else{n=0;if((G|0)<(n|0)|(G|0)==(n|0)&I>>>0<14>>>0){la=O*.0625;ha=N;ia=la;ja=P+la*+(W|0);ka=Q;break}if(!((W|0)!=0&(N|0)==0)){ha=N;ia=O;ja=P;ka=Q;break}ha=1;ia=O;ja=P+O*.5;ka=Q}}while(0);o=EF(I,G,1,0)|0;Y=H;Z=o;_=J;$=K;aa=1;ba=M;ca=ha;ea=ia;fa=ja;ga=ka}o=c[e>>2]|0;if(o>>>0<(c[m>>2]|0)>>>0){c[e>>2]=o+1;F=d[o]|0;G=Y;I=Z;J=_;K=$;L=aa;M=ba;N=ca;O=ea;P=fa;Q=ga;continue}else{F=mF(b)|0;G=Y;I=Z;J=_;K=$;L=aa;M=ba;N=ca;O=ea;P=fa;Q=ga;continue}}if((L|0)==0){o=(c[m>>2]|0)==0;if(!o){c[e>>2]=(c[e>>2]|0)-1}do{if(w){lF(b,0)}else{if(o){break}n=c[e>>2]|0;c[e>>2]=n-1;if((M|0)==0){break}c[e>>2]=n-2}}while(0);l=+(r|0)*0.0;i=g;return+l}o=(M|0)==0;n=o?I:K;q=o?G:J;o=0;if((G|0)<(o|0)|(G|0)==(o|0)&I>>>0<8>>>0){o=Q;p=G;ma=I;while(1){na=o<<4;oa=EF(ma,p,1,0)|0;pa=H;qa=0;if((pa|0)<(qa|0)|(pa|0)==(qa|0)&oa>>>0<8>>>0){o=na;p=pa;ma=oa}else{ra=na;break}}}else{ra=Q}do{if((X|32|0)==112){ma=kF(b,f)|0;p=H;if(!((ma|0)==0&(p|0)==(-2147483648|0))){sa=p;ta=ma;break}if(w){lF(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){sa=0;ta=0;break}c[e>>2]=(c[e>>2]|0)-1;sa=0;ta=0;break}}else{if((c[m>>2]|0)==0){sa=0;ta=0;break}c[e>>2]=(c[e>>2]|0)-1;sa=0;ta=0}}while(0);ma=EF(n<<2|0>>>30,q<<2|n>>>30,-32,-1)|0;p=EF(ma,H,ta,sa)|0;ma=H;if((ra|0)==0){l=+(r|0)*0.0;i=g;return+l}o=0;if((ma|0)>(o|0)|(ma|0)==(o|0)&p>>>0>(-j|0)>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}o=j-106|0;na=(o|0)<0|0?-1:0;if((ma|0)<(na|0)|(ma|0)==(na|0)&p>>>0<o>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((ra|0)>-1){o=ra;la=P;na=ma;oa=p;while(1){pa=o<<1;if(la<.5){ua=la;va=pa}else{ua=la+-1.0;va=pa|1}wa=la+ua;pa=EF(oa,na,-1,-1)|0;qa=H;if((va|0)>-1){o=va;la=wa;na=qa;oa=pa}else{xa=va;ya=wa;za=qa;Aa=pa;break}}}else{xa=ra;ya=P;za=ma;Aa=p}oa=0;na=FF(32,0,j,(j|0)<0|0?-1:0)|0;o=EF(Aa,za,na,H)|0;na=H;if((oa|0)>(na|0)|(oa|0)==(na|0)&k>>>0>o>>>0){na=o;Ba=(na|0)<0?0:na}else{Ba=k}do{if((Ba|0)<53){la=+(r|0);wa=+pb(+(+nF(1.0,84-Ba|0)),+la);if(!((Ba|0)<32&ya!=0.0)){Ca=ya;Da=xa;Ea=wa;Fa=la;break}na=xa&1;Ca=(na|0)==0?0.0:ya;Da=(na^1)+xa|0;Ea=wa;Fa=la}else{Ca=ya;Da=xa;Ea=0.0;Fa=+(r|0)}}while(0);la=Fa*Ca+(Ea+Fa*+(Da>>>0>>>0))-Ea;if(la==0.0){c[(Vb()|0)>>2]=34}l=+oF(la,Aa);i=g;return+l}else{C=y}}while(0);p=j+k|0;ma=-p|0;na=C;o=0;while(1){if((na|0)==46){x=139;break}else if((na|0)!=48){Ga=na;Ha=0;Ia=o;Ja=0;Ka=0;break}oa=c[e>>2]|0;if(oa>>>0<(c[m>>2]|0)>>>0){c[e>>2]=oa+1;na=d[oa]|0;o=1;continue}else{na=mF(b)|0;o=1;continue}}d:do{if((x|0)==139){na=c[e>>2]|0;if(na>>>0<(c[m>>2]|0)>>>0){c[e>>2]=na+1;La=d[na]|0}else{La=mF(b)|0}if((La|0)==48){Ma=-1;Na=-1}else{Ga=La;Ha=1;Ia=o;Ja=0;Ka=0;break}while(1){na=c[e>>2]|0;if(na>>>0<(c[m>>2]|0)>>>0){c[e>>2]=na+1;Oa=d[na]|0}else{Oa=mF(b)|0}if((Oa|0)!=48){Ga=Oa;Ha=1;Ia=1;Ja=Ma;Ka=Na;break d}na=EF(Na,Ma,-1,-1)|0;Ma=H;Na=na}}}while(0);o=h|0;c[o>>2]=0;na=Ga-48|0;oa=(Ga|0)==46;e:do{if(na>>>0<10>>>0|oa){n=h+496|0;q=Ja;pa=Ka;qa=0;Pa=0;Ra=0;Sa=Ia;Ta=Ha;Ua=0;Va=0;Wa=Ga;Ya=na;Za=oa;while(1){do{if(Za){if((Ta|0)==0){_a=Va;$a=Ua;ab=1;bb=Sa;cb=Ra;db=qa;eb=Pa;fb=qa;gb=Pa}else{hb=q;ib=pa;jb=qa;kb=Pa;lb=Ra;mb=Sa;nb=Ua;ob=Va;qb=Wa;break e}}else{rb=EF(Pa,qa,1,0)|0;sb=H;tb=(Wa|0)!=48;if((Ua|0)>=125){if(!tb){_a=Va;$a=Ua;ab=Ta;bb=Sa;cb=Ra;db=sb;eb=rb;fb=q;gb=pa;break}c[n>>2]=c[n>>2]|1;_a=Va;$a=Ua;ab=Ta;bb=Sa;cb=Ra;db=sb;eb=rb;fb=q;gb=pa;break}ub=h+(Ua<<2)|0;if((Va|0)==0){vb=Ya}else{vb=Wa-48+((c[ub>>2]|0)*10|0)|0}c[ub>>2]=vb;ub=Va+1|0;wb=(ub|0)==9;_a=wb?0:ub;$a=(wb&1)+Ua|0;ab=Ta;bb=1;cb=tb?rb:Ra;db=sb;eb=rb;fb=q;gb=pa}}while(0);rb=c[e>>2]|0;if(rb>>>0<(c[m>>2]|0)>>>0){c[e>>2]=rb+1;xb=d[rb]|0}else{xb=mF(b)|0}rb=xb-48|0;sb=(xb|0)==46;if(rb>>>0<10>>>0|sb){q=fb;pa=gb;qa=db;Pa=eb;Ra=cb;Sa=bb;Ta=ab;Ua=$a;Va=_a;Wa=xb;Ya=rb;Za=sb}else{yb=fb;zb=gb;Ab=db;Bb=eb;Cb=cb;Db=bb;Eb=ab;Fb=$a;Gb=_a;Hb=xb;x=162;break}}}else{yb=Ja;zb=Ka;Ab=0;Bb=0;Cb=0;Db=Ia;Eb=Ha;Fb=0;Gb=0;Hb=Ga;x=162}}while(0);if((x|0)==162){oa=(Eb|0)==0;hb=oa?Ab:yb;ib=oa?Bb:zb;jb=Ab;kb=Bb;lb=Cb;mb=Db;nb=Fb;ob=Gb;qb=Hb}oa=(mb|0)!=0;do{if(oa){if((qb|32|0)!=101){x=171;break}na=kF(b,f)|0;Za=H;do{if((na|0)==0&(Za|0)==(-2147483648|0)){if(w){lF(b,0);l=0.0;i=g;return+l}else{if((c[m>>2]|0)==0){Ib=0;Jb=0;break}c[e>>2]=(c[e>>2]|0)-1;Ib=0;Jb=0;break}}else{Ib=Za;Jb=na}}while(0);na=EF(Jb,Ib,ib,hb)|0;Kb=H;Lb=na}else{x=171}}while(0);do{if((x|0)==171){if((qb|0)<=-1){Kb=hb;Lb=ib;break}if((c[m>>2]|0)==0){Kb=hb;Lb=ib;break}c[e>>2]=(c[e>>2]|0)-1;Kb=hb;Lb=ib}}while(0);if(!oa){c[(Vb()|0)>>2]=22;lF(b,0);l=0.0;i=g;return+l}na=c[o>>2]|0;if((na|0)==0){l=+(r|0)*0.0;i=g;return+l}Za=0;do{if((Lb|0)==(kb|0)&(Kb|0)==(jb|0)&((jb|0)<(Za|0)|(jb|0)==(Za|0)&kb>>>0<10>>>0)){if(k>>>0<=30>>>0){if((na>>>(k>>>0)|0)!=0){break}}l=+(r|0)*+(na>>>0>>>0);i=g;return+l}}while(0);na=(j|0)/-2|0;Za=(na|0)<0|0?-1:0;if((Kb|0)>(Za|0)|(Kb|0)==(Za|0)&Lb>>>0>na>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*1.7976931348623157e+308*1.7976931348623157e+308;i=g;return+l}na=j-106|0;Za=(na|0)<0|0?-1:0;if((Kb|0)<(Za|0)|(Kb|0)==(Za|0)&Lb>>>0<na>>>0){c[(Vb()|0)>>2]=34;l=+(r|0)*2.2250738585072014e-308*2.2250738585072014e-308;i=g;return+l}if((ob|0)==0){Mb=nb}else{if((ob|0)<9){na=h+(nb<<2)|0;Za=ob;oa=c[na>>2]|0;do{oa=oa*10|0;Za=Za+1|0;}while((Za|0)<9);c[na>>2]=oa}Mb=nb+1|0}Za=Lb;do{if((lb|0)<9){if(!((lb|0)<=(Za|0)&(Za|0)<18)){break}if((Za|0)==9){l=+(r|0)*+((c[o>>2]|0)>>>0>>>0);i=g;return+l}if((Za|0)<9){l=+(r|0)*+((c[o>>2]|0)>>>0>>>0)/+(c[29728+(8-Za<<2)>>2]|0);i=g;return+l}Ya=k+27+(Za*-3|0)|0;Wa=c[o>>2]|0;if((Ya|0)<=30){if((Wa>>>(Ya>>>0)|0)!=0){break}}l=+(r|0)*+(Wa>>>0>>>0)*+(c[29728+(Za-10<<2)>>2]|0);i=g;return+l}}while(0);o=(Za|0)%9|0;if((o|0)==0){Nb=0;Ob=Mb;Pb=0;Qb=Za}else{oa=(Za|0)>-1?o:o+9|0;o=c[29728+(8-oa<<2)>>2]|0;do{if((Mb|0)==0){Rb=0;Sb=0;Tb=Za}else{na=1e9/(o|0)|0;Wa=Za;Ya=0;Va=0;Ua=0;while(1){Ta=h+(Va<<2)|0;Sa=c[Ta>>2]|0;Ra=((Sa>>>0)/(o>>>0)|0)+Ua|0;c[Ta>>2]=Ra;Ub=da((Sa>>>0)%(o>>>0)|0,na)|0;Sa=Va+1|0;if((Va|0)==(Ya|0)&(Ra|0)==0){Wb=Sa&127;Xb=Wa-9|0}else{Wb=Ya;Xb=Wa}if((Sa|0)==(Mb|0)){break}else{Wa=Xb;Ya=Wb;Va=Sa;Ua=Ub}}if((Ub|0)==0){Rb=Mb;Sb=Wb;Tb=Xb;break}c[h+(Mb<<2)>>2]=Ub;Rb=Mb+1|0;Sb=Wb;Tb=Xb}}while(0);Nb=Sb;Ob=Rb;Pb=0;Qb=9-oa+Tb|0}f:while(1){o=h+(Nb<<2)|0;if((Qb|0)<18){Za=Ob;Ua=Pb;while(1){Va=0;Ya=Za+127|0;Wa=Za;while(1){na=Ya&127;Sa=h+(na<<2)|0;Ra=c[Sa>>2]|0;Ta=EF(Ra<<29|0>>>3,0<<29|Ra>>>3,Va,0)|0;Ra=H;Pa=0;if(Ra>>>0>Pa>>>0|Ra>>>0==Pa>>>0&Ta>>>0>1e9>>>0){Pa=PF(Ta,Ra,1e9,0)|0;qa=QF(Ta,Ra,1e9,0)|0;Yb=Pa;Zb=qa}else{Yb=0;Zb=Ta}c[Sa>>2]=Zb;Sa=(na|0)==(Nb|0);if((na|0)!=(Wa+127&127|0)|Sa){_b=Wa}else{_b=(Zb|0)==0?na:Wa}if(Sa){break}else{Va=Yb;Ya=na-1|0;Wa=_b}}Wa=Ua-29|0;if((Yb|0)==0){Za=_b;Ua=Wa}else{$b=Wa;ac=_b;bc=Yb;break}}}else{if((Qb|0)==18){cc=Ob;dc=Pb}else{ec=Nb;fc=Ob;gc=Pb;hc=Qb;break}while(1){if((c[o>>2]|0)>>>0>=9007199>>>0){ec=Nb;fc=cc;gc=dc;hc=18;break f}Ua=0;Za=cc+127|0;Wa=cc;while(1){Ya=Za&127;Va=h+(Ya<<2)|0;na=c[Va>>2]|0;Sa=EF(na<<29|0>>>3,0<<29|na>>>3,Ua,0)|0;na=H;Ta=0;if(na>>>0>Ta>>>0|na>>>0==Ta>>>0&Sa>>>0>1e9>>>0){Ta=PF(Sa,na,1e9,0)|0;qa=QF(Sa,na,1e9,0)|0;ic=Ta;jc=qa}else{ic=0;jc=Sa}c[Va>>2]=jc;Va=(Ya|0)==(Nb|0);if((Ya|0)!=(Wa+127&127|0)|Va){kc=Wa}else{kc=(jc|0)==0?Ya:Wa}if(Va){break}else{Ua=ic;Za=Ya-1|0;Wa=kc}}Wa=dc-29|0;if((ic|0)==0){cc=kc;dc=Wa}else{$b=Wa;ac=kc;bc=ic;break}}}o=Nb+127&127;if((o|0)==(ac|0)){Wa=ac+127&127;Za=h+((ac+126&127)<<2)|0;c[Za>>2]=c[Za>>2]|c[h+(Wa<<2)>>2];lc=Wa}else{lc=ac}c[h+(o<<2)>>2]=bc;Nb=o;Ob=lc;Pb=$b;Qb=Qb+9|0}g:while(1){mc=fc+1&127;oa=h+((fc+127&127)<<2)|0;o=ec;Wa=gc;Za=hc;while(1){Ua=(Za|0)==18;Ya=(Za|0)>27?9:1;nc=o;oc=Wa;while(1){Va=0;while(1){Sa=Va+nc&127;if((Sa|0)==(fc|0)){pc=2;break}qa=c[h+(Sa<<2)>>2]|0;Sa=c[29720+(Va<<2)>>2]|0;if(qa>>>0<Sa>>>0){pc=2;break}Ta=Va+1|0;if(qa>>>0>Sa>>>0){pc=Va;break}if((Ta|0)<2){Va=Ta}else{pc=Ta;break}}if((pc|0)==2&Ua){break g}qc=Ya+oc|0;if((nc|0)==(fc|0)){nc=fc;oc=qc}else{break}}Ua=(1<<Ya)-1|0;Va=1e9>>>(Ya>>>0);rc=Za;sc=nc;Ta=nc;tc=0;do{Sa=h+(Ta<<2)|0;qa=c[Sa>>2]|0;na=(qa>>>(Ya>>>0))+tc|0;c[Sa>>2]=na;tc=da(qa&Ua,Va)|0;qa=(Ta|0)==(sc|0)&(na|0)==0;Ta=Ta+1&127;rc=qa?rc-9|0:rc;sc=qa?Ta:sc;}while((Ta|0)!=(fc|0));if((tc|0)==0){o=sc;Wa=qc;Za=rc;continue}if((mc|0)!=(sc|0)){break}c[oa>>2]=c[oa>>2]|1;o=sc;Wa=qc;Za=rc}c[h+(fc<<2)>>2]=tc;ec=sc;fc=mc;gc=qc;hc=rc}Za=nc&127;if((Za|0)==(fc|0)){c[h+(mc-1<<2)>>2]=0;uc=mc}else{uc=fc}la=+((c[h+(Za<<2)>>2]|0)>>>0>>>0);Za=nc+1&127;if((Za|0)==(uc|0)){Wa=uc+1&127;c[h+(Wa-1<<2)>>2]=0;vc=Wa}else{vc=uc}wa=+(r|0);wc=wa*(la*1.0e9+ +((c[h+(Za<<2)>>2]|0)>>>0>>>0));Za=oc+53|0;Wa=Za-j|0;if((Wa|0)<(k|0)){xc=(Wa|0)<0?0:Wa;yc=1}else{xc=k;yc=0}if((xc|0)<53){la=+pb(+(+nF(1.0,105-xc|0)),+wc);zc=+Xa(+wc,+(+nF(1.0,53-xc|0)));Ac=la;Bc=zc;Cc=la+(wc-zc)}else{Ac=0.0;Bc=0.0;Cc=wc}o=nc+2&127;do{if((o|0)==(vc|0)){Dc=Bc}else{oa=c[h+(o<<2)>>2]|0;do{if(oa>>>0<5e8>>>0){if((oa|0)==0){if((nc+3&127|0)==(vc|0)){Ec=Bc;break}}Ec=wa*.25+Bc}else{if(oa>>>0>5e8>>>0){Ec=wa*.75+Bc;break}if((nc+3&127|0)==(vc|0)){Ec=wa*.5+Bc;break}else{Ec=wa*.75+Bc;break}}}while(0);if((53-xc|0)<=1){Dc=Ec;break}if(+Xa(+Ec,+1.0)!=0.0){Dc=Ec;break}Dc=Ec+1.0}}while(0);wa=Cc+Dc-Ac;do{if((Za&2147483647|0)>(-2-p|0)){if(+S(+wa)<9007199254740992.0){Fc=wa;Gc=yc;Hc=oc}else{Fc=wa*.5;Gc=(yc|0)!=0&(xc|0)==(Wa|0)?0:yc;Hc=oc+1|0}if((Hc+50|0)<=(ma|0)){if(!((Gc|0)!=0&Dc!=0.0)){Ic=Fc;Jc=Hc;break}}c[(Vb()|0)>>2]=34;Ic=Fc;Jc=Hc}else{Ic=wa;Jc=oc}}while(0);l=+oF(Ic,Jc);i=g;return+l}else if((z|0)==3){ma=c[e>>2]|0;if(ma>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ma+1;Kc=d[ma]|0}else{Kc=mF(b)|0}if((Kc|0)==40){Lc=1}else{if((c[m>>2]|0)==0){l=+s;i=g;return+l}c[e>>2]=(c[e>>2]|0)-1;l=+s;i=g;return+l}while(1){ma=c[e>>2]|0;if(ma>>>0<(c[m>>2]|0)>>>0){c[e>>2]=ma+1;Mc=d[ma]|0}else{Mc=mF(b)|0}if(!((Mc-48|0)>>>0<10>>>0|(Mc-65|0)>>>0<26>>>0)){if(!((Mc-97|0)>>>0<26>>>0|(Mc|0)==95)){break}}Lc=Lc+1|0}if((Mc|0)==41){l=+s;i=g;return+l}ma=(c[m>>2]|0)==0;if(!ma){c[e>>2]=(c[e>>2]|0)-1}if(w){c[(Vb()|0)>>2]=22;lF(b,0);l=0.0;i=g;return+l}if((Lc|0)==0|ma){l=+s;i=g;return+l}else{Nc=Lc}while(1){ma=Nc-1|0;c[e>>2]=(c[e>>2]|0)-1;if((ma|0)==0){l=+s;break}else{Nc=ma}}i=g;return+l}else{if((c[m>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)-1}c[(Vb()|0)>>2]=22;lF(b,0);l=0.0;i=g;return+l}}}while(0);do{if((x|0)==23){b=(c[m>>2]|0)==0;if(!b){c[e>>2]=(c[e>>2]|0)-1}if(u>>>0<4>>>0|(f|0)==0|b){break}else{Oc=u}do{c[e>>2]=(c[e>>2]|0)-1;Oc=Oc-1|0;}while(Oc>>>0>3>>>0)}}while(0);l=+(r|0)*t;i=g;return+l}function kF(a,b){a=a|0;b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0;e=a+4|0;f=c[e>>2]|0;g=a+100|0;if(f>>>0<(c[g>>2]|0)>>>0){c[e>>2]=f+1;h=d[f]|0}else{h=mF(a)|0}do{if((h|0)==45|(h|0)==43){f=(h|0)==45|0;i=c[e>>2]|0;if(i>>>0<(c[g>>2]|0)>>>0){c[e>>2]=i+1;j=d[i]|0}else{j=mF(a)|0}if((j-48|0)>>>0<10>>>0|(b|0)==0){k=f;l=j;break}if((c[g>>2]|0)==0){k=f;l=j;break}c[e>>2]=(c[e>>2]|0)-1;k=f;l=j}else{k=0;l=h}}while(0);if((l-48|0)>>>0>9>>>0){if((c[g>>2]|0)==0){m=-2147483648;n=0;return(H=m,n)|0}c[e>>2]=(c[e>>2]|0)-1;m=-2147483648;n=0;return(H=m,n)|0}else{o=l;p=0}while(1){q=o-48+p|0;l=c[e>>2]|0;if(l>>>0<(c[g>>2]|0)>>>0){c[e>>2]=l+1;r=d[l]|0}else{r=mF(a)|0}if(!((r-48|0)>>>0<10>>>0&(q|0)<214748364)){break}o=r;p=q*10|0}p=q;o=(q|0)<0|0?-1:0;if((r-48|0)>>>0<10>>>0){q=r;l=o;h=p;while(1){j=OF(h,l,10,0)|0;b=H;f=EF(q,(q|0)<0|0?-1:0,-48,-1)|0;i=EF(f,H,j,b)|0;b=H;j=c[e>>2]|0;if(j>>>0<(c[g>>2]|0)>>>0){c[e>>2]=j+1;s=d[j]|0}else{s=mF(a)|0}j=21474836;if((s-48|0)>>>0<10>>>0&((b|0)<(j|0)|(b|0)==(j|0)&i>>>0<2061584302>>>0)){q=s;l=b;h=i}else{t=s;u=b;v=i;break}}}else{t=r;u=o;v=p}if((t-48|0)>>>0<10>>>0){do{t=c[e>>2]|0;if(t>>>0<(c[g>>2]|0)>>>0){c[e>>2]=t+1;w=d[t]|0}else{w=mF(a)|0}}while((w-48|0)>>>0<10>>>0)}if((c[g>>2]|0)!=0){c[e>>2]=(c[e>>2]|0)-1}e=(k|0)!=0;k=FF(0,0,v,u)|0;m=e?H:u;n=e?k:v;return(H=m,n)|0}function lF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0;c[a+104>>2]=b;d=c[a+8>>2]|0;e=c[a+4>>2]|0;f=d-e|0;c[a+108>>2]=f;if((b|0)!=0&(f|0)>(b|0)){c[a+100>>2]=e+b;return}else{c[a+100>>2]=d;return}}function mF(b){b=b|0;var e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0;e=b+104|0;f=c[e>>2]|0;if((f|0)==0){g=3}else{if((c[b+108>>2]|0)<(f|0)){g=3}}do{if((g|0)==3){f=qF(b)|0;if((f|0)<0){break}h=c[e>>2]|0;i=c[b+8>>2]|0;do{if((h|0)==0){g=8}else{j=c[b+4>>2]|0;k=h-(c[b+108>>2]|0)-1|0;if((i-j|0)<=(k|0)){g=8;break}c[b+100>>2]=j+k}}while(0);if((g|0)==8){c[b+100>>2]=i}h=c[b+4>>2]|0;if((i|0)!=0){k=b+108|0;c[k>>2]=i+1-h+(c[k>>2]|0)}k=h-1|0;if((d[k]|0|0)==(f|0)){l=f;return l|0}a[k]=f;l=f;return l|0}}while(0);c[b+100>>2]=0;l=-1;return l|0}function nF(a,b){a=+a;b=b|0;var d=0.0,e=0,f=0.0,g=0;do{if((b|0)>1023){d=a*8.98846567431158e+307;e=b-1023|0;if((e|0)<=1023){f=d;g=e;break}e=b-2046|0;f=d*8.98846567431158e+307;g=(e|0)>1023?1023:e}else{if((b|0)>=-1022){f=a;g=b;break}d=a*2.2250738585072014e-308;e=b+1022|0;if((e|0)>=-1022){f=d;g=e;break}e=b+2044|0;f=d*2.2250738585072014e-308;g=(e|0)<-1022?-1022:e}}while(0);return+(f*(c[k>>2]=0<<20|0>>>12,c[k+4>>2]=g+1023<<20|0>>>12,+h[k>>3]))}function oF(a,b){a=+a;b=b|0;return+(+nF(a,b))}function pF(b){b=b|0;var d=0,e=0,f=0,g=0,h=0;d=b+74|0;e=a[d]|0;a[d]=e-1&255|e;e=b+20|0;d=b+44|0;if((c[e>>2]|0)>>>0>(c[d>>2]|0)>>>0){Hc[c[b+36>>2]&63](b,0,0)|0}c[b+16>>2]=0;c[b+28>>2]=0;c[e>>2]=0;e=b|0;f=c[e>>2]|0;if((f&20|0)==0){g=c[d>>2]|0;c[b+8>>2]=g;c[b+4>>2]=g;h=0;return h|0}if((f&4|0)==0){h=-1;return h|0}c[e>>2]=f|32;h=-1;return h|0}function qF(a){a=a|0;var b=0,e=0,f=0,g=0;b=i;i=i+8|0;e=b|0;if((c[a+8>>2]|0)==0){if((pF(a)|0)==0){f=3}else{g=-1}}else{f=3}do{if((f|0)==3){if((Hc[c[a+32>>2]&63](a,e,1)|0)!=1){g=-1;break}g=d[e]|0}}while(0);i=b;return g|0}function rF(a){a=a|0;return+(+sF(a,0))}function sF(a,b){a=a|0;b=b|0;var d=0,e=0,f=0,g=0,h=0.0,j=0,k=0,l=0,m=0;d=i;i=i+112|0;e=d|0;vF(e|0,0,112)|0;f=e+4|0;c[f>>2]=a;g=e+8|0;c[g>>2]=-1;c[e+44>>2]=a;c[e+76>>2]=-1;lF(e,0);h=+jF(e,1,1);j=(c[f>>2]|0)-(c[g>>2]|0)+(c[e+108>>2]|0)|0;if((b|0)==0){k=112;l=0;i=d;return+h}if((j|0)==0){m=a}else{m=a+j|0}c[b>>2]=m;k=112;l=0;i=d;return+h}function tF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0;f=b|0;if((b&3)==(d&3)){while(b&3){if((e|0)==0)return f|0;a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}while((e|0)>=4){c[b>>2]=c[d>>2];b=b+4|0;d=d+4|0;e=e-4|0}}while((e|0)>0){a[b]=a[d]|0;b=b+1|0;d=d+1|0;e=e-1|0}return f|0}function uF(b,c,d){b=b|0;c=c|0;d=d|0;var e=0;if((c|0)<(b|0)&(b|0)<(c+d|0)){e=b;c=c+d|0;b=b+d|0;while((d|0)>0){b=b-1|0;c=c-1|0;d=d-1|0;a[b]=a[c]|0}b=e}else{tF(b,c,d)|0}return b|0}function vF(b,d,e){b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0;f=b+e|0;if((e|0)>=20){d=d&255;g=b&3;h=d|d<<8|d<<16|d<<24;i=f&~3;if(g){g=b+4-g|0;while((b|0)<(g|0)){a[b]=d;b=b+1|0}}while((b|0)<(i|0)){c[b>>2]=h;b=b+4|0}}while((b|0)<(f|0)){a[b]=d;b=b+1|0}return b-e|0}function wF(a,b,c){a=a|0;b=b|0;c=c|0;var e=0,f=0,g=0;while((e|0)<(c|0)){f=d[a+e|0]|0;g=d[b+e|0]|0;if((f|0)!=(g|0))return((f|0)>(g|0)?1:-1)|0;e=e+1|0}return 0}function xF(b){b=b|0;var c=0;c=b;while(a[c]|0){c=c+1|0}return c-b|0}function yF(a){a=a|0;if((a|0)<65)return a|0;if((a|0)>90)return a|0;return a-65+97|0}function zF(b,c){b=b|0;c=c|0;var d=0;do{a[b+d|0]=a[c+d|0];d=d+1|0}while(a[c+(d-1)|0]|0);return b|0}function AF(b,c){b=b|0;c=c|0;var d=0,e=0;d=b+(xF(b)|0)|0;do{a[d+e|0]=a[c+e|0];e=e+1|0}while(a[c+(e-1)|0]|0);return b|0}function BF(a,b,d){a=a|0;b=b|0;d=d|0;var e=0;w=w+1|0;c[a>>2]=w;while((e|0)<40){if((c[d+(e<<2)>>2]|0)==0){c[d+(e<<2)>>2]=w;c[d+((e<<2)+4)>>2]=b;c[d+((e<<2)+8)>>2]=0;return 0}e=e+2|0}sb(116);sb(111);sb(111);sb(32);sb(109);sb(97);sb(110);sb(121);sb(32);sb(115);sb(101);sb(116);sb(106);sb(109);sb(112);sb(115);sb(32);sb(105);sb(110);sb(32);sb(97);sb(32);sb(102);sb(117);sb(110);sb(99);sb(116);sb(105);sb(111);sb(110);sb(32);sb(99);sb(97);sb(108);sb(108);sb(44);sb(32);sb(98);sb(117);sb(105);sb(108);sb(100);sb(32);sb(119);sb(105);sb(116);sb(104);sb(32);sb(97);sb(32);sb(104);sb(105);sb(103);sb(104);sb(101);sb(114);sb(32);sb(118);sb(97);sb(108);sb(117);sb(101);sb(32);sb(102);sb(111);sb(114);sb(32);sb(77);sb(65);sb(88);sb(95);sb(83);sb(69);sb(84);sb(74);sb(77);sb(80);sb(83);sb(10);ea(0);return 0}function CF(a,b){a=a|0;b=b|0;var d=0,e=0;while((d|0)<20){e=c[b+(d<<2)>>2]|0;if((e|0)==0)break;if((e|0)==(a|0)){return c[b+((d<<2)+4)>>2]|0}d=d+2|0}return 0}function DF(b,c,d){b=b|0;c=c|0;d=d|0;var e=0,f=0;while((e|0)<(d|0)){a[b+e|0]=f?0:a[c+e|0]|0;f=f?1:(a[c+e|0]|0)==0;e=e+1|0}return b|0}function EF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=a+c>>>0;return(H=b+d+(e>>>0<a>>>0|0)>>>0,e|0)|0}function FF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=b-d>>>0;e=b-d-(c>>>0>a>>>0|0)>>>0;return(H=e,a-c>>>0|0)|0}function GF(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b<<c|(a&(1<<c)-1<<32-c)>>>32-c;return a<<c}H=a<<c-32;return 0}function HF(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b>>>c;return a>>>c|(b&(1<<c)-1)<<32-c}H=0;return b>>>c-32|0}function IF(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){H=b>>c;return a>>>c|(b&(1<<c)-1)<<32-c}H=(b|0)<0?-1:0;return b>>c-32|0}function JF(b){b=b|0;var c=0;c=a[n+(b>>>24)|0]|0;if((c|0)<8)return c|0;c=a[n+(b>>16&255)|0]|0;if((c|0)<8)return c+8|0;c=a[n+(b>>8&255)|0]|0;if((c|0)<8)return c+16|0;return(a[n+(b&255)|0]|0)+24|0}function KF(b){b=b|0;var c=0;c=a[m+(b&255)|0]|0;if((c|0)<8)return c|0;c=a[m+(b>>8&255)|0]|0;if((c|0)<8)return c+8|0;c=a[m+(b>>16&255)|0]|0;if((c|0)<8)return c+16|0;return(a[m+(b>>>24)|0]|0)+24|0}function LF(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;c=a&65535;d=b&65535;e=da(d,c)|0;f=a>>>16;a=(e>>>16)+(da(d,f)|0)|0;d=b>>>16;b=da(d,c)|0;return(H=(a>>>16)+(da(d,f)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|e&65535|0)|0}function MF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0;e=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;g=d>>31|((d|0)<0?-1:0)<<1;h=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;i=FF(e^a,f^b,e,f)|0;b=H;a=g^e;e=h^f;f=FF((RF(i,b,FF(g^c,h^d,g,h)|0,H,0)|0)^a,H^e,a,e)|0;return(H=H,f)|0}function NF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0,k=0,l=0,m=0;f=i;i=i+8|0;g=f|0;h=b>>31|((b|0)<0?-1:0)<<1;j=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;k=e>>31|((e|0)<0?-1:0)<<1;l=((e|0)<0?-1:0)>>31|((e|0)<0?-1:0)<<1;m=FF(h^a,j^b,h,j)|0;b=H;RF(m,b,FF(k^d,l^e,k,l)|0,H,g)|0;l=FF(c[g>>2]^h,c[g+4>>2]^j,h,j)|0;j=H;i=f;return(H=j,l)|0}function OF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;a=c;c=LF(e,a)|0;f=H;return(H=(da(b,a)|0)+(da(d,e)|0)+f|f&0,c|0|0)|0}function PF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;e=RF(a,b,c,d,0)|0;return(H=H,e)|0}function QF(a,b,d,e){a=a|0;b=b|0;d=d|0;e=e|0;var f=0,g=0;f=i;i=i+8|0;g=f|0;RF(a,b,d,e,g)|0;i=f;return(H=c[g+4>>2]|0,c[g>>2]|0)|0}function RF(a,b,d,e,f){a=a|0;b=b|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,I=0,J=0,K=0,L=0,M=0;g=a;h=b;i=h;j=d;k=e;l=k;if((i|0)==0){m=(f|0)!=0;if((l|0)==0){if(m){c[f>>2]=(g>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(g>>>0)/(j>>>0)>>>0;return(H=n,o)|0}else{if(!m){n=0;o=0;return(H=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=b&0;n=0;o=0;return(H=n,o)|0}}m=(l|0)==0;do{if((j|0)==0){if(m){if((f|0)!=0){c[f>>2]=(i>>>0)%(j>>>0);c[f+4>>2]=0}n=0;o=(i>>>0)/(j>>>0)>>>0;return(H=n,o)|0}if((g|0)==0){if((f|0)!=0){c[f>>2]=0;c[f+4>>2]=(i>>>0)%(l>>>0)}n=0;o=(i>>>0)/(l>>>0)>>>0;return(H=n,o)|0}p=l-1|0;if((p&l|0)==0){if((f|0)!=0){c[f>>2]=a|0;c[f+4>>2]=p&i|b&0}n=0;o=i>>>((KF(l|0)|0)>>>0);return(H=n,o)|0}p=(JF(l|0)|0)-(JF(i|0)|0)|0;if(p>>>0<=30){q=p+1|0;r=31-p|0;s=q;t=i<<r|g>>>(q>>>0);u=i>>>(q>>>0);v=0;w=g<<r;break}if((f|0)==0){n=0;o=0;return(H=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(H=n,o)|0}else{if(!m){r=(JF(l|0)|0)-(JF(i|0)|0)|0;if(r>>>0<=31){q=r+1|0;p=31-r|0;x=r-31>>31;s=q;t=g>>>(q>>>0)&x|i<<p;u=i>>>(q>>>0)&x;v=0;w=g<<p;break}if((f|0)==0){n=0;o=0;return(H=n,o)|0}c[f>>2]=a|0;c[f+4>>2]=h|b&0;n=0;o=0;return(H=n,o)|0}p=j-1|0;if((p&j|0)!=0){x=(JF(j|0)|0)+33-(JF(i|0)|0)|0;q=64-x|0;r=32-x|0;y=r>>31;z=x-32|0;A=z>>31;s=x;t=r-1>>31&i>>>(z>>>0)|(i<<r|g>>>(x>>>0))&A;u=A&i>>>(x>>>0);v=g<<q&y;w=(i<<q|g>>>(z>>>0))&y|g<<r&x-33>>31;break}if((f|0)!=0){c[f>>2]=p&g;c[f+4>>2]=0}if((j|0)==1){n=h|b&0;o=a|0|0;return(H=n,o)|0}else{p=KF(j|0)|0;n=i>>>(p>>>0)|0;o=i<<32-p|g>>>(p>>>0)|0;return(H=n,o)|0}}}while(0);if((s|0)==0){B=w;C=v;D=u;E=t;F=0;G=0}else{g=d|0|0;d=k|e&0;e=EF(g,d,-1,-1)|0;k=H;i=w;w=v;v=u;u=t;t=s;s=0;while(1){I=w>>>31|i<<1;J=s|w<<1;j=u<<1|i>>>31|0;a=u>>>31|v<<1|0;FF(e,k,j,a)|0;b=H;h=b>>31|((b|0)<0?-1:0)<<1;K=h&1;L=FF(j,a,h&g,(((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1)&d)|0;M=H;b=t-1|0;if((b|0)==0){break}else{i=I;w=J;v=M;u=L;t=b;s=K}}B=I;C=J;D=M;E=L;F=0;G=K}K=C;C=0;if((f|0)!=0){c[f>>2]=E;c[f+4>>2]=D}n=(K|0)>>>31|(B|C)<<1|(C<<1|K>>>31)&0|F;o=(K<<1|0>>>31)&-2|G;return(H=n,o)|0}function SF(a){a=+a;return+T(+a)}function TF(a,b){a=a|0;b=b|0;rc(a|0,b|0)}function UF(a){a=a|0;return tb(a|0)|0}function VF(a,b,c){a=a|0;b=b|0;c=c|0;return nb(a|0,b|0,c|0)|0}function WF(a,b,c){a=a|0;b=b|0;c=c|0;return gc(a|0,b|0,c|0)|0}function XF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ma(a|0,b|0,c|0,d|0)|0}function YF(a,b){a=a|0;b=b|0;return Ka(a|0,b|0)|0}function ZF(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Jb(a|0,b|0,c|0,d|0)}function _F(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Bc[a&63](b|0,c|0,d|0,e|0,f|0)}function $F(a,b){a=a|0;b=b|0;Cc[a&255](b|0)}function aG(a,b,c){a=a|0;b=b|0;c=c|0;Dc[a&63](b|0,c|0)}function bG(a,b){a=a|0;b=b|0;return Ec[a&63](b|0)|0}function cG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=+d;e=+e;return Fc[a&7](b|0,c|0,+d,+e)|0}function dG(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;return Gc[a&127](b|0,c|0,d|0,e|0,f|0)|0}function eG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Hc[a&63](b|0,c|0,d|0)|0}function fG(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Ic[a&15](b|0,c|0,d|0,e|0,f|0,g|0)}function gG(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=+f;g=+g;h=+h;i=+i;return Jc[a&3](b|0,c|0,d|0,e|0,+f,+g,+h,+i)|0}function hG(a,b){a=a|0;b=b|0;return+Kc[a&3](b|0)}function iG(a,b){a=a|0;b=+b;return+Lc[a&3](+b)}function jG(a,b,c,d){a=a|0;b=+b;c=+c;d=+d;return+Mc[a&15](+b,+c,+d)}function kG(a,b,c,d,e,f,g,h,i,j){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;j=j|0;Nc[a&1](b|0,c|0,d|0,e|0,f|0,g|0,h|0,i|0,j|0)}function lG(a,b,c){a=a|0;b=b|0;c=c|0;return Oc[a&255](b|0,c|0)|0}function mG(a){a=a|0;return+Pc[a&3]()}function nG(a){a=a|0;return Qc[a&3]()|0}function oG(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=g|0;Rc[a&31](b|0,c|0,d|0,+e,+f,g|0)}function pG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;return Sc[a&127](b|0,c|0,d|0,e|0)|0}function qG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Tc[a&127](b|0,c|0,d|0)}function rG(a){a=a|0;Uc[a&3]()}function sG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Vc[a&63](b|0,c|0,d|0,e|0)}function tG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ea(0)}function uG(a){a=a|0;ea(1)}function vG(a,b){a=a|0;b=b|0;ea(2)}function wG(a){a=a|0;ea(3);return 0}function xG(a,b,c,d){a=a|0;b=b|0;c=+c;d=+d;ea(4);return 0}function yG(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ea(5);return 0}function zG(a,b,c){a=a|0;b=b|0;c=c|0;ea(6);return 0}function AG(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ea(7)}function BG(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=+e;f=+f;g=+g;h=+h;ea(8);return 0}function CG(a){a=a|0;ea(9);return 0.0}function DG(a){a=+a;ea(10);return 0.0}function EG(a,b,c){a=+a;b=+b;c=+c;ea(11);return 0.0}function FG(a,b,c,d,e,f,g,h,i){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;i=i|0;ea(12)}function GG(a,b){a=a|0;b=b|0;ea(13);return 0}function HG(){ea(14);return 0.0}function IG(){ea(15);return 0}function JG(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=+d;e=+e;f=f|0;ea(16)}function KG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ea(17);return 0}function LG(a,b,c){a=a|0;b=b|0;c=c|0;ea(18)}function MG(){ea(19)}function NG(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ea(20)}
+
+
+
+
+// EMSCRIPTEN_END_FUNCS
+var Bc=[tG,tG,Mf,tG,sf,tG,JC,tG,oo,tG,xg,tG,tg,tG,cD,tG,Xe,tG,Ye,tG,eg,tG,tf,tG,ug,tG,gv,tG,XC,tG,QD,tG,fg,tG,rD,tG,Nf,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG,tG];var Cc=[uG,uG,NC,uG,sl,uG,hC,uG,eD,uG,iC,uG,kD,uG,WC,uG,TC,uG,Cl,uG,gC,uG,xC,uG,to,uG,HC,uG,dv,uG,tC,uG,Ll,uG,lD,uG,mD,uG,fC,uG,$D,uG,Xu,uG,Xk,uG,Lq,uG,ND,uG,aE,uG,Pu,uG,ZD,uG,rl,uG,iD,uG,FD,uG,PD,uG,nD,uG,pD,uG,SB,uG,jD,uG,wC,uG,uC,uG,_k,uG,xt,uG,ql,uG,SC,uG,sC,uG,Ot,uG,jC,uG,kz,uG,Ty,uG,vC,uG,sE,uG,IC,uG,Ou,uG,UC,uG,CD,uG,po,uG,QC,uG,VC,uG,MC,uG,Ww,uG,OD,uG,PC,uG,Bm,uG,RD,uG,LC,uG,DD,uG,rE,uG,Qh,uG,ez,uG,_D,uG,ED,uG,sk,uG,qD,uG,Uy,uG,st,uG,wo,uG,pA,uG,eF,uG,$k,uG,Mq,uG,nE,uG,$u,uG,fD,uG,uA,uG,yC,uG,RC,uG,NB,uG,gD,uG,rk,uG,oD,uG,iz,uG,sD,uG,Wu,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG,uG];var Dc=[vG,vG,Kl,vG,Ug,vG,Bl,vG,zi,vG,pk,vG,rx,vG,wA,vG,qn,vG,Cm,vG,gE,vG,sA,vG,Hv,vG,hv,vG,bD,vG,AC,vG,Pl,vG,tk,vG,LD,vG,Ul,vG,TF,vG,XD,vG,FC,vG,Al,vG,Gl,vG,yD,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG,vG];var Ec=[wG,wG,UF,wG,mA,wG,dF,wG,TB,wG,Am,wG,jk,wG,ox,wG,lA,wG,ux,wG,Lw,wG,jA,wG,xF,wG,nA,wG,St,wG,Dm,wG,oA,wG,aA,wG,uk,wG,Kw,wG,kA,wG,Tt,wG,iA,wG,Eo,wG,lx,wG,hA,wG,Ro,wG,kk,wG,$w,wG,wG,wG,wG,wG,wG,wG];var Fc=[xG,xG,Yt,xG,Zt,xG,xG,xG];var Gc=[yG,yG,de,yG,Js,yG,me,yG,ke,yG,ne,yG,oe,yG,pe,yG,$d,yG,Ne,yG,je,yG,Fl,yG,Pe,yG,Oe,yG,Ie,yG,Ke,yG,he,yG,He,yG,Me,yG,Je,yG,Le,yG,Qe,yG,qe,yG,ve,yG,we,yG,xe,yG,se,yG,re,yG,ue,yG,te,yG,Zd,yG,_d,yG,Ge,yG,Ae,yG,Be,yG,De,yG,Fe,yG,Ee,yG,ye,yG,ie,yG,Ce,yG,ze,yG,ge,yG,Ol,yG,ce,yG,ae,yG,Sw,yG,le,yG,be,yG,fe,yG,ee,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG,yG];var Hc=[zG,zG,_g,zG,Mt,zG,VF,zG,pz,zG,jx,zG,Py,zG,Zq,zG,Fv,zG,nx,zG,jf,zG,Tw,zG,pf,zG,Xf,zG,Cn,zG,WF,zG,bz,zG,qk,zG,Tg,zG,ry,zG,Pk,zG,Xj,zG,um,zG,eh,zG,Vw,zG,Jf,zG,Df,zG,bg,zG,Sq,zG,Kt,zG,Dt,zG,gh,zG];var Ic=[AG,AG,$C,AG,DC,AG,nC,AG,JD,AG,eE,AG,wD,AG,VD,AG];var Jc=[BG,BG,OB,BG];var Kc=[CG,CG,Gm,CG];var Lc=[DG,DG,SF,DG];var Mc=[EG,EG,ii,EG,hi,EG,fi,EG,gi,EG,EG,EG,EG,EG,EG,EG];var Nc=[FG,FG];var Oc=[GG,GG,Pv,GG,Dp,GG,Ii,GG,Rv,GG,Pi,GG,jg,GG,kg,GG,jz,GG,Di,GG,Ue,GG,yB,GG,Dv,GG,zo,GG,Fi,GG,_z,GG,Zi,GG,Is,GG,Vi,GG,_i,GG,Li,GG,_f,GG,Bh,GG,Hi,GG,xm,GG,Lt,GG,Tl,GG,Xi,GG,Ep,GG,$i,GG,Kr,GG,Ff,GG,cj,GG,Ei,GG,Gi,GG,lg,GG,mg,GG,ng,GG,Ni,GG,Ui,GG,Vu,GG,El,GG,ig,GG,Fg,GG,vx,GG,Nl,GG,ej,GG,Gf,GG,of,GG,Lr,GG,YF,GG,Qi,GG,Tn,GG,Gg,GG,kx,GG,Ki,GG,ag,GG,Jl,GG,Wi,GG,px,GG,gn,GG,Qv,GG,zp,GG,lf,GG,aj,GG,Si,GG,Hg,GG,Ri,GG,bj,GG,tr,GG,Er,GG,Gr,GG,Mi,GG,mf,GG,XE,GG,Rw,GG,Qo,GG,If,GG,Zf,GG,fj,GG,Cv,GG,Ir,GG,Yi,GG,Un,GG,QB,GG,Ve,GG,zF,GG,dj,GG,We,GG,Mr,GG,zv,GG,RB,GG,Vl,GG,hg,GG,gg,GG,Ti,GG,Ji,GG,Co,GG,Oi,GG,mh,GG,LB,GG,gF,GG,Hr,GG,mk,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG,GG];var Pc=[HG,HG,zm,HG];var Qc=[IG,IG,sr,IG];var Rc=[JG,JG,uh,JG,wh,JG,vh,JG,xh,JG,rh,JG,yh,JG,sh,JG,th,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG,JG];var Sc=[KG,KG,Fd,KG,Yf,KG,Od,KG,Uq,KG,Hf,KG,Rk,KG,En,KG,rf,KG,zf,KG,Lf,KG,Aw,KG,kf,KG,Dx,KG,qx,KG,ef,KG,nf,KG,Af,KG,Uf,KG,Sf,KG,Xg,KG,XF,KG,ix,KG,$e,KG,Lz,KG,Ft,KG,Em,KG,zw,KG,Wv,KG,df,KG,Wx,KG,hx,KG,af,KG,Bf,KG,hf,KG,Wf,KG,wm,KG,dg,KG,ff,KG,cz,KG,Qw,KG,Jd,KG,vd,KG,Sd,KG,gf,KG,Ld,KG,Vd,KG,Ef,KG,Tf,KG,Ex,KG,Vf,KG,Ud,KG,Cf,KG,$f,KG,Pr,KG,$q,KG,Zj,KG,wy,KG,yf,KG,KG,KG,KG,KG,KG,KG,KG,KG,KG,KG];var Tc=[LG,LG,xy,LG,Yj,LG,vm,LG,TD,LG,Bx,LG,qA,LG,ZC,LG,KD,LG,Ux,LG,Fx,LG,nj,LG,el,LG,Yx,LG,EC,LG,qj,LG,Et,LG,bE,LG,vw,LG,kC,LG,zC,LG,SD,LG,jq,LG,Tv,LG,WD,LG,aD,LG,Tq,LG,lC,LG,YC,LG,UB,LG,HD,LG,uD,LG,kw,LG,xD,LG,fE,LG,Ai,LG,oC,LG,Sk,LG,lw,LG,oj,LG,kq,LG,zn,LG,Xw,LG,tA,LG,vA,LG,mj,LG,$x,LG,pj,LG,cE,LG,yi,LG,dz,LG,iq,LG,ni,LG,tD,LG,Qk,LG,xA,LG,HB,LG,Dn,LG,rA,LG,_q,LG,BC,LG,Uw,LG,GD,LG,LG,LG];var Uc=[MG,MG,ym,MG];var Vc=[NG,NG,_C,NG,pE,NG,mE,NG,Ml,NG,oE,NG,kE,NG,bf,NG,iE,NG,jE,NG,qE,NG,CC,NG,dE,NG,qf,NG,cg,NG,lE,NG,hD,NG,Dl,NG,mC,NG,ID,NG,ZF,NG,dC,NG,vD,NG,UD,NG,Kf,NG,OC,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG,NG];return{_vizRenderFromString:ld,_strlen:xF,_strcat:AF,_free:eF,_memcmp:wF,_strncpy:DF,_memmove:uF,_tolower:yF,_saveSetjmp:BF,_memset:vF,_malloc:dF,_memcpy:tF,_realloc:gF,_strcpy:zF,_calloc:fF,_testSetjmp:CF,runPostSets:kd,stackAlloc:Wc,stackSave:Xc,stackRestore:Yc,setThrew:Zc,setTempRet0:ad,setTempRet1:bd,setTempRet2:cd,setTempRet3:dd,setTempRet4:ed,setTempRet5:fd,setTempRet6:gd,setTempRet7:hd,setTempRet8:id,setTempRet9:jd,dynCall_viiiii:_F,dynCall_vi:$F,dynCall_vii:aG,dynCall_ii:bG,dynCall_iiiff:cG,dynCall_iiiiii:dG,dynCall_iiii:eG,dynCall_viiiiii:fG,dynCall_iiiiidddd:gG,dynCall_di:hG,dynCall_dd:iG,dynCall_dddd:jG,dynCall_viiiiiiiii:kG,dynCall_iii:lG,dynCall_d:mG,dynCall_i:nG,dynCall_viiiddi:oG,dynCall_iiiii:pG,dynCall_viii:qG,dynCall_v:rG,dynCall_viiii:sG}
+// EMSCRIPTEN_END_ASM
+
+})({Math:Math,
+Int8Array:Int8Array,Int16Array:Int16Array,Int32Array:Int32Array,Uint8Array:Uint8Array,Uint16Array:Uint16Array,Uint32Array:Uint32Array,Float32Array:Float32Array,Float64Array:Float64Array},{abort:aa,assert:J,asmPrintInt:function(a,b){e.print("int "+a+","+b)},asmPrintFloat:function(a,b){e.print("float "+a+","+b)},min:va,invoke_viiiii:function(a,b,c,d,g,i){try{e.dynCall_viiiii(a,b,c,d,g,i)}catch(h){"number"!==typeof h&&"longjmp"!==h&&k(h),u.setThrew(1,0)}},invoke_vi:function(a,b){try{e.dynCall_vi(a,b)}catch(c){"number"!==
+typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_vii:function(a,b,c){try{e.dynCall_vii(a,b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&k(d),u.setThrew(1,0)}},invoke_ii:function(a,b){try{return e.dynCall_ii(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_iiiff:function(a,b,c,d,g){try{return e.dynCall_iiiff(a,b,c,d,g)}catch(i){"number"!==typeof i&&"longjmp"!==i&&k(i),u.setThrew(1,0)}},invoke_iiiiii:function(a,b,c,d,g,i){try{return e.dynCall_iiiiii(a,b,c,d,g,
+i)}catch(h){"number"!==typeof h&&"longjmp"!==h&&k(h),u.setThrew(1,0)}},invoke_iiii:function(a,b,c,d){try{return e.dynCall_iiii(a,b,c,d)}catch(g){"number"!==typeof g&&"longjmp"!==g&&k(g),u.setThrew(1,0)}},invoke_viiiiii:function(a,b,c,d,g,i,h){try{e.dynCall_viiiiii(a,b,c,d,g,i,h)}catch(j){"number"!==typeof j&&"longjmp"!==j&&k(j),u.setThrew(1,0)}},invoke_iiiiidddd:function(a,b,c,d,g,i,h,j,l){try{return e.dynCall_iiiiidddd(a,b,c,d,g,i,h,j,l)}catch(n){"number"!==typeof n&&"longjmp"!==n&&k(n),u.setThrew(1,
+0)}},invoke_di:function(a,b){try{return e.dynCall_di(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_dd:function(a,b){try{return e.dynCall_dd(a,b)}catch(c){"number"!==typeof c&&"longjmp"!==c&&k(c),u.setThrew(1,0)}},invoke_dddd:function(a,b,c,d){try{return e.dynCall_dddd(a,b,c,d)}catch(g){"number"!==typeof g&&"longjmp"!==g&&k(g),u.setThrew(1,0)}},invoke_viiiiiiiii:function(a,b,c,d,g,i,h,j,l,n){try{e.dynCall_viiiiiiiii(a,b,c,d,g,i,h,j,l,n)}catch(m){"number"!==typeof m&&
+"longjmp"!==m&&k(m),u.setThrew(1,0)}},invoke_iii:function(a,b,c){try{return e.dynCall_iii(a,b,c)}catch(d){"number"!==typeof d&&"longjmp"!==d&&k(d),u.setThrew(1,0)}},invoke_d:function(a){try{return e.dynCall_d(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&k(b),u.setThrew(1,0)}},invoke_i:function(a){try{return e.dynCall_i(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&k(b),u.setThrew(1,0)}},invoke_viiiddi:function(a,b,c,d,g,i,h){try{e.dynCall_viiiddi(a,b,c,d,g,i,h)}catch(j){"number"!==typeof j&&
+"longjmp"!==j&&k(j),u.setThrew(1,0)}},invoke_iiiii:function(a,b,c,d,g){try{return e.dynCall_iiiii(a,b,c,d,g)}catch(i){"number"!==typeof i&&"longjmp"!==i&&k(i),u.setThrew(1,0)}},invoke_viii:function(a,b,c,d){try{e.dynCall_viii(a,b,c,d)}catch(g){"number"!==typeof g&&"longjmp"!==g&&k(g),u.setThrew(1,0)}},invoke_v:function(a){try{e.dynCall_v(a)}catch(b){"number"!==typeof b&&"longjmp"!==b&&k(b),u.setThrew(1,0)}},invoke_viiii:function(a,b,c,d,g){try{e.dynCall_viiii(a,b,c,d,g)}catch(i){"number"!==typeof i&&
+"longjmp"!==i&&k(i),u.setThrew(1,0)}},_llvm_lifetime_end:M(),_lseek:Pb,__scanString:Q,_fclose:function(a){Mb(a);return Lb(a)},_fflush:M(),_strtol:Ab,_fputc:ra,_strtok:function(a,b){return Fb(a,b,dc)},_fwrite:Db,_send:function(a,b,c){return!K.ae(a)?(H(g.H),-1):Ba(a,b,c)},_fputs:Qb,_tmpnam:Fa,_isspace:yb,_read:fb,_ceil:Hc,_fileno:function(a){return a},_strstr:function(a,b){var c=0,d;do{c||(d=a,c=b);var e=v[a++|0],g=v[c++|0];if(0==g)return d;g!=e&&(a=d+1,c=0)}while(e);return 0},_fsync:Mb,_isblank:function(a){return 32==
+a||9==a},_fmod:function(a,b){return a%b},_strcmp:function(a,b){return xb(a,b,ha)},_strncmp:xb,_tmpfile:Ra,_snprintf:hb,_fgetc:Ea,__getFloat:Bb,_hypot:function(a,b){return Math.sqrt(a*a+b*b)},_fgets:function(a,b,c){var e=d.D(c);if(!e||e.error||e.Ua)return 0;for(var g,i=0;i<b-1&&10!=g;i++){g=Ea(c);if(-1==g){if(e.error||e.Ua&&0==i)return 0;if(e.Ua)break}v[a+i|0]=g}v[a+i|0]=0;return a},_close:Lb,_getgid:function(){return 0},_strchr:function(a,b){a--;do{a++;var c=v[a];if(c==b)return a}while(c);return 0},
+_asin:Ic,_puts:function(a){var b=t[ma>>2],a=Qb(a,b);return 0>a?a:0>ra(10,b)?-1:a+1},___setErrNo:H,_access:function(a,b){a=R(a);if(b&-8)return H(g.B),-1;var c;try{c=d.F(a,{T:q}).k}catch(e){return d.sa(e),-1}var l="";b&4&&(l+="r");b&2&&(l+="w");b&1&&(l+="x");return l&&d.Da(c,l)?(H(g.mc),-1):0},_ftell:function(a){a=d.D(a);return!a?(H(g.H),-1):d.vb(a.k.mode)?(H(g.nb),-1):a.position},_exit:function(a){Gb(a)},_sprintf:Cb,_strrchr:function(a,b){var c=a+Aa(a);do{if(v[c]==b)return c;c--}while(c>=a);return 0},
+_copysign:function(a,b){return Pa(a)===Pa(b)?a:-a},_recv:function(a,b,c){return!K.ae(a)?(H(g.H),-1):fb(a,b,c)},_cos:uc,_putchar:function(a){return ra(a,t[ma>>2])},_isalnum:function(a){return 48<=a&&57>=a||97<=a&&122>=a||65<=a&&90>=a},_times:function(a){0!==a&&cc(a,0,16);return 0},_bsearch:function(a,b,c,d,g){for(var i=0,h,j,l;i<c;)if(h=i+c>>>1,l=b+h*d,j=e.dynCall_iii(g,a,l),0>j)c=h;else if(0<j)i=h+1;else return l;return 0},__exit:Gb,_isupper:function(a){return 65<=a&&90>=a},_rand:function(){return Math.floor(2147483648*
+Math.random())},_fabsf:Jc,_setlocale:Qa,_bcopy:function(a,b,c){bc(b,a,c)},_toupper:function(a){return 97<=a&&122>=a?a-97+65:a},_pread:function(a,b,c,e){a=d.D(a);if(!a)return H(g.H),-1;try{return d.P(a,v,b,c,e)}catch(l){return d.sa(l),-1}},_fopen:Kb,_open:Jb,_sqrtf:Kc,_sysconf:function(a){switch(a){case 30:return 4096;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 79:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;
+case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;
+case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1E3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:return 1}H(g.B);return-1},_putenv:function(a){if(0===a)return H(g.B),-1;var a=R(a),
+b=a.indexOf("=");if(""===a||-1===a.indexOf("="))return H(g.B),-1;var c=a.slice(0,b),a=a.slice(b+1);if(!(c in U)||U[c]!==a)U[c]=a,Ca(U);return 0},_qsort:function(a,b,c,d){if(!(0==b||0==c)){for(var g=[],i=0;i<b;i++)g.push(i);g.sort(function(b,g){return e.dynCall_iii(d,a+b*c,a+g*c)});var h=ia(b*c);Za(h,a,b*c);for(i=0;i<b;i++)g[i]!=i&&Za(a+i*c,h+g[i]*c,c);Ib(h)}},_isalpha:function(a){return 97<=a&&122>=a||65<=a&&90>=a},_strdup:function(a){var b=Aa(a),c=ia(b+1);Za(c,a,b)|0;v[c+b|0]=0;return c},_log10:function(a){return Math.log(a)/
+Math.LN10},_fread:Nb,_isatty:function(a){a=d.D(a);return!a?(H(g.H),0):!a.aa?(H(g.vd),0):1},__formatString:gb,_getenv:Da,_atoi:function(a){return Ab(a,r,10)},_vfprintf:function(a,b,c){return Eb(a,b,t[c>>2])},_llvm_pow_f64:Lc,_sbrk:Rb,___errno_location:function(){return Na},_strerror:ya,_fstat:function(a,b){var c=d.D(a);return!c?(H(g.H),-1):Ob(c.path,b)},_llvm_lifetime_start:M(),__parseInt:zb,_vsprintf:function(a,b,c){return Cb(a,b,t[c>>2])},_vsnprintf:function(a,b,c,d){return hb(a,b,c,t[d>>2])},_sscanf:function(a,
+b,c){var d=0;return Q(b,function(){return v[a+d++|0]},function(){d--},c)},_feof:function(a){a=d.D(a);return Number(a&&a.Ua)},___assert_fail:function(a,b,c,d){ba=q;k("Assertion failed: "+R(a)+", at: "+[b?R(b):"unknown filename",c,d?R(d):"unknown function"]+" at "+bb())},_srand:M(),_strtok_r:Fb,_abort:function(){e.abort()},_fprintf:Eb,_tan:wc,___buildEnvironment:Ca,_fabs:Dc,_floor:zc,__reallyNegative:Pa,_fseek:function(a,b,c){if(-1==Pb(a,b,c))return-1;a=d.D(a);a.Ua=G;return 0},_sqrt:sc,_write:Ba,_sin:vc,
+_stat:Ob,_longjmp:function(a,b){u.setThrew(a,b||1);k("longjmp")},_strpbrk:function(a,b){for(var c,d={};;){c=v[b++|0];if(!c)break;d[c]=1}for(;;){c=v[a];if(!c)break;if(c in d)return a;a++}return 0},_llvm_va_end:M(),_acos:Cc,_pwrite:function(a,b,c,e){a=d.D(a);if(!a)return H(g.H),-1;try{return d.write(a,v,b,c,e)}catch(l){return d.sa(l),-1}},_strerror_r:wb,_atan2:yc,_exp:xc,_time:function(a){var b=Math.floor(Date.now()/1E3);a&&(t[a>>2]=b);return b},STACKTOP:X,STACK_MAX:nb,tempDoublePtr:sa,ABORT:ba,cttz_i8:Nc,
+ctlz_i8:Mc,NaN:NaN,Infinity:Infinity,_stderr:Ha,_stdout:ma,_stdin:Ga,___fsmu8:p},$);e._vizRenderFromString=u._vizRenderFromString;var Aa=e._strlen=u._strlen,Bc=e._strcat=u._strcat,Ib=e._free=u._free,rc=e._memcmp=u._memcmp,Gc=e._strncpy=u._strncpy,bc=e._memmove=u._memmove,tc=e._tolower=u._tolower,Ec=e._saveSetjmp=u._saveSetjmp,cc=e._memset=u._memset,ia=e._malloc=u._malloc,Za=e._memcpy=u._memcpy;e._realloc=u._realloc;var Ac=e._strcpy=u._strcpy;e._calloc=u._calloc;var Fc=e._testSetjmp=u._testSetjmp,
+qc=e.runPostSets=u.runPostSets;e.dynCall_viiiii=u.dynCall_viiiii;e.dynCall_vi=u.dynCall_vi;e.dynCall_vii=u.dynCall_vii;e.dynCall_ii=u.dynCall_ii;e.dynCall_iiiff=u.dynCall_iiiff;e.dynCall_iiiiii=u.dynCall_iiiiii;e.dynCall_iiii=u.dynCall_iiii;e.dynCall_viiiiii=u.dynCall_viiiiii;e.dynCall_iiiiidddd=u.dynCall_iiiiidddd;e.dynCall_di=u.dynCall_di;e.dynCall_dd=u.dynCall_dd;e.dynCall_dddd=u.dynCall_dddd;e.dynCall_viiiiiiiii=u.dynCall_viiiiiiiii;e.dynCall_iii=u.dynCall_iii;e.dynCall_d=u.dynCall_d;e.dynCall_i=
+u.dynCall_i;e.dynCall_viiiddi=u.dynCall_viiiddi;e.dynCall_iiiii=u.dynCall_iiiii;e.dynCall_viii=u.dynCall_viii;e.dynCall_v=u.dynCall_v;e.dynCall_viiii=u.dynCall_viiii;l.hd=function(a){return u.stackAlloc(a)};l.kd=function(){return u.stackSave()};l.jd=function(a){u.stackRestore(a)};var za=function(){function a(a,b){this.C=a|0;this.K=b|0}function b(a,b){a!=r&&("number"==typeof a?this.ea(a):b==r&&"string"!=typeof a?this.Q(a,256):this.Q(a,b))}function c(){return new b(r)}function d(a,b){var c=l[a.charCodeAt(b)];
+return c==r?-1:c}function e(a){var b=c();b.za(a);return b}function g(a){var b=1,c;if(0!=(c=a>>>16))a=c,b+=16;if(0!=(c=a>>8))a=c,b+=8;if(0!=(c=a>>4))a=c,b+=4;if(0!=(c=a>>2))a=c,b+=2;0!=a>>1&&(b+=1);return b}function h(a){this.R=a}function j(a){this.R=a;this.ke=a.Cf();this.le=this.ke&32767;this.Tf=this.ke>>15;this.pg=(1<<a.A-15)-1;this.Uf=2*a.g}a.zd={};a.za=function(b){if(-128<=b&&128>b){var c=a.zd[b];if(c)return c}c=new a(b|0,0>b?-1:0);-128<=b&&128>b&&(a.zd[b]=c);return c};a.ea=function(b){return isNaN(b)||
+!isFinite(b)?a.ZERO:b<=-a.Cd?a.MIN_VALUE:b+1>=a.Cd?a.MAX_VALUE:0>b?a.ea(-b).G():new a(b%a.va|0,b/a.va|0)};a.ra=function(b,c){return new a(b,c)};a.Q=function(b,c){0==b.length&&k(Error("number format error: empty string"));var d=c||10;(2>d||36<d)&&k(Error("radix out of range: "+d));if("-"==b.charAt(0))return a.Q(b.substring(1),d).G();0<=b.indexOf("-")&&k(Error('number format error: interior "-" character: '+b));for(var e=a.ea(Math.pow(d,8)),f=a.ZERO,g=0;g<b.length;g+=8){var i=Math.min(8,b.length-g),
+h=parseInt(b.substring(g,g+i),d);8>i?(i=a.ea(Math.pow(d,i)),f=f.multiply(i).add(a.ea(h))):(f=f.multiply(e),f=f.add(a.ea(h)))}return f};a.rc=65536;a.gi=16777216;a.va=a.rc*a.rc;a.hi=a.va/2;a.ii=a.va*a.rc;a.Te=a.va*a.va;a.Cd=a.Te/2;a.ZERO=a.za(0);a.ONE=a.za(1);a.Ad=a.za(-1);a.MAX_VALUE=a.ra(-1,2147483647);a.MIN_VALUE=a.ra(0,-2147483648);a.Bd=a.za(16777216);a.prototype.kc=function(){return this.K*a.va+this.uf()};a.prototype.toString=function(b){b=b||10;(2>b||36<b)&&k(Error("radix out of range: "+b));
+if(this.Ma())return"0";if(this.U()){if(this.ca(a.MIN_VALUE)){var c=a.ea(b),d=this.Ja(c),c=d.multiply(c).Eb(this);return d.toString(b)+c.C.toString(b)}return"-"+this.G().toString(b)}for(var d=a.ea(Math.pow(b,6)),c=this,e="";;){var f=c.Ja(d),g=c.Eb(f.multiply(d)).C.toString(b),c=f;if(c.Ma())return g+e;for(;6>g.length;)g="0"+g;e=""+g+e}};a.prototype.uf=function(){return 0<=this.C?this.C:a.va+this.C};a.prototype.Ma=function(){return 0==this.K&&0==this.C};a.prototype.U=function(){return 0>this.K};a.prototype.ge=
+function(){return 1==(this.C&1)};a.prototype.ca=function(a){return this.K==a.K&&this.C==a.C};a.prototype.ie=function(a){return 0>this.yc(a)};a.prototype.yf=function(a){return 0<this.yc(a)};a.prototype.zf=function(a){return 0<=this.yc(a)};a.prototype.yc=function(a){if(this.ca(a))return 0;var b=this.U(),c=a.U();return b&&!c?-1:!b&&c?1:this.Eb(a).U()?-1:1};a.prototype.G=function(){return this.ca(a.MIN_VALUE)?a.MIN_VALUE:this.Xf().add(a.ONE)};a.prototype.add=function(b){var c=this.K>>>16,d=this.K&65535,
+e=this.C>>>16,f=b.K>>>16,g=b.K&65535,i=b.C>>>16,h;h=0+((this.C&65535)+(b.C&65535));b=0+(h>>>16);b+=e+i;e=0+(b>>>16);e+=d+g;d=0+(e>>>16);d=d+(c+f)&65535;return a.ra((b&65535)<<16|h&65535,d<<16|e&65535)};a.prototype.Eb=function(a){return this.add(a.G())};a.prototype.multiply=function(b){if(this.Ma()||b.Ma())return a.ZERO;if(this.ca(a.MIN_VALUE))return b.ge()?a.MIN_VALUE:a.ZERO;if(b.ca(a.MIN_VALUE))return this.ge()?a.MIN_VALUE:a.ZERO;if(this.U())return b.U()?this.G().multiply(b.G()):this.G().multiply(b).G();
+if(b.U())return this.multiply(b.G()).G();if(this.ie(a.Bd)&&b.ie(a.Bd))return a.ea(this.kc()*b.kc());var c=this.K>>>16,d=this.K&65535,e=this.C>>>16,f=this.C&65535,g=b.K>>>16,i=b.K&65535,h=b.C>>>16,b=b.C&65535,j,l,m,n;n=0+f*b;m=0+(n>>>16);m+=e*b;l=0+(m>>>16);m=(m&65535)+f*h;l+=m>>>16;m&=65535;l+=d*b;j=0+(l>>>16);l=(l&65535)+e*h;j+=l>>>16;l&=65535;l+=f*i;j+=l>>>16;l&=65535;j=j+(c*b+d*h+e*i+f*g)&65535;return a.ra(m<<16|n&65535,j<<16|l)};a.prototype.Ja=function(b){b.Ma()&&k(Error("division by zero"));
+if(this.Ma())return a.ZERO;if(this.ca(a.MIN_VALUE)){if(b.ca(a.ONE)||b.ca(a.Ad))return a.MIN_VALUE;if(b.ca(a.MIN_VALUE))return a.ONE;var c=this.ng().Ja(b).shiftLeft(1);if(c.ca(a.ZERO))return b.U()?a.ONE:a.Ad;var d=this.Eb(b.multiply(c));return c.add(d.Ja(b))}if(b.ca(a.MIN_VALUE))return a.ZERO;if(this.U())return b.U()?this.G().Ja(b.G()):this.G().Ja(b).G();if(b.U())return this.Ja(b.G()).G();for(var e=a.ZERO,d=this;d.zf(b);){for(var c=Math.max(1,Math.floor(d.kc()/b.kc())),f=Math.ceil(Math.log(c)/Math.LN2),
+f=48>=f?1:Math.pow(2,f-48),g=a.ea(c),i=g.multiply(b);i.U()||i.yf(d);)c-=f,g=a.ea(c),i=g.multiply(b);g.Ma()&&(g=a.ONE);e=e.add(g);d=d.Eb(i)}return e};a.prototype.Xf=function(){return a.ra(~this.C,~this.K)};a.prototype.shiftLeft=function(b){b&=63;if(0==b)return this;var c=this.C;return 32>b?a.ra(c<<b,this.K<<b|c>>>32-b):a.ra(0,c<<b-32)};a.prototype.ng=function(){var b;b=1;if(0==b)return this;var c=this.K;return 32>b?a.ra(this.C>>>b|c<<32-b,c>>b):a.ra(c>>b-32,0<=c?0:-1)};b.prototype.Ga=function(a,b,
+c,d,e,f){for(;0<=--f;){var g=b*this[a++]+c[d]+e,e=Math.floor(g/67108864);c[d++]=g&67108863}return e};b.prototype.A=26;b.prototype.ha=67108863;b.prototype.X=67108864;b.prototype.Qe=Math.pow(2,52);b.prototype.xd=26;b.prototype.yd=0;var l=[],n,m;n=48;for(m=0;9>=m;++m)l[n++]=m;n=97;for(m=10;36>m;++m)l[n++]=m;n=65;for(m=10;36>m;++m)l[n++]=m;h.prototype.Id=function(a){return 0>a.p||0<=a.ya(this.R)?a.Pf(this.R):a};h.prototype.ve=function(a){return a};h.prototype.reduce=function(a){a.tb(this.R,r,a)};h.prototype.me=
+function(a,b,c){a.Vc(b,c);this.reduce(c)};h.prototype.ye=function(a,b){a.ze(b);this.reduce(b)};j.prototype.Id=function(a){var d=c();a.abs().Tb(this.R.g,d);d.tb(this.R,r,d);0>a.p&&0<d.ya(b.ZERO)&&this.R.W(d,d);return d};j.prototype.ve=function(a){var b=c();a.copyTo(b);this.reduce(b);return b};j.prototype.reduce=function(a){for(;a.g<=this.Uf;)a[a.g++]=0;for(var b=0;b<this.R.g;++b){var c=a[b]&32767,d=c*this.le+((c*this.Tf+(a[b]>>15)*this.le&this.pg)<<15)&a.ha,c=b+this.R.g;for(a[c]+=this.R.Ga(0,d,a,b,
+0,this.R.g);a[c]>=a.X;)a[c]-=a.X,a[++c]++}a.ia();a.Qd(this.R.g,a);0<=a.ya(this.R)&&a.W(this.R,a)};j.prototype.me=function(a,b,c){a.Vc(b,c);this.reduce(c)};j.prototype.ye=function(a,b){a.ze(b);this.reduce(b)};b.prototype.copyTo=function(a){for(var b=this.g-1;0<=b;--b)a[b]=this[b];a.g=this.g;a.p=this.p};b.prototype.za=function(a){this.g=1;this.p=0>a?-1:0;0<a?this[0]=a:-1>a?this[0]=a+DV:this.g=0};b.prototype.Q=function(a,c){var e;if(16==c)e=4;else if(8==c)e=3;else if(256==c)e=8;else if(2==c)e=1;else if(32==
+c)e=5;else if(4==c)e=2;else{this.rf(a,c);return}this.p=this.g=0;for(var g=a.length,i=G,h=0;0<=--g;){var j=8==e?a[g]&255:d(a,g);0>j?"-"==a.charAt(g)&&(i=q):(i=G,0==h?this[this.g++]=j:h+e>this.A?(this[this.g-1]|=(j&(1<<this.A-h)-1)<<h,this[this.g++]=j>>this.A-h):this[this.g-1]|=j<<h,h+=e,h>=this.A&&(h-=this.A))}8==e&&0!=(a[0]&128)&&(this.p=-1,0<h&&(this[this.g-1]|=(1<<this.A-h)-1<<h));this.ia();i&&b.ZERO.W(this,this)};b.prototype.ia=function(){for(var a=this.p&this.ha;0<this.g&&this[this.g-1]==a;)--this.g};
+b.prototype.Tb=function(a,b){var c;for(c=this.g-1;0<=c;--c)b[c+a]=this[c];for(c=a-1;0<=c;--c)b[c]=0;b.g=this.g+a;b.p=this.p};b.prototype.Qd=function(a,b){for(var c=a;c<this.g;++c)b[c-a]=this[c];b.g=Math.max(this.g-a,0);b.p=this.p};b.prototype.he=function(a,b){var c=a%this.A,d=this.A-c,e=(1<<d)-1,f=Math.floor(a/this.A),g=this.p<<c&this.ha,i;for(i=this.g-1;0<=i;--i)b[i+f+1]=this[i]>>d|g,g=(this[i]&e)<<c;for(i=f-1;0<=i;--i)b[i]=0;b[f]=g;b.g=this.g+f+1;b.p=this.p;b.ia()};b.prototype.cg=function(a,b){b.p=
+this.p;var c=Math.floor(a/this.A);if(c>=this.g)b.g=0;else{var d=a%this.A,e=this.A-d,f=(1<<d)-1;b[0]=this[c]>>d;for(var g=c+1;g<this.g;++g)b[g-c-1]|=(this[g]&f)<<e,b[g-c]=this[g]>>d;0<d&&(b[this.g-c-1]|=(this.p&f)<<e);b.g=this.g-c;b.ia()}};b.prototype.W=function(a,b){for(var c=0,d=0,e=Math.min(a.g,this.g);c<e;)d+=this[c]-a[c],b[c++]=d&this.ha,d>>=this.A;if(a.g<this.g){for(d-=a.p;c<this.g;)d+=this[c],b[c++]=d&this.ha,d>>=this.A;d+=this.p}else{for(d+=this.p;c<a.g;)d-=a[c],b[c++]=d&this.ha,d>>=this.A;
+d-=a.p}b.p=0>d?-1:0;-1>d?b[c++]=this.X+d:0<d&&(b[c++]=d);b.g=c;b.ia()};b.prototype.Vc=function(a,c){var d=this.abs(),e=a.abs(),f=d.g;for(c.g=f+e.g;0<=--f;)c[f]=0;for(f=0;f<e.g;++f)c[f+d.g]=d.Ga(0,e[f],c,f,0,d.g);c.p=0;c.ia();this.p!=a.p&&b.ZERO.W(c,c)};b.prototype.ze=function(a){for(var b=this.abs(),c=a.g=2*b.g;0<=--c;)a[c]=0;for(c=0;c<b.g-1;++c){var d=b.Ga(c,b[c],a,2*c,0,1);if((a[c+b.g]+=b.Ga(c+1,2*b[c],a,2*c+1,d,b.g-c-1))>=b.X)a[c+b.g]-=b.X,a[c+b.g+1]=1}0<a.g&&(a[a.g-1]+=b.Ga(c,b[c],a,2*c,0,1));
+a.p=0;a.ia()};b.prototype.tb=function(a,d,e){var f=a.abs();if(!(0>=f.g)){var h=this.abs();if(h.g<f.g)d!=r&&d.za(0),e!=r&&this.copyTo(e);else{e==r&&(e=c());var j=c(),l=this.p,a=a.p,m=this.A-g(f[f.g-1]);0<m?(f.he(m,j),h.he(m,e)):(f.copyTo(j),h.copyTo(e));f=j.g;h=j[f-1];if(0!=h){var n=h*(1<<this.xd)+(1<f?j[f-2]>>this.yd:0),s=this.Qe/n,n=(1<<this.xd)/n,u=1<<this.yd,t=e.g,x=t-f,v=d==r?c():d;j.Tb(x,v);0<=e.ya(v)&&(e[e.g++]=1,e.W(v,e));b.ONE.Tb(f,v);for(v.W(j,j);j.g<f;)j[j.g++]=0;for(;0<=--x;){var z=e[--t]==
+h?this.ha:Math.floor(e[t]*s+(e[t-1]+u)*n);if((e[t]+=j.Ga(0,z,e,x,0,f))<z){j.Tb(x,v);for(e.W(v,e);e[t]<--z;)e.W(v,e)}}d!=r&&(e.Qd(f,d),l!=a&&b.ZERO.W(d,d));e.g=f;e.ia();0<m&&e.cg(m,e);0>l&&b.ZERO.W(e,e)}}}};b.prototype.Cf=function(){if(1>this.g)return 0;var a=this[0];if(0==(a&1))return 0;var b=a&3,b=b*(2-(a&15)*b)&15,b=b*(2-(a&255)*b)&255,b=b*(2-((a&65535)*b&65535))&65535,b=b*(2-a*b%this.X)%this.X;return 0<b?this.X-b:-b};b.prototype.exp=function(a,d){if(4294967295<a||1>a)return b.ONE;var e=c(),f=c(),
+h=d.Id(this),j=g(a)-1;for(h.copyTo(e);0<=--j;)if(d.ye(e,f),0<(a&1<<j))d.me(f,h,e);else var l=e,e=f,f=l;return d.ve(e)};b.prototype.toString=function(a){if(0>this.p)return"-"+this.G().toString(a);if(16==a)a=4;else if(8==a)a=3;else if(2==a)a=1;else if(32==a)a=5;else if(4==a)a=2;else return this.og(a);var b=(1<<a)-1,c,d=G,e="",f=this.g,g=this.A-f*this.A%a;if(0<f--){if(g<this.A&&0<(c=this[f]>>g))d=q,e="0123456789abcdefghijklmnopqrstuvwxyz".charAt(c);for(;0<=f;)g<a?(c=(this[f]&(1<<g)-1)<<a-g,c|=this[--f]>>
+(g+=this.A-a)):(c=this[f]>>(g-=a)&b,0>=g&&(g+=this.A,--f)),0<c&&(d=q),d&&(e+="0123456789abcdefghijklmnopqrstuvwxyz".charAt(c))}return d?e:"0"};b.prototype.G=function(){var a=c();b.ZERO.W(this,a);return a};b.prototype.abs=function(){return 0>this.p?this.G():this};b.prototype.ya=function(a){var b=this.p-a.p;if(0!=b)return b;var c=this.g,b=c-a.g;if(0!=b)return 0>this.p?-b:b;for(;0<=--c;)if(0!=(b=this[c]-a[c]))return b;return 0};b.prototype.Pf=function(a){var d=c();this.abs().tb(a,r,d);0>this.p&&0<d.ya(b.ZERO)&&
+a.W(d,d);return d};b.ZERO=e(0);b.ONE=e(1);b.prototype.rf=function(a,c){this.za(0);c==r&&(c=10);for(var e=this.Ob(c),g=Math.pow(c,e),i=G,h=0,j=0,l=0;l<a.length;++l){var m=d(a,l);0>m?"-"==a.charAt(l)&&0==this.gd()&&(i=q):(j=c*j+m,++h>=e&&(this.Nd(g),this.Md(j),j=h=0))}0<h&&(this.Nd(Math.pow(c,h)),this.Md(j));i&&b.ZERO.W(this,this)};b.prototype.Ob=function(a){return Math.floor(Math.LN2*this.A/Math.log(a))};b.prototype.gd=function(){return 0>this.p?-1:0>=this.g||1==this.g&&0>=this[0]?0:1};b.prototype.Nd=
+function(a){this[this.g]=this.Ga(0,a-1,this,0,0,this.g);++this.g;this.ia()};b.prototype.Md=function(a){var b=0;if(0!=a){for(;this.g<=b;)this[this.g++]=0;for(this[b]+=a;this[b]>=this.X;)this[b]-=this.X,++b>=this.g&&(this[this.g++]=0),++this[b]}};b.prototype.og=function(a){a==r&&(a=10);if(0==this.gd()||2>a||36<a)return"0";var b=this.Ob(a),b=Math.pow(a,b),d=e(b),f=c(),g=c(),h="";for(this.tb(d,f,g);0<f.gd();)h=(b+g.fe()).toString(a).substr(1)+h,f.tb(d,f,g);return g.fe().toString(a)+h};b.prototype.fe=
+function(){if(0>this.p){if(1==this.g)return this[0]-this.X;if(0==this.g)return-1}else{if(1==this.g)return this[0];if(0==this.g)return 0}return(this[1]&(1<<32-this.A)-1)<<this.A|this[0]};b.prototype.sc=function(a,b){for(var c=0,d=0,e=Math.min(a.g,this.g);c<e;)d+=this[c]+a[c],b[c++]=d&this.ha,d>>=this.A;if(a.g<this.g){for(d+=a.p;c<this.g;)d+=this[c],b[c++]=d&this.ha,d>>=this.A;d+=this.p}else{for(d+=this.p;c<a.g;)d+=a[c],b[c++]=d&this.ha,d>>=this.A;d+=a.p}b.p=0>d?-1:0;0<d?b[c++]=d:-1>d&&(b[c++]=this.X+
+d);b.g=c;b.ia()};var s={abs:function(b,c){var d=new a(b,c),d=d.U()?d.G():d;t[sa>>2]=d.C;t[sa+4>>2]=d.K},Sd:function(){s.of||(s.of=q,s.Ce=new b,s.Ce.Q("4294967296",10),s.od=new b,s.od.Q("18446744073709551616",10),s.wj=new b,s.xj=new b)},Wi:function(a,c){var d=new b;d.Q(c.toString(),10);var e=new b;d.Vc(s.Ce,e);d=new b;d.Q(a.toString(),10);var f=new b;d.sc(e,f);return f},stringify:function(c,d,e){c=(new a(c,d)).toString();e&&"-"==c[0]&&(s.Sd(),e=new b,e.Q(c,10),c=new b,s.od.sc(e,c),c=c.toString(10));
+return c},Q:function(c,d,e,f,g){s.Sd();var h=new b;h.Q(c,d);c=new b;c.Q(e,10);e=new b;e.Q(f,10);g&&0>h.ya(b.ZERO)&&(f=new b,h.sc(s.od,f),h=f);f=G;0>h.ya(c)?(h=c,f=q):0<h.ya(e)&&(h=e,f=q);h=a.Q(h.toString());t[sa>>2]=h.C;t[sa+4>>2]=h.K;f&&k("range error")}};return s}();jb.prototype=Error();var Tb,Ta=r,xa=function b(){!e.calledRun&&mb&&kb();e.calledRun||(xa=b)};e.callMain=e.vi=function(b){function c(){for(var b=0;3>b;b++)g.push(0)}J(0==fa,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");
+J(0==cb.length,"cannot call main when preRun functions remain to be called");b=b||[];Wa&&Ta!==r&&e.ab("preload time: "+(Date.now()-Ta)+" ms");Sa||(Sa=q,qa(ka));var d=b.length+1,g=[D(V("/bin/this.program"),"i8",ja)];c();for(var i=0;i<d-1;i+=1)g.push(D(V(b[i]),"i8",ja)),c();g.push(0);g=D(g,"i32",ja);Tb=X;try{var h=e._main(d,g,0);e.noExitRuntime||Sb(h)}catch(j){j instanceof jb||("SimulateInfiniteLoop"==j?e.noExitRuntime=q:(j&&("object"===typeof j&&j.stack)&&e.ab("exception thrown: "+[j,j.stack]),k(j)))}finally{}};
+e.run=e.oj=kb;e.exit=e.Di=Sb;e.abort=e.abort=aa;if(e.preInit)for("function"==typeof e.preInit&&(e.preInit=[e.preInit]);0<e.preInit.length;)e.preInit.pop()();var mb=q;e.noInitialRun&&(mb=G);kb();return e.ccall("vizRenderFromString","string",["string","string","string"],[$a,ec,ab])};
+
diff --git a/pkg/analyzer/doc/support/web_app.dart.js b/pkg/analyzer/doc/support/web_app.dart.js
new file mode 100644
index 0000000..720a137
--- /dev/null
+++ b/pkg/analyzer/doc/support/web_app.dart.js
@@ -0,0 +1,4107 @@
+(function(){var supportsDirectProtoAccess=function(){var z=function(){}
+z.prototype={p:{}}
+var y=new z()
+return y.__proto__&&y.__proto__.p===z.prototype.p}()
+function map(a){a=Object.create(null)
+a.x=0
+delete a.x
+return a}var A=map()
+var B=map()
+var C=map()
+var D=map()
+var E=map()
+var F=map()
+var G=map()
+var H=map()
+var J=map()
+var K=map()
+var L=map()
+var M=map()
+var N=map()
+var O=map()
+var P=map()
+var Q=map()
+var R=map()
+var S=map()
+var T=map()
+var U=map()
+var V=map()
+var W=map()
+var X=map()
+var Y=map()
+var Z=map()
+function I(){}init()
+function setupProgram(a,b){"use strict"
+function generateAccessor(a9,b0,b1){var g=a9.split("-")
+var f=g[0]
+var e=f.length
+var d=f.charCodeAt(e-1)
+var c
+if(g.length>1)c=true
+else c=false
+d=d>=60&&d<=64?d-59:d>=123&&d<=126?d-117:d>=37&&d<=43?d-27:0
+if(d){var a0=d&3
+var a1=d>>2
+var a2=f=f.substring(0,e-1)
+var a3=f.indexOf(":")
+if(a3>0){a2=f.substring(0,a3)
+f=f.substring(a3+1)}if(a0){var a4=a0&2?"r":""
+var a5=a0&1?"this":"r"
+var a6="return "+a5+"."+f
+var a7=b1+".prototype.g"+a2+"="
+var a8="function("+a4+"){"+a6+"}"
+if(c)b0.push(a7+"$reflectable("+a8+");\n")
+else b0.push(a7+a8+";\n")}if(a1){var a4=a1&2?"r,v":"v"
+var a5=a1&1?"this":"r"
+var a6=a5+"."+f+"=v"
+var a7=b1+".prototype.s"+a2+"="
+var a8="function("+a4+"){"+a6+"}"
+if(c)b0.push(a7+"$reflectable("+a8+");\n")
+else b0.push(a7+a8+";\n")}}return f}function defineClass(a2,a3){var g=[]
+var f="function "+a2+"("
+var e=""
+var d=""
+for(var c=0;c<a3.length;c++){if(c!=0)f+=", "
+var a0=generateAccessor(a3[c],g,a2)
+d+="'"+a0+"',"
+var a1="p_"+a0
+f+=a1
+e+="this."+a0+" = "+a1+";\n"}if(supportsDirectProtoAccess)e+="this."+"$deferredAction"+"();"
+f+=") {\n"+e+"}\n"
+f+=a2+".builtin$cls=\""+a2+"\";\n"
+f+="$desc=$collectedClasses."+a2+"[1];\n"
+f+=a2+".prototype = $desc;\n"
+if(typeof defineClass.name!="string")f+=a2+".name=\""+a2+"\";\n"
+f+=a2+"."+"$__fields__"+"=["+d+"];\n"
+f+=g.join("")
+return f}init.createNewIsolate=function(){return new I()}
+init.classIdExtractor=function(c){return c.constructor.name}
+init.classFieldsExtractor=function(c){var g=c.constructor.$__fields__
+if(!g)return[]
+var f=[]
+f.length=g.length
+for(var e=0;e<g.length;e++)f[e]=c[g[e]]
+return f}
+init.instanceFromClassId=function(c){return new init.allClasses[c]()}
+init.initializeEmptyInstance=function(c,d,e){init.allClasses[c].apply(d,e)
+return d}
+var z=supportsDirectProtoAccess?function(c,d){var g=c.prototype
+g.__proto__=d.prototype
+g.constructor=c
+g["$is"+c.name]=c
+return convertToFastObject(g)}:function(){function tmp(){}return function(a0,a1){tmp.prototype=a1.prototype
+var g=new tmp()
+convertToSlowObject(g)
+var f=a0.prototype
+var e=Object.keys(f)
+for(var d=0;d<e.length;d++){var c=e[d]
+g[c]=f[c]}g["$is"+a0.name]=a0
+g.constructor=a0
+a0.prototype=g
+return g}}()
+function finishClasses(a4){var g=init.allClasses
+a4.combinedConstructorFunction+="return [\n"+a4.constructorsList.join(",\n ")+"\n]"
+var f=new Function("$collectedClasses",a4.combinedConstructorFunction)(a4.collected)
+a4.combinedConstructorFunction=null
+for(var e=0;e<f.length;e++){var d=f[e]
+var c=d.name
+var a0=a4.collected[c]
+var a1=a0[0]
+a0=a0[1]
+g[c]=d
+a1[c]=d}f=null
+var a2=init.finishedClasses
+function finishClass(c1){if(a2[c1])return
+a2[c1]=true
+var a5=a4.pending[c1]
+if(a5&&a5.indexOf("+")>0){var a6=a5.split("+")
+a5=a6[0]
+var a7=a6[1]
+finishClass(a7)
+var a8=g[a7]
+var a9=a8.prototype
+var b0=g[c1].prototype
+var b1=Object.keys(a9)
+for(var b2=0;b2<b1.length;b2++){var b3=b1[b2]
+if(!u.call(b0,b3))b0[b3]=a9[b3]}}if(!a5||typeof a5!="string"){var b4=g[c1]
+var b5=b4.prototype
+b5.constructor=b4
+b5.$isMh=b4
+b5.$deferredAction=function(){}
+return}finishClass(a5)
+var b6=g[a5]
+if(!b6)b6=existingIsolateProperties[a5]
+var b4=g[c1]
+var b5=z(b4,b6)
+if(a9)b5.$deferredAction=mixinDeferredActionHelper(a9,b5)
+if(Object.prototype.hasOwnProperty.call(b5,"%")){var b7=b5["%"].split(";")
+if(b7[0]){var b8=b7[0].split("|")
+for(var b2=0;b2<b8.length;b2++){init.interceptorsByTag[b8[b2]]=b4
+init.leafTags[b8[b2]]=true}}if(b7[1]){b8=b7[1].split("|")
+if(b7[2]){var b9=b7[2].split("|")
+for(var b2=0;b2<b9.length;b2++){var c0=g[b9[b2]]
+c0.$nativeSuperclassTag=b8[0]}}for(b2=0;b2<b8.length;b2++){init.interceptorsByTag[b8[b2]]=b4
+init.leafTags[b8[b2]]=false}}b5.$deferredAction()}if(b5.$isvB)b5.$deferredAction()}var a3=Object.keys(a4.pending)
+for(var e=0;e<a3.length;e++)finishClass(a3[e])}function finishAddStubsHelper(){var g=this
+while(!g.hasOwnProperty("$deferredAction"))g=g.__proto__
+delete g.$deferredAction
+var f=Object.keys(g)
+for(var e=0;e<f.length;e++){var d=f[e]
+var c=d.charCodeAt(0)
+var a0
+if(d!=="^"&&d!=="$reflectable"&&c!==43&&c!==42&&(a0=g[d])!=null&&a0.constructor===Array&&d!=="<>")addStubs(g,a0,d,false,[])}convertToFastObject(g)
+g=g.__proto__
+g.$deferredAction()}function mixinDeferredActionHelper(c,d){var g
+if(d.hasOwnProperty("$deferredAction"))g=d.$deferredAction
+return function foo(){var f=this
+while(!f.hasOwnProperty("$deferredAction"))f=f.__proto__
+if(g)f.$deferredAction=g
+else{delete f.$deferredAction
+convertToFastObject(f)}c.$deferredAction()
+f.$deferredAction()}}function processClassData(b1,b2,b3){b2=convertToSlowObject(b2)
+var g
+var f=Object.keys(b2)
+var e=false
+var d=supportsDirectProtoAccess&&b1!="Mh"
+for(var c=0;c<f.length;c++){var a0=f[c]
+var a1=a0.charCodeAt(0)
+if(a0==="static"){processStatics(init.statics[b1]=b2.static,b3)
+delete b2.static}else if(a1===43){w[g]=a0.substring(1)
+var a2=b2[a0]
+if(a2>0)b2[g].$reflectable=a2}else if(a1===42){b2[g].$defaultValues=b2[a0]
+var a3=b2.$methodsWithOptionalArguments
+if(!a3)b2.$methodsWithOptionalArguments=a3={}
+a3[a0]=g}else{var a4=b2[a0]
+if(a0!=="^"&&a4!=null&&a4.constructor===Array&&a0!=="<>")if(d)e=true
+else addStubs(b2,a4,a0,false,[])
+else g=a0}}if(e)b2.$deferredAction=finishAddStubsHelper
+var a5=b2["^"],a6,a7,a8=a5
+var a9=a8.split(";")
+a8=a9[1]?a9[1].split(","):[]
+a7=a9[0]
+a6=a7.split(":")
+if(a6.length==2){a7=a6[0]
+var b0=a6[1]
+if(b0)b2.$signature=function(b4){return function(){return init.types[b4]}}(b0)}if(a7)b3.pending[b1]=a7
+b3.combinedConstructorFunction+=defineClass(b1,a8)
+b3.constructorsList.push(b1)
+b3.collected[b1]=[m,b2]
+i.push(b1)}function processStatics(a3,a4){var g=Object.keys(a3)
+for(var f=0;f<g.length;f++){var e=g[f]
+if(e==="^")continue
+var d=a3[e]
+var c=e.charCodeAt(0)
+var a0
+if(c===43){v[a0]=e.substring(1)
+var a1=a3[e]
+if(a1>0)a3[a0].$reflectable=a1
+if(d&&d.length)init.typeInformation[a0]=d}else if(c===42){m[a0].$defaultValues=d
+var a2=a3.$methodsWithOptionalArguments
+if(!a2)a3.$methodsWithOptionalArguments=a2={}
+a2[e]=a0}else if(typeof d==="function"){m[a0=e]=d
+h.push(e)
+init.globalFunctions[e]=d}else if(d.constructor===Array)addStubs(m,d,e,true,h)
+else{a0=e
+processClassData(e,d,a4)}}}function addStubs(b2,b3,b4,b5,b6){var g=0,f=b3[g],e
+if(typeof f=="string")e=b3[++g]
+else{e=f
+f=b4}var d=[b2[b4]=b2[f]=e]
+e.$stubName=b4
+b6.push(b4)
+for(g++;g<b3.length;g++){e=b3[g]
+if(typeof e!="function")break
+if(!b5)e.$stubName=b3[++g]
+d.push(e)
+if(e.$stubName){b2[e.$stubName]=e
+b6.push(e.$stubName)}}for(var c=0;c<d.length;g++,c++)d[c].$callName=b3[g]
+var a0=b3[g]
+b3=b3.slice(++g)
+var a1=b3[0]
+var a2=a1>>1
+var a3=(a1&1)===1
+var a4=a1===3
+var a5=a1===1
+var a6=b3[1]
+var a7=a6>>1
+var a8=(a6&1)===1
+var a9=a2+a7!=d[0].length
+var b0=b3[2]
+if(typeof b0=="number")b3[2]=b0+b
+var b1=2*a7+a2+3
+if(a0){e=tearOff(d,b3,b5,b4,a9)
+b2[b4].$getter=e
+e.$getterStub=true
+if(b5){init.globalFunctions[b4]=e
+b6.push(a0)}b2[a0]=e
+d.push(e)
+e.$stubName=a0
+e.$callName=null}}Function.prototype.$0=function(){return this()}
+Function.prototype.$1=function(c){return this(c)}
+Function.prototype.$2=function(c,d){return this(c,d)}
+Function.prototype.$4=function(c,d,e,f){return this(c,d,e,f)}
+Function.prototype.$3=function(c,d,e){return this(c,d,e)}
+function tearOffGetter(c,d,e,f){return f?new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+e+y+++"(x) {"+"if (c === null) c = "+"H.qm"+"("+"this, funcs, reflectionInfo, false, [x], name);"+"return new c(this, funcs[0], x, name);"+"}")(c,d,e,H,null):new Function("funcs","reflectionInfo","name","H","c","return function tearOff_"+e+y+++"() {"+"if (c === null) c = "+"H.qm"+"("+"this, funcs, reflectionInfo, false, [], name);"+"return new c(this, funcs[0], null, name);"+"}")(c,d,e,H,null)}function tearOff(c,d,e,f,a0){var g
+return e?function(){if(g===void 0)g=H.qm(this,c,d,true,[],f).prototype
+return g}:tearOffGetter(c,d,f,a0)}var y=0
+if(!init.libraries)init.libraries=[]
+if(!init.mangledNames)init.mangledNames=map()
+if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
+if(!init.statics)init.statics=map()
+if(!init.typeInformation)init.typeInformation=map()
+if(!init.globalFunctions)init.globalFunctions=map()
+var x=init.libraries
+var w=init.mangledNames
+var v=init.mangledGlobalNames
+var u=Object.prototype.hasOwnProperty
+var t=a.length
+var s=map()
+s.collected=map()
+s.pending=map()
+s.constructorsList=[]
+s.combinedConstructorFunction="function $reflectable(fn){fn.$reflectable=1;return fn};\n"+"var $desc;\n"
+for(var r=0;r<t;r++){var q=a[r]
+var p=q[0]
+var o=q[1]
+var n=q[2]
+var m=q[3]
+var l=q[4]
+var k=!!q[5]
+var j=l&&l["^"]
+if(j instanceof Array)j=j[0]
+var i=[]
+var h=[]
+processStatics(l,s)
+x.push([p,o,i,h,n,j,k,m])}finishClasses(s)}I.HU=function(){}
+var dart=[["","",,H,{"^":"",FK:{"^":"Mh;a"}}],["","",,J,{"^":"",
+v:function(a){return void 0},
+Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
+m:function(a){var z,y,x,w
+z=a[init.dispatchPropertyName]
+if(z==null)if($.M==null){H.u()
+z=a[init.dispatchPropertyName]}if(z!=null){y=z.p
+if(!1===y)return z.i
+if(!0===y)return a
+x=Object.getPrototypeOf(a)
+if(y===x)return z.i
+if(z.e===x)throw H.b(new P.D("Return interceptor for "+H.d(y(a,z))))}w=H.w(a)
+if(w==null){if(typeof a=="function")return C.DG
+y=Object.getPrototypeOf(a)
+if(y==null||y===Object.prototype)return C.ZQ
+else return C.vB}return w},
+vB:{"^":"Mh;",
+D:function(a,b){return a===b},
+gM:function(a){return H.wP(a)},
+w:["UG",function(a){return H.H(a)}],
+"%":"ANGLEInstancedArrays|Animation|AnimationEffect|AnimationNode|AnimationTimeline|AudioListener|AudioParam|AudioTrack|BarProp|Body|CSS|Cache|CacheStorage|Canvas2DContextAttributes|CanvasGradient|CanvasPattern|CanvasRenderingContext2D|CircularGeofencingRegion|ConsoleBase|Coordinates|Counter|Credential|CredentialsContainer|Crypto|CryptoKey|DOMError|DOMFileSystem|DOMFileSystemSync|DOMImplementation|DOMMatrix|DOMMatrixReadOnly|DOMParser|DOMPoint|DOMPointReadOnly|DataTransfer|Database|DeprecatedStorageInfo|DeprecatedStorageQuota|DeviceAcceleration|DeviceRotationRate|DirectoryEntrySync|DirectoryReader|DirectoryReaderSync|EXTBlendMinMax|EXTFragDepth|EXTShaderTextureLOD|EXTTextureFilterAnisotropic|EntrySync|FederatedCredential|FileEntrySync|FileError|FileReaderSync|FileWriterSync|FormData|GamepadButton|Geofencing|GeofencingRegion|Geolocation|Geoposition|HTMLAllCollection|IDBCursor|IDBCursorWithValue|IDBFactory|IDBKeyRange|IDBObjectStore|ImageBitmap|ImageData|InjectedScriptHost|LocalCredential|MIDIInputMap|MIDIOutputMap|MediaDeviceInfo|MediaError|MediaKeyError|MediaKeys|MemoryInfo|MessageChannel|Metadata|MutationObserver|MutationRecord|NavigatorUserMediaError|NodeFilter|NodeIterator|OESElementIndexUint|OESStandardDerivatives|OESTextureFloat|OESTextureFloatLinear|OESTextureHalfFloat|OESTextureHalfFloatLinear|OESVertexArrayObject|PagePopupController|PerformanceEntry|PerformanceMark|PerformanceMeasure|PerformanceNavigation|PerformanceResourceTiming|PerformanceTiming|PeriodicWave|PositionError|PushManager|PushRegistration|RGBColor|RTCIceCandidate|RTCSessionDescription|RTCStatsResponse|Range|ReadableStream|Rect|Request|Response|SQLError|SQLResultSet|SQLTransaction|SVGAngle|SVGAnimatedAngle|SVGAnimatedBoolean|SVGAnimatedEnumeration|SVGAnimatedInteger|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedPreserveAspectRatio|SVGAnimatedRect|SVGAnimatedString|SVGAnimatedTransformList|SVGMatrix|SVGPoint|SVGPreserveAspectRatio|SVGRect|SVGRenderingIntent|SVGUnitTypes|Screen|Selection|ServiceWorkerClient|ServiceWorkerClients|ServiceWorkerContainer|SourceInfo|SpeechRecognitionAlternative|SpeechSynthesisVoice|StorageInfo|StorageQuota|Stream|StyleMedia|SubtleCrypto|TextMetrics|Timing|TreeWalker|VTTRegion|ValidityState|VideoPlaybackQuality|VideoTrack|WebGLActiveInfo|WebGLBuffer|WebGLCompressedTextureATC|WebGLCompressedTextureETC1|WebGLCompressedTexturePVRTC|WebGLCompressedTextureS3TC|WebGLContextAttributes|WebGLDebugRendererInfo|WebGLDebugShaders|WebGLDepthTexture|WebGLDrawBuffers|WebGLExtensionLoseContext|WebGLFramebuffer|WebGLLoseContext|WebGLProgram|WebGLRenderbuffer|WebGLRenderingContext|WebGLShader|WebGLShaderPrecisionFormat|WebGLTexture|WebGLUniformLocation|WebGLVertexArrayObjectOES|WebKitCSSMatrix|WebKitMutationObserver|WorkerConsole|WorkerPerformance|XMLSerializer|XPathEvaluator|XPathExpression|XPathNSResolver|XPathResult|XSLTProcessor|mozRTCIceCandidate|mozRTCSessionDescription"},
+yE:{"^":"vB;",
+w:function(a){return String(a)},
+gM:function(a){return a?519018:218159},
+$isa2:1},
+PE:{"^":"vB;",
+D:function(a,b){return null==b},
+w:function(a){return"null"},
+gM:function(a){return 0}},
+Ue:{"^":"vB;",
+gM:function(a){return 0},
+w:["tk",function(a){return String(a)}],
+$isvm:1},
+iC:{"^":"Ue;"},
+k:{"^":"Ue;"},
+c5:{"^":"Ue;",
+w:function(a){var z=a[$.$get$fa()]
+return z==null?this.tk(a):J.A(z)}},
+jd:{"^":"vB;",
+uy:function(a,b){if(!!a.immutable$list)throw H.b(new P.ub(b))},
+PP:function(a,b){if(!!a.fixed$length)throw H.b(new P.ub(b))},
+FV:function(a,b){var z
+this.PP(a,"addAll")
+for(z=0;z<2;++z)a.push(b[z])},
+U:function(a,b){var z,y
+z=a.length
+for(y=0;y<z;++y){b.$1(a[y])
+if(a.length!==z)throw H.b(new P.UV(a))}},
+ez:function(a,b){return H.VM(new H.A8(a,b),[null,null])},
+W:function(a,b){return a[b]},
+gtH:function(a){if(a.length>0)return a[0]
+throw H.b(H.Wp())},
+YW:function(a,b,c,d,e){var z,y
+this.uy(a,"set range")
+P.jB(b,c,a.length,null,null,null)
+z=c-b
+if(z===0)return
+if(e<0)H.vh(P.TE(e,0,null,"skipCount",null))
+if(e+z>d.length)throw H.b(H.ar())
+if(e<b)for(y=z-1;y>=0;--y)a[b+y]=d[e+y]
+else for(y=0;y<z;++y)a[b+y]=d[e+y]},
+Vr:function(a,b){var z,y
+z=a.length
+for(y=0;y<z;++y){if(b.$1(a[y]))return!0
+if(a.length!==z)throw H.b(new P.UV(a))}return!1},
+tg:function(a,b){var z
+for(z=0;z<a.length;++z)if(J.RM(a[z],b))return!0
+return!1},
+w:function(a){return P.WE(a,"[","]")},
+gk:function(a){return new J.m1(a,a.length,0,null)},
+gM:function(a){return H.wP(a)},
+gA:function(a){return a.length},
+sA:function(a,b){this.PP(a,"set length")
+if(b<0)throw H.b(P.TE(b,0,null,"newLength",null))
+a.length=b},
+q:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(H.HY(a,b))
+if(b>=a.length||b<0)throw H.b(H.HY(a,b))
+return a[b]},
+t:function(a,b,c){this.uy(a,"indexed set")
+if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(H.HY(a,b))
+if(b>=a.length||b<0)throw H.b(H.HY(a,b))
+a[b]=c},
+$isDD:1,
+$iszM:1,
+$aszM:null,
+$isqC:1},
+Po:{"^":"jd;"},
+m1:{"^":"Mh;a,b,c,d",
+gl:function(){return this.d},
+F:function(){var z,y,x
+z=this.a
+y=z.length
+if(this.b!==y)throw H.b(H.lk(z))
+x=this.c
+if(x>=y){this.d=null
+return!1}this.d=z[x]
+this.c=x+1
+return!0}},
+jX:{"^":"vB;",
+JV:function(a,b){return a%b},
+yu:function(a){var z
+if(a>=-2147483648&&a<=2147483647)return a|0
+if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
+return z+0}throw H.b(new P.ub(""+a))},
+w:function(a){if(a===0&&1/a<0)return"-0.0"
+else return""+a},
+gM:function(a){return a&0x1FFFFFFF},
+BU:function(a,b){return(a|0)===a?a/b|0:this.yu(a/b)},
+wG:function(a,b){var z
+if(a>0)z=b>31?0:a>>>b
+else{z=b>31?31:b
+z=a>>z>>>0}return z},
+B:function(a,b){if(typeof b!=="number")throw H.b(H.G(b))
+return a<b},
+$islf:1},
+im:{"^":"jX;",$islf:1,$isKN:1},
+VA:{"^":"jX;",$islf:1},
+Dr:{"^":"vB;",
+J:function(a,b){if(b<0)throw H.b(H.HY(a,b))
+if(b>=a.length)throw H.b(H.HY(a,b))
+return a.charCodeAt(b)},
+Qi:function(a,b,c){var z
+H.fI(c)
+if(c>a.length)throw H.b(P.TE(c,0,a.length,null,null))
+z=c+b.length
+if(z>a.length)return!1
+return b===a.substring(c,z)},
+nC:function(a,b){return this.Qi(a,b,0)},
+C:function(a,b,c){if(c==null)c=a.length
+if(typeof c!=="number"||Math.floor(c)!==c)H.vh(H.G(c))
+if(b<0)throw H.b(P.F(b,null,null))
+if(b>c)throw H.b(P.F(b,null,null))
+if(c>a.length)throw H.b(P.F(c,null,null))
+return a.substring(b,c)},
+G:function(a,b){return this.C(a,b,null)},
+hc:function(a){return a.toLowerCase()},
+bS:function(a){var z,y,x,w,v
+z=a.trim()
+y=z.length
+if(y===0)return z
+if(this.J(z,0)===133){x=J.mm(z,1)
+if(x===y)return""}else x=0
+w=y-1
+v=this.J(z,w)===133?J.r9(z,w):y
+if(x===0&&v===y)return z
+return z.substring(x,v)},
+w:function(a){return a},
+gM:function(a){var z,y,x
+for(z=a.length,y=0,x=0;x<z;++x){y=536870911&y+a.charCodeAt(x)
+y=536870911&y+((524287&y)<<10>>>0)
+y^=y>>6}y=536870911&y+((67108863&y)<<3>>>0)
+y^=y>>11
+return 536870911&y+((16383&y)<<15>>>0)},
+gA:function(a){return a.length},
+q:function(a,b){if(b>=a.length||!1)throw H.b(H.HY(a,b))
+return a[b]},
+$isDD:1,
+$isqU:1,
+static:{
+Ga:function(a){if(a<256)switch(a){case 9:case 10:case 11:case 12:case 13:case 32:case 133:case 160:return!0
+default:return!1}switch(a){case 5760:case 6158:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8232:case 8233:case 8239:case 8287:case 12288:case 65279:return!0
+default:return!1}},
+mm:function(a,b){var z,y
+for(z=a.length;b<z;){y=C.xB.J(a,b)
+if(y!==32&&y!==13&&!J.Ga(y))break;++b}return b},
+r9:function(a,b){var z,y
+for(;b>0;b=z){z=b-1
+y=C.xB.J(a,z)
+if(y!==32&&y!==13&&!J.Ga(y))break}return b}}}}],["","",,H,{"^":"",
+zd:function(a,b){var z=a.v(b)
+if(!init.globalState.d.cy)init.globalState.f.bL()
+return z},
+Rq:function(a,b){var z,y,x,w,v,u
+z={}
+z.a=b
+if(b==null){b=[]
+z.a=b
+y=b}else y=b
+if(!J.v(y).$iszM)throw H.b(P.q("Arguments to main must be a List: "+H.d(y)))
+init.globalState=new H.O2(0,0,1,null,null,null,null,null,null,null,null,null,a)
+y=init.globalState
+x=self.window==null
+w=self.Worker
+v=x&&!!self.postMessage
+y.x=v
+v=!v
+if(v)w=w!=null&&$.$get$Kb()!=null
+else w=!0
+y.y=w
+y.r=x&&v
+y.f=new H.cC(P.NZ(null,H.IY),0)
+y.z=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,H.aX])
+y.ch=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,null])
+if(y.x){x=new H.JH()
+y.Q=x
+self.onmessage=function(c,d){return function(e){c(d,e)}}(H.Mg,x)
+self.dartPrint=self.dartPrint||function(c){return function(d){if(self.console&&self.console.log)self.console.log(d)
+else self.postMessage(c(d))}}(H.wI)}if(init.globalState.x)return
+y=init.globalState.a++
+x=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,H.yo])
+w=P.Ls(null,null,null,P.KN)
+v=new H.yo(0,null,!1)
+u=new H.aX(y,x,w,init.createNewIsolate(),v,new H.ku(H.Uh()),new H.ku(H.Uh()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+w.AN(0,0)
+u.co(0,v)
+init.globalState.e=u
+init.globalState.d=u
+y=H.N7()
+x=H.KT(y,[y]).Zg(a)
+if(x)u.v(new H.PK(z,a))
+else{y=H.KT(y,[y,y]).Zg(a)
+if(y)u.v(new H.JO(z,a))
+else u.v(a)}init.globalState.f.bL()},
+yl:function(){var z=init.currentScript
+if(z!=null)return String(z.src)
+if(init.globalState.x)return H.mf()
+return},
+mf:function(){var z,y
+z=new Error().stack
+if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
+if(z==null)throw H.b(new P.ub("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
+if(y!=null)return y[1]
+y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
+if(y!=null)return y[1]
+throw H.b(new P.ub('Cannot extract URI from "'+H.d(z)+'"'))},
+Mg:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z=new H.fP(!0,[]).QS(b.data)
+y=J.U6(z)
+switch(y.q(z,"command")){case"start":init.globalState.b=y.q(z,"id")
+x=y.q(z,"functionName")
+w=x==null?init.globalState.cx:init.globalFunctions[x]()
+v=y.q(z,"args")
+u=new H.fP(!0,[]).QS(y.q(z,"msg"))
+t=y.q(z,"isSpawnUri")
+s=y.q(z,"startPaused")
+r=new H.fP(!0,[]).QS(y.q(z,"replyTo"))
+y=init.globalState.a++
+q=H.VM(new H.N5(0,null,null,null,null,null,0),[P.KN,H.yo])
+p=P.Ls(null,null,null,P.KN)
+o=new H.yo(0,null,!1)
+n=new H.aX(y,q,p,init.createNewIsolate(),o,new H.ku(H.Uh()),new H.ku(H.Uh()),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
+p.AN(0,0)
+n.co(0,o)
+init.globalState.f.a.B7(0,new H.IY(n,new H.jl(w,v,u,t,s,r),"worker-start"))
+init.globalState.d=n
+init.globalState.f.bL()
+break
+case"spawn-worker":break
+case"message":if(y.q(z,"port")!=null)J.TT(y.q(z,"port"),y.q(z,"msg"))
+init.globalState.f.bL()
+break
+case"close":init.globalState.ch.Rz(0,$.$get$jp().q(0,a))
+a.terminate()
+init.globalState.f.bL()
+break
+case"log":H.VL(y.q(z,"msg"))
+break
+case"print":if(init.globalState.x){y=init.globalState.Q
+q=P.Td(["command","print","msg",z])
+q=new H.jP(!0,P.E8(null,P.KN)).a3(q)
+y.toString
+self.postMessage(q)}else P.JS(y.q(z,"msg"))
+break
+case"error":throw H.b(y.q(z,"msg"))}},
+VL:function(a){var z,y,x,w
+if(init.globalState.x){y=init.globalState.Q
+x=P.Td(["command","log","msg",a])
+x=new H.jP(!0,P.E8(null,P.KN)).a3(x)
+y.toString
+self.postMessage(x)}else try{self.console.log(a)}catch(w){H.p(w)
+z=H.ts(w)
+throw H.b(P.FM(z))}},
+Z7:function(a,b,c,d,e,f){var z,y,x,w
+z=init.globalState.d
+y=z.a
+$.te=$.te+("_"+y)
+$.eb=$.eb+("_"+y)
+y=z.e
+x=init.globalState.d.a
+w=z.f
+f.wR(0,["spawned",new H.JM(y,x),w,z.r])
+x=new H.Vg(a,b,c,d,z)
+if(e){z.v8(w,w)
+init.globalState.f.a.B7(0,new H.IY(z,x,"start isolate"))}else x.$0()},
+Gx:function(a){return new H.fP(!0,[]).QS(new H.jP(!1,P.E8(null,P.KN)).a3(a))},
+PK:{"^":"L:0;a,b",
+$0:function(){this.b.$1(this.a.a)}},
+JO:{"^":"L:0;a,b",
+$0:function(){this.b.$2(this.a.a,null)}},
+O2:{"^":"Mh;a,b,c,d,e,f,r,x,y,z,Q,ch,cx",static:{
+wI:function(a){var z=P.Td(["command","print","msg",a])
+return new H.jP(!0,P.E8(null,P.KN)).a3(z)}}},
+aX:{"^":"Mh;a,b,c,En:d<,EE:e<,f,r,x,y,z,Q,ch,cx,cy,db,dx",
+v8:function(a,b){if(!this.f.D(0,a))return
+if(this.Q.AN(0,b)&&!this.y)this.y=!0
+this.Wp()},
+cK:function(a){var z,y,x,w,v
+if(!this.y)return
+z=this.Q
+z.Rz(0,a)
+if(z.a===0){for(z=this.z;z.length!==0;){y=z.pop()
+x=init.globalState.f.a
+w=x.b
+v=x.a
+w=(w-1&v.length-1)>>>0
+x.b=w
+v[w]=y
+if(w===x.c)x.wL();++x.d}this.y=!1}this.Wp()},
+h4:function(a,b){var z,y,x
+if(this.ch==null)this.ch=[]
+for(z=J.v(a),y=0;x=this.ch,y<x.length;y+=2)if(z.D(a,x[y])){this.ch[y+1]=b
+return}x.push(a)
+this.ch.push(b)},
+Hh:function(a){var z,y,x
+if(this.ch==null)return
+for(z=J.v(a),y=0;x=this.ch,y<x.length;y+=2)if(z.D(a,x[y])){z=this.ch
+x=y+2
+z.toString
+if(typeof z!=="object"||z===null||!!z.fixed$length)H.vh(new P.ub("removeRange"))
+P.jB(y,x,z.length,null,null,null)
+z.splice(y,x-y)
+return}},
+MZ:function(a,b){if(!this.r.D(0,a))return
+this.db=b},
+l7:function(a,b,c){var z
+if(b!==0)z=b===1&&!this.cy
+else z=!0
+if(z){a.wR(0,c)
+return}z=this.cx
+if(z==null){z=P.NZ(null,null)
+this.cx=z}z.B7(0,new H.NY(a,c))},
+bc:function(a,b){var z
+if(!this.r.D(0,a))return
+if(b!==0)z=b===1&&!this.cy
+else z=!0
+if(z){this.Dm()
+return}z=this.cx
+if(z==null){z=P.NZ(null,null)
+this.cx=z}z.B7(0,this.gIm())},
+hk:function(a,b){var z,y,x
+z=this.dx
+if(z.a===0){if(this.db&&this===init.globalState.e)return
+if(self.console&&self.console.error)self.console.error(a,b)
+else{P.JS(a)
+if(b!=null)P.JS(b)}return}y=new Array(2)
+y.fixed$length=Array
+y[0]=J.A(a)
+y[1]=b==null?null:b.w(0)
+for(x=new P.lm(z,z.r,null,null),x.c=z.e;x.F();)x.d.wR(0,y)},
+v:function(a){var z,y,x,w,v,u,t
+z=init.globalState.d
+init.globalState.d=this
+$=this.d
+y=null
+x=this.cy
+this.cy=!0
+try{y=a.$0()}catch(u){t=H.p(u)
+w=t
+v=H.ts(u)
+this.hk(w,v)
+if(this.db){this.Dm()
+if(this===init.globalState.e)throw u}}finally{this.cy=x
+init.globalState.d=z
+if(z!=null)$=z.gEn()
+if(this.cx!=null)for(;t=this.cx,!t.gl0(t);)this.cx.Ux().$0()}return y},
+Zt:function(a){return this.b.q(0,a)},
+co:function(a,b){var z=this.b
+if(z.x4(0,a))throw H.b(P.FM("Registry: ports must be registered only once."))
+z.t(0,a,b)},
+Wp:function(){var z=this.b
+if(z.gA(z)-this.c.a>0||this.y||!this.x)init.globalState.z.t(0,this.a,this)
+else this.Dm()},
+Dm:[function(){var z,y,x
+z=this.cx
+if(z!=null)z.V1(0)
+for(z=this.b,y=z.gUQ(z),y=y.gk(y);y.F();)y.gl().EC()
+z.V1(0)
+this.c.V1(0)
+init.globalState.z.Rz(0,this.a)
+this.dx.V1(0)
+if(this.ch!=null){for(x=0;z=this.ch,x<z.length;x+=2)z[x].wR(0,z[x+1])
+this.ch=null}},"$0","gIm",0,0,2]},
+NY:{"^":"L:2;a,b",
+$0:function(){this.a.wR(0,this.b)}},
+cC:{"^":"Mh;a,b",
+Jc:function(){var z=this.a
+if(z.b===z.c)return
+return z.Ux()},
+xB:function(){var z,y,x
+z=this.Jc()
+if(z==null){if(init.globalState.e!=null)if(init.globalState.z.x4(0,init.globalState.e.a))if(init.globalState.r){y=init.globalState.e.b
+y=y.gl0(y)}else y=!1
+else y=!1
+else y=!1
+if(y)H.vh(P.FM("Program exited with open ReceivePorts."))
+y=init.globalState
+if(y.x){x=y.z
+x=x.gl0(x)&&y.f.b===0}else x=!1
+if(x){y=y.Q
+x=P.Td(["command","close"])
+x=new H.jP(!0,H.VM(new P.ey(0,null,null,null,null,null,0),[null,P.KN])).a3(x)
+y.toString
+self.postMessage(x)}return!1}z.VU()
+return!0},
+Ex:function(){if(self.window!=null)new H.RA(this).$0()
+else for(;this.xB(););},
+bL:function(){var z,y,x,w,v
+if(!init.globalState.x)this.Ex()
+else try{this.Ex()}catch(x){w=H.p(x)
+z=w
+y=H.ts(x)
+w=init.globalState.Q
+v=P.Td(["command","error","msg",H.d(z)+"\n"+H.d(y)])
+v=new H.jP(!0,P.E8(null,P.KN)).a3(v)
+w.toString
+self.postMessage(v)}}},
+RA:{"^":"L:2;a",
+$0:function(){if(!this.a.xB())return
+P.ww(C.RT,this)}},
+IY:{"^":"Mh;a,b,c",
+VU:function(){var z=this.a
+if(z.y){z.z.push(this)
+return}z.v(this.b)}},
+JH:{"^":"Mh;"},
+jl:{"^":"L:0;a,b,c,d,e,f",
+$0:function(){H.Z7(this.a,this.b,this.c,this.d,this.e,this.f)}},
+Vg:{"^":"L:2;a,b,c,d,e",
+$0:function(){var z,y,x,w
+z=this.e
+z.x=!0
+if(!this.d)this.a.$1(this.c)
+else{y=this.a
+x=H.N7()
+w=H.KT(x,[x,x]).Zg(y)
+if(w)y.$2(this.b,this.c)
+else{x=H.KT(x,[x]).Zg(y)
+if(x)y.$1(this.b)
+else y.$0()}}z.Wp()}},
+Iy:{"^":"Mh;"},
+JM:{"^":"Iy;b,a",
+wR:function(a,b){var z,y,x,w
+z=init.globalState.z.q(0,this.a)
+if(z==null)return
+y=this.b
+if(y.c)return
+x=H.Gx(b)
+if(z.gEE()===y){y=J.U6(x)
+switch(y.q(x,0)){case"pause":z.v8(y.q(x,1),y.q(x,2))
+break
+case"resume":z.cK(y.q(x,1))
+break
+case"add-ondone":z.h4(y.q(x,1),y.q(x,2))
+break
+case"remove-ondone":z.Hh(y.q(x,1))
+break
+case"set-errors-fatal":z.MZ(y.q(x,1),y.q(x,2))
+break
+case"ping":z.l7(y.q(x,1),y.q(x,2),y.q(x,3))
+break
+case"kill":z.bc(y.q(x,1),y.q(x,2))
+break
+case"getErrors":y=y.q(x,1)
+z.dx.AN(0,y)
+break
+case"stopErrors":y=y.q(x,1)
+z.dx.Rz(0,y)
+break}return}y=init.globalState.f
+w="receive "+H.d(b)
+y.a.B7(0,new H.IY(z,new H.Ua(this,x),w))},
+D:function(a,b){var z,y
+if(b==null)return!1
+if(b instanceof H.JM){z=this.b
+y=b.b
+y=z==null?y==null:z===y
+z=y}else z=!1
+return z},
+gM:function(a){return this.b.a}},
+Ua:{"^":"L:0;a,b",
+$0:function(){var z=this.a.b
+if(!z.c)z.z6(0,this.b)}},
+ns:{"^":"Iy;b,c,a",
+wR:function(a,b){var z,y,x
+z=P.Td(["command","message","port",this,"msg",b])
+y=new H.jP(!0,P.E8(null,P.KN)).a3(z)
+if(init.globalState.x){init.globalState.Q.toString
+self.postMessage(y)}else{x=init.globalState.ch.q(0,this.b)
+if(x!=null)x.postMessage(y)}},
+D:function(a,b){var z,y
+if(b==null)return!1
+if(b instanceof H.ns){z=this.b
+y=b.b
+if(z==null?y==null:z===y){z=this.a
+y=b.a
+if(z==null?y==null:z===y){z=this.c
+y=b.c
+y=z==null?y==null:z===y
+z=y}else z=!1}else z=!1}else z=!1
+return z},
+gM:function(a){return(this.b<<16^this.a<<8^this.c)>>>0}},
+yo:{"^":"Mh;a,b,c",
+EC:function(){this.c=!0
+this.b=null},
+z6:function(a,b){if(this.c)return
+this.mY(b)},
+mY:function(a){return this.b.$1(a)},
+$isaL:1},
+yH:{"^":"Mh;a,b,c",
+Qa:function(a,b){var z,y
+if(a===0)z=self.setTimeout==null||init.globalState.x
+else z=!1
+if(z){this.c=1
+z=init.globalState.f
+y=init.globalState.d
+z.a.B7(0,new H.IY(y,new H.FA(this,b),"timer"))
+this.b=!0}else if(self.setTimeout!=null){++init.globalState.f.b
+this.c=self.setTimeout(H.tR(new H.Av(this,b),0),a)}else throw H.b(new P.ub("Timer greater than 0."))},
+static:{
+cy:function(a,b){var z=new H.yH(!0,!1,null)
+z.Qa(a,b)
+return z}}},
+FA:{"^":"L:2;a,b",
+$0:function(){this.a.c=null
+this.b.$0()}},
+Av:{"^":"L:2;a,b",
+$0:function(){this.a.c=null;--init.globalState.f.b
+this.b.$0()}},
+ku:{"^":"Mh;a",
+gM:function(a){var z=this.a
+z=C.jn.wG(z,0)^C.jn.BU(z,4294967296)
+z=(~z>>>0)+(z<<15>>>0)&4294967295
+z=((z^z>>>12)>>>0)*5&4294967295
+z=((z^z>>>4)>>>0)*2057&4294967295
+return(z^z>>>16)>>>0},
+D:function(a,b){var z,y
+if(b==null)return!1
+if(b===this)return!0
+if(b instanceof H.ku){z=this.a
+y=b.a
+return z==null?y==null:z===y}return!1}},
+jP:{"^":"Mh;a,b",
+a3:[function(a){var z,y,x,w,v
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
+z=this.b
+y=z.q(0,a)
+if(y!=null)return["ref",y]
+z.t(0,a,z.gA(z))
+z=J.v(a)
+if(!!z.$isWZ)return["buffer",a]
+if(!!z.$isET)return["typed",a]
+if(!!z.$isDD)return this.BE(a)
+if(!!z.$isym){x=this.gpC()
+w=z.gvc(a)
+w=H.K1(w,x,H.W8(w,"cX",0),null)
+w=P.PW(w,!0,H.W8(w,"cX",0))
+z=z.gUQ(a)
+z=H.K1(z,x,H.W8(z,"cX",0),null)
+return["map",w,P.PW(z,!0,H.W8(z,"cX",0))]}if(!!z.$isvm)return this.xw(a)
+if(!!z.$isvB)this.jf(a)
+if(!!z.$isaL)this.kz(a,"RawReceivePorts can't be transmitted:")
+if(!!z.$isJM)return this.PE(a)
+if(!!z.$isns)return this.ff(a)
+if(!!z.$isL){v=a.$static_name
+if(v==null)this.kz(a,"Closures can't be transmitted:")
+return["function",v]}if(!!z.$isku)return["capability",a.a]
+if(!(a instanceof P.Mh))this.jf(a)
+return["dart",init.classIdExtractor(a),this.jG(init.classFieldsExtractor(a))]},"$1","gpC",2,0,1],
+kz:function(a,b){throw H.b(new P.ub(H.d(b==null?"Can't transmit:":b)+" "+H.d(a)))},
+jf:function(a){return this.kz(a,null)},
+BE:function(a){var z=this.dY(a)
+if(!!a.fixed$length)return["fixed",z]
+if(!a.fixed$length)return["extendable",z]
+if(!a.immutable$list)return["mutable",z]
+if(a.constructor===Array)return["const",z]
+this.kz(a,"Can't serialize indexable: ")},
+dY:function(a){var z,y
+z=[]
+C.Nm.sA(z,a.length)
+for(y=0;y<a.length;++y)z[y]=this.a3(a[y])
+return z},
+jG:function(a){var z
+for(z=0;z<a.length;++z)C.Nm.t(a,z,this.a3(a[z]))
+return a},
+xw:function(a){var z,y,x
+if(!!a.constructor&&a.constructor!==Object)this.kz(a,"Only plain JS Objects are supported:")
+z=Object.keys(a)
+y=[]
+C.Nm.sA(y,z.length)
+for(x=0;x<z.length;++x)y[x]=this.a3(a[z[x]])
+return["js-object",z,y]},
+ff:function(a){if(this.a)return["sendport",a.b,a.a,a.c]
+return["raw sendport",a]},
+PE:function(a){if(this.a)return["sendport",init.globalState.b,a.a,a.b.a]
+return["raw sendport",a]}},
+fP:{"^":"Mh;a,b",
+QS:[function(a){var z,y,x,w,v
+if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
+if(typeof a!=="object"||a===null||a.constructor!==Array)throw H.b(P.q("Bad serialized message: "+H.d(a)))
+switch(C.Nm.gtH(a)){case"ref":return this.b[a[1]]
+case"buffer":z=a[1]
+this.b.push(z)
+return z
+case"typed":z=a[1]
+this.b.push(z)
+return z
+case"fixed":z=a[1]
+this.b.push(z)
+y=H.VM(this.NB(z),[null])
+y.fixed$length=Array
+return y
+case"extendable":z=a[1]
+this.b.push(z)
+return H.VM(this.NB(z),[null])
+case"mutable":z=a[1]
+this.b.push(z)
+return this.NB(z)
+case"const":z=a[1]
+this.b.push(z)
+y=H.VM(this.NB(z),[null])
+y.fixed$length=Array
+return y
+case"map":return this.di(a)
+case"sendport":return this.Vf(a)
+case"raw sendport":z=a[1]
+this.b.push(z)
+return z
+case"js-object":return this.ZQ(a)
+case"function":z=init.globalFunctions[a[1]]()
+this.b.push(z)
+return z
+case"capability":return new H.ku(a[1])
+case"dart":x=a[1]
+w=a[2]
+v=init.instanceFromClassId(x)
+this.b.push(v)
+this.NB(w)
+return init.initializeEmptyInstance(x,v,w)
+default:throw H.b("couldn't deserialize: "+H.d(a))}},"$1","gia",2,0,1],
+NB:function(a){var z
+for(z=0;z<a.length;++z)C.Nm.t(a,z,this.QS(a[z]))
+return a},
+di:function(a){var z,y,x,w,v
+z=a[1]
+y=a[2]
+x=P.u5()
+this.b.push(x)
+z=J.iu(z,this.gia()).br(0)
+for(w=J.U6(y),v=0;v<z.length;++v)x.t(0,z[v],this.QS(w.q(y,v)))
+return x},
+Vf:function(a){var z,y,x,w,v,u,t
+z=a[1]
+y=a[2]
+x=a[3]
+w=init.globalState.b
+if(z==null?w==null:z===w){v=init.globalState.z.q(0,y)
+if(v==null)return
+u=v.Zt(x)
+if(u==null)return
+t=new H.JM(u,y)}else t=new H.ns(z,x,y)
+this.b.push(t)
+return t},
+ZQ:function(a){var z,y,x,w,v,u
+z=a[1]
+y=a[2]
+x={}
+this.b.push(x)
+for(w=J.U6(z),v=J.U6(y),u=0;u<w.gA(z);++u)x[w.q(z,u)]=this.QS(v.q(y,u))
+return x}}}],["","",,H,{"^":"",
+e:function(a){return init.types[a]},
+wV:function(a,b){var z
+if(b!=null){z=b.x
+if(z!=null)return z}return!!J.v(a).$isXj},
+d:function(a){var z
+if(typeof a==="string")return a
+if(typeof a==="number"){if(a!==0)return""+a}else if(!0===a)return"true"
+else if(!1===a)return"false"
+else if(a==null)return"null"
+z=J.A(a)
+if(typeof z!=="string")throw H.b(H.G(a))
+return z},
+wP:function(a){var z=a.$identityHash
+if(z==null){z=Math.random()*0x3fffffff|0
+a.$identityHash=z}return z},
+l:function(a){var z,y,x,w,v,u,t,s
+z=J.v(a)
+y=z.constructor
+if(typeof y=="function"){x=y.name
+w=typeof x==="string"?x:null}else w=null
+if(w==null||z===C.Ok||!!J.v(a).$isk){v=C.w2(a)
+if(v==="Object"){u=a.constructor
+if(typeof u=="function"){t=String(u).match(/^\s*function\s*([\w$]*)\s*\(/)
+s=t==null?null:t[1]
+if(typeof s==="string"&&/^\w+$/.test(s))w=s}if(w==null)w=v}else w=v}w=w
+if(w.length>1&&C.xB.J(w,0)===36)w=C.xB.G(w,1)
+return function(b,c){return b.replace(/[^<,> ]+/g,function(d){return c[d]||d})}(w+H.i(H.j(a),0,null),init.mangledGlobalNames)},
+H:function(a){return"Instance of '"+H.l(a)+"'"},
+VK:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(H.G(a))
+return a[b]},
+aw:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(H.G(a))
+a[b]=c},
+HY:function(a,b){var z
+if(typeof b!=="number"||Math.floor(b)!==b)return new P.AT(!0,b,"index",null)
+z=J.Hm(a)
+if(b<0||b>=z)return P.Cf(b,a,"index",null,z)
+return P.F(b,"index",null)},
+G:function(a){return new P.AT(!0,a,null,null)},
+fI:function(a){return a},
+Yx:function(a){return a},
+b:function(a){var z
+if(a==null)a=new P.B()
+z=new Error()
+z.dartException=a
+if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.J})
+z.name=""}else z.toString=H.J
+return z},
+J:function(){return J.A(this.dartException)},
+vh:function(a){throw H.b(a)},
+lk:function(a){throw H.b(new P.UV(a))},
+p:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+z=new H.Hk(a)
+if(a==null)return
+if(typeof a!=="object")return a
+if("dartException" in a)return z.$1(a.dartException)
+else if(!("message" in a))return a
+y=a.message
+if("number" in a&&typeof a.number=="number"){x=a.number
+w=x&65535
+if((C.jn.wG(x,16)&8191)===10)switch(w){case 438:return z.$1(H.T3(H.d(y)+" (Error "+w+")",null))
+case 445:case 5007:v=H.d(y)+" (Error "+w+")"
+return z.$1(new H.ZQ(v,null))}}if(a instanceof TypeError){u=$.$get$U2()
+t=$.$get$k1()
+s=$.$get$Re()
+r=$.$get$fN()
+q=$.$get$qi()
+p=$.$get$rZ()
+o=$.$get$BX()
+$.$get$tt()
+n=$.$get$dt()
+m=$.$get$A7()
+l=u.qS(y)
+if(l!=null)return z.$1(H.T3(y,l))
+else{l=t.qS(y)
+if(l!=null){l.method="call"
+return z.$1(H.T3(y,l))}else{l=s.qS(y)
+if(l==null){l=r.qS(y)
+if(l==null){l=q.qS(y)
+if(l==null){l=p.qS(y)
+if(l==null){l=o.qS(y)
+if(l==null){l=r.qS(y)
+if(l==null){l=n.qS(y)
+if(l==null){l=m.qS(y)
+v=l!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
+if(v)return z.$1(new H.ZQ(y,l==null?null:l.method))}}return z.$1(new H.vV(typeof y==="string"?y:""))}if(a instanceof RangeError){if(typeof y==="string"&&y.indexOf("call stack")!==-1)return new P.VS()
+y=function(b){try{return String(b)}catch(k){}return null}(a)
+return z.$1(new P.AT(!1,null,null,typeof y==="string"?y.replace(/^RangeError:\s*/,""):y))}if(typeof InternalError=="function"&&a instanceof InternalError)if(typeof y==="string"&&y==="too much recursion")return new P.VS()
+return a},
+ts:function(a){var z
+if(a==null)return new H.XO(a,null)
+z=a.$cachedTrace
+if(z!=null)return z
+return a.$cachedTrace=new H.XO(a,null)},
+CU:function(a){if(a==null||typeof a!='object')return J.hf(a)
+else return H.wP(a)},
+B7:function(a,b){var z,y,x,w
+z=a.length
+for(y=0;y<z;y=w){x=y+1
+w=x+1
+b.t(0,a[y],a[x])}return b},
+ft:function(a,b,c,d,e,f,g){switch(c){case 0:return H.zd(b,new H.dr(a))
+case 1:return H.zd(b,new H.TL(a,d))
+case 2:return H.zd(b,new H.KX(a,d,e))
+case 3:return H.zd(b,new H.uZ(a,d,e,f))
+case 4:return H.zd(b,new H.OQ(a,d,e,f,g))}throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},
+tR:function(a,b){var z
+if(a==null)return
+z=a.$identity
+if(!!z)return z
+z=function(c,d,e,f){return function(g,h,i,j){return f(c,e,d,g,h,i,j)}}(a,b,init.globalState.d,H.ft)
+a.$identity=z
+return z},
+iA:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=b[0]
+y=z.$callName
+if(!!J.v(c).$iszM){z.$reflectionInfo=c
+x=H.I(z).r}else x=c
+w=d?Object.create(new H.zx().constructor.prototype):Object.create(new H.rT(null,null,null,null).constructor.prototype)
+w.$initialize=w.constructor
+if(d)v=function(){this.$initialize()}
+else{u=$.yj
+$.yj=u+1
+u=new Function("a,b,c,d","this.$initialize(a,b,c,d);"+u)
+v=u}w.constructor=v
+v.prototype=w
+u=!d
+if(u){t=e.length==1&&!0
+s=H.bx(a,z,t)
+s.$reflectionInfo=c}else{w.$static_name=f
+s=z
+t=!1}if(typeof x=="number")r=function(g,h){return function(){return g(h)}}(H.e,x)
+else if(u&&typeof x=="function"){q=t?H.yS:H.DV
+r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
+w.$signature=r
+w[y]=s
+for(u=b.length,p=1;p<u;++p){o=b[p]
+n=o.$callName
+if(n!=null){m=d?o:H.bx(a,o,t)
+w[n]=m}}w["call*"]=s
+w.$requiredArgCount=z.$requiredArgCount
+w.$defaultValues=z.$defaultValues
+return v},
+vq:function(a,b,c,d){var z=H.DV
+switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
+case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
+case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
+case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
+case 4:return function(e,f){return function(g,h,i,j){return f(this)[e](g,h,i,j)}}(c,z)
+case 5:return function(e,f){return function(g,h,i,j,k){return f(this)[e](g,h,i,j,k)}}(c,z)
+default:return function(e,f){return function(){return e.apply(f(this),arguments)}}(d,z)}},
+bx:function(a,b,c){var z,y,x,w,v,u
+if(c)return H.Hf(a,b)
+z=b.$stubName
+y=b.length
+x=a[z]
+w=b==null?x==null:b===x
+v=!w||y>=27
+if(v)return H.vq(y,!w,z,b)
+if(y===0){w=$.mJ
+if(w==null){w=H.E2("self")
+$.mJ=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
+v=$.yj
+$.yj=v+1
+return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
+w="return function("+u+"){return this."
+v=$.mJ
+if(v==null){v=H.E2("self")
+$.mJ=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
+w=$.yj
+$.yj=w+1
+return new Function(v+H.d(w)+"}")()},
+Z4:function(a,b,c,d){var z,y
+z=H.DV
+y=H.yS
+switch(b?-1:a){case 0:throw H.b(new H.Eq("Intercepted function with no arguments."))
+case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
+case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
+case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
+case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
+case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
+case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
+default:return function(e,f,g,h){return function(){h=[g(this)]
+Array.prototype.push.apply(h,arguments)
+return e.apply(f(this),h)}}(d,z,y)}},
+Hf:function(a,b){var z,y,x,w,v,u,t,s
+z=H.oN()
+y=$.P4
+if(y==null){y=H.E2("receiver")
+$.P4=y}x=b.$stubName
+w=b.length
+v=a[x]
+u=b==null?v==null:b===v
+t=!u||w>=28
+if(t)return H.Z4(w,!u,x,b)
+if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
+u=$.yj
+$.yj=u+1
+return new Function(y+H.d(u)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
+y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
+u=$.yj
+$.yj=u+1
+return new Function(y+H.d(u)+"}")()},
+qm:function(a,b,c,d,e,f){var z
+b.fixed$length=Array
+if(!!J.v(c).$iszM){c.fixed$length=Array
+z=c}else z=c
+return H.iA(a,b,z,!!d,e,f)},
+SE:function(a,b){var z=J.U6(b)
+throw H.b(H.aq(H.l(a),z.C(b,3,z.gA(b))))},
+Go:function(a,b){var z
+if(a!=null)z=(typeof a==="object"||typeof a==="function")&&J.v(a)[b]
+else z=!0
+if(z)return a
+H.SE(a,b)},
+eQ:function(a){throw H.b(new P.t7("Cyclic initialization for static "+H.d(a)))},
+KT:function(a,b,c){return new H.tD(a,b,c,null)},
+N7:function(){return C.KZ},
+Uh:function(){return(Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296},
+VM:function(a,b){a.$builtinTypeInfo=b
+return a},
+j:function(a){if(a==null)return
+return a.$builtinTypeInfo},
+IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.j(a))},
+W8:function(a,b,c){var z=H.IM(a,b)
+return z==null?null:z[c]},
+Kp:function(a,b){var z=H.j(a)
+return z==null?null:z[b]},
+Ko:function(a,b){if(a==null)return"dynamic"
+else if(typeof a==="object"&&a!==null&&a.constructor===Array)return a[0].builtin$cls+H.i(a,1,b)
+else if(typeof a=="function")return a.builtin$cls
+else if(typeof a==="number"&&Math.floor(a)===a)return C.jn.w(a)
+else return},
+i:function(a,b,c){var z,y,x,w,v,u
+if(a==null)return""
+z=new P.Rn("")
+for(y=b,x=!0,w=!0,v="";y<a.length;++y){if(x)x=!1
+else z.a=v+", "
+u=a[y]
+if(u!=null)w=!1
+v=z.a+=H.d(H.Ko(u,c))}return w?"":"<"+H.d(z)+">"},
+Y9:function(a,b){if(typeof a=="function"){a=a.apply(null,b)
+if(a==null)return a
+if(typeof a==="object"&&a!==null&&a.constructor===Array)return a
+if(typeof a=="function")return a.apply(null,b)}return b},
+hv:function(a,b){var z,y
+if(a==null||b==null)return!0
+z=a.length
+for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
+return!0},
+IG:function(a,b,c){return a.apply(b,H.IM(b,c))},
+t1:function(a,b){var z,y,x,w,v
+if(a===b)return!0
+if(a==null||b==null)return!0
+if('func' in b)return H.Ly(a,b)
+if('func' in a)return b.builtin$cls==="EH"
+z=typeof a==="object"&&a!==null&&a.constructor===Array
+y=z?a[0]:a
+x=typeof b==="object"&&b!==null&&b.constructor===Array
+w=x?b[0]:b
+if(w!==y){if(!('$is'+H.Ko(w,null) in y.prototype))return!1
+v=y.prototype["$as"+H.d(H.Ko(w,null))]}else v=null
+if(!z&&v==null||!x)return!0
+z=z?a.slice(1):null
+x=x?b.slice(1):null
+return H.hv(H.Y9(v,z),x)},
+Hc:function(a,b,c){var z,y,x,w,v
+z=b==null
+if(z&&a==null)return!0
+if(z)return c
+if(a==null)return!1
+y=a.length
+x=b.length
+if(c){if(y<x)return!1}else if(y!==x)return!1
+for(w=0;w<x;++w){z=a[w]
+v=b[w]
+if(!(H.t1(z,v)||H.t1(v,z)))return!1}return!0},
+Vt:function(a,b){var z,y,x,w,v,u
+if(b==null)return!0
+if(a==null)return!1
+z=Object.getOwnPropertyNames(b)
+z.fixed$length=Array
+y=z
+for(z=y.length,x=0;x<z;++x){w=y[x]
+if(!Object.hasOwnProperty.call(a,w))return!1
+v=b[w]
+u=a[w]
+if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
+Ly:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
+if(!('func' in a))return!1
+if("v" in a){if(!("v" in b)&&"ret" in b)return!1}else if(!("v" in b)){z=a.ret
+y=b.ret
+if(!(H.t1(z,y)||H.t1(y,z)))return!1}x=a.args
+w=b.args
+v=a.opt
+u=b.opt
+t=x!=null?x.length:0
+s=w!=null?w.length:0
+r=v!=null?v.length:0
+q=u!=null?u.length:0
+if(t>s)return!1
+if(t+r<s+q)return!1
+if(t===s){if(!H.Hc(x,w,!1))return!1
+if(!H.Hc(v,u,!0))return!1}else{for(p=0;p<t;++p){o=x[p]
+n=w[p]
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=p,l=0;m<s;++l,++m){o=v[l]
+n=w[m]
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
+n=u[m]
+if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
+F3:function(a){var z=$.n
+return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
+kE:function(a){return H.wP(a)},
+iw:function(a,b,c){Object.defineProperty(a,b,{value:c,enumerable:false,writable:true,configurable:true})},
+w:function(a){var z,y,x,w,v,u
+z=$.n.$1(a)
+y=$.z[z]
+if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
+return y.i}x=$.a[z]
+if(x!=null)return x
+w=init.interceptorsByTag[z]
+if(w==null){z=$.c.$2(a,z)
+if(z!=null){y=$.z[z]
+if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
+return y.i}x=$.a[z]
+if(x!=null)return x
+w=init.interceptorsByTag[z]}}if(w==null)return
+x=w.prototype
+v=z[0]
+if(v==="!"){y=H.C(x)
+$.z[z]=y
+Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
+return y.i}if(v==="~"){$.a[z]=x
+return x}if(v==="-"){u=H.C(x)
+Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
+return u.i}if(v==="+")return H.Lc(a,x)
+if(v==="*")throw H.b(new P.D(z))
+if(init.leafTags[z]===true){u=H.C(x)
+Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
+return u.i}else return H.Lc(a,x)},
+Lc:function(a,b){var z=Object.getPrototypeOf(a)
+Object.defineProperty(z,init.dispatchPropertyName,{value:J.Qu(b,z,null,null),enumerable:false,writable:true,configurable:true})
+return b},
+C:function(a){return J.Qu(a,!1,null,!!a.$isXj)},
+VF:function(a,b,c){var z=b.prototype
+if(init.leafTags[a]===true)return J.Qu(z,!1,null,!!z.$isXj)
+else return J.Qu(z,c,null,null)},
+u:function(){if(!0===$.M)return
+$.M=!0
+H.Z1()},
+Z1:function(){var z,y,x,w,v,u,t,s
+$.z=Object.create(null)
+$.a=Object.create(null)
+H.f()
+z=init.interceptorsByTag
+y=Object.getOwnPropertyNames(z)
+if(typeof window!="undefined"){window
+x=function(){}
+for(w=0;w<y.length;++w){v=y[w]
+u=$.x7.$1(v)
+if(u!=null){t=H.VF(v,z[v],u)
+if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
+x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
+if(/^[A-Za-z_]/.test(v)){s=z[v]
+z["!"+v]=s
+z["~"+v]=s
+z["-"+v]=s
+z["+"+v]=s
+z["*"+v]=s}}},
+f:function(){var z,y,x,w,v,u,t
+z=C.M1()
+z=H.ud(C.Mc,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.Jh,H.ud(C.lR,H.ud(C.ur(C.w2),z)))))))
+if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
+if(typeof y=="function")y=[y]
+if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
+if(typeof w=="function")z=w(z)||z}}v=z.getTag
+u=z.getUnknownTag
+t=z.prototypeForTag
+$.n=new H.y(v)
+$.c=new H.dC(u)
+$.x7=new H.wN(t)},
+ud:function(a,b){return a(b)||b},
+FD:{"^":"Mh;a,b,c,d,e,f,r,x",static:{
+I:function(a){var z,y,x
+z=a.$reflectionInfo
+if(z==null)return
+z.fixed$length=Array
+z=z
+y=z[0]
+x=z[1]
+return new H.FD(a,z,(y&1)===1,y>>1,x>>1,(x&1)===1,z[2],null)}}},
+Zr:{"^":"Mh;a,b,c,d,e,f",
+qS:function(a){var z,y,x
+z=new RegExp(this.a).exec(a)
+if(z==null)return
+y=Object.create(null)
+x=this.b
+if(x!==-1)y.arguments=z[x+1]
+x=this.c
+if(x!==-1)y.argumentsExpr=z[x+1]
+x=this.d
+if(x!==-1)y.expr=z[x+1]
+x=this.e
+if(x!==-1)y.method=z[x+1]
+x=this.f
+if(x!==-1)y.receiver=z[x+1]
+return y},
+static:{
+cM:function(a){var z,y,x,w,v,u
+a=a.replace(String({}),'$receiver$').replace(/[[\]{}()*+?.\\^$|]/g,"\\$&")
+z=a.match(/\\\$[a-zA-Z]+\\\$/g)
+if(z==null)z=[]
+y=z.indexOf("\\$arguments\\$")
+x=z.indexOf("\\$argumentsExpr\\$")
+w=z.indexOf("\\$expr\\$")
+v=z.indexOf("\\$method\\$")
+u=z.indexOf("\\$receiver\\$")
+return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},
+S7:function(a){return function($expr$){var $argumentsExpr$='$arguments$'
+try{$expr$.$method$($argumentsExpr$)}catch(z){return z.message}}(a)},
+Mj:function(a){return function($expr$){try{$expr$.$method$}catch(z){return z.message}}(a)}}},
+ZQ:{"^":"Ge;a,b",
+w:function(a){var z=this.b
+if(z==null)return"NullError: "+H.d(this.a)
+return"NullError: method not found: '"+H.d(z)+"' on null"}},
+az:{"^":"Ge;a,b,c",
+w:function(a){var z,y
+z=this.b
+if(z==null)return"NoSuchMethodError: "+H.d(this.a)
+y=this.c
+if(y==null)return"NoSuchMethodError: method not found: '"+H.d(z)+"' ("+H.d(this.a)+")"
+return"NoSuchMethodError: method not found: '"+H.d(z)+"' on '"+H.d(y)+"' ("+H.d(this.a)+")"},
+static:{
+T3:function(a,b){var z,y
+z=b==null
+y=z?null:b.method
+return new H.az(a,y,z?null:b.receiver)}}},
+vV:{"^":"Ge;a",
+w:function(a){var z=this.a
+return z.length===0?"Error":"Error: "+z}},
+Hk:{"^":"L:1;a",
+$1:function(a){if(!!J.v(a).$isGe)if(a.$thrownJsError==null)a.$thrownJsError=this.a
+return a}},
+XO:{"^":"Mh;a,b",
+w:function(a){var z,y
+z=this.b
+if(z!=null)return z
+z=this.a
+y=z!==null&&typeof z==="object"?z.stack:null
+z=y==null?"":y
+this.b=z
+return z}},
+dr:{"^":"L:0;a",
+$0:function(){return this.a.$0()}},
+TL:{"^":"L:0;a,b",
+$0:function(){return this.a.$1(this.b)}},
+KX:{"^":"L:0;a,b,c",
+$0:function(){return this.a.$2(this.b,this.c)}},
+uZ:{"^":"L:0;a,b,c,d",
+$0:function(){return this.a.$3(this.b,this.c,this.d)}},
+OQ:{"^":"L:0;a,b,c,d,e",
+$0:function(){return this.a.$4(this.b,this.c,this.d,this.e)}},
+L:{"^":"Mh;",
+w:function(a){return"Closure '"+H.l(this)+"'"},
+gQl:function(){return this},
+gQl:function(){return this}},
+Bp:{"^":"L;"},
+zx:{"^":"Bp;",
+w:function(a){var z=this.$static_name
+if(z==null)return"Closure of unknown static method"
+return"Closure '"+z+"'"}},
+rT:{"^":"Bp;a,b,c,d",
+D:function(a,b){if(b==null)return!1
+if(this===b)return!0
+if(!(b instanceof H.rT))return!1
+return this.a===b.a&&this.b===b.b&&this.c===b.c},
+gM:function(a){var z,y
+z=this.c
+if(z==null)y=H.wP(this.a)
+else y=typeof z!=="object"?J.hf(z):H.wP(z)
+return(y^H.wP(this.b))>>>0},
+w:function(a){var z=this.c
+if(z==null)z=this.a
+return"Closure '"+H.d(this.d)+"' of "+H.H(z)},
+static:{
+DV:function(a){return a.a},
+yS:function(a){return a.c},
+oN:function(){var z=$.mJ
+if(z==null){z=H.E2("self")
+$.mJ=z}return z},
+E2:function(a){var z,y,x,w,v
+z=new H.rT("self","target","receiver","name")
+y=Object.getOwnPropertyNames(z)
+y.fixed$length=Array
+x=y
+for(y=x.length,w=0;w<y;++w){v=x[w]
+if(z[v]===a)return v}}}},
+Pe:{"^":"Ge;a",
+w:function(a){return this.a},
+static:{
+aq:function(a,b){return new H.Pe("CastError: Casting value of type "+H.d(a)+" to incompatible type "+H.d(b))}}},
+Eq:{"^":"Ge;a",
+w:function(a){return"RuntimeError: "+H.d(this.a)}},
+lb:{"^":"Mh;"},
+tD:{"^":"lb;a,b,c,d",
+Zg:function(a){var z=this.LC(a)
+return z==null?!1:H.Ly(z,this.za())},
+LC:function(a){var z=J.v(a)
+return"$signature" in z?z.$signature():null},
+za:function(){var z,y,x,w,v,u,t
+z={func:"dynafunc"}
+y=this.a
+x=J.v(y)
+if(!!x.$isnr)z.v=true
+else if(!x.$ishJ)z.ret=y.za()
+y=this.b
+if(y!=null&&y.length!==0)z.args=H.Dz(y)
+y=this.c
+if(y!=null&&y.length!==0)z.opt=H.Dz(y)
+y=this.d
+if(y!=null){w=Object.create(null)
+v=H.kU(y)
+for(x=v.length,u=0;u<x;++u){t=v[u]
+w[t]=y[t].za()}z.named=w}return z},
+w:function(a){var z,y,x,w,v,u,t,s
+z=this.b
+if(z!=null)for(y=z.length,x="(",w=!1,v=0;v<y;++v,w=!0){u=z[v]
+if(w)x+=", "
+x+=J.A(u)}else{x="("
+w=!1}z=this.c
+if(z!=null&&z.length!==0){x=(w?x+", ":x)+"["
+for(y=z.length,w=!1,v=0;v<y;++v,w=!0){u=z[v]
+if(w)x+=", "
+x+=J.A(u)}x+="]"}else{z=this.d
+if(z!=null){x=(w?x+", ":x)+"{"
+t=H.kU(z)
+for(y=t.length,w=!1,v=0;v<y;++v,w=!0){s=t[v]
+if(w)x+=", "
+x+=H.d(z[s].za())+" "+s}x+="}"}}return x+(") -> "+J.A(this.a))},
+static:{
+Dz:function(a){var z,y,x
+a=a
+z=[]
+for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
+return z}}},
+hJ:{"^":"lb;",
+w:function(a){return"dynamic"},
+za:function(){return}},
+N5:{"^":"Mh;a,b,c,d,e,f,r",
+gA:function(a){return this.a},
+gl0:function(a){return this.a===0},
+gvc:function(a){return H.VM(new H.i5(this),[H.Kp(this,0)])},
+gUQ:function(a){return H.K1(this.gvc(this),new H.Mw(this),H.Kp(this,0),H.Kp(this,1))},
+x4:function(a,b){var z,y
+if(typeof b==="string"){z=this.b
+if(z==null)return!1
+return this.Xu(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.c
+if(y==null)return!1
+return this.Xu(y,b)}else return this.CX(b)},
+CX:function(a){var z=this.d
+if(z==null)return!1
+return this.X(this.i(z,this.xi(a)),a)>=0},
+q:function(a,b){var z,y,x
+if(typeof b==="string"){z=this.b
+if(z==null)return
+y=this.i(z,b)
+return y==null?null:y.b}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.c
+if(x==null)return
+y=this.i(x,b)
+return y==null?null:y.b}else return this.aa(b)},
+aa:function(a){var z,y,x
+z=this.d
+if(z==null)return
+y=this.i(z,this.xi(a))
+x=this.X(y,a)
+if(x<0)return
+return y[x].b},
+t:function(a,b,c){var z,y,x,w,v,u
+if(typeof b==="string"){z=this.b
+if(z==null){z=this.j()
+this.b=z}this.m(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.c
+if(y==null){y=this.j()
+this.c=y}this.m(y,b,c)}else{x=this.d
+if(x==null){x=this.j()
+this.d=x}w=this.xi(b)
+v=this.i(x,w)
+if(v==null)this.n(x,w,[this.Y(b,c)])
+else{u=this.X(v,b)
+if(u>=0)v[u].b=c
+else v.push(this.Y(b,c))}}},
+Rz:function(a,b){if(typeof b==="string")return this.Vz(this.b,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Vz(this.c,b)
+else return this.WM(b)},
+WM:function(a){var z,y,x,w
+z=this.d
+if(z==null)return
+y=this.i(z,this.xi(a))
+x=this.X(y,a)
+if(x<0)return
+w=y.splice(x,1)[0]
+this.Yp(w)
+return w.b},
+V1:function(a){if(this.a>0){this.f=null
+this.e=null
+this.d=null
+this.c=null
+this.b=null
+this.a=0
+this.r=this.r+1&67108863}},
+U:function(a,b){var z,y
+z=this.e
+y=this.r
+for(;z!=null;){b.$2(z.a,z.b)
+if(y!==this.r)throw H.b(new P.UV(this))
+z=z.c}},
+m:function(a,b,c){var z=this.i(a,b)
+if(z==null)this.n(a,b,this.Y(b,c))
+else z.b=c},
+Vz:function(a,b){var z
+if(a==null)return
+z=this.i(a,b)
+if(z==null)return
+this.Yp(z)
+this.R(a,b)
+return z.b},
+Y:function(a,b){var z,y
+z=new H.db(a,b,null,null)
+if(this.e==null){this.f=z
+this.e=z}else{y=this.f
+z.d=y
+y.c=z
+this.f=z}++this.a
+this.r=this.r+1&67108863
+return z},
+Yp:function(a){var z,y
+z=a.d
+y=a.c
+if(z==null)this.e=y
+else z.c=y
+if(y==null)this.f=z
+else y.d=z;--this.a
+this.r=this.r+1&67108863},
+xi:function(a){return J.hf(a)&0x3ffffff},
+X:function(a,b){var z,y
+if(a==null)return-1
+z=a.length
+for(y=0;y<z;++y)if(J.RM(a[y].a,b))return y
+return-1},
+w:function(a){return P.vW(this)},
+i:function(a,b){return a[b]},
+n:function(a,b,c){a[b]=c},
+R:function(a,b){delete a[b]},
+Xu:function(a,b){return this.i(a,b)!=null},
+j:function(){var z=Object.create(null)
+this.n(z,"<non-identifier-key>",z)
+this.R(z,"<non-identifier-key>")
+return z},
+$isym:1},
+Mw:{"^":"L:1;a",
+$1:function(a){return this.a.q(0,a)}},
+db:{"^":"Mh;a,b,c,d"},
+i5:{"^":"cX;a",
+gA:function(a){return this.a.a},
+gk:function(a){var z,y
+z=this.a
+y=new H.N6(z,z.r,null,null)
+y.c=z.e
+return y},
+U:function(a,b){var z,y,x
+z=this.a
+y=z.e
+x=z.r
+for(;y!=null;){b.$1(y.a)
+if(x!==z.r)throw H.b(new P.UV(z))
+y=y.c}},
+$isqC:1},
+N6:{"^":"Mh;a,b,c,d",
+gl:function(){return this.d},
+F:function(){var z=this.a
+if(this.b!==z.r)throw H.b(new P.UV(z))
+else{z=this.c
+if(z==null){this.d=null
+return!1}else{this.d=z.a
+this.c=z.c
+return!0}}}},
+y:{"^":"L:1;a",
+$1:function(a){return this.a(a)}},
+dC:{"^":"L:8;a",
+$2:function(a,b){return this.a(a,b)}},
+wN:{"^":"L:9;a",
+$1:function(a){return this.a(a)}},
+VR:{"^":"Mh;a,b,c,d",
+w:function(a){return"RegExp/"+this.a+"/"},
+static:{
+v4:function(a,b,c,d){var z,y,x,w
+H.Yx(a)
+z=b?"m":""
+y=c?"":"i"
+x=d?"g":""
+w=function(e,f){try{return new RegExp(e,f)}catch(v){return v}}(a,z+y+x)
+if(w instanceof RegExp)return w
+throw H.b(new P.aE("Illegal RegExp pattern ("+String(w)+")",a,null))}}}}],["","",,H,{"^":"",
+Wp:function(){return new P.lj("No element")},
+Am:function(){return new P.lj("Too many elements")},
+ar:function(){return new P.lj("Too few elements")},
+ho:{"^":"cX;",
+gk:function(a){return new H.a7(this,this.gA(this),0,null)},
+U:function(a,b){var z,y
+z=this.gA(this)
+for(y=0;y<z;++y){b.$1(this.W(0,y))
+if(z!==this.gA(this))throw H.b(new P.UV(this))}},
+S:function(a,b){return this.p(this,b)},
+tt:function(a,b){var z,y
+z=H.VM([],[H.W8(this,"ho",0)])
+C.Nm.sA(z,this.gA(this))
+for(y=0;y<this.gA(this);++y)z[y]=this.W(0,y)
+return z},
+br:function(a){return this.tt(a,!0)},
+$isqC:1},
+a7:{"^":"Mh;a,b,c,d",
+gl:function(){return this.d},
+F:function(){var z,y,x,w
+z=this.a
+y=J.U6(z)
+x=y.gA(z)
+if(this.b!==x)throw H.b(new P.UV(z))
+w=this.c
+if(w>=x){this.d=null
+return!1}this.d=y.W(z,w);++this.c
+return!0}},
+i1:{"^":"cX;a,b",
+gk:function(a){var z=new H.MH(null,J.IT(this.a),this.b)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z},
+gA:function(a){return J.Hm(this.a)},
+$ascX:function(a,b){return[b]},
+static:{
+K1:function(a,b,c,d){if(!!J.v(a).$isqC)return H.VM(new H.xy(a,b),[c,d])
+return H.VM(new H.i1(a,b),[c,d])}}},
+xy:{"^":"i1;a,b",$isqC:1},
+MH:{"^":"An;a,b,c",
+F:function(){var z=this.b
+if(z.F()){this.a=this.Mi(z.gl())
+return!0}this.a=null
+return!1},
+gl:function(){return this.a},
+Mi:function(a){return this.c.$1(a)}},
+A8:{"^":"ho;a,b",
+gA:function(a){return J.Hm(this.a)},
+W:function(a,b){return this.Mi(J.GA(this.a,b))},
+Mi:function(a){return this.b.$1(a)},
+$asho:function(a,b){return[b]},
+$ascX:function(a,b){return[b]},
+$isqC:1},
+U5:{"^":"cX;a,b",
+gk:function(a){var z=new H.SO(J.IT(this.a),this.b)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+return z}},
+SO:{"^":"An;a,b",
+F:function(){for(var z=this.a;z.F();)if(this.Mi(z.gl()))return!0
+return!1},
+gl:function(){return this.a.gl()},
+Mi:function(a){return this.b.$1(a)}},
+SU:{"^":"Mh;"}}],["","",,H,{"^":"",
+kU:function(a){var z=H.VM(a?Object.keys(a):[],[null])
+z.fixed$length=Array
+return z}}],["","",,P,{"^":"",
+Oj:function(){var z,y,x
+z={}
+if(self.scheduleImmediate!=null)return P.EX()
+if(self.MutationObserver!=null&&self.document!=null){y=self.document.createElement("div")
+x=self.document.createElement("span")
+z.a=null
+new self.MutationObserver(H.tR(new P.th(z),1)).observe(y,{childList:true})
+return new P.ha(z,y,x)}else if(self.setImmediate!=null)return P.yt()
+return P.qW()},
+ZV:[function(a){++init.globalState.f.b
+self.scheduleImmediate(H.tR(new P.C6(a),0))},"$1","EX",2,0,3],
+oA:[function(a){++init.globalState.f.b
+self.setImmediate(H.tR(new P.Ft(a),0))},"$1","yt",2,0,3],
+Bz:[function(a){P.YF(C.RT,a)},"$1","qW",2,0,3],
+VH:function(a,b){var z=H.N7()
+z=H.KT(z,[z,z]).Zg(a)
+if(z){b.toString
+return a}else{b.toString
+return a}},
+pu:function(){var z,y
+for(;z=$.S6,z!=null;){$.mg=null
+y=z.b
+$.S6=y
+if(y==null)$.k8=null
+z.a.$0()}},
+eN:[function(){$.UD=!0
+try{P.pu()}finally{$.mg=null
+$.UD=!1
+if($.S6!=null)$.$get$Wc().$1(P.UI())}},"$0","UI",0,0,2],
+eW:function(a){var z=new P.OM(a,null)
+if($.S6==null){$.k8=z
+$.S6=z
+if(!$.UD)$.$get$Wc().$1(P.UI())}else{$.k8.b=z
+$.k8=z}},
+rR:function(a){var z,y,x
+z=$.S6
+if(z==null){P.eW(a)
+$.mg=$.k8
+return}y=new P.OM(a,null)
+x=$.mg
+if(x==null){y.b=z
+$.mg=y
+$.S6=y}else{y.b=x.b
+x.b=y
+$.mg=y
+if(y.b==null)$.k8=y}},
+rb:function(a){var z=$.X3
+if(C.NU===z){P.Tk(null,null,C.NU,a)
+return}z.toString
+P.Tk(null,null,z,z.kb(a,!0))},
+FE:function(a,b,c){var z,y,x,w,v,u,t
+try{b.$1(a.$0())}catch(u){t=H.p(u)
+z=t
+y=H.ts(u)
+$.X3.toString
+x=null
+if(x==null)c.$2(z,y)
+else{t=J.YA(x)
+w=t
+v=x.gII()
+c.$2(w,v)}}},
+NX:function(a,b,c,d){var z=a.Gv(0)
+if(!!J.v(z).$isb8)z.wM(new P.v1(b,c,d))
+else b.ZL(c,d)},
+TB:function(a,b){return new P.uR(a,b)},
+ww:function(a,b){var z=$.X3
+if(z===C.NU){z.toString
+return P.YF(a,b)}return P.YF(a,z.kb(b,!0))},
+YF:function(a,b){var z=C.jn.BU(a.a,1000)
+return H.cy(z<0?0:z,b)},
+L2:function(a,b,c,d,e){var z={}
+z.a=d
+P.rR(new P.pK(z,e))},
+T8:function(a,b,c,d){var z,y
+y=$.X3
+if(y===c)return d.$0()
+$.X3=c
+z=y
+try{y=d.$0()
+return y}finally{$.X3=z}},
+yv:function(a,b,c,d,e){var z,y
+y=$.X3
+if(y===c)return d.$1(e)
+$.X3=c
+z=y
+try{y=d.$1(e)
+return y}finally{$.X3=z}},
+Qx:function(a,b,c,d,e,f){var z,y
+y=$.X3
+if(y===c)return d.$2(e,f)
+$.X3=c
+z=y
+try{y=d.$2(e,f)
+return y}finally{$.X3=z}},
+Tk:function(a,b,c,d){var z=C.NU!==c
+if(z)d=c.kb(d,!(!z||!1))
+P.eW(d)},
+th:{"^":"L:1;a",
+$1:function(a){var z,y;--init.globalState.f.b
+z=this.a
+y=z.a
+z.a=null
+y.$0()}},
+ha:{"^":"L:10;a,b,c",
+$1:function(a){var z,y;++init.globalState.f.b
+this.a.a=a
+z=this.b
+y=this.c
+z.firstChild?z.removeChild(y):z.appendChild(y)}},
+C6:{"^":"L:0;a",
+$0:function(){--init.globalState.f.b
+this.a.$0()}},
+Ft:{"^":"L:0;a",
+$0:function(){--init.globalState.f.b
+this.a.$0()}},
+b8:{"^":"Mh;"},
+Fe:{"^":"Mh;a,b,c,d,e"},
+vs:{"^":"Mh;YM:a@,b,O1:c<",
+Rx:function(a,b){var z,y
+z=$.X3
+if(z!==C.NU){z.toString
+if(b!=null)b=P.VH(b,z)}y=H.VM(new P.vs(0,z,null),[null])
+this.xf(new P.Fe(null,y,b==null?1:3,a,b))
+return y},
+ml:function(a){return this.Rx(a,null)},
+wM:function(a){var z,y
+z=$.X3
+y=new P.vs(0,z,null)
+y.$builtinTypeInfo=this.$builtinTypeInfo
+if(z!==C.NU)z.toString
+this.xf(new P.Fe(null,y,8,a,null))
+return y},
+xf:function(a){var z,y
+z=this.a
+if(z<=1){a.a=this.c
+this.c=a}else{if(z===2){z=this.c
+y=z.a
+if(y<4){z.xf(a)
+return}this.a=y
+this.c=z.c}z=this.b
+z.toString
+P.Tk(null,null,z,new P.da(this,a))}},
+jQ:function(a){var z,y,x,w,v,u
+z={}
+z.a=a
+if(a==null)return
+y=this.a
+if(y<=1){x=this.c
+this.c=a
+if(x!=null){for(w=a;v=w.a,v!=null;w=v);w.a=x}}else{if(y===2){y=this.c
+u=y.a
+if(u<4){y.jQ(a)
+return}this.a=u
+this.c=y.c}z.a=this.N8(a)
+y=this.b
+y.toString
+P.Tk(null,null,y,new P.oQ(z,this))}},
+ah:function(){var z=this.c
+this.c=null
+return this.N8(z)},
+N8:function(a){var z,y,x
+for(z=a,y=null;z!=null;y=z,z=x){x=z.a
+z.a=y}return y},
+HH:function(a){var z
+if(!!J.v(a).$isb8)P.A9(a,this)
+else{z=this.ah()
+this.a=4
+this.c=a
+P.HZ(this,z)}},
+X2:function(a){var z=this.ah()
+this.a=4
+this.c=a
+P.HZ(this,z)},
+ZL:[function(a,b){var z=this.ah()
+this.a=8
+this.c=new P.OH(a,b)
+P.HZ(this,z)},function(a){return this.ZL(a,null)},"yk","$2","$1","gFa",2,2,11,0],
+$isb8:1,
+static:{
+k3:function(a,b){var z,y,x,w
+b.sYM(1)
+try{a.Rx(new P.pV(b),new P.U7(b))}catch(x){w=H.p(x)
+z=w
+y=H.ts(x)
+P.rb(new P.vr(b,z,y))}},
+A9:function(a,b){var z,y,x
+for(;z=a.a,z===2;)a=a.c
+y=b.c
+if(z>=4){b.c=null
+x=b.N8(y)
+b.a=a.a
+b.c=a.c
+P.HZ(b,x)}else{b.a=2
+b.c=a
+a.jQ(y)}},
+HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
+z={}
+z.a=a
+for(y=a;!0;){x={}
+w=y.a===8
+if(b==null){if(w){z=y.c
+y=y.b
+x=z.a
+z=z.b
+y.toString
+P.L2(null,null,y,x,z)}return}for(;v=b.a,v!=null;b=v){b.a=null
+P.HZ(z.a,b)}y=z.a
+u=y.c
+x.a=w
+x.b=u
+t=!w
+if(t){s=b.c
+s=(s&1)!==0||s===8}else s=!0
+if(s){s=b.b
+r=s.b
+if(w){q=y.b
+q.toString
+q=q==null?r==null:q===r
+if(!q)r.toString
+else q=!0
+q=!q}else q=!1
+if(q){z=y.b
+y=u.a
+x=u.b
+z.toString
+P.L2(null,null,z,y,x)
+return}p=$.X3
+if(p==null?r!=null:p!==r)$.X3=r
+else p=null
+y=b.c
+if(y===8)new P.RT(z,x,w,b,r).$0()
+else if(t){if((y&1)!==0)new P.rq(x,w,b,u,r).$0()}else if((y&2)!==0)new P.RW(z,x,b,r).$0()
+if(p!=null)$.X3=p
+y=x.b
+t=J.v(y)
+if(!!t.$isb8){if(!!t.$isvs)if(y.a>=4){o=s.c
+s.c=null
+b=s.N8(o)
+s.a=y.a
+s.c=y.c
+z.a=y
+continue}else P.A9(y,s)
+else P.k3(y,s)
+return}}n=b.b
+o=n.c
+n.c=null
+b=n.N8(o)
+y=x.a
+x=x.b
+if(!y){n.a=4
+n.c=x}else{n.a=8
+n.c=x}z.a=n
+y=n}}}},
+da:{"^":"L:0;a,b",
+$0:function(){P.HZ(this.a,this.b)}},
+oQ:{"^":"L:0;a,b",
+$0:function(){P.HZ(this.b,this.a.a)}},
+pV:{"^":"L:1;a",
+$1:function(a){this.a.X2(a)}},
+U7:{"^":"L:12;a",
+$2:function(a,b){this.a.ZL(a,b)},
+$1:function(a){return this.$2(a,null)}},
+vr:{"^":"L:0;a,b,c",
+$0:function(){this.a.ZL(this.b,this.c)}},
+rq:{"^":"L:2;a,b,c,d,e",
+$0:function(){var z,y,x,w
+try{x=this.a
+x.b=this.e.FI(this.c.d,this.d)
+x.a=!1}catch(w){x=H.p(w)
+z=x
+y=H.ts(w)
+x=this.a
+x.b=new P.OH(z,y)
+x.a=!0}}},
+RW:{"^":"L:2;a,b,c,d",
+$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
+z=this.a.a.c
+y=!0
+r=this.c
+if(r.c===6){x=r.d
+try{y=this.d.FI(x,J.YA(z))}catch(q){r=H.p(q)
+w=r
+v=H.ts(q)
+r=J.YA(z)
+p=w
+o=(r==null?p==null:r===p)?z:new P.OH(w,v)
+r=this.b
+r.b=o
+r.a=!0
+return}}u=r.e
+if(y&&u!=null)try{r=u
+p=H.N7()
+p=H.KT(p,[p,p]).Zg(r)
+n=this.d
+m=this.b
+if(p)m.b=n.mg(u,J.YA(z),z.gII())
+else m.b=n.FI(u,J.YA(z))
+m.a=!1}catch(q){r=H.p(q)
+t=r
+s=H.ts(q)
+r=J.YA(z)
+p=t
+o=(r==null?p==null:r===p)?z:new P.OH(t,s)
+r=this.b
+r.b=o
+r.a=!0}}},
+RT:{"^":"L:2;a,b,c,d,e",
+$0:function(){var z,y,x,w,v,u
+z=null
+try{z=this.e.Gr(this.d.d)}catch(w){v=H.p(w)
+y=v
+x=H.ts(w)
+if(this.c){v=this.a.a.c.a
+u=y
+u=v==null?u==null:v===u
+v=u}else v=!1
+u=this.b
+if(v)u.b=this.a.a.c
+else u.b=new P.OH(y,x)
+u.a=!0
+return}if(!!J.v(z).$isb8){if(z instanceof P.vs&&z.gYM()>=4){if(z.gYM()===8){v=this.b
+v.b=z.gO1()
+v.a=!0}return}v=this.b
+v.b=z.ml(new P.jZ(this.a.a))
+v.a=!1}}},
+jZ:{"^":"L:1;a",
+$1:function(a){return this.a}},
+OM:{"^":"Mh;a,b"},
+qh:{"^":"Mh;",
+U:function(a,b){var z,y
+z={}
+y=H.VM(new P.vs(0,$.X3,null),[null])
+z.a=null
+z.a=this.X5(new P.lz(z,this,b,y),!0,new P.M4(y),y.gFa())
+return y},
+gA:function(a){var z,y
+z={}
+y=H.VM(new P.vs(0,$.X3,null),[P.KN])
+z.a=0
+this.X5(new P.B5(z),!0,new P.PI(z,y),y.gFa())
+return y}},
+lz:{"^":"L;a,b,c,d",
+$1:function(a){P.FE(new P.Rl(this.c,a),new P.Jb(),P.TB(this.a.a,this.d))},
+$signature:function(){return H.IG(function(a){return{func:1,args:[a]}},this.b,"qh")}},
+Rl:{"^":"L:0;a,b",
+$0:function(){return this.a.$1(this.b)}},
+Jb:{"^":"L:1;",
+$1:function(a){}},
+M4:{"^":"L:0;a",
+$0:function(){this.a.HH(null)}},
+B5:{"^":"L:1;a",
+$1:function(a){++this.a.a}},
+PI:{"^":"L:0;a,b",
+$0:function(){this.b.HH(this.a.a)}},
+MO:{"^":"Mh;"},
+NO:{"^":"Mh;"},
+aA:{"^":"Mh;"},
+v1:{"^":"L:0;a,b,c",
+$0:function(){return this.a.ZL(this.b,this.c)}},
+uR:{"^":"L:13;a,b",
+$2:function(a,b){return P.NX(this.a,this.b,a,b)}},
+OH:{"^":"Mh;kc:a>,II:b<",
+w:function(a){return H.d(this.a)},
+$isGe:1},
+m0:{"^":"Mh;"},
+pK:{"^":"L:0;a,b",
+$0:function(){var z,y,x
+z=this.a
+y=z.a
+if(y==null){x=new P.B()
+z.a=x
+z=x}else z=y
+y=this.b
+if(y==null)throw H.b(z)
+x=H.b(z)
+x.stack=J.A(y)
+throw x}},
+R8:{"^":"m0;",
+bH:function(a){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$0()
+return x}x=P.T8(null,null,this,a)
+return x}catch(w){x=H.p(w)
+z=x
+y=H.ts(w)
+return P.L2(null,null,this,z,y)}},
+m1:function(a,b){var z,y,x,w
+try{if(C.NU===$.X3){x=a.$1(b)
+return x}x=P.yv(null,null,this,a,b)
+return x}catch(w){x=H.p(w)
+z=x
+y=H.ts(w)
+return P.L2(null,null,this,z,y)}},
+kb:function(a,b){if(b)return new P.hj(this,a)
+else return new P.MK(this,a)},
+oj:function(a,b){return new P.pQ(this,a)},
+q:function(a,b){return},
+Gr:function(a){if($.X3===C.NU)return a.$0()
+return P.T8(null,null,this,a)},
+FI:function(a,b){if($.X3===C.NU)return a.$1(b)
+return P.yv(null,null,this,a,b)},
+mg:function(a,b,c){if($.X3===C.NU)return a.$2(b,c)
+return P.Qx(null,null,this,a,b,c)}},
+hj:{"^":"L:0;a,b",
+$0:function(){return this.a.bH(this.b)}},
+MK:{"^":"L:0;a,b",
+$0:function(){return this.a.Gr(this.b)}},
+pQ:{"^":"L:1;a,b",
+$1:function(a){return this.a.m1(this.b,a)}}}],["","",,P,{"^":"",
+u5:function(){return H.VM(new H.N5(0,null,null,null,null,null,0),[null,null])},
+Td:function(a){return H.B7(a,H.VM(new H.N5(0,null,null,null,null,null,0),[null,null]))},
+EP:function(a,b,c){var z,y
+if(P.hB(a)){if(b==="("&&c===")")return"(...)"
+return b+"..."+c}z=[]
+y=$.$get$xg()
+y.push(a)
+try{P.Vr(a,z)}finally{y.pop()}y=P.vg(b,z,", ")+c
+return y.charCodeAt(0)==0?y:y},
+WE:function(a,b,c){var z,y,x
+if(P.hB(a))return b+"..."+c
+z=new P.Rn(b)
+y=$.$get$xg()
+y.push(a)
+try{x=z
+x.a=P.vg(x.gI(),a,", ")}finally{y.pop()}y=z
+y.a=y.gI()+c
+y=z.gI()
+return y.charCodeAt(0)==0?y:y},
+hB:function(a){var z,y
+for(z=0;y=$.$get$xg(),z<y.length;++z)if(a===y[z])return!0
+return!1},
+Vr:function(a,b){var z,y,x,w,v,u,t,s,r,q
+z=a.gk(a)
+y=0
+x=0
+while(!0){if(!(y<80||x<3))break
+if(!z.F())return
+w=H.d(z.gl())
+b.push(w)
+y+=w.length+2;++x}if(!z.F()){if(x<=5)return
+v=b.pop()
+u=b.pop()}else{t=z.gl();++x
+if(!z.F()){if(x<=4){b.push(H.d(t))
+return}v=H.d(t)
+u=b.pop()
+y+=v.length+2}else{s=z.gl();++x
+for(;z.F();t=s,s=r){r=z.gl();++x
+if(x>100){while(!0){if(!(y>75&&x>3))break
+y-=b.pop().length+2;--x}b.push("...")
+return}}u=H.d(t)
+v=H.d(s)
+y+=v.length+u.length+4}}if(x>b.length+2){y+=5
+q="..."}else q=null
+while(!0){if(!(y>80&&b.length>3))break
+y-=b.pop().length+2
+if(q==null){y+=5
+q="..."}}if(q!=null)b.push(q)
+b.push(u)
+b.push(v)},
+Ls:function(a,b,c,d){return H.VM(new P.b6(0,null,null,null,null,null,0),[d])},
+tM:function(a,b){var z,y,x
+z=P.Ls(null,null,null,b)
+for(y=a.length,x=0;x<a.length;a.length===y||(0,H.lk)(a),++x)z.AN(0,a[x])
+return z},
+vW:function(a){var z,y,x
+z={}
+if(P.hB(a))return"{...}"
+y=new P.Rn("")
+try{$.$get$xg().push(a)
+x=y
+x.a=x.gI()+"{"
+z.a=!0
+J.hE(a,new P.W0(z,y))
+z=y
+z.a=z.gI()+"}"}finally{$.$get$xg().pop()}z=y.gI()
+return z.charCodeAt(0)==0?z:z},
+ey:{"^":"N5;a,b,c,d,e,f,r",
+xi:function(a){return H.CU(a)&0x3ffffff},
+X:function(a,b){var z,y,x
+if(a==null)return-1
+z=a.length
+for(y=0;y<z;++y){x=a[y].a
+if(x==null?b==null:x===b)return y}return-1},
+static:{
+E8:function(a,b){return H.VM(new P.ey(0,null,null,null,null,null,0),[a,b])}}},
+b6:{"^":"u3;a,b,c,d,e,f,r",
+gk:function(a){var z=new P.lm(this,this.r,null,null)
+z.c=this.e
+return z},
+gA:function(a){return this.a},
+tg:function(a,b){var z,y
+if(typeof b==="string"&&b!=="__proto__"){z=this.b
+if(z==null)return!1
+return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.c
+if(y==null)return!1
+return y[b]!=null}else return this.PR(b)},
+PR:function(a){var z=this.d
+if(z==null)return!1
+return this.DF(z[this.rk(a)],a)>=0},
+Zt:function(a){var z=typeof a==="number"&&(a&0x3ffffff)===a
+if(z)return this.tg(0,a)?a:null
+else return this.vR(a)},
+vR:function(a){var z,y,x
+z=this.d
+if(z==null)return
+y=z[this.rk(a)]
+x=this.DF(y,a)
+if(x<0)return
+return J.w2(y,x).gSk()},
+U:function(a,b){var z,y
+z=this.e
+y=this.r
+for(;z!=null;){b.$1(z.a)
+if(y!==this.r)throw H.b(new P.UV(this))
+z=z.b}},
+AN:function(a,b){var z,y,x
+if(typeof b==="string"&&b!=="__proto__"){z=this.b
+if(z==null){y=Object.create(null)
+y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.b=y
+z=y}return this.cW(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.c
+if(x==null){y=Object.create(null)
+y["<non-identifier-key>"]=y
+delete y["<non-identifier-key>"]
+this.c=y
+x=y}return this.cW(x,b)}else return this.B7(0,b)},
+B7:function(a,b){var z,y,x
+z=this.d
+if(z==null){z=P.T2()
+this.d=z}y=this.rk(b)
+x=z[y]
+if(x==null)z[y]=[this.dg(b)]
+else{if(this.DF(x,b)>=0)return!1
+x.push(this.dg(b))}return!0},
+Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.H4(this.b,b)
+else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.H4(this.c,b)
+else return this.qg(0,b)},
+qg:function(a,b){var z,y,x
+z=this.d
+if(z==null)return!1
+y=z[this.rk(b)]
+x=this.DF(y,b)
+if(x<0)return!1
+this.GS(y.splice(x,1)[0])
+return!0},
+V1:function(a){if(this.a>0){this.f=null
+this.e=null
+this.d=null
+this.c=null
+this.b=null
+this.a=0
+this.r=this.r+1&67108863}},
+cW:function(a,b){if(a[b]!=null)return!1
+a[b]=this.dg(b)
+return!0},
+H4:function(a,b){var z
+if(a==null)return!1
+z=a[b]
+if(z==null)return!1
+this.GS(z)
+delete a[b]
+return!0},
+dg:function(a){var z,y
+z=new P.bn(a,null,null)
+if(this.e==null){this.f=z
+this.e=z}else{y=this.f
+z.c=y
+y.b=z
+this.f=z}++this.a
+this.r=this.r+1&67108863
+return z},
+GS:function(a){var z,y
+z=a.c
+y=a.b
+if(z==null)this.e=y
+else z.b=y
+if(y==null)this.f=z
+else y.c=z;--this.a
+this.r=this.r+1&67108863},
+rk:function(a){return J.hf(a)&0x3ffffff},
+DF:function(a,b){var z,y
+if(a==null)return-1
+z=a.length
+for(y=0;y<z;++y)if(J.RM(a[y].a,b))return y
+return-1},
+$isqC:1,
+static:{
+T2:function(){var z=Object.create(null)
+z["<non-identifier-key>"]=z
+delete z["<non-identifier-key>"]
+return z}}},
+bn:{"^":"Mh;Sk:a<,b,c"},
+lm:{"^":"Mh;a,b,c,d",
+gl:function(){return this.d},
+F:function(){var z=this.a
+if(this.b!==z.r)throw H.b(new P.UV(z))
+else{z=this.c
+if(z==null){this.d=null
+return!1}else{this.d=z.a
+this.c=z.b
+return!0}}}},
+u3:{"^":"Vj;"},
+LU:{"^":"E9;"},
+E9:{"^":"Mh+lD;",$iszM:1,$aszM:null,$isqC:1},
+lD:{"^":"Mh;",
+gk:function(a){return new H.a7(a,this.gA(a),0,null)},
+W:function(a,b){return this.q(a,b)},
+U:function(a,b){var z,y
+z=this.gA(a)
+for(y=0;y<z;++y){b.$1(this.q(a,y))
+if(z!==this.gA(a))throw H.b(new P.UV(a))}},
+S:function(a,b){return H.VM(new H.U5(a,b),[H.W8(a,"lD",0)])},
+ez:function(a,b){return H.VM(new H.A8(a,b),[null,null])},
+w:function(a){return P.WE(a,"[","]")},
+$iszM:1,
+$aszM:null,
+$isqC:1},
+W0:{"^":"L:14;a,b",
+$2:function(a,b){var z,y
+z=this.a
+if(!z.a)this.b.a+=", "
+z.a=!1
+z=this.b
+y=z.a+=H.d(a)
+z.a=y+": "
+z.a+=H.d(b)}},
+Sw:{"^":"cX;a,b,c,d",
+gk:function(a){return new P.o0(this,this.c,this.d,this.b,null)},
+U:function(a,b){var z,y
+z=this.d
+for(y=this.b;y!==this.c;y=(y+1&this.a.length-1)>>>0){b.$1(this.a[y])
+if(z!==this.d)H.vh(new P.UV(this))}},
+gl0:function(a){return this.b===this.c},
+gA:function(a){return(this.c-this.b&this.a.length-1)>>>0},
+V1:function(a){var z,y,x,w
+z=this.b
+y=this.c
+if(z!==y){for(x=this.a,w=x.length-1;z!==y;z=(z+1&w)>>>0)x[z]=null
+this.c=0
+this.b=0;++this.d}},
+w:function(a){return P.WE(this,"{","}")},
+Ux:function(){var z,y,x
+z=this.b
+if(z===this.c)throw H.b(H.Wp());++this.d
+y=this.a
+x=y[z]
+y[z]=null
+this.b=(z+1&y.length-1)>>>0
+return x},
+B7:function(a,b){var z,y
+z=this.a
+y=this.c
+z[y]=b
+z=(y+1&z.length-1)>>>0
+this.c=z
+if(this.b===z)this.wL();++this.d},
+wL:function(){var z,y,x,w
+z=new Array(this.a.length*2)
+z.fixed$length=Array
+y=H.VM(z,[H.Kp(this,0)])
+z=this.a
+x=this.b
+w=z.length-x
+C.Nm.YW(y,0,w,z,x)
+C.Nm.YW(y,w,w+this.b,this.a,0)
+this.b=0
+this.c=this.a.length
+this.a=y},
+Eo:function(a,b){var z=new Array(8)
+z.fixed$length=Array
+this.a=H.VM(z,[b])},
+$isqC:1,
+static:{
+NZ:function(a,b){var z=H.VM(new P.Sw(null,0,0,0),[b])
+z.Eo(a,b)
+return z}}},
+o0:{"^":"Mh;a,b,c,d,e",
+gl:function(){return this.e},
+F:function(){var z,y
+z=this.a
+if(this.c!==z.d)H.vh(new P.UV(z))
+y=this.d
+if(y===this.b){this.e=null
+return!1}z=z.a
+this.e=z[y]
+this.d=(y+1&z.length-1)>>>0
+return!0}},
+Ma:{"^":"Mh;",
+FV:function(a,b){var z
+for(z=J.IT(b);z.F();)this.AN(0,z.gl())},
+w:function(a){return P.WE(this,"{","}")},
+U:function(a,b){var z
+for(z=new P.lm(this,this.r,null,null),z.c=this.e;z.F();)b.$1(z.d)},
+zV:function(a,b){var z,y,x
+z=new P.lm(this,this.r,null,null)
+z.c=this.e
+if(!z.F())return""
+y=new P.Rn("")
+if(b===""){do y.a+=H.d(z.d)
+while(z.F())}else{y.a=H.d(z.d)
+for(;z.F();){y.a+=b
+y.a+=H.d(z.d)}}x=y.a
+return x.charCodeAt(0)==0?x:x},
+$isqC:1},
+Vj:{"^":"Ma;"}}],["","",,P,{"^":"",zF:{"^":"Mh;"},fU:{"^":"Mh;a,b,c,d,e",
+w:function(a){return this.a}},Rc:{"^":"zF;a",
+h:function(a,b,c){var z,y,x,w
+for(z=b,y=null;z<c;++z){switch(a[z]){case"&":x="&"
+break
+case'"':x="""
+break
+case"'":x="'"
+break
+case"<":x="<"
+break
+case">":x=">"
+break
+case"/":x="/"
+break
+default:x=null}if(x!=null){if(y==null)y=new P.Rn("")
+if(z>b){w=C.xB.C(a,b,z)
+y.a=y.a+w}y.a=y.a+x
+b=z+1}}if(y==null)return
+if(c>b)y.a+=J.ld(a,b,c)
+w=y.a
+return w.charCodeAt(0)==0?w:w}}}],["","",,P,{"^":"",
+h:function(a){if(typeof a==="number"||typeof a==="boolean"||null==a)return J.A(a)
+if(typeof a==="string")return JSON.stringify(a)
+return P.o(a)},
+o:function(a){var z=J.v(a)
+if(!!z.$isL)return z.w(a)
+return H.H(a)},
+FM:function(a){return new P.CD(a)},
+PW:function(a,b,c){var z,y
+z=H.VM([],[c])
+for(y=J.IT(a);y.F();)z.push(y.gl())
+if(b)return z
+z.fixed$length=Array
+return z},
+JS:function(a){var z=H.d(a)
+H.qw(z)},
+a2:{"^":"Mh;"},
+"+bool":0,
+iP:{"^":"Mh;"},
+CP:{"^":"lf;"},
+"+double":0,
+a6:{"^":"Mh;a",
+B:function(a,b){return C.jn.B(this.a,b.gm5())},
+D:function(a,b){if(b==null)return!1
+if(!(b instanceof P.a6))return!1
+return this.a===b.a},
+gM:function(a){return this.a&0x1FFFFFFF},
+w:function(a){var z,y,x,w,v
+z=new P.DW()
+y=this.a
+if(y<0)return"-"+new P.a6(-y).w(0)
+x=z.$1(C.jn.JV(C.jn.BU(y,6e7),60))
+w=z.$1(C.jn.JV(C.jn.BU(y,1e6),60))
+v=new P.P7().$1(C.jn.JV(y,1e6))
+return""+C.jn.BU(y,36e8)+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)}},
+P7:{"^":"L:4;",
+$1:function(a){if(a>=1e5)return""+a
+if(a>=1e4)return"0"+a
+if(a>=1000)return"00"+a
+if(a>=100)return"000"+a
+if(a>=10)return"0000"+a
+return"00000"+a}},
+DW:{"^":"L:4;",
+$1:function(a){if(a>=10)return""+a
+return"0"+a}},
+Ge:{"^":"Mh;",
+gII:function(){return H.ts(this.$thrownJsError)}},
+B:{"^":"Ge;",
+w:function(a){return"Throw of null."}},
+AT:{"^":"Ge;a,b,c,d",
+gZ:function(){return"Invalid argument"+(!this.a?"(s)":"")},
+gu:function(){return""},
+w:function(a){var z,y,x,w,v,u
+z=this.c
+y=z!=null?" ("+H.d(z)+")":""
+z=this.d
+x=z==null?"":": "+H.d(z)
+w=this.gZ()+y+x
+if(!this.a)return w
+v=this.gu()
+u=P.h(this.b)
+return w+v+": "+H.d(u)},
+static:{
+q:function(a){return new P.AT(!1,null,null,a)},
+L3:function(a,b,c){return new P.AT(!0,a,b,c)},
+hG:function(a){return new P.AT(!1,null,a,"Must not be null")}}},
+bJ:{"^":"AT;e,f,a,b,c,d",
+gZ:function(){return"RangeError"},
+gu:function(){var z,y,x
+z=this.e
+if(z==null){z=this.f
+y=z!=null?": Not less than or equal to "+H.d(z):""}else{x=this.f
+if(x==null)y=": Not greater than or equal to "+H.d(z)
+else if(x>z)y=": Not in range "+H.d(z)+".."+H.d(x)+", inclusive"
+else y=x<z?": Valid value range is empty":": Only valid value is "+H.d(z)}return y},
+static:{
+F:function(a,b,c){return new P.bJ(null,null,!0,a,b,"Value not in range")},
+TE:function(a,b,c,d,e){return new P.bJ(b,c,!0,a,d,"Invalid value")},
+jB:function(a,b,c,d,e,f){if(0>a||a>c)throw H.b(P.TE(a,0,c,"start",f))
+if(a>b||b>c)throw H.b(P.TE(b,a,c,"end",f))
+return b}}},
+eY:{"^":"AT;e,A:f>,a,b,c,d",
+gZ:function(){return"RangeError"},
+gu:function(){if(J.aa(this.b,0))return": index must not be negative"
+var z=this.f
+if(z===0)return": no indices are valid"
+return": index should be less than "+H.d(z)},
+static:{
+Cf:function(a,b,c,d,e){var z=e!=null?e:J.Hm(b)
+return new P.eY(b,z,!0,a,c,"Index out of range")}}},
+ub:{"^":"Ge;a",
+w:function(a){return"Unsupported operation: "+this.a}},
+D:{"^":"Ge;a",
+w:function(a){var z=this.a
+return z!=null?"UnimplementedError: "+H.d(z):"UnimplementedError"}},
+lj:{"^":"Ge;a",
+w:function(a){return"Bad state: "+this.a}},
+UV:{"^":"Ge;a",
+w:function(a){var z=this.a
+if(z==null)return"Concurrent modification during iteration."
+return"Concurrent modification during iteration: "+H.d(P.h(z))+"."}},
+VS:{"^":"Mh;",
+w:function(a){return"Stack Overflow"},
+gII:function(){return},
+$isGe:1},
+t7:{"^":"Ge;a",
+w:function(a){return"Reading static variable '"+this.a+"' during its initialization"}},
+CD:{"^":"Mh;a",
+w:function(a){var z=this.a
+if(z==null)return"Exception"
+return"Exception: "+H.d(z)}},
+aE:{"^":"Mh;a,b,c",
+w:function(a){var z,y
+z=""!==this.a?"FormatException: "+this.a:"FormatException"
+y=this.b
+if(y.length>78)y=C.xB.C(y,0,75)+"..."
+return z+"\n"+y}},
+kM:{"^":"Mh;a",
+w:function(a){return"Expando:"+H.d(this.a)},
+q:function(a,b){var z=H.VK(b,"expando$values")
+return z==null?null:H.VK(z,this.KV(0))},
+KV:function(a){var z,y
+z=H.VK(this,"expando$key")
+if(z==null){y=$.Ss
+$.Ss=y+1
+z="expando$key$"+y
+H.aw(this,"expando$key",z)}return z}},
+EH:{"^":"Mh;"},
+KN:{"^":"lf;"},
+"+int":0,
+cX:{"^":"Mh;",
+S:["p",function(a,b){return H.VM(new H.U5(this,b),[H.W8(this,"cX",0)])}],
+U:function(a,b){var z
+for(z=this.gk(this);z.F();)b.$1(z.gl())},
+gA:function(a){var z,y
+z=this.gk(this)
+for(y=0;z.F();)++y
+return y},
+gV:function(a){var z,y
+z=this.gk(this)
+if(!z.F())throw H.b(H.Wp())
+y=z.gl()
+if(z.F())throw H.b(H.Am())
+return y},
+W:function(a,b){var z,y,x
+if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.hG("index"))
+if(b<0)H.vh(P.TE(b,0,null,"index",null))
+for(z=this.gk(this),y=0;z.F();){x=z.gl()
+if(b===y)return x;++y}throw H.b(P.Cf(b,this,"index",null,y))},
+w:function(a){return P.EP(this,"(",")")}},
+An:{"^":"Mh;"},
+zM:{"^":"Mh;",$aszM:null,$isqC:1},
+"+List":0,
+L8:{"^":"Mh;"},
+c8:{"^":"Mh;",
+w:function(a){return"null"}},
+"+Null":0,
+lf:{"^":"Mh;"},
+"+num":0,
+Mh:{"^":";",
+D:function(a,b){return this===b},
+gM:function(a){return H.wP(this)},
+w:function(a){return H.H(this)},
+toString:function(){return this.w(this)}},
+Gz:{"^":"Mh;"},
+qU:{"^":"Mh;"},
+"+String":0,
+Rn:{"^":"Mh;I:a<",
+gA:function(a){return this.a.length},
+w:function(a){var z=this.a
+return z.charCodeAt(0)==0?z:z},
+static:{
+vg:function(a,b,c){var z=J.IT(b)
+if(!z.F())return a
+if(c.length===0){do a+=H.d(z.gl())
+while(z.F())}else{a+=H.d(z.gl())
+for(;z.F();)a=a+c+H.d(z.gl())}return a}}}}],["","",,W,{"^":"",
+U9:function(a,b,c){var z,y
+z=document.body
+y=(z&&C.RY).O(z,a,b,c)
+y.toString
+z=new W.e7(y)
+z=z.S(z,new W.wJ())
+return z.gV(z)},
+rS:function(a){var z,y,x
+z="element tag unavailable"
+try{y=J.Ob(a)
+if(typeof y==="string")z=J.Ob(a)}catch(x){H.p(x)}return z},
+C0:function(a,b){a=536870911&a+b
+a=536870911&a+((524287&a)<<10>>>0)
+return a^a>>>6},
+Up:function(a){a=536870911&a+((67108863&a)<<3>>>0)
+a^=a>>>11
+return 536870911&a+((16383&a)<<15>>>0)},
+qc:function(a){var z
+if(a==null)return
+if("postMessage" in a){z=W.P1(a)
+if(!!J.v(z).$isD0)return z
+return}else return a},
+aF:function(a){var z=$.X3
+if(z===C.NU)return a
+return z.oj(a,!0)},
+Z0:function(a){return document.querySelector(a)},
+qE:{"^":"cv;",$isqE:1,$iscv:1,$isK:1,$isMh:1,"%":"HTMLAppletElement|HTMLBRElement|HTMLCanvasElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDetailsElement|HTMLDialogElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLImageElement|HTMLLIElement|HTMLLabelElement|HTMLLegendElement|HTMLMarqueeElement|HTMLMenuElement|HTMLMenuItemElement|HTMLMeterElement|HTMLModElement|HTMLOListElement|HTMLOptGroupElement|HTMLOptionElement|HTMLParagraphElement|HTMLPictureElement|HTMLPreElement|HTMLProgressElement|HTMLQuoteElement|HTMLShadowElement|HTMLSourceElement|HTMLSpanElement|HTMLStyleElement|HTMLTableCaptionElement|HTMLTableCellElement|HTMLTableColElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement|HTMLTitleElement|HTMLTrackElement|HTMLUListElement|HTMLUnknownElement|PluginPlaceholderElement;HTMLElement"},
+Yy:{"^":"vB;",$iszM:1,
+$aszM:function(){return[W.M5]},
+$isqC:1,
+"%":"EntryArray"},
+Gh:{"^":"qE;LU:href}",
+w:function(a){return String(a)},
+$isvB:1,
+"%":"HTMLAnchorElement"},
+fY:{"^":"qE;LU:href}",
+w:function(a){return String(a)},
+$isvB:1,
+"%":"HTMLAreaElement"},
+fo:{"^":"D0;A:length=","%":"AudioTrackList"},
+nB:{"^":"qE;LU:href}","%":"HTMLBaseElement"},
+Az:{"^":"vB;","%":";Blob"},
+QP:{"^":"qE;",$isQP:1,$isD0:1,$isvB:1,"%":"HTMLBodyElement"},
+IF:{"^":"qE;oc:name=",$isIF:1,"%":"HTMLButtonElement"},
+nx:{"^":"K;A:length=",$isvB:1,"%":"CDATASection|CharacterData|Comment|ProcessingInstruction|Text"},
+lw:{"^":"vB;",$isMh:1,"%":"CSSCharsetRule|CSSFontFaceRule|CSSImportRule|CSSKeyframeRule|CSSKeyframesRule|CSSMediaRule|CSSPageRule|CSSRule|CSSStyleRule|CSSSupportsRule|CSSUnknownRule|CSSViewportRule|MozCSSKeyframeRule|MozCSSKeyframesRule|WebKitCSSFilterRule|WebKitCSSKeyframeRule|WebKitCSSKeyframesRule"},
+oJ:{"^":"BV;A:length=","%":"CSS2Properties|CSSStyleDeclaration|MSStyleCSSProperties"},
+BV:{"^":"vB+id;"},
+id:{"^":"Mh;"},
+Wv:{"^":"vB;",$isWv:1,$isMh:1,"%":"DataTransferItem"},
+Sb:{"^":"vB;A:length=",
+q:function(a,b){return a[b]},
+"%":"DataTransferItemList"},
+QF:{"^":"K;",
+Wk:function(a,b){return a.querySelector(b)},
+"%":"Document|HTMLDocument|XMLDocument"},
+hs:{"^":"K;",
+Wk:function(a,b){return a.querySelector(b)},
+$isvB:1,
+"%":"DocumentFragment|ShadowRoot"},
+Nh:{"^":"vB;",
+w:function(a){return String(a)},
+"%":"DOMException"},
+tk:{"^":"vB;",$istk:1,$isMh:1,"%":"Iterator"},
+IB:{"^":"vB;L:height=,H:left=,T:top=,P:width=",
+w:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(this.gP(a))+" x "+H.d(this.gL(a))},
+D:function(a,b){var z,y,x
+if(b==null)return!1
+z=J.v(b)
+if(!z.$istn)return!1
+y=a.left
+x=z.gH(b)
+if(y==null?x==null:y===x){y=a.top
+x=z.gT(b)
+if(y==null?x==null:y===x){y=this.gP(a)
+x=z.gP(b)
+if(y==null?x==null:y===x){y=this.gL(a)
+z=z.gL(b)
+z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
+return z},
+gM:function(a){var z,y,x,w
+z=J.hf(a.left)
+y=J.hf(a.top)
+x=J.hf(this.gP(a))
+w=J.hf(this.gL(a))
+return W.Up(W.C0(W.C0(W.C0(W.C0(0,z),y),x),w))},
+$istn:1,
+$astn:I.HU,
+"%":";DOMRectReadOnly"},
+Yl:{"^":"ec;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[P.qU]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"DOMStringList"},
+nN:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.qU]},
+$isqC:1},
+ec:{"^":"nN+Gm;",$iszM:1,
+$aszM:function(){return[P.qU]},
+$isqC:1},
+NQ:{"^":"vB;A:length=","%":"DOMSettableTokenList|DOMTokenList"},
+wz:{"^":"LU;a",
+gA:function(a){return this.a.length},
+q:function(a,b){return this.a[b]},
+$asLU:I.HU,
+$aszM:I.HU,
+$iszM:1,
+$isqC:1},
+cv:{"^":"K;jO:id},ns:tagName=",
+gQg:function(a){return new W.i7(a)},
+gDD:function(a){return new W.I4(a)},
+w:function(a){return a.localName},
+N:function(a,b,c,d,e){var z
+if(d instanceof W.x)a.insertAdjacentHTML(b,c)
+else{z=this.O(a,c,d,e)
+switch(b.toLowerCase()){case"beforebegin":a.parentNode.insertBefore(z,a)
+break
+case"afterbegin":a.insertBefore(z,a.childNodes.length>0?a.childNodes[0]:null)
+break
+case"beforeend":a.appendChild(z)
+break
+case"afterend":a.parentNode.insertBefore(z,a.nextSibling)
+break
+default:H.vh(P.q("Invalid position "+b))}}},
+O:["DW",function(a,b,c,d){var z,y,x,w,v
+if(c==null){z=$.lt
+if(z==null){z=H.VM([],[W.kF])
+y=new W.vD(z)
+z.push(W.Tw(null))
+z.push(W.Bl())
+$.lt=y
+d=y}else d=z
+z=$.EU
+if(z==null){z=new W.MM(d)
+$.EU=z
+c=z}else{z.a=d
+c=z}}if($.xo==null){z=document.implementation.createHTMLDocument("")
+$.xo=z
+$.BO=z.createRange()
+z=$.xo
+z.toString
+x=z.createElement("base")
+J.Gq(x,document.baseURI)
+$.xo.head.appendChild(x)}z=$.xo
+if(!!this.$isQP)w=z.body
+else{y=a.tagName
+z.toString
+w=z.createElement(y)
+$.xo.body.appendChild(w)}if("createContextualFragment" in window.Range.prototype&&!C.Nm.tg(C.Sq,a.tagName)){$.BO.selectNodeContents(w)
+v=$.BO.createContextualFragment(b)}else{w.innerHTML=b
+v=$.xo.createDocumentFragment()
+for(;z=w.firstChild,z!=null;)v.appendChild(z)}z=$.xo.body
+if(w==null?z!=null:w!==z)J.Ns(w)
+c.Pn(v)
+document.adoptNode(v)
+return v},function(a,b,c){return this.O(a,b,c,null)},"E",null,null,"gkf",2,5,null,0,0],
+a7:function(a,b,c){return a.setAttribute(b,c)},
+Wk:function(a,b){return a.querySelector(b)},
+$iscv:1,
+$isK:1,
+$isMh:1,
+$isvB:1,
+$isD0:1,
+"%":";Element"},
+wJ:{"^":"L:1;",
+$1:function(a){return!!J.v(a).$iscv}},
+Fs:{"^":"qE;oc:name=","%":"HTMLEmbedElement"},
+M5:{"^":"vB;",$isMh:1,"%":"DirectoryEntry|Entry|FileEntry"},
+hY:{"^":"ea;kc:error=","%":"ErrorEvent"},
+ea:{"^":"vB;","%":"AnimationPlayerEvent|ApplicationCacheErrorEvent|AudioProcessingEvent|AutocompleteErrorEvent|BeforeUnloadEvent|CloseEvent|CustomEvent|DeviceLightEvent|DeviceMotionEvent|DeviceOrientationEvent|ExtendableEvent|FetchEvent|FontFaceSetLoadEvent|GamepadEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|MIDIConnectionEvent|MIDIMessageEvent|MediaKeyEvent|MediaKeyMessageEvent|MediaKeyNeededEvent|MediaQueryListEvent|MediaStreamEvent|MediaStreamTrackEvent|MessageEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|PopStateEvent|ProgressEvent|PushEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|RTCPeerConnectionIceEvent|RelatedEvent|ResourceProgressEvent|SecurityPolicyViolationEvent|SpeechRecognitionEvent|SpeechSynthesisEvent|StorageEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent|XMLHttpRequestProgressEvent;ClipboardEvent|Event|InputEvent"},
+D0:{"^":"vB;",
+On:function(a,b,c,d){if(c!=null)this.v0(a,b,c,!1)},
+Y9:function(a,b,c,d){if(c!=null)this.Ci(a,b,c,!1)},
+v0:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),!1)},
+Ci:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),!1)},
+$isD0:1,
+"%":"AnalyserNode|AnimationPlayer|ApplicationCache|AudioBufferSourceNode|AudioChannelMerger|AudioChannelSplitter|AudioContext|AudioDestinationNode|AudioGainNode|AudioNode|AudioPannerNode|AudioSourceNode|BatteryManager|BiquadFilterNode|ChannelMergerNode|ChannelSplitterNode|ConvolverNode|DOMApplicationCache|DelayNode|DynamicsCompressorNode|EventSource|GainNode|IDBDatabase|InputMethodContext|JavaScriptAudioNode|MIDIAccess|MediaController|MediaElementAudioSourceNode|MediaQueryList|MediaSource|MediaStream|MediaStreamAudioDestinationNode|MediaStreamAudioSourceNode|MediaStreamTrack|MessagePort|NetworkInformation|Notification|OfflineAudioContext|OfflineResourceList|Oscillator|OscillatorNode|PannerNode|Performance|Presentation|RTCDTMFSender|RTCPeerConnection|RealtimeAnalyserNode|ScreenOrientation|ScriptProcessorNode|ServiceWorkerRegistration|SpeechRecognition|SpeechSynthesis|SpeechSynthesisUtterance|WaveShaperNode|mozRTCPeerConnection|webkitAudioContext|webkitAudioPannerNode;EventTarget;Vc|mr|KS|bD"},
+as:{"^":"qE;oc:name=","%":"HTMLFieldSetElement"},
+dU:{"^":"Az;",$isMh:1,"%":"File"},
+XV:{"^":"x5;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.dU]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"FileList"},
+zL:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.dU]},
+$isqC:1},
+x5:{"^":"zL+Gm;",$iszM:1,
+$aszM:function(){return[W.dU]},
+$isqC:1},
+H0:{"^":"D0;kc:error=","%":"FileReader"},
+Bf:{"^":"D0;kc:error=,A:length=","%":"FileWriter"},
+n5:{"^":"vB;",$isn5:1,$isMh:1,"%":"FontFace"},
+CV:{"^":"D0;",
+K:function(a,b,c){return a.forEach(H.tR(b,3),c)},
+U:function(a,b){b=H.tR(b,3)
+return a.forEach(b)},
+"%":"FontFaceSet"},
+Yu:{"^":"qE;A:length=,oc:name=","%":"HTMLFormElement"},
+GO:{"^":"vB;",$isMh:1,"%":"Gamepad"},
+F1:{"^":"vB;",
+K:function(a,b,c){return a.forEach(H.tR(b,3),c)},
+U:function(a,b){b=H.tR(b,3)
+return a.forEach(b)},
+"%":"Headers"},
+br:{"^":"vB;A:length=","%":"History"},
+xn:{"^":"HR;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
+dx:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1},
+HR:{"^":"dx+Gm;",$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1},
+zU:{"^":"wa;",
+wR:function(a,b){return a.send(b)},
+"%":"XMLHttpRequest"},
+wa:{"^":"D0;","%":"XMLHttpRequestUpload;XMLHttpRequestEventTarget"},
+tX:{"^":"qE;oc:name=","%":"HTMLIFrameElement"},
+Mi:{"^":"qE;oc:name=",$iscv:1,$isvB:1,$isD0:1,"%":"HTMLInputElement"},
+MX:{"^":"qE;oc:name=","%":"HTMLKeygenElement"},
+Og:{"^":"qE;LU:href}","%":"HTMLLinkElement"},
+u8:{"^":"vB;",
+w:function(a){return String(a)},
+"%":"Location"},
+M6:{"^":"qE;oc:name=","%":"HTMLMapElement"},
+eL:{"^":"qE;kc:error=","%":"HTMLAudioElement|HTMLMediaElement|HTMLVideoElement"},
+G9:{"^":"D0;kc:error=","%":"MediaKeySession"},
+tL:{"^":"vB;A:length=","%":"MediaList"},
+Ee:{"^":"qE;oc:name=","%":"HTMLMetaElement"},
+Lk:{"^":"Im;",
+LV:function(a,b,c){return a.send(b,c)},
+wR:function(a,b){return a.send(b)},
+"%":"MIDIOutput"},
+Im:{"^":"D0;","%":"MIDIInput;MIDIPort"},
+AW:{"^":"vB;",$isMh:1,"%":"MimeType"},
+bw:{"^":"rr;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.AW]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"MimeTypeArray"},
+hm:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.AW]},
+$isqC:1},
+rr:{"^":"hm+Gm;",$iszM:1,
+$aszM:function(){return[W.AW]},
+$isqC:1},
+Aj:{"^":"w6;",$isAj:1,$isMh:1,"%":"DragEvent|MSPointerEvent|MouseEvent|PointerEvent|WheelEvent"},
+oU:{"^":"vB;",$isvB:1,"%":"Navigator"},
+e7:{"^":"LU;a",
+gV:function(a){var z,y
+z=this.a
+y=z.childNodes.length
+if(y===0)throw H.b(new P.lj("No elements"))
+if(y>1)throw H.b(new P.lj("More than one element"))
+return z.firstChild},
+FV:function(a,b){var z,y,x,w
+z=b.a
+y=this.a
+if(z!==y)for(x=z.childNodes.length,w=0;w<x;++w)y.appendChild(z.firstChild)
+return},
+gk:function(a){return C.t5.gk(this.a.childNodes)},
+gA:function(a){return this.a.childNodes.length},
+q:function(a,b){return this.a.childNodes[b]},
+$asLU:function(){return[W.K]},
+$aszM:function(){return[W.K]}},
+K:{"^":"D0;",
+wg:function(a){var z=a.parentNode
+if(z!=null)z.removeChild(a)},
+w:function(a){var z=a.nodeValue
+return z==null?this.UG(a):z},
+$isK:1,
+$isMh:1,
+"%":";Node"},
+BH:{"^":"Gb;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"NodeList|RadioNodeList"},
+xt:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1},
+Gb:{"^":"xt+Gm;",$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1},
+G7:{"^":"qE;oc:name=","%":"HTMLObjectElement"},
+wL:{"^":"qE;oc:name=","%":"HTMLOutputElement"},
+HD:{"^":"qE;oc:name=","%":"HTMLParamElement"},
+O4:{"^":"vB;",$isvB:1,"%":"Path2D"},
+qp:{"^":"vB;A:length=",$isMh:1,"%":"Plugin"},
+Ev:{"^":"ma;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.qp]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"PluginArray"},
+nj:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.qp]},
+$isqC:1},
+ma:{"^":"nj+Gm;",$iszM:1,
+$aszM:function(){return[W.qp]},
+$isqC:1},
+dK:{"^":"D0;",
+wR:function(a,b){return a.send(b)},
+"%":"DataChannel|RTCDataChannel"},
+p8:{"^":"vB;",$isp8:1,$isMh:1,"%":"RTCStatsReport"},
+qI:{"^":"qE;",$isqI:1,"%":"HTMLScriptElement"},
+lp:{"^":"qE;A:length=,oc:name=","%":"HTMLSelectElement"},
+Ji:{"^":"D0;",$isD0:1,$isvB:1,"%":"SharedWorker"},
+x8:{"^":"D0;",$isMh:1,"%":"SourceBuffer"},
+Mk:{"^":"mr;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.x8]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"SourceBufferList"},
+Vc:{"^":"D0+lD;",$iszM:1,
+$aszM:function(){return[W.x8]},
+$isqC:1},
+mr:{"^":"Vc+Gm;",$iszM:1,
+$aszM:function(){return[W.x8]},
+$isqC:1},
+Y4:{"^":"vB;",$isMh:1,"%":"SpeechGrammar"},
+Nn:{"^":"ecX;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.Y4]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"SpeechGrammarList"},
+qb:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.Y4]},
+$isqC:1},
+ecX:{"^":"qb+Gm;",$iszM:1,
+$aszM:function(){return[W.Y4]},
+$isqC:1},
+zD:{"^":"ea;kc:error=","%":"SpeechRecognitionError"},
+vK:{"^":"vB;A:length=",$isMh:1,"%":"SpeechRecognitionResult"},
+As:{"^":"vB;",
+q:function(a,b){return a.getItem(b)},
+U:function(a,b){var z,y
+for(z=0;!0;++z){y=a.key(z)
+if(y==null)return
+b.$2(y,a.getItem(y))}},
+gA:function(a){return a.length},
+"%":"Storage"},
+WW:{"^":"vB;",$isMh:1,"%":"CSSStyleSheet|StyleSheet"},
+Tb:{"^":"qE;",
+O:function(a,b,c,d){var z,y
+if("createContextualFragment" in window.Range.prototype)return this.DW(a,b,c,d)
+z=W.U9("<table>"+H.d(b)+"</table>",c,d)
+y=document.createDocumentFragment()
+y.toString
+z.toString
+new W.e7(y).FV(0,new W.e7(z))
+return y},
+"%":"HTMLTableElement"},
+Iv:{"^":"qE;",
+O:function(a,b,c,d){var z,y,x,w
+if("createContextualFragment" in window.Range.prototype)return this.DW(a,b,c,d)
+z=document.createDocumentFragment()
+y=document
+y=C.Ie.O(y.createElement("table"),b,c,d)
+y.toString
+y=new W.e7(y)
+x=y.gV(y)
+x.toString
+y=new W.e7(x)
+w=y.gV(y)
+z.toString
+w.toString
+new W.e7(z).FV(0,new W.e7(w))
+return z},
+"%":"HTMLTableRowElement"},
+BT:{"^":"qE;",
+O:function(a,b,c,d){var z,y,x
+if("createContextualFragment" in window.Range.prototype)return this.DW(a,b,c,d)
+z=document.createDocumentFragment()
+y=document
+y=C.Ie.O(y.createElement("table"),b,c,d)
+y.toString
+y=new W.e7(y)
+x=y.gV(y)
+z.toString
+x.toString
+new W.e7(z).FV(0,new W.e7(x))
+return z},
+"%":"HTMLTableSectionElement"},
+yY:{"^":"qE;",$isyY:1,"%":"HTMLTemplateElement"},
+FB:{"^":"qE;oc:name=","%":"HTMLTextAreaElement"},
+A1:{"^":"D0;",$isMh:1,"%":"TextTrack"},
+MN:{"^":"D0;",$isMh:1,"%":"TextTrackCue|VTTCue"},
+K8:{"^":"w1p;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$isXj:1,
+$isDD:1,
+$iszM:1,
+$aszM:function(){return[W.MN]},
+$isqC:1,
+"%":"TextTrackCueList"},
+RAp:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.MN]},
+$isqC:1},
+w1p:{"^":"RAp+Gm;",$iszM:1,
+$aszM:function(){return[W.MN]},
+$isqC:1},
+nJ:{"^":"bD;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.A1]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"TextTrackList"},
+KS:{"^":"D0+lD;",$iszM:1,
+$aszM:function(){return[W.A1]},
+$isqC:1},
+bD:{"^":"KS+Gm;",$iszM:1,
+$aszM:function(){return[W.A1]},
+$isqC:1},
+M0:{"^":"vB;A:length=","%":"TimeRanges"},
+a3:{"^":"vB;",$isMh:1,"%":"Touch"},
+o4:{"^":"kEI;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.a3]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"TouchList"},
+nNL:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.a3]},
+$isqC:1},
+kEI:{"^":"nNL+Gm;",$iszM:1,
+$aszM:function(){return[W.a3]},
+$isqC:1},
+w6:{"^":"ea;","%":"CompositionEvent|FocusEvent|KeyboardEvent|SVGZoomEvent|TextEvent|TouchEvent;UIEvent"},
+Fj:{"^":"vB;",
+w:function(a){return String(a)},
+$isvB:1,
+"%":"URL"},
+vX:{"^":"D0;A:length=","%":"VideoTrackList"},
+wf:{"^":"vB;A:length=","%":"VTTRegionList"},
+EK:{"^":"D0;",
+wR:function(a,b){return a.send(b)},
+"%":"WebSocket"},
+K5:{"^":"D0;",$isvB:1,$isD0:1,"%":"DOMWindow|Window"},
+ny:{"^":"D0;",$isD0:1,$isvB:1,"%":"Worker"},
+Cm:{"^":"D0;",$isvB:1,"%":"DedicatedWorkerGlobalScope|ServiceWorkerGlobalScope|SharedWorkerGlobalScope|WorkerGlobalScope"},
+RX:{"^":"K;oc:name=","%":"Attr"},
+ia:{"^":"vB;",$isMh:1,"%":"CSSPrimitiveValue;CSSValue;hw|lS"},
+YC:{"^":"vB;L:height=,H:left=,T:top=,P:width=",
+w:function(a){return"Rectangle ("+H.d(a.left)+", "+H.d(a.top)+") "+H.d(a.width)+" x "+H.d(a.height)},
+D:function(a,b){var z,y,x
+if(b==null)return!1
+z=J.v(b)
+if(!z.$istn)return!1
+y=a.left
+x=z.gH(b)
+if(y==null?x==null:y===x){y=a.top
+x=z.gT(b)
+if(y==null?x==null:y===x){y=a.width
+x=z.gP(b)
+if(y==null?x==null:y===x){y=a.height
+z=z.gL(b)
+z=y==null?z==null:y===z}else z=!1}else z=!1}else z=!1
+return z},
+gM:function(a){var z,y,x,w
+z=J.hf(a.left)
+y=J.hf(a.top)
+x=J.hf(a.width)
+w=J.hf(a.height)
+return W.Up(W.C0(W.C0(W.C0(W.C0(0,z),y),x),w))},
+$istn:1,
+$astn:I.HU,
+"%":"ClientRect"},
+S3:{"^":"x5e;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$isXj:1,
+$isDD:1,
+$iszM:1,
+$aszM:function(){return[P.tn]},
+$isqC:1,
+"%":"ClientRectList|DOMRectList"},
+yoo:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.tn]},
+$isqC:1},
+x5e:{"^":"yoo+Gm;",$iszM:1,
+$aszM:function(){return[P.tn]},
+$isqC:1},
+PR:{"^":"HRa;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.lw]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"CSSRuleList"},
+zLC:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.lw]},
+$isqC:1},
+HRa:{"^":"zLC+Gm;",$iszM:1,
+$aszM:function(){return[W.lw]},
+$isqC:1},
+VE:{"^":"lS;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.ia]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"CSSValueList|WebKitCSSFilterValue|WebKitCSSTransformValue"},
+hw:{"^":"ia+lD;",$iszM:1,
+$aszM:function(){return[W.ia]},
+$isqC:1},
+lS:{"^":"hw+Gm;",$iszM:1,
+$aszM:function(){return[W.ia]},
+$isqC:1},
+hq:{"^":"K;",$isvB:1,"%":"DocumentType"},
+w4:{"^":"IB;",
+gL:function(a){return a.height},
+gP:function(a){return a.width},
+"%":"DOMRect"},
+Ij:{"^":"t7i;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.GO]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"GamepadList"},
+dxW:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.GO]},
+$isqC:1},
+t7i:{"^":"dxW+Gm;",$iszM:1,
+$aszM:function(){return[W.GO]},
+$isqC:1},
+Nf:{"^":"qE;",$isD0:1,$isvB:1,"%":"HTMLFrameSetElement"},
+rh:{"^":"rrb;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"MozNamedAttrMap|NamedNodeMap"},
+hmZ:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1},
+rrb:{"^":"hmZ+Gm;",$iszM:1,
+$aszM:function(){return[W.K]},
+$isqC:1},
+XT:{"^":"D0;",$isD0:1,$isvB:1,"%":"ServiceWorker"},
+LO:{"^":"rla;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.vK]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"SpeechRecognitionResultList"},
+xth:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.vK]},
+$isqC:1},
+rla:{"^":"xth+Gm;",$iszM:1,
+$aszM:function(){return[W.vK]},
+$isqC:1},
+i9:{"^":"Gba;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a[b]},
+W:function(a,b){return a[b]},
+$iszM:1,
+$aszM:function(){return[W.WW]},
+$isqC:1,
+$isXj:1,
+$isDD:1,
+"%":"StyleSheetList"},
+Ocb:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[W.WW]},
+$isqC:1},
+Gba:{"^":"Ocb+Gm;",$iszM:1,
+$aszM:function(){return[W.WW]},
+$isqC:1},
+jx:{"^":"vB;",$isvB:1,"%":"WorkerLocation"},
+Iz:{"^":"vB;",$isvB:1,"%":"WorkerNavigator"},
+D9:{"^":"Mh;dA:a<",
+U:function(a,b){var z,y,x,w,v
+for(z=this.gvc(this),y=z.length,x=this.a,w=0;w<z.length;z.length===y||(0,H.lk)(z),++w){v=z[w]
+b.$2(v,x.getAttribute(v))}},
+gvc:function(a){var z,y,x,w,v
+z=this.a.attributes
+y=H.VM([],[P.qU])
+for(x=z.length,w=0;w<x;++w){v=z[w]
+if(v.namespaceURI==null)y.push(J.Ay(v))}return y}},
+i7:{"^":"D9;a",
+q:function(a,b){return this.a.getAttribute(b)},
+gA:function(a){return this.gvc(this).length}},
+I4:{"^":"hx;dA:a<",
+DG:function(){var z,y,x,w,v
+z=P.Ls(null,null,null,P.qU)
+for(y=this.a.className.split(" "),x=y.length,w=0;w<y.length;y.length===x||(0,H.lk)(y),++w){v=J.T0(y[w])
+if(v.length!==0)z.AN(0,v)}return z},
+p5:function(a){this.a.className=a.zV(0," ")},
+gA:function(a){return this.a.classList.length},
+tg:function(a,b){return typeof b==="string"&&this.a.classList.contains(b)},
+AN:function(a,b){var z,y
+z=this.a.classList
+y=z.contains(b)
+z.add(b)
+return!y},
+Rz:function(a,b){var z,y,x
+z=this.a.classList
+y=z.contains(b)
+z.remove(b)
+x=y
+return x}},
+RO:{"^":"qh;",
+X5:function(a,b,c,d){var z=new W.xC(0,this.a,this.b,W.aF(a),!1)
+z.$builtinTypeInfo=this.$builtinTypeInfo
+z.DN()
+return z}},
+Cq:{"^":"RO;a,b,c"},
+xC:{"^":"MO;a,b,c,d,e",
+Gv:function(a){if(this.b==null)return
+this.EO()
+this.b=null
+this.d=null
+return},
+DN:function(){var z=this.d
+if(z!=null&&this.a<=0)J.dZ(this.b,this.c,z,!1)},
+EO:function(){var z=this.d
+if(z!=null)J.EJ(this.b,this.c,z,!1)}},
+JQ:{"^":"Mh;a",
+i0:function(a){return $.$get$zX().tg(0,W.rS(a))},
+Eb:function(a,b,c){var z,y,x
+z=W.rS(a)
+y=$.$get$or()
+x=y.q(0,H.d(z)+"::"+b)
+if(x==null)x=y.q(0,"*::"+b)
+if(x==null)return!1
+return x.$4(a,b,c,this)},
+CY:function(a){var z,y
+z=$.$get$or()
+if(z.gl0(z)){for(y=0;y<262;++y)z.t(0,C.cm[y],W.pS())
+for(y=0;y<12;++y)z.t(0,C.BI[y],W.V4())}},
+$iskF:1,
+static:{
+Tw:function(a){var z,y
+z=document
+y=z.createElement("a")
+z=new W.mk(y,window.location)
+z=new W.JQ(z)
+z.CY(a)
+return z},
+qD:[function(a,b,c,d){return!0},"$4","pS",8,0,7],
+QW:[function(a,b,c,d){var z,y,x,w,v
+z=d.a
+y=z.a
+y.href=c
+x=y.hostname
+z=z.b
+w=z.hostname
+if(x==null?w==null:x===w){w=y.port
+v=z.port
+if(w==null?v==null:w===v){w=y.protocol
+z=z.protocol
+z=w==null?z==null:w===z}else z=!1}else z=!1
+if(!z)if(x==="")if(y.port===""){z=y.protocol
+z=z===":"||z===""}else z=!1
+else z=!1
+else z=!0
+return z},"$4","V4",8,0,7]}},
+Gm:{"^":"Mh;",
+gk:function(a){return new W.W9(a,this.gA(a),-1,null)},
+$iszM:1,
+$aszM:null,
+$isqC:1},
+vD:{"^":"Mh;a",
+i0:function(a){return C.Nm.Vr(this.a,new W.mD(a))},
+Eb:function(a,b,c){return C.Nm.Vr(this.a,new W.Eg(a,b,c))}},
+mD:{"^":"L:1;a",
+$1:function(a){return a.i0(this.a)}},
+Eg:{"^":"L:1;a,b,c",
+$1:function(a){return a.Eb(this.a,this.b,this.c)}},
+m6:{"^":"Mh;",
+i0:function(a){return this.a.tg(0,W.rS(a))},
+Eb:["jF",function(a,b,c){var z,y
+z=W.rS(a)
+y=this.c
+if(y.tg(0,H.d(z)+"::"+b))return this.d.Dt(c)
+else if(y.tg(0,"*::"+b))return this.d.Dt(c)
+else{y=this.b
+if(y.tg(0,H.d(z)+"::"+b))return!0
+else if(y.tg(0,"*::"+b))return!0
+else if(y.tg(0,H.d(z)+"::*"))return!0
+else if(y.tg(0,"*::*"))return!0}return!1}],
+CY:function(a,b,c,d){var z,y,x
+this.a.FV(0,c)
+z=b.S(0,new W.Eo())
+y=b.S(0,new W.Wk())
+this.b.FV(0,z)
+x=this.c
+x.FV(0,C.xD)
+x.FV(0,y)}},
+Eo:{"^":"L:1;",
+$1:function(a){return!C.Nm.tg(C.BI,a)}},
+Wk:{"^":"L:1;",
+$1:function(a){return C.Nm.tg(C.BI,a)}},
+ct:{"^":"m6;e,a,b,c,d",
+Eb:function(a,b,c){if(this.jF(a,b,c))return!0
+if(b==="template"&&c==="")return!0
+if(a.getAttribute("template")==="")return this.e.tg(0,b)
+return!1},
+static:{
+Bl:function(){var z,y,x,w
+z=H.VM(new H.A8(C.Qx,new W.IA()),[null,null])
+y=P.Ls(null,null,null,P.qU)
+x=P.Ls(null,null,null,P.qU)
+w=P.Ls(null,null,null,P.qU)
+w=new W.ct(P.tM(C.Qx,P.qU),y,x,w,null)
+w.CY(null,z,["TEMPLATE"],null)
+return w}}},
+IA:{"^":"L:1;",
+$1:function(a){return"TEMPLATE::"+H.d(a)}},
+Ow:{"^":"Mh;",
+i0:function(a){var z=J.v(a)
+if(!!z.$isj2)return!1
+z=!!z.$isd5
+if(z&&W.rS(a)==="foreignObject")return!1
+if(z)return!0
+return!1},
+Eb:function(a,b,c){if(b==="is"||C.xB.nC(b,"on"))return!1
+return this.i0(a)}},
+W9:{"^":"Mh;a,b,c,d",
+F:function(){var z,y
+z=this.c+1
+y=this.b
+if(z<y){this.d=J.w2(this.a,z)
+this.c=z
+return!0}this.d=null
+this.c=y
+return!1},
+gl:function(){return this.d}},
+dW:{"^":"Mh;a",
+On:function(a,b,c,d){return H.vh(new P.ub("You can only attach EventListeners to your own window."))},
+Y9:function(a,b,c,d){return H.vh(new P.ub("You can only attach EventListeners to your own window."))},
+$isD0:1,
+$isvB:1,
+static:{
+P1:function(a){if(a===window)return a
+else return new W.dW(a)}}},
+kF:{"^":"Mh;"},
+x:{"^":"Mh;",
+Pn:function(a){}},
+mk:{"^":"Mh;a,b"},
+MM:{"^":"Mh;a",
+Pn:function(a){new W.fm(this).$2(a,null)},
+EP:function(a,b){if(b==null)J.Ns(a)
+else b.removeChild(a)},
+I4:function(a,b){var z,y,x,w,v,u,t,s
+z=!0
+y=null
+x=null
+try{y=J.Q1(a)
+x=y.gdA().getAttribute("is")
+w=function(c){if(!(c.attributes instanceof NamedNodeMap))return true
+var r=c.childNodes
+if(c.lastChild&&c.lastChild!==r[r.length-1])return true
+if(c.children)if(!(c.children instanceof HTMLCollection||c.children instanceof NodeList))return true
+var q=0
+if(c.children)q=c.children.length
+for(var p=0;p<q;p++){var o=c.children[p]
+if(o.id=='attributes'||o.name=='attributes'||o.id=='lastChild'||o.name=='lastChild'||o.id=='children'||o.name=='children')return true}return false}(a)
+z=w?!0:!(a.attributes instanceof NamedNodeMap)}catch(t){H.p(t)}v="element unprintable"
+try{v=J.A(a)}catch(t){H.p(t)}try{u=W.rS(a)
+this.kR(a,b,z,v,u,y,x)}catch(t){if(H.p(t) instanceof P.AT)throw t
+else{this.EP(a,b)
+window
+s="Removing corrupted element "+H.d(v)
+if(typeof console!="undefined")console.warn(s)}}},
+kR:function(a,b,c,d,e,f,g){var z,y,x,w,v
+if(c){this.EP(a,b)
+window
+z="Removing element due to corrupted attributes on <"+d+">"
+if(typeof console!="undefined")console.warn(z)
+return}if(!this.a.i0(a)){this.EP(a,b)
+window
+z="Removing disallowed element <"+H.d(e)+"> from "+J.A(b)
+if(typeof console!="undefined")console.warn(z)
+return}if(g!=null)if(!this.a.Eb(a,"is",g)){this.EP(a,b)
+window
+z="Removing disallowed type extension <"+H.d(e)+' is="'+g+'">'
+if(typeof console!="undefined")console.warn(z)
+return}z=f.gvc(f)
+y=H.VM(z.slice(),[H.Kp(z,0)])
+for(x=f.gvc(f).length-1,z=f.a;x>=0;--x){w=y[x]
+if(!this.a.Eb(a,J.cH(w),z.getAttribute(w))){window
+v="Removing disallowed attribute <"+H.d(e)+" "+w+'="'+H.d(z.getAttribute(w))+'">'
+if(typeof console!="undefined")console.warn(v)
+z.getAttribute(w)
+z.removeAttribute(w)}}if(!!J.v(a).$isyY)this.Pn(a.content)}},
+fm:{"^":"L:15;a",
+$2:function(a,b){var z,y,x
+z=this.a
+switch(a.nodeType){case 1:z.I4(a,b)
+break
+case 8:case 11:case 3:case 4:break
+default:z.EP(a,b)}y=a.lastChild
+for(;y!=null;y=x){x=y.previousSibling
+this.$2(y,a)}}}}],["","",,P,{"^":"",tK:{"^":"vB;",$istK:1,$isMh:1,"%":"IDBIndex"},m9:{"^":"D0;kc:error=","%":"IDBOpenDBRequest|IDBRequest|IDBVersionChangeRequest"},nq:{"^":"D0;kc:error=","%":"IDBTransaction"}}],["","",,P,{"^":"",Y0:{"^":"tp;",$isvB:1,"%":"SVGAElement"},ZJ:{"^":"Pt;",$isvB:1,"%":"SVGAltGlyphElement"},ui:{"^":"d5;",$isvB:1,"%":"SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGSetElement"},jw:{"^":"d5;",$isvB:1,"%":"SVGFEBlendElement"},lv:{"^":"d5;",$isvB:1,"%":"SVGFEColorMatrixElement"},pf:{"^":"d5;",$isvB:1,"%":"SVGFEComponentTransferElement"},py:{"^":"d5;",$isvB:1,"%":"SVGFECompositeElement"},Ef:{"^":"d5;",$isvB:1,"%":"SVGFEConvolveMatrixElement"},zo:{"^":"d5;",$isvB:1,"%":"SVGFEDiffuseLightingElement"},q6:{"^":"d5;",$isvB:1,"%":"SVGFEDisplacementMapElement"},ih:{"^":"d5;",$isvB:1,"%":"SVGFEFloodElement"},v6:{"^":"d5;",$isvB:1,"%":"SVGFEGaussianBlurElement"},me:{"^":"d5;",$isvB:1,"%":"SVGFEImageElement"},oB:{"^":"d5;",$isvB:1,"%":"SVGFEMergeElement"},yu:{"^":"d5;",$isvB:1,"%":"SVGFEMorphologyElement"},MI:{"^":"d5;",$isvB:1,"%":"SVGFEOffsetElement"},bM:{"^":"d5;",$isvB:1,"%":"SVGFESpecularLightingElement"},Qy:{"^":"d5;",$isvB:1,"%":"SVGFETileElement"},ju:{"^":"d5;",$isvB:1,"%":"SVGFETurbulenceElement"},OE:{"^":"d5;",$isvB:1,"%":"SVGFilterElement"},BA:{"^":"tp;",$isBA:1,"%":"SVGGElement"},tp:{"^":"d5;",$isvB:1,"%":"SVGCircleElement|SVGClipPathElement|SVGDefsElement|SVGEllipseElement|SVGForeignObjectElement|SVGGeometryElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement|SVGRectElement|SVGSwitchElement;SVGGraphicsElement"},rE:{"^":"tp;",$isvB:1,"%":"SVGImageElement"},Xk:{"^":"vB;",$isMh:1,"%":"SVGLength"},jK:{"^":"maa;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a.getItem(b)},
+W:function(a,b){return this.q(a,b)},
+$iszM:1,
+$aszM:function(){return[P.Xk]},
+$isqC:1,
+"%":"SVGLengthList"},nja:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.Xk]},
+$isqC:1},maa:{"^":"nja+Gm;",$iszM:1,
+$aszM:function(){return[P.Xk]},
+$isqC:1},uz:{"^":"d5;",$isvB:1,"%":"SVGMarkerElement"},Yd:{"^":"d5;",$isvB:1,"%":"SVGMaskElement"},uP:{"^":"vB;",$isMh:1,"%":"SVGNumber"},ZZ:{"^":"e0;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a.getItem(b)},
+W:function(a,b){return this.q(a,b)},
+$iszM:1,
+$aszM:function(){return[P.uP]},
+$isqC:1,
+"%":"SVGNumberList"},qba:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.uP]},
+$isqC:1},e0:{"^":"qba+Gm;",$iszM:1,
+$aszM:function(){return[P.uP]},
+$isqC:1},XW:{"^":"vB;",$isMh:1,"%":"SVGPathSeg|SVGPathSegArcAbs|SVGPathSegArcRel|SVGPathSegClosePath|SVGPathSegCurvetoCubicAbs|SVGPathSegCurvetoCubicRel|SVGPathSegCurvetoCubicSmoothAbs|SVGPathSegCurvetoCubicSmoothRel|SVGPathSegCurvetoQuadraticAbs|SVGPathSegCurvetoQuadraticRel|SVGPathSegCurvetoQuadraticSmoothAbs|SVGPathSegCurvetoQuadraticSmoothRel|SVGPathSegLinetoAbs|SVGPathSegLinetoHorizontalAbs|SVGPathSegLinetoHorizontalRel|SVGPathSegLinetoRel|SVGPathSegLinetoVerticalAbs|SVGPathSegLinetoVerticalRel|SVGPathSegMovetoAbs|SVGPathSegMovetoRel"},Sv:{"^":"f0;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a.getItem(b)},
+W:function(a,b){return this.q(a,b)},
+$iszM:1,
+$aszM:function(){return[P.XW]},
+$isqC:1,
+"%":"SVGPathSegList"},R1:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.XW]},
+$isqC:1},f0:{"^":"R1+Gm;",$iszM:1,
+$aszM:function(){return[P.XW]},
+$isqC:1},Gr:{"^":"d5;",$isvB:1,"%":"SVGPatternElement"},ED:{"^":"vB;A:length=","%":"SVGPointList"},j2:{"^":"d5;",$isj2:1,$isvB:1,"%":"SVGScriptElement"},Kq:{"^":"g0;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a.getItem(b)},
+W:function(a,b){return this.q(a,b)},
+$iszM:1,
+$aszM:function(){return[P.qU]},
+$isqC:1,
+"%":"SVGStringList"},S1:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.qU]},
+$isqC:1},g0:{"^":"S1+Gm;",$iszM:1,
+$aszM:function(){return[P.qU]},
+$isqC:1},O7:{"^":"hx;a",
+DG:function(){var z,y,x,w,v,u
+z=this.a.getAttribute("class")
+y=P.Ls(null,null,null,P.qU)
+if(z==null)return y
+for(x=z.split(" "),w=x.length,v=0;v<x.length;x.length===w||(0,H.lk)(x),++v){u=J.T0(x[v])
+if(u.length!==0)y.AN(0,u)}return y},
+p5:function(a){this.a.setAttribute("class",a.zV(0," "))}},d5:{"^":"cv;",
+gDD:function(a){return new P.O7(a)},
+O:function(a,b,c,d){var z,y,x,w,v
+if(c==null){z=H.VM([],[W.kF])
+d=new W.vD(z)
+z.push(W.Tw(null))
+z.push(W.Bl())
+z.push(new W.Ow())
+c=new W.MM(d)}y='<svg version="1.1">'+H.d(b)+"</svg>"
+z=document.body
+x=(z&&C.RY).E(z,y,c)
+w=document.createDocumentFragment()
+x.toString
+z=new W.e7(x)
+v=z.gV(z)
+for(;z=v.firstChild,z!=null;)w.appendChild(z)
+return w},
+$isd5:1,
+$isD0:1,
+$isvB:1,
+"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGComponentTransferFunctionElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFEPointLightElement|SVGFESpotLightElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGHKernElement|SVGMetadataElement|SVGMissingGlyphElement|SVGStopElement|SVGStyleElement|SVGTitleElement|SVGVKernElement;SVGElement"},hy:{"^":"tp;",$isvB:1,"%":"SVGSVGElement"},aS:{"^":"d5;",$isvB:1,"%":"SVGSymbolElement"},mH:{"^":"tp;","%":";SVGTextContentElement"},Rk:{"^":"mH;",$isvB:1,"%":"SVGTextPathElement"},Pt:{"^":"mH;","%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},zY:{"^":"vB;",$isMh:1,"%":"SVGTransform"},DT:{"^":"h0;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return a.getItem(b)},
+W:function(a,b){return this.q(a,b)},
+$iszM:1,
+$aszM:function(){return[P.zY]},
+$isqC:1,
+"%":"SVGTransformList"},T1:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.zY]},
+$isqC:1},h0:{"^":"T1+Gm;",$iszM:1,
+$aszM:function(){return[P.zY]},
+$isqC:1},ox:{"^":"tp;",$isvB:1,"%":"SVGUseElement"},ZD:{"^":"d5;",$isvB:1,"%":"SVGViewElement"},bW:{"^":"vB;",$isvB:1,"%":"SVGViewSpec"},cu:{"^":"d5;",$isvB:1,"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},We:{"^":"d5;",$isvB:1,"%":"SVGCursorElement"},cB:{"^":"d5;",$isvB:1,"%":"SVGFEDropShadowElement"},Pi:{"^":"d5;",$isvB:1,"%":"SVGGlyphRefElement"},zu:{"^":"d5;",$isvB:1,"%":"SVGMPathElement"}}],["","",,P,{"^":"",r2:{"^":"vB;A:length=","%":"AudioBuffer"}}],["","",,P,{"^":""}],["","",,P,{"^":"",Fn:{"^":"i0;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)throw H.b(P.Cf(b,a,null,null,null))
+return P.mR(a.item(b))},
+W:function(a,b){return this.q(a,b)},
+$iszM:1,
+$aszM:function(){return[P.L8]},
+$isqC:1,
+"%":"SQLResultSetRowList"},U3:{"^":"vB+lD;",$iszM:1,
+$aszM:function(){return[P.L8]},
+$isqC:1},i0:{"^":"U3+Gm;",$iszM:1,
+$aszM:function(){return[P.L8]},
+$isqC:1}}],["","",,P,{"^":"",IU:{"^":"Mh;"}}],["","",,P,{"^":"",Ex:{"^":"Mh;"},tn:{"^":"Ex;",$astn:null}}],["","",,H,{"^":"",WZ:{"^":"vB;",$isWZ:1,"%":"ArrayBuffer"},ET:{"^":"vB;",$isET:1,"%":"DataView;ArrayBufferView;b0|fj|GV|Dg|pb|Ip|Pg"},b0:{"^":"ET;",
+gA:function(a){return a.length},
+$isXj:1,
+$isDD:1},Dg:{"^":"GV;",
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]}},fj:{"^":"b0+lD;",$iszM:1,
+$aszM:function(){return[P.CP]},
+$isqC:1},GV:{"^":"fj+SU;"},Pg:{"^":"Ip;",$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1},pb:{"^":"b0+lD;",$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1},Ip:{"^":"pb+SU;"},Hg:{"^":"Dg;",$iszM:1,
+$aszM:function(){return[P.CP]},
+$isqC:1,
+"%":"Float32Array"},fS:{"^":"Dg;",$iszM:1,
+$aszM:function(){return[P.CP]},
+$isqC:1,
+"%":"Float64Array"},xj:{"^":"Pg;",
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":"Int16Array"},dE:{"^":"Pg;",
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":"Int32Array"},ZA:{"^":"Pg;",
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":"Int8Array"},dT:{"^":"Pg;",
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":"Uint16Array"},nl:{"^":"Pg;",
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":"Uint32Array"},eE:{"^":"Pg;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":"CanvasPixelArray|Uint8ClampedArray"},V6:{"^":"Pg;",
+gA:function(a){return a.length},
+q:function(a,b){if(b>>>0!==b||b>=a.length)H.vh(H.HY(a,b))
+return a[b]},
+$iszM:1,
+$aszM:function(){return[P.KN]},
+$isqC:1,
+"%":";Uint8Array"}}],["","",,H,{"^":"",
+qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
+return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
+return}if(typeof window=="object")return
+if(typeof print=="function"){print(a)
+return}throw"Unable to print message: "+String(a)}}],["","",,P,{"^":"",
+mR:function(a){var z,y,x,w,v
+if(a==null)return
+z=P.u5()
+y=Object.getOwnPropertyNames(a)
+for(x=y.length,w=0;w<y.length;y.length===x||(0,H.lk)(y),++w){v=y[w]
+z.t(0,v,a[v])}return z},
+hx:{"^":"Mh;",
+VL:function(a){if($.$get$X4().b.test(H.Yx(a)))return a
+throw H.b(P.L3(a,"value","Not a valid class token"))},
+w:function(a){return this.DG().zV(0," ")},
+O4:function(a,b,c){var z,y
+this.VL(b)
+z=this.DG()
+if(!z.tg(0,b)){z.AN(0,b)
+y=!0}else{z.Rz(0,b)
+y=!1}this.p5(z)
+return y},
+lo:function(a,b){return this.O4(a,b,null)},
+gk:function(a){var z,y
+z=this.DG()
+y=new P.lm(z,z.r,null,null)
+y.c=z.e
+return y},
+U:function(a,b){this.DG().U(0,b)},
+gA:function(a){return this.DG().a},
+tg:function(a,b){if(typeof b!=="string")return!1
+this.VL(b)
+return this.DG().tg(0,b)},
+Zt:function(a){return this.tg(0,a)?a:null},
+AN:function(a,b){this.VL(b)
+return this.OS(0,new P.GE(b))},
+Rz:function(a,b){var z,y
+this.VL(b)
+z=this.DG()
+y=z.Rz(0,b)
+this.p5(z)
+return y},
+OS:function(a,b){var z,y
+z=this.DG()
+y=b.$1(z)
+this.p5(z)
+return y},
+$isqC:1},
+GE:{"^":"L:1;a",
+$1:function(a){return a.AN(0,this.a)}}}],["","",,Z,{"^":"",
+E:[function(){var z,y,x,w,v,u,t
+z=$.$get$t().innerHTML
+try{y=self.Viz(z,"svg")
+Z.r(y)}catch(v){u=H.p(v)
+x=u
+u=J.A(x)
+t=C.oW.h(u,0,u.length)
+w="<pre>"+H.d(t==null?u:t)+"</pre>"
+u=document.body;(u&&C.RY).N(u,"beforeend",w,null,null)}},"$0","cK",0,0,2],
+r:function(a){var z,y,x,w,v
+z=document.body;(z&&C.RY).N(z,"beforeend",a,C.Hv,null)
+z=$.$get$hh()
+y=z.style
+y.display="block"
+$.v7=H.Go(document.querySelector("svg"),"$isd5")
+z.toString
+z=H.VM(new W.Cq(z,"click",!1),[null])
+H.VM(new W.xC(0,z.a,z.b,W.aF(new Z.AR()),!1),[H.Kp(z,0)]).DN()
+for(z=new W.wz($.v7.querySelectorAll("g.node")),z=z.gk(z);z.F();){x=z.d
+y=J.RE(x)
+y.sjO(x,y.Wk(x,"title").textContent)}for(z=new W.wz($.v7.querySelectorAll("g.edge")),z=z.gk(z);z.F();){w=z.d
+y=J.RE(w)
+v=y.Wk(w,"title").textContent.split("->")
+y.a7(w,"x-from",v[0])
+w.setAttribute("x-to",v[1])}z=$.v7
+z.toString
+z=H.VM(new W.Cq(z,"mouseover",!1),[null])
+H.VM(new W.xC(0,z.a,z.b,W.aF(new Z.lg()),!1),[H.Kp(z,0)]).DN()
+z=$.v7
+z.toString
+z=H.VM(new W.Cq(z,"mouseleave",!1),[null])
+H.VM(new W.xC(0,z.a,z.b,W.aF(new Z.qK()),!1),[H.Kp(z,0)]).DN()},
+ws:function(a){var z,y
+z=[]
+if(a!=null)if(new P.O7(a).tg(0,"edge"))C.Nm.FV(z,[a.getAttribute("x-to"),a.getAttribute("x-from")])
+else z.push(a.id)
+y=new W.wz($.v7.querySelectorAll("g.node"))
+y.U(y,new Z.tb(z))
+y=new W.wz($.v7.querySelectorAll("g.edge"))
+y.U(y,new Z.GJ(z))},
+AR:{"^":"L:1;",
+$1:function(a){var z=$.v7
+z.toString
+new P.O7(z).lo(0,"zoom")}},
+lg:{"^":"L:5;",
+$1:function(a){var z,y
+z=H.Go(W.qc(a.relatedTarget),"$iscv")
+while(!0){y=z!=null
+if(!(y&&!J.v(z).$isBA))break
+z=z.parentElement}if(y){y=J.RE(z)
+y=y.gDD(z).tg(0,"edge")||y.gDD(z).tg(0,"node")}else y=!1
+if(y)Z.ws(z)
+else Z.ws(null)}},
+qK:{"^":"L:5;",
+$1:function(a){Z.ws(null)}},
+tb:{"^":"L:6;a",
+$1:function(a){var z=J.RE(a)
+if(C.Nm.tg(this.a,a.id))z.gDD(a).AN(0,"active")
+else z.gDD(a).Rz(0,"active")}},
+GJ:{"^":"L:6;a",
+$1:function(a){var z,y
+z=this.a
+if(z.length===2){z=C.Nm.tg(z,a.getAttribute("x-to"))&&C.Nm.tg(z,a.getAttribute("x-from"))
+y=J.RE(a)
+if(z)y.gDD(a).AN(0,"active")
+else y.gDD(a).Rz(0,"active")}else{z=C.Nm.tg(z,a.getAttribute("x-to"))||C.Nm.tg(z,a.getAttribute("x-from"))
+y=J.RE(a)
+if(z)y.gDD(a).AN(0,"active")
+else y.gDD(a).Rz(0,"active")}}}},1]]
+setupProgram(dart,0)
+J.RE=function(a){if(a==null)return a
+if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
+return a}if(a instanceof P.Mh)return a
+return J.m(a)}
+J.U6=function(a){if(typeof a=="string")return J.Dr.prototype
+if(a==null)return a
+if(a.constructor==Array)return J.jd.prototype
+if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
+return a}if(a instanceof P.Mh)return a
+return J.m(a)}
+J.Wx=function(a){if(typeof a=="number")return J.jX.prototype
+if(a==null)return a
+if(!(a instanceof P.Mh))return J.k.prototype
+return a}
+J.rY=function(a){if(typeof a=="string")return J.Dr.prototype
+if(a==null)return a
+if(!(a instanceof P.Mh))return J.k.prototype
+return a}
+J.v=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.im.prototype
+return J.VA.prototype}if(typeof a=="string")return J.Dr.prototype
+if(a==null)return J.PE.prototype
+if(typeof a=="boolean")return J.yE.prototype
+if(a.constructor==Array)return J.jd.prototype
+if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
+return a}if(a instanceof P.Mh)return a
+return J.m(a)}
+J.w1=function(a){if(a==null)return a
+if(a.constructor==Array)return J.jd.prototype
+if(typeof a!="object"){if(typeof a=="function")return J.c5.prototype
+return a}if(a instanceof P.Mh)return a
+return J.m(a)}
+J.A=function(a){return J.v(a).w(a)}
+J.Ay=function(a){return J.RE(a).goc(a)}
+J.EJ=function(a,b,c,d){return J.RE(a).Y9(a,b,c,d)}
+J.GA=function(a,b){return J.w1(a).W(a,b)}
+J.Gq=function(a,b){return J.RE(a).sLU(a,b)}
+J.Hm=function(a){return J.U6(a).gA(a)}
+J.IT=function(a){return J.w1(a).gk(a)}
+J.Ns=function(a){return J.w1(a).wg(a)}
+J.Ob=function(a){return J.RE(a).gns(a)}
+J.Q1=function(a){return J.RE(a).gQg(a)}
+J.RM=function(a,b){if(a==null)return b==null
+if(typeof a!="object")return b!=null&&a===b
+return J.v(a).D(a,b)}
+J.T0=function(a){return J.rY(a).bS(a)}
+J.TT=function(a,b){return J.RE(a).wR(a,b)}
+J.YA=function(a){return J.RE(a).gkc(a)}
+J.aa=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
+return J.Wx(a).B(a,b)}
+J.cH=function(a){return J.rY(a).hc(a)}
+J.dZ=function(a,b,c,d){return J.RE(a).On(a,b,c,d)}
+J.hE=function(a,b){return J.w1(a).U(a,b)}
+J.hf=function(a){return J.v(a).gM(a)}
+J.iu=function(a,b){return J.w1(a).ez(a,b)}
+J.ld=function(a,b,c){return J.rY(a).C(a,b,c)}
+J.w2=function(a,b){if(typeof b==="number")if(a.constructor==Array||typeof a=="string"||H.wV(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
+return J.U6(a).q(a,b)}
+I.uL=function(a){a.immutable$list=Array
+a.fixed$length=Array
+return a}
+var $=I.p
+C.RY=W.QP.prototype
+C.Ok=J.vB.prototype
+C.Nm=J.jd.prototype
+C.jn=J.im.prototype
+C.xB=J.Dr.prototype
+C.DG=J.c5.prototype
+C.t5=W.BH.prototype
+C.ZQ=J.iC.prototype
+C.Ie=W.Tb.prototype
+C.vB=J.k.prototype
+C.KZ=new H.hJ()
+C.NU=new P.R8()
+C.Hv=new W.x()
+C.RT=new P.a6(0)
+C.Hw=new P.fU("unknown",!0,!0,!0,!0)
+C.oW=new P.Rc(C.Hw)
+C.Mc=function(hooks) {
+ if (typeof dartExperimentalFixupGetTag != "function") return hooks;
+ hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
+}
+C.lR=function(hooks) {
+ var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+ if (userAgent.indexOf("Firefox") == -1) return hooks;
+ var getTag = hooks.getTag;
+ var quickMap = {
+ "BeforeUnloadEvent": "Event",
+ "DataTransfer": "Clipboard",
+ "GeoGeolocation": "Geolocation",
+ "Location": "!Location",
+ "WorkerMessageEvent": "MessageEvent",
+ "XMLDocument": "!Document"};
+ function getTagFirefox(o) {
+ var tag = getTag(o);
+ return quickMap[tag] || tag;
+ }
+ hooks.getTag = getTagFirefox;
+}
+C.w2=function getTagFallback(o) {
+ var constructor = o.constructor;
+ if (typeof constructor == "function") {
+ var name = constructor.name;
+ if (typeof name == "string" &&
+ name.length > 2 &&
+ name !== "Object" &&
+ name !== "Function.prototype") {
+ return name;
+ }
+ }
+ var s = Object.prototype.toString.call(o);
+ return s.substring(8, s.length - 1);
+}
+C.XQ=function(hooks) { return hooks; }
+
+C.ur=function(getTagFallback) {
+ return function(hooks) {
+ if (typeof navigator != "object") return hooks;
+ var ua = navigator.userAgent;
+ if (ua.indexOf("DumpRenderTree") >= 0) return hooks;
+ if (ua.indexOf("Chrome") >= 0) {
+ function confirm(p) {
+ return typeof window == "object" && window[p] && window[p].name == p;
+ }
+ if (confirm("Window") && confirm("HTMLElement")) return hooks;
+ }
+ hooks.getTag = getTagFallback;
+ };
+}
+C.Jh=function(hooks) {
+ var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
+ if (userAgent.indexOf("Trident/") == -1) return hooks;
+ var getTag = hooks.getTag;
+ var quickMap = {
+ "BeforeUnloadEvent": "Event",
+ "DataTransfer": "Clipboard",
+ "HTMLDDElement": "HTMLElement",
+ "HTMLDTElement": "HTMLElement",
+ "HTMLPhraseElement": "HTMLElement",
+ "Position": "Geoposition"
+ };
+ function getTagIE(o) {
+ var tag = getTag(o);
+ var newTag = quickMap[tag];
+ if (newTag) return newTag;
+ if (tag == "Object") {
+ if (window.DataView && (o instanceof window.DataView)) return "DataView";
+ }
+ return tag;
+ }
+ function prototypeForTagIE(tag) {
+ var constructor = window[tag];
+ if (constructor == null) return null;
+ return constructor.prototype;
+ }
+ hooks.getTag = getTagIE;
+ hooks.prototypeForTag = prototypeForTagIE;
+}
+C.M1=function() {
+ function typeNameInChrome(o) {
+ var constructor = o.constructor;
+ if (constructor) {
+ var name = constructor.name;
+ if (name) return name;
+ }
+ var s = Object.prototype.toString.call(o);
+ return s.substring(8, s.length - 1);
+ }
+ function getUnknownTag(object, tag) {
+ if (/^HTML[A-Z].*Element$/.test(tag)) {
+ var name = Object.prototype.toString.call(object);
+ if (name == "[object Object]") return null;
+ return "HTMLElement";
+ }
+ }
+ function getUnknownTagGenericBrowser(object, tag) {
+ if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
+ return getUnknownTag(object, tag);
+ }
+ function prototypeForTag(tag) {
+ if (typeof window == "undefined") return null;
+ if (typeof window[tag] == "undefined") return null;
+ var constructor = window[tag];
+ if (typeof constructor != "function") return null;
+ return constructor.prototype;
+ }
+ function discriminator(tag) { return null; }
+ var isBrowser = typeof navigator == "object";
+ return {
+ getTag: typeNameInChrome,
+ getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
+ prototypeForTag: prototypeForTag,
+ discriminator: discriminator };
+}
+C.hQ=function(hooks) {
+ var getTag = hooks.getTag;
+ var prototypeForTag = hooks.prototypeForTag;
+ function getTagFixed(o) {
+ var tag = getTag(o);
+ if (tag == "Document") {
+ if (!!o.xmlVersion) return "!Document";
+ return "!HTMLDocument";
+ }
+ return tag;
+ }
+ function prototypeForTagFixed(tag) {
+ if (tag == "Document") return null;
+ return prototypeForTag(tag);
+ }
+ hooks.getTag = getTagFixed;
+ hooks.prototypeForTag = prototypeForTagFixed;
+}
+C.cm=H.VM(I.uL(["*::class","*::dir","*::draggable","*::hidden","*::id","*::inert","*::itemprop","*::itemref","*::itemscope","*::lang","*::spellcheck","*::title","*::translate","A::accesskey","A::coords","A::hreflang","A::name","A::shape","A::tabindex","A::target","A::type","AREA::accesskey","AREA::alt","AREA::coords","AREA::nohref","AREA::shape","AREA::tabindex","AREA::target","AUDIO::controls","AUDIO::loop","AUDIO::mediagroup","AUDIO::muted","AUDIO::preload","BDO::dir","BODY::alink","BODY::bgcolor","BODY::link","BODY::text","BODY::vlink","BR::clear","BUTTON::accesskey","BUTTON::disabled","BUTTON::name","BUTTON::tabindex","BUTTON::type","BUTTON::value","CANVAS::height","CANVAS::width","CAPTION::align","COL::align","COL::char","COL::charoff","COL::span","COL::valign","COL::width","COLGROUP::align","COLGROUP::char","COLGROUP::charoff","COLGROUP::span","COLGROUP::valign","COLGROUP::width","COMMAND::checked","COMMAND::command","COMMAND::disabled","COMMAND::label","COMMAND::radiogroup","COMMAND::type","DATA::value","DEL::datetime","DETAILS::open","DIR::compact","DIV::align","DL::compact","FIELDSET::disabled","FONT::color","FONT::face","FONT::size","FORM::accept","FORM::autocomplete","FORM::enctype","FORM::method","FORM::name","FORM::novalidate","FORM::target","FRAME::name","H1::align","H2::align","H3::align","H4::align","H5::align","H6::align","HR::align","HR::noshade","HR::size","HR::width","HTML::version","IFRAME::align","IFRAME::frameborder","IFRAME::height","IFRAME::marginheight","IFRAME::marginwidth","IFRAME::width","IMG::align","IMG::alt","IMG::border","IMG::height","IMG::hspace","IMG::ismap","IMG::name","IMG::usemap","IMG::vspace","IMG::width","INPUT::accept","INPUT::accesskey","INPUT::align","INPUT::alt","INPUT::autocomplete","INPUT::autofocus","INPUT::checked","INPUT::disabled","INPUT::inputmode","INPUT::ismap","INPUT::list","INPUT::max","INPUT::maxlength","INPUT::min","INPUT::multiple","INPUT::name","INPUT::placeholder","INPUT::readonly","INPUT::required","INPUT::size","INPUT::step","INPUT::tabindex","INPUT::type","INPUT::usemap","INPUT::value","INS::datetime","KEYGEN::disabled","KEYGEN::keytype","KEYGEN::name","LABEL::accesskey","LABEL::for","LEGEND::accesskey","LEGEND::align","LI::type","LI::value","LINK::sizes","MAP::name","MENU::compact","MENU::label","MENU::type","METER::high","METER::low","METER::max","METER::min","METER::value","OBJECT::typemustmatch","OL::compact","OL::reversed","OL::start","OL::type","OPTGROUP::disabled","OPTGROUP::label","OPTION::disabled","OPTION::label","OPTION::selected","OPTION::value","OUTPUT::for","OUTPUT::name","P::align","PRE::width","PROGRESS::max","PROGRESS::min","PROGRESS::value","SELECT::autocomplete","SELECT::disabled","SELECT::multiple","SELECT::name","SELECT::required","SELECT::size","SELECT::tabindex","SOURCE::type","TABLE::align","TABLE::bgcolor","TABLE::border","TABLE::cellpadding","TABLE::cellspacing","TABLE::frame","TABLE::rules","TABLE::summary","TABLE::width","TBODY::align","TBODY::char","TBODY::charoff","TBODY::valign","TD::abbr","TD::align","TD::axis","TD::bgcolor","TD::char","TD::charoff","TD::colspan","TD::headers","TD::height","TD::nowrap","TD::rowspan","TD::scope","TD::valign","TD::width","TEXTAREA::accesskey","TEXTAREA::autocomplete","TEXTAREA::cols","TEXTAREA::disabled","TEXTAREA::inputmode","TEXTAREA::name","TEXTAREA::placeholder","TEXTAREA::readonly","TEXTAREA::required","TEXTAREA::rows","TEXTAREA::tabindex","TEXTAREA::wrap","TFOOT::align","TFOOT::char","TFOOT::charoff","TFOOT::valign","TH::abbr","TH::align","TH::axis","TH::bgcolor","TH::char","TH::charoff","TH::colspan","TH::headers","TH::height","TH::nowrap","TH::rowspan","TH::scope","TH::valign","TH::width","THEAD::align","THEAD::char","THEAD::charoff","THEAD::valign","TR::align","TR::bgcolor","TR::char","TR::charoff","TR::valign","TRACK::default","TRACK::kind","TRACK::label","TRACK::srclang","UL::compact","UL::type","VIDEO::controls","VIDEO::height","VIDEO::loop","VIDEO::mediagroup","VIDEO::muted","VIDEO::preload","VIDEO::width"]),[P.qU])
+C.Sq=I.uL(["HEAD","AREA","BASE","BASEFONT","BR","COL","COLGROUP","EMBED","FRAME","FRAMESET","HR","IMAGE","IMG","INPUT","ISINDEX","LINK","META","PARAM","SOURCE","STYLE","TITLE","WBR"])
+C.xD=I.uL([])
+C.Qx=H.VM(I.uL(["bind","if","ref","repeat","syntax"]),[P.qU])
+C.BI=H.VM(I.uL(["A::href","AREA::href","BLOCKQUOTE::cite","BODY::background","COMMAND::icon","DEL::cite","FORM::action","IMG::src","INPUT::src","INS::cite","Q::cite","VIDEO::poster"]),[P.qU])
+$.te="$cachedFunction"
+$.eb="$cachedInvocation"
+$.yj=0
+$.mJ=null
+$.P4=null
+$.n=null
+$.c=null
+$.x7=null
+$.z=null
+$.a=null
+$.M=null
+$.S6=null
+$.k8=null
+$.mg=null
+$.UD=!1
+$.X3=C.NU
+$.Ss=0
+$.xo=null
+$.BO=null
+$.lt=null
+$.EU=null
+$.v7=null
+$=null
+init.isHunkLoaded=function(a){return!!$dart_deferred_initializers$[a]}
+init.deferredInitialized=new Object(null)
+init.isHunkInitialized=function(a){return init.deferredInitialized[a]}
+init.initializeLoadedHunk=function(a){$dart_deferred_initializers$[a]($globals$,$)
+init.deferredInitialized[a]=true}
+init.deferredLibraryUris={}
+init.deferredLibraryHashes={};(function(a){for(var z=0;z<a.length;){var y=a[z++]
+var x=a[z++]
+var w=a[z++]
+I.$lazy(y,x,w)}})(["fa","$get$fa",function(){return init.getIsolateTag("_$dart_dartClosure")},"Kb","$get$Kb",function(){return H.yl()},"jp","$get$jp",function(){return new P.kM(null)},"U2","$get$U2",function(){return H.cM(H.S7({
+toString:function(){return"$receiver$"}}))},"k1","$get$k1",function(){return H.cM(H.S7({$method$:null,
+toString:function(){return"$receiver$"}}))},"Re","$get$Re",function(){return H.cM(H.S7(null))},"fN","$get$fN",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())},"qi","$get$qi",function(){return H.cM(H.S7(void 0))},"rZ","$get$rZ",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
+try{(void 0).$method$($argumentsExpr$)}catch(z){return z.message}}())},"BX","$get$BX",function(){return H.cM(H.Mj(null))},"tt","$get$tt",function(){return H.cM(function(){try{null.$method$}catch(z){return z.message}}())},"dt","$get$dt",function(){return H.cM(H.Mj(void 0))},"A7","$get$A7",function(){return H.cM(function(){try{(void 0).$method$}catch(z){return z.message}}())},"Wc","$get$Wc",function(){return P.Oj()},"xg","$get$xg",function(){return[]},"zX","$get$zX",function(){return P.tM(["A","ABBR","ACRONYM","ADDRESS","AREA","ARTICLE","ASIDE","AUDIO","B","BDI","BDO","BIG","BLOCKQUOTE","BR","BUTTON","CANVAS","CAPTION","CENTER","CITE","CODE","COL","COLGROUP","COMMAND","DATA","DATALIST","DD","DEL","DETAILS","DFN","DIR","DIV","DL","DT","EM","FIELDSET","FIGCAPTION","FIGURE","FONT","FOOTER","FORM","H1","H2","H3","H4","H5","H6","HEADER","HGROUP","HR","I","IFRAME","IMG","INPUT","INS","KBD","LABEL","LEGEND","LI","MAP","MARK","MENU","METER","NAV","NOBR","OL","OPTGROUP","OPTION","OUTPUT","P","PRE","PROGRESS","Q","S","SAMP","SECTION","SELECT","SMALL","SOURCE","SPAN","STRIKE","STRONG","SUB","SUMMARY","SUP","TABLE","TBODY","TD","TEXTAREA","TFOOT","TH","THEAD","TIME","TR","TRACK","TT","U","UL","VAR","VIDEO","WBR"],null)},"or","$get$or",function(){return P.u5()},"X4","$get$X4",function(){return new H.VR("^\\S+$",H.v4("^\\S+$",!1,!0,!1),null,null)},"hh","$get$hh",function(){return H.Go(W.Z0("#zoomBtn"),"$isIF")},"t","$get$t",function(){return H.Go(W.Z0("#dot"),"$isqI")}])
+I=I.$finishIsolateConstructor(I)
+$=new I()
+init.metadata=[null]
+init.types=[{func:1},{func:1,args:[,]},{func:1,v:true},{func:1,v:true,args:[{func:1,v:true}]},{func:1,ret:P.qU,args:[P.KN]},{func:1,args:[W.Aj]},{func:1,args:[W.cv]},{func:1,ret:P.a2,args:[W.cv,P.qU,P.qU,W.JQ]},{func:1,args:[,P.qU]},{func:1,args:[P.qU]},{func:1,args:[{func:1,v:true}]},{func:1,v:true,args:[,],opt:[P.Gz]},{func:1,args:[,],opt:[,]},{func:1,args:[,P.Gz]},{func:1,args:[,,]},{func:1,v:true,args:[W.K,W.K]}]
+function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
+new MyClass()
+return a}function convertToSlowObject(a){a.__MAGIC_SLOW_PROPERTY=1
+delete a.__MAGIC_SLOW_PROPERTY
+return a}A=convertToFastObject(A)
+B=convertToFastObject(B)
+C=convertToFastObject(C)
+D=convertToFastObject(D)
+E=convertToFastObject(E)
+F=convertToFastObject(F)
+G=convertToFastObject(G)
+H=convertToFastObject(H)
+J=convertToFastObject(J)
+K=convertToFastObject(K)
+L=convertToFastObject(L)
+M=convertToFastObject(M)
+N=convertToFastObject(N)
+O=convertToFastObject(O)
+P=convertToFastObject(P)
+Q=convertToFastObject(Q)
+R=convertToFastObject(R)
+S=convertToFastObject(S)
+T=convertToFastObject(T)
+U=convertToFastObject(U)
+V=convertToFastObject(V)
+W=convertToFastObject(W)
+X=convertToFastObject(X)
+Y=convertToFastObject(Y)
+Z=convertToFastObject(Z)
+function init(){I.p=Object.create(null)
+init.allClasses=map()
+init.getTypeFromName=function(a){return init.allClasses[a]}
+init.interceptorsByTag=map()
+init.leafTags=map()
+init.finishedClasses=map()
+I.$lazy=function(a,b,c,d,e){if(!init.lazies)init.lazies=Object.create(null)
+init.lazies[a]=b
+e=e||I.p
+var z={}
+var y={}
+e[a]=z
+e[b]=function(){var x=this[a]
+try{if(x===z){this[a]=y
+try{x=this[a]=c()}finally{if(x===z)this[a]=null}}else if(x===y)H.eQ(d||a)
+return x}finally{this[b]=function(){return this[a]}}}}
+I.$finishIsolateConstructor=function(a){var z=a.p
+function Isolate(){var y=Object.keys(z)
+for(var x=0;x<y.length;x++){var w=y[x]
+this[w]=z[w]}var v=init.lazies
+var u=v?Object.keys(v):[]
+for(var x=0;x<u.length;x++)this[v[u[x]]]=null
+function ForceEfficientMap(){}ForceEfficientMap.prototype=this
+new ForceEfficientMap()
+for(var x=0;x<u.length;x++){var t=v[u[x]]
+this[t]=z[t]}}Isolate.prototype=a.prototype
+Isolate.prototype.constructor=Isolate
+Isolate.p=z
+Isolate.uL=a.uL
+Isolate.HU=a.HU
+return Isolate}}!function(){var z=function(a){var t={}
+t[a]=1
+return Object.keys(convertToFastObject(t))[0]}
+init.getIsolateTag=function(a){return z("___dart_"+a+init.isolateTag)}
+var y="___dart_isolate_tags_"
+var x=Object[y]||(Object[y]=Object.create(null))
+var w="_ZxYxX"
+for(var v=0;;v++){var u=z(w+"_"+v+"_")
+if(!(u in x)){x[u]=1
+init.isolateTag=u
+break}}init.dispatchPropertyName=init.getIsolateTag("dispatch_record")}();(function(a){if(typeof document==="undefined"){a(null)
+return}if(typeof document.currentScript!='undefined'){a(document.currentScript)
+return}var z=document.scripts
+function onLoad(b){for(var x=0;x<z.length;++x)z[x].removeEventListener("load",onLoad,false)
+a(b.target)}for(var y=0;y<z.length;++y)z[y].addEventListener("load",onLoad,false)})(function(a){init.currentScript=a
+if(typeof dartMainRunner==="function")dartMainRunner(function(b){H.Rq(Z.cK(),b)},[])
+else (function(b){H.Rq(Z.cK(),b)})([])})})()
\ No newline at end of file
diff --git a/pkg/analyzer/doc/tasks.html b/pkg/analyzer/doc/tasks.html
new file mode 100644
index 0000000..2224724
--- /dev/null
+++ b/pkg/analyzer/doc/tasks.html
@@ -0,0 +1,340 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Analysis Task Dependency Graph</title>
+ <link rel="stylesheet" href="support/style.css">
+ <script src="support/viz.js"></script>
+ <script type="application/dart" src="support/web_app.dart.js"></script>
+ <script src="support/dart.js"></script>
+</head>
+<body>
+<button id="zoomBtn">Zoom</button>
+<script type="text/vnd.graphviz" id="dot">
+digraph G {
+ tooltip="Analysis Task Dependency Graph";
+ node [fontname=Helvetica];
+ edge [fontname=Helvetica, fontcolor=gray];
+ BUILD_DIRECTIVES_ERRORS -> LibraryUnitErrorsTask
+ BUILD_DIRECTIVES_ERRORS [shape=box]
+ BUILD_LIBRARY_ERRORS -> LibraryUnitErrorsTask
+ BUILD_LIBRARY_ERRORS [shape=box]
+ BuildCompilationUnitElementTask -> COMPILATION_UNIT_CONSTANTS
+ BuildCompilationUnitElementTask -> COMPILATION_UNIT_ELEMENT
+ BuildCompilationUnitElementTask -> CREATED_RESOLVED_UNIT1
+ BuildCompilationUnitElementTask -> RESOLVED_UNIT1
+ BuildDirectiveElementsTask -> BUILD_DIRECTIVES_ERRORS
+ BuildDirectiveElementsTask -> LIBRARY_ELEMENT2
+ BuildEnumMemberElementsTask -> CREATED_RESOLVED_UNIT3
+ BuildEnumMemberElementsTask -> RESOLVED_UNIT3
+ BuildExportNamespaceTask -> LIBRARY_ELEMENT4
+ BuildLibraryElementTask -> BUILD_LIBRARY_ERRORS
+ BuildLibraryElementTask -> IS_LAUNCHABLE
+ BuildLibraryElementTask -> LIBRARY_ELEMENT1
+ BuildPublicNamespaceTask -> LIBRARY_ELEMENT3
+ BuildSourceExportClosureTask -> EXPORT_SOURCE_CLOSURE
+ BuildTypeProviderTask -> TYPE_PROVIDER
+ COMPILATION_UNIT_CONSTANTS -> EvaluateUnitConstantsTask
+ COMPILATION_UNIT_CONSTANTS [shape=box]
+ COMPILATION_UNIT_ELEMENT [shape=box]
+ CONSTANT_DEPENDENCIES -> ComputeConstantValueTask
+ CONSTANT_DEPENDENCIES [shape=box]
+ CONSTANT_EXPRESSIONS_DEPENDENCIES -> EvaluateUnitConstantsTask
+ CONSTANT_EXPRESSIONS_DEPENDENCIES [shape=box]
+ CONSTANT_EXPRESSION_RESOLVED -> ComputeConstantDependenciesTask
+ CONSTANT_EXPRESSION_RESOLVED [shape=box]
+ CONSTANT_VALUE -> ComputeConstantValueTask
+ CONSTANT_VALUE -> EvaluateUnitConstantsTask
+ CONSTANT_VALUE [shape=box]
+ CONTAINING_LIBRARIES -> DartErrorsTask
+ CONTAINING_LIBRARIES [shape=box]
+ CONTENT -> ScanDartTask
+ CONTENT [shape=box]
+ CREATED_RESOLVED_UNIT [shape=box]
+ CREATED_RESOLVED_UNIT1 [shape=box]
+ CREATED_RESOLVED_UNIT10 -> InferInstanceMembersInUnitTask
+ CREATED_RESOLVED_UNIT10 -> InferStaticVariableTypeTask
+ CREATED_RESOLVED_UNIT10 -> PartiallyResolveUnitReferencesTask
+ CREATED_RESOLVED_UNIT10 -> ResolveInstanceFieldsInUnitTask
+ CREATED_RESOLVED_UNIT10 -> ResolveUnitTask
+ CREATED_RESOLVED_UNIT10 [shape=box]
+ CREATED_RESOLVED_UNIT11 -> ResolveConstantExpressionTask
+ CREATED_RESOLVED_UNIT11 [shape=box]
+ CREATED_RESOLVED_UNIT12 [shape=box]
+ CREATED_RESOLVED_UNIT2 [shape=box]
+ CREATED_RESOLVED_UNIT3 [shape=box]
+ CREATED_RESOLVED_UNIT4 [shape=box]
+ CREATED_RESOLVED_UNIT5 [shape=box]
+ CREATED_RESOLVED_UNIT6 [shape=box]
+ CREATED_RESOLVED_UNIT7 [shape=box]
+ CREATED_RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
+ CREATED_RESOLVED_UNIT8 [shape=box]
+ CREATED_RESOLVED_UNIT9 -> InferInstanceMembersInUnitTask
+ CREATED_RESOLVED_UNIT9 [shape=box]
+ ComputeConstantDependenciesTask -> CONSTANT_DEPENDENCIES
+ ComputeConstantValueTask -> CONSTANT_VALUE
+ ComputeInferableStaticVariableDependenciesTask -> INFERABLE_STATIC_VARIABLE_DEPENDENCIES
+ ComputeLibraryCycleTask -> LIBRARY_CYCLE
+ ComputeLibraryCycleTask -> LIBRARY_CYCLE_DEPENDENCIES
+ ComputeLibraryCycleTask -> LIBRARY_CYCLE_UNITS
+ ComputePropagableVariableDependenciesTask -> PROPAGABLE_VARIABLE_DEPENDENCIES
+ ContainingLibrariesTask -> CONTAINING_LIBRARIES
+ DART_ERRORS -> LibraryErrorsReadyTask
+ DART_ERRORS [shape=box]
+ DART_SCRIPTS -> ScanDartTask
+ DART_SCRIPTS [shape=box]
+ DartErrorsTask -> DART_ERRORS
+ EXPLICITLY_IMPORTED_LIBRARIES [shape=box]
+ EXPORTED_LIBRARIES -> BuildDirectiveElementsTask
+ EXPORTED_LIBRARIES -> ReadyLibraryElement2Task
+ EXPORTED_LIBRARIES -> ReadyLibraryElement5Task
+ EXPORTED_LIBRARIES -> ReadyLibraryElement6Task
+ EXPORTED_LIBRARIES [shape=box]
+ EXPORT_SOURCE_CLOSURE -> BuildExportNamespaceTask
+ EXPORT_SOURCE_CLOSURE [shape=box]
+ EvaluateUnitConstantsTask -> CREATED_RESOLVED_UNIT12
+ EvaluateUnitConstantsTask -> RESOLVED_UNIT12
+ GatherUsedImportedElementsTask -> USED_IMPORTED_ELEMENTS
+ GatherUsedLocalElementsTask -> USED_LOCAL_ELEMENTS
+ GenerateHintsTask -> HINTS
+ GenerateLintsTask -> LINTS
+ HINTS -> LibraryUnitErrorsTask
+ HINTS [shape=box]
+ IMPORTED_LIBRARIES -> BuildDirectiveElementsTask
+ IMPORTED_LIBRARIES -> ReadyLibraryElement2Task
+ IMPORTED_LIBRARIES -> ReadyLibraryElement5Task
+ IMPORTED_LIBRARIES -> ReadyLibraryElement6Task
+ IMPORTED_LIBRARIES -> ResolveUnitTypeNamesTask
+ IMPORTED_LIBRARIES [shape=box]
+ INCLUDED_PARTS -> BuildLibraryElementTask
+ INCLUDED_PARTS [shape=box]
+ INFERABLE_STATIC_VARIABLES_IN_UNIT -> InferStaticVariableTypesInUnitTask
+ INFERABLE_STATIC_VARIABLES_IN_UNIT [shape=box]
+ INFERABLE_STATIC_VARIABLE_DEPENDENCIES -> InferStaticVariableTypeTask
+ INFERABLE_STATIC_VARIABLE_DEPENDENCIES [shape=box]
+ INFERRED_STATIC_VARIABLE -> InferStaticVariableTypeTask
+ INFERRED_STATIC_VARIABLE -> InferStaticVariableTypesInUnitTask
+ INFERRED_STATIC_VARIABLE [shape=box]
+ IS_LAUNCHABLE [shape=box]
+ InferInstanceMembersInUnitTask -> CREATED_RESOLVED_UNIT10
+ InferInstanceMembersInUnitTask -> RESOLVED_UNIT10
+ InferStaticVariableTypeTask -> INFERRED_STATIC_VARIABLE
+ InferStaticVariableTypesInUnitTask -> CREATED_RESOLVED_UNIT8
+ InferStaticVariableTypesInUnitTask -> RESOLVED_UNIT8
+ LIBRARY_CYCLE [shape=box]
+ LIBRARY_CYCLE_DEPENDENCIES -> InferInstanceMembersInUnitTask
+ LIBRARY_CYCLE_DEPENDENCIES -> InferStaticVariableTypeTask
+ LIBRARY_CYCLE_DEPENDENCIES -> PartiallyResolveUnitReferencesTask
+ LIBRARY_CYCLE_DEPENDENCIES -> ResolveInstanceFieldsInUnitTask
+ LIBRARY_CYCLE_DEPENDENCIES [shape=box]
+ LIBRARY_CYCLE_UNITS -> InferInstanceMembersInUnitTask
+ LIBRARY_CYCLE_UNITS -> ResolveInstanceFieldsInUnitTask
+ LIBRARY_CYCLE_UNITS -> ResolveUnitTask
+ LIBRARY_CYCLE_UNITS [shape=box]
+ LIBRARY_ELEMENT -> LibraryErrorsReadyTask
+ LIBRARY_ELEMENT [shape=box]
+ LIBRARY_ELEMENT1 -> BuildDirectiveElementsTask
+ LIBRARY_ELEMENT1 -> ResolveVariableReferencesTask
+ LIBRARY_ELEMENT1 [shape=box]
+ LIBRARY_ELEMENT2 -> BuildPublicNamespaceTask
+ LIBRARY_ELEMENT2 -> BuildSourceExportClosureTask
+ LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
+ LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
+ LIBRARY_ELEMENT2 -> ResolveDirectiveElementsTask
+ LIBRARY_ELEMENT2 [shape=box]
+ LIBRARY_ELEMENT3 -> BuildExportNamespaceTask
+ LIBRARY_ELEMENT3 -> BuildTypeProviderTask
+ LIBRARY_ELEMENT3 [shape=box]
+ LIBRARY_ELEMENT4 -> ResolveLibraryTypeNamesTask
+ LIBRARY_ELEMENT4 -> ResolveUnitTypeNamesTask
+ LIBRARY_ELEMENT4 [shape=box]
+ LIBRARY_ELEMENT5 -> PartiallyResolveUnitReferencesTask
+ LIBRARY_ELEMENT5 -> PropagateVariableTypesInLibraryTask
+ LIBRARY_ELEMENT5 -> ReadyLibraryElement5Task
+ LIBRARY_ELEMENT5 -> ResolveInstanceFieldsInUnitTask
+ LIBRARY_ELEMENT5 [shape=box]
+ LIBRARY_ELEMENT6 -> PropagateVariableTypesInLibraryClosureTask
+ LIBRARY_ELEMENT6 -> ReadyLibraryElement6Task
+ LIBRARY_ELEMENT6 [shape=box]
+ LIBRARY_ELEMENT7 -> ResolveLibraryReferencesTask
+ LIBRARY_ELEMENT7 -> ResolveUnitTask
+ LIBRARY_ELEMENT7 [shape=box]
+ LIBRARY_ELEMENT8 -> EvaluateUnitConstantsTask
+ LIBRARY_ELEMENT8 -> ResolveLibraryTask
+ LIBRARY_ELEMENT8 [shape=box]
+ LIBRARY_ERRORS_READY [shape=box]
+ LIBRARY_SPECIFIC_UNITS -> GenerateHintsTask
+ LIBRARY_SPECIFIC_UNITS -> PropagateVariableTypesInLibraryTask
+ LIBRARY_SPECIFIC_UNITS -> ReadyResolvedUnitTask
+ LIBRARY_SPECIFIC_UNITS -> ResolveLibraryReferencesTask
+ LIBRARY_SPECIFIC_UNITS -> ResolveLibraryTypeNamesTask
+ LIBRARY_SPECIFIC_UNITS [shape=box]
+ LIBRARY_UNIT_ERRORS -> dartErrorsForUnit
+ LIBRARY_UNIT_ERRORS [shape=box]
+ LINE_INFO -> DartErrorsTask
+ LINE_INFO -> ParseDartTask
+ LINE_INFO [shape=box]
+ LINTS -> LibraryUnitErrorsTask
+ LINTS [shape=box]
+ LibraryErrorsReadyTask -> LIBRARY_ERRORS_READY
+ LibraryUnitErrorsTask -> LIBRARY_UNIT_ERRORS
+ MODIFICATION_TIME -> ParseDartTask
+ MODIFICATION_TIME [shape=box]
+ PARSED_UNIT -> BuildCompilationUnitElementTask
+ PARSED_UNIT -> DartErrorsTask
+ PARSED_UNIT [shape=box]
+ PARSE_ERRORS -> dartErrorsForSource
+ PARSE_ERRORS [shape=box]
+ PROPAGABLE_VARIABLES_IN_UNIT -> PropagateVariableTypesInUnitTask
+ PROPAGABLE_VARIABLES_IN_UNIT [shape=box]
+ PROPAGABLE_VARIABLE_DEPENDENCIES -> PropagateVariableTypeTask
+ PROPAGABLE_VARIABLE_DEPENDENCIES [shape=box]
+ PROPAGATED_VARIABLE -> PropagateVariableTypeTask
+ PROPAGATED_VARIABLE -> PropagateVariableTypesInUnitTask
+ PROPAGATED_VARIABLE [shape=box]
+ ParseDartTask -> EXPLICITLY_IMPORTED_LIBRARIES
+ ParseDartTask -> EXPORTED_LIBRARIES
+ ParseDartTask -> IMPORTED_LIBRARIES
+ ParseDartTask -> INCLUDED_PARTS
+ ParseDartTask -> LIBRARY_SPECIFIC_UNITS
+ ParseDartTask -> PARSED_UNIT
+ ParseDartTask -> PARSE_ERRORS
+ ParseDartTask -> SOURCE_KIND
+ ParseDartTask -> UNITS
+ PartiallyResolveUnitReferencesTask -> CREATED_RESOLVED_UNIT6
+ PartiallyResolveUnitReferencesTask -> INFERABLE_STATIC_VARIABLES_IN_UNIT
+ PartiallyResolveUnitReferencesTask -> PROPAGABLE_VARIABLES_IN_UNIT
+ PartiallyResolveUnitReferencesTask -> RESOLVED_UNIT6
+ PropagateVariableTypeTask -> PROPAGATED_VARIABLE
+ PropagateVariableTypesInLibraryClosureTask -> LIBRARY_ELEMENT7
+ PropagateVariableTypesInLibraryTask -> LIBRARY_ELEMENT6
+ PropagateVariableTypesInUnitTask -> CREATED_RESOLVED_UNIT7
+ PropagateVariableTypesInUnitTask -> RESOLVED_UNIT7
+ READY_LIBRARY_ELEMENT2 -> ComputeLibraryCycleTask
+ READY_LIBRARY_ELEMENT2 -> ReadyLibraryElement2Task
+ READY_LIBRARY_ELEMENT2 [shape=box]
+ READY_LIBRARY_ELEMENT5 -> PartiallyResolveUnitReferencesTask
+ READY_LIBRARY_ELEMENT5 -> ReadyLibraryElement5Task
+ READY_LIBRARY_ELEMENT5 [shape=box]
+ READY_LIBRARY_ELEMENT6 -> PropagateVariableTypesInLibraryClosureTask
+ READY_LIBRARY_ELEMENT6 -> ReadyLibraryElement6Task
+ READY_LIBRARY_ELEMENT6 [shape=box]
+ READY_RESOLVED_UNIT -> ResolveLibraryTask
+ READY_RESOLVED_UNIT -> VerifyUnitTask
+ READY_RESOLVED_UNIT [shape=box]
+ REFERENCED_NAMES [shape=box]
+ RESOLVED_UNIT -> GenerateHintsTask
+ RESOLVED_UNIT -> GenerateLintsTask
+ RESOLVED_UNIT -> ReadyResolvedUnitTask
+ RESOLVED_UNIT -> VerifyUnitTask
+ RESOLVED_UNIT [shape=box]
+ RESOLVED_UNIT1 -> BuildDirectiveElementsTask
+ RESOLVED_UNIT1 -> BuildLibraryElementTask
+ RESOLVED_UNIT1 -> ResolveDirectiveElementsTask
+ RESOLVED_UNIT1 [shape=box]
+ RESOLVED_UNIT10 -> ResolveUnitTask
+ RESOLVED_UNIT10 [shape=box]
+ RESOLVED_UNIT11 -> EvaluateUnitConstantsTask
+ RESOLVED_UNIT11 -> GatherUsedImportedElementsTask
+ RESOLVED_UNIT11 -> GatherUsedLocalElementsTask
+ RESOLVED_UNIT11 -> ResolveLibraryReferencesTask
+ RESOLVED_UNIT11 [shape=box]
+ RESOLVED_UNIT12 -> StrongModeVerifyUnitTask
+ RESOLVED_UNIT12 [shape=box]
+ RESOLVED_UNIT2 -> BuildEnumMemberElementsTask
+ RESOLVED_UNIT2 [shape=box]
+ RESOLVED_UNIT3 -> ResolveUnitTypeNamesTask
+ RESOLVED_UNIT3 [shape=box]
+ RESOLVED_UNIT4 -> ResolveLibraryTypeNamesTask
+ RESOLVED_UNIT4 -> ResolveVariableReferencesTask
+ RESOLVED_UNIT4 [shape=box]
+ RESOLVED_UNIT5 -> PartiallyResolveUnitReferencesTask
+ RESOLVED_UNIT5 [shape=box]
+ RESOLVED_UNIT6 -> ComputeInferableStaticVariableDependenciesTask
+ RESOLVED_UNIT6 -> ComputePropagableVariableDependenciesTask
+ RESOLVED_UNIT6 -> PropagateVariableTypeTask
+ RESOLVED_UNIT6 -> PropagateVariableTypesInUnitTask
+ RESOLVED_UNIT6 [shape=box]
+ RESOLVED_UNIT7 -> InferStaticVariableTypeTask
+ RESOLVED_UNIT7 -> InferStaticVariableTypesInUnitTask
+ RESOLVED_UNIT7 -> PropagateVariableTypesInLibraryTask
+ RESOLVED_UNIT7 [shape=box]
+ RESOLVED_UNIT8 -> ResolveInstanceFieldsInUnitTask
+ RESOLVED_UNIT8 [shape=box]
+ RESOLVED_UNIT9 -> InferInstanceMembersInUnitTask
+ RESOLVED_UNIT9 [shape=box]
+ RESOLVE_TYPE_NAMES_ERRORS -> LibraryUnitErrorsTask
+ RESOLVE_TYPE_NAMES_ERRORS [shape=box]
+ RESOLVE_UNIT_ERRORS -> LibraryUnitErrorsTask
+ RESOLVE_UNIT_ERRORS [shape=box]
+ ReadyLibraryElement2Task -> READY_LIBRARY_ELEMENT2
+ ReadyLibraryElement5Task -> READY_LIBRARY_ELEMENT5
+ ReadyLibraryElement6Task -> READY_LIBRARY_ELEMENT6
+ ReadyResolvedUnitTask -> READY_RESOLVED_UNIT
+ ResolveConstantExpressionTask -> CONSTANT_EXPRESSION_RESOLVED
+ ResolveDirectiveElementsTask -> CREATED_RESOLVED_UNIT2
+ ResolveDirectiveElementsTask -> RESOLVED_UNIT2
+ ResolveInstanceFieldsInUnitTask -> CREATED_RESOLVED_UNIT9
+ ResolveInstanceFieldsInUnitTask -> RESOLVED_UNIT9
+ ResolveLibraryReferencesTask -> LIBRARY_ELEMENT8
+ ResolveLibraryReferencesTask -> REFERENCED_NAMES
+ ResolveLibraryTask -> LIBRARY_ELEMENT
+ ResolveLibraryTypeNamesTask -> LIBRARY_ELEMENT5
+ ResolveUnitTask -> CONSTANT_EXPRESSIONS_DEPENDENCIES
+ ResolveUnitTask -> CREATED_RESOLVED_UNIT11
+ ResolveUnitTask -> RESOLVED_UNIT11
+ ResolveUnitTask -> RESOLVE_UNIT_ERRORS
+ ResolveUnitTypeNamesTask -> CREATED_RESOLVED_UNIT4
+ ResolveUnitTypeNamesTask -> RESOLVED_UNIT4
+ ResolveUnitTypeNamesTask -> RESOLVE_TYPE_NAMES_ERRORS
+ ResolveVariableReferencesTask -> CREATED_RESOLVED_UNIT5
+ ResolveVariableReferencesTask -> RESOLVED_UNIT5
+ ResolveVariableReferencesTask -> VARIABLE_REFERENCE_ERRORS
+ SCAN_ERRORS -> dartErrorsForSource
+ SCAN_ERRORS [shape=box]
+ SOURCE_KIND -> BuildDirectiveElementsTask
+ SOURCE_KIND [shape=box]
+ STRONG_MODE_ERRORS -> LibraryUnitErrorsTask
+ STRONG_MODE_ERRORS [shape=box]
+ ScanDartTask -> LINE_INFO
+ ScanDartTask -> SCAN_ERRORS
+ ScanDartTask -> TOKEN_STREAM
+ StrongModeVerifyUnitTask -> CREATED_RESOLVED_UNIT
+ StrongModeVerifyUnitTask -> RESOLVED_UNIT
+ StrongModeVerifyUnitTask -> STRONG_MODE_ERRORS
+ TOKEN_STREAM -> ParseDartTask
+ TOKEN_STREAM [shape=box]
+ TYPE_PROVIDER -> BuildEnumMemberElementsTask
+ TYPE_PROVIDER -> ComputeConstantDependenciesTask
+ TYPE_PROVIDER -> ComputeConstantValueTask
+ TYPE_PROVIDER -> GenerateHintsTask
+ TYPE_PROVIDER -> InferInstanceMembersInUnitTask
+ TYPE_PROVIDER -> InferStaticVariableTypeTask
+ TYPE_PROVIDER -> PartiallyResolveUnitReferencesTask
+ TYPE_PROVIDER -> PropagateVariableTypeTask
+ TYPE_PROVIDER -> ResolveInstanceFieldsInUnitTask
+ TYPE_PROVIDER -> ResolveLibraryTypeNamesTask
+ TYPE_PROVIDER -> ResolveUnitTask
+ TYPE_PROVIDER -> ResolveUnitTypeNamesTask
+ TYPE_PROVIDER -> ResolveVariableReferencesTask
+ TYPE_PROVIDER -> StrongModeVerifyUnitTask
+ TYPE_PROVIDER -> VerifyUnitTask
+ TYPE_PROVIDER [shape=box]
+ UNITS -> LibraryErrorsReadyTask
+ UNITS [shape=box]
+ USED_IMPORTED_ELEMENTS -> GenerateHintsTask
+ USED_IMPORTED_ELEMENTS [shape=box]
+ USED_LOCAL_ELEMENTS -> GenerateHintsTask
+ USED_LOCAL_ELEMENTS [shape=box]
+ VARIABLE_REFERENCE_ERRORS -> LibraryUnitErrorsTask
+ VARIABLE_REFERENCE_ERRORS [shape=box]
+ VERIFY_ERRORS -> LibraryUnitErrorsTask
+ VERIFY_ERRORS [shape=box]
+ VerifyUnitTask -> VERIFY_ERRORS
+ dartErrorsForSource -> DartErrorsTask
+ dartErrorsForSource [shape=hexagon]
+ dartErrorsForUnit -> DartErrorsTask
+ dartErrorsForUnit [shape=hexagon]
+}
+</script>
+</body>
+</html>
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index 860c029..a320b8d 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -624,6 +624,11 @@
bool get isDeprecated;
/**
+ * Return `true` if this element has an annotation of the form '@JS(..)'.
+ */
+ bool get isJS;
+
+ /**
* Return `true` if this element has an annotation of the form '@override'.
*/
bool get isOverride;
@@ -813,6 +818,12 @@
bool get isDeprecated;
/**
+ * Return `true` if this annotation marks the associated element with the `JS`
+ * annotation.
+ */
+ bool get isJS;
+
+ /**
* Return `true` if this annotation marks the associated member as requiring
* overriding methods to call super.
*/
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index ba28157..63528f1b 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -1620,6 +1620,16 @@
static String _DEPRECATED_VARIABLE_NAME = "deprecated";
/**
+ * The name of the class used to JS annotate an element.
+ */
+ static String _JS_CLASS_NAME = "JS";
+
+ /**
+ * The name of `js` library, used to define JS annotations.
+ */
+ static String _JS_LIB_NAME = "js";
+
+ /**
* The name of `meta` library, used to define analysis annotations.
*/
static String _META_LIB_NAME = "meta";
@@ -1708,6 +1718,11 @@
}
@override
+ bool get isJS => element is ConstructorElement &&
+ element.enclosingElement.name == _JS_CLASS_NAME &&
+ element.library?.name == _JS_LIB_NAME;
+
+ @override
bool get isMustCallSuper =>
element is PropertyAccessorElement &&
element.name == _MUST_CALL_SUPER_VARIABLE_NAME &&
@@ -1923,6 +1938,16 @@
}
@override
+ bool get isJS {
+ for (ElementAnnotation annotation in metadata) {
+ if (annotation.isJS) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ @override
bool get isOverride {
for (ElementAnnotation annotation in metadata) {
if (annotation.isOverride) {
@@ -4105,6 +4130,9 @@
bool get isDeprecated => false;
@override
+ bool get isJS => false;
+
+ @override
bool get isOverride => false;
@override
diff --git a/pkg/analyzer/lib/src/dart/element/handle.dart b/pkg/analyzer/lib/src/dart/element/handle.dart
index 99b87b2..b922a4c 100644
--- a/pkg/analyzer/lib/src/dart/element/handle.dart
+++ b/pkg/analyzer/lib/src/dart/element/handle.dart
@@ -62,6 +62,9 @@
bool get isEnum => actualElement.isEnum;
@override
+ bool get isJS => actualElement.isJS;
+
+ @override
bool get isMixinApplication => actualElement.isMixinApplication;
@override
@@ -353,6 +356,9 @@
bool get isDeprecated => actualElement.isDeprecated;
@override
+ bool get isJS => actualElement.isJS;
+
+ @override
bool get isOverride => actualElement.isOverride;
@override
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index f467ce2..efb778f 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -461,6 +461,9 @@
bool get isDeprecated => _baseElement.isDeprecated;
@override
+ bool get isJS => _baseElement.isJS;
+
+ @override
bool get isOverride => _baseElement.isOverride;
@override
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index 4a78c0d..f3947b4 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -13,6 +13,7 @@
import 'package:analyzer/source/error_processor.dart';
import 'package:analyzer/src/dart/element/type.dart';
import 'package:analyzer/src/dart/scanner/scanner.dart' show ScannerErrorCode;
+import 'package:analyzer/src/generated/engine.dart';
import 'package:analyzer/src/generated/generated/shared_messages.dart'
as shared_messages;
import 'package:analyzer/src/generated/java_core.dart';
@@ -2683,6 +2684,7 @@
HintCode.IMPORT_DEFERRED_LIBRARY_WITH_LOAD_FUNCTION,
HintCode.INVALID_ASSIGNMENT,
HintCode.INVALID_USE_OF_PROTECTED_MEMBER,
+ HintCode.MISSING_JS_LIB_ANNOTATION,
HintCode.MISSING_REQUIRED_PARAM,
HintCode.MISSING_RETURN,
HintCode.NULL_AWARE_IN_CONDITION,
@@ -2706,6 +2708,7 @@
HintCode.UNUSED_CATCH_CLAUSE,
HintCode.UNUSED_CATCH_STACK,
HintCode.UNUSED_LOCAL_VARIABLE,
+ HintCode.UNUSED_SHOWN_NAME,
HintCode.USE_OF_VOID_RESULT,
HintCode.FILE_IMPORT_INSIDE_LIB_REFERENCES_FILE_OUTSIDE,
HintCode.FILE_IMPORT_OUTSIDE_LIB_REFERENCES_FILE_INSIDE,
@@ -3583,6 +3586,14 @@
static const HintCode MISSING_REQUIRED_PARAM = const HintCode(
'MISSING_REQUIRED_PARAM', "The parameter '{0}' is required. {1}");
+ /**
+ * Generate a hint for an element that is annotated with `@JS(...)` whose
+ * library declaration is not similarly annotated.
+ */
+ static const HintCode MISSING_JS_LIB_ANNOTATION = const HintCode(
+ 'MISSING_JS_LIB_ANNOTATION',
+ "The @JS() annotation can only be used if it is also declared on the library directive.");
+
/**
* Generate a hint for methods or functions that have a return type, but do
* not have a non-void return statement on all branches. At the end of methods
@@ -3778,6 +3789,12 @@
"The value of the local variable '{0}' is not used");
/**
+ * Unused shown names are names shown on imports which are never used.
+ */
+ static const HintCode UNUSED_SHOWN_NAME =
+ const HintCode('UNUSED_SHOWN_NAME', "The name {0} is shown, but not used.");
+
+ /**
* Hint for cases where the source expects a method or function to return a
* non-void result, but the method or function signature returns void.
*
@@ -5715,12 +5732,19 @@
"Add a case clause for the missing constant or add a default clause.");
/**
+ * A flag indicating whether this warning is an error when running with strong
+ * mode enabled.
+ */
+ final bool isStrongModeError;
+
+ /**
* Initialize a newly created error code to have the given [name]. The message
* associated with the error will be created from the given [message]
* template. The correction associated with the error will be created from the
* given [correction] template.
*/
- const StaticWarningCode(String name, String message, [String correction])
+ const StaticWarningCode(String name, String message,
+ [String correction, this.isStrongModeError = false])
: super(name, message, correction);
@override
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index aa3651e..ac7214d 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -14,6 +14,7 @@
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/dart/element/visitor.dart';
import 'package:analyzer/src/dart/ast/token.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
import 'package:analyzer/src/dart/element/element.dart';
import 'package:analyzer/src/dart/element/member.dart';
import 'package:analyzer/src/dart/element/type.dart';
@@ -305,6 +306,7 @@
@override
Object visitAnnotation(Annotation node) {
_checkForInvalidAnnotationFromDeferredLibrary(node);
+ _checkForMissingJSLibAnnotation(node);
return super.visitAnnotation(node);
}
@@ -3729,50 +3731,6 @@
[name.name]);
}
- void _checkForMissingRequiredParam(
- DartType type, ArgumentList argumentList, AstNode node) {
- if (type is FunctionType) {
- List<ParameterElement> parameters = type.parameters;
- for (ParameterElement param in parameters) {
- if (param.parameterKind == ParameterKind.NAMED) {
- ElementAnnotationImpl annotation = _getRequiredAnnotation(param);
- if (annotation != null) {
- String paramName = param.name;
- if (!_containsNamedExpression(argumentList, paramName)) {
- DartObject constantValue = annotation.constantValue;
- String reason =
- constantValue.getField('reason')?.toStringValue() ?? '';
- // Append a `.` if needed.
- if (reason != null &&
- reason.isNotEmpty &&
- !reason.endsWith('.')) {
- reason += '.';
- }
-
- _errorReporter.reportErrorForNode(
- HintCode.MISSING_REQUIRED_PARAM, node, [paramName, reason]);
- }
- }
- }
- }
- }
- }
-
- ElementAnnotationImpl _getRequiredAnnotation(ParameterElement param) => param
- .metadata
- .firstWhere((ElementAnnotation e) => e.isRequired, orElse: () => null);
-
- bool _containsNamedExpression(ArgumentList args, String name) {
- for (Expression expression in args.arguments) {
- if (expression is NamedExpression) {
- if (expression.name.label.name == name) {
- return true;
- }
- }
- }
- return false;
- }
-
/**
* Check whether the given [executableElement] collides with the name of a
* static method in one of its superclasses, and reports the appropriate
@@ -4249,6 +4207,38 @@
}
}
+ void _checkForMissingJSLibAnnotation(Annotation node) {
+ if (node.elementAnnotation?.isJS ?? false) {
+ Element element = ElementLocator.locate(node.parent);
+ if (element?.library?.isJS != true) {
+ _errorReporter.reportErrorForNode(
+ HintCode.MISSING_JS_LIB_ANNOTATION, node, [element.name]);
+ }
+ }
+ }
+
+ void _checkForMissingRequiredParam(
+ DartType type, ArgumentList argumentList, AstNode node) {
+ if (type is FunctionType) {
+ List<ParameterElement> parameters = type.parameters;
+ for (ParameterElement param in parameters) {
+ if (param.parameterKind == ParameterKind.NAMED) {
+ ElementAnnotationImpl annotation = _getRequiredAnnotation(param);
+ if (annotation != null) {
+ String paramName = param.name;
+ if (!_containsNamedExpression(argumentList, paramName)) {
+ DartObject constantValue = annotation.constantValue;
+ String reason =
+ constantValue.getField('reason')?.toStringValue() ?? '';
+ _errorReporter.reportErrorForNode(
+ HintCode.MISSING_REQUIRED_PARAM, node, [paramName, reason]);
+ }
+ }
+ }
+ }
+ }
+ }
+
/**
* Verify that the given function [body] does not contain return statements
* that both have and do not have return values.
@@ -5662,6 +5652,17 @@
return staticReturnType;
}
+ bool _containsNamedExpression(ArgumentList args, String name) {
+ for (Expression expression in args.arguments) {
+ if (expression is NamedExpression) {
+ if (expression.name.label.name == name) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
MethodElement _findOverriddenMemberThatMustCallSuper(MethodDeclaration node) {
ExecutableElement overriddenMember = _getOverriddenMember(node.element);
List<ExecutableElement> seen = <ExecutableElement>[];
@@ -5742,6 +5743,10 @@
return _inheritanceManager.lookupInheritance(classElement, member.name);
}
+ ElementAnnotationImpl _getRequiredAnnotation(ParameterElement param) => param
+ .metadata
+ .firstWhere((ElementAnnotation e) => e.isRequired, orElse: () => null);
+
/**
* Return the type of the first and only parameter of the given [setter].
*/
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
index 78b0355..67885d1 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolution_validator.dart
@@ -856,6 +856,8 @@
if (a is LocalElement && b is LocalElement) {
_verifyEqual('visibleRange', a.visibleRange, b.visibleRange);
}
+ _verifyEqual(
+ 'documentationComment', a.documentationComment, b.documentationComment);
}
void _verifyEqual(String name, actual, expected) {
diff --git a/pkg/analyzer/lib/src/generated/incremental_resolver.dart b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
index 3d3d7d8..9ed4477 100644
--- a/pkg/analyzer/lib/src/generated/incremental_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/incremental_resolver.dart
@@ -1677,6 +1677,23 @@
_updateEntry();
// resolve references in the comment
incrementalResolver._resolveReferences(newComment);
+ // update 'documentationComment' of the parent element(s)
+ {
+ AstNode parent = newComment.parent;
+ if (parent is AnnotatedNode) {
+ Element parentElement = ElementLocator.locate(newComment.parent);
+ if (parentElement is ElementImpl) {
+ setElementDocumentationComment(parentElement, parent);
+ } else if (parentElement == null && parent is FieldDeclaration) {
+ for (VariableDeclaration field in parent.fields.variables) {
+ if (field.element is ElementImpl) {
+ setElementDocumentationComment(
+ field.element as ElementImpl, parent);
+ }
+ }
+ }
+ }
+ }
// OK
return true;
}
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index 28cc6f4..32afd15 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -3386,7 +3386,7 @@
*/
Identifier parsePrefixedIdentifier() {
SimpleIdentifier qualifier = parseSimpleIdentifier();
- if (!_matches(TokenType.PERIOD)) {
+ if (!_matches(TokenType.PERIOD) || _injectGenericCommentTypeList()) {
return qualifier;
}
Token period = getAndAdvance();
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 0a3fdb8..3f1c0ed 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -4104,24 +4104,8 @@
}
@override
- void visitPrefixedIdentifier(PrefixedIdentifier node) {
- // If the prefixed identifier references some A.B, where A is a library
- // prefix, then we can lookup the associated ImportDirective in
- // prefixElementMap and remove it from the unusedImports list.
- SimpleIdentifier prefixIdentifier = node.prefix;
- Element element = prefixIdentifier.staticElement;
- if (element is PrefixElement) {
- usedElements.prefixes.add(element);
- return;
- }
- // Otherwise, pass the prefixed identifier element and name onto
- // visitIdentifier.
- _visitIdentifier(element, prefixIdentifier.name);
- }
-
- @override
void visitSimpleIdentifier(SimpleIdentifier node) {
- _visitIdentifier(node.staticElement, node.name);
+ _visitIdentifier(node, node.staticElement);
}
/**
@@ -4132,7 +4116,7 @@
directive.metadata.accept(this);
}
- void _visitIdentifier(Element element, String name) {
+ void _visitIdentifier(SimpleIdentifier identifier, Element element) {
if (element == null) {
return;
}
@@ -4141,11 +4125,18 @@
if (element is MultiplyDefinedElement) {
MultiplyDefinedElement multiplyDefinedElement = element;
for (Element elt in multiplyDefinedElement.conflictingElements) {
- _visitIdentifier(elt, name);
+ _visitIdentifier(identifier, elt);
}
return;
- } else if (element is PrefixElement) {
- usedElements.prefixes.add(element);
+ }
+
+ // Record `importPrefix.identifier` into 'prefixMap'.
+ if (_recordPrefixMap(identifier, element)) {
+ return;
+ }
+
+ if (element is PrefixElement) {
+ usedElements.prefixMap.putIfAbsent(element, () => <Element>[]);
return;
} else if (element.enclosingElement is! CompilationUnitElement) {
// Identifiers that aren't a prefix element and whose enclosing element
@@ -4166,6 +4157,30 @@
// Remember the element.
usedElements.elements.add(element);
}
+
+ /**
+ * If the given [identifier] is prefixed with a [PrefixElement], fill the
+ * corresponding `UsedImportedElements.prefixMap` entry and return `true`.
+ */
+ bool _recordPrefixMap(SimpleIdentifier identifier, Element element) {
+ bool recordIfTargetIsPrefixElement(Expression target) {
+ if (target is SimpleIdentifier && target.staticElement is PrefixElement) {
+ List<Element> prefixedElements = usedElements.prefixMap
+ .putIfAbsent(target.staticElement, () => <Element>[]);
+ prefixedElements.add(element);
+ return true;
+ }
+ return false;
+ }
+ AstNode parent = identifier.parent;
+ if (parent is MethodInvocation && parent.methodName == identifier) {
+ return recordIfTargetIsPrefixElement(parent.target);
+ }
+ if (parent is PrefixedIdentifier && parent.identifier == identifier) {
+ return recordIfTargetIsPrefixElement(parent.prefix);
+ }
+ return false;
+ }
}
/**
@@ -4375,6 +4390,7 @@
.removeUsedElements(_usedImportedElementsVisitor.usedElements);
importsVerifier.generateDuplicateImportHints(definingUnitErrorReporter);
importsVerifier.generateUnusedImportHints(definingUnitErrorReporter);
+ importsVerifier.generateUnusedShownNameHints(definingUnitErrorReporter);
}
_library.accept(new UnusedLocalElementsVerifier(
_errorListener, _usedLocalElementsVisitor.usedElements));
@@ -4457,20 +4473,23 @@
}
/**
- * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the
- * source code verifying that all of the imports are used, otherwise a
- * [HintCode.UNUSED_IMPORT] is generated with
- * [generateUnusedImportHints].
+ * Instances of the class `ImportsVerifier` visit all of the referenced libraries in the source code
+ * verifying that all of the imports are used, otherwise a [HintCode.UNUSED_IMPORT] hint is
+ * generated with [generateUnusedImportHints].
+ *
+ * Additionally, [generateDuplicateImportHints] generates [HintCode.DUPLICATE_IMPORT] hints and
+ * [HintCode.UNUSED_SHOWN_NAME] hints.
*
* While this class does not yet have support for an "Organize Imports" action, this logic built up
* in this class could be used for such an action in the future.
*/
class ImportsVerifier {
/**
- * A list of [ImportDirective]s that the current library imports, as identifiers are visited
- * by this visitor and an import has been identified as being used by the library, the
- * [ImportDirective] is removed from this list. After all the sources in the library have
- * been evaluated, this list represents the set of unused imports.
+ * A list of [ImportDirective]s that the current library imports, but does not use.
+ *
+ * As identifiers are visited by this visitor and an import has been identified as being used
+ * by the library, the [ImportDirective] is removed from this list. After all the sources in the
+ * library have been evaluated, this list represents the set of unused imports.
*
* See [ImportsVerifier.generateUnusedImportErrors].
*/
@@ -4483,15 +4502,14 @@
final List<ImportDirective> _duplicateImports = <ImportDirective>[];
/**
- * This is a map between the set of [LibraryElement]s that the current library imports, and
- * a list of [ImportDirective]s that imports the library. In cases where the current library
- * imports a library with a single directive (such as `import lib1.dart;`), the library
+ * This is a map between the set of [LibraryElement]s that the current library imports, and the
+ * list of [ImportDirective]s that import each [LibraryElement]. In cases where the current
+ * library imports a library with a single directive (such as `import lib1.dart;`), the library
* element will map to a list of one [ImportDirective], which will then be removed from the
* [unusedImports] list. In cases where the current library imports a library with multiple
- * directives (such as `import lib1.dart; import lib1.dart show C;`), the
- * [LibraryElement] will be mapped to a list of the import directives, and the namespace
- * will need to be used to compute the correct [ImportDirective] being used, see
- * [namespaceMap].
+ * directives (such as `import lib1.dart; import lib1.dart show C;`), the [LibraryElement] will
+ * be mapped to a list of the import directives, and the namespace will need to be used to
+ * compute the correct [ImportDirective] being used; see [_namespaceMap].
*/
final HashMap<LibraryElement, List<ImportDirective>> _libraryMap =
new HashMap<LibraryElement, List<ImportDirective>>();
@@ -4518,44 +4536,62 @@
final HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap =
new HashMap<PrefixElement, List<ImportDirective>>();
+ /**
+ * A map of identifiers that the current library's imports show, but that the library does not
+ * use.
+ *
+ * Each import directive maps to a list of the identifiers that are imported via the "show"
+ * keyword.
+ *
+ * As each identifier is visited by this visitor, it is identified as being used by the library,
+ * and the identifier is removed from this map (under the import that imported it). After all the
+ * sources in the library have been evaluated, each list in this map's values present the set of
+ * unused shown elements.
+ *
+ * See [ImportsVerifier.generateUnusedShownNameHints].
+ */
+ final HashMap<ImportDirective, List<SimpleIdentifier>> _unusedShownNamesMap =
+ new HashMap<ImportDirective, List<SimpleIdentifier>>();
+
void addImports(CompilationUnit node) {
for (Directive directive in node.directives) {
if (directive is ImportDirective) {
ImportDirective importDirective = directive;
LibraryElement libraryElement = importDirective.uriElement;
- if (libraryElement != null) {
- _unusedImports.add(importDirective);
- //
- // Initialize prefixElementMap
- //
- if (importDirective.asKeyword != null) {
- SimpleIdentifier prefixIdentifier = importDirective.prefix;
- if (prefixIdentifier != null) {
- Element element = prefixIdentifier.staticElement;
- if (element is PrefixElement) {
- PrefixElement prefixElementKey = element;
- List<ImportDirective> list =
- _prefixElementMap[prefixElementKey];
- if (list == null) {
- list = new List<ImportDirective>();
- _prefixElementMap[prefixElementKey] = list;
- }
- list.add(importDirective);
- }
- // TODO (jwren) Can the element ever not be a PrefixElement?
- }
- }
- //
- // Initialize libraryMap: libraryElement -> importDirective
- //
- _putIntoLibraryMap(libraryElement, importDirective);
- //
- // For this new addition to the libraryMap, also recursively add any
- // exports from the libraryElement.
- //
- _addAdditionalLibrariesForExports(
- libraryElement, importDirective, new List<LibraryElement>());
+ if (libraryElement == null) {
+ continue;
}
+ _unusedImports.add(importDirective);
+ //
+ // Initialize prefixElementMap
+ //
+ if (importDirective.asKeyword != null) {
+ SimpleIdentifier prefixIdentifier = importDirective.prefix;
+ if (prefixIdentifier != null) {
+ Element element = prefixIdentifier.staticElement;
+ if (element is PrefixElement) {
+ PrefixElement prefixElementKey = element;
+ List<ImportDirective> list = _prefixElementMap[prefixElementKey];
+ if (list == null) {
+ list = new List<ImportDirective>();
+ _prefixElementMap[prefixElementKey] = list;
+ }
+ list.add(importDirective);
+ }
+ // TODO (jwren) Can the element ever not be a PrefixElement?
+ }
+ }
+ //
+ // Initialize libraryMap: libraryElement -> importDirective
+ //
+ _putIntoLibraryMap(libraryElement, importDirective);
+ //
+ // For this new addition to the libraryMap, also recursively add any
+ // exports from the libraryElement.
+ //
+ _addAdditionalLibrariesForExports(
+ libraryElement, importDirective, new List<LibraryElement>());
+ _addShownNames(importDirective);
}
}
if (_unusedImports.length > 1) {
@@ -4598,12 +4634,12 @@
}
/**
- * After all of the compilation units have been visited by this visitor, this method can be called
- * to report an [HintCode.UNUSED_IMPORT] hint for each of the import directives in the
- * [unusedImports] list.
+ * Report an [HintCode.UNUSED_IMPORT] hint for each unused import.
*
- * @param errorReporter the error reporter to report the set of [HintCode.UNUSED_IMPORT]
- * hints to
+ * Only call this method after all of the compilation units have been visited by this visitor.
+ *
+ * @param errorReporter the error reporter used to report the set of [HintCode.UNUSED_IMPORT]
+ * hints
*/
void generateUnusedImportHints(ErrorReporter errorReporter) {
for (ImportDirective unusedImport in _unusedImports) {
@@ -4621,32 +4657,60 @@
}
/**
+ * Report an [HintCode.UNUSED_SHOWN_NAME] hint for each unused shown name.
+ *
+ * Only call this method after all of the compilation units have been visited by this visitor.
+ *
+ * @param errorReporter the error reporter used to report the set of [HintCode.UNUSED_SHOWN_NAME]
+ * hints
+ */
+ void generateUnusedShownNameHints(ErrorReporter reporter) {
+ _unusedShownNamesMap.forEach(
+ (ImportDirective importDirective, List<SimpleIdentifier> identifiers) {
+ if (_unusedImports.contains(importDirective)) {
+ // This import is actually wholly unused, not just one or more shown names from it.
+ // This is then an "unused import", rather than unused shown names.
+ return;
+ }
+ for (Identifier identifier in identifiers) {
+ reporter.reportErrorForNode(
+ HintCode.UNUSED_SHOWN_NAME, identifier, [identifier.name]);
+ }
+ });
+ }
+
+ /**
* Remove elements from [_unusedImports] using the given [usedElements].
*/
void removeUsedElements(UsedImportedElements usedElements) {
- // Stop if all the imports are known to be used.
- if (_unusedImports.isEmpty) {
+ // Stop if all the imports and shown names are known to be used.
+ if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
return;
}
// Process import prefixes.
- for (PrefixElement prefix in usedElements.prefixes) {
+ usedElements.prefixMap
+ .forEach((PrefixElement prefix, List<Element> elements) {
List<ImportDirective> importDirectives = _prefixElementMap[prefix];
if (importDirectives != null) {
for (ImportDirective importDirective in importDirectives) {
_unusedImports.remove(importDirective);
+ for (Element element in elements) {
+ _removeFromUnusedShownNamesMap(element, importDirective);
+ }
}
}
- }
+ });
// Process top-level elements.
for (Element element in usedElements.elements) {
- // Stop if all the imports are known to be used.
- if (_unusedImports.isEmpty) {
+ // Stop if all the imports and shown names are known to be used.
+ if (_unusedImports.isEmpty && _unusedShownNamesMap.isEmpty) {
return;
}
- // Prepare import directives for this library.
+ // Prepare import directives for this element's library.
LibraryElement library = element.library;
List<ImportDirective> importsLibrary = _libraryMap[library];
if (importsLibrary == null) {
+ // element's library is not imported. Must be the current library.
continue;
}
// If there is only one import directive for this library, then it must be
@@ -4655,6 +4719,7 @@
if (importsLibrary.length == 1) {
ImportDirective usedImportDirective = importsLibrary[0];
_unusedImports.remove(usedImportDirective);
+ _removeFromUnusedShownNamesMap(element, usedImportDirective);
continue;
}
// Otherwise, find import directives using namespaces.
@@ -4663,6 +4728,7 @@
Namespace namespace = _computeNamespace(importDirective);
if (namespace != null && namespace.get(name) != null) {
_unusedImports.remove(importDirective);
+ _removeFromUnusedShownNamesMap(element, importDirective);
}
}
}
@@ -4685,9 +4751,28 @@
}
/**
- * Lookup and return the [Namespace] from the [namespaceMap], if the map does not
- * have the computed namespace, compute it and cache it in the map. If the import directive is not
- * resolved or is not resolvable, `null` is returned.
+ * Add every shown name from [importDirective] into [_unusedShownNamesMap].
+ */
+ void _addShownNames(ImportDirective importDirective) {
+ if (importDirective.combinators == null) {
+ return;
+ }
+ List<SimpleIdentifier> identifiers = new List<SimpleIdentifier>();
+ _unusedShownNamesMap[importDirective] = identifiers;
+ for (Combinator combinator in importDirective.combinators) {
+ if (combinator is ShowCombinator) {
+ for (SimpleIdentifier name in combinator.shownNames) {
+ identifiers.add(name);
+ }
+ }
+ }
+ }
+
+ /**
+ * Lookup and return the [Namespace] from the [_namespaceMap].
+ *
+ * If the map does not have the computed namespace, compute it and cache it in the map. If
+ * [importDirective] is not resolved or is not resolvable, `null` is returned.
*
* @param importDirective the import directive used to compute the returned namespace
* @return the computed or looked up [Namespace]
@@ -4722,6 +4807,35 @@
}
importList.add(importDirective);
}
+
+ /**
+ * Remove [element] from the list of names shown by [importDirective].
+ */
+ void _removeFromUnusedShownNamesMap(
+ Element element, ImportDirective importDirective) {
+ List<SimpleIdentifier> identifiers = _unusedShownNamesMap[importDirective];
+ if (identifiers == null) {
+ return;
+ }
+ for (Identifier identifier in identifiers) {
+ if (element is PropertyAccessorElement) {
+ // If the getter or setter of a variable is used, then the variable (the
+ // shown name) is used.
+ if (identifier.staticElement == element.variable) {
+ identifiers.remove(identifier);
+ break;
+ }
+ } else {
+ if (identifier.staticElement == element) {
+ identifiers.remove(identifier);
+ break;
+ }
+ }
+ }
+ if (identifiers.isEmpty) {
+ _unusedShownNamesMap.remove(importDirective);
+ }
+ }
}
/**
@@ -12566,9 +12680,10 @@
*/
class UsedImportedElements {
/**
- * The set of referenced [PrefixElement]s.
+ * The map of referenced [PrefixElement]s and the [Element]s that they prefix.
*/
- final Set<PrefixElement> prefixes = new HashSet<PrefixElement>();
+ final Map<PrefixElement, List<Element>> prefixMap =
+ new HashMap<PrefixElement, List<Element>>();
/**
* The set of referenced top-level [Element]s.
diff --git a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
index 12c9aac..f76cf73 100644
--- a/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
+++ b/pkg/analyzer/lib/src/generated/static_type_analyzer.dart
@@ -257,6 +257,8 @@
} else {
ExecutableElement staticMethodElement = node.staticElement;
DartType staticType = _computeStaticReturnType(staticMethodElement);
+ staticType =
+ _refineAssignmentExpressionType(node, staticType, _getStaticType);
_recordStaticType(node, staticType);
MethodElement propagatedMethodElement = node.propagatedElement;
if (!identical(propagatedMethodElement, staticMethodElement)) {
@@ -2095,6 +2097,44 @@
}
/**
+ * Attempts to make a better guess for the type of the given assignment
+ * [expression], given that resolution has so far produced the [currentType].
+ * The [typeAccessor] is used to access the corresponding type of the left
+ * and right operands.
+ */
+ DartType _refineAssignmentExpressionType(AssignmentExpression expression,
+ DartType currentType, DartType typeAccessor(Expression node)) {
+ Expression leftHandSize = expression.leftHandSide;
+ Expression rightHandSide = expression.rightHandSide;
+ TokenType operator = expression.operator.type;
+ DartType intType = _typeProvider.intType;
+ if (typeAccessor(leftHandSize) == intType) {
+ // int op= double
+ if (operator == TokenType.MINUS_EQ ||
+ operator == TokenType.PERCENT_EQ ||
+ operator == TokenType.PLUS_EQ ||
+ operator == TokenType.STAR_EQ) {
+ DartType doubleType = _typeProvider.doubleType;
+ if (typeAccessor(rightHandSide) == doubleType) {
+ return doubleType;
+ }
+ }
+ // int op= int
+ if (operator == TokenType.MINUS_EQ ||
+ operator == TokenType.PERCENT_EQ ||
+ operator == TokenType.PLUS_EQ ||
+ operator == TokenType.STAR_EQ ||
+ operator == TokenType.TILDE_SLASH_EQ) {
+ if (typeAccessor(rightHandSide) == intType) {
+ return intType;
+ }
+ }
+ }
+ // default
+ return currentType;
+ }
+
+ /**
* Attempts to make a better guess for the type of the given binary
* [expression], given that resolution has so far produced the [currentType].
* The [typeAccessor] is used to access the corresponding type of the left
diff --git a/pkg/analyzer/lib/src/summary/format.dart b/pkg/analyzer/lib/src/summary/format.dart
index 5cb69d9..bd866c7 100644
--- a/pkg/analyzer/lib/src/summary/format.dart
+++ b/pkg/analyzer/lib/src/summary/format.dart
@@ -987,6 +987,7 @@
bool _finished = false;
List<LinkedDependencyBuilder> _dependencies;
+ List<int> _exportDependencies;
List<LinkedExportNameBuilder> _exportNames;
bool _fallbackMode;
List<int> _importDependencies;
@@ -1018,6 +1019,19 @@
}
@override
+ List<int> get exportDependencies => _exportDependencies ??= <int>[];
+
+ /**
+ * For each export in [UnlinkedUnit.exports], an index into [dependencies]
+ * of the library being exported.
+ */
+ void set exportDependencies(List<int> _value) {
+ assert(!_finished);
+ assert(_value == null || _value.every((e) => e >= 0));
+ _exportDependencies = _value;
+ }
+
+ @override
List<LinkedExportNameBuilder> get exportNames => _exportNames ??= <LinkedExportNameBuilder>[];
/**
@@ -1085,8 +1099,9 @@
_units = _value;
}
- LinkedLibraryBuilder({List<LinkedDependencyBuilder> dependencies, List<LinkedExportNameBuilder> exportNames, bool fallbackMode, List<int> importDependencies, int numPrelinkedDependencies, List<LinkedUnitBuilder> units})
+ LinkedLibraryBuilder({List<LinkedDependencyBuilder> dependencies, List<int> exportDependencies, List<LinkedExportNameBuilder> exportNames, bool fallbackMode, List<int> importDependencies, int numPrelinkedDependencies, List<LinkedUnitBuilder> units})
: _dependencies = dependencies,
+ _exportDependencies = exportDependencies,
_exportNames = exportNames,
_fallbackMode = fallbackMode,
_importDependencies = importDependencies,
@@ -1111,12 +1126,16 @@
assert(!_finished);
_finished = true;
fb.Offset offset_dependencies;
+ fb.Offset offset_exportDependencies;
fb.Offset offset_exportNames;
fb.Offset offset_importDependencies;
fb.Offset offset_units;
if (!(_dependencies == null || _dependencies.isEmpty)) {
offset_dependencies = fbBuilder.writeList(_dependencies.map((b) => b.finish(fbBuilder)).toList());
}
+ if (!(_exportDependencies == null || _exportDependencies.isEmpty)) {
+ offset_exportDependencies = fbBuilder.writeListUint32(_exportDependencies);
+ }
if (!(_exportNames == null || _exportNames.isEmpty)) {
offset_exportNames = fbBuilder.writeList(_exportNames.map((b) => b.finish(fbBuilder)).toList());
}
@@ -1130,6 +1149,9 @@
if (offset_dependencies != null) {
fbBuilder.addOffset(0, offset_dependencies);
}
+ if (offset_exportDependencies != null) {
+ fbBuilder.addOffset(6, offset_exportDependencies);
+ }
if (offset_exportNames != null) {
fbBuilder.addOffset(4, offset_exportNames);
}
@@ -1167,6 +1189,7 @@
_LinkedLibraryImpl(this._bp);
List<idl.LinkedDependency> _dependencies;
+ List<int> _exportDependencies;
List<idl.LinkedExportName> _exportNames;
bool _fallbackMode;
List<int> _importDependencies;
@@ -1180,6 +1203,12 @@
}
@override
+ List<int> get exportDependencies {
+ _exportDependencies ??= const fb.Uint32ListReader().vTableGet(_bp, 6, const <int>[]);
+ return _exportDependencies;
+ }
+
+ @override
List<idl.LinkedExportName> get exportNames {
_exportNames ??= const fb.ListReader<idl.LinkedExportName>(const _LinkedExportNameReader()).vTableGet(_bp, 4, const <idl.LinkedExportName>[]);
return _exportNames;
@@ -1215,6 +1244,7 @@
Map<String, Object> toJson() {
Map<String, Object> _result = <String, Object>{};
if (dependencies.isNotEmpty) _result["dependencies"] = dependencies.map((_value) => _value.toJson()).toList();
+ if (exportDependencies.isNotEmpty) _result["exportDependencies"] = exportDependencies;
if (exportNames.isNotEmpty) _result["exportNames"] = exportNames.map((_value) => _value.toJson()).toList();
if (fallbackMode != false) _result["fallbackMode"] = fallbackMode;
if (importDependencies.isNotEmpty) _result["importDependencies"] = importDependencies;
@@ -1226,6 +1256,7 @@
@override
Map<String, Object> toMap() => {
"dependencies": dependencies,
+ "exportDependencies": exportDependencies,
"exportNames": exportNames,
"fallbackMode": fallbackMode,
"importDependencies": importDependencies,
@@ -4571,9 +4602,9 @@
_codeRange = null;
_constantInitializers?.forEach((b) => b.flushInformative());
_documentationComment = null;
- _localFunctions?.forEach((b) => b.flushInformative());
- _localLabels?.forEach((b) => b.flushInformative());
- _localVariables?.forEach((b) => b.flushInformative());
+ _localFunctions = null;
+ _localLabels = null;
+ _localVariables = null;
_nameEnd = null;
_nameOffset = null;
_parameters?.forEach((b) => b.flushInformative());
@@ -8082,7 +8113,7 @@
_codeRange = null;
_constExpr?.flushInformative();
_documentationComment = null;
- _initializer?.flushInformative();
+ _initializer = null;
_nameOffset = null;
_type?.flushInformative();
}
diff --git a/pkg/analyzer/lib/src/summary/format.fbs b/pkg/analyzer/lib/src/summary/format.fbs
index 2a41e6c..e7e548c 100644
--- a/pkg/analyzer/lib/src/summary/format.fbs
+++ b/pkg/analyzer/lib/src/summary/format.fbs
@@ -600,7 +600,7 @@
typeCast,
/**
- * Pop the top value from the stack and check whether is is a subclass of the
+ * Pop the top value from the stack and check whether it is a subclass of the
* type with reference from [UnlinkedConst.references], push the result into
* the stack.
*/
@@ -978,6 +978,12 @@
dependencies:[LinkedDependency] (id: 0);
/**
+ * For each export in [UnlinkedUnit.exports], an index into [dependencies]
+ * of the library being exported.
+ */
+ exportDependencies:[uint] (id: 6);
+
+ /**
* Information about entities in the export namespace of the library that are
* not in the public namespace of the library (that is, entities that are
* brought into the namespace via `export` directives).
diff --git a/pkg/analyzer/lib/src/summary/idl.dart b/pkg/analyzer/lib/src/summary/idl.dart
index 8f86380..ebbe533 100644
--- a/pkg/analyzer/lib/src/summary/idl.dart
+++ b/pkg/analyzer/lib/src/summary/idl.dart
@@ -49,6 +49,9 @@
* Annotation describing information which is not part of Dart semantics; in
* other words, if this information (or any information it refers to) changes,
* static analysis and runtime behavior of the library are unaffected.
+ *
+ * Information that has purely local effect (in other words, it does not affect
+ * the API of the code being analyzed) is also marked as `informative`.
*/
const informative = null;
@@ -427,6 +430,13 @@
List<LinkedDependency> get dependencies;
/**
+ * For each export in [UnlinkedUnit.exports], an index into [dependencies]
+ * of the library being exported.
+ */
+ @Id(6)
+ List<int> get exportDependencies;
+
+ /**
* Information about entities in the export namespace of the library that are
* not in the public namespace of the library (that is, entities that are
* brought into the namespace via `export` directives).
@@ -1428,7 +1438,7 @@
typeCast,
/**
- * Pop the top value from the stack and check whether is is a subclass of the
+ * Pop the top value from the stack and check whether it is a subclass of the
* type with reference from [UnlinkedConst.references], push the result into
* the stack.
*/
@@ -1697,18 +1707,21 @@
/**
* The list of local functions.
*/
+ @informative
@Id(18)
List<UnlinkedExecutable> get localFunctions;
/**
* The list of local labels.
*/
+ @informative
@Id(22)
List<UnlinkedLabel> get localLabels;
/**
* The list of local variables.
*/
+ @informative
@Id(19)
List<UnlinkedVariable> get localVariables;
@@ -2605,6 +2618,7 @@
* The synthetic initializer function of the variable. Absent if the variable
* does not have an initializer.
*/
+ @informative
@Id(13)
UnlinkedExecutable get initializer;
diff --git a/pkg/analyzer/lib/src/summary/link.dart b/pkg/analyzer/lib/src/summary/link.dart
index 0f642ef..8d7d33e 100644
--- a/pkg/analyzer/lib/src/summary/link.dart
+++ b/pkg/analyzer/lib/src/summary/link.dart
@@ -57,8 +57,8 @@
* - Where possible, we favor method dispatch instead of "is" and "as"
* checks. E.g. see [ReferenceableElementForLink.asConstructor].
*/
-
import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/token.dart' show TokenType;
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/dart/element/type.dart';
import 'package:analyzer/src/dart/constant/value.dart';
@@ -71,6 +71,18 @@
import 'package:analyzer/src/summary/prelink.dart';
import 'package:analyzer/src/task/strong_mode.dart';
+bool isIncrementOrDecrement(UnlinkedExprAssignOperator operator) {
+ switch (operator) {
+ case UnlinkedExprAssignOperator.prefixDecrement:
+ case UnlinkedExprAssignOperator.prefixIncrement:
+ case UnlinkedExprAssignOperator.postfixDecrement:
+ case UnlinkedExprAssignOperator.postfixIncrement:
+ return true;
+ default:
+ return false;
+ }
+}
+
/**
* Link together the build unit consisting of [libraryUris], using
* [getDependency] to fetch the [LinkedLibrary] objects from other
@@ -89,16 +101,7 @@
Map<String, LinkedLibraryBuilder> link(Set<String> libraryUris,
GetDependencyCallback getDependency, GetUnitCallback getUnit, bool strong) {
Map<String, LinkedLibraryBuilder> linkedLibraries =
- <String, LinkedLibraryBuilder>{};
- for (String absoluteUri in libraryUris) {
- Uri uri = Uri.parse(absoluteUri);
- UnlinkedUnit getRelativeUnit(String relativeUri) =>
- getUnit(resolveRelativeUri(uri, Uri.parse(relativeUri)).toString());
- linkedLibraries[absoluteUri] = prelink(
- getUnit(absoluteUri),
- getRelativeUnit,
- (String relativeUri) => getRelativeUnit(relativeUri)?.publicNamespace);
- }
+ setupForLink(libraryUris, getUnit);
relink(linkedLibraries, getDependency, getUnit, strong);
return linkedLibraries;
}
@@ -118,7 +121,32 @@
*/
void relink(Map<String, LinkedLibraryBuilder> libraries,
GetDependencyCallback getDependency, GetUnitCallback getUnit, bool strong) {
- new _Linker(libraries, getDependency, getUnit, strong).link();
+ new Linker(libraries, getDependency, getUnit, strong).link();
+}
+
+/**
+ * Prepare to link together the build unit consisting of [libraryUris], using
+ * [getUnit] to fetch the [UnlinkedUnit] objects from both this build unit and
+ * other build units.
+ *
+ * The libraries are prelinked, and a map is returned whose keys are the URIs of
+ * the libraries in this build unit, and whose values are the corresponding
+ * [LinkedLibraryBuilder]s.
+ */
+Map<String, LinkedLibraryBuilder> setupForLink(
+ Set<String> libraryUris, GetUnitCallback getUnit) {
+ Map<String, LinkedLibraryBuilder> linkedLibraries =
+ <String, LinkedLibraryBuilder>{};
+ for (String absoluteUri in libraryUris) {
+ Uri uri = Uri.parse(absoluteUri);
+ UnlinkedUnit getRelativeUnit(String relativeUri) =>
+ getUnit(resolveRelativeUri(uri, Uri.parse(relativeUri)).toString());
+ linkedLibraries[absoluteUri] = prelink(
+ getUnit(absoluteUri),
+ getRelativeUnit,
+ (String relativeUri) => getRelativeUnit(relativeUri)?.publicNamespace);
+ }
+ return linkedLibraries;
}
/**
@@ -143,6 +171,9 @@
.toList();
}
return result;
+ } else if (type is DynamicTypeImpl) {
+ result.reference = compilationUnit.addRawReference('dynamic');
+ return result;
} else if (type is VoidTypeImpl) {
result.reference = compilationUnit.addRawReference('void');
return result;
@@ -168,6 +199,16 @@
}
return result;
}
+ if (element is MethodElementForLink) {
+ result.reference = compilationUnit.addReference(element);
+ if (type.typeArguments.isNotEmpty) {
+ result.typeArguments = type.typeArguments
+ .map((DartType t) =>
+ _createLinkedType(t, compilationUnit, typeParameterContext))
+ .toList();
+ }
+ return result;
+ }
// TODO(paulberry): implement other cases.
throw new UnimplementedError('${element.runtimeType}');
}
@@ -294,16 +335,16 @@
List<MethodElementForLink> _methods;
List<InterfaceType> _mixins;
List<InterfaceType> _interfaces;
- List<PropertyAccessorElementForLink> _accessors;
+ List<PropertyAccessorElement> _accessors;
ClassElementForLink_Class(
CompilationUnitElementForLink enclosingElement, this._unlinkedClass)
: super(enclosingElement);
@override
- List<PropertyAccessorElementForLink> get accessors {
+ List<PropertyAccessorElement> get accessors {
if (_accessors == null) {
- _accessors = <PropertyAccessorElementForLink>[];
+ _accessors = <PropertyAccessorElement>[];
Map<String, SyntheticVariableElementForLink> syntheticVariables =
<String, SyntheticVariableElementForLink>{};
for (UnlinkedExecutable unlinkedExecutable
@@ -317,8 +358,8 @@
}
SyntheticVariableElementForLink syntheticVariable = syntheticVariables
.putIfAbsent(name, () => new SyntheticVariableElementForLink());
- PropertyAccessorElementForLink accessor =
- new PropertyAccessorElementForLink(
+ PropertyAccessorElementForLink_Executable accessor =
+ new PropertyAccessorElementForLink_Executable(
this, unlinkedExecutable, syntheticVariable);
_accessors.add(accessor);
if (unlinkedExecutable.kind == UnlinkedExecutableKind.getter) {
@@ -328,6 +369,14 @@
}
}
}
+ for (FieldElementForLink_ClassField field in fields) {
+ _accessors
+ .add(new PropertyAccessorElementForLink_Variable(field, false));
+ if (!field.isConst && !field.isFinal) {
+ _accessors
+ .add(new PropertyAccessorElementForLink_Variable(field, true));
+ }
+ }
}
return _accessors;
}
@@ -343,6 +392,11 @@
.add(new ConstructorElementForLink(this, unlinkedExecutable));
}
}
+ if (_constructors.isEmpty) {
+ _unnamedConstructorComputed = true;
+ _unnamedConstructor = new ConstructorElementForLink_Synthetic(this);
+ _constructors.add(_unnamedConstructor);
+ }
}
return _constructors;
}
@@ -443,11 +497,31 @@
}
@override
+ PropertyAccessorElement getGetter(String getterName) {
+ for (PropertyAccessorElement accessor in accessors) {
+ if (accessor.isGetter && accessor.name == getterName) {
+ return accessor;
+ }
+ }
+ return null;
+ }
+
+ @override
+ MethodElement getMethod(String methodName) {
+ for (MethodElement method in methods) {
+ if (method.name == methodName) {
+ return method;
+ }
+ }
+ return null;
+ }
+
+ @override
void link(CompilationUnitElementInBuildUnit compilationUnit) {
for (ConstructorElementForLink constructorElement in constructors) {
constructorElement.link(compilationUnit);
}
- if (compilationUnit.library._linker.strongMode) {
+ if (library._linker.strongMode) {
for (MethodElementForLink methodElement in methods) {
methodElement.link(compilationUnit);
}
@@ -465,12 +539,12 @@
* Convert [typeRef] into an [InterfaceType].
*/
InterfaceType _computeInterfaceType(EntityRef typeRef) {
- if (_unlinkedClass.supertype != null) {
- DartType supertype = enclosingElement._resolveTypeRef(typeRef, this);
- if (supertype is InterfaceType) {
- return supertype;
+ if (typeRef != null) {
+ DartType type = enclosingElement._resolveTypeRef(typeRef, this);
+ if (type is InterfaceType) {
+ return type;
}
- // In the event that the supertype isn't an interface type (which may
+ // In the event that the `typeRef` isn't an interface type (which may
// happen in the event of erroneous code) just fall through and pretend
// the supertype is `Object`.
}
@@ -511,9 +585,9 @@
List<FieldElementForLink_EnumField> get fields {
if (_fields == null) {
_fields = <FieldElementForLink_EnumField>[];
- _fields.add(new FieldElementForLink_EnumField(null));
+ _fields.add(new FieldElementForLink_EnumField(null, this));
for (UnlinkedEnumValue value in _unlinkedEnum.values) {
- _fields.add(new FieldElementForLink_EnumField(value));
+ _fields.add(new FieldElementForLink_EnumField(value, this));
}
}
return _fields;
@@ -538,12 +612,18 @@
InterfaceType get supertype => library._linker.typeProvider.objectType;
@override
+ DartType get type => _type ??= new InterfaceTypeImpl(this);
+
+ @override
+ List<TypeParameterElement> get typeParameters => const [];
+
+ @override
ConstructorElementForLink get unnamedConstructor => null;
@override
DartType buildType(DartType getTypeArgument(int i),
List<int> implicitFunctionTypeIndices) =>
- _type ??= new InterfaceTypeImpl(this);
+ type;
@override
void link(CompilationUnitElementInBuildUnit compilationUnit) {}
@@ -577,9 +657,9 @@
*/
final int unitNum;
- CompilationUnitElementForLink(UnlinkedUnit unlinkedUnit, this.unitNum)
- : _references = new List<ReferenceableElementForLink>(
- unlinkedUnit.references.length),
+ CompilationUnitElementForLink(
+ UnlinkedUnit unlinkedUnit, this.unitNum, int numReferences)
+ : _references = new List<ReferenceableElementForLink>(numReferences),
_unlinkedUnit = unlinkedUnit;
@override
@@ -602,6 +682,18 @@
*/
bool get isInBuildUnit;
+ /**
+ * Determine whether type inference is complete in this compilation unit.
+ */
+ bool get isTypeInferenceComplete {
+ LibraryCycleForLink libraryCycleForLink = library.libraryCycleForLink;
+ if (libraryCycleForLink == null) {
+ return true;
+ } else {
+ return libraryCycleForLink._node.isEvaluated;
+ }
+ }
+
@override
LibraryElementForLink get library => enclosingElement;
@@ -658,6 +750,14 @@
name, () => UndefinedElementForLink.instance);
}
+ /**
+ * Compute the type referred to by the given linked type [slot] (interpreted
+ * relative to [typeParameterContext]). If there is no inferred type in the
+ * given slot, `dynamic` is returned.
+ */
+ DartType getLinkedType(
+ int slot, TypeParameterizedElementForLink typeParameterContext);
+
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
@@ -668,17 +768,32 @@
*/
ReferenceableElementForLink _resolveRef(int index) {
if (_references[index] == null) {
- UnlinkedReference unlinkedReference = _unlinkedUnit.references[index];
+ UnlinkedReference unlinkedReference =
+ index < _unlinkedUnit.references.length
+ ? _unlinkedUnit.references[index]
+ : null;
LinkedReference linkedReference = _linkedUnit.references[index];
- String name = unlinkedReference.name;
- int containingReference = unlinkedReference.prefixReference;
+ String name = unlinkedReference == null
+ ? linkedReference.name
+ : unlinkedReference.name;
+ int containingReference = unlinkedReference == null
+ ? linkedReference.containingReference
+ : unlinkedReference.prefixReference;
if (containingReference != 0 &&
_linkedUnit.references[containingReference].kind !=
ReferenceKind.prefix) {
_references[index] =
_resolveRef(containingReference).getContainedName(name);
} else if (linkedReference.dependency == 0) {
- _references[index] = enclosingElement.getContainedName(name);
+ if (name == 'void') {
+ _references[index] = enclosingElement._linker.voidElement;
+ } else if (name == '*bottom*') {
+ _references[index] = enclosingElement._linker.bottomElement;
+ } else if (name == 'dynamic') {
+ _references[index] = enclosingElement._linker.dynamicElement;
+ } else {
+ _references[index] = enclosingElement.getContainedName(name);
+ }
} else {
LibraryElementForLink dependency =
enclosingElement._getDependency(linkedReference.dependency);
@@ -741,7 +856,7 @@
CompilationUnitElementInBuildUnit(this.enclosingElement,
UnlinkedUnit unlinkedUnit, this._linkedUnit, int unitNum)
- : super(unlinkedUnit, unitNum);
+ : super(unlinkedUnit, unitNum, unlinkedUnit.references.length);
@override
bool get isInBuildUnit => true;
@@ -827,6 +942,16 @@
throw new UnimplementedError('${element.runtimeType}');
}
+ @override
+ DartType getLinkedType(
+ int slot, TypeParameterizedElementForLink typeParameterContext) {
+ // This method should only be called on compilation units that come from
+ // dependencies, never on compilation units that are part of the current
+ // build unit.
+ throw new StateError(
+ 'Linker tried to access linked type from current build unit');
+ }
+
/**
* Perform type inference and const cycle detection on this
* compilation unit.
@@ -836,6 +961,9 @@
new InstanceMemberInferrer(enclosingElement._linker.typeProvider,
enclosingElement.inheritanceManager)
.inferCompilationUnit(this);
+ for (TopLevelVariableElementForLink variable in topLevelVariables) {
+ variable.link(this);
+ }
}
for (ClassElementForLink classElement in types) {
classElement.link(this);
@@ -887,15 +1015,43 @@
@override
final LinkedUnit _linkedUnit;
+ List<EntityRef> _linkedTypeRefs;
+
@override
final LibraryElementInDependency enclosingElement;
CompilationUnitElementInDependency(this.enclosingElement,
- UnlinkedUnit unlinkedUnit, this._linkedUnit, int unitNum)
- : super(unlinkedUnit, unitNum);
+ UnlinkedUnit unlinkedUnit, LinkedUnit linkedUnit, int unitNum)
+ : _linkedUnit = linkedUnit,
+ super(unlinkedUnit, unitNum, linkedUnit.references.length) {
+ // Make one pass through the linked types to determine the lengths for
+ // _linkedTypeRefs and _linkedTypes. TODO(paulberry): add an int to the
+ // summary to make this unnecessary.
+ int maxLinkedTypeSlot = 0;
+ for (EntityRef ref in _linkedUnit.types) {
+ if (ref.slot > maxLinkedTypeSlot) {
+ maxLinkedTypeSlot = ref.slot;
+ }
+ }
+ // Initialize _linkedTypeRefs.
+ _linkedTypeRefs = new List<EntityRef>(maxLinkedTypeSlot + 1);
+ for (EntityRef ref in _linkedUnit.types) {
+ _linkedTypeRefs[ref.slot] = ref;
+ }
+ }
@override
bool get isInBuildUnit => false;
+
+ @override
+ DartType getLinkedType(
+ int slot, TypeParameterizedElementForLink typeParameterContext) {
+ if (slot < _linkedTypeRefs.length) {
+ return _resolveTypeRef(_linkedTypeRefs[slot], typeParameterContext);
+ } else {
+ return DynamicTypeImpl.instance;
+ }
+ }
}
/**
@@ -1131,6 +1287,7 @@
UnlinkedExecutable unlinkedExecutable)
: super(enclosingElement, unlinkedExecutable) {
if (enclosingElement.enclosingElement.isInBuildUnit &&
+ _unlinkedExecutable != null &&
_unlinkedExecutable.constCycleSlot != 0) {
_constNode = new ConstConstructorNode(this);
}
@@ -1184,6 +1341,21 @@
}
/**
+ * A synthetic constructor.
+ */
+class ConstructorElementForLink_Synthetic extends ConstructorElementForLink {
+ ConstructorElementForLink_Synthetic(
+ ClassElementForLink_Class enclosingElement)
+ : super(enclosingElement, null);
+
+ @override
+ String get name => '';
+
+ @override
+ List<ParameterElement> get parameters => const <ParameterElement>[];
+}
+
+/**
* Instance of [ConstNode] representing a constant field or constant
* top level variable.
*/
@@ -1349,6 +1521,7 @@
DartType _inferredReturnType;
FunctionTypeImpl _type;
List<TypeParameterElementForLink> _typeParameters;
+ String _name;
List<ParameterElementForLink> _parameters;
/**
@@ -1359,6 +1532,12 @@
ExecutableElementForLink(this.enclosingElement, this._unlinkedExecutable);
+ /**
+ * Return the compilation unit in which this executable appears.
+ */
+ CompilationUnitElementForLink get compilationUnit =>
+ enclosingElement.enclosingElement;
+
@override
TypeParameterizedElementForLink get enclosingTypeParameterContext =>
enclosingElement;
@@ -1376,7 +1555,15 @@
LibraryElementForLink get library => enclosingElement.library;
@override
- String get name => _unlinkedExecutable.name;
+ String get name {
+ if (_name == null) {
+ _name = _unlinkedExecutable.name;
+ if (_name == '-' && _unlinkedExecutable.parameters.isEmpty) {
+ _name = 'unary-';
+ }
+ }
+ return _name;
+ }
@override
List<ParameterElementForLink> get parameters {
@@ -1401,6 +1588,10 @@
if (_unlinkedExecutable.kind == UnlinkedExecutableKind.constructor) {
// TODO(paulberry): implement.
throw new UnimplementedError();
+ } else if (!compilationUnit.isInBuildUnit) {
+ _inferredReturnType = compilationUnit.getLinkedType(
+ _unlinkedExecutable.inferredReturnTypeSlot, this);
+ return _inferredReturnType;
} else if (_unlinkedExecutable.kind == UnlinkedExecutableKind.setter &&
library._linker.strongMode) {
// In strong mode, setters without an explicit return type are
@@ -1446,6 +1637,616 @@
}
}
+class ExprTypeComputer {
+ VariableElementForLink variable;
+ CompilationUnitElementForLink unit;
+ LibraryElementForLink library;
+ Linker linker;
+ TypeProvider typeProvider;
+ UnlinkedConst unlinkedConst;
+
+ final List<DartType> stack = <DartType>[];
+ int intPtr = 0;
+ int refPtr = 0;
+ int strPtr = 0;
+ int assignmentOperatorPtr = 0;
+
+ ExprTypeComputer(VariableElementForLink variableElement) {
+ this.variable = variableElement;
+ unit = variableElement.compilationUnit;
+ library = unit.enclosingElement;
+ linker = library._linker;
+ typeProvider = linker.typeProvider;
+ unlinkedConst = variableElement.unlinkedVariable.constExpr;
+ }
+
+ DartType compute() {
+ // Perform RPN evaluation of the constant, using a stack of inferred types.
+ for (UnlinkedConstOperation operation in unlinkedConst.operations) {
+ switch (operation) {
+ case UnlinkedConstOperation.pushInt:
+ intPtr++;
+ stack.add(typeProvider.intType);
+ break;
+ case UnlinkedConstOperation.pushLongInt:
+ int numInts = _getNextInt();
+ intPtr += numInts;
+ stack.add(typeProvider.intType);
+ break;
+ case UnlinkedConstOperation.pushDouble:
+ stack.add(typeProvider.doubleType);
+ break;
+ case UnlinkedConstOperation.pushTrue:
+ case UnlinkedConstOperation.pushFalse:
+ stack.add(typeProvider.boolType);
+ break;
+ case UnlinkedConstOperation.pushString:
+ strPtr++;
+ stack.add(typeProvider.stringType);
+ break;
+ case UnlinkedConstOperation.concatenate:
+ stack.length -= _getNextInt();
+ stack.add(typeProvider.stringType);
+ break;
+ case UnlinkedConstOperation.makeSymbol:
+ strPtr++;
+ stack.add(typeProvider.symbolType);
+ break;
+ case UnlinkedConstOperation.pushNull:
+ stack.add(BottomTypeImpl.instance);
+ break;
+ case UnlinkedConstOperation.pushReference:
+ _doPushReference();
+ break;
+ case UnlinkedConstOperation.extractProperty:
+ _doExtractProperty();
+ break;
+ case UnlinkedConstOperation.invokeConstructor:
+ _doInvokeConstructor();
+ break;
+ case UnlinkedConstOperation.makeUntypedList:
+ _doMakeUntypedList();
+ break;
+ case UnlinkedConstOperation.makeUntypedMap:
+ _doMakeUntypedMap();
+ break;
+ case UnlinkedConstOperation.makeTypedList:
+ _doMakeTypedList();
+ break;
+ case UnlinkedConstOperation.makeTypedMap:
+ _doMakeTypeMap();
+ break;
+ case UnlinkedConstOperation.not:
+ stack.length -= 1;
+ stack.add(typeProvider.boolType);
+ break;
+ case UnlinkedConstOperation.complement:
+ _computePrefixExpressionType('~');
+ break;
+ case UnlinkedConstOperation.negate:
+ _computePrefixExpressionType('unary-');
+ break;
+ case UnlinkedConstOperation.and:
+ case UnlinkedConstOperation.or:
+ case UnlinkedConstOperation.equal:
+ case UnlinkedConstOperation.notEqual:
+ stack.length -= 2;
+ stack.add(typeProvider.boolType);
+ break;
+ case UnlinkedConstOperation.bitXor:
+ _computeBinaryExpressionType(TokenType.CARET);
+ break;
+ case UnlinkedConstOperation.bitAnd:
+ _computeBinaryExpressionType(TokenType.AMPERSAND);
+ break;
+ case UnlinkedConstOperation.bitOr:
+ _computeBinaryExpressionType(TokenType.BAR);
+ break;
+ case UnlinkedConstOperation.bitShiftRight:
+ _computeBinaryExpressionType(TokenType.GT_GT);
+ break;
+ case UnlinkedConstOperation.bitShiftLeft:
+ _computeBinaryExpressionType(TokenType.LT_LT);
+ break;
+ case UnlinkedConstOperation.add:
+ _computeBinaryExpressionType(TokenType.PLUS);
+ break;
+ case UnlinkedConstOperation.subtract:
+ _computeBinaryExpressionType(TokenType.MINUS);
+ break;
+ case UnlinkedConstOperation.multiply:
+ _computeBinaryExpressionType(TokenType.STAR);
+ break;
+ case UnlinkedConstOperation.divide:
+ _computeBinaryExpressionType(TokenType.SLASH);
+ break;
+ case UnlinkedConstOperation.floorDivide:
+ _computeBinaryExpressionType(TokenType.TILDE_SLASH);
+ break;
+ case UnlinkedConstOperation.greater:
+ _computeBinaryExpressionType(TokenType.GT);
+ break;
+ case UnlinkedConstOperation.less:
+ _computeBinaryExpressionType(TokenType.LT);
+ break;
+ case UnlinkedConstOperation.greaterEqual:
+ _computeBinaryExpressionType(TokenType.GT_EQ);
+ break;
+ case UnlinkedConstOperation.lessEqual:
+ _computeBinaryExpressionType(TokenType.LT_EQ);
+ break;
+ case UnlinkedConstOperation.modulo:
+ _computeBinaryExpressionType(TokenType.PERCENT);
+ break;
+ case UnlinkedConstOperation.conditional:
+ _doConditional();
+ break;
+ case UnlinkedConstOperation.assignToRef:
+ _doAssignToRef();
+ break;
+ case UnlinkedConstOperation.assignToProperty:
+ _doAssignToProperty();
+ break;
+ case UnlinkedConstOperation.assignToIndex:
+ _doAssignToIndex();
+ break;
+ case UnlinkedConstOperation.extractIndex:
+ _doExtractIndex();
+ break;
+ case UnlinkedConstOperation.invokeMethodRef:
+ _doInvokeMethodRef();
+ break;
+ case UnlinkedConstOperation.invokeMethod:
+ _doInvokeMethod();
+ break;
+ case UnlinkedConstOperation.cascadeSectionBegin:
+ stack.add(stack.last);
+ break;
+ case UnlinkedConstOperation.cascadeSectionEnd:
+ stack.removeLast();
+ break;
+ case UnlinkedConstOperation.typeCast:
+ stack.removeLast();
+ DartType type = _getNextTypeRef();
+ stack.add(type);
+ break;
+ case UnlinkedConstOperation.typeCheck:
+ stack.removeLast();
+ refPtr++;
+ stack.add(typeProvider.boolType);
+ break;
+ case UnlinkedConstOperation.throwException:
+ stack.removeLast();
+ stack.add(BottomTypeImpl.instance);
+ break;
+ default:
+ // TODO(paulberry): implement.
+ throw new UnimplementedError('$operation');
+ }
+ }
+ assert(intPtr == unlinkedConst.ints.length);
+ assert(refPtr == unlinkedConst.references.length);
+ assert(strPtr == unlinkedConst.strings.length);
+ assert(assignmentOperatorPtr == unlinkedConst.assignmentOperators.length);
+ assert(stack.length == 1);
+ return _dynamicIfNull(stack[0]);
+ }
+
+ void _computeBinaryExpressionType(TokenType operator) {
+ DartType right = stack.removeLast();
+ DartType left = stack.removeLast();
+ _pushBinaryOperatorType(left, operator, right);
+ }
+
+ void _computePrefixExpressionType(String operatorName) {
+ DartType operand = stack.removeLast();
+ if (operand is InterfaceType) {
+ MethodElement method = operand.lookUpMethod(operatorName, library);
+ if (method != null) {
+ DartType type = method.returnType;
+ stack.add(type);
+ return;
+ }
+ }
+ stack.add(DynamicTypeImpl.instance);
+ }
+
+ void _doAssignToIndex() {
+ stack.removeLast();
+ stack.removeLast();
+ UnlinkedExprAssignOperator operator =
+ unlinkedConst.assignmentOperators[assignmentOperatorPtr++];
+ if (operator == UnlinkedExprAssignOperator.assign) {
+ // The type of the assignment is the type of the value,
+ // which is already in the stack.
+ } else if (isIncrementOrDecrement(operator)) {
+ // TODO(scheglov) implement
+ stack.add(DynamicTypeImpl.instance);
+ } else {
+ stack.removeLast();
+ // TODO(scheglov) implement
+ stack.add(DynamicTypeImpl.instance);
+ }
+ }
+
+ void _doAssignToProperty() {
+ DartType targetType = stack.removeLast();
+ String propertyName = _getNextString();
+ UnlinkedExprAssignOperator assignOperator =
+ unlinkedConst.assignmentOperators[assignmentOperatorPtr++];
+ if (assignOperator == UnlinkedExprAssignOperator.assign) {
+ // The type of the assignment is the type of the value,
+ // which is already in the stack.
+ } else if (assignOperator == UnlinkedExprAssignOperator.postfixDecrement ||
+ assignOperator == UnlinkedExprAssignOperator.postfixIncrement) {
+ DartType propertyType = _getPropertyType(targetType, propertyName);
+ stack.add(propertyType);
+ } else if (assignOperator == UnlinkedExprAssignOperator.prefixDecrement) {
+ _pushPropertyBinaryExpression(
+ targetType, propertyName, TokenType.MINUS, typeProvider.intType);
+ } else if (assignOperator == UnlinkedExprAssignOperator.prefixIncrement) {
+ _pushPropertyBinaryExpression(
+ targetType, propertyName, TokenType.PLUS, typeProvider.intType);
+ } else {
+ TokenType binaryOperator =
+ _convertAssignOperatorToTokenType(assignOperator);
+ DartType operandType = stack.removeLast();
+ _pushPropertyBinaryExpression(
+ targetType, propertyName, binaryOperator, operandType);
+ }
+ }
+
+ void _doAssignToRef() {
+ refPtr++;
+ UnlinkedExprAssignOperator operator =
+ unlinkedConst.assignmentOperators[assignmentOperatorPtr++];
+ if (operator == UnlinkedExprAssignOperator.assign) {
+ // The type of the assignment is the type of the value,
+ // which is already in the stack.
+ } else if (isIncrementOrDecrement(operator)) {
+ // TODO(scheglov) implement
+ stack.add(DynamicTypeImpl.instance);
+ } else {
+ stack.removeLast();
+ // TODO(scheglov) implement
+ stack.add(DynamicTypeImpl.instance);
+ }
+ }
+
+ void _doConditional() {
+ DartType elseType = stack.removeLast();
+ DartType thenType = stack.removeLast();
+ stack.removeLast();
+ DartType type = _leastUpperBound(thenType, elseType);
+ type = _dynamicIfNull(type);
+ stack.add(type);
+ }
+
+ void _doExtractIndex() {
+ stack.removeLast(); // index
+ DartType target = stack.removeLast();
+ stack.add(() {
+ if (target is InterfaceType) {
+ MethodElement method = target.lookUpMethod('[]', library);
+ if (method != null) {
+ return method.returnType;
+ }
+ }
+ return DynamicTypeImpl.instance;
+ }());
+ }
+
+ void _doExtractProperty() {
+ DartType target = stack.removeLast();
+ String propertyName = _getNextString();
+ stack.add(() {
+ if (target is InterfaceType) {
+ PropertyAccessorElement getter =
+ target.lookUpGetter(propertyName, library);
+ if (getter != null) {
+ return getter.returnType;
+ }
+ MethodElement method = target.lookUpMethod(propertyName, library);
+ if (method != null) {
+ return method.type;
+ }
+ }
+ return DynamicTypeImpl.instance;
+ }());
+ }
+
+ void _doInvokeConstructor() {
+ int numNamed = _getNextInt();
+ int numPositional = _getNextInt();
+ // TODO(paulberry): don't just pop the args; use their types
+ // to infer the type of type arguments.
+ stack.length -= numNamed + numPositional;
+ strPtr += numNamed;
+ EntityRef ref = unlinkedConst.references[refPtr++];
+ ConstructorElementForLink element =
+ unit._resolveRef(ref.reference).asConstructor;
+ if (element != null) {
+ stack.add(element.enclosingElement.buildType(
+ (int i) => i >= ref.typeArguments.length
+ ? DynamicTypeImpl.instance
+ : unit._resolveTypeRef(
+ ref.typeArguments[i], variable._typeParameterContext),
+ const []));
+ } else {
+ stack.add(DynamicTypeImpl.instance);
+ }
+ }
+
+ void _doInvokeMethod() {
+ int numNamed = unlinkedConst.ints[intPtr++];
+ int numPositional = unlinkedConst.ints[intPtr++];
+ List<String> namedArgNames = _getNextStrings(numNamed);
+ List<DartType> namedArgTypeList = _popList(numNamed);
+ List<DartType> positionalArgTypes = _popList(numPositional);
+ String methodName = _getNextString();
+ DartType target = stack.removeLast();
+ stack.add(() {
+ if (target is InterfaceType) {
+ MethodElement method = target.lookUpMethod(methodName, library);
+ DartType rawMethodType = method?.type;
+ TypeSystem ts = linker.typeSystem;
+ if (rawMethodType is FunctionType) {
+ if (rawMethodType.typeFormals.isNotEmpty &&
+ ts is StrongTypeSystemImpl) {
+ List<DartType> paramTypes = <DartType>[];
+ List<DartType> argTypes = <DartType>[];
+ // Add positional parameter and argument types.
+ for (int i = 0; i < numPositional; i++) {
+ ParameterElement parameter = rawMethodType.parameters[i];
+ if (parameter != null) {
+ paramTypes.add(parameter.type);
+ argTypes.add(positionalArgTypes[i]);
+ }
+ }
+ // Prepare named argument types map.
+ Map<String, DartType> namedArgTypes = <String, DartType>{};
+ for (int i = 0; i < numNamed; i++) {
+ String name = namedArgNames[i];
+ DartType type = namedArgTypeList[i];
+ namedArgTypes[name] = type;
+ }
+ // Add named parameter and argument types.
+ Map<String, DartType> namedParameterTypes =
+ rawMethodType.namedParameterTypes;
+ namedArgTypes.forEach((String name, DartType argType) {
+ DartType parameterType = namedParameterTypes[name];
+ if (parameterType != null) {
+ paramTypes.add(parameterType);
+ argTypes.add(argType);
+ }
+ });
+ // Perform inference.
+ FunctionType inferred = ts.inferGenericFunctionCall(
+ typeProvider, rawMethodType, paramTypes, argTypes, null);
+ return inferred.returnType;
+ }
+ // Not a generic method, use the raw return type.
+ return rawMethodType.returnType;
+ }
+ }
+ return DynamicTypeImpl.instance;
+ }());
+ }
+
+ void _doInvokeMethodRef() {
+ int numNamed = _getNextInt();
+ int numPositional = _getNextInt();
+ // TODO(paulberry): don't just pop the args; use their types
+ // to infer the type of type arguments.
+ stack.length -= numNamed + numPositional;
+ strPtr += numNamed;
+ refPtr++;
+ // TODO(paulberry): implement.
+ stack.add(DynamicTypeImpl.instance);
+ }
+
+ void _doMakeTypedList() {
+ DartType itemType = _getNextTypeRef();
+ stack.length -= _getNextInt();
+ stack.add(typeProvider.listType.instantiate(<DartType>[itemType]));
+ }
+
+ void _doMakeTypeMap() {
+ DartType keyType = _getNextTypeRef();
+ DartType valueType = _getNextTypeRef();
+ stack.length -= 2 * _getNextInt();
+ stack.add(typeProvider.mapType.instantiate(<DartType>[keyType, valueType]));
+ }
+
+ void _doMakeUntypedList() {
+ int numItems = _getNextInt();
+ DartType itemType = numItems == 0
+ ? DynamicTypeImpl.instance
+ : _popList(numItems).reduce(_leastUpperBound);
+ itemType = _dynamicIfNull(itemType);
+ stack.add(typeProvider.listType.instantiate(<DartType>[itemType]));
+ }
+
+ void _doMakeUntypedMap() {
+ int numEntries = _getNextInt();
+ List<DartType> keysValues = _popList(2 * numEntries);
+ DartType keyType = null;
+ DartType valueType = null;
+ for (int i = 0; i < 2 * numEntries; i++) {
+ DartType type = keysValues[i];
+ if (i.isEven) {
+ keyType = keyType == null ? type : _leastUpperBound(keyType, type);
+ } else {
+ valueType =
+ valueType == null ? type : _leastUpperBound(valueType, type);
+ }
+ }
+ keyType = _dynamicIfNull(keyType);
+ valueType = _dynamicIfNull(valueType);
+ stack.add(typeProvider.mapType.instantiate(<DartType>[keyType, valueType]));
+ }
+
+ void _doPushReference() {
+ EntityRef ref = unlinkedConst.references[refPtr++];
+ if (ref.paramReference != 0) {
+ stack.add(typeProvider.typeType);
+ } else {
+ // Synthetic function types can't be directly referred
+ // to by expressions.
+ assert(ref.syntheticReturnType == null);
+ // Nor can implicit function types derived from
+ // function-typed parameters.
+ assert(ref.implicitFunctionTypeIndices.isEmpty);
+ ReferenceableElementForLink element =
+ variable.compilationUnit._resolveRef(ref.reference);
+ stack.add(element.asStaticType);
+ }
+ }
+
+ int _getNextInt() {
+ return unlinkedConst.ints[intPtr++];
+ }
+
+ String _getNextString() {
+ return unlinkedConst.strings[strPtr++];
+ }
+
+ List<String> _getNextStrings(int n) {
+ List<String> result = new List<String>(n);
+ for (int i = 0; i < n; i++) {
+ result[i] = _getNextString();
+ }
+ return result;
+ }
+
+ DartType _getNextTypeRef() {
+ EntityRef ref = unlinkedConst.references[refPtr++];
+ return unit._resolveTypeRef(ref, variable._typeParameterContext);
+ }
+
+ /**
+ * Return the type of the property with the given [propertyName] in the
+ * given [targetType]. May return `dynamic` if the property cannot be
+ * resolved.
+ */
+ DartType _getPropertyType(DartType targetType, String propertyName) {
+ return targetType is InterfaceType
+ ? targetType.lookUpGetter(propertyName, library)?.returnType
+ : DynamicTypeImpl.instance;
+ }
+
+ DartType _leastUpperBound(DartType s, DartType t) {
+ return linker.typeSystem.getLeastUpperBound(typeProvider, s, t);
+ }
+
+ List<DartType> _popList(int n) {
+ List<DartType> result = stack.sublist(stack.length - n, stack.length);
+ stack.length -= n;
+ return result;
+ }
+
+ void _pushBinaryOperatorType(
+ DartType left, TokenType operator, DartType right) {
+ if (left is InterfaceType) {
+ MethodElement method = left.lookUpMethod(operator.lexeme, library);
+ if (method != null) {
+ DartType type = method.returnType;
+ type = _refineBinaryExpressionType(operator, type, left, right);
+ stack.add(type);
+ return;
+ }
+ }
+ stack.add(DynamicTypeImpl.instance);
+ }
+
+ /**
+ * Extract the property with the given [propertyName], apply the operator
+ * with the given [operandType], push the type of applying operand of the
+ * given [operandType].
+ */
+ void _pushPropertyBinaryExpression(DartType targetType, String propertyName,
+ TokenType operator, DartType operandType) {
+ DartType propertyType = _getPropertyType(targetType, propertyName);
+ _pushBinaryOperatorType(propertyType, operator, operandType);
+ }
+
+ DartType _refineBinaryExpressionType(TokenType operator, DartType currentType,
+ DartType leftType, DartType rightType) {
+ DartType intType = typeProvider.intType;
+ if (leftType == intType) {
+ // int op double
+ if (operator == TokenType.MINUS ||
+ operator == TokenType.PERCENT ||
+ operator == TokenType.PLUS ||
+ operator == TokenType.STAR) {
+ DartType doubleType = typeProvider.doubleType;
+ if (rightType == doubleType) {
+ return doubleType;
+ }
+ }
+ // int op int
+ if (operator == TokenType.MINUS ||
+ operator == TokenType.PERCENT ||
+ operator == TokenType.PLUS ||
+ operator == TokenType.STAR ||
+ operator == TokenType.TILDE_SLASH) {
+ if (rightType == intType) {
+ return intType;
+ }
+ }
+ }
+ // default
+ return currentType;
+ }
+
+ static TokenType _convertAssignOperatorToTokenType(
+ UnlinkedExprAssignOperator o) {
+ switch (o) {
+ case UnlinkedExprAssignOperator.assign:
+ return null;
+ case UnlinkedExprAssignOperator.ifNull:
+ return TokenType.QUESTION_QUESTION;
+ case UnlinkedExprAssignOperator.multiply:
+ return TokenType.STAR;
+ case UnlinkedExprAssignOperator.divide:
+ return TokenType.SLASH;
+ case UnlinkedExprAssignOperator.floorDivide:
+ return TokenType.TILDE_SLASH;
+ case UnlinkedExprAssignOperator.modulo:
+ return TokenType.PERCENT;
+ case UnlinkedExprAssignOperator.plus:
+ return TokenType.PLUS;
+ case UnlinkedExprAssignOperator.minus:
+ return TokenType.MINUS;
+ case UnlinkedExprAssignOperator.shiftLeft:
+ return TokenType.LT_LT;
+ case UnlinkedExprAssignOperator.shiftRight:
+ return TokenType.GT_GT;
+ case UnlinkedExprAssignOperator.bitAnd:
+ return TokenType.AMPERSAND;
+ case UnlinkedExprAssignOperator.bitXor:
+ return TokenType.CARET;
+ case UnlinkedExprAssignOperator.bitOr:
+ return TokenType.BAR;
+ case UnlinkedExprAssignOperator.prefixIncrement:
+ return TokenType.PLUS_PLUS;
+ case UnlinkedExprAssignOperator.prefixDecrement:
+ return TokenType.MINUS_MINUS;
+ case UnlinkedExprAssignOperator.postfixIncrement:
+ return TokenType.PLUS_PLUS;
+ case UnlinkedExprAssignOperator.postfixDecrement:
+ return TokenType.MINUS_MINUS;
+ }
+ }
+
+ static DartType _dynamicIfNull(DartType type) {
+ if (type == null || type.isBottom || type.isVoid) {
+ return DynamicTypeImpl.instance;
+ }
+ return type;
+ }
+}
+
/**
* Element representing a field resynthesized from a summary during
* linking.
@@ -1479,11 +2280,18 @@
@override
DartType get type {
+ // TODO(paulberry): can this be unified with
+ // [VariableElementForLink.asStaticType]?
assert(!isStatic);
if (_inferredInstanceType != null) {
return _inferredInstanceType;
} else if (_declaredType == null) {
if (unlinkedVariable.type == null) {
+ if (!compilationUnit.isInBuildUnit) {
+ _inferredInstanceType = compilationUnit.getLinkedType(
+ unlinkedVariable.inferredTypeSlot, enclosingElement);
+ return _inferredInstanceType;
+ }
_declaredType = DynamicTypeImpl.instance;
} else {
_declaredType = compilationUnit._resolveTypeRef(
@@ -1500,6 +2308,9 @@
_inferredInstanceType = inferredType;
}
+ @override
+ TypeParameterizedElementForLink get _typeParameterContext => enclosingElement;
+
/**
* Store the results of type inference for this field in
* [compilationUnit].
@@ -1531,7 +2342,10 @@
*/
final UnlinkedEnumValue unlinkedEnumValue;
- FieldElementForLink_EnumField(this.unlinkedEnumValue);
+ @override
+ final ClassElementForLink_Enum enclosingElement;
+
+ FieldElementForLink_EnumField(this.unlinkedEnumValue, this.enclosingElement);
@override
ConstructorElementForLink get asConstructor => null;
@@ -1545,10 +2359,7 @@
}
@override
- DartType get asStaticType {
- // TODO(paulberry): implement.
- throw new UnimplementedError();
- }
+ DartType get asStaticType => enclosingElement.type;
@override
TypeInferenceNode get asTypeInferenceNode => null;
@@ -1659,19 +2470,119 @@
}
/**
+ * Specialization of [DependencyWalker] for linking library cycles.
+ */
+class LibraryCycleDependencyWalker extends DependencyWalker<LibraryCycleNode> {
+ @override
+ void evaluate(LibraryCycleNode v) {
+ v.link();
+ }
+
+ @override
+ void evaluateScc(List<LibraryCycleNode> scc) {
+ // There should never be a cycle among library cycles.
+ throw new StateError('Cycle among library cycles');
+ }
+}
+
+/**
* An instance of [LibraryCycleForLink] represents a single library cycle
* discovered during linking; it consists of one or more libraries in the build
* unit being linked.
- *
- * This is a stub implementation; at the moment all libraries in the build unit
- * being linked are considered to be part of the same library cycle. Hence
- * there is just a singleton instance of this class.
- * TODO(paulberry): replace this with a correct implementation.
*/
class LibraryCycleForLink {
- static final LibraryCycleForLink instance = const LibraryCycleForLink._();
+ /**
+ * The libraries in the cycle.
+ */
+ final List<LibraryElementInBuildUnit> libraries;
- const LibraryCycleForLink._();
+ /**
+ * The library cycles which this library depends on.
+ */
+ final List<LibraryCycleForLink> dependencies;
+
+ /**
+ * The [LibraryCycleNode] for this library cycle.
+ */
+ LibraryCycleNode _node;
+
+ LibraryCycleForLink(this.libraries, this.dependencies) {
+ _node = new LibraryCycleNode(this);
+ }
+
+ LibraryCycleNode get node => _node;
+
+ /**
+ * Link this library cycle and any library cycles it depends on. Does
+ * nothing if this library cycle has already been linked.
+ */
+ void ensureLinked() {
+ if (!node.isEvaluated) {
+ new LibraryCycleDependencyWalker().walk(node);
+ }
+ }
+}
+
+/**
+ * Specialization of [Node] used to link library cycles in proper dependency
+ * order.
+ */
+class LibraryCycleNode extends Node<LibraryCycleNode> {
+ /**
+ * The library cycle this [Node] represents.
+ */
+ final LibraryCycleForLink libraryCycle;
+
+ /**
+ * Indicates whether this library cycle has been linked yet.
+ */
+ bool _isLinked = false;
+
+ LibraryCycleNode(this.libraryCycle);
+
+ @override
+ bool get isEvaluated => _isLinked;
+
+ @override
+ List<LibraryCycleNode> computeDependencies() => libraryCycle.dependencies
+ .map((LibraryCycleForLink cycle) => cycle.node)
+ .toList();
+
+ /**
+ * Link this library cycle.
+ */
+ void link() {
+ for (LibraryElementInBuildUnit library in libraryCycle.libraries) {
+ library.link();
+ }
+ _isLinked = true;
+ }
+}
+
+/**
+ * Specialization of [DependencyWalker] for computing library cycles.
+ */
+class LibraryDependencyWalker extends DependencyWalker<LibraryNode> {
+ @override
+ void evaluate(LibraryNode v) => evaluateScc(<LibraryNode>[v]);
+
+ @override
+ void evaluateScc(List<LibraryNode> scc) {
+ Set<LibraryCycleForLink> dependentCycles = new Set<LibraryCycleForLink>();
+ for (LibraryNode node in scc) {
+ for (LibraryNode dependency in node.dependencies) {
+ if (dependency.isEvaluated) {
+ dependentCycles.add(dependency._libraryCycle);
+ }
+ }
+ }
+ LibraryCycleForLink cycle = new LibraryCycleForLink(
+ scc.map((LibraryNode n) => n.library).toList(),
+ dependentCycles.toList());
+ for (LibraryNode node in scc) {
+ node._libraryCycle = cycle;
+ }
+ }
}
/**
@@ -1685,7 +2596,7 @@
/**
* Pointer back to the linker.
*/
- final _Linker _linker;
+ final Linker _linker;
/**
* The absolute URI of this library.
@@ -1697,9 +2608,13 @@
<String, ReferenceableElementForLink>{};
final List<LibraryElementForLink> _dependencies = <LibraryElementForLink>[];
UnlinkedUnit _definingUnlinkedUnit;
+ List<LibraryElementForLink> _importedLibraries;
+ List<LibraryElementForLink> _exportedLibraries;
LibraryElementForLink(this._linker, this._absoluteUri) {
- _dependencies.length = _linkedLibrary.dependencies.length;
+ if (_linkedLibrary != null) {
+ _dependencies.length = _linkedLibrary.dependencies.length;
+ }
}
/**
@@ -1711,6 +2626,14 @@
@override
Element get enclosingElement => null;
+ @override
+ List<LibraryElementForLink> get exportedLibraries => _exportedLibraries ??=
+ _linkedLibrary.exportDependencies.map(_getDependency).toList();
+
+ @override
+ List<LibraryElementForLink> get importedLibraries => _importedLibraries ??=
+ _linkedLibrary.importDependencies.map(_getDependency).toList();
+
/**
* If this library is part of the build unit being linked, return the library
* cycle it is part of. Otherwise return `null`.
@@ -1785,11 +2708,18 @@
@override
final LinkedLibraryBuilder _linkedLibrary;
+ /**
+ * The [LibraryNode] representing this library in the library dependency
+ * graph.
+ */
+ LibraryNode _libraryNode;
+
InheritanceManager _inheritanceManager;
- LibraryElementInBuildUnit(
- _Linker linker, Uri absoluteUri, this._linkedLibrary)
- : super(linker, absoluteUri);
+ LibraryElementInBuildUnit(Linker linker, Uri absoluteUri, this._linkedLibrary)
+ : super(linker, absoluteUri) {
+ _libraryNode = new LibraryNode(this);
+ }
/**
* Get the inheritance manager for this library (creating it if necessary).
@@ -1798,7 +2728,12 @@
_inheritanceManager ??= new InheritanceManager(this);
@override
- LibraryCycleForLink get libraryCycleForLink => LibraryCycleForLink.instance;
+ LibraryCycleForLink get libraryCycleForLink {
+ if (!_libraryNode.isEvaluated) {
+ new LibraryDependencyWalker().walk(_libraryNode);
+ }
+ return _libraryNode._libraryCycle;
+ }
/**
* If this library already has a dependency in its dependencies table matching
@@ -1857,7 +2792,7 @@
final LinkedLibrary _linkedLibrary;
LibraryElementInDependency(
- _Linker linker, Uri absoluteUri, this._linkedLibrary)
+ Linker linker, Uri absoluteUri, this._linkedLibrary)
: super(linker, absoluteUri);
@override
@@ -1871,6 +2806,175 @@
}
/**
+ * Specialization of [Node] used to construct the library dependency graph.
+ */
+class LibraryNode extends Node<LibraryNode> {
+ /**
+ * The library this [Node] represents.
+ */
+ final LibraryElementInBuildUnit library;
+
+ /**
+ * The library cycle to which [library] belongs, if it has been computed.
+ * Otherwise `null`.
+ */
+ LibraryCycleForLink _libraryCycle;
+
+ LibraryNode(this.library);
+
+ @override
+ bool get isEvaluated => _libraryCycle != null;
+
+ @override
+ List<LibraryNode> computeDependencies() {
+ // Note: we only need to consider dependencies within the build unit being
+ // linked; dependencies in other build units can't participate in library
+ // cycles with us.
+ List<LibraryNode> dependencies = <LibraryNode>[];
+ for (LibraryElement dependency in library.importedLibraries) {
+ if (dependency is LibraryElementInBuildUnit) {
+ dependencies.add(dependency._libraryNode);
+ }
+ }
+ for (LibraryElement dependency in library.exportedLibraries) {
+ if (dependency is LibraryElementInBuildUnit) {
+ dependencies.add(dependency._libraryNode);
+ }
+ }
+ return dependencies;
+ }
+}
+
+/**
+ * Instances of [Linker] contain the necessary information to link
+ * together a single build unit.
+ */
+class Linker {
+ /**
+ * Callback to ask the client for a [LinkedLibrary] for a
+ * dependency.
+ */
+ final GetDependencyCallback getDependency;
+
+ /**
+ * Callback to ask the client for an [UnlinkedUnit].
+ */
+ final GetUnitCallback getUnit;
+
+ /**
+ * Map containing all library elements accessed during linking,
+ * whether they are part of the build unit being linked or whether
+ * they are dependencies.
+ */
+ final Map<Uri, LibraryElementForLink> _libraries =
+ <Uri, LibraryElementForLink>{};
+
+ /**
+ * List of library elements for the libraries in the build unit
+ * being linked.
+ */
+ final List<LibraryElementInBuildUnit> _librariesInBuildUnit =
+ <LibraryElementInBuildUnit>[];
+
+ /**
+ * Indicates whether type inference should use strong mode rules.
+ */
+ final bool strongMode;
+
+ LibraryElementForLink _coreLibrary;
+ LibraryElementForLink _asyncLibrary;
+ TypeProviderForLink _typeProvider;
+ TypeSystem _typeSystem;
+ SpecialTypeElementForLink _voidElement;
+ SpecialTypeElementForLink _dynamicElement;
+ SpecialTypeElementForLink _bottomElement;
+
+ Linker(Map<String, LinkedLibraryBuilder> linkedLibraries, this.getDependency,
+ this.getUnit, this.strongMode) {
+ // Create elements for the libraries to be linked. The rest of
+ // the element model will be created on demand.
+ linkedLibraries
+ .forEach((String absoluteUri, LinkedLibraryBuilder linkedLibrary) {
+ Uri uri = Uri.parse(absoluteUri);
+ _librariesInBuildUnit.add(_libraries[uri] =
+ new LibraryElementInBuildUnit(this, uri, linkedLibrary));
+ });
+ }
+
+ /**
+ * Get the library element for `dart:async`.
+ */
+ LibraryElementForLink get asyncLibrary =>
+ _asyncLibrary ??= getLibrary(Uri.parse('dart:async'));
+
+ /**
+ * Get the element representing the "bottom" type.
+ */
+ SpecialTypeElementForLink get bottomElement => _bottomElement ??=
+ new SpecialTypeElementForLink(this, BottomTypeImpl.instance);
+
+ /**
+ * Get the library element for `dart:core`.
+ */
+ LibraryElementForLink get coreLibrary =>
+ _coreLibrary ??= getLibrary(Uri.parse('dart:core'));
+
+ /**
+ * Get the element representing `dynamic`.
+ */
+ SpecialTypeElementForLink get dynamicElement => _dynamicElement ??=
+ new SpecialTypeElementForLink(this, DynamicTypeImpl.instance);
+
+ /**
+ * Get an instance of [TypeProvider] for use during linking.
+ */
+ TypeProviderForLink get typeProvider =>
+ _typeProvider ??= new TypeProviderForLink(this);
+
+ /**
+ * Get an instance of [TypeSystem] for use during linking.
+ */
+ TypeSystem get typeSystem => _typeSystem ??=
+ strongMode ? new StrongTypeSystemImpl() : new TypeSystemImpl();
+
+ /**
+ * Get the element representing `void`.
+ */
+ SpecialTypeElementForLink get voidElement => _voidElement ??=
+ new SpecialTypeElementForLink(this, VoidTypeImpl.instance);
+
+ /**
+ * Get the library element for the library having the given [uri].
+ */
+ LibraryElementForLink getLibrary(Uri uri) => _libraries.putIfAbsent(
+ uri,
+ () => new LibraryElementInDependency(
+ this, uri, getDependency(uri.toString())));
+
+ /**
+ * Perform type inference and const cycle detection on all libraries
+ * in the build unit being linked.
+ */
+ void link() {
+ // Link library cycles in appropriate dependency order.
+ for (LibraryElementInBuildUnit library in _librariesInBuildUnit) {
+ library.libraryCycleForLink.ensureLinked();
+ }
+ // TODO(paulberry): set dependencies.
+ }
+
+ /**
+ * Throw away any information stored in the summary by a previous call to
+ * [link].
+ */
+ void unlink() {
+ for (LibraryElementInBuildUnit library in _librariesInBuildUnit) {
+ library.unlink();
+ }
+ }
+}
+
+/**
* Element representing a method resynthesized from a summary during linking.
*/
class MethodElementForLink extends ExecutableElementForLink
@@ -1948,13 +3052,13 @@
@override
DartType get asStaticType {
// TODO(paulberry): implement.
- throw new UnimplementedError();
+ return DynamicTypeImpl.instance;
}
@override
TypeInferenceNode get asTypeInferenceNode {
// TODO(paulberry): implement.
- throw new UnimplementedError();
+ return null;
}
@override
@@ -2036,12 +3140,17 @@
return _inferredType;
} else if (_declaredType == null) {
if (_unlinkedParam.isFunctionTyped) {
- // TODO(paulberry): implement.
_declaredType = new FunctionTypeImpl(
new FunctionElementForLink_FunctionTypedParam(
this, enclosingElement, <int>[_parameterIndex]));
} else if (_unlinkedParam.type == null) {
- _declaredType = DynamicTypeImpl.instance;
+ if (!compilationUnit.isInBuildUnit) {
+ _inferredType = compilationUnit.getLinkedType(
+ _unlinkedParam.inferredTypeSlot, _typeParameterContext);
+ return _inferredType;
+ } else {
+ _declaredType = DynamicTypeImpl.instance;
+ }
} else {
_declaredType = compilationUnit._resolveTypeRef(
_unlinkedParam.type, _typeParameterContext);
@@ -2073,17 +3182,29 @@
* Element representing a getter or setter resynthesized from a summary during
* linking.
*/
-class PropertyAccessorElementForLink extends ExecutableElementForLink
+abstract class PropertyAccessorElementForLink
implements PropertyAccessorElementImpl {
+ void link(CompilationUnitElementInBuildUnit compilationUnit);
+}
+
+/**
+ * Specialization of [PropertyAccessorElementForLink] for non-synthetic
+ * accessors explicitly declared in the source code.
+ */
+class PropertyAccessorElementForLink_Executable extends ExecutableElementForLink
+ implements PropertyAccessorElementForLink {
@override
SyntheticVariableElementForLink variable;
- PropertyAccessorElementForLink(ClassElementForLink_Class enclosingElement,
- UnlinkedExecutable unlinkedExecutable, this.variable)
+ PropertyAccessorElementForLink_Executable(
+ ClassElementForLink_Class enclosingElement,
+ UnlinkedExecutable unlinkedExecutable,
+ this.variable)
: super(enclosingElement, unlinkedExecutable);
@override
- PropertyAccessorElementForLink get correspondingGetter => variable.getter;
+ PropertyAccessorElementForLink_Executable get correspondingGetter =>
+ variable.getter;
@override
bool get isGetter =>
@@ -2102,6 +3223,75 @@
}
/**
+ * Specialization of [PropertyAccessorElementForLink] for synthetic accessors
+ * implied by a field or variable declaration.
+ */
+class PropertyAccessorElementForLink_Variable
+ implements PropertyAccessorElementForLink {
+ @override
+ final bool isSetter;
+
+ final VariableElementForLink _variable;
+ FunctionTypeImpl _type;
+
+ PropertyAccessorElementForLink_Variable(this._variable, this.isSetter);
+
+ @override
+ Element get enclosingElement => _variable.enclosingElement;
+
+ @override
+ bool get isGetter => !isSetter;
+
+ @override
+ bool get isStatic => _variable.isStatic;
+
+ @override
+ bool get isSynthetic => true;
+
+ @override
+ ElementKind get kind => isSetter ? ElementKind.SETTER : ElementKind.GETTER;
+
+ @override
+ String get name => isSetter ? '${_variable.name}=' : _variable.name;
+
+ @override
+ DartType get returnType {
+ if (isSetter) {
+ return VoidTypeImpl.instance;
+ } else if (_variable.hasImplicitType &&
+ !isStatic &&
+ !_variable.compilationUnit.isTypeInferenceComplete) {
+ // This is an instance field and we are currently inferring types in the
+ // library cycle containing it. So we shouldn't use the inferred type
+ // (even if we have already computed it), since that would lead to
+ // non-deterministic type inference results.
+ return DynamicTypeImpl.instance;
+ } else {
+ return _variable.type;
+ }
+ }
+
+ @override
+ FunctionTypeImpl get type => _type ??= new FunctionTypeImpl(this);
+
+ @override
+ List<TypeParameterElement> get typeParameters {
+ // TODO(paulberry): is this correct for fields in generic classes?
+ return const [];
+ }
+
+ @override
+ bool isAccessibleIn(LibraryElement library) =>
+ !Identifier.isPrivateName(name) || identical(this.library, library);
+
+ @override
+ void link(CompilationUnitElementInBuildUnit compilationUnit) {}
+
+ @override
+ noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+/**
* Abstract base class representing an element which can be the target
* of a reference.
*/
@@ -2121,7 +3311,8 @@
ConstVariableNode get asConstVariable;
/**
- * Return the static type of the entity referred to by thi element.
+ * Return the static type (possibly inferred) of the entity referred to by
+ * this element.
*/
DartType get asStaticType;
@@ -2151,18 +3342,51 @@
}
/**
+ * Element used for references to special types such as `void`.
+ */
+class SpecialTypeElementForLink extends ReferenceableElementForLink {
+ final Linker linker;
+ final DartType type;
+
+ SpecialTypeElementForLink(this.linker, this.type);
+
+ @override
+ ConstructorElementForLink get asConstructor => null;
+
+ @override
+ ConstVariableNode get asConstVariable => null;
+
+ @override
+ DartType get asStaticType => linker.typeProvider.typeType;
+
+ @override
+ TypeInferenceNode get asTypeInferenceNode => null;
+
+ @override
+ DartType buildType(
+ DartType getTypeArgument(int i), List<int> implicitFunctionTypeIndices) {
+ return type;
+ }
+
+ @override
+ ReferenceableElementForLink getContainedName(String name) {
+ return UndefinedElementForLink.instance;
+ }
+}
+
+/**
* Element representing a synthetic variable resynthesized from a summary during
* linking.
*/
class SyntheticVariableElementForLink implements PropertyInducingElementImpl {
- PropertyAccessorElementForLink _getter;
- PropertyAccessorElementForLink _setter;
+ PropertyAccessorElementForLink_Executable _getter;
+ PropertyAccessorElementForLink_Executable _setter;
@override
- PropertyAccessorElementForLink get getter => _getter;
+ PropertyAccessorElementForLink_Executable get getter => _getter;
@override
- PropertyAccessorElementForLink get setter => _setter;
+ PropertyAccessorElementForLink_Executable get setter => _setter;
@override
void set type(DartType inferredType) {}
@@ -2183,6 +3407,23 @@
@override
bool get isStatic => true;
+
+ @override
+ TypeParameterizedElementForLink get _typeParameterContext => null;
+
+ /**
+ * Store the results of type inference for this variable in
+ * [compilationUnit].
+ */
+ void link(CompilationUnitElementInBuildUnit compilationUnit) {
+ if (hasImplicitType) {
+ TypeInferenceNode typeInferenceNode = this.asTypeInferenceNode;
+ if (typeInferenceNode != null) {
+ compilationUnit._storeLinkedType(unlinkedVariable.inferredTypeSlot,
+ typeInferenceNode.inferredType, null);
+ }
+ }
+ }
}
/**
@@ -2250,6 +3491,7 @@
return;
}
int refPtr = 0;
+
for (UnlinkedConstOperation operation in unlinkedConst.operations) {
switch (operation) {
case UnlinkedConstOperation.pushReference:
@@ -2269,6 +3511,20 @@
case UnlinkedConstOperation.makeTypedMap:
refPtr += 2;
break;
+ case UnlinkedConstOperation.assignToRef:
+ // TODO(paulberry): if this reference refers to a variable, should it
+ // be considered a type inference dependency?
+ refPtr++;
+ break;
+ case UnlinkedConstOperation.invokeMethodRef:
+ // TODO(paulberry): if this reference refers to a variable, should it
+ // be considered a type inference dependency?
+ refPtr++;
+ break;
+ case UnlinkedConstOperation.typeCast:
+ case UnlinkedConstOperation.typeCheck:
+ refPtr++;
+ break;
default:
break;
}
@@ -2286,89 +3542,11 @@
return dependencies;
}
- @override
void evaluate(bool inCycle) {
if (inCycle) {
_inferredType = DynamicTypeImpl.instance;
- } else if (!variableElement.unlinkedVariable.constExpr.isValidConst) {
- // TODO(paulberry): delete this case and fix errors.
- throw new UnimplementedError();
} else {
- // Perform RPN evaluation of the cycle, using a stack of
- // inferred types.
- List<DartType> stack = <DartType>[];
- int refPtr = 0;
- int intPtr = 0;
- UnlinkedConst unlinkedConst = variableElement.unlinkedVariable.constExpr;
- TypeProvider typeProvider =
- variableElement.compilationUnit.enclosingElement._linker.typeProvider;
- for (UnlinkedConstOperation operation in unlinkedConst.operations) {
- switch (operation) {
- case UnlinkedConstOperation.pushInt:
- intPtr++;
- stack.add(typeProvider.intType);
- break;
- case UnlinkedConstOperation.pushNull:
- stack.add(BottomTypeImpl.instance);
- break;
- case UnlinkedConstOperation.pushReference:
- EntityRef ref = unlinkedConst.references[refPtr++];
- if (ref.paramReference != 0) {
- stack.add(typeProvider.typeType);
- } else {
- // Synthetic function types can't be directly referred
- // to by expressions.
- assert(ref.syntheticReturnType == null);
- // Nor can implicit function types derived from
- // function-typed parameters.
- assert(ref.implicitFunctionTypeIndices.isEmpty);
- ReferenceableElementForLink element =
- variableElement.compilationUnit._resolveRef(ref.reference);
- TypeInferenceNode typeInferenceNode = element.asTypeInferenceNode;
- if (typeInferenceNode != null) {
- assert(typeInferenceNode.isEvaluated);
- stack.add(typeInferenceNode._inferredType);
- } else {
- stack.add(element.asStaticType);
- }
- }
- break;
- case UnlinkedConstOperation.makeTypedList:
- refPtr++;
- stack.length -= unlinkedConst.ints[intPtr++];
- // TODO(paulberry): implement.
- stack.add(DynamicTypeImpl.instance);
- break;
- case UnlinkedConstOperation.makeTypedMap:
- refPtr += 2;
- // TODO(paulberry): implement.
- throw new UnimplementedError('$operation');
- case UnlinkedConstOperation.invokeConstructor:
- // TODO(paulberry): don't just pop the args; use their types
- // to infer the type of type arguments.
- stack.length -=
- unlinkedConst.ints[intPtr++] + unlinkedConst.ints[intPtr++];
- EntityRef ref = unlinkedConst.references[refPtr++];
- ConstructorElementForLink element = variableElement.compilationUnit
- ._resolveRef(ref.reference)
- .asConstructor;
- if (ref.typeArguments.isNotEmpty) {
- // TODO(paulberry): handle type arguments
- throw new UnimplementedError();
- }
- // TODO(paulberry): do we have to follow constructor
- // redirections?
- stack.add(element.enclosingElement.type);
- break;
- default:
- // TODO(paulberry): implement.
- throw new UnimplementedError('$operation');
- }
- }
- assert(refPtr == unlinkedConst.references.length);
- assert(intPtr == unlinkedConst.ints.length);
- assert(stack.length == 1);
- _inferredType = stack[0];
+ _inferredType = new ExprTypeComputer(variableElement).compute();
}
}
}
@@ -2394,6 +3572,18 @@
TypeParameterElementForLink(this._unlinkedTypeParam, this.nestingLevel);
@override
+ DartType get bound {
+ if (_unlinkedTypeParam.bound == null) {
+ return null;
+ }
+ // TODO(scheglov) implement
+ throw new UnimplementedError();
+ }
+
+ @override
+ ElementKind get kind => ElementKind.TYPE_PARAMETER;
+
+ @override
String get name => _unlinkedTypeParam.name;
@override
@@ -2477,7 +3667,7 @@
}
class TypeProviderForLink implements TypeProvider {
- final _Linker _linker;
+ final Linker _linker;
InterfaceType _boolType;
InterfaceType _deprecatedType;
@@ -2614,9 +3804,11 @@
InterfaceType _buildInterfaceType(
LibraryElementForLink library, String name) {
- return library
- .getContainedName(name)
- .buildType((int i) => DynamicTypeImpl.instance, const []);
+ return library.getContainedName(name).buildType((int i) {
+ // TODO(scheglov) accept type parameter names
+ var element = new TypeParameterElementImpl('T$i', -1);
+ return new TypeParameterTypeImpl(element);
+ }, const []);
}
}
@@ -2676,6 +3868,7 @@
TypeInferenceNode _typeInferenceNode;
FunctionElementForLink_Initializer _initializer;
+ DartType _staticType;
/**
* The compilation unit in which this variable appears.
@@ -2699,8 +3892,23 @@
@override
DartType get asStaticType {
- // TODO(paulberry): implement.
- throw new UnimplementedError();
+ if (_staticType == null) {
+ if (_typeInferenceNode != null) {
+ assert(_typeInferenceNode.isEvaluated);
+ _staticType = _typeInferenceNode.inferredType;
+ } else if (hasImplicitType) {
+ if (!compilationUnit.isInBuildUnit) {
+ _staticType = compilationUnit.getLinkedType(
+ unlinkedVariable.inferredTypeSlot, _typeParameterContext);
+ } else {
+ _staticType = DynamicTypeImpl.instance;
+ }
+ } else {
+ _staticType = compilationUnit._resolveTypeRef(
+ unlinkedVariable.type, _typeParameterContext);
+ }
+ }
+ return _staticType;
}
@override
@@ -2738,6 +3946,12 @@
// TODO(paulberry): store inferred type.
}
+ /**
+ * The context in which type parameters should be interpreted, or `null` if
+ * there are no type parameters in scope.
+ */
+ TypeParameterizedElementForLink get _typeParameterContext;
+
@override
DartType buildType(DartType getTypeArgument(int i),
List<int> implicitFunctionTypeIndices) =>
@@ -2750,104 +3964,3 @@
@override
noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
}
-
-/**
- * Instances of [_Linker] contain the necessary information to link
- * together a single build unit.
- */
-class _Linker {
- /**
- * Callback to ask the client for a [LinkedLibrary] for a
- * dependency.
- */
- final GetDependencyCallback getDependency;
-
- /**
- * Callback to ask the client for an [UnlinkedUnit].
- */
- final GetUnitCallback getUnit;
-
- /**
- * Map containing all library elements accessed during linking,
- * whether they are part of the build unit being linked or whether
- * they are dependencies.
- */
- final Map<Uri, LibraryElementForLink> _libraries =
- <Uri, LibraryElementForLink>{};
-
- /**
- * List of library elements for the libraries in the build unit
- * being linked.
- */
- final List<LibraryElementInBuildUnit> _librariesInBuildUnit =
- <LibraryElementInBuildUnit>[];
-
- /**
- * Indicates whether type inference should use strong mode rules.
- */
- final bool strongMode;
-
- LibraryElementForLink _coreLibrary;
- LibraryElementForLink _asyncLibrary;
- TypeProviderForLink _typeProvider;
-
- _Linker(Map<String, LinkedLibraryBuilder> linkedLibraries, this.getDependency,
- this.getUnit, this.strongMode) {
- // Create elements for the libraries to be linked. The rest of
- // the element model will be created on demand.
- linkedLibraries
- .forEach((String absoluteUri, LinkedLibraryBuilder linkedLibrary) {
- Uri uri = Uri.parse(absoluteUri);
- _librariesInBuildUnit.add(_libraries[uri] =
- new LibraryElementInBuildUnit(this, uri, linkedLibrary));
- });
- }
-
- /**
- * Get the library element for `dart:async`.
- */
- LibraryElementForLink get asyncLibrary =>
- _asyncLibrary ??= getLibrary(Uri.parse('dart:async'));
-
- /**
- * Get the library element for `dart:core`.
- */
- LibraryElementForLink get coreLibrary =>
- _coreLibrary ??= getLibrary(Uri.parse('dart:core'));
-
- /**
- * Get an instance of [TypeProvider] for use during linking.
- */
- TypeProviderForLink get typeProvider =>
- _typeProvider ??= new TypeProviderForLink(this);
-
- /**
- * Get the library element for the library having the given [uri].
- */
- LibraryElementForLink getLibrary(Uri uri) => _libraries.putIfAbsent(
- uri,
- () => new LibraryElementInDependency(
- this, uri, getDependency(uri.toString())));
-
- /**
- * Perform type inference and const cycle detection on all libraries
- * in the build unit being linked.
- */
- void link() {
- // TODO(paulberry): link library cycles in appropriate dependency order.
- for (LibraryElementInBuildUnit library in _librariesInBuildUnit) {
- library.link();
- }
- // TODO(paulberry): set dependencies.
- }
-
- /**
- * Throw away any information stored in the summary by a previous call to
- * [link].
- */
- void unlink() {
- for (LibraryElementInBuildUnit library in _librariesInBuildUnit) {
- library.unlink();
- }
- }
-}
diff --git a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
index 59c1951..bde6e40 100644
--- a/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary/package_bundle_reader.dart
@@ -85,6 +85,15 @@
}
return false;
}
+ } else if (target is VariableElement) {
+ if (!_resynthesizer
+ .hasLibrarySummary(target.library.source.uri.toString())) {
+ return false;
+ }
+ if (result == PROPAGATED_VARIABLE || result == INFERRED_STATIC_VARIABLE) {
+ entry.setValue(result, target, TargetedResult.EMPTY_LIST);
+ return true;
+ }
}
return false;
}
diff --git a/pkg/analyzer/lib/src/summary/prelink.dart b/pkg/analyzer/lib/src/summary/prelink.dart
index ede4239..e98b64b 100644
--- a/pkg/analyzer/lib/src/summary/prelink.dart
+++ b/pkg/analyzer/lib/src/summary/prelink.dart
@@ -477,9 +477,12 @@
}
}
- // Fill in imported names.
+ // Fill in imported and exported names.
List<int> importDependencies =
definingUnit.imports.map(handleImport).toList();
+ List<int> exportDependencies = definingUnit.publicNamespace.exports
+ .map((UnlinkedExportPublic exp) => uriToDependency[exp.uri])
+ .toList();
// Link each compilation unit.
List<LinkedUnitBuilder> linkedUnits = units.map(linkUnit).toList();
@@ -488,6 +491,7 @@
units: linkedUnits,
dependencies: dependencies,
importDependencies: importDependencies,
+ exportDependencies: exportDependencies,
exportNames: exportNames,
numPrelinkedDependencies: dependencies.length);
}
diff --git a/pkg/analyzer/lib/src/summary/summarize_ast.dart b/pkg/analyzer/lib/src/summary/summarize_ast.dart
index f8d96a1..3c4ddb7 100644
--- a/pkg/analyzer/lib/src/summary/summarize_ast.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_ast.dart
@@ -1047,15 +1047,17 @@
@override
void visitForEachStatement(ForEachStatement node) {
DeclaredIdentifier loopVariable = node.loopVariable;
- serializeDeclaredIdentifier(
- node,
- loopVariable.documentationComment,
- loopVariable.metadata,
- loopVariable.isFinal,
- loopVariable.isConst,
- loopVariable.type,
- true,
- loopVariable.identifier);
+ if (loopVariable != null) {
+ serializeDeclaredIdentifier(
+ node,
+ loopVariable.documentationComment,
+ loopVariable.metadata,
+ loopVariable.isFinal,
+ loopVariable.isConst,
+ loopVariable.type,
+ true,
+ loopVariable.identifier);
+ }
super.visitForEachStatement(node);
}
diff --git a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
index 8a6a4e1..6362f01 100644
--- a/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_const_expr.dart
@@ -271,12 +271,12 @@
} else if (expr is AsExpression) {
isValidConst = false;
_serialize(expr.expression);
- _serialize(expr.type.name);
+ references.add(serializeType(expr.type));
operations.add(UnlinkedConstOperation.typeCast);
} else if (expr is IsExpression) {
isValidConst = false;
_serialize(expr.expression);
- _serialize(expr.type.name);
+ references.add(serializeType(expr.type));
operations.add(UnlinkedConstOperation.typeCheck);
} else if (expr is ThrowExpression) {
isValidConst = false;
diff --git a/pkg/analyzer/lib/src/summary/summarize_elements.dart b/pkg/analyzer/lib/src/summary/summarize_elements.dart
index 3315785..bb2a42e 100644
--- a/pkg/analyzer/lib/src/summary/summarize_elements.dart
+++ b/pkg/analyzer/lib/src/summary/summarize_elements.dart
@@ -20,6 +20,7 @@
import 'package:analyzer/src/summary/name_filter.dart';
import 'package:analyzer/src/summary/summarize_const_expr.dart';
import 'package:crypto/crypto.dart';
+import 'package:path/path.dart' as path;
/**
* Serialize all the elements in [lib] to a summary using [ctx] as the context
@@ -156,8 +157,8 @@
void addFallbackUnit(Source source) {
String uri = source.uri.toString();
_unlinkedUnitUris.add(uri);
- _unlinkedUnits
- .add(new UnlinkedUnitBuilder(fallbackModePath: source.fullName));
+ _unlinkedUnits.add(new UnlinkedUnitBuilder(
+ fallbackModePath: path.relative(source.fullName)));
}
void addLinkedLibrary(String uri, LinkedLibraryBuilder library) {
@@ -166,9 +167,13 @@
}
void addUnlinkedUnit(Source source, UnlinkedUnitBuilder unit) {
- _unlinkedUnitUris.add(source.uri.toString());
+ addUnlinkedUnitWithHash(source.uri.toString(), unit, _hash(source.contents.data));
+ }
+
+ void addUnlinkedUnitWithHash(String uri, UnlinkedUnitBuilder unit, String hash) {
+ _unlinkedUnitUris.add(uri);
_unlinkedUnits.add(unit);
- _unlinkedUnitHashes.add(_hash(source.contents.data));
+ _unlinkedUnitHashes.add(hash);
}
/**
@@ -453,7 +458,6 @@
* parameter [type], or return `null` if the type parameter is not in scope.
*/
int findTypeParameterIndex(TypeParameterType type, Element context) {
- Element originalContext = context;
int index = 0;
while (context != null) {
List<TypeParameterElement> typeParameters;
@@ -1488,6 +1492,12 @@
final List<int> linkedImports = <int>[];
/**
+ * The linked portion of the "exports table". This is the list of ints
+ * which should be written to [LinkedLibrary.exports].
+ */
+ final List<int> linkedExports = <int>[];
+
+ /**
* Set of libraries which have been seen so far while visiting the transitive
* closure of exports.
*/
@@ -1594,6 +1604,7 @@
LinkedLibraryBuilder pb = new LinkedLibraryBuilder();
for (ExportElement exportElement in libraryElement.exports) {
addTransitiveExportClosure(exportElement.exportedLibrary);
+ linkedExports.add(serializeDependency(exportElement.exportedLibrary));
}
for (ImportElement importElement in libraryElement.imports) {
addTransitiveExportClosure(importElement.importedLibrary);
@@ -1619,6 +1630,7 @@
compilationUnitSerializer.createLinkedInfo();
}
pb.importDependencies = linkedImports;
+ pb.exportDependencies = linkedExports;
List<String> exportedNames =
libraryElement.exportNamespace.definedNames.keys.toList();
exportedNames.sort();
diff --git a/pkg/analyzer/lib/src/task/dart.dart b/pkg/analyzer/lib/src/task/dart.dart
index 88c44fe..3f80560 100644
--- a/pkg/analyzer/lib/src/task/dart.dart
+++ b/pkg/analyzer/lib/src/task/dart.dart
@@ -2764,6 +2764,7 @@
usedImportedElementsList.forEach(verifier.removeUsedElements);
verifier.generateDuplicateImportHints(errorReporter);
verifier.generateUnusedImportHints(errorReporter);
+ verifier.generateUnusedShownNameHints(errorReporter);
}
// Unused local elements.
{
diff --git a/pkg/analyzer/lib/src/task/dart_work_manager.dart b/pkg/analyzer/lib/src/task/dart_work_manager.dart
index 0122c88..4a81c18 100644
--- a/pkg/analyzer/lib/src/task/dart_work_manager.dart
+++ b/pkg/analyzer/lib/src/task/dart_work_manager.dart
@@ -204,7 +204,7 @@
}
}
List<Source> libraries = partLibrariesMap[part];
- return libraries != null ? libraries : Source.EMPTY_LIST;
+ return libraries?.toList() ?? Source.EMPTY_LIST;
}
@override
diff --git a/pkg/analyzer/test/generated/hint_code_test.dart b/pkg/analyzer/test/generated/hint_code_test.dart
index fa3da21..168c471 100644
--- a/pkg/analyzer/test/generated/hint_code_test.dart
+++ b/pkg/analyzer/test/generated/hint_code_test.dart
@@ -132,6 +132,12 @@
final String reason;
const _Required([this.reason]));
}
+''',
+ 'package:js/js.dart': r'''
+library js;
+class JS {
+ const JS([String js]) { }
+}
'''
});
}
@@ -1241,6 +1247,65 @@
verify([source]);
}
+ void test_js_lib_OK() {
+ Source source = addSource(r'''
+@JS()
+library foo;
+
+import 'package:js/js.dart';
+
+@JS()
+class A { }
+''');
+ computeLibrarySourceErrors(source);
+ assertNoErrors(source);
+ verify([source]);
+ }
+
+ void test_missing_js_lib_on_class_decl() {
+ Source source = addSource(r'''
+library foo;
+
+import 'package:js/js.dart';
+
+@JS()
+class A { }
+''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
+ verify([source]);
+ }
+
+ void test_missing_js_lib_on_function() {
+ Source source = addSource(r'''
+library foo;
+
+import 'package:js/js.dart';
+
+@JS('acxZIndex')
+set _currentZIndex(int value) { }
+''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
+ verify([source]);
+ }
+
+ void test_missing_js_lib_on_member() {
+ Source source = addSource(r'''
+library foo;
+
+import 'package:js/js.dart';
+
+class A {
+ @JS()
+ void a() { }
+}
+''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [HintCode.MISSING_JS_LIB_ANNOTATION]);
+ verify([source]);
+ }
+
void test_missingReturn_async() {
Source source = addSource('''
import 'dart:async';
@@ -2838,6 +2903,82 @@
verify([source, source2]);
}
+ void test_unusedShownName() {
+ Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A, B;
+A a;''');
+ Source source2 = addNamedSource(
+ "/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+ assertNoErrors(source2);
+ verify([source, source2]);
+ }
+
+ void test_unusedShownName_topLevelVariable() {
+ Source source = addSource(r'''
+library L;
+import 'lib1.dart' show var1, var2;
+import 'lib1.dart' show var3, var4;
+int a = var1;
+int b = var2;
+int c = var3;''');
+ Source source2 = addNamedSource(
+ "/lib1.dart",
+ r'''
+library lib1;
+const int var1 = 1;
+const int var2 = 2;
+const int var3 = 3;
+const int var4 = 4;''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+ assertNoErrors(source2);
+ verify([source, source2]);
+ }
+
+ void test_unusedShownName_as() {
+ Source source = addSource(r'''
+library L;
+import 'lib1.dart' as p show A, B;
+p.A a;''');
+ Source source2 = addNamedSource(
+ "/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
+ assertNoErrors(source2);
+ verify([source, source2]);
+ }
+
+ void test_unusedShownName_duplicates() {
+ Source source = addSource(r'''
+library L;
+import 'lib1.dart' show A, B;
+import 'lib1.dart' show C, D;
+A a;
+C c;''');
+ Source source2 = addNamedSource(
+ "/lib1.dart", r'''
+library lib1;
+class A {}
+class B {}
+class C {}
+class D {}''');
+ computeLibrarySourceErrors(source);
+ assertErrors(source, [
+ HintCode.UNUSED_SHOWN_NAME,
+ HintCode.UNUSED_SHOWN_NAME]);
+ assertNoErrors(source2);
+ verify([source, source2]);
+ }
+
void test_unusedLocalVariable_inCatch_exception() {
enableUnusedLocalVariable = true;
Source source = addSource(r'''
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index fd3a422..8b4cd5e 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -167,7 +167,7 @@
class N {}
class N2 {}''');
computeLibrarySourceErrors(source);
- assertNoErrors(source);
+ assertErrors(source, [HintCode.UNUSED_SHOWN_NAME]);
}
void test_annotated_partOfDeclaration() {
diff --git a/pkg/analyzer/test/generated/non_hint_code_test.dart b/pkg/analyzer/test/generated/non_hint_code_test.dart
index 8d9c19d..9fc1dfb 100644
--- a/pkg/analyzer/test/generated/non_hint_code_test.dart
+++ b/pkg/analyzer/test/generated/non_hint_code_test.dart
@@ -1096,6 +1096,30 @@
verify([source]);
}
+ void test_unusedImport_prefix_topLevelFunction2() {
+ Source source = addSource(r'''
+library L;
+import 'lib1.dart' hide topLevelFunction;
+import 'lib1.dart' as one show topLevelFunction;
+import 'lib1.dart' as two show topLevelFunction;
+class A {
+ static void x() {
+ One o;
+ one.topLevelFunction();
+ two.topLevelFunction();
+ }
+}''');
+ addNamedSource(
+ "/lib1.dart",
+ r'''
+library lib1;
+class One {}
+topLevelFunction() {}''');
+ computeLibrarySourceErrors(source);
+ assertNoErrors(source);
+ verify([source]);
+ }
+
void test_useOfVoidResult_implicitReturnValue() {
Source source = addSource(r'''
f() {}
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 1e6878d..c366b84 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -8643,7 +8643,9 @@
expect(expression.keyword, token);
ConstructorName name = expression.constructorName;
expect(name, isNotNull);
- expect(name.type, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
expect(name.period, isNull);
expect(name.name, isNull);
expect(expression.argumentList, isNotNull);
@@ -8656,12 +8658,79 @@
expect(expression.keyword, token);
ConstructorName name = expression.constructorName;
expect(name, isNotNull);
- expect(name.type, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
expect(name.period, isNotNull);
expect(name.name, isNotNull);
expect(expression.argumentList, isNotNull);
}
+ void
+ test_parseInstanceCreationExpression_qualifiedType_named_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression = parse(
+ "parseInstanceCreationExpression", <Object>[token], "A.B/*<E>*/.c()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
+ void
+ test_parseInstanceCreationExpression_qualifiedType_named_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression =
+ parse("parseInstanceCreationExpression", <Object>[token], "A.B<E>.c()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
+ void
+ test_parseInstanceCreationExpression_qualifiedType_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression = parse(
+ "parseInstanceCreationExpression", <Object>[token], "A.B/*<E>*/()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
+ void test_parseInstanceCreationExpression_qualifiedType_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression =
+ parse("parseInstanceCreationExpression", <Object>[token], "A.B<E>()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
void test_parseInstanceCreationExpression_type() {
Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
InstanceCreationExpression expression =
@@ -8669,25 +8738,92 @@
expect(expression.keyword, token);
ConstructorName name = expression.constructorName;
expect(name, isNotNull);
- expect(name.type, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
expect(name.period, isNull);
expect(name.name, isNull);
expect(expression.argumentList, isNotNull);
}
void test_parseInstanceCreationExpression_type_named() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression =
+ parse("parseInstanceCreationExpression", <Object>[token], "A.c()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments, isNull);
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
+ void test_parseInstanceCreationExpression_type_named_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression = parse(
+ "parseInstanceCreationExpression", <Object>[token], "A/*<B>*/.c()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNotNull);
+ expect(name.name, isNotNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
+ void test_parseInstanceCreationExpression_type_named_typeParameters() {
Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
InstanceCreationExpression expression =
parse("parseInstanceCreationExpression", <Object>[token], "A<B>.c()");
expect(expression.keyword, token);
ConstructorName name = expression.constructorName;
expect(name, isNotNull);
- expect(name.type, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
expect(name.period, isNotNull);
expect(name.name, isNotNull);
expect(expression.argumentList, isNotNull);
}
+ void test_parseInstanceCreationExpression_type_typeParameterComment() {
+ enableGenericMethodComments = true;
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression =
+ parse("parseInstanceCreationExpression", <Object>[token], "A/*<B>*/()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
+ void test_parseInstanceCreationExpression_type_typeParameters() {
+ Token token = TokenFactory.tokenFromKeyword(Keyword.NEW);
+ InstanceCreationExpression expression =
+ parse("parseInstanceCreationExpression", <Object>[token], "A<B>()");
+ expect(expression.keyword, token);
+ ConstructorName name = expression.constructorName;
+ expect(name, isNotNull);
+ TypeName type = name.type;
+ expect(type, isNotNull);
+ expect(type.typeArguments.arguments, hasLength(1));
+ expect(name.period, isNull);
+ expect(name.name, isNull);
+ expect(expression.argumentList, isNotNull);
+ }
+
void test_parseLibraryDirective() {
LibraryDirective directive = parse("parseLibraryDirective",
<Object>[emptyCommentAndMetadata()], "library l;");
diff --git a/pkg/analyzer/test/generated/static_type_analyzer_test.dart b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
index dd0d172..0e0e3a1 100644
--- a/pkg/analyzer/test/generated/static_type_analyzer_test.dart
+++ b/pkg/analyzer/test/generated/static_type_analyzer_test.dart
@@ -375,16 +375,42 @@
_listener.assertNoErrors();
}
- void test_visitAssignmentExpression_compound() {
- // i += 1
- InterfaceType numType = _typeProvider.numType;
- SimpleIdentifier identifier = _resolvedVariable(_typeProvider.intType, "i");
- AssignmentExpression node = AstFactory.assignmentExpression(
- identifier, TokenType.PLUS_EQ, _resolvedInteger(1));
- MethodElement plusMethod = getMethod(numType, "+");
- node.staticElement = plusMethod;
- expect(_analyze(node), same(numType));
- _listener.assertNoErrors();
+ void test_visitAssignmentExpression_compound_II() {
+ validate(TokenType operator) {
+ InterfaceType numType = _typeProvider.numType;
+ InterfaceType intType = _typeProvider.intType;
+ SimpleIdentifier identifier = _resolvedVariable(intType, "i");
+ AssignmentExpression node = AstFactory.assignmentExpression(
+ identifier, operator, _resolvedInteger(1));
+ MethodElement plusMethod = getMethod(numType, "+");
+ node.staticElement = plusMethod;
+ expect(_analyze(node), same(intType));
+ _listener.assertNoErrors();
+ }
+ validate(TokenType.MINUS_EQ);
+ validate(TokenType.PERCENT_EQ);
+ validate(TokenType.PLUS_EQ);
+ validate(TokenType.STAR_EQ);
+ validate(TokenType.TILDE_SLASH_EQ);
+ }
+
+ void test_visitAssignmentExpression_compound_plusID() {
+ validate(TokenType operator) {
+ InterfaceType numType = _typeProvider.numType;
+ InterfaceType intType = _typeProvider.intType;
+ InterfaceType doubleType = _typeProvider.doubleType;
+ SimpleIdentifier identifier = _resolvedVariable(intType, "i");
+ AssignmentExpression node = AstFactory.assignmentExpression(
+ identifier, operator, _resolvedDouble(1.0));
+ MethodElement plusMethod = getMethod(numType, "+");
+ node.staticElement = plusMethod;
+ expect(_analyze(node), same(doubleType));
+ _listener.assertNoErrors();
+ }
+ validate(TokenType.MINUS_EQ);
+ validate(TokenType.PERCENT_EQ);
+ validate(TokenType.PLUS_EQ);
+ validate(TokenType.STAR_EQ);
}
void test_visitAssignmentExpression_compoundIfNull_differentTypes() {
diff --git a/pkg/analyzer/test/generated/test_all.dart b/pkg/analyzer/test/generated/test_all.dart
index 4785daf..3536c10 100644
--- a/pkg/analyzer/test/generated/test_all.dart
+++ b/pkg/analyzer/test/generated/test_all.dart
@@ -8,22 +8,31 @@
import '../utils.dart';
import 'all_the_rest_test.dart' as all_the_rest;
+import 'checked_mode_compile_time_error_code_test.dart'
+ as checked_mode_compile_time_error_code_test;
import 'compile_time_error_code_test.dart' as compile_time_error_code_test;
import 'constant_test.dart' as constant_test;
import 'declaration_resolver_test.dart' as declaration_resolver_test;
+import 'element_resolver_test.dart' as element_resolver_test;
import 'engine_test.dart' as engine_test;
import 'error_suppression_test.dart' as error_suppression_test;
+import 'hint_code_test.dart' as hint_code_test;
import 'incremental_resolver_test.dart' as incremental_resolver_test;
import 'incremental_scanner_test.dart' as incremental_scanner_test;
+import 'inheritance_manager_test.dart' as inheritance_manager_test;
import 'java_core_test.dart' as java_core_test;
import 'java_io_test.dart' as java_io_test;
import 'non_error_resolver_test.dart' as non_error_resolver_test;
+import 'non_hint_code_test.dart' as non_hint_code_test;
import 'parser_test.dart' as parser_test;
import 'resolver_test.dart' as resolver_test;
import 'scanner_test.dart' as scanner_test;
+import 'simple_resolver_test.dart' as simple_resolver_test;
import 'source_factory_test.dart' as source_factory_test;
+import 'static_type_analyzer_test.dart' as static_type_analyzer_test;
import 'static_type_warning_code_test.dart' as static_type_warning_code_test;
import 'static_warning_code_test.dart' as static_warning_code_test;
+import 'strong_mode_test.dart' as strong_mode_test;
import 'type_system_test.dart' as type_system_test;
import 'utilities_test.dart' as utilities_test;
@@ -32,22 +41,30 @@
initializeTestEnvironment();
group('generated tests', () {
all_the_rest.main();
+ checked_mode_compile_time_error_code_test.main();
compile_time_error_code_test.main();
constant_test.main();
declaration_resolver_test.main();
+ element_resolver_test.main();
engine_test.main();
error_suppression_test.main();
+ hint_code_test.main();
incremental_resolver_test.main();
incremental_scanner_test.main();
+ inheritance_manager_test.main();
java_core_test.main();
java_io_test.main();
non_error_resolver_test.main();
+ non_hint_code_test.main();
parser_test.main();
resolver_test.main();
scanner_test.main();
+ simple_resolver_test.main();
source_factory_test.main();
+ static_type_analyzer_test.main();
static_type_warning_code_test.main();
static_warning_code_test.main();
+ strong_mode_test.main();
type_system_test.main();
utilities_test.main();
});
diff --git a/pkg/analyzer/test/reflective_tests.dart b/pkg/analyzer/test/reflective_tests.dart
index 820cb16..310e7d0 100644
--- a/pkg/analyzer/test/reflective_tests.dart
+++ b/pkg/analyzer/test/reflective_tests.dart
@@ -11,6 +11,12 @@
import 'package:unittest/unittest.dart';
/**
+ * A marker annotation used to annotate overridden test methods (so we cannot
+ * rename them to `fail_`) which are expected to fail.
+ */
+const _FailingTest failingTest = const _FailingTest();
+
+/**
* A marker annotation used to instruct dart2js to keep reflection information
* for the annotated classes.
*/
@@ -29,7 +35,7 @@
* method invocation.
*
* If [type] declares method `tearDown`, it will be invoked after any test
- * method invocation. If method returns [Future] to test some asyncronous
+ * method invocation. If method returns [Future] to test some asynchronous
* behavior, then `tearDown` will be invoked in `Future.complete`.
*/
void runReflectiveTests(Type type) {
@@ -42,7 +48,8 @@
}
String className = MirrorSystem.getName(classMirror.simpleName);
group(className, () {
- classMirror.instanceMembers.forEach((symbol, memberMirror) {
+ classMirror.instanceMembers
+ .forEach((Symbol symbol, MethodMirror memberMirror) {
// we need only methods
if (memberMirror is! MethodMirror || !memberMirror.isRegularMethod) {
return;
@@ -51,7 +58,11 @@
// test_
if (memberName.startsWith('test_')) {
test(memberName, () {
- return _runTest(classMirror, symbol);
+ if (_hasFailingTestAnnotation(memberMirror)) {
+ return _runFailingTest(classMirror, symbol);
+ } else {
+ return _runTest(classMirror, symbol);
+ }
});
return;
}
@@ -77,6 +88,11 @@
});
}
+bool _hasFailingTestAnnotation(MethodMirror method) {
+ return method.metadata.any((InstanceMirror annotation) =>
+ annotation.type.reflectedType == _FailingTest);
+}
+
Future _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
var invocationResult = null;
InstanceMirror closure;
@@ -120,3 +136,11 @@
class ReflectiveTest {
const ReflectiveTest();
}
+
+/**
+ * A marker annotation used to annotate overridden test methods (so we cannot
+ * rename them to `fail_`) which are expected to fail.
+ */
+class _FailingTest {
+ const _FailingTest();
+}
diff --git a/pkg/analyzer/test/src/context/mock_sdk.dart b/pkg/analyzer/test/src/context/mock_sdk.dart
index a28f4b8..62d0beb 100644
--- a/pkg/analyzer/test/src/context/mock_sdk.dart
+++ b/pkg/analyzer/test/src/context/mock_sdk.dart
@@ -32,6 +32,15 @@
Iterable<Future/*<T>*/> futures) => null;
Future/*<R>*/ then/*<R>*/(/*=R*/ onValue(T value)) => null;
}
+
+abstract class Completer<T> {
+ factory Completer() => new _AsyncCompleter<T>();
+ factory Completer.sync() => new _SyncCompleter<T>();
+ Future<T> get future;
+ void complete([value]);
+ void completeError(Object error, [StackTrace stackTrace]);
+ bool get isCompleted;
+}
''',
const <String, String>{
'/lib/async/stream.dart': r'''
@@ -118,8 +127,8 @@
int operator |(int other);
int operator <<(int other);
int operator >>(int other);
- int operator ~/(int other);
- int operator %(int other);
+ int operator ~/(num other);
+ num operator %(num other);
int operator ~();
int toInt();
double toDouble();
diff --git a/pkg/analyzer/test/src/summary/linker_test.dart b/pkg/analyzer/test/src/summary/linker_test.dart
new file mode 100644
index 0000000..81499ae
--- /dev/null
+++ b/pkg/analyzer/test/src/summary/linker_test.dart
@@ -0,0 +1,400 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/src/summary/format.dart';
+import 'package:analyzer/src/summary/link.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'summarize_ast_test.dart';
+
+main() {
+ groupSep = ' | ';
+ runReflectiveTests(LinkerUnitTest);
+}
+
+@reflectiveTest
+class LinkerUnitTest extends SummaryLinkerTest {
+ Linker linker;
+
+ LinkerInputs linkerInputs;
+ LibraryElementInBuildUnit _testLibrary;
+ @override
+ bool get allowMissingFiles => false;
+
+ LibraryElementInBuildUnit get testLibrary => _testLibrary ??=
+ linker.getLibrary(linkerInputs.testDartUri) as LibraryElementInBuildUnit;
+
+ void createLinker(String text, {String path: '/test.dart'}) {
+ linkerInputs = createLinkerInputs(text, path: path);
+ Map<String, LinkedLibraryBuilder> linkedLibraries =
+ setupForLink(linkerInputs.linkedLibraries, linkerInputs.getUnit);
+ linker = new Linker(linkedLibraries, linkerInputs.getDependency,
+ linkerInputs.getUnit, true);
+ }
+
+ LibraryElementForLink getLibrary(String uri) {
+ return linker.getLibrary(Uri.parse(uri));
+ }
+
+ void test_inferredType_instanceField_dynamic() {
+ createLinker('''
+var x;
+class C {
+ var f = x; // Inferred type: dynamic
+}
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ library.libraryCycleForLink.ensureLinked();
+ ClassElementForLink_Class cls = library.getContainedName('C');
+ expect(cls.fields, hasLength(1));
+ var field = cls.fields[0];
+ expect(field.type.toString(), 'dynamic');
+ }
+
+ void test_inferredType_methodParamType_dynamic() {
+ createLinker('''
+clas B {
+ void f(dynamic x) {}
+}
+class C extends B {
+ f(x) {} // Inferred param type: dynamic
+}
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ library.libraryCycleForLink.ensureLinked();
+ ClassElementForLink_Class cls = library.getContainedName('C');
+ expect(cls.methods, hasLength(1));
+ var method = cls.methods[0];
+ expect(method.parameters, hasLength(1));
+ expect(method.parameters[0].type.toString(), 'dynamic');
+ }
+
+ void test_inferredType_methodReturnType_dynamic() {
+ createLinker('''
+class B {
+ dynamic f() {}
+}
+class C extends B {
+ f() {} // Inferred return type: dynamic
+}
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ library.libraryCycleForLink.ensureLinked();
+ ClassElementForLink_Class cls = library.getContainedName('C');
+ expect(cls.methods, hasLength(1));
+ expect(cls.methods[0].returnType.toString(), 'dynamic');
+ }
+
+ void test_inferredType_staticField_dynamic() {
+ createLinker('''
+dynamic x = null;
+class C {
+ static var y = x;
+}
+''');
+ expect(
+ linker
+ .getLibrary(linkerInputs.testDartUri)
+ .getContainedName('C')
+ .getContainedName('y')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'dynamic');
+ }
+
+ void test_inferredType_topLevelVariable_dynamic() {
+ createLinker('''
+dynamic x = null;
+var y = x;
+''');
+ expect(
+ linker
+ .getLibrary(linkerInputs.testDartUri)
+ .getContainedName('y')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'dynamic');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_dynamic() {
+ var bundle = createPackageBundle(
+ '''
+var x;
+var y = x; // Inferred type: dynamic
+''',
+ path: '/a.dart');
+ addBundle(bundle);
+ createLinker('''
+import 'a.dart';
+var z = y; // Inferred type: dynamic
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ expect(
+ library
+ .getContainedName('z')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'dynamic');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_instanceField() {
+ var bundle = createPackageBundle(
+ '''
+class C {
+ var f = 0; // Inferred type: int
+}
+''',
+ path: '/a.dart');
+ addBundle(bundle);
+ createLinker('''
+import 'a.dart';
+var x = new C().f; // Inferred type: int
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ expect(
+ library
+ .getContainedName('x')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'int');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_methodParamType_viaGeneric() {
+ var bundle = createPackageBundle(
+ '''
+class B {
+ T f<T>(T t) => t;
+}
+class C extends B {
+ f<T>(t) => t; // Inferred param type: T
+}
+''',
+ path: '/a.dart');
+ addBundle(bundle);
+ createLinker('''
+import 'a.dart';
+var x = new C().f(0); // Inferred type: int
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ expect(
+ library
+ .getContainedName('x')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'int');
+ }
+
+ void test_inferredType_methodReturnType_void() {
+ createLinker('''
+class B {
+ void f() {}
+}
+class C extends B {
+ f() {}
+}
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ library.libraryCycleForLink.ensureLinked();
+ ClassElementForLink_Class cls = library.getContainedName('C');
+ expect(cls.methods, hasLength(1));
+ expect(cls.methods[0].returnType.toString(), 'void');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_methodParamType_viaInheritance() {
+ var bundle = createPackageBundle(
+ '''
+class B {
+ void f(int i) {}
+}
+class C extends B {
+ f(i) {} // Inferred param type: int
+}
+''',
+ path: '/a.dart');
+ addBundle(bundle);
+ createLinker('''
+import 'a.dart';
+class D extends C {
+ f(i) {} // Inferred param type: int
+}
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ library.libraryCycleForLink.ensureLinked();
+ ClassElementForLink_Class cls = library.getContainedName('D');
+ expect(cls.methods, hasLength(1));
+ var method = cls.methods[0];
+ expect(method.parameters, hasLength(1));
+ expect(method.parameters[0].type.toString(), 'int');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_methodReturnType_viaCall() {
+ var bundle = createPackageBundle(
+ '''
+class B {
+ int f() => 0;
+}
+class C extends B {
+ f() => 1; // Inferred return type: int
+}
+''',
+ path: '/a.dart');
+ addBundle(bundle);
+ createLinker('''
+import 'a.dart';
+var x = new C().f(); // Inferred type: int
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ expect(
+ library
+ .getContainedName('x')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'int');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_methodReturnType_viaInheritance() {
+ var bundle = createPackageBundle(
+ '''
+class B {
+ int f() => 0;
+}
+class C extends B {
+ f() => 1; // Inferred return type: int
+}
+''',
+ path: '/a.dart');
+ addBundle(bundle);
+ createLinker('''
+import 'a.dart';
+class D extends C {
+ f() => 2; //Inferred return type: int
+}
+''');
+ LibraryElementForLink library = linker.getLibrary(linkerInputs.testDartUri);
+ library.libraryCycleForLink.ensureLinked();
+ ClassElementForLink_Class cls = library.getContainedName('D');
+ expect(cls.methods, hasLength(1));
+ expect(cls.methods[0].returnType.toString(), 'int');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_staticField() {
+ var bundle =
+ createPackageBundle('class C { static var f = 0; }', path: '/a.dart');
+ addBundle(bundle);
+ createLinker('import "a.dart"; var x = C.f;', path: '/b.dart');
+ expect(
+ linker
+ .getLibrary(linkerInputs.testDartUri)
+ .getContainedName('x')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'int');
+ }
+
+ void test_inferredTypeFromOutsideBuildUnit_topLevelVariable() {
+ var bundle = createPackageBundle('var a = 0;', path: '/a.dart');
+ addBundle(bundle);
+ createLinker('import "a.dart"; var b = a;', path: '/b.dart');
+ expect(
+ linker
+ .getLibrary(linkerInputs.testDartUri)
+ .getContainedName('b')
+ .asTypeInferenceNode
+ .inferredType
+ .toString(),
+ 'int');
+ }
+
+ void test_libraryCycle_ignoresDependenciesOutsideBuildUnit() {
+ createLinker('import "dart:async";');
+ LibraryCycleForLink libraryCycle = testLibrary.libraryCycleForLink;
+ expect(libraryCycle.dependencies, isEmpty);
+ expect(libraryCycle.libraries, [testLibrary]);
+ }
+
+ void test_libraryCycle_linkEnsuresDependenciesLinked() {
+ addNamedSource('/a.dart', 'import "b.dart";');
+ addNamedSource('/b.dart', '');
+ addNamedSource('/c.dart', '');
+ createLinker('import "a.dart"; import "c.dart";');
+ LibraryElementForLink libA = getLibrary('file:///a.dart');
+ LibraryElementForLink libB = getLibrary('file:///b.dart');
+ LibraryElementForLink libC = getLibrary('file:///c.dart');
+ expect(libA.libraryCycleForLink.node.isEvaluated, isFalse);
+ expect(libB.libraryCycleForLink.node.isEvaluated, isFalse);
+ expect(libC.libraryCycleForLink.node.isEvaluated, isFalse);
+ libA.libraryCycleForLink.ensureLinked();
+ expect(libA.libraryCycleForLink.node.isEvaluated, isTrue);
+ expect(libB.libraryCycleForLink.node.isEvaluated, isTrue);
+ expect(libC.libraryCycleForLink.node.isEvaluated, isFalse);
+ }
+
+ void test_libraryCycle_nontrivial() {
+ addNamedSource('/a.dart', 'import "b.dart";');
+ addNamedSource('/b.dart', 'import "a.dart";');
+ createLinker('');
+ LibraryElementForLink libA = getLibrary('file:///a.dart');
+ LibraryElementForLink libB = getLibrary('file:///b.dart');
+ LibraryCycleForLink libraryCycle = libA.libraryCycleForLink;
+ expect(libB.libraryCycleForLink, same(libraryCycle));
+ expect(libraryCycle.dependencies, isEmpty);
+ expect(libraryCycle.libraries, unorderedEquals([libA, libB]));
+ }
+
+ void test_libraryCycle_nontrivial_dependencies() {
+ addNamedSource('/a.dart', '');
+ addNamedSource('/b.dart', '');
+ addNamedSource('/c.dart', 'import "a.dart"; import "d.dart";');
+ addNamedSource('/d.dart', 'import "b.dart"; import "c.dart";');
+ createLinker('');
+ LibraryElementForLink libA = getLibrary('file:///a.dart');
+ LibraryElementForLink libB = getLibrary('file:///b.dart');
+ LibraryElementForLink libC = getLibrary('file:///c.dart');
+ LibraryElementForLink libD = getLibrary('file:///d.dart');
+ LibraryCycleForLink libraryCycle = libC.libraryCycleForLink;
+ expect(libD.libraryCycleForLink, same(libraryCycle));
+ expect(libraryCycle.dependencies,
+ unorderedEquals([libA.libraryCycleForLink, libB.libraryCycleForLink]));
+ expect(libraryCycle.libraries, unorderedEquals([libC, libD]));
+ }
+
+ void test_libraryCycle_nontrivial_via_export() {
+ addNamedSource('/a.dart', 'export "b.dart";');
+ addNamedSource('/b.dart', 'export "a.dart";');
+ createLinker('');
+ LibraryElementForLink libA = getLibrary('file:///a.dart');
+ LibraryElementForLink libB = getLibrary('file:///b.dart');
+ LibraryCycleForLink libraryCycle = libA.libraryCycleForLink;
+ expect(libB.libraryCycleForLink, same(libraryCycle));
+ expect(libraryCycle.dependencies, isEmpty);
+ expect(libraryCycle.libraries, unorderedEquals([libA, libB]));
+ }
+
+ void test_libraryCycle_trivial() {
+ createLinker('');
+ LibraryCycleForLink libraryCycle = testLibrary.libraryCycleForLink;
+ expect(libraryCycle.dependencies, isEmpty);
+ expect(libraryCycle.libraries, [testLibrary]);
+ }
+
+ void test_libraryCycle_trivial_dependencies() {
+ addNamedSource('/a.dart', '');
+ addNamedSource('/b.dart', '');
+ createLinker('import "a.dart"; import "b.dart";');
+ LibraryElementForLink libA = getLibrary('file:///a.dart');
+ LibraryElementForLink libB = getLibrary('file:///b.dart');
+ LibraryCycleForLink libraryCycle = testLibrary.libraryCycleForLink;
+ expect(libraryCycle.dependencies,
+ unorderedEquals([libA.libraryCycleForLink, libB.libraryCycleForLink]));
+ expect(libraryCycle.libraries, [testLibrary]);
+ }
+}
diff --git a/pkg/analyzer/test/src/summary/prelinker_test.dart b/pkg/analyzer/test/src/summary/prelinker_test.dart
index b4d4098..f2f1a82 100644
--- a/pkg/analyzer/test/src/summary/prelinker_test.dart
+++ b/pkg/analyzer/test/src/summary/prelinker_test.dart
@@ -49,7 +49,7 @@
String resolveToAbsoluteUri(LibraryElement library, String relativeUri) {
Source resolvedSource =
- analysisContext.sourceFactory.resolveUri(library.source, relativeUri);
+ context.sourceFactory.resolveUri(library.source, relativeUri);
if (resolvedSource == null) {
fail('Failed to resolve relative uri "$relativeUri"');
}
diff --git a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
index 13c09c1..5e2bcd6 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_ast_test.dart
@@ -5,10 +5,15 @@
library analyzer.test.src.summary.resynthesize_ast_test;
import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/generated/engine.dart'
+ show AnalysisContext, AnalysisOptionsImpl;
+import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/summary/format.dart';
import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/link.dart';
import 'package:analyzer/src/summary/prelink.dart';
import 'package:analyzer/src/summary/resynthesize.dart';
import 'package:analyzer/src/summary/summarize_ast.dart';
@@ -18,107 +23,531 @@
import 'package:unittest/unittest.dart';
import '../../reflective_tests.dart';
+import '../context/abstract_context.dart';
+import '../task/strong/inferred_type_test.dart';
import 'resynthesize_test.dart';
+import 'summary_common.dart';
main() {
groupSep = ' | ';
runReflectiveTests(ResynthesizeAstTest);
+ runReflectiveTests(AstInferredTypeTest);
}
@reflectiveTest
-class ResynthesizeAstTest extends ResynthesizeTest {
- final Set<Source> serializedSources = new Set<Source>();
- final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler();
- final Map<Uri, UnlinkedUnitBuilder> uriToUnit = <Uri, UnlinkedUnitBuilder>{};
+class AstInferredTypeTest extends AbstractResynthesizeTest
+ with _AstResynthesizeTestMixin, InferredTypeMixin {
+ bool get checkPropagatedTypes {
+ // AST-based summaries do not yet handle propagated types.
+ // TODO(paulberry): fix this.
+ return false;
+ }
@override
+ bool get skipBrokenAstInference => true;
+
+ @override
+ void addFile(String content, {String name: '/main.dart'}) {
+ addLibrarySource(name, content);
+ }
+
+ @override
+ CompilationUnitElement checkFile(String content) {
+ Source source = addSource('/main.dart', content);
+ SummaryResynthesizer resynthesizer = _encodeLibrary(source);
+ LibraryElementImpl resynthesized = _checkSource(resynthesizer, source);
+ for (Source otherSource in otherLibrarySources) {
+ _checkSource(resynthesizer, otherSource);
+ }
+ return resynthesized.definingCompilationUnit;
+ }
+
+ @override
+ void compareLocalVariableElementLists(ExecutableElement resynthesized,
+ ExecutableElement original, String desc) {
+ // We don't resynthesize local elements during link.
+ // So, we should not compare them.
+ }
+
+ @override
+ DartSdk createDartSdk() => AbstractContextTest.SHARED_STRONG_MOCK_SDK;
+
+ @override
+ AnalysisOptionsImpl createOptions() => new AnalysisOptionsImpl()
+ ..enableGenericMethods = true
+ ..strongMode = true;
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_async_allReturnsAreValues() {
+ super.test_blockBodiedLambdas_async_allReturnsAreValues();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_async_alReturnsAreFutures() {
+ super.test_blockBodiedLambdas_async_alReturnsAreFutures();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_async_mixOfValuesAndFutures() {
+ super.test_blockBodiedLambdas_async_mixOfValuesAndFutures();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_asyncStar() {
+ super.test_blockBodiedLambdas_asyncStar();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_basic_topLevel() {
+ super.test_blockBodiedLambdas_basic_topLevel();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_doesNotInferBottom_async() {
+ super.test_blockBodiedLambdas_doesNotInferBottom_async();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_doesNotInferBottom_asyncStar() {
+ super.test_blockBodiedLambdas_doesNotInferBottom_asyncStar();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_doesNotInferBottom_sync() {
+ super.test_blockBodiedLambdas_doesNotInferBottom_sync();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_doesNotInferBottom_syncStar() {
+ super.test_blockBodiedLambdas_doesNotInferBottom_syncStar();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_downwardsIncompatibleWithUpwardsInference() {
+ super.test_blockBodiedLambdas_downwardsIncompatibleWithUpwardsInference();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_LUB_topLevel() {
+ super.test_blockBodiedLambdas_LUB_topLevel();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_nestedLambdas() {
+ super.test_blockBodiedLambdas_nestedLambdas();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_noReturn() {
+ super.test_blockBodiedLambdas_noReturn();
+ }
+
+ @override
+ @failingTest
+ void test_blockBodiedLambdas_syncStar() {
+ super.test_blockBodiedLambdas_syncStar();
+ }
+
+ @override
+ @failingTest
+ void test_canInferAlsoFromStaticAndInstanceFieldsFlagOn() {
+ super.test_canInferAlsoFromStaticAndInstanceFieldsFlagOn();
+ }
+
+ @override
+ @failingTest
+ void test_downwardsInferenceAnnotations() {
+ super.test_downwardsInferenceAnnotations();
+ }
+
+ @override
+ @failingTest
+ void test_downwardsInferenceAsyncAwait() {
+ super.test_downwardsInferenceAsyncAwait();
+ }
+
+ @override
+ @failingTest
+ void test_downwardsInferenceForEach() {
+ super.test_downwardsInferenceForEach();
+ }
+
+ @override
+ @failingTest
+ void test_downwardsInferenceOnFunctionOfTUsingTheT() {
+ super.test_downwardsInferenceOnFunctionOfTUsingTheT();
+ }
+
+ @override
+ @failingTest
+ void test_downwardsInferenceOnGenericFunctionExpressions() {
+ super.test_downwardsInferenceOnGenericFunctionExpressions();
+ }
+
+ @override
+ @failingTest
+ void test_downwardsInferenceYieldYieldStar() {
+ super.test_downwardsInferenceYieldYieldStar();
+ }
+
+ @override
+ @failingTest
+ void test_genericMethods_inferJSBuiltin() {
+ super.test_genericMethods_inferJSBuiltin();
+ }
+
+ void test_infer_extractIndex_custom() {
+ var unit = checkFile('''
+class A {
+ String operator [](_) => null;
+}
+var a = new A();
+var b = a[0];
+ ''');
+ expect(unit.topLevelVariables[1].type.toString(), 'String');
+ }
+
+ void test_infer_extractIndex_fromList() {
+ var unit = checkFile('''
+var a = <int>[1, 2, 3];
+var b = a[0];
+ ''');
+ expect(unit.topLevelVariables[1].type.toString(), 'int');
+ }
+
+ void test_infer_extractIndex_fromMap() {
+ var unit = checkFile('''
+var a = <int, double>{};
+var b = a[0];
+ ''');
+ expect(unit.topLevelVariables[1].type.toString(), 'double');
+ }
+
+ void test_infer_extractProperty_getter() {
+ checkFile(r'''
+var a = 1.isEven;
+var b = 2.isNaN;
+var c = 3.foo;
+var d = foo.bar;
+ ''');
+ }
+
+ void test_infer_extractProperty_method() {
+ checkFile(r'''
+var a = 1.round;
+ ''');
+ }
+
+ void test_infer_invokeConstructor_factoryRedirected() {
+ checkFile(r'''
+class A {
+ factory A() = B;
+}
+class B implements A {}
+var a = new A();
+ ''');
+ }
+
+ void test_infer_invokeConstructor_named() {
+ checkFile(r'''
+class A {
+ A.aaa();
+}
+class B<K, V> {
+ B.bbb();
+}
+var a = new A.aaa();
+var b1 = new B.bbb();
+var b2 = new B<int, String>.bbb();
+var b3 = new B<List<int>, Map<List<int>, Set<String>>>.bbb();
+ ''');
+ }
+
+ void test_infer_invokeConstructor_named_importedWithPrefix() {
+ addFile(
+ r'''
+class A {
+ A.aaa();
+}
+class B<K, V> {
+ B.bbb();
+}
+''',
+ name: '/a.dart');
+ checkFile(r'''
+import 'a.dart' as p;
+var a = new p.A.aaa();
+var b1 = new p.B.bbb();
+var b2 = new p.B<int, String>.bbb();
+ ''');
+ }
+
+ void test_infer_invokeConstructor_unnamed() {
+ checkFile(r'''
+class A {
+ A();
+}
+class B<T> {
+ B();
+}
+var a = new A();
+var b1 = new B();
+var b2 = new B<int>();
+ ''');
+ }
+
+ void test_infer_invokeConstructor_unnamed_synthetic() {
+ checkFile(r'''
+class A {}
+class B<T> {}
+var a = new A();
+var b1 = new B();
+var b2 = new B<int>();
+ ''');
+ }
+
+ @override
+ @failingTest
+ void test_inferCorrectlyOnMultipleVariablesDeclaredTogether() {
+ super.test_inferCorrectlyOnMultipleVariablesDeclaredTogether();
+ }
+
+ @override
+ @failingTest
+ void test_inferenceInCyclesIsDeterministic() {
+ super.test_inferenceInCyclesIsDeterministic();
+ }
+
+ @override
+ @failingTest
+ void test_inferFromRhsOnlyIfItWontConflictWithOverriddenFields() {
+ super.test_inferFromRhsOnlyIfItWontConflictWithOverriddenFields();
+ }
+
+ @override
+ @failingTest
+ void test_inferTypesOnGenericInstantiations_4() {
+ super.test_inferTypesOnGenericInstantiations_4();
+ }
+
+ @override
+ @failingTest
+ void test_inferTypesOnGenericInstantiations_5() {
+ super.test_inferTypesOnGenericInstantiations_5();
+ }
+
+ @override
+ @failingTest
+ void test_inferTypesOnGenericInstantiationsInLibraryCycle() {
+ super.test_inferTypesOnGenericInstantiationsInLibraryCycle();
+ }
+
+ void test_invokeMethod_notGeneric_genericClass() {
+ var unit = checkFile(r'''
+class C<T> {
+ T m(int a, {String b, T c}) => null;
+}
+var v = new C<double>().m(1, b: 'bbb', c: 2.0);
+ ''');
+ expect(unit.topLevelVariables[0].type.toString(), 'double');
+ }
+
+ void test_invokeMethod_notGeneric_notGenericClass() {
+ var unit = checkFile(r'''
+class C {
+ int m(int a, {String b, int c}) => null;
+}
+var v = new C().m(1, b: 'bbb', c: 2.0);
+ ''');
+ expect(unit.topLevelVariables[0].type.toString(), 'int');
+ }
+
+ @override
+ @failingTest
+ void test_listLiteralsShouldNotInferBottom() {
+ super.test_listLiteralsShouldNotInferBottom();
+ }
+
+ @override
+ @failingTest
+ void test_mapLiteralsShouldNotInferBottom() {
+ super.test_mapLiteralsShouldNotInferBottom();
+ }
+
+ @override
+ @failingTest
+ void test_nullLiteralShouldNotInferAsBottom() {
+ super.test_nullLiteralShouldNotInferAsBottom();
+ }
+
+ LibraryElementImpl _checkSource(
+ SummaryResynthesizer resynthesizer, Source source) {
+ LibraryElementImpl resynthesized =
+ resynthesizer.getLibraryElement(source.uri.toString());
+ LibraryElementImpl original = context.computeLibraryElement(source);
+ checkLibraryElements(original, resynthesized);
+ return resynthesized;
+ }
+}
+
+@reflectiveTest
+class ResynthesizeAstTest extends ResynthesizeTest
+ with _AstResynthesizeTestMixin {
+ @override
bool get checkPropagatedTypes => false;
@override
void checkLibrary(String text,
{bool allowErrors: false, bool dumpSummaries: false}) {
Source source = addTestSource(text);
- SummaryResynthesizer resynthesizer = _encodeLibrary(source);
- LibraryElementImpl resynthesized =
- resynthesizer.getLibraryElement(source.uri.toString());
+ LibraryElementImpl resynthesized = _encodeDecodeLibraryElement(source);
LibraryElementImpl original = context.computeLibraryElement(source);
checkLibraryElements(original, resynthesized);
}
@override
+ DartSdk createDartSdk() => AbstractContextTest.SHARED_MOCK_SDK;
+
+ @override
TestSummaryResynthesizer encodeDecodeLibrarySource(Source source) {
return _encodeLibrary(source);
}
@override
- void test_const_invokeConstructor_named() {
- // TODO(scheglov) fix me
+ @failingTest
+ void test_constructor_initializers_field_notConst() {
+ super.test_constructor_initializers_field_notConst();
}
@override
- void test_constructor_withCycles_const() {
- // TODO(scheglov) fix me
- }
-
- @override
+ @failingTest
void test_inferred_function_type_in_generic_class_constructor() {
- // TODO(scheglov) fix me
+ super.test_inferred_function_type_in_generic_class_constructor();
}
@override
+ @failingTest
void test_metadata_constructor_call_named() {
- // TODO(scheglov) fix me
+ super.test_metadata_constructor_call_named();
}
@override
+ @failingTest
void test_metadata_constructor_call_named_prefixed() {
- // TODO(scheglov) fix me
+ super.test_metadata_constructor_call_named_prefixed();
}
@override
+ @failingTest
void test_metadata_constructor_call_unnamed() {
- // TODO(scheglov) fix me
+ super.test_metadata_constructor_call_unnamed();
}
@override
+ @failingTest
void test_metadata_constructor_call_with_args() {
- // TODO(scheglov) fix me
+ super.test_metadata_constructor_call_with_args();
}
@override
+ @failingTest
void test_type_reference_to_import_part_in_subdir() {
- // TODO(scheglov) fix me
+ super.test_type_reference_to_import_part_in_subdir();
}
+}
- @override
- void test_unused_type_parameter() {
- // TODO(paulberry): fix.
+/**
+ * Abstract mixin for serializing ASTs and resynthesizing elements from it.
+ */
+abstract class _AstResynthesizeTestMixin {
+ final Set<Source> serializedSources = new Set<Source>();
+ final PackageBundleAssembler bundleAssembler = new PackageBundleAssembler();
+ final Map<String, UnlinkedUnitBuilder> uriToUnit =
+ <String, UnlinkedUnitBuilder>{};
+
+ AnalysisContext get context;
+
+ LibraryElementImpl _encodeDecodeLibraryElement(Source source) {
+ SummaryResynthesizer resynthesizer = _encodeLibrary(source);
+ return resynthesizer.getLibraryElement(source.uri.toString());
}
TestSummaryResynthesizer _encodeLibrary(Source source) {
- addLibrary('dart:core');
_serializeLibrary(source);
PackageBundle bundle =
new PackageBundle.fromBuffer(bundleAssembler.assemble().toBuffer());
Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{};
- Map<String, LinkedLibrary> linkedSummaries = <String, LinkedLibrary>{};
for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
String uri = bundle.unlinkedUnitUris[i];
unlinkedSummaries[uri] = bundle.unlinkedUnits[i];
}
- for (int i = 0; i < bundle.linkedLibraryUris.length; i++) {
- String uri = bundle.linkedLibraryUris[i];
- linkedSummaries[uri] = bundle.linkedLibraries[i];
+
+ LinkedLibrary getDependency(String absoluteUri) {
+ Map<String, LinkedLibrary> sdkLibraries =
+ SerializedMockSdk.instance.uriToLinkedLibrary;
+ LinkedLibrary linkedLibrary = sdkLibraries[absoluteUri];
+ if (linkedLibrary == null) {
+ fail('Linker unexpectedly requested LinkedLibrary for "$absoluteUri".'
+ ' Libraries available: ${sdkLibraries.keys}');
+ }
+ return linkedLibrary;
}
+ UnlinkedUnit getUnit(String absoluteUri) {
+ UnlinkedUnit unit = uriToUnit[absoluteUri] ??
+ SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri];
+ if (unit == null) {
+ fail('Linker unexpectedly requested unit for "$absoluteUri".');
+ }
+ return unit;
+ }
+
+ Set<String> nonSdkLibraryUris = context.sources
+ .where((Source source) =>
+ !source.isInSystemLibrary &&
+ context.computeKindOf(source) == SourceKind.LIBRARY)
+ .map((Source source) => source.uri.toString())
+ .toSet();
+
+ Map<String, LinkedLibrary> linkedSummaries = link(nonSdkLibraryUris,
+ getDependency, getUnit, context.analysisOptions.strongMode);
+
return new TestSummaryResynthesizer(
- null, context, unlinkedSummaries, linkedSummaries);
+ null,
+ context,
+ new Map<String, UnlinkedUnit>()
+ ..addAll(SerializedMockSdk.instance.uriToUnlinkedUnit)
+ ..addAll(unlinkedSummaries),
+ new Map<String, LinkedLibrary>()
+ ..addAll(SerializedMockSdk.instance.uriToLinkedLibrary)
+ ..addAll(linkedSummaries));
}
- UnlinkedUnitBuilder _getUnlinkedUnit(Source source) {
- return uriToUnit.putIfAbsent(source.uri, () {
+ UnlinkedUnit _getUnlinkedUnit(Source source) {
+ String uriStr = source.uri.toString();
+ {
+ UnlinkedUnit unlinkedUnitInSdk =
+ SerializedMockSdk.instance.uriToUnlinkedUnit[uriStr];
+ if (unlinkedUnitInSdk != null) {
+ return unlinkedUnitInSdk;
+ }
+ }
+ return uriToUnit.putIfAbsent(uriStr, () {
CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
bundleAssembler.addUnlinkedUnit(source, unlinkedUnit);
@@ -127,6 +556,9 @@
}
void _serializeLibrary(Source librarySource) {
+ if (librarySource.isInSystemLibrary) {
+ return;
+ }
if (!serializedSources.add(librarySource)) {
return;
}
@@ -141,7 +573,7 @@
return resolvedSource;
}
- UnlinkedUnitBuilder getPart(String relativeUri) {
+ UnlinkedUnit getPart(String relativeUri) {
return _getUnlinkedUnit(resolveRelativeUri(relativeUri));
}
@@ -149,11 +581,9 @@
return getPart(relativeUri).publicNamespace;
}
- UnlinkedUnitBuilder definingUnit = _getUnlinkedUnit(librarySource);
+ UnlinkedUnit definingUnit = _getUnlinkedUnit(librarySource);
LinkedLibraryBuilder linkedLibrary =
prelink(definingUnit, getPart, getImport);
- bundleAssembler.addLinkedLibrary(
- librarySource.uri.toString(), linkedLibrary);
linkedLibrary.dependencies.skip(1).forEach((LinkedDependency d) {
_serializeLibrary(resolveRelativeUri(d.uri));
});
diff --git a/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart b/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart
index c52b604..d337de7 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_strong_test.dart
@@ -19,6 +19,7 @@
@reflectiveTest
class ResynthesizeStrongTest extends ResynthesizeElementTest {
+ @override
DartSdk createDartSdk() => AbstractContextTest.SHARED_STRONG_MOCK_SDK;
@override
diff --git a/pkg/analyzer/test/src/summary/resynthesize_test.dart b/pkg/analyzer/test/src/summary/resynthesize_test.dart
index aa938d7..5b4f8ed 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_test.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_test.dart
@@ -38,125 +38,33 @@
runReflectiveTests(ResynthesizeElementTest);
}
-@reflectiveTest
-class ResynthesizeElementTest extends ResynthesizeTest {
- @override
- void checkLibrary(String text,
- {bool allowErrors: false, bool dumpSummaries: false}) {
- Source source = addTestSource(text);
- LibraryElementImpl original = context.computeLibraryElement(source);
- LibraryElementImpl resynthesized = resynthesizeLibraryElement(
- encodeLibrary(original,
- allowErrors: allowErrors, dumpSummaries: dumpSummaries),
- source.uri.toString(),
- original);
- checkLibraryElements(original, resynthesized);
- }
-
- @override
- SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource) {
- LibraryElement libraryElement =
- context.computeLibraryElement(librarySource);
- return encodeLibrary(libraryElement);
- }
-
- /**
- * Serialize the given [library] into a summary. Then create a
- * [TestSummaryResynthesizer] which can deserialize it, along with any
- * references it makes to `dart:core`.
- *
- * Errors will lead to a test failure unless [allowErrors] is `true`.
- */
- TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library,
- {bool allowErrors: false, bool dumpSummaries: false}) {
- if (!allowErrors) {
- assertNoErrors(library.source);
- }
- addLibrary('dart:core');
- addLibrary('dart:async');
- addLibrary('dart:math');
- return encodeLibraryElement(library, dumpSummaries: dumpSummaries);
- }
-
- /**
- * Convert the library element [library] into a summary, and then create a
- * [TestSummaryResynthesizer] which can deserialize it.
- *
- * Caller is responsible for checking the library for errors, and adding any
- * dependent libraries using [addLibrary].
- */
- TestSummaryResynthesizer encodeLibraryElement(LibraryElementImpl library,
- {bool dumpSummaries: false}) {
- Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{};
- LinkedLibrary getLinkedSummaryFor(LibraryElement lib) {
- LibrarySerializationResult serialized = serializeLibrary(
- lib, context.typeProvider, context.analysisOptions.strongMode);
- for (int i = 0; i < serialized.unlinkedUnits.length; i++) {
- unlinkedSummaries[serialized.unitUris[i]] =
- new UnlinkedUnit.fromBuffer(serialized.unlinkedUnits[i].toBuffer());
- }
- return new LinkedLibrary.fromBuffer(serialized.linked.toBuffer());
- }
- Map<String, LinkedLibrary> linkedSummaries = <String, LinkedLibrary>{
- library.source.uri.toString(): getLinkedSummaryFor(library)
- };
- for (Source source in otherLibrarySources) {
- LibraryElement original = context.computeLibraryElement(source);
- String uri = source.uri.toString();
- linkedSummaries[uri] = getLinkedSummaryFor(original);
- }
- if (dumpSummaries) {
- unlinkedSummaries.forEach((String path, UnlinkedUnit unit) {
- print('Unlinked $path: ${JSON.encode(canonicalize(unit))}');
- });
- linkedSummaries.forEach((String path, LinkedLibrary lib) {
- print('Linked $path: ${JSON.encode(canonicalize(lib))}');
- });
- }
- return new TestSummaryResynthesizer(
- null, context, unlinkedSummaries, linkedSummaries);
- }
-
- /**
- * Resynthesize the library element associated with [uri] using
- * [resynthesizer], and verify that it only had to consult one summary in
- * order to do so. [original] is consulted merely to verify that no
- * unnecessary resynthesis work was performed.
- */
- LibraryElementImpl resynthesizeLibraryElement(
- TestSummaryResynthesizer resynthesizer,
- String uri,
- LibraryElement original) {
- LibraryElementImpl resynthesized = resynthesizer.getLibraryElement(uri);
- checkMinimalResynthesisWork(resynthesizer, original);
- return resynthesized;
- }
-
- test_core() {
- addLibrary('dart:async');
- addLibrary('dart:math');
- String uri = 'dart:core';
- LibraryElementImpl original =
- context.computeLibraryElement(context.sourceFactory.forUri(uri));
- LibraryElementImpl resynthesized = resynthesizeLibraryElement(
- encodeLibraryElement(original), uri, original);
- checkLibraryElements(original, resynthesized);
- }
-}
-
-@reflectiveTest
-abstract class ResynthesizeTest extends AbstractSingleUnitTest {
+/**
+ * Abstract base class for resynthesizing and comparing elements.
+ */
+abstract class AbstractResynthesizeTest extends AbstractSingleUnitTest {
Set<Source> otherLibrarySources = new Set<Source>();
bool constantInitializersAreInvalid = false;
bool get checkPropagatedTypes => true;
+ /**
+ * Derived classes can override this getter to return `true` in order to
+ * cause certain checks to be skipped if they are known to fail with
+ * AST-based type inference.
+ *
+ * TODO(paulberry): remove this flag once AST-based type inference is fully
+ * working.
+ */
+ bool get skipBrokenAstInference => false;
+
void addLibrary(String uri) {
otherLibrarySources.add(context.sourceFactory.forUri(uri));
}
- void addLibrarySource(String filePath, String contents) {
- otherLibrarySources.add(addSource(filePath, contents));
+ Source addLibrarySource(String filePath, String contents) {
+ Source source = addSource(filePath, contents);
+ otherLibrarySources.add(source);
+ return source;
}
void assertNoErrors(Source source) {
@@ -189,9 +97,6 @@
}
}
- void checkLibrary(String text,
- {bool allowErrors: false, bool dumpSummaries: false});
-
void checkLibraryElements(
LibraryElementImpl original, LibraryElementImpl resynthesized) {
compareElements(resynthesized, original, '(library)');
@@ -818,13 +723,7 @@
}
}
if (original is! Member) {
- List<LocalVariableElement> rVariables = resynthesized.localVariables;
- List<LocalVariableElement> oVariables = original.localVariables;
- expect(rVariables, hasLength(oVariables.length));
- for (int i = 0; i < oVariables.length; i++) {
- compareVariableElements(rVariables[i], oVariables[i],
- '$desc local variable ${oVariables[i].name}');
- }
+ compareLocalVariableElementLists(resynthesized, original, desc);
}
}
@@ -903,6 +802,17 @@
compareElements(resynthesized, original, desc);
}
+ void compareLocalVariableElementLists(ExecutableElement resynthesized,
+ ExecutableElement original, String desc) {
+ List<LocalVariableElement> rVariables = resynthesized.localVariables;
+ List<LocalVariableElement> oVariables = original.localVariables;
+ expect(rVariables, hasLength(oVariables.length));
+ for (int i = 0; i < oVariables.length; i++) {
+ compareVariableElements(rVariables[i], oVariables[i],
+ '$desc local variable ${oVariables[i].name}');
+ }
+ }
+
void compareMetadata(List<ElementAnnotation> resynthesized,
List<ElementAnnotation> original, String desc) {
expect(resynthesized, hasLength(original.length), reason: desc);
@@ -1159,8 +1069,10 @@
VariableElementImpl resynthesizedActual =
getActualElement(resynthesized, desc);
VariableElementImpl originalActual = getActualElement(original, desc);
- compareFunctionElements(resynthesizedActual.initializer,
- originalActual.initializer, '$desc initializer');
+ if (!skipBrokenAstInference) {
+ compareFunctionElements(resynthesizedActual.initializer,
+ originalActual.initializer, '$desc initializer');
+ }
if (originalActual is ConstVariableElement) {
Element oEnclosing = original.enclosingElement;
if (oEnclosing is ClassElement && oEnclosing.isEnum) {
@@ -1189,12 +1101,6 @@
new AnalysisOptionsImpl()..enableGenericMethods = true;
/**
- * Return a [SummaryResynthesizer] to resynthesize the library with the
- * given [librarySource].
- */
- SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource);
-
- /**
* Serialize the given [library] into a summary. Then create a
* [TestSummaryResynthesizer] which can deserialize it, along with any
* references it makes to `dart:core`.
@@ -1251,10 +1157,6 @@
null, context, unlinkedSummaries, linkedSummaries);
}
- fail_library_hasExtUri() {
- checkLibrary('import "dart-ext:doesNotExist.dart";');
- }
-
ElementImpl getActualElement(Element element, String desc) {
if (element == null) {
return null;
@@ -1300,6 +1202,134 @@
prepareAnalysisContext(createOptions());
}
+ void _assertUnresolvedIdentifier(Expression initializer, String desc) {
+ expect(initializer, new isInstanceOf<SimpleIdentifier>(), reason: desc);
+ SimpleIdentifier identifier = initializer;
+ expect(identifier.staticElement, isNull, reason: desc);
+ }
+}
+
+@reflectiveTest
+class ResynthesizeElementTest extends ResynthesizeTest {
+ @override
+ void checkLibrary(String text,
+ {bool allowErrors: false, bool dumpSummaries: false}) {
+ Source source = addTestSource(text);
+ LibraryElementImpl original = context.computeLibraryElement(source);
+ LibraryElementImpl resynthesized = resynthesizeLibraryElement(
+ encodeLibrary(original,
+ allowErrors: allowErrors, dumpSummaries: dumpSummaries),
+ source.uri.toString(),
+ original);
+ checkLibraryElements(original, resynthesized);
+ }
+
+ @override
+ SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource) {
+ LibraryElement libraryElement =
+ context.computeLibraryElement(librarySource);
+ return encodeLibrary(libraryElement);
+ }
+
+ /**
+ * Serialize the given [library] into a summary. Then create a
+ * [TestSummaryResynthesizer] which can deserialize it, along with any
+ * references it makes to `dart:core`.
+ *
+ * Errors will lead to a test failure unless [allowErrors] is `true`.
+ */
+ TestSummaryResynthesizer encodeLibrary(LibraryElementImpl library,
+ {bool allowErrors: false, bool dumpSummaries: false}) {
+ if (!allowErrors) {
+ assertNoErrors(library.source);
+ }
+ addLibrary('dart:core');
+ addLibrary('dart:async');
+ addLibrary('dart:math');
+ return encodeLibraryElement(library, dumpSummaries: dumpSummaries);
+ }
+
+ /**
+ * Convert the library element [library] into a summary, and then create a
+ * [TestSummaryResynthesizer] which can deserialize it.
+ *
+ * Caller is responsible for checking the library for errors, and adding any
+ * dependent libraries using [addLibrary].
+ */
+ TestSummaryResynthesizer encodeLibraryElement(LibraryElementImpl library,
+ {bool dumpSummaries: false}) {
+ Map<String, UnlinkedUnit> unlinkedSummaries = <String, UnlinkedUnit>{};
+ LinkedLibrary getLinkedSummaryFor(LibraryElement lib) {
+ LibrarySerializationResult serialized = serializeLibrary(
+ lib, context.typeProvider, context.analysisOptions.strongMode);
+ for (int i = 0; i < serialized.unlinkedUnits.length; i++) {
+ unlinkedSummaries[serialized.unitUris[i]] =
+ new UnlinkedUnit.fromBuffer(serialized.unlinkedUnits[i].toBuffer());
+ }
+ return new LinkedLibrary.fromBuffer(serialized.linked.toBuffer());
+ }
+ Map<String, LinkedLibrary> linkedSummaries = <String, LinkedLibrary>{
+ library.source.uri.toString(): getLinkedSummaryFor(library)
+ };
+ for (Source source in otherLibrarySources) {
+ LibraryElement original = context.computeLibraryElement(source);
+ String uri = source.uri.toString();
+ linkedSummaries[uri] = getLinkedSummaryFor(original);
+ }
+ if (dumpSummaries) {
+ unlinkedSummaries.forEach((String path, UnlinkedUnit unit) {
+ print('Unlinked $path: ${JSON.encode(canonicalize(unit))}');
+ });
+ linkedSummaries.forEach((String path, LinkedLibrary lib) {
+ print('Linked $path: ${JSON.encode(canonicalize(lib))}');
+ });
+ }
+ return new TestSummaryResynthesizer(
+ null, context, unlinkedSummaries, linkedSummaries);
+ }
+
+ /**
+ * Resynthesize the library element associated with [uri] using
+ * [resynthesizer], and verify that it only had to consult one summary in
+ * order to do so. [original] is consulted merely to verify that no
+ * unnecessary resynthesis work was performed.
+ */
+ LibraryElementImpl resynthesizeLibraryElement(
+ TestSummaryResynthesizer resynthesizer,
+ String uri,
+ LibraryElement original) {
+ LibraryElementImpl resynthesized = resynthesizer.getLibraryElement(uri);
+ checkMinimalResynthesisWork(resynthesizer, original);
+ return resynthesized;
+ }
+
+ test_core() {
+ addLibrary('dart:async');
+ addLibrary('dart:math');
+ String uri = 'dart:core';
+ LibraryElementImpl original =
+ context.computeLibraryElement(context.sourceFactory.forUri(uri));
+ LibraryElementImpl resynthesized = resynthesizeLibraryElement(
+ encodeLibraryElement(original), uri, original);
+ checkLibraryElements(original, resynthesized);
+ }
+}
+
+@reflectiveTest
+abstract class ResynthesizeTest extends AbstractResynthesizeTest {
+ void checkLibrary(String text,
+ {bool allowErrors: false, bool dumpSummaries: false});
+
+ /**
+ * Return a [SummaryResynthesizer] to resynthesize the library with the
+ * given [librarySource].
+ */
+ SummaryResynthesizer encodeDecodeLibrarySource(Source librarySource);
+
+ fail_library_hasExtUri() {
+ checkLibrary('import "dart-ext:doesNotExist.dart";');
+ }
+
test_class_abstract() {
checkLibrary('abstract class C {}');
}
@@ -3005,8 +3035,9 @@
test_getElement_constructor_named() {
String text = 'class C { C.named(); }';
+ Source source = addLibrarySource('/test.dart', text);
ConstructorElement original = context
- .computeLibraryElement(addTestSource(text))
+ .computeLibraryElement(source)
.getType('C')
.getNamedConstructor('named');
expect(original, isNotNull);
@@ -3016,10 +3047,9 @@
test_getElement_constructor_unnamed() {
String text = 'class C { C(); }';
- ConstructorElement original = context
- .computeLibraryElement(addTestSource(text))
- .getType('C')
- .unnamedConstructor;
+ Source source = addLibrarySource('/test.dart', text);
+ ConstructorElement original =
+ context.computeLibraryElement(source).getType('C').unnamedConstructor;
expect(original, isNotNull);
ConstructorElement resynthesized = validateGetElement(text, original);
compareConstructorElements(resynthesized, original, 'C.constructor');
@@ -3027,10 +3057,9 @@
test_getElement_field() {
String text = 'class C { var f; }';
- FieldElement original = context
- .computeLibraryElement(addTestSource(text))
- .getType('C')
- .getField('f');
+ Source source = addLibrarySource('/test.dart', text);
+ FieldElement original =
+ context.computeLibraryElement(source).getType('C').getField('f');
expect(original, isNotNull);
FieldElement resynthesized = validateGetElement(text, original);
compareFieldElements(resynthesized, original, 'C.field f');
@@ -3038,10 +3067,9 @@
test_getElement_getter() {
String text = 'class C { get f => null; }';
- PropertyAccessorElement original = context
- .computeLibraryElement(addTestSource(text))
- .getType('C')
- .getGetter('f');
+ Source source = addLibrarySource('/test.dart', text);
+ PropertyAccessorElement original =
+ context.computeLibraryElement(source).getType('C').getGetter('f');
expect(original, isNotNull);
PropertyAccessorElement resynthesized = validateGetElement(text, original);
comparePropertyAccessorElements(resynthesized, original, 'C.getter f');
@@ -3049,10 +3077,9 @@
test_getElement_method() {
String text = 'class C { f() {} }';
- MethodElement original = context
- .computeLibraryElement(addTestSource(text))
- .getType('C')
- .getMethod('f');
+ Source source = addLibrarySource('/test.dart', text);
+ MethodElement original =
+ context.computeLibraryElement(source).getType('C').getMethod('f');
expect(original, isNotNull);
MethodElement resynthesized = validateGetElement(text, original);
compareMethodElements(resynthesized, original, 'C.method f');
@@ -3060,10 +3087,9 @@
test_getElement_operator() {
String text = 'class C { operator+(x) => null; }';
- MethodElement original = context
- .computeLibraryElement(addTestSource(text))
- .getType('C')
- .getMethod('+');
+ Source source = addLibrarySource('/test.dart', text);
+ MethodElement original =
+ context.computeLibraryElement(source).getType('C').getMethod('+');
expect(original, isNotNull);
MethodElement resynthesized = validateGetElement(text, original);
compareMethodElements(resynthesized, original, 'C.operator+');
@@ -3071,10 +3097,9 @@
test_getElement_setter() {
String text = 'class C { void set f(value) {} }';
- PropertyAccessorElement original = context
- .computeLibraryElement(addTestSource(text))
- .getType('C')
- .getSetter('f');
+ Source source = addLibrarySource('/test.dart', text);
+ PropertyAccessorElement original =
+ context.computeLibraryElement(source).getType('C').getSetter('f');
expect(original, isNotNull);
PropertyAccessorElement resynthesized = validateGetElement(text, original);
comparePropertyAccessorElements(resynthesized, original, 'C.setter f');
@@ -3082,7 +3107,7 @@
test_getElement_unit() {
String text = 'class C { f() {} }';
- Source source = addTestSource(text);
+ Source source = addLibrarySource('/test.dart', text);
CompilationUnitElement original =
context.computeLibraryElement(source).definingCompilationUnit;
expect(original, isNotNull);
@@ -3142,7 +3167,11 @@
test_import_show() {
addLibrary('dart:async');
- checkLibrary('import "dart:async" show Future, Stream; Future f;');
+ checkLibrary('''
+import "dart:async" show Future, Stream;
+Future f;
+Stream s;
+''');
}
test_imports() {
@@ -4252,12 +4281,6 @@
expect(result.location, location);
return result;
}
-
- void _assertUnresolvedIdentifier(Expression initializer, String desc) {
- expect(initializer, new isInstanceOf<SimpleIdentifier>(), reason: desc);
- SimpleIdentifier identifier = initializer;
- expect(identifier.staticElement, isNull, reason: desc);
- }
}
class TestSummaryResynthesizer extends SummaryResynthesizer {
diff --git a/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart b/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart
index 1858f8f..13f10ce 100644
--- a/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_ast_strong_test.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-library analyzer.test.src.summary.summarize_ast_test;
+library analyzer.test.src.summary.summarize_ast_strong_test;
import 'package:unittest/unittest.dart';
@@ -23,132 +23,152 @@
bool get strongMode => true;
@override
+ @failingTest
test_bottom_reference_shared() {
- // TODO(paulberry): fix.
+ super.test_bottom_reference_shared();
}
@override
+ @failingTest
test_closure_executable_with_imported_return_type() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_imported_return_type();
}
@override
+ @failingTest
test_closure_executable_with_return_type_from_closure() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_return_type_from_closure();
}
@override
+ @failingTest
test_closure_executable_with_unimported_return_type() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_unimported_return_type();
}
@override
+ @failingTest
test_field_propagated_type_final_immediate() {
- // TODO(paulberry): fix.
+ super.test_field_propagated_type_final_immediate();
}
@override
+ @failingTest
test_fully_linked_references_follow_other_references() {
- // TODO(paulberry): fix.
+ super.test_fully_linked_references_follow_other_references();
}
@override
+ @failingTest
test_implicit_dependencies_follow_other_dependencies() {
- // TODO(paulberry): fix.
+ super.test_implicit_dependencies_follow_other_dependencies();
}
@override
+ @failingTest
test_initializer_executable_with_bottom_return_type() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_bottom_return_type();
}
@override
+ @failingTest
test_initializer_executable_with_imported_return_type() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_imported_return_type();
}
@override
+ @failingTest
test_initializer_executable_with_return_type_from_closure() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_return_type_from_closure();
}
@override
+ @failingTest
test_initializer_executable_with_return_type_from_closure_field() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_return_type_from_closure_field();
}
@override
+ @failingTest
test_initializer_executable_with_return_type_from_closure_local() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_return_type_from_closure_local();
}
@override
+ @failingTest
test_initializer_executable_with_unimported_return_type() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_unimported_return_type();
}
@override
+ @failingTest
test_linked_reference_reuse() {
- // TODO(paulberry): fix.
+ super.test_linked_reference_reuse();
}
@override
+ @failingTest
test_linked_type_dependency_reuse() {
- // TODO(paulberry): fix.
+ super.test_linked_type_dependency_reuse();
}
@override
+ @failingTest
test_syntheticFunctionType_genericClosure() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_genericClosure();
}
@override
+ @failingTest
test_syntheticFunctionType_genericClosure_inGenericFunction() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_genericClosure_inGenericFunction();
}
@override
+ @failingTest
test_syntheticFunctionType_inGenericClass() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_inGenericClass();
}
@override
+ @failingTest
test_syntheticFunctionType_inGenericFunction() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_inGenericFunction();
}
@override
+ @failingTest
test_syntheticFunctionType_noArguments() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_noArguments();
}
@override
+ @failingTest
test_syntheticFunctionType_withArguments() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_withArguments();
}
@override
+ @failingTest
test_unused_type_parameter() {
- // TODO(paulberry): fix.
+ super.test_unused_type_parameter();
}
@override
- test_variable_inferred_type_implicit_initialized() {
- // TODO(paulberry): fix.
- }
-
- @override
+ @failingTest
test_variable_propagated_type_final_immediate() {
- // TODO(paulberry): fix.
+ super.test_variable_propagated_type_final_immediate();
}
@override
+ @failingTest
test_variable_propagated_type_new_reference() {
- // TODO(paulberry): fix.
+ super.test_variable_propagated_type_new_reference();
}
@override
+ @failingTest
test_variable_propagated_type_omit_dynamic() {
- // TODO(paulberry): fix.
+ super.test_variable_propagated_type_omit_dynamic();
}
}
diff --git a/pkg/analyzer/test/src/summary/summarize_ast_test.dart b/pkg/analyzer/test/src/summary/summarize_ast_test.dart
index a1690c5..60b30a8 100644
--- a/pkg/analyzer/test/src/summary/summarize_ast_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_ast_test.dart
@@ -11,9 +11,12 @@
import 'package:analyzer/src/dart/scanner/scanner.dart';
import 'package:analyzer/src/generated/error.dart';
import 'package:analyzer/src/generated/parser.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analyzer/src/summary/format.dart';
import 'package:analyzer/src/summary/idl.dart';
import 'package:analyzer/src/summary/link.dart';
import 'package:analyzer/src/summary/summarize_ast.dart';
+import 'package:analyzer/src/summary/summarize_elements.dart';
import 'package:unittest/unittest.dart';
import '../../reflective_tests.dart';
@@ -30,123 +33,147 @@
bool get strongMode => false;
@override
+ @failingTest
test_bottom_reference_shared() {
- // TODO(paulberry): fix.
+ super.test_bottom_reference_shared();
}
@override
+ @failingTest
test_closure_executable_with_bottom_return_type() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_bottom_return_type();
}
@override
+ @failingTest
test_closure_executable_with_imported_return_type() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_imported_return_type();
}
@override
+ @failingTest
test_closure_executable_with_return_type_from_closure() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_return_type_from_closure();
}
@override
+ @failingTest
test_closure_executable_with_unimported_return_type() {
- // TODO(paulberry): fix.
+ super.test_closure_executable_with_unimported_return_type();
}
@override
+ @failingTest
test_field_propagated_type_final_immediate() {
- // TODO(paulberry): fix.
+ super.test_field_propagated_type_final_immediate();
}
@override
+ @failingTest
test_fully_linked_references_follow_other_references() {
- // TODO(paulberry): fix.
+ super.test_fully_linked_references_follow_other_references();
}
@override
+ @failingTest
test_implicit_dependencies_follow_other_dependencies() {
- // TODO(paulberry): fix.
+ super.test_implicit_dependencies_follow_other_dependencies();
}
@override
+ @failingTest
test_initializer_executable_with_bottom_return_type() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_bottom_return_type();
}
@override
+ @failingTest
test_initializer_executable_with_imported_return_type() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_imported_return_type();
}
@override
+ @failingTest
test_initializer_executable_with_return_type_from_closure() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_return_type_from_closure();
}
@override
+ @failingTest
test_initializer_executable_with_return_type_from_closure_field() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_return_type_from_closure_field();
}
@override
+ @failingTest
test_initializer_executable_with_return_type_from_closure_local() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_return_type_from_closure_local();
}
@override
+ @failingTest
test_initializer_executable_with_unimported_return_type() {
- // TODO(paulberry): fix.
+ super.test_initializer_executable_with_unimported_return_type();
}
@override
+ @failingTest
test_linked_reference_reuse() {
- // TODO(paulberry): fix.
+ super.test_linked_reference_reuse();
}
@override
+ @failingTest
test_linked_type_dependency_reuse() {
- // TODO(paulberry): fix.
+ super.test_linked_type_dependency_reuse();
}
@override
+ @failingTest
test_syntheticFunctionType_inGenericClass() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_inGenericClass();
}
@override
+ @failingTest
test_syntheticFunctionType_inGenericFunction() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_inGenericFunction();
}
@override
+ @failingTest
test_syntheticFunctionType_noArguments() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_noArguments();
}
@override
+ @failingTest
test_syntheticFunctionType_withArguments() {
- // TODO(paulberry): fix.
+ super.test_syntheticFunctionType_withArguments();
}
@override
+ @failingTest
test_unused_type_parameter() {
- // TODO(paulberry): fix.
+ super.test_unused_type_parameter();
}
@override
+ @failingTest
test_variable_propagated_type_final_immediate() {
- // TODO(paulberry): fix.
+ super.test_variable_propagated_type_final_immediate();
}
@override
+ @failingTest
test_variable_propagated_type_new_reference() {
- // TODO(paulberry): fix.
+ super.test_variable_propagated_type_new_reference();
}
@override
+ @failingTest
test_variable_propagated_type_omit_dynamic() {
- // TODO(paulberry): fix.
+ super.test_variable_propagated_type_omit_dynamic();
}
}
@@ -155,19 +182,14 @@
* AST.
*/
@reflectiveTest
-abstract class LinkedSummarizeAstTest extends Object with SummaryTest {
+abstract class LinkedSummarizeAstTest extends SummaryLinkerTest
+ with SummaryTest {
@override
LinkedLibrary linked;
@override
List<UnlinkedUnit> unlinkedUnits;
- /**
- * Map from absolute URI to the [UnlinkedUnit] for each compilation unit
- * passed to [addNamedSource].
- */
- Map<String, UnlinkedUnit> uriToUnit = <String, UnlinkedUnit>{};
-
@override
bool get checkAstDerivedData => true;
@@ -181,46 +203,19 @@
bool get skipNonConstInitializers => false;
@override
- addNamedSource(String filePath, String contents) {
- CompilationUnit unit = _parseText(contents);
- UnlinkedUnit unlinkedUnit =
- new UnlinkedUnit.fromBuffer(serializeAstUnlinked(unit).toBuffer());
- uriToUnit[absUri(filePath)] = unlinkedUnit;
- }
-
- @override
void serializeLibraryText(String text, {bool allowErrors: false}) {
- Uri testDartUri = Uri.parse(absUri('/test.dart'));
- CompilationUnit unit = _parseText(text);
- UnlinkedUnit definingUnit =
- new UnlinkedUnit.fromBuffer(serializeAstUnlinked(unit).toBuffer());
- uriToUnit[testDartUri.toString()] = definingUnit;
- LinkedLibrary getDependency(String absoluteUri) {
- Map<String, LinkedLibrary> sdkLibraries =
- SerializedMockSdk.instance.uriToLinkedLibrary;
- LinkedLibrary linkedLibrary = sdkLibraries[absoluteUri];
- if (linkedLibrary == null && !allowMissingFiles) {
- fail('Linker unexpectedly requested LinkedLibrary for "$absoluteUri".'
- ' Libraries available: ${sdkLibraries.keys}');
- }
- return linkedLibrary;
- }
- UnlinkedUnit getUnit(String absoluteUri) {
- UnlinkedUnit unit = uriToUnit[absoluteUri] ??
- SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri];
- if (unit == null && !allowMissingFiles) {
- fail('Linker unexpectedly requested unit for "$absoluteUri".');
- }
- return unit;
- }
- linked = link(uriToUnit.keys.toSet(), getDependency, getUnit, strongMode)[
- testDartUri.toString()];
+ Map<String, UnlinkedUnitBuilder> uriToUnit = this.uriToUnit;
+ LinkerInputs linkerInputs = createLinkerInputs(text);
+ linked = link(linkerInputs.linkedLibraries, linkerInputs.getDependency,
+ linkerInputs.getUnit, strongMode)[linkerInputs.testDartUri.toString()];
expect(linked, isNotNull);
validateLinkedLibrary(linked);
- unlinkedUnits = <UnlinkedUnit>[definingUnit];
- for (String relativeUri in definingUnit.publicNamespace.parts) {
+ unlinkedUnits = <UnlinkedUnit>[linkerInputs.unlinkedDefiningUnit];
+ for (String relativeUri
+ in linkerInputs.unlinkedDefiningUnit.publicNamespace.parts) {
UnlinkedUnit unit = uriToUnit[
- resolveRelativeUri(testDartUri, Uri.parse(relativeUri)).toString()];
+ resolveRelativeUri(linkerInputs.testDartUri, Uri.parse(relativeUri))
+ .toString()];
if (unit == null) {
if (!allowMissingFiles) {
fail('Test referred to unknown unit $relativeUri');
@@ -237,6 +232,156 @@
expect(cls.supertype, isNull);
expect(cls.hasNoSupertype, isTrue);
}
+}
+
+/**
+ * Instances of the class [LinkerInputs] encapsulate the necessary information
+ * to pass to the summary linker.
+ */
+class LinkerInputs {
+ final bool _allowMissingFiles;
+ final Map<String, UnlinkedUnit> _uriToUnit;
+ final Uri testDartUri;
+ final UnlinkedUnit unlinkedDefiningUnit;
+ final Map<String, LinkedLibrary> _dependentLinkedLibraries;
+ final Map<String, UnlinkedUnit> _dependentUnlinkedUnits;
+
+ LinkerInputs(
+ this._allowMissingFiles,
+ this._uriToUnit,
+ this.testDartUri,
+ this.unlinkedDefiningUnit,
+ this._dependentLinkedLibraries,
+ this._dependentUnlinkedUnits);
+
+ Set<String> get linkedLibraries => _uriToUnit.keys.toSet();
+
+ LinkedLibrary getDependency(String absoluteUri) {
+ Map<String, LinkedLibrary> sdkLibraries =
+ SerializedMockSdk.instance.uriToLinkedLibrary;
+ LinkedLibrary linkedLibrary =
+ sdkLibraries[absoluteUri] ?? _dependentLinkedLibraries[absoluteUri];
+ if (linkedLibrary == null && !_allowMissingFiles) {
+ Set<String> librariesAvailable = sdkLibraries.keys.toSet();
+ librariesAvailable.addAll(_dependentLinkedLibraries.keys);
+ fail('Linker unexpectedly requested LinkedLibrary for "$absoluteUri".'
+ ' Libraries available: ${librariesAvailable.toList()}');
+ }
+ return linkedLibrary;
+ }
+
+ UnlinkedUnit getUnit(String absoluteUri) {
+ UnlinkedUnit unit = _uriToUnit[absoluteUri] ??
+ SerializedMockSdk.instance.uriToUnlinkedUnit[absoluteUri] ??
+ _dependentUnlinkedUnits[absoluteUri];
+ if (unit == null && !_allowMissingFiles) {
+ fail('Linker unexpectedly requested unit for "$absoluteUri".');
+ }
+ return unit;
+ }
+}
+
+/**
+ * Base class providing the ability to run the summary linker using summaries
+ * build from ASTs.
+ */
+abstract class SummaryLinkerTest {
+ /**
+ * Map from absolute URI to the [UnlinkedUnit] for each compilation unit
+ * passed to [addNamedSource].
+ */
+ Map<String, UnlinkedUnitBuilder> uriToUnit = <String, UnlinkedUnitBuilder>{};
+
+ /**
+ * Map from absolute URI to the [LinkedLibrary] for each compilation unit in a
+ * package bundle passed to [addBundle].
+ */
+ Map<String, LinkedLibrary> _dependentLinkedLibraries =
+ <String, LinkedLibrary>{};
+
+ /**
+ * Map from absolute URI to the [UnlinkedUnit] for each compilation unit in a
+ * package bundle passed to [addBundle].
+ */
+ Map<String, UnlinkedUnit> _dependentUnlinkedUnits = <String, UnlinkedUnit>{};
+
+ /**
+ * A test will set this to `true` if it contains `import`, `export`, or
+ * `part` declarations that deliberately refer to non-existent files.
+ */
+ bool get allowMissingFiles;
+
+ /**
+ * Add the given package bundle as a dependency so that it may be referenced
+ * by the files under test.
+ */
+ void addBundle(PackageBundle bundle) {
+ for (int i = 0; i < bundle.linkedLibraryUris.length; i++) {
+ _dependentLinkedLibraries[bundle.linkedLibraryUris[i]] =
+ bundle.linkedLibraries[i];
+ }
+ for (int i = 0; i < bundle.unlinkedUnitUris.length; i++) {
+ _dependentUnlinkedUnits[bundle.unlinkedUnitUris[i]] =
+ bundle.unlinkedUnits[i];
+ }
+ }
+
+ /**
+ * Add the given source file so that it may be referenced by the file under
+ * test.
+ */
+ Source addNamedSource(String filePath, String contents) {
+ CompilationUnit unit = _parseText(contents);
+ UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
+ uriToUnit[absUri(filePath)] = unlinkedUnit;
+ // Tests using SummaryLinkerTest don't actually need the returned
+ // Source, so we can safely return `null`.
+ return null;
+ }
+
+ LinkerInputs createLinkerInputs(String text, {String path: '/test.dart'}) {
+ Uri testDartUri = Uri.parse(absUri(path));
+ CompilationUnit unit = _parseText(text);
+ UnlinkedUnitBuilder unlinkedDefiningUnit = serializeAstUnlinked(unit);
+ uriToUnit[testDartUri.toString()] = unlinkedDefiningUnit;
+ LinkerInputs linkerInputs = new LinkerInputs(
+ allowMissingFiles,
+ uriToUnit,
+ testDartUri,
+ unlinkedDefiningUnit,
+ _dependentLinkedLibraries,
+ _dependentUnlinkedUnits);
+ // Reset uriToUnit, _dependentLinkedLibraries, and _dependentUnlinkedUnits
+ // in case the test needs to start a new package bundle.
+ uriToUnit = <String, UnlinkedUnitBuilder>{};
+ _dependentLinkedLibraries = <String, LinkedLibrary>{};
+ _dependentUnlinkedUnits = <String, UnlinkedUnit>{};
+ return linkerInputs;
+ }
+
+ /**
+ * Link together the given file, along with any other files passed to
+ * [addNamedSource], to form a package bundle. Reset the state of the buffers
+ * accumulated by [addNamedSource] and [addBundle] so that further bundles
+ * can be created.
+ */
+ PackageBundleBuilder createPackageBundle(String text,
+ {String path: '/test.dart'}) {
+ PackageBundleAssembler assembler = new PackageBundleAssembler();
+ LinkerInputs linkerInputs = createLinkerInputs(text, path: path);
+ Map<String, LinkedLibraryBuilder> linkedLibraries = link(
+ linkerInputs.linkedLibraries,
+ linkerInputs.getDependency,
+ linkerInputs.getUnit,
+ true);
+ linkedLibraries.forEach(assembler.addLinkedLibrary);
+ linkerInputs._uriToUnit.forEach((String uri, UnlinkedUnitBuilder unit) {
+ // Note: it doesn't matter what we store for the hash because it isn't
+ // used in these tests.
+ assembler.addUnlinkedUnitWithHash(uri, unit, 'HASH');
+ });
+ return assembler.assemble();
+ }
CompilationUnit _parseText(String text) {
CharSequenceReader reader = new CharSequenceReader(text);
diff --git a/pkg/analyzer/test/src/summary/summarize_elements_strong_test.dart b/pkg/analyzer/test/src/summary/summarize_elements_strong_test.dart
index 8a8bfe6..1ae97d4 100644
--- a/pkg/analyzer/test/src/summary/summarize_elements_strong_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_elements_strong_test.dart
@@ -5,9 +5,11 @@
library analyzer.test.src.summary.summarize_elements_strong_test;
import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
import 'package:unittest/unittest.dart';
import '../../reflective_tests.dart';
+import '../context/abstract_context.dart';
import 'summarize_elements_test.dart';
import 'summary_common.dart';
@@ -27,4 +29,7 @@
@override
bool get strongMode => true;
+
+ @override
+ DartSdk createDartSdk() => AbstractContextTest.SHARED_STRONG_MOCK_SDK;
}
diff --git a/pkg/analyzer/test/src/summary/summarize_elements_test.dart b/pkg/analyzer/test/src/summary/summarize_elements_test.dart
index da2a2bb..eda8138 100644
--- a/pkg/analyzer/test/src/summary/summarize_elements_test.dart
+++ b/pkg/analyzer/test/src/summary/summarize_elements_test.dart
@@ -6,6 +6,7 @@
import 'package:analyzer/dart/element/element.dart';
import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
import 'package:analyzer/src/generated/source.dart';
import 'package:analyzer/src/generated/source_io.dart';
import 'package:analyzer/src/summary/format.dart';
@@ -16,8 +17,9 @@
as summarize_elements;
import 'package:unittest/unittest.dart';
-import '../../generated/resolver_test_case.dart';
import '../../reflective_tests.dart';
+import '../abstract_single_unit.dart';
+import '../context/abstract_context.dart';
import 'summary_common.dart';
main() {
@@ -29,7 +31,7 @@
* Override of [SummaryTest] which creates summaries from the element model.
*/
@reflectiveTest
-class SummarizeElementsTest extends ResolverTestCase with SummaryTest {
+class SummarizeElementsTest extends AbstractSingleUnitTest with SummaryTest {
/**
* The list of absolute unit URIs corresponding to the compilation units in
* [unlinkedUnits].
@@ -71,11 +73,14 @@
@override
Source addNamedSource(String filePath, String contents) {
- Source source = super.addNamedSource(filePath, contents);
+ Source source = super.addSource(filePath, contents);
_fileContents[source] = contents;
return source;
}
+ @override
+ DartSdk createDartSdk() => AbstractContextTest.SHARED_MOCK_SDK;
+
/**
* Serialize the library containing the given class [element], then
* deserialize it and return the summary of the class.
@@ -92,7 +97,7 @@
void serializeLibraryElement(LibraryElement library) {
summarize_elements.LibrarySerializationResult serializedLib =
summarize_elements.serializeLibrary(
- library, typeProvider, analysisContext.analysisOptions.strongMode);
+ library, context.typeProvider, context.analysisOptions.strongMode);
{
List<int> buffer = serializedLib.linked.toBuffer();
linked = new LinkedLibrary.fromBuffer(buffer);
@@ -107,14 +112,15 @@
@override
void serializeLibraryText(String text, {bool allowErrors: false}) {
- Source source = addSource(text);
+ Source source = addTestSource(text);
_fileContents[source] = text;
- LibraryElement library = resolve2(source);
+ LibraryElement library = context.computeLibraryElement(source);
if (!allowErrors) {
- assertNoErrors(source);
+ assertNoErrorsInSource(source);
}
serializeLibraryElement(library);
expect(unlinkedUnits[0].imports.length, linked.importDependencies.length);
+ expect(unlinkedUnits[0].exports.length, linked.exportDependencies.length);
expect(linked.units.length, unlinkedUnits.length);
for (int i = 0; i < linked.units.length; i++) {
expect(unlinkedUnits[i].references.length,
@@ -126,11 +132,12 @@
@override
void setUp() {
super.setUp();
- resetWithOptions(options);
+ prepareAnalysisContext(options);
}
test_class_no_superclass() {
- UnlinkedClass cls = serializeClassElement(typeProvider.objectType.element);
+ UnlinkedClass cls =
+ serializeClassElement(context.typeProvider.objectType.element);
expect(cls.supertype, isNull);
expect(cls.hasNoSupertype, isTrue);
}
@@ -141,7 +148,7 @@
*/
void verifyPublicNamespace() {
for (int i = 0; i < unlinkedUnits.length; i++) {
- Source source = analysisContext.sourceFactory.forUri(unitUris[i]);
+ Source source = context.sourceFactory.forUri(unitUris[i]);
String text = _fileContents[source];
if (text == null) {
if (!allowMissingFiles) {
diff --git a/pkg/analyzer/test/src/summary/summary_common.dart b/pkg/analyzer/test/src/summary/summary_common.dart
index a34f921..cfde5e9 100644
--- a/pkg/analyzer/test/src/summary/summary_common.dart
+++ b/pkg/analyzer/test/src/summary/summary_common.dart
@@ -23,7 +23,15 @@
as summarize_elements;
import 'package:unittest/unittest.dart';
-import '../../generated/analysis_context_factory.dart';
+import '../context/mock_sdk.dart';
+
+/**
+ * Convert [path] to a suitably formatted absolute path URI for the current
+ * platform.
+ */
+String absUri(String path) {
+ return FileUtilities2.createFile(path).toURI().toString();
+}
/**
* Convert a summary object (or a portion of one) into a canonical form that
@@ -99,13 +107,14 @@
static SerializedMockSdk _serializeMockSdk() {
try {
- AnalysisContext analysisContext =
- AnalysisContextFactory.contextWithCore();
+ AnalysisContext analysisContext = new MockSdk().context;
Map<String, UnlinkedUnit> uriToUnlinkedUnit = <String, UnlinkedUnit>{};
Map<String, LinkedLibrary> uriToLinkedLibrary = <String, LinkedLibrary>{};
List<LibraryElement> libraries = [
analysisContext.typeProvider.objectType.element.library,
- analysisContext.typeProvider.futureType.element.library
+ analysisContext.typeProvider.futureType.element.library,
+ analysisContext.computeLibraryElement(
+ analysisContext.sourceFactory.resolveUri(null, 'dart:math')),
];
for (LibraryElement library in libraries) {
summarize_elements.LibrarySerializationResult serializedLibrary =
@@ -189,14 +198,6 @@
List<UnlinkedUnit> get unlinkedUnits;
/**
- * Convert [path] to a suitably formatted absolute path URI for the current
- * platform.
- */
- String absUri(String path) {
- return FileUtilities2.createFile(path).toURI().toString();
- }
-
- /**
* Add the given source file so that it may be referenced by the file under
* test.
*/
@@ -4993,6 +4994,25 @@
}
}
+ test_executable_localVariables_forEachLoop_outside() {
+ String code = r'''
+f() { // 1
+ int i;
+ for (i in <int>[]) {
+ print(i);
+ }
+} // 4
+''';
+ UnlinkedExecutable executable = serializeExecutableText(code);
+ List<UnlinkedVariable> variables = executable.localVariables;
+ expect(variables, hasLength(1));
+ {
+ UnlinkedVariable i = variables.singleWhere((v) => v.name == 'i');
+ _assertVariableVisible(code, i, '{ // 1', '} // 4');
+ checkTypeRef(i.type, 'dart:core', 'dart:core', 'int');
+ }
+ }
+
test_executable_localVariables_forLoop() {
String code = r'''
f() { // 1
@@ -5673,6 +5693,12 @@
ReferenceKind.classOrEnum);
}
+ test_export_dependency() {
+ serializeLibraryText('export "dart:async";');
+ expect(unlinkedUnits[0].exports, hasLength(1));
+ checkDependency(linked.exportDependencies[0], 'dart:async', 'dart:async');
+ }
+
test_export_enum() {
addNamedSource('/a.dart', 'enum E { v }');
serializeLibraryText('export "a.dart";');
@@ -5734,6 +5760,21 @@
expect(linked.exportNames, isNotEmpty);
}
+ test_export_missing() {
+ if (!checkAstDerivedData) {
+ // TODO(paulberry): At the moment unresolved exports are not included in
+ // the element model, so we can't pass this test.
+ return;
+ }
+ // Unresolved exports are included since this is necessary for proper
+ // dependency tracking.
+ allowMissingFiles = true;
+ serializeLibraryText('export "foo.dart";', allowErrors: true);
+ expect(unlinkedUnits[0].imports, hasLength(1));
+ checkDependency(
+ linked.exportDependencies[0], absUri('/foo.dart'), 'foo.dart');
+ }
+
test_export_names_excludes_names_from_library() {
addNamedSource('/a.dart', 'part of my.lib; int y; int _y;');
serializeLibraryText('library my.lib; part "a.dart"; int x; int _x;');
@@ -6674,7 +6715,6 @@
''');
_assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
UnlinkedConstOperation.pushInt,
- UnlinkedConstOperation.pushReference,
UnlinkedConstOperation.typeCast,
], ints: [
42
@@ -6693,7 +6733,6 @@
''');
_assertUnlinkedConst(variable.constExpr, isValidConst: false, operators: [
UnlinkedConstOperation.pushInt,
- UnlinkedConstOperation.pushReference,
UnlinkedConstOperation.typeCheck,
], ints: [
42
@@ -7200,7 +7239,7 @@
checkTypeRef(findVariable('f').type, 'dart:async', 'dart:async', 'Future',
numTypeParameters: 1);
checkTypeRef(findVariable('s').type, 'dart:async', 'dart:async', 'Stream',
- numTypeParameters: 1);
+ expectedTargetUnit: 1, numTypeParameters: 1);
}
test_import_reference_merged_prefixed() {
@@ -7214,7 +7253,7 @@
checkTypeRef(findVariable('f').type, 'dart:async', 'dart:async', 'Future',
expectedPrefix: 'a', numTypeParameters: 1);
checkTypeRef(findVariable('s').type, 'dart:async', 'dart:async', 'Stream',
- expectedPrefix: 'a', numTypeParameters: 1);
+ expectedTargetUnit: 1, expectedPrefix: 'a', numTypeParameters: 1);
}
test_import_reference_merged_prefixed_separate_libraries() {
diff --git a/pkg/analyzer/test/src/summary/test_all.dart b/pkg/analyzer/test/src/summary/test_all.dart
index 0943a6e..fa620fe 100644
--- a/pkg/analyzer/test/src/summary/test_all.dart
+++ b/pkg/analyzer/test/src/summary/test_all.dart
@@ -16,6 +16,7 @@
import 'resynthesize_ast_test.dart' as resynthesize_ast_test;
import 'resynthesize_strong_test.dart' as resynthesize_strong_test;
import 'resynthesize_test.dart' as resynthesize_test;
+import 'summarize_ast_strong_test.dart' as summarize_ast_strong_test;
import 'summarize_ast_test.dart' as summarize_ast_test;
import 'summarize_elements_strong_test.dart' as summarize_elements_strong_test;
import 'summarize_elements_test.dart' as summarize_elements_test;
@@ -33,6 +34,7 @@
resynthesize_ast_test.main();
resynthesize_strong_test.main();
resynthesize_test.main();
+ summarize_ast_strong_test.main();
summarize_ast_test.main();
summarize_elements_strong_test.main();
summarize_elements_test.main();
diff --git a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
index 58944b6..3ace67a 100644
--- a/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
+++ b/pkg/analyzer/test/src/task/strong/inferred_type_test.dart
@@ -7,1215 +7,911 @@
/// Tests for type inference.
library analyzer.test.src.task.strong.inferred_type_test;
+import 'package:analyzer/dart/element/element.dart';
import 'package:unittest/unittest.dart';
-import 'strong_test_helper.dart';
+import '../../../reflective_tests.dart';
+import 'strong_test_helper.dart' as helper;
void main() {
- initStrongModeTests();
-
- // Error also expected when declared type is `int`.
- test('infer type on var', () {
- checkFile('''
- test1() {
- int x = 3;
- x = /*warning:INVALID_ASSIGNMENT*/"hi";
- }
- ''');
- });
-
- // If inferred type is `int`, error is also reported
- test('infer type on var 2', () {
- checkFile('''
- test2() {
- var x = 3;
- x = /*warning:INVALID_ASSIGNMENT*/"hi";
- }
- ''');
- });
-
- test('No error when declared type is `num` and assigned null.', () {
- checkFile('''
- test1() {
- num x = 3;
- x = null;
- }
- ''');
- });
-
- test('do not infer type on dynamic', () {
- checkFile('''
- test() {
- dynamic x = 3;
- x = "hi";
- }
- ''');
- });
-
- test('do not infer type when initializer is null', () {
- checkFile('''
- test() {
- var x = null;
- x = "hi";
- x = 3;
- }
- ''');
- });
-
- test('infer type on var from field', () {
- checkFile('''
- class A {
- int x = 0;
-
- test1() {
- var a = x;
- a = /*warning:INVALID_ASSIGNMENT*/"hi";
- a = 3;
- var b = y;
- b = /*warning:INVALID_ASSIGNMENT*/"hi";
- b = 4;
- var c = z;
- c = /*warning:INVALID_ASSIGNMENT*/"hi";
- c = 4;
- }
-
- int y; // field def after use
- final z = 42; // should infer `int`
- }
- ''');
- });
-
- test('infer type on var from top-level', () {
- checkFile('''
- int x = 0;
-
- test1() {
- var a = x;
- a = /*warning:INVALID_ASSIGNMENT*/"hi";
- a = 3;
- var b = y;
- b = /*warning:INVALID_ASSIGNMENT*/"hi";
- b = 4;
- var c = z;
- c = /*warning:INVALID_ASSIGNMENT*/"hi";
- c = 4;
- }
-
- int y = 0; // field def after use
- final z = 42; // should infer `int`
- ''');
- });
-
- test('do not infer field type when initializer is null', () {
- checkFile('''
- var x = null;
- var y = 3;
- class A {
- static var x = null;
- static var y = 3;
-
- var x2 = null;
- var y2 = 3;
- }
-
- test() {
- x = "hi";
- y = /*warning:INVALID_ASSIGNMENT*/"hi";
- A.x = "hi";
- A.y = /*warning:INVALID_ASSIGNMENT*/"hi";
- new A().x2 = "hi";
- new A().y2 = /*warning:INVALID_ASSIGNMENT*/"hi";
- }
- ''');
- });
-
- test('infer from variables in non-cycle imports with flag', () {
- addFile(
- '''
- var x = 2;
- ''',
- name: '/a.dart');
- checkFile('''
- import 'a.dart';
- var y = x;
-
- test1() {
- x = /*warning:INVALID_ASSIGNMENT*/"hi";
- y = /*warning:INVALID_ASSIGNMENT*/"hi";
- }
- ''');
- });
-
- test('infer from variables in non-cycle imports with flag 2', () {
- addFile(
- '''
- class A { static var x = 2; }
- ''',
- name: '/a.dart');
- checkFile('''
- import 'a.dart';
- class B { static var y = A.x; }
-
- test1() {
- A.x = /*warning:INVALID_ASSIGNMENT*/"hi";
- B.y = /*warning:INVALID_ASSIGNMENT*/"hi";
- }
- ''');
- });
-
- test('infer from variables in cycle libs when flag is on', () {
- addFile(
- '''
- import 'main.dart';
- var x = 2; // ok to infer
- ''',
- name: '/a.dart');
- checkFile('''
- import 'a.dart';
- var y = x; // now ok :)
-
- test1() {
- int t = 3;
- t = x;
- t = y;
- }
- ''');
- });
-
- test('infer from variables in cycle libs when flag is on 2', () {
- addFile(
- '''
- import 'main.dart';
- class A { static var x = 2; }
- ''',
- name: '/a.dart');
- checkFile('''
- import 'a.dart';
- class B { static var y = A.x; }
-
- test1() {
- int t = 3;
- t = A.x;
- t = B.y;
- }
- ''');
- });
-
- test('can infer also from static and instance fields (flag on)', () {
- addFile(
- '''
- import 'b.dart';
- class A {
- static final a1 = B.b1;
- final a2 = new B().b2;
- }
- ''',
- name: '/a.dart');
- addFile(
- '''
- class B {
- static final b1 = 1;
- final b2 = 1;
- }
- ''',
- name: '/b.dart');
- checkFile('''
- import "a.dart";
-
- test1() {
- int x = 0;
- // inference in A now works.
- x = A.a1;
- x = new A().a2;
- }
- ''');
- });
-
- test('inference in cycles is deterministic', () {
- addFile(
- '''
- import 'b.dart';
- class A {
- static final a1 = B.b1;
- final a2 = new B().b2;
- }
- ''',
- name: '/a.dart');
- addFile(
- '''
- class B {
- static final b1 = 1;
- final b2 = 1;
- }
- ''',
- name: '/b.dart');
- addFile(
- '''
- import "main.dart"; // creates a cycle
-
- class C {
- static final c1 = 1;
- final c2 = 1;
- }
- ''',
- name: '/c.dart');
- addFile(
- '''
- library e;
- import 'a.dart';
- part 'e2.dart';
-
- class E {
- static final e1 = 1;
- static final e2 = F.f1;
- static final e3 = A.a1;
- final e4 = 1;
- final e5 = new F().f2;
- final e6 = new A().a2;
- }
- ''',
- name: '/e.dart');
- addFile(
- '''
- part 'f2.dart';
- ''',
- name: '/f.dart');
- addFile(
- '''
- part of e;
- class F {
- static final f1 = 1;
- final f2 = 1;
- }
- ''',
- name: '/e2.dart');
- checkFile('''
- import "a.dart";
- import "c.dart";
- import "e.dart";
-
- class D {
- static final d1 = A.a1 + 1;
- static final d2 = C.c1 + 1;
- final d3 = new A().a2;
- final d4 = new C().c2;
- }
-
- test1() {
- int x = 0;
- // inference in A works, it's not in a cycle
- x = A.a1;
- x = new A().a2;
-
- // Within a cycle we allow inference when the RHS is well known, but
- // not when it depends on other fields within the cycle
- x = C.c1;
- x = D.d1;
- x = D.d2;
- x = new C().c2;
- x = new D().d3;
- x = /*info:DYNAMIC_CAST*/new D().d4;
-
-
- // Similarly if the library contains parts.
- x = E.e1;
- x = E.e2;
- x = E.e3;
- x = new E().e4;
- x = /*info:DYNAMIC_CAST*/new E().e5;
- x = new E().e6;
- x = F.f1;
- x = new F().f2;
- }
- ''');
- });
-
- test('infer from complex expressions if the outer-most value is precise', () {
- checkFile('''
- class A { int x; B operator+(other) => null; }
- class B extends A { B(ignore); }
- var a = new A();
- // Note: it doesn't matter that some of these refer to 'x'.
- var b = new B(/*warning:UNDEFINED_IDENTIFIER*/x); // allocations
- var c1 = [/*warning:UNDEFINED_IDENTIFIER*/x]; // list literals
- var c2 = const [];
- var d = <dynamic, dynamic>{'a': 'b'}; // map literals
- var e = new A()..x = 3; // cascades
- var f = 2 + 3; // binary expressions are OK if the left operand
- // is from a library in a different strongest
- // conected component.
- var g = -3;
- var h = new A() + 3;
- var i = /*warning:UNDEFINED_OPERATOR*/- new A();
- var j = null as B;
-
- test1() {
- a = /*warning:INVALID_ASSIGNMENT*/"hi";
- a = new B(3);
- b = /*warning:INVALID_ASSIGNMENT*/"hi";
- b = new B(3);
- c1 = [];
- c1 = /*warning:INVALID_ASSIGNMENT*/{};
- c2 = [];
- c2 = /*warning:INVALID_ASSIGNMENT*/{};
- d = {};
- d = /*warning:INVALID_ASSIGNMENT*/3;
- e = new A();
- e = /*warning:INVALID_ASSIGNMENT*/{};
- f = 3;
- f = /*warning:INVALID_ASSIGNMENT*/false;
- g = 1;
- g = /*warning:INVALID_ASSIGNMENT*/false;
- h = /*warning:INVALID_ASSIGNMENT*/false;
- h = new B('b');
- i = false;
- j = new B('b');
- j = /*warning:INVALID_ASSIGNMENT*/false;
- j = /*warning:INVALID_ASSIGNMENT*/[];
- }
- ''');
- });
-
- test('infer list literal nested in map literal', () {
- checkFile(r'''
-class Resource {}
-class Folder extends Resource {}
-
-Resource getResource(String str) => null;
-
-class Foo<T> {
- Foo(T t);
+ helper.initStrongModeTests();
+ runReflectiveTests(InferredTypeTest);
}
+abstract class InferredTypeMixin {
+ /**
+ * Add a new file with the given [name] and [content].
+ */
+ void addFile(String content, {String name: '/main.dart'});
+
+ /**
+ * Add the file, process it (resolve, validate, etc) and return the resolved
+ * unit element.
+ */
+ CompilationUnitElement checkFile(String content);
+
+ void test_blockBodiedLambdas_async_allReturnsAreValues() {
+ var mainUnit = checkFile(r'''
+import 'dart:async';
+import 'dart:math' show Random;
+main() {
+ var f = /*info:INFERRED_TYPE_CLOSURE*/() async {
+ if (new Random().nextBool()) {
+ return 1;
+ } else {
+ return 2.0;
+ }
+ };
+ Future<num> g = f();
+ Future<int> h = /*info:ASSIGNMENT_CAST*/f();
+}
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Future<num>');
+ }
+
+ void test_blockBodiedLambdas_async_alReturnsAreFutures() {
+ var mainUnit = checkFile(r'''
+import 'dart:async';
+import 'dart:math' show Random;
+main() {
+ var f = /*info:INFERRED_TYPE_CLOSURE*/() async {
+ if (new Random().nextBool()) {
+ return new Future<int>.value(1);
+ } else {
+ return new Future<double>.value(2.0);
+ }
+ };
+ Future<num> g = f();
+ Future<int> h = /*info:ASSIGNMENT_CAST*/f();
+}
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Future<num>');
+ }
+
+ void test_blockBodiedLambdas_async_mixOfValuesAndFutures() {
+ var mainUnit = checkFile(r'''
+ import 'dart:async';
+ import 'dart:math' show Random;
+ main() {
+ var f = /*info:INFERRED_TYPE_CLOSURE*/() async {
+ if (new Random().nextBool()) {
+ return new Future<int>.value(1);
+ } else {
+ return 2.0;
+ }
+ };
+ Future<num> g = f();
+ Future<int> h = /*info:ASSIGNMENT_CAST*/f();
+ }
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Future<num>');
+ }
+
+ void test_blockBodiedLambdas_asyncStar() {
+ var mainUnit = checkFile(r'''
+ import 'dart:async';
+ main() {
+ var f = /*info:INFERRED_TYPE_CLOSURE*/() async* {
+ yield 1;
+ Stream<double> s;
+ yield* s;
+ };
+ Stream<num> g = f();
+ Stream<int> h = /*info:ASSIGNMENT_CAST*/f();
+ }
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Stream<num>');
+ }
+
+ void test_blockBodiedLambdas_basic() {
+ checkFile(r'''
+test1() {
+ List<int> o;
+ var y = o.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { return x + 1; });
+ Iterable<int> z = y;
+}
+''');
+ }
+
+ void test_blockBodiedLambdas_basic_topLevel() {
+ checkFile(r'''
+List<int> o;
+var y = o.map(/*info:INFERRED_TYPE_CLOSURE*/(x) { return x + 1; });
+Iterable<int> z = y;
+''');
+ }
+
+ void test_blockBodiedLambdas_doesNotInferBottom_async() {
+ var mainUnit = checkFile(r'''
+import 'dart:async';
+main() async {
+ var f = () async { return null; };
+ Future y = f();
+ Future<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
+ String s = /*info:DYNAMIC_CAST*/await f();
+}
+''');
+
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Future<dynamic>');
+ }
+
+ void test_blockBodiedLambdas_doesNotInferBottom_asyncStar() {
+ var mainUnit = checkFile(r'''
+import 'dart:async';
+main() async {
+ var f = () async* { yield null; };
+ Stream y = f();
+ Stream<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
+ String s = /*info:DYNAMIC_CAST*/await f().first;
+}
+''');
+
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Stream<dynamic>');
+ }
+
+ void test_blockBodiedLambdas_doesNotInferBottom_sync() {
+ var mainUnit = checkFile(r'''
+var h = null;
+void foo(int f(Object _)) {}
+
main() {
- // List inside map
- var map = <String, List<Folder>>{
- 'pkgA': /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/')],
- 'pkgB': /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgB/lib/')]
- };
- // Also try map inside list
- var list = <Map<String, Folder>>[
- /*info:INFERRED_TYPE_LITERAL*/{ 'pkgA': /*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/') },
- /*info:INFERRED_TYPE_LITERAL*/{ 'pkgB': /*info:DOWN_CAST_IMPLICIT*/getResource('/pkgB/lib/') },
- ];
- // Instance creation too
- var foo = new Foo<List<Folder>>(
- /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/')]
- );
+ var f = (Object x) { return null; };
+ String y = /*info:DYNAMIC_CAST*/f(42);
+
+ f = /*info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
+
+ foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { return null; });
+ foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { throw "not implemented"; });
}
- ''');
- });
+''');
- // but flags can enable this behavior.
- test('infer if complex expressions read possibly inferred field', () {
+ var f = mainUnit.functions[1].localVariables[0];
+ expect(f.type.toString(), '(Object) → dynamic');
+ }
+
+ void test_blockBodiedLambdas_doesNotInferBottom_syncStar() {
+ var mainUnit = checkFile(r'''
+main() {
+ var f = () sync* { yield null; };
+ Iterable y = f();
+ Iterable<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
+ String s = /*info:DYNAMIC_CAST*/f().first;
+}
+''');
+
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Iterable<dynamic>');
+ }
+
+ void test_blockBodiedLambdas_downwardsIncompatibleWithUpwardsInference() {
+ var mainUnit = checkFile(r'''
+main() {
+ String f() => null;
+ var g = f;
+ g = /*info:INFERRED_TYPE_CLOSURE*/() { return /*warning:RETURN_OF_INVALID_TYPE*/1; };
+}
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → String');
+ }
+
+ void test_blockBodiedLambdas_LUB() {
+ checkFile(r'''
+import 'dart:math' show Random;
+test2() {
+ List<num> o;
+ var y = o.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) {
+ if (new Random().nextBool()) {
+ return x.toInt() + 1;
+ } else {
+ return x.toDouble();
+ }
+ });
+ Iterable<num> w = y;
+ Iterable<int> z = /*info:ASSIGNMENT_CAST*/y;
+}
+''');
+ }
+
+ void test_blockBodiedLambdas_LUB_topLevel() {
+ checkFile(r'''
+import 'dart:math' show Random;
+List<num> o;
+var y = o.map(/*info:INFERRED_TYPE_CLOSURE*/(x) {
+ if (new Random().nextBool()) {
+ return x.toInt() + 1;
+ } else {
+ return x.toDouble();
+ }
+});
+Iterable<num> w = y;
+Iterable<int> z = /*info:ASSIGNMENT_CAST*/y;
+''');
+ }
+
+ void test_blockBodiedLambdas_nestedLambdas() {
+ // Original feature request: https://github.com/dart-lang/sdk/issues/25487
+ var mainUnit = checkFile(r'''
+main() {
+ var f = /*info:INFERRED_TYPE_CLOSURE*/() {
+ return /*info:INFERRED_TYPE_CLOSURE*/(int x) { return 2.0 * x; };
+ };
+}
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → (int) → num');
+ }
+
+ void test_blockBodiedLambdas_noReturn() {
+ var mainUnit = checkFile(r'''
+test1() {
+ List<int> o;
+ var y = o.map(/*info:INFERRED_TYPE_CLOSURE*/(x) { });
+ Iterable<int> z = /*warning:DOWN_CAST_COMPOSITE*/y;
+}
+''');
+ var f = mainUnit.functions[0].localVariables[1];
+ expect(f.type.toString(), 'Iterable<dynamic>');
+ }
+
+ void test_blockBodiedLambdas_syncStar() {
+ var mainUnit = checkFile(r'''
+main() {
+ var f = /*info:INFERRED_TYPE_CLOSURE*/() sync* {
+ yield 1;
+ yield* [3, 4.0];
+ };
+ Iterable<num> g = f();
+ Iterable<int> h = /*info:ASSIGNMENT_CAST*/f();
+}
+''');
+ var f = mainUnit.functions[0].localVariables[0];
+ expect(f.type.toString(), '() → Iterable<num>');
+ }
+
+ void test_canInferAlsoFromStaticAndInstanceFieldsFlagOn() {
addFile(
'''
- class A {
- var x = 3;
- }
- ''',
+import 'b.dart';
+class A {
+ static final a1 = B.b1;
+ final a2 = new B().b2;
+}
+''',
name: '/a.dart');
- checkFile('''
- import 'a.dart';
- class B {
- var y = 3;
- }
- final t1 = new A();
- final t2 = new A().x;
- final t3 = new B();
- final t4 = new B().y;
-
- test1() {
- int i = 0;
- A a;
- B b;
- a = t1;
- i = t2;
- b = t3;
- i = /*info:DYNAMIC_CAST*/t4;
- i = new B().y; // B.y was inferred though
- }
- ''');
- });
-
- group('infer types on loop indices', () {
- test('foreach loop', () {
- checkFile('''
- class Foo {
- int bar = 42;
- }
-
- class Bar<T extends Iterable<String>> {
- void foo(T t) {
- for (var i in t) {
- int x = /*warning:INVALID_ASSIGNMENT*/i;
- }
- }
- }
-
- class Baz<T, E extends Iterable<T>, S extends E> {
- void foo(S t) {
- for (var i in t) {
- int x = /*warning:INVALID_ASSIGNMENT*/i;
- T y = i;
- }
- }
- }
-
- test() {
- var list = <Foo>[];
- for (var x in list) {
- String y = /*warning:INVALID_ASSIGNMENT*/x;
- }
-
- for (dynamic x in list) {
- // The INVALID_ASSIGNMENT hint is because type propagation knows x is
- // a Foo.
- String y = /*info:DYNAMIC_CAST,info:INVALID_ASSIGNMENT*/x;
- }
-
- for (String x in /*warning:FOR_IN_OF_INVALID_ELEMENT_TYPE*/list) {
- String y = x;
- }
-
- var z;
- for(z in list) {
- String y = /*info:DYNAMIC_CAST,info:INVALID_ASSIGNMENT*/z;
- }
-
- Iterable iter = list;
- for (Foo /*info:DYNAMIC_CAST*/x in iter) {
- var y = x;
- }
-
- dynamic iter2 = list;
- for (Foo /*info:DYNAMIC_CAST*/x in /*info:DYNAMIC_CAST*/iter2) {
- var y = x;
- }
-
- var map = <String, Foo>{};
- // Error: map must be an Iterable.
- for (var x in /*warning:FOR_IN_OF_INVALID_TYPE*/map) {
- String y = /*info:DYNAMIC_CAST*/x;
- }
-
- // We're not properly inferring that map.keys is an Iterable<String>
- // and that x is a String.
- for (var x in map.keys) {
- String y = x;
- }
- }
- ''');
- });
-
- test('for loop, with inference', () {
- checkFile('''
- test() {
- for (var i = 0; i < 10; i++) {
- int j = i + 1;
- }
- }
- ''');
- });
- });
-
- test('propagate inference to field in class', () {
- checkFile('''
- class A {
- int x = 2;
- }
-
- test() {
- var a = new A();
- A b = a; // doesn't require down cast
- print(a.x); // doesn't require dynamic invoke
- print(a.x + 2); // ok to use in bigger expression
- }
- ''');
- });
-
- test('propagate inference to field in class dynamic warnings', () {
- checkFile('''
- class A {
- int x = 2;
- }
-
- test() {
- dynamic a = new A();
- A b = /*info:DYNAMIC_CAST*/a;
- print(/*info:DYNAMIC_INVOKE*/a.x);
- print(/*info:DYNAMIC_INVOKE*/(/*info:DYNAMIC_INVOKE*/a.x) + 2);
- }
- ''');
- });
-
- test('propagate inference transitively', () {
- checkFile('''
- class A {
- int x = 2;
- }
-
- test5() {
- var a1 = new A();
- a1.x = /*warning:INVALID_ASSIGNMENT*/"hi";
-
- A a2 = new A();
- a2.x = /*warning:INVALID_ASSIGNMENT*/"hi";
- }
- ''');
- });
-
- test('propagate inference transitively 2', () {
- checkFile('''
- class A {
- int x = 42;
- }
-
- class B {
- A a = new A();
- }
-
- class C {
- B b = new B();
- }
-
- class D {
- C c = new C();
- }
-
- void main() {
- var d1 = new D();
- print(d1.c.b.a.x);
-
- D d2 = new D();
- print(d2.c.b.a.x);
- }
- ''');
- });
-
- group('infer type on overridden fields', () {
- test('2', () {
- checkFile('''
- class A {
- int x = 2;
- }
-
- class B extends A {
- /*severe:INVALID_FIELD_OVERRIDE*/get x => 3;
- }
-
- foo() {
- String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
- int z = new B().x;
- }
- ''');
- });
-
- test('4', () {
- checkFile('''
- class A {
- final int x = 2;
- }
-
- class B implements A {
- get x => 3;
- }
-
- foo() {
- String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
- int z = new B().x;
- }
- ''');
- });
- });
-
- group('infer types on generic instantiations', () {
- test('infer', () {
- checkFile('''
- class A<T> {
- final T x = null;
- }
-
- class B implements A<int> {
- /*severe:INVALID_METHOD_OVERRIDE*/dynamic get x => 3;
- }
-
- foo() {
- String y = /*info:DYNAMIC_CAST*/new B().x;
- int z = /*info:DYNAMIC_CAST*/new B().x;
- }
- ''');
- });
-
- test('3', () {
- checkFile('''
- class A<T> {
- final T x = null;
- final T w = null;
- }
-
- class B implements A<int> {
- get x => 3;
- get w => /*warning:RETURN_OF_INVALID_TYPE*/"hello";
- }
-
- foo() {
- String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
- int z = new B().x;
- }
- ''');
- });
-
- test('4', () {
- checkFile('''
- class A<T> {
- T x;
- }
-
- class B<E> extends A<E> {
- E y;
- /*severe:INVALID_FIELD_OVERRIDE*/get x => y;
- }
-
- foo() {
- int y = /*warning:INVALID_ASSIGNMENT*/new B<String>().x;
- String z = new B<String>().x;
- }
- ''');
- });
-
- test('5', () {
- checkFile('''
- abstract class I<E> {
- String m(a, String f(v, E e));
- }
-
- abstract class A<E> implements I<E> {
- const A();
- String m(a, String f(v, E e));
- }
-
- abstract class M {
- final int y = 0;
- }
-
- class B<E> extends A<E> implements M {
- const B();
- int get y => 0;
-
- m(a, f(v, E e)) {}
- }
-
- foo () {
- int y = /*warning:INVALID_ASSIGNMENT*/new B().m(null, null);
- String z = new B().m(null, null);
- }
- ''');
- });
- });
-
- test('infer type regardless of declaration order or cycles', () {
addFile(
'''
- import 'main.dart';
-
- class B extends A { }
- ''',
+class B {
+ static final b1 = 1;
+ final b2 = 1;
+}
+''',
name: '/b.dart');
checkFile('''
- import 'b.dart';
- class C extends B {
- get x => null;
- }
- class A {
- int get x => 0;
- }
- foo() {
- int y = new C().x;
- String z = /*warning:INVALID_ASSIGNMENT*/new C().x;
- }
- ''');
- });
+import "a.dart";
- // Note: this is a regression test for a non-deterministic behavior we used to
- // have with inference in library cycles. If you see this test flake out,
- // change `test` to `skip_test` and reopen bug #48.
- test('infer types on generic instantiations in library cycle', () {
- addFile(
- '''
- import 'main.dart';
- abstract class I<E> {
- A<E> m(a, String f(v, int e));
- }
- ''',
- name: '/a.dart');
+test1() {
+ int x = 0;
+ // inference in A now works.
+ x = A.a1;
+ x = new A().a2;
+}
+''');
+ }
+
+ void test_conflictsCanHappen() {
checkFile('''
- import 'a.dart';
+class I1 {
+ int x;
+}
+class I2 extends I1 {
+ int y;
+}
- abstract class A<E> implements I<E> {
- const A();
+class A {
+ final I1 a = null;
+}
- final E value = null;
- }
+class B {
+ final I2 a = null;
+}
- abstract class M {
- final int y = 0;
- }
+class C1 implements A, B {
+ /*severe:INVALID_METHOD_OVERRIDE*/get a => null;
+}
- class B<E> extends A<E> implements M {
- const B();
- int get y => 0;
+// Still ambiguous
+class C2 implements B, A {
+ /*severe:INVALID_METHOD_OVERRIDE*/get a => null;
+}
+''');
+ }
- m(a, f(v, int e)) {}
- }
-
- foo () {
- int y = /*warning:INVALID_ASSIGNMENT*/new B<String>().m(null, null).value;
- String z = new B<String>().m(null, null).value;
- }
- ''');
- });
-
- group('do not infer overridden fields that explicitly say dynamic', () {
- test('infer', () {
- checkFile('''
- class A {
- final int x = 2;
- }
-
- class B implements A {
- /*severe:INVALID_METHOD_OVERRIDE*/dynamic get x => 3;
- }
-
- foo() {
- String y = /*info:DYNAMIC_CAST*/new B().x;
- int z = /*info:DYNAMIC_CAST*/new B().x;
- }
- ''');
- });
- });
-
- test('conflicts can happen', () {
+ void test_conflictsCanHappen2() {
checkFile('''
- class I1 {
- int x;
- }
- class I2 extends I1 {
- int y;
- }
+class I1 {
+ int x;
+}
+class I2 {
+ int y;
+}
- class A {
- final I1 a = null;
- }
+class I3 implements I1, I2 {
+ int x;
+ int y;
+}
- class B {
- final I2 a = null;
- }
+class A {
+ final I1 a = null;
+}
- class C1 implements A, B {
- /*severe:INVALID_METHOD_OVERRIDE*/get a => null;
- }
+class B {
+ final I2 a = null;
+}
- // Still ambiguous
- class C2 implements B, A {
- /*severe:INVALID_METHOD_OVERRIDE*/get a => null;
- }
- ''');
- });
+class C1 implements A, B {
+ I3 get a => null;
+}
- test('conflicts can happen 2', () {
+class C2 implements A, B {
+ /*severe:INVALID_METHOD_OVERRIDE*/get a => null;
+}
+''');
+ }
+
+ void test_doNotInferOverriddenFieldsThatExplicitlySayDynamic_infer() {
checkFile('''
- class I1 {
- int x;
- }
- class I2 {
- int y;
- }
+class A {
+ final int x = 2;
+}
- class I3 implements I1, I2 {
- int x;
- int y;
- }
+class B implements A {
+ /*severe:INVALID_METHOD_OVERRIDE*/dynamic get x => 3;
+}
- class A {
- final I1 a = null;
- }
+foo() {
+ String y = /*info:DYNAMIC_CAST*/new B().x;
+ int z = /*info:DYNAMIC_CAST*/new B().x;
+}
+''');
+ }
- class B {
- final I2 a = null;
- }
-
- class C1 implements A, B {
- I3 get a => null;
- }
-
- class C2 implements A, B {
- /*severe:INVALID_METHOD_OVERRIDE*/get a => null;
- }
- ''');
- });
-
- test('infer from RHS only if it wont conflict with overridden fields', () {
+ void test_dontInferFieldTypeWhenInitializerIsNull() {
checkFile('''
- class A {
- var x;
- }
+var x = null;
+var y = 3;
+class A {
+ static var x = null;
+ static var y = 3;
- class B implements A {
- var x = 2;
- }
+ var x2 = null;
+ var y2 = 3;
+}
- foo() {
- String y = /*info:DYNAMIC_CAST*/new B().x;
- int z = /*info:DYNAMIC_CAST*/new B().x;
- }
- ''');
- });
+test() {
+ x = "hi";
+ y = /*warning:INVALID_ASSIGNMENT*/"hi";
+ A.x = "hi";
+ A.y = /*warning:INVALID_ASSIGNMENT*/"hi";
+ new A().x2 = "hi";
+ new A().y2 = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
- test('infer from RHS only if it wont conflict with overridden fields 2', () {
+ void test_dontInferTypeOnDynamic() {
checkFile('''
- class A {
- final x = null;
- }
+test() {
+ dynamic x = 3;
+ x = "hi";
+}
+''');
+ }
- class B implements A {
- final x = 2;
- }
-
- foo() {
- String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
- int z = new B().x;
- }
- ''');
- });
-
- test('infer correctly on multiple variables declared together', () {
+ void test_dontInferTypeWhenInitializerIsNull() {
checkFile('''
- class A {
- var x, y = 2, z = "hi";
- }
+test() {
+ var x = null;
+ x = "hi";
+ x = 3;
+}
+''');
+ }
- class B implements A {
- var x = 2, y = 3, z, w = 2;
- }
-
- foo() {
- String s;
- int i;
-
- s = /*info:DYNAMIC_CAST*/new B().x;
- s = /*warning:INVALID_ASSIGNMENT*/new B().y;
- s = new B().z;
- s = /*warning:INVALID_ASSIGNMENT*/new B().w;
-
- i = /*info:DYNAMIC_CAST*/new B().x;
- i = new B().y;
- i = /*warning:INVALID_ASSIGNMENT*/new B().z;
- i = new B().w;
- }
- ''');
- });
-
- test('infer consts transitively', () {
- addFile(
- '''
- const b1 = 2;
- ''',
- name: '/b.dart');
- addFile(
- '''
- import 'main.dart';
- import 'b.dart';
- const a1 = m2;
- const a2 = b1;
- ''',
- name: '/a.dart');
+ void test_downwardInference_miscellaneous() {
checkFile('''
- import 'a.dart';
- const m1 = a1;
- const m2 = a2;
+typedef T Function2<S, T>(S x);
+class A<T> {
+ Function2<T, T> x;
+ A(this.x);
+}
+void main() {
+ { // Variables, nested literals
+ var x = "hello";
+ var y = 3;
+ void f(List<Map<int, String>> l) {};
+ f(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/{y: x}]);
+ }
+ {
+ int f(int x) => 0;
+ A<int> a = /*info:INFERRED_TYPE_ALLOCATION*/new A(f);
+ }
+}
+''');
+ }
- foo() {
- int i;
- i = m1;
- }
- ''');
- });
-
- test('infer statics transitively', () {
- addFile(
- '''
- final b1 = 2;
- ''',
- name: '/b.dart');
- addFile(
- '''
- import 'main.dart';
- import 'b.dart';
- final a1 = m2;
- class A {
- static final a2 = b1;
- }
- ''',
- name: '/a.dart');
+ void test_downwardsInferenceAnnotations() {
checkFile('''
- import 'a.dart';
- final m1 = a1;
- final m2 = A.a2;
+class Foo {
+ const Foo(List<String> l);
+ const Foo.named(List<String> l);
+}
+@Foo(/*info:INFERRED_TYPE_LITERAL*/const [])
+class Bar {}
+@Foo.named(/*info:INFERRED_TYPE_LITERAL*/const [])
+class Baz {}
+''');
+ }
- foo() {
- int i;
- i = m1;
- }
- ''');
- });
-
- test('infer statics transitively 2', () {
+ void test_downwardsInferenceAssignmentStatements() {
checkFile('''
- const x1 = 1;
- final x2 = 1;
- final y1 = x1;
- final y2 = x2;
+void main() {
+ List<int> l;
+ l = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
+ l = (l = /*info:INFERRED_TYPE_LITERAL*/[1]);
+}
+''');
+ }
- foo() {
- int i;
- i = y1;
- i = y2;
- }
- ''');
- });
-
- test('infer statics transitively 3', () {
- addFile(
- '''
- const a1 = 3;
- const a2 = 4;
- class A {
- static const a3 = null;
- }
- ''',
- name: '/a.dart');
+ void test_downwardsInferenceAsyncAwait() {
checkFile('''
- import 'a.dart' show a1, A;
- import 'a.dart' as p show a2, A;
- const t1 = 1;
- const t2 = t1;
- const t3 = a1;
- const t4 = p.a2;
- const t5 = A.a3;
- const t6 = p.A.a3;
+import 'dart:async';
+Future test() async {
+ dynamic d;
+ List<int> l0 = /*warning:DOWN_CAST_COMPOSITE should be pass*/await /*pass should be info:INFERRED_TYPE_LITERAL*/[d];
+ List<int> l1 = await /*info:INFERRED_TYPE_ALLOCATION*/new Future.value(/*info:INFERRED_TYPE_LITERAL*/[/*info:DYNAMIC_CAST*/d]);
+}
+''');
+ }
- foo() {
- int i;
- i = t1;
- i = t2;
- i = t3;
- i = t4;
- }
- ''');
- });
-
- test('infer statics with method invocations', () {
- addFile(
- '''
- m3(String a, String b, [a1,a2]) {}
- ''',
- name: '/a.dart');
+ void test_downwardsInferenceForEach() {
checkFile('''
- import 'a.dart';
- class T {
- static final T foo = m1(m2(m3('', '')));
- static T m1(String m) { return null; }
- static String m2(e) { return ''; }
- }
+import 'dart:async';
+Future main() async {
+ for(int x in /*info:INFERRED_TYPE_LITERAL*/[1, 2, 3]) {}
+ await for(int x in /*info:INFERRED_TYPE_ALLOCATION*/new Stream()) {}
+}
+''');
+ }
-
- ''');
- });
-
- test('downwards inference: miscellaneous', () {
+ void test_downwardsInferenceInitializingFormalDefaultFormal() {
checkFile('''
- typedef T Function2<S, T>(S x);
- class A<T> {
- Function2<T, T> x;
- A(this.x);
- }
- void main() {
- { // Variables, nested literals
- var x = "hello";
- var y = 3;
- void f(List<Map<int, String>> l) {};
- f(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/{y: x}]);
- }
- {
- int f(int x) => 0;
- A<int> a = /*info:INFERRED_TYPE_ALLOCATION*/new A(f);
- }
- }
- ''');
- });
+typedef T Function2<S, T>([S x]);
+class Foo {
+ List<int> x;
+ Foo([this.x = /*info:INFERRED_TYPE_LITERAL*/const [1]]);
+ Foo.named([List<int> x = /*info:INFERRED_TYPE_LITERAL*/const [1]]);
+}
+void f([List<int> l = /*info:INFERRED_TYPE_LITERAL*/const [1]]) {}
+// We do this inference in an early task but don't preserve the infos.
+Function2<List<int>, String> g = /*pass should be info:INFERRED_TYPE_CLOSURE*/([llll = /*info:INFERRED_TYPE_LITERAL*/const [1]]) => "hello";
+''');
+ }
- group('downwards inference on instance creations', () {
- test('infer downwards', () {
- checkFile('''
- class A<S, T> {
- S x;
- T y;
- A(this.x, this.y);
- A.named(this.x, this.y);
- }
+ void test_downwardsInferenceOnConstructorArguments_inferDownwards() {
+ checkFile('''
+class F0 {
+ F0(List<int> a) {}
+}
+class F1 {
+ F1({List<int> a}) {}
+}
+class F2 {
+ F2(Iterable<int> a) {}
+}
+class F3 {
+ F3(Iterable<Iterable<int>> a) {}
+}
+class F4 {
+ F4({Iterable<Iterable<int>> a}) {}
+}
+void main() {
+ new F0(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F0(/*info:INFERRED_TYPE_LITERAL*/[3]);
+ new F0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ new F0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello",
+ 3]);
- class B<S, T> extends A<T, S> {
- B(S y, T x) : super(x, y);
- B.named(S y, T x) : super.named(x, y);
- }
+ new F1(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ new F1(a: /*info:INFERRED_TYPE_LITERAL*/[3]);
+ new F1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ new F1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
- class C<S> extends B<S, S> {
- C(S a) : super(a, a);
- C.named(S a) : super.named(a, a);
- }
+ new F2(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F2(/*info:INFERRED_TYPE_LITERAL*/[3]);
+ new F2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ new F2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
- class D<S, T> extends B<T, int> {
- D(T a) : super(a, 3);
- D.named(T a) : super.named(a, 3);
- }
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
+ /*info:INFERRED_TYPE_LITERAL*/[3]]);
- class E<S, T> extends A<C<S>, T> {
- E(T a) : super(null, a);
- }
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
+ /*info:INFERRED_TYPE_LITERAL*/[3]]);
+}
+''');
+ }
- class F<S, T> extends A<S, T> {
- F(S x, T y, {List<S> a, List<T> b}) : super(x, y);
- F.named(S x, T y, [S a, T b]) : super(a, b);
- }
+ void test_downwardsInferenceOnFunctionArguments_inferDownwards() {
+ checkFile('''
+void f0(List<int> a) {}
+void f1({List<int> a}) {}
+void f2(Iterable<int> a) {}
+void f3(Iterable<Iterable<int>> a) {}
+void f4({Iterable<Iterable<int>> a}) {}
+void main() {
+ f0(/*info:INFERRED_TYPE_LITERAL*/[]);
+ f0(/*info:INFERRED_TYPE_LITERAL*/[3]);
+ f0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ f0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
- void main() {
- {
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new A(3, "hello");
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new A.named(3, "hello");
- A<int, String> a2 = new A<int, String>(3, "hello");
- A<int, String> a3 = new A<int, String>.named(3, "hello");
- A<int, String> a4 = /*severe:STATIC_TYPE_ERROR*/new A<int, dynamic>(3, "hello");
- A<int, String> a5 = /*severe:STATIC_TYPE_ERROR*/new A<dynamic, dynamic>.named(3, "hello");
- }
- {
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new A(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello",
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new A.named(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello",
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
- }
- {
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new B("hello", 3);
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new B.named("hello", 3);
- A<int, String> a2 = new B<String, int>("hello", 3);
- A<int, String> a3 = new B<String, int>.named("hello", 3);
- A<int, String> a4 = /*severe:STATIC_TYPE_ERROR*/new B<String, dynamic>("hello", 3);
- A<int, String> a5 = /*severe:STATIC_TYPE_ERROR*/new B<dynamic, dynamic>.named("hello", 3);
- }
- {
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new B(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3,
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new B.named(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3,
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
- }
- {
- A<int, int> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new C(3);
- A<int, int> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(3);
- A<int, int> a2 = new C<int>(3);
- A<int, int> a3 = new C<int>.named(3);
- A<int, int> a4 = /*severe:STATIC_TYPE_ERROR*/new C<dynamic>(3);
- A<int, int> a5 = /*severe:STATIC_TYPE_ERROR*/new C<dynamic>.named(3);
- }
- {
- A<int, int> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new C(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
- A<int, int> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
- }
- {
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new D("hello");
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new D.named("hello");
- A<int, String> a2 = new D<int, String>("hello");
- A<int, String> a3 = new D<String, String>.named("hello");
- A<int, String> a4 = /*severe:STATIC_TYPE_ERROR*/new D<num, dynamic>("hello");
- A<int, String> a5 = /*severe:STATIC_TYPE_ERROR*/new D<dynamic, dynamic>.named("hello");
- }
- {
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new D(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new D.named(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
- }
- { // Currently we only allow variable constraints. Test that we reject.
- A<C<int>, String> a0 = /*severe:STATIC_TYPE_ERROR*/new E("hello");
- }
- { // Check named and optional arguments
- A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new F(3, "hello",
- a: /*info:INFERRED_TYPE_LITERAL*/[3],
- b: /*info:INFERRED_TYPE_LITERAL*/["hello"]);
- A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new F(3, "hello",
- a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
- b: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3]);
- A<int, String> a2 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello", 3, "hello");
- A<int, String> a3 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello");
- A<int, String> a4 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello",
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello", /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
- A<int, String> a5 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello",
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
- }
- }
- ''');
- });
- });
+ f1(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ f1(a: /*info:INFERRED_TYPE_LITERAL*/[3]);
+ f1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ f1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
- group('downwards inference on list literals', () {
- test('infer downwards', () {
- checkFile('''
- void foo([List<String> list1 = /*info:INFERRED_TYPE_LITERAL*/const [],
- List<String> list2 = /*info:INFERRED_TYPE_LITERAL*/const [/*severe:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/42]]) {
- }
+ f2(/*info:INFERRED_TYPE_LITERAL*/[]);
+ f2(/*info:INFERRED_TYPE_LITERAL*/[3]);
+ f2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ f2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
- void main() {
- {
- List<int> l0 = /*info:INFERRED_TYPE_LITERAL*/[];
- List<int> l1 = /*info:INFERRED_TYPE_LITERAL*/[3];
- List<int> l2 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
- List<int> l3 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
- }
- {
- List<dynamic> l0 = [];
- List<dynamic> l1 = [3];
- List<dynamic> l2 = ["hello"];
- List<dynamic> l3 = ["hello", 3];
- }
- {
- List<int> l0 = /*severe:STATIC_TYPE_ERROR*/<num>[];
- List<int> l1 = /*severe:STATIC_TYPE_ERROR*/<num>[3];
- List<int> l2 = /*severe:STATIC_TYPE_ERROR*/<num>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
- List<int> l3 = /*severe:STATIC_TYPE_ERROR*/<num>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
- }
- {
- Iterable<int> i0 = /*info:INFERRED_TYPE_LITERAL*/[];
- Iterable<int> i1 = /*info:INFERRED_TYPE_LITERAL*/[3];
- Iterable<int> i2 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
- Iterable<int> i3 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
- }
- {
- const List<int> c0 = /*info:INFERRED_TYPE_LITERAL*/const [];
- const List<int> c1 = /*info:INFERRED_TYPE_LITERAL*/const [3];
- const List<int> c2 = /*info:INFERRED_TYPE_LITERAL*/const [/*severe:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
- const List<int> c3 = /*info:INFERRED_TYPE_LITERAL*/const [/*severe:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
- }
- }
- ''');
- });
+ f3(/*info:INFERRED_TYPE_LITERAL*/[]);
+ f3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
+ f3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
+ f3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"], /*info:INFERRED_TYPE_LITERAL*/[3]]);
- test('infer if value types match context', () {
- checkFile(r'''
+ f4(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ f4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
+ f4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
+ f4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"], /*info:INFERRED_TYPE_LITERAL*/[3]]);
+}
+''');
+ }
+
+ void test_downwardsInferenceOnFunctionExpressions() {
+ checkFile('''
+typedef T Function2<S, T>(S x);
+
+void main () {
+ {
+ Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => null;
+ Function2<int, String> l1 = (int x) => "hello";
+ Function2<int, String> l2 = /*warning:INVALID_ASSIGNMENT*/(String x) => "hello";
+ Function2<int, String> l3 = /*warning:INVALID_ASSIGNMENT*/(int x) => 3;
+ Function2<int, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(int x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
+ }
+ {
+ Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => null;
+ Function2<int, String> l1 = /*info:INFERRED_TYPE_CLOSURE*/(x) => "hello";
+ Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*/(x) => 3;
+ Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
+ Function2<int, String> l4 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/x;};
+ }
+ {
+ Function2<int, List<String>> l0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => null;
+ Function2<int, List<String>> l1 = (int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+ Function2<int, List<String>> l2 = /*warning:INVALID_ASSIGNMENT*/(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+ Function2<int, List<String>> l3 = (int x) => /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
+ Function2<int, List<String>> l4 = /*info:INFERRED_TYPE_CLOSURE*/(int x) {return /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];};
+ }
+ {
+ Function2<int, int> l0 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x;
+ Function2<int, int> l1 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x+1;
+ Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*/(x) => x;
+ Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/x.substring(3);
+ Function2<String, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x.substring(3);
+ }
+}
+''');
+ }
+
+ void test_downwardsInferenceOnFunctionOfTUsingTheT() {
+ checkFile('''
+void main () {
+ {
+ /*=T*/ f/*<T>*/(/*=T*/ x) => null;
+ var v1 = f;
+ v1 = /*info:INFERRED_TYPE_CLOSURE*//*<S>*/(x) => x;
+ }
+ {
+ /*=List<T>*/ f/*<T>*/(/*=T*/ x) => null;
+ var v2 = f;
+ v2 = /*info:INFERRED_TYPE_CLOSURE*//*<S>*/(x) => /*info:INFERRED_TYPE_LITERAL*/[x];
+ Iterable<int> r = v2(42);
+ Iterable<String> s = v2('hello');
+ Iterable<List<int>> t = v2(<int>[]);
+ Iterable<num> u = v2(42);
+ Iterable<num> v = v2/*<num>*/(42);
+ }
+}
+''');
+ }
+
+ void test_downwardsInferenceOnGenericConstructorArguments_inferDownwards() {
+ checkFile('''
+class F0<T> {
+ F0(List<T> a) {}
+}
+class F1<T> {
+ F1({List<T> a}) {}
+}
+class F2<T> {
+ F2(Iterable<T> a) {}
+}
+class F3<T> {
+ F3(Iterable<Iterable<T>> a) {}
+}
+class F4<T> {
+ F4({Iterable<Iterable<T>> a}) {}
+}
+void main() {
+ new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[3]);
+ new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello",
+ 3]);
+
+ new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[3]);
+ new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
+
+ new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[3]);
+ new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
+ new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
+
+ new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
+ new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
+ new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
+ /*info:INFERRED_TYPE_LITERAL*/[3]]);
+
+ new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
+ new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
+ new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
+ /*info:INFERRED_TYPE_LITERAL*/[3]]);
+
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[]);
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[[3]]);
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[["hello"]]);
+ new F3(/*info:INFERRED_TYPE_LITERAL*/[["hello"], [3]]);
+
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[]);
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[[3]]);
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[["hello"]]);
+ new F4(a: /*info:INFERRED_TYPE_LITERAL*/[["hello"], [3]]);
+}
+''');
+ }
+
+ void test_downwardsInferenceOnGenericFunctionExpressions() {
+ checkFile('''
+void main () {
+ {
+ String f/*<S>*/(int x) => null;
+ var v = f;
+ v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) => null;
+ v = /*<T>*/(int x) => "hello";
+ v = /*warning:INVALID_ASSIGNMENT*//*<T>*/(String x) => "hello";
+ v = /*warning:INVALID_ASSIGNMENT*//*<T>*/(int x) => 3;
+ v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
+ }
+ {
+ String f/*<S>*/(int x) => null;
+ var v = f;
+ v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => null;
+ v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => "hello";
+ v = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*//*<T>*/(x) => 3;
+ v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
+ v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/x;};
+ }
+ {
+ List<String> f/*<S>*/(int x) => null;
+ var v = f;
+ v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) => null;
+ v = /*<T>*/(int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+ v = /*warning:INVALID_ASSIGNMENT*//*<T>*/(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
+ v = /*<T>*/(int x) => /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
+ v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) {return /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];};
+ }
+ {
+ int int2int/*<S>*/(int x) => null;
+ String int2String/*<T>*/(int x) => null;
+ String string2String/*<T>*/(String x) => null;
+ var x = int2int;
+ x = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => x;
+ x = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => x+1;
+ var y = int2String;
+ y = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*//*<T>*/(x) => x;
+ y = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/x.substring(3);
+ var z = string2String;
+ z = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => x.substring(3);
+ }
+}
+''');
+ }
+
+ void test_downwardsInferenceOnInstanceCreations_inferDownwards() {
+ checkFile('''
+class A<S, T> {
+ S x;
+ T y;
+ A(this.x, this.y);
+ A.named(this.x, this.y);
+}
+
+class B<S, T> extends A<T, S> {
+ B(S y, T x) : super(x, y);
+ B.named(S y, T x) : super.named(x, y);
+}
+
+class C<S> extends B<S, S> {
+ C(S a) : super(a, a);
+ C.named(S a) : super.named(a, a);
+}
+
+class D<S, T> extends B<T, int> {
+ D(T a) : super(a, 3);
+ D.named(T a) : super.named(a, 3);
+}
+
+class E<S, T> extends A<C<S>, T> {
+ E(T a) : super(null, a);
+}
+
+class F<S, T> extends A<S, T> {
+ F(S x, T y, {List<S> a, List<T> b}) : super(x, y);
+ F.named(S x, T y, [S a, T b]) : super(a, b);
+}
+
+void main() {
+ {
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new A(3, "hello");
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new A.named(3, "hello");
+ A<int, String> a2 = new A<int, String>(3, "hello");
+ A<int, String> a3 = new A<int, String>.named(3, "hello");
+ A<int, String> a4 = /*severe:STATIC_TYPE_ERROR*/new A<int, dynamic>(3, "hello");
+ A<int, String> a5 = /*severe:STATIC_TYPE_ERROR*/new A<dynamic, dynamic>.named(3, "hello");
+ }
+ {
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new A(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello",
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new A.named(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello",
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+ }
+ {
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new B("hello", 3);
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new B.named("hello", 3);
+ A<int, String> a2 = new B<String, int>("hello", 3);
+ A<int, String> a3 = new B<String, int>.named("hello", 3);
+ A<int, String> a4 = /*severe:STATIC_TYPE_ERROR*/new B<String, dynamic>("hello", 3);
+ A<int, String> a5 = /*severe:STATIC_TYPE_ERROR*/new B<dynamic, dynamic>.named("hello", 3);
+ }
+ {
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new B(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3,
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new B.named(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3,
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
+ }
+ {
+ A<int, int> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new C(3);
+ A<int, int> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(3);
+ A<int, int> a2 = new C<int>(3);
+ A<int, int> a3 = new C<int>.named(3);
+ A<int, int> a4 = /*severe:STATIC_TYPE_ERROR*/new C<dynamic>(3);
+ A<int, int> a5 = /*severe:STATIC_TYPE_ERROR*/new C<dynamic>.named(3);
+ }
+ {
+ A<int, int> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new C(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
+ A<int, int> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new C.named(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
+ }
+ {
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new D("hello");
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new D.named("hello");
+ A<int, String> a2 = new D<int, String>("hello");
+ A<int, String> a3 = new D<String, String>.named("hello");
+ A<int, String> a4 = /*severe:STATIC_TYPE_ERROR*/new D<num, dynamic>("hello");
+ A<int, String> a5 = /*severe:STATIC_TYPE_ERROR*/new D<dynamic, dynamic>.named("hello");
+ }
+ {
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new D(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new D.named(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+ }
+ { // Currently we only allow variable constraints. Test that we reject.
+ A<C<int>, String> a0 = /*severe:STATIC_TYPE_ERROR*/new E("hello");
+ }
+ { // Check named and optional arguments
+ A<int, String> a0 = /*info:INFERRED_TYPE_ALLOCATION*/new F(3, "hello",
+ a: /*info:INFERRED_TYPE_LITERAL*/[3],
+ b: /*info:INFERRED_TYPE_LITERAL*/["hello"]);
+ A<int, String> a1 = /*info:INFERRED_TYPE_ALLOCATION*/new F(3, "hello",
+ a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
+ b: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3]);
+ A<int, String> a2 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello", 3, "hello");
+ A<int, String> a3 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello");
+ A<int, String> a4 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello",
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello", /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/3);
+ A<int, String> a5 = /*info:INFERRED_TYPE_ALLOCATION*/new F.named(3, "hello",
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hello");
+ }
+}
+ ''');
+ }
+
+ void test_downwardsInferenceOnListLiterals_inferDownwards() {
+ checkFile('''
+void foo([List<String> list1 = /*info:INFERRED_TYPE_LITERAL*/const [],
+ List<String> list2 = /*info:INFERRED_TYPE_LITERAL*/const [/*severe:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/42]]) {
+}
+
+void main() {
+ {
+ List<int> l0 = /*info:INFERRED_TYPE_LITERAL*/[];
+ List<int> l1 = /*info:INFERRED_TYPE_LITERAL*/[3];
+ List<int> l2 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
+ List<int> l3 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
+ }
+ {
+ List<dynamic> l0 = [];
+ List<dynamic> l1 = [3];
+ List<dynamic> l2 = ["hello"];
+ List<dynamic> l3 = ["hello", 3];
+ }
+ {
+ List<int> l0 = /*severe:STATIC_TYPE_ERROR*/<num>[];
+ List<int> l1 = /*severe:STATIC_TYPE_ERROR*/<num>[3];
+ List<int> l2 = /*severe:STATIC_TYPE_ERROR*/<num>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
+ List<int> l3 = /*severe:STATIC_TYPE_ERROR*/<num>[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
+ }
+ {
+ Iterable<int> i0 = /*info:INFERRED_TYPE_LITERAL*/[];
+ Iterable<int> i1 = /*info:INFERRED_TYPE_LITERAL*/[3];
+ Iterable<int> i2 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
+ Iterable<int> i3 = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
+ }
+ {
+ const List<int> c0 = /*info:INFERRED_TYPE_LITERAL*/const [];
+ const List<int> c1 = /*info:INFERRED_TYPE_LITERAL*/const [3];
+ const List<int> c2 = /*info:INFERRED_TYPE_LITERAL*/const [/*severe:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
+ const List<int> c3 = /*info:INFERRED_TYPE_LITERAL*/const [/*severe:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE,warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3];
+ }
+}
+''');
+ }
+
+ void test_downwardsInferenceOnListLiterals_inferIfValueTypesMatchContext() {
+ checkFile(r'''
class DartType {}
typedef void Asserter<T>(T type);
typedef Asserter<T> AsserterBuilder<S, T>(S arg);
@@ -1237,9 +933,9 @@
assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]);
assertEOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]);
}
-}
+ }
-abstract class G<T> {
+ abstract class G<T> {
AsserterBuilder<List<Asserter<DartType>>, DartType> assertAOf;
AsserterBuilder<List<Asserter<DartType>>, DartType> get assertDOf;
@@ -1270,571 +966,305 @@
g.assertAOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]);
g.assertDOf(/*info:INFERRED_TYPE_LITERAL*/[_isInt, _isString]);
}
- ''');
- });
- });
+ ''');
+ }
- group('downwards inference on function arguments', () {
- test('infer downwards', () {
- checkFile('''
- void f0(List<int> a) {}
- void f1({List<int> a}) {}
- void f2(Iterable<int> a) {}
- void f3(Iterable<Iterable<int>> a) {}
- void f4({Iterable<Iterable<int>> a}) {}
- void main() {
- f0(/*info:INFERRED_TYPE_LITERAL*/[]);
- f0(/*info:INFERRED_TYPE_LITERAL*/[3]);
- f0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- f0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- f1(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- f1(a: /*info:INFERRED_TYPE_LITERAL*/[3]);
- f1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- f1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- f2(/*info:INFERRED_TYPE_LITERAL*/[]);
- f2(/*info:INFERRED_TYPE_LITERAL*/[3]);
- f2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- f2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- f3(/*info:INFERRED_TYPE_LITERAL*/[]);
- f3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
- f3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
- f3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"], /*info:INFERRED_TYPE_LITERAL*/[3]]);
-
- f4(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- f4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
- f4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
- f4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"], /*info:INFERRED_TYPE_LITERAL*/[3]]);
- }
- ''');
- });
- });
-
- group('downwards inference on constructor arguments', () {
- test('infer downwards', () {
- checkFile('''
- class F0 {
- F0(List<int> a) {}
- }
- class F1 {
- F1({List<int> a}) {}
- }
- class F2 {
- F2(Iterable<int> a) {}
- }
- class F3 {
- F3(Iterable<Iterable<int>> a) {}
- }
- class F4 {
- F4({Iterable<Iterable<int>> a}) {}
- }
- void main() {
- new F0(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F0(/*info:INFERRED_TYPE_LITERAL*/[3]);
- new F0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- new F0(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello",
- 3]);
-
- new F1(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- new F1(a: /*info:INFERRED_TYPE_LITERAL*/[3]);
- new F1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- new F1(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- new F2(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F2(/*info:INFERRED_TYPE_LITERAL*/[3]);
- new F2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- new F2(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- new F3(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
- new F3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
- new F3(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
- /*info:INFERRED_TYPE_LITERAL*/[3]]);
-
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
- /*info:INFERRED_TYPE_LITERAL*/[3]]);
- }
- ''');
- });
- });
-
- group('downwards inference on generic constructor arguments', () {
- test('infer downwards', () {
- checkFile('''
- class F0<T> {
- F0(List<T> a) {}
- }
- class F1<T> {
- F1({List<T> a}) {}
- }
- class F2<T> {
- F2(Iterable<T> a) {}
- }
- class F3<T> {
- F3(Iterable<Iterable<T>> a) {}
- }
- class F4<T> {
- F4({Iterable<Iterable<T>> a}) {}
- }
- void main() {
- new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[3]);
- new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- new F0<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello",
- 3]);
-
- new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[3]);
- new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- new F1<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[3]);
- new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]);
- new F2<int>(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello", 3]);
-
- new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
- new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
- new F3<int>(/*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
- /*info:INFERRED_TYPE_LITERAL*/[3]]);
-
- new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[3]]);
- new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"]]);
- new F4<int>(a: /*info:INFERRED_TYPE_LITERAL*/[/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"],
- /*info:INFERRED_TYPE_LITERAL*/[3]]);
-
- new F3(/*info:INFERRED_TYPE_LITERAL*/[]);
- new F3(/*info:INFERRED_TYPE_LITERAL*/[[3]]);
- new F3(/*info:INFERRED_TYPE_LITERAL*/[["hello"]]);
- new F3(/*info:INFERRED_TYPE_LITERAL*/[["hello"], [3]]);
-
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[]);
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[[3]]);
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[["hello"]]);
- new F4(a: /*info:INFERRED_TYPE_LITERAL*/[["hello"], [3]]);
- }
- ''');
- });
- });
-
- group('downwards inference on map literals', () {
- test('infer downwards', () {
- checkFile('''
- void foo([Map<int, String> m1 = /*info:INFERRED_TYPE_LITERAL*/const {1: "hello"},
- Map<int, String> m2 = /*info:INFERRED_TYPE_LITERAL*/const {
- // The warning is the type error, and the severe is the compile time
- // error from const evaluation.
- /*severe:MAP_KEY_TYPE_NOT_ASSIGNABLE,warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
- "world"
- }]) {
- }
- void main() {
- {
- Map<int, String> l0 = /*info:INFERRED_TYPE_LITERAL*/{};
- Map<int, String> l1 = /*info:INFERRED_TYPE_LITERAL*/{3: "hello"};
- Map<int, String> l2 = /*info:INFERRED_TYPE_LITERAL*/{
- /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello": "hello"
- };
- Map<int, String> l3 = /*info:INFERRED_TYPE_LITERAL*/{
- 3: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
- };
- Map<int, String> l4 = /*info:INFERRED_TYPE_LITERAL*/{
- 3: "hello",
- /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
- /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
- };
- }
- {
- Map<dynamic, dynamic> l0 = {};
- Map<dynamic, dynamic> l1 = {3: "hello"};
- Map<dynamic, dynamic> l2 = {"hello": "hello"};
- Map<dynamic, dynamic> l3 = {3: 3};
- Map<dynamic, dynamic> l4 = {3:"hello", "hello": 3};
- }
- {
- Map<dynamic, String> l0 = /*info:INFERRED_TYPE_LITERAL*/{};
- Map<dynamic, String> l1 = /*info:INFERRED_TYPE_LITERAL*/{3: "hello"};
- Map<dynamic, String> l2 = /*info:INFERRED_TYPE_LITERAL*/{"hello": "hello"};
- Map<dynamic, String> l3 = /*info:INFERRED_TYPE_LITERAL*/{
- 3: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
- };
- Map<dynamic, String> l4 = /*info:INFERRED_TYPE_LITERAL*/{
- 3: "hello",
- "hello": /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
- };
- }
- {
- Map<int, dynamic> l0 = /*info:INFERRED_TYPE_LITERAL*/{};
- Map<int, dynamic> l1 = /*info:INFERRED_TYPE_LITERAL*/{3: "hello"};
- Map<int, dynamic> l2 = /*info:INFERRED_TYPE_LITERAL*/{
- /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello": "hello"
- };
- Map<int, dynamic> l3 = /*info:INFERRED_TYPE_LITERAL*/{3: 3};
- Map<int, dynamic> l4 = /*info:INFERRED_TYPE_LITERAL*/{
- 3:"hello",
- /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello": 3
- };
- }
- {
- Map<int, String> l0 = /*severe:STATIC_TYPE_ERROR*/<num, dynamic>{};
- Map<int, String> l1 = /*severe:STATIC_TYPE_ERROR*/<num, dynamic>{3: "hello"};
- Map<int, String> l3 = /*severe:STATIC_TYPE_ERROR*/<num, dynamic>{3: 3};
- }
- {
- const Map<int, String> l0 = /*info:INFERRED_TYPE_LITERAL*/const {};
- const Map<int, String> l1 = /*info:INFERRED_TYPE_LITERAL*/const {3: "hello"};
- const Map<int, String> l2 = /*info:INFERRED_TYPE_LITERAL*/const {
- /*severe:MAP_KEY_TYPE_NOT_ASSIGNABLE,warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
- "hello"
- };
- const Map<int, String> l3 = /*info:INFERRED_TYPE_LITERAL*/const {
- 3: /*severe:MAP_VALUE_TYPE_NOT_ASSIGNABLE,warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
- };
- const Map<int, String> l4 = /*info:INFERRED_TYPE_LITERAL*/const {
- 3:"hello",
- /*severe:MAP_KEY_TYPE_NOT_ASSIGNABLE,warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
- /*severe:MAP_VALUE_TYPE_NOT_ASSIGNABLE,warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
- };
- }
- }
- ''');
- });
- });
-
- test('downwards inference on function expressions', () {
+ void test_downwardsInferenceOnMapLiterals() {
checkFile('''
- typedef T Function2<S, T>(S x);
-
- void main () {
- {
- Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => null;
- Function2<int, String> l1 = (int x) => "hello";
- Function2<int, String> l2 = /*warning:INVALID_ASSIGNMENT*/(String x) => "hello";
- Function2<int, String> l3 = /*warning:INVALID_ASSIGNMENT*/(int x) => 3;
- Function2<int, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(int x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
- }
- {
- Function2<int, String> l0 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => null;
- Function2<int, String> l1 = /*info:INFERRED_TYPE_CLOSURE*/(x) => "hello";
- Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*/(x) => 3;
- Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
- Function2<int, String> l4 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/x;};
- }
- {
- Function2<int, List<String>> l0 = /*info:INFERRED_TYPE_CLOSURE*/(int x) => null;
- Function2<int, List<String>> l1 = (int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
- Function2<int, List<String>> l2 = /*warning:INVALID_ASSIGNMENT*/(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
- Function2<int, List<String>> l3 = (int x) => /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
- Function2<int, List<String>> l4 = /*info:INFERRED_TYPE_CLOSURE*/(int x) {return /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];};
- }
- {
- Function2<int, int> l0 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x;
- Function2<int, int> l1 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x+1;
- Function2<int, String> l2 = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*/(x) => x;
- Function2<int, String> l3 = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*/(x) => /*info:DYNAMIC_CAST, info:DYNAMIC_INVOKE*/x.substring(3);
- Function2<String, String> l4 = /*info:INFERRED_TYPE_CLOSURE*/(x) => x.substring(3);
- }
- }
- ''');
- });
-
- test('downwards inference on generic function expressions', () {
- checkFile('''
- void main () {
- {
- String f/*<S>*/(int x) => null;
- var v = f;
- v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) => null;
- v = /*<T>*/(int x) => "hello";
- v = /*warning:INVALID_ASSIGNMENT*//*<T>*/(String x) => "hello";
- v = /*warning:INVALID_ASSIGNMENT*//*<T>*/(int x) => 3;
- v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
- }
- {
- String f/*<S>*/(int x) => null;
- var v = f;
- v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => null;
- v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => "hello";
- v = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*//*<T>*/(x) => 3;
- v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/3;};
- v = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) {return /*warning:RETURN_OF_INVALID_TYPE*/x;};
- }
- {
- List<String> f/*<S>*/(int x) => null;
- var v = f;
- v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) => null;
- v = /*<T>*/(int x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
- v = /*warning:INVALID_ASSIGNMENT*//*<T>*/(String x) => /*info:INFERRED_TYPE_LITERAL*/["hello"];
- v = /*<T>*/(int x) => /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];
- v = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(int x) {return /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/3];};
- }
- {
- int int2int/*<S>*/(int x) => null;
- String int2String/*<T>*/(int x) => null;
- String string2String/*<T>*/(String x) => null;
- var x = int2int;
- x = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => x;
- x = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => x+1;
- var y = int2String;
- y = /*info:INFERRED_TYPE_CLOSURE, warning:INVALID_ASSIGNMENT*//*<T>*/(x) => x;
- y = /*info:INFERRED_TYPE_CLOSURE, info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => /*info:DYNAMIC_INVOKE, info:DYNAMIC_CAST*/x.substring(3);
- var z = string2String;
- z = /*info:INFERRED_TYPE_CLOSURE*//*<T>*/(x) => x.substring(3);
- }
- }
- ''');
- });
-
- test('downwards inference on function<T> using the T', () {
- checkFile('''
- void main () {
- {
- /*=T*/ f/*<T>*/(/*=T*/ x) => null;
- var v1 = f;
- v1 = /*info:INFERRED_TYPE_CLOSURE*//*<S>*/(x) => x;
- }
- {
- /*=List<T>*/ f/*<T>*/(/*=T*/ x) => null;
- var v2 = f;
- v2 = /*info:INFERRED_TYPE_CLOSURE*//*<S>*/(x) => /*info:INFERRED_TYPE_LITERAL*/[x];
- Iterable<int> r = v2(42);
- Iterable<String> s = v2('hello');
- Iterable<List<int>> t = v2(<int>[]);
- Iterable<num> u = v2(42);
- Iterable<num> v = v2/*<num>*/(42);
- }
- }
- ''');
- });
-
- test('downwards inference initializing formal, default formal', () {
- checkFile('''
- typedef T Function2<S, T>([S x]);
- class Foo {
- List<int> x;
- Foo([this.x = /*info:INFERRED_TYPE_LITERAL*/const [1]]);
- Foo.named([List<int> x = /*info:INFERRED_TYPE_LITERAL*/const [1]]);
- }
- void f([List<int> l = /*info:INFERRED_TYPE_LITERAL*/const [1]]) {}
- // We do this inference in an early task but don't preserve the infos.
- Function2<List<int>, String> g = /*pass should be info:INFERRED_TYPE_CLOSURE*/([llll = /*info:INFERRED_TYPE_LITERAL*/const [1]]) => "hello";
- ''');
- });
-
- test('downwards inference async/await', () {
- checkFile('''
- import 'dart:async';
- Future test() async {
- dynamic d;
- List<int> l0 = /*warning:DOWN_CAST_COMPOSITE should be pass*/await /*pass should be info:INFERRED_TYPE_LITERAL*/[d];
- List<int> l1 = await /*info:INFERRED_TYPE_ALLOCATION*/new Future.value(/*info:INFERRED_TYPE_LITERAL*/[/*info:DYNAMIC_CAST*/d]);
- }
- ''');
- });
-
- test('downwards inference foreach', () {
- checkFile('''
- import 'dart:async';
- Future main() async {
- for(int x in /*info:INFERRED_TYPE_LITERAL*/[1, 2, 3]) {}
- await for(int x in /*info:INFERRED_TYPE_ALLOCATION*/new Stream()) {}
- }
- ''');
- });
-
- test('downwards inference yield/yield*', () {
- checkFile('''
- import 'dart:async';
- Stream<List<int>> foo() async* {
- yield /*info:INFERRED_TYPE_LITERAL*/[];
- yield /*warning:YIELD_OF_INVALID_TYPE*/new Stream();
- yield* /*warning:YIELD_OF_INVALID_TYPE*/[];
- yield* /*info:INFERRED_TYPE_ALLOCATION*/new Stream();
- }
-
- Iterable<Map<int, int>> bar() sync* {
- yield /*info:INFERRED_TYPE_LITERAL*/{};
- yield /*warning:YIELD_OF_INVALID_TYPE*/new List();
- yield* /*warning:YIELD_OF_INVALID_TYPE*/{};
- yield* /*info:INFERRED_TYPE_ALLOCATION*/new List();
- }
- ''');
- });
-
- test('downwards inference, annotations', () {
- checkFile('''
- class Foo {
- const Foo(List<String> l);
- const Foo.named(List<String> l);
- }
- @Foo(/*info:INFERRED_TYPE_LITERAL*/const [])
- class Bar {}
- @Foo.named(/*info:INFERRED_TYPE_LITERAL*/const [])
- class Baz {}
- ''');
- });
-
- test('downwards inference, assignment statements', () {
- checkFile('''
- void main() {
- List<int> l;
- l = /*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/"hello"];
- l = (l = /*info:INFERRED_TYPE_LITERAL*/[1]);
- }
+void foo([Map<int, String> m1 = /*info:INFERRED_TYPE_LITERAL*/const {1: "hello"},
+ Map<int, String> m2 = /*info:INFERRED_TYPE_LITERAL*/const {
+ // The warning is the type error, and the severe is the compile time
+ // error from const evaluation.
+ /*severe:MAP_KEY_TYPE_NOT_ASSIGNABLE,warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
+ "world"
+ }]) {
+}
+void main() {
+ {
+ Map<int, String> l0 = /*info:INFERRED_TYPE_LITERAL*/{};
+ Map<int, String> l1 = /*info:INFERRED_TYPE_LITERAL*/{3: "hello"};
+ Map<int, String> l2 = /*info:INFERRED_TYPE_LITERAL*/{
+ /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello": "hello"
+ };
+ Map<int, String> l3 = /*info:INFERRED_TYPE_LITERAL*/{
+ 3: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
+ };
+ Map<int, String> l4 = /*info:INFERRED_TYPE_LITERAL*/{
+ 3: "hello",
+ /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
+ /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
+ };
+ }
+ {
+ Map<dynamic, dynamic> l0 = {};
+ Map<dynamic, dynamic> l1 = {3: "hello"};
+ Map<dynamic, dynamic> l2 = {"hello": "hello"};
+ Map<dynamic, dynamic> l3 = {3: 3};
+ Map<dynamic, dynamic> l4 = {3:"hello", "hello": 3};
+ }
+ {
+ Map<dynamic, String> l0 = /*info:INFERRED_TYPE_LITERAL*/{};
+ Map<dynamic, String> l1 = /*info:INFERRED_TYPE_LITERAL*/{3: "hello"};
+ Map<dynamic, String> l2 = /*info:INFERRED_TYPE_LITERAL*/{"hello": "hello"};
+ Map<dynamic, String> l3 = /*info:INFERRED_TYPE_LITERAL*/{
+ 3: /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
+ };
+ Map<dynamic, String> l4 = /*info:INFERRED_TYPE_LITERAL*/{
+ 3: "hello",
+ "hello": /*warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
+ };
+ }
+ {
+ Map<int, dynamic> l0 = /*info:INFERRED_TYPE_LITERAL*/{};
+ Map<int, dynamic> l1 = /*info:INFERRED_TYPE_LITERAL*/{3: "hello"};
+ Map<int, dynamic> l2 = /*info:INFERRED_TYPE_LITERAL*/{
+ /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello": "hello"
+ };
+ Map<int, dynamic> l3 = /*info:INFERRED_TYPE_LITERAL*/{3: 3};
+ Map<int, dynamic> l4 = /*info:INFERRED_TYPE_LITERAL*/{
+ 3:"hello",
+ /*warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello": 3
+ };
+ }
+ {
+ Map<int, String> l0 = /*severe:STATIC_TYPE_ERROR*/<num, dynamic>{};
+ Map<int, String> l1 = /*severe:STATIC_TYPE_ERROR*/<num, dynamic>{3: "hello"};
+ Map<int, String> l3 = /*severe:STATIC_TYPE_ERROR*/<num, dynamic>{3: 3};
+ }
+ {
+ const Map<int, String> l0 = /*info:INFERRED_TYPE_LITERAL*/const {};
+ const Map<int, String> l1 = /*info:INFERRED_TYPE_LITERAL*/const {3: "hello"};
+ const Map<int, String> l2 = /*info:INFERRED_TYPE_LITERAL*/const {
+ /*severe:MAP_KEY_TYPE_NOT_ASSIGNABLE,warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
+ "hello"
+ };
+ const Map<int, String> l3 = /*info:INFERRED_TYPE_LITERAL*/const {
+ 3: /*severe:MAP_VALUE_TYPE_NOT_ASSIGNABLE,warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
+ };
+ const Map<int, String> l4 = /*info:INFERRED_TYPE_LITERAL*/const {
+ 3:"hello",
+ /*severe:MAP_KEY_TYPE_NOT_ASSIGNABLE,warning:MAP_KEY_TYPE_NOT_ASSIGNABLE*/"hello":
+ /*severe:MAP_VALUE_TYPE_NOT_ASSIGNABLE,warning:MAP_VALUE_TYPE_NOT_ASSIGNABLE*/3
+ };
+ }
+}
''');
- });
+ }
- test('inferred initializing formal checks default value', () {
+ void test_downwardsInferenceYieldYieldStar() {
checkFile('''
- class Foo {
- var x = 1;
- Foo([this.x = /*warning:INVALID_ASSIGNMENT*/"1"]);
- }''');
- });
+import 'dart:async';
+Stream<List<int>> foo() async* {
+ yield /*info:INFERRED_TYPE_LITERAL*/[];
+ yield /*warning:YIELD_OF_INVALID_TYPE*/new Stream();
+ yield* /*warning:YIELD_OF_INVALID_TYPE*/[];
+ yield* /*info:INFERRED_TYPE_ALLOCATION*/new Stream();
+}
- group('generic methods', () {
- test('dart:math min/max', () {
- checkFile('''
- import 'dart:math';
+Iterable<Map<int, int>> bar() sync* {
+ yield /*info:INFERRED_TYPE_LITERAL*/{};
+ yield /*warning:YIELD_OF_INVALID_TYPE*/new List();
+ yield* /*warning:YIELD_OF_INVALID_TYPE*/{};
+ yield* /*info:INFERRED_TYPE_ALLOCATION*/new List();
+}
+ ''');
+ }
- void printInt(int x) => print(x);
- void printDouble(double x) => print(x);
+ void test_genericMethods_basicDownwardInference() {
+ checkFile(r'''
+/*=T*/ f/*<S, T>*/(/*=S*/ s) => null;
+main() {
+ String x = f(42);
+ String y = (f)(42);
+}
+''');
+ }
- num myMax(num x, num y) => max(x, y);
+ void test_genericMethods_correctlyRecognizeGenericUpperBound() {
+ // Regression test for https://github.com/dart-lang/sdk/issues/25740.
+ checkFile(r'''
+class Foo<T extends Pattern> {
+void method/*<U extends T>*/(dynamic/*=U*/ u) {}
+}
+main() {
+ new Foo().method/*<String>*/("str");
+ new Foo();
- main() {
- // Okay if static types match.
- printInt(max(1, 2));
- printInt(min(1, 2));
- printDouble(max(1.0, 2.0));
- printDouble(min(1.0, 2.0));
+ new Foo<String>().method("str");
+ new Foo().method("str");
- // No help for user-defined functions from num->num->num.
- printInt(/*info:DOWN_CAST_IMPLICIT*/myMax(1, 2));
- printInt(myMax(1, 2) as int);
+ new Foo<String>().method(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/42);
+}
+''');
+ }
- // Mixing int and double means return type is num.
- printInt(/*info:DOWN_CAST_IMPLICIT*/max(1, 2.0));
- printInt(/*info:DOWN_CAST_IMPLICIT*/min(1, 2.0));
- printDouble(/*info:DOWN_CAST_IMPLICIT*/max(1, 2.0));
- printDouble(/*info:DOWN_CAST_IMPLICIT*/min(1, 2.0));
+ void test_genericMethods_dartMathMinMax() {
+ checkFile('''
+import 'dart:math';
- // Types other than int and double are not accepted.
- printInt(
- /*info:DOWN_CAST_IMPLICIT*/min(
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hi",
- /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"there"));
- }
- ''');
- });
+void printInt(int x) => print(x);
+void printDouble(double x) => print(x);
- test('Iterable and Future', () {
- checkFile('''
- import 'dart:async';
+num myMax(num x, num y) => max(x, y);
- Future<int> make(int x) => (/*info:INFERRED_TYPE_ALLOCATION*/new Future(() => x));
+main() {
+ // Okay if static types match.
+ printInt(max(1, 2));
+ printInt(min(1, 2));
+ printDouble(max(1.0, 2.0));
+ printDouble(min(1.0, 2.0));
- main() {
- Iterable<Future<int>> list = <int>[1, 2, 3].map(make);
- Future<List<int>> results = Future.wait(list);
- Future<String> results2 = results.then((List<int> list)
- => list.fold('', /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y.toString()));
- }
- ''');
- });
+ // No help for user-defined functions from num->num->num.
+ printInt(/*info:DOWN_CAST_IMPLICIT*/myMax(1, 2));
+ printInt(myMax(1, 2) as int);
- // TODO(jmesserly): we should change how this inference works.
- // For now this test will cover what we use.
- test('infer JS builtin', () {
- checkFile('''
- import 'dart:_foreign_helper' show JS;
- main() {
- String x = /*warning:INVALID_ASSIGNMENT*/JS('int', '42');
- var y = JS('String', '"hello"');
- y = "world";
- y = /*warning:INVALID_ASSIGNMENT*/42;
- }
- ''');
- });
+ // Mixing int and double means return type is num.
+ printInt(/*info:DOWN_CAST_IMPLICIT*/max(1, 2.0));
+ printInt(/*info:DOWN_CAST_IMPLICIT*/min(1, 2.0));
+ printDouble(/*info:DOWN_CAST_IMPLICIT*/max(1, 2.0));
+ printDouble(/*info:DOWN_CAST_IMPLICIT*/min(1, 2.0));
- test('inferred generic instantiation', () {
- checkFile('''
+ // Types other than int and double are not accepted.
+ printInt(
+ /*info:DOWN_CAST_IMPLICIT*/min(
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"hi",
+ /*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/"there"));
+}
+''');
+ }
+
+ void test_genericMethods_doNotInferInvalidOverrideOfGenericMethod() {
+ checkFile('''
+class C {
+/*=T*/ m/*<T>*/(/*=T*/ x) => x;
+}
+class D extends C {
+/*severe:INVALID_METHOD_OVERRIDE*/m(x) => x;
+}
+main() {
+ int y = /*info:DYNAMIC_CAST*/new D()./*warning:WRONG_NUMBER_OF_TYPE_ARGUMENTS*/m/*<int>*/(42);
+ print(y);
+}
+''');
+ }
+
+ void test_genericMethods_downwardsInferenceAffectsArguments() {
+ checkFile(r'''
+/*=T*/ f/*<T>*/(List/*<T>*/ s) => null;
+main() {
+ String x = f(/*info:INFERRED_TYPE_LITERAL*/['hi']);
+ String y = f(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/42]);
+}
+''');
+ }
+
+ void test_genericMethods_downwardsInferenceFold() {
+ // Regression from https://github.com/dart-lang/sdk/issues/25491
+ // The first example works now, but the latter requires a full solution to
+ // https://github.com/dart-lang/sdk/issues/25490
+ checkFile(r'''
+void main() {
+ List<int> o;
+ int y = o.fold(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y);
+ var z = o.fold(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
+ y = /*info:DYNAMIC_CAST*/z;
+}
+void functionExpressionInvocation() {
+ List<int> o;
+ int y = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y);
+ var z = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
+ y = /*info:DYNAMIC_CAST*/z;
+}
+''');
+ }
+
+ void test_genericMethods_handleOverrideOfNonGenericWithGeneric() {
+ // Regression test for crash when adding genericity
+ checkFile('''
+class C {
+ m(x) => x;
+}
+class D extends C {
+ /*=T*/ m/*<T>*/(/*=T*/ x) => x;
+}
+main() {
+ int y = /*info:DYNAMIC_CAST*/(new D() as C).m(42);
+ print(y);
+}
+ ''');
+ }
+
+ void test_genericMethods_inferGenericInstantiation() {
+ checkFile('''
import 'dart:math' as math;
import 'dart:math' show min;
class C {
- /*=T*/ m/*<T extends num>*/(/*=T*/ x, /*=T*/ y) => null;
+/*=T*/ m/*<T extends num>*/(/*=T*/ x, /*=T*/ y) => null;
}
main() {
- takeIII(math.max);
- takeDDD(math.max);
- takeNNN(math.max);
- takeIDN(math.max);
- takeDIN(math.max);
- takeIIN(math.max);
- takeDDN(math.max);
- takeIIO(math.max);
- takeDDO(math.max);
+takeIII(math.max);
+takeDDD(math.max);
+takeNNN(math.max);
+takeIDN(math.max);
+takeDIN(math.max);
+takeIIN(math.max);
+takeDDN(math.max);
+takeIIO(math.max);
+takeDDO(math.max);
- takeOOI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
- takeIDI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
- takeDID(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
- takeOON(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
- takeOOO(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
+takeOOI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
+takeIDI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
+takeDID(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
+takeOON(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
+takeOOO(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/math.max);
- // Also test SimpleIdentifier
- takeIII(min);
- takeDDD(min);
- takeNNN(min);
- takeIDN(min);
- takeDIN(min);
- takeIIN(min);
- takeDDN(min);
- takeIIO(min);
- takeDDO(min);
+// Also test SimpleIdentifier
+takeIII(min);
+takeDDD(min);
+takeNNN(min);
+takeIDN(min);
+takeDIN(min);
+takeIIN(min);
+takeDDN(min);
+takeIIO(min);
+takeDDO(min);
- takeOOI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
- takeIDI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
- takeDID(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
- takeOON(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
- takeOOO(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
+takeOOI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
+takeIDI(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
+takeDID(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
+takeOON(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
+takeOOO(/*severe:STATIC_TYPE_ERROR,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/min);
- // Also PropertyAccess
- takeIII(new C().m);
- takeDDD(new C().m);
- takeNNN(new C().m);
- takeIDN(new C().m);
- takeDIN(new C().m);
- takeIIN(new C().m);
- takeDDN(new C().m);
- takeIIO(new C().m);
- takeDDO(new C().m);
+// Also PropertyAccess
+takeIII(new C().m);
+takeDDD(new C().m);
+takeNNN(new C().m);
+takeIDN(new C().m);
+takeDIN(new C().m);
+takeIIN(new C().m);
+takeDDN(new C().m);
+takeIIO(new C().m);
+takeDDO(new C().m);
- // Note: this is a warning because a downcast of a method tear-off could work
- // (derived method can be a subtype):
- //
- // class D extends C {
- // S m<S extends num>(Object x, Object y);
- // }
- //
- // That's legal because we're loosening parameter types.
- //
- takeOON(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
- takeOOO(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
+// Note: this is a warning because a downcast of a method tear-off could work
+// (derived method can be a subtype):
+//
+// class D extends C {
+// S m<S extends num>(Object x, Object y);
+// }
+//
+// That's legal because we're loosening parameter types.
+//
+takeOON(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
+takeOOO(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
- // Note: this is a warning because a downcast of a method tear-off could work
- // in "normal" Dart, due to bivariance.
- takeOOI(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
- takeIDI(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
- takeDID(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
+// Note: this is a warning because a downcast of a method tear-off could work
+// in "normal" Dart, due to bivariance.
+takeOOI(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
+takeIDI(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
+takeDID(/*warning:DOWN_CAST_COMPOSITE,warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/new C().m);
}
void takeIII(int fn(int a, int b)) {}
@@ -1851,12 +1281,12 @@
void takeOOI(int fn(Object a, Object b)) {}
void takeIIO(Object fn(int a, int b)) {}
void takeDDO(Object fn(double a, double b)) {}
- ''');
- });
+''');
+ }
+ void test_genericMethods_inferGenericMethodType() {
// Regression test for https://github.com/dart-lang/sdk/issues/25668
- test('infer generic method type', () {
- checkFile('''
+ checkFile('''
class C {
/*=T*/ m/*<T>*/(/*=T*/ x) => x;
}
@@ -1867,125 +1297,1082 @@
int y = new D().m/*<int>*/(42);
print(y);
}
- ''');
- });
-
- test('do not infer invalid override of generic method', () {
- checkFile('''
-class C {
- /*=T*/ m/*<T>*/(/*=T*/ x) => x;
-}
-class D extends C {
- /*severe:INVALID_METHOD_OVERRIDE*/m(x) => x;
-}
-main() {
- int y = /*info:DYNAMIC_CAST*/new D()./*warning:WRONG_NUMBER_OF_TYPE_ARGUMENTS*/m/*<int>*/(42);
- print(y);
-}
- ''');
- });
-
- // Regression test for crash when adding genericity
- test('handle override of non-generic with generic', () {
- checkFile('''
-class C {
- m(x) => x;
-}
-class D extends C {
- /*=T*/ m/*<T>*/(/*=T*/ x) => x;
-}
-main() {
- int y = /*info:DYNAMIC_CAST*/(new D() as C).m(42);
- print(y);
-}
- ''');
- });
-
- test('correctly recognize generic upper bound', () {
- // Regression test for https://github.com/dart-lang/sdk/issues/25740.
- checkFile(r'''
-class Foo<T extends Pattern> {
- void method/*<U extends T>*/(dynamic/*=U*/ u) {}
-}
-main() {
- new Foo().method/*<String>*/("str");
- new Foo();
-
- new Foo<String>().method("str");
- new Foo().method("str");
-
- new Foo<String>().method(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/42);
-}
- ''');
- });
-
- test('basic downwards inference', () {
- checkFile(r'''
-/*=T*/ f/*<S, T>*/(/*=S*/ s) => null;
-main() {
- String x = f(42);
- String y = (f)(42);
-}
- ''');
- });
-
- test('downwards inference affects arguments', () {
- checkFile(r'''
-/*=T*/ f/*<T>*/(List/*<T>*/ s) => null;
-main() {
- String x = f(/*info:INFERRED_TYPE_LITERAL*/['hi']);
- String y = f(/*info:INFERRED_TYPE_LITERAL*/[/*warning:LIST_ELEMENT_TYPE_NOT_ASSIGNABLE*/42]);
-}
- ''');
- });
-
- test('downwards inference fold', () {
- // Regression from https://github.com/dart-lang/sdk/issues/25491
- // The first example works now, but the latter requires a full solution to
- // https://github.com/dart-lang/sdk/issues/25490
- checkFile(r'''
-void main() {
- List<int> o;
- int y = o.fold(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y);
- var z = o.fold(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
- y = /*info:DYNAMIC_CAST*/z;
-}
-void functionExpressionInvocation() {
- List<int> o;
- int y = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y);
- var z = (o.fold)(0, /*info:INFERRED_TYPE_CLOSURE*/(x, y) => /*info:DYNAMIC_INVOKE*/x + y);
- y = /*info:DYNAMIC_CAST*/z;
-}
- ''');
- });
- });
-
- // Regression test for https://github.com/dart-lang/dev_compiler/issues/47
- test('null literal should not infer as bottom', () {
- checkFile(r'''
- var h = null;
- void foo(int f(Object _)) {}
-
- main() {
- var f = (Object x) => null;
- String y = /*info:DYNAMIC_CAST*/f(42);
-
- f = /*info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
-
- var g = null;
- g = 'hello';
- (/*info:DYNAMIC_INVOKE*/g.foo());
-
- h = 'hello';
- (/*info:DYNAMIC_INVOKE*/h.foo());
-
- foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) => null);
- foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) => throw "not implemented");
- }
''');
- });
+ }
- test('list literals', () {
+ void test_genericMethods_inferJSBuiltin() {
+ // TODO(jmesserly): we should change how this inference works.
+ // For now this test will cover what we use.
+ checkFile('''
+import 'dart:_foreign_helper' show JS;
+main() {
+ String x = /*warning:INVALID_ASSIGNMENT*/JS('int', '42');
+ var y = JS('String', '"hello"');
+ y = "world";
+ y = /*warning:INVALID_ASSIGNMENT*/42;
+}
+''');
+ }
+
+ void test_genericMethods_IterableAndFuture() {
+ checkFile('''
+import 'dart:async';
+
+Future<int> make(int x) => (/*info:INFERRED_TYPE_ALLOCATION*/new Future(() => x));
+
+main() {
+ Iterable<Future<int>> list = <int>[1, 2, 3].map(make);
+ Future<List<int>> results = Future.wait(list);
+ Future<String> results2 = results.then((List<int> list)
+ => list.fold('', /*info:INFERRED_TYPE_CLOSURE*/(x, y) => x + y.toString()));
+}
+''');
+ }
+
+ void test_infer_assignToIndex() {
+ checkFile(r'''
+List<double> a = <double>[];
+var b = (a[0] = 1.0);
+''');
+ }
+
+ void test_infer_assignToProperty() {
+ checkFile(r'''
+class A {
+ int f;
+}
+var v_assign = (new A().f = 1);
+var v_plus = (new A().f += 1);
+var v_minus = (new A().f -= 1);
+var v_multiply = (new A().f *= 1);
+var v_prefix_pp = (++new A().f);
+var v_prefix_mm = (--new A().f);
+var v_postfix_pp = (new A().f++);
+var v_postfix_mm = (new A().f--);
+''');
+ }
+
+ void test_infer_assignToProperty_custom() {
+ checkFile(r'''
+class A {
+ int operator +(other) => 1;
+ double operator -(other) => 2.0;
+}
+class B {
+ A a;
+}
+var v_prefix_pp = (++new B().a);
+var v_prefix_mm = (--new B().a);
+var v_postfix_pp = (new B().a++);
+var v_postfix_mm = (new B().a--);
+''');
+ }
+
+ void test_infer_assignToRef() {
+ checkFile(r'''
+class A {
+ int f;
+}
+A a = new A();
+var b = (a.f = 1);
+var c = 0;
+var d = (c = 1);
+''');
+ }
+
+ void test_infer_binary_custom() {
+ checkFile(r'''
+class A {
+ int operator +(other) => 1;
+ double operator -(other) => 2.0;
+}
+var v_add = new A() + 'foo';
+var v_minus = new A() - 'bar';
+''');
+ }
+
+ void test_infer_binary_doubleDouble() {
+ checkFile(r'''
+var a_equal = 1.0 == 2.0;
+var a_notEqual = 1.0 != 2.0;
+var a_add = 1.0 + 2.0;
+var a_subtract = 1.0 - 2.0;
+var a_multiply = 1.0 * 2.0;
+var a_divide = 1.0 / 2.0;
+var a_floorDivide = 1.0 ~/ 2.0;
+var a_greater = 1.0 > 2.0;
+var a_less = 1.0 < 2.0;
+var a_greaterEqual = 1.0 >= 2.0;
+var a_lessEqual = 1.0 <= 2.0;
+var a_modulo = 1.0 % 2.0;
+''');
+ }
+
+ void test_infer_binary_doubleInt() {
+ checkFile(r'''
+var a_equal = 1.0 == 2;
+var a_notEqual = 1.0 != 2;
+var a_add = 1.0 + 2;
+var a_subtract = 1.0 - 2;
+var a_multiply = 1.0 * 2;
+var a_divide = 1.0 / 2;
+var a_floorDivide = 1.0 ~/ 2;
+var a_greater = 1.0 > 2;
+var a_less = 1.0 < 2;
+var a_greaterEqual = 1.0 >= 2;
+var a_lessEqual = 1.0 <= 2;
+var a_modulo = 1.0 % 2;
+''');
+ }
+
+ void test_infer_binary_intDouble() {
+ checkFile(r'''
+var a_equal = 1 == 2.0;
+var a_notEqual = 1 != 2.0;
+var a_add = 1 + 2.0;
+var a_subtract = 1 - 2.0;
+var a_multiply = 1 * 2.0;
+var a_divide = 1 / 2.0;
+var a_floorDivide = 1 ~/ 2.0;
+var a_greater = 1 > 2.0;
+var a_less = 1 < 2.0;
+var a_greaterEqual = 1 >= 2.0;
+var a_lessEqual = 1 <= 2.0;
+var a_modulo = 1 % 2.0;
+''');
+ }
+
+ void test_infer_binary_intInt() {
+ checkFile(r'''
+var a_equal = 1 == 2;
+var a_notEqual = 1 != 2;
+var a_bitXor = 1 ^ 2;
+var a_bitAnd = 1 & 2;
+var a_bitOr = 1 | 2;
+var a_bitShiftRight = 1 >> 2;
+var a_bitShiftLeft = 1 << 2;
+var a_add = 1 + 2;
+var a_subtract = 1 - 2;
+var a_multiply = 1 * 2;
+var a_divide = 1 / 2;
+var a_floorDivide = 1 ~/ 2;
+var a_greater = 1 > 2;
+var a_less = 1 < 2;
+var a_greaterEqual = 1 >= 2;
+var a_lessEqual = 1 <= 2;
+var a_modulo = 1 % 2;
+''');
+ }
+
+ void test_infer_conditional() {
+ checkFile(r'''
+var a = 1 == 2 ? 1 : 2.0;
+var b = 1 == 2 ? 1.0 : 2;
+''');
+ }
+
+ void test_infer_prefixExpression() {
+ checkFile(r'''
+var a_not = !true;
+var a_complement = ~1;
+var a_negate = -1;
+''');
+ }
+
+ void test_infer_prefixExpression_custom() {
+ checkFile(r'''
+class A {
+ A();
+ int operator ~() => 1;
+ double operator -() => 2.0;
+}
+var a = new A();
+var v_complement = ~a;
+var v_negate = -a;
+''');
+ }
+
+ void test_infer_throw() {
+ checkFile(r'''
+var t = true;
+var a = (throw 0);
+var b = (throw 0) ? 1 : 2;
+var c = t ? (throw 1) : 2;
+var d = t ? 1 : (throw 2);
+''');
+ }
+
+ void test_infer_typeCast() {
+ checkFile(r'''
+class A<T> {}
+class B<T> extends A<T> {
+ foo() {}
+}
+A<num> a = new B<int>();
+var b = (a as B<int>);
+main() {
+ b.foo();
+}
+''');
+ }
+
+ void test_infer_typedListLiteral() {
+ checkFile(r'''
+var a = <int>[];
+var b = <double>[1.0, 2.0, 3.0];
+var c = <List<int>>[];
+var d = <dynamic>[1, 2.0, false];
+''');
+ }
+
+ void test_infer_typedMapLiteral() {
+ checkFile(r'''
+var a = <int, String>{0: 'aaa', 1: 'bbb'};
+var b = <double, int>{1.1: 1, 2.2: 2};
+var c = <List<int>, Map<String, double>>{};
+var d = <int, dynamic>{};
+var e = <dynamic, int>{};
+var f = <dynamic, dynamic>{};
+''');
+ }
+
+ void test_infer_use_of_void() {
+ checkFile('''
+class B {
+ void f() {}
+}
+class C extends B {
+ f() {}
+}
+var x = new C()./*info:USE_OF_VOID_RESULT*/f();
+''');
+ }
+
+ void test_inferConstsTransitively() {
+ addFile(
+ '''
+const b1 = 2;
+''',
+ name: '/b.dart');
+ addFile(
+ '''
+import 'main.dart';
+import 'b.dart';
+const a1 = m2;
+const a2 = b1;
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+const m1 = a1;
+const m2 = a2;
+
+foo() {
+ int i;
+ i = m1;
+}
+''');
+ }
+
+ void test_inferCorrectlyOnMultipleVariablesDeclaredTogether() {
+ checkFile('''
+class A {
+ var x, y = 2, z = "hi";
+}
+
+class B implements A {
+ var x = 2, y = 3, z, w = 2;
+}
+
+foo() {
+ String s;
+ int i;
+
+ s = /*info:DYNAMIC_CAST*/new B().x;
+ s = /*warning:INVALID_ASSIGNMENT*/new B().y;
+ s = new B().z;
+ s = /*warning:INVALID_ASSIGNMENT*/new B().w;
+
+ i = /*info:DYNAMIC_CAST*/new B().x;
+ i = new B().y;
+ i = /*warning:INVALID_ASSIGNMENT*/new B().z;
+ i = new B().w;
+}
+''');
+ }
+
+ void test_inferenceInCyclesIsDeterministic() {
+ addFile(
+ '''
+import 'b.dart';
+class A {
+ static final a1 = B.b1;
+ final a2 = new B().b2;
+}
+''',
+ name: '/a.dart');
+ addFile(
+ '''
+class B {
+ static final b1 = 1;
+ final b2 = 1;
+}
+''',
+ name: '/b.dart');
+ addFile(
+ '''
+import "main.dart"; // creates a cycle
+
+class C {
+ static final c1 = 1;
+ final c2 = 1;
+}
+''',
+ name: '/c.dart');
+ addFile(
+ '''
+library e;
+import 'a.dart';
+part 'e2.dart';
+
+class E {
+ static final e1 = 1;
+ static final e2 = F.f1;
+ static final e3 = A.a1;
+ final e4 = 1;
+ final e5 = new F().f2;
+ final e6 = new A().a2;
+}
+''',
+ name: '/e.dart');
+ addFile(
+ '''
+part 'f2.dart';
+''',
+ name: '/f.dart');
+ addFile(
+ '''
+part of e;
+class F {
+ static final f1 = 1;
+ final f2 = 1;
+}
+''',
+ name: '/e2.dart');
+ checkFile('''
+import "a.dart";
+import "c.dart";
+import "e.dart";
+
+class D {
+ static final d1 = A.a1 + 1;
+ static final d2 = C.c1 + 1;
+ final d3 = new A().a2;
+ final d4 = new C().c2;
+}
+
+test1() {
+ int x = 0;
+ // inference in A works, it's not in a cycle
+ x = A.a1;
+ x = new A().a2;
+
+ // Within a cycle we allow inference when the RHS is well known, but
+ // not when it depends on other fields within the cycle
+ x = C.c1;
+ x = D.d1;
+ x = D.d2;
+ x = new C().c2;
+ x = new D().d3;
+ x = /*info:DYNAMIC_CAST*/new D().d4;
+
+
+ // Similarly if the library contains parts.
+ x = E.e1;
+ x = E.e2;
+ x = E.e3;
+ x = new E().e4;
+ x = /*info:DYNAMIC_CAST*/new E().e5;
+ x = new E().e6;
+ x = F.f1;
+ x = new F().f2;
+}
+''');
+ }
+
+ void test_inferFromComplexExpressionsIfOuterMostValueIsPrecise() {
+ checkFile('''
+class A { int x; B operator+(other) => null; }
+class B extends A { B(ignore); }
+var a = new A();
+// Note: it doesn't matter that some of these refer to 'x'.
+var b = new B(/*warning:UNDEFINED_IDENTIFIER*/x); // allocations
+var c1 = [/*warning:UNDEFINED_IDENTIFIER*/x]; // list literals
+var c2 = const [];
+var d = <dynamic, dynamic>{'a': 'b'}; // map literals
+var e = new A()..x = 3; // cascades
+var f = 2 + 3; // binary expressions are OK if the left operand
+ // is from a library in a different strongest
+ // conected component.
+var g = -3;
+var h = new A() + 3;
+var i = /*warning:UNDEFINED_OPERATOR*/- new A();
+var j = null as B;
+
+test1() {
+ a = /*warning:INVALID_ASSIGNMENT*/"hi";
+ a = new B(3);
+ b = /*warning:INVALID_ASSIGNMENT*/"hi";
+ b = new B(3);
+ c1 = [];
+ c1 = /*warning:INVALID_ASSIGNMENT*/{};
+ c2 = [];
+ c2 = /*warning:INVALID_ASSIGNMENT*/{};
+ d = {};
+ d = /*warning:INVALID_ASSIGNMENT*/3;
+ e = new A();
+ e = /*warning:INVALID_ASSIGNMENT*/{};
+ f = 3;
+ f = /*warning:INVALID_ASSIGNMENT*/false;
+ g = 1;
+ g = /*warning:INVALID_ASSIGNMENT*/false;
+ h = /*warning:INVALID_ASSIGNMENT*/false;
+ h = new B('b');
+ i = false;
+ j = new B('b');
+ j = /*warning:INVALID_ASSIGNMENT*/false;
+ j = /*warning:INVALID_ASSIGNMENT*/[];
+}
+''');
+ }
+
+ void test_inferFromRhsOnlyIfItWontConflictWithOverriddenFields() {
+ checkFile('''
+class A {
+ var x;
+}
+
+class B implements A {
+ var x = 2;
+}
+
+foo() {
+ String y = /*info:DYNAMIC_CAST*/new B().x;
+ int z = /*info:DYNAMIC_CAST*/new B().x;
+}
+''');
+ }
+
+ void test_inferFromRhsOnlyIfItWontConflictWithOverriddenFields2() {
+ checkFile('''
+class A {
+ final x = null;
+}
+
+class B implements A {
+ final x = 2;
+}
+
+foo() {
+ String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
+ int z = new B().x;
+}
+''');
+ }
+
+ void test_inferFromVariablesInCycleLibsWhenFlagIsOn() {
+ addFile(
+ '''
+import 'main.dart';
+var x = 2; // ok to infer
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+var y = x; // now ok :)
+
+test1() {
+ int t = 3;
+ t = x;
+ t = y;
+}
+''');
+ }
+
+ void test_inferFromVariablesInCycleLibsWhenFlagIsOn2() {
+ addFile(
+ '''
+import 'main.dart';
+class A { static var x = 2; }
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+class B { static var y = A.x; }
+
+test1() {
+ int t = 3;
+ t = A.x;
+ t = B.y;
+}
+''');
+ }
+
+ void test_inferFromVariablesInNonCycleImportsWithFlag() {
+ addFile(
+ '''
+var x = 2;
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+var y = x;
+
+test1() {
+ x = /*warning:INVALID_ASSIGNMENT*/"hi";
+ y = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
+
+ void test_inferFromVariablesInNonCycleImportsWithFlag2() {
+ addFile(
+ '''
+class A { static var x = 2; }
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+class B { static var y = A.x; }
+
+test1() {
+ A.x = /*warning:INVALID_ASSIGNMENT*/"hi";
+ B.y = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
+
+ void test_inferGenericMethodType_named() {
+ var unit = checkFile('''
+class C {
+ /*=T*/ m/*<T>*/(int a, {String b, /*=T*/ c}) => null;
+}
+var y = new C().m(1, b: 'bbb', c: 2.0);
+ ''');
+ expect(unit.topLevelVariables[0].type.toString(), 'double');
+ }
+
+ void test_inferGenericMethodType_positional() {
+ var unit = checkFile('''
+class C {
+ /*=T*/ m/*<T>*/(int a, [/*=T*/ b]) => null;
+}
+var y = new C().m(1, 2.0);
+ ''');
+ expect(unit.topLevelVariables[0].type.toString(), 'double');
+ }
+
+ void test_inferGenericMethodType_positional2() {
+ var unit = checkFile('''
+class C {
+ /*=T*/ m/*<T>*/(int a, [String b, /*=T*/ c]) => null;
+}
+var y = new C().m(1, 'bbb', 2.0);
+ ''');
+ expect(unit.topLevelVariables[0].type.toString(), 'double');
+ }
+
+ void test_inferGenericMethodType_required() {
+ var unit = checkFile('''
+class C {
+ /*=T*/ m/*<T>*/(/*=T*/ x) => x;
+}
+var y = new C().m(42);
+ ''');
+ expect(unit.topLevelVariables[0].type.toString(), 'int');
+ }
+
+ void test_inferIfComplexExpressionsReadPossibleInferredField() {
+ // but flags can enable this behavior.
+ addFile(
+ '''
+class A {
+ var x = 3;
+}
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+class B {
+ var y = 3;
+}
+final t1 = new A();
+final t2 = new A().x;
+final t3 = new B();
+final t4 = new B().y;
+
+test1() {
+ int i = 0;
+ A a;
+ B b;
+ a = t1;
+ i = t2;
+ b = t3;
+ i = /*info:DYNAMIC_CAST*/t4;
+ i = new B().y; // B.y was inferred though
+}
+''');
+ }
+
+ void test_inferListLiteralNestedInMapLiteral() {
+ checkFile(r'''
+class Resource {}
+class Folder extends Resource {}
+
+Resource getResource(String str) => null;
+
+class Foo<T> {
+ Foo(T t);
+}
+
+main() {
+ // List inside map
+ var map = <String, List<Folder>>{
+ 'pkgA': /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/')],
+ 'pkgB': /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgB/lib/')]
+ };
+ // Also try map inside list
+ var list = <Map<String, Folder>>[
+ /*info:INFERRED_TYPE_LITERAL*/{ 'pkgA': /*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/') },
+ /*info:INFERRED_TYPE_LITERAL*/{ 'pkgB': /*info:DOWN_CAST_IMPLICIT*/getResource('/pkgB/lib/') },
+ ];
+ // Instance creation too
+ var foo = new Foo<List<Folder>>(
+ /*info:INFERRED_TYPE_LITERAL*/[/*info:DOWN_CAST_IMPLICIT*/getResource('/pkgA/lib/')]
+ );
+}
+ ''');
+ }
+
+ void test_inferredInitializingFormalChecksDefaultValue() {
+ checkFile('''
+class Foo {
+ var x = 1;
+ Foo([this.x = /*warning:INVALID_ASSIGNMENT*/"1"]);
+}''');
+ }
+
+ void test_inferStaticsTransitively() {
+ addFile(
+ '''
+final b1 = 2;
+''',
+ name: '/b.dart');
+ addFile(
+ '''
+import 'main.dart';
+import 'b.dart';
+final a1 = m2;
+class A {
+ static final a2 = b1;
+}
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+final m1 = a1;
+final m2 = A.a2;
+
+foo() {
+ int i;
+ i = m1;
+}
+''');
+ }
+
+ void test_inferStaticsTransitively2() {
+ checkFile('''
+const x1 = 1;
+final x2 = 1;
+final y1 = x1;
+final y2 = x2;
+
+foo() {
+ int i;
+ i = y1;
+ i = y2;
+}
+''');
+ }
+
+ void test_inferStaticsTransitively3() {
+ addFile(
+ '''
+const a1 = 3;
+const a2 = 4;
+class A {
+ static const a3 = null;
+}
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart' show a1, A;
+import 'a.dart' as p show a2, A;
+const t1 = 1;
+const t2 = t1;
+const t3 = a1;
+const t4 = p.a2;
+const t5 = A.a3;
+const t6 = p.A.a3;
+
+foo() {
+ int i;
+ i = t1;
+ i = t2;
+ i = t3;
+ i = t4;
+}
+''');
+ }
+
+ void test_inferStaticsWithMethodInvocations() {
+ addFile(
+ '''
+m3(String a, String b, [a1,a2]) {}
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+class T {
+ static final T foo = m1(m2(m3('', '')));
+ static T m1(String m) { return null; }
+ static String m2(e) { return ''; }
+}
+''');
+ }
+
+ void test_inferTypeOnOverriddenFields2() {
+ checkFile('''
+class A {
+ int x = 2;
+}
+
+class B extends A {
+ /*severe:INVALID_FIELD_OVERRIDE*/get x => 3;
+}
+
+foo() {
+ String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
+ int z = new B().x;
+}
+''');
+ }
+
+ void test_inferTypeOnOverriddenFields4() {
+ checkFile('''
+class A {
+ final int x = 2;
+}
+
+class B implements A {
+ get x => 3;
+}
+
+foo() {
+ String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
+ int z = new B().x;
+}
+''');
+ }
+
+ void test_inferTypeOnVar() {
+ // Error also expected when declared type is `int`.
+ checkFile('''
+test1() {
+ int x = 3;
+ x = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
+
+ void test_inferTypeOnVar2() {
+ checkFile('''
+test2() {
+ var x = 3;
+ x = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
+
+ void test_inferTypeOnVarFromField() {
+ checkFile('''
+class A {
+ int x = 0;
+
+ test1() {
+ var a = x;
+ a = /*warning:INVALID_ASSIGNMENT*/"hi";
+ a = 3;
+ var b = y;
+ b = /*warning:INVALID_ASSIGNMENT*/"hi";
+ b = 4;
+ var c = z;
+ c = /*warning:INVALID_ASSIGNMENT*/"hi";
+ c = 4;
+ }
+
+ int y; // field def after use
+ final z = 42; // should infer `int`
+}
+''');
+ }
+
+ void test_inferTypeOnVarFromTopLevel() {
+ checkFile('''
+int x = 0;
+
+test1() {
+ var a = x;
+ a = /*warning:INVALID_ASSIGNMENT*/"hi";
+ a = 3;
+ var b = y;
+ b = /*warning:INVALID_ASSIGNMENT*/"hi";
+ b = 4;
+ var c = z;
+ c = /*warning:INVALID_ASSIGNMENT*/"hi";
+ c = 4;
+}
+
+int y = 0; // field def after use
+final z = 42; // should infer `int`
+''');
+ }
+
+ void test_inferTypeRegardlessOfDeclarationOrderOrCycles() {
+ addFile(
+ '''
+import 'main.dart';
+
+class B extends A { }
+''',
+ name: '/b.dart');
+ checkFile('''
+import 'b.dart';
+class C extends B {
+ get x => null;
+}
+class A {
+ int get x => 0;
+}
+foo() {
+ int y = new C().x;
+ String z = /*warning:INVALID_ASSIGNMENT*/new C().x;
+}
+''');
+ }
+
+ void test_inferTypesOnGenericInstantiations_3() {
+ checkFile('''
+class A<T> {
+ final T x = null;
+ final T w = null;
+}
+
+class B implements A<int> {
+ get x => 3;
+ get w => /*warning:RETURN_OF_INVALID_TYPE*/"hello";
+}
+
+foo() {
+ String y = /*warning:INVALID_ASSIGNMENT*/new B().x;
+ int z = new B().x;
+}
+''');
+ }
+
+ void test_inferTypesOnGenericInstantiations_4() {
+ checkFile('''
+class A<T> {
+ T x;
+}
+
+class B<E> extends A<E> {
+ E y;
+ /*severe:INVALID_FIELD_OVERRIDE*/get x => y;
+}
+
+foo() {
+ int y = /*warning:INVALID_ASSIGNMENT*/new B<String>().x;
+ String z = new B<String>().x;
+}
+''');
+ }
+
+ void test_inferTypesOnGenericInstantiations_5() {
+ checkFile('''
+abstract class I<E> {
+ String m(a, String f(v, E e));
+}
+
+abstract class A<E> implements I<E> {
+ const A();
+ String m(a, String f(v, E e));
+}
+
+abstract class M {
+ final int y = 0;
+}
+
+class B<E> extends A<E> implements M {
+ const B();
+ int get y => 0;
+
+ m(a, f(v, E e)) {}
+}
+
+foo () {
+ int y = /*warning:INVALID_ASSIGNMENT*/new B().m(null, null);
+ String z = new B().m(null, null);
+}
+''');
+ }
+
+ void test_inferTypesOnGenericInstantiations_infer() {
+ checkFile('''
+class A<T> {
+ final T x = null;
+}
+
+class B implements A<int> {
+ /*severe:INVALID_METHOD_OVERRIDE*/dynamic get x => 3;
+}
+
+foo() {
+ String y = /*info:DYNAMIC_CAST*/new B().x;
+ int z = /*info:DYNAMIC_CAST*/new B().x;
+}
+''');
+ }
+
+ void test_inferTypesOnGenericInstantiationsInLibraryCycle() {
+ // Note: this is a regression test for a non-deterministic behavior we used to
+ // have with inference in library cycles. If you see this test flake out,
+ // change `test` to `skip_test` and reopen bug #48.
+ addFile(
+ '''
+import 'main.dart';
+abstract class I<E> {
+ A<E> m(a, String f(v, int e));
+}
+''',
+ name: '/a.dart');
+ checkFile('''
+import 'a.dart';
+
+abstract class A<E> implements I<E> {
+ const A();
+
+ final E value = null;
+}
+
+abstract class M {
+ final int y = 0;
+}
+
+class B<E> extends A<E> implements M {
+ const B();
+ int get y => 0;
+
+ m(a, f(v, int e)) {}
+}
+
+foo () {
+ int y = /*warning:INVALID_ASSIGNMENT*/new B<String>().m(null, null).value;
+ String z = new B<String>().m(null, null).value;
+}
+''');
+ }
+
+ void test_inferTypesOnLoopIndices_forEachLoop() {
+ checkFile('''
+class Foo {
+ int bar = 42;
+}
+
+class Bar<T extends Iterable<String>> {
+ void foo(T t) {
+ for (var i in t) {
+ int x = /*warning:INVALID_ASSIGNMENT*/i;
+ }
+ }
+}
+
+class Baz<T, E extends Iterable<T>, S extends E> {
+ void foo(S t) {
+ for (var i in t) {
+ int x = /*warning:INVALID_ASSIGNMENT*/i;
+ T y = i;
+ }
+ }
+}
+
+test() {
+ var list = <Foo>[];
+ for (var x in list) {
+ String y = /*warning:INVALID_ASSIGNMENT*/x;
+ }
+
+ for (dynamic x in list) {
+ // The INVALID_ASSIGNMENT hint is because type propagation knows x is
+ // a Foo.
+ String y = /*info:DYNAMIC_CAST,info:INVALID_ASSIGNMENT*/x;
+ }
+
+ for (String x in /*warning:FOR_IN_OF_INVALID_ELEMENT_TYPE*/list) {
+ String y = x;
+ }
+
+ var z;
+ for(z in list) {
+ String y = /*info:DYNAMIC_CAST,info:INVALID_ASSIGNMENT*/z;
+ }
+
+ Iterable iter = list;
+ for (Foo /*info:DYNAMIC_CAST*/x in iter) {
+ var y = x;
+ }
+
+ dynamic iter2 = list;
+ for (Foo /*info:DYNAMIC_CAST*/x in /*info:DYNAMIC_CAST*/iter2) {
+ var y = x;
+ }
+
+ var map = <String, Foo>{};
+ // Error: map must be an Iterable.
+ for (var x in /*warning:FOR_IN_OF_INVALID_TYPE*/map) {
+ String y = /*info:DYNAMIC_CAST*/x;
+ }
+
+ // We're not properly inferring that map.keys is an Iterable<String>
+ // and that x is a String.
+ for (var x in map.keys) {
+ String y = x;
+ }
+}
+''');
+ }
+
+ void test_inferTypesOnLoopIndices_forLoopWithInference() {
+ checkFile('''
+test() {
+ for (var i = 0; i < 10; i++) {
+ int j = i + 1;
+ }
+}
+''');
+ }
+
+ void test_listLiterals() {
checkFile(r'''
test1() {
var x = [1, 2, 3];
@@ -2000,21 +2387,39 @@
x.add(4.0);
List<int> y = /*info:ASSIGNMENT_CAST*/x;
}
- ''');
- });
+ ''');
+ }
- test('list literals should not infer bottom', () {
+ void test_listLiterals_topLevel() {
+ checkFile(r'''
+var x1 = [1, 2, 3];
+test1() {
+ x1.add(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/'hi');
+ x1.add(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/4.0);
+ x1.add(4);
+ List<num> y = x1;
+}
+var x2 = [1, 2.0, 3];
+test2() {
+ x2.add(/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/'hi');
+ x2.add(4.0);
+ List<int> y = /*info:ASSIGNMENT_CAST*/x2;
+}
+ ''');
+ }
+
+ void test_listLiteralsShouldNotInferBottom() {
var unit = checkFile(r'''
test1() {
var x = [null];
x.add(42);
}
- ''');
- var x = unit.element.functions[0].localVariables[0];
+''');
+ var x = unit.functions[0].localVariables[0];
expect(x.type.toString(), 'List<dynamic>');
- });
+ }
- test('map literals', () {
+ void test_mapLiterals() {
checkFile(r'''
test1() {
var x = { 1: 'x', 2: 'y' };
@@ -2035,246 +2440,234 @@
x[2] = p;
Map<int, String> y = /*info:ASSIGNMENT_CAST*/x;
}
- ''');
- });
+ ''');
+ }
- test('map literals should not infer bottom', () {
+ void test_mapLiterals_topLevel() {
+ checkFile(r'''
+var x1 = { 1: 'x', 2: 'y' };
+test1() {
+ x1[3] = 'z';
+ x1[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/'hi'] = 'w';
+ x1[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/4.0] = 'u';
+ x1[3] = /*warning:INVALID_ASSIGNMENT*/42;
+ Map<num, String> y = x1;
+}
+
+var x2 = { 1: 'x', 2: 'y', 3.0: new RegExp('.') };
+test2() {
+ x2[3] = 'z';
+ x2[/*warning:ARGUMENT_TYPE_NOT_ASSIGNABLE*/'hi'] = 'w';
+ x2[4.0] = 'u';
+ x2[3] = /*warning:INVALID_ASSIGNMENT*/42;
+ Pattern p = null;
+ x2[2] = p;
+ Map<int, String> y = /*info:ASSIGNMENT_CAST*/x2;
+}
+ ''');
+ }
+
+ void test_mapLiteralsShouldNotInferBottom() {
var unit = checkFile(r'''
test1() {
var x = { null: null };
x[3] = 'z';
}
-
- ''');
- var x = unit.element.functions[0].localVariables[0];
+''');
+ var x = unit.functions[0].localVariables[0];
expect(x.type.toString(), 'Map<dynamic, dynamic>');
- });
+ }
- group('block bodied lambdas', () {
- // Original feature request: https://github.com/dart-lang/sdk/issues/25487
+ void test_noErrorWhenDeclaredTypeIsNumAndAssignedNull() {
+ checkFile('''
+test1() {
+ num x = 3;
+ x = null;
+}
+''');
+ }
- test('basic', () {
- checkFile(r'''
- test1() {
- List<int> o;
- var y = o.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { return x + 1; });
- Iterable<int> z = y;
- }
- ''');
- });
+ void test_nullLiteralShouldNotInferAsBottom() {
+ // Regression test for https://github.com/dart-lang/dev_compiler/issues/47
+ checkFile(r'''
+var h = null;
+void foo(int f(Object _)) {}
- test('no return', () {
- var mainUnit = checkFile(r'''
- test1() {
- List<int> o;
- var y = o.map(/*info:INFERRED_TYPE_CLOSURE*/(x) { });
- Iterable<int> z = /*warning:DOWN_CAST_COMPOSITE*/y;
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[1];
- expect(f.type.toString(), 'Iterable<dynamic>');
- });
+main() {
+ var f = (Object x) => null;
+ String y = /*info:DYNAMIC_CAST*/f(42);
- test('LUB', () {
- checkFile(r'''
- import 'dart:math' show Random;
- test2() {
- List<num> o;
- var y = o.map(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) {
- if (new Random().nextBool()) {
- return x.toInt() + 1;
- } else {
- return x.toDouble();
- }
- });
- Iterable<num> w = y;
- Iterable<int> z = /*info:ASSIGNMENT_CAST*/y;
- }
- ''');
- });
+ f = /*info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
- group('does not infer bottom', () {
- test('sync', () {
- var mainUnit = checkFile(r'''
- var h = null;
- void foo(int f(Object _)) {}
+ var g = null;
+ g = 'hello';
+ (/*info:DYNAMIC_INVOKE*/g.foo());
- main() {
- var f = (Object x) { return null; };
- String y = /*info:DYNAMIC_CAST*/f(42);
+ h = 'hello';
+ (/*info:DYNAMIC_INVOKE*/h.foo());
- f = /*info:INFERRED_TYPE_CLOSURE*/(x) => 'hello';
+ foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) => null);
+ foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) => throw "not implemented");
+}
+''');
+ }
- foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { return null; });
- foo(/*info:INFERRED_TYPE_CLOSURE,info:INFERRED_TYPE_CLOSURE*/(x) { throw "not implemented"; });
- }
- ''');
+ void test_propagateInferenceToFieldInClass() {
+ checkFile('''
+class A {
+ int x = 2;
+}
- var f = mainUnit.element.functions[1].localVariables[0];
- expect(f.type.toString(), '(Object) → dynamic');
- });
+test() {
+ var a = new A();
+ A b = a; // doesn't require down cast
+ print(a.x); // doesn't require dynamic invoke
+ print(a.x + 2); // ok to use in bigger expression
+}
+''');
+ }
- test('sync*', () {
- var mainUnit = checkFile(r'''
- main() {
- var f = () sync* { yield null; };
- Iterable y = f();
- Iterable<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
- String s = /*info:DYNAMIC_CAST*/f().first;
- }
- ''');
+ void test_propagateInferenceToFieldInClassDynamicWarnings() {
+ checkFile('''
+class A {
+ int x = 2;
+}
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Iterable<dynamic>');
- });
+test() {
+ dynamic a = new A();
+ A b = /*info:DYNAMIC_CAST*/a;
+ print(/*info:DYNAMIC_INVOKE*/a.x);
+ print(/*info:DYNAMIC_INVOKE*/(/*info:DYNAMIC_INVOKE*/a.x) + 2);
+}
+''');
+ }
- test('async', () {
- var mainUnit = checkFile(r'''
- import 'dart:async';
- main() async {
- var f = () async { return null; };
- Future y = f();
- Future<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
- String s = /*info:DYNAMIC_CAST*/await f();
- }
- ''');
+ void test_propagateInferenceTransitively() {
+ checkFile('''
+class A {
+ int x = 2;
+}
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Future<dynamic>');
- });
+test5() {
+ var a1 = new A();
+ a1.x = /*warning:INVALID_ASSIGNMENT*/"hi";
- test('async*', () {
- var mainUnit = checkFile(r'''
- import 'dart:async';
- main() async {
- var f = () async* { yield null; };
- Stream y = f();
- Stream<String> z = /*warning:DOWN_CAST_COMPOSITE*/f();
- String s = /*info:DYNAMIC_CAST*/await f().first;
- }
- ''');
+ A a2 = new A();
+ a2.x = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Stream<dynamic>');
- });
- });
+ void test_propagateInferenceTransitively2() {
+ checkFile('''
+class A {
+ int x = 42;
+}
- group('async', () {
- test('all returns are values', () {
- var mainUnit = checkFile(r'''
- import 'dart:async';
- import 'dart:math' show Random;
- main() {
- var f = /*info:INFERRED_TYPE_CLOSURE*/() async {
- if (new Random().nextBool()) {
- return 1;
- } else {
- return 2.0;
- }
- };
- Future<num> g = f();
- Future<int> h = /*info:ASSIGNMENT_CAST*/f();
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Future<num>');
- });
+class B {
+ A a = new A();
+}
- test('all returns are futures', () {
- var mainUnit = checkFile(r'''
- import 'dart:async';
- import 'dart:math' show Random;
- main() {
- var f = /*info:INFERRED_TYPE_CLOSURE*/() async {
- if (new Random().nextBool()) {
- return new Future<int>.value(1);
- } else {
- return new Future<double>.value(2.0);
- }
- };
- Future<num> g = f();
- Future<int> h = /*info:ASSIGNMENT_CAST*/f();
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Future<num>');
- });
+class C {
+ B b = new B();
+}
- test('mix of values and futures', () {
- var mainUnit = checkFile(r'''
- import 'dart:async';
- import 'dart:math' show Random;
- main() {
- var f = /*info:INFERRED_TYPE_CLOSURE*/() async {
- if (new Random().nextBool()) {
- return new Future<int>.value(1);
- } else {
- return 2.0;
- }
- };
- Future<num> g = f();
- Future<int> h = /*info:ASSIGNMENT_CAST*/f();
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Future<num>');
- });
- });
+class D {
+ C c = new C();
+}
- test('sync*', () {
- var mainUnit = checkFile(r'''
- main() {
- var f = /*info:INFERRED_TYPE_CLOSURE*/() sync* {
- yield 1;
- yield* [3, 4.0];
- };
- Iterable<num> g = f();
- Iterable<int> h = /*info:ASSIGNMENT_CAST*/f();
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Iterable<num>');
- });
+void main() {
+ var d1 = new D();
+ print(d1.c.b.a.x);
- test('async*', () {
- var mainUnit = checkFile(r'''
- import 'dart:async';
- main() {
- var f = /*info:INFERRED_TYPE_CLOSURE*/() async* {
- yield 1;
- Stream<double> s;
- yield* s;
- };
- Stream<num> g = f();
- Stream<int> h = /*info:ASSIGNMENT_CAST*/f();
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → Stream<num>');
- });
+ D d2 = new D();
+ print(d2.c.b.a.x);
+}
+''');
+ }
- test('downwards incompatible with upwards inference', () {
- var mainUnit = checkFile(r'''
- main() {
- String f() => null;
- var g = f;
- g = /*info:INFERRED_TYPE_CLOSURE*/() { return /*warning:RETURN_OF_INVALID_TYPE*/1; };
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → String');
- });
+ void test_staticRefersToNonstaticField_inOtherLibraryCycle() {
+ addFile(
+ '''
+import 'b.dart';
+var x = new C().f;
+''',
+ name: '/a.dart');
+ addFile(
+ '''
+class C {
+ var f = 0;
+}
+''',
+ name: '/b.dart');
+ checkFile('''
+import 'a.dart';
+test() {
+ x = /*warning:INVALID_ASSIGNMENT*/"hi";
+}
+''');
+ }
- test('nested lambdas', () {
- var mainUnit = checkFile(r'''
- main() {
- var f = /*info:INFERRED_TYPE_CLOSURE*/() {
- return /*info:INFERRED_TYPE_CLOSURE*/(int x) { return 2.0 * x; };
- };
- }
- ''');
- var f = mainUnit.element.functions[0].localVariables[0];
- expect(f.type.toString(), '() → (int) → num');
- });
- });
+ void test_staticRefersToNonstaticField_inSameLibraryCycle() {
+ addFile(
+ '''
+import 'b.dart';
+var x = new C().f;
+class D {
+ var f = 0;
+}
+''',
+ name: '/a.dart');
+ addFile(
+ '''
+import 'a.dart';
+var y = new D().f;
+class C {
+ var f = 0;
+}
+''',
+ name: '/b.dart');
+ checkFile('''
+import 'a.dart';
+import 'b.dart';
+test() {
+ x = "hi";
+ y = "hi";
+}
+''');
+ }
+}
+
+@reflectiveTest
+class InferredTypeTest extends InferredTypeMixin {
+ /// Adds a file to check. The file should contain:
+ ///
+ /// * all expected failures are listed in the source code using comments
+ /// immediately in front of the AST node that should contain the error.
+ ///
+ /// * errors are formatted as a token `level:Type`, where `level` is the
+ /// logging level were the error would be reported at, and `Type` is the
+ /// concrete subclass of [StaticInfo] that denotes the error.
+ ///
+ /// For example to check that an assignment produces a type error, you can
+ /// create a file like:
+ ///
+ /// addFile('''
+ /// String x = /*severe:STATIC_TYPE_ERROR*/3;
+ /// ''');
+ /// check();
+ ///
+ /// For a single file, you may also use [checkFile].
+ @override
+ void addFile(String content, {String name: '/main.dart'}) {
+ helper.addFile(content, name: name);
+ }
+
+ /// Adds a file using [helper.addFile] and calls [helper.check].
+ ///
+ /// Also returns the resolved compilation unit.
+ @override
+ CompilationUnitElement checkFile(String content) {
+ return helper.checkFile(content).element;
+ }
}
diff --git a/pkg/analyzer/test/src/task/strong/test_all.dart b/pkg/analyzer/test/src/task/strong/test_all.dart
new file mode 100644
index 0000000..be9a178
--- /dev/null
+++ b/pkg/analyzer/test/src/task/strong/test_all.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library analyzer.test.src.task.strong.test_all;
+
+import 'package:unittest/unittest.dart';
+
+import '../../../utils.dart';
+import 'checker_test.dart' as checker_test;
+import 'inferred_type_test.dart' as inferred_type_test;
+
+/// Utility for manually running all tests.
+main() {
+ initializeTestEnvironment();
+ group('task tests', () {
+ checker_test.main();
+ inferred_type_test.main();
+ });
+}
diff --git a/pkg/analyzer/test/src/task/test_all.dart b/pkg/analyzer/test/src/task/test_all.dart
index 956a8e5..22108ff 100644
--- a/pkg/analyzer/test/src/task/test_all.dart
+++ b/pkg/analyzer/test/src/task/test_all.dart
@@ -20,6 +20,7 @@
import 'model_test.dart' as model_test;
import 'options_test.dart' as options_test;
import 'options_work_manager_test.dart' as options_work_manager_test;
+import 'strong/test_all.dart' as strong_mode_test_all;
import 'strong_mode_test.dart' as strong_mode_test;
import 'yaml_test.dart' as yaml_test;
@@ -39,6 +40,7 @@
model_test.main();
options_test.main();
options_work_manager_test.main();
+ strong_mode_test_all.main();
strong_mode_test.main();
yaml_test.main();
});
diff --git a/pkg/analyzer/tool/task_dependency_graph/generate.dart b/pkg/analyzer/tool/task_dependency_graph/generate.dart
index 766ca03..2b904bb 100644
--- a/pkg/analyzer/tool/task_dependency_graph/generate.dart
+++ b/pkg/analyzer/tool/task_dependency_graph/generate.dart
@@ -42,9 +42,12 @@
main() {
String script = Platform.script.toFilePath(windows: Platform.isWindows);
String pkgPath = normalize(join(dirname(script), '..', '..'));
- GeneratedContent.generateAll(pkgPath, <GeneratedContent>[target]);
+ GeneratedContent.generateAll(pkgPath, <GeneratedContent>[target, htmlTarget]);
}
+final GeneratedFile htmlTarget = new GeneratedFile(
+ 'doc/tasks.html', (String pkgPath) => new Driver(pkgPath).generateHtml());
+
final GeneratedFile target = new GeneratedFile(
'tool/task_dependency_graph/tasks.dot',
(String pkgPath) => new Driver(pkgPath).generateFileContents());
@@ -52,6 +55,7 @@
typedef void GetterFinderCallback(PropertyAccessorElement element);
class Driver {
+ static bool hasInitializedPlugins = false;
PhysicalResourceProvider resourceProvider;
AnalysisContext context;
InterfaceType resultDescriptorType;
@@ -59,6 +63,7 @@
ClassElement enginePluginClass;
CompilationUnitElement taskUnitElement;
InterfaceType extensionPointIdType;
+
final String rootDir;
Driver(String pkgPath) : rootDir = new Directory(pkgPath).absolute.path;
@@ -121,7 +126,28 @@
* Generate the task dependency graph and return it as a [String].
*/
String generateFileContents() {
- AnalysisEngine.instance.processRequiredPlugins();
+ return '''
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// This file has been automatically generated. Please do not edit it manually.
+// To regenerate the file, use the script
+// "pkg/analyzer/tool/task_dependency_graph/generate.dart".
+//
+// To render this graph using Graphviz (www.graphviz.org) use the command:
+// "dot tasks.dot -Tpdf -O".
+digraph G {
+${generateGraphData()}
+}
+''';
+ }
+
+ String generateGraphData() {
+ if (!hasInitializedPlugins) {
+ AnalysisEngine.instance.processRequiredPlugins();
+ hasInitializedPlugins = true;
+ }
List<String> lines = <String>[];
resourceProvider = PhysicalResourceProvider.INSTANCE;
DartSdk sdk = DirectoryBasedDartSdk.defaultSdk;
@@ -197,20 +223,32 @@
lines.add(' $result [shape=box]');
}
lines.sort();
+ return lines.join('\n');
+ }
+
+ String generateHtml() {
return '''
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// This file has been automatically generated. Please do not edit it manually.
-// To regenerate the file, use the script
-// "pkg/analyzer/tool/task_dependency_graph/generate.dart".
-//
-// To render this graph using Graphviz (www.graphviz.org) use the command:
-// "dot tasks.dot -Tpdf -O".
+<!DOCTYPE html>
+<html>
+<head>
+ <title>Analysis Task Dependency Graph</title>
+ <link rel="stylesheet" href="support/style.css">
+ <script src="support/viz.js"></script>
+ <script type="application/dart" src="support/web_app.dart.js"></script>
+ <script src="support/dart.js"></script>
+</head>
+<body>
+<button id="zoomBtn">Zoom</button>
+<script type="text/vnd.graphviz" id="dot">
digraph G {
-${lines.join('\n')}
+ tooltip="Analysis Task Dependency Graph";
+ node [fontname=Helvetica];
+ edge [fontname=Helvetica, fontcolor=gray];
+${generateGraphData()}
}
+</script>
+</body>
+</html>
''';
}
diff --git a/pkg/analyzer_cli/lib/src/analyzer_impl.dart b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
index 428869f..7314a20 100644
--- a/pkg/analyzer_cli/lib/src/analyzer_impl.dart
+++ b/pkg/analyzer_cli/lib/src/analyzer_impl.dart
@@ -254,27 +254,28 @@
static ErrorSeverity computeSeverity(
AnalysisError error, CommandLineOptions options,
[AnalysisContext context]) {
+ bool isStrongMode = false;
if (context != null) {
ErrorProcessor processor = ErrorProcessor.getProcessor(context, error);
// If there is a processor for this error, defer to it.
if (processor != null) {
return processor.severity;
}
+ isStrongMode = context.analysisOptions.strongMode;
}
if (!options.enableTypeChecks &&
error.errorCode.type == ErrorType.CHECKED_MODE_COMPILE_TIME_ERROR) {
return ErrorSeverity.INFO;
- }
-
- if (options.hintsAreFatal && error.errorCode is HintCode) {
+ } else if (options.hintsAreFatal && error.errorCode is HintCode) {
+ return ErrorSeverity.ERROR;
+ } else if (options.lintsAreFatal && error.errorCode is LintCode) {
+ return ErrorSeverity.ERROR;
+ } else if (isStrongMode &&
+ error is StaticWarningCode &&
+ (error as StaticWarningCode).isStrongModeError) {
return ErrorSeverity.ERROR;
}
-
- if (options.lintsAreFatal && error.errorCode is LintCode) {
- return ErrorSeverity.ERROR;
- }
-
return error.errorCode.errorSeverity;
}
@@ -302,6 +303,13 @@
ErrorSeverity severity = computeSeverity(error, options, context);
bool isOverridden = false;
+ // Skip TODOs categorically (unless escalated to ERROR or HINT.)
+ // https://github.com/dart-lang/sdk/issues/26215
+ if (error.errorCode.type == ErrorType.TODO &&
+ severity == ErrorSeverity.INFO) {
+ return null;
+ }
+
// First check for a filter.
if (severity == null) {
// Null severity means the error has been explicitly ignored.
@@ -316,11 +324,6 @@
if (severity == ErrorSeverity.INFO && options.disableHints) {
return null;
}
-
- // Skip TODOs.
- if (severity == ErrorType.TODO) {
- return null;
- }
}
return new ProcessedSeverity(severity, isOverridden);
diff --git a/pkg/analyzer_cli/lib/src/build_mode.dart b/pkg/analyzer_cli/lib/src/build_mode.dart
index 2256247..511c6c0 100644
--- a/pkg/analyzer_cli/lib/src/build_mode.dart
+++ b/pkg/analyzer_cli/lib/src/build_mode.dart
@@ -4,7 +4,6 @@
library analyzer_cli.src.build_mode;
-import 'dart:convert';
import 'dart:core' hide Resource;
import 'dart:io' as io;
@@ -20,8 +19,8 @@
import 'package:analyzer/src/generated/source_io.dart';
import 'package:analyzer/src/summary/format.dart';
import 'package:analyzer/src/summary/idl.dart';
+import 'package:analyzer/src/summary/link.dart';
import 'package:analyzer/src/summary/package_bundle_reader.dart';
-import 'package:analyzer/src/summary/prelink.dart';
import 'package:analyzer/src/summary/summarize_ast.dart';
import 'package:analyzer/src/summary/summarize_elements.dart';
import 'package:analyzer/task/dart.dart';
@@ -29,6 +28,10 @@
import 'package:analyzer_cli/src/driver.dart';
import 'package:analyzer_cli/src/error_formatter.dart';
import 'package:analyzer_cli/src/options.dart';
+import 'package:protobuf/protobuf.dart';
+
+import 'message_grouper.dart';
+import 'worker_protocol.pb.dart';
/**
* Analyzer used when the "--build-mode" option is supplied.
@@ -95,20 +98,22 @@
// Write summary.
if (options.buildSummaryOutput != null) {
- for (Source source in explicitSources) {
- if (context.computeKindOf(source) == SourceKind.LIBRARY) {
- if (options.buildSummaryFallback) {
- assembler.addFallbackLibrary(source);
- } else if (options.buildSummaryOnlyAst) {
- _serializeAstBasedSummary(source);
- } else {
- LibraryElement libraryElement =
- context.computeLibraryElement(source);
- assembler.serializeLibraryElement(libraryElement);
+ if (options.buildSummaryOnlyAst && !options.buildSummaryFallback) {
+ _serializeAstBasedSummary(explicitSources);
+ } else {
+ for (Source source in explicitSources) {
+ if (context.computeKindOf(source) == SourceKind.LIBRARY) {
+ if (options.buildSummaryFallback) {
+ assembler.addFallbackLibrary(source);
+ } else {
+ LibraryElement libraryElement =
+ context.computeLibraryElement(source);
+ assembler.serializeLibraryElement(libraryElement);
+ }
}
- }
- if (options.buildSummaryFallback) {
- assembler.addFallbackUnit(source);
+ if (options.buildSummaryFallback) {
+ assembler.addFallbackUnit(source);
+ }
}
}
// Write the whole package bundle.
@@ -212,33 +217,28 @@
}
/**
- * Serialize the library with the given [source] into [assembler] using only
- * its AST, [UnlinkedUnit]s of input packages and ASTs (via [UnlinkedUnit]s)
- * of package sources.
+ * Serialize the package with the given [sources] into [assembler] using only
+ * their ASTs and [LinkedUnit]s of input packages.
*/
- void _serializeAstBasedSummary(Source source) {
- Source resolveRelativeUri(String relativeUri) {
- Source resolvedSource =
- context.sourceFactory.resolveUri(source, relativeUri);
- if (resolvedSource == null) {
- context.sourceFactory.resolveUri(source, relativeUri);
- throw new StateError('Could not resolve $relativeUri in the context of '
- '$source (${source.runtimeType})');
- }
- return resolvedSource;
- }
+ void _serializeAstBasedSummary(List<Source> sources) {
+ Set<String> sourceUris =
+ sources.map((Source s) => s.uri.toString()).toSet();
- UnlinkedUnit _getUnlinkedUnit(Source source) {
+ LinkedLibrary _getDependency(String absoluteUri) =>
+ summaryDataStore.linkedMap[absoluteUri];
+
+ UnlinkedUnit _getUnit(String absoluteUri) {
// Maybe an input package contains the source.
{
- String uriStr = source.uri.toString();
- UnlinkedUnit unlinkedUnit = summaryDataStore.unlinkedMap[uriStr];
+ UnlinkedUnit unlinkedUnit = summaryDataStore.unlinkedMap[absoluteUri];
if (unlinkedUnit != null) {
return unlinkedUnit;
}
}
// Parse the source and serialize its AST.
- return uriToUnit.putIfAbsent(source.uri, () {
+ Uri uri = Uri.parse(absoluteUri);
+ Source source = context.sourceFactory.forUri2(uri);
+ return uriToUnit.putIfAbsent(uri, () {
CompilationUnit unit = context.computeResult(source, PARSED_UNIT);
UnlinkedUnitBuilder unlinkedUnit = serializeAstUnlinked(unit);
assembler.addUnlinkedUnit(source, unlinkedUnit);
@@ -246,18 +246,9 @@
});
}
- UnlinkedUnit getPart(String relativeUri) {
- return _getUnlinkedUnit(resolveRelativeUri(relativeUri));
- }
-
- UnlinkedPublicNamespace getImport(String relativeUri) {
- return getPart(relativeUri).publicNamespace;
- }
-
- UnlinkedUnitBuilder definingUnit = _getUnlinkedUnit(source);
- LinkedLibraryBuilder linkedLibrary =
- prelink(definingUnit, getPart, getImport);
- assembler.addLinkedLibrary(source.uri.toString(), linkedLibrary);
+ Map<String, LinkedLibraryBuilder> linkResult =
+ link(sourceUris, _getDependency, _getUnit, options.strongMode);
+ linkResult.forEach(assembler.addLinkedLibrary);
}
/**
@@ -284,13 +275,33 @@
}
/**
- * Interface that every worker related data object has.
+ * Default implementation of [WorkerConnection] that works with stdio.
*/
-abstract class WorkDataObject {
- /**
- * Translate the data in this class into a JSON map.
- */
- Map<String, Object> toJson();
+class StdWorkerConnection implements WorkerConnection {
+ final MessageGrouper _messageGrouper;
+ final io.Stdout _stdoutStream;
+
+ StdWorkerConnection(io.Stdin stdinStream, this._stdoutStream)
+ : _messageGrouper = new MessageGrouper(stdinStream);
+
+ @override
+ WorkRequest readRequest() {
+ var buffer = _messageGrouper.next;
+ if (buffer == null) return null;
+
+ return new WorkRequest.fromBuffer(buffer);
+ }
+
+ @override
+ void writeResponse(WorkResponse response) {
+ var responseBuffer = response.writeToBuffer();
+
+ var writer = new CodedBufferWriter();
+ writer.writeInt32NoTag(responseBuffer.length);
+ writer.writeRawBytes(responseBuffer);
+
+ _stdoutStream.add(writer.toBuffer());
+ }
}
/**
@@ -298,14 +309,14 @@
*/
abstract class WorkerConnection {
/**
- * Read a new line. Block until a line is read. Return `null` if EOF.
+ * Read a new [WorkRequest]. Returns [null] when there are no more requests.
*/
- String readLineSync();
+ WorkRequest readRequest();
/**
- * Write the given [json] as a new line to the output.
+ * Write the given [response] as bytes to the output.
*/
- void writeJson(Map<String, Object> json);
+ void writeResponse(WorkResponse response);
}
/**
@@ -320,17 +331,24 @@
final StringBuffer errorBuffer = new StringBuffer();
final StringBuffer outBuffer = new StringBuffer();
- WorkerLoop(this.connection);
+ final String dartSdkPath;
- factory WorkerLoop.std() {
- WorkerConnection connection = new _StdWorkerConnection();
- return new WorkerLoop(connection);
+ WorkerLoop(this.connection, {this.dartSdkPath});
+
+ factory WorkerLoop.std(
+ {io.Stdin stdinStream, io.Stdout stdoutStream, String dartSdkPath}) {
+ stdinStream ??= io.stdin;
+ stdoutStream ??= io.stdout;
+ WorkerConnection connection =
+ new StdWorkerConnection(stdinStream, stdoutStream);
+ return new WorkerLoop(connection, dartSdkPath: dartSdkPath);
}
/**
* Performs analysis with given [options].
*/
void analyze(CommandLineOptions options) {
+ options.dartSdkPath ??= dartSdkPath;
new BuildMode(options, new AnalysisStats()).analyze();
}
@@ -339,7 +357,7 @@
*/
bool performSingle() {
try {
- WorkRequest request = _readRequest();
+ WorkRequest request = connection.readRequest();
if (request == null) {
return true;
}
@@ -351,11 +369,15 @@
// Analyze and respond.
analyze(options);
String msg = _getErrorOutputBuffersText();
- _writeResponse(new WorkResponse(EXIT_CODE_OK, msg));
+ connection.writeResponse(new WorkResponse()
+ ..exitCode = EXIT_CODE_OK
+ ..output = msg);
} catch (e, st) {
String msg = _getErrorOutputBuffersText();
msg += '$e \n $st';
- _writeResponse(new WorkResponse(EXIT_CODE_ERROR, msg));
+ connection.writeResponse(new WorkResponse()
+ ..exitCode = EXIT_CODE_ERROR
+ ..output = msg);
}
return false;
}
@@ -389,182 +411,4 @@
}
return msg;
}
-
- /**
- * Read a new [WorkRequest]. Return `null` if EOF.
- * Throw [ArgumentError] if cannot be parsed.
- */
- WorkRequest _readRequest() {
- String line = connection.readLineSync();
- if (line == null) {
- return null;
- }
- Object json = JSON.decode(line);
- if (json is Map) {
- return new WorkRequest.fromJson(json);
- } else {
- throw new ArgumentError('The request line is not a JSON object: $line');
- }
- }
-
- void _writeResponse(WorkResponse response) {
- Map<String, Object> json = response.toJson();
- connection.writeJson(json);
- }
-}
-
-/**
- * Input file.
- */
-class WorkInput implements WorkDataObject {
- final String path;
- final List<int> digest;
-
- WorkInput(this.path, this.digest);
-
- factory WorkInput.fromJson(Map<String, Object> json) {
- // Parse path.
- Object path2 = json['path'];
- if (path2 == null) {
- throw new ArgumentError('The field "path" is missing.');
- }
- if (path2 is! String) {
- throw new ArgumentError('The field "path" must be a string.');
- }
- // Parse digest.
- List<int> digest = const <int>[];
- {
- Object digestJson = json['digest'];
- if (digestJson != null) {
- if (digestJson is List && digestJson.every((e) => e is int)) {
- digest = digestJson;
- } else {
- throw new ArgumentError(
- 'The field "digest" should be a list of int.');
- }
- }
- }
- // OK
- return new WorkInput(path2, digest);
- }
-
- @override
- Map<String, Object> toJson() {
- Map<String, Object> json = <String, Object>{};
- if (path != null) {
- json['path'] = path;
- }
- if (digest != null) {
- json['digest'] = digest;
- }
- return json;
- }
-}
-
-/**
- * Single work unit that Bazel sends to the worker.
- */
-class WorkRequest implements WorkDataObject {
- /**
- * Command line arguments for this request.
- */
- final List<String> arguments;
-
- /**
- * Input files that the worker is allowed to read during execution of this
- * request.
- */
- final List<WorkInput> inputs;
-
- WorkRequest(this.arguments, this.inputs);
-
- factory WorkRequest.fromJson(Map<String, Object> json) {
- // Parse arguments.
- List<String> arguments = const <String>[];
- {
- Object argumentsJson = json['arguments'];
- if (argumentsJson != null) {
- if (argumentsJson is List && argumentsJson.every((e) => e is String)) {
- arguments = argumentsJson;
- } else {
- throw new ArgumentError(
- 'The field "arguments" should be a list of strings.');
- }
- }
- }
- // Parse inputs.
- List<WorkInput> inputs = const <WorkInput>[];
- {
- Object inputsJson = json['inputs'];
- if (inputsJson != null) {
- if (inputsJson is List &&
- inputsJson.every((e) {
- return e is Map && e.keys.every((key) => key is String);
- })) {
- inputs = inputsJson
- .map((Map input) => new WorkInput.fromJson(input))
- .toList();
- } else {
- throw new ArgumentError(
- 'The field "inputs" should be a list of objects.');
- }
- }
- }
- // No inputs.
- if (arguments.isEmpty && inputs.isEmpty) {
- throw new ArgumentError('Both "arguments" and "inputs" cannot be empty.');
- }
- // OK
- return new WorkRequest(arguments, inputs);
- }
-
- @override
- Map<String, Object> toJson() {
- Map<String, Object> json = <String, Object>{};
- if (arguments != null) {
- json['arguments'] = arguments;
- }
- if (inputs != null) {
- json['inputs'] = inputs.map((input) => input.toJson()).toList();
- }
- return json;
- }
-}
-
-/**
- * Result that the worker sends back to Bazel when it finished its work on a
- * [WorkRequest] message.
- */
-class WorkResponse implements WorkDataObject {
- final int exitCode;
- final String output;
-
- WorkResponse(this.exitCode, this.output);
-
- @override
- Map<String, Object> toJson() {
- Map<String, Object> json = <String, Object>{};
- if (exitCode != null) {
- json['exit_code'] = exitCode;
- }
- if (output != null) {
- json['output'] = output;
- }
- return json;
- }
-}
-
-/**
- * Default implementation of [WorkerConnection] that works with stdio.
- */
-class _StdWorkerConnection implements WorkerConnection {
- @override
- String readLineSync() {
- return io.stdin.readLineSync();
- }
-
- @override
- void writeJson(Map<String, Object> json) {
- io.stdout.writeln(JSON.encode(json));
- }
}
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index f3016d5..a05f81e 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -245,7 +245,7 @@
ErrorSeverity _buildModeAnalyze(CommandLineOptions options) {
return _analyzeAllTag.makeCurrentWhile(() {
if (options.buildModePersistentWorker) {
- new WorkerLoop.std().run();
+ new WorkerLoop.std(dartSdkPath: options.dartSdkPath).run();
} else {
return new BuildMode(options, stats).analyze();
}
diff --git a/pkg/analyzer_cli/lib/src/message_grouper.dart b/pkg/analyzer_cli/lib/src/message_grouper.dart
new file mode 100644
index 0000000..8696796
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/message_grouper.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:io';
+import 'dart:typed_data';
+
+/// Groups stdin input into messages by interpreting it as
+/// base-128 encoded lengths interleaved with raw data.
+///
+/// The base-128 encoding is in little-endian order, with the high bit set on
+/// all bytes but the last. This was chosen since it's the same as the
+/// base-128 encoding used by protobufs, so it allows a modest amount of code
+/// reuse at the other end of the protocol.
+///
+/// Possible future improvements to consider (should a debugging need arise):
+/// - Put a magic number at the beginning of the stream.
+/// - Use a guard byte between messages to sanity check that the encoder and
+/// decoder agree on the encoding of lengths.
+class MessageGrouper {
+ final _state = new _MessageGrouperState();
+ final Stdin _stdin;
+
+ MessageGrouper(this._stdin);
+
+ /// Blocks until the next full message is received, and then returns it.
+ ///
+ /// Returns null at end of file.
+ List<int> get next {
+ var message;
+ while (message == null) {
+ var nextByte = _stdin.readByteSync();
+ if (nextByte == -1) return null;
+ message = _state.handleInput(nextByte);
+ }
+ return message;
+ }
+}
+
+/// State held by the [MessageGrouper] while waiting for additional data to
+/// arrive.
+class _MessageGrouperState {
+ /// `true` means we are waiting to receive bytes of base-128 encoded length.
+ /// Some bytes of length may have been received already.
+ ///
+ /// `false` means we are waiting to receive more bytes of message data. Some
+ /// bytes of message data may have been received already.
+ bool waitingForLength = true;
+
+ /// If [waitingForLength] is `true`, the decoded value of the length bytes
+ /// received so far (if any). If [waitingForLength] is `false`, the decoded
+ /// length that was most recently received.
+ int length = 0;
+
+ /// If [waitingForLength] is `true`, the amount by which the next received
+ /// length byte must be left-shifted; otherwise undefined.
+ int lengthShift = 0;
+
+ /// If [waitingForLength] is `false`, a [Uint8List] which is ready to receive
+ /// message data. Otherwise null.
+ Uint8List message;
+
+ /// If [waitingForLength] is `false`, the number of message bytes that have
+ /// been received so far. Otherwise zero.
+ int numMessageBytesReceived;
+
+ _MessageGrouperState() {
+ reset();
+ }
+
+ /// Handle one byte at a time.
+ ///
+ /// Returns a [List<int>] of message bytes if [byte] was the last byte in a
+ /// message, otherwise returns [null].
+ List<int> handleInput(int byte) {
+ if (waitingForLength) {
+ length |= (byte & 0x7f) << lengthShift;
+ if ((byte & 0x80) == 0) {
+ waitingForLength = false;
+ message = new Uint8List(length);
+ if (length == 0) {
+ // There is no message data to wait for, so just go ahead and deliver the
+ // empty message.
+ var messageToReturn = message;
+ reset();
+ return messageToReturn;
+ }
+ } else {
+ lengthShift += 7;
+ }
+ } else {
+ message[numMessageBytesReceived] = byte;
+ numMessageBytesReceived++;
+ if (numMessageBytesReceived == length) {
+ var messageToReturn = message;
+ reset();
+ return messageToReturn;
+ }
+ }
+ return null;
+ }
+
+ /// Reset the state so that we are ready to receive the next base-128 encoded
+ /// length.
+ void reset() {
+ waitingForLength = true;
+ length = 0;
+ lengthShift = 0;
+ message = null;
+ numMessageBytesReceived = 0;
+ }
+}
diff --git a/pkg/analyzer_cli/lib/src/options.dart b/pkg/analyzer_cli/lib/src/options.dart
index 2c543fa..fc778f4 100644
--- a/pkg/analyzer_cli/lib/src/options.dart
+++ b/pkg/analyzer_cli/lib/src/options.dart
@@ -263,6 +263,12 @@
}
static CommandLineOptions _parse(List<String> args) {
+ // Check if the args are in a file (bazel worker mode).
+ if (args.last.startsWith('@')) {
+ var argsFile = new File(args.last.substring(1));
+ args = argsFile.readAsLinesSync();
+ }
+
args = args.expand((String arg) => arg.split('=')).toList();
var parser = new CommandLineParser()
..addFlag('batch',
@@ -459,9 +465,20 @@
// Persistent worker.
if (args.contains('--persistent_worker')) {
- if (args.length != 2 || !args.contains('--build-mode')) {
+ bool validArgs;
+ if (!args.contains('--build-mode')) {
+ validArgs = false;
+ } else if (args.length == 2) {
+ validArgs = true;
+ } else if (args.length == 4 && args.contains('--dart-sdk')) {
+ validArgs = true;
+ } else {
+ validArgs = false;
+ }
+ if (!validArgs) {
printAndFail('The --persistent_worker flag should be used with and '
- 'only with the --build-mode flag.');
+ 'only with the --build-mode flag, and possibly the --dart-sdk '
+ 'option. Got: $args');
return null; // Only reachable in testing.
}
return new CommandLineOptions._fromArgs(results, definedVariables);
diff --git a/pkg/analyzer_cli/lib/src/worker_protocol.pb.dart b/pkg/analyzer_cli/lib/src/worker_protocol.pb.dart
new file mode 100755
index 0000000..908dfac
--- /dev/null
+++ b/pkg/analyzer_cli/lib/src/worker_protocol.pb.dart
@@ -0,0 +1,133 @@
+///
+// Generated code. Do not modify.
+///
+library blaze.worker_worker_protocol;
+
+import 'package:protobuf/protobuf.dart';
+
+class Input extends GeneratedMessage {
+ static final BuilderInfo _i = new BuilderInfo('Input')
+ ..a(1, 'path', PbFieldType.OS)
+ ..a(2, 'digest', PbFieldType.OY)
+ ..hasRequiredFields = false
+ ;
+
+ Input() : super();
+ Input.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
+ Input.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
+ Input clone() => new Input()..mergeFromMessage(this);
+ BuilderInfo get info_ => _i;
+ static Input create() => new Input();
+ static PbList<Input> createRepeated() => new PbList<Input>();
+ static Input getDefault() {
+ if (_defaultInstance == null) _defaultInstance = new _ReadonlyInput();
+ return _defaultInstance;
+ }
+ static Input _defaultInstance;
+ static void $checkItem(Input v) {
+ if (v is !Input) checkItemFailed(v, 'Input');
+ }
+
+ String get path => $_get(0, 1, '');
+ void set path(String v) { $_setString(0, 1, v); }
+ bool hasPath() => $_has(0, 1);
+ void clearPath() => clearField(1);
+
+ List<int> get digest => $_get(1, 2, null);
+ void set digest(List<int> v) { $_setBytes(1, 2, v); }
+ bool hasDigest() => $_has(1, 2);
+ void clearDigest() => clearField(2);
+}
+
+class _ReadonlyInput extends Input with ReadonlyMessageMixin {}
+
+class WorkRequest extends GeneratedMessage {
+ static final BuilderInfo _i = new BuilderInfo('WorkRequest')
+ ..p(1, 'arguments', PbFieldType.PS)
+ ..pp(2, 'inputs', PbFieldType.PM, Input.$checkItem, Input.create)
+ ..hasRequiredFields = false
+ ;
+
+ WorkRequest() : super();
+ WorkRequest.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
+ WorkRequest.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
+ WorkRequest clone() => new WorkRequest()..mergeFromMessage(this);
+ BuilderInfo get info_ => _i;
+ static WorkRequest create() => new WorkRequest();
+ static PbList<WorkRequest> createRepeated() => new PbList<WorkRequest>();
+ static WorkRequest getDefault() {
+ if (_defaultInstance == null) _defaultInstance = new _ReadonlyWorkRequest();
+ return _defaultInstance;
+ }
+ static WorkRequest _defaultInstance;
+ static void $checkItem(WorkRequest v) {
+ if (v is !WorkRequest) checkItemFailed(v, 'WorkRequest');
+ }
+
+ List<String> get arguments => $_get(0, 1, null);
+
+ List<Input> get inputs => $_get(1, 2, null);
+}
+
+class _ReadonlyWorkRequest extends WorkRequest with ReadonlyMessageMixin {}
+
+class WorkResponse extends GeneratedMessage {
+ static final BuilderInfo _i = new BuilderInfo('WorkResponse')
+ ..a(1, 'exitCode', PbFieldType.O3)
+ ..a(2, 'output', PbFieldType.OS)
+ ..hasRequiredFields = false
+ ;
+
+ WorkResponse() : super();
+ WorkResponse.fromBuffer(List<int> i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromBuffer(i, r);
+ WorkResponse.fromJson(String i, [ExtensionRegistry r = ExtensionRegistry.EMPTY]) : super.fromJson(i, r);
+ WorkResponse clone() => new WorkResponse()..mergeFromMessage(this);
+ BuilderInfo get info_ => _i;
+ static WorkResponse create() => new WorkResponse();
+ static PbList<WorkResponse> createRepeated() => new PbList<WorkResponse>();
+ static WorkResponse getDefault() {
+ if (_defaultInstance == null) _defaultInstance = new _ReadonlyWorkResponse();
+ return _defaultInstance;
+ }
+ static WorkResponse _defaultInstance;
+ static void $checkItem(WorkResponse v) {
+ if (v is !WorkResponse) checkItemFailed(v, 'WorkResponse');
+ }
+
+ int get exitCode => $_get(0, 1, 0);
+ void set exitCode(int v) { $_setUnsignedInt32(0, 1, v); }
+ bool hasExitCode() => $_has(0, 1);
+ void clearExitCode() => clearField(1);
+
+ String get output => $_get(1, 2, '');
+ void set output(String v) { $_setString(1, 2, v); }
+ bool hasOutput() => $_has(1, 2);
+ void clearOutput() => clearField(2);
+}
+
+class _ReadonlyWorkResponse extends WorkResponse with ReadonlyMessageMixin {}
+
+const Input$json = const {
+ '1': 'Input',
+ '2': const [
+ const {'1': 'path', '3': 1, '4': 1, '5': 9},
+ const {'1': 'digest', '3': 2, '4': 1, '5': 12},
+ ],
+};
+
+const WorkRequest$json = const {
+ '1': 'WorkRequest',
+ '2': const [
+ const {'1': 'arguments', '3': 1, '4': 3, '5': 9},
+ const {'1': 'inputs', '3': 2, '4': 3, '5': 11, '6': '.blaze.worker.Input'},
+ ],
+};
+
+const WorkResponse$json = const {
+ '1': 'WorkResponse',
+ '2': const [
+ const {'1': 'exit_code', '3': 1, '4': 1, '5': 5},
+ const {'1': 'output', '3': 2, '4': 1, '5': 9},
+ ],
+};
+
diff --git a/pkg/analyzer_cli/pubspec.yaml b/pkg/analyzer_cli/pubspec.yaml
index 6e59161..a1b2fe8 100644
--- a/pkg/analyzer_cli/pubspec.yaml
+++ b/pkg/analyzer_cli/pubspec.yaml
@@ -12,6 +12,7 @@
linter: ^0.1.10
package_config: ^0.1.1
plugin: ^0.1.0
+ protobuf: ^0.5.0
yaml: ^2.1.2
dev_dependencies:
test_reflective_loader: '>=0.0.3 <0.1.0'
diff --git a/pkg/analyzer_cli/test/all.dart b/pkg/analyzer_cli/test/all.dart
index 13f72d1..05d8a98 100644
--- a/pkg/analyzer_cli/test/all.dart
+++ b/pkg/analyzer_cli/test/all.dart
@@ -6,6 +6,7 @@
import 'build_mode_test.dart' as build_mode_test;
import 'driver_test.dart' as driver;
import 'error_test.dart' as error;
+import 'message_grouper_test.dart' as message_grouper;
import 'options_test.dart' as options;
import 'package_prefix_test.dart' as package_prefix;
import 'perf_report_test.dart' as perf;
@@ -24,6 +25,7 @@
//sdk_ext.main();
//strong_mode.main();
error.main();
+ message_grouper.main();
options.main();
perf.main();
plugin_manager.main();
diff --git a/pkg/analyzer_cli/test/build_mode_test.dart b/pkg/analyzer_cli/test/build_mode_test.dart
index 29c4da6..dcc2423 100644
--- a/pkg/analyzer_cli/test/build_mode_test.dart
+++ b/pkg/analyzer_cli/test/build_mode_test.dart
@@ -4,38 +4,59 @@
library analyzer_cli.test.built_mode;
+import 'dart:collection';
import 'dart:convert';
+import 'dart:io';
import 'package:analyzer_cli/src/build_mode.dart';
import 'package:analyzer_cli/src/driver.dart';
import 'package:analyzer_cli/src/options.dart';
+import 'package:analyzer_cli/src/worker_protocol.pb.dart';
+import 'package:protobuf/protobuf.dart';
import 'package:test_reflective_loader/test_reflective_loader.dart';
import 'package:typed_mock/typed_mock.dart';
import 'package:unittest/unittest.dart';
+import 'utils.dart';
+
main() {
defineReflectiveTests(WorkerLoopTest);
- defineReflectiveTests(WorkInputTest);
- defineReflectiveTests(WorkRequestTest);
}
typedef void _TestWorkerLoopAnalyze(CommandLineOptions options);
@reflectiveTest
class WorkerLoopTest {
- final _TestWorkerConnection connection = new _TestWorkerConnection();
+ final TestStdinStream stdinStream = new TestStdinStream();
+ final TestStdoutStream stdoutStream = new TestStdoutStream();
+ _TestWorkerConnection connection;
+
+ WorkerLoopTest() {
+ connection = new _TestWorkerConnection(this.stdinStream, this.stdoutStream);
+ }
void setUp() {}
+ List<int> _serializeProto(GeneratedMessage message) {
+ var buffer = message.writeToBuffer();
+
+ var writer = new CodedBufferWriter();
+ writer.writeInt32NoTag(buffer.length);
+ writer.writeRawBytes(buffer);
+
+ return writer.toBuffer();
+ }
+
test_run() {
- _setInputLine(JSON.encode({
- 'arguments': [
- '--build-summary-input=/tmp/1.sum',
- '--build-summary-input=/tmp/2.sum',
- 'package:foo/foo.dart|/inputs/foo/lib/foo.dart',
- 'package:foo/bar.dart|/inputs/foo/lib/bar.dart'
- ],
- }));
+ var request = new WorkRequest();
+ request.arguments.addAll([
+ '--build-summary-input=/tmp/1.sum',
+ '--build-summary-input=/tmp/2.sum',
+ 'package:foo/foo.dart|/inputs/foo/lib/foo.dart',
+ 'package:foo/bar.dart|/inputs/foo/lib/bar.dart',
+ ]);
+ stdinStream.addInputBytes(_serializeProto(request));
+
new _TestWorkerLoop(connection, (CommandLineOptions options) {
expect(options.buildSummaryInputs,
unorderedEquals(['/tmp/1.sum', '/tmp/2.sum']));
@@ -51,235 +72,71 @@
errorSink.writeln('errorSink b');
}).run();
expect(connection.outputList, hasLength(1));
- expect(connection.outputList[0], {
- 'exit_code': WorkerLoop.EXIT_CODE_OK,
- 'output': allOf(contains('errorSink a'), contains('errorSink a'),
- contains('outSink a'), contains('outSink b'))
- });
+
+ var response = connection.outputList[0];
+ expect(response.exitCode, WorkerLoop.EXIT_CODE_OK);
+ expect(
+ response.output,
+ allOf(contains('errorSink a'), contains('errorSink a'),
+ contains('outSink a'), contains('outSink b')));
+
+ // Check that a serialized version was written to std out.
+ expect(stdoutStream.writes, hasLength(1));
+ expect(stdoutStream.writes[0], _serializeProto(response));
}
test_run_invalidOptions() {
- _setInputLine(JSON.encode({
- 'arguments': ['--unknown-option', '/foo.dart', '/bar.dart',],
- }));
+ var request = new WorkRequest();
+ request.arguments.addAll(['--unknown-option', '/foo.dart', '/bar.dart']);
+ stdinStream.addInputBytes(_serializeProto(request));
new _TestWorkerLoop(connection).run();
expect(connection.outputList, hasLength(1));
- expect(connection.outputList[0],
- {'exit_code': WorkerLoop.EXIT_CODE_ERROR, 'output': anything});
+
+ var response = connection.outputList[0];
+ expect(response.exitCode, WorkerLoop.EXIT_CODE_ERROR);
+ expect(response.output, anything);
}
test_run_invalidRequest_noArgumentsInputs() {
- _setInputLine('{}');
+ stdinStream.addInputBytes(_serializeProto(new WorkRequest()));
+
new _TestWorkerLoop(connection).run();
expect(connection.outputList, hasLength(1));
- expect(connection.outputList[0],
- {'exit_code': WorkerLoop.EXIT_CODE_ERROR, 'output': anything});
+
+ var response = connection.outputList[0];
+ expect(response.exitCode, WorkerLoop.EXIT_CODE_ERROR);
+ expect(response.output, anything);
}
- test_run_invalidRequest_notJson() {
- _setInputLine('not a JSON string');
+ test_run_invalidRequest_randomBytes() {
+ stdinStream.addInputBytes([1, 2, 3]);
new _TestWorkerLoop(connection).run();
expect(connection.outputList, hasLength(1));
- expect(connection.outputList[0],
- {'exit_code': WorkerLoop.EXIT_CODE_ERROR, 'output': anything});
+
+ var response = connection.outputList[0];
+ expect(response.exitCode, WorkerLoop.EXIT_CODE_ERROR);
+ expect(response.output, anything);
}
test_run_stopAtEOF() {
- when(connection.readLineSync()).thenReturnList([null]);
+ stdinStream.addInputBytes([-1]);
new _TestWorkerLoop(connection).run();
}
-
- void _setInputLine(String line) {
- when(connection.readLineSync()).thenReturnList([line, null]);
- }
-}
-
-@reflectiveTest
-class WorkInputTest {
- test_fromJson() {
- WorkInput input = new WorkInput.fromJson({
- 'path': '/my/path',
- 'digest': [1, 2, 3, 4, 5]
- });
- expect(input.path, '/my/path');
- expect(input.digest, <int>[1, 2, 3, 4, 5]);
- }
-
- test_fromJson_digest_isMissing() {
- WorkInput input = new WorkInput.fromJson({'path': '/my/path',});
- expect(input.path, '/my/path');
- expect(input.digest, <int>[]);
- }
-
- test_fromJson_digest_isNotList() {
- expect(() {
- new WorkInput.fromJson({'path': '/my/path', 'digest': 0});
- }, throwsArgumentError);
- }
-
- test_fromJson_digest_isNotListOfInt() {
- expect(() {
- new WorkInput.fromJson({
- 'path': '/my/path',
- 'digest': ['a', 'b', 'c']
- });
- }, throwsArgumentError);
- }
-
- test_fromJson_path_isMissing() {
- expect(() {
- new WorkInput.fromJson({
- 'digest': [1, 2, 3, 4, 5]
- });
- }, throwsArgumentError);
- }
-
- test_fromJson_path_isNotString() {
- expect(() {
- new WorkInput.fromJson({
- 'path': 0,
- 'digest': [1, 2, 3, 4, 5]
- });
- }, throwsArgumentError);
- }
-
- test_toJson() {
- WorkInput input = new WorkInput('/my/path', <int>[1, 2, 3, 4, 5]);
- Map<String, Object> json = input.toJson();
- expect(json, {
- 'path': '/my/path',
- 'digest': [1, 2, 3, 4, 5]
- });
- }
-
- test_toJson_withoutDigest() {
- WorkInput input = new WorkInput('/my/path', null);
- Map<String, Object> json = input.toJson();
- expect(json, {'path': '/my/path'});
- }
-}
-
-@reflectiveTest
-class WorkRequestTest {
- test_fromJson() {
- WorkRequest request = new WorkRequest.fromJson({
- 'arguments': ['--arg1', '--arg2', '--arg3'],
- 'inputs': [
- {
- 'path': '/my/path1',
- 'digest': [11, 12, 13]
- },
- {
- 'path': '/my/path2',
- 'digest': [21, 22, 23]
- }
- ]
- });
- expect(request.arguments, ['--arg1', '--arg2', '--arg3']);
- expect(request.inputs, hasLength(2));
- expect(request.inputs[0].path, '/my/path1');
- expect(request.inputs[0].digest, <int>[11, 12, 13]);
- expect(request.inputs[1].path, '/my/path2');
- expect(request.inputs[1].digest, <int>[21, 22, 23]);
- }
-
- test_fromJson_arguments_isMissing() {
- WorkRequest request = new WorkRequest.fromJson({
- 'inputs': [
- {
- 'path': '/my/path1',
- 'digest': [11, 12, 13]
- },
- ]
- });
- expect(request.arguments, isEmpty);
- expect(request.inputs, hasLength(1));
- expect(request.inputs[0].path, '/my/path1');
- expect(request.inputs[0].digest, <int>[11, 12, 13]);
- }
-
- test_fromJson_arguments_isNotList() {
- expect(() {
- new WorkRequest.fromJson({'arguments': 0, 'inputs': []});
- }, throwsArgumentError);
- }
-
- test_fromJson_arguments_isNotListOfString() {
- expect(() {
- new WorkRequest.fromJson({
- 'arguments': [0, 1, 2],
- 'inputs': []
- });
- }, throwsArgumentError);
- }
-
- test_fromJson_inputs_isMissing() {
- WorkRequest request = new WorkRequest.fromJson({
- 'arguments': ['--arg1', '--arg2', '--arg3'],
- });
- expect(request.arguments, ['--arg1', '--arg2', '--arg3']);
- expect(request.inputs, hasLength(0));
- }
-
- test_fromJson_inputs_isNotList() {
- expect(() {
- new WorkRequest.fromJson({
- 'arguments': ['--arg1', '--arg2', '--arg3'],
- 'inputs': 0
- });
- }, throwsArgumentError);
- }
-
- test_fromJson_inputs_isNotListOfObject() {
- expect(() {
- new WorkRequest.fromJson({
- 'arguments': ['--arg1', '--arg2', '--arg3'],
- 'inputs': [0, 1, 2]
- });
- }, throwsArgumentError);
- }
-
- test_fromJson_noArgumentsInputs() {
- expect(() {
- new WorkRequest.fromJson({});
- }, throwsArgumentError);
- }
-
- test_toJson() {
- WorkRequest request = new WorkRequest(<String>[
- '--arg1',
- '--arg2',
- '--arg3'
- ], <WorkInput>[
- new WorkInput('/my/path1', <int>[11, 12, 13]),
- new WorkInput('/my/path2', <int>[21, 22, 23])
- ]);
- Map<String, Object> json = request.toJson();
- expect(json, {
- 'arguments': ['--arg1', '--arg2', '--arg3'],
- 'inputs': [
- {
- 'path': '/my/path1',
- 'digest': [11, 12, 13]
- },
- {
- 'path': '/my/path2',
- 'digest': [21, 22, 23]
- }
- ]
- });
- }
}
/**
- * [WorkerConnection] mock.
+ * A [StdWorkerConnection] which records its responses.
*/
-class _TestWorkerConnection extends TypedMock implements WorkerConnection {
- final outputList = <Map<String, Object>>[];
+class _TestWorkerConnection extends StdWorkerConnection {
+ final outputList = <WorkResponse>[];
+
+ _TestWorkerConnection(Stdin stdinStream, Stdout stdoutStream)
+ : super(stdinStream, stdoutStream);
@override
- void writeJson(Map<String, Object> json) {
- outputList.add(json);
+ void writeResponse(WorkResponse response) {
+ super.writeResponse(response);
+ outputList.add(response);
}
}
diff --git a/pkg/analyzer_cli/test/data/file_with_todo.dart b/pkg/analyzer_cli/test/data/file_with_todo.dart
new file mode 100644
index 0000000..dd3feda
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/file_with_todo.dart
@@ -0,0 +1,2 @@
+//TODO: add main
+main() {}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index efd6362..0b48331 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -66,6 +66,10 @@
expect(processor.options['test_plugin'], isNotNull);
expect(processor.exception, isNull);
});
+ test('todos', () {
+ drive('data/file_with_todo.dart');
+ expect(outSink.toString().contains('[info]'), isFalse);
+ });
});
group('exit codes', () {
diff --git a/pkg/analyzer_cli/test/message_grouper_test.dart b/pkg/analyzer_cli/test/message_grouper_test.dart
new file mode 100644
index 0000000..6388f9b
--- /dev/null
+++ b/pkg/analyzer_cli/test/message_grouper_test.dart
@@ -0,0 +1,123 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer_cli/src/message_grouper.dart';
+import 'package:unittest/unittest.dart';
+
+import 'utils.dart';
+
+main() {
+ MessageGrouper messageGrouper;
+ TestStdinStream stdinStream;
+
+ setUp(() {
+ stdinStream = new TestStdinStream();
+ messageGrouper = new MessageGrouper(stdinStream);
+ });
+
+ group('message_grouper', () {
+ /// Check that if the message grouper produces the [expectedOutput] in
+ /// response to the corresponding [input].
+ void check(List<int> input, List<List<int>> expectedOutput) {
+ stdinStream.addInputBytes(input);
+ for (var chunk in expectedOutput) {
+ expect(messageGrouper.next, equals(chunk));
+ }
+ }
+
+ /// Make a simple message having the given [length]
+ List<int> makeMessage(int length) {
+ var result = <int>[];
+ for (int i = 0; i < length; i++) {
+ result.add(i & 0xff);
+ }
+ return result;
+ }
+
+ test('Empty message', () {
+ check([0], [[]]);
+ });
+
+ test('Short message', () {
+ check([
+ 5,
+ 10,
+ 20,
+ 30,
+ 40,
+ 50
+ ], [
+ [10, 20, 30, 40, 50]
+ ]);
+ });
+
+ test('Message with 2-byte length', () {
+ var len = 0x155;
+ var msg = makeMessage(len);
+ var encodedLen = [0xd5, 0x02];
+ check([]..addAll(encodedLen)..addAll(msg), [msg]);
+ });
+
+ test('Message with 3-byte length', () {
+ var len = 0x4103;
+ var msg = makeMessage(len);
+ var encodedLen = [0x83, 0x82, 0x01];
+ check([]..addAll(encodedLen)..addAll(msg), [msg]);
+ });
+
+ test('Multiple messages', () {
+ check([
+ 2,
+ 10,
+ 20,
+ 2,
+ 30,
+ 40
+ ], [
+ [10, 20],
+ [30, 40]
+ ]);
+ });
+
+ test('Empty message at start', () {
+ check([
+ 0,
+ 2,
+ 10,
+ 20
+ ], [
+ [],
+ [10, 20]
+ ]);
+ });
+
+ test('Empty message at end', () {
+ check([
+ 2,
+ 10,
+ 20,
+ 0
+ ], [
+ [10, 20],
+ []
+ ]);
+ });
+
+ test('Empty message in the middle', () {
+ check([
+ 2,
+ 10,
+ 20,
+ 0,
+ 2,
+ 30,
+ 40
+ ], [
+ [10, 20],
+ [],
+ [30, 40]
+ ]);
+ });
+ });
+}
diff --git a/pkg/analyzer_cli/test/utils.dart b/pkg/analyzer_cli/test/utils.dart
index 07dbe4b..ce71009b 100644
--- a/pkg/analyzer_cli/test/utils.dart
+++ b/pkg/analyzer_cli/test/utils.dart
@@ -4,6 +4,7 @@
library analyzer_cli.test.utils;
+import 'dart:collection';
import 'dart:io';
import 'dart:mirrors';
@@ -11,6 +12,7 @@
import 'package:analyzer/src/generated/java_io.dart';
import 'package:path/path.dart' as pathos;
import 'package:path/path.dart' as path;
+import 'package:typed_mock/typed_mock.dart';
import 'package:unittest/unittest.dart';
/// Gets the test directory in a way that works with
@@ -63,3 +65,37 @@
}
class _TestUtils {}
+
+/**
+ * A [Stdin] mock.
+ */
+class TestStdinStream extends TypedMock implements Stdin {
+ final pendingBytes = new Queue<int>();
+
+ // Adds all the input bytes to this stream.
+ void addInputBytes(List<int> bytes) {
+ pendingBytes.addAll(bytes);
+ }
+
+ @override
+ int readByteSync() {
+ if (pendingBytes.isEmpty) {
+ return -1;
+ } else {
+ return pendingBytes.removeFirst();
+ }
+ }
+}
+
+/**
+ * A [Stdout] mock.
+ */
+class TestStdoutStream extends TypedMock implements Stdout {
+ final writes = <List<int>>[];
+
+ @override
+ void add(List<int> bytes) {
+ super.add(bytes);
+ writes.add(bytes);
+ }
+}
diff --git a/pkg/compiler/lib/compiler.dart b/pkg/compiler/lib/compiler.dart
index b4c22eb..11e99b3 100644
--- a/pkg/compiler/lib/compiler.dart
+++ b/pkg/compiler/lib/compiler.dart
@@ -52,8 +52,7 @@
* As more features are added to the compiler, new names and
* extensions may be introduced.
*/
-typedef EventSink<String> CompilerOutputProvider(String name,
- String extension);
+typedef EventSink<String> CompilerOutputProvider(String name, String extension);
/**
* Invoked by the compiler to report diagnostics. If [uri] is
@@ -65,8 +64,8 @@
* diagnostic message, and [kind] indicates indicates what kind of
* diagnostic it is.
*/
-typedef void DiagnosticHandler(Uri uri, int begin, int end,
- String message, Diagnostic kind);
+typedef void DiagnosticHandler(
+ Uri uri, int begin, int end, String message, Diagnostic kind);
/**
* Provides a package lookup mechanism in the case that no package root or
@@ -104,18 +103,13 @@
* as the compiler may create multiple files to support lazy loading
* of libraries.
*/
-Future<CompilationResult> compile(
- Uri script,
- Uri libraryRoot,
- Uri packageRoot,
- CompilerInputProvider inputProvider,
- DiagnosticHandler handler,
+Future<CompilationResult> compile(Uri script, Uri libraryRoot, Uri packageRoot,
+ CompilerInputProvider inputProvider, DiagnosticHandler handler,
[List<String> options = const [],
- CompilerOutputProvider outputProvider,
- Map<String, dynamic> environment = const {},
- Uri packageConfig,
- PackagesDiscoveryProvider packagesDiscoveryProvider]) {
-
+ CompilerOutputProvider outputProvider,
+ Map<String, dynamic> environment = const {},
+ Uri packageConfig,
+ PackagesDiscoveryProvider packagesDiscoveryProvider]) {
CompilerOptions compilerOptions = new CompilerOptions.parse(
entryPoint: script,
libraryRoot: libraryRoot,
@@ -131,8 +125,9 @@
new_api.CompilerOutput compilerOutput =
new LegacyCompilerOutput(outputProvider);
- return new_api.compile(compilerOptions, compilerInput,
- compilerDiagnostics, compilerOutput)
+ return new_api
+ .compile(
+ compilerOptions, compilerInput, compilerDiagnostics, compilerOutput)
.then((new_api.CompilationResult result) {
return new CompilationResult(result.compiler, isSuccess: result.isSuccess);
});
diff --git a/pkg/compiler/lib/compiler_new.dart b/pkg/compiler/lib/compiler_new.dart
index 3988c2f..51de3810 100644
--- a/pkg/compiler/lib/compiler_new.dart
+++ b/pkg/compiler/lib/compiler_new.dart
@@ -125,4 +125,3 @@
return new CompilationResult(compiler, isSuccess: success);
});
}
-
diff --git a/pkg/compiler/lib/src/apiimpl.dart b/pkg/compiler/lib/src/apiimpl.dart
index 9e04e16..bfadc5b 100644
--- a/pkg/compiler/lib/src/apiimpl.dart
+++ b/pkg/compiler/lib/src/apiimpl.dart
@@ -9,28 +9,22 @@
import 'package:package_config/packages.dart';
import 'package:package_config/packages_file.dart' as pkgs;
-import 'package:package_config/src/packages_impl.dart' show
- MapPackages,
- NonFilePackagesDirectoryPackages;
-import 'package:package_config/src/util.dart' show
- checkValidPackageUri;
+import 'package:package_config/src/packages_impl.dart'
+ show MapPackages, NonFilePackagesDirectoryPackages;
+import 'package:package_config/src/util.dart' show checkValidPackageUri;
import '../compiler_new.dart' as api;
import 'common.dart';
-import 'common/tasks.dart' show
- GenericTask;
+import 'common/tasks.dart' show GenericTask;
import 'compiler.dart';
-import 'diagnostics/messages.dart' show
- Message;
+import 'diagnostics/messages.dart' show Message;
import 'elements/elements.dart' as elements;
import 'environment.dart';
import 'io/source_file.dart';
-import 'options.dart' show
- CompilerOptions;
+import 'options.dart' show CompilerOptions;
import 'platform_configuration.dart' as platform_configuration;
import 'script.dart';
-
/// Implements the [Compiler] using a [api.CompilerInput] for supplying the
/// sources.
class CompilerImpl extends Compiler {
@@ -50,21 +44,21 @@
Uri get libraryRoot => options.platformConfigUri.resolve(".");
- CompilerImpl(this.provider, api.CompilerOutput outputProvider,
- this.handler, CompilerOptions options)
- : super(options: options, outputProvider: outputProvider,
- environment: new _Environment(options.environment)) {
+ CompilerImpl(this.provider, api.CompilerOutput outputProvider, this.handler,
+ CompilerOptions options)
+ : super(
+ options: options,
+ outputProvider: outputProvider,
+ environment: new _Environment(options.environment)) {
_Environment env = environment;
env.compiler = this;
tasks.addAll([
- userHandlerTask = new GenericTask('Diagnostic handler', this),
- userProviderTask = new GenericTask('Input provider', this),
- userPackagesDiscoveryTask =
- new GenericTask('Package discovery', this),
+ userHandlerTask = new GenericTask('Diagnostic handler', this),
+ userProviderTask = new GenericTask('Input provider', this),
+ userPackagesDiscoveryTask = new GenericTask('Package discovery', this),
]);
}
-
void log(message) {
callUserHandler(
null, null, null, null, message, api.Diagnostic.VERBOSE_INFO);
@@ -72,7 +66,7 @@
/// See [Compiler.translateResolvedUri].
Uri translateResolvedUri(elements.LibraryElement importingLibrary,
- Uri resolvedUri, Spannable spannable) {
+ Uri resolvedUri, Spannable spannable) {
if (resolvedUri.scheme == 'dart') {
return translateDartUri(importingLibrary, resolvedUri, spannable);
}
@@ -85,8 +79,8 @@
Future<Script> readScript(Uri readableUri, [Spannable node]) {
if (!readableUri.isAbsolute) {
if (node == null) node = NO_LOCATION_SPANNABLE;
- reporter.internalError(node,
- 'Relative uri $readableUri provided to readScript(Uri).');
+ reporter.internalError(
+ node, 'Relative uri $readableUri provided to readScript(Uri).');
}
// We need to store the current element since we are reporting read errors
@@ -101,9 +95,7 @@
{'uri': readableUri, 'exception': exception});
} else {
reporter.withCurrentElement(element, () {
- reporter.reportErrorMessage(
- node,
- MessageKind.READ_SCRIPT_ERROR,
+ reporter.reportErrorMessage(node, MessageKind.READ_SCRIPT_ERROR,
{'uri': readableUri, 'exception': exception});
});
}
@@ -114,8 +106,7 @@
if (resourceUri.scheme == 'dart-ext') {
if (!options.allowNativeExtensions) {
reporter.withCurrentElement(element, () {
- reporter.reportErrorMessage(
- node, MessageKind.DART_EXT_NOT_SUPPORTED);
+ reporter.reportErrorMessage(node, MessageKind.DART_EXT_NOT_SUPPORTED);
});
}
return _synthesizeScript(readableUri);
@@ -132,7 +123,7 @@
sourceFile = new StringSourceFile.fromUri(resourceUri, data);
} else {
String message = "Expected a 'String' or a 'List<int>' from the input "
- "provider, but got: ${Error.safeToString(data)}.";
+ "provider, but got: ${Error.safeToString(data)}.";
reportReadError(message);
}
// We use [readableUri] as the URI for the script since need to preserve
@@ -168,19 +159,16 @@
/// Internal libraries (whose name starts with '_') can be only resolved if
/// [importingLibrary] is a platform or patch library.
Uri translateDartUri(elements.LibraryElement importingLibrary,
- Uri resolvedUri, Spannable spannable) {
-
+ Uri resolvedUri, Spannable spannable) {
Uri location = lookupLibraryUri(resolvedUri.path);
if (location == null) {
- reporter.reportErrorMessage(
- spannable,
- MessageKind.LIBRARY_NOT_FOUND,
+ reporter.reportErrorMessage(spannable, MessageKind.LIBRARY_NOT_FOUND,
{'resolvedUri': resolvedUri});
return null;
}
- if (resolvedUri.path.startsWith('_') ) {
+ if (resolvedUri.path.startsWith('_')) {
bool allowInternalLibraryAccess = importingLibrary != null &&
(importingLibrary.isPlatformLibrary ||
importingLibrary.isPatch ||
@@ -190,14 +178,12 @@
if (!allowInternalLibraryAccess) {
if (importingLibrary != null) {
reporter.reportErrorMessage(
- spannable,
- MessageKind.INTERNAL_LIBRARY_FROM,
- {'resolvedUri': resolvedUri,
- 'importingUri': importingLibrary.canonicalUri});
+ spannable, MessageKind.INTERNAL_LIBRARY_FROM, {
+ 'resolvedUri': resolvedUri,
+ 'importingUri': importingLibrary.canonicalUri
+ });
} else {
- reporter.reportErrorMessage(
- spannable,
- MessageKind.INTERNAL_LIBRARY,
+ reporter.reportErrorMessage(spannable, MessageKind.INTERNAL_LIBRARY,
{'resolvedUri': resolvedUri});
registerDisallowedLibraryUse(resolvedUri);
}
@@ -206,16 +192,13 @@
}
if (location.scheme == "unsupported") {
- reporter.reportErrorMessage(
- spannable,
- MessageKind.LIBRARY_NOT_SUPPORTED,
+ reporter.reportErrorMessage(spannable, MessageKind.LIBRARY_NOT_SUPPORTED,
{'resolvedUri': resolvedUri});
registerDisallowedLibraryUse(resolvedUri);
return null;
}
- if (resolvedUri.path == 'html' ||
- resolvedUri.path == 'io') {
+ if (resolvedUri.path == 'html' || resolvedUri.path == 'io') {
// TODO(ahe): Get rid of mockableLibraryUsed when test.dart
// supports this use case better.
mockableLibraryUsed = true;
@@ -227,24 +210,18 @@
try {
checkValidPackageUri(uri);
} on ArgumentError catch (e) {
- reporter.reportErrorMessage(
- node,
- MessageKind.INVALID_PACKAGE_URI,
+ reporter.reportErrorMessage(node, MessageKind.INVALID_PACKAGE_URI,
{'uri': uri, 'exception': e.message});
return null;
}
- return packages.resolve(uri,
- notFound: (Uri notFound) {
- reporter.reportErrorMessage(
- node,
- MessageKind.LIBRARY_NOT_FOUND,
- {'resolvedUri': uri});
- return null;
- });
+ return packages.resolve(uri, notFound: (Uri notFound) {
+ reporter.reportErrorMessage(
+ node, MessageKind.LIBRARY_NOT_FOUND, {'resolvedUri': uri});
+ return null;
+ });
}
- Future<elements.LibraryElement> analyzeUri(
- Uri uri,
+ Future<elements.LibraryElement> analyzeUri(Uri uri,
{bool skipLibraryWithPartOfTag: true}) {
List<Future> setupFutures = new List<Future>();
if (sdkLibraries == null) {
@@ -254,8 +231,8 @@
setupFutures.add(setupPackages(uri));
}
return Future.wait(setupFutures).then((_) {
- return super.analyzeUri(uri,
- skipLibraryWithPartOfTag: skipLibraryWithPartOfTag);
+ return super
+ .analyzeUri(uri, skipLibraryWithPartOfTag: skipLibraryWithPartOfTag);
});
}
@@ -271,12 +248,11 @@
}
// The input provider may put a trailing 0 byte when it reads a source
// file, which confuses the package config parser.
- if (configContents.length > 0 &&
- configContents.last == 0) {
+ if (configContents.length > 0 && configContents.last == 0) {
configContents = configContents.sublist(0, configContents.length - 1);
}
- packages = new MapPackages(
- pkgs.parse(configContents, options.packageConfig));
+ packages =
+ new MapPackages(pkgs.parse(configContents, options.packageConfig));
}).catchError((error) {
reporter.reportErrorMessage(
NO_LOCATION_SPANNABLE,
@@ -298,7 +274,8 @@
Future<Null> setupSdk() {
if (sdkLibraries == null) {
- return platform_configuration.load(options.platformConfigUri, provider)
+ return platform_configuration
+ .load(options.platformConfigUri, provider)
.then((Map<String, Uri> mapping) {
sdkLibraries = mapping;
});
@@ -338,16 +315,15 @@
}
void reportDiagnostic(DiagnosticMessage message,
- List<DiagnosticMessage> infos,
- api.Diagnostic kind) {
+ List<DiagnosticMessage> infos, api.Diagnostic kind) {
_reportDiagnosticMessage(message, kind);
for (DiagnosticMessage info in infos) {
_reportDiagnosticMessage(info, api.Diagnostic.INFO);
}
}
- void _reportDiagnosticMessage(DiagnosticMessage diagnosticMessage,
- api.Diagnostic kind) {
+ void _reportDiagnosticMessage(
+ DiagnosticMessage diagnosticMessage, api.Diagnostic kind) {
// [:span.uri:] might be [:null:] in case of a [Script] with no [uri]. For
// instance in the [Types] constructor in typechecker.dart.
SourceSpan span = diagnosticMessage.sourceSpan;
@@ -364,7 +340,7 @@
mockableLibraryUsed && options.allowMockCompilation;
void callUserHandler(Message message, Uri uri, int begin, int end,
- String text, api.Diagnostic kind) {
+ String text, api.Diagnostic kind) {
userHandlerTask.measure(() {
handler.report(message, uri, begin, end, text, kind);
});
@@ -375,13 +351,13 @@
}
Future<Packages> callUserPackagesDiscovery(Uri uri) {
- return userPackagesDiscoveryTask.measure(
- () => options.packagesDiscoveryProvider(uri));
+ return userPackagesDiscoveryTask
+ .measure(() => options.packagesDiscoveryProvider(uri));
}
Uri lookupLibraryUri(String libraryName) {
- assert(invariant(NO_LOCATION_SPANNABLE,
- sdkLibraries != null, message: "setupSdk() has not been run"));
+ assert(invariant(NO_LOCATION_SPANNABLE, sdkLibraries != null,
+ message: "setupSdk() has not been run"));
return sdkLibraries[libraryName];
}
@@ -401,8 +377,8 @@
_Environment(this.definitions);
String valueOf(String name) {
- assert(invariant(NO_LOCATION_SPANNABLE,
- compiler.sdkLibraries != null, message: "setupSdk() has not been run"));
+ assert(invariant(NO_LOCATION_SPANNABLE, compiler.sdkLibraries != null,
+ message: "setupSdk() has not been run"));
var result = definitions[name];
if (result != null || definitions.containsKey(name)) return result;
diff --git a/pkg/compiler/lib/src/cache_strategy.dart b/pkg/compiler/lib/src/cache_strategy.dart
index 2a0a8f0..3136a18 100644
--- a/pkg/compiler/lib/src/cache_strategy.dart
+++ b/pkg/compiler/lib/src/cache_strategy.dart
@@ -2,9 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'dart:collection' show
- HashMap,
- HashSet;
+import 'dart:collection' show HashMap, HashSet;
/**
* Helper class for allocating sets and maps appropriate for caching objects
diff --git a/pkg/compiler/lib/src/closure.dart b/pkg/compiler/lib/src/closure.dart
index 1315016..2d0ee99 100644
--- a/pkg/compiler/lib/src/closure.dart
+++ b/pkg/compiler/lib/src/closure.dart
@@ -5,31 +5,22 @@
library closureToClassMapper;
import 'common.dart';
-import 'common/names.dart' show
- Identifiers;
-import 'common/resolution.dart' show
- Parsing,
- Resolution;
-import 'common/tasks.dart' show
- CompilerTask;
-import 'compiler.dart' show
- Compiler;
+import 'common/names.dart' show Identifiers;
+import 'common/resolution.dart' show Parsing, Resolution;
+import 'common/tasks.dart' show CompilerTask;
+import 'compiler.dart' show Compiler;
import 'constants/expressions.dart';
import 'dart_types.dart';
import 'elements/elements.dart';
-import 'elements/modelx.dart' show
- BaseFunctionElementX,
- ClassElementX,
- ElementX,
- LocalFunctionElementX;
+import 'elements/modelx.dart'
+ show BaseFunctionElementX, ClassElementX, ElementX, LocalFunctionElementX;
import 'elements/visitor.dart' show ElementVisitor;
import 'js_backend/js_backend.dart' show JavaScriptBackend;
import 'resolution/tree_elements.dart' show TreeElements;
import 'tokens/token.dart' show Token;
import 'tree/tree.dart';
import 'util/util.dart';
-import 'universe/universe.dart' show
- Universe;
+import 'universe/universe.dart' show Universe;
class ClosureTask extends CompilerTask {
Map<Node, ClosureClassMap> closureMappingCache;
@@ -39,9 +30,8 @@
String get name => "Closure Simplifier";
- ClosureClassMap computeClosureToClassMapping(Element element,
- Node node,
- TreeElements elements) {
+ ClosureClassMap computeClosureToClassMapping(
+ Element element, Node node, TreeElements elements) {
return measure(() {
ClosureClassMap cached = closureMappingCache[node];
if (cached != null) return cached;
@@ -107,9 +97,7 @@
/// The [BoxLocal] or [LocalElement] being accessed through the field.
final Local local;
- ClosureFieldElement(String name,
- this.local,
- ClosureClassElement enclosing)
+ ClosureFieldElement(String name, this.local, ClosureClassElement enclosing)
: super(name, ElementKind.FIELD, enclosing);
/// Use [closureClass] instead.
@@ -128,8 +116,8 @@
bool get hasNode => false;
Node get node {
- throw new SpannableAssertionFailure(local,
- 'Should not access node of ClosureFieldElement.');
+ throw new SpannableAssertionFailure(
+ local, 'Should not access node of ClosureFieldElement.');
}
bool get hasResolvedAst => hasTreeElements;
@@ -139,8 +127,8 @@
}
Expression get initializer {
- throw new SpannableAssertionFailure(local,
- 'Should not access initializer of ClosureFieldElement.');
+ throw new SpannableAssertionFailure(
+ local, 'Should not access initializer of ClosureFieldElement.');
}
bool get isInstanceMember => true;
@@ -177,6 +165,7 @@
DartType rawType;
DartType thisType;
FunctionType callType;
+
/// Node that corresponds to this closure, used for source position.
final FunctionExpression node;
@@ -187,18 +176,17 @@
final List<ClosureFieldElement> _closureFields = <ClosureFieldElement>[];
- ClosureClassElement(this.node,
- String name,
- Compiler compiler,
- LocalFunctionElement closure)
+ ClosureClassElement(
+ this.node, String name, Compiler compiler, LocalFunctionElement closure)
: this.methodElement = closure,
- super(name,
- closure.compilationUnit,
- // By assigning a fresh class-id we make sure that the hashcode
- // is unique, but also emit closure classes after all other
- // classes (since the emitter sorts classes by their id).
- compiler.getNextFreeClassId(),
- STATE_DONE) {
+ super(
+ name,
+ closure.compilationUnit,
+ // By assigning a fresh class-id we make sure that the hashcode
+ // is unique, but also emit closure classes after all other
+ // classes (since the emitter sorts classes by their id).
+ compiler.getNextFreeId(),
+ STATE_DONE) {
JavaScriptBackend backend = compiler.backend;
ClassElement superclass = methodElement.isInstanceMember
? backend.helpers.boundClosureClass
@@ -251,12 +239,14 @@
// TODO(ngeoffray, ahe): These classes continuously cause problems. We need to
// find a more general solution.
class BoxFieldElement extends ElementX
- implements TypedElement, CapturedVariable, FieldElement,
+ implements
+ TypedElement,
+ CapturedVariable,
+ FieldElement,
PrivatelyNamedJSEntity {
final BoxLocal box;
- BoxFieldElement(String name, this.variableElement,
- BoxLocal box)
+ BoxFieldElement(String name, this.variableElement, BoxLocal box)
: this.box = box,
super(name, ElementKind.FIELD, box.executableContext);
@@ -323,9 +313,8 @@
implements MethodElement {
final LocalFunctionElement expression;
- SynthesizedCallMethodElementX(String name,
- LocalFunctionElementX other,
- ClosureClassElement enclosing)
+ SynthesizedCallMethodElementX(
+ String name, LocalFunctionElementX other, ClosureClassElement enclosing)
: expression = other,
super(name, other.kind, other.modifiers, enclosing) {
asyncMarker = other.asyncMarker;
@@ -378,8 +367,8 @@
return capturedVariables.containsKey(variable);
}
- void forEachCapturedVariable(f(LocalVariableElement variable,
- BoxFieldElement boxField)) {
+ void forEachCapturedVariable(
+ f(LocalVariableElement variable, BoxFieldElement boxField)) {
capturedVariables.forEach(f);
}
}
@@ -416,10 +405,8 @@
/// TODO(johnniwinter): Add variables to this only if the variable is mutated.
final Set<Local> variablesUsedInTryOrGenerator = new Set<Local>();
- ClosureClassMap(this.closureElement,
- this.closureClassElement,
- this.callElement,
- this.thisLocal);
+ ClosureClassMap(this.closureElement, this.closureClassElement,
+ this.callElement, this.thisLocal);
void addFreeVariable(Local element) {
assert(freeVariableMap[element] == null);
@@ -432,8 +419,7 @@
return freeVariableMap.containsKey(element);
}
- void forEachFreeVariable(f(Local variable,
- CapturedVariable field)) {
+ void forEachFreeVariable(f(Local variable, CapturedVariable field)) {
freeVariableMap.forEach(f);
}
@@ -457,8 +443,7 @@
return capturingScopesBox(variable);
}
- void forEachCapturedVariable(void f(Local variable,
- CapturedVariable field)) {
+ void forEachCapturedVariable(void f(Local variable, CapturedVariable field)) {
freeVariableMap.forEach((variable, copy) {
if (variable is BoxLocal) return;
f(variable, copy);
@@ -468,8 +453,8 @@
});
}
- void forEachBoxedVariable(void f(LocalVariableElement local,
- BoxFieldElement field)) {
+ void forEachBoxedVariable(
+ void f(LocalVariableElement local, BoxFieldElement field)) {
freeVariableMap.forEach((variable, copy) {
if (!isVariableBoxed(variable)) return;
f(variable, copy);
@@ -521,9 +506,7 @@
bool insideClosure = false;
- ClosureTranslator(this.compiler,
- this.elements,
- this.closureMappingCache);
+ ClosureTranslator(this.compiler, this.elements, this.closureMappingCache);
DiagnosticReporter get reporter => compiler.reporter;
@@ -568,8 +551,7 @@
_capturedVariableMapping[variable] = null;
}
- void setCapturedVariableBoxField(Local variable,
- BoxFieldElement boxField) {
+ void setCapturedVariableBoxField(Local variable, BoxFieldElement boxField) {
assert(isCapturedVariable(variable));
_capturedVariableMapping[variable] = boxField;
}
@@ -591,9 +573,10 @@
}
void translateLazyInitializer(VariableElement element,
- VariableDefinitions node,
- Expression initializer) {
- visitInvokable(element, node, () { visit(initializer); });
+ VariableDefinitions node, Expression initializer) {
+ visitInvokable(element, node, () {
+ visit(initializer);
+ });
updateClosures();
}
@@ -627,8 +610,7 @@
}
});
ClosureClassElement closureClass = data.closureClassElement;
- assert(closureClass != null ||
- (fieldCaptures.isEmpty && boxes.isEmpty));
+ assert(closureClass != null || (fieldCaptures.isEmpty && boxes.isEmpty));
void addClosureField(Local local, String name) {
ClosureFieldElement closureField =
@@ -674,7 +656,7 @@
// the factory.
bool inCurrentContext(Local variable) {
return variable == executableContext ||
- variable.executableContext == executableContext;
+ variable.executableContext == executableContext;
}
if (insideClosure && !inCurrentContext(variable)) {
@@ -719,8 +701,8 @@
visit(node.type);
}
for (Link<Node> link = node.definitions.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
Node definition = link.head;
LocalElement element = elements[definition];
assert(element != null);
@@ -748,7 +730,8 @@
// TODO(karlklose,johnniwinther): if the type is null, the annotation is
// from a parameter which has been analyzed before the method has been
// resolved and the result has been thrown away.
- if (compiler.options.enableTypeAssertions && type != null &&
+ if (compiler.options.enableTypeAssertions &&
+ type != null &&
type.containsTypeVariables) {
if (insideClosure && member.isFactoryConstructor) {
// This is a closure in a factory constructor. Since there is no
@@ -775,8 +758,7 @@
} else {
Element element = elements[node];
if (element != null && element.isTypeVariable) {
- if (outermostElement.isConstructor ||
- outermostElement.isField) {
+ if (outermostElement.isConstructor || outermostElement.isField) {
TypeVariableElement typeVariable = element;
useTypeVariableAsLocal(typeVariable.type);
} else {
@@ -796,7 +778,7 @@
TypeVariableElement variable = element;
analyzeType(variable.type);
} else if (node.receiver == null &&
- Elements.isInstanceSend(node, elements)) {
+ Elements.isInstanceSend(node, elements)) {
registerNeedsThis();
} else if (node.isSuperCall) {
registerNeedsThis();
@@ -848,8 +830,7 @@
type.forEachTypeVariable((TypeVariableType typeVariable) {
// Field initializers are inlined and access the type variable as
// normal parameters.
- if (!outermostElement.isField &&
- !outermostElement.isConstructor) {
+ if (!outermostElement.isField && !outermostElement.isConstructor) {
registerNeedsThis();
} else {
useTypeVariableAsLocal(typeVariable);
@@ -862,8 +843,7 @@
if (type == null) return;
if (outermostElement.isClassMember &&
compiler.backend.classNeedsRti(outermostElement.enclosingClass)) {
- if (outermostElement.isConstructor ||
- outermostElement.isField) {
+ if (outermostElement.isConstructor || outermostElement.isField) {
analyzeTypeVariables(type);
} else if (outermostElement.isInstanceMember) {
if (type.containsTypeVariables) {
@@ -958,8 +938,8 @@
node.initializer.asVariableDefinitions();
if (definitions == null) return;
for (Link<Node> link = definitions.definitions.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
Node definition = link.head;
LocalVariableElement element = elements[definition];
// Non-mutated variables should not be boxed. The mutatedVariables set
@@ -984,20 +964,20 @@
parts = parts.prepend(ownName);
}
for (Element enclosingElement = element.enclosingElement;
- enclosingElement != null &&
- (enclosingElement.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY
- || enclosingElement.kind == ElementKind.GENERATIVE_CONSTRUCTOR
- || enclosingElement.kind == ElementKind.CLASS
- || enclosingElement.kind == ElementKind.FUNCTION
- || enclosingElement.kind == ElementKind.GETTER
- || enclosingElement.kind == ElementKind.SETTER);
- enclosingElement = enclosingElement.enclosingElement) {
+ enclosingElement != null &&
+ (enclosingElement.kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY ||
+ enclosingElement.kind == ElementKind.GENERATIVE_CONSTRUCTOR ||
+ enclosingElement.kind == ElementKind.CLASS ||
+ enclosingElement.kind == ElementKind.FUNCTION ||
+ enclosingElement.kind == ElementKind.GETTER ||
+ enclosingElement.kind == ElementKind.SETTER);
+ enclosingElement = enclosingElement.enclosingElement) {
// TODO(johnniwinther): Simplify computed names.
if (enclosingElement.isGenerativeConstructor ||
enclosingElement.isGenerativeConstructorBody ||
enclosingElement.isFactoryConstructor) {
- parts = parts.prepend(
- Elements.reconstructConstructorName(enclosingElement));
+ parts = parts
+ .prepend(Elements.reconstructConstructorName(enclosingElement));
} else {
String surroundingName =
Elements.operatorNameToIdentifier(enclosingElement.name);
@@ -1014,18 +994,16 @@
JavaScriptBackend get backend => compiler.backend;
- ClosureClassMap globalizeClosure(FunctionExpression node,
- LocalFunctionElement element) {
+ ClosureClassMap globalizeClosure(
+ FunctionExpression node, LocalFunctionElement element) {
String closureName = computeClosureName(element);
- ClosureClassElement globalizedElement = new ClosureClassElement(
- node, closureName, compiler, element);
+ ClosureClassElement globalizedElement =
+ new ClosureClassElement(node, closureName, compiler, element);
// Extend [globalizedElement] as an instantiated class in the closed world.
- compiler.world.registerClass(
- globalizedElement, isDirectlyInstantiated: true);
- FunctionElement callElement =
- new SynthesizedCallMethodElementX(Identifiers.call,
- element,
- globalizedElement);
+ compiler.world
+ .registerClass(globalizedElement, isDirectlyInstantiated: true);
+ FunctionElement callElement = new SynthesizedCallMethodElementX(
+ Identifiers.call, element, globalizedElement);
backend.maybeMarkClosureAsNeededForReflection(
globalizedElement, callElement, element);
MemberElement enclosing = element.memberContext;
@@ -1036,13 +1014,12 @@
// function. It could be [null] if we are inside a static method.
ThisLocal thisElement = closureData.thisLocal;
- return new ClosureClassMap(element, globalizedElement,
- callElement, thisElement);
+ return new ClosureClassMap(
+ element, globalizedElement, callElement, thisElement);
}
- void visitInvokable(ExecutableElement element,
- Node node,
- void visitChildren()) {
+ void visitInvokable(
+ ExecutableElement element, Node node, void visitChildren()) {
bool oldInsideClosure = insideClosure;
Element oldFunctionElement = executableContext;
ClosureClassMap oldClosureData = closureData;
@@ -1070,14 +1047,13 @@
// escape the potential type variables used in that closure.
if (element is FunctionElement &&
(compiler.backend.methodNeedsRti(element) ||
- compiler.options.enableTypeAssertions)) {
+ compiler.options.enableTypeAssertions)) {
analyzeTypeVariables(type);
}
visitChildren();
});
-
ClosureClassMap savedClosureData = closureData;
bool savedInsideClosure = insideClosure;
diff --git a/pkg/compiler/lib/src/commandline_options.dart b/pkg/compiler/lib/src/commandline_options.dart
index 1997d1c..0f3a7da 100644
--- a/pkg/compiler/lib/src/commandline_options.dart
+++ b/pkg/compiler/lib/src/commandline_options.dart
@@ -51,6 +51,7 @@
// Experimental flags.
static const String conditionalDirectives = '--conditional-directives';
+ static const String genericMethodSyntax = '--generic-method-syntax';
}
class Option {
diff --git a/pkg/compiler/lib/src/common.dart b/pkg/compiler/lib/src/common.dart
index df3ad46..bf49907 100644
--- a/pkg/compiler/lib/src/common.dart
+++ b/pkg/compiler/lib/src/common.dart
@@ -6,20 +6,16 @@
/// of phase or subfunctionality.
library dart2js.common;
-export 'diagnostics/diagnostic_listener.dart' show
- DiagnosticMessage,
- DiagnosticReporter;
-export 'diagnostics/invariant.dart' show
- assertDebugMode,
- InternalErrorFunction,
- invariant;
-export 'diagnostics/messages.dart' show
- MessageKind;
-export 'diagnostics/source_span.dart' show
- SourceSpan;
-export 'diagnostics/spannable.dart' show
- CURRENT_ELEMENT_SPANNABLE,
- NO_LOCATION_SPANNABLE,
- Spannable,
- SpannableAssertionFailure;
+export 'diagnostics/diagnostic_listener.dart'
+ show DiagnosticMessage, DiagnosticReporter;
+export 'diagnostics/invariant.dart'
+ show assertDebugMode, InternalErrorFunction, invariant;
+export 'diagnostics/messages.dart' show MessageKind;
+export 'diagnostics/source_span.dart' show SourceSpan;
+export 'diagnostics/spannable.dart'
+ show
+ CURRENT_ELEMENT_SPANNABLE,
+ NO_LOCATION_SPANNABLE,
+ Spannable,
+ SpannableAssertionFailure;
export 'helpers/helpers.dart';
diff --git a/pkg/compiler/lib/src/common/backend_api.dart b/pkg/compiler/lib/src/common/backend_api.dart
index d7af0cb..71a8c82 100644
--- a/pkg/compiler/lib/src/common/backend_api.dart
+++ b/pkg/compiler/lib/src/common/backend_api.dart
@@ -7,77 +7,44 @@
import 'dart:async' show Future;
import '../common.dart';
-import '../common/codegen.dart' show
- CodegenImpact;
-import '../common/resolution.dart' show
- ResolutionImpact;
-import '../compiler.dart' show
- Compiler;
-import '../compile_time_constants.dart' show
- BackendConstantEnvironment,
- ConstantCompilerTask;
-import '../constants/expressions.dart' show
- ConstantExpression;
-import '../constants/constant_system.dart' show
- ConstantSystem;
-import '../constants/values.dart' show
- ConstantValue;
-import '../dart_types.dart' show
- DartType,
- InterfaceType;
-import '../elements/elements.dart' show
- ClassElement,
- ConstructorElement,
- Element,
- FunctionElement,
- LibraryElement,
- MetadataAnnotation,
- MethodElement;
-import '../enqueue.dart' show
- Enqueuer,
- CodegenEnqueuer,
- ResolutionEnqueuer;
-import '../io/code_output.dart' show
- CodeBuffer;
-import '../io/source_information.dart' show
- SourceInformationStrategy;
-import '../js_backend/backend_helpers.dart' as js_backend show
- BackendHelpers;
-import '../js_backend/js_backend.dart' as js_backend show
- JavaScriptBackend;
-import '../library_loader.dart' show
- LibraryLoader,
- LoadedLibraries;
-import '../native/native.dart' as native show
- NativeEnqueuer,
- maybeEnableNative;
-import '../patch_parser.dart' show
- checkNativeAnnotation, checkJsInteropAnnotation;
-import '../resolution/tree_elements.dart' show
- TreeElements;
-import '../serialization/serialization.dart' show
- DeserializerPlugin,
- ObjectDecoder,
- ObjectEncoder,
- SerializerPlugin;
-import '../tree/tree.dart' show
- Node,
- Send;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/world_impact.dart' show
- ImpactStrategy,
- WorldImpact;
+import '../common/codegen.dart' show CodegenImpact;
+import '../common/resolution.dart' show ResolutionImpact;
+import '../compiler.dart' show Compiler;
+import '../compile_time_constants.dart'
+ show BackendConstantEnvironment, ConstantCompilerTask;
+import '../constants/expressions.dart' show ConstantExpression;
+import '../constants/constant_system.dart' show ConstantSystem;
+import '../constants/values.dart' show ConstantValue;
+import '../dart_types.dart' show DartType, InterfaceType;
+import '../elements/elements.dart'
+ show
+ ClassElement,
+ ConstructorElement,
+ Element,
+ FunctionElement,
+ LibraryElement,
+ MetadataAnnotation,
+ MethodElement;
+import '../enqueue.dart' show Enqueuer, CodegenEnqueuer, ResolutionEnqueuer;
+import '../io/code_output.dart' show CodeBuffer;
+import '../io/source_information.dart' show SourceInformationStrategy;
+import '../js_backend/backend_helpers.dart' as js_backend show BackendHelpers;
+import '../js_backend/js_backend.dart' as js_backend show JavaScriptBackend;
+import '../library_loader.dart' show LibraryLoader, LoadedLibraries;
+import '../native/native.dart' as native show NativeEnqueuer, maybeEnableNative;
+import '../patch_parser.dart'
+ show checkNativeAnnotation, checkJsInteropAnnotation;
+import '../resolution/tree_elements.dart' show TreeElements;
+import '../serialization/serialization.dart'
+ show DeserializerPlugin, ObjectDecoder, ObjectEncoder, SerializerPlugin;
+import '../tree/tree.dart' show Node, Send;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/world_impact.dart' show ImpactStrategy, WorldImpact;
-import 'codegen.dart' show
- CodegenWorkItem;
-import 'registry.dart' show
- Registry;
-import 'tasks.dart' show
- CompilerTask;
-import 'work.dart' show
- ItemCompilationContext;
-
+import 'codegen.dart' show CodegenWorkItem;
+import 'registry.dart' show Registry;
+import 'tasks.dart' show CompilerTask;
+import 'work.dart' show ItemCompilationContext;
abstract class Backend {
final Compiler compiler;
@@ -132,6 +99,7 @@
native.NativeEnqueuer nativeResolutionEnqueuer(world) {
return new native.NativeEnqueuer();
}
+
native.NativeEnqueuer nativeCodegenEnqueuer(world) {
return new native.NativeEnqueuer();
}
@@ -165,52 +133,44 @@
/// Called during resolution when a constant value for [metadata] on
/// [annotatedElement] has been evaluated.
void registerMetadataConstant(MetadataAnnotation metadata,
- Element annotatedElement,
- Registry registry) {}
+ Element annotatedElement, Registry registry) {}
/// Called to notify to the backend that a class is being instantiated.
// TODO(johnniwinther): Remove this. It's only called once for each [cls] and
// only with [Compiler.globalDependencies] as [registry].
- void registerInstantiatedClass(ClassElement cls,
- Enqueuer enqueuer,
- Registry registry) {}
+ void registerInstantiatedClass(
+ ClassElement cls, Enqueuer enqueuer, Registry registry) {}
/// Called to notify to the backend that a class is implemented by an
/// instantiated class.
- void registerImplementedClass(ClassElement cls,
- Enqueuer enqueuer,
- Registry registry) {}
+ void registerImplementedClass(
+ ClassElement cls, Enqueuer enqueuer, Registry registry) {}
/// Called to instruct to the backend register [type] as instantiated on
/// [enqueuer].
- void registerInstantiatedType(InterfaceType type,
- Enqueuer enqueuer,
- Registry registry,
- {bool mirrorUsage: false}) {
+ void registerInstantiatedType(
+ InterfaceType type, Enqueuer enqueuer, Registry registry,
+ {bool mirrorUsage: false}) {
registry.registerDependency(type.element);
enqueuer.registerInstantiatedType(type, mirrorUsage: mirrorUsage);
}
/// Register a runtime type variable bound tests between [typeArgument] and
/// [bound].
- void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
- DartType bound) {}
+ void registerTypeVariableBoundsSubtypeCheck(
+ DartType typeArgument, DartType bound) {}
/**
* Call this to register that an instantiated generic class has a call
* method.
*/
void registerCallMethodWithFreeTypeVariables(
- Element callMethod,
- Enqueuer enqueuer,
- Registry registry) {}
+ Element callMethod, Enqueuer enqueuer, Registry registry) {}
/// Called to instruct the backend to register that a closure exists for a
/// function on an instantiated generic class.
void registerClosureWithFreeTypeVariables(
- Element closure,
- Enqueuer enqueuer,
- Registry registry) {
+ Element closure, Enqueuer enqueuer, Registry registry) {
enqueuer.universe.closuresWithFreeTypeVariables.add(closure);
}
@@ -349,9 +309,8 @@
/// Called by [MirrorUsageAnalyzerTask] after it has merged all @MirrorsUsed
/// annotations. The arguments corresponds to the unions of the corresponding
/// fields of the annotations.
- void registerMirrorUsage(Set<String> symbols,
- Set<Element> targets,
- Set<Element> metaTargets) {}
+ void registerMirrorUsage(
+ Set<String> symbols, Set<Element> targets, Set<Element> metaTargets) {}
/// Returns true if this element needs reflection information at runtime.
bool isAccessibleByReflection(Element element) => true;
@@ -419,15 +378,12 @@
void registerMainHasArguments(Enqueuer enqueuer) {}
- void registerAsyncMarker(FunctionElement element,
- Enqueuer enqueuer,
- Registry registry) {}
+ void registerAsyncMarker(
+ FunctionElement element, Enqueuer enqueuer, Registry registry) {}
/// Called when resolving a call to a foreign function.
- void registerForeignCall(Send node,
- Element element,
- CallStructure callStructure,
- ForeignResolver resolver) {}
+ void registerForeignCall(Send node, Element element,
+ CallStructure callStructure, ForeignResolver resolver) {}
/// Returns the location of the patch-file associated with [libraryName]
/// resolved from [plaformConfigUri].
@@ -438,8 +394,8 @@
/// Creates an impact strategy to use for compilation.
ImpactStrategy createImpactStrategy(
{bool supportDeferredLoad: true,
- bool supportDumpInfo: true,
- bool supportSerialization: true}) {
+ bool supportDumpInfo: true,
+ bool supportSerialization: true}) {
return const ImpactStrategy();
}
}
@@ -473,7 +429,7 @@
}
/// Interface for serialization of backend specific data.
-class BackendSerialization {
+class BackendSerialization {
const BackendSerialization();
SerializerPlugin get serializer => const SerializerPlugin();
diff --git a/pkg/compiler/lib/src/common/codegen.dart b/pkg/compiler/lib/src/common/codegen.dart
index 7e9b40f..0a9cf75 100644
--- a/pkg/compiler/lib/src/common/codegen.dart
+++ b/pkg/compiler/lib/src/common/codegen.dart
@@ -5,40 +5,24 @@
library dart2js.common.codegen;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
-import '../constants/values.dart' show
- ConstantValue;
-import '../dart_types.dart' show
- DartType,
- InterfaceType;
-import '../elements/elements.dart' show
- AstElement,
- ClassElement,
- Element,
- FunctionElement,
- LocalFunctionElement;
-import '../enqueue.dart' show
- CodegenEnqueuer;
-import '../resolution/tree_elements.dart' show
- TreeElements;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
-import '../universe/world_impact.dart' show
- WorldImpact,
- WorldImpactBuilder,
- WorldImpactVisitor;
-import '../util/util.dart' show
- Pair,
- Setlet;
-import 'registry.dart' show
- Registry,
- EagerRegistry;
-import 'work.dart' show
- ItemCompilationContext,
- WorkItem;
+import '../compiler.dart' show Compiler;
+import '../constants/values.dart' show ConstantValue;
+import '../dart_types.dart' show DartType, InterfaceType;
+import '../elements/elements.dart'
+ show
+ AstElement,
+ ClassElement,
+ Element,
+ FunctionElement,
+ LocalFunctionElement;
+import '../enqueue.dart' show CodegenEnqueuer;
+import '../resolution/tree_elements.dart' show TreeElements;
+import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
+import '../universe/world_impact.dart'
+ show WorldImpact, WorldImpactBuilder, WorldImpactVisitor;
+import '../util/util.dart' show Pair, Setlet;
+import 'registry.dart' show Registry, EagerRegistry;
+import 'work.dart' show ItemCompilationContext, WorkItem;
class CodegenImpact extends WorldImpact {
const CodegenImpact();
@@ -94,21 +78,23 @@
Iterable<ConstantValue> get compileTimeConstants {
return _compileTimeConstants != null
- ? _compileTimeConstants : const <ConstantValue>[];
+ ? _compileTimeConstants
+ : const <ConstantValue>[];
}
- void registerTypeVariableBoundsSubtypeCheck(DartType subtype,
- DartType supertype) {
+ void registerTypeVariableBoundsSubtypeCheck(
+ DartType subtype, DartType supertype) {
if (_typeVariableBoundsSubtypeChecks == null) {
_typeVariableBoundsSubtypeChecks = new Setlet<Pair<DartType, DartType>>();
}
- _typeVariableBoundsSubtypeChecks.add(
- new Pair<DartType, DartType>(subtype, supertype));
+ _typeVariableBoundsSubtypeChecks
+ .add(new Pair<DartType, DartType>(subtype, supertype));
}
Iterable<Pair<DartType, DartType>> get typeVariableBoundsSubtypeChecks {
return _typeVariableBoundsSubtypeChecks != null
- ? _typeVariableBoundsSubtypeChecks : const <Pair<DartType, DartType>>[];
+ ? _typeVariableBoundsSubtypeChecks
+ : const <Pair<DartType, DartType>>[];
}
void registerConstSymbol(String name) {
@@ -119,8 +105,7 @@
}
Iterable<String> get constSymbols {
- return _constSymbols != null
- ? _constSymbols : const <String>[];
+ return _constSymbols != null ? _constSymbols : const <String>[];
}
void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
@@ -132,7 +117,8 @@
Iterable<Set<ClassElement>> get specializedGetInterceptors {
return _specializedGetInterceptors != null
- ? _specializedGetInterceptors : const <Set<ClassElement>>[];
+ ? _specializedGetInterceptors
+ : const <Set<ClassElement>>[];
}
void registerUseInterceptor() {
@@ -149,8 +135,7 @@
}
Iterable<ClassElement> get typeConstants {
- return _typeConstants != null
- ? _typeConstants : const <ClassElement>[];
+ return _typeConstants != null ? _typeConstants : const <ClassElement>[];
}
void registerAsyncMarker(FunctionElement element) {
@@ -161,8 +146,7 @@
}
Iterable<Element> get asyncMarkers {
- return _asyncMarkers != null
- ? _asyncMarkers : const <FunctionElement>[];
+ return _asyncMarkers != null ? _asyncMarkers : const <FunctionElement>[];
}
}
@@ -177,7 +161,7 @@
: this.compiler = compiler,
this.currentElement = currentElement,
this.worldImpact = new _CodegenImpact(new EagerRegistry(
- 'EagerRegistry for $currentElement', compiler.enqueuer.codegen));
+ 'EagerRegistry for $currentElement', compiler.enqueuer.codegen));
bool get isForResolution => false;
@@ -204,8 +188,8 @@
worldImpact.registerCompileTimeConstant(constant);
}
- void registerTypeVariableBoundsSubtypeCheck(DartType subtype,
- DartType supertype) {
+ void registerTypeVariableBoundsSubtypeCheck(
+ DartType subtype, DartType supertype) {
worldImpact.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
}
@@ -242,16 +226,14 @@
class CodegenWorkItem extends WorkItem {
CodegenRegistry registry;
- factory CodegenWorkItem(
- Compiler compiler,
- AstElement element,
+ factory CodegenWorkItem(Compiler compiler, AstElement element,
ItemCompilationContext compilationContext) {
// If this assertion fails, the resolution callbacks of the backend may be
// missing call of form registry.registerXXX. Alternatively, the code
// generation could spuriously be adding dependencies on things we know we
// don't need.
- assert(invariant(element,
- compiler.enqueuer.resolution.hasBeenProcessed(element),
+ assert(invariant(
+ element, compiler.enqueuer.resolution.hasBeenProcessed(element),
message: "$element has not been resolved."));
assert(invariant(element, element.resolvedAst.elements != null,
message: 'Resolution tree is null for $element in codegen work item'));
@@ -259,8 +241,7 @@
}
CodegenWorkItem.internal(
- AstElement element,
- ItemCompilationContext compilationContext)
+ AstElement element, ItemCompilationContext compilationContext)
: super(element, compilationContext);
TreeElements get resolutionTree => element.resolvedAst.elements;
diff --git a/pkg/compiler/lib/src/common/names.dart b/pkg/compiler/lib/src/common/names.dart
index 70ebabe..300d176 100644
--- a/pkg/compiler/lib/src/common/names.dart
+++ b/pkg/compiler/lib/src/common/names.dart
@@ -6,13 +6,9 @@
/// the compiler.
library dart2js.common.names;
-import '../elements/elements.dart' show
- Name,
- PublicName;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
+import '../elements/elements.dart' show Name, PublicName;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
/// [String]s commonly used.
class Identifiers {
@@ -106,8 +102,7 @@
new Selector.call(Names.toString_, CallStructure.NO_ARGS);
/// The selector for tearing off toString.
- static final Selector toStringGetter =
- new Selector.getter(Names.toString_);
+ static final Selector toStringGetter = new Selector.getter(Names.toString_);
static final Selector hashCode_ =
new Selector.getter(const PublicName('hashCode'));
@@ -131,9 +126,22 @@
/// These objects are shared between different runs in batch-mode and must
/// thus remain in the [Selector.canonicalizedValues] map.
static final List<Selector> ALL = <Selector>[
- cancel, current, iterator, moveNext, noSuchMethod_, noSuchMethodGetter,
- toString_, toStringGetter, hashCode_, compareTo, equals, length,
- codeUnitAt, index, runtimeType_];
+ cancel,
+ current,
+ iterator,
+ moveNext,
+ noSuchMethod_,
+ noSuchMethodGetter,
+ toString_,
+ toStringGetter,
+ hashCode_,
+ compareTo,
+ equals,
+ length,
+ codeUnitAt,
+ index,
+ runtimeType_
+ ];
}
/// [Uri]s commonly used.
diff --git a/pkg/compiler/lib/src/common/registry.dart b/pkg/compiler/lib/src/common/registry.dart
index 1ba7b9d..0499858 100644
--- a/pkg/compiler/lib/src/common/registry.dart
+++ b/pkg/compiler/lib/src/common/registry.dart
@@ -4,16 +4,10 @@
library dart2js.common.registry;
-import '../dart_types.dart' show
- InterfaceType;
-import '../enqueue.dart' show
- Enqueuer;
-import '../elements/elements.dart' show
- Element,
- FunctionElement;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse;
+import '../dart_types.dart' show InterfaceType;
+import '../enqueue.dart' show Enqueuer;
+import '../elements/elements.dart' show Element, FunctionElement;
+import '../universe/use.dart' show DynamicUse, StaticUse;
/// Interface for registration of element dependencies.
abstract class Registry {
diff --git a/pkg/compiler/lib/src/common/resolution.dart b/pkg/compiler/lib/src/common/resolution.dart
index 7c675af..42f9617 100644
--- a/pkg/compiler/lib/src/common/resolution.dart
+++ b/pkg/compiler/lib/src/common/resolution.dart
@@ -1,4 +1,3 @@
-
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@@ -6,49 +5,37 @@
library dart2js.common.resolution;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
-import '../constants/expressions.dart' show
- ConstantExpression;
-import '../core_types.dart' show
- CoreTypes;
-import '../dart_types.dart' show
- DartType,
- InterfaceType;
-import '../elements/elements.dart' show
- AstElement,
- ClassElement,
- Element,
- ErroneousElement,
- FunctionElement,
- FunctionSignature,
- LocalFunctionElement,
- MetadataAnnotation,
- MethodElement,
- TypedefElement,
- TypeVariableElement;
-import '../enqueue.dart' show
- ResolutionEnqueuer;
-import '../options.dart' show
- ParserOptions;
-import '../parser/element_listener.dart' show
- ScannerOptions;
-import '../tree/tree.dart' show
- AsyncForIn,
- Send,
- TypeAnnotation;
-import '../universe/world_impact.dart' show
- WorldImpact;
-import 'work.dart' show
- ItemCompilationContext,
- WorkItem;
+import '../compiler.dart' show Compiler;
+import '../constants/expressions.dart' show ConstantExpression;
+import '../core_types.dart' show CoreTypes;
+import '../dart_types.dart' show DartType, InterfaceType;
+import '../elements/elements.dart'
+ show
+ AstElement,
+ ClassElement,
+ Element,
+ ErroneousElement,
+ FunctionElement,
+ FunctionSignature,
+ LocalFunctionElement,
+ MetadataAnnotation,
+ MethodElement,
+ ResolvedAst,
+ TypedefElement,
+ TypeVariableElement;
+import '../enqueue.dart' show ResolutionEnqueuer;
+import '../options.dart' show ParserOptions;
+import '../parser/element_listener.dart' show ScannerOptions;
+import '../tree/tree.dart' show AsyncForIn, Send, TypeAnnotation;
+import '../universe/world_impact.dart' show WorldImpact;
+import 'work.dart' show ItemCompilationContext, WorkItem;
/// [WorkItem] used exclusively by the [ResolutionEnqueuer].
class ResolutionWorkItem extends WorkItem {
bool _isAnalyzed = false;
- ResolutionWorkItem(AstElement element,
- ItemCompilationContext compilationContext)
+ ResolutionWorkItem(
+ AstElement element, ItemCompilationContext compilationContext)
: super(element, compilationContext);
WorldImpact run(Compiler compiler, ResolutionEnqueuer world) {
@@ -77,48 +64,69 @@
enum Feature {
/// Invocation of a generative construction on an abstract class.
ABSTRACT_CLASS_INSTANTIATION,
+
/// An assert statement with no message.
ASSERT,
+
/// An assert statement with a message.
ASSERT_WITH_MESSAGE,
+
/// A method with an `async` body modifier.
ASYNC,
+
/// An asynchronous for in statement like `await for (var e in i) {}`.
ASYNC_FOR_IN,
+
/// A method with an `async*` body modifier.
ASYNC_STAR,
+
/// A catch statement.
CATCH_STATEMENT,
+
/// A compile time error.
COMPILE_TIME_ERROR,
+
/// A fall through in a switch case.
FALL_THROUGH_ERROR,
+
/// A ++/-- operation.
INC_DEC_OPERATION,
+
/// A field whose initialization is not a constant.
LAZY_FIELD,
+
/// A catch clause with a variable for the stack trace.
STACK_TRACE_IN_CATCH,
+
/// String interpolation.
STRING_INTERPOLATION,
+
/// String juxtaposition.
STRING_JUXTAPOSITION,
+
/// An implicit call to `super.noSuchMethod`, like calling an unresolved
/// super method.
SUPER_NO_SUCH_METHOD,
+
/// A redirection to the `Symbol` constructor.
SYMBOL_CONSTRUCTOR,
+
/// An synchronous for in statement, like `for (var e in i) {}`.
SYNC_FOR_IN,
+
/// A method with a `sync*` body modifier.
SYNC_STAR,
+
/// A throw expression.
THROW_EXPRESSION,
+
/// An implicit throw of a `NoSuchMethodError`, like calling an unresolved
/// static method.
THROW_NO_SUCH_METHOD,
+
/// An implicit throw of a runtime error, like
THROW_RUNTIME_ERROR,
+
/// The need for a type variable bound check, like instantiation of a generic
/// type whose type variable have non-trivial bounds.
TYPE_VARIABLE_BOUNDS_CHECK,
@@ -133,8 +141,7 @@
MapLiteralUse(this.type, {this.isConstant: false, this.isEmpty: false});
int get hashCode {
- return
- type.hashCode * 13 +
+ return type.hashCode * 13 +
isConstant.hashCode * 17 +
isEmpty.hashCode * 19;
}
@@ -142,8 +149,7 @@
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! MapLiteralUse) return false;
- return
- type == other.type &&
+ return type == other.type &&
isConstant == other.isConstant &&
isEmpty == other.isEmpty;
}
@@ -162,8 +168,7 @@
ListLiteralUse(this.type, {this.isConstant: false, this.isEmpty: false});
int get hashCode {
- return
- type.hashCode * 13 +
+ return type.hashCode * 13 +
isConstant.hashCode * 17 +
isEmpty.hashCode * 19;
}
@@ -171,8 +176,7 @@
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! ListLiteralUse) return false;
- return
- type == other.type &&
+ return type == other.type &&
isConstant == other.isConstant &&
isEmpty == other.isEmpty;
}
@@ -204,6 +208,12 @@
ResolutionWorkItem createWorkItem(
Element element, ItemCompilationContext compilationContext);
+ /// Returns `true` if [element] as a fully computed [ResolvedAst].
+ bool hasResolvedAst(Element element);
+
+ /// Returns the `ResolvedAst` for the [element].
+ ResolvedAst getResolvedAst(Element element);
+
/// Returns `true` if the [ResolutionImpact] for [element] is cached.
bool hasResolutionImpact(Element element);
@@ -233,4 +243,4 @@
measure(f());
ScannerOptions getScannerOptionsFor(Element element);
ParserOptions get parserOptions;
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/common/tasks.dart b/pkg/compiler/lib/src/common/tasks.dart
index 1088363..69e5f11 100644
--- a/pkg/compiler/lib/src/common/tasks.dart
+++ b/pkg/compiler/lib/src/common/tasks.dart
@@ -4,14 +4,11 @@
library dart2js.common.tasks;
-import 'dart:developer' show
- UserTag;
+import 'dart:developer' show UserTag;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
-import '../elements/elements.dart' show
- Element;
+import '../compiler.dart' show Compiler;
+import '../elements/elements.dart' show Element;
typedef void DeferredAction();
@@ -80,8 +77,8 @@
// Use a nested CompilerTask for the measurement to ensure nested [measure]
// calls work correctly. The subtasks will never themselves have nested
// subtasks because they are not accessible outside.
- GenericTask subtask = _subtasks.putIfAbsent(name,
- () => new GenericTask(name, compiler));
+ GenericTask subtask =
+ _subtasks.putIfAbsent(name, () => new GenericTask(name, compiler));
return subtask.measure(action);
}
@@ -93,6 +90,5 @@
class GenericTask extends CompilerTask {
final String name;
- GenericTask(this.name, Compiler compiler)
- : super(compiler);
+ GenericTask(this.name, Compiler compiler) : super(compiler);
}
diff --git a/pkg/compiler/lib/src/common/work.dart b/pkg/compiler/lib/src/common/work.dart
index 482d9e8..31dc75c 100644
--- a/pkg/compiler/lib/src/common/work.dart
+++ b/pkg/compiler/lib/src/common/work.dart
@@ -5,22 +5,16 @@
library dart2js.common.work;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
-import '../elements/elements.dart' show
- AstElement;
-import '../enqueue.dart' show
- Enqueuer;
-import '../universe/world_impact.dart' show
- WorldImpact;
-
+import '../compiler.dart' show Compiler;
+import '../elements/elements.dart' show AstElement;
+import '../enqueue.dart' show Enqueuer;
+import '../universe/world_impact.dart' show WorldImpact;
/**
* Contains backend-specific data that is used throughout the compilation of
* one work item.
*/
-class ItemCompilationContext {
-}
+class ItemCompilationContext {}
abstract class WorkItem {
final ItemCompilationContext compilationContext;
diff --git a/pkg/compiler/lib/src/compile_time_constants.dart b/pkg/compiler/lib/src/compile_time_constants.dart
index 1eabdf3..825176c 100644
--- a/pkg/compiler/lib/src/compile_time_constants.dart
+++ b/pkg/compiler/lib/src/compile_time_constants.dart
@@ -5,31 +5,23 @@
library dart2js.compile_time_constant_evaluator;
import 'common.dart';
-import 'common/resolution.dart' show
- Resolution;
-import 'common/tasks.dart' show
- CompilerTask;
-import 'compiler.dart' show
- Compiler;
+import 'common/resolution.dart' show Resolution;
+import 'common/tasks.dart' show CompilerTask;
+import 'compiler.dart' show Compiler;
import 'constant_system_dart.dart';
import 'constants/constant_system.dart';
import 'constants/evaluation.dart';
import 'constants/expressions.dart';
import 'constants/values.dart';
-import 'core_types.dart' show
- CoreTypes;
+import 'core_types.dart' show CoreTypes;
import 'dart_types.dart';
import 'elements/elements.dart';
-import 'elements/modelx.dart' show
- FunctionElementX;
-import 'resolution/tree_elements.dart' show
- TreeElements;
+import 'elements/modelx.dart' show FunctionElementX;
+import 'resolution/tree_elements.dart' show TreeElements;
import 'resolution/operators.dart';
import 'tree/tree.dart';
-import 'util/util.dart' show
- Link;
-import 'universe/call_structure.dart' show
- CallStructure;
+import 'util/util.dart' show Link;
+import 'universe/call_structure.dart' show CallStructure;
/// A [ConstantEnvironment] provides access for constants compiled for variable
/// initializers.
@@ -87,9 +79,8 @@
/// the compile-time constant for the backend interpretation of constants.
///
/// The returned constant is always of the frontend interpretation.
- ConstantExpression compileMetadata(MetadataAnnotation metadata,
- Node node,
- TreeElements elements);
+ ConstantExpression compileMetadata(
+ MetadataAnnotation metadata, Node node, TreeElements elements);
/// Evaluates [constant] and caches the result.
// TODO(johnniwinther): Remove when all constants are evaluated.
@@ -182,8 +173,7 @@
void evaluate(ConstantExpression constant) {
constantValueMap.putIfAbsent(constant, () {
return constant.evaluate(
- new _CompilerEnvironment(compiler),
- constantSystem);
+ new _CompilerEnvironment(compiler), constantSystem);
});
}
@@ -263,11 +253,8 @@
if (!constantSystem.isSubtype(
compiler.types, constantType, elementType)) {
if (isConst) {
- reporter.reportErrorMessage(
- node,
- MessageKind.NOT_ASSIGNABLE,
- {'fromType': constantType,
- 'toType': elementType});
+ reporter.reportErrorMessage(node, MessageKind.NOT_ASSIGNABLE,
+ {'fromType': constantType, 'toType': elementType});
} else {
// If the field cannot be lazily initialized, we will throw
// the exception at runtime.
@@ -292,10 +279,12 @@
}
ConstantExpression compileNodeWithDefinitions(
- Node node, TreeElements definitions, {bool isConst: true}) {
+ Node node, TreeElements definitions,
+ {bool isConst: true}) {
assert(node != null);
CompileTimeConstantEvaluator evaluator = new CompileTimeConstantEvaluator(
- this, definitions, compiler, isConst: isConst);
+ this, definitions, compiler,
+ isConst: isConst);
AstConstant constant = evaluator.evaluate(node);
if (constant != null) {
cacheConstantValue(constant.expression, constant.value);
@@ -340,7 +329,8 @@
}
ConstantExpression compileNodeWithDefinitions(
- Node node, TreeElements definitions, {bool isConst: true}) {
+ Node node, TreeElements definitions,
+ {bool isConst: true}) {
ConstantExpression constant = definitions.getConstant(node);
if (constant != null && getConstantValue(constant) != null) {
return constant;
@@ -393,13 +383,17 @@
}
AstConstant visitLiteralBool(LiteralBool node) {
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new BoolConstantExpression(node.value),
constantSystem.createBool(node.value));
}
AstConstant visitLiteralDouble(LiteralDouble node) {
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new DoubleConstantExpression(node.value),
constantSystem.createDouble(node.value));
}
@@ -426,7 +420,9 @@
argumentValues.add(argument.value);
}
DartType type = elements.getType(node);
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new ListConstantExpression(type, argumentExpressions),
constantSystem.createList(type, argumentValues));
}
@@ -462,7 +458,9 @@
map[key.value] = value.value;
}
InterfaceType type = elements.getType(node);
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new MapConstantExpression(type, keyExpressions, valueExpressions),
constantSystem.createMap(
compiler, type, keyValues, map.values.toList()));
@@ -474,7 +472,9 @@
}
AstConstant visitLiteralString(LiteralString node) {
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new StringConstantExpression(node.dartString.slowToString()),
constantSystem.createString(node.dartString));
}
@@ -485,7 +485,9 @@
if (left == null || right == null) return null;
StringConstantValue leftValue = left.value;
StringConstantValue rightValue = right.value;
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new ConcatenateConstantExpression([left.expression, right.expression]),
constantSystem.createString(new DartString.concat(
leftValue.primitiveValue, rightValue.primitiveValue)));
@@ -529,7 +531,9 @@
new DartString.concat(accumulator, partStringValue.primitiveValue);
}
;
- return new AstConstant(context, node,
+ return new AstConstant(
+ context,
+ node,
new ConcatenateConstantExpression(subexpressions),
constantSystem.createString(accumulator));
}
@@ -580,7 +584,9 @@
if (Elements.isStaticOrTopLevelFunction(element)) {
FunctionElementX function = element;
function.computeType(resolution);
- result = new AstConstant(context, send,
+ result = new AstConstant(
+ context,
+ send,
new FunctionConstantExpression(function),
new FunctionConstantValue(function));
} else if (Elements.isStaticOrTopLevelField(element)) {
@@ -591,14 +597,18 @@
elementExpression = handler.compileVariable(element);
}
if (elementExpression != null) {
- result = new AstConstant(context, send,
+ result = new AstConstant(
+ context,
+ send,
new VariableConstantExpression(element),
handler.getConstantValue(elementExpression));
}
} else if (Elements.isClass(element) || Elements.isTypedef(element)) {
assert(elements.isTypeLiteral(send));
DartType elementType = elements.getTypeLiteralType(send);
- result = new AstConstant(context, send,
+ result = new AstConstant(
+ context,
+ send,
new TypeConstantExpression(elementType),
makeTypeConstant(elementType));
} else if (send.receiver != null) {
@@ -619,7 +629,9 @@
ConstantExpression variableExpression =
handler.compileConstant(element);
if (variableExpression != null) {
- result = new AstConstant(context, send,
+ result = new AstConstant(
+ context,
+ send,
new VariableConstantExpression(element),
handler.getConstantValue(variableExpression));
}
@@ -634,11 +646,13 @@
}
PrefixElement prefix =
compiler.deferredLoadTask.deferredPrefixElement(send, elements);
- result = new AstConstant(context, send,
+ result = new AstConstant(
+ context,
+ send,
new DeferredConstantExpression(result.expression, prefix),
new DeferredConstantValue(result.value, prefix));
- compiler.deferredLoadTask.registerConstantDeferredUse(
- result.value, prefix);
+ compiler.deferredLoadTask
+ .registerConstantDeferredUse(result.value, prefix);
}
return result;
} else if (send.isCall) {
@@ -651,8 +665,12 @@
ConstantValue result =
constantSystem.identity.fold(left.value, right.value);
if (result != null) {
- return new AstConstant(context, send, new IdenticalConstantExpression(
- left.expression, right.expression), result);
+ return new AstConstant(
+ context,
+ send,
+ new IdenticalConstantExpression(
+ left.expression, right.expression),
+ result);
}
}
return signalNotCompileTimeConstant(send);
@@ -672,7 +690,9 @@
if (folded == null) {
return signalNotCompileTimeConstant(send);
}
- return new AstConstant(context, send,
+ return new AstConstant(
+ context,
+ send,
new UnaryConstantExpression(operator, receiverConstant.expression),
folded);
} else if (send.isOperator && !send.isPostfix) {
@@ -716,8 +736,12 @@
if (folded == null) {
return signalNotCompileTimeConstant(send);
}
- return new AstConstant(context, send, new BinaryConstantExpression(
- left.expression, operator, right.expression), folded);
+ return new AstConstant(
+ context,
+ send,
+ new BinaryConstantExpression(
+ left.expression, operator, right.expression),
+ folded);
}
return signalNotCompileTimeConstant(send);
}
@@ -729,11 +753,8 @@
} else if (!condition.value.isBool) {
DartType conditionType = condition.value.getType(coreTypes);
if (isEvaluatingConstant) {
- reporter.reportErrorMessage(
- node.condition,
- MessageKind.NOT_ASSIGNABLE,
- {'fromType': conditionType,
- 'toType': coreTypes.boolType});
+ reporter.reportErrorMessage(node.condition, MessageKind.NOT_ASSIGNABLE,
+ {'fromType': conditionType, 'toType': coreTypes.boolType});
return new ErroneousAstConstant(context, node);
}
return null;
@@ -744,11 +765,14 @@
return null;
}
BoolConstantValue boolCondition = condition.value;
- return new AstConstant(context, node, new ConditionalConstantExpression(
- condition.expression, thenExpression.expression,
- elseExpression.expression), boolCondition.primitiveValue
- ? thenExpression.value
- : elseExpression.value);
+ return new AstConstant(
+ context,
+ node,
+ new ConditionalConstantExpression(condition.expression,
+ thenExpression.expression, elseExpression.expression),
+ boolCondition.primitiveValue
+ ? thenExpression.value
+ : elseExpression.value);
}
AstConstant visitSendSet(SendSet node) {
@@ -762,9 +786,12 @@
*
* Invariant: [target] must be an implementation element.
*/
- List<AstConstant> evaluateArgumentsToConstructor(Node node,
- CallStructure callStructure, Link<Node> arguments,
- ConstructorElement target, {AstConstant compileArgument(Node node)}) {
+ List<AstConstant> evaluateArgumentsToConstructor(
+ Node node,
+ CallStructure callStructure,
+ Link<Node> arguments,
+ ConstructorElement target,
+ {AstConstant compileArgument(Node node)}) {
assert(invariant(node, target.isImplementation));
AstConstant compileDefaultValue(VariableElement element) {
@@ -778,9 +805,8 @@
if (!callStructure.signatureApplies(signature)) {
String name = Elements.constructorNameForDiagnostics(
target.enclosingClass.name, target.name);
- reporter.reportErrorMessage(
- node, MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS,
- {'constructorName': name});
+ reporter.reportErrorMessage(node,
+ MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS, {'constructorName': name});
return new List<AstConstant>.filled(
target.functionSignature.parameterCount,
@@ -834,8 +860,7 @@
if (constructor.isEffectiveTargetMalformed) {
isInvalid = true;
} else {
- constructedType =
- constructor.computeEffectiveTargetType(type);
+ constructedType = constructor.computeEffectiveTargetType(type);
ConstructorElement target = constructor.effectiveTarget;
// The constructor must be an implementation to ensure that field
// initializers are handled correctly.
@@ -882,14 +907,26 @@
return createFromEnvironmentConstant(node, constructedType, constructor,
callStructure, normalizedArguments, concreteArguments);
} else {
- return makeConstructedConstant(compiler, handler, context, node, type,
- constructor, constructedType, implementation, callStructure,
- concreteArguments, normalizedArguments);
+ return makeConstructedConstant(
+ compiler,
+ handler,
+ context,
+ node,
+ type,
+ constructor,
+ constructedType,
+ implementation,
+ callStructure,
+ concreteArguments,
+ normalizedArguments);
}
}
- AstConstant createFromEnvironmentConstant(Node node, InterfaceType type,
- ConstructorElement constructor, CallStructure callStructure,
+ AstConstant createFromEnvironmentConstant(
+ Node node,
+ InterfaceType type,
+ ConstructorElement constructor,
+ CallStructure callStructure,
List<AstConstant> normalizedArguments,
List<AstConstant> concreteArguments) {
var firstArgument = normalizedArguments[0].value;
@@ -906,8 +943,7 @@
reporter.reportErrorMessage(
normalizedArguments[0].node,
MessageKind.NOT_ASSIGNABLE,
- {'fromType': type,
- 'toType': coreTypes.stringType});
+ {'fromType': type, 'toType': coreTypes.stringType});
return null;
}
@@ -917,8 +953,7 @@
reporter.reportErrorMessage(
normalizedArguments[1].node,
MessageKind.NOT_ASSIGNABLE,
- {'fromType': type,
- 'toType': coreTypes.intType});
+ {'fromType': type, 'toType': coreTypes.intType});
return null;
}
@@ -928,8 +963,7 @@
reporter.reportErrorMessage(
normalizedArguments[1].node,
MessageKind.NOT_ASSIGNABLE,
- {'fromType': type,
- 'toType': coreTypes.boolType});
+ {'fromType': type, 'toType': coreTypes.boolType});
return null;
}
@@ -939,8 +973,7 @@
reporter.reportErrorMessage(
normalizedArguments[1].node,
MessageKind.NOT_ASSIGNABLE,
- {'fromType': type,
- 'toType': coreTypes.stringType});
+ {'fromType': type, 'toType': coreTypes.stringType});
return null;
}
@@ -989,24 +1022,31 @@
}
}
- static AstConstant makeConstructedConstant(Compiler compiler,
- ConstantCompilerBase handler, Element context, Node node,
- InterfaceType type, ConstructorElement constructor,
- InterfaceType constructedType, ConstructorElement target,
- CallStructure callStructure, List<AstConstant> concreteArguments,
+ static AstConstant makeConstructedConstant(
+ Compiler compiler,
+ ConstantCompilerBase handler,
+ Element context,
+ Node node,
+ InterfaceType type,
+ ConstructorElement constructor,
+ InterfaceType constructedType,
+ ConstructorElement target,
+ CallStructure callStructure,
+ List<AstConstant> concreteArguments,
List<AstConstant> normalizedArguments) {
if (target.isRedirectingFactory) {
// This happens is case of cyclic redirection.
assert(invariant(node, compiler.compilationFailed,
message: "makeConstructedConstant can only be called with the "
- "effective target: $constructor"));
+ "effective target: $constructor"));
return new ErroneousAstConstant(context, node);
}
- assert(invariant(node,
+ assert(invariant(
+ node,
callStructure.signatureApplies(constructor.functionSignature) ||
compiler.compilationFailed,
message: "Call structure $callStructure does not apply to constructor "
- "$constructor."));
+ "$constructor."));
ConstructorEvaluator evaluator =
new ConstructorEvaluator(constructedType, target, handler, compiler);
@@ -1018,8 +1058,10 @@
fieldConstants.forEach((FieldElement field, AstConstant astConstant) {
fieldValues[field] = astConstant.value;
});
- return new AstConstant(context, node, new ConstructedConstantExpression(
- type, constructor, callStructure,
+ return new AstConstant(
+ context,
+ node,
+ new ConstructedConstantExpression(type, constructor, callStructure,
concreteArguments.map((e) => e.expression).toList()),
new ConstructedConstantValue(constructedType, fieldValues));
}
@@ -1085,11 +1127,8 @@
if (!constantSystem.isSubtype(
compiler.types, constantType, elementType)) {
reporter.withCurrentElement(constant.element, () {
- reporter.reportErrorMessage(
- constant.node,
- MessageKind.NOT_ASSIGNABLE,
- {'fromType': constantType,
- 'toType': elementType});
+ reporter.reportErrorMessage(constant.node, MessageKind.NOT_ASSIGNABLE,
+ {'fromType': constantType, 'toType': elementType});
});
}
}
@@ -1127,7 +1166,9 @@
List<AstConstant> compiledArguments, FunctionElement targetConstructor) {
ConstructorEvaluator evaluator = new ConstructorEvaluator(
constructedType.asInstanceOf(targetConstructor.enclosingClass),
- targetConstructor, handler, compiler);
+ targetConstructor,
+ handler,
+ compiler);
evaluator.evaluateConstructorFieldValues(compiledArguments);
// Copy over the fieldValues from the super/redirect-constructor.
// No need to go through [updateFieldValue] because the
@@ -1168,11 +1209,11 @@
if (!target.isMalformed) {
List<AstConstant> compiledArguments =
evaluateArgumentsToConstructor(
- call,
- elements.getSelector(call).callStructure,
- call.arguments,
- target,
- compileArgument: evaluateConstant);
+ call,
+ elements.getSelector(call).callStructure,
+ call.arguments,
+ target,
+ compileArgument: evaluateConstant);
evaluateSuperOrRedirectSend(compiledArguments, target);
}
foundSuperOrRedirect = true;
@@ -1202,7 +1243,9 @@
// already and compilation will fail anyway. So just ignore that case.
if (targetConstructor != null) {
List<AstConstant> compiledArguments = evaluateArgumentsToConstructor(
- functionNode, CallStructure.NO_ARGS, const Link<Node>(),
+ functionNode,
+ CallStructure.NO_ARGS,
+ const Link<Node>(),
targetConstructor);
evaluateSuperOrRedirectSend(compiledArguments, targetConstructor);
}
@@ -1227,10 +1270,10 @@
/// inheritance chain of [classElement].
Map<FieldElement, AstConstant> buildFieldConstants(
ClassElement classElement) {
- Map<FieldElement, AstConstant> fieldConstants = <FieldElement, AstConstant>{
- };
- classElement.implementation
- .forEachInstanceField((ClassElement enclosing, FieldElement field) {
+ Map<FieldElement, AstConstant> fieldConstants =
+ <FieldElement, AstConstant>{};
+ classElement.implementation.forEachInstanceField(
+ (ClassElement enclosing, FieldElement field) {
AstConstant fieldValue = fieldValues[field];
if (fieldValue == null) {
// Use the default value.
@@ -1268,9 +1311,11 @@
factory AstConstant.fromDefaultValue(VariableElement element,
ConstantExpression constant, ConstantValue value) {
- return new AstConstant(element, element.initializer != null
- ? element.initializer
- : element.node, constant, value);
+ return new AstConstant(
+ element,
+ element.initializer != null ? element.initializer : element.node,
+ constant,
+ value);
}
String toString() => expression.toString();
@@ -1278,9 +1323,13 @@
/// A synthetic constant used to recover from errors.
class ErroneousAstConstant extends AstConstant {
- ErroneousAstConstant(Element element, Node node) : super(element, node,
- // TODO(johnniwinther): Return a [NonConstantValue] instead.
- new ErroneousConstantExpression(), new NullConstantValue());
+ ErroneousAstConstant(Element element, Node node)
+ : super(
+ element,
+ node,
+ // TODO(johnniwinther): Return a [NonConstantValue] instead.
+ new ErroneousConstantExpression(),
+ new NullConstantValue());
}
// TODO(johnniwinther): Clean this up.
diff --git a/pkg/compiler/lib/src/compiler.dart b/pkg/compiler/lib/src/compiler.dart
index 2cfadd3..1b01849 100644
--- a/pkg/compiler/lib/src/compiler.dart
+++ b/pkg/compiler/lib/src/compiler.dart
@@ -4,161 +4,94 @@
library dart2js.compiler_base;
-import 'dart:async' show
- EventSink,
- Future;
+import 'dart:async' show EventSink, Future;
import '../compiler_new.dart' as api;
-import 'cache_strategy.dart' show
- CacheStrategy;
-import 'closure.dart' as closureMapping show
- ClosureTask;
+import 'cache_strategy.dart' show CacheStrategy;
+import 'closure.dart' as closureMapping show ClosureTask;
import 'common.dart';
-import 'common/backend_api.dart' show
- Backend;
-import 'common/codegen.dart' show
- CodegenImpact,
- CodegenWorkItem;
-import 'common/names.dart' show
- Identifiers,
- Uris;
-import 'common/registry.dart' show
- EagerRegistry,
- Registry;
-import 'common/resolution.dart' show
- Parsing,
- Resolution,
- ResolutionWorkItem,
- ResolutionImpact;
-import 'common/tasks.dart' show
- CompilerTask,
- GenericTask;
-import 'common/work.dart' show
- ItemCompilationContext,
- WorkItem;
+import 'common/backend_api.dart' show Backend;
+import 'common/codegen.dart' show CodegenImpact, CodegenWorkItem;
+import 'common/names.dart' show Identifiers, Uris;
+import 'common/registry.dart' show EagerRegistry, Registry;
+import 'common/resolution.dart'
+ show Parsing, Resolution, ResolutionWorkItem, ResolutionImpact;
+import 'common/tasks.dart' show CompilerTask, GenericTask;
+import 'common/work.dart' show ItemCompilationContext, WorkItem;
import 'compile_time_constants.dart';
import 'constants/values.dart';
-import 'core_types.dart' show
- CoreClasses,
- CoreTypes;
+import 'core_types.dart' show CoreClasses, CoreTypes;
import 'dart_backend/dart_backend.dart' as dart_backend;
-import 'dart_types.dart' show
- DartType,
- DynamicType,
- InterfaceType,
- Types;
+import 'dart_types.dart' show DartType, DynamicType, InterfaceType, Types;
import 'deferred_load.dart' show DeferredLoadTask, OutputUnit;
import 'diagnostics/code_location.dart';
-import 'diagnostics/diagnostic_listener.dart' show
- DiagnosticReporter;
-import 'diagnostics/invariant.dart' show
- REPORT_EXCESS_RESOLUTION;
-import 'diagnostics/messages.dart' show
- Message,
- MessageTemplate;
-import 'dump_info.dart' show
- DumpInfoTask;
+import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
+import 'diagnostics/invariant.dart' show REPORT_EXCESS_RESOLUTION;
+import 'diagnostics/messages.dart' show Message, MessageTemplate;
+import 'dump_info.dart' show DumpInfoTask;
import 'elements/elements.dart';
-import 'elements/modelx.dart' show
- ErroneousElementX,
- ClassElementX,
- CompilationUnitElementX,
- DeferredLoaderGetterElementX,
- MethodElementX,
- LibraryElementX,
- PrefixElementX;
-import 'enqueue.dart' show
- CodegenEnqueuer,
- Enqueuer,
- EnqueueTask,
- ResolutionEnqueuer,
- QueueFilter;
+import 'elements/modelx.dart'
+ show
+ ErroneousElementX,
+ ClassElementX,
+ CompilationUnitElementX,
+ DeferredLoaderGetterElementX,
+ MethodElementX,
+ LibraryElementX,
+ PrefixElementX;
+import 'enqueue.dart'
+ show
+ CodegenEnqueuer,
+ Enqueuer,
+ EnqueueTask,
+ ResolutionEnqueuer,
+ QueueFilter;
import 'environment.dart';
-import 'io/source_information.dart' show
- SourceInformation;
-import 'js_backend/backend_helpers.dart' as js_backend show
- BackendHelpers;
-import 'js_backend/js_backend.dart' as js_backend show
- JavaScriptBackend;
-import 'library_loader.dart' show
- ElementScanner,
- LibraryLoader,
- LibraryLoaderTask,
- LoadedLibraries,
- LibraryLoaderListener,
- ResolvedUriTranslator,
- ScriptLoader;
-import 'mirrors_used.dart' show
- MirrorUsageAnalyzerTask;
-import 'common/names.dart' show
- Selectors;
-import 'null_compiler_output.dart' show
- NullCompilerOutput,
- NullSink;
-import 'options.dart' show
- CompilerOptions,
- DiagnosticOptions,
- ParserOptions;
-import 'parser/diet_parser_task.dart' show
- DietParserTask;
-import 'parser/element_listener.dart' show
- ScannerOptions;
-import 'parser/parser_task.dart' show
- ParserTask;
-import 'patch_parser.dart' show
- PatchParserTask;
-import 'resolution/registry.dart' show
- ResolutionRegistry;
-import 'resolution/resolution.dart' show
- ResolverTask;
-import 'resolution/tree_elements.dart' show
- TreeElementMapping;
-import 'scanner/scanner_task.dart' show
- ScannerTask;
-import 'serialization/task.dart' show
- SerializationTask;
-import 'script.dart' show
- Script;
-import 'ssa/nodes.dart' show
- HInstruction;
-import 'tracer.dart' show
- Tracer;
-import 'tokens/token.dart' show
- StringToken,
- Token,
- TokenPair;
-import 'tokens/token_constants.dart' as Tokens show
- COMMENT_TOKEN,
- EOF_TOKEN;
-import 'tokens/token_map.dart' show
- TokenMap;
-import 'tree/tree.dart' show
- Node,
- TypeAnnotation;
-import 'typechecker.dart' show
- TypeCheckerTask;
+import 'id_generator.dart';
+import 'io/source_information.dart' show SourceInformation;
+import 'js_backend/backend_helpers.dart' as js_backend show BackendHelpers;
+import 'js_backend/js_backend.dart' as js_backend show JavaScriptBackend;
+import 'library_loader.dart'
+ show
+ ElementScanner,
+ LibraryLoader,
+ LibraryLoaderTask,
+ LoadedLibraries,
+ LibraryLoaderListener,
+ ResolvedUriTranslator,
+ ScriptLoader;
+import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
+import 'common/names.dart' show Selectors;
+import 'null_compiler_output.dart' show NullCompilerOutput, NullSink;
+import 'options.dart' show CompilerOptions, DiagnosticOptions, ParserOptions;
+import 'parser/diet_parser_task.dart' show DietParserTask;
+import 'parser/element_listener.dart' show ScannerOptions;
+import 'parser/parser_task.dart' show ParserTask;
+import 'patch_parser.dart' show PatchParserTask;
+import 'resolution/registry.dart' show ResolutionRegistry;
+import 'resolution/resolution.dart' show ResolverTask;
+import 'resolution/tree_elements.dart' show TreeElementMapping;
+import 'scanner/scanner_task.dart' show ScannerTask;
+import 'serialization/task.dart' show SerializationTask;
+import 'script.dart' show Script;
+import 'ssa/nodes.dart' show HInstruction;
+import 'tracer.dart' show Tracer;
+import 'tokens/token.dart' show StringToken, Token, TokenPair;
+import 'tokens/token_map.dart' show TokenMap;
+import 'tree/tree.dart' show Node, TypeAnnotation;
+import 'typechecker.dart' show TypeCheckerTask;
import 'types/types.dart' as ti;
-import 'universe/call_structure.dart' show
- CallStructure;
-import 'universe/selector.dart' show
- Selector;
-import 'universe/universe.dart' show
- Universe;
-import 'universe/use.dart' show
- StaticUse;
-import 'universe/world_impact.dart' show
- ImpactStrategy,
- WorldImpact;
-import 'util/util.dart' show
- Link,
- Setlet;
-import 'world.dart' show
- World;
+import 'universe/call_structure.dart' show CallStructure;
+import 'universe/selector.dart' show Selector;
+import 'universe/universe.dart' show Universe;
+import 'universe/use.dart' show StaticUse;
+import 'universe/world_impact.dart' show ImpactStrategy, WorldImpact;
+import 'util/util.dart' show Link, Setlet;
+import 'world.dart' show World;
-abstract class Compiler implements LibraryLoaderListener {
-
+abstract class Compiler implements LibraryLoaderListener, IdGenerator {
final Stopwatch totalCompileTime = new Stopwatch();
- int nextFreeClassId = 0;
+ final IdGenerator idGenerator = new IdGenerator();
World world;
Types types;
_CompilerCoreTypes _coreTypes;
@@ -324,11 +257,10 @@
/// A customizable filter that is applied to enqueued work items.
QueueFilter enqueuerFilter = new QueueFilter();
- final Selector symbolValidatedConstructorSelector = new Selector.call(
- const PublicName('validated'), CallStructure.ONE_ARG);
+ final Selector symbolValidatedConstructorSelector =
+ new Selector.call(const PublicName('validated'), CallStructure.ONE_ARG);
- static const String CREATE_INVOCATION_MIRROR =
- 'createInvocationMirror';
+ static const String CREATE_INVOCATION_MIRROR = 'createInvocationMirror';
bool enabledRuntimeType = false;
bool enabledFunctionApply = false;
@@ -360,13 +292,15 @@
compilationFailedInternal = value;
}
- Compiler({CompilerOptions options,
- api.CompilerOutput outputProvider,
- this.environment: const _EmptyEnvironment()})
+ Compiler(
+ {CompilerOptions options,
+ api.CompilerOutput outputProvider,
+ this.environment: const _EmptyEnvironment()})
: this.options = options,
this.cacheStrategy = new CacheStrategy(options.hasIncrementalSupport),
this.userOutputProvider = outputProvider == null
- ? const NullCompilerOutput() : outputProvider {
+ ? const NullCompilerOutput()
+ : outputProvider {
world = new World(this);
// TODO(johnniwinther): Initialize core types in [initializeCoreClasses] and
// make its field final.
@@ -386,11 +320,11 @@
globalDependencies = new GlobalDependencyRegistry(this);
if (options.emitJavaScript) {
- js_backend.JavaScriptBackend jsBackend =
- new js_backend.JavaScriptBackend(
- this, generateSourceMap: options.generateSourceMap,
- useStartupEmitter: options.useStartupEmitter,
- useNewSourceInfo: options.useNewSourceInfo);
+ js_backend.JavaScriptBackend jsBackend = new js_backend.JavaScriptBackend(
+ this,
+ generateSourceMap: options.generateSourceMap,
+ useStartupEmitter: options.useStartupEmitter,
+ useNewSourceInfo: options.useNewSourceInfo);
backend = jsBackend;
} else {
backend = new dart_backend.DartBackend(this, options.strips,
@@ -400,11 +334,17 @@
}
}
+ if (options.dumpInfo && options.useStartupEmitter) {
+ throw new ArgumentError(
+ '--dump-info is not supported with the fast startup emitter');
+ }
+
tasks = [
- dietParser = new DietParserTask(this, parsing.parserOptions),
+ dietParser = new DietParserTask(this, parsing.parserOptions, idGenerator),
scanner = createScannerTask(),
serialization = new SerializationTask(this),
- libraryLoader = new LibraryLoaderTask(this,
+ libraryLoader = new LibraryLoaderTask(
+ this,
new _ResolvedUriTranslator(this),
new _ScriptLoader(this),
new _ElementScanner(scanner),
@@ -431,7 +371,8 @@
/// Creates the scanner task.
///
/// Override this to mock the scanner for testing.
- ScannerTask createScannerTask() => new ScannerTask(this);
+ ScannerTask createScannerTask() => new ScannerTask(this, dietParser,
+ preserveComments: options.preserveComments, commentMap: commentMap);
/// Creates the resolver task.
///
@@ -450,7 +391,9 @@
bool get disableTypeInference =>
options.disableTypeInference || compilationFailed;
- int getNextFreeClassId() => nextFreeClassId++;
+ // TODO(het): remove this and pass idGenerator directly instead
+ @deprecated
+ int getNextFreeId() => idGenerator.getNextFreeId();
void unimplemented(Spannable spannable, String methodName) {
reporter.internalError(spannable, "$methodName not implemented.");
@@ -548,20 +491,18 @@
new UriLocation(importChainReversed.head);
compactImportChain = compactImportChain.prepend(currentCodeLocation);
for (Link<Uri> link = importChainReversed.tail;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
Uri uri = link.head;
if (!currentCodeLocation.inSameLocation(uri)) {
currentCodeLocation =
options.verbose ? new UriLocation(uri) : new CodeLocation(uri);
- compactImportChain =
- compactImportChain.prepend(currentCodeLocation);
+ compactImportChain = compactImportChain.prepend(currentCodeLocation);
}
}
- String importChain =
- compactImportChain.map((CodeLocation codeLocation) {
- return codeLocation.relativize(rootUri);
- }).join(' => ');
+ String importChain = compactImportChain.map((CodeLocation codeLocation) {
+ return codeLocation.relativize(rootUri);
+ }).join(' => ');
if (!importChains.contains(importChain)) {
if (importChains.length > compactChainLimit) {
@@ -604,11 +545,12 @@
if (loadedLibraries.containsLibrary(uri)) {
Set<String> importChains =
computeImportChainsFor(loadedLibraries, uri);
- reporter.reportInfo(NO_LOCATION_SPANNABLE,
- MessageKind.DISALLOWED_LIBRARY_IMPORT,
- {'uri': uri,
- 'importChain': importChains.join(
- MessageTemplate.DISALLOWED_LIBRARY_IMPORT_PADDING)});
+ reporter.reportInfo(
+ NO_LOCATION_SPANNABLE, MessageKind.DISALLOWED_LIBRARY_IMPORT, {
+ 'uri': uri,
+ 'importChain': importChains
+ .join(MessageTemplate.DISALLOWED_LIBRARY_IMPORT_PADDING)
+ });
}
}
@@ -621,19 +563,19 @@
if (importsMirrorsLibrary && !backend.supportsReflection) {
Set<String> importChains =
computeImportChainsFor(loadedLibraries, Uris.dart_mirrors);
- reporter.reportErrorMessage(
- NO_LOCATION_SPANNABLE,
- MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND,
- {'importChain': importChains.join(
- MessageTemplate.MIRRORS_NOT_SUPPORTED_BY_BACKEND_PADDING)});
+ reporter.reportErrorMessage(NO_LOCATION_SPANNABLE,
+ MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND, {
+ 'importChain': importChains
+ .join(MessageTemplate.MIRRORS_NOT_SUPPORTED_BY_BACKEND_PADDING)
+ });
} else if (importsMirrorsLibrary && !options.enableExperimentalMirrors) {
Set<String> importChains =
computeImportChainsFor(loadedLibraries, Uris.dart_mirrors);
reporter.reportWarningMessage(
- NO_LOCATION_SPANNABLE,
- MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
- {'importChain': importChains.join(
- MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING)});
+ NO_LOCATION_SPANNABLE, MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, {
+ 'importChain': importChains
+ .join(MessageTemplate.IMPORT_EXPERIMENTAL_MIRRORS_PADDING)
+ });
}
coreClasses.functionClass.ensureResolved(resolution);
@@ -641,7 +583,8 @@
coreClasses.functionClass.lookupLocalMember('apply');
if (options.preserveComments) {
- return libraryLoader.loadLibrary(Uris.dart_mirrors)
+ return libraryLoader
+ .loadLibrary(Uris.dart_mirrors)
.then((LibraryElement libraryElement) {
documentClass = libraryElement.find('Comment');
});
@@ -654,9 +597,8 @@
if (field == null) return false;
if (!resolution.hasBeenResolved(field)) return false;
if (proxyConstant == null) {
- proxyConstant =
- constants.getConstantValue(
- resolver.constantCompiler.compileConstant(field));
+ proxyConstant = constants
+ .getConstantValue(resolver.constantCompiler.compileConstant(field));
}
return proxyConstant == value;
}
@@ -664,7 +606,8 @@
Element findRequiredElement(LibraryElement library, String name) {
var element = library.find(name);
if (element == null) {
- reporter.internalError(library,
+ reporter.internalError(
+ library,
"The library '${library.canonicalUri}' does not contain required "
"element: '$name'.");
}
@@ -681,8 +624,8 @@
} else if (coreClasses.symbolClass == cls) {
symbolConstructor = cls.constructors.head;
} else if (symbolImplementationClass == cls) {
- symbolValidatedConstructor = cls.lookupConstructor(
- symbolValidatedConstructorSelector.name);
+ symbolValidatedConstructor =
+ cls.lookupConstructor(symbolValidatedConstructorSelector.name);
} else if (mirrorsUsedClass == cls) {
mirrorsUsedConstructor = cls.constructors.head;
} else if (coreClasses.intClass == cls) {
@@ -757,8 +700,8 @@
// The selector objects held in static fields must remain canonical.
for (Selector selector in Selectors.ALL) {
Selector.canonicalizedValues
- .putIfAbsent(selector.hashCode, () => <Selector>[])
- .add(selector);
+ .putIfAbsent(selector.hashCode, () => <Selector>[])
+ .add(selector);
}
assert(uri != null || options.analyzeOnly || options.hasIncrementalSupport);
@@ -793,15 +736,13 @@
if (main == null) {
if (options.analyzeOnly) {
if (!analyzeAll) {
- errorElement = new ErroneousElementX(
- MessageKind.CONSIDER_ANALYZE_ALL, {'main': Identifiers.main},
- Identifiers.main, mainApp);
+ errorElement = new ErroneousElementX(MessageKind.CONSIDER_ANALYZE_ALL,
+ {'main': Identifiers.main}, Identifiers.main, mainApp);
}
} else {
// Compilation requires a main method.
- errorElement = new ErroneousElementX(
- MessageKind.MISSING_MAIN, {'main': Identifiers.main},
- Identifiers.main, mainApp);
+ errorElement = new ErroneousElementX(MessageKind.MISSING_MAIN,
+ {'main': Identifiers.main}, Identifiers.main, mainApp);
}
mainFunction = backend.helperForMissingMain();
} else if (main.isError && main.isSynthesized) {
@@ -812,9 +753,8 @@
}
mainFunction = backend.helperForBadMain();
} else if (!main.isFunction) {
- errorElement = new ErroneousElementX(
- MessageKind.MAIN_NOT_A_FUNCTION, {'main': Identifiers.main},
- Identifiers.main, main);
+ errorElement = new ErroneousElementX(MessageKind.MAIN_NOT_A_FUNCTION,
+ {'main': Identifiers.main}, Identifiers.main, main);
mainFunction = backend.helperForBadMain();
} else {
mainFunction = main;
@@ -825,7 +765,8 @@
parameters.orderedForEachParameter((Element parameter) {
if (index++ < 2) return;
errorElement = new ErroneousElementX(
- MessageKind.MAIN_WITH_EXTRA_PARAMETER, {'main': Identifiers.main},
+ MessageKind.MAIN_WITH_EXTRA_PARAMETER,
+ {'main': Identifiers.main},
Identifiers.main,
parameter);
mainFunction = backend.helperForMainArity();
@@ -844,8 +785,7 @@
if (errorElement != null &&
errorElement.isSynthesized &&
!mainApp.isSynthesized) {
- reporter.reportWarningMessage(
- errorElement, errorElement.messageKind,
+ reporter.reportWarningMessage(errorElement, errorElement.messageKind,
errorElement.messageArguments);
}
}
@@ -857,14 +797,13 @@
///
/// This operation assumes an unclosed resolution queue and is only supported
/// when the '--analyze-main' option is used.
- Future<LibraryElement> analyzeUri(
- Uri libraryUri,
+ Future<LibraryElement> analyzeUri(Uri libraryUri,
{bool skipLibraryWithPartOfTag: true}) {
assert(options.analyzeMain);
reporter.log('Analyzing $libraryUri (${options.buildId})');
- return libraryLoader.loadLibrary(
- libraryUri, skipFileWithPartOfTag: true).then(
- (LibraryElement library) {
+ return libraryLoader
+ .loadLibrary(libraryUri, skipFileWithPartOfTag: true)
+ .then((LibraryElement library) {
if (library == null) return null;
fullyEnqueueLibrary(library, enqueuer.resolution);
emptyQueue(enqueuer.resolution);
@@ -892,7 +831,7 @@
phase = PHASE_RESOLVING;
if (analyzeAll) {
libraryLoader.libraries.forEach((LibraryElement library) {
- reporter.log('Enqueuing ${library.canonicalUri}');
+ reporter.log('Enqueuing ${library.canonicalUri}');
fullyEnqueueLibrary(library, enqueuer.resolution);
});
} else if (options.analyzeMain) {
@@ -901,8 +840,8 @@
}
if (librariesToAnalyzeWhenRun != null) {
for (Uri libraryUri in librariesToAnalyzeWhenRun) {
- fullyEnqueueLibrary(libraryLoader.lookupLibrary(libraryUri),
- enqueuer.resolution);
+ fullyEnqueueLibrary(
+ libraryLoader.lookupLibrary(libraryUri), enqueuer.resolution);
}
}
}
@@ -916,7 +855,7 @@
_reporter.reportSuppressedMessagesSummary();
- if (compilationFailed){
+ if (compilationFailed) {
if (!options.generateCodeWithCompileTimeErrors) return;
if (!backend.enableCodegenWithErrorsIfSupported(NO_LOCATION_SPANNABLE)) {
return;
@@ -991,8 +930,7 @@
ClassElement cls = element;
cls.ensureResolved(resolution);
cls.forEachLocalMember(enqueuer.resolution.addToWorkList);
- backend.registerInstantiatedType(
- cls.rawType, world, globalDependencies);
+ backend.registerInstantiatedType(cls.rawType, world, globalDependencies);
} else {
world.addToWorkList(element);
}
@@ -1016,7 +954,7 @@
*/
void emptyQueue(Enqueuer world) {
world.forEach((WorkItem work) {
- reporter.withCurrentElement(work.element, () {
+ reporter.withCurrentElement(work.element, () {
world.applyImpact(work.element, work.run(this, world));
});
});
@@ -1086,29 +1024,28 @@
}
reporter.log('Excess resolution work: ${resolved.length}.');
for (Element e in resolved) {
- reporter.reportWarningMessage(e,
- MessageKind.GENERIC,
+ reporter.reportWarningMessage(e, MessageKind.GENERIC,
{'text': 'Warning: $e resolved but not compiled.'});
}
}
WorldImpact analyzeElement(Element element) {
- assert(invariant(element,
- element.impliesType ||
- element.isField ||
- element.isFunction ||
- element.isConstructor ||
- element.isGetter ||
- element.isSetter,
- message: 'Unexpected element kind: ${element.kind}'));
+ assert(invariant(
+ element,
+ element.impliesType ||
+ element.isField ||
+ element.isFunction ||
+ element.isConstructor ||
+ element.isGetter ||
+ element.isSetter,
+ message: 'Unexpected element kind: ${element.kind}'));
assert(invariant(element, element is AnalyzableElement,
message: 'Element $element is not analyzable.'));
assert(invariant(element, element.isDeclaration));
return resolution.computeWorldImpact(element);
}
- WorldImpact analyze(ResolutionWorkItem work,
- ResolutionEnqueuer world) {
+ WorldImpact analyze(ResolutionWorkItem work, ResolutionEnqueuer world) {
assert(invariant(work.element, identical(world, enqueuer.resolution)));
assert(invariant(work.element, !work.isAnalyzed,
message: 'Element ${work.element} has already been analyzed'));
@@ -1116,8 +1053,7 @@
// TODO(ahe): Add structured diagnostics to the compiler API and
// use it to separate this from the --verbose option.
if (phase == PHASE_RESOLVING) {
- reporter.log(
- 'Resolved ${enqueuer.resolution.processedElements.length} '
+ reporter.log('Resolved ${enqueuer.resolution.processedElements.length} '
'elements.');
progress.reset();
}
@@ -1137,16 +1073,15 @@
if (shouldPrintProgress) {
// TODO(ahe): Add structured diagnostics to the compiler API and
// use it to separate this from the --verbose option.
- reporter.log(
- 'Compiled ${enqueuer.codegen.generatedCode.length} methods.');
+ reporter
+ .log('Compiled ${enqueuer.codegen.generatedCode.length} methods.');
progress.reset();
}
return backend.codegen(work);
}
void reportDiagnostic(DiagnosticMessage message,
- List<DiagnosticMessage> infos,
- api.Diagnostic kind);
+ List<DiagnosticMessage> infos, api.Diagnostic kind);
void reportCrashInUserCode(String message, exception, stackTrace) {
_reporter.onCrashInUserCode(message, exception, stackTrace);
@@ -1155,8 +1090,8 @@
/// Messages for which compile-time errors are reported but compilation
/// continues regardless.
static const List<MessageKind> BENIGN_ERRORS = const <MessageKind>[
- MessageKind.INVALID_METADATA,
- MessageKind.INVALID_METADATA_GENERIC,
+ MessageKind.INVALID_METADATA,
+ MessageKind.INVALID_METADATA_GENERIC,
];
bool markCompilationAsFailed(DiagnosticMessage message, api.Diagnostic kind) {
@@ -1171,8 +1106,7 @@
}
void fatalDiagnosticReported(DiagnosticMessage message,
- List<DiagnosticMessage> infos,
- api.Diagnostic kind) {
+ List<DiagnosticMessage> infos, api.Diagnostic kind) {
if (markCompilationAsFailed(message, kind)) {
compilationFailed = true;
}
@@ -1192,8 +1126,8 @@
*
* See [LibraryLoader] for terminology on URIs.
*/
- Uri translateResolvedUri(LibraryElement importingLibrary,
- Uri resolvedUri, Spannable spannable) {
+ Uri translateResolvedUri(
+ LibraryElement importingLibrary, Uri resolvedUri, Spannable spannable) {
unimplemented(importingLibrary, 'Compiler.translateResolvedUri');
return null;
}
@@ -1218,28 +1152,6 @@
bool get isMockCompilation => false;
- Token processAndStripComments(Token currentToken) {
- Token firstToken = currentToken;
- Token prevToken;
- while (currentToken.kind != Tokens.EOF_TOKEN) {
- if (identical(currentToken.kind, Tokens.COMMENT_TOKEN)) {
- Token firstCommentToken = currentToken;
- while (identical(currentToken.kind, Tokens.COMMENT_TOKEN)) {
- currentToken = currentToken.next;
- }
- commentMap[currentToken] = firstCommentToken;
- if (prevToken == null) {
- firstToken = currentToken;
- } else {
- prevToken.next = currentToken;
- }
- }
- prevToken = currentToken;
- currentToken = currentToken.next;
- }
- return firstToken;
- }
-
void reportUnusedCode() {
void checkLive(member) {
if (member.isMalformed) return;
@@ -1314,8 +1226,8 @@
userCodeLocations.add(new CodeLocation(mainApp.canonicalUri));
}
if (librariesToAnalyzeWhenRun != null) {
- userCodeLocations.addAll(librariesToAnalyzeWhenRun.map(
- (Uri uri) => new CodeLocation(uri)));
+ userCodeLocations.addAll(
+ librariesToAnalyzeWhenRun.map((Uri uri) => new CodeLocation(uri)));
}
if (userCodeLocations.isEmpty && assumeInUserCode) {
// Assume in user code since [mainApp] has not been set yet.
@@ -1446,8 +1358,7 @@
}
@override
- InterfaceType mapType([DartType keyType,
- DartType valueType]) {
+ InterfaceType mapType([DartType keyType, DartType valueType]) {
mapClass.ensureResolved(resolution);
InterfaceType type = mapClass.rawType;
if (keyType == null && valueType == null) {
@@ -1546,9 +1457,7 @@
Element get currentElement => _currentElement;
- DiagnosticMessage createMessage(
- Spannable spannable,
- MessageKind messageKind,
+ DiagnosticMessage createMessage(Spannable spannable, MessageKind messageKind,
[Map arguments = const {}]) {
SourceSpan span = spanFromSpannable(spannable);
MessageTemplate template = MessageTemplate.TEMPLATES[messageKind];
@@ -1556,64 +1465,58 @@
return new DiagnosticMessage(span, spannable, message);
}
- void reportError(
- DiagnosticMessage message,
+ void reportError(DiagnosticMessage message,
[List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
reportDiagnosticInternal(message, infos, api.Diagnostic.ERROR);
}
- void reportWarning(
- DiagnosticMessage message,
+ void reportWarning(DiagnosticMessage message,
[List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
reportDiagnosticInternal(message, infos, api.Diagnostic.WARNING);
}
- void reportHint(
- DiagnosticMessage message,
+ void reportHint(DiagnosticMessage message,
[List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
reportDiagnosticInternal(message, infos, api.Diagnostic.HINT);
}
@deprecated
void reportInfo(Spannable node, MessageKind messageKind,
- [Map arguments = const {}]) {
- reportDiagnosticInternal(
- createMessage(node, messageKind, arguments),
- const <DiagnosticMessage>[],
- api.Diagnostic.INFO);
+ [Map arguments = const {}]) {
+ reportDiagnosticInternal(createMessage(node, messageKind, arguments),
+ const <DiagnosticMessage>[], api.Diagnostic.INFO);
}
void reportDiagnosticInternal(DiagnosticMessage message,
- List<DiagnosticMessage> infos,
- api.Diagnostic kind) {
+ List<DiagnosticMessage> infos, api.Diagnostic kind) {
if (!options.showAllPackageWarnings &&
message.spannable != NO_LOCATION_SPANNABLE) {
switch (kind) {
- case api.Diagnostic.WARNING:
- case api.Diagnostic.HINT:
- Element element = elementFromSpannable(message.spannable);
- if (!compiler.inUserCode(element, assumeInUserCode: true)) {
- Uri uri = compiler.getCanonicalUri(element);
- if (options.showPackageWarningsFor(uri)) {
- reportDiagnostic(message, infos, kind);
+ case api.Diagnostic.WARNING:
+ case api.Diagnostic.HINT:
+ Element element = elementFromSpannable(message.spannable);
+ if (!compiler.inUserCode(element, assumeInUserCode: true)) {
+ Uri uri = compiler.getCanonicalUri(element);
+ if (options.showPackageWarningsFor(uri)) {
+ reportDiagnostic(message, infos, kind);
+ return;
+ }
+ SuppressionInfo info = suppressedWarnings.putIfAbsent(
+ uri, () => new SuppressionInfo());
+ if (kind == api.Diagnostic.WARNING) {
+ info.warnings++;
+ } else {
+ info.hints++;
+ }
+ lastDiagnosticWasFiltered = true;
return;
}
- SuppressionInfo info =
- suppressedWarnings.putIfAbsent(uri, () => new SuppressionInfo());
- if (kind == api.Diagnostic.WARNING) {
- info.warnings++;
- } else {
- info.hints++;
+ break;
+ case api.Diagnostic.INFO:
+ if (lastDiagnosticWasFiltered) {
+ return;
}
- lastDiagnosticWasFiltered = true;
- return;
- }
- break;
- case api.Diagnostic.INFO:
- if (lastDiagnosticWasFiltered) {
- return;
- }
- break;
+ break;
}
}
lastDiagnosticWasFiltered = false;
@@ -1621,13 +1524,11 @@
}
void reportDiagnostic(DiagnosticMessage message,
- List<DiagnosticMessage> infos,
- api.Diagnostic kind) {
+ List<DiagnosticMessage> infos, api.Diagnostic kind) {
compiler.reportDiagnostic(message, infos, kind);
if (kind == api.Diagnostic.ERROR ||
kind == api.Diagnostic.CRASH ||
- (options.fatalWarnings &&
- kind == api.Diagnostic.WARNING)) {
+ (options.fatalWarnings && kind == api.Diagnostic.WARNING)) {
compiler.fatalDiagnosticReported(message, infos, kind);
}
}
@@ -1667,8 +1568,8 @@
}
void reportAssertionFailure(SpannableAssertionFailure ex) {
- String message = (ex.message != null) ? tryToString(ex.message)
- : tryToString(ex);
+ String message =
+ (ex.message != null) ? tryToString(ex.message) : tryToString(ex);
reportDiagnosticInternal(
createMessage(ex.node, MessageKind.GENERIC, {'text': message}),
const <DiagnosticMessage>[],
@@ -1685,7 +1586,6 @@
if (uri == null && currentElement != null) {
uri = currentElement.compilationUnit.script.resourceUri;
assert(invariant(currentElement, () {
-
bool sameToken(Token token, Token sought) {
if (token == sought) return true;
if (token.stringValue == '>>') {
@@ -1842,7 +1742,8 @@
Element _elementFromHInstruction(HInstruction instruction) {
return instruction.sourceElement is Element
- ? instruction.sourceElement : null;
+ ? instruction.sourceElement
+ : null;
}
internalError(Spannable node, reason) {
@@ -1857,17 +1758,14 @@
void unhandledExceptionOnElement(Element element) {
if (hasCrashed) return;
hasCrashed = true;
- reportDiagnostic(
- createMessage(element, MessageKind.COMPILER_CRASHED),
- const <DiagnosticMessage>[],
- api.Diagnostic.CRASH);
+ reportDiagnostic(createMessage(element, MessageKind.COMPILER_CRASHED),
+ const <DiagnosticMessage>[], api.Diagnostic.CRASH);
pleaseReportCrash();
}
void pleaseReportCrash() {
- print(
- MessageTemplate.TEMPLATES[MessageKind.PLEASE_REPORT_THE_CRASH]
- .message({'buildId': compiler.options.buildId}));
+ print(MessageTemplate.TEMPLATES[MessageKind.PLEASE_REPORT_THE_CRASH]
+ .message({'buildId': compiler.options.buildId}));
}
/// Finds the approximate [Element] for [node]. [currentElement] is used as
@@ -1887,10 +1785,8 @@
void log(message) {
Message msg = MessageTemplate.TEMPLATES[MessageKind.GENERIC]
.message({'text': '$message'});
- reportDiagnostic(
- new DiagnosticMessage(null, null, msg),
- const <DiagnosticMessage>[],
- api.Diagnostic.VERBOSE_INFO);
+ reportDiagnostic(new DiagnosticMessage(null, null, msg),
+ const <DiagnosticMessage>[], api.Diagnostic.VERBOSE_INFO);
}
String tryToString(object) {
@@ -1910,8 +1806,7 @@
} else {
reportDiagnostic(
createMessage(
- new SourceSpan(uri, 0, 0),
- MessageKind.COMPILER_CRASHED),
+ new SourceSpan(uri, 0, 0), MessageKind.COMPILER_CRASHED),
const <DiagnosticMessage>[],
api.Diagnostic.CRASH);
}
@@ -1940,14 +1835,10 @@
}
MessageTemplate template = MessageTemplate.TEMPLATES[kind];
Message message = template.message(
- {'warnings': info.warnings,
- 'hints': info.hints,
- 'uri': uri},
- options.terseDiagnostics);
- reportDiagnostic(
- new DiagnosticMessage(null, null, message),
- const <DiagnosticMessage>[],
- api.Diagnostic.HINT);
+ {'warnings': info.warnings, 'hints': info.hints, 'uri': uri},
+ options.terseDiagnostics);
+ reportDiagnostic(new DiagnosticMessage(null, null, message),
+ const <DiagnosticMessage>[], api.Diagnostic.HINT);
});
}
}
@@ -2003,6 +1894,25 @@
}
@override
+ bool hasResolvedAst(Element element) {
+ return element is AstElement &&
+ hasBeenResolved(element) &&
+ element.hasResolvedAst;
+ }
+
+ @override
+ ResolvedAst getResolvedAst(Element element) {
+ if (hasResolvedAst(element)) {
+ AstElement astElement = element;
+ return astElement.resolvedAst;
+ }
+ assert(invariant(element, hasResolvedAst(element),
+ message: "ResolvedAst not available for $element."));
+ return null;
+ }
+
+
+ @override
bool hasResolutionImpact(Element element) {
return _resolutionImpactCache.containsKey(element);
}
@@ -2029,9 +1939,9 @@
assert(compiler.parser != null);
Node tree = compiler.parser.parse(element);
assert(invariant(element, !element.isSynthesized || tree == null));
- ResolutionImpact resolutionImpact =
- compiler.resolver.resolve(element);
- if (compiler.serialization.supportSerialization || retainCachesForTesting) {
+ ResolutionImpact resolutionImpact = compiler.resolver.resolve(element);
+ if (compiler.serialization.supportSerialization ||
+ retainCachesForTesting) {
// [ResolutionImpact] is currently only used by serialization. The
// enqueuer uses the [WorldImpact] which is always cached.
// TODO(johnniwinther): Align these use cases better; maybe only
@@ -2045,9 +1955,8 @@
// Only analyze nodes with a corresponding [TreeElements].
compiler.checker.check(element);
}
- WorldImpact worldImpact =
- compiler.backend.impactTransformer.transformResolutionImpact(
- resolutionImpact);
+ WorldImpact worldImpact = compiler.backend.impactTransformer
+ .transformResolutionImpact(resolutionImpact);
return worldImpact;
});
}
@@ -2080,8 +1989,8 @@
ResolutionWorkItem createWorkItem(
Element element, ItemCompilationContext compilationContext) {
if (compiler.serialization.isDeserialized(element)) {
- return compiler.serialization.createResolutionWorkItem(
- element, compilationContext);
+ return compiler.serialization
+ .createResolutionWorkItem(element, compilationContext);
} else {
return new ResolutionWorkItem(element, compilationContext);
}
@@ -2147,8 +2056,8 @@
_ResolvedUriTranslator(this.compiler);
Uri translate(LibraryElement importingLibrary, Uri resolvedUri,
- [Spannable spannable]) =>
- compiler.translateResolvedUri(importingLibrary, resolvedUri, spannable);
+ [Spannable spannable]) =>
+ compiler.translateResolvedUri(importingLibrary, resolvedUri, spannable);
}
class _ScriptLoader implements ScriptLoader {
diff --git a/pkg/compiler/lib/src/constant_system_dart.dart b/pkg/compiler/lib/src/constant_system_dart.dart
index c2c819e..60e8899 100644
--- a/pkg/compiler/lib/src/constant_system_dart.dart
+++ b/pkg/compiler/lib/src/constant_system_dart.dart
@@ -4,13 +4,11 @@
library dart2js.constant_system.dart;
-import 'compiler.dart' show
- Compiler;
+import 'compiler.dart' show Compiler;
import 'constants/constant_system.dart';
import 'constants/values.dart';
import 'dart_types.dart';
-import 'tree/tree.dart' show
- DartString;
+import 'tree/tree.dart' show DartString;
const DART_CONSTANT_SYSTEM = const DartConstantSystem();
@@ -77,7 +75,7 @@
class BitOrOperation extends BinaryBitOperation {
final String name = '|';
const BitOrOperation();
- int foldInts(int left, int right) => left | right;
+ int foldInts(int left, int right) => left | right;
apply(left, right) => left | right;
}
@@ -104,6 +102,7 @@
if (right > 100 || right < 0) return null;
return left << right;
}
+
apply(left, right) => left << right;
}
@@ -114,6 +113,7 @@
if (right < 0) return null;
return left >> right;
}
+
apply(left, right) => left >> right;
}
@@ -161,8 +161,7 @@
}
// A division by 0 means that we might not have a folded value.
if (foldedValue == null) return null;
- if (left.isInt && right.isInt && !isDivide() ||
- isTruncatingDivide()) {
+ if (left.isInt && right.isInt && !isDivide() || isTruncatingDivide()) {
assert(foldedValue is int);
return DART_CONSTANT_SYSTEM.createInt(foldedValue);
} else {
@@ -199,6 +198,7 @@
if (right == 0) return null;
return left % right;
}
+
num foldNums(num left, num right) => left % right;
apply(left, right) => left % right;
}
@@ -210,11 +210,13 @@
if (right == 0) return null;
return left ~/ right;
}
+
num foldNums(num left, num right) {
num ratio = left / right;
if (ratio.isNaN || ratio.isInfinite) return null;
return ratio.truncate().toInt();
}
+
apply(left, right) => left ~/ right;
bool isTruncatingDivide() => true;
}
@@ -244,13 +246,14 @@
} else if (left.isString && right.isString) {
StringConstantValue leftString = left;
StringConstantValue rightString = right;
- DartString result = new DartString.concat(leftString.primitiveValue,
- rightString.primitiveValue);
+ DartString result = new DartString.concat(
+ leftString.primitiveValue, rightString.primitiveValue);
return DART_CONSTANT_SYSTEM.createString(result);
} else {
return null;
}
}
+
apply(left, right) => left + right;
}
@@ -316,6 +319,7 @@
}
return DART_CONSTANT_SYSTEM.createBool(left == right);
}
+
apply(left, right) => left == right;
}
@@ -329,6 +333,7 @@
if (left.isNaN && right.isNaN) return null;
return DART_CONSTANT_SYSTEM.createBool(left == right);
}
+
apply(left, right) => identical(left, right);
}
@@ -339,6 +344,7 @@
if (left.isNull) return right;
return left;
}
+
apply(left, right) => left ?? right;
}
@@ -407,7 +413,6 @@
const DartConstantSystem();
-
@override
IntConstantValue createInt(int i) => new IntConstantValue(i);
@@ -426,16 +431,13 @@
NullConstantValue createNull() => new NullConstantValue();
@override
- ListConstantValue createList(InterfaceType type,
- List<ConstantValue> values) {
+ ListConstantValue createList(InterfaceType type, List<ConstantValue> values) {
return new ListConstantValue(type, values);
}
@override
- MapConstantValue createMap(Compiler compiler,
- InterfaceType type,
- List<ConstantValue> keys,
- List<ConstantValue> values) {
+ MapConstantValue createMap(Compiler compiler, InterfaceType type,
+ List<ConstantValue> keys, List<ConstantValue> values) {
return new MapConstantValue(type, keys, values);
}
diff --git a/pkg/compiler/lib/src/constants/constant_constructors.dart b/pkg/compiler/lib/src/constants/constant_constructors.dart
index 4cc77b3..c389eef 100644
--- a/pkg/compiler/lib/src/constants/constant_constructors.dart
+++ b/pkg/compiler/lib/src/constants/constant_constructors.dart
@@ -11,14 +11,11 @@
import '../elements/elements.dart';
import '../resolution/operators.dart';
import '../resolution/semantic_visitor.dart';
-import '../resolution/send_resolver.dart' show
- DeclarationResolverMixin;
+import '../resolution/send_resolver.dart' show DeclarationResolverMixin;
import '../resolution/send_structure.dart';
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../tree/tree.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../universe/call_structure.dart' show CallStructure;
import 'constructors.dart';
import 'expressions.dart';
@@ -30,32 +27,32 @@
}
class ConstantConstructorComputer extends SemanticVisitor
- with SemanticDeclarationResolvedMixin,
- DeclarationResolverMixin,
- GetBulkMixin,
- SetBulkMixin,
- ErrorBulkMixin,
- InvokeBulkMixin,
- IndexSetBulkMixin,
- CompoundBulkMixin,
- SetIfNullBulkMixin,
- UnaryBulkMixin,
- BaseBulkMixin,
- BinaryBulkMixin,
- PrefixBulkMixin,
- PostfixBulkMixin,
- NewBulkMixin,
- InitializerBulkMixin,
- FunctionBulkMixin,
- VariableBulkMixin
+ with
+ SemanticDeclarationResolvedMixin,
+ DeclarationResolverMixin,
+ GetBulkMixin,
+ SetBulkMixin,
+ ErrorBulkMixin,
+ InvokeBulkMixin,
+ IndexSetBulkMixin,
+ CompoundBulkMixin,
+ SetIfNullBulkMixin,
+ UnaryBulkMixin,
+ BaseBulkMixin,
+ BinaryBulkMixin,
+ PrefixBulkMixin,
+ PostfixBulkMixin,
+ NewBulkMixin,
+ InitializerBulkMixin,
+ FunctionBulkMixin,
+ VariableBulkMixin
implements SemanticDeclarationVisitor, SemanticSendVisitor {
final Map<FieldElement, ConstantExpression> fieldMap =
<FieldElement, ConstantExpression>{};
- final Map<dynamic/*int|String*/, ConstantExpression> defaultValues =
- <dynamic/*int|String*/, ConstantExpression>{};
+ final Map<dynamic /*int|String*/, ConstantExpression> defaultValues =
+ <dynamic /*int|String*/, ConstantExpression>{};
- ConstantConstructorComputer(TreeElements elements)
- : super(elements);
+ ConstantConstructorComputer(TreeElements elements) : super(elements);
SemanticDeclarationVisitor get declVisitor => this;
@@ -73,7 +70,7 @@
@override
bulkHandleNode(Node node, String template, _) {
- internalError(node, template.replaceFirst('#' , '$node'));
+ internalError(node, template.replaceFirst('#', '$node'));
}
internalError(Node node, String message) {
@@ -81,12 +78,12 @@
}
ConstantConstructor visitGenerativeConstructorDeclaration(
- FunctionExpression node,
- ConstructorElement constructor,
- NodeList parameters,
- NodeList initializers,
- Node body,
- _) {
+ FunctionExpression node,
+ ConstructorElement constructor,
+ NodeList parameters,
+ NodeList initializers,
+ Node body,
+ _) {
applyParameters(parameters, _);
ConstructedConstantExpression constructorInvocation =
applyInitializers(node, _);
@@ -131,18 +128,12 @@
return new RedirectingFactoryConstantConstructor(
new ConstructedConstantExpression(
- redirectionType,
- redirectionTarget,
- callStructure,
- arguments));
+ redirectionType, redirectionTarget, callStructure, arguments));
}
@override
- visitFactoryConstructorDeclaration(
- FunctionExpression node,
- ConstructorElement constructor,
- NodeList parameters,
- Node body, _) {
+ visitFactoryConstructorDeclaration(FunctionExpression node,
+ ConstructorElement constructor, NodeList parameters, Node body, _) {
// TODO(johnniwinther): Handle constant constructors with errors.
internalError(node, "Factory constructor cannot be constant: $node.");
}
@@ -151,12 +142,8 @@
computeParameterStructures(parameters).forEach((s) => s.dispatch(this, _));
}
- visitParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- int index,
- _) {
+ visitParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, int index, _) {
// Do nothing.
}
@@ -171,23 +158,15 @@
defaultValues[index] = defaultValue;
}
- visitNamedParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- ConstantExpression defaultValue,
- _) {
+ visitNamedParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, ConstantExpression defaultValue, _) {
assert(invariant(node, defaultValue != null));
String name = parameter.name;
defaultValues[name] = defaultValue;
}
- visitInitializingFormalDeclaration(
- VariableDefinitions node,
- Node definition,
- InitializingFormalElement parameter,
- int index,
- _) {
+ visitInitializingFormalDeclaration(VariableDefinitions node, Node definition,
+ InitializingFormalElement parameter, int index, _) {
fieldMap[parameter.fieldElement] = new PositionalArgumentReference(index);
}
@@ -231,18 +210,11 @@
return constructorInvocation;
}
- visitFieldInitializer(
- SendSet node,
- FieldElement field,
- Node initializer,
- _) {
+ visitFieldInitializer(SendSet node, FieldElement field, Node initializer, _) {
fieldMap[field] = apply(initializer);
}
- visitParameterGet(
- Send node,
- ParameterElement parameter,
- _) {
+ visitParameterGet(Send node, ParameterElement parameter, _) {
if (parameter.isNamed) {
return new NamedArgumentReference(parameter.name);
} else {
@@ -261,10 +233,7 @@
List<ConstantExpression> argumentExpression =
arguments.nodes.map((a) => apply(a)).toList();
return new ConstructedConstantExpression(
- type,
- superConstructor,
- callStructure,
- argumentExpression);
+ type, superConstructor, callStructure, argumentExpression);
}
ConstructedConstantExpression visitImplicitSuperConstructorInvoke(
@@ -272,11 +241,8 @@
ConstructorElement superConstructor,
InterfaceType type,
_) {
- return new ConstructedConstantExpression(
- type,
- superConstructor,
- CallStructure.NO_ARGS,
- const <ConstantExpression>[]);
+ return new ConstructedConstantExpression(type, superConstructor,
+ CallStructure.NO_ARGS, const <ConstantExpression>[]);
}
ConstructedConstantExpression visitThisConstructorInvoke(
@@ -287,48 +253,29 @@
_) {
List<ConstantExpression> argumentExpression =
arguments.nodes.map((a) => apply(a)).toList();
- return new ConstructedConstantExpression(
- currentClass.thisType,
- thisConstructor,
- callStructure,
- argumentExpression);
+ return new ConstructedConstantExpression(currentClass.thisType,
+ thisConstructor, callStructure, argumentExpression);
}
@override
ConstantExpression visitBinary(
- Send node,
- Node left,
- BinaryOperator operator,
- Node right,
- _) {
- return new BinaryConstantExpression(
- apply(left), operator, apply(right));
+ Send node, Node left, BinaryOperator operator, Node right, _) {
+ return new BinaryConstantExpression(apply(left), operator, apply(right));
}
-
@override
ConstantExpression visitUnary(
- Send node,
- UnaryOperator operator,
- Node expression,
- _) {
- return new UnaryConstantExpression(
- operator, apply(expression));
+ Send node, UnaryOperator operator, Node expression, _) {
+ return new UnaryConstantExpression(operator, apply(expression));
}
@override
- ConstantExpression visitStaticFieldGet(
- Send node,
- FieldElement field,
- _) {
+ ConstantExpression visitStaticFieldGet(Send node, FieldElement field, _) {
return new VariableConstantExpression(field);
}
@override
- ConstantExpression visitTopLevelFieldGet(
- Send node,
- FieldElement field,
- _) {
+ ConstantExpression visitTopLevelFieldGet(Send node, FieldElement field, _) {
return new VariableConstantExpression(field);
}
@@ -354,14 +301,13 @@
@override
ConstantExpression visitConditional(Conditional node) {
- return new ConditionalConstantExpression(
- apply(node.condition),
- apply(node.thenExpression),
- apply(node.elseExpression));
+ return new ConditionalConstantExpression(apply(node.condition),
+ apply(node.thenExpression), apply(node.elseExpression));
}
@override
- ConstantExpression visitParenthesizedExpression(ParenthesizedExpression node) {
+ ConstantExpression visitParenthesizedExpression(
+ ParenthesizedExpression node) {
return apply(node.expression);
}
@@ -383,4 +329,4 @@
ConstantExpression visitNamedArgument(NamedArgument node) {
return apply(node.expression);
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/constants/constant_system.dart b/pkg/compiler/lib/src/constants/constant_system.dart
index 06c9fad..aae267f 100644
--- a/pkg/compiler/lib/src/constants/constant_system.dart
+++ b/pkg/compiler/lib/src/constants/constant_system.dart
@@ -5,11 +5,9 @@
library dart2js.constant_system;
import '../dart_types.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../resolution/operators.dart';
-import '../tree/tree.dart' show
- DartString;
+import '../tree/tree.dart' show DartString;
import 'values.dart';
abstract class Operation {
@@ -64,16 +62,12 @@
ConstantValue createString(DartString string);
ConstantValue createBool(bool value);
ConstantValue createNull();
- ConstantValue createList(InterfaceType type,
- List<ConstantValue> values);
+ ConstantValue createList(InterfaceType type, List<ConstantValue> values);
// TODO(johnniwinther): Remove the need for [compiler].
- ConstantValue createMap(Compiler compiler,
- InterfaceType type,
- List<ConstantValue> keys,
- List<ConstantValue> values);
+ ConstantValue createMap(Compiler compiler, InterfaceType type,
+ List<ConstantValue> keys, List<ConstantValue> values);
// TODO(johnniwinther): Remove the need for [compiler].
- ConstantValue createType(Compiler compiler,
- DartType type);
+ ConstantValue createType(Compiler compiler, DartType type);
// We need to special case the subtype check for JavaScript constant
// system because an int is a double at runtime.
@@ -92,35 +86,59 @@
UnaryOperation lookupUnary(UnaryOperator operator) {
switch (operator.kind) {
- case UnaryOperatorKind.COMPLEMENT: return bitNot;
- case UnaryOperatorKind.NEGATE: return negate;
- case UnaryOperatorKind.NOT: return not;
- default: return null;
+ case UnaryOperatorKind.COMPLEMENT:
+ return bitNot;
+ case UnaryOperatorKind.NEGATE:
+ return negate;
+ case UnaryOperatorKind.NOT:
+ return not;
+ default:
+ return null;
}
}
BinaryOperation lookupBinary(BinaryOperator operator) {
switch (operator.kind) {
- case BinaryOperatorKind.ADD: return add;
- case BinaryOperatorKind.SUB: return subtract;
- case BinaryOperatorKind.MUL: return multiply;
- case BinaryOperatorKind.DIV: return divide;
- case BinaryOperatorKind.MOD: return modulo;
- case BinaryOperatorKind.IDIV: return truncatingDivide;
- case BinaryOperatorKind.OR: return bitOr;
- case BinaryOperatorKind.AND: return bitAnd;
- case BinaryOperatorKind.XOR: return bitXor;
- case BinaryOperatorKind.LOGICAL_OR: return booleanOr;
- case BinaryOperatorKind.LOGICAL_AND: return booleanAnd;
- case BinaryOperatorKind.SHL: return shiftLeft;
- case BinaryOperatorKind.SHR: return shiftRight;
- case BinaryOperatorKind.LT: return less;
- case BinaryOperatorKind.LTEQ: return lessEqual;
- case BinaryOperatorKind.GT: return greater;
- case BinaryOperatorKind.GTEQ: return greaterEqual;
- case BinaryOperatorKind.EQ: return equal;
- case BinaryOperatorKind.IF_NULL: return ifNull;
- default: return null;
+ case BinaryOperatorKind.ADD:
+ return add;
+ case BinaryOperatorKind.SUB:
+ return subtract;
+ case BinaryOperatorKind.MUL:
+ return multiply;
+ case BinaryOperatorKind.DIV:
+ return divide;
+ case BinaryOperatorKind.MOD:
+ return modulo;
+ case BinaryOperatorKind.IDIV:
+ return truncatingDivide;
+ case BinaryOperatorKind.OR:
+ return bitOr;
+ case BinaryOperatorKind.AND:
+ return bitAnd;
+ case BinaryOperatorKind.XOR:
+ return bitXor;
+ case BinaryOperatorKind.LOGICAL_OR:
+ return booleanOr;
+ case BinaryOperatorKind.LOGICAL_AND:
+ return booleanAnd;
+ case BinaryOperatorKind.SHL:
+ return shiftLeft;
+ case BinaryOperatorKind.SHR:
+ return shiftRight;
+ case BinaryOperatorKind.LT:
+ return less;
+ case BinaryOperatorKind.LTEQ:
+ return lessEqual;
+ case BinaryOperatorKind.GT:
+ return greater;
+ case BinaryOperatorKind.GTEQ:
+ return greaterEqual;
+ case BinaryOperatorKind.EQ:
+ return equal;
+ case BinaryOperatorKind.IF_NULL:
+ return ifNull;
+ default:
+ return null;
}
}
}
diff --git a/pkg/compiler/lib/src/constants/constructors.dart b/pkg/compiler/lib/src/constants/constructors.dart
index 7faf593..c2b53fc 100644
--- a/pkg/compiler/lib/src/constants/constructors.dart
+++ b/pkg/compiler/lib/src/constants/constructors.dart
@@ -5,11 +5,8 @@
library dart2js.constants.constructors;
import '../dart_types.dart';
-import '../elements/elements.dart' show
- ConstructorElement,
- FieldElement;
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../elements/elements.dart' show ConstructorElement, FieldElement;
+import '../universe/call_structure.dart' show CallStructure;
import '../util/util.dart';
import 'evaluation.dart';
import 'expressions.dart';
@@ -31,8 +28,7 @@
/// Computes the constant expressions of the fields of the created instance
/// in a const constructor invocation with [arguments].
Map<FieldElement, ConstantExpression> computeInstanceFields(
- List<ConstantExpression> arguments,
- CallStructure callStructure);
+ List<ConstantExpression> arguments, CallStructure callStructure);
accept(ConstantConstructorVisitor visitor, arg);
}
@@ -52,16 +48,13 @@
}
/// A generative constant constructor.
-class GenerativeConstantConstructor implements ConstantConstructor{
+class GenerativeConstantConstructor implements ConstantConstructor {
final InterfaceType type;
- final Map<dynamic/*int|String*/, ConstantExpression> defaultValues;
+ final Map<dynamic /*int|String*/, ConstantExpression> defaultValues;
final Map<FieldElement, ConstantExpression> fieldMap;
final ConstructedConstantExpression superConstructorInvocation;
- GenerativeConstantConstructor(
- this.type,
- this.defaultValues,
- this.fieldMap,
+ GenerativeConstantConstructor(this.type, this.defaultValues, this.fieldMap,
this.superConstructorInvocation);
ConstantConstructorKind get kind => ConstantConstructorKind.GENERATIVE;
@@ -71,14 +64,13 @@
}
Map<FieldElement, ConstantExpression> computeInstanceFields(
- List<ConstantExpression> arguments,
- CallStructure callStructure) {
- NormalizedArguments args = new NormalizedArguments(
- defaultValues, callStructure, arguments);
+ List<ConstantExpression> arguments, CallStructure callStructure) {
+ NormalizedArguments args =
+ new NormalizedArguments(defaultValues, callStructure, arguments);
Map<FieldElement, ConstantExpression> appliedFieldMap =
applyFields(args, superConstructorInvocation);
fieldMap.forEach((FieldElement field, ConstantExpression constant) {
- appliedFieldMap[field] = constant.apply(args);
+ appliedFieldMap[field] = constant.apply(args);
});
return appliedFieldMap;
}
@@ -97,8 +89,7 @@
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! GenerativeConstantConstructor) return false;
- return
- type == other.type &&
+ return type == other.type &&
superConstructorInvocation == other.superConstructorInvocation &&
mapEquals(defaultValues, other.defaultValues) &&
mapEquals(fieldMap, other.fieldMap);
@@ -151,25 +142,24 @@
/// A redirecting generative constant constructor.
class RedirectingGenerativeConstantConstructor implements ConstantConstructor {
- final Map<dynamic/*int|String*/, ConstantExpression> defaultValues;
+ final Map<dynamic /*int|String*/, ConstantExpression> defaultValues;
final ConstructedConstantExpression thisConstructorInvocation;
RedirectingGenerativeConstantConstructor(
- this.defaultValues,
- this.thisConstructorInvocation);
+ this.defaultValues, this.thisConstructorInvocation);
ConstantConstructorKind get kind {
return ConstantConstructorKind.REDIRECTING_GENERATIVE;
}
InterfaceType computeInstanceType(InterfaceType newType) {
- return thisConstructorInvocation.computeInstanceType()
+ return thisConstructorInvocation
+ .computeInstanceType()
.substByContext(newType);
}
Map<FieldElement, ConstantExpression> computeInstanceFields(
- List<ConstantExpression> arguments,
- CallStructure callStructure) {
+ List<ConstantExpression> arguments, CallStructure callStructure) {
NormalizedArguments args =
new NormalizedArguments(defaultValues, callStructure, arguments);
Map<FieldElement, ConstantExpression> appliedFieldMap =
@@ -190,8 +180,7 @@
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! RedirectingGenerativeConstantConstructor) return false;
- return
- thisConstructorInvocation == other.thisConstructorInvocation &&
+ return thisConstructorInvocation == other.thisConstructorInvocation &&
GenerativeConstantConstructor.mapEquals(
defaultValues, other.defaultValues);
}
@@ -219,13 +208,13 @@
}
InterfaceType computeInstanceType(InterfaceType newType) {
- return targetConstructorInvocation.computeInstanceType()
+ return targetConstructorInvocation
+ .computeInstanceType()
.substByContext(newType);
}
Map<FieldElement, ConstantExpression> computeInstanceFields(
- List<ConstantExpression> arguments,
- CallStructure callStructure) {
+ List<ConstantExpression> arguments, CallStructure callStructure) {
ConstantConstructor constantConstructor =
targetConstructorInvocation.target.constantConstructor;
return constantConstructor.computeInstanceFields(arguments, callStructure);
diff --git a/pkg/compiler/lib/src/constants/evaluation.dart b/pkg/compiler/lib/src/constants/evaluation.dart
index 176d736..88aad8a 100644
--- a/pkg/compiler/lib/src/constants/evaluation.dart
+++ b/pkg/compiler/lib/src/constants/evaluation.dart
@@ -4,10 +4,8 @@
library dart2js.constants.evaluation;
-import '../compiler.dart' show
- Compiler;
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../compiler.dart' show Compiler;
+import '../universe/call_structure.dart' show CallStructure;
import 'expressions.dart';
/// Environment used for evaluating constant expressions.
@@ -22,7 +20,7 @@
/// The normalized arguments passed to a const constructor computed from the
/// actual [arguments] and the [defaultValues] of the called construrctor.
class NormalizedArguments {
- final Map<dynamic/*int|String*/, ConstantExpression> defaultValues;
+ final Map<dynamic /*int|String*/, ConstantExpression> defaultValues;
final CallStructure callStructure;
final List<ConstantExpression> arguments;
diff --git a/pkg/compiler/lib/src/constants/expressions.dart b/pkg/compiler/lib/src/constants/expressions.dart
index 02f7b1a..809d7e0 100644
--- a/pkg/compiler/lib/src/constants/expressions.dart
+++ b/pkg/compiler/lib/src/constants/expressions.dart
@@ -8,18 +8,17 @@
import '../constants/constant_system.dart';
import '../core_types.dart';
import '../dart_types.dart';
-import '../elements/elements.dart' show
- ConstructorElement,
- Element,
- FieldElement,
- FunctionElement,
- PrefixElement,
- VariableElement;
+import '../elements/elements.dart'
+ show
+ ConstructorElement,
+ Element,
+ FieldElement,
+ FunctionElement,
+ PrefixElement,
+ VariableElement;
import '../resolution/operators.dart';
-import '../tree/tree.dart' show
- DartString;
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../tree/tree.dart' show DartString;
+import '../universe/call_structure.dart' show CallStructure;
import 'evaluation.dart';
import 'values.dart';
@@ -48,7 +47,6 @@
TYPE,
UNARY,
VARIABLE,
-
POSITIONAL_REFERENCE,
NAMED_REFERENCE,
}
@@ -78,8 +76,8 @@
/// Compute the [ConstantValue] for this expression using the [environment]
/// and the [constantSystem].
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem);
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem);
/// Returns the type of this constant expression, if it is independent of the
/// environment values.
@@ -112,7 +110,7 @@
String toString() {
assertDebugMode('Use ConstantExpression.getText() instead of '
- 'ConstantExpression.toString()');
+ 'ConstantExpression.toString()');
return getText();
}
}
@@ -126,8 +124,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
// TODO(johnniwinther): Use non-constant values for errors.
return new NonConstantValue();
}
@@ -146,8 +144,8 @@
SyntheticConstantExpression(this.value);
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return value;
}
@@ -166,8 +164,6 @@
ConstantExpressionKind get kind => ConstantExpressionKind.SYNTHETIC;
}
-
-
/// A boolean, int, double, string, or null constant.
abstract class PrimitiveConstantExpression extends ConstantExpression {
/// The primitive value of this contant expression.
@@ -187,8 +183,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createBool(primitiveValue);
}
@@ -217,8 +213,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createInt(primitiveValue);
}
@@ -247,8 +243,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createDouble(primitiveValue);
}
@@ -277,8 +273,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createString(new DartString.literal(primitiveValue));
}
@@ -305,8 +301,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createNull();
}
@@ -336,8 +332,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createList(type,
values.map((v) => v.evaluate(environment, constantSystem)).toList());
}
@@ -385,9 +381,10 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
- return constantSystem.createMap(environment.compiler,
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
+ return constantSystem.createMap(
+ environment.compiler,
type,
keys.map((k) => k.evaluate(environment, constantSystem)).toList(),
values.map((v) => v.evaluate(environment, constantSystem)).toList());
@@ -432,10 +429,7 @@
final List<ConstantExpression> arguments;
ConstructedConstantExpression(
- this.type,
- this.target,
- this.callStructure,
- this.arguments) {
+ this.type, this.target, this.callStructure, this.arguments) {
assert(type.element == target.enclosingClass);
assert(!arguments.contains(null));
}
@@ -447,8 +441,8 @@
}
Map<FieldElement, ConstantExpression> computeInstanceFields() {
- return target.constantConstructor.computeInstanceFields(
- arguments, callStructure);
+ return target.constantConstructor
+ .computeInstanceFields(arguments, callStructure);
}
InterfaceType computeInstanceType() {
@@ -456,18 +450,17 @@
}
ConstructedConstantExpression apply(NormalizedArguments arguments) {
- return new ConstructedConstantExpression(
- type, target, callStructure,
+ return new ConstructedConstantExpression(type, target, callStructure,
this.arguments.map((a) => a.apply(arguments)).toList());
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
Map<FieldElement, ConstantValue> fieldValues =
<FieldElement, ConstantValue>{};
- computeInstanceFields().forEach(
- (FieldElement field, ConstantExpression constant) {
+ computeInstanceFields()
+ .forEach((FieldElement field, ConstantExpression constant) {
fieldValues[field] = constant.evaluate(environment, constantSystem);
});
return new ConstructedConstantValue(computeInstanceType(), fieldValues);
@@ -476,9 +469,7 @@
@override
int _computeHashCode() {
int hashCode =
- 13 * type.hashCode +
- 17 * target.hashCode +
- 19 * callStructure.hashCode;
+ 13 * type.hashCode + 17 * target.hashCode + 19 * callStructure.hashCode;
for (ConstantExpression value in arguments) {
hashCode ^= 23 * value.hashCode;
}
@@ -515,8 +506,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
DartString accumulator;
for (ConstantExpression expression in expressions) {
ConstantValue value = expression.evaluate(environment, constantSystem);
@@ -585,8 +576,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
// TODO(johnniwinther): Implement this.
throw new UnsupportedError('SymbolConstantExpression.evaluate');
}
@@ -611,8 +602,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.createType(environment.compiler, type);
}
@@ -641,8 +632,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return element.constant.evaluate(environment, constantSystem);
}
@@ -668,8 +659,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return new FunctionConstantValue(element);
}
@@ -702,8 +693,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.lookupBinary(operator).fold(
left.evaluate(environment, constantSystem),
right.evaluate(environment, constantSystem));
@@ -711,9 +702,7 @@
ConstantExpression apply(NormalizedArguments arguments) {
return new BinaryConstantExpression(
- left.apply(arguments),
- operator,
- right.apply(arguments));
+ left.apply(arguments), operator, right.apply(arguments));
}
DartType getKnownType(CoreTypes coreTypes) {
@@ -734,11 +723,11 @@
assert(knownRightType == coreTypes.stringType);
return coreTypes.stringType;
} else if (knownLeftType == coreTypes.intType &&
- knownRightType == coreTypes.intType) {
+ knownRightType == coreTypes.intType) {
return coreTypes.intType;
}
assert(knownLeftType == coreTypes.doubleType ||
- knownRightType == coreTypes.doubleType);
+ knownRightType == coreTypes.doubleType);
return coreTypes.doubleType;
case BinaryOperatorKind.SUB:
case BinaryOperatorKind.MUL:
@@ -748,7 +737,7 @@
return coreTypes.intType;
}
assert(knownLeftType == coreTypes.doubleType ||
- knownRightType == coreTypes.doubleType);
+ knownRightType == coreTypes.doubleType);
return coreTypes.doubleType;
case BinaryOperatorKind.DIV:
return coreTypes.doubleType;
@@ -767,21 +756,18 @@
}
}
-
int get precedence => PRECEDENCE_MAP[operator.kind];
@override
int _computeHashCode() {
- return 13 * operator.hashCode +
- 17 * left.hashCode +
- 19 * right.hashCode;
+ return 13 * operator.hashCode + 17 * left.hashCode + 19 * right.hashCode;
}
@override
bool _equals(BinaryConstantExpression other) {
return operator == other.operator &&
- left == other.left &&
- right == other.right;
+ left == other.left &&
+ right == other.right;
}
static const Map<BinaryOperatorKind, int> PRECEDENCE_MAP = const {
@@ -822,8 +808,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return constantSystem.identity.fold(
left.evaluate(environment, constantSystem),
right.evaluate(environment, constantSystem));
@@ -831,22 +817,19 @@
ConstantExpression apply(NormalizedArguments arguments) {
return new IdenticalConstantExpression(
- left.apply(arguments),
- right.apply(arguments));
+ left.apply(arguments), right.apply(arguments));
}
int get precedence => 15;
@override
int _computeHashCode() {
- return 17 * left.hashCode +
- 19 * right.hashCode;
+ return 17 * left.hashCode + 19 * right.hashCode;
}
@override
bool _equals(IdenticalConstantExpression other) {
- return left == other.left &&
- right == other.right;
+ return left == other.left && right == other.right;
}
@override
@@ -869,30 +852,27 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
- return constantSystem.lookupUnary(operator).fold(
- expression.evaluate(environment, constantSystem));
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
+ return constantSystem
+ .lookupUnary(operator)
+ .fold(expression.evaluate(environment, constantSystem));
}
ConstantExpression apply(NormalizedArguments arguments) {
- return new UnaryConstantExpression(
- operator,
- expression.apply(arguments));
+ return new UnaryConstantExpression(operator, expression.apply(arguments));
}
int get precedence => PRECEDENCE_MAP[operator.kind];
@override
int _computeHashCode() {
- return 13 * operator.hashCode +
- 17 * expression.hashCode;
+ return 13 * operator.hashCode + 17 * expression.hashCode;
}
@override
bool _equals(UnaryConstantExpression other) {
- return operator == other.operator &&
- expression == other.expression;
+ return operator == other.operator && expression == other.expression;
}
@override
@@ -907,7 +887,6 @@
};
}
-
/// A string length constant expression like `a.length`.
class StringLengthConstantExpression extends ConstantExpression {
final ConstantExpression expression;
@@ -921,8 +900,8 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
ConstantValue value = expression.evaluate(environment, constantSystem);
if (value.isString) {
StringConstantValue stringValue = value;
@@ -957,9 +936,7 @@
final ConstantExpression trueExp;
final ConstantExpression falseExp;
- ConditionalConstantExpression(this.condition,
- this.trueExp,
- this.falseExp);
+ ConditionalConstantExpression(this.condition, this.trueExp, this.falseExp);
ConstantExpressionKind get kind => ConstantExpressionKind.CONDITIONAL;
@@ -968,10 +945,8 @@
}
ConstantExpression apply(NormalizedArguments arguments) {
- return new ConditionalConstantExpression(
- condition.apply(arguments),
- trueExp.apply(arguments),
- falseExp.apply(arguments));
+ return new ConditionalConstantExpression(condition.apply(arguments),
+ trueExp.apply(arguments), falseExp.apply(arguments));
}
int get precedence => 3;
@@ -979,26 +954,24 @@
@override
int _computeHashCode() {
return 13 * condition.hashCode +
- 17 * trueExp.hashCode +
- 19 * falseExp.hashCode;
+ 17 * trueExp.hashCode +
+ 19 * falseExp.hashCode;
}
@override
bool _equals(ConditionalConstantExpression other) {
return condition == other.condition &&
- trueExp == other.trueExp &&
- falseExp == other.falseExp;
+ trueExp == other.trueExp &&
+ falseExp == other.falseExp;
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
ConstantValue conditionValue =
condition.evaluate(environment, constantSystem);
- ConstantValue trueValue =
- trueExp.evaluate(environment, constantSystem);
- ConstantValue falseValue =
- falseExp.evaluate(environment, constantSystem);
+ ConstantValue trueValue = trueExp.evaluate(environment, constantSystem);
+ ConstantValue falseValue = falseExp.evaluate(environment, constantSystem);
if (conditionValue.isTrue) {
return trueValue;
} else if (conditionValue.isFalse) {
@@ -1044,8 +1017,8 @@
bool _equals(PositionalArgumentReference other) => index == other.index;
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
throw new UnsupportedError('PositionalArgumentReference.evaluate');
}
}
@@ -1075,8 +1048,8 @@
bool _equals(NamedArgumentReference other) => name == other.name;
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
throw new UnsupportedError('NamedArgumentReference.evaluate');
}
}
@@ -1089,24 +1062,20 @@
@override
int _computeHashCode() {
- return 13 * name.hashCode +
- 17 * defaultValue.hashCode;
+ return 13 * name.hashCode + 17 * defaultValue.hashCode;
}
@override
bool _equals(FromEnvironmentConstantExpression other) {
- return name == other.name &&
- defaultValue == other.defaultValue;
+ return name == other.name && defaultValue == other.defaultValue;
}
}
/// A `const bool.fromEnvironment` constant.
class BoolFromEnvironmentConstantExpression
extends FromEnvironmentConstantExpression {
-
BoolFromEnvironmentConstantExpression(
- ConstantExpression name,
- ConstantExpression defaultValue)
+ ConstantExpression name, ConstantExpression defaultValue)
: super(name, defaultValue);
ConstantExpressionKind get kind {
@@ -1118,14 +1087,13 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
ConstantValue nameConstantValue =
name.evaluate(environment, constantSystem);
ConstantValue defaultConstantValue;
if (defaultValue != null) {
- defaultConstantValue =
- defaultValue.evaluate(environment, constantSystem);
+ defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
} else {
defaultConstantValue = constantSystem.createBool(false);
}
@@ -1145,8 +1113,7 @@
}
ConstantExpression apply(NormalizedArguments arguments) {
- return new BoolFromEnvironmentConstantExpression(
- name.apply(arguments),
+ return new BoolFromEnvironmentConstantExpression(name.apply(arguments),
defaultValue != null ? defaultValue.apply(arguments) : null);
}
@@ -1157,10 +1124,8 @@
/// A `const int.fromEnvironment` constant.
class IntFromEnvironmentConstantExpression
extends FromEnvironmentConstantExpression {
-
IntFromEnvironmentConstantExpression(
- ConstantExpression name,
- ConstantExpression defaultValue)
+ ConstantExpression name, ConstantExpression defaultValue)
: super(name, defaultValue);
ConstantExpressionKind get kind {
@@ -1172,14 +1137,13 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
ConstantValue nameConstantValue =
name.evaluate(environment, constantSystem);
ConstantValue defaultConstantValue;
if (defaultValue != null) {
- defaultConstantValue =
- defaultValue.evaluate(environment, constantSystem);
+ defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
} else {
defaultConstantValue = constantSystem.createNull();
}
@@ -1201,8 +1165,7 @@
}
ConstantExpression apply(NormalizedArguments arguments) {
- return new IntFromEnvironmentConstantExpression(
- name.apply(arguments),
+ return new IntFromEnvironmentConstantExpression(name.apply(arguments),
defaultValue != null ? defaultValue.apply(arguments) : null);
}
@@ -1213,10 +1176,8 @@
/// A `const String.fromEnvironment` constant.
class StringFromEnvironmentConstantExpression
extends FromEnvironmentConstantExpression {
-
StringFromEnvironmentConstantExpression(
- ConstantExpression name,
- ConstantExpression defaultValue)
+ ConstantExpression name, ConstantExpression defaultValue)
: super(name, defaultValue);
ConstantExpressionKind get kind {
@@ -1228,14 +1189,13 @@
}
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
ConstantValue nameConstantValue =
name.evaluate(environment, constantSystem);
ConstantValue defaultConstantValue;
if (defaultValue != null) {
- defaultConstantValue =
- defaultValue.evaluate(environment, constantSystem);
+ defaultConstantValue = defaultValue.evaluate(environment, constantSystem);
} else {
defaultConstantValue = constantSystem.createNull();
}
@@ -1253,8 +1213,7 @@
}
ConstantExpression apply(NormalizedArguments arguments) {
- return new StringFromEnvironmentConstantExpression(
- name.apply(arguments),
+ return new StringFromEnvironmentConstantExpression(name.apply(arguments),
defaultValue != null ? defaultValue.apply(arguments) : null);
}
@@ -1273,8 +1232,8 @@
ConstantExpressionKind get kind => ConstantExpressionKind.DEFERRED;
@override
- ConstantValue evaluate(Environment environment,
- ConstantSystem constantSystem) {
+ ConstantValue evaluate(
+ Environment environment, ConstantSystem constantSystem) {
return expression.evaluate(environment, constantSystem);
}
@@ -1284,8 +1243,7 @@
}
ConstantExpression apply(NormalizedArguments arguments) {
- return new DeferredConstantExpression(
- expression.apply(arguments), prefix);
+ return new DeferredConstantExpression(expression.apply(arguments), prefix);
}
@override
@@ -1324,12 +1282,12 @@
R visitUnary(UnaryConstantExpression exp, A context);
R visitStringLength(StringLengthConstantExpression exp, A context);
R visitConditional(ConditionalConstantExpression exp, A context);
- R visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
- A context);
- R visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp,
- A context);
- R visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp,
- A context);
+ R visitBoolFromEnvironment(
+ BoolFromEnvironmentConstantExpression exp, A context);
+ R visitIntFromEnvironment(
+ IntFromEnvironmentConstantExpression exp, A context);
+ R visitStringFromEnvironment(
+ StringFromEnvironmentConstantExpression exp, A context);
R visitDeferred(DeferredConstantExpression exp, A context);
R visitPositional(PositionalArgumentReference exp, A context);
@@ -1339,9 +1297,8 @@
class ConstExpPrinter extends ConstantExpressionVisitor {
final StringBuffer sb = new StringBuffer();
- void write(ConstantExpression parent,
- ConstantExpression child,
- {bool leftAssociative: true}) {
+ void write(ConstantExpression parent, ConstantExpression child,
+ {bool leftAssociative: true}) {
if (child.precedence < parent.precedence ||
!leftAssociative && child.precedence == parent.precedence) {
sb.write('(');
@@ -1478,7 +1435,6 @@
visit(expression);
sb.write("}");
}
-
}
sb.write('"');
}
@@ -1572,7 +1528,7 @@
@override
void visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
- [_]) {
+ [_]) {
sb.write('const bool.fromEnvironment(');
visit(exp.name);
if (exp.defaultValue != null) {
@@ -1595,7 +1551,7 @@
@override
void visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp,
- [_]) {
+ [_]) {
sb.write('const String.fromEnvironment(');
visit(exp.name);
if (exp.defaultValue != null) {
diff --git a/pkg/compiler/lib/src/constants/values.dart b/pkg/compiler/lib/src/constants/values.dart
index 3b0ed7d..1cc0271 100644
--- a/pkg/compiler/lib/src/constants/values.dart
+++ b/pkg/compiler/lib/src/constants/values.dart
@@ -8,11 +8,7 @@
import '../core_types.dart';
import '../dart_types.dart';
import '../elements/elements.dart'
- show ClassElement,
- Element,
- FieldElement,
- FunctionElement,
- PrefixElement;
+ show ClassElement, Element, FieldElement, FunctionElement, PrefixElement;
import '../tree/tree.dart' hide unparse;
import '../util/util.dart' show Hashing;
@@ -89,7 +85,7 @@
String toString() {
assertDebugMode("Use Constant.unparse() or Constant.toStructuredString() "
- "instead of Constant.toString().");
+ "instead of Constant.toString().");
return toStructuredString();
}
}
@@ -104,7 +100,7 @@
bool get isFunction => true;
bool operator ==(var other) {
- if (other is !FunctionConstantValue) return false;
+ if (other is! FunctionConstantValue) return false;
return identical(other.element, element);
}
@@ -141,7 +137,7 @@
bool get isPrimitive => true;
bool operator ==(var other) {
- if (other is !PrimitiveConstantValue) return false;
+ if (other is! PrimitiveConstantValue) return false;
PrimitiveConstantValue otherPrimitive = other;
// We use == instead of 'identical' so that DartStrings compare correctly.
return primitiveValue == otherPrimitive.primitiveValue;
@@ -195,20 +191,34 @@
factory IntConstantValue(int value) {
switch (value) {
- case 0: return const IntConstantValue._internal(0);
- case 1: return const IntConstantValue._internal(1);
- case 2: return const IntConstantValue._internal(2);
- case 3: return const IntConstantValue._internal(3);
- case 4: return const IntConstantValue._internal(4);
- case 5: return const IntConstantValue._internal(5);
- case 6: return const IntConstantValue._internal(6);
- case 7: return const IntConstantValue._internal(7);
- case 8: return const IntConstantValue._internal(8);
- case 9: return const IntConstantValue._internal(9);
- case 10: return const IntConstantValue._internal(10);
- case -1: return const IntConstantValue._internal(-1);
- case -2: return const IntConstantValue._internal(-2);
- default: return new IntConstantValue._internal(value);
+ case 0:
+ return const IntConstantValue._internal(0);
+ case 1:
+ return const IntConstantValue._internal(1);
+ case 2:
+ return const IntConstantValue._internal(2);
+ case 3:
+ return const IntConstantValue._internal(3);
+ case 4:
+ return const IntConstantValue._internal(4);
+ case 5:
+ return const IntConstantValue._internal(5);
+ case 6:
+ return const IntConstantValue._internal(6);
+ case 7:
+ return const IntConstantValue._internal(7);
+ case 8:
+ return const IntConstantValue._internal(8);
+ case 9:
+ return const IntConstantValue._internal(9);
+ case 10:
+ return const IntConstantValue._internal(10);
+ case -1:
+ return const IntConstantValue._internal(-1);
+ case -2:
+ return const IntConstantValue._internal(-2);
+ default:
+ return new IntConstantValue._internal(value);
}
}
@@ -233,7 +243,7 @@
// The is [:!IntConstant:] check at the beginning of the function makes sure
// that we compare only equal to integer constants.
bool operator ==(var other) {
- if (other is !IntConstantValue) return false;
+ if (other is! IntConstantValue) return false;
IntConstantValue otherInt = other;
return primitiveValue == otherInt.primitiveValue;
}
@@ -288,7 +298,7 @@
DartType getType(CoreTypes types) => types.doubleType;
bool operator ==(var other) {
- if (other is !DoubleConstantValue) return false;
+ if (other is! DoubleConstantValue) return false;
DoubleConstantValue otherDouble = other;
double otherValue = otherDouble.primitiveValue;
if (primitiveValue == 0.0 && otherValue == 0.0) {
@@ -390,10 +400,10 @@
bool operator ==(var other) {
if (identical(this, other)) return true;
- if (other is !StringConstantValue) return false;
+ if (other is! StringConstantValue) return false;
StringConstantValue otherString = other;
return hashCode == otherString.hashCode &&
- primitiveValue == otherString.primitiveValue;
+ primitiveValue == otherString.primitiveValue;
}
DartString toDartString() => primitiveValue;
@@ -436,7 +446,7 @@
bool operator ==(other) {
return other is TypeConstantValue &&
- representedType == other.representedType;
+ representedType == other.representedType;
}
int get hashCode => representedType.hashCode * 13;
@@ -463,7 +473,7 @@
bool operator ==(var other) {
if (identical(this, other)) return true;
- if (other is !ListConstantValue) return false;
+ if (other is! ListConstantValue) return false;
ListConstantValue otherList = other;
if (hashCode != otherList.hashCode) return false;
if (type != otherList.type) return false;
@@ -484,7 +494,7 @@
StringBuffer sb = new StringBuffer();
_unparseTypeArguments(sb);
sb.write('[');
- for (int i = 0 ; i < length ; i++) {
+ for (int i = 0; i < length; i++) {
if (i > 0) sb.write(',');
sb.write(entries[i].unparse());
}
@@ -497,7 +507,7 @@
sb.write('ListConstant(');
_unparseTypeArguments(sb);
sb.write('[');
- for (int i = 0 ; i < length ; i++) {
+ for (int i = 0; i < length; i++) {
if (i > 0) sb.write(', ');
sb.write(entries[i].toStructuredString());
}
@@ -512,14 +522,12 @@
final int hashCode;
Map<ConstantValue, ConstantValue> _lookupMap;
- MapConstantValue(InterfaceType type,
- List<ConstantValue> keys,
- List<ConstantValue> values)
+ MapConstantValue(
+ InterfaceType type, List<ConstantValue> keys, List<ConstantValue> values)
: this.keys = keys,
this.values = values,
- this.hashCode = Hashing.listHash(values,
- Hashing.listHash(keys,
- Hashing.objectHash(type))),
+ this.hashCode = Hashing.listHash(
+ values, Hashing.listHash(keys, Hashing.objectHash(type))),
super(type) {
assert(keys.length == values.length);
}
@@ -528,7 +536,7 @@
bool operator ==(var other) {
if (identical(this, other)) return true;
- if (other is !MapConstantValue) return false;
+ if (other is! MapConstantValue) return false;
MapConstantValue otherMap = other;
if (hashCode != otherMap.hashCode) return false;
if (type != other.type) return false;
@@ -561,7 +569,7 @@
StringBuffer sb = new StringBuffer();
_unparseTypeArguments(sb);
sb.write('{');
- for (int i = 0 ; i < length ; i++) {
+ for (int i = 0; i < length; i++) {
if (i > 0) sb.write(',');
sb.write(keys[i].unparse());
sb.write(':');
@@ -597,8 +605,8 @@
bool get isInterceptor => true;
bool operator ==(other) {
- return other is InterceptorConstantValue
- && dispatchedType == other.dispatchedType;
+ return other is InterceptorConstantValue &&
+ dispatchedType == other.dispatchedType;
}
int get hashCode => dispatchedType.hashCode * 43;
@@ -629,8 +637,7 @@
bool get isDummy => true;
bool operator ==(other) {
- return other is SyntheticConstantValue
- && payload == other.payload;
+ return other is SyntheticConstantValue && payload == other.payload;
}
get hashCode => payload.hashCode * 17 + kind.hashCode;
@@ -652,11 +659,11 @@
final Map<FieldElement, ConstantValue> fields;
final int hashCode;
- ConstructedConstantValue(InterfaceType type,
- Map<FieldElement, ConstantValue> fields)
- : this.fields = fields,
- hashCode = Hashing.mapHash(fields, Hashing.objectHash(type)),
- super(type) {
+ ConstructedConstantValue(
+ InterfaceType type, Map<FieldElement, ConstantValue> fields)
+ : this.fields = fields,
+ hashCode = Hashing.mapHash(fields, Hashing.objectHash(type)),
+ super(type) {
assert(type != null);
assert(!fields.containsValue(null));
}
@@ -665,7 +672,7 @@
bool operator ==(var otherVar) {
if (identical(this, otherVar)) return true;
- if (otherVar is !ConstructedConstantValue) return false;
+ if (otherVar is! ConstructedConstantValue) return false;
ConstructedConstantValue other = otherVar;
if (hashCode != other.hashCode) return false;
if (type != other.type) return false;
@@ -728,9 +735,9 @@
bool get isReference => true;
bool operator ==(other) {
- return other is DeferredConstantValue
- && referenced == other.referenced
- && prefix == other.prefix;
+ return other is DeferredConstantValue &&
+ referenced == other.referenced &&
+ prefix == other.prefix;
}
get hashCode => (referenced.hashCode * 17 + prefix.hashCode) & 0x3fffffff;
diff --git a/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart b/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart
index 4a018ef..5bdfc6c 100644
--- a/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart
+++ b/pkg/compiler/lib/src/cps_ir/backward_null_check_remover.dart
@@ -71,7 +71,9 @@
if (prim is ReceiverCheck && prim.isNullCheck) {
Primitive value = prim.value;
LetPrim let = prim.parent;
- prim..replaceUsesWith(value)..destroy();
+ prim
+ ..replaceUsesWith(value)
+ ..destroy();
let.remove();
} else if (prim is GetLength || prim is GetField || prim is GetIndex) {
if (prim.hasNoRefinedUses) {
diff --git a/pkg/compiler/lib/src/cps_ir/bounds_checker.dart b/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
index faaf93e..b4ca8e1 100644
--- a/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
+++ b/pkg/compiler/lib/src/cps_ir/bounds_checker.dart
@@ -124,13 +124,13 @@
return lengthOf
.putIfAbsent(indexableObject, () => <int, SignedVariable>{})
.putIfAbsent(effectNumber, () {
- int length = types.getContainerLength(type);
- if (length != null) {
- return octagon.makeVariable(length, length);
- } else {
- return octagon.makeVariable(0, MAX_UINT32);
- }
- });
+ int length = types.getContainerLength(type);
+ if (length != null) {
+ return octagon.makeVariable(length, length);
+ } else {
+ return octagon.makeVariable(0, MAX_UINT32);
+ }
+ });
}
// ------------- CONSTRAINT HELPERS -----------------
@@ -493,9 +493,8 @@
void visitBoundsCheck(BoundsCheck node) {
if (node.checks == BoundsCheck.NONE) return;
assert(node.indexRef != null); // Because there is at least one check.
- SignedVariable length = node.lengthRef == null
- ? null
- : getValue(node.length);
+ SignedVariable length =
+ node.lengthRef == null ? null : getValue(node.length);
SignedVariable index = getValue(node.index);
if (node.hasUpperBoundCheck) {
if (isDefinitelyLessThan(index, length)) {
@@ -519,12 +518,16 @@
}
}
if (!node.lengthUsedInCheck && node.lengthRef != null) {
- node..lengthRef.unlink()..lengthRef = null;
+ node
+ ..lengthRef.unlink()
+ ..lengthRef = null;
}
if (node.checks == BoundsCheck.NONE) {
// We can't remove the bounds check node because it may still be used to
// restrict code motion. But the index is no longer needed.
- node..indexRef.unlink()..indexRef = null;
+ node
+ ..indexRef.unlink()
+ ..indexRef = null;
}
}
diff --git a/pkg/compiler/lib/src/cps_ir/builtin_operator.dart b/pkg/compiler/lib/src/cps_ir/builtin_operator.dart
index 5751644..7c5e45c 100644
--- a/pkg/compiler/lib/src/cps_ir/builtin_operator.dart
+++ b/pkg/compiler/lib/src/cps_ir/builtin_operator.dart
@@ -212,7 +212,7 @@
/// True for the built-in operators that may be used in a compound assignment.
bool isCompoundableOperator(BuiltinOperator operator) {
- switch(operator) {
+ switch (operator) {
case BuiltinOperator.NumAdd:
case BuiltinOperator.NumSubtract:
case BuiltinOperator.NumMultiply:
@@ -228,12 +228,11 @@
int getEffectsOfBuiltinMethod(BuiltinMethod method) {
switch (method) {
case BuiltinMethod.Push:
- return Effects.changesIndexableContent |
- Effects.changesIndexableLength;
+ return Effects.changesIndexableContent | Effects.changesIndexableLength;
case BuiltinMethod.Pop:
return Effects.dependsOnIndexableContent |
- Effects.dependsOnIndexableLength |
- Effects.changesIndexableLength;
+ Effects.dependsOnIndexableLength |
+ Effects.changesIndexableLength;
case BuiltinMethod.SetLength:
return Effects.changesIndexableLength;
}
diff --git a/pkg/compiler/lib/src/cps_ir/cps_fragment.dart b/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
index 903b672..992ae55 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_fragment.dart
@@ -118,27 +118,22 @@
return letPrim(new Refinement(value, type));
}
- Primitive invokeBuiltin(BuiltinMethod method,
- Primitive receiver,
- List<Primitive> arguments,
- {bool receiverIsNotNull: false}) {
+ Primitive invokeBuiltin(
+ BuiltinMethod method, Primitive receiver, List<Primitive> arguments,
+ {bool receiverIsNotNull: false}) {
ApplyBuiltinMethod apply =
new ApplyBuiltinMethod(method, receiver, arguments, sourceInformation);
return letPrim(apply);
}
/// Inserts an invocation and returns a primitive holding the returned value.
- Primitive invokeMethod(Primitive receiver,
- Selector selector,
- TypeMask mask,
+ Primitive invokeMethod(Primitive receiver, Selector selector, TypeMask mask,
List<Primitive> arguments,
- {Primitive interceptor,
- CallingConvention callingConvention}) {
- InvokeMethod invoke =
- new InvokeMethod(receiver, selector, mask, arguments,
- sourceInformation: sourceInformation,
- callingConvention: callingConvention,
- interceptor: interceptor);
+ {Primitive interceptor, CallingConvention callingConvention}) {
+ InvokeMethod invoke = new InvokeMethod(receiver, selector, mask, arguments,
+ sourceInformation: sourceInformation,
+ callingConvention: callingConvention,
+ interceptor: interceptor);
return letPrim(invoke);
}
@@ -168,8 +163,8 @@
/// Call [continueLoop] with the returned continuation to iterate the loop.
///
/// The loop body becomes the new hole.
- Continuation beginLoop([List<Parameter> loopVars,
- List<Primitive> initialValues]) {
+ Continuation beginLoop(
+ [List<Parameter> loopVars, List<Primitive> initialValues]) {
if (initialValues == null) {
assert(loopVars == null);
loopVars = <Parameter>[];
@@ -195,13 +190,14 @@
///
/// The other branch becomes the new hole.
CpsFragment branch(Primitive condition,
- {bool negate: false,
- bool strict: false}) {
+ {bool negate: false, bool strict: false}) {
Continuation trueCont = new Continuation(<Parameter>[]);
Continuation falseCont = new Continuation(<Parameter>[]);
- put(new LetCont.two(trueCont, falseCont,
- new Branch(condition, trueCont, falseCont,
- sourceInformation, strict: strict)));
+ put(new LetCont.two(
+ trueCont,
+ falseCont,
+ new Branch(condition, trueCont, falseCont, sourceInformation,
+ strict: strict)));
if (negate) {
context = trueCont;
return new CpsFragment(sourceInformation, falseCont);
@@ -278,11 +274,9 @@
/// remains open, even if [target] never returns.
///
/// The [target] function is destroyed and should not be reused.
- Primitive inlineFunction(FunctionDefinition target,
- Primitive receiver,
- List<Primitive> arguments,
- {Entity hint,
- Primitive interceptor}) {
+ Primitive inlineFunction(
+ FunctionDefinition target, Primitive receiver, List<Primitive> arguments,
+ {Entity hint, Primitive interceptor}) {
if (interceptor != null) {
target.interceptorParameter.replaceUsesWith(interceptor);
}
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
index b7d7cdf..7927ba0 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder.dart
@@ -6,42 +6,31 @@
import '../closure.dart' as closure;
import '../common.dart';
-import '../common/names.dart' show
- Names,
- Selectors;
-import '../compile_time_constants.dart' show
- BackendConstantEnvironment;
+import '../common/names.dart' show Names, Selectors;
+import '../compile_time_constants.dart' show BackendConstantEnvironment;
import '../constants/constant_system.dart';
-import '../constants/values.dart' show
- ConstantValue,
- PrimitiveConstantValue;
+import '../constants/values.dart' show ConstantValue, PrimitiveConstantValue;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../io/source_information.dart';
-import '../js/js.dart' as js show
- js,
- objectLiteral,
- Expression,
- LiteralStatement,
- Template,
- InterpolatedExpression,
- isIdentityTemplate;
-import '../native/native.dart' show
- NativeBehavior;
+import '../js/js.dart' as js
+ show
+ js,
+ objectLiteral,
+ Expression,
+ LiteralStatement,
+ Template,
+ InterpolatedExpression,
+ isIdentityTemplate;
+import '../native/native.dart' show NativeBehavior;
import '../tree/tree.dart' as ast;
-import '../types/types.dart' show
- TypeMask;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector,
- SelectorKind;
+import '../types/types.dart' show TypeMask;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector, SelectorKind;
-import 'cps_ir_builder_task.dart' show
- GlobalProgramInformation;
+import 'cps_ir_builder_task.dart' show GlobalProgramInformation;
import 'cps_ir_nodes.dart' as ir;
-
/// A mapping from variable elements to their compile-time values.
///
/// Map elements denoted by parameters and local variables to the
@@ -110,7 +99,7 @@
ir.Primitive lookup(Local element) {
assert(invariant(element, variable2index.containsKey(element),
- message: "Unknown variable: $element."));
+ message: "Unknown variable: $element."));
return index2value[variable2index[element]];
}
@@ -158,8 +147,8 @@
/// The environment is the one in effect at the point where the jump's
/// continuation will be bound. Continuations can take an extra argument
/// (see [addJump]).
- JumpCollector(this._continuationEnvironment, this.target,
- bool hasExtraArgument) {
+ JumpCollector(
+ this._continuationEnvironment, this.target, bool hasExtraArgument) {
if (hasExtraArgument) _continuationEnvironment.extend(null, null);
}
@@ -168,7 +157,8 @@
/// There is no jump target, it is implicitly the exit from the function.
/// There is no environment at the destination.
JumpCollector.retrn(this._continuation)
- : _continuationEnvironment = null, target = null;
+ : _continuationEnvironment = null,
+ target = null;
/// Construct a collector for collecting goto jumps.
///
@@ -280,8 +270,8 @@
[ir.Primitive value, SourceInformation sourceInformation]) {
assert(_continuation == null);
_buildTryExit(builder);
- ir.InvokeContinuation invoke = new ir.InvokeContinuation.uninitialized(
- isEscapingTry: isEscapingTry);
+ ir.InvokeContinuation invoke =
+ new ir.InvokeContinuation.uninitialized(isEscapingTry: isEscapingTry);
builder.add(invoke);
_invocations.add(invoke);
// Truncate the environment at the invocation site so it only includes
@@ -316,8 +306,8 @@
int length = _continuationEnvironment.length;
for (int varIndex = 0; varIndex < length; ++varIndex) {
for (Environment invocationEnvironment in _invocationEnvironments) {
- assert(invocationEnvironment.sameDomain(length,
- _continuationEnvironment));
+ assert(invocationEnvironment.sameDomain(
+ length, _continuationEnvironment));
if (invocationEnvironment[varIndex] !=
_continuationEnvironment[varIndex]) {
ir.Parameter parameter = new ir.Parameter(
@@ -399,10 +389,9 @@
if (value != null) ++delta;
if (delta > 0) builder.environment.discard(delta);
if (value != null) builder.environment.extend(null, value);
- builder.add(new ir.InvokeContinuation(_continuation,
- builder.environment.index2value,
- isRecursive: true,
- isEscapingTry: isEscapingTry));
+ builder.add(new ir.InvokeContinuation(
+ _continuation, builder.environment.index2value,
+ isRecursive: true, isEscapingTry: isEscapingTry));
builder._current = null;
}
}
@@ -424,8 +413,7 @@
[ir.Primitive value, SourceInformation sourceInformation]) {
isEmpty = false;
builder.add(new ir.InvokeContinuation(continuation, <ir.Primitive>[value],
- isEscapingTry: isEscapingTry,
- sourceInformation: sourceInformation));
+ isEscapingTry: isEscapingTry, sourceInformation: sourceInformation));
builder._current = null;
}
}
@@ -444,7 +432,8 @@
JumpCollector _breakJoin;
GotoJumpCollector(JumpTarget target, this._stateVariableIndex,
- this._stateValue, this._breakJoin) : super.goto(target);
+ this._stateValue, this._breakJoin)
+ : super.goto(target);
void addJump(IrBuilder builder,
[ir.Primitive value, SourceInformation sourceInformation]) {
@@ -599,11 +588,10 @@
GlobalProgramInformation get program => state.program;
IrBuilder(GlobalProgramInformation program,
- BackendConstantEnvironment constants,
- ExecutableElement currentElement)
- : state = new IrBuilderSharedState(program, constants, currentElement),
- environment = new Environment.empty(),
- mutableVariables = <Local, ir.MutableVariable>{};
+ BackendConstantEnvironment constants, ExecutableElement currentElement)
+ : state = new IrBuilderSharedState(program, constants, currentElement),
+ environment = new Environment.empty(),
+ mutableVariables = <Local, ir.MutableVariable>{};
IrBuilder._internal(this.state, this.environment, this.mutableVariables);
@@ -630,8 +618,7 @@
/// Creates a [ir.MutableVariable] for the given local.
void makeMutableVariable(Local local) {
- mutableVariables[local] =
- new ir.MutableVariable(local);
+ mutableVariables[local] = new ir.MutableVariable(local);
}
/// Remove an [ir.MutableVariable] for a local.
@@ -650,8 +637,7 @@
bool get isOpen => root == null || _current != null;
List<ir.Primitive> buildFunctionHeader(Iterable<Local> parameters,
- {ClosureScope closureScope,
- ClosureEnvironment env}) {
+ {ClosureScope closureScope, ClosureEnvironment env}) {
_createThisParameter();
_enterClosureEnvironment(env);
_enterScope(closureScope);
@@ -687,10 +673,8 @@
return primitive;
}
- ir.Primitive buildInvokeStatic(Element element,
- Selector selector,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildInvokeStatic(Element element, Selector selector,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
assert(!element.isLocal);
assert(!element.isInstanceMember);
assert(isOpen);
@@ -701,41 +685,38 @@
new ir.InvokeStatic(element, selector, arguments, sourceInformation));
}
- ir.Primitive _buildInvokeSuper(Element target,
- Selector selector,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive _buildInvokeSuper(Element target, Selector selector,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
assert(target.isInstanceMember);
assert(isOpen);
return addPrimitive(new ir.InvokeMethodDirectly(
buildThis(), target, selector, arguments, sourceInformation));
}
- ir.Primitive _buildInvokeDynamic(ir.Primitive receiver,
- Selector selector,
- TypeMask mask,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive _buildInvokeDynamic(
+ ir.Primitive receiver,
+ Selector selector,
+ TypeMask mask,
+ List<ir.Primitive> arguments,
+ SourceInformation sourceInformation) {
assert(isOpen);
- return addPrimitive(new ir.InvokeMethod(
- receiver, selector, mask, arguments,
+ return addPrimitive(new ir.InvokeMethod(receiver, selector, mask, arguments,
sourceInformation: sourceInformation));
}
- ir.Primitive _buildInvokeCall(ir.Primitive target,
- CallStructure callStructure,
- TypeMask mask,
- List<ir.Definition> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive _buildInvokeCall(
+ ir.Primitive target,
+ CallStructure callStructure,
+ TypeMask mask,
+ List<ir.Definition> arguments,
+ SourceInformation sourceInformation) {
Selector selector = callStructure.callSelector;
return _buildInvokeDynamic(
target, selector, mask, arguments, sourceInformation);
}
- ir.Primitive buildStaticNoSuchMethod(
- Selector selector,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildStaticNoSuchMethod(Selector selector,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
ir.Primitive receiver = buildStringConstant('');
ir.Primitive name = buildStringConstant(selector.name);
ir.Primitive argumentList = buildListLiteral(null, arguments);
@@ -748,7 +729,7 @@
/// Create a [ir.Constant] from [value] and add it to the CPS term.
ir.Constant buildConstant(ConstantValue value,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
assert(isOpen);
return addPrimitive(
new ir.Constant(value, sourceInformation: sourceInformation));
@@ -787,9 +768,9 @@
/// Creates a non-constant list literal of the provided [type] and with the
/// provided [values].
- ir.Primitive buildListLiteral(InterfaceType type,
- Iterable<ir.Primitive> values,
- {TypeMask allocationSiteType}) {
+ ir.Primitive buildListLiteral(
+ InterfaceType type, Iterable<ir.Primitive> values,
+ {TypeMask allocationSiteType}) {
assert(isOpen);
return addPrimitive(new ir.LiteralList(type, values.toList(),
allocationSiteType: allocationSiteType));
@@ -832,12 +813,13 @@
ir.Continuation elseContinuation = new ir.Continuation([]);
thenContinuation.body = thenBuilder.root;
elseContinuation.body = elseBuilder.root;
- add(new ir.LetCont(join.continuation,
- new ir.LetCont.two(thenContinuation, elseContinuation,
- new ir.Branch.strict(condition,
- thenContinuation,
- elseContinuation,
- sourceInformation))));
+ add(new ir.LetCont(
+ join.continuation,
+ new ir.LetCont.two(
+ thenContinuation,
+ elseContinuation,
+ new ir.Branch.strict(condition, thenContinuation, elseContinuation,
+ sourceInformation))));
environment = join.environment;
return environment.discard(1);
}
@@ -863,12 +845,8 @@
ir.FunctionDefinition makeFunctionDefinition(
SourceInformation sourceInformation) {
_ensureReturn();
- return new ir.FunctionDefinition(
- state.currentElement,
- state.thisParameter,
- state.functionParameters,
- state.returnContinuation,
- root,
+ return new ir.FunctionDefinition(state.currentElement, state.thisParameter,
+ state.functionParameters, state.returnContinuation, root,
sourceInformation: sourceInformation);
}
@@ -882,65 +860,51 @@
SourceInformation sourceInformation) {
// TODO(johnniwinther): This shouldn't be necessary.
SelectorKind kind = Elements.isOperatorName(method.name)
- ? SelectorKind.OPERATOR : SelectorKind.CALL;
- Selector selector =
- new Selector(kind, method.memberName, callStructure);
+ ? SelectorKind.OPERATOR
+ : SelectorKind.CALL;
+ Selector selector = new Selector(kind, method.memberName, callStructure);
return _buildInvokeSuper(method, selector, arguments, sourceInformation);
}
/// Create a read access of the [method] on the super class, i.e. a
/// closurization of [method].
- ir.Primitive buildSuperMethodGet(MethodElement method,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperMethodGet(
+ MethodElement method, SourceInformation sourceInformation) {
// TODO(johnniwinther): This should have its own ir node.
- return _buildInvokeSuper(
- method,
- new Selector.getter(method.memberName),
- const <ir.Primitive>[],
- sourceInformation);
+ return _buildInvokeSuper(method, new Selector.getter(method.memberName),
+ const <ir.Primitive>[], sourceInformation);
}
/// Create a getter invocation of the [getter] on the super class.
- ir.Primitive buildSuperGetterGet(MethodElement getter,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperGetterGet(
+ MethodElement getter, SourceInformation sourceInformation) {
// TODO(johnniwinther): This should have its own ir node.
- return _buildInvokeSuper(
- getter,
- new Selector.getter(getter.memberName),
- const <ir.Primitive>[],
- sourceInformation);
+ return _buildInvokeSuper(getter, new Selector.getter(getter.memberName),
+ const <ir.Primitive>[], sourceInformation);
}
/// Create an setter invocation of the [setter] on the super class with
/// [value].
- ir.Primitive buildSuperSetterSet(MethodElement setter,
- ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperSetterSet(MethodElement setter, ir.Primitive value,
+ SourceInformation sourceInformation) {
// TODO(johnniwinther): This should have its own ir node.
- _buildInvokeSuper(
- setter,
- new Selector.setter(setter.memberName),
- <ir.Primitive>[value],
- sourceInformation);
+ _buildInvokeSuper(setter, new Selector.setter(setter.memberName),
+ <ir.Primitive>[value], sourceInformation);
return value;
}
/// Create an invocation of the index [method] on the super class with
/// the provided [index].
- ir.Primitive buildSuperIndex(MethodElement method,
- ir.Primitive index,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperIndex(MethodElement method, ir.Primitive index,
+ SourceInformation sourceInformation) {
return _buildInvokeSuper(
- method, new Selector.index(), <ir.Primitive>[index],
- sourceInformation);
+ method, new Selector.index(), <ir.Primitive>[index], sourceInformation);
}
/// Create an invocation of the index set [method] on the super class with
/// the provided [index] and [value].
- ir.Primitive buildSuperIndexSet(MethodElement method,
- ir.Primitive index,
- ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperIndexSet(MethodElement method, ir.Primitive index,
+ ir.Primitive value, SourceInformation sourceInformation) {
_buildInvokeSuper(method, new Selector.indexSet(),
<ir.Primitive>[index, value], sourceInformation);
return value;
@@ -949,21 +913,20 @@
/// Create a dynamic invocation on [receiver] where the method name and
/// argument structure are defined by [selector] and the argument values are
/// defined by [arguments].
- ir.Primitive buildDynamicInvocation(ir.Primitive receiver,
- Selector selector,
- TypeMask mask,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildDynamicInvocation(
+ ir.Primitive receiver,
+ Selector selector,
+ TypeMask mask,
+ List<ir.Primitive> arguments,
+ SourceInformation sourceInformation) {
return _buildInvokeDynamic(
receiver, selector, mask, arguments, sourceInformation);
}
/// Create a dynamic getter invocation on [receiver] where the getter name is
/// defined by [selector].
- ir.Primitive buildDynamicGet(ir.Primitive receiver,
- Selector selector,
- TypeMask mask,
- SourceInformation sourceInformation) {
+ ir.Primitive buildDynamicGet(ir.Primitive receiver, Selector selector,
+ TypeMask mask, SourceInformation sourceInformation) {
assert(selector.isGetter);
FieldElement field = program.locateSingleField(selector, mask);
if (field != null) {
@@ -978,11 +941,8 @@
/// Create a dynamic setter invocation on [receiver] where the setter name and
/// argument are defined by [selector] and [value], respectively.
- ir.Primitive buildDynamicSet(ir.Primitive receiver,
- Selector selector,
- TypeMask mask,
- ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive buildDynamicSet(ir.Primitive receiver, Selector selector,
+ TypeMask mask, ir.Primitive value, SourceInformation sourceInformation) {
assert(selector.isSetter);
FieldElement field = program.locateSingleField(selector, mask);
if (field != null) {
@@ -990,22 +950,22 @@
// treated as a field access, since the setter might not be emitted.
buildFieldSet(receiver, field, value, sourceInformation);
} else {
- _buildInvokeDynamic(receiver, selector, mask, <ir.Primitive>[value],
- sourceInformation);
+ _buildInvokeDynamic(
+ receiver, selector, mask, <ir.Primitive>[value], sourceInformation);
}
return value;
}
/// Create a dynamic index set invocation on [receiver] with the provided
/// [index] and [value].
- ir.Primitive buildDynamicIndexSet(ir.Primitive receiver,
- TypeMask mask,
- ir.Primitive index,
- ir.Primitive value,
- SourceInformation sourceInformation) {
- _buildInvokeDynamic(
- receiver, new Selector.indexSet(), mask, <ir.Primitive>[index, value],
- sourceInformation);
+ ir.Primitive buildDynamicIndexSet(
+ ir.Primitive receiver,
+ TypeMask mask,
+ ir.Primitive index,
+ ir.Primitive value,
+ SourceInformation sourceInformation) {
+ _buildInvokeDynamic(receiver, new Selector.indexSet(), mask,
+ <ir.Primitive>[index, value], sourceInformation);
return value;
}
@@ -1019,42 +979,37 @@
SourceInformation sourceInformation) {
// TODO(johnniwinther): Maybe this should have its own ir node.
return buildCallInvocation(
- buildLocalGet(function), callStructure, arguments,
- sourceInformation);
+ buildLocalGet(function), callStructure, arguments, sourceInformation);
}
/// Create a static invocation of [function].
///
/// The arguments are not named and their values are defined by [arguments].
- ir.Primitive buildStaticFunctionInvocation(
- MethodElement function,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildStaticFunctionInvocation(MethodElement function,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
Selector selector = new Selector.call(
function.memberName, new CallStructure(arguments.length));
return buildInvokeStatic(function, selector, arguments, sourceInformation);
}
/// Create a getter invocation of the static [getter].
- ir.Primitive buildStaticGetterGet(MethodElement getter,
- SourceInformation sourceInformation) {
+ ir.Primitive buildStaticGetterGet(
+ MethodElement getter, SourceInformation sourceInformation) {
Selector selector = new Selector.getter(getter.memberName);
return buildInvokeStatic(
getter, selector, const <ir.Primitive>[], sourceInformation);
}
/// Create a write access to the static [field] with the [value].
- ir.Primitive buildStaticFieldSet(FieldElement field,
- ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive buildStaticFieldSet(FieldElement field, ir.Primitive value,
+ SourceInformation sourceInformation) {
addPrimitive(new ir.SetStatic(field, value, sourceInformation));
return value;
}
/// Create a setter invocation of the static [setter] with the [value].
- ir.Primitive buildStaticSetterSet(MethodElement setter,
- ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive buildStaticSetterSet(MethodElement setter, ir.Primitive value,
+ SourceInformation sourceInformation) {
Selector selector = new Selector.setter(setter.memberName);
buildInvokeStatic(
setter, selector, <ir.Primitive>[value], sourceInformation);
@@ -1064,23 +1019,18 @@
/// Create an erroneous invocation where argument structure is defined by
/// [selector] and the argument values are defined by [arguments].
// TODO(johnniwinther): Make this more fine-grained.
- ir.Primitive buildErroneousInvocation(
- Element element,
- Selector selector,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildErroneousInvocation(Element element, Selector selector,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
// TODO(johnniwinther): This should have its own ir node.
return buildInvokeStatic(element, selector, arguments, sourceInformation);
}
/// Concatenate string values. The arguments must be strings.
- ir.Primitive buildStringConcatenation(List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildStringConcatenation(
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
assert(isOpen);
return addPrimitive(new ir.ApplyBuiltinOperator(
- ir.BuiltinOperator.StringConcatenate,
- arguments,
- sourceInformation));
+ ir.BuiltinOperator.StringConcatenate, arguments, sourceInformation));
}
/// Create an invocation of the `call` method of [functionExpression], where
@@ -1102,10 +1052,11 @@
/// An if-then statement is created if [buildElsePart] is a no-op.
// TODO(johnniwinther): Unify implementation with [buildConditional] and
// [_buildLogicalOperator].
- void buildIf(ir.Primitive condition,
- void buildThenPart(IrBuilder builder),
- void buildElsePart(IrBuilder builder),
- SourceInformation sourceInformation) {
+ void buildIf(
+ ir.Primitive condition,
+ void buildThenPart(IrBuilder builder),
+ void buildElsePart(IrBuilder builder),
+ SourceInformation sourceInformation) {
assert(isOpen);
// The then and else parts are delimited.
@@ -1129,14 +1080,12 @@
? <ir.Continuation>[elseContinuation, thenContinuation]
: <ir.Continuation>[thenContinuation, elseContinuation];
- ir.Expression result =
- new ir.LetCont.many(arms,
- new ir.Branch.strict(condition,
- thenContinuation,
- elseContinuation,
- sourceInformation));
+ ir.Expression result = new ir.LetCont.many(
+ arms,
+ new ir.Branch.strict(
+ condition, thenContinuation, elseContinuation, sourceInformation));
- JumpCollector join; // Null if there is no join.
+ JumpCollector join; // Null if there is no join.
if (thenBuilder.isOpen && elseBuilder.isOpen) {
// There is a join-point continuation. Build the term
// 'let cont join(x, ...) = [] in Result' and plug invocations of the
@@ -1181,9 +1130,10 @@
void addRecursiveContinuation(BackwardJumpCollector collector) {
assert(environment.length == collector.environment.length);
- add(new ir.LetCont(collector.continuation,
- new ir.InvokeContinuation(collector.continuation,
- environment.index2value)));
+ add(new ir.LetCont(
+ collector.continuation,
+ new ir.InvokeContinuation(
+ collector.continuation, environment.index2value)));
environment = collector.environment;
}
@@ -1200,14 +1150,15 @@
///
/// [loopVariables] is the list of variables declared in the for-loop
/// initializer.
- void buildFor({SubbuildFunction buildInitializer,
- SubbuildFunction buildCondition,
- SourceInformation conditionSourceInformation,
- SubbuildFunction buildBody,
- SubbuildFunction buildUpdate,
- JumpTarget target,
- ClosureScope closureScope,
- List<LocalElement> loopVariables}) {
+ void buildFor(
+ {SubbuildFunction buildInitializer,
+ SubbuildFunction buildCondition,
+ SourceInformation conditionSourceInformation,
+ SubbuildFunction buildBody,
+ SubbuildFunction buildUpdate,
+ JumpTarget target,
+ ClosureScope closureScope,
+ List<LocalElement> loopVariables}) {
assert(isOpen);
// For loops use four named continuations: the entry to the condition,
@@ -1290,8 +1241,8 @@
// Connect the inner and outer body builders. This is done only after
// it is guaranteed that the updateBuilder has a non-empty term.
if (hasContinues) {
- outerBodyBuilder.add(new ir.LetCont(continueCollector.continuation,
- innerBodyBuilder.root));
+ outerBodyBuilder.add(new ir.LetCont(
+ continueCollector.continuation, innerBodyBuilder.root));
continueCollector.continuation.body = updateBuilder.root;
} else {
outerBodyBuilder.add(innerBodyBuilder.root);
@@ -1303,12 +1254,11 @@
bodyContinuation.body = outerBodyBuilder.root;
// Note the order of continuations: the first one is the one that will
// be filled by LetCont.plug.
- ir.LetCont branch =
- new ir.LetCont.two(exitContinuation, bodyContinuation,
- new ir.Branch.strict(condition,
- bodyContinuation,
- exitContinuation,
- conditionSourceInformation));
+ ir.LetCont branch = new ir.LetCont.two(
+ exitContinuation,
+ bodyContinuation,
+ new ir.Branch.strict(condition, bodyContinuation, exitContinuation,
+ conditionSourceInformation));
// If there are breaks in the body, then there must be a join-point
// continuation for the normal exit and the breaks. Otherwise, the
// successor is translated in the hole in the exit continuation.
@@ -1342,22 +1292,23 @@
/// [buildBody] creates the body, `b`, of the loop. The jump [target] is used
/// to identify which `break` and `continue` statements that have this for-in
/// statement as their target.
- void buildForIn({SubbuildFunction buildExpression,
- SubbuildFunction buildVariableDeclaration,
- Element variableElement,
- Selector variableSelector,
- TypeMask variableMask,
- SourceInformation variableSetSourceInformation,
- TypeMask currentMask,
- SourceInformation currentSourceInformation,
- TypeMask iteratorMask,
- SourceInformation iteratorSourceInformation,
- TypeMask moveNextMask,
- SourceInformation moveNextSourceInformation,
- SubbuildFunction buildBody,
- JumpTarget target,
- ClosureScope closureScope,
- SourceInformation conditionSourceInformation}) {
+ void buildForIn(
+ {SubbuildFunction buildExpression,
+ SubbuildFunction buildVariableDeclaration,
+ Element variableElement,
+ Selector variableSelector,
+ TypeMask variableMask,
+ SourceInformation variableSetSourceInformation,
+ TypeMask currentMask,
+ SourceInformation currentSourceInformation,
+ TypeMask iteratorMask,
+ SourceInformation iteratorSourceInformation,
+ TypeMask moveNextMask,
+ SourceInformation moveNextSourceInformation,
+ SubbuildFunction buildBody,
+ JumpTarget target,
+ ClosureScope closureScope,
+ SourceInformation conditionSourceInformation}) {
// The for-in loop
//
// for (a in e) s;
@@ -1377,11 +1328,8 @@
// in expressionReceiver.iterator () iteratorInvoked
ir.Primitive expressionReceiver = buildExpression(this);
List<ir.Primitive> emptyArguments = <ir.Primitive>[];
- ir.Primitive iterator = addPrimitive(
- new ir.InvokeMethod(expressionReceiver,
- Selectors.iterator,
- iteratorMask,
- emptyArguments));
+ ir.Primitive iterator = addPrimitive(new ir.InvokeMethod(
+ expressionReceiver, Selectors.iterator, iteratorMask, emptyArguments));
// Fill with:
// let cont loop(x, ...) =
@@ -1391,11 +1339,8 @@
// in loop(v, ...)
JumpCollector loop = new BackwardJumpCollector(environment, target: target);
addRecursiveContinuation(loop);
- ir.Primitive condition = addPrimitive(
- new ir.InvokeMethod(iterator,
- Selectors.moveNext,
- moveNextMask,
- emptyArguments));
+ ir.Primitive condition = addPrimitive(new ir.InvokeMethod(
+ iterator, Selectors.moveNext, moveNextMask, emptyArguments));
// As a delimited term, build:
// <<BODY>> =
@@ -1410,38 +1355,31 @@
if (buildVariableDeclaration != null) {
buildVariableDeclaration(bodyBuilder);
}
- ir.Primitive currentValue = bodyBuilder.addPrimitive(
- new ir.InvokeMethod(
- iterator,
- Selectors.current,
- currentMask,
- emptyArguments,
- sourceInformation: currentSourceInformation));
+ ir.Primitive currentValue = bodyBuilder.addPrimitive(new ir.InvokeMethod(
+ iterator, Selectors.current, currentMask, emptyArguments,
+ sourceInformation: currentSourceInformation));
// TODO(johnniwinther): Extract this as a provided strategy.
if (Elements.isLocal(variableElement)) {
bodyBuilder.buildLocalVariableSet(
- variableElement,
- currentValue,
- variableSetSourceInformation);
+ variableElement, currentValue, variableSetSourceInformation);
} else if (Elements.isError(variableElement) ||
- Elements.isMalformed(variableElement)) {
+ Elements.isMalformed(variableElement)) {
Selector selector = new Selector.setter(
new Name(variableElement.name, variableElement.library));
List<ir.Primitive> value = <ir.Primitive>[currentValue];
// Note the comparison below. It can be the case that an element isError
// and isMalformed.
if (Elements.isError(variableElement)) {
- bodyBuilder.buildStaticNoSuchMethod(selector, value,
- variableSetSourceInformation);
+ bodyBuilder.buildStaticNoSuchMethod(
+ selector, value, variableSetSourceInformation);
} else {
bodyBuilder.buildErroneousInvocation(
variableElement, selector, value, variableSetSourceInformation);
}
} else if (Elements.isStaticOrTopLevel(variableElement)) {
if (variableElement.isField) {
- bodyBuilder.addPrimitive(
- new ir.SetStatic(
- variableElement, currentValue, variableSetSourceInformation));
+ bodyBuilder.addPrimitive(new ir.SetStatic(
+ variableElement, currentValue, variableSetSourceInformation));
} else {
bodyBuilder.buildStaticSetterSet(
variableElement, currentValue, variableSetSourceInformation);
@@ -1449,9 +1387,8 @@
} else {
ir.Primitive receiver = bodyBuilder.buildThis();
assert(receiver != null);
- bodyBuilder.buildDynamicSet(
- receiver, variableSelector, variableMask, currentValue,
- variableSetSourceInformation);
+ bodyBuilder.buildDynamicSet(receiver, variableSelector, variableMask,
+ currentValue, variableSetSourceInformation);
}
// Translate the body in the hole in the delimited term above, and add
@@ -1477,12 +1414,11 @@
bodyContinuation.body = bodyBuilder.root;
// Note the order of continuations: the first one is the one that will
// be filled by LetCont.plug.
- ir.LetCont branch =
- new ir.LetCont.two(exitContinuation, bodyContinuation,
- new ir.Branch.strict(condition,
- bodyContinuation,
- exitContinuation,
- conditionSourceInformation));
+ ir.LetCont branch = new ir.LetCont.two(
+ exitContinuation,
+ bodyContinuation,
+ new ir.Branch.strict(condition, bodyContinuation, exitContinuation,
+ conditionSourceInformation));
// If there are breaks in the body, then there must be a join-point
// continuation for the normal exit and the breaks. Otherwise, the
// successor is translated in the hole in the exit continuation.
@@ -1505,11 +1441,12 @@
///
/// The jump [target] is used to identify which `break` and `continue`
/// statements that have this `while` statement as their target.
- void buildWhile({SubbuildFunction buildCondition,
- SubbuildFunction buildBody,
- JumpTarget target,
- ClosureScope closureScope,
- SourceInformation sourceInformation}) {
+ void buildWhile(
+ {SubbuildFunction buildCondition,
+ SubbuildFunction buildBody,
+ JumpTarget target,
+ ClosureScope closureScope,
+ SourceInformation sourceInformation}) {
assert(isOpen);
// While loops use four named continuations: the entry to the body, the
// loop exit, the loop back edge (continue), and the loop exit (break).
@@ -1554,12 +1491,11 @@
bodyContinuation.body = bodyBuilder.root;
// Note the order of continuations: the first one is the one that will
// be filled by LetCont.plug.
- ir.LetCont branch =
- new ir.LetCont.two(exitContinuation, bodyContinuation,
- new ir.Branch.strict(condition,
- bodyContinuation,
- exitContinuation,
- sourceInformation));
+ ir.LetCont branch = new ir.LetCont.two(
+ exitContinuation,
+ bodyContinuation,
+ new ir.Branch.strict(
+ condition, bodyContinuation, exitContinuation, sourceInformation));
// If there are breaks in the body, then there must be a join-point
// continuation for the normal exit and the breaks. Otherwise, the
// successor is translated in the hole in the exit continuation.
@@ -1577,7 +1513,6 @@
}
}
-
/// Creates a do-while loop.
///
/// The body and condition are created by [buildBody] and [buildCondition].
@@ -1585,11 +1520,12 @@
/// statements in the body that have the loop as their target.
/// [closureScope] contains all the variables declared in the loop (but not
/// declared in some inner closure scope).
- void buildDoWhile({SubbuildFunction buildBody,
- SubbuildFunction buildCondition,
- JumpTarget target,
- ClosureScope closureScope,
- SourceInformation sourceInformation}) {
+ void buildDoWhile(
+ {SubbuildFunction buildBody,
+ SubbuildFunction buildCondition,
+ JumpTarget target,
+ ClosureScope closureScope,
+ SourceInformation sourceInformation}) {
assert(isOpen);
// The CPS translation of [[do body; while (condition); successor]] is:
//
@@ -1642,12 +1578,11 @@
repeatBuilder.jumpTo(loop);
repeatContinuation.body = repeatBuilder.root;
- continueBuilder.add(
- new ir.LetCont.two(exitContinuation, repeatContinuation,
- new ir.Branch.strict(condition,
- repeatContinuation,
- exitContinuation,
- sourceInformation)));
+ continueBuilder.add(new ir.LetCont.two(
+ exitContinuation,
+ repeatContinuation,
+ new ir.Branch.strict(condition, repeatContinuation, exitContinuation,
+ sourceInformation)));
continueCollector.continuation.body = continueBuilder.root;
// Construct the loop continuation (i.e., the body and condition).
@@ -1655,18 +1590,16 @@
// let cont continue(x, ...) =
// <Continue>
// in [[body]]; continue(v, ...)
- loopBuilder.add(
- new ir.LetCont(continueCollector.continuation,
- bodyBuilder.root));
+ loopBuilder
+ .add(new ir.LetCont(continueCollector.continuation, bodyBuilder.root));
// And tie it all together.
add(new ir.LetCont(breakCollector.continuation, loopBuilder.root));
environment = breakCollector.environment;
}
- void buildSimpleSwitch(JumpCollector join,
- List<SwitchCaseInfo> cases,
- SubbuildFunction buildDefaultBody) {
+ void buildSimpleSwitch(JumpCollector join, List<SwitchCaseInfo> cases,
+ SubbuildFunction buildDefaultBody) {
IrBuilder casesBuilder = makeDelimitedBuilder();
for (SwitchCaseInfo caseInfo in cases) {
ir.Primitive condition = caseInfo.buildCondition(casesBuilder);
@@ -1678,12 +1611,11 @@
// A LetCont.two term has a hole as the body of the first listed
// continuation, to be plugged by the translation. Therefore put the
// else continuation first.
- casesBuilder.add(
- new ir.LetCont.two(elseContinuation, thenContinuation,
- new ir.Branch.strict(condition,
- thenContinuation,
- elseContinuation,
- caseInfo.sourceInformation)));
+ casesBuilder.add(new ir.LetCont.two(
+ elseContinuation,
+ thenContinuation,
+ new ir.Branch.strict(condition, thenContinuation, elseContinuation,
+ caseInfo.sourceInformation)));
}
if (buildDefaultBody == null) {
@@ -1715,13 +1647,14 @@
///
/// Please see the function's implementation for where these functions are
/// called.
- void _helpBuildTryCatch(TryStatementInfo variables,
+ void _helpBuildTryCatch(
+ TryStatementInfo variables,
void enterTry(IrBuilder builder),
SubbuildFunction buildTryBlock,
void leaveTry(IrBuilder builder),
List<ir.Parameter> buildCatch(IrBuilder builder, JumpCollector join),
- void leaveTryCatch(IrBuilder builder, JumpCollector join,
- ir.Expression body)) {
+ void leaveTryCatch(
+ IrBuilder builder, JumpCollector join, ir.Expression body)) {
JumpCollector join = new ForwardJumpCollector(environment);
IrBuilder tryCatchBuilder = makeDelimitedBuilder();
@@ -1759,8 +1692,7 @@
List<ir.Parameter> catchParameters = buildCatch(catchBuilder, join);
ir.Continuation catchContinuation = new ir.Continuation(catchParameters);
catchContinuation.body = catchBuilder.root;
- tryCatchBuilder.add(
- new ir.LetHandler(catchContinuation, tryBuilder.root));
+ tryCatchBuilder.add(new ir.LetHandler(catchContinuation, tryBuilder.root));
leaveTryCatch(this, join, tryCatchBuilder.root);
}
@@ -1772,9 +1704,8 @@
/// [buildTryBlock] builds the try block.
/// [catchClauseInfos] provides access to the catch type, exception variable,
/// and stack trace variable, and a function for building the catch block.
- void buildTryCatch(TryStatementInfo variables,
- SubbuildFunction buildTryBlock,
- List<CatchClauseInfo> catchClauseInfos) {
+ void buildTryCatch(TryStatementInfo variables, SubbuildFunction buildTryBlock,
+ List<CatchClauseInfo> catchClauseInfos) {
assert(isOpen);
// Catch handlers are in scope for their body. The CPS translation of
// [[try tryBlock catch (ex, st) catchBlock; successor]] is:
@@ -1828,8 +1759,7 @@
restoreJump(builder.state.returnCollector);
}
- List<ir.Parameter> buildCatch(IrBuilder builder,
- JumpCollector join) {
+ List<ir.Parameter> buildCatch(IrBuilder builder, JumpCollector join) {
// Translate the catch clauses. Multiple clauses are translated as if
// they were explicitly cascaded if/else type tests.
@@ -1871,9 +1801,8 @@
// Expand multiple catch clauses into an explicit if/then/else. Iterate
// them in reverse so the current block becomes the next else block.
- ir.Expression catchBody = (catchAll == null)
- ? new ir.Rethrow()
- : buildCatchClause(catchAll);
+ ir.Expression catchBody =
+ (catchAll == null) ? new ir.Rethrow() : buildCatchClause(catchAll);
for (CatchClauseInfo clause in catchClauseInfos.reversed) {
ir.Continuation thenContinuation = new ir.Continuation([]);
ir.Continuation elseContinuation = new ir.Continuation([]);
@@ -1884,16 +1813,14 @@
// environment with the nested builder because this part cannot mutate
// it.
IrBuilder checkBuilder = builder.makeDelimitedBuilder(environment);
- ir.Primitive typeMatches =
- checkBuilder.buildTypeOperator(exceptionParameter,
- clause.type,
- clause.sourceInformation,
- isTypeTest: true);
- checkBuilder.add(new ir.LetCont.two(thenContinuation, elseContinuation,
- new ir.Branch.strict(typeMatches,
- thenContinuation,
- elseContinuation,
- clause.sourceInformation)));
+ ir.Primitive typeMatches = checkBuilder.buildTypeOperator(
+ exceptionParameter, clause.type, clause.sourceInformation,
+ isTypeTest: true);
+ checkBuilder.add(new ir.LetCont.two(
+ thenContinuation,
+ elseContinuation,
+ new ir.Branch.strict(typeMatches, thenContinuation,
+ elseContinuation, clause.sourceInformation)));
catchBody = checkBuilder.root;
}
builder.add(catchBody);
@@ -1901,16 +1828,16 @@
return <ir.Parameter>[exceptionParameter, traceParameter];
}
- void leaveTryCatch(IrBuilder builder, JumpCollector join,
- ir.Expression body) {
+ void leaveTryCatch(
+ IrBuilder builder, JumpCollector join, ir.Expression body) {
// Add the binding for the join-point continuation and continue the
// translation in its body.
builder.add(new ir.LetCont(join.continuation, body));
builder.environment = join.environment;
}
- _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry,
- buildCatch, leaveTryCatch);
+ _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry, buildCatch,
+ leaveTryCatch);
}
/// Translates a try/finally.
@@ -1920,8 +1847,7 @@
/// [buildTryBlock] builds the try block.
/// [buildFinallyBlock] builds the finally block.
void buildTryFinally(TryStatementInfo variables,
- SubbuildFunction buildTryBlock,
- SubbuildFunction buildFinallyBlock) {
+ SubbuildFunction buildTryBlock, SubbuildFunction buildFinallyBlock) {
assert(isOpen);
// Try/finally is implemented in terms of try/catch and by duplicating the
// code for finally at all exits. The encoding is:
@@ -1952,13 +1878,13 @@
savedContinues = builder.state.continueCollectors;
savedReturn = builder.state.returnCollector;
- builder.state.breakCollectors = newBreaks =
- savedBreaks.map(interceptJump).toList();
- builder.state.continueCollectors = newContinues =
- savedContinues.map(interceptJump).toList();
+ builder.state.breakCollectors =
+ newBreaks = savedBreaks.map(interceptJump).toList();
+ builder.state.continueCollectors =
+ newContinues = savedContinues.map(interceptJump).toList();
builder.state.returnCollector = newReturn =
new ForwardJumpCollector(environment, hasExtraArgument: true)
- ..enterTry(variables.boxedOnEntry);
+ ..enterTry(variables.boxedOnEntry);
}
void leaveTry(IrBuilder builder) {
@@ -1976,8 +1902,7 @@
builder.state.returnCollector = savedReturn;
}
- List<ir.Parameter> buildCatch(IrBuilder builder,
- JumpCollector join) {
+ List<ir.Parameter> buildCatch(IrBuilder builder, JumpCollector join) {
// The catch block of the try/catch used for try/finally is the finally
// code followed by a rethrow.
buildFinallyBlock(builder);
@@ -1988,13 +1913,13 @@
return <ir.Parameter>[new ir.Parameter(null), new ir.Parameter(null)];
}
- void leaveTryCatch(IrBuilder builder, JumpCollector join,
- ir.Expression body) {
+ void leaveTryCatch(
+ IrBuilder builder, JumpCollector join, ir.Expression body) {
// Build a list of continuations for jumps from the try block and
// duplicate the finally code before jumping to the actual target.
List<ir.Continuation> exits = <ir.Continuation>[join.continuation];
- void addJump(JumpCollector newCollector,
- JumpCollector originalCollector) {
+ void addJump(
+ JumpCollector newCollector, JumpCollector originalCollector) {
if (newCollector.isEmpty) return;
IrBuilder builder = makeDelimitedBuilder(newCollector.environment);
buildFinallyBlock(builder);
@@ -2021,8 +1946,8 @@
buildFinallyBlock(builder);
}
- _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry,
- buildCatch, leaveTryCatch);
+ _helpBuildTryCatch(variables, enterTry, buildTryBlock, leaveTry, buildCatch,
+ leaveTryCatch);
}
/// Create a return statement `return value;` or `return;` if [value] is
@@ -2041,16 +1966,14 @@
/// Generate the body for a native function [function] that is annotated with
/// an implementation in JavaScript (provided as string in [javaScriptCode]).
- void buildNativeFunctionBody(
- FunctionElement function,
- String javaScriptCode,
+ void buildNativeFunctionBody(FunctionElement function, String javaScriptCode,
SourceInformation sourceInformation) {
NativeBehavior behavior = new NativeBehavior();
behavior.sideEffects.setAllSideEffects();
// Generate a [ForeignCode] statement from the given native code.
buildForeignCode(
- js.js.statementTemplateYielding(
- new js.LiteralStatement(javaScriptCode)),
+ js.js
+ .statementTemplateYielding(new js.LiteralStatement(javaScriptCode)),
<ir.Primitive>[],
behavior,
sourceInformation);
@@ -2062,9 +1985,8 @@
/// Generates a call to the real target, which is given by [functions]'s
/// `fixedBackendName`, passing all parameters as arguments. The target can
/// be the JavaScript implementation of a function, getter, or setter.
- void buildRedirectingNativeFunctionBody(FunctionElement function,
- String name,
- SourceInformation sourceInformation) {
+ void buildRedirectingNativeFunctionBody(FunctionElement function, String name,
+ SourceInformation sourceInformation) {
List<ir.Primitive> arguments = <ir.Primitive>[];
NativeBehavior behavior = new NativeBehavior();
behavior.sideEffects.setAllSideEffects();
@@ -2084,9 +2006,8 @@
// The parameter type is a function type either directly or through
// typedef(s).
ir.Constant arity = buildIntegerConstant(type.computeArity());
- input = buildStaticFunctionInvocation(
- program.closureConverter, <ir.Primitive>[input, arity],
- sourceInformation);
+ input = buildStaticFunctionInvocation(program.closureConverter,
+ <ir.Primitive>[input, arity], sourceInformation);
}
arguments.add(input);
argumentTemplates.add('#');
@@ -2115,10 +2036,8 @@
!(value is ir.Constant && value.value.isNull);
/// Builds a call to a resolved js-interop element.
- ir.Primitive buildInvokeJsInteropMember(
- FunctionElement element,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildInvokeJsInteropMember(FunctionElement element,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
program.addNativeMethod(element);
String target = program.getJsInteropTargetPath(element);
// Strip off trailing arguments that were not specified.
@@ -2128,8 +2047,9 @@
var inputs = arguments.where(_isNotNull).toList();
var behavior = new NativeBehavior()..sideEffects.setAllSideEffects();
- DartType type = element.isConstructor ?
- element.enclosingClass.thisType : element.type.returnType;
+ DartType type = element.isConstructor
+ ? element.enclosingClass.thisType
+ : element.type.returnType;
// Native behavior effects here are similar to native/behavior.dart.
// The return type is dynamic if we don't trust js-interop type
// declarations.
@@ -2144,7 +2064,8 @@
// It also includes any other JS interop type if we don't trust the
// annotation or if is declared too broad.
- if (!program.trustJSInteropTypeAnnotations || type.isObject ||
+ if (!program.trustJSInteropTypeAnnotations ||
+ type.isObject ||
type.isDynamic) {
behavior.typesInstantiated.add(program.jsJavascriptObjectType);
}
@@ -2158,17 +2079,15 @@
var args = new List.filled(inputs.length, '#').join(',');
code = element.isConstructor ? "new $target($args)" : "$target($args)";
}
- return buildForeignCode(js.js.parseForeignJS(code),
- inputs, behavior, sourceInformation);
+ return buildForeignCode(
+ js.js.parseForeignJS(code), inputs, behavior, sourceInformation);
// TODO(sigmund): should we record the source-information here?
}
/// Builds an object literal that results from invoking a factory constructor
/// of a js-interop anonymous type.
- ir.Primitive buildJsInteropObjectLiteral(
- ConstructorElement constructor,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildJsInteropObjectLiteral(ConstructorElement constructor,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
assert(program.isJsInteropAnonymous(constructor));
program.addNativeMethod(constructor);
FunctionSignature params = constructor.functionSignature;
@@ -2178,7 +2097,7 @@
params.orderedForEachParameter((ParameterElement parameter) {
// TODO(jacobr): throw if parameter names do not match names of property
// names in the class.
- assert (parameter.isNamed);
+ assert(parameter.isNamed);
ir.Primitive argument = arguments[i++];
if (_isNotNull(argument)) {
filteredArguments.add(argument);
@@ -2220,8 +2139,7 @@
}
/// Creates a labeled statement
- void buildLabeledStatement({SubbuildFunction buildBody,
- JumpTarget target}) {
+ void buildLabeledStatement({SubbuildFunction buildBody, JumpTarget target}) {
JumpCollector join = new ForwardJumpCollector(environment, target: target);
IrBuilder innerBuilder = makeDelimitedBuilder();
innerBuilder.state.breakCollectors.add(join);
@@ -2257,8 +2175,8 @@
return buildJumpInternal(target, state.continueCollectors);
}
- bool buildJumpInternal(JumpTarget target,
- Iterable<JumpCollector> collectors) {
+ bool buildJumpInternal(
+ JumpTarget target, Iterable<JumpCollector> collectors) {
assert(isOpen);
for (JumpCollector collector in collectors) {
if (target == collector.target) {
@@ -2291,8 +2209,7 @@
/// Create a negation of [condition].
ir.Primitive buildNegation(
- ir.Primitive condition,
- SourceInformation sourceInformation) {
+ ir.Primitive condition, SourceInformation sourceInformation) {
// ! e is translated as e ? false : true
// Add a continuation parameter for the result of the expression.
@@ -2310,16 +2227,17 @@
ir.Constant falseConstant = makeBoolConstant(false);
thenContinuation.body = new ir.LetPrim(falseConstant)
- ..plug(new ir.InvokeContinuation(joinContinuation, [falseConstant]));
+ ..plug(new ir.InvokeContinuation(joinContinuation, [falseConstant]));
elseContinuation.body = new ir.LetPrim(trueConstant)
- ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
+ ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
- add(new ir.LetCont(joinContinuation,
- new ir.LetCont.two(thenContinuation, elseContinuation,
- new ir.Branch.strict(condition,
- thenContinuation,
- elseContinuation,
- sourceInformation))));
+ add(new ir.LetCont(
+ joinContinuation,
+ new ir.LetCont.two(
+ thenContinuation,
+ elseContinuation,
+ new ir.Branch.strict(condition, thenContinuation, elseContinuation,
+ sourceInformation))));
return resultParameter;
}
@@ -2376,12 +2294,11 @@
rightTrueContinuation.body = rightTrueBuilder.root;
rightFalseContinuation.body = rightFalseBuilder.root;
// The right subexpression has two continuations.
- rightBuilder.add(
- new ir.LetCont.two(rightTrueContinuation, rightFalseContinuation,
- new ir.Branch.strict(rightValue,
- rightTrueContinuation,
- rightFalseContinuation,
- sourceInformation)));
+ rightBuilder.add(new ir.LetCont.two(
+ rightTrueContinuation,
+ rightFalseContinuation,
+ new ir.Branch.strict(rightValue, rightTrueContinuation,
+ rightFalseContinuation, sourceInformation)));
// Depending on the operator, the left subexpression's continuations are
// either the right subexpression or an invocation of the join-point
// continuation.
@@ -2393,21 +2310,21 @@
leftFalseContinuation.body = emptyBuilder.root;
}
- add(new ir.LetCont(join.continuation,
- new ir.LetCont.two(leftTrueContinuation, leftFalseContinuation,
- new ir.Branch.strict(leftValue,
- leftTrueContinuation,
- leftFalseContinuation,
- sourceInformation))));
+ add(new ir.LetCont(
+ join.continuation,
+ new ir.LetCont.two(
+ leftTrueContinuation,
+ leftFalseContinuation,
+ new ir.Branch.strict(leftValue, leftTrueContinuation,
+ leftFalseContinuation, sourceInformation))));
environment = join.environment;
return environment.discard(1);
}
ir.Primitive buildIdentical(ir.Primitive x, ir.Primitive y,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
return addPrimitive(new ir.ApplyBuiltinOperator(
- ir.BuiltinOperator.Identical, <ir.Primitive>[x, y],
- sourceInformation));
+ ir.BuiltinOperator.Identical, <ir.Primitive>[x, y], sourceInformation));
}
/// Called when entering a nested function with free variables.
@@ -2428,8 +2345,8 @@
} else {
// Unboxed variables are loaded from the function object immediately.
// This includes BoxLocals which are themselves unboxed variables.
- environment.extend(local,
- addPrimitive(new ir.GetField(thisPrim, location.field)));
+ environment.extend(
+ local, addPrimitive(new ir.GetField(thisPrim, location.field)));
}
});
@@ -2482,9 +2399,7 @@
ClosureLocation location = state.boxedVariables[parameterElement];
if (location != null) {
addPrimitive(new ir.SetField(
- environment.lookup(location.box),
- location.field,
- parameter));
+ environment.lookup(location.box), location.field, parameter));
} else {
environment.extend(parameterElement, parameter);
}
@@ -2499,7 +2414,7 @@
}
void declareLocalVariable(LocalElement variableElement,
- {ir.Primitive initialValue}) {
+ {ir.Primitive initialValue}) {
assert(isOpen);
if (initialValue == null) {
initialValue = buildNullConstant();
@@ -2507,13 +2422,9 @@
ClosureLocation location = state.boxedVariables[variableElement];
if (location != null) {
addPrimitive(new ir.SetField(
- environment.lookup(location.box),
- location.field,
- initialValue));
+ environment.lookup(location.box), location.field, initialValue));
} else if (isInMutableVariable(variableElement)) {
- add(new ir.LetMutable(
- getMutableVariable(variableElement),
- initialValue));
+ add(new ir.LetMutable(getMutableVariable(variableElement), initialValue));
} else {
initialValue.useElementAsHint(variableElement);
environment.extend(variableElement, initialValue);
@@ -2521,16 +2432,17 @@
}
/// Add [functionElement] to the environment with provided [definition].
- void declareLocalFunction(LocalFunctionElement functionElement,
- closure.ClosureClassElement classElement,
- SourceInformation sourceInformation) {
+ void declareLocalFunction(
+ LocalFunctionElement functionElement,
+ closure.ClosureClassElement classElement,
+ SourceInformation sourceInformation) {
ir.Primitive closure =
- buildFunctionExpression(classElement, sourceInformation);
+ buildFunctionExpression(classElement, sourceInformation);
declareLocalVariable(functionElement, initialValue: closure);
}
ir.Primitive buildFunctionExpression(closure.ClosureClassElement classElement,
- SourceInformation sourceInformation) {
+ SourceInformation sourceInformation) {
List<ir.Primitive> arguments = <ir.Primitive>[];
for (closure.ClosureFieldElement field in classElement.closureFields) {
// Captured 'this' and type variables are not always available as locals
@@ -2552,22 +2464,19 @@
/// Create a read access of [local] function, variable, or parameter.
// TODO(johnniwinther): Make [sourceInformation] mandatory.
- ir.Primitive buildLocalGet(
- LocalElement local,
+ ir.Primitive buildLocalGet(LocalElement local,
{SourceInformation sourceInformation}) {
assert(isOpen);
ClosureLocation location = state.boxedVariables[local];
if (location != null) {
ir.Primitive result = new ir.GetField(
- environment.lookup(location.box),
- location.field,
+ environment.lookup(location.box), location.field,
sourceInformation: sourceInformation);
result.useElementAsHint(local);
return addPrimitive(result);
} else if (isInMutableVariable(local)) {
- return addPrimitive(
- new ir.GetMutable(
- getMutableVariable(local), sourceInformation: sourceInformation));
+ return addPrimitive(new ir.GetMutable(getMutableVariable(local),
+ sourceInformation: sourceInformation));
} else {
return environment.lookup(local);
}
@@ -2575,22 +2484,16 @@
/// Create a write access to [local] variable or parameter with the provided
/// [value].
- ir.Primitive buildLocalVariableSet(
- LocalElement local,
- ir.Primitive value,
+ ir.Primitive buildLocalVariableSet(LocalElement local, ir.Primitive value,
SourceInformation sourceInformation) {
assert(isOpen);
ClosureLocation location = state.boxedVariables[local];
if (location != null) {
addPrimitive(new ir.SetField(
- environment.lookup(location.box),
- location.field,
- value,
+ environment.lookup(location.box), location.field, value,
sourceInformation: sourceInformation));
} else if (isInMutableVariable(local)) {
- addPrimitive(new ir.SetMutable(
- getMutableVariable(local),
- value,
+ addPrimitive(new ir.SetMutable(getMutableVariable(local), value,
sourceInformation: sourceInformation));
} else {
value.useElementAsHint(local);
@@ -2603,8 +2506,8 @@
///
/// The loop variables will subsequently be declared using
/// [declareLocalVariable].
- void _enterForLoopInitializer(ClosureScope scope,
- List<LocalElement> loopVariables) {
+ void _enterForLoopInitializer(
+ ClosureScope scope, List<LocalElement> loopVariables) {
if (scope == null) return;
// If there are no boxed loop variables, don't create the box here, let
// it be created inside the body instead.
@@ -2613,8 +2516,7 @@
}
/// Called before building the body of a for-loop.
- void _enterForLoopBody(ClosureScope scope,
- List<LocalElement> loopVariables) {
+ void _enterForLoopBody(ClosureScope scope, List<LocalElement> loopVariables) {
if (scope == null) return;
// If there are boxed loop variables, the box has already been created
// at the initializer.
@@ -2623,8 +2525,8 @@
}
/// Called before building the update of a for-loop.
- void _enterForLoopUpdate(ClosureScope scope,
- List<LocalElement> loopVariables) {
+ void _enterForLoopUpdate(
+ ClosureScope scope, List<LocalElement> loopVariables) {
if (scope == null) return;
// If there are no boxed loop variables, then the box is created inside the
// body, so there is no need to explicitly renew it.
@@ -2650,38 +2552,29 @@
return state.thisParameter;
}
- ir.Primitive buildFieldGet(
- ir.Primitive receiver,
- FieldElement target,
+ ir.Primitive buildFieldGet(ir.Primitive receiver, FieldElement target,
SourceInformation sourceInformation) {
return addPrimitive(new ir.GetField(receiver, target,
sourceInformation: sourceInformation,
isFinal: program.fieldNeverChanges(target)));
}
- void buildFieldSet(ir.Primitive receiver,
- FieldElement target,
- ir.Primitive value,
- SourceInformation sourceInformation) {
- addPrimitive(new ir.SetField(
- receiver, target, value, sourceInformation: sourceInformation));
+ void buildFieldSet(ir.Primitive receiver, FieldElement target,
+ ir.Primitive value, SourceInformation sourceInformation) {
+ addPrimitive(new ir.SetField(receiver, target, value,
+ sourceInformation: sourceInformation));
}
ir.Primitive buildSuperFieldGet(
- FieldElement target,
- SourceInformation sourceInformation) {
- return addPrimitive(
- new ir.GetField(
- buildThis(), target, sourceInformation: sourceInformation));
+ FieldElement target, SourceInformation sourceInformation) {
+ return addPrimitive(new ir.GetField(buildThis(), target,
+ sourceInformation: sourceInformation));
}
- ir.Primitive buildSuperFieldSet(
- FieldElement target,
- ir.Primitive value,
+ ir.Primitive buildSuperFieldSet(FieldElement target, ir.Primitive value,
SourceInformation sourceInformation) {
- addPrimitive(
- new ir.SetField(
- buildThis(), target, value, sourceInformation: sourceInformation));
+ addPrimitive(new ir.SetField(buildThis(), target, value,
+ sourceInformation: sourceInformation));
return value;
}
@@ -2690,8 +2583,8 @@
/// The header for a constructor body differs from other functions in that
/// some parameters are already boxed, and the box is passed as an argument
/// instead of being created in the header.
- void buildConstructorBodyHeader(Iterable<Local> parameters,
- ClosureScope closureScope) {
+ void buildConstructorBodyHeader(
+ Iterable<Local> parameters, ClosureScope closureScope) {
_createThisParameter();
for (Local param in parameters) {
ir.Parameter parameter = _createLocalParameter(param);
@@ -2731,8 +2624,7 @@
? buildNullConstant()
: buildTypeExpression(argument);
});
- arguments = new List<ir.Primitive>.from(arguments)
- ..addAll(typeArguments);
+ arguments = new List<ir.Primitive>.from(arguments)..addAll(typeArguments);
}
return addPrimitive(new ir.InvokeConstructor(
type, element, selector, arguments, sourceInformation,
@@ -2749,8 +2641,8 @@
ir.Primitive value = buildTypeVariableAccess(variable);
arguments.add(value);
});
- return addPrimitive(new ir.TypeExpression(ir.TypeExpressionKind.COMPLETE,
- type, arguments));
+ return addPrimitive(new ir.TypeExpression(
+ ir.TypeExpressionKind.COMPLETE, type, arguments));
} else if (type.treatAsDynamic) {
return buildNullConstant();
} else {
@@ -2766,7 +2658,7 @@
/// corresponding type argument (field initializers are evaluated before the
/// receiver object is created).
ir.Primitive buildTypeVariableAccess(TypeVariableType variable,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
// If the local exists in the environment, use that.
// This is put here when we are inside a constructor or field initializer,
// (or possibly a closure inside one of these).
@@ -2791,25 +2683,26 @@
}
/// Reifies the value of [variable] on the current receiver object.
- ir.Primitive buildReifyTypeVariable(TypeVariableType variable,
- SourceInformation sourceInformation) {
+ ir.Primitive buildReifyTypeVariable(
+ TypeVariableType variable, SourceInformation sourceInformation) {
ir.Primitive typeArgument =
buildTypeVariableAccess(variable, sourceInformation: sourceInformation);
return addPrimitive(
new ir.ReifyRuntimeType(typeArgument, sourceInformation));
}
- ir.Primitive buildInvocationMirror(Selector selector,
- List<ir.Primitive> arguments) {
+ ir.Primitive buildInvocationMirror(
+ Selector selector, List<ir.Primitive> arguments) {
return addPrimitive(new ir.CreateInvocationMirror(selector, arguments));
}
- ir.Primitive buildForeignCode(js.Template codeTemplate,
- List<ir.Primitive> arguments,
- NativeBehavior behavior,
- SourceInformation sourceInformation,
- {Element dependency,
- TypeMask type}) {
+ ir.Primitive buildForeignCode(
+ js.Template codeTemplate,
+ List<ir.Primitive> arguments,
+ NativeBehavior behavior,
+ SourceInformation sourceInformation,
+ {Element dependency,
+ TypeMask type}) {
assert(behavior != null);
if (type == null) {
type = program.getTypeMaskForForeign(behavior);
@@ -2822,11 +2715,7 @@
return addPrimitive(new ir.Refinement(arguments.single, type));
}
ir.Primitive result = addPrimitive(new ir.ForeignCode(
- codeTemplate,
- type,
- arguments,
- behavior,
- sourceInformation,
+ codeTemplate, type, arguments, behavior, sourceInformation,
dependency: dependency));
if (!codeTemplate.isExpression) {
// Close the term if this is a "throw" expression or native body.
@@ -2837,10 +2726,9 @@
}
/// Creates a type test or type cast of [value] against [type].
- ir.Primitive buildTypeOperator(ir.Primitive value,
- DartType type,
- SourceInformation sourceInformation,
- {bool isTypeTest}) {
+ ir.Primitive buildTypeOperator(
+ ir.Primitive value, DartType type, SourceInformation sourceInformation,
+ {bool isTypeTest}) {
assert(isOpen);
assert(isTypeTest != null);
@@ -2849,10 +2737,8 @@
if (type.isMalformed) {
ErroneousElement element = type.element;
ir.Primitive message = buildStringConstant(element.message);
- return buildStaticFunctionInvocation(
- program.throwTypeErrorHelper,
- <ir.Primitive>[message],
- sourceInformation);
+ return buildStaticFunctionInvocation(program.throwTypeErrorHelper,
+ <ir.Primitive>[message], sourceInformation);
}
List<ir.Primitive> typeArguments = const <ir.Primitive>[];
@@ -2891,11 +2777,11 @@
/// expression whose result is either [value] if [value] is not null, or
/// `right` if [value] is null. Only when [value] is null, [buildRight] is
/// evaluated to produce the `right` value.
- ir.Primitive buildIfNull(ir.Primitive value,
- ir.Primitive buildRight(IrBuilder builder),
- SourceInformation sourceInformation) {
- ir.Primitive condition =
- _buildCheckNull(value, sourceInformation);
+ ir.Primitive buildIfNull(
+ ir.Primitive value,
+ ir.Primitive buildRight(IrBuilder builder),
+ SourceInformation sourceInformation) {
+ ir.Primitive condition = _buildCheckNull(value, sourceInformation);
return buildConditional(
condition, buildRight, (_) => value, sourceInformation);
}
@@ -2903,18 +2789,18 @@
/// Create a conditional send. This is equivalent to a conditional expression
/// that checks if [receiver] is null, if so, it returns null, otherwise it
/// evaluates the [buildSend] expression.
- ir.Primitive buildIfNotNullSend(ir.Primitive receiver,
- ir.Primitive buildSend(IrBuilder builder),
- SourceInformation sourceInformation) {
- ir.Primitive condition =
- _buildCheckNull(receiver, sourceInformation);
+ ir.Primitive buildIfNotNullSend(
+ ir.Primitive receiver,
+ ir.Primitive buildSend(IrBuilder builder),
+ SourceInformation sourceInformation) {
+ ir.Primitive condition = _buildCheckNull(receiver, sourceInformation);
return buildConditional(
condition, (_) => receiver, buildSend, sourceInformation);
}
/// Creates a type test checking whether [value] is null.
- ir.Primitive _buildCheckNull(ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive _buildCheckNull(
+ ir.Primitive value, SourceInformation sourceInformation) {
assert(isOpen);
return buildIdentical(value, buildNullConstant(),
sourceInformation: sourceInformation);
@@ -3017,11 +2903,12 @@
final SubbuildFunction buildCatchBlock;
final SourceInformation sourceInformation;
- CatchClauseInfo({this.type,
- this.exceptionVariable,
- this.stackTraceVariable,
- this.buildCatchBlock,
- this.sourceInformation});
+ CatchClauseInfo(
+ {this.type,
+ this.exceptionVariable,
+ this.stackTraceVariable,
+ this.buildCatchBlock,
+ this.sourceInformation});
}
class SwitchCaseInfo {
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
index 1afb9d3..e9d1845 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_builder_task.dart
@@ -6,45 +6,32 @@
import '../closure.dart' as closure;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers,
- Names,
- Selectors;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/names.dart' show Identifiers, Names, Selectors;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../constants/expressions.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- SynthesizedConstructorElementX,
- ConstructorBodyElementX,
- FunctionSignatureX;
+import '../elements/modelx.dart'
+ show
+ SynthesizedConstructorElementX,
+ ConstructorBodyElementX,
+ FunctionSignatureX;
import '../io/source_information.dart';
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
-import '../js_backend/js_backend.dart' show
- JavaScriptBackend,
- SyntheticConstantKind;
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
+import '../js_backend/js_backend.dart'
+ show JavaScriptBackend, SyntheticConstantKind;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../resolution/semantic_visitor.dart';
import '../resolution/operators.dart' as op;
import '../tree/tree.dart' as ast;
-import '../types/types.dart' show
- TypeMask;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../constants/values.dart' show
- ConstantValue;
+import '../types/types.dart' show TypeMask;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../constants/values.dart' show ConstantValue;
import 'cps_ir_nodes.dart' as ir;
import 'cps_ir_builder.dart';
-import '../native/native.dart' show
- NativeBehavior,
- HasCapturedPlaceholders;
+import '../native/native.dart' show NativeBehavior, HasCapturedPlaceholders;
// TODO(karlklose): remove.
import '../js/js.dart' as js show js, Template, Expression, Name;
@@ -54,8 +41,7 @@
import 'package:js_runtime/shared/embedded_names.dart'
show JsBuiltin, JsGetName;
import '../constants/values.dart';
-import 'type_mask_system.dart' show
- TypeMaskSystem;
+import 'type_mask_system.dart' show TypeMaskSystem;
typedef void IrBuilderCallback(Element element, ir.FunctionDefinition irNode);
@@ -88,8 +74,8 @@
String get name => 'CPS builder';
- ir.FunctionDefinition buildNode(AstElement element,
- TypeMaskSystem typeMaskSystem) {
+ ir.FunctionDefinition buildNode(
+ AstElement element, TypeMaskSystem typeMaskSystem) {
return measure(() {
bailoutMessage = null;
@@ -99,10 +85,8 @@
SourceInformationBuilder sourceInformationBuilder =
sourceInformationStrategy.createBuilderForContext(element);
- IrBuilderVisitor builder =
- new IrBuilderVisitor(
- elementsMapping, compiler, sourceInformationBuilder,
- typeMaskSystem);
+ IrBuilderVisitor builder = new IrBuilderVisitor(elementsMapping,
+ compiler, sourceInformationBuilder, typeMaskSystem);
ir.FunctionDefinition irNode = builder.buildExecutable(element);
if (irNode == null) {
bailoutMessage = builder.bailoutMessage;
@@ -125,18 +109,19 @@
/// For statements, `null` is returned.
// TODO(johnniwinther): Implement [SemanticDeclVisitor].
class IrBuilderVisitor extends ast.Visitor<ir.Primitive>
- with IrBuilderMixin<ast.Node>,
- SemanticSendResolvedMixin<ir.Primitive, dynamic>,
- ErrorBulkMixin<ir.Primitive, dynamic>,
- BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfNewMixin<ir.Primitive, dynamic>,
- BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfSetIfNullsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>,
- BaseImplementationOfSuperIndexSetIfNullMixin<ir.Primitive, dynamic>
+ with
+ IrBuilderMixin<ast.Node>,
+ SemanticSendResolvedMixin<ir.Primitive, dynamic>,
+ ErrorBulkMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfStaticsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfLocalsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfDynamicsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfConstantsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfNewMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfCompoundsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfSetIfNullsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfIndexCompoundsMixin<ir.Primitive, dynamic>,
+ BaseImplementationOfSuperIndexSetIfNullMixin<ir.Primitive, dynamic>
implements SemanticSendVisitor<ir.Primitive, dynamic> {
final TreeElements elements;
final Compiler compiler;
@@ -170,10 +155,8 @@
// arguments, and what the arguments are.
/// Construct a top-level visitor.
- IrBuilderVisitor(this.elements,
- this.compiler,
- this.sourceInformationBuilder,
- this.typeMaskSystem);
+ IrBuilderVisitor(this.elements, this.compiler, this.sourceInformationBuilder,
+ this.typeMaskSystem);
JavaScriptBackend get backend => compiler.backend;
BackendHelpers get helpers => backend.helpers;
@@ -209,11 +192,8 @@
/// Returns the [ClosureScope] for any function, possibly different from the
/// one currently being built.
ClosureScope getClosureScopeForFunction(FunctionElement function) {
- closure.ClosureClassMap map =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- function,
- function.node,
- elements);
+ closure.ClosureClassMap map = compiler.closureToClassMapper
+ .computeClosureToClassMapping(function, function.node, elements);
return new ClosureScope(map.capturingScopes[function.node]);
}
@@ -226,9 +206,7 @@
IrBuilder getBuilderFor(Element element) {
return new IrBuilder(
- new GlobalProgramInformation(compiler),
- backend.constants,
- element);
+ new GlobalProgramInformation(compiler), backend.constants, element);
}
/// Builds the [ir.FunctionDefinition] for an executable element. In case the
@@ -297,8 +275,8 @@
ClassElement clazz = type.element;
assert(clazz.typeVariables.length == type.typeArguments.length);
for (int i = 0; i < clazz.typeVariables.length; ++i) {
- irBuilder.declareTypeVariable(clazz.typeVariables[i],
- type.typeArguments[i]);
+ irBuilder.declareTypeVariable(
+ clazz.typeVariables[i], type.typeArguments[i]);
}
loadTypeVariablesForSuperClasses(clazz);
}
@@ -338,7 +316,7 @@
// Create origin body element for patched constructors.
ConstructorBodyElementX patch = bodyElement;
ConstructorBodyElementX origin =
- new ConstructorBodyElementX(constructor.origin);
+ new ConstructorBodyElementX(constructor.origin);
origin.applyPatch(patch);
classElement.origin.addBackendMember(bodyElement.origin);
}
@@ -402,8 +380,8 @@
backend.isNativeOrExtendsNative(classElement)) {
parameters.add(new ExplicitReceiverParameter(constructor));
}
- constructor.functionSignature.orderedForEachParameter(
- (ParameterElement p) => parameters.add(p));
+ constructor.functionSignature
+ .orderedForEachParameter((ParameterElement p) => parameters.add(p));
int firstTypeArgumentParameterIndex;
@@ -486,14 +464,14 @@
}
} else {
instance = new ir.CreateInstance(
- classElement,
- instanceArguments,
- typeInformation,
- constructor.hasNode
- ? sourceInformationBuilder.buildCreate(constructor.node)
- // TODO(johnniwinther): Provide source information for creation
- // through synthetic constructors.
- : null);
+ classElement,
+ instanceArguments,
+ typeInformation,
+ constructor.hasNode
+ ? sourceInformationBuilder.buildCreate(constructor.node)
+ // TODO(johnniwinther): Provide source information for creation
+ // through synthetic constructors.
+ : null);
irBuilder.add(new ir.LetPrim(instance));
}
@@ -505,8 +483,8 @@
for (Local param in getConstructorBodyParameters(bodyElement)) {
bodyArguments.add(irBuilder.environment.lookup(param));
}
- Selector selector = new Selector.call(target.memberName,
- new CallStructure(bodyArguments.length));
+ Selector selector = new Selector.call(
+ target.memberName, new CallStructure(bodyArguments.length));
irBuilder.addPrimitive(new ir.InvokeMethodDirectly(
instance, bodyElement, selector, bodyArguments, null));
}
@@ -515,7 +493,7 @@
irBuilder.buildReturn(
value: instance,
sourceInformation:
- sourceInformationBuilder.buildImplicitReturn(constructor));
+ sourceInformationBuilder.buildImplicitReturn(constructor));
return irBuilder.makeFunctionDefinition(
sourceInformationBuilder.buildVariableDeclaration());
@@ -527,11 +505,8 @@
/// Every visitor can only be applied to nodes in one context, because
/// the [elements] field is specific to that context.
IrBuilderVisitor makeVisitorForContext(AstElement context) {
- return new IrBuilderVisitor(
- context.resolvedAst.elements,
- compiler,
- sourceInformationBuilder.forContext(context),
- typeMaskSystem);
+ return new IrBuilderVisitor(context.resolvedAst.elements, compiler,
+ sourceInformationBuilder.forContext(context), typeMaskSystem);
}
/// Builds the IR for an [expression] taken from a different [context].
@@ -550,8 +525,7 @@
Map<FieldElement, ir.Primitive> fieldValues) {
assert(constructor.enclosingClass.implementation.isMixinApplication);
assert(constructor.isSynthesized);
- ConstructorElement target =
- constructor.definingConstructor.implementation;
+ ConstructorElement target = constructor.definingConstructor.implementation;
// The resolver gives us the exact same FunctionSignature for the two
// constructors. The parameters for the synthesized constructor
// are already in the environment, so the target constructor's parameters
@@ -568,8 +542,7 @@
///
/// Defaults for optional arguments are evaluated in order to ensure
/// all parameters are available in the environment.
- void loadArguments(ConstructorElement target,
- CallStructure call,
+ void loadArguments(ConstructorElement target, CallStructure call,
List<ir.Primitive> arguments) {
assert(target.isImplementation);
assert(target == elements.analyzedElement);
@@ -676,8 +649,8 @@
return;
}
// Evaluate initializing parameters, e.g. `Foo(this.x)`.
- constructor.functionSignature.orderedForEachParameter(
- (ParameterElement parameter) {
+ constructor.functionSignature
+ .orderedForEachParameter((ParameterElement parameter) {
if (parameter.isInitializingFormal) {
InitializingFormalElement fieldParameter = parameter;
fieldValues[fieldParameter.fieldElement] =
@@ -688,7 +661,7 @@
ast.FunctionExpression node = constructor.node;
bool hasConstructorCall = false; // Has this() or super() initializer?
if (node != null && node.initializers != null) {
- for(ast.Node initializer in node.initializers) {
+ for (ast.Node initializer in node.initializers) {
if (initializer is ast.SendSet) {
// Field initializer.
FieldElement field = elements[initializer];
@@ -699,15 +672,11 @@
Selector selector = elements.getSelector(initializer);
List<ir.Primitive> arguments = initializer.arguments.mapToList(visit);
evaluateConstructorCallFromInitializer(
- target,
- selector.callStructure,
- arguments,
- supers,
- fieldValues);
+ target, selector.callStructure, arguments, supers, fieldValues);
hasConstructorCall = true;
} else {
- reporter.internalError(initializer,
- "Unexpected initializer type $initializer");
+ reporter.internalError(
+ initializer, "Unexpected initializer type $initializer");
}
}
}
@@ -720,11 +689,7 @@
}
target = target.implementation;
evaluateConstructorCallFromInitializer(
- target,
- CallStructure.NO_ARGS,
- const [],
- supers,
- fieldValues);
+ target, CallStructure.NO_ARGS, const [], supers, fieldValues);
}
// Add this constructor after the superconstructors.
supers.add(constructor);
@@ -748,11 +713,8 @@
ir.FunctionDefinition buildConstructorBody(ConstructorBodyElement body) {
ConstructorElement constructor = body.constructor;
ast.FunctionExpression node = constructor.node;
- closureClassMap =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- constructor,
- node,
- elements);
+ closureClassMap = compiler.closureToClassMapper
+ .computeClosureToClassMapping(constructor, node, elements);
// We compute variables boxed in mutable variables on entry to each try
// block, not including variables captured by a closure (which are boxed
@@ -766,8 +728,8 @@
IrBuilder builder = getBuilderFor(body);
return withBuilder(builder, () {
- irBuilder.buildConstructorBodyHeader(getConstructorBodyParameters(body),
- getClosureScopeForNode(node));
+ irBuilder.buildConstructorBodyHeader(
+ getConstructorBodyParameters(body), getClosureScopeForNode(node));
visit(node.body);
return irBuilder.makeFunctionDefinition(
sourceInformationBuilder.buildVariableDeclaration());
@@ -782,27 +744,21 @@
assert(node != null);
assert(elements[node] != null);
- closureClassMap =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- element,
- node,
- elements);
+ closureClassMap = compiler.closureToClassMapper
+ .computeClosureToClassMapping(element, node, elements);
TryBoxedVariables variables = _analyzeTryBoxedVariables(node);
tryStatements = variables.tryStatements;
IrBuilder builder = getBuilderFor(element);
- return withBuilder(builder,
- () => _makeFunctionBody(builder, element, node));
+ return withBuilder(
+ builder, () => _makeFunctionBody(builder, element, node));
}
ir.FunctionDefinition buildStaticFieldInitializer(FieldElement element) {
if (!backend.constants.lazyStatics.contains(element)) {
return null; // Nothing to do.
}
- closureClassMap =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- element,
- element.node,
- elements);
+ closureClassMap = compiler.closureToClassMapper
+ .computeClosureToClassMapping(element, element.node, elements);
IrBuilder builder = getBuilderFor(element);
return withBuilder(builder, () {
irBuilder.buildFunctionHeader(<Local>[]);
@@ -812,7 +768,7 @@
irBuilder.buildReturn(
value: initialValue,
sourceInformation:
- sourceInformationBuilder.buildReturn(sendSet.assignmentOperator));
+ sourceInformationBuilder.buildReturn(sendSet.assignmentOperator));
return irBuilder.makeFunctionDefinition(
sourceInformationBuilder.buildVariableDeclaration());
});
@@ -847,8 +803,7 @@
/// appear in a canonical order. A [CallStructure] reflecting this order
/// is returned.
CallStructure normalizeStaticArguments(CallStructure callStructure,
- FunctionElement target,
- List<ir.Primitive> arguments) {
+ FunctionElement target, List<ir.Primitive> arguments) {
target = target.implementation;
FunctionSignature signature = target.functionSignature;
if (!signature.optionalParametersAreNamed &&
@@ -877,7 +832,8 @@
// value in the temporary list, otherwise the default value.
signature.orderedOptionalParameters.forEach((ParameterElement element) {
int nameIndex = callStructure.namedArguments.indexOf(element.name);
- arguments.add(nameIndex == -1 ? translateDefaultValue(element)
+ arguments.add(nameIndex == -1
+ ? translateDefaultValue(element)
: namedArguments[nameIndex]);
normalizedNames.add(element.name);
});
@@ -890,8 +846,8 @@
/// list [arguments] is normalized by sorting it in place so that the named
/// arguments appear in a canonical order. A [CallStructure] reflecting this
/// order is returned.
- CallStructure normalizeDynamicArguments(CallStructure callStructure,
- List<ir.Primitive> arguments) {
+ CallStructure normalizeDynamicArguments(
+ CallStructure callStructure, List<ir.Primitive> arguments) {
assert(arguments.length == callStructure.argumentCount);
if (callStructure.namedArguments.isEmpty) return callStructure;
int destinationIndex = callStructure.positionalArgumentCount;
@@ -900,8 +856,8 @@
int sourceIndex = callStructure.namedArguments.indexOf(argName);
arguments[destinationIndex++] = namedArguments[sourceIndex];
}
- return new CallStructure(callStructure.argumentCount,
- callStructure.getOrderedNamedArguments());
+ return new CallStructure(
+ callStructure.argumentCount, callStructure.getOrderedNamedArguments());
}
/// Read the value of [field].
@@ -922,9 +878,7 @@
}
ir.FunctionDefinition _makeFunctionBody(
- IrBuilder builder,
- FunctionElement element,
- ast.FunctionExpression node) {
+ IrBuilder builder, FunctionElement element, ast.FunctionExpression node) {
FunctionSignature signature = element.functionSignature;
List<Local> parameters = <Local>[];
signature.orderedForEachParameter(
@@ -943,8 +897,8 @@
}
irBuilder.buildFunctionHeader(parameters,
- closureScope: getClosureScopeForNode(node),
- env: getClosureEnvironment());
+ closureScope: getClosureScopeForNode(node),
+ env: getClosureEnvironment());
if (element == helpers.jsArrayTypedConstructor) {
// Generate a body for JSArray<E>.typed(allocation):
@@ -965,21 +919,23 @@
ir.Primitive typeInformation = irBuilder.addPrimitive(
new ir.TypeExpression(ir.TypeExpressionKind.INSTANCE,
- element.enclosingClass.thisType,
- <ir.Primitive>[typeArgument]));
+ element.enclosingClass.thisType, <ir.Primitive>[typeArgument]));
MethodElement helper = helpers.setRuntimeTypeInfo;
CallStructure callStructure = CallStructure.TWO_ARGS;
Selector selector = new Selector.call(helper.memberName, callStructure);
allocation = irBuilder.buildInvokeStatic(
- helper, selector, <ir.Primitive>[allocation, typeInformation],
+ helper,
+ selector,
+ <ir.Primitive>[allocation, typeInformation],
sourceInformationBuilder.buildGeneric(node));
}
ir.Primitive refinement = irBuilder.addPrimitive(
new ir.Refinement(allocation, typeMaskSystem.arrayType));
- irBuilder.buildReturn(value: refinement,
+ irBuilder.buildReturn(
+ value: refinement,
sourceInformation:
sourceInformationBuilder.buildImplicitReturn(element));
} else {
@@ -999,15 +955,15 @@
}
ir.Primitive visitFunctionExpression(ast.FunctionExpression node) {
- return irBuilder.buildFunctionExpression(makeSubFunction(node),
- sourceInformationBuilder.buildCreate(node));
+ return irBuilder.buildFunctionExpression(
+ makeSubFunction(node), sourceInformationBuilder.buildCreate(node));
}
visitFunctionDeclaration(ast.FunctionDeclaration node) {
LocalFunctionElement element = elements[node.function];
Object inner = makeSubFunction(node.function);
- irBuilder.declareLocalFunction(element, inner,
- sourceInformationBuilder.buildCreate(node.function));
+ irBuilder.declareLocalFunction(
+ element, inner, sourceInformationBuilder.buildCreate(node.function));
}
// ## Statements ##
@@ -1078,10 +1034,9 @@
});
ClassElement cls = redirectingConstructor.enclosingClass;
InterfaceType targetType =
- redirectingConstructor.computeEffectiveTargetType(cls.thisType);
- CallStructure callStructure = new CallStructure(
- redirectingSignature.parameterCount,
- namedParameters);
+ redirectingConstructor.computeEffectiveTargetType(cls.thisType);
+ CallStructure callStructure =
+ new CallStructure(redirectingSignature.parameterCount, namedParameters);
callStructure =
normalizeStaticArguments(callStructure, targetConstructor, arguments);
ir.Primitive instance = irBuilder.buildConstructorInvocation(
@@ -1117,11 +1072,8 @@
}
visitIf(ast.If node) {
- irBuilder.buildIf(
- build(node.condition),
- subbuild(node.thenPart),
- subbuild(node.elsePart),
- sourceInformationBuilder.buildIf(node));
+ irBuilder.buildIf(build(node.condition), subbuild(node.thenPart),
+ subbuild(node.elsePart), sourceInformationBuilder.buildIf(node));
}
visitLabeledStatement(ast.LabeledStatement node) {
@@ -1131,8 +1083,7 @@
} else {
JumpTarget target = elements.getTargetDefinition(body);
irBuilder.buildLabeledStatement(
- buildBody: subbuild(body),
- target: target);
+ buildBody: subbuild(body), target: target);
}
}
@@ -1208,7 +1159,7 @@
irBuilder.buildLocalVariableSet(
variable, current, sourceInformation);
} else if (Elements.isError(variable) ||
- Elements.isMalformed(variable)) {
+ Elements.isMalformed(variable)) {
Selector selector =
new Selector.setter(new Name(variable.name, variable.library));
List<ir.Primitive> args = <ir.Primitive>[current];
@@ -1259,8 +1210,8 @@
return builder.addPrimitive(new ir.Await(cancellation));
}
- irBuilder.buildTryFinally(new TryStatementInfo(), buildTryBody,
- buildFinallyBody);
+ irBuilder.buildTryFinally(
+ new TryStatementInfo(), buildTryBody, buildFinallyBody);
}
visitAwait(ast.Await node) {
@@ -1292,16 +1243,16 @@
variableSelector: selector,
variableMask: elements.getTypeMask(identifier),
variableSetSourceInformation:
- sourceInformationBuilder.buildForInSet(node),
+ sourceInformationBuilder.buildForInSet(node),
currentMask: elements.getCurrentTypeMask(node),
currentSourceInformation:
- sourceInformationBuilder.buildForInCurrent(node),
+ sourceInformationBuilder.buildForInCurrent(node),
moveNextMask: elements.getMoveNextTypeMask(node),
moveNextSourceInformation:
- sourceInformationBuilder.buildForInMoveNext(node),
+ sourceInformationBuilder.buildForInMoveNext(node),
iteratorMask: elements.getIteratorTypeMask(node),
iteratorSourceInformation:
- sourceInformationBuilder.buildForInIterator(node),
+ sourceInformationBuilder.buildForInIterator(node),
buildBody: subbuild(node.body),
target: elements.getTargetDefinition(node),
closureScope: getClosureScopeForNode(node));
@@ -1359,13 +1310,13 @@
if (nativeBody != null) {
ast.LiteralString jsCode = nativeBody.asLiteralString();
String javaScriptCode = jsCode.dartString.slowToString();
- assert(invariant(nativeBody,
- !nativeRedirectionRegExp.hasMatch(javaScriptCode),
- message: "Deprecated syntax, use @JSName('name') instead."));
- assert(invariant(nativeBody,
- function.functionSignature.parameterCount == 0,
+ assert(invariant(
+ nativeBody, !nativeRedirectionRegExp.hasMatch(javaScriptCode),
+ message: "Deprecated syntax, use @JSName('name') instead."));
+ assert(invariant(
+ nativeBody, function.functionSignature.parameterCount == 0,
message: 'native "..." syntax is restricted to '
- 'functions with zero parameters.'));
+ 'functions with zero parameters.'));
irBuilder.buildNativeFunctionBody(function, javaScriptCode,
sourceInformationBuilder.buildForeignCode(node));
} else {
@@ -1374,8 +1325,7 @@
}
} else {
irBuilder.buildReturn(
- value: build(node.expression),
- sourceInformation: source);
+ value: build(node.expression), sourceInformation: source);
}
}
@@ -1471,8 +1421,8 @@
for (int i = 0; i < continueTargets.length; ++i) {
// The state value is i, the case's position in the list of recursive
// cases.
- irBuilder.state.continueCollectors.add(new GotoJumpCollector(
- continueTargets[i], stateIndex, i, join));
+ irBuilder.state.continueCollectors
+ .add(new GotoJumpCollector(continueTargets[i], stateIndex, i, join));
}
// For each non-default case use a pair of functions, one to translate the
@@ -1523,7 +1473,8 @@
if (condition == null) {
condition = buildComparison();
} else {
- condition = irBuilder.buildLogicalOperator(condition,
+ condition = irBuilder.buildLogicalOperator(
+ condition,
nested(buildComparison),
sourceInformationBuilder.buildSwitchCase(switchCase),
isLazyOr: true);
@@ -1589,8 +1540,8 @@
target: elements.getTargetDefinition(node));
irBuilder.state.breakCollectors.add(exit);
for (int i = 0; i < continueTargets.length; ++i) {
- irBuilder.state.continueCollectors.add(new GotoJumpCollector(
- continueTargets[i], stateIndex, i, loop));
+ irBuilder.state.continueCollectors
+ .add(new GotoJumpCollector(continueTargets[i], stateIndex, i, loop));
}
cases.clear();
for (int i = 0; i < continueTargets.length; ++i) {
@@ -1628,16 +1579,14 @@
// A loop with a simple switch in the body.
IrBuilder whileBuilder = irBuilder.makeDelimitedBuilder();
- whileBuilder.buildWhile(
- buildCondition: (IrBuilder builder) {
- ir.Primitive condition = builder.buildIdentical(
- builder.environment.index2value[stateIndex], initial);
- return builder.buildNegation(condition,
- sourceInformationBuilder.buildSwitch(node));
- },
- buildBody: (IrBuilder builder) {
- builder.buildSimpleSwitch(loop, cases, null);
- });
+ whileBuilder.buildWhile(buildCondition: (IrBuilder builder) {
+ ir.Primitive condition = builder.buildIdentical(
+ builder.environment.index2value[stateIndex], initial);
+ return builder.buildNegation(
+ condition, sourceInformationBuilder.buildSwitch(node));
+ }, buildBody: (IrBuilder builder) {
+ builder.buildSimpleSwitch(loop, cases, null);
+ });
// Jump to the exit continuation. This jump is the body of the loop exit
// continuation, so the loop exit continuation can be eta-reduced. The
// jump is here for simplicity because `buildWhile` does not expose the
@@ -1646,7 +1595,7 @@
whileBuilder.jumpTo(exit);
irBuilder.add(new ir.LetCont(exit.continuation, whileBuilder.root));
irBuilder.environment = exit.environment;
- irBuilder.environment.discard(1); // Discard the state variable.
+ irBuilder.environment.discard(1); // Discard the state variable.
irBuilder.state.breakCollectors.removeLast();
irBuilder.state.continueCollectors.length -= continueTargets.length;
}
@@ -1683,19 +1632,15 @@
// try { try tryBlock catch (ex, st) catchBlock } finally finallyBlock
irBuilder.buildTryFinally(tryStatements[node.finallyBlock],
(IrBuilder inner) {
- inner.buildTryCatch(tryStatements[node.catchBlocks],
- subbuild(node.tryBlock),
- catchClauseInfos);
- },
- subbuild(node.finallyBlock));
+ inner.buildTryCatch(tryStatements[node.catchBlocks],
+ subbuild(node.tryBlock), catchClauseInfos);
+ }, subbuild(node.finallyBlock));
} else if (!node.catchBlocks.isEmpty) {
irBuilder.buildTryCatch(tryStatements[node.catchBlocks],
- subbuild(node.tryBlock),
- catchClauseInfos);
+ subbuild(node.tryBlock), catchClauseInfos);
} else {
irBuilder.buildTryFinally(tryStatements[node.finallyBlock],
- subbuild(node.tryBlock),
- subbuild(node.finallyBlock));
+ subbuild(node.tryBlock), subbuild(node.finallyBlock));
}
}
@@ -1743,8 +1688,8 @@
return irBuilder.state.constants.getConstantValueForVariable(element);
}
- ir.Primitive buildConstantExpression(ConstantExpression expression,
- SourceInformation sourceInformation) {
+ ir.Primitive buildConstantExpression(
+ ConstantExpression expression, SourceInformation sourceInformation) {
return irBuilder.buildConstant(
irBuilder.state.constants.getConstantValue(expression),
sourceInformation: sourceInformation);
@@ -1756,8 +1701,8 @@
/// allocation site for a List object (a literal list or a call to one
/// of the List constructors).
TypeMask getAllocationSiteType(ast.Node node) {
- return compiler.typesTask.getGuaranteedTypeOfNode(
- elements.analyzedElement, node);
+ return compiler.typesTask
+ .getGuaranteedTypeOfNode(elements.analyzedElement, node);
}
ir.Primitive visitLiteralList(ast.LiteralList node) {
@@ -1770,7 +1715,7 @@
// TODO(sra): In checked mode, the elements must be checked as though
// operator[]= is called.
ir.Primitive list = irBuilder.buildListLiteral(type, values,
- allocationSiteType: allocationSiteType);
+ allocationSiteType: allocationSiteType);
if (type.treatAsRaw) return list;
// Call JSArray<E>.typed(allocation) to install the reified type.
ConstructorElement constructor = helpers.jsArrayTypedConstructor;
@@ -1783,8 +1728,8 @@
if (allocationSiteType == null) return tagged;
- return irBuilder.addPrimitive(
- new ir.Refinement(tagged, allocationSiteType));
+ return irBuilder
+ .addPrimitive(new ir.Refinement(tagged, allocationSiteType));
}
ir.Primitive visitLiteralMap(ast.LiteralMap node) {
@@ -1841,8 +1786,7 @@
return translateConstant(node);
}
- ir.Primitive visitParenthesizedExpression(
- ast.ParenthesizedExpression node) {
+ ir.Primitive visitParenthesizedExpression(ast.ParenthesizedExpression node) {
assert(irBuilder.isOpen);
return visit(node.expression);
}
@@ -1907,10 +1851,8 @@
}
@override
- ir.Primitive visitExpressionInvoke(ast.Send node,
- ast.Node expression,
- ast.NodeList argumentsNode,
- CallStructure callStructure, _) {
+ ir.Primitive visitExpressionInvoke(ast.Send node, ast.Node expression,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
ir.Primitive receiver = visit(expression);
List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
callStructure = normalizeDynamicArguments(callStructure, arguments);
@@ -1926,10 +1868,9 @@
@override
ir.Primitive handleConstantGet(
- ast.Node node,
- ConstantExpression constant, _) {
- return buildConstantExpression(constant,
- sourceInformationBuilder.buildGet(node));
+ ast.Node node, ConstantExpression constant, _) {
+ return buildConstantExpression(
+ constant, sourceInformationBuilder.buildGet(node));
}
/// If [node] is null, returns this.
@@ -1940,10 +1881,7 @@
@override
ir.Primitive handleDynamicGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ ast.Send node, ast.Node receiver, Name name, _) {
return irBuilder.buildDynamicGet(
translateReceiver(receiver),
new Selector.getter(name),
@@ -1953,10 +1891,7 @@
@override
ir.Primitive visitIfNotNullDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ ast.Send node, ast.Node receiver, Name name, _) {
ir.Primitive target = visit(receiver);
return irBuilder.buildIfNotNullSend(
target,
@@ -1970,54 +1905,40 @@
@override
ir.Primitive visitDynamicTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
- return buildConstantExpression(constant,
- sourceInformationBuilder.buildGet(node));
+ ast.Send node, ConstantExpression constant, _) {
+ return buildConstantExpression(
+ constant, sourceInformationBuilder.buildGet(node));
}
@override
ir.Primitive visitLocalVariableGet(
- ast.Send node,
- LocalVariableElement element,
- _) {
+ ast.Send node, LocalVariableElement element, _) {
return element.isConst
? irBuilder.buildConstant(getConstantForVariable(element),
sourceInformation: sourceInformationBuilder.buildGet(node))
: irBuilder.buildLocalGet(element);
}
- ir.Primitive handleLocalGet(
- ast.Send node,
- LocalElement element,
- _) {
+ ir.Primitive handleLocalGet(ast.Send node, LocalElement element, _) {
return irBuilder.buildLocalGet(element);
}
@override
ir.Primitive handleStaticFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ ast.Send node, MethodElement function, _) {
return irBuilder.addPrimitive(new ir.GetStatic(function, isFinal: true));
}
@override
- ir.Primitive handleStaticGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
- return buildStaticGetterGet(
- getter, node, sourceInformationBuilder.buildGet(node));
+ ir.Primitive handleStaticGetterGet(ast.Send node, FunctionElement getter, _) {
+ return buildStaticGetterGet(
+ getter, node, sourceInformationBuilder.buildGet(node));
}
/// Create a getter invocation of the static getter [getter]. This also
/// handles the special case where [getter] is the `loadLibrary`
/// pseudo-function on library prefixes of deferred imports.
- ir.Primitive buildStaticGetterGet(
- MethodElement getter,
- ast.Send node,
+ ir.Primitive buildStaticGetterGet(MethodElement getter, ast.Send node,
SourceInformation sourceInformation) {
if (getter.isDeferredLoaderGetter) {
PrefixElement prefix = getter.enclosingElement;
@@ -2033,48 +1954,39 @@
}
@override
- ir.Primitive visitSuperFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ ir.Primitive visitSuperFieldGet(ast.Send node, FieldElement field, _) {
return irBuilder.buildSuperFieldGet(
field, sourceInformationBuilder.buildGet(node));
}
@override
- ir.Primitive visitSuperGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ ir.Primitive visitSuperGetterGet(ast.Send node, FunctionElement getter, _) {
return irBuilder.buildSuperGetterGet(
getter, sourceInformationBuilder.buildGet(node));
}
@override
- ir.Primitive visitSuperMethodGet(
- ast.Send node,
- MethodElement method,
- _) {
+ ir.Primitive visitSuperMethodGet(ast.Send node, MethodElement method, _) {
return irBuilder.buildSuperMethodGet(
method, sourceInformationBuilder.buildGet(node));
}
@override
- ir.Primitive visitUnresolvedSuperGet(
- ast.Send node,
- Element element, _) {
+ ir.Primitive visitUnresolvedSuperGet(ast.Send node, Element element, _) {
return buildSuperNoSuchMethod(
- elements.getSelector(node), elements.getTypeMask(node), [],
+ elements.getSelector(node),
+ elements.getTypeMask(node),
+ [],
sourceInformationBuilder.buildGet(node));
}
@override
ir.Primitive visitUnresolvedSuperSet(
- ast.Send node,
- Element element,
- ast.Node rhs, _) {
+ ast.Send node, Element element, ast.Node rhs, _) {
return buildSuperNoSuchMethod(
- elements.getSelector(node), elements.getTypeMask(node), [visit(rhs)],
+ elements.getSelector(node),
+ elements.getTypeMask(node),
+ [visit(rhs)],
sourceInformationBuilder.buildAssignment(node));
}
@@ -2090,22 +2002,20 @@
}
ir.Primitive translateTypeVariableTypeLiteral(
- TypeVariableElement element,
- SourceInformation sourceInformation) {
+ TypeVariableElement element, SourceInformation sourceInformation) {
return irBuilder.buildReifyTypeVariable(element.type, sourceInformation);
}
@override
- ir.Primitive visitTypeVariableTypeLiteralGet(ast.Send node,
- TypeVariableElement element, _) {
- return translateTypeVariableTypeLiteral(element,
- sourceInformationBuilder.buildGet(node));
+ ir.Primitive visitTypeVariableTypeLiteralGet(
+ ast.Send node, TypeVariableElement element, _) {
+ return translateTypeVariableTypeLiteral(
+ element, sourceInformationBuilder.buildGet(node));
}
ir.Primitive translateLogicalOperator(ast.Expression left,
- ast.Expression right,
- SourceInformation sourceInformation,
- {bool isLazyOr}) {
+ ast.Expression right, SourceInformation sourceInformation,
+ {bool isLazyOr}) {
ir.Primitive leftValue = visit(left);
ir.Primitive buildRightValue(IrBuilder rightBuilder) {
@@ -2113,75 +2023,60 @@
}
return irBuilder.buildLogicalOperator(
- leftValue, buildRightValue, sourceInformation, isLazyOr: isLazyOr);
+ leftValue, buildRightValue, sourceInformation,
+ isLazyOr: isLazyOr);
}
@override
- ir.Primitive visitIfNull(
- ast.Send node, ast.Node left, ast.Node right, _) {
- return irBuilder.buildIfNull(build(left), subbuild(right),
- sourceInformationBuilder.buildIf(node));
+ ir.Primitive visitIfNull(ast.Send node, ast.Node left, ast.Node right, _) {
+ return irBuilder.buildIfNull(
+ build(left), subbuild(right), sourceInformationBuilder.buildIf(node));
}
@override
ir.Primitive visitLogicalAnd(
ast.Send node, ast.Node left, ast.Node right, _) {
- return translateLogicalOperator(left, right,
- sourceInformationBuilder.buildIf(node), isLazyOr: false);
+ return translateLogicalOperator(
+ left, right, sourceInformationBuilder.buildIf(node),
+ isLazyOr: false);
}
@override
- ir.Primitive visitLogicalOr(
- ast.Send node, ast.Node left, ast.Node right, _) {
- return translateLogicalOperator(left, right,
- sourceInformationBuilder.buildIf(node), isLazyOr: true);
+ ir.Primitive visitLogicalOr(ast.Send node, ast.Node left, ast.Node right, _) {
+ return translateLogicalOperator(
+ left, right, sourceInformationBuilder.buildIf(node),
+ isLazyOr: true);
}
@override
- ir.Primitive visitAs(
- ast.Send node,
- ast.Node expression,
- DartType type,
- _) {
+ ir.Primitive visitAs(ast.Send node, ast.Node expression, DartType type, _) {
ir.Primitive receiver = visit(expression);
return irBuilder.buildTypeOperator(
- receiver,
- type,
- sourceInformationBuilder.buildAs(node),
+ receiver, type, sourceInformationBuilder.buildAs(node),
isTypeTest: false);
}
@override
- ir.Primitive visitIs(
- ast.Send node,
- ast.Node expression,
- DartType type,
- _) {
+ ir.Primitive visitIs(ast.Send node, ast.Node expression, DartType type, _) {
ir.Primitive value = visit(expression);
return irBuilder.buildTypeOperator(
- value,
- type,
- sourceInformationBuilder.buildIs(node),
+ value, type, sourceInformationBuilder.buildIs(node),
isTypeTest: true);
}
@override
- ir.Primitive visitIsNot(ast.Send node,
- ast.Node expression, DartType type, _) {
+ ir.Primitive visitIsNot(
+ ast.Send node, ast.Node expression, DartType type, _) {
ir.Primitive value = visit(expression);
ir.Primitive check = irBuilder.buildTypeOperator(
- value,
- type,
- sourceInformationBuilder.buildIs(node),
+ value, type, sourceInformationBuilder.buildIs(node),
isTypeTest: true);
- return irBuilder.buildNegation(check,
- sourceInformationBuilder.buildIf(node));
+ return irBuilder.buildNegation(
+ check, sourceInformationBuilder.buildIf(node));
}
- ir.Primitive translateBinary(ast.Send node,
- ast.Node left,
- op.BinaryOperator operator,
- ast.Node right) {
+ ir.Primitive translateBinary(ast.Send node, ast.Node left,
+ op.BinaryOperator operator, ast.Node right) {
ir.Primitive receiver = visit(left);
Selector selector = new Selector.binaryOperator(operator.selectorName);
List<ir.Primitive> arguments = <ir.Primitive>[visit(right)];
@@ -2196,17 +2091,13 @@
}
@override
- ir.Primitive visitBinary(ast.Send node,
- ast.Node left,
- op.BinaryOperator operator,
- ast.Node right, _) {
+ ir.Primitive visitBinary(ast.Send node, ast.Node left,
+ op.BinaryOperator operator, ast.Node right, _) {
return translateBinary(node, left, operator, right);
}
@override
- ir.Primitive visitIndex(ast.Send node,
- ast.Node receiver,
- ast.Node index, _) {
+ ir.Primitive visitIndex(ast.Send node, ast.Node receiver, ast.Node index, _) {
ir.Primitive target = visit(receiver);
Selector selector = new Selector.index();
List<ir.Primitive> arguments = <ir.Primitive>[visit(index)];
@@ -2220,70 +2111,50 @@
sourceInformationBuilder.buildCall(receiver, node.selector));
}
- ir.Primitive translateSuperBinary(FunctionElement function,
- op.BinaryOperator operator,
- ast.Node argument,
- SourceInformation sourceInformation) {
- List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)];
- return irBuilder.buildSuperMethodInvocation(function,
- CallStructure.ONE_ARG, arguments, sourceInformation);
- }
-
- @override
- ir.Primitive visitSuperBinary(
- ast.Send node,
+ ir.Primitive translateSuperBinary(
FunctionElement function,
op.BinaryOperator operator,
ast.Node argument,
- _) {
+ SourceInformation sourceInformation) {
+ List<ir.Primitive> arguments = <ir.Primitive>[visit(argument)];
+ return irBuilder.buildSuperMethodInvocation(
+ function, CallStructure.ONE_ARG, arguments, sourceInformation);
+ }
+
+ @override
+ ir.Primitive visitSuperBinary(ast.Send node, FunctionElement function,
+ op.BinaryOperator operator, ast.Node argument, _) {
return translateSuperBinary(function, operator, argument,
sourceInformationBuilder.buildBinary(node));
}
@override
ir.Primitive visitSuperIndex(
- ast.Send node,
- FunctionElement function,
- ast.Node index,
- _) {
- return irBuilder.buildSuperIndex(function, visit(index),
- sourceInformationBuilder.buildIndex(node));
+ ast.Send node, FunctionElement function, ast.Node index, _) {
+ return irBuilder.buildSuperIndex(
+ function, visit(index), sourceInformationBuilder.buildIndex(node));
}
@override
- ir.Primitive visitEquals(
- ast.Send node,
- ast.Node left,
- ast.Node right,
- _) {
+ ir.Primitive visitEquals(ast.Send node, ast.Node left, ast.Node right, _) {
return translateBinary(node, left, op.BinaryOperator.EQ, right);
}
@override
ir.Primitive visitSuperEquals(
- ast.Send node,
- FunctionElement function,
- ast.Node argument,
- _) {
+ ast.Send node, FunctionElement function, ast.Node argument, _) {
return translateSuperBinary(function, op.BinaryOperator.EQ, argument,
sourceInformationBuilder.buildBinary(node));
}
@override
- ir.Primitive visitNot(
- ast.Send node,
- ast.Node expression,
- _) {
- return irBuilder.buildNegation(visit(expression),
- sourceInformationBuilder.buildIf(node));
+ ir.Primitive visitNot(ast.Send node, ast.Node expression, _) {
+ return irBuilder.buildNegation(
+ visit(expression), sourceInformationBuilder.buildIf(node));
}
@override
- ir.Primitive visitNotEquals(
- ast.Send node,
- ast.Node left,
- ast.Node right,
- _) {
+ ir.Primitive visitNotEquals(ast.Send node, ast.Node left, ast.Node right, _) {
return irBuilder.buildNegation(
translateBinary(node, left, op.BinaryOperator.NOT_EQ, right),
sourceInformationBuilder.buildIf(node));
@@ -2291,10 +2162,7 @@
@override
ir.Primitive visitSuperNotEquals(
- ast.Send node,
- FunctionElement function,
- ast.Node argument,
- _) {
+ ast.Send node, FunctionElement function, ast.Node argument, _) {
return irBuilder.buildNegation(
translateSuperBinary(function, op.BinaryOperator.NOT_EQ, argument,
sourceInformationBuilder.buildBinary(node)),
@@ -2302,32 +2170,30 @@
}
@override
- ir.Primitive visitUnary(ast.Send node,
- op.UnaryOperator operator, ast.Node expression, _) {
+ ir.Primitive visitUnary(
+ ast.Send node, op.UnaryOperator operator, ast.Node expression, _) {
// TODO(johnniwinther): Clean up the creation of selectors.
Selector selector = operator.selector;
ir.Primitive receiver = translateReceiver(expression);
return irBuilder.buildDynamicInvocation(
- receiver, selector, elements.getTypeMask(node), const [],
+ receiver,
+ selector,
+ elements.getTypeMask(node),
+ const [],
sourceInformationBuilder.buildCall(expression, node));
}
@override
ir.Primitive visitSuperUnary(
- ast.Send node,
- op.UnaryOperator operator,
- FunctionElement function,
- _) {
- return irBuilder.buildSuperMethodInvocation(
- function, CallStructure.NO_ARGS, const [],
- sourceInformationBuilder.buildCall(node, node));
+ ast.Send node, op.UnaryOperator operator, FunctionElement function, _) {
+ return irBuilder.buildSuperMethodInvocation(function, CallStructure.NO_ARGS,
+ const [], sourceInformationBuilder.buildCall(node, node));
}
// TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct
// semantic correlation between arguments and invocation.
CallStructure translateDynamicArguments(ast.NodeList nodeList,
- CallStructure callStructure,
- List<ir.Primitive> arguments) {
+ CallStructure callStructure, List<ir.Primitive> arguments) {
assert(arguments.isEmpty);
for (ast.Node node in nodeList) arguments.add(visit(node));
return normalizeDynamicArguments(callStructure, arguments);
@@ -2335,19 +2201,18 @@
// TODO(johnniwinther): Handle this in the [IrBuilder] to ensure the correct
// semantic correlation between arguments and invocation.
- CallStructure translateStaticArguments(ast.NodeList nodeList,
- Element element,
- CallStructure callStructure,
- List<ir.Primitive> arguments) {
+ CallStructure translateStaticArguments(ast.NodeList nodeList, Element element,
+ CallStructure callStructure, List<ir.Primitive> arguments) {
assert(arguments.isEmpty);
for (ast.Node node in nodeList) arguments.add(visit(node));
return normalizeStaticArguments(callStructure, element, arguments);
}
- ir.Primitive translateCallInvoke(ir.Primitive target,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- SourceInformation sourceInformation) {
+ ir.Primitive translateCallInvoke(
+ ir.Primitive target,
+ ast.NodeList argumentsNode,
+ CallStructure callStructure,
+ SourceInformation sourceInformation) {
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
@@ -2356,14 +2221,10 @@
}
@override
- ir.Primitive handleConstantInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- ir.Primitive target = buildConstantExpression(constant,
- sourceInformationBuilder.buildGet(node));
+ ir.Primitive handleConstantInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ ir.Primitive target = buildConstantExpression(
+ constant, sourceInformationBuilder.buildGet(node));
return translateCallInvoke(target, arguments, callStructure,
sourceInformationBuilder.buildCall(node, arguments));
}
@@ -2376,15 +2237,14 @@
ast.NodeList argumentsNode,
CallStructure callStructure,
_) {
-
// TODO(sigmund): move these checks down after visiting arguments
// (see issue #25355)
ast.Send send = node.send;
// If an allocation refers to a type using a deferred import prefix (e.g.
// `new lib.A()`), we must ensure that the deferred import has already been
// loaded.
- var prefix = compiler.deferredLoadTask.deferredPrefixElement(
- send, elements);
+ var prefix =
+ compiler.deferredLoadTask.deferredPrefixElement(send, elements);
if (prefix != null) buildCheckDeferredIsLoaded(prefix, send);
// We also emit deferred import checks when using redirecting factories that
@@ -2439,12 +2299,8 @@
}
@override
- ir.Primitive handleDynamicInvoke(
- ast.Send node,
- ast.Node receiver,
- ast.NodeList argumentsNode,
- Selector selector,
- _) {
+ ir.Primitive handleDynamicInvoke(ast.Send node, ast.Node receiver,
+ ast.NodeList argumentsNode, Selector selector, _) {
ir.Primitive target = translateReceiver(receiver);
List<ir.Primitive> arguments = <ir.Primitive>[];
CallStructure callStructure = translateDynamicArguments(
@@ -2458,35 +2314,24 @@
}
@override
- ir.Primitive visitIfNotNullDynamicPropertyInvoke(
- ast.Send node,
- ast.Node receiver,
- ast.NodeList argumentsNode,
- Selector selector,
- _) {
+ ir.Primitive visitIfNotNullDynamicPropertyInvoke(ast.Send node,
+ ast.Node receiver, ast.NodeList argumentsNode, Selector selector, _) {
ir.Primitive target = visit(receiver);
- return irBuilder.buildIfNotNullSend(
- target,
- nested(() {
- List<ir.Primitive> arguments = <ir.Primitive>[];
- CallStructure callStructure = translateDynamicArguments(
- argumentsNode, selector.callStructure, arguments);
- return irBuilder.buildDynamicInvocation(
- target,
- new Selector(selector.kind, selector.memberName, callStructure),
- elements.getTypeMask(node),
- arguments,
- sourceInformationBuilder.buildCall(node, node.selector));
- }),
- sourceInformationBuilder.buildIf(node));
+ return irBuilder.buildIfNotNullSend(target, nested(() {
+ List<ir.Primitive> arguments = <ir.Primitive>[];
+ CallStructure callStructure = translateDynamicArguments(
+ argumentsNode, selector.callStructure, arguments);
+ return irBuilder.buildDynamicInvocation(
+ target,
+ new Selector(selector.kind, selector.memberName, callStructure),
+ elements.getTypeMask(node),
+ arguments,
+ sourceInformationBuilder.buildCall(node, node.selector));
+ }), sourceInformationBuilder.buildIf(node));
}
- ir.Primitive handleLocalInvoke(
- ast.Send node,
- LocalElement element,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
+ ir.Primitive handleLocalInvoke(ast.Send node, LocalElement element,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
ir.Primitive function = irBuilder.buildLocalGet(element);
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
@@ -2501,40 +2346,26 @@
}
@override
- ir.Primitive handleStaticFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
+ ir.Primitive handleStaticFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
SourceInformation src = sourceInformationBuilder.buildGet(node);
ir.Primitive target = buildStaticFieldGet(field, src);
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
- return irBuilder.buildCallInvocation(
- target,
- callStructure,
- arguments,
+ return irBuilder.buildCallInvocation(target, callStructure, arguments,
sourceInformationBuilder.buildCall(node, argumentsNode));
}
@override
- ir.Primitive handleStaticFunctionInvoke(ast.Send node,
- MethodElement function,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
+ ir.Primitive handleStaticFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
if (compiler.backend.isForeign(function)) {
- return handleForeignCode(
- node,
- function,
- argumentsNode,
- callStructure);
+ return handleForeignCode(node, function, argumentsNode, callStructure);
} else {
List<ir.Primitive> arguments = <ir.Primitive>[];
- callStructure = translateStaticArguments(argumentsNode, function,
- callStructure, arguments);
+ callStructure = translateStaticArguments(
+ argumentsNode, function, callStructure, arguments);
Selector selector = new Selector.call(function.memberName, callStructure);
return irBuilder.buildInvokeStatic(function, selector, arguments,
sourceInformationBuilder.buildCall(node, node.selector));
@@ -2546,7 +2377,8 @@
ast.Send node,
MethodElement function,
ast.NodeList arguments,
- CallStructure callStructure, _) {
+ CallStructure callStructure,
+ _) {
return irBuilder.buildStaticNoSuchMethod(
elements.getSelector(node),
arguments.nodes.mapToList(visit),
@@ -2554,77 +2386,49 @@
}
@override
- ir.Primitive handleStaticGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
+ ir.Primitive handleStaticGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
ir.Primitive target = buildStaticGetterGet(
getter, node, sourceInformationBuilder.buildGet(node));
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
- return irBuilder.buildCallInvocation(
- target,
- callStructure,
- arguments,
+ return irBuilder.buildCallInvocation(target, callStructure, arguments,
sourceInformationBuilder.buildCall(node, argumentsNode));
}
@override
- ir.Primitive visitSuperFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
+ ir.Primitive visitSuperFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
ir.Primitive target = irBuilder.buildSuperFieldGet(
field, sourceInformationBuilder.buildGet(node));
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
- return irBuilder.buildCallInvocation(
- target,
- callStructure,
- arguments,
+ return irBuilder.buildCallInvocation(target, callStructure, arguments,
sourceInformationBuilder.buildCall(node, argumentsNode));
}
@override
- ir.Primitive visitSuperGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
- ir.Primitive target = irBuilder.buildSuperGetterGet(getter,
- sourceInformationBuilder.buildGet(node));
+ ir.Primitive visitSuperGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
+ ir.Primitive target = irBuilder.buildSuperGetterGet(
+ getter, sourceInformationBuilder.buildGet(node));
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
- return irBuilder.buildCallInvocation(
- target,
- callStructure,
- arguments,
+ return irBuilder.buildCallInvocation(target, callStructure, arguments,
sourceInformationBuilder.buildCall(node, argumentsNode));
}
@override
- ir.Primitive visitSuperMethodInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList argumentsNode,
- CallStructure callStructure,
- _) {
+ ir.Primitive visitSuperMethodInvoke(ast.Send node, MethodElement method,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
List<ir.Primitive> arguments = <ir.Primitive>[];
- callStructure = translateStaticArguments(argumentsNode, method,
- callStructure, arguments);
- return irBuilder.buildSuperMethodInvocation(
- method,
- callStructure,
- arguments,
- sourceInformationBuilder.buildCall(node, node.selector));
+ callStructure = translateStaticArguments(
+ argumentsNode, method, callStructure, arguments);
+ return irBuilder.buildSuperMethodInvocation(method, callStructure,
+ arguments, sourceInformationBuilder.buildCall(node, node.selector));
}
@override
@@ -2632,10 +2436,11 @@
ast.Send node,
MethodElement method,
ast.NodeList arguments,
- CallStructure callStructure, _) {
+ CallStructure callStructure,
+ _) {
List<ir.Primitive> normalizedArguments = <ir.Primitive>[];
- CallStructure normalizedCallStructure =
- translateDynamicArguments(arguments, callStructure, normalizedArguments);
+ CallStructure normalizedCallStructure = translateDynamicArguments(
+ arguments, callStructure, normalizedArguments);
return buildSuperNoSuchMethod(
new Selector.call(method.memberName, normalizedCallStructure),
elements.getTypeMask(node),
@@ -2644,11 +2449,8 @@
}
@override
- ir.Primitive visitUnresolvedSuperInvoke(
- ast.Send node,
- Element element,
- ast.NodeList argumentsNode,
- Selector selector, _) {
+ ir.Primitive visitUnresolvedSuperInvoke(ast.Send node, Element element,
+ ast.NodeList argumentsNode, Selector selector, _) {
List<ir.Primitive> arguments = <ir.Primitive>[];
CallStructure callStructure = translateDynamicArguments(
argumentsNode, selector.callStructure, arguments);
@@ -2663,14 +2465,8 @@
@override
ir.Primitive visitThisInvoke(
- ast.Send node,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- return translateCallInvoke(
- irBuilder.buildThis(),
- arguments,
- callStructure,
+ ast.Send node, ast.NodeList arguments, CallStructure callStructure, _) {
+ return translateCallInvoke(irBuilder.buildThis(), arguments, callStructure,
sourceInformationBuilder.buildCall(node, arguments));
}
@@ -2691,11 +2487,7 @@
@override
ir.Primitive visitIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, _) {
return irBuilder.buildDynamicIndexSet(
visit(receiver),
elements.getTypeMask(node),
@@ -2705,24 +2497,14 @@
}
@override
- ir.Primitive visitSuperIndexSet(
- ast.SendSet node,
- FunctionElement function,
- ast.Node index,
- ast.Node rhs,
- _) {
- return irBuilder.buildSuperIndexSet(
- function,
- visit(index),
- visit(rhs),
+ ir.Primitive visitSuperIndexSet(ast.SendSet node, FunctionElement function,
+ ast.Node index, ast.Node rhs, _) {
+ return irBuilder.buildSuperIndexSet(function, visit(index), visit(rhs),
sourceInformationBuilder.buildIndexSet(node));
}
- ir.Primitive translateIfNull(
- ast.SendSet node,
- ir.Primitive getValue(),
- ast.Node rhs,
- void setValue(ir.Primitive value)) {
+ ir.Primitive translateIfNull(ast.SendSet node, ir.Primitive getValue(),
+ ast.Node rhs, void setValue(ir.Primitive value)) {
ir.Primitive value = getValue();
// Unlike other compound operators if-null conditionally will not do the
// assignment operation.
@@ -2730,15 +2512,11 @@
ir.Primitive newValue = build(rhs);
setValue(newValue);
return newValue;
- }),
- sourceInformationBuilder.buildIf(node));
+ }), sourceInformationBuilder.buildIf(node));
}
- ir.Primitive translateCompounds(
- ast.SendSet node,
- ir.Primitive getValue(),
- CompoundRhs rhs,
- void setValue(ir.Primitive value)) {
+ ir.Primitive translateCompounds(ast.SendSet node, ir.Primitive getValue(),
+ CompoundRhs rhs, void setValue(ir.Primitive value)) {
ir.Primitive value = getValue();
op.BinaryOperator operator = rhs.operator;
assert(operator.kind != op.BinaryOperatorKind.IF_NULL);
@@ -2760,8 +2538,8 @@
sourceInformationBuilder.buildCall(node, node.assignmentOperator);
ir.Primitive result = irBuilder.buildDynamicInvocation(
value,
- new Selector(operatorSelector.kind, operatorSelector.memberName,
- callStructure),
+ new Selector(
+ operatorSelector.kind, operatorSelector.memberName, callStructure),
operatorTypeMask,
arguments,
operatorSourceInformation);
@@ -2769,11 +2547,8 @@
return rhs.kind == CompoundKind.POSTFIX ? value : result;
}
- ir.Primitive translateSetIfNull(
- ast.SendSet node,
- ir.Primitive getValue(),
- ast.Node rhs,
- void setValue(ir.Primitive value)) {
+ ir.Primitive translateSetIfNull(ast.SendSet node, ir.Primitive getValue(),
+ ast.Node rhs, void setValue(ir.Primitive value)) {
ir.Primitive value = getValue();
// Unlike other compound operators if-null conditionally will not do the
// assignment operation.
@@ -2781,8 +2556,7 @@
ir.Primitive newValue = build(rhs);
setValue(newValue);
return newValue;
- }),
- sourceInformationBuilder.buildIf(node));
+ }), sourceInformationBuilder.buildIf(node));
}
@override
@@ -2794,66 +2568,64 @@
ast.Node rhs,
arg,
{bool isGetterValid,
- bool isSetterValid}) {
- return translateSetIfNull(node, () {
- if (isGetterValid) {
- return irBuilder.buildSuperMethodGet(
- indexFunction, sourceInformationBuilder.buildIndex(node));
- } else {
- return buildSuperNoSuchGetter(
- indexFunction,
- elements.getGetterTypeMaskInComplexSendSet(node),
- sourceInformationBuilder.buildIndex(node));
- }
- }, rhs, (ir.Primitive result) {
- if (isSetterValid) {
- return irBuilder.buildSuperMethodGet(
- indexSetFunction, sourceInformationBuilder.buildIndexSet(node));
- } else {
- return buildSuperNoSuchSetter(
- indexSetFunction, elements.getTypeMask(node), result,
- sourceInformationBuilder.buildIndexSet(node));
- }
- });
+ bool isSetterValid}) {
+ return translateSetIfNull(
+ node,
+ () {
+ if (isGetterValid) {
+ return irBuilder.buildSuperMethodGet(
+ indexFunction, sourceInformationBuilder.buildIndex(node));
+ } else {
+ return buildSuperNoSuchGetter(
+ indexFunction,
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ sourceInformationBuilder.buildIndex(node));
+ }
+ },
+ rhs,
+ (ir.Primitive result) {
+ if (isSetterValid) {
+ return irBuilder.buildSuperMethodGet(
+ indexSetFunction, sourceInformationBuilder.buildIndexSet(node));
+ } else {
+ return buildSuperNoSuchSetter(
+ indexSetFunction,
+ elements.getTypeMask(node),
+ result,
+ sourceInformationBuilder.buildIndexSet(node));
+ }
+ });
}
@override
ir.Primitive visitIndexSetIfNull(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- arg) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, arg) {
ir.Primitive target = visit(receiver);
ir.Primitive indexValue = visit(index);
- return translateSetIfNull(node, () {
- Selector selector = new Selector.index();
- List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
- CallStructure callStructure =
- normalizeDynamicArguments(selector.callStructure, arguments);
- return irBuilder.buildDynamicInvocation(
- target,
- new Selector(selector.kind, selector.memberName, callStructure),
- elements.getGetterTypeMaskInComplexSendSet(node),
- arguments,
- sourceInformationBuilder.buildCall(receiver, node));
- }, rhs, (ir.Primitive result) {
- irBuilder.buildDynamicIndexSet(
- target,
- elements.getTypeMask(node),
- indexValue,
- result,
- sourceInformationBuilder.buildIndexSet(node));
- });
+ return translateSetIfNull(
+ node,
+ () {
+ Selector selector = new Selector.index();
+ List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
+ CallStructure callStructure =
+ normalizeDynamicArguments(selector.callStructure, arguments);
+ return irBuilder.buildDynamicInvocation(
+ target,
+ new Selector(selector.kind, selector.memberName, callStructure),
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ arguments,
+ sourceInformationBuilder.buildCall(receiver, node));
+ },
+ rhs,
+ (ir.Primitive result) {
+ irBuilder.buildDynamicIndexSet(target, elements.getTypeMask(node),
+ indexValue, result, sourceInformationBuilder.buildIndexSet(node));
+ });
}
@override
ir.Primitive handleDynamicSet(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, Name name, ast.Node rhs, _) {
return irBuilder.buildDynamicSet(
translateReceiver(receiver),
new Selector.setter(name),
@@ -2864,11 +2636,7 @@
@override
ir.Primitive visitIfNotNullDynamicPropertySet(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, Name name, ast.Node rhs, _) {
ir.Primitive target = visit(receiver);
return irBuilder.buildIfNotNullSend(
target,
@@ -2883,116 +2651,95 @@
@override
ir.Primitive handleLocalSet(
- ast.SendSet node,
- LocalElement element,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalElement element, ast.Node rhs, _) {
ir.Primitive value = visit(rhs);
value = checkTypeVsElement(value, element);
- return irBuilder.buildLocalVariableSet(element, value,
- sourceInformationBuilder.buildAssignment(node));
+ return irBuilder.buildLocalVariableSet(
+ element, value, sourceInformationBuilder.buildAssignment(node));
}
@override
ir.Primitive handleStaticFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
ir.Primitive value = visit(rhs);
- irBuilder.addPrimitive(new ir.SetStatic(field, value,
- sourceInformationBuilder.buildAssignment(node)));
+ irBuilder.addPrimitive(new ir.SetStatic(
+ field, value, sourceInformationBuilder.buildAssignment(node)));
return value;
}
@override
ir.Primitive visitSuperFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
- return irBuilder.buildSuperFieldSet(field, visit(rhs),
- sourceInformationBuilder.buildAssignment(node));
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
+ return irBuilder.buildSuperFieldSet(
+ field, visit(rhs), sourceInformationBuilder.buildAssignment(node));
}
@override
ir.Primitive visitSuperSetterSet(
- ast.SendSet node,
- FunctionElement setter,
- ast.Node rhs,
- _) {
- return irBuilder.buildSuperSetterSet(setter, visit(rhs),
- sourceInformationBuilder.buildAssignment(node));
+ ast.SendSet node, FunctionElement setter, ast.Node rhs, _) {
+ return irBuilder.buildSuperSetterSet(
+ setter, visit(rhs), sourceInformationBuilder.buildAssignment(node));
}
@override
ir.Primitive visitUnresolvedSuperIndexSet(
- ast.Send node,
- Element element,
- ast.Node index,
- ast.Node rhs,
- arg) {
+ ast.Send node, Element element, ast.Node index, ast.Node rhs, arg) {
return giveup(node, 'visitUnresolvedSuperIndexSet');
}
@override
ir.Primitive handleStaticSetterSet(
- ast.SendSet node,
- FunctionElement setter,
- ast.Node rhs,
- _) {
- return irBuilder.buildStaticSetterSet(setter, visit(rhs),
- sourceInformationBuilder.buildAssignment(node));
+ ast.SendSet node, FunctionElement setter, ast.Node rhs, _) {
+ return irBuilder.buildStaticSetterSet(
+ setter, visit(rhs), sourceInformationBuilder.buildAssignment(node));
}
@override
ir.Primitive handleTypeLiteralConstantCompounds(
- ast.SendSet node,
- ConstantExpression constant,
- CompoundRhs rhs,
- arg) {
+ ast.SendSet node, ConstantExpression constant, CompoundRhs rhs, arg) {
SourceInformation src = sourceInformationBuilder.buildGet(node);
- return translateCompounds(node, () {
- return buildConstantExpression(constant, src);
- }, rhs, (ir.Primitive value) {
- // The binary operator will throw before this.
- });
+ return translateCompounds(
+ node,
+ () {
+ return buildConstantExpression(constant, src);
+ },
+ rhs,
+ (ir.Primitive value) {
+ // The binary operator will throw before this.
+ });
}
@override
ir.Primitive handleTypeLiteralConstantSetIfNulls(
- ast.SendSet node,
- ConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ConstantExpression constant, ast.Node rhs, _) {
// The type literal is never `null`.
- return buildConstantExpression(constant,
- sourceInformationBuilder.buildGet(node));
+ return buildConstantExpression(
+ constant, sourceInformationBuilder.buildGet(node));
}
@override
ir.Primitive handleDynamicCompounds(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- CompoundRhs rhs,
- arg) {
+ ast.SendSet node, ast.Node receiver, Name name, CompoundRhs rhs, arg) {
ir.Primitive target = translateReceiver(receiver);
ir.Primitive helper() {
- return translateCompounds(node, () {
- return irBuilder.buildDynamicGet(
- target,
- new Selector.getter(name),
- elements.getGetterTypeMaskInComplexSendSet(node),
- sourceInformationBuilder.buildGet(node));
- }, rhs, (ir.Primitive result) {
- irBuilder.buildDynamicSet(
- target,
- new Selector.setter(name),
- elements.getTypeMask(node),
- result,
- sourceInformationBuilder.buildAssignment(node));
- });
+ return translateCompounds(
+ node,
+ () {
+ return irBuilder.buildDynamicGet(
+ target,
+ new Selector.getter(name),
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ sourceInformationBuilder.buildGet(node));
+ },
+ rhs,
+ (ir.Primitive result) {
+ irBuilder.buildDynamicSet(
+ target,
+ new Selector.setter(name),
+ elements.getTypeMask(node),
+ result,
+ sourceInformationBuilder.buildAssignment(node));
+ });
}
return node.isConditional
? irBuilder.buildIfNotNullSend(
@@ -3002,27 +2749,27 @@
@override
ir.Primitive handleDynamicSetIfNulls(
- ast.Send node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.Send node, ast.Node receiver, Name name, ast.Node rhs, _) {
ir.Primitive target = translateReceiver(receiver);
ir.Primitive helper() {
- return translateSetIfNull(node, () {
- return irBuilder.buildDynamicGet(
- target,
- new Selector.getter(name),
- elements.getGetterTypeMaskInComplexSendSet(node),
- sourceInformationBuilder.buildGet(node));
- }, rhs, (ir.Primitive result) {
- irBuilder.buildDynamicSet(
- target,
- new Selector.setter(name),
- elements.getTypeMask(node),
- result,
- sourceInformationBuilder.buildAssignment(node));
- });
+ return translateSetIfNull(
+ node,
+ () {
+ return irBuilder.buildDynamicGet(
+ target,
+ new Selector.getter(name),
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ sourceInformationBuilder.buildGet(node));
+ },
+ rhs,
+ (ir.Primitive result) {
+ irBuilder.buildDynamicSet(
+ target,
+ new Selector.setter(name),
+ elements.getTypeMask(node),
+ result,
+ sourceInformationBuilder.buildAssignment(node));
+ });
}
return node.isConditional
? irBuilder.buildIfNotNullSend(
@@ -3030,9 +2777,7 @@
: helper();
}
- ir.Primitive buildLocalNoSuchSetter(
- LocalElement local,
- ir.Primitive value,
+ ir.Primitive buildLocalNoSuchSetter(LocalElement local, ir.Primitive value,
SourceInformation sourceInformation) {
Selector selector = new Selector.setter(
new Name(local.name, local.library, isSetter: true));
@@ -3042,51 +2787,50 @@
@override
ir.Primitive handleLocalCompounds(
- ast.SendSet node,
- LocalElement local,
- CompoundRhs rhs,
- arg,
+ ast.SendSet node, LocalElement local, CompoundRhs rhs, arg,
{bool isSetterValid}) {
- return translateCompounds(node, () {
- return irBuilder.buildLocalGet(local);
- }, rhs, (ir.Primitive result) {
- if (isSetterValid) {
- irBuilder.buildLocalVariableSet(
- local, result,
- sourceInformationBuilder.buildAssignment(node));
- } else {
- Selector selector = new Selector.setter(
- new Name(local.name, local.library, isSetter: true));
- irBuilder.buildStaticNoSuchMethod(
- selector, <ir.Primitive>[result],
- sourceInformationBuilder.buildAssignment(node));
- }
- });
+ return translateCompounds(
+ node,
+ () {
+ return irBuilder.buildLocalGet(local);
+ },
+ rhs,
+ (ir.Primitive result) {
+ if (isSetterValid) {
+ irBuilder.buildLocalVariableSet(
+ local, result, sourceInformationBuilder.buildAssignment(node));
+ } else {
+ Selector selector = new Selector.setter(
+ new Name(local.name, local.library, isSetter: true));
+ irBuilder.buildStaticNoSuchMethod(selector, <ir.Primitive>[result],
+ sourceInformationBuilder.buildAssignment(node));
+ }
+ });
}
@override
ir.Primitive handleLocalSetIfNulls(
- ast.SendSet node,
- LocalElement local,
- ast.Node rhs,
- _,
+ ast.SendSet node, LocalElement local, ast.Node rhs, _,
{bool isSetterValid}) {
- return translateSetIfNull(node, () {
- return irBuilder.buildLocalGet(
- local, sourceInformation: sourceInformationBuilder.buildGet(node));
- }, rhs, (ir.Primitive result) {
- SourceInformation sourceInformation =
- sourceInformationBuilder.buildAssignment(node);
- if (isSetterValid) {
- irBuilder.buildLocalVariableSet(
- local, result, sourceInformation);
- } else {
- Selector selector = new Selector.setter(
- new Name(local.name, local.library, isSetter: true));
- irBuilder.buildStaticNoSuchMethod(
- selector, <ir.Primitive>[result], sourceInformation);
- }
- });
+ return translateSetIfNull(
+ node,
+ () {
+ return irBuilder.buildLocalGet(local,
+ sourceInformation: sourceInformationBuilder.buildGet(node));
+ },
+ rhs,
+ (ir.Primitive result) {
+ SourceInformation sourceInformation =
+ sourceInformationBuilder.buildAssignment(node);
+ if (isSetterValid) {
+ irBuilder.buildLocalVariableSet(local, result, sourceInformation);
+ } else {
+ Selector selector = new Selector.setter(
+ new Name(local.name, local.library, isSetter: true));
+ irBuilder.buildStaticNoSuchMethod(
+ selector, <ir.Primitive>[result], sourceInformation);
+ }
+ });
}
@override
@@ -3098,42 +2842,46 @@
CompoundSetter setterKind,
CompoundRhs rhs,
arg) {
- return translateCompounds(node, () {
- SourceInformation sourceInformation =
- sourceInformationBuilder.buildGet(node);
- switch (getterKind) {
- case CompoundGetter.FIELD:
- return buildStaticFieldGet(getter, sourceInformation);
- case CompoundGetter.GETTER:
- return buildStaticGetterGet(getter, node, sourceInformation);
- case CompoundGetter.METHOD:
- return irBuilder.addPrimitive(new ir.GetStatic(getter,
- sourceInformation: sourceInformation, isFinal: true));
- case CompoundGetter.UNRESOLVED:
- return irBuilder.buildStaticNoSuchMethod(
- new Selector.getter(new Name(getter.name, getter.library)),
- <ir.Primitive>[],
- sourceInformation);
- }
- }, rhs, (ir.Primitive result) {
- SourceInformation sourceInformation =
- sourceInformationBuilder.buildAssignment(node);
- switch (setterKind) {
- case CompoundSetter.FIELD:
- irBuilder.addPrimitive(
- new ir.SetStatic(setter, result, sourceInformation));
- return;
- case CompoundSetter.SETTER:
- irBuilder.buildStaticSetterSet(setter, result, sourceInformation);
- return;
- case CompoundSetter.INVALID:
- irBuilder.buildStaticNoSuchMethod(
- new Selector.setter(new Name(setter.name, setter.library)),
- <ir.Primitive>[result],
- sourceInformation);
- return;
- }
- });
+ return translateCompounds(
+ node,
+ () {
+ SourceInformation sourceInformation =
+ sourceInformationBuilder.buildGet(node);
+ switch (getterKind) {
+ case CompoundGetter.FIELD:
+ return buildStaticFieldGet(getter, sourceInformation);
+ case CompoundGetter.GETTER:
+ return buildStaticGetterGet(getter, node, sourceInformation);
+ case CompoundGetter.METHOD:
+ return irBuilder.addPrimitive(new ir.GetStatic(getter,
+ sourceInformation: sourceInformation, isFinal: true));
+ case CompoundGetter.UNRESOLVED:
+ return irBuilder.buildStaticNoSuchMethod(
+ new Selector.getter(new Name(getter.name, getter.library)),
+ <ir.Primitive>[],
+ sourceInformation);
+ }
+ },
+ rhs,
+ (ir.Primitive result) {
+ SourceInformation sourceInformation =
+ sourceInformationBuilder.buildAssignment(node);
+ switch (setterKind) {
+ case CompoundSetter.FIELD:
+ irBuilder.addPrimitive(
+ new ir.SetStatic(setter, result, sourceInformation));
+ return;
+ case CompoundSetter.SETTER:
+ irBuilder.buildStaticSetterSet(setter, result, sourceInformation);
+ return;
+ case CompoundSetter.INVALID:
+ irBuilder.buildStaticNoSuchMethod(
+ new Selector.setter(new Name(setter.name, setter.library)),
+ <ir.Primitive>[result],
+ sourceInformation);
+ return;
+ }
+ });
}
@override
@@ -3145,49 +2893,50 @@
CompoundSetter setterKind,
ast.Node rhs,
_) {
- return translateSetIfNull(node, () {
- SourceInformation sourceInformation =
- sourceInformationBuilder.buildGet(node);
- switch (getterKind) {
- case CompoundGetter.FIELD:
- return buildStaticFieldGet(getter, sourceInformation);
- case CompoundGetter.GETTER:
- return buildStaticGetterGet(getter, node, sourceInformation);
- case CompoundGetter.METHOD:
- return irBuilder.addPrimitive(new ir.GetStatic(getter,
- sourceInformation: sourceInformation,
- isFinal: true));
- case CompoundGetter.UNRESOLVED:
- return irBuilder.buildStaticNoSuchMethod(
- new Selector.getter(new Name(getter.name, getter.library)),
- <ir.Primitive>[],
- sourceInformation);
- }
- }, rhs, (ir.Primitive result) {
- SourceInformation sourceInformation =
- sourceInformationBuilder.buildAssignment(node);
- switch (setterKind) {
- case CompoundSetter.FIELD:
- irBuilder.addPrimitive(new ir.SetStatic(
- setter, result, sourceInformation));
- return;
- case CompoundSetter.SETTER:
- irBuilder.buildStaticSetterSet(setter, result, sourceInformation);
- return;
- case CompoundSetter.INVALID:
- irBuilder.buildStaticNoSuchMethod(
- new Selector.setter(new Name(setter.name, setter.library)),
- <ir.Primitive>[result],
- sourceInformation);
- return;
- }
- });
+ return translateSetIfNull(
+ node,
+ () {
+ SourceInformation sourceInformation =
+ sourceInformationBuilder.buildGet(node);
+ switch (getterKind) {
+ case CompoundGetter.FIELD:
+ return buildStaticFieldGet(getter, sourceInformation);
+ case CompoundGetter.GETTER:
+ return buildStaticGetterGet(getter, node, sourceInformation);
+ case CompoundGetter.METHOD:
+ return irBuilder.addPrimitive(new ir.GetStatic(getter,
+ sourceInformation: sourceInformation, isFinal: true));
+ case CompoundGetter.UNRESOLVED:
+ return irBuilder.buildStaticNoSuchMethod(
+ new Selector.getter(new Name(getter.name, getter.library)),
+ <ir.Primitive>[],
+ sourceInformation);
+ }
+ },
+ rhs,
+ (ir.Primitive result) {
+ SourceInformation sourceInformation =
+ sourceInformationBuilder.buildAssignment(node);
+ switch (setterKind) {
+ case CompoundSetter.FIELD:
+ irBuilder.addPrimitive(
+ new ir.SetStatic(setter, result, sourceInformation));
+ return;
+ case CompoundSetter.SETTER:
+ irBuilder.buildStaticSetterSet(setter, result, sourceInformation);
+ return;
+ case CompoundSetter.INVALID:
+ irBuilder.buildStaticNoSuchMethod(
+ new Selector.setter(new Name(setter.name, setter.library)),
+ <ir.Primitive>[result],
+ sourceInformation);
+ return;
+ }
+ });
}
ir.Primitive buildSuperNoSuchGetter(
- Element element,
- TypeMask mask,
- SourceInformation sourceInformation) {
+ Element element, TypeMask mask, SourceInformation sourceInformation) {
return buildSuperNoSuchMethod(
new Selector.getter(new Name(element.name, element.library)),
mask,
@@ -3195,11 +2944,8 @@
sourceInformation);
}
- ir.Primitive buildSuperNoSuchSetter(
- Element element,
- TypeMask mask,
- ir.Primitive value,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperNoSuchSetter(Element element, TypeMask mask,
+ ir.Primitive value, SourceInformation sourceInformation) {
return buildSuperNoSuchMethod(
new Selector.setter(new Name(element.name, element.library)),
mask,
@@ -3216,39 +2962,43 @@
CompoundSetter setterKind,
CompoundRhs rhs,
arg) {
- return translateCompounds(node, () {
- switch (getterKind) {
- case CompoundGetter.FIELD:
- return irBuilder.buildSuperFieldGet(
- getter, sourceInformationBuilder.buildGet(node));
- case CompoundGetter.GETTER:
- return irBuilder.buildSuperGetterGet(
- getter, sourceInformationBuilder.buildGet(node));
- case CompoundGetter.METHOD:
- return irBuilder.buildSuperMethodGet(
- getter, sourceInformationBuilder.buildGet(node));
- case CompoundGetter.UNRESOLVED:
- return buildSuperNoSuchGetter(
- getter, elements.getGetterTypeMaskInComplexSendSet(node),
- sourceInformationBuilder.buildGet(node));
- }
- }, rhs, (ir.Primitive result) {
- switch (setterKind) {
- case CompoundSetter.FIELD:
- irBuilder.buildSuperFieldSet(setter, result,
- sourceInformationBuilder.buildAssignment(node));
- return;
- case CompoundSetter.SETTER:
- irBuilder.buildSuperSetterSet(setter, result,
- sourceInformationBuilder.buildAssignment(node));
- return;
- case CompoundSetter.INVALID:
- buildSuperNoSuchSetter(
- setter, elements.getTypeMask(node), result,
- sourceInformationBuilder.buildAssignment(node));
- return;
- }
- });
+ return translateCompounds(
+ node,
+ () {
+ switch (getterKind) {
+ case CompoundGetter.FIELD:
+ return irBuilder.buildSuperFieldGet(
+ getter, sourceInformationBuilder.buildGet(node));
+ case CompoundGetter.GETTER:
+ return irBuilder.buildSuperGetterGet(
+ getter, sourceInformationBuilder.buildGet(node));
+ case CompoundGetter.METHOD:
+ return irBuilder.buildSuperMethodGet(
+ getter, sourceInformationBuilder.buildGet(node));
+ case CompoundGetter.UNRESOLVED:
+ return buildSuperNoSuchGetter(
+ getter,
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ sourceInformationBuilder.buildGet(node));
+ }
+ },
+ rhs,
+ (ir.Primitive result) {
+ switch (setterKind) {
+ case CompoundSetter.FIELD:
+ irBuilder.buildSuperFieldSet(setter, result,
+ sourceInformationBuilder.buildAssignment(node));
+ return;
+ case CompoundSetter.SETTER:
+ irBuilder.buildSuperSetterSet(setter, result,
+ sourceInformationBuilder.buildAssignment(node));
+ return;
+ case CompoundSetter.INVALID:
+ buildSuperNoSuchSetter(setter, elements.getTypeMask(node), result,
+ sourceInformationBuilder.buildAssignment(node));
+ return;
+ }
+ });
}
@override
@@ -3260,98 +3010,92 @@
CompoundSetter setterKind,
ast.Node rhs,
_) {
- return translateSetIfNull(node, () {
- switch (getterKind) {
- case CompoundGetter.FIELD:
- return irBuilder.buildSuperFieldGet(
- getter, sourceInformationBuilder.buildGet(node));
- case CompoundGetter.GETTER:
- return irBuilder.buildSuperGetterGet(
- getter, sourceInformationBuilder.buildGet(node));
- case CompoundGetter.METHOD:
- return irBuilder.buildSuperMethodGet(
- getter, sourceInformationBuilder.buildGet(node));
- case CompoundGetter.UNRESOLVED:
- return buildSuperNoSuchGetter(
- getter,
- elements.getGetterTypeMaskInComplexSendSet(node),
- sourceInformationBuilder.buildGet(node));
- }
- }, rhs, (ir.Primitive result) {
- switch (setterKind) {
- case CompoundSetter.FIELD:
- irBuilder.buildSuperFieldSet(
- setter, result,
- sourceInformationBuilder.buildAssignment(node));
- return;
- case CompoundSetter.SETTER:
- irBuilder.buildSuperSetterSet(
- setter, result,
- sourceInformationBuilder.buildAssignment(node));
- return;
- case CompoundSetter.INVALID:
- buildSuperNoSuchSetter(
- setter, elements.getTypeMask(node), result,
- sourceInformationBuilder.buildAssignment(node));
- return;
- }
- });
+ return translateSetIfNull(
+ node,
+ () {
+ switch (getterKind) {
+ case CompoundGetter.FIELD:
+ return irBuilder.buildSuperFieldGet(
+ getter, sourceInformationBuilder.buildGet(node));
+ case CompoundGetter.GETTER:
+ return irBuilder.buildSuperGetterGet(
+ getter, sourceInformationBuilder.buildGet(node));
+ case CompoundGetter.METHOD:
+ return irBuilder.buildSuperMethodGet(
+ getter, sourceInformationBuilder.buildGet(node));
+ case CompoundGetter.UNRESOLVED:
+ return buildSuperNoSuchGetter(
+ getter,
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ sourceInformationBuilder.buildGet(node));
+ }
+ },
+ rhs,
+ (ir.Primitive result) {
+ switch (setterKind) {
+ case CompoundSetter.FIELD:
+ irBuilder.buildSuperFieldSet(setter, result,
+ sourceInformationBuilder.buildAssignment(node));
+ return;
+ case CompoundSetter.SETTER:
+ irBuilder.buildSuperSetterSet(setter, result,
+ sourceInformationBuilder.buildAssignment(node));
+ return;
+ case CompoundSetter.INVALID:
+ buildSuperNoSuchSetter(setter, elements.getTypeMask(node), result,
+ sourceInformationBuilder.buildAssignment(node));
+ return;
+ }
+ });
}
@override
- ir.Primitive handleTypeVariableTypeLiteralCompounds(
- ast.SendSet node,
- TypeVariableElement typeVariable,
- CompoundRhs rhs,
- arg) {
- return translateCompounds(node, () {
- return irBuilder.buildReifyTypeVariable(
- typeVariable.type,
- sourceInformationBuilder.buildGet(node));
- }, rhs, (ir.Primitive value) {
- // The binary operator will throw before this.
- });
+ ir.Primitive handleTypeVariableTypeLiteralCompounds(ast.SendSet node,
+ TypeVariableElement typeVariable, CompoundRhs rhs, arg) {
+ return translateCompounds(
+ node,
+ () {
+ return irBuilder.buildReifyTypeVariable(
+ typeVariable.type, sourceInformationBuilder.buildGet(node));
+ },
+ rhs,
+ (ir.Primitive value) {
+ // The binary operator will throw before this.
+ });
}
@override
ir.Primitive visitTypeVariableTypeLiteralSetIfNull(
- ast.Send node,
- TypeVariableElement element,
- ast.Node rhs,
- _) {
+ ast.Send node, TypeVariableElement element, ast.Node rhs, _) {
// The type variable is never `null`.
- return translateTypeVariableTypeLiteral(element,
- sourceInformationBuilder.buildGet(node));
+ return translateTypeVariableTypeLiteral(
+ element, sourceInformationBuilder.buildGet(node));
}
@override
- ir.Primitive handleIndexCompounds(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- CompoundRhs rhs,
- arg) {
+ ir.Primitive handleIndexCompounds(ast.SendSet node, ast.Node receiver,
+ ast.Node index, CompoundRhs rhs, arg) {
ir.Primitive target = visit(receiver);
ir.Primitive indexValue = visit(index);
- return translateCompounds(node, () {
- Selector selector = new Selector.index();
- List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
- CallStructure callStructure =
- normalizeDynamicArguments(selector.callStructure, arguments);
- return irBuilder.buildDynamicInvocation(
- target,
- new Selector(selector.kind, selector.memberName, callStructure),
- elements.getGetterTypeMaskInComplexSendSet(node),
- arguments,
- sourceInformationBuilder.buildCall(receiver, node));
- }, rhs, (ir.Primitive result) {
- irBuilder.buildDynamicIndexSet(
- target,
- elements.getTypeMask(node),
- indexValue,
- result,
- sourceInformationBuilder.buildIndexSet(node));
- });
+ return translateCompounds(
+ node,
+ () {
+ Selector selector = new Selector.index();
+ List<ir.Primitive> arguments = <ir.Primitive>[indexValue];
+ CallStructure callStructure =
+ normalizeDynamicArguments(selector.callStructure, arguments);
+ return irBuilder.buildDynamicInvocation(
+ target,
+ new Selector(selector.kind, selector.memberName, callStructure),
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ arguments,
+ sourceInformationBuilder.buildCall(receiver, node));
+ },
+ rhs,
+ (ir.Primitive result) {
+ irBuilder.buildDynamicIndexSet(target, elements.getTypeMask(node),
+ indexValue, result, sourceInformationBuilder.buildIndexSet(node));
+ });
}
@override
@@ -3363,42 +3107,41 @@
CompoundRhs rhs,
arg,
{bool isGetterValid,
- bool isSetterValid}) {
+ bool isSetterValid}) {
ir.Primitive indexValue = visit(index);
- return translateCompounds(node, () {
- if (isGetterValid) {
- return irBuilder.buildSuperIndex(
- indexFunction,
- indexValue,
- sourceInformationBuilder.buildIndex(node));
- } else {
- return buildSuperNoSuchMethod(
- new Selector.index(),
- elements.getGetterTypeMaskInComplexSendSet(node),
- <ir.Primitive>[indexValue],
- sourceInformationBuilder.buildIndex(node));
- }
- }, rhs, (ir.Primitive result) {
- if (isSetterValid) {
- irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result,
- sourceInformationBuilder.buildIndexSet(node));
- } else {
- buildSuperNoSuchMethod(
- new Selector.indexSet(),
- elements.getTypeMask(node),
- <ir.Primitive>[indexValue, result],
- sourceInformationBuilder.buildIndexSet(node));
- }
- });
+ return translateCompounds(
+ node,
+ () {
+ if (isGetterValid) {
+ return irBuilder.buildSuperIndex(indexFunction, indexValue,
+ sourceInformationBuilder.buildIndex(node));
+ } else {
+ return buildSuperNoSuchMethod(
+ new Selector.index(),
+ elements.getGetterTypeMaskInComplexSendSet(node),
+ <ir.Primitive>[indexValue],
+ sourceInformationBuilder.buildIndex(node));
+ }
+ },
+ rhs,
+ (ir.Primitive result) {
+ if (isSetterValid) {
+ irBuilder.buildSuperIndexSet(indexSetFunction, indexValue, result,
+ sourceInformationBuilder.buildIndexSet(node));
+ } else {
+ buildSuperNoSuchMethod(
+ new Selector.indexSet(),
+ elements.getTypeMask(node),
+ <ir.Primitive>[indexValue, result],
+ sourceInformationBuilder.buildIndexSet(node));
+ }
+ });
}
/// Build code to handle foreign code, that is, native JavaScript code, or
/// builtin values and operations of the backend.
- ir.Primitive handleForeignCode(ast.Send node,
- MethodElement function,
- ast.NodeList argumentList,
- CallStructure callStructure) {
-
+ ir.Primitive handleForeignCode(ast.Send node, MethodElement function,
+ ast.NodeList argumentList, CallStructure callStructure) {
void validateArgumentCount({int minimum, int exactly}) {
assert((minimum == null) != (exactly == null));
int count = 0;
@@ -3420,15 +3163,14 @@
/// Call a helper method from the isolate library. The isolate library uses
/// its own isolate structure, that encapsulates dart2js's isolate.
- ir.Primitive buildIsolateHelperInvocation(MethodElement element,
- CallStructure callStructure) {
+ ir.Primitive buildIsolateHelperInvocation(
+ MethodElement element, CallStructure callStructure) {
if (element == null) {
- reporter.internalError(node,
- 'Isolate library and compiler mismatch.');
+ reporter.internalError(node, 'Isolate library and compiler mismatch.');
}
List<ir.Primitive> arguments = <ir.Primitive>[];
- callStructure = translateStaticArguments(argumentList, element,
- callStructure, arguments);
+ callStructure = translateStaticArguments(
+ argumentList, element, callStructure, arguments);
Selector selector = new Selector.call(element.memberName, callStructure);
return irBuilder.buildInvokeStatic(element, selector, arguments,
sourceInformationBuilder.buildCall(node, node.selector));
@@ -3437,11 +3179,12 @@
/// Lookup the value of the enum described by [node].
getEnumValue(ast.Node node, EnumClassElement enumClass, List values) {
Element element = elements[node];
- if (element is! FieldElement || element.enclosingClass != enumClass) {
+ if (element is! EnumConstantElement ||
+ element.enclosingClass != enumClass) {
internalError(node, 'expected a JsBuiltin enum value');
}
-
- int index = enumClass.enumValues.indexOf(element);
+ EnumConstantElement enumConstant = element;
+ int index = enumConstant.index;
return values[index];
}
@@ -3457,9 +3200,9 @@
}
}
- Link<ast.Node> argumentNodes = argumentList.nodes;
+ Link<ast.Node> argumentNodes = argumentList.nodes;
NativeBehavior behavior =
- compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node);
+ compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node);
switch (function.name) {
case 'JS':
validateArgumentCount(minimum: 2);
@@ -3467,13 +3210,12 @@
// which already have been analyzed by the resolver and can be retrieved
// using [NativeBehavior]. We can ignore these arguments in the backend.
List<ir.Primitive> arguments =
- argumentNodes.skip(2).mapToList(visit, growable: false);
+ argumentNodes.skip(2).mapToList(visit, growable: false);
if (behavior.codeTemplate.positionalArgumentCount != arguments.length) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text':
- 'Mismatch between number of placeholders'
- ' and number of arguments.'});
+ reporter.reportErrorMessage(node, MessageKind.GENERIC, {
+ 'text': 'Mismatch between number of placeholders'
+ ' and number of arguments.'
+ });
return irBuilder.buildNullConstant();
}
@@ -3494,12 +3236,11 @@
ast.Node argument = node.arguments.single;
FunctionElement closure = elements[argument].implementation;
if (!Elements.isStaticOrTopLevelFunction(closure)) {
- internalError(argument,
- 'only static or toplevel function supported');
+ internalError(argument, 'only static or toplevel function supported');
}
if (closure.functionSignature.hasOptionalParameters) {
- internalError(argument,
- 'closures with optional parameters not supported');
+ internalError(
+ argument, 'closures with optional parameters not supported');
}
return irBuilder.buildForeignCode(
js.js.expressionTemplateYielding(
@@ -3510,19 +3251,19 @@
dependency: closure);
case 'JS_BUILTIN':
- // The first argument is a description of the type and effect of the
- // builtin, which has already been analyzed in the frontend. The second
- // argument must be a [JsBuiltin] value. All other arguments are
- // values used by the JavaScript template that is associated with the
- // builtin.
+ // The first argument is a description of the type and effect of the
+ // builtin, which has already been analyzed in the frontend. The second
+ // argument must be a [JsBuiltin] value. All other arguments are
+ // values used by the JavaScript template that is associated with the
+ // builtin.
validateArgumentCount(minimum: 2);
ast.Node builtin = argumentNodes.tail.head;
- JsBuiltin value = getEnumValue(builtin, helpers.jsBuiltinEnum,
- JsBuiltin.values);
+ JsBuiltin value =
+ getEnumValue(builtin, helpers.jsBuiltinEnum, JsBuiltin.values);
js.Template template = backend.emitter.builtinTemplateFor(value);
List<ir.Primitive> arguments =
- argumentNodes.skip(2).mapToList(visit, growable: false);
+ argumentNodes.skip(2).mapToList(visit, growable: false);
return irBuilder.buildForeignCode(template, arguments, behavior,
sourceInformationBuilder.buildForeignCode(node));
@@ -3531,7 +3272,7 @@
String name = expectStringConstant(argumentNodes.tail.head);
js.Expression access =
- backend.emitter.generateEmbeddedGlobalAccess(name);
+ backend.emitter.generateEmbeddedGlobalAccess(name);
js.Template template = js.js.expressionTemplateYielding(access);
return irBuilder.buildForeignCode(template, <ir.Primitive>[], behavior,
sourceInformationBuilder.buildForeignCode(node));
@@ -3544,7 +3285,7 @@
if (argumentValue is ir.Constant && argumentValue.value.isType) {
TypeConstantValue constant = argumentValue.value;
ConstantValue interceptorValue =
- new InterceptorConstantValue(constant.representedType);
+ new InterceptorConstantValue(constant.representedType);
return irBuilder.buildConstant(interceptorValue);
}
return internalError(argument, 'expected Type as argument');
@@ -3556,12 +3297,11 @@
validateArgumentCount(exactly: 1);
ast.Node argument = argumentNodes.head;
- JsGetName id = getEnumValue(argument, helpers.jsGetNameEnum,
- JsGetName.values);
+ JsGetName id =
+ getEnumValue(argument, helpers.jsGetNameEnum, JsGetName.values);
js.Name name = backend.namer.getNameForJsGetName(argument, id);
- ConstantValue nameConstant =
- new SyntheticConstantValue(SyntheticConstantKind.NAME,
- js.js.quoteName(name));
+ ConstantValue nameConstant = new SyntheticConstantValue(
+ SyntheticConstantKind.NAME, js.js.quoteName(name));
return irBuilder.buildConstant(nameConstant);
@@ -3585,8 +3325,8 @@
case 'JS_STRING_CONCAT':
validateArgumentCount(exactly: 2);
List<ir.Primitive> arguments = argumentNodes.mapToList(visit);
- return irBuilder.buildStringConcatenation(arguments,
- sourceInformationBuilder.buildForeignCode(node));
+ return irBuilder.buildStringConcatenation(
+ arguments, sourceInformationBuilder.buildForeignCode(node));
case 'JS_CURRENT_ISOLATE_CONTEXT':
validateArgumentCount(exactly: 0);
@@ -3596,8 +3336,8 @@
// to fetch the current isolate.
continue getStaticState;
}
- return buildIsolateHelperInvocation(helpers.currentIsolate,
- CallStructure.NO_ARGS);
+ return buildIsolateHelperInvocation(
+ helpers.currentIsolate, CallStructure.NO_ARGS);
getStaticState: case 'JS_GET_STATIC_STATE':
validateArgumentCount(exactly: 0);
@@ -3624,12 +3364,14 @@
if (!compiler.hasIsolateSupport) {
ir.Primitive closure = visit(argumentNodes.tail.head);
- return irBuilder.buildCallInvocation(closure, CallStructure.NO_ARGS,
+ return irBuilder.buildCallInvocation(
+ closure,
+ CallStructure.NO_ARGS,
const <ir.Primitive>[],
sourceInformationBuilder.buildForeignCode(node));
}
- return buildIsolateHelperInvocation(helpers.callInIsolate,
- CallStructure.TWO_ARGS);
+ return buildIsolateHelperInvocation(
+ helpers.callInIsolate, CallStructure.TWO_ARGS);
default:
return giveup(node, 'unplemented native construct: ${function.name}');
@@ -3669,22 +3411,21 @@
assert(irBuilder.isOpen);
List<ir.Primitive> parts = <ir.Primitive>[];
buildStringParts(node, parts);
- return irBuilder.buildStringConcatenation(parts,
- sourceInformationBuilder.buildStringInterpolation(node));
+ return irBuilder.buildStringConcatenation(
+ parts, sourceInformationBuilder.buildStringInterpolation(node));
}
ir.Primitive visitStringInterpolation(ast.StringInterpolation node) {
assert(irBuilder.isOpen);
List<ir.Primitive> parts = <ir.Primitive>[];
buildStringParts(node, parts);
- return irBuilder.buildStringConcatenation(parts,
- sourceInformationBuilder.buildStringInterpolation(node));
+ return irBuilder.buildStringConcatenation(
+ parts, sourceInformationBuilder.buildStringInterpolation(node));
}
ir.Primitive translateConstant(ast.Node node) {
assert(irBuilder.isOpen);
- return irBuilder.buildConstant(
- getConstantForNode(node),
+ return irBuilder.buildConstant(getConstantForNode(node),
sourceInformation: sourceInformationBuilder.buildGet(node));
}
@@ -3695,16 +3436,13 @@
return irBuilder.buildNonTailThrow(visit(node.expression));
}
- ir.Primitive buildSuperNoSuchMethod(
- Selector selector,
- TypeMask mask,
- List<ir.Primitive> arguments,
- SourceInformation sourceInformation) {
+ ir.Primitive buildSuperNoSuchMethod(Selector selector, TypeMask mask,
+ List<ir.Primitive> arguments, SourceInformation sourceInformation) {
ClassElement cls = elements.analyzedElement.enclosingClass;
MethodElement element = cls.lookupSuperMember(Identifiers.noSuchMethod_);
if (!Selectors.noSuchMethod_.signatureApplies(element)) {
- element = compiler.coreClasses.objectClass.lookupMember(
- Identifiers.noSuchMethod_);
+ element = compiler.coreClasses.objectClass
+ .lookupMember(Identifiers.noSuchMethod_);
}
return irBuilder.buildSuperMethodInvocation(
element,
@@ -3714,11 +3452,8 @@
}
@override
- ir.Primitive visitUnresolvedCompound(
- ast.Send node,
- Element element,
- op.AssignmentOperator operator,
- ast.Node rhs, _) {
+ ir.Primitive visitUnresolvedCompound(ast.Send node, Element element,
+ op.AssignmentOperator operator, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(
new Selector.getter(new Name(element.name, element.library)),
[],
@@ -3731,14 +3466,13 @@
Element element,
DartType type,
ast.NodeList arguments,
- Selector selector, _) {
+ Selector selector,
+ _) {
// If the class is missing it's a runtime error.
ir.Primitive message =
irBuilder.buildStringConstant("Unresolved class: '${element.name}'");
- return irBuilder.buildStaticFunctionInvocation(
- helpers.throwRuntimeError,
- <ir.Primitive>[message],
- sourceInformationBuilder.buildNew(node));
+ return irBuilder.buildStaticFunctionInvocation(helpers.throwRuntimeError,
+ <ir.Primitive>[message], sourceInformationBuilder.buildNew(node));
}
@override
@@ -3747,7 +3481,8 @@
Element constructor,
DartType type,
ast.NodeList argumentsNode,
- Selector selector, _) {
+ Selector selector,
+ _) {
// If the class is there but the constructor is missing, it's an NSM error.
List<ir.Primitive> arguments = <ir.Primitive>[];
CallStructure callStructure = translateDynamicArguments(
@@ -3764,30 +3499,26 @@
ConstructorElement constructor,
DartType type,
ast.NodeList argumentsNode,
- CallStructure callStructure, _) {
+ CallStructure callStructure,
+ _) {
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
return irBuilder.buildStaticNoSuchMethod(
- new Selector.call(constructor.memberName, callStructure), arguments,
+ new Selector.call(constructor.memberName, callStructure),
+ arguments,
sourceInformationBuilder.buildNew(node));
}
@override
- ir.Primitive visitUnresolvedGet(
- ast.Send node,
- Element element, _) {
- return irBuilder.buildStaticNoSuchMethod(
- elements.getSelector(node), [],
+ ir.Primitive visitUnresolvedGet(ast.Send node, Element element, _) {
+ return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node), [],
sourceInformationBuilder.buildGet(node));
}
@override
- ir.Primitive visitUnresolvedInvoke(
- ast.Send node,
- Element element,
- ast.NodeList arguments,
- Selector selector, _) {
+ ir.Primitive visitUnresolvedInvoke(ast.Send node, Element element,
+ ast.NodeList arguments, Selector selector, _) {
return irBuilder.buildStaticNoSuchMethod(
elements.getSelector(node),
arguments.nodes.mapToList(visit),
@@ -3796,11 +3527,12 @@
@override
ir.Primitive visitUnresolvedRedirectingFactoryConstructorInvoke(
- ast.NewExpression node,
- ConstructorElement constructor,
- InterfaceType type,
- ast.NodeList argumentsNode,
- CallStructure callStructure, _) {
+ ast.NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ ast.NodeList argumentsNode,
+ CallStructure callStructure,
+ _) {
String nameString = Elements.reconstructConstructorName(constructor);
Name name = new Name(nameString, constructor.library);
List<ir.Primitive> arguments = <ir.Primitive>[];
@@ -3814,31 +3546,25 @@
@override
ir.Primitive visitUnresolvedSet(
- ast.Send node,
- Element element,
- ast.Node rhs, _) {
+ ast.Send node, Element element, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(elements.getSelector(node),
- [visit(rhs)],
- sourceInformationBuilder.buildAssignment(node));
+ [visit(rhs)], sourceInformationBuilder.buildAssignment(node));
}
@override
ir.Primitive visitUnresolvedSuperIndex(
- ast.Send node,
- Element function,
- ast.Node index, _) {
+ ast.Send node, Element function, ast.Node index, _) {
// Assume the index getter is missing.
return buildSuperNoSuchMethod(
- new Selector.index(), elements.getTypeMask(node), [visit(index)],
+ new Selector.index(),
+ elements.getTypeMask(node),
+ [visit(index)],
sourceInformationBuilder.buildIndex(node));
}
@override
- ir.Primitive visitUnresolvedSuperBinary(
- ast.Send node,
- Element element,
- op.BinaryOperator operator,
- ast.Node argument, _) {
+ ir.Primitive visitUnresolvedSuperBinary(ast.Send node, Element element,
+ op.BinaryOperator operator, ast.Node argument, _) {
return buildSuperNoSuchMethod(
elements.getSelector(node),
elements.getTypeMask(node),
@@ -3848,11 +3574,11 @@
@override
ir.Primitive visitUnresolvedSuperUnary(
- ast.Send node,
- op.UnaryOperator operator,
- Element element, _) {
+ ast.Send node, op.UnaryOperator operator, Element element, _) {
return buildSuperNoSuchMethod(
- elements.getSelector(node), elements.getTypeMask(node), [],
+ elements.getSelector(node),
+ elements.getTypeMask(node),
+ [],
sourceInformationBuilder.buildCall(node, node.selector));
}
@@ -3868,9 +3594,7 @@
@override
ir.Primitive visitClassTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs, _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
InterfaceType type = constant.type;
ClassElement element = type.element;
return irBuilder.buildStaticNoSuchMethod(
@@ -3881,9 +3605,7 @@
@override
ir.Primitive visitTypedefTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs, _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
TypedefType type = constant.type;
TypedefElement element = type.element;
return irBuilder.buildStaticNoSuchMethod(
@@ -3894,21 +3616,19 @@
@override
ir.Primitive visitTypeVariableTypeLiteralSet(
- ast.SendSet node,
- TypeVariableElement element,
- ast.Node rhs, _) {
+ ast.SendSet node, TypeVariableElement element, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(
- new Selector.setter(element.memberName), [visit(rhs)],
+ new Selector.setter(element.memberName),
+ [visit(rhs)],
sourceInformationBuilder.buildAssignment(node));
}
@override
ir.Primitive visitDynamicTypeLiteralSet(
- ast.SendSet node,
- ConstantExpression constant,
- ast.Node rhs, _) {
+ ast.SendSet node, ConstantExpression constant, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(
- new Selector.setter(Names.dynamic_), [visit(rhs)],
+ new Selector.setter(Names.dynamic_),
+ [visit(rhs)],
sourceInformationBuilder.buildAssignment(node));
}
@@ -3918,7 +3638,8 @@
ConstructorElement element,
InterfaceType type,
ast.NodeList arguments,
- CallStructure callStructure, _) {
+ CallStructure callStructure,
+ _) {
for (ast.Node argument in arguments) visit(argument);
ir.Primitive name =
irBuilder.buildStringConstant(element.enclosingClass.name);
@@ -3930,9 +3651,7 @@
@override
ir.Primitive handleFinalStaticFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs, _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
// TODO(asgerf): Include class name somehow for static class members?
return irBuilder.buildStaticNoSuchMethod(
new Selector.setter(field.memberName),
@@ -3942,9 +3661,7 @@
@override
ir.Primitive visitFinalSuperFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs, _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
return buildSuperNoSuchMethod(
new Selector.setter(field.memberName),
elements.getTypeMask(node),
@@ -3954,9 +3671,7 @@
@override
ir.Primitive handleImmutableLocalSet(
- ast.SendSet node,
- LocalElement local,
- ast.Node rhs, _) {
+ ast.SendSet node, LocalElement local, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(
new Selector.setter(new Name(local.name, local.library)),
[visit(rhs)],
@@ -3965,10 +3680,7 @@
@override
ir.Primitive handleStaticFunctionSet(
- ast.Send node,
- MethodElement function,
- ast.Node rhs,
- _) {
+ ast.Send node, MethodElement function, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(
new Selector.setter(function.memberName),
[visit(rhs)],
@@ -3977,10 +3689,7 @@
@override
ir.Primitive handleStaticGetterSet(
- ast.SendSet node,
- GetterElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, GetterElement getter, ast.Node rhs, _) {
return irBuilder.buildStaticNoSuchMethod(
new Selector.setter(getter.memberName),
[visit(rhs)],
@@ -3988,10 +3697,7 @@
}
@override
- ir.Primitive handleStaticSetterGet(
- ast.Send node,
- SetterElement setter,
- _) {
+ ir.Primitive handleStaticSetterGet(ast.Send node, SetterElement setter, _) {
return irBuilder.buildStaticNoSuchMethod(
new Selector.getter(setter.memberName),
[],
@@ -3999,11 +3705,8 @@
}
@override
- ir.Primitive handleStaticSetterInvoke(
- ast.Send node,
- SetterElement setter,
- ast.NodeList argumentsNode,
- CallStructure callStructure, _) {
+ ir.Primitive handleStaticSetterInvoke(ast.Send node, SetterElement setter,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
// Translate as a method call.
List<ir.Primitive> arguments = argumentsNode.nodes.mapToList(visit);
return irBuilder.buildStaticNoSuchMethod(
@@ -4014,10 +3717,7 @@
@override
ir.Primitive visitSuperGetterSet(
- ast.SendSet node,
- GetterElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, GetterElement getter, ast.Node rhs, _) {
return buildSuperNoSuchMethod(
new Selector.setter(getter.memberName),
elements.getTypeMask(node),
@@ -4027,10 +3727,7 @@
@override
ir.Primitive visitSuperMethodSet(
- ast.Send node,
- MethodElement method,
- ast.Node rhs,
- _) {
+ ast.Send node, MethodElement method, ast.Node rhs, _) {
return buildSuperNoSuchMethod(
new Selector.setter(method.memberName),
elements.getTypeMask(node),
@@ -4039,9 +3736,7 @@
}
@override
- ir.Primitive visitSuperSetterGet(
- ast.Send node,
- SetterElement setter, _) {
+ ir.Primitive visitSuperSetterGet(ast.Send node, SetterElement setter, _) {
return buildSuperNoSuchMethod(
new Selector.getter(setter.memberName),
elements.getTypeMask(node),
@@ -4050,11 +3745,8 @@
}
@override
- ir.Primitive visitSuperSetterInvoke(
- ast.Send node,
- SetterElement setter,
- ast.NodeList argumentsNode,
- CallStructure callStructure, _) {
+ ir.Primitive visitSuperSetterInvoke(ast.Send node, SetterElement setter,
+ ast.NodeList argumentsNode, CallStructure callStructure, _) {
List<ir.Primitive> arguments = <ir.Primitive>[];
callStructure =
translateDynamicArguments(argumentsNode, callStructure, arguments);
@@ -4068,7 +3760,7 @@
ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
try {
return action();
- } catch(e) {
+ } catch (e) {
if (e == ABORT_IRNODE_BUILDER) {
return null;
}
@@ -4297,7 +3989,7 @@
}
TypeMask getTypeMaskForNativeFunction(FunctionElement function) {
- return _compiler.typesTask.getGuaranteedReturnTypeOfElement(function);
+ return _compiler.typesTask.getGuaranteedReturnTypeOfElement(function);
}
FieldElement locateSingleField(Selector selector, TypeMask type) {
@@ -4324,13 +4016,13 @@
bool isJsInterop(FunctionElement element) => _backend.isJsInterop(element);
bool isJsInteropAnonymous(FunctionElement element) =>
- _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass);
+ _backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass);
String getJsInteropTargetPath(FunctionElement element) {
return '${_backend.namer.fixedBackendPath(element)}.'
- '${_backend.nativeData.getFixedBackendName(element)}';
+ '${_backend.nativeData.getFixedBackendName(element)}';
}
DartType get jsJavascriptObjectType =>
- _backend.helpers.jsJavaScriptObjectClass.thisType;
+ _backend.helpers.jsJavaScriptObjectClass.thisType;
}
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart
index efdc27f..cee7a1e 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_integrity.dart
@@ -27,7 +27,6 @@
/// - Each reference object occurs only once in the IR (no sharing).
///
class CheckCpsIntegrity extends TrampolineRecursiveVisitor {
-
FunctionDefinition topLevelNode;
final Map<Definition, ScopeType> inScope = <Definition, ScopeType>{};
final List<Definition> definitions = [];
@@ -40,13 +39,16 @@
int i = 0;
for (Reference ref = def.firstRef; ref != null; ref = ref.next) {
if (ref.definition != def) {
- error('Reference to ${ref.definition} found in '
- 'reference chain for $def', def);
+ error(
+ 'Reference to ${ref.definition} found in '
+ 'reference chain for $def',
+ def);
}
if (ref == anchor) {
error('Cyclic reference chain for $def', def);
}
- if (i & ++i == 0) { // Move the anchor every 2^Nth step.
+ if (i & ++i == 0) {
+ // Move the anchor every 2^Nth step.
anchor = ref;
}
}
@@ -225,9 +227,9 @@
sexpr = '(Set DUMP_IR flag to enable SExpr dump)';
}
throw 'CPS integrity violation\n'
- 'After \'$previousPass\' on ${topLevelNode.element}\n'
- '$message\n\n'
- '$sexpr\n';
+ 'After \'$previousPass\' on ${topLevelNode.element}\n'
+ '$message\n\n'
+ '$sexpr\n';
}
}
@@ -260,7 +262,7 @@
_worklist.add(node);
if (node.parent != _parent) {
error('Parent pointer on $node is ${node.parent} but should be $_parent',
- node);
+ node);
}
}
@@ -268,7 +270,7 @@
processReference(Reference node) {
if (node.parent != _parent) {
error('Parent pointer on $node is ${node.parent} but should be $_parent',
- node);
+ node);
}
}
}
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
index d543cc6..3e82f93 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes.dart
@@ -423,14 +423,9 @@
final SourceInformation sourceInformation;
Expression body;
- FunctionDefinition(
- this.element,
- this.receiverParameter,
- this.parameters,
- this.returnContinuation,
- this.body,
- {this.interceptorParameter,
- this.sourceInformation});
+ FunctionDefinition(this.element, this.receiverParameter, this.parameters,
+ this.returnContinuation, this.body,
+ {this.interceptorParameter, this.sourceInformation});
accept(BlockVisitor visitor) => visitor.visitFunctionDefinition(this);
@@ -568,8 +563,8 @@
InvokeMethod(
Primitive receiver, this.selector, this.mask, List<Primitive> arguments,
{this.sourceInformation,
- CallingConvention callingConvention,
- Primitive interceptor})
+ CallingConvention callingConvention,
+ Primitive interceptor})
: this.receiverRef = new Reference<Primitive>(receiver),
this.argumentRefs = _referenceList(arguments),
this.interceptorRef = _optionalReference(interceptor),
@@ -1144,9 +1139,7 @@
MutableVariable get variable => variableRef.definition;
Primitive get value => valueRef.definition;
- SetMutable(
- MutableVariable variable,
- Primitive value,
+ SetMutable(MutableVariable variable, Primitive value,
{this.sourceInformation})
: this.variableRef = new Reference<MutableVariable>(variable),
this.valueRef = new Reference<Primitive>(value);
@@ -1181,11 +1174,8 @@
Primitive get object => objectRef.definition;
- GetField(
- Primitive object,
- this.field,
- {this.sourceInformation,
- this.isFinal: false})
+ GetField(Primitive object, this.field,
+ {this.sourceInformation, this.isFinal: false})
: this.objectRef = new Reference<Primitive>(object);
accept(Visitor visitor) => visitor.visitGetField(this);
@@ -1213,10 +1203,7 @@
Primitive get object => objectRef.definition;
Primitive get value => valueRef.definition;
- SetField(
- Primitive object,
- this.field,
- Primitive value,
+ SetField(Primitive object, this.field, Primitive value,
{this.sourceInformation})
: this.objectRef = new Reference<Primitive>(object),
this.valueRef = new Reference<Primitive>(value);
@@ -1548,12 +1535,8 @@
Primitive argument(int n) => argumentRefs[n].definition;
Iterable<Primitive> get arguments => _dereferenceList(argumentRefs);
- ForeignCode(
- this.codeTemplate,
- this.storedType,
- List<Primitive> arguments,
- this.nativeBehavior,
- this.sourceInformation,
+ ForeignCode(this.codeTemplate, this.storedType, List<Primitive> arguments,
+ this.nativeBehavior, this.sourceInformation,
{this.dependency})
: this.argumentRefs = _referenceList(arguments) {
effects = Effects.from(nativeBehavior.sideEffects);
@@ -2084,10 +2067,7 @@
/// boolean.
bool isStrictCheck;
- Branch(
- Primitive condition,
- Continuation trueCont,
- Continuation falseCont,
+ Branch(Primitive condition, Continuation trueCont, Continuation falseCont,
this.sourceInformation,
{bool strict})
: this.conditionRef = new Reference<Primitive>(condition),
@@ -2097,18 +2077,12 @@
assert(strict != null);
}
- Branch.strict(
- Primitive condition,
- Continuation trueCont,
- Continuation falseCont,
- SourceInformation sourceInformation)
+ Branch.strict(Primitive condition, Continuation trueCont,
+ Continuation falseCont, SourceInformation sourceInformation)
: this(condition, trueCont, falseCont, sourceInformation, strict: true);
- Branch.loose(
- Primitive condition,
- Continuation trueCont,
- Continuation falseCont,
- SourceInformation sourceInformation)
+ Branch.loose(Primitive condition, Continuation trueCont,
+ Continuation falseCont, SourceInformation sourceInformation)
: this(condition, trueCont, falseCont, sourceInformation, strict: false);
accept(BlockVisitor visitor) => visitor.visitBranch(this);
@@ -2888,8 +2862,8 @@
}
Definition visitGetMutable(GetMutable node) {
- return new GetMutable(
- getCopy(node.variableRef), sourceInformation: node.sourceInformation);
+ return new GetMutable(getCopy(node.variableRef),
+ sourceInformation: node.sourceInformation);
}
Definition visitParameter(Parameter node) {
@@ -3004,8 +2978,7 @@
Definition visitForeignCode(ForeignCode node) {
return new ForeignCode(node.codeTemplate, node.storedType,
- getList(node.argumentRefs), node.nativeBehavior,
- node.sourceInformation,
+ getList(node.argumentRefs), node.nativeBehavior, node.sourceInformation,
dependency: node.dependency);
}
}
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
index 5dad783..185f011 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_nodes_sexpr.dart
@@ -7,8 +7,7 @@
import '../constants/values.dart';
import '../util/util.dart';
import 'cps_ir_nodes.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../universe/call_structure.dart' show CallStructure;
/// A [Decorator] is a function used by [SExpressionStringifier] to augment the
/// output produced for a node or reference. It can be provided to the
@@ -178,8 +177,8 @@
return '$indentation(LetMutable ($name $value)\n$body)';
}
- String formatArguments(CallStructure call,
- List<Reference<Primitive>> arguments,
+ String formatArguments(
+ CallStructure call, List<Reference<Primitive>> arguments,
[CallingConvention callingConvention = CallingConvention.Normal]) {
int positionalArgumentCount = call.positionalArgumentCount;
List<String> args =
@@ -191,15 +190,16 @@
args.add("($name: $arg)");
}
// Constructors can have type parameter after the named arguments.
- args.addAll(
- arguments.skip(positionalArgumentCount + argumentNames.length)
- .map(access));
+ args.addAll(arguments
+ .skip(positionalArgumentCount + argumentNames.length)
+ .map(access));
return '(${args.join(' ')})';
}
String visitInvokeStatic(InvokeStatic node) {
String name = node.target.name;
- String args = formatArguments(node.selector.callStructure, node.argumentRefs);
+ String args =
+ formatArguments(node.selector.callStructure, node.argumentRefs);
return '(InvokeStatic $name $args)';
}
@@ -207,8 +207,8 @@
String name = node.selector.name;
String interceptor = optionalAccess(node.interceptorRef);
String receiver = access(node.receiverRef);
- String arguments = formatArguments(node.selector.callStructure,
- node.argumentRefs, node.callingConvention);
+ String arguments = formatArguments(
+ node.selector.callStructure, node.argumentRefs, node.callingConvention);
return '(InvokeMethod $interceptor $receiver $name $arguments)';
}
@@ -216,8 +216,8 @@
String interceptor = optionalAccess(node.interceptorRef);
String receiver = access(node.receiverRef);
String name = node.selector.name;
- String arguments = formatArguments(node.selector.callStructure,
- node.argumentRefs, node.callingConvention);
+ String arguments = formatArguments(
+ node.selector.callStructure, node.argumentRefs, node.callingConvention);
return '(InvokeMethodDirectly $interceptor $receiver $name $arguments)';
}
@@ -232,7 +232,8 @@
if (!node.target.name.isEmpty) {
name = '${name}.${node.target.name}';
}
- String args = formatArguments(node.selector.callStructure, node.argumentRefs);
+ String args =
+ formatArguments(node.selector.callStructure, node.argumentRefs);
return '(InvokeConstructor $name $args)';
}
@@ -241,7 +242,7 @@
if (node.isRecursive) name = 'rec $name';
String args = node.argumentRefs == null
? '**** NULL ****'
- : node.argumentRefs.map(access).join(' ');
+ : node.argumentRefs.map(access).join(' ');
String escaping = node.isEscapingTry ? ' escape' : '';
return '$indentation(InvokeContinuation $name ($args)$escaping)';
}
@@ -259,10 +260,8 @@
String condition = access(node.conditionRef);
assert(isBranchTarget(node.trueContinuation));
assert(isBranchTarget(node.falseContinuation));
- String trueCont =
- indentBlock(() => visit(node.trueContinuation));
- String falseCont =
- indentBlock(() => visit(node.falseContinuation));
+ String trueCont = indentBlock(() => visit(node.trueContinuation));
+ String falseCont = indentBlock(() => visit(node.falseContinuation));
String strict = node.isStrictCheck ? 'Strict' : 'NonStrict';
return '$indentation(Branch $strict $condition\n$trueCont\n$falseCont)';
}
@@ -494,7 +493,7 @@
String visitList(ListConstantValue constant, _) {
String entries =
- constant.entries.map((entry) => entry.accept(this, _)).join(' ');
+ constant.entries.map((entry) => entry.accept(this, _)).join(' ');
return '(List $entries)';
}
diff --git a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
index 8a53864..7b7e1e4 100644
--- a/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
+++ b/pkg/compiler/lib/src/cps_ir/cps_ir_tracer.dart
@@ -52,7 +52,6 @@
throw 'The IR tracer reached an unexpected IR instruction: $node';
}
-
int countUses(cps_ir.Definition definition) {
int count = 0;
cps_ir.Reference ref = definition.firstRef;
@@ -307,7 +306,7 @@
visitInterceptor(cps_ir.Interceptor node) {
return 'Interceptor(${formatReference(node.inputRef)}, '
- '${node.interceptedClasses})';
+ '${node.interceptedClasses})';
}
visitGetMutable(cps_ir.GetMutable node) {
@@ -361,8 +360,8 @@
visitForeignCode(cps_ir.ForeignCode node) {
String id = names.name(node);
String arguments = node.argumentRefs.map(formatReference).join(', ');
- printStmt(id,
- "ForeignCode ${node.type} ${node.codeTemplate.source} $arguments");
+ printStmt(
+ id, "ForeignCode ${node.type} ${node.codeTemplate.source} $arguments");
}
visitGetLength(cps_ir.GetLength node) {
@@ -391,12 +390,10 @@
visitBoundsCheck(cps_ir.BoundsCheck node) {
String object = formatReference(node.objectRef);
- String index = node.indexRef == null
- ? 'no-index'
- : formatReference(node.indexRef);
- String length = node.lengthRef == null
- ? 'no-length'
- : formatReference(node.lengthRef);
+ String index =
+ node.indexRef == null ? 'no-index' : formatReference(node.indexRef);
+ String length =
+ node.lengthRef == null ? 'no-length' : formatReference(node.lengthRef);
return 'BoundsCheck $object $index $length ${node.checkString}';
}
@@ -416,13 +413,7 @@
*/
class Names {
final Map<Object, String> names = {};
- final Map<String, int> counters = {
- 'r': 0,
- 'B': 0,
- 'v': 0,
- 'x': 0,
- 'c': 0
- };
+ final Map<String, int> counters = {'r': 0, 'B': 0, 'v': 0, 'x': 0, 'c': 0};
String prefix(x) {
if (x is cps_ir.Parameter) return 'r';
@@ -532,14 +523,11 @@
unexpectedNode(node);
}
- visitThrow(cps_ir.Throw exp) {
- }
+ visitThrow(cps_ir.Throw exp) {}
- visitRethrow(cps_ir.Rethrow exp) {
- }
+ visitRethrow(cps_ir.Rethrow exp) {}
- visitUnreachable(cps_ir.Unreachable node) {
- }
+ visitUnreachable(cps_ir.Unreachable node) {}
visitGetLazyStatic(cps_ir.GetLazyStatic node) {
unexpectedNode(node);
diff --git a/pkg/compiler/lib/src/cps_ir/eagerly_load_statics.dart b/pkg/compiler/lib/src/cps_ir/eagerly_load_statics.dart
index e03f9ca..60a7977 100644
--- a/pkg/compiler/lib/src/cps_ir/eagerly_load_statics.dart
+++ b/pkg/compiler/lib/src/cps_ir/eagerly_load_statics.dart
@@ -23,7 +23,7 @@
<Continuation, Map<FieldElement, Primitive>>{};
static Map<FieldElement, Primitive> cloneFieldMap(
- Map<FieldElement, Primitive> map) {
+ Map<FieldElement, Primitive> map) {
return new Map<FieldElement, Primitive>.from(map);
}
@@ -62,9 +62,8 @@
// No reason to create a GetStatic when the field is final.
node.replaceWithFragment(new CpsFragment(), initializer);
} else if (initializer != null) {
- GetStatic newNode = new GetStatic.witnessed(node.element,
- initializer, sourceInformation: node.sourceInformation)
- ..type = node.type;
+ GetStatic newNode = new GetStatic.witnessed(node.element, initializer,
+ sourceInformation: node.sourceInformation)..type = node.type;
node.replaceWith(newNode);
} else {
initializerFor[node.element] = node;
diff --git a/pkg/compiler/lib/src/cps_ir/effects.dart b/pkg/compiler/lib/src/cps_ir/effects.dart
index 9ab55cd..29d3172 100644
--- a/pkg/compiler/lib/src/cps_ir/effects.dart
+++ b/pkg/compiler/lib/src/cps_ir/effects.dart
@@ -30,8 +30,7 @@
static const int changesIndexableLength = _changes << _indexableLength;
static const int changesOther = _changes << _other;
- static const int changesAll =
- changesStaticField |
+ static const int changesAll = changesStaticField |
changesInstanceField |
changesIndexableContent |
changesIndexableLength |
@@ -45,8 +44,7 @@
static const int dependsOnIndexableLength = _depends << _indexableLength;
static const int dependsOnOther = _depends << _other;
- static const int dependsOnAll =
- dependsOnStaticField |
+ static const int dependsOnAll = dependsOnStaticField |
dependsOnInstanceField |
dependsOnIndexableContent |
dependsOnIndexableLength |
@@ -131,9 +129,9 @@
return new EffectNumbers._zero().._effectNumbers.setAll(0, _effectNumbers);
}
- int operator[](int i) => _effectNumbers[i];
+ int operator [](int i) => _effectNumbers[i];
- void operator[]=(int i, int value) {
+ void operator []=(int i, int value) {
_effectNumbers[i] = value;
}
@@ -146,15 +144,19 @@
void set staticField(int n) {
_effectNumbers[Effects._staticField] = n;
}
+
void set instanceField(int n) {
_effectNumbers[Effects._instanceField] = n;
}
+
void set indexableContent(int n) {
_effectNumbers[Effects._indexableContent] = n;
}
+
void set indexableLength(int n) {
_effectNumbers[Effects._indexableLength] = n;
}
+
void set other(int n) {
_effectNumbers[Effects._other] = n;
}
diff --git a/pkg/compiler/lib/src/cps_ir/finalize.dart b/pkg/compiler/lib/src/cps_ir/finalize.dart
index 9376800..e583f49 100644
--- a/pkg/compiler/lib/src/cps_ir/finalize.dart
+++ b/pkg/compiler/lib/src/cps_ir/finalize.dart
@@ -38,18 +38,22 @@
CpsFragment visitBoundsCheck(BoundsCheck node) {
CpsFragment cps = new CpsFragment(node.sourceInformation);
if (node.hasNoChecks) {
- node..replaceUsesWith(node.object)..destroy();
+ node
+ ..replaceUsesWith(node.object)
+ ..destroy();
return cps;
}
Continuation fail = cps.letCont();
Primitive index = node.index;
if (node.hasIntegerCheck) {
- cps.ifTruthy(cps.applyBuiltin(BuiltinOperator.IsNotUnsigned32BitInteger,
- [index, index]))
+ cps
+ .ifTruthy(cps.applyBuiltin(
+ BuiltinOperator.IsNotUnsigned32BitInteger, [index, index]))
.invokeContinuation(fail);
} else if (node.hasLowerBoundCheck) {
- cps.ifTruthy(cps.applyBuiltin(BuiltinOperator.NumLt,
- [index, cps.makeZero()]))
+ cps
+ .ifTruthy(
+ cps.applyBuiltin(BuiltinOperator.NumLt, [index, cps.makeZero()]))
.invokeContinuation(fail);
}
if (node.hasUpperBoundCheck) {
@@ -63,25 +67,29 @@
lengthBinding.remove();
cps.letPrim(length);
}
- cps.ifTruthy(cps.applyBuiltin(BuiltinOperator.NumGe,
- [index, length]))
+ cps
+ .ifTruthy(cps.applyBuiltin(BuiltinOperator.NumGe, [index, length]))
.invokeContinuation(fail);
}
if (node.hasEmptinessCheck) {
- cps.ifTruthy(cps.applyBuiltin(BuiltinOperator.StrictEq,
- [node.length, cps.makeZero()]))
+ cps
+ .ifTruthy(cps.applyBuiltin(
+ BuiltinOperator.StrictEq, [node.length, cps.makeZero()]))
.invokeContinuation(fail);
}
cps.insideContinuation(fail).invokeStaticThrower(
- helpers.throwIndexOutOfRangeException,
- [node.object, index]);
- node..replaceUsesWith(node.object)..destroy();
+ helpers.throwIndexOutOfRangeException, [node.object, index]);
+ node
+ ..replaceUsesWith(node.object)
+ ..destroy();
return cps;
}
void visitGetStatic(GetStatic node) {
if (node.witnessRef != null) {
- node..witnessRef.unlink()..witnessRef = null;
+ node
+ ..witnessRef.unlink()
+ ..witnessRef = null;
}
}
@@ -93,7 +101,7 @@
// after allocation. After the finalize pass, this assumption is no
// longer needed, so we can replace the remaining idenitity templates.
Refinement refinement = new Refinement(node.argument(0), node.type)
- ..type = node.type;
+ ..type = node.type;
node.replaceWith(refinement);
}
}
diff --git a/pkg/compiler/lib/src/cps_ir/gvn.dart b/pkg/compiler/lib/src/cps_ir/gvn.dart
index d8eeff0..8970f5c 100644
--- a/pkg/compiler/lib/src/cps_ir/gvn.dart
+++ b/pkg/compiler/lib/src/cps_ir/gvn.dart
@@ -95,10 +95,10 @@
// GetLazyStatic cannot have side effects because the field has already
// been initialized.
return prim.isSafeForElimination ||
- prim is GetField ||
- prim is GetLength ||
- prim is GetIndex ||
- prim is GetLazyStatic;
+ prim is GetField ||
+ prim is GetLength ||
+ prim is GetIndex ||
+ prim is GetLazyStatic;
}
@override
@@ -150,7 +150,9 @@
Interceptor interceptor = existing;
interceptor.interceptedClasses.addAll(prim.interceptedClasses);
}
- prim..replaceUsesWith(existing)..destroy();
+ prim
+ ..replaceUsesWith(existing)
+ ..destroy();
node.remove();
return next;
}
@@ -247,7 +249,7 @@
Continuation enclosingLoop = currentLoopHeader;
Continuation hoistTarget = null;
while (loopHierarchy.getDepth(enclosingLoop) > hoistDepth &&
- canHoistHeapDependencyOutOfLoop(prim, enclosingLoop)) {
+ canHoistHeapDependencyOutOfLoop(prim, enclosingLoop)) {
hoistTarget = enclosingLoop;
enclosingLoop = loopHierarchy.getEnclosingLoop(enclosingLoop);
}
@@ -294,17 +296,14 @@
// Put the primitive in the environment while processing the loop.
environment[gvn] = prim;
- loopHoistedBindings
- .putIfAbsent(hoistTarget, () => <int>[])
- .add(gvn);
+ loopHoistedBindings.putIfAbsent(hoistTarget, () => <int>[]).add(gvn);
return true;
}
/// If the given primitive is a trivial primitive that should be hoisted
/// on-demand, hoist it and its dependent values above [loopBinding].
- void hoistTrivialPrimitive(Primitive prim,
- LetCont loopBinding,
- Continuation enclosingLoop) {
+ void hoistTrivialPrimitive(
+ Primitive prim, LetCont loopBinding, Continuation enclosingLoop) {
assert(isFastConstant(prim));
// The primitive might already be bound in an outer scope. Do not relocate
@@ -439,9 +438,11 @@
final List vector;
final int hashCode;
- GvnEntry(List vector) : vector = vector, hashCode = computeHashCode(vector);
+ GvnEntry(List vector)
+ : vector = vector,
+ hashCode = computeHashCode(vector);
- bool operator==(other) {
+ bool operator ==(other) {
if (other is! GvnEntry) return false;
GvnEntry entry = other;
List otherVector = entry.vector;
@@ -461,7 +462,7 @@
hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10));
hash = hash ^ (hash >> 6);
}
- hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
+ hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3));
hash = hash ^ (hash >> 11);
return 0x1fffffff & (hash + ((0x00003fff & hash) << 15));
}
@@ -600,6 +601,7 @@
}
typedef ReferenceCallback(Reference ref);
+
class InputVisitor extends DeepRecursiveVisitor {
ReferenceCallback callback;
diff --git a/pkg/compiler/lib/src/cps_ir/inline.dart b/pkg/compiler/lib/src/cps_ir/inline.dart
index 076e809..cbb673d 100644
--- a/pkg/compiler/lib/src/cps_ir/inline.dart
+++ b/pkg/compiler/lib/src/cps_ir/inline.dart
@@ -14,8 +14,8 @@
import '../elements/elements.dart';
import '../js_backend/js_backend.dart' show JavaScriptBackend;
import '../js_backend/codegen/task.dart' show CpsFunctionCompiler;
-import '../types/types.dart' show
- FlatTypeMask, ForwardingTypeMask, TypeMask, UnionTypeMask;
+import '../types/types.dart'
+ show FlatTypeMask, ForwardingTypeMask, TypeMask, UnionTypeMask;
import '../universe/call_structure.dart' show CallStructure;
import '../universe/selector.dart' show Selector;
import 'package:js_ast/js_ast.dart' as js;
@@ -62,7 +62,7 @@
if (callStructure == null) {
if (otherCallStructure != null) return false;
} else if (otherCallStructure == null ||
- !callStructure.match(otherCallStructure)) {
+ !callStructure.match(otherCallStructure)) {
return false;
}
@@ -97,20 +97,23 @@
// copied because the compiler passes will mutate them.
final CopyingVisitor copier = new CopyingVisitor();
- void _putInternal(ExecutableElement element, CallStructure callStructure,
+ void _putInternal(
+ ExecutableElement element,
+ CallStructure callStructure,
TypeMask receiver,
List<TypeMask> arguments,
bool decision,
FunctionDefinition function) {
- map.putIfAbsent(element, () => <CacheEntry>[])
- .add(new CacheEntry(callStructure, receiver, arguments, decision,
- function));
+ map.putIfAbsent(element, () => <CacheEntry>[]).add(
+ new CacheEntry(callStructure, receiver, arguments, decision, function));
}
/// Put a positive inlining decision in the cache.
///
/// A positive inlining decision maps to an IR function definition.
- void putPositive(ExecutableElement element, CallStructure callStructure,
+ void putPositive(
+ ExecutableElement element,
+ CallStructure callStructure,
TypeMask receiver,
List<TypeMask> arguments,
FunctionDefinition function) {
@@ -119,10 +122,8 @@
}
/// Put a negative inlining decision in the cache.
- void putNegative(ExecutableElement element,
- CallStructure callStructure,
- TypeMask receiver,
- List<TypeMask> arguments) {
+ void putNegative(ExecutableElement element, CallStructure callStructure,
+ TypeMask receiver, List<TypeMask> arguments) {
_putInternal(element, callStructure, receiver, arguments, false, null);
}
@@ -188,10 +189,11 @@
if (element is ConstructorBodyElement) {
ClassElement class_ = element.enclosingClass;
return !functionCompiler.compiler.world.hasAnyStrictSubclass(class_) &&
- class_.constructors.tail?.isEmpty ?? false;
+ class_.constructors.tail?.isEmpty ??
+ false;
}
- return functionCompiler.compiler.typesTask.typesInferrer.isCalledOnce(
- element);
+ return functionCompiler.compiler.typesTask.typesInferrer
+ .isCalledOnce(element);
}
void rewrite(FunctionDefinition node, [CallStructure callStructure]) {
@@ -344,25 +346,21 @@
/// function that takes optional arguments not passed at the call site.
FunctionDefinition buildAdapter(InvokeMethod node, FunctionElement target) {
Parameter thisParameter = new Parameter(new ThisParameterLocal(target))
- ..type = node.receiver.type;
- Parameter interceptorParameter = node.interceptorRef != null
- ? new Parameter(null)
- : null;
- List<Parameter> parameters = new List<Parameter>.generate(
- node.argumentRefs.length,
- (int index) {
- // TODO(kmillikin): Use a hint for the parameter names.
- return new Parameter(null)
- ..type = node.argument(index).type;
- });
+ ..type = node.receiver.type;
+ Parameter interceptorParameter =
+ node.interceptorRef != null ? new Parameter(null) : null;
+ List<Parameter> parameters =
+ new List<Parameter>.generate(node.argumentRefs.length, (int index) {
+ // TODO(kmillikin): Use a hint for the parameter names.
+ return new Parameter(null)..type = node.argument(index).type;
+ });
Continuation returnContinuation = new Continuation.retrn();
CpsFragment cps = new CpsFragment();
FunctionSignature signature = target.functionSignature;
int requiredParameterCount = signature.requiredParameterCount;
List<Primitive> arguments = new List<Primitive>.generate(
- requiredParameterCount,
- (int index) => parameters[index]);
+ requiredParameterCount, (int index) => parameters[index]);
int parameterIndex = requiredParameterCount;
CallStructure newCallStructure;
@@ -400,21 +398,17 @@
newCallStructure = new CallStructure(signature.parameterCount);
}
- Selector newSelector =
- new Selector(node.selector.kind, node.selector.memberName,
- newCallStructure);
- Primitive result = cps.invokeMethod(thisParameter,
- newSelector,
- node.mask,
- arguments,
+ Selector newSelector = new Selector(
+ node.selector.kind, node.selector.memberName, newCallStructure);
+ Primitive result = cps.invokeMethod(
+ thisParameter, newSelector, node.mask, arguments,
interceptor: interceptorParameter,
callingConvention: node.callingConvention);
result.type = typeSystem.getInvokeReturnType(node.selector, node.mask);
returnContinuation.parameters.single.type = result.type;
cps.invokeContinuation(returnContinuation, <Primitive>[result]);
- return new FunctionDefinition(target, thisParameter, parameters,
- returnContinuation,
- cps.root,
+ return new FunctionDefinition(
+ target, thisParameter, parameters, returnContinuation, cps.root,
interceptorParameter: interceptorParameter);
}
@@ -427,7 +421,7 @@
// if the call was inlined, and the inlined function body is available in
// [_fragment]. If the call was not inlined, null is returned.
Primitive tryInlining(InvocationPrimitive invoke, FunctionElement target,
- CallStructure callStructure) {
+ CallStructure callStructure) {
// Quick checks: do not inline or even cache calls to targets without an
// AST node, targets that are asynchronous or generator functions, or
// targets containing a try statement.
@@ -468,9 +462,8 @@
: abstractReceiver.nonNullable();
List<TypeMask> abstractArguments =
invoke.arguments.map(abstractType).toList();
- var cachedResult = _inliner.cache.get(target, callStructure,
- abstractReceiverInMethod,
- abstractArguments);
+ var cachedResult = _inliner.cache.get(
+ target, callStructure, abstractReceiverInMethod, abstractArguments);
// Negative inlining result in the cache.
if (cachedResult == InliningCache.NO_INLINE) return null;
@@ -482,11 +475,11 @@
// Add a null check to the inlined function body if necessary. The
// cached function body does not contain the null check.
if (receiver != null && abstractReceiver.isNullable) {
- receiver = nullReceiverGuard(
- invoke, _fragment, receiver, abstractReceiver);
+ receiver =
+ nullReceiverGuard(invoke, _fragment, receiver, abstractReceiver);
}
return _fragment.inlineFunction(function, receiver, arguments,
- interceptor: invoke.interceptor, hint: invoke.hint);
+ interceptor: invoke.interceptor, hint: invoke.hint);
}
// Positive inlining result in the cache.
@@ -542,35 +535,30 @@
return finish(function);
}
- Primitive nullReceiverGuard(InvocationPrimitive invoke,
- CpsFragment fragment,
- Primitive dartReceiver,
- TypeMask abstractReceiver) {
+ Primitive nullReceiverGuard(InvocationPrimitive invoke, CpsFragment fragment,
+ Primitive dartReceiver, TypeMask abstractReceiver) {
if (invoke is! InvokeMethod) return dartReceiver;
InvokeMethod invokeMethod = invoke;
Selector selector = invokeMethod.selector;
if (typeSystem.isDefinitelyNum(abstractReceiver, allowNull: true)) {
- Primitive condition = _fragment.letPrim(
- new ApplyBuiltinOperator(BuiltinOperator.IsNotNumber,
- <Primitive>[dartReceiver],
- invoke.sourceInformation));
+ Primitive condition = _fragment.letPrim(new ApplyBuiltinOperator(
+ BuiltinOperator.IsNotNumber,
+ <Primitive>[dartReceiver],
+ invoke.sourceInformation));
condition.type = typeSystem.boolType;
- Primitive check = _fragment.letPrim(
- new ReceiverCheck.nullCheck(dartReceiver, selector,
- invoke.sourceInformation,
- condition: condition));
+ Primitive check = _fragment.letPrim(new ReceiverCheck.nullCheck(
+ dartReceiver, selector, invoke.sourceInformation,
+ condition: condition));
check.type = abstractReceiver.nonNullable();
return check;
}
- Primitive check = _fragment.letPrim(
- new ReceiverCheck.nullCheck(dartReceiver, selector,
- invoke.sourceInformation));
+ Primitive check = _fragment.letPrim(new ReceiverCheck.nullCheck(
+ dartReceiver, selector, invoke.sourceInformation));
check.type = abstractReceiver.nonNullable();
return check;
}
-
@override
Primitive visitInvokeStatic(InvokeStatic node) {
return tryInlining(node, node.target, null);
@@ -585,8 +573,8 @@
if (node.selector.isSetter != element.isSetter) return null;
if (node.selector.name != element.name) return null;
- return tryInlining(node, element.asFunctionElement(),
- node.selector.callStructure);
+ return tryInlining(
+ node, element.asFunctionElement(), node.selector.callStructure);
}
@override
@@ -613,8 +601,8 @@
ClassElement enclosingClass = target.enclosingClass;
if (target.isOperator &&
(enclosingClass == backend.helpers.jsNumberClass ||
- enclosingClass == backend.helpers.jsDoubleClass ||
- enclosingClass == backend.helpers.jsIntClass)) {
+ enclosingClass == backend.helpers.jsDoubleClass ||
+ enclosingClass == backend.helpers.jsIntClass)) {
// These should be handled by operator specialization.
return true;
}
diff --git a/pkg/compiler/lib/src/cps_ir/insert_refinements.dart b/pkg/compiler/lib/src/cps_ir/insert_refinements.dart
index d5412c6..28d013f 100644
--- a/pkg/compiler/lib/src/cps_ir/insert_refinements.dart
+++ b/pkg/compiler/lib/src/cps_ir/insert_refinements.dart
@@ -118,15 +118,14 @@
// Skip arguments that provide no refinement.
if (argSuccessType == types.dynamicType) continue;
- applyRefinement(node.parent,
- new Refinement(node.argument(i), argSuccessType));
+ applyRefinement(
+ node.parent, new Refinement(node.argument(i), argSuccessType));
}
}
void visitInvokeStatic(InvokeStatic node) {
node.argumentRefs.forEach(processReference);
- _refineArguments(node,
- _getSuccessTypesForStaticMethod(types, node.target));
+ _refineArguments(node, _getSuccessTypesForStaticMethod(types, node.target));
}
void visitInvokeMethod(InvokeMethod node) {
@@ -150,8 +149,8 @@
// Refine arguments of methods on numbers which we know will throw on
// invalid argument values.
- _refineArguments(node,
- _getSuccessTypesForInstanceMethod(types, type, selector));
+ _refineArguments(
+ node, _getSuccessTypesForInstanceMethod(types, type, selector));
}
}
@@ -212,10 +211,8 @@
// This can happen either for calls to `==` or `identical` calls, such
// as the ones inserted by the unsugaring pass.
- void refineEquality(Primitive first,
- Primitive second,
- Continuation trueCont,
- Continuation falseCont) {
+ void refineEquality(Primitive first, Primitive second,
+ Continuation trueCont, Continuation falseCont) {
if (second is Constant && second.value.isNull) {
Refinement refinedTrue = new Refinement(first, types.nullType);
Refinement refinedFalse = new Refinement(first, types.nonNullType);
@@ -233,19 +230,15 @@
}
if (condition is InvokeMethod && condition.selector == Selectors.equals) {
- refineEquality(condition.receiver,
- condition.argument(0),
- trueCont,
- falseCont);
+ refineEquality(
+ condition.receiver, condition.argument(0), trueCont, falseCont);
return;
}
if (condition is ApplyBuiltinOperator &&
condition.operator == BuiltinOperator.Identical) {
- refineEquality(condition.argument(0),
- condition.argument(1),
- trueCont,
- falseCont);
+ refineEquality(
+ condition.argument(0), condition.argument(1), trueCont, falseCont);
return;
}
@@ -292,7 +285,7 @@
return [types.intType];
case 'modPow':
- return [types.intType, types.intType];
+ return [types.intType, types.intType];
}
// Note: num methods on int values are handled below.
}
@@ -300,13 +293,13 @@
if (types.isDefinitelyNum(receiver)) {
switch (selector.name) {
case 'clamp':
- return [types.numType, types.numType];
+ return [types.numType, types.numType];
case 'toStringAsFixed':
case 'toStringAsPrecision':
case 'toRadixString':
- return [types.intType];
+ return [types.intType];
case 'toStringAsExponential':
- return [types.intType.nullable()];
+ return [types.intType.nullable()];
case 'compareTo':
case 'remainder':
case '+':
@@ -324,7 +317,7 @@
case '>':
case '<=':
case '>=':
- return [types.numType];
+ return [types.numType];
default:
return null;
}
@@ -385,7 +378,7 @@
case 'sublist':
return [types.uintType, types.uintType.nullable()];
case 'length':
- return selector.isSetter ? [types.uintType] : null;
+ return selector.isSetter ? [types.uintType] : null;
case '[]':
case '[]=':
return [types.uintType];
@@ -410,7 +403,7 @@
}
if (lib.isPlatformLibrary && '${lib.canonicalUri}' == 'dart:math') {
- switch(target.name) {
+ switch (target.name) {
case 'sqrt':
case 'sin':
case 'cos':
diff --git a/pkg/compiler/lib/src/cps_ir/loop_effects.dart b/pkg/compiler/lib/src/cps_ir/loop_effects.dart
index 4a73e5d..d7c3c6f 100644
--- a/pkg/compiler/lib/src/cps_ir/loop_effects.dart
+++ b/pkg/compiler/lib/src/cps_ir/loop_effects.dart
@@ -85,7 +85,8 @@
if (inner == null) {
// The shrinking reductions pass must run before any pass that relies
// on computing loop side effects.
- world.compiler.reporter.internalError(null,
+ world.compiler.reporter.internalError(
+ null,
'Unreachable continuations must be removed before computing '
'loop side effects.');
}
diff --git a/pkg/compiler/lib/src/cps_ir/loop_hierarchy.dart b/pkg/compiler/lib/src/cps_ir/loop_hierarchy.dart
index 57d71207..35d9b76 100644
--- a/pkg/compiler/lib/src/cps_ir/loop_hierarchy.dart
+++ b/pkg/compiler/lib/src/cps_ir/loop_hierarchy.dart
@@ -123,8 +123,7 @@
target = loopTarget[node.continuation];
}
} else if (node is Branch) {
- target = _markInnerLoop(
- loopTarget[node.trueContinuation],
+ target = _markInnerLoop(loopTarget[node.trueContinuation],
loopTarget[node.falseContinuation]);
} else if (node == null) {
// If the code ends abruptly, use the exit loop provided in [update].
@@ -166,8 +165,7 @@
/// [catchLoop] is the loop target for the catch clause of the try/catch
/// surrounding the inserted fragment.
void update(CpsFragment fragment,
- {Continuation exitLoop,
- Continuation catchLoop}) {
+ {Continuation exitLoop, Continuation catchLoop}) {
if (fragment.isEmpty) return;
_exitLoop = exitLoop;
_currentDepth = getDepth(exitLoop);
diff --git a/pkg/compiler/lib/src/cps_ir/loop_invariant_branch.dart b/pkg/compiler/lib/src/cps_ir/loop_invariant_branch.dart
index 98df30a..95ee597 100644
--- a/pkg/compiler/lib/src/cps_ir/loop_invariant_branch.dart
+++ b/pkg/compiler/lib/src/cps_ir/loop_invariant_branch.dart
@@ -121,7 +121,8 @@
Node use = ref.parent;
if (use is InvokeContinuation) {
for (Parameter loopParam in parameters) {
- use.argumentRefs.add(new Reference<Primitive>(loopParam)..parent = use);
+ use.argumentRefs
+ .add(new Reference<Primitive>(loopParam)..parent = use);
}
}
}
@@ -148,7 +149,7 @@
hoistedCase = trueCont;
loopCase = falseCont;
} else if (loopHierarchy.getLoopHeader(falseCont) != loop &&
- loopHierarchy.getLoopHeader(trueCont) == loop) {
+ loopHierarchy.getLoopHeader(trueCont) == loop) {
hoistedCase = falseCont;
loopCase = trueCont;
} else {
@@ -211,13 +212,12 @@
// branch b newTrue newFalse
//
InvokeContinuation loopEntry = loopBinding.body;
- List<Primitive> loopArgs =
- loopEntry.arguments.toList();
+ List<Primitive> loopArgs = loopEntry.arguments.toList();
CpsFragment cps = new CpsFragment();
- cps.branch(condition,
- strict: branch.isStrictCheck,
- negate: hoistedCase == falseCont)
- .invokeContinuation(hoistedCase, loopArgs);
+ cps
+ .branch(condition,
+ strict: branch.isStrictCheck, negate: hoistedCase == falseCont)
+ .invokeContinuation(hoistedCase, loopArgs);
// The continuations created in the fragment need to have their loop header
// set so the loop hierarchy remains intact
diff --git a/pkg/compiler/lib/src/cps_ir/mutable_ssa.dart b/pkg/compiler/lib/src/cps_ir/mutable_ssa.dart
index 0c86696..ee44978 100644
--- a/pkg/compiler/lib/src/cps_ir/mutable_ssa.dart
+++ b/pkg/compiler/lib/src/cps_ir/mutable_ssa.dart
@@ -110,8 +110,7 @@
}
bool isJoinContinuation(Continuation cont) {
- return !cont.hasExactlyOneUse ||
- cont.firstRef.parent is InvokeContinuation;
+ return !cont.hasExactlyOneUse || cont.firstRef.parent is InvokeContinuation;
}
/// If some useful source information is attached to exactly one of the
@@ -131,8 +130,8 @@
/// will be mutated during the processing.
///
/// Continuations to be processed are put on the stack for later processing.
- void processBlock(Expression node,
- Map<MutableVariable, Primitive> environment) {
+ void processBlock(
+ Expression node, Map<MutableVariable, Primitive> environment) {
Expression next = node.next;
for (; node is! TailExpression; node = next, next = node.next) {
if (node is LetMutable && shouldRewrite(node.variable)) {
@@ -221,12 +220,9 @@
// Enqueue both branches with the current environment.
// Clone the environments once so the processing of one branch does not
// mutate the environment needed to process the other branch.
- stack.add(new ContinuationItem(
- node.trueContinuation,
+ stack.add(new ContinuationItem(node.trueContinuation,
new Map<MutableVariable, Primitive>.from(environment)));
- stack.add(new ContinuationItem(
- node.falseContinuation,
- environment));
+ stack.add(new ContinuationItem(node.falseContinuation, environment));
} else {
assert(node is Throw || node is Unreachable);
}
diff --git a/pkg/compiler/lib/src/cps_ir/octagon.dart b/pkg/compiler/lib/src/cps_ir/octagon.dart
index 691c15d..83feb77 100644
--- a/pkg/compiler/lib/src/cps_ir/octagon.dart
+++ b/pkg/compiler/lib/src/cps_ir/octagon.dart
@@ -72,8 +72,8 @@
SignedVariable v1 = new SignedVariable._make();
if (min != null) {
// v1 >= min <==> -v1 - v1 <= -2 * min
- v1.negated._constraints.add(
- new Constraint(v1.negated, v1.negated, -2 * min));
+ v1.negated._constraints
+ .add(new Constraint(v1.negated, v1.negated, -2 * min));
}
if (max != null) {
// v1 <= max <==> v1 + v1 <= 2 * max
diff --git a/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart b/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart
index 9dd05c7b..65500a5 100644
--- a/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart
+++ b/pkg/compiler/lib/src/cps_ir/optimize_interceptors.dart
@@ -59,10 +59,10 @@
bool hasNoFalsyValues(ClassElement class_) {
return class_ != helpers.jsInterceptorClass &&
- class_ != helpers.jsNullClass &&
- class_ != helpers.jsBoolClass &&
- class_ != helpers.jsStringClass &&
- !class_.isSubclassOf(helpers.jsNumberClass);
+ class_ != helpers.jsNullClass &&
+ class_ != helpers.jsBoolClass &&
+ class_ != helpers.jsStringClass &&
+ !class_.isSubclassOf(helpers.jsNumberClass);
}
Continuation getCurrentOuterLoop({Continuation scope}) {
@@ -79,10 +79,10 @@
/// The constant will be hoisted out of loops, and shared with other requests
/// for the same constant as long as it is in scope.
Primitive makeConstantFor(ConstantValue constant,
- {Expression useSite,
- TypeMask type,
- SourceInformation sourceInformation,
- Entity hint}) {
+ {Expression useSite,
+ TypeMask type,
+ SourceInformation sourceInformation,
+ Entity hint}) {
Constant prim =
new Constant(constant, sourceInformation: sourceInformation);
prim.hint = hint;
@@ -107,8 +107,8 @@
TypeMask type = use.receiver.type;
bool canOccurAsReceiver(ClassElement elem) {
return classWorld.isInstantiated(elem) &&
- !typeSystem.areDisjoint(type,
- typeSystem.getInterceptorSubtypes(elem));
+ !typeSystem.areDisjoint(
+ type, typeSystem.getInterceptorSubtypes(elem));
}
Iterable<ClassElement> classes =
backend.getInterceptedClassesOn(use.selector.name);
@@ -210,7 +210,9 @@
type: interceptor.type,
sourceInformation: interceptor.sourceInformation);
constantPrim.useElementAsHint(interceptor.hint);
- interceptor..replaceUsesWith(constantPrim)..destroy();
+ interceptor
+ ..replaceUsesWith(constantPrim)
+ ..destroy();
let.remove();
} else {
Primitive constantPrim = makeConstantFor(constant,
@@ -226,15 +228,16 @@
cps.ifFalsy(input).invokeContinuation(cont, [input]);
} else {
// If there are other falsy values compile as "x == null ? x : CONST".
- Primitive condition = cps.applyBuiltin(
- BuiltinOperator.LooseEq,
- [input, cps.makeNull()]);
+ Primitive condition =
+ cps.applyBuiltin(BuiltinOperator.LooseEq, [input, cps.makeNull()]);
cps.ifTruthy(condition).invokeContinuation(cont, [input]);
}
cps.invokeContinuation(cont, [constantPrim]);
cps.context = cont;
cps.insertAbove(let);
- interceptor..replaceUsesWith(param)..destroy();
+ interceptor
+ ..replaceUsesWith(param)
+ ..destroy();
let.remove();
}
return true;
@@ -303,7 +306,9 @@
Constant existing = sharedConstantFor[prim.value];
if (existing != null) {
existing.useElementAsHint(prim.hint);
- prim..replaceUsesWith(existing)..destroy();
+ prim
+ ..replaceUsesWith(existing)
+ ..destroy();
node.remove();
return next;
}
diff --git a/pkg/compiler/lib/src/cps_ir/optimizers.dart b/pkg/compiler/lib/src/cps_ir/optimizers.dart
index 2b248fe..8af5154 100644
--- a/pkg/compiler/lib/src/cps_ir/optimizers.dart
+++ b/pkg/compiler/lib/src/cps_ir/optimizers.dart
@@ -42,7 +42,7 @@
/// Returns true if [value] is false, null, 0, -0, NaN, or the empty string.
bool isFalsyConstant(ConstantValue value) {
return value.isFalse ||
- value.isNull ||
+ value.isNull ||
value.isZero ||
value.isMinusZero ||
value.isNaN ||
@@ -59,6 +59,10 @@
/// Selectors that do not throw when invoked on the null value.
final List<Selector> selectorsOnNull = <Selector>[
- Selectors.equals, Selectors.hashCode_, Selectors.runtimeType_,
- Selectors.toString_, Selectors.toStringGetter,
- Selectors.noSuchMethodGetter];
+ Selectors.equals,
+ Selectors.hashCode_,
+ Selectors.runtimeType_,
+ Selectors.toString_,
+ Selectors.toStringGetter,
+ Selectors.noSuchMethodGetter
+];
diff --git a/pkg/compiler/lib/src/cps_ir/parent_visitor.dart b/pkg/compiler/lib/src/cps_ir/parent_visitor.dart
index 33896e0..bb98c33 100644
--- a/pkg/compiler/lib/src/cps_ir/parent_visitor.dart
+++ b/pkg/compiler/lib/src/cps_ir/parent_visitor.dart
@@ -40,4 +40,3 @@
node.parent = _parent;
}
}
-
diff --git a/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart b/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart
index 965a632..933111e 100644
--- a/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart
+++ b/pkg/compiler/lib/src/cps_ir/path_based_optimizer.dart
@@ -59,8 +59,7 @@
// TODO(asgerf): Could be more precise if GVN shared expressions that are not
// in direct scope of one another, e.g. by using phis pass the shared value.
//
-class PathBasedOptimizer extends TrampolineRecursiveVisitor
- implements Pass {
+class PathBasedOptimizer extends TrampolineRecursiveVisitor implements Pass {
String get passName => 'Path-based optimizations';
// Classification of all values.
@@ -158,7 +157,7 @@
// Only self-interceptors can respond to a non-intercepted selector.
valueOf[node.receiver] = receiverValue & SELF_INTERCEPTOR;
} else if (receiverValue & ~SELF_INTERCEPTOR == 0 &&
- node.callingConvention == CallingConvention.Intercepted) {
+ node.callingConvention == CallingConvention.Intercepted) {
// This is an intercepted call whose receiver is definitely a
// self-interceptor.
// TODO(25646): If TypeMasks could represent "any self-interceptor" this
@@ -167,8 +166,8 @@
// Replace the extra receiver argument with a dummy value if the
// target definitely does not use it.
- if (typeSystem.targetIgnoresReceiverArgument(node.receiver.type,
- node.selector)) {
+ if (typeSystem.targetIgnoresReceiverArgument(
+ node.receiver.type, node.selector)) {
node.makeDummyIntercepted();
}
}
diff --git a/pkg/compiler/lib/src/cps_ir/redundant_join.dart b/pkg/compiler/lib/src/cps_ir/redundant_join.dart
index 59cac26..3ba1d61 100644
--- a/pkg/compiler/lib/src/cps_ir/redundant_join.dart
+++ b/pkg/compiler/lib/src/cps_ir/redundant_join.dart
@@ -20,7 +20,7 @@
/// meaningless during this pass, until repaired by [AlphaRenamer] at
/// the end.
class RedundantJoinEliminator extends TrampolineRecursiveVisitor
- implements Pass {
+ implements Pass {
String get passName => 'Redundant join elimination';
final Set<Branch> workSet = new Set<Branch>();
@@ -110,7 +110,7 @@
// replacing a boolean variable with a labeled break.
// TODO(asgerf): The labeled break might be better? Evaluate.
if (!(trueHits == 1 && !trueCall.isEscapingTry ||
- falseHits == 1 && !falseCall.isEscapingTry)) {
+ falseHits == 1 && !falseCall.isEscapingTry)) {
return;
}
@@ -140,8 +140,8 @@
Expression use = ref.parent;
if (use is InvokeContinuation) {
for (Parameter param in branchCont.parameters) {
- use.argumentRefs.add(
- new Reference<Primitive>(param)..parent = use);
+ use.argumentRefs
+ .add(new Reference<Primitive>(param)..parent = use);
}
} else {
// The branch will be eliminated, so don't worry about updating it.
diff --git a/pkg/compiler/lib/src/cps_ir/redundant_phi.dart b/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
index b612d13..96e6431 100644
--- a/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
+++ b/pkg/compiler/lib/src/cps_ir/redundant_phi.dart
@@ -15,7 +15,8 @@
/// (except for feedback). Redundant parameters are removed from the
/// continuation signature, all invocations, and replaced within the
/// continuation body.
-class RedundantPhiEliminator extends TrampolineRecursiveVisitor implements Pass {
+class RedundantPhiEliminator extends TrampolineRecursiveVisitor
+ implements Pass {
String get passName => 'Redundant phi elimination';
final Set<Continuation> workSet = new Set<Continuation>();
@@ -122,8 +123,8 @@
// Add continuations of about-to-be modified invokes to worklist since
// we might introduce new optimization opportunities.
for (Reference ref = oldDefinition.firstRef;
- ref != null;
- ref = ref.next) {
+ ref != null;
+ ref = ref.next) {
Node parent = ref.parent;
if (parent is InvokeContinuation) {
Continuation thatCont = parent.continuation;
diff --git a/pkg/compiler/lib/src/cps_ir/redundant_refinement.dart b/pkg/compiler/lib/src/cps_ir/redundant_refinement.dart
index cff47d6..8cd13b3 100644
--- a/pkg/compiler/lib/src/cps_ir/redundant_refinement.dart
+++ b/pkg/compiler/lib/src/cps_ir/redundant_refinement.dart
@@ -28,7 +28,7 @@
/// Ideally, this pass should go away and GVN should handle refinements
/// directly.
class RedundantRefinementEliminator extends TrampolineRecursiveVisitor
- implements Pass {
+ implements Pass {
String get passName => 'Redundant refinement elimination';
TypeMaskSystem typeSystem;
@@ -45,7 +45,9 @@
Refinement refinement = node.primitive;
Primitive value = refinement.value.definition;
if (typeSystem.isMorePreciseOrEqual(value.type, refinement.refineType)) {
- refinement..replaceUsesWith(value)..destroy();
+ refinement
+ ..replaceUsesWith(value)
+ ..destroy();
node.remove();
return next;
}
diff --git a/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart b/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart
index 5eb8156..a913f08 100644
--- a/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart
+++ b/pkg/compiler/lib/src/cps_ir/scalar_replacement.dart
@@ -8,8 +8,7 @@
import 'dart:collection' show Queue;
import '../common.dart';
-import '../compiler.dart' as dart2js show
- Compiler;
+import '../compiler.dart' as dart2js show Compiler;
import '../constants/values.dart';
import '../elements/elements.dart';
import '../types/types.dart';
@@ -44,7 +43,6 @@
* can create new candidates, iterate until all scalar replacements are done.
*/
class ScalarReplacementVisitor extends TrampolineRecursiveVisitor {
-
final InternalErrorFunction internalError;
final World classWorld;
ScalarReplacementRemovalVisitor removalVisitor;
@@ -71,7 +69,6 @@
}
void tryScalarReplacement(Primitive allocation) {
-
// We can do scalar replacement of an aggregate if all uses of an allocation
// are reads or writes.
for (Reference ref = allocation.firstRef; ref != null; ref = ref.next) {
@@ -101,11 +98,10 @@
if (allocation is CreateInstance) {
int i = 0;
allocation.classElement.forEachInstanceField(
- (ClassElement enclosingClass, FieldElement field) {
- Primitive argument = allocation.argument(i++);
- fieldInitialValues[field] = argument;
- },
- includeSuperAndInjectedMembers: true);
+ (ClassElement enclosingClass, FieldElement field) {
+ Primitive argument = allocation.argument(i++);
+ fieldInitialValues[field] = argument;
+ }, includeSuperAndInjectedMembers: true);
}
// Create [MutableVariable]s for each written field. Initialize the
@@ -113,7 +109,7 @@
// `null` constant if there is not initial value.
Map<FieldElement, MutableVariable> cells =
<FieldElement, MutableVariable>{};
- InteriorNode insertionPoint = allocation.parent; // LetPrim
+ InteriorNode insertionPoint = allocation.parent; // LetPrim
for (FieldElement field in writes) {
MutableVariable variable = new MutableVariable(field);
variable.type = new TypeMask.nonNullEmpty();
@@ -214,7 +210,6 @@
}
}
-
/// Visit a just-deleted subterm and unlink all [Reference]s in it. Reconsider
/// allocations for scalar replacement.
class ScalarReplacementRemovalVisitor extends TrampolineRecursiveVisitor {
diff --git a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
index 1c84ca6..3e3fd94 100644
--- a/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
+++ b/pkg/compiler/lib/src/cps_ir/shrinking_reductions.dart
@@ -39,9 +39,8 @@
void _debugWorklist(FunctionDefinition root) {
while (_worklist.isNotEmpty) {
_ReductionTask task = _worklist.removeLast();
- String irBefore = root.debugString({
- task.node: '${task.kind} applied here'
- });
+ String irBefore =
+ root.debugString({task.node: '${task.kind} applied here'});
_processTask(task);
Set seenRedexes = _worklist.where(isValidTask).toSet();
Set actualRedexes = (new _RedexVisitor([])..visit(root)).worklist.toSet();
@@ -51,9 +50,7 @@
print('\nBEFORE $task:\n');
print(irBefore);
print('\nAFTER $task:\n');
- root.debugPrint({
- missedTask.node: 'MISSED ${missedTask.kind}'
- });
+ root.debugPrint({missedTask.node: 'MISSED ${missedTask.kind}'});
throw 'Missed $missedTask after processing $task';
}
}
@@ -79,7 +76,7 @@
/// Removes the given node from the CPS graph, replacing it with its body
/// and marking it as deleted. The node's parent must be a [[InteriorNode]].
void _removeNode(InteriorNode node) {
- Node body = node.body;
+ Node body = node.body;
InteriorNode parent = node.parent;
assert(parent.body == node);
@@ -291,8 +288,7 @@
return;
}
- InvokeContinuation invoke = new InvokeContinuation(
- target, <Primitive>[]
+ InvokeContinuation invoke = new InvokeContinuation(target, <Primitive>[]
// TODO(sra): Add sourceInformation.
/*, sourceInformation: branch.sourceInformation*/);
branch.parent.body = invoke;
@@ -356,8 +352,8 @@
void _checkUselessBranchTarget(Continuation continuation) {
if (_isBranchTargetOfUselessIf(continuation)) {
- _worklist.add(new _ReductionTask(_ReductionKind.BRANCH,
- continuation.firstRef.parent));
+ _worklist.add(new _ReductionTask(
+ _ReductionKind.BRANCH, continuation.firstRef.parent));
}
}
@@ -375,8 +371,8 @@
primitive = primitive.unrefined;
if (primitive is Parameter) {
if (_isDeadParameter(primitive)) {
- _worklist.add(new _ReductionTask(_ReductionKind.DEAD_PARAMETER,
- primitive));
+ _worklist
+ .add(new _ReductionTask(_ReductionKind.DEAD_PARAMETER, primitive));
}
} else if (primitive.parent is LetPrim) {
LetPrim letPrim = primitive.parent;
@@ -400,15 +396,15 @@
/// preventing it from being eliminated.
bool _isDeadVal(LetPrim node) {
return !_isRemoved(node) &&
- node.primitive.hasNoRefinedUses &&
- node.primitive.isSafeForElimination;
+ node.primitive.hasNoRefinedUses &&
+ node.primitive.isSafeForElimination;
}
/// Returns true iff the continuation is unused.
bool _isDeadCont(Continuation cont) {
return !_isRemoved(cont) &&
- !cont.isReturnContinuation &&
- !cont.hasAtLeastOneUse;
+ !cont.isReturnContinuation &&
+ !cont.hasAtLeastOneUse;
}
/// Returns true iff the continuation has a body (i.e., it is not the return
@@ -541,8 +537,7 @@
if (falseBody is! InvokeContinuation) return false;
InvokeContinuation trueInvoke = trueBody;
InvokeContinuation falseInvoke = falseBody;
- if (trueInvoke.continuation !=
- falseInvoke.continuation) {
+ if (trueInvoke.continuation != falseInvoke.continuation) {
return false;
}
// Matching zero arguments should be adequate, since isomorphic true and false
@@ -607,7 +602,7 @@
// detect it.
if (_isDeadCont(node)) {
worklist.add(new _ReductionTask(_ReductionKind.DEAD_CONT, node));
- } else if (_isBetaContLin(node)){
+ } else if (_isBetaContLin(node)) {
worklist.add(new _ReductionTask(_ReductionKind.BETA_CONT_LIN, node));
} else if (_isEtaCont(node)) {
worklist.add(new _ReductionTask(_ReductionKind.ETA_CONT, node));
@@ -655,8 +650,8 @@
if (parent is LetPrim && _isDeadVal(parent)) {
worklist.add(new _ReductionTask(_ReductionKind.DEAD_VAL, parent));
} else if (primitive is Parameter && _isDeadParameter(primitive)) {
- worklist.add(new _ReductionTask(_ReductionKind.DEAD_PARAMETER,
- primitive));
+ worklist
+ .add(new _ReductionTask(_ReductionKind.DEAD_PARAMETER, primitive));
}
} else if (reference.definition is Continuation) {
Continuation cont = reference.definition;
@@ -703,11 +698,13 @@
}
_ReductionTask(this.kind, this.node) {
- assert(node is Continuation || node is LetPrim || node is Parameter ||
- node is Branch);
+ assert(node is Continuation ||
+ node is LetPrim ||
+ node is Parameter ||
+ node is Branch);
}
- bool operator==(_ReductionTask that) {
+ bool operator ==(_ReductionTask that) {
return (that.kind == this.kind && that.node == this.node);
}
diff --git a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
index b7a070e..c77bd02 100644
--- a/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_mask_system.dart
@@ -104,9 +104,8 @@
new TypeMask.nonNullSubtype(classWorld.stringClass, classWorld);
TypeMask anyBool =
new TypeMask.nonNullSubtype(classWorld.boolClass, classWorld);
- _numStringBoolType =
- new TypeMask.unionOf(<TypeMask>[anyNum, anyString, anyBool],
- classWorld);
+ _numStringBoolType = new TypeMask.unionOf(
+ <TypeMask>[anyNum, anyString, anyBool], classWorld);
}
return _numStringBoolType;
}
@@ -114,8 +113,10 @@
@override
TypeMask get fixedLengthType {
if (_fixedLengthType == null) {
- List<TypeMask> fixedLengthTypes =
- <TypeMask>[stringType, backend.fixedArrayType];
+ List<TypeMask> fixedLengthTypes = <TypeMask>[
+ stringType,
+ backend.fixedArrayType
+ ];
if (classWorld.isInstantiated(helpers.typedArrayClass)) {
fixedLengthTypes.add(nonNullSubclass(helpers.typedArrayClass));
}
@@ -128,13 +129,14 @@
TypeMask get interceptorType {
if (_interceptorType == null) {
_interceptorType =
- new TypeMask.nonNullSubtype(helpers.jsInterceptorClass, classWorld);
+ new TypeMask.nonNullSubtype(helpers.jsInterceptorClass, classWorld);
}
return _interceptorType;
}
@override
- TypeMask get interceptedTypes { // Does not include null.
+ TypeMask get interceptedTypes {
+ // Does not include null.
if (_interceptedTypes == null) {
// We redundantly include subtypes of num/string/bool as intercepted
// types, because the type system does not infer that their
@@ -154,9 +156,8 @@
new TypeMask.nonNullSubtype(helpers.jsIndexableClass, classWorld);
TypeMask anyString =
new TypeMask.nonNullSubtype(classWorld.stringClass, classWorld);
- __indexableTypeTest = new TypeMask.unionOf(
- <TypeMask>[indexable, anyString],
- classWorld);
+ __indexableTypeTest =
+ new TypeMask.unionOf(<TypeMask>[indexable, anyString], classWorld);
}
return __indexableTypeTest;
}
@@ -169,15 +170,14 @@
TypeMaskSystem(dart2js.Compiler compiler)
: inferrer = compiler.typesTask,
classWorld = compiler.world,
- backend = compiler.backend {
- }
+ backend = compiler.backend {}
@override
bool methodIgnoresReceiverArgument(FunctionElement function) {
assert(backend.isInterceptedMethod(function));
ClassElement clazz = function.enclosingClass.declaration;
return !clazz.isSubclassOf(helpers.jsInterceptorClass) &&
- !classWorld.isUsedAsMixin(clazz);
+ !classWorld.isUsedAsMixin(clazz);
}
@override
@@ -191,7 +191,7 @@
if (target is! FunctionElement) return false;
FunctionElement function = target;
return selector.isGetter && !function.isGetter ||
- !methodIgnoresReceiverArgument(function);
+ !methodIgnoresReceiverArgument(function);
}
return !classWorld.allFunctions.filter(selector, type).any(needsReceiver);
}
@@ -271,8 +271,8 @@
return a.intersection(b, classWorld);
}
- void associateConstantValueWithElement(ConstantValue constant,
- Element element) {
+ void associateConstantValueWithElement(
+ ConstantValue constant, Element element) {
// TODO(25093): Replace this code with an approach that works for anonymous
// constants and non-constant literals.
if (constant is ListConstantValue || constant is MapConstantValue) {
@@ -289,13 +289,13 @@
@override
TypeMask getTypeOf(ConstantValue constant) {
return _constantMasks[constant] ??
- computeTypeMask(inferrer.compiler, constant);
+ computeTypeMask(inferrer.compiler, constant);
}
@override
ConstantValue getConstantOf(TypeMask mask) {
if (!mask.isValue) return null;
- if (mask.isNullable) return null; // e.g. 'true or null'.
+ if (mask.isNullable) return null; // e.g. 'true or null'.
ValueTypeMask valueMask = mask;
if (valueMask.value.isBool) return valueMask.value;
// TODO(sra): Consider other values. Be careful with large strings.
@@ -420,8 +420,9 @@
@override
bool isDefinitelyExtendableArray(TypeMask t, {bool allowNull: false}) {
if (!allowNull && t.isNullable) return false;
- return t.nonNullable().satisfies(helpers.jsExtendableArrayClass,
- classWorld);
+ return t
+ .nonNullable()
+ .satisfies(helpers.jsExtendableArrayClass, classWorld);
}
@override
@@ -433,8 +434,9 @@
@override
bool isDefinitelyMutableIndexable(TypeMask t, {bool allowNull: false}) {
if (!allowNull && t.isNullable) return false;
- return t.nonNullable().satisfies(helpers.jsMutableIndexableClass,
- classWorld);
+ return t
+ .nonNullable()
+ .satisfies(helpers.jsMutableIndexableClass, classWorld);
}
@override
@@ -480,9 +482,8 @@
}
@override
- AbstractBool isSubtypeOf(TypeMask value,
- types.DartType type,
- {bool allowNull}) {
+ AbstractBool isSubtypeOf(TypeMask value, types.DartType type,
+ {bool allowNull}) {
assert(allowNull != null);
if (type is types.DynamicType) {
return AbstractBool.True;
@@ -543,8 +544,7 @@
if (element == classWorld.stringClass) {
return stringType;
}
- if (element == classWorld.numClass ||
- element == classWorld.doubleClass) {
+ if (element == classWorld.numClass || element == classWorld.doubleClass) {
return numType;
}
if (element == classWorld.intClass) {
diff --git a/pkg/compiler/lib/src/cps_ir/type_propagation.dart b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
index 3f982d1..50a73e0 100644
--- a/pkg/compiler/lib/src/cps_ir/type_propagation.dart
+++ b/pkg/compiler/lib/src/cps_ir/type_propagation.dart
@@ -5,33 +5,23 @@
import 'optimizers.dart';
-import '../closure.dart' show
- ClosureClassElement;
+import '../closure.dart' show ClosureClassElement;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers,
- Selectors;
-import '../compiler.dart' as dart2js show
- Compiler;
+import '../common/names.dart' show Identifiers, Selectors;
+import '../compiler.dart' as dart2js show Compiler;
import '../constants/constant_system.dart';
import '../constants/values.dart';
import '../dart_types.dart' as types;
import '../elements/elements.dart';
-import '../io/source_information.dart' show
- SourceInformation;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
-import '../js_backend/js_backend.dart' show
- JavaScriptBackend;
-import '../js_backend/codegen/task.dart' show
- CpsFunctionCompiler;
+import '../io/source_information.dart' show SourceInformation;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
+import '../js_backend/js_backend.dart' show JavaScriptBackend;
+import '../js_backend/codegen/task.dart' show CpsFunctionCompiler;
import '../resolution/operators.dart';
import '../tree/tree.dart' as ast;
import '../types/types.dart';
-import '../types/abstract_value_domain.dart' show
- AbstractBool;
-import '../universe/selector.dart' show
- Selector;
+import '../types/abstract_value_domain.dart' show AbstractBool;
+import '../universe/selector.dart' show Selector;
import '../world.dart' show World;
import 'cps_fragment.dart';
import 'cps_ir_nodes.dart';
@@ -49,17 +39,17 @@
final AbstractConstantValue falseValue;
ConstantPropagationLattice(CpsFunctionCompiler functionCompiler)
- : typeSystem = functionCompiler.typeSystem,
- constantSystem = functionCompiler.compiler.backend.constantSystem,
- dartTypes = functionCompiler.compiler.types,
- anything = new AbstractConstantValue.nonConstant(
- functionCompiler.typeSystem.dynamicType),
- nullValue = new AbstractConstantValue.constantValue(
- new NullConstantValue(), new TypeMask.empty()),
- trueValue = new AbstractConstantValue.constantValue(
- new TrueConstantValue(), functionCompiler.typeSystem.boolType),
- falseValue = new AbstractConstantValue.constantValue(
- new FalseConstantValue(), functionCompiler.typeSystem.boolType);
+ : typeSystem = functionCompiler.typeSystem,
+ constantSystem = functionCompiler.compiler.backend.constantSystem,
+ dartTypes = functionCompiler.compiler.types,
+ anything = new AbstractConstantValue.nonConstant(
+ functionCompiler.typeSystem.dynamicType),
+ nullValue = new AbstractConstantValue.constantValue(
+ new NullConstantValue(), new TypeMask.empty()),
+ trueValue = new AbstractConstantValue.constantValue(
+ new TrueConstantValue(), functionCompiler.typeSystem.boolType),
+ falseValue = new AbstractConstantValue.constantValue(
+ new FalseConstantValue(), functionCompiler.typeSystem.boolType);
AbstractConstantValue constant(ConstantValue value, [TypeMask type]) {
if (type == null) type = typeSystem.getTypeOf(value);
@@ -91,33 +81,33 @@
/// True if all members of this value are booleans.
bool isDefinitelyBool(AbstractConstantValue value, {bool allowNull: false}) {
return value.isNothing ||
- typeSystem.isDefinitelyBool(value.type, allowNull: allowNull);
+ typeSystem.isDefinitelyBool(value.type, allowNull: allowNull);
}
/// True if all members of this value are numbers.
bool isDefinitelyNum(AbstractConstantValue value, {bool allowNull: false}) {
return value.isNothing ||
- typeSystem.isDefinitelyNum(value.type, allowNull: allowNull);
+ typeSystem.isDefinitelyNum(value.type, allowNull: allowNull);
}
/// True if all members of this value are strings.
bool isDefinitelyString(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
- typeSystem.isDefinitelyString(value.type, allowNull: allowNull);
+ typeSystem.isDefinitelyString(value.type, allowNull: allowNull);
}
/// True if all members of this value are numbers, strings, or booleans.
bool isDefinitelyNumStringBool(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
- typeSystem.isDefinitelyNumStringBool(value.type, allowNull: allowNull);
+ typeSystem.isDefinitelyNumStringBool(value.type, allowNull: allowNull);
}
/// True if this value cannot be a string, number, or boolean.
bool isDefinitelyNotNumStringBool(AbstractConstantValue value) {
return value.isNothing ||
- typeSystem.isDefinitelyNotNumStringBool(value.type);
+ typeSystem.isDefinitelyNotNumStringBool(value.type);
}
/// True if this value cannot be a non-integer double.
@@ -126,63 +116,58 @@
/// it is a whole number and is not NaN, Infinity, or minus Infinity.
bool isDefinitelyNotNonIntegerDouble(AbstractConstantValue value) {
return value.isNothing ||
- value.isConstant && !value.constant.isDouble ||
- typeSystem.isDefinitelyNotNonIntegerDouble(value.type);
+ value.isConstant && !value.constant.isDouble ||
+ typeSystem.isDefinitelyNotNonIntegerDouble(value.type);
}
- bool isDefinitelyInt(AbstractConstantValue value,
- {bool allowNull: false}) {
+ bool isDefinitelyInt(AbstractConstantValue value, {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyInt(value.type, allowNull: allowNull);
}
bool isDefinitelyUint31(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyUint31(value.type, allowNull: allowNull);
}
bool isDefinitelyUint32(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyUint32(value.type, allowNull: allowNull);
}
- bool isDefinitelyUint(AbstractConstantValue value,
- {bool allowNull: false}) {
+ bool isDefinitelyUint(AbstractConstantValue value, {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyUint(value.type, allowNull: allowNull);
}
- bool isDefinitelyArray(AbstractConstantValue value,
- {bool allowNull: false}) {
+ bool isDefinitelyArray(AbstractConstantValue value, {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyArray(value.type, allowNull: allowNull);
}
bool isDefinitelyMutableArray(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
- typeSystem.isDefinitelyMutableArray(value.type,
- allowNull: allowNull);
+ typeSystem.isDefinitelyMutableArray(value.type, allowNull: allowNull);
}
bool isDefinitelyFixedArray(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
- typeSystem.isDefinitelyFixedArray(value.type,
- allowNull: allowNull);
+ typeSystem.isDefinitelyFixedArray(value.type, allowNull: allowNull);
}
bool isDefinitelyExtendableArray(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyExtendableArray(value.type,
- allowNull: allowNull);
+ allowNull: allowNull);
}
bool isDefinitelyIndexable(AbstractConstantValue value,
- {bool allowNull: false}) {
+ {bool allowNull: false}) {
return value.isNothing ||
typeSystem.isDefinitelyIndexable(value.type, allowNull: allowNull);
}
@@ -210,9 +195,8 @@
/// If [allowNull] is true, `null` is considered an instance of anything,
/// otherwise it is only considered an instance of [Object], [dynamic], and
/// [Null].
- AbstractBool isSubtypeOf(AbstractConstantValue value,
- types.DartType type,
- {bool allowNull}) {
+ AbstractBool isSubtypeOf(AbstractConstantValue value, types.DartType type,
+ {bool allowNull}) {
assert(allowNull != null);
if (value.isNothing) {
return AbstractBool.Nothing;
@@ -232,8 +216,8 @@
}
if (type == dartTypes.coreTypes.intType) {
return constantSystem.isInt(value.constant)
- ? AbstractBool.True
- : AbstractBool.False;
+ ? AbstractBool.True
+ : AbstractBool.False;
}
types.DartType valueType = value.constant.getType(dartTypes.coreTypes);
if (constantSystem.isSubtype(dartTypes, valueType, type)) {
@@ -256,8 +240,8 @@
///
/// This method returns `null` if a good result could not be found. In that
/// case, it is best to fall back on interprocedural type information.
- AbstractConstantValue unaryOp(UnaryOperator operator,
- AbstractConstantValue value) {
+ AbstractConstantValue unaryOp(
+ UnaryOperator operator, AbstractConstantValue value) {
switch (operator.kind) {
case UnaryOperatorKind.COMPLEMENT:
return bitNotSpecial(value);
@@ -289,8 +273,7 @@
/// This method returns `null` if a good result could not be found. In that
/// case, it is best to fall back on interprocedural type information.
AbstractConstantValue binaryOp(BinaryOperator operator,
- AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue left, AbstractConstantValue right) {
switch (operator.kind) {
case BinaryOperatorKind.ADD:
return addSpecial(left, right);
@@ -355,8 +338,8 @@
return null; // The caller will use return type from type inference.
}
- AbstractConstantValue foldUnary(UnaryOperation operation,
- AbstractConstantValue value) {
+ AbstractConstantValue foldUnary(
+ UnaryOperation operation, AbstractConstantValue value) {
if (value.isNothing) return nothing;
if (value.isConstant) {
ConstantValue result = operation.fold(value.constant);
@@ -378,7 +361,6 @@
return null;
}
-
AbstractConstantValue foldBinary(BinaryOperation operation,
AbstractConstantValue left, AbstractConstantValue right) {
if (left.isNothing || right.isNothing) return nothing;
@@ -389,8 +371,8 @@
return null;
}
- AbstractConstantValue closedOnInt(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue closedOnInt(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (isDefinitelyInt(left, allowNull: true) &&
isDefinitelyInt(right, allowNull: true)) {
return nonConstant(typeSystem.intType);
@@ -398,8 +380,8 @@
return null;
}
- AbstractConstantValue closedOnUint(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue closedOnUint(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (isDefinitelyUint(left, allowNull: true) &&
isDefinitelyUint(right, allowNull: true)) {
return nonConstant(typeSystem.uintType);
@@ -407,8 +389,8 @@
return null;
}
- AbstractConstantValue closedOnUint31(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue closedOnUint31(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (isDefinitelyUint31(left, allowNull: true) &&
isDefinitelyUint31(right, allowNull: true)) {
return nonConstant(typeSystem.uint31Type);
@@ -416,8 +398,8 @@
return null;
}
- AbstractConstantValue addSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue addSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded = foldBinary(constantSystem.add, left, right);
if (folded != null) return folded;
if (isDefinitelyNum(left, allowNull: true)) {
@@ -430,22 +412,22 @@
return null;
}
- AbstractConstantValue subtractSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue subtractSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.subtract, left, right);
return folded ?? closedOnInt(left, right);
}
- AbstractConstantValue multiplySpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue multiplySpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.multiply, left, right);
return folded ?? closedOnUint(left, right) ?? closedOnInt(left, right);
}
- AbstractConstantValue divideSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue divideSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
return foldBinary(constantSystem.divide, left, right);
}
@@ -476,42 +458,41 @@
return null;
}
- AbstractConstantValue moduloSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue moduloSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.modulo, left, right);
return folded ?? closedOnUint(left, right) ?? closedOnInt(left, right);
}
- AbstractConstantValue remainderSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue remainderSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (left.isNothing || right.isNothing) return nothing;
- AbstractConstantValue folded = null; // Remainder not in constant system.
+ AbstractConstantValue folded = null; // Remainder not in constant system.
return folded ?? closedOnUint(left, right) ?? closedOnInt(left, right);
}
- AbstractConstantValue codeUnitAtSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue codeUnitAtSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
return foldBinary(constantSystem.codeUnitAt, left, right);
}
- AbstractConstantValue equalSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue equalSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.equal, left, right);
if (folded != null) return folded;
bool behavesLikeIdentity =
isDefinitelyNumStringBool(left, allowNull: true) ||
- right.isNullConstant;
- if (behavesLikeIdentity &&
- typeSystem.areDisjoint(left.type, right.type)) {
+ right.isNullConstant;
+ if (behavesLikeIdentity && typeSystem.areDisjoint(left.type, right.type)) {
return constant(new FalseConstantValue());
}
return null;
}
- AbstractConstantValue andSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue andSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.bitAnd, left, right);
if (folded != null) return folded;
@@ -525,27 +506,27 @@
return null;
}
- AbstractConstantValue orSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue orSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.bitOr, left, right);
return folded ?? closedOnUint31(left, right);
}
- AbstractConstantValue xorSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue xorSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.bitXor, left, right);
return folded ?? closedOnUint31(left, right);
}
- AbstractConstantValue shiftLeftSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue shiftLeftSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
return foldBinary(constantSystem.shiftLeft, left, right);
}
- AbstractConstantValue shiftRightSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue shiftRightSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
AbstractConstantValue folded =
foldBinary(constantSystem.shiftRight, left, right);
if (folded != null) return folded;
@@ -561,8 +542,8 @@
return null;
}
- AbstractConstantValue lessSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue lessSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (isDefinitelyUint(left) && right.isZeroOrNegativeConstant) {
return falseValue; // "uint < 0" is false.
} else if (left.isNegativeConstant && isDefinitelyUint(right)) {
@@ -571,8 +552,8 @@
return foldBinary(constantSystem.less, left, right);
}
- AbstractConstantValue lessEqualSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue lessEqualSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (isDefinitelyUint(left) && right.isNegativeConstant) {
return falseValue; // "uint <= -1" is false.
} else if (left.isZeroOrNegativeConstant && isDefinitelyUint(right)) {
@@ -581,8 +562,8 @@
return foldBinary(constantSystem.lessEqual, left, right);
}
- AbstractConstantValue greaterSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue greaterSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (left.isZeroOrNegativeConstant && isDefinitelyUint(right)) {
return falseValue; // "0 > uint" is false
} else if (isDefinitelyUint(left) && right.isNegativeConstant) {
@@ -591,8 +572,8 @@
return foldBinary(constantSystem.greater, left, right);
}
- AbstractConstantValue greaterEqualSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue greaterEqualSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (left.isNegativeConstant && isDefinitelyUint(right)) {
return falseValue; // "-1 >= uint" is false
} else if (isDefinitelyUint(left) && right.isZeroOrNegativeConstant) {
@@ -618,15 +599,15 @@
if (length != null) {
return intConstant(length);
}
- return null; // The caller will use return type from type inference.
+ return null; // The caller will use return type from type inference.
}
AbstractConstantValue stringConstant(String value) {
return constant(new StringConstantValue(new ast.DartString.literal(value)));
}
- AbstractConstantValue indexSpecial(AbstractConstantValue left,
- AbstractConstantValue right) {
+ AbstractConstantValue indexSpecial(
+ AbstractConstantValue left, AbstractConstantValue right) {
if (left.isNothing || right.isNothing) return nothing;
if (right.isConstant) {
ConstantValue index = right.constant;
@@ -639,7 +620,7 @@
if (0 <= indexValue && indexValue < stringValue.length) {
return stringConstant(stringValue[indexValue]);
} else {
- return nothing; // Will throw.
+ return nothing; // Will throw.
}
}
} else if (receiver is ListConstantValue) {
@@ -648,7 +629,7 @@
if (0 <= indexValue && indexValue < receiver.length) {
return constant(receiver.entries[indexValue]);
} else {
- return nothing; // Will throw.
+ return nothing; // Will throw.
}
}
} else if (receiver is MapConstantValue) {
@@ -664,7 +645,7 @@
}
// TODO(asgerf): Handle case where 'left' is a List or Map constant but
// the index is unknown.
- return null; // The caller will use return type from type inference.
+ return null; // The caller will use return type from type inference.
}
AbstractConstantValue stringify(AbstractConstantValue value) {
@@ -726,8 +707,8 @@
return nonConstant(value.type.nonNullable());
}
- AbstractConstantValue intersectWithType(AbstractConstantValue value,
- TypeMask type) {
+ AbstractConstantValue intersectWithType(
+ AbstractConstantValue value, TypeMask type) {
if (value.isNothing || typeSystem.areDisjoint(value.type, type)) {
return nothing;
} else if (value.isConstant) {
@@ -761,7 +742,7 @@
String get passName => 'Type propagation';
final CpsFunctionCompiler _functionCompiler;
- final Map<Variable, ConstantValue> _values= <Variable, ConstantValue>{};
+ final Map<Variable, ConstantValue> _values = <Variable, ConstantValue>{};
final ConstantPropagationLattice _lattice;
final bool recomputeAll;
@@ -777,10 +758,8 @@
void rewrite(FunctionDefinition root) {
// Analyze. In this phase, the entire term is analyzed for reachability
// and the abstract value of each expression.
- TypePropagationVisitor analyzer = new TypePropagationVisitor(
- _lattice,
- _values,
- _internalError);
+ TypePropagationVisitor analyzer =
+ new TypePropagationVisitor(_lattice, _values, _internalError);
analyzer.analyze(root, recomputeAll);
@@ -788,28 +767,24 @@
// replace branches with fixed targets and side-effect-free expressions
// with constant results or existing values that are in scope.
TransformingVisitor transformer = new TransformingVisitor(
- _compiler,
- _functionCompiler,
- _lattice,
- analyzer,
- _internalError);
+ _compiler, _functionCompiler, _lattice, analyzer, _internalError);
transformer.transform(root);
}
}
final Map<String, BuiltinOperator> NumBinaryBuiltins =
- const <String, BuiltinOperator>{
- '+': BuiltinOperator.NumAdd,
- '-': BuiltinOperator.NumSubtract,
- '*': BuiltinOperator.NumMultiply,
- '/': BuiltinOperator.NumDivide,
- '&': BuiltinOperator.NumAnd,
- '|': BuiltinOperator.NumOr,
- '^': BuiltinOperator.NumXor,
- '<': BuiltinOperator.NumLt,
- '<=': BuiltinOperator.NumLe,
- '>': BuiltinOperator.NumGt,
- '>=': BuiltinOperator.NumGe
+ const <String, BuiltinOperator>{
+ '+': BuiltinOperator.NumAdd,
+ '-': BuiltinOperator.NumSubtract,
+ '*': BuiltinOperator.NumMultiply,
+ '/': BuiltinOperator.NumDivide,
+ '&': BuiltinOperator.NumAnd,
+ '|': BuiltinOperator.NumOr,
+ '^': BuiltinOperator.NumXor,
+ '<': BuiltinOperator.NumLt,
+ '<=': BuiltinOperator.NumLe,
+ '>': BuiltinOperator.NumGt,
+ '>=': BuiltinOperator.NumGe
};
/**
@@ -835,14 +810,10 @@
TypeCheckOperator checkIsNumber;
- TransformingVisitor(this.compiler,
- this.functionCompiler,
- this.lattice,
- this.analyzer,
- this.internalError) {
+ TransformingVisitor(this.compiler, this.functionCompiler, this.lattice,
+ this.analyzer, this.internalError) {
checkIsNumber = new ClassTypeCheckOperator(
- helpers.jsNumberClass,
- BuiltinOperator.IsNotNumber);
+ helpers.jsNumberClass, BuiltinOperator.IsNotNumber);
}
void transform(FunctionDefinition root) {
@@ -854,8 +825,8 @@
if (getValue(param).isNothing) {
// Replace with `throw "Unreachable";`
CpsFragment cps = new CpsFragment(null);
- Primitive message = cps.makeConstant(
- new StringConstantValue.fromString("Unreachable"));
+ Primitive message =
+ cps.makeConstant(new StringConstantValue.fromString("Unreachable"));
cps.put(new Throw(message));
replaceSubtree(root.body, cps.result);
return;
@@ -1168,7 +1139,7 @@
/// Check that the receiver and argument satisfy the given type checks, and
/// throw a [NoSuchMethodError] or [ArgumentError] if the check fails.
CpsFragment makeGuard(TypeCheckOperator receiverGuard,
- [TypeCheckOperator argumentGuard]) {
+ [TypeCheckOperator argumentGuard]) {
CpsFragment cps = new CpsFragment(node.sourceInformation);
// Make no guards if trusting primitives.
@@ -1178,8 +1149,7 @@
ChecksNeeded receiverChecks =
receiverGuard.getChecksNeeded(node.receiver, classWorld);
bool needReceiverGuard = receiverChecks != ChecksNeeded.None;
- bool needArgumentGuard =
- argumentGuard != null &&
+ bool needArgumentGuard = argumentGuard != null &&
argumentGuard.needsCheck(node.argument(0), classWorld);
if (!needReceiverGuard && !needArgumentGuard) return cps;
@@ -1193,13 +1163,10 @@
if (!needArgumentGuard) {
Primitive condition = receiverGuard.makeCheck(cps, node.receiver);
cps.letPrim(new ReceiverCheck(
- node.receiver,
- node.selector,
- node.sourceInformation,
+ node.receiver, node.selector, node.sourceInformation,
condition: condition,
useSelector: true,
- isNullCheck: receiverChecks == ChecksNeeded.Null
- ));
+ isNullCheck: receiverChecks == ChecksNeeded.Null));
return cps;
}
@@ -1212,9 +1179,10 @@
// if (typeof argument !== "number") return H.iae(argument);
//
if (!needReceiverGuard) {
- cps.ifTruthy(argumentGuard.makeCheck(cps, node.argument(0)))
- .invokeStaticThrower(helpers.throwIllegalArgumentException,
- [node.argument(0)]);
+ cps
+ .ifTruthy(argumentGuard.makeCheck(cps, node.argument(0)))
+ .invokeStaticThrower(
+ helpers.throwIllegalArgumentException, [node.argument(0)]);
return cps;
}
@@ -1226,16 +1194,18 @@
// return J.$lt(receiver, argument);
//
Continuation fail = cps.letCont();
- cps.ifTruthy(receiverGuard.makeCheck(cps, node.receiver))
- .invokeContinuation(fail);
- cps.ifTruthy(argumentGuard.makeCheck(cps, node.argument(0)))
- .invokeContinuation(fail);
+ cps
+ .ifTruthy(receiverGuard.makeCheck(cps, node.receiver))
+ .invokeContinuation(fail);
+ cps
+ .ifTruthy(argumentGuard.makeCheck(cps, node.argument(0)))
+ .invokeContinuation(fail);
cps.insideContinuation(fail)
- ..invokeMethod(node.receiver, node.selector, node.mask,
- [node.argument(0)],
- callingConvention: CallingConvention.OneShotIntercepted)
- ..put(new Unreachable());
+ ..invokeMethod(
+ node.receiver, node.selector, node.mask, [node.argument(0)],
+ callingConvention: CallingConvention.OneShotIntercepted)
+ ..put(new Unreachable());
return cps;
}
@@ -1246,11 +1216,10 @@
/// If [guard] is given, the receiver and argument are both checked using
/// that operator.
CpsFragment makeBinary(BuiltinOperator operator,
- {TypeCheckOperator guard: TypeCheckOperator.none}) {
+ {TypeCheckOperator guard: TypeCheckOperator.none}) {
CpsFragment cps = makeGuard(guard, guard);
Primitive left = guard.makeRefinement(cps, node.receiver, classWorld);
- Primitive right =
- guard.makeRefinement(cps, node.argument(0), classWorld);
+ Primitive right = guard.makeRefinement(cps, node.argument(0), classWorld);
Primitive result = cps.applyBuiltin(operator, [left, right]);
result.hint = node.hint;
node.replaceUsesWith(result);
@@ -1260,10 +1229,9 @@
/// Like [makeBinary] but for unary operators with the receiver as the
/// argument.
CpsFragment makeUnary(BuiltinOperator operator,
- {TypeCheckOperator guard: TypeCheckOperator.none}) {
+ {TypeCheckOperator guard: TypeCheckOperator.none}) {
CpsFragment cps = makeGuard(guard);
- Primitive argument =
- guard.makeRefinement(cps, node.receiver, classWorld);
+ Primitive argument = guard.makeRefinement(cps, node.receiver, classWorld);
Primitive result = cps.applyBuiltin(operator, [argument]);
result.hint = node.hint;
node.replaceUsesWith(result);
@@ -1278,10 +1246,8 @@
/// Replaces the call with a call to [name] with the same inputs.
InvokeMethod makeRenamedInvoke(String name) {
- return new InvokeMethod(node.receiver,
- renameToOptimizedSelector(name),
- node.mask,
- node.arguments.toList(),
+ return new InvokeMethod(node.receiver, renameToOptimizedSelector(name),
+ node.mask, node.arguments.toList(),
sourceInformation: node.sourceInformation,
callingConvention: node.callingConvention,
interceptor: node.interceptor);
@@ -1348,13 +1314,13 @@
lattice.isDefinitelyIntInRange(right, min: 0, max: 31)) {
return makeBinary(BuiltinOperator.NumShr, guard: checkIsNumber);
} else if (lattice.isDefinitelyUint(left) &&
- lattice.isDefinitelyUint(right)) {
+ lattice.isDefinitelyUint(right)) {
return makeRenamedInvoke('_shrBothPositive');
} else if (lattice.isDefinitelyUint(left) &&
- lattice.isDefinitelyNum(right)) {
+ lattice.isDefinitelyNum(right)) {
return makeRenamedInvoke('_shrReceiverPositive');
} else if (lattice.isDefinitelyNum(left) &&
- lattice.isDefinitelyUint(right)) {
+ lattice.isDefinitelyUint(right)) {
return makeRenamedInvoke('_shrOtherPositive');
}
}
@@ -1416,9 +1382,8 @@
lattice.isDefinitelyInt(getValue(index))) {
CpsFragment cps = new CpsFragment(node.sourceInformation);
receiver = makeBoundsCheck(cps, receiver, index);
- ApplyBuiltinOperator get =
- cps.applyBuiltin(BuiltinOperator.CharCodeAt,
- <Primitive>[receiver, index]);
+ ApplyBuiltinOperator get = cps.applyBuiltin(
+ BuiltinOperator.CharCodeAt, <Primitive>[receiver, index]);
node.replaceUsesWith(get);
get.hint = node.hint;
return cps;
@@ -1458,9 +1423,7 @@
} else if (node.selector.isSetter) {
if (target.isFinal) return null;
assert(node.hasNoUses);
- return new SetField(node.receiver,
- target,
- node.argument(0));
+ return new SetField(node.receiver, target, node.argument(0));
} else if (node.selector.isCall) {
CpsFragment cps = new CpsFragment(node.sourceInformation);
Primitive fieldValue = cps.letPrim(new GetField(node.receiver, target));
@@ -1482,17 +1445,15 @@
///
/// Returns a CPS fragment whose context is the branch where no error
/// was thrown.
- Primitive makeBoundsCheck(CpsFragment cps,
- Primitive list,
- Primitive index,
- [int checkKind = BoundsCheck.BOTH_BOUNDS | BoundsCheck.INTEGER]) {
+ Primitive makeBoundsCheck(CpsFragment cps, Primitive list, Primitive index,
+ [int checkKind = BoundsCheck.BOTH_BOUNDS | BoundsCheck.INTEGER]) {
if (compiler.options.trustPrimitives) {
return cps.letPrim(new BoundsCheck.noCheck(list, cps.sourceInformation));
} else {
GetLength length = cps.letPrim(new GetLength(list));
list = cps.refine(list, typeSystem.nonNullType);
- BoundsCheck check = cps.letPrim(new BoundsCheck(list, index, length,
- checkKind, cps.sourceInformation));
+ BoundsCheck check = cps.letPrim(new BoundsCheck(
+ list, index, length, checkKind, cps.sourceInformation));
if (check.hasIntegerCheck) {
if (typeSystem.isDefinitelyInt(index.type)) {
check.checks &= ~BoundsCheck.INTEGER;
@@ -1509,16 +1470,13 @@
///
/// Returns a CPS fragment whose context is the branch where no error
/// was thrown.
- CpsFragment makeConcurrentModificationCheck(Primitive list,
- Primitive originalLength,
- SourceInformation sourceInfo) {
+ CpsFragment makeConcurrentModificationCheck(
+ Primitive list, Primitive originalLength, SourceInformation sourceInfo) {
CpsFragment cps = new CpsFragment(sourceInfo);
- Primitive lengthChanged = cps.applyBuiltin(
- BuiltinOperator.StrictNeq,
+ Primitive lengthChanged = cps.applyBuiltin(BuiltinOperator.StrictNeq,
<Primitive>[originalLength, cps.letPrim(new GetLength(list))]);
cps.ifTruthy(lengthChanged).invokeStaticThrower(
- helpers.throwConcurrentModificationError,
- <Primitive>[list]);
+ helpers.throwConcurrentModificationError, <Primitive>[list]);
return cps;
}
@@ -1529,7 +1487,7 @@
Primitive receiver = node.receiver;
AbstractConstantValue receiverValue = getValue(receiver);
if (!typeSystem.isDefinitelyIndexable(receiverValue.type,
- allowNull: true)) {
+ allowNull: true)) {
return null;
}
switch (node.selector.name) {
@@ -1539,7 +1497,7 @@
}
if (node.selector.isSetter) {
if (!typeSystem.isDefinitelyExtendableArray(receiver.type,
- allowNull: true)) {
+ allowNull: true)) {
return null;
}
CpsFragment cps = new CpsFragment(node.sourceInformation);
@@ -1554,11 +1512,8 @@
return null;
}
}
- cps.letPrim(new ApplyBuiltinMethod(
- BuiltinMethod.SetLength,
- receiver,
- [newLength],
- node.sourceInformation));
+ cps.letPrim(new ApplyBuiltinMethod(BuiltinMethod.SetLength, receiver,
+ [newLength], node.sourceInformation));
if (!typeSystem.isDefinitelyUint32(newLength.type)) {
// If the setter succeeded, the length must have been a uint32.
cps.refine(newLength, typeSystem.uint32Type);
@@ -1579,7 +1534,7 @@
case '[]=':
if (!typeSystem.isDefinitelyMutableIndexable(receiverValue.type,
- allowNull: true)) {
+ allowNull: true)) {
return null;
}
Primitive index = node.argument(0);
@@ -1595,8 +1550,8 @@
CpsFragment cps = new CpsFragment(node.sourceInformation);
Primitive length = cps.letPrim(new GetLength(receiver));
Constant zero = cps.makeZero();
- ApplyBuiltinOperator op = cps.applyBuiltin(BuiltinOperator.StrictEq,
- [length, zero]);
+ ApplyBuiltinOperator op =
+ cps.applyBuiltin(BuiltinOperator.StrictEq, [length, zero]);
node.replaceUsesWith(op);
op.hint = node.hint;
return cps;
@@ -1606,8 +1561,8 @@
CpsFragment cps = new CpsFragment(node.sourceInformation);
Primitive length = cps.letPrim(new GetLength(receiver));
Constant zero = cps.makeZero();
- ApplyBuiltinOperator op = cps.applyBuiltin(BuiltinOperator.StrictNeq,
- [length, zero]);
+ ApplyBuiltinOperator op =
+ cps.applyBuiltin(BuiltinOperator.StrictNeq, [length, zero]);
node.replaceUsesWith(op);
op.hint = node.hint;
return cps;
@@ -1642,33 +1597,28 @@
if (!isExtendable) return null;
Primitive addedItem = node.argument(0);
CpsFragment cps = new CpsFragment(sourceInfo);
- cps.invokeBuiltin(BuiltinMethod.Push,
- list,
- <Primitive>[addedItem]);
+ cps.invokeBuiltin(BuiltinMethod.Push, list, <Primitive>[addedItem]);
if (node.hasAtLeastOneUse) {
node.replaceUsesWith(cps.makeNull());
}
return cps;
case 'removeLast':
- if (!node.selector.isCall ||
- node.selector.argumentCount != 0) {
+ if (!node.selector.isCall || node.selector.argumentCount != 0) {
return null;
}
if (!isExtendable) return null;
CpsFragment cps = new CpsFragment(sourceInfo);
- list = makeBoundsCheck(cps, list, cps.makeMinusOne(),
- BoundsCheck.EMPTINESS);
- Primitive removedItem = cps.invokeBuiltin(BuiltinMethod.Pop,
- list,
- <Primitive>[]);
+ list = makeBoundsCheck(
+ cps, list, cps.makeMinusOne(), BoundsCheck.EMPTINESS);
+ Primitive removedItem =
+ cps.invokeBuiltin(BuiltinMethod.Pop, list, <Primitive>[]);
removedItem.hint = node.hint;
node.replaceUsesWith(removedItem);
return cps;
case 'addAll':
- if (!node.selector.isCall ||
- node.selector.argumentCount != 1) {
+ if (!node.selector.isCall || node.selector.argumentCount != 1) {
return null;
}
if (!isExtendable) return null;
@@ -1683,9 +1633,8 @@
LiteralList addedLiteral = addedList;
CpsFragment cps = new CpsFragment(sourceInfo);
for (Reference value in addedLiteral.valueRefs) {
- cps.invokeBuiltin(BuiltinMethod.Push,
- list,
- <Primitive>[value.definition]);
+ cps.invokeBuiltin(
+ BuiltinMethod.Push, list, <Primitive>[value.definition]);
}
if (node.hasAtLeastOneUse) {
node.replaceUsesWith(cps.makeNull());
@@ -1711,19 +1660,16 @@
case 'forEach':
Element element =
compiler.world.locateSingleElement(node.selector, listValue.type);
- if (element == null ||
- !element.isFunction ||
- !node.selector.isCall) return null;
+ if (element == null || !element.isFunction || !node.selector.isCall)
+ return null;
assert(node.selector.positionalArgumentCount == 1);
assert(node.selector.namedArgumentCount == 0);
FunctionDefinition target = functionCompiler.compileToCpsIr(element);
CpsFragment cps = new CpsFragment(node.sourceInformation);
- Primitive result = cps.inlineFunction(target,
- node.receiver,
- node.arguments.toList(),
- interceptor: node.interceptor,
- hint: node.hint);
+ Primitive result = cps.inlineFunction(
+ target, node.receiver, node.arguments.toList(),
+ interceptor: node.interceptor, hint: node.hint);
node.replaceUsesWith(result);
return cps;
@@ -1765,7 +1711,7 @@
}
use.replaceWith(new GetMutable(current));
} else {
- assert (use.selector == Selectors.moveNext);
+ assert(use.selector == Selectors.moveNext);
// Rewrite iterator.moveNext() to:
//
// if (index < list.length) {
@@ -1818,8 +1764,8 @@
// TODO(asgerf): Do this in a continuation so multiple
// continues can share the same code.
for (Reference ref = parent.firstRef;
- ref != null;
- ref = ref.next) {
+ ref != null;
+ ref = ref.next) {
Expression invocationCaller = ref.parent;
if (getEffectiveParent(invocationCaller) == iteratorBinding) {
// No need to check for concurrent modification immediately
@@ -1837,8 +1783,7 @@
}
// Check if there are more elements.
- Primitive hasMore = cps.applyBuiltin(
- BuiltinOperator.NumLt,
+ Primitive hasMore = cps.applyBuiltin(BuiltinOperator.NumLt,
[cps.getMutable(index), cps.letPrim(new GetLength(list))]);
// Return false if there are no more.
@@ -1851,9 +1796,10 @@
current.type = typeSystem.elementTypeOfIndexable(listValue.type);
cps.setMutable(current,
cps.letPrim(new GetIndex(list, cps.getMutable(index))));
- cps.setMutable(index, cps.applyBuiltin(
- BuiltinOperator.NumAdd,
- [cps.getMutable(index), cps.makeOne()]));
+ cps.setMutable(
+ index,
+ cps.applyBuiltin(BuiltinOperator.NumAdd,
+ [cps.getMutable(index), cps.makeOne()]));
cps.invokeContinuation(moveNextCont, [cps.makeTrue()]);
reanalyzeFragment(cps);
@@ -1863,7 +1809,9 @@
cps.context = moveNextCont;
cps.insertBelow(let);
let.remove();
- use..replaceUsesWith(result)..destroy();
+ use
+ ..replaceUsesWith(result)
+ ..destroy();
}
}
@@ -1927,10 +1875,8 @@
// Replace with InvokeStatic.
// The tear-off will be cleaned up by shrinking reductions.
- return new InvokeStatic(target,
- new Selector.fromElement(target),
- node.arguments.toList(),
- node.sourceInformation);
+ return new InvokeStatic(target, new Selector.fromElement(target),
+ node.arguments.toList(), node.sourceInformation);
}
if (tearOff is InvokeMethod && tearOff.selector.isGetter) {
Selector getter = tearOff.selector;
@@ -1972,12 +1918,13 @@
}
InvokeMethod invoke = new InvokeMethod(
- object,
- new Selector.call(getter.memberName, call.callStructure),
- type,
- node.arguments.toList(),
- sourceInformation: node.sourceInformation);
- node.receiverRef.changeTo(new Parameter(null)); // Remove the tear off use.
+ object,
+ new Selector.call(getter.memberName, call.callStructure),
+ type,
+ node.arguments.toList(),
+ sourceInformation: node.sourceInformation);
+ node.receiverRef
+ .changeTo(new Parameter(null)); // Remove the tear off use.
if (tearOff.hasNoRefinedUses) {
// Eliminate the getter call if it has no more uses.
@@ -2008,13 +1955,13 @@
assert(call.argumentCount == node.argumentRefs.length);
Primitive receiver = node.receiver;
- if (receiver is !CreateInstance) return null;
+ if (receiver is! CreateInstance) return null;
CreateInstance createInstance = receiver;
if (!createInstance.hasExactlyOneUse) return null;
// Inline only closures. This avoids inlining the 'call' method of a class
// that has many allocation sites.
- if (createInstance.classElement is !ClosureClassElement) return null;
+ if (createInstance.classElement is! ClosureClassElement) return null;
ClosureClassElement closureClassElement = createInstance.classElement;
Element element = closureClassElement.localLookup(Identifiers.call);
@@ -2041,8 +1988,8 @@
// inline if there are other uses of 'this' since that could be an escape or
// a recursive call.
for (Reference ref = target.receiverParameter.firstRef;
- ref != null;
- ref = ref.next) {
+ ref != null;
+ ref = ref.next) {
Node use = ref.parent;
if (use is GetField) continue;
// Closures do not currently have writable fields, but closure conversion
@@ -2052,9 +1999,8 @@
}
CpsFragment cps = new CpsFragment(node.sourceInformation);
- Primitive returnValue = cps.inlineFunction(target,
- node.receiver,
- node.arguments.toList(),
+ Primitive returnValue = cps.inlineFunction(
+ target, node.receiver, node.arguments.toList(),
hint: node.hint);
node.replaceUsesWith(returnValue);
return cps;
@@ -2084,8 +2030,7 @@
ConstructorBodyElement constructorBody = target;
target = constructorBody.constructor;
}
- node.effects =
- Effects.from(compiler.world.getSideEffectsOfElement(target));
+ node.effects = Effects.from(compiler.world.getSideEffectsOfElement(target));
TypeMask receiverType = node.receiver.type;
if (node.callingConvention == CallingConvention.Intercepted &&
typeSystem.areDisjoint(receiverType, typeSystem.interceptorType)) {
@@ -2097,8 +2042,7 @@
}
visitInvokeMethod(InvokeMethod node) {
- var specialized =
- specializeOperatorCall(node) ??
+ var specialized = specializeOperatorCall(node) ??
specializeFieldAccess(node) ??
specializeIndexableAccess(node) ??
specializeArrayAccess(node) ??
@@ -2113,8 +2057,7 @@
compiler.world.getSideEffectsOfSelector(node.selector, node.mask));
bool canBeNonThrowingCallOnNull =
- selectorsOnNull.contains(node.selector) &&
- receiverType.isNullable;
+ selectorsOnNull.contains(node.selector) && receiverType.isNullable;
if (node.callingConvention == CallingConvention.Intercepted &&
!canBeNonThrowingCallOnNull &&
@@ -2125,8 +2068,8 @@
// Replace the extra receiver argument with a dummy value if the
// target definitely does not use it.
- if (typeSystem.targetIgnoresReceiverArgument(receiverType,
- node.selector)) {
+ if (typeSystem.targetIgnoresReceiverArgument(
+ receiverType, node.selector)) {
node.makeDummyIntercepted();
}
}
@@ -2160,15 +2103,12 @@
node.replaceUsesWith(argument);
return new CpsFragment();
} else if (typeSystem.isDefinitelySelfInterceptor(value.type)) {
- TypeMask toStringReturn = typeSystem.getInvokeReturnType(
- Selectors.toString_, value.type);
+ TypeMask toStringReturn =
+ typeSystem.getInvokeReturnType(Selectors.toString_, value.type);
if (typeSystem.isDefinitelyString(toStringReturn)) {
CpsFragment cps = new CpsFragment(node.sourceInformation);
Primitive invoke = cps.invokeMethod(
- argument,
- Selectors.toString_,
- value.type,
- [],
+ argument, Selectors.toString_, value.type, [],
callingConvention: CallingConvention.DummyIntercepted);
node.replaceUsesWith(invoke);
return cps;
@@ -2177,16 +2117,15 @@
} else if (node.target == compiler.identicalFunction) {
if (node.argumentRefs.length == 2) {
return new ApplyBuiltinOperator(BuiltinOperator.Identical,
- [node.argument(0), node.argument(1)],
- node.sourceInformation);
+ [node.argument(0), node.argument(1)], node.sourceInformation);
}
}
return null;
}
visitInvokeStatic(InvokeStatic node) {
- node.effects = Effects.from(
- compiler.world.getSideEffectsOfElement(node.target));
+ node.effects =
+ Effects.from(compiler.world.getSideEffectsOfElement(node.target));
return specializeInternalMethodCall(node);
}
@@ -2199,7 +2138,6 @@
return new AbstractConstantValue.nonConstant(node.type);
}
-
/*************************** PRIMITIVES **************************/
//
// The visit method for a primitive may return one of the following:
@@ -2230,9 +2168,8 @@
AbstractConstantValue secondValue = getValue(node.argument(i++));
if (!secondValue.isConstant) continue;
- ast.DartString string =
- new ast.ConsDartString(getString(firstValue),
- getString(secondValue));
+ ast.DartString string = new ast.ConsDartString(
+ getString(firstValue), getString(secondValue));
// We found a sequence of at least two constants.
// Look for the end of the sequence.
@@ -2280,22 +2217,21 @@
// This is not safe when we might compare JS null and JS undefined.
newOperator = BuiltinOperator.StrictEq;
} else if (lattice.isDefinitelyNum(left, allowNull: true) &&
- lattice.isDefinitelyNum(right, allowNull: true)) {
+ lattice.isDefinitelyNum(right, allowNull: true)) {
// If both operands can be null, but otherwise are of the same type,
// we can use `==` for comparison.
// This is not safe e.g. for comparing strings against numbers.
newOperator = BuiltinOperator.LooseEq;
} else if (lattice.isDefinitelyString(left, allowNull: true) &&
- lattice.isDefinitelyString(right, allowNull: true)) {
+ lattice.isDefinitelyString(right, allowNull: true)) {
newOperator = BuiltinOperator.LooseEq;
} else if (lattice.isDefinitelyBool(left, allowNull: true) &&
- lattice.isDefinitelyBool(right, allowNull: true)) {
+ lattice.isDefinitelyBool(right, allowNull: true)) {
newOperator = BuiltinOperator.LooseEq;
}
if (newOperator != null) {
- return new ApplyBuiltinOperator(newOperator,
- node.arguments.toList(),
- node.sourceInformation);
+ return new ApplyBuiltinOperator(
+ newOperator, node.arguments.toList(), node.sourceInformation);
}
break;
@@ -2303,8 +2239,7 @@
case BuiltinOperator.LooseEq:
case BuiltinOperator.StrictNeq:
case BuiltinOperator.LooseNeq:
- bool negated =
- node.operator == BuiltinOperator.StrictNeq ||
+ bool negated = node.operator == BuiltinOperator.StrictNeq ||
node.operator == BuiltinOperator.LooseNeq;
for (int firstIndex in [0, 1]) {
int secondIndex = 1 - firstIndex;
@@ -2324,9 +2259,7 @@
// (x === false) ==> !x
// (x !== true) ==> !x
return new ApplyBuiltinOperator(
- BuiltinOperator.IsFalsy,
- [firstArg],
- node.sourceInformation);
+ BuiltinOperator.IsFalsy, [firstArg], node.sourceInformation);
}
}
break;
@@ -2336,8 +2269,7 @@
return null;
}
- void visitApplyBuiltinMethod(ApplyBuiltinMethod node) {
- }
+ void visitApplyBuiltinMethod(ApplyBuiltinMethod node) {}
visitTypeTest(TypeTest node) {
Primitive prim = node.value;
@@ -2359,27 +2291,21 @@
// Compile as typeof x === 'number' && Math.floor(x) === x
if (lattice.isDefinitelyNum(value, allowNull: true)) {
// If value is null or a number, we can skip the typeof test.
- return new ApplyBuiltinOperator(
- BuiltinOperator.IsFloor,
- <Primitive>[prim, prim],
- node.sourceInformation);
+ return new ApplyBuiltinOperator(BuiltinOperator.IsFloor,
+ <Primitive>[prim, prim], node.sourceInformation);
}
if (lattice.isDefinitelyNotNonIntegerDouble(value)) {
// If the value cannot be a non-integer double, but might not be a
// number at all, we can skip the Math.floor test.
return unaryBuiltinOperator(BuiltinOperator.IsNumber);
}
- return new ApplyBuiltinOperator(
- BuiltinOperator.IsInteger,
- <Primitive>[prim, prim, prim],
- node.sourceInformation);
+ return new ApplyBuiltinOperator(BuiltinOperator.IsInteger,
+ <Primitive>[prim, prim, prim], node.sourceInformation);
}
if (node.dartType == dartTypes.coreTypes.numType ||
node.dartType == dartTypes.coreTypes.doubleType) {
return new ApplyBuiltinOperator(
- BuiltinOperator.IsNumber,
- <Primitive>[prim],
- node.sourceInformation);
+ BuiltinOperator.IsNumber, <Primitive>[prim], node.sourceInformation);
}
AbstractBool isNullableSubtype =
@@ -2394,10 +2320,8 @@
// 'typeof' expressions might give the VM some more useful information.
Primitive nullConst = makeConstantPrimitive(new NullConstantValue());
new LetPrim(nullConst).insertAbove(node.parent);
- return new ApplyBuiltinOperator(
- BuiltinOperator.LooseNeq,
- <Primitive>[prim, nullConst],
- node.sourceInformation);
+ return new ApplyBuiltinOperator(BuiltinOperator.LooseNeq,
+ <Primitive>[prim, nullConst], node.sourceInformation);
}
if (dartType.element == functionCompiler.glue.jsFixedArrayClass) {
@@ -2448,9 +2372,8 @@
if (node.hasNoChecks) return;
Primitive indexPrim = node.index;
int index = lattice.intValue(getValue(indexPrim));
- int length = node.lengthRef == null
- ? null
- : lattice.intValue(getValue(node.length));
+ int length =
+ node.lengthRef == null ? null : lattice.intValue(getValue(node.length));
if (index != null && length != null && index < length) {
node.checks &= ~BoundsCheck.UPPER_BOUND;
}
@@ -2464,7 +2387,9 @@
node.checks &= ~BoundsCheck.INTEGER;
}
if (!node.lengthUsedInCheck && node.lengthRef != null) {
- node..lengthRef.unlink()..lengthRef = null;
+ node
+ ..lengthRef.unlink()
+ ..lengthRef = null;
}
if (node.checks == BoundsCheck.NONE) {
// We can't remove the bounds check node because it may still be used to
@@ -2475,7 +2400,9 @@
// restrict code motion. However, if we want to run this pass after
// [BoundsChecker] that would not be safe any more, so for now we
// keep the node for forward compatibilty.
- node..indexRef.unlink()..indexRef = null;
+ node
+ ..indexRef.unlink()
+ ..indexRef = null;
}
}
@@ -2483,7 +2410,7 @@
Primitive input = node.value;
if (!input.type.isNullable &&
(node.isNullCheck ||
- !input.type.needsNoSuchMethodHandling(node.selector, classWorld))) {
+ !input.type.needsNoSuchMethodHandling(node.selector, classWorld))) {
node.replaceUsesWith(input);
return new CpsFragment();
}
@@ -2491,8 +2418,8 @@
}
visitGetLength(GetLength node) {
- node.isFinal = typeSystem.isDefinitelyFixedLengthIndexable(
- node.object.type, allowNull: true);
+ node.isFinal = typeSystem.isDefinitelyFixedLengthIndexable(node.object.type,
+ allowNull: true);
}
visitReadTypeVariable(ReadTypeVariable node) {
@@ -2539,7 +2466,9 @@
Primitive typeInformation = node.typeInformation;
if (typeInformation is TypeExpression &&
typeInformation.arguments.every(isNullConstant)) {
- node..typeInformationRef.unlink()..typeInformationRef = null;
+ node
+ ..typeInformationRef.unlink()
+ ..typeInformationRef = null;
}
}
}
@@ -2591,9 +2520,7 @@
// Access through [getValue] and [setValue].
final Map<Variable, ConstantValue> values;
- TypePropagationVisitor(this.lattice,
- this.values,
- this.internalError);
+ TypePropagationVisitor(this.lattice, this.values, this.internalError);
void analyze(FunctionDefinition root, bool recomputeAll) {
reachableContinuations.clear();
@@ -2630,7 +2557,7 @@
visit(ref.parent);
}
} else {
- break; // Both worklists empty.
+ break; // Both worklists empty.
}
}
}
@@ -2684,9 +2611,8 @@
///
/// If [updateValue] is a constant and [canReplace] is true, the primitive
/// is also marked as safe for elimination, so it can be constant-folded.
- void setResult(UnsafePrimitive prim,
- AbstractConstantValue updateValue,
- {bool canReplace: false}) {
+ void setResult(UnsafePrimitive prim, AbstractConstantValue updateValue,
+ {bool canReplace: false}) {
// TODO(asgerf): Separate constant folding from side effect analysis.
setValue(prim, updateValue);
prim.isSafeForElimination = canReplace && updateValue.isConstant;
@@ -2697,7 +2623,9 @@
}
// -------------------------- Visitor overrides ------------------------------
- void visit(Node node) { node.accept(this); }
+ void visit(Node node) {
+ node.accept(this);
+ }
void visitFunctionDefinition(FunctionDefinition node) {
if (node.interceptorParameter != null) {
@@ -2721,7 +2649,8 @@
if (type.isEmpty) hasParameterWithoutValue = true;
}
}
- if (!hasParameterWithoutValue) { // Don't analyze unreachable code.
+ if (!hasParameterWithoutValue) {
+ // Don't analyze unreachable code.
push(node.body);
}
}
@@ -2848,7 +2777,6 @@
}
void visitApplyBuiltinOperator(ApplyBuiltinOperator node) {
-
void unaryOp(
AbstractConstantValue operation(AbstractConstantValue argument),
TypeMask defaultType) {
@@ -2857,8 +2785,8 @@
}
void binaryOp(
- AbstractConstantValue operation(AbstractConstantValue left,
- AbstractConstantValue right),
+ AbstractConstantValue operation(
+ AbstractConstantValue left, AbstractConstantValue right),
TypeMask defaultType) {
AbstractConstantValue left = getValue(node.argument(0));
AbstractConstantValue right = getValue(node.argument(1));
@@ -2866,20 +2794,20 @@
}
void binaryNumOp(
- AbstractConstantValue operation(AbstractConstantValue left,
- AbstractConstantValue right)) {
+ AbstractConstantValue operation(
+ AbstractConstantValue left, AbstractConstantValue right)) {
binaryOp(operation, typeSystem.numType);
}
void binaryUint32Op(
- AbstractConstantValue operation(AbstractConstantValue left,
- AbstractConstantValue right)) {
+ AbstractConstantValue operation(
+ AbstractConstantValue left, AbstractConstantValue right)) {
binaryOp(operation, typeSystem.uint32Type);
}
void binaryBoolOp(
- AbstractConstantValue operation(AbstractConstantValue left,
- AbstractConstantValue right)) {
+ AbstractConstantValue operation(
+ AbstractConstantValue left, AbstractConstantValue right)) {
binaryOp(operation, typeSystem.boolType);
}
@@ -2892,8 +2820,8 @@
setValue(node, lattice.nothing);
return; // And come back later
} else if (value.isConstant &&
- value.constant.isString &&
- stringValue != null) {
+ value.constant.isString &&
+ stringValue != null) {
StringConstantValue constant = value.constant;
stringValue =
new ast.ConsDartString(stringValue, constant.primitiveValue);
@@ -2918,8 +2846,7 @@
case BuiltinOperator.StrictNeq:
case BuiltinOperator.LooseEq:
case BuiltinOperator.LooseNeq:
- bool negated =
- node.operator == BuiltinOperator.StrictNeq ||
+ bool negated = node.operator == BuiltinOperator.StrictNeq ||
node.operator == BuiltinOperator.LooseNeq;
AbstractConstantValue left = getValue(node.argument(0));
AbstractConstantValue right = getValue(node.argument(1));
@@ -2928,8 +2855,8 @@
return;
}
if (left.isConstant && right.isConstant) {
- ConstantValue equal = lattice.constantSystem.identity.fold(
- left.constant, right.constant);
+ ConstantValue equal = lattice.constantSystem.identity
+ .fold(left.constant, right.constant);
if (equal != null && equal.isBool) {
ConstantValue result =
new BoolConstantValue(equal.isTrue == !negated);
@@ -3038,8 +2965,8 @@
void visitApplyBuiltinMethod(ApplyBuiltinMethod node) {
AbstractConstantValue receiver = getValue(node.receiver);
if (node.method == BuiltinMethod.Pop) {
- setValue(node, nonConstant(
- typeSystem.elementTypeOfIndexable(receiver.type)));
+ setValue(
+ node, nonConstant(typeSystem.elementTypeOfIndexable(receiver.type)));
} else {
setValue(node, nonConstant());
}
@@ -3063,14 +2990,11 @@
}
}
- void visitThrow(Throw node) {
- }
+ void visitThrow(Throw node) {}
- void visitRethrow(Rethrow node) {
- }
+ void visitRethrow(Rethrow node) {}
- void visitUnreachable(Unreachable node) {
- }
+ void visitUnreachable(Unreachable node) {}
void visitBranch(Branch node) {
AbstractConstantValue conditionCell = getValue(node.condition);
@@ -3108,7 +3032,7 @@
void handleTypeTest(
Primitive node, AbstractConstantValue input, types.DartType dartType) {
TypeMask boolType = typeSystem.boolType;
- switch(lattice.isSubtypeOf(input, dartType, allowNull: false)) {
+ switch (lattice.isSubtypeOf(input, dartType, allowNull: false)) {
case AbstractBool.Nothing:
break; // And come back later.
@@ -3144,8 +3068,7 @@
case AbstractBool.Maybe:
// Narrow type of output to those that survive the cast.
TypeMask type = input.type.intersection(
- typeSystem.subtypesOf(node.dartType).nullable(),
- classWorld);
+ typeSystem.subtypesOf(node.dartType).nullable(), classWorld);
setValue(node, nonConstant(type));
break;
}
@@ -3177,11 +3100,9 @@
setValue(node, getValue(node.variable));
}
- void visitMutableVariable(MutableVariable node) {
- }
+ void visitMutableVariable(MutableVariable node) {}
- void visitParameter(Parameter node) {
- }
+ void visitParameter(Parameter node) {}
void visitContinuation(Continuation node) {
node.parameters.forEach(visit);
@@ -3277,7 +3198,8 @@
void visitForeignCode(ForeignCode node) {
bool firstArgumentIsNullable = false;
if (node.argumentRefs.length > 0) {
- AbstractConstantValue first = getValue(node.argumentRefs.first.definition);
+ AbstractConstantValue first =
+ getValue(node.argumentRefs.first.definition);
if (first.isNothing) {
setValue(node, nothing);
return;
@@ -3287,9 +3209,9 @@
setValue(node, nonConstant(node.storedType));
node.isSafeForElimination =
!node.nativeBehavior.sideEffects.hasSideEffects() &&
- (!node.nativeBehavior.throwBehavior.canThrow ||
- (!firstArgumentIsNullable &&
- node.nativeBehavior.throwBehavior.isOnlyNullNSMGuard));
+ (!node.nativeBehavior.throwBehavior.canThrow ||
+ (!firstArgumentIsNullable &&
+ node.nativeBehavior.throwBehavior.isOnlyNullNSMGuard));
}
@override
@@ -3313,7 +3235,8 @@
setValue(node, nothing);
} else {
node.objectIsNotNull = object.isDefinitelyNotNull;
- setValue(node, nonConstant(typeSystem.elementTypeOfIndexable(object.type)));
+ setValue(
+ node, nonConstant(typeSystem.elementTypeOfIndexable(object.type)));
}
}
@@ -3332,9 +3255,10 @@
@override
void visitRefinement(Refinement node) {
- setValue(node, lattice.intersectWithType(
- getValue(node.value.definition),
- node.refineType));
+ setValue(
+ node,
+ lattice.intersectWithType(
+ getValue(node.value.definition), node.refineType));
}
@override
@@ -3369,7 +3293,7 @@
/// and the type of the constant is in the [type] field.
/// NONCONST: not a constant, but [type] may hold some information.
class AbstractConstantValue {
- static const int NOTHING = 0;
+ static const int NOTHING = 0;
static const int CONSTANT = 1;
static const int NONCONST = 2;
@@ -3399,7 +3323,7 @@
}
}
- bool get isNothing => (kind == NOTHING);
+ bool get isNothing => (kind == NOTHING);
bool get isConstant => (kind == CONSTANT);
bool get isNonConst => (kind == NONCONST);
bool get isNullConstant => kind == CONSTANT && constant.isNull;
@@ -3411,6 +3335,7 @@
PrimitiveConstantValue value = constant;
return value.primitiveValue <= 0;
}
+
bool get isNegativeConstant {
if (kind != CONSTANT || !constant.isNum) return false;
PrimitiveConstantValue value = constant;
@@ -3427,16 +3352,20 @@
bool operator ==(AbstractConstantValue that) {
return that.kind == this.kind &&
- that.constant == this.constant &&
- that.type == this.type;
+ that.constant == this.constant &&
+ that.type == this.type;
}
String toString() {
switch (kind) {
- case NOTHING: return "Nothing";
- case CONSTANT: return "Constant: ${constant.unparse()}: $type";
- case NONCONST: return "Non-constant: $type";
- default: assert(false);
+ case NOTHING:
+ return "Nothing";
+ case CONSTANT:
+ return "Constant: ${constant.unparse()}: $type";
+ case NONCONST:
+ return "Non-constant: $type";
+ default:
+ assert(false);
}
return null;
}
diff --git a/pkg/compiler/lib/src/cps_ir/update_refinements.dart b/pkg/compiler/lib/src/cps_ir/update_refinements.dart
index 313f2cb..09f5d7a 100644
--- a/pkg/compiler/lib/src/cps_ir/update_refinements.dart
+++ b/pkg/compiler/lib/src/cps_ir/update_refinements.dart
@@ -44,7 +44,9 @@
node.type = typeSystem.receiverTypeFor(node.selector, value.type);
} else {
// Check is no longer needed.
- node..replaceUsesWith(value)..destroy();
+ node
+ ..replaceUsesWith(value)
+ ..destroy();
LetPrim letPrim = node.parent;
letPrim.remove();
return;
@@ -62,8 +64,8 @@
visitRefinement(Refinement node) {
if (refine(node.value)) {
// Update the type if the input has changed.
- node.type = typeSystem.intersection(node.value.definition.type,
- node.refineType);
+ node.type =
+ typeSystem.intersection(node.value.definition.type, node.refineType);
}
Primitive value = node.effectiveDefinition;
Primitive old = refinementFor[value];
@@ -75,8 +77,7 @@
visitBoundsCheck(BoundsCheck node) {
super.visitBoundsCheck(node);
- if (node.hasIntegerCheck &&
- typeSystem.isDefinitelyInt(node.index.type)) {
+ if (node.hasIntegerCheck && typeSystem.isDefinitelyInt(node.index.type)) {
node.checks &= ~BoundsCheck.INTEGER;
}
}
diff --git a/pkg/compiler/lib/src/cps_ir/use_field_initializers.dart b/pkg/compiler/lib/src/cps_ir/use_field_initializers.dart
index e923a22..1b218af 100644
--- a/pkg/compiler/lib/src/cps_ir/use_field_initializers.dart
+++ b/pkg/compiler/lib/src/cps_ir/use_field_initializers.dart
@@ -74,21 +74,27 @@
void visitContinuation(Continuation node) {
endBasicBlock();
}
+
void visitLetHandler(LetHandler node) {
endBasicBlock();
}
+
void visitInvokeContinuation(InvokeContinuation node) {
endBasicBlock();
}
+
void visitBranch(Branch node) {
endBasicBlock();
}
+
void visitRethrow(Rethrow node) {
endBasicBlock();
}
+
void visitThrow(Throw node) {
endBasicBlock();
}
+
void visitUnreachable(Unreachable node) {
endBasicBlock();
}
@@ -109,7 +115,9 @@
void sinkLetConts() {
if (letContSinkTarget != null) {
for (LetCont letCont in letConts.reversed) {
- letCont..remove()..insertBelow(letContSinkTarget);
+ letCont
+ ..remove()
+ ..insertBelow(letContSinkTarget);
}
letContSinkTarget = null;
}
diff --git a/pkg/compiler/lib/src/dart2js.dart b/pkg/compiler/lib/src/dart2js.dart
index f46ad8d..f2ee6b2 100644
--- a/pkg/compiler/lib/src/dart2js.dart
+++ b/pkg/compiler/lib/src/dart2js.dart
@@ -4,12 +4,18 @@
library dart2js.cmdline;
-import 'dart:async'
- show Future, EventSink;
+import 'dart:async' show Future, EventSink;
import 'dart:convert' show UTF8, LineSplitter;
import 'dart:io'
- show exit, File, FileMode, Platform, RandomAccessFile, FileSystemException,
- stdin, stderr;
+ show
+ exit,
+ File,
+ FileMode,
+ Platform,
+ RandomAccessFile,
+ FileSystemException,
+ stdin,
+ stderr;
import '../compiler.dart' as api;
import 'commandline_options.dart';
@@ -173,7 +179,10 @@
out = currentDirectory.resolve('out.dart');
sourceMapOut = currentDirectory.resolve('out.dart.map');
}
- diagnosticHandler(null, null, null,
+ diagnosticHandler(
+ null,
+ null,
+ null,
"--output-type=dart is deprecated. It will remain available "
"in Dart 1.11, but will be removed in Dart 1.12.",
api.Diagnostic.WARNING);
@@ -257,7 +266,7 @@
for (String category in categories) {
if (!["Client", "Server"].contains(category)) {
fail('Unsupported library category "$category", '
- 'supported categories are: Client, Server, all');
+ 'supported categories are: Client, Server, all');
}
}
}
@@ -304,8 +313,8 @@
passThrough(Flags.suppressWarnings);
}),
new OptionHandler(Flags.fatalWarnings, passThrough),
- new OptionHandler(Flags.suppressHints,
- (_) => diagnosticHandler.showHints = false),
+ new OptionHandler(
+ Flags.suppressHints, (_) => diagnosticHandler.showHints = false),
new OptionHandler(
'--output-type=dart|--output-type=dart-multi|--output-type=js',
setOutputType),
@@ -318,24 +327,24 @@
new OptionHandler(Flags.allowMockCompilation, passThrough),
new OptionHandler(Flags.fastStartup, passThrough),
new OptionHandler(Flags.conditionalDirectives, passThrough),
+ new OptionHandler(Flags.genericMethodSyntax, passThrough),
new OptionHandler('${Flags.minify}|-m', implyCompilation),
new OptionHandler(Flags.preserveUris, passThrough),
new OptionHandler('--force-strip=.*', setStrip),
new OptionHandler(Flags.disableDiagnosticColors,
- (_) => diagnosticHandler.enableColors = false),
+ (_) => diagnosticHandler.enableColors = false),
new OptionHandler(Flags.enableDiagnosticColors,
- (_) => diagnosticHandler.enableColors = true),
+ (_) => diagnosticHandler.enableColors = true),
new OptionHandler('--enable[_-]checked[_-]mode|--checked',
- (_) => setCheckedMode(Flags.enableCheckedMode)),
+ (_) => setCheckedMode(Flags.enableCheckedMode)),
new OptionHandler(Flags.trustTypeAnnotations,
- (_) => setTrustTypeAnnotations(
- Flags.trustTypeAnnotations)),
+ (_) => setTrustTypeAnnotations(Flags.trustTypeAnnotations)),
new OptionHandler(Flags.trustPrimitives,
- (_) => setTrustPrimitives(
- Flags.trustPrimitives)),
- new OptionHandler(Flags.trustJSInteropTypeAnnotations,
- (_) => setTrustJSInteropTypeAnnotations(
- Flags.trustJSInteropTypeAnnotations)),
+ (_) => setTrustPrimitives(Flags.trustPrimitives)),
+ new OptionHandler(
+ Flags.trustJSInteropTypeAnnotations,
+ (_) => setTrustJSInteropTypeAnnotations(
+ Flags.trustJSInteropTypeAnnotations)),
new OptionHandler(r'--help|/\?|/h', (_) => wantHelp = true),
new OptionHandler('--packages=.+', setPackageConfig),
new OptionHandler('--package-root=.+|-p.+', setPackageRoot),
@@ -349,8 +358,8 @@
new OptionHandler(Flags.terse, passThrough),
new OptionHandler('--deferred-map=.+', implyCompilation),
new OptionHandler(Flags.dumpInfo, setDumpInfo),
- new OptionHandler('--disallow-unsafe-eval',
- (_) => hasDisallowUnsafeEval = true),
+ new OptionHandler(
+ '--disallow-unsafe-eval', (_) => hasDisallowUnsafeEval = true),
new OptionHandler(Option.showPackageWarnings, passThrough),
new OptionHandler(Flags.useContentSecurityPolicy, passThrough),
new OptionHandler(Flags.enableExperimentalMirrors, passThrough),
@@ -361,7 +370,7 @@
"Async-await is supported by default.",
api.Diagnostic.HINT);
}),
- new OptionHandler('--enable-null-aware-operators', (_) {
+ new OptionHandler('--enable-null-aware-operators', (_) {
diagnosticHandler.info(
"Option '--enable-null-aware-operators' is no longer needed. "
"Null aware operators are supported by default.",
@@ -393,18 +402,18 @@
}
if (hasDisallowUnsafeEval) {
- String precompiledName =
- relativize(currentDirectory,
- RandomAccessFileOutputProvider.computePrecompiledUri(out),
- Platform.isWindows);
+ String precompiledName = relativize(
+ currentDirectory,
+ RandomAccessFileOutputProvider.computePrecompiledUri(out),
+ Platform.isWindows);
helpAndFail("Option '--disallow-unsafe-eval' has been removed."
- " Instead, the compiler generates a file named"
- " '$precompiledName'.");
+ " Instead, the compiler generates a file named"
+ " '$precompiledName'.");
}
if (outputLanguage != OUTPUT_LANGUAGE_DART && stripArgumentSet) {
helpAndFail("Option '--force-strip' may only be used with "
- "'--output-type=dart'.");
+ "'--output-type=dart'.");
}
if (arguments.isEmpty) {
helpAndFail('No Dart file specified.');
@@ -416,7 +425,7 @@
if (checkedMode && trustTypeAnnotations) {
helpAndFail("Option '${Flags.trustTypeAnnotations}' may not be used in "
- "checked mode.");
+ "checked mode.");
}
if (packageRoot != null && packageConfig != null) {
@@ -438,33 +447,33 @@
if (!analyzeOnly) {
if (allowNativeExtensions) {
helpAndFail("Option '${Flags.allowNativeExtensions}' is only supported "
- "in combination with the '${Flags.analyzeOnly}' option.");
+ "in combination with the '${Flags.analyzeOnly}' option.");
}
}
if (dumpInfo && outputLanguage == OUTPUT_LANGUAGE_DART) {
helpAndFail("Option '${Flags.dumpInfo}' is not supported in "
- "combination with the '--output-type=dart' option.");
+ "combination with the '--output-type=dart' option.");
}
options.add('--out=$out');
options.add('--source-map=$sourceMapOut');
RandomAccessFileOutputProvider outputProvider =
- new RandomAccessFileOutputProvider(
- out, sourceMapOut, onInfo: diagnosticHandler.info, onFailure: fail);
+ new RandomAccessFileOutputProvider(out, sourceMapOut,
+ onInfo: diagnosticHandler.info, onFailure: fail);
api.CompilationResult compilationDone(api.CompilationResult result) {
if (analyzeOnly) return result;
if (!result.isSuccess) {
fail('Compilation failed.');
}
- writeString(Uri.parse('$out.deps'),
- getDepsOutput(inputProvider.sourceFiles));
- diagnosticHandler.info(
- 'Compiled ${inputProvider.dartCharactersRead} characters Dart '
- '-> ${outputProvider.totalCharactersWritten} characters '
- '$outputLanguage in '
- '${relativize(currentDirectory, out, Platform.isWindows)}');
+ writeString(
+ Uri.parse('$out.deps'), getDepsOutput(inputProvider.sourceFiles));
+ diagnosticHandler
+ .info('Compiled ${inputProvider.dartCharactersRead} characters Dart '
+ '-> ${outputProvider.totalCharactersWritten} characters '
+ '$outputLanguage in '
+ '${relativize(currentDirectory, out, Platform.isWindows)}');
if (diagnosticHandler.verbose) {
String input = uriPathToNative(arguments[0]);
print('Dart file ($input) compiled to $outputLanguage.');
@@ -481,10 +490,18 @@
}
Uri uri = currentDirectory.resolve(arguments[0]);
- return compileFunc(uri, libraryRoot, packageRoot, inputProvider,
- diagnosticHandler, options, outputProvider, environment,
- packageConfig, findPackages)
- .then(compilationDone);
+ return compileFunc(
+ uri,
+ libraryRoot,
+ packageRoot,
+ inputProvider,
+ diagnosticHandler,
+ options,
+ outputProvider,
+ environment,
+ packageConfig,
+ findPackages)
+ .then(compilationDone);
}
class AbortLeg {
@@ -504,8 +521,7 @@
void fail(String message) {
if (diagnosticHandler != null) {
- diagnosticHandler.report(
- null, null, -1, -1, message, api.Diagnostic.ERROR);
+ diagnosticHandler.report(null, null, -1, -1, message, api.Diagnostic.ERROR);
} else {
print('Error: $message');
}
@@ -515,7 +531,7 @@
Future<api.CompilationResult> compilerMain(List<String> arguments) {
var root = uriPathToNative("/$LIBRARY_ROOT");
arguments = <String>['--library-root=${Platform.script.toFilePath()}$root']
- ..addAll(arguments);
+ ..addAll(arguments);
return compile(arguments);
}
@@ -660,14 +676,13 @@
--no-frequency-based-minification
Experimental. Disabled the new frequency based minifying namer and use the
old namer instead.
-'''.trim());
+'''
+ .trim());
}
void helpAndExit(bool wantHelp, bool wantVersion, bool verbose) {
if (wantVersion) {
- var version = (BUILD_ID == null)
- ? '<non-SDK build>'
- : BUILD_ID;
+ var version = (BUILD_ID == null) ? '<non-SDK build>' : BUILD_ID;
print('Dart-to-JavaScript compiler (dart2js) version: $version');
}
if (wantHelp) {
@@ -762,7 +777,7 @@
}).whenComplete(() {
// The testing framework waits for a status line on stdout and
// stderr before moving to the next test.
- if (exitCode == 0){
+ if (exitCode == 0) {
print(">>> TEST OK");
} else if (exitCode == 253) {
print(">>> TEST CRASH");
diff --git a/pkg/compiler/lib/src/dart2js_profile_many.dart b/pkg/compiler/lib/src/dart2js_profile_many.dart
index e7ad871..e29ec46 100644
--- a/pkg/compiler/lib/src/dart2js_profile_many.dart
+++ b/pkg/compiler/lib/src/dart2js_profile_many.dart
@@ -7,8 +7,7 @@
import 'dart2js.dart' as cmdline;
import 'dart:async';
-const String USAGE =
-"""
+const String USAGE = """
Usage: dart2js_profile_many.dart [OPTIONS] [FILES]
Invokes dart2js separately for each file using the given options.
@@ -20,7 +19,6 @@
}
void main(List<String> args) {
-
List options = [];
List files = [];
@@ -45,10 +43,8 @@
List subargs = [];
subargs.addAll(options);
subargs.add(file);
- return cmdline.compilerMain(subargs).catchError((e) { });
+ return cmdline.compilerMain(subargs).catchError((e) {});
}).then((_) {
print("Done");
});
-
-
}
diff --git a/pkg/compiler/lib/src/dart2js_stress.dart b/pkg/compiler/lib/src/dart2js_stress.dart
index 7daedea..453d95c 100644
--- a/pkg/compiler/lib/src/dart2js_stress.dart
+++ b/pkg/compiler/lib/src/dart2js_stress.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
library dart2js.stress;
+
import "dart2js.dart" as dart2js;
const ITERATIONS_FLAG_PREFIX = "--iterations=";
@@ -16,23 +17,21 @@
}
if (maxCount == null) {
print("Running indefinitely.\n"
- "Use '$ITERATIONS_FLAG_PREFIX<count>' to set a repetition count"
- " (as first flag).");
+ "Use '$ITERATIONS_FLAG_PREFIX<count>' to set a repetition count"
+ " (as first flag).");
}
args = ["--suppress-warnings", "--suppress-hints"]..addAll(args);
void iterate() {
count++;
sw.reset();
sw.start();
- dart2js.internalMain(args)
- .then((_) {
- print("$count: ${sw.elapsedMilliseconds}ms");
- })
- .then((_) {
- if (maxCount == null || count < maxCount) {
- iterate();
- }
- });
+ dart2js.internalMain(args).then((_) {
+ print("$count: ${sw.elapsedMilliseconds}ms");
+ }).then((_) {
+ if (maxCount == null || count < maxCount) {
+ iterate();
+ }
+ });
}
iterate();
}
diff --git a/pkg/compiler/lib/src/dart_backend/backend.dart b/pkg/compiler/lib/src/dart_backend/backend.dart
index bb925f9..8d9d0cc 100644
--- a/pkg/compiler/lib/src/dart_backend/backend.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend.dart
@@ -52,11 +52,10 @@
new Set<ClassElement>();
bool enableCodegenWithErrorsIfSupported(Spannable node) {
- reporter.reportHintMessage(
- node,
- MessageKind.GENERIC,
- {'text': "Generation of code with compile time errors is not "
- "supported for dart2dart."});
+ reporter.reportHintMessage(node, MessageKind.GENERIC, {
+ 'text': "Generation of code with compile time errors is not "
+ "supported for dart2dart."
+ });
return false;
}
@@ -73,14 +72,14 @@
Map<ClassElement, Iterable<Element>> classMembers) {
ClassElement typeErrorElement = compiler.coreLibrary.find('TypeError');
if (classMembers.containsKey(typeErrorElement) ||
- compiler.resolverWorld.isChecks.any(
- (DartType type) => type.element == typeErrorElement)) {
+ compiler.resolverWorld.isChecks
+ .any((DartType type) => type.element == typeErrorElement)) {
return false;
}
Set<DartType> processedTypes = new Set<DartType>();
List<DartType> workQueue = new List<DartType>();
- workQueue.addAll(
- classMembers.keys.map((classElement) => classElement.thisType));
+ workQueue
+ .addAll(classMembers.keys.map((classElement) => classElement.thisType));
workQueue.addAll(compiler.resolverWorld.isChecks);
while (!workQueue.isEmpty) {
@@ -116,7 +115,6 @@
impactTransformer = new DartImpactTransformer(this);
}
-
DiagnosticReporter get reporter => compiler.reporter;
Resolution get resolution => compiler.resolution;
@@ -128,7 +126,12 @@
// Right now resolver doesn't always resolve interfaces needed
// for literals, so force them. TODO(antonm): fix in the resolver.
final LITERAL_TYPE_NAMES = const [
- 'Map', 'List', 'num', 'int', 'double', 'bool'
+ 'Map',
+ 'List',
+ 'num',
+ 'int',
+ 'double',
+ 'bool'
];
final coreLibrary = compiler.coreLibrary;
for (final name in LITERAL_TYPE_NAMES) {
@@ -138,12 +141,10 @@
// Enqueue the methods that the VM might invoke on user objects because
// we don't trust the resolution to always get these included.
world.registerDynamicUse(new DynamicUse(Selectors.toString_, null));
- world.registerDynamicUse(
- new DynamicUse(Selectors.hashCode_, null));
+ world.registerDynamicUse(new DynamicUse(Selectors.hashCode_, null));
world.registerDynamicUse(
new DynamicUse(new Selector.binaryOperator('=='), null));
- world.registerDynamicUse(
- new DynamicUse(Selectors.compareTo, null));
+ world.registerDynamicUse(new DynamicUse(Selectors.compareTo, null));
}
WorldImpact codegen(CodegenWorkItem work) {
@@ -158,27 +159,25 @@
bool shouldOutput(Element element) {
return (!element.library.isPlatformLibrary &&
!element.isSynthesized &&
- element is! AbstractFieldElement)
- || mirrorRenamer.isMirrorHelperLibrary(element.library);
+ element is! AbstractFieldElement) ||
+ mirrorRenamer.isMirrorHelperLibrary(element.library);
}
int assembleProgram() {
ElementAst computeElementAst(AstElement element) {
- return new ElementAst(element.resolvedAst.node,
- element.resolvedAst.elements);
+ return new ElementAst(
+ element.resolvedAst.node, element.resolvedAst.elements);
}
// TODO(johnniwinther): Remove the need for this method.
- void postProcessElementAst(
- AstElement element, ElementAst elementAst,
- newTypedefElementCallback,
- newClassElementCallback) {
- ReferencedElementCollector collector =
- new ReferencedElementCollector(reporter,
- element,
- elementAst,
- newTypedefElementCallback,
- newClassElementCallback);
+ void postProcessElementAst(AstElement element, ElementAst elementAst,
+ newTypedefElementCallback, newClassElementCallback) {
+ ReferencedElementCollector collector = new ReferencedElementCollector(
+ reporter,
+ element,
+ elementAst,
+ newTypedefElementCallback,
+ newClassElementCallback);
collector.collect();
}
@@ -198,17 +197,14 @@
// Output verbose info about size ratio of resulting bundle to all
// referenced non-platform sources.
- logResultBundleSizeInfo(
- outputter.libraryInfo.userLibraries,
- outputter.elementInfo.topLevelElements,
- totalSize);
+ logResultBundleSizeInfo(outputter.libraryInfo.userLibraries,
+ outputter.elementInfo.topLevelElements, totalSize);
return totalSize;
}
void logResultBundleSizeInfo(Iterable<LibraryElement> userLibraries,
- Iterable<Element> topLevelElements,
- int totalOutputSize) {
+ Iterable<Element> topLevelElements, int totalOutputSize) {
// Sum total size of scripts in each referenced library.
int nonPlatformSize = 0;
for (LibraryElement lib in userLibraries) {
@@ -239,11 +235,12 @@
});
if (useMirrorHelperLibrary &&
loadedLibraries.containsLibrary(Uris.dart_mirrors)) {
- return compiler.libraryLoader.loadLibrary(
- compiler.translateResolvedUri(
+ return compiler.libraryLoader
+ .loadLibrary(compiler.translateResolvedUri(
loadedLibraries.getLibrary(Uris.dart_mirrors),
- MirrorRenamerImpl.DART_MIRROR_HELPER, null)).
- then((LibraryElement library) {
+ MirrorRenamerImpl.DART_MIRROR_HELPER,
+ null))
+ .then((LibraryElement library) {
mirrorRenamer = new MirrorRenamerImpl(compiler, this, library);
});
}
@@ -261,21 +258,18 @@
}
@override
- void registerInstantiatedType(InterfaceType type,
- Enqueuer enqueuer,
- Registry registry,
- {bool mirrorUsage: false}) {
+ void registerInstantiatedType(
+ InterfaceType type, Enqueuer enqueuer, Registry registry,
+ {bool mirrorUsage: false}) {
registerPlatformMembers(type, registerUse: registry.registerDynamicUse);
- super.registerInstantiatedType(
- type, enqueuer, registry, mirrorUsage: mirrorUsage);
+ super.registerInstantiatedType(type, enqueuer, registry,
+ mirrorUsage: mirrorUsage);
}
/// Register dynamic access of members of [type] that implement members
/// of types defined in the platform libraries.
- void registerPlatformMembers(
- InterfaceType type,
+ void registerPlatformMembers(InterfaceType type,
{void registerUse(DynamicUse dynamicUse)}) {
-
// Without patching, dart2dart has no way of performing sound tree-shaking
// in face external functions. Therefore we employ another scheme:
//
@@ -310,8 +304,8 @@
ClassElement cls = type.element;
if (!cls.library.isPlatformLibrary) {
for (Link<DartType> link = cls.allSupertypes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
InterfaceType supertype = link.head;
ClassElement superclass = supertype.element;
LibraryElement library = superclass.library;
@@ -326,8 +320,7 @@
FunctionElement function = element.asFunctionElement();
element.computeType(resolution);
Selector selector = new Selector.fromElement(element);
- registerUse(
- new DynamicUse(selector, null));
+ registerUse(new DynamicUse(selector, null));
});
}
}
@@ -402,7 +395,6 @@
}
}
-
/**
* Some elements are not recorded by resolver now,
* for example, typedefs or classes which are only
@@ -416,11 +408,8 @@
final newTypedefElementCallback;
final newClassElementCallback;
- ReferencedElementCollector(this.reporter,
- this.element,
- this.elementAst,
- this.newTypedefElementCallback,
- this.newClassElementCallback);
+ ReferencedElementCollector(this.reporter, this.element, this.elementAst,
+ this.newTypedefElementCallback, this.newClassElementCallback);
visitNode(Node node) {
node.visitChildren(this);
@@ -466,8 +455,8 @@
final DartConstantCompiler constantCompiler;
DartConstantTask(Compiler compiler)
- : this.constantCompiler = new DartConstantCompiler(compiler),
- super(compiler);
+ : this.constantCompiler = new DartConstantCompiler(compiler),
+ super(compiler);
String get name => 'ConstantHandler';
@@ -526,9 +515,7 @@
}
@override
- ConstantExpression compileNode(
- Node node,
- TreeElements elements,
+ ConstantExpression compileNode(Node node, TreeElements elements,
{bool enforceConst: true}) {
return measure(() {
return constantCompiler.compileNodeWithDefinitions(node, elements,
@@ -538,9 +525,7 @@
@override
ConstantExpression compileMetadata(
- MetadataAnnotation metadata,
- Node node,
- TreeElements elements) {
+ MetadataAnnotation metadata, Node node, TreeElements elements) {
return measure(() {
return constantCompiler.compileMetadata(metadata, node, elements);
});
@@ -550,7 +535,7 @@
// expressions.
@override
void copyConstantValues(DartConstantTask task) {
- constantCompiler.constantValueMap.addAll(
- task.constantCompiler.constantValueMap);
+ constantCompiler.constantValueMap
+ .addAll(task.constantCompiler.constantValueMap);
}
}
diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
index 10b056d..fd7a45f 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_emitter.dart
@@ -9,13 +9,11 @@
import '../elements/elements.dart';
class TypeGenerator {
-
/// TODO(johnniwinther): Remove this when issue 21283 has been resolved.
static int pseudoNameCounter = 0;
static Parameter emitParameter(DartType type,
- {String name,
- Element element}) {
+ {String name, Element element}) {
if (name == null && element != null) {
name = element.name;
}
@@ -26,8 +24,7 @@
if (type.isFunctionType) {
FunctionType functionType = type;
TypeAnnotation returnType = createOptionalType(functionType.returnType);
- Parameters innerParameters =
- createParametersFromType(functionType);
+ Parameters innerParameters = createParametersFromType(functionType);
parameter = new Parameter.function(name, returnType, innerParameters);
} else {
TypeAnnotation typeAnnotation = createOptionalType(type);
@@ -40,31 +37,26 @@
static Parameters createParametersFromType(FunctionType functionType) {
pseudoNameCounter = 0;
if (functionType.namedParameters.isEmpty) {
- return new Parameters(
- createParameters(functionType.parameterTypes),
- createParameters(functionType.optionalParameterTypes),
- false);
+ return new Parameters(createParameters(functionType.parameterTypes),
+ createParameters(functionType.optionalParameterTypes), false);
} else {
return new Parameters(
createParameters(functionType.parameterTypes),
createParameters(functionType.namedParameterTypes,
- names: functionType.namedParameters),
+ names: functionType.namedParameters),
true);
}
}
- static List<Parameter> createParameters(
- Iterable<DartType> parameterTypes,
+ static List<Parameter> createParameters(Iterable<DartType> parameterTypes,
{Iterable<String> names: const <String>[],
- Iterable<Element> elements: const <Element>[]}) {
+ Iterable<Element> elements: const <Element>[]}) {
Iterator<String> name = names.iterator;
Iterator<Element> element = elements.iterator;
return parameterTypes.map((DartType type) {
name.moveNext();
element.moveNext();
- return emitParameter(type,
- name: name.current,
- element: element.current);
+ return emitParameter(type, name: name.current, element: element.current);
}).toList();
}
@@ -83,22 +75,17 @@
if (type.treatAsRaw) {
return new TypeAnnotation(type.element.name)..dartType = type;
}
- return new TypeAnnotation(
- type.element.name,
- type.typeArguments.map(createType).toList(growable:false))
- ..dartType = type;
+ return new TypeAnnotation(type.element.name,
+ type.typeArguments.map(createType).toList(growable: false))
+ ..dartType = type;
} else if (type is VoidType) {
- return new TypeAnnotation('void')
- ..dartType = type;
+ return new TypeAnnotation('void')..dartType = type;
} else if (type is TypeVariableType) {
- return new TypeAnnotation(type.name)
- ..dartType = type;
+ return new TypeAnnotation(type.name)..dartType = type;
} else if (type is DynamicType) {
- return new TypeAnnotation("dynamic")
- ..dartType = type;
+ return new TypeAnnotation("dynamic")..dartType = type;
} else if (type is MalformedType) {
- return new TypeAnnotation(type.name)
- ..dartType = type;
+ return new TypeAnnotation(type.name)..dartType = type;
} else {
throw "Unsupported type annotation: $type";
}
diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_nodes.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_nodes.dart
index d4e86e6..81c17c3 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_nodes.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_nodes.dart
@@ -68,7 +68,6 @@
// STATEMENTS
-
class Block extends Statement {
final List<Statement> statements;
@@ -108,9 +107,9 @@
/// Initializer must be [VariableDeclarations] or [Expression] or null.
For(this.initializer, this.condition, this.updates, this.body) {
- assert(initializer == null
- || initializer is VariableDeclarations
- || initializer is Expression);
+ assert(initializer == null ||
+ initializer is VariableDeclarations ||
+ initializer is Expression);
}
}
@@ -124,10 +123,10 @@
/// initializer.
ForIn(Node leftHandValue, this.expression, this.body)
: this.leftHandValue = leftHandValue {
- assert(leftHandValue is Identifier
- || (leftHandValue is VariableDeclarations
- && leftHandValue.declarations.length == 1
- && leftHandValue.declarations[0].initializer == null));
+ assert(leftHandValue is Identifier ||
+ (leftHandValue is VariableDeclarations &&
+ leftHandValue.declarations.length == 1 &&
+ leftHandValue.declarations[0].initializer == null));
}
}
@@ -160,8 +159,7 @@
LabeledStatement(this.label, this.statement);
}
-class Rethrow extends Statement {
-}
+class Rethrow extends Statement {}
class Return extends Statement {
final Expression expression;
@@ -229,9 +227,7 @@
final List<VariableDeclaration> declarations;
VariableDeclarations(this.declarations,
- { this.type,
- this.isFinal: false,
- this.isConst: false }) {
+ {this.type, this.isFinal: false, this.isConst: false}) {
// Cannot be both final and const.
assert(!isFinal || !isConst);
}
@@ -246,7 +242,6 @@
VariableDeclaration(this.name, [this.initializer]);
}
-
class FunctionDeclaration extends Statement {
final FunctionExpression function;
@@ -264,14 +259,13 @@
final bool hasNamedParameters;
Parameters(this.requiredParameters,
- [ this.optionalParameters,
- this.hasNamedParameters = false ]);
+ [this.optionalParameters, this.hasNamedParameters = false]);
Parameters.named(this.requiredParameters, this.optionalParameters)
: hasNamedParameters = true;
Parameters.positional(this.requiredParameters, this.optionalParameters)
- : hasNamedParameters = false;
+ : hasNamedParameters = false;
bool get hasOptionalParameters =>
optionalParameters != null && optionalParameters.length > 0;
@@ -290,13 +284,11 @@
elements.FormalElement element;
- Parameter(this.name, {this.type, this.defaultValue})
- : parameters = null;
+ Parameter(this.name, {this.type, this.defaultValue}) : parameters = null;
- Parameter.function(this.name,
- TypeAnnotation returnType,
- this.parameters,
- [ this.defaultValue ]) : type = returnType {
+ Parameter.function(this.name, TypeAnnotation returnType, this.parameters,
+ [this.defaultValue])
+ : type = returnType {
assert(parameters != null);
}
@@ -332,12 +324,11 @@
elements.FunctionElement element;
- FunctionExpression(this.parameters,
- this.body,
- { this.name,
- this.returnType,
- this.isGetter: false,
- this.isSetter: false }) {
+ FunctionExpression(this.parameters, this.body,
+ {this.name,
+ this.returnType,
+ this.isGetter: false,
+ this.isSetter: false}) {
// Function must have a name if it has a return type
assert(returnType == null || name != null);
}
@@ -348,7 +339,7 @@
final bool isConst;
ConstructorDefinition(Parameters parameters, Statement body,
- this.initializers, String name, this.isConst)
+ this.initializers, String name, this.isConst)
: super(parameters, body, name: name);
}
@@ -389,7 +380,7 @@
final TypeAnnotation typeArgument;
final List<Expression> values;
- LiteralList(this.values, { this.typeArgument, this.isConst: false });
+ LiteralList(this.values, {this.typeArgument, this.isConst: false});
}
class LiteralMap extends Expression {
@@ -397,10 +388,10 @@
final List<TypeAnnotation> typeArguments;
final List<LiteralMapEntry> entries;
- LiteralMap(this.entries, { this.typeArguments, this.isConst: false }) {
- assert(this.typeArguments == null
- || this.typeArguments.length == 0
- || this.typeArguments.length == 2);
+ LiteralMap(this.entries, {this.typeArguments, this.isConst: false}) {
+ assert(this.typeArguments == null ||
+ this.typeArguments.length == 0 ||
+ this.typeArguments.length == 2);
}
}
@@ -504,10 +495,8 @@
elements.FunctionElement constructor;
types.DartType dartType;
- CallNew(this.type,
- this.arguments,
- { this.constructorName,
- this.isConst: false });
+ CallNew(this.type, this.arguments,
+ {this.constructorName, this.isConst: false});
}
/// Expression of form `T.f(..)`.
@@ -550,9 +539,7 @@
final TypeAnnotation type;
TypeOperator(this.expression, this.operator, this.type) {
- assert(operator == 'is'
- || operator == 'as'
- || operator == 'is!');
+ assert(operator == 'is' || operator == 'as' || operator == 'is!');
}
}
@@ -574,9 +561,20 @@
}
class Assignment extends Expression {
- static final _operators =
- new Set.from(['=', '|=', '^=', '&=', '<<=', '>>=',
- '+=', '-=', '*=', '/=', '%=', '~/=']);
+ static final _operators = new Set.from([
+ '=',
+ '|=',
+ '^=',
+ '&=',
+ '<<=',
+ '>>=',
+ '+=',
+ '-=',
+ '*=',
+ '/=',
+ '%=',
+ '~/='
+ ]);
final Expression left;
final String operator;
@@ -606,9 +604,11 @@
bool isUnaryOperator(String op) {
return op == '!' || op == '-' || op == '~';
}
+
bool isBinaryOperator(String op) {
return BINARY_PRECEDENCE.containsKey(op);
}
+
/// True if the given operator can be converted to a compound assignment.
bool isCompoundableOperator(String op) {
switch (BINARY_PRECEDENCE[op]) {
@@ -624,7 +624,6 @@
}
}
-
// Precedence levels
const int EXPRESSION = 1;
const int CONDITIONAL = 2;
@@ -646,28 +645,22 @@
/// Precedence level required for the callee in a [FunctionCall].
const int CALLEE = 21;
-const Map<String,int> BINARY_PRECEDENCE = const {
+const Map<String, int> BINARY_PRECEDENCE = const {
'&&': LOGICAL_AND,
'||': LOGICAL_OR,
-
'==': EQUALITY,
'!=': EQUALITY,
-
'>': RELATIONAL,
'>=': RELATIONAL,
'<': RELATIONAL,
'<=': RELATIONAL,
-
'|': BITWISE_OR,
'^': BITWISE_XOR,
'&': BITWISE_AND,
-
'>>': SHIFT,
'<<': SHIFT,
-
'+': ADDITIVE,
'-': ADDITIVE,
-
'*': MULTIPLICATIVE,
'%': MULTIPLICATIVE,
'/': MULTIPLICATIVE,
@@ -687,9 +680,9 @@
return false;
}
return (characters.$0 <= x && x <= characters.$9) ||
- (characters.$A <= x && x <= characters.$Z) ||
- (characters.$a <= x && x <= characters.$z) ||
- (x == characters.$_);
+ (characters.$A <= x && x <= characters.$Z) ||
+ (characters.$a <= x && x <= characters.$z) ||
+ (x == characters.$_);
}
/// The unparser will apply the following syntactic rewritings:
@@ -727,7 +720,6 @@
Unparser(this.output);
-
void write(String s) {
output.write(s);
}
@@ -786,7 +778,7 @@
/// using parentheses if necessary to raise the precedence level.
/// Abusing terminology slightly, the function accepts a [Receiver] which
/// may also be the [SuperReceiver] object.
- void writeExp(Receiver e, int minPrecedence, {beginStmt:false}) {
+ void writeExp(Receiver e, int minPrecedence, {beginStmt: false}) {
void withPrecedence(int actual, void action()) {
if (actual < minPrecedence) {
write("(");
@@ -842,8 +834,7 @@
} else if (e is Literal) {
if (e.value.isString) {
writeStringLiteral(e);
- }
- else if (e.value.isDouble) {
+ } else if (e.value.isDouble) {
double v = e.value.primitiveValue;
if (v == double.INFINITY) {
withPrecedence(MULTIPLICATIVE, () {
@@ -875,8 +866,7 @@
write('[');
writeEach(',', e.values, writeExpression);
write(']');
- }
- else if (e is LiteralMap) {
+ } else if (e is LiteralMap) {
// The curly brace can be mistaken for a block statement if we
// are at the beginning of a statement.
bool needParen = beginStmt;
@@ -920,7 +910,8 @@
Receiver operand = e.operand;
// !(x == y) ==> x != y.
if (e.operatorName == '!' &&
- operand is BinaryOperator && operand.operator == '==') {
+ operand is BinaryOperator &&
+ operand.operator == '==') {
withPrecedence(EQUALITY, () {
writeExp(operand.left, RELATIONAL);
writeOperator('!=');
@@ -929,14 +920,14 @@
}
// !(x is T) ==> x is!T
else if (e.operatorName == '!' &&
- operand is TypeOperator && operand.operator == 'is') {
+ operand is TypeOperator &&
+ operand.operator == 'is') {
withPrecedence(RELATIONAL, () {
writeExp(operand.expression, BITWISE_OR, beginStmt: beginStmt);
write(' is!');
writeType(operand.type);
});
- }
- else {
+ } else {
withPrecedence(UNARY, () {
writeOperator(e.operatorName);
writeExp(e.operand, UNARY);
@@ -1100,7 +1091,7 @@
} else if (stmt is EmptyStatement) {
write(';');
} else if (stmt is ExpressionStatement) {
- writeExp(stmt.expression, EXPRESSION, beginStmt:true);
+ writeExp(stmt.expression, EXPRESSION, beginStmt: true);
write(';');
} else if (stmt is For) {
write('for(');
@@ -1246,8 +1237,7 @@
void writeVariableDefinitions(VariableDeclarations vds) {
if (vds.isConst)
write('const ');
- else if (vds.isFinal)
- write('final ');
+ else if (vds.isFinal) write('final ');
if (vds.type != null) {
writeType(vds.type);
write(' ');
@@ -1307,10 +1297,10 @@
// Ignore multiline quotings for now. Would need to make sure that no
// newline (potentially prefixed by whitespace) follows the quoting.
static const _QUOTINGS = const <tree.StringQuoting>[
- const tree.StringQuoting(characters.$DQ, raw: false, leftQuoteLength: 1),
- const tree.StringQuoting(characters.$DQ, raw: true, leftQuoteLength: 1),
- const tree.StringQuoting(characters.$SQ, raw: false, leftQuoteLength: 1),
- const tree.StringQuoting(characters.$SQ, raw: true, leftQuoteLength: 1),
+ const tree.StringQuoting(characters.$DQ, raw: false, leftQuoteLength: 1),
+ const tree.StringQuoting(characters.$DQ, raw: true, leftQuoteLength: 1),
+ const tree.StringQuoting(characters.$SQ, raw: false, leftQuoteLength: 1),
+ const tree.StringQuoting(characters.$SQ, raw: true, leftQuoteLength: 1),
];
static StringLiteralOutput analyzeStringLiteral(Expression node) {
@@ -1371,24 +1361,20 @@
}
}
-
/// Applies additional cost to each track in [penalized], and considers
/// switching from each [penalized] to a [nonPenalized] track.
- void penalize(List<int> penalized,
- List<int> nonPenalized,
- int endIndex,
- num cost(tree.StringQuoting q)) {
+ void penalize(List<int> penalized, List<int> nonPenalized, int endIndex,
+ num cost(tree.StringQuoting q)) {
for (int j in penalized) {
// Check if another track can benefit from switching from this track.
for (int k in nonPenalized) {
- num newCost = best[j].cost
- + 1 // Whitespace in string juxtaposition
- + getQuoteCost(best[k].quoting);
+ num newCost = best[j].cost +
+ 1 // Whitespace in string juxtaposition
+ +
+ getQuoteCost(best[k].quoting);
if (newCost < best[k].cost) {
best[k] = new OpenStringChunk(
- best[j].end(endIndex),
- best[k].quoting,
- newCost);
+ best[j].end(endIndex), best[k].quoting, newCost);
}
}
best[j].cost += cost(best[j].quoting);
@@ -1433,18 +1419,18 @@
if (part is Identifier &&
!part.name.contains(r'$') &&
i + 1 < parts.length &&
- isIdentifierPartNoDollar(parts[i+1])) {
+ isIdentifierPartNoDollar(parts[i + 1])) {
for (int j in nonRaws) {
for (int k = 0; k < best.length; k++) {
- num newCost = best[j].cost
- + 1 // Whitespace in string juxtaposition
- - 2 // Save two curly braces
- + getQuoteCost(best[k].quoting);
+ num newCost = best[j].cost +
+ 1 // Whitespace in string juxtaposition
+ -
+ 2 // Save two curly braces
+ +
+ getQuoteCost(best[k].quoting);
if (newCost < best[k].cost) {
best[k] = new OpenStringChunk(
- best[j].end(i+1),
- best[k].quoting,
- newCost);
+ best[j].end(i + 1), best[k].quoting, newCost);
}
}
}
@@ -1481,15 +1467,15 @@
write(chunk.quoting.quoteChar);
bool raw = chunk.quoting.raw;
int quoteCode = chunk.quoting.quote;
- for (int i=startIndex; i<chunk.endIndex; i++) {
+ for (int i = startIndex; i < chunk.endIndex; i++) {
var part = parts[i];
if (part is int) {
int char = part;
write(getEscapedCharacter(char, quoteCode, raw));
} else if (part is Identifier &&
- !part.name.contains(r'$') &&
- (i == chunk.endIndex - 1 ||
- !isIdentifierPartNoDollar(parts[i+1]))) {
+ !part.name.contains(r'$') &&
+ (i == chunk.endIndex - 1 ||
+ !isIdentifierPartNoDollar(parts[i + 1]))) {
write(r'$');
write(part.name);
} else {
@@ -1531,7 +1517,6 @@
return new String.fromCharCode(char);
}
}
-
}
/// The contents of a string literal together with a strategy for printing it.
@@ -1544,7 +1529,6 @@
StringLiteralOutput(this.parts, this.chunk);
}
-
/// Strategy for printing a prefix of a string literal.
/// A chunk represents the substring going from [:previous.endIndex:] to
/// [endIndex] (or from 0 to [endIndex] if [previous] is null).
diff --git a/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart b/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart
index 2500c44..1ab7882 100644
--- a/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart
+++ b/pkg/compiler/lib/src/dart_backend/backend_ast_to_frontend_ast.dart
@@ -8,8 +8,7 @@
import '../constants/values.dart' as values;
import '../dart_types.dart' as types;
import '../elements/elements.dart' as elements;
-import '../resolution/tree_elements.dart' show
- TreeElementMapping;
+import '../resolution/tree_elements.dart' show TreeElementMapping;
import '../tokens/token.dart';
import '../tokens/token_constants.dart';
import '../tokens/precedence.dart';
@@ -20,8 +19,7 @@
import 'backend_ast_emitter.dart' show TypeGenerator;
/// Translates the backend AST to Dart frontend AST.
-tree.Node emit(TreeElementMapping treeElements,
- RootNode root) {
+tree.Node emit(TreeElementMapping treeElements, RootNode root) {
return new TreePrinter(treeElements).makeDefinition(root);
}
@@ -52,10 +50,11 @@
setElement(definition, node.element, node);
return new tree.VariableDefinitions(
null, // TODO(sigurdm): Type
- makeVarModifiers(useVar: true,
- isFinal: node.element.isFinal,
- isStatic: node.element.isStatic,
- isConst: node.element.isConst),
+ makeVarModifiers(
+ useVar: true,
+ isFinal: node.element.isFinal,
+ isStatic: node.element.isStatic,
+ isConst: node.element.isConst),
makeList(null, [definition], close: semicolon));
} else if (node is FunctionExpression) {
return makeExpression(node);
@@ -90,12 +89,12 @@
return openTok;
}
- final BeginGroupToken openParen = makeGroup(OPEN_PAREN_INFO,
- CLOSE_PAREN_INFO);
- final BeginGroupToken openBrace = makeGroup(OPEN_CURLY_BRACKET_INFO,
- CLOSE_CURLY_BRACKET_INFO);
- final BeginGroupToken openBracket = makeGroup(OPEN_SQUARE_BRACKET_INFO,
- CLOSE_SQUARE_BRACKET_INFO);
+ final BeginGroupToken openParen =
+ makeGroup(OPEN_PAREN_INFO, CLOSE_PAREN_INFO);
+ final BeginGroupToken openBrace =
+ makeGroup(OPEN_CURLY_BRACKET_INFO, CLOSE_CURLY_BRACKET_INFO);
+ final BeginGroupToken openBracket =
+ makeGroup(OPEN_SQUARE_BRACKET_INFO, CLOSE_SQUARE_BRACKET_INFO);
final BeginGroupToken lt = makeGroup(LT_INFO, GT_INFO);
Token get closeParen => openParen.endGroup;
@@ -116,6 +115,7 @@
static Token makeIdToken(String text) {
return new StringToken.fromString(IDENTIFIER_INFO, text, -1);
}
+
final Token newToken = makeIdToken('new');
final Token constToken = makeIdToken('const');
final Token throwToken = makeIdToken('throw');
@@ -168,27 +168,32 @@
tree.NodeList blankList() {
return new tree.NodeList(null, makeLink([]), null, '');
}
+
tree.NodeList singleton(tree.Node node) {
return new tree.NodeList(null, makeLink([node]), null, '');
}
- tree.NodeList makeList(String delimiter,
- Iterable<tree.Node> nodes,
- { Token open,
- Token close }) {
+
+ tree.NodeList makeList(String delimiter, Iterable<tree.Node> nodes,
+ {Token open, Token close}) {
return new tree.NodeList(open, makeLink(nodes), close, delimiter);
}
+
tree.NodeList parenList(String delimiter, Iterable<tree.Node> nodes) {
return makeList(delimiter, nodes, open: openParen, close: closeParen);
}
+
tree.NodeList bracketList(String delimiter, Iterable<tree.Node> nodes) {
return makeList(delimiter, nodes, open: openBracket, close: closeBracket);
}
+
tree.NodeList braceList(String delimiter, Iterable<tree.Node> nodes) {
return makeList(delimiter, nodes, open: openBrace, close: closeBrace);
}
+
tree.NodeList argList(Iterable<tree.Node> nodes) {
return parenList(',', nodes);
}
+
tree.NodeList typeArgList(Iterable<tree.Node> nodes) {
return makeList(',', nodes, open: lt, close: gt);
}
@@ -198,7 +203,7 @@
if (name == null) {
return null;
}
- List<String> names = name.split('.').toList(growable:false);
+ List<String> names = name.split('.').toList(growable: false);
tree.Node node = makeIdentifier(names[0]);
for (int i = 1; i < names.length; i++) {
node = new tree.Send(node, makeIdentifier(names[i]));
@@ -208,18 +213,30 @@
static Token assignmentToken(String operatorName) {
switch (operatorName) {
- case '=': return new SymbolToken(EQ_INFO, -1);
- case '+=': return new SymbolToken(PLUS_EQ_INFO, -1);
- case '-=': return new SymbolToken(MINUS_EQ_INFO, -1);
- case '*=': return new SymbolToken(STAR_EQ_INFO, -1);
- case '/=': return new SymbolToken(SLASH_EQ_INFO, -1);
- case '~/=': return new SymbolToken(TILDE_SLASH_EQ_INFO, -1);
- case '%=': return new SymbolToken(PERCENT_EQ_INFO, -1);
- case '&=': return new SymbolToken(AMPERSAND_EQ_INFO, -1);
- case '^=': return new SymbolToken(CARET_EQ_INFO, -1);
- case '|=': return new SymbolToken(BAR_EQ_INFO, -1);
- case '>>=': return new SymbolToken(GT_GT_EQ_INFO, -1);
- case '<<=': return new SymbolToken(LT_LT_EQ_INFO, -1);
+ case '=':
+ return new SymbolToken(EQ_INFO, -1);
+ case '+=':
+ return new SymbolToken(PLUS_EQ_INFO, -1);
+ case '-=':
+ return new SymbolToken(MINUS_EQ_INFO, -1);
+ case '*=':
+ return new SymbolToken(STAR_EQ_INFO, -1);
+ case '/=':
+ return new SymbolToken(SLASH_EQ_INFO, -1);
+ case '~/=':
+ return new SymbolToken(TILDE_SLASH_EQ_INFO, -1);
+ case '%=':
+ return new SymbolToken(PERCENT_EQ_INFO, -1);
+ case '&=':
+ return new SymbolToken(AMPERSAND_EQ_INFO, -1);
+ case '^=':
+ return new SymbolToken(CARET_EQ_INFO, -1);
+ case '|=':
+ return new SymbolToken(BAR_EQ_INFO, -1);
+ case '>>=':
+ return new SymbolToken(GT_GT_EQ_INFO, -1);
+ case '<<=':
+ return new SymbolToken(LT_LT_EQ_INFO, -1);
default:
throw "Unrecognized assignment operator: $operatorName";
}
@@ -227,25 +244,44 @@
static Token binopToken(String operatorName) {
switch (operatorName) {
- case '+': return new SymbolToken(PLUS_INFO, -1);
- case '-': return new SymbolToken(MINUS_INFO, -1);
- case '*': return new SymbolToken(STAR_INFO, -1);
- case '/': return new SymbolToken(SLASH_INFO, -1);
- case '~/': return new SymbolToken(TILDE_SLASH_INFO, -1);
- case '%': return new SymbolToken(PERCENT_INFO, -1);
- case '&': return new SymbolToken(AMPERSAND_INFO, -1);
- case '^': return new SymbolToken(CARET_INFO, -1);
- case '|': return new SymbolToken(BAR_INFO, -1);
- case '>>': return new SymbolToken(GT_GT_INFO, -1);
- case '<<': return new SymbolToken(LT_LT_INFO, -1);
- case '==': return new SymbolToken(EQ_EQ_INFO, -1);
- case '!=': return new SymbolToken(BANG_EQ_INFO, -1);
- case '>': return new SymbolToken(GT_INFO, -1);
- case '>=': return new SymbolToken(GT_EQ_INFO, -1);
- case '<': return new SymbolToken(LT_INFO, -1);
- case '<=': return new SymbolToken(LT_EQ_INFO, -1);
- case '&&': return new SymbolToken(AMPERSAND_AMPERSAND_INFO, -1);
- case '||': return new SymbolToken(BAR_BAR_INFO, -1);
+ case '+':
+ return new SymbolToken(PLUS_INFO, -1);
+ case '-':
+ return new SymbolToken(MINUS_INFO, -1);
+ case '*':
+ return new SymbolToken(STAR_INFO, -1);
+ case '/':
+ return new SymbolToken(SLASH_INFO, -1);
+ case '~/':
+ return new SymbolToken(TILDE_SLASH_INFO, -1);
+ case '%':
+ return new SymbolToken(PERCENT_INFO, -1);
+ case '&':
+ return new SymbolToken(AMPERSAND_INFO, -1);
+ case '^':
+ return new SymbolToken(CARET_INFO, -1);
+ case '|':
+ return new SymbolToken(BAR_INFO, -1);
+ case '>>':
+ return new SymbolToken(GT_GT_INFO, -1);
+ case '<<':
+ return new SymbolToken(LT_LT_INFO, -1);
+ case '==':
+ return new SymbolToken(EQ_EQ_INFO, -1);
+ case '!=':
+ return new SymbolToken(BANG_EQ_INFO, -1);
+ case '>':
+ return new SymbolToken(GT_INFO, -1);
+ case '>=':
+ return new SymbolToken(GT_EQ_INFO, -1);
+ case '<':
+ return new SymbolToken(LT_INFO, -1);
+ case '<=':
+ return new SymbolToken(LT_EQ_INFO, -1);
+ case '&&':
+ return new SymbolToken(AMPERSAND_AMPERSAND_INFO, -1);
+ case '||':
+ return new SymbolToken(BAR_BAR_INFO, -1);
default:
throw "Unrecognized binary operator: $operatorName";
}
@@ -253,17 +289,22 @@
static Token incrementToken(String operatorName) {
switch (operatorName) {
- case '++': return new SymbolToken(PLUS_PLUS_INFO, -1);
- case '--': return new SymbolToken(MINUS_MINUS_INFO, -1);
+ case '++':
+ return new SymbolToken(PLUS_PLUS_INFO, -1);
+ case '--':
+ return new SymbolToken(MINUS_MINUS_INFO, -1);
default:
throw "Unrecognized increment operator: $operatorName";
}
}
static Token typeOpToken(String operatorName) {
- switch (operatorName) { // "is!" is not an operator in the frontend AST.
- case 'is': return new SymbolToken(IS_INFO, -1);
- case 'as': return new SymbolToken(AS_INFO, -1);
+ switch (operatorName) {
+ // "is!" is not an operator in the frontend AST.
+ case 'is':
+ return new SymbolToken(IS_INFO, -1);
+ case 'as':
+ return new SymbolToken(AS_INFO, -1);
default:
throw 'Unrecognized type operator: $operatorName';
}
@@ -271,9 +312,12 @@
Token unopToken(String operatorName) {
switch (operatorName) {
- case '-': return new SymbolToken(MINUS_INFO, -1);
- case '~': return new SymbolToken(TILDE_INFO, -1);
- case '!': return bang;
+ case '-':
+ return new SymbolToken(MINUS_INFO, -1);
+ case '~':
+ return new SymbolToken(TILDE_INFO, -1);
+ case '!':
+ return bang;
default:
throw "Unrecognized unary operator: $operatorName";
}
@@ -283,9 +327,7 @@
if (treeElements == null) return null;
if (element.isStatic) {
elements.ClassElement enclosingClass = element.enclosingClass;
- tree.Send send = new tree.Send(
- null,
- makeIdentifier(enclosingClass.name));
+ tree.Send send = new tree.Send(null, makeIdentifier(enclosingClass.name));
treeElements[send] = enclosingClass;
return send;
} else {
@@ -298,9 +340,7 @@
return makeExpression(arg);
} else if (arg is NamedArgument) {
return new tree.NamedArgument(
- makeIdentifier(arg.name),
- colon,
- makeExpression(arg.expression));
+ makeIdentifier(arg.name), colon, makeExpression(arg.expression));
} else {
throw "Unrecognized argument type: ${arg}";
}
@@ -338,8 +378,8 @@
} else if (left is IndexExpression) {
receiver = makeExp(left.object, PRIMARY, beginStmt: beginStmt);
selector = new tree.Operator(indexToken);
- arguments = bracketList(',',
- [makeExpression(left.index), makeExpression(exp.right)]);
+ arguments = bracketList(
+ ',', [makeExpression(left.index), makeExpression(exp.right)]);
} else {
throw "Unexpected left-hand side of assignment: ${left}";
}
@@ -358,8 +398,8 @@
// class B { var x; B() : x = (() {return a;}) {}}
// Not the invalid:
// class B { var x; B() : x = () {return a;} {}}
- result = new tree.SendSet(receiver, selector, op,
- singleton(makeExp(exp.body, CALLEE)));
+ result = new tree.SendSet(
+ receiver, selector, op, singleton(makeExp(exp.body, CALLEE)));
setElement(result, exp.element, exp);
} else if (exp is SuperInitializer) {
precedence = EXPRESSION;
@@ -369,9 +409,8 @@
if (exp.target.name == "") {
result = new tree.Send(null, receiver, arguments);
} else {
- result = new tree.Send(receiver,
- makeIdentifier(exp.target.name),
- arguments);
+ result =
+ new tree.Send(receiver, makeIdentifier(exp.target.name), arguments);
}
setElement(result, exp.target, exp);
} else if (exp is BinaryOperator) {
@@ -395,9 +434,7 @@
selector = makeExp(callee, CALLEE, beginStmt: beginStmt);
}
result = new tree.Send(
- receiver,
- selector,
- argList(exp.arguments.map(makeArgument)));
+ receiver, selector, argList(exp.arguments.map(makeArgument)));
if (callee is Identifier) {
setElement(result, element, exp);
}
@@ -406,31 +443,23 @@
// TODO(sra): Elide receiver when This, but only if not in a scope that
// shadows the method (e.g. constructor body).
tree.Node receiver = makeExp(exp.object, PRIMARY, beginStmt: beginStmt);
- result = new tree.Send(
- receiver,
- makeIdentifier(exp.methodName),
+ result = new tree.Send(receiver, makeIdentifier(exp.methodName),
argList(exp.arguments.map(makeArgument)));
} else if (exp is CallNew) {
precedence = CALLEE;
tree.Node selector = makeName(exp.type.name);
if (exp.type.typeArguments.length > 0) {
selector = new tree.TypeAnnotation(
- selector,
- typeArgList(exp.type.typeArguments.map(makeType)));
+ selector, typeArgList(exp.type.typeArguments.map(makeType)));
setType(selector, exp.dartType, exp);
}
if (exp.constructorName != null) {
- selector = new tree.Send(
- selector,
- makeIdentifier(exp.constructorName));
+ selector = new tree.Send(selector, makeIdentifier(exp.constructorName));
}
tree.Send send = new tree.Send(
- null,
- selector,
- argList(exp.arguments.map(makeArgument)));
- result = new tree.NewExpression(
- exp.isConst ? constToken : newToken,
- send);
+ null, selector, argList(exp.arguments.map(makeArgument)));
+ result =
+ new tree.NewExpression(exp.isConst ? constToken : newToken, send);
setType(result, exp.dartType, exp);
setElement(send, exp.constructor, exp);
} else if (exp is CallStatic) {
@@ -459,18 +488,19 @@
tree.NodeList parameters = makeParameters(exp.parameters);
tree.NodeList initializers =
exp.initializers == null || exp.initializers.isEmpty
- ? null
- : makeList(",", exp.initializers.map(makeExpression).toList());
+ ? null
+ : makeList(",", exp.initializers.map(makeExpression).toList());
tree.Node body = exp.isConst || exp.body == null
? new tree.EmptyStatement(semicolon)
: makeFunctionBody(exp.body);
- result = new tree.FunctionExpression(constructorName(exp),
+ result = new tree.FunctionExpression(
+ constructorName(exp),
parameters,
body,
- null, // return type
+ null, // return type
makeFunctionModifiers(exp),
initializers,
- null, // get/set
+ null, // get/set
null); // async modifier
setElement(result, exp.element, exp);
} else if (exp is FunctionExpression) {
@@ -478,33 +508,27 @@
if (beginStmt && exp.name != null) {
needParen = true; // Do not mistake for function declaration.
}
- Token getOrSet = exp.isGetter
- ? getToken
- : exp.isSetter
- ? setToken
- : null;
- tree.NodeList parameters = exp.isGetter
- ? makeList("", [])
- : makeParameters(exp.parameters);
+ Token getOrSet = exp.isGetter ? getToken : exp.isSetter ? setToken : null;
+ tree.NodeList parameters =
+ exp.isGetter ? makeList("", []) : makeParameters(exp.parameters);
tree.Node body = makeFunctionBody(exp.body);
result = new tree.FunctionExpression(
functionName(exp),
parameters,
body,
exp.returnType == null || exp.element.isConstructor
- ? null
- : makeType(exp.returnType),
+ ? null
+ : makeType(exp.returnType),
makeFunctionModifiers(exp),
- null, // initializers
- getOrSet, // get/set
- null); // async modifier
+ null, // initializers
+ getOrSet, // get/set
+ null); // async modifier
elements.Element element = exp.element;
if (element != null) setElement(result, element, exp);
} else if (exp is Identifier) {
precedence = CALLEE;
result = new tree.Send(
- makeStaticReceiver(exp.element),
- makeIdentifier(exp.name));
+ makeStaticReceiver(exp.element), makeIdentifier(exp.name));
setElement(result, exp.element, exp);
} else if (exp is Increment) {
Expression lvalue = exp.expression;
@@ -597,8 +621,7 @@
} else if (exp is LiteralSymbol) {
precedence = PRIMARY;
result = new tree.LiteralSymbol(
- hash,
- makeList('.', exp.id.split('.').map(makeIdentifier)));
+ hash, makeList('.', exp.id.split('.').map(makeIdentifier)));
} else if (exp is LiteralType) {
precedence = TYPE_LITERAL;
elements.Element optionalElement = exp.type.element;
@@ -606,14 +629,13 @@
optionalElement == null ? null : makeStaticReceiver(optionalElement),
makeIdentifier(exp.name));
treeElements.setType(result, exp.type);
- if (optionalElement != null) { // dynamic does not have an element
+ if (optionalElement != null) {
+ // dynamic does not have an element
setElement(result, optionalElement, exp);
}
} else if (exp is ReifyTypeVar) {
precedence = PRIMARY;
- result = new tree.Send(
- null,
- makeIdentifier(exp.name));
+ result = new tree.Send(null, makeIdentifier(exp.name));
setElement(result, exp.element, exp);
setType(result, exp.element.type, exp);
} else if (exp is StringConcat) {
@@ -624,9 +646,7 @@
result = makeIdentifier('this');
} else if (exp is Throw) {
precedence = EXPRESSION; // ???
- result = new tree.Throw(
- makeExpression(exp.expression),
- throwToken,
+ result = new tree.Throw(makeExpression(exp.expression), throwToken,
throwToken); // endToken not used by unparser
} else if (exp is TypeOperator) {
precedence = RELATIONAL;
@@ -634,10 +654,8 @@
tree.Node rightOperand = makeType(exp.type);
if (exp.operator == 'is!') {
operator = new tree.Operator(typeOpToken('is'));
- rightOperand = new tree.Send(
- rightOperand,
- new tree.Operator(bang),
- blankList());
+ rightOperand =
+ new tree.Send(rightOperand, new tree.Operator(bang), blankList());
} else {
operator = new tree.Operator(typeOpToken(exp.operator));
}
@@ -647,8 +665,7 @@
singleton(rightOperand));
} else if (exp is UnaryOperator) {
precedence = UNARY;
- result = new tree.Send.prefix(
- makeExp(exp.operand, UNARY),
+ result = new tree.Send.prefix(makeExp(exp.operand, UNARY),
new tree.Operator(unopToken(exp.operatorName)));
} else {
throw "Unknown expression type: ${exp}";
@@ -672,9 +689,7 @@
tree.LiteralMapEntry makeLiteralMapEntry(LiteralMapEntry en) {
return new tree.LiteralMapEntry(
- makeExpression(en.key),
- colon,
- makeExpression(en.value));
+ makeExpression(en.key), colon, makeExpression(en.value));
}
/// A comment token to be inserted when [INSERT_NEW_BACKEND_COMMENT] is true.
@@ -684,8 +699,8 @@
tree.Node makeFunctionBody(Statement stmt) {
if (INSERT_NEW_BACKEND_COMMENT) {
- return new tree.Block(makeList('', [makeBlock(stmt)],
- open: newBackendComment));
+ return new tree.Block(
+ makeList('', [makeBlock(stmt)], open: newBackendComment));
} else {
return makeBlock(stmt);
}
@@ -717,7 +732,7 @@
/// True if [stmt] is equivalent to an empty statement.
bool isEmptyStatement(Statement stmt) {
return stmt is EmptyStatement ||
- (stmt is Block && stmt.statements.every(isEmptyStatement));
+ (stmt is Block && stmt.statements.every(isEmptyStatement));
}
tree.Node makeStatement(Statement stmt, {bool shortIf: true}) {
@@ -748,8 +763,7 @@
return new tree.EmptyStatement(semicolon);
} else if (stmt is ExpressionStatement) {
return new tree.ExpressionStatement(
- makeExp(stmt.expression, EXPRESSION, beginStmt: true),
- semicolon);
+ makeExp(stmt.expression, EXPRESSION, beginStmt: true), semicolon);
} else if (stmt is For) {
tree.Node initializer;
if (stmt.initializer is VariableDeclarations) {
@@ -762,8 +776,7 @@
tree.Node condition;
if (stmt.condition != null) {
condition = new tree.ExpressionStatement(
- makeExpression(stmt.condition),
- semicolon);
+ makeExpression(stmt.condition), semicolon);
} else {
condition = new tree.EmptyStatement(semicolon);
}
@@ -780,12 +793,8 @@
} else {
left = makeVariableDeclarations(stmt.leftHandValue);
}
- return new tree.SyncForIn(
- left,
- makeExpression(stmt.expression),
- makeStatement(stmt.body, shortIf: shortIf),
- forToken,
- inToken);
+ return new tree.SyncForIn(left, makeExpression(stmt.expression),
+ makeStatement(stmt.body, shortIf: shortIf), forToken, inToken);
} else if (stmt is FunctionDeclaration) {
tree.FunctionExpression function = new tree.FunctionExpression(
stmt.name != null ? makeIdentifier(stmt.name) : null,
@@ -793,8 +802,8 @@
makeFunctionBody(stmt.body),
stmt.returnType != null ? makeType(stmt.returnType) : null,
makeEmptyModifiers(),
- null, // initializers
- null, // get/set
+ null, // initializers
+ null, // get/set
null); // async modifier
setElement(function, stmt.function.element, stmt);
return new tree.FunctionDeclaration(function);
@@ -827,14 +836,11 @@
inner = lbl.statement;
}
return new tree.LabeledStatement(
- makeList('', labels),
- makeStatement(inner, shortIf: shortIf));
+ makeList('', labels), makeStatement(inner, shortIf: shortIf));
} else if (stmt is Rethrow) {
return new tree.Rethrow(rethrowToken, semicolon);
} else if (stmt is Return) {
- return new tree.Return(
- returnToken,
- semicolon,
+ return new tree.Return(returnToken, semicolon,
stmt.expression == null ? null : makeExpression(stmt.expression));
} else if (stmt is Switch) {
return new tree.SwitchStatement(
@@ -851,10 +857,8 @@
} else if (stmt is VariableDeclarations) {
return makeVariableDeclarations(stmt, useVar: true, endToken: semicolon);
} else if (stmt is While) {
- return new tree.While(
- parenthesize(makeExpression(stmt.condition)),
- makeStatement(stmt.body, shortIf: shortIf),
- whileToken);
+ return new tree.While(parenthesize(makeExpression(stmt.condition)),
+ makeStatement(stmt.body, shortIf: shortIf), whileToken);
} else {
throw "Unrecognized statement: ${stmt}";
}
@@ -866,11 +870,8 @@
if (vd.initializer == null) {
return id;
}
- tree.Node send = new tree.SendSet(
- null,
- id,
- new tree.Operator(eq),
- singleton(makeExpression(vd.initializer)));
+ tree.Node send = new tree.SendSet(null, id, new tree.Operator(eq),
+ singleton(makeExpression(vd.initializer)));
setElement(send, vd.element, vd);
return send;
}
@@ -879,15 +880,14 @@
/// if no other modifiers are present.
/// [endToken] will be used to terminate the declaration list.
tree.Node makeVariableDeclarations(VariableDeclarations decl,
- { bool useVar: false,
- Token endToken: null }) {
+ {bool useVar: false, Token endToken: null}) {
return new tree.VariableDefinitions(
decl.type == null ? null : makeType(decl.type),
- makeVarModifiers(isConst: decl.isConst,
- isFinal: decl.isFinal,
- useVar: useVar && decl.type == null),
- makeList(',',
- decl.declarations.map(makeVariableDeclaration),
+ makeVarModifiers(
+ isConst: decl.isConst,
+ isFinal: decl.isFinal,
+ useVar: useVar && decl.type == null),
+ makeList(',', decl.declarations.map(makeVariableDeclaration),
close: endToken));
}
@@ -897,17 +897,13 @@
tree.Node exceptionName = makeIdentifier(block.exceptionVar.name);
setElement(exceptionName, block.exceptionVar.element, block.exceptionVar);
formals.add(new tree.VariableDefinitions(
- null,
- makeEmptyModifiers(),
- singleton(exceptionName)));
+ null, makeEmptyModifiers(), singleton(exceptionName)));
}
if (block.stackVar != null) {
tree.Node stackTraceName = makeIdentifier(block.stackVar.name);
setElement(stackTraceName, block.stackVar.element, block.stackVar);
formals.add(new tree.VariableDefinitions(
- null,
- makeEmptyModifiers(),
- singleton(stackTraceName)));
+ null, makeEmptyModifiers(), singleton(stackTraceName)));
}
return new tree.CatchBlock(
block.onType == null ? null : makeType(block.onType),
@@ -958,7 +954,7 @@
Token open = params.hasNamedParameters ? openBrace : openBracket;
Token close = params.hasNamedParameters ? closeBrace : closeBracket;
Iterable<tree.Node> opt =
- params.optionalParameters.map((p) => makeParameter(p,assign));
+ params.optionalParameters.map((p) => makeParameter(p, assign));
nodes.add(new tree.NodeList(open, makeLink(opt), close, ','));
}
return argList(nodes);
@@ -971,10 +967,10 @@
makeIdentifier(param.name),
makeParameters(param.parameters),
null, // body
- param.type == null ? null : makeType(param.type),
+ param.type == null ? null : makeType(param.type),
makeEmptyModifiers(), // TODO: Function parameter modifiers?
- null, // initializers
- null, // get/set
+ null, // initializers
+ null, // get/set
null); // async modifier
if (param.element != null) {
setElement(definition, param.element, param);
@@ -987,9 +983,7 @@
singleton(makeExpression(param.defaultValue)));
}
return new tree.VariableDefinitions(
- null,
- makeEmptyModifiers(),
- singleton(definition));
+ null, makeEmptyModifiers(), singleton(definition));
} else {
tree.Node definition;
if (param.defaultValue != null) {
@@ -1015,13 +1009,14 @@
return new tree.Modifiers(blankList());
}
- tree.Modifiers makeModifiers({bool isExternal: false,
- bool isStatic: false,
- bool isAbstract: false,
- bool isFactory: false,
- bool isConst: false,
- bool isFinal: false,
- bool isVar: false}) {
+ tree.Modifiers makeModifiers(
+ {bool isExternal: false,
+ bool isStatic: false,
+ bool isAbstract: false,
+ bool isFactory: false,
+ bool isConst: false,
+ bool isFinal: false,
+ bool isVar: false}) {
List<tree.Node> nodes = [];
if (isExternal) {
nodes.add(makeIdentifier('external'));
@@ -1047,22 +1042,25 @@
return new tree.Modifiers(makeList(' ', nodes));
}
- tree.Modifiers makeVarModifiers({bool isConst: false,
- bool isFinal: false,
- bool useVar: false,
- bool isStatic: false}) {
- return makeModifiers(isStatic: isStatic,
- isConst: isConst,
- isFinal: isFinal,
- isVar: useVar && !(isConst || isFinal));
+ tree.Modifiers makeVarModifiers(
+ {bool isConst: false,
+ bool isFinal: false,
+ bool useVar: false,
+ bool isStatic: false}) {
+ return makeModifiers(
+ isStatic: isStatic,
+ isConst: isConst,
+ isFinal: isFinal,
+ isVar: useVar && !(isConst || isFinal));
}
tree.Modifiers makeFunctionModifiers(FunctionExpression exp) {
if (exp.element == null) return makeEmptyModifiers();
- return makeModifiers(isExternal: exp.element.isExternal,
- isStatic: exp.element.isStatic,
- isFactory: exp.element.isFactoryConstructor,
- isConst: exp.element.isConst);
+ return makeModifiers(
+ isExternal: exp.element.isExternal,
+ isStatic: exp.element.isStatic,
+ isFactory: exp.element.isFactoryConstructor,
+ isConst: exp.element.isConst);
}
tree.Node makeNodeForClassElement(elements.ClassElement cls) {
@@ -1089,8 +1087,8 @@
final Token typedefKeyword = typedefToken;
final Token endToken = semicolon;
- return new tree.Typedef(returnType, name, typeParameters, formals,
- typedefKeyword, endToken);
+ return new tree.Typedef(
+ returnType, name, typeParameters, formals, typedefKeyword, endToken);
}
/// Create a [tree.NodeList] containing the type variable declarations in
@@ -1126,17 +1124,17 @@
/// differs between [tree.NamedMixinApplication] and [tree.ClassNode].
// TODO(johnniwinther): Normalize interfaces on[tree.NamedMixinApplication]
// and [tree.ClassNode].
- tree.NodeList makeInterfaces(Link<types.DartType> interfaces,
- Set<types.DartType> mixinTypes,
- {bool forNamedMixinApplication: false}) {
+ tree.NodeList makeInterfaces(
+ Link<types.DartType> interfaces, Set<types.DartType> mixinTypes,
+ {bool forNamedMixinApplication: false}) {
Link<tree.Node> typeAnnotations = const Link<tree.Node>();
for (Link<types.DartType> link = interfaces;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
types.DartType interface = link.head;
if (!mixinTypes.contains(interface)) {
- typeAnnotations = typeAnnotations.prepend(
- makeType(TypeGenerator.createType(interface)));
+ typeAnnotations = typeAnnotations
+ .prepend(makeType(TypeGenerator.createType(interface)));
}
}
if (typeAnnotations.isEmpty) {
@@ -1144,7 +1142,9 @@
} else {
return new tree.NodeList(
forNamedMixinApplication ? null : implementsToken,
- typeAnnotations, null, ',');
+ typeAnnotations,
+ null,
+ ',');
}
}
@@ -1152,11 +1152,10 @@
// TODO(johnniwinther): Unify creation of mixin lists between
// [NamedMixinApplicationElement] and [ClassElement].
tree.NamedMixinApplication makeNamedMixinApplication(
- elements.MixinApplicationElement cls) {
-
+ elements.MixinApplicationElement cls) {
assert(invariant(cls, !cls.isUnnamedMixinApplication,
message: "Cannot create ClassNode for unnamed mixin application "
- "$cls."));
+ "$cls."));
tree.Modifiers modifiers = makeModifiers(isAbstract: cls.isAbstract);
tree.Identifier name = makeIdentifier(cls.name);
tree.NodeList typeParameters = makeTypeParameters(cls.typeVariables);
@@ -1183,12 +1182,11 @@
tree.Node supernode = new tree.MixinApplication(
superclass, new tree.NodeList(null, mixins, null, ','));
- tree.NodeList interfaces = makeInterfaces(
- cls.interfaces, mixinTypes, forNamedMixinApplication: true);
+ tree.NodeList interfaces = makeInterfaces(cls.interfaces, mixinTypes,
+ forNamedMixinApplication: true);
- return new tree.NamedMixinApplication(
- name, typeParameters, modifiers, supernode,
- interfaces, classToken, semicolon);
+ return new tree.NamedMixinApplication(name, typeParameters, modifiers,
+ supernode, interfaces, classToken, semicolon);
}
tree.Enum makeEnum(elements.EnumClassElement cls) {
@@ -1196,14 +1194,14 @@
enumToken,
makeIdentifier(cls.name),
makeList(',', cls.enumValues.map((e) => makeIdentifier(e.name)),
- open: openBrace, close: closeBrace));
+ open: openBrace, close: closeBrace));
}
/// Creates a [tree.ClassNode] node for [cls].
tree.ClassNode makeClassNode(elements.ClassElement cls) {
assert(invariant(cls, !cls.isUnnamedMixinApplication,
message: "Cannot create ClassNode for unnamed mixin application "
- "$cls."));
+ "$cls."));
tree.Modifiers modifiers = makeModifiers(isAbstract: cls.isAbstract);
tree.Identifier name = makeIdentifier(cls.name);
tree.NodeList typeParameters = makeTypeParameters(cls.typeVariables);
@@ -1232,13 +1230,17 @@
supernode = makeType(TypeGenerator.createType(supertype));
}
}
- tree.NodeList interfaces = makeInterfaces(
- cls.interfaces, mixinTypes);
+ tree.NodeList interfaces = makeInterfaces(cls.interfaces, mixinTypes);
Token extendsKeyword = supernode != null ? extendsToken : null;
return new tree.ClassNode(
- modifiers, name, typeParameters, supernode,
- interfaces, openBrace, extendsKeyword,
+ modifiers,
+ name,
+ typeParameters,
+ supernode,
+ interfaces,
+ openBrace,
+ extendsKeyword,
null, // No body.
closeBrace);
}
@@ -1246,9 +1248,8 @@
tree.Node constructorName(ConstructorDefinition exp) {
String name = exp.name;
tree.Identifier className = makeIdentifier(exp.element.enclosingClass.name);
- tree.Node result = name == ""
- ? className
- : new tree.Send(className, makeIdentifier(name));
+ tree.Node result =
+ name == "" ? className : new tree.Send(className, makeIdentifier(name));
setElement(result, exp.element, exp);
return result;
}
@@ -1296,9 +1297,8 @@
// Finish the previous string interpolation, if there is one.
tree.LiteralString lit = makeVerbatimStringLiteral(sb.toString());
if (currentInterpolation != null) {
- literalParts.add(new tree.StringInterpolationPart(
- currentInterpolation,
- lit));
+ literalParts.add(
+ new tree.StringInterpolationPart(currentInterpolation, lit));
} else {
firstLiteral = lit;
}
@@ -1322,24 +1322,20 @@
if (firstLiteral == null) {
node = lit;
} else {
- literalParts.add(new tree.StringInterpolationPart(
- currentInterpolation,
- lit));
+ literalParts
+ .add(new tree.StringInterpolationPart(currentInterpolation, lit));
node = new tree.StringInterpolation(
- firstLiteral,
- makeList('', literalParts));
+ firstLiteral, makeList('', literalParts));
}
// Juxtapose with the previous string chunks, if any.
if (chunk.previous != null) {
return new tree.StringJuxtaposition(
- printStringChunk(chunk.previous),
- node);
+ printStringChunk(chunk.previous), node);
} else {
return node;
}
}
return printStringChunk(output.chunk);
}
-
}
diff --git a/pkg/compiler/lib/src/dart_backend/dart_backend.dart b/pkg/compiler/lib/src/dart_backend/dart_backend.dart
index ee653f0..729091f 100644
--- a/pkg/compiler/lib/src/dart_backend/dart_backend.dart
+++ b/pkg/compiler/lib/src/dart_backend/dart_backend.dart
@@ -7,53 +7,30 @@
import 'dart:async' show Future;
import 'dart:math' show max;
-import '../../compiler.dart' show
- CompilerOutputProvider;
+import '../../compiler.dart' show CompilerOutputProvider;
import '../common.dart';
-import '../common/backend_api.dart' show
- Backend,
- ImpactTransformer;
-import '../common/codegen.dart' show
- CodegenWorkItem;
-import '../common/names.dart' show
- Selectors,
- Uris;
-import '../common/registry.dart' show
- Registry;
-import '../common/resolution.dart' show
- Resolution,
- ResolutionImpact;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/backend_api.dart' show Backend, ImpactTransformer;
+import '../common/codegen.dart' show CodegenWorkItem;
+import '../common/names.dart' show Selectors, Uris;
+import '../common/registry.dart' show Registry;
+import '../common/resolution.dart' show Resolution, ResolutionImpact;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../compile_time_constants.dart';
import '../constants/constant_system.dart';
import '../constants/expressions.dart';
import '../constants/values.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../enqueue.dart' show
- Enqueuer,
- ResolutionEnqueuer;
-import '../library_loader.dart' show
- LoadedLibraries;
+import '../enqueue.dart' show Enqueuer, ResolutionEnqueuer;
+import '../library_loader.dart' show LoadedLibraries;
import '../mirror_renamer/mirror_renamer.dart';
-import '../resolution/tree_elements.dart' show
- TreeElements,
- TreeElementMapping;
-import '../tokens/keyword.dart' show
- Keyword;
+import '../resolution/tree_elements.dart' show TreeElements, TreeElementMapping;
+import '../tokens/keyword.dart' show Keyword;
import '../tree/tree.dart';
-import '../universe/selector.dart' show
- Selector;
-import '../universe/use.dart' show
- DynamicUse,
- TypeUse,
- TypeUseKind;
-import '../universe/world_impact.dart' show
- WorldImpact,
- TransformedWorldImpact;
+import '../universe/selector.dart' show Selector;
+import '../universe/use.dart' show DynamicUse, TypeUse, TypeUseKind;
+import '../universe/world_impact.dart' show WorldImpact, TransformedWorldImpact;
import '../util/util.dart';
import 'backend_ast_to_frontend_ast.dart' as backend2frontend;
diff --git a/pkg/compiler/lib/src/dart_backend/outputter.dart b/pkg/compiler/lib/src/dart_backend/outputter.dart
index 484bda2..ce9022a 100644
--- a/pkg/compiler/lib/src/dart_backend/outputter.dart
+++ b/pkg/compiler/lib/src/dart_backend/outputter.dart
@@ -8,7 +8,8 @@
Map<ClassElement, Iterable<Element>> classMembers);
typedef void ElementCallback<E>(E element);
typedef void ElementPostProcessFunction(
- AstElement element, ElementAst elementAst,
+ AstElement element,
+ ElementAst elementAst,
ElementCallback<TypedefElement> typedefCallback,
ElementCallback<ClassElement> classCallback);
typedef ElementAst ComputeElementAstFunction(AstElement element);
@@ -38,9 +39,9 @@
// TODO(johnniwinther): Support recompilation.
DartOutputter(this.reporter, this.outputProvider,
- {bool this.forceStripTypes: false,
- bool this.enableMinification: false,
- bool this.multiFile: false});
+ {bool this.forceStripTypes: false,
+ bool this.enableMinification: false,
+ bool this.multiFile: false});
/// Generate Dart code for the program starting at [mainFunction].
///
@@ -57,8 +58,8 @@
/// [resolvedElements] in the generated output.
///
/// Returns the total size of the generated code.
- int assembleProgram({
- MirrorRenamer mirrorRenamer: const MirrorRenamer(),
+ int assembleProgram(
+ {MirrorRenamer mirrorRenamer: const MirrorRenamer(),
Iterable<LibraryElement> libraries,
Iterable<Element> instantiatedClasses,
Iterable<Element> resolvedElements,
@@ -70,7 +71,6 @@
ElementFilter shouldOutput,
IsSafeToRemoveTypeDeclarations isSafeToRemoveTypeDeclarations,
ElementSorter sortElements}) {
-
assert(invariant(NO_LOCATION_SPANNABLE, libraries != null,
message: "'libraries' must be non-null."));
assert(invariant(NO_LOCATION_SPANNABLE, instantiatedClasses != null,
@@ -83,8 +83,8 @@
message: "'computeElementAst' must be non-null."));
assert(invariant(NO_LOCATION_SPANNABLE, shouldOutput != null,
message: "'shouldOutput' must be non-null."));
- assert(invariant(NO_LOCATION_SPANNABLE,
- isSafeToRemoveTypeDeclarations != null,
+ assert(invariant(
+ NO_LOCATION_SPANNABLE, isSafeToRemoveTypeDeclarations != null,
message: "'isSafeToRemoveTypeDeclarations' must be non-null."));
if (sortElements == null) {
@@ -96,29 +96,20 @@
};
}
- libraryInfo = LibraryInfo.processLibraries(
- reporter, libraries, resolvedElements);
+ libraryInfo =
+ LibraryInfo.processLibraries(reporter, libraries, resolvedElements);
elementInfo = ElementInfoProcessor.createElementInfo(
- instantiatedClasses,
- resolvedElements,
- usedTypeLiterals,
+ instantiatedClasses, resolvedElements, usedTypeLiterals,
postProcessElementAst: postProcessElementAst,
parseElementAst: computeElementAst,
shouldOutput: shouldOutput,
sortElements: sortElements);
PlaceholderCollector collector = collectPlaceholders(
- reporter,
- mirrorRenamer,
- mainFunction,
- libraryInfo,
- elementInfo);
+ reporter, mirrorRenamer, mainFunction, libraryInfo, elementInfo);
- renamer = createRenamer(
- collector,
- libraryInfo,
- elementInfo,
+ renamer = createRenamer(collector, libraryInfo, elementInfo,
enableMinification: enableMinification,
forceStripTypes: forceStripTypes,
isSafeToRemoveTypeDeclarations: isSafeToRemoveTypeDeclarations);
@@ -126,20 +117,13 @@
if (outputAst) {
String code = astOutput(reporter, elementInfo);
outputProvider("", "dart")
- ..add(code)
- ..close();
+ ..add(code)
+ ..close();
return code.length;
} else {
output = new MainOutputGenerator();
- return output.generateCode(
- libraryInfo,
- elementInfo,
- collector,
- renamer,
- mainFunction,
- outputUri,
- outputProvider,
- mirrorRenamer,
+ return output.generateCode(libraryInfo, elementInfo, collector, renamer,
+ mainFunction, outputUri, outputProvider, mirrorRenamer,
multiFile: multiFile,
forceStripTypes: forceStripTypes,
enableMinification: enableMinification);
@@ -171,17 +155,15 @@
return collector;
}
- static PlaceholderRenamer createRenamer(
- PlaceholderCollector collector,
- LibraryInfo libraryInfo,
- ElementInfo elementInfo,
+ static PlaceholderRenamer createRenamer(PlaceholderCollector collector,
+ LibraryInfo libraryInfo, ElementInfo elementInfo,
{bool enableMinification: false,
- bool forceStripTypes: false,
- isSafeToRemoveTypeDeclarations}) {
+ bool forceStripTypes: false,
+ isSafeToRemoveTypeDeclarations}) {
// Create renames.
- bool shouldCutDeclarationTypes = forceStripTypes
- || (enableMinification
- && isSafeToRemoveTypeDeclarations(elementInfo.classMembers));
+ bool shouldCutDeclarationTypes = forceStripTypes ||
+ (enableMinification &&
+ isSafeToRemoveTypeDeclarations(elementInfo.classMembers));
PlaceholderRenamer placeholderRenamer = new PlaceholderRenamer(
libraryInfo.fixedDynamicNames,
@@ -194,8 +176,8 @@
return placeholderRenamer;
}
- static String astOutput(DiagnosticReporter reporter,
- ElementInfo elementInfo) {
+ static String astOutput(
+ DiagnosticReporter reporter, ElementInfo elementInfo) {
// TODO(antonm): Ideally XML should be a separate backend.
// TODO(antonm): obey renames and minification, at least as an option.
StringBuffer sb = new StringBuffer();
@@ -223,10 +205,8 @@
final Map<Element, LibraryElement> reexportingLibraries;
final List<LibraryElement> userLibraries;
- LibraryInfo(this.fixedStaticNames,
- this.fixedDynamicNames,
- this.reexportingLibraries,
- this.userLibraries);
+ LibraryInfo(this.fixedStaticNames, this.fixedDynamicNames,
+ this.reexportingLibraries, this.userLibraries);
static LibraryInfo processLibraries(
DiagnosticReporter reporter,
@@ -235,7 +215,7 @@
Set<String> fixedStaticNames = new Set<String>();
Set<String> fixedDynamicNames = new Set<String>();
Map<Element, LibraryElement> reexportingLibraries =
- <Element, LibraryElement>{};
+ <Element, LibraryElement>{};
List<LibraryElement> userLibraries = <LibraryElement>[];
// Conservatively traverse all platform libraries and collect member names.
// TODO(antonm): ideally we should only collect names of used members,
@@ -268,8 +248,7 @@
});
library.forEachExport((Element export) {
- if (!library.isInternalLibrary &&
- export.library.isInternalLibrary) {
+ if (!library.isInternalLibrary && export.library.isInternalLibrary) {
// If an element of an internal library is reexported by a platform
// library, we have to import the reexporting library instead of the
// internal library, because the internal library is an
@@ -300,17 +279,15 @@
enumClassMap.putIfAbsent(cls.name, () => cls);
if (existingEnumClass != cls) {
reporter.reportError(
- reporter.createMessage(
- cls,
- MessageKind.GENERIC,
- {'text': "Duplicate enum names are not supported "
- "in dart2dart."}),
- <DiagnosticMessage>[
- reporter.createMessage(
- existingEnumClass,
- MessageKind.GENERIC,
- {'text': "This is the other declaration of '${cls.name}'."}),
- ]);
+ reporter.createMessage(cls, MessageKind.GENERIC, {
+ 'text': "Duplicate enum names are not supported "
+ "in dart2dart."
+ }),
+ <DiagnosticMessage>[
+ reporter.createMessage(existingEnumClass, MessageKind.GENERIC, {
+ 'text': "This is the other declaration of '${cls.name}'."
+ }),
+ ]);
}
}
}
@@ -321,8 +298,7 @@
// that are invoked as functions. Make sure to not rename that.
fixedDynamicNames.add('call');
- return new LibraryInfo(
- fixedStaticNames, fixedDynamicNames,
+ return new LibraryInfo(fixedStaticNames, fixedDynamicNames,
reexportingLibraries, userLibraries);
}
}
@@ -333,10 +309,8 @@
final Map<ClassElement, Iterable<Element>> classMembers;
final Iterable<ClassElement> emitNoMembersFor;
- ElementInfo(this.elementAsts,
- this.topLevelElements,
- this.classMembers,
- this.emitNoMembersFor);
+ ElementInfo(this.elementAsts, this.topLevelElements, this.classMembers,
+ this.emitNoMembersFor);
}
class ElementInfoProcessor implements ElementInfo {
@@ -350,18 +324,16 @@
final ElementFilter shouldOutput;
ElementInfoProcessor(
- {this.postProcessElementAst,
- this.parseElementAst,
- this.shouldOutput});
+ {this.postProcessElementAst, this.parseElementAst, this.shouldOutput});
static ElementInfo createElementInfo(
Iterable<ClassElement> instantiatedClasses,
Iterable<AstElement> resolvedElements,
Iterable<ClassElement> usedTypeLiterals,
{ElementPostProcessFunction postProcessElementAst,
- ComputeElementAstFunction parseElementAst,
- ElementFilter shouldOutput,
- ElementSorter sortElements}) {
+ ComputeElementAstFunction parseElementAst,
+ ElementFilter shouldOutput,
+ ElementSorter sortElements}) {
ElementInfoProcessor processor = new ElementInfoProcessor(
postProcessElementAst: postProcessElementAst,
parseElementAst: parseElementAst,
@@ -371,10 +343,11 @@
sortElements: sortElements);
}
- ElementInfo process(Iterable<ClassElement> instantiatedClasses,
- Iterable<AstElement> resolvedElements,
- Iterable<ClassElement> usedTypeLiterals,
- {ElementSorter sortElements}) {
+ ElementInfo process(
+ Iterable<ClassElement> instantiatedClasses,
+ Iterable<AstElement> resolvedElements,
+ Iterable<ClassElement> usedTypeLiterals,
+ {ElementSorter sortElements}) {
// Build all top level elements to emit and necessary class members.
instantiatedClasses.where(shouldOutput).forEach(addClass);
resolvedElements.where(shouldOutput).forEach(addMember);
@@ -402,9 +375,8 @@
void processElement(Element element, ElementAst elementAst) {
if (postProcessElementAst != null) {
- postProcessElementAst(element, elementAst,
- newTypedefElementCallback,
- newClassElementCallback);
+ postProcessElementAst(element, elementAst, newTypedefElementCallback,
+ newClassElementCallback);
}
elementAsts[element] = elementAst;
}
@@ -459,7 +431,7 @@
/// [CompilerOutputProvider].
class MainOutputGenerator {
final Map<ClassNode, List<Node>> memberNodes =
- new Map<ClassNode, List<Node>>();
+ new Map<ClassNode, List<Node>>();
final List<Node> topLevelNodes = <Node>[];
/// Generates the code and returns the total size.
@@ -473,8 +445,8 @@
CompilerOutputProvider outputProvider,
MirrorRenamer mirrorRenamer,
{bool multiFile: false,
- bool forceStripTypes: false,
- bool enableMinification: false}) {
+ bool forceStripTypes: false,
+ bool enableMinification: false}) {
for (Element element in elementInfo.topLevelElements) {
topLevelNodes.add(elementInfo.elementAsts[element].ast);
if (element.isClass) {
@@ -490,8 +462,8 @@
}
}
- mirrorRenamer.addRenames(placeholderRenamer.renames,
- topLevelNodes, collector);
+ mirrorRenamer.addRenames(
+ placeholderRenamer.renames, topLevelNodes, collector);
Map<LibraryElement, String> outputPaths = new Map<LibraryElement, String>();
Map<LibraryElement, EmitterUnparser> unparsers =
@@ -501,8 +473,7 @@
EmitterUnparser mainUnparser = multiFile
? null
: new EmitterUnparser(placeholderRenamer.renames,
- stripTypes: forceStripTypes,
- minify: enableMinification);
+ stripTypes: forceStripTypes, minify: enableMinification);
if (multiFile) {
// TODO(sigurdm): Factor handling of library-paths out from emitting.
@@ -528,7 +499,7 @@
}
/// Rewrites imports/exports to refer to the paths given in [outputPaths].
- for(LibraryElement outputLibrary in libraryInfo.userLibraries) {
+ for (LibraryElement outputLibrary in libraryInfo.userLibraries) {
EmitterUnparser unparser = new EmitterUnparser(
placeholderRenamer.renames,
stripTypes: forceStripTypes,
@@ -553,8 +524,8 @@
}
}
} else {
- placeholderRenamer.platformImports.forEach(
- (LibraryElement library, String prefix) {
+ placeholderRenamer.platformImports
+ .forEach((LibraryElement library, String prefix) {
assert(library.isPlatformLibrary && !library.isInternalLibrary);
mainUnparser.unparseImportTag(library.canonicalUri.toString());
if (prefix != null) {
@@ -562,7 +533,7 @@
// it to avoid shadowing.
// TODO(johnniwinther): Avoid prefix-less import if not needed.
mainUnparser.unparseImportTag(library.canonicalUri.toString(),
- prefix: prefix);
+ prefix: prefix);
}
});
}
@@ -582,20 +553,20 @@
int totalSize = 0;
if (multiFile) {
- for(LibraryElement outputLibrary in libraryInfo.userLibraries) {
+ for (LibraryElement outputLibrary in libraryInfo.userLibraries) {
// TODO(sigurdm): Make the unparser output directly into the buffer
// instead of caching in `.result`.
String code = unparsers[outputLibrary].result;
totalSize += code.length;
outputProvider(outputPaths[outputLibrary], "dart")
- ..add(code)
- ..close();
+ ..add(code)
+ ..close();
}
} else {
String code = mainUnparser.result;
outputProvider("", "dart")
- ..add(code)
- ..close();
+ ..add(code)
+ ..close();
totalSize = code.length;
}
diff --git a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
index 0a2d0e1..e6656a7 100644
--- a/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
+++ b/pkg/compiler/lib/src/dart_backend/placeholder_collector.dart
@@ -9,8 +9,7 @@
final Set<Node> nodes;
LocalPlaceholder(this.identifier) : nodes = new Set<Node>();
int get hashCode => identifier.hashCode;
- String toString() =>
- 'local_placeholder[id($identifier), nodes($nodes)]';
+ String toString() => 'local_placeholder[id($identifier), nodes($nodes)]';
}
class FunctionScope {
@@ -18,7 +17,7 @@
final Set<LocalPlaceholder> localPlaceholders;
FunctionScope()
: parameterIdentifiers = new Set<String>(),
- localPlaceholders = new Set<LocalPlaceholder>();
+ localPlaceholders = new Set<LocalPlaceholder>();
void registerParameter(Identifier node) {
parameterIdentifiers.add(node.source);
}
@@ -133,18 +132,17 @@
visitStaticSend(Send node) {
Element element = elements[node];
- collector.mirrorRenamer.registerStaticSend(
- collector.currentElement, element, node);
+ collector.mirrorRenamer
+ .registerStaticSend(collector.currentElement, element, node);
- if (Elements.isUnresolved(element)
- || element.isDeferredLoaderGetter) {
+ if (Elements.isUnresolved(element) || element.isDeferredLoaderGetter) {
return;
}
if (element.isConstructor || element.isFactoryConstructor) {
// Rename named constructor in redirection position:
// class C { C.named(); C.redirecting() : this.named(); }
- if (node.receiver is Identifier
- && node.receiver.asIdentifier().isThis()) {
+ if (node.receiver is Identifier &&
+ node.receiver.asIdentifier().isThis()) {
assert(node.selector is Identifier);
collector.tryMakeConstructorPlaceholder(node, element);
}
@@ -178,16 +176,16 @@
final Set<Node> prefixNodesToErase = new Set<Node>();
final Set<Node> unresolvedNodes = new Set<Node>();
final Map<Element, Set<Node>> elementNodes = new Map<Element, Set<Node>>();
- final Map<FunctionElement, FunctionScope> functionScopes
- = new Map<FunctionElement, FunctionScope>();
+ final Map<FunctionElement, FunctionScope> functionScopes =
+ new Map<FunctionElement, FunctionScope>();
final Map<LibraryElement, Set<Identifier>> privateNodes =
new Map<LibraryElement, Set<Identifier>>();
- final List<DeclarationTypePlaceholder> declarationTypePlaceholders
- = new List<DeclarationTypePlaceholder>();
- final Map<String, Set<Identifier>> memberPlaceholders
- = new Map<String, Set<Identifier>>();
- final List<ConstructorPlaceholder> constructorPlaceholders
- = new List<ConstructorPlaceholder>();
+ final List<DeclarationTypePlaceholder> declarationTypePlaceholders =
+ new List<DeclarationTypePlaceholder>();
+ final Map<String, Set<Identifier>> memberPlaceholders =
+ new Map<String, Set<Identifier>>();
+ final List<ConstructorPlaceholder> constructorPlaceholders =
+ new List<ConstructorPlaceholder>();
Map<String, LocalPlaceholder> currentLocalPlaceholders;
Element currentElement;
FunctionElement topmostEnclosingFunction;
@@ -196,9 +194,8 @@
get currentFunctionScope => functionScopes.putIfAbsent(
topmostEnclosingFunction, () => new FunctionScope());
- PlaceholderCollector(this.reporter, this.mirrorRenamer,
- this.fixedMemberNames, this.elementAsts,
- this.mainFunction);
+ PlaceholderCollector(this.reporter, this.mirrorRenamer, this.fixedMemberNames,
+ this.elementAsts, this.mainFunction);
void collectFunctionDeclarationPlaceholders(
FunctionElement element, FunctionExpression node) {
@@ -212,8 +209,7 @@
FunctionElement redirectTarget = constructor.immediateRedirectionTarget;
assert(redirectTarget != null && redirectTarget != element);
tryMakeConstructorPlaceholder(
- bodyAsRedirectingFactoryBody.constructorReference,
- redirectTarget);
+ bodyAsRedirectingFactoryBody.constructorReference, redirectTarget);
}
} else if (Elements.isStaticOrTopLevel(element)) {
// Note: this code should only rename private identifiers for class'
@@ -281,7 +277,8 @@
}
return false;
}
- if (element.isParameter && !isTypedefParameter(element) &&
+ if (element.isParameter &&
+ !isTypedefParameter(element) &&
isNamedOptionalParameter()) {
currentFunctionScope.registerParameter(node);
} else if (Elements.isLocal(element) && !isTypedefParameter(element)) {
@@ -294,8 +291,9 @@
if (node is Operator) return;
String identifier = node.source;
if (fixedMemberNames.contains(identifier)) return;
- memberPlaceholders.putIfAbsent(
- identifier, () => new Set<Identifier>()).add(node);
+ memberPlaceholders
+ .putIfAbsent(identifier, () => new Set<Identifier>())
+ .add(node);
}
void makeTypePlaceholder(Node node, DartType type) {
@@ -324,8 +322,8 @@
void makeOmitDeclarationTypePlaceholder(TypeAnnotation type) {
if (type == null) return;
- declarationTypePlaceholders.add(
- new DeclarationTypePlaceholder(type, false));
+ declarationTypePlaceholders
+ .add(new DeclarationTypePlaceholder(type, false));
}
void makeVarDeclarationTypePlaceholder(VariableDefinitions node) {
@@ -335,8 +333,8 @@
// and/or catch syntax changes.
if (node.type == null) return;
bool requiresVar = !node.modifiers.isFinalOrConst;
- declarationTypePlaceholders.add(
- new DeclarationTypePlaceholder(node.type, requiresVar));
+ declarationTypePlaceholders
+ .add(new DeclarationTypePlaceholder(node.type, requiresVar));
}
/// Marks [node] to be erased in the output.
@@ -378,8 +376,9 @@
!Elements.isStaticOrTopLevel(element) &&
!Elements.isLocal(element) &&
Name.isPrivateName(node.source)) {
- privateNodes.putIfAbsent(
- currentElement.library, () => new Set<Identifier>()).add(node);
+ privateNodes
+ .putIfAbsent(currentElement.library, () => new Set<Identifier>())
+ .add(node);
}
}
@@ -429,7 +428,7 @@
Send receiver = node.receiver;
// prefix.ClassName.constructorName()
assert(treeElements[receiver.receiver] != null &&
- treeElements[receiver.receiver].isPrefix);
+ treeElements[receiver.receiver].isPrefix);
prefix = receiver.receiver;
className = receiver.selector;
constructorName = node.selector;
@@ -468,8 +467,8 @@
if (constructorName != null) {
Element definingConstructor = findDefiningConstructor(element);
- constructorPlaceholders.add(new ConstructorPlaceholder(constructorName,
- definingConstructor));
+ constructorPlaceholders.add(
+ new ConstructorPlaceholder(constructorName, definingConstructor));
tryMakePrivateIdentifier(constructorName, element);
}
}
@@ -480,7 +479,9 @@
visit(Node node) => (node == null) ? null : node.accept(this);
- visitNode(Node node) { node.visitChildren(this); } // We must go deeper.
+ visitNode(Node node) {
+ node.visitChildren(this);
+ } // We must go deeper.
visitNewExpression(NewExpression node) {
Send send = node.send;
@@ -544,10 +545,13 @@
if (Elements.isStaticOrTopLevel(element)) {
// TODO(smok): Worth investigating why sometimes we get getter/setter
// here and sometimes abstract field.
- assert(element.isClass || element is VariableElement ||
- element.isAccessor || element.isAbstractField ||
- element.isFunction || element.isTypedef ||
- element is TypeVariableElement);
+ assert(element.isClass ||
+ element is VariableElement ||
+ element.isAccessor ||
+ element.isAbstractField ||
+ element.isFunction ||
+ element.isTypedef ||
+ element is TypeVariableElement);
makeElementPlaceholder(send.selector, element);
} else {
Identifier identifier = send.selector.asIdentifier();
@@ -600,9 +604,7 @@
Identifier identifier = definition is Identifier
? definition
: definition is Send
- ? (send.selector is Identifier
- ? send.selector
- : null)
+ ? (send.selector is Identifier ? send.selector : null)
: null;
tryMakePrivateIdentifier(identifier, definitionElement);
@@ -619,8 +621,7 @@
} else {
assert(send.selector is FunctionExpression);
if (definitionElement.isInitializingFormal) {
- tryMakeMemberPlaceholder(
- send.selector.asFunctionExpression().name);
+ tryMakeMemberPlaceholder(send.selector.asFunctionExpression().name);
}
}
} else if (definition is Identifier) {
diff --git a/pkg/compiler/lib/src/dart_backend/renamer.dart b/pkg/compiler/lib/src/dart_backend/renamer.dart
index 6465af8..29b26d7 100644
--- a/pkg/compiler/lib/src/dart_backend/renamer.dart
+++ b/pkg/compiler/lib/src/dart_backend/renamer.dart
@@ -4,8 +4,7 @@
part of dart_backend;
-Comparator get _compareNodes =>
- compareBy((n) => n.getBeginToken().charOffset);
+Comparator get _compareNodes => compareBy((n) => n.getBeginToken().charOffset);
abstract class Renamable implements Comparable {
final int RENAMABLE_TYPE_ELEMENT = 1;
@@ -31,8 +30,7 @@
class GlobalRenamable extends Renamable {
final Entity entity;
- GlobalRenamable(this.entity, Set<Node> nodes)
- : super(nodes);
+ GlobalRenamable(this.entity, Set<Node> nodes) : super(nodes);
int compareInternals(GlobalRenamable other) =>
compareElements(this.entity, other.entity);
@@ -44,8 +42,7 @@
class MemberRenamable extends Renamable {
final String identifier;
- MemberRenamable(this.identifier, Set<Node> nodes)
- : super(nodes);
+ MemberRenamable(this.identifier, Set<Node> nodes) : super(nodes);
int compareInternals(MemberRenamable other) =>
this.identifier.compareTo(other.identifier);
int get kind => RENAMABLE_TYPE_MEMBER;
@@ -55,11 +52,10 @@
}
class LocalRenamable extends Renamable {
- LocalRenamable(Set<Node> nodes)
- : super(nodes);
- int compareInternals(LocalRenamable other) =>
- _compareNodes(sorted(this.nodes, _compareNodes)[0],
- sorted(other.nodes, _compareNodes)[0]);
+ LocalRenamable(Set<Node> nodes) : super(nodes);
+ int compareInternals(LocalRenamable other) => _compareNodes(
+ sorted(this.nodes, _compareNodes)[0],
+ sorted(other.nodes, _compareNodes)[0]);
int get kind => RENAMABLE_TYPE_LOCAL;
String createNewName(PlaceholderRenamer placeholderRenamer) {
return placeholderRenamer._generateUniqueTopLevelName("");
@@ -72,6 +68,7 @@
class PlaceholderRenamer {
/// After running [computeRenames] this will contain the computed renames.
final Map<Node, String> renames = new Map<Node, String>();
+
/// After running [computeRenames] this will map the used platform
/// libraries to their respective prefixes.
final Map<LibraryElement, String> platformImports =
@@ -94,10 +91,9 @@
Generator _generator;
- PlaceholderRenamer(this.fixedDynamicNames,
- this.fixedStaticNames,
- this.reexportingLibraries,
- {this.enableMinification, this.cutDeclarationTypes});
+ PlaceholderRenamer(
+ this.fixedDynamicNames, this.fixedStaticNames, this.reexportingLibraries,
+ {this.enableMinification, this.cutDeclarationTypes});
void _renameNodes(Iterable<Node> nodes, String renamer(Node node)) {
for (Node node in sorted(nodes, _compareNodes)) {
@@ -108,7 +104,7 @@
String _generateUniqueTopLevelName(String originalName) {
String newName = _generator.generate(originalName, (name) {
return _forbiddenIdentifiers.contains(name) ||
- _allNamedParameterIdentifiers.contains(name);
+ _allNamedParameterIdentifiers.contains(name);
});
_forbiddenIdentifiers.add(newName);
return newName;
@@ -121,9 +117,10 @@
/// Looks up [originalName] in the [_privateCache] cache of [library].
/// If [originalName] was not renamed before, generate a new name.
String _getPrivateName(LibraryElement library, String originalName) {
- return _privateCache.putIfAbsent(library, () => new Map<String, String>())
- .putIfAbsent(originalName,
- () => _generateUniqueTopLevelName(originalName));
+ return _privateCache
+ .putIfAbsent(library, () => new Map<String, String>())
+ .putIfAbsent(
+ originalName, () => _generateUniqueTopLevelName(originalName));
}
String _renameConstructor(ConstructorPlaceholder placeholder) {
@@ -135,9 +132,9 @@
String _renameGlobal(Entity entity) {
assert(entity is! Element ||
- Elements.isMalformed(entity) ||
- Elements.isStaticOrTopLevel(entity) ||
- entity is TypeVariableElement);
+ Elements.isMalformed(entity) ||
+ Elements.isStaticOrTopLevel(entity) ||
+ entity is TypeVariableElement);
// TODO(smok): We may want to reuse class static field and method names.
if (entity is Element) {
LibraryElement library = entity.library;
@@ -148,14 +145,14 @@
// TODO(johnniwinther): Handle prefixes for dart:core.
if (library.canonicalUri == Uris.dart_core) return entity.name;
if (library.isInternalLibrary) {
- throw new SpannableAssertionFailure(entity,
+ throw new SpannableAssertionFailure(
+ entity,
"Internal library $library should never have been imported from "
"the code compiled by dart2dart.");
}
String prefix = platformImports.putIfAbsent(library, () => null);
- if (entity.isTopLevel &&
- fixedDynamicNames.contains(entity.name)) {
+ if (entity.isTopLevel && fixedDynamicNames.contains(entity.name)) {
if (prefix == null) {
prefix = _generateUniqueTopLevelName('');
platformImports[library] = prefix;
@@ -165,8 +162,8 @@
return entity.name;
}
}
- String name = _renamedCache.putIfAbsent(entity,
- () => _generateUniqueTopLevelName(entity.name));
+ String name = _renamedCache.putIfAbsent(
+ entity, () => _generateUniqueTopLevelName(entity.name));
// Look up in [_renamedCache] for a name for [entity] .
// If it was not renamed before, generate a new name.
return name;
@@ -178,22 +175,23 @@
// Build a list sorted by usage of local nodes that will be renamed to
// the same identifier. So the top-used local variables in all functions
// will be renamed first and will all share the same new identifier.
- int maxLength = placeholderCollector.functionScopes.values.fold(0,
- (a, b) => max(a, b.localPlaceholders.length));
+ int maxLength = placeholderCollector.functionScopes.values
+ .fold(0, (a, b) => max(a, b.localPlaceholders.length));
- List<Set<Node>> allLocals = new List<Set<Node>>
- .generate(maxLength, (_) => new Set<Node>());
+ List<Set<Node>> allLocals =
+ new List<Set<Node>>.generate(maxLength, (_) => new Set<Node>());
for (FunctionScope functionScope
in placeholderCollector.functionScopes.values) {
// Add current sorted local identifiers to the whole sorted list
// of all local identifiers for all functions.
- List<LocalPlaceholder> currentSortedPlaceholders =
- sorted(functionScope.localPlaceholders,
- compareBy((LocalPlaceholder ph) => -ph.nodes.length));
+ List<LocalPlaceholder> currentSortedPlaceholders = sorted(
+ functionScope.localPlaceholders,
+ compareBy((LocalPlaceholder ph) => -ph.nodes.length));
List<Set<Node>> currentSortedNodes = currentSortedPlaceholders
- .map((LocalPlaceholder ph) => ph.nodes).toList();
+ .map((LocalPlaceholder ph) => ph.nodes)
+ .toList();
for (int i = 0; i < currentSortedNodes.length; i++) {
allLocals[i].addAll(currentSortedNodes[i]);
@@ -204,12 +202,12 @@
// count, otherwise when we rename elements first there will be no good
// identifiers left for members even if they are used often.
List<Renamable> renamables = new List<Renamable>();
- placeholderCollector.elementNodes.forEach(
- (Element element, Set<Node> nodes) {
+ placeholderCollector.elementNodes
+ .forEach((Element element, Set<Node> nodes) {
renamables.add(new GlobalRenamable(element, nodes));
});
- placeholderCollector.memberPlaceholders.forEach(
- (String memberName, Set<Identifier> identifiers) {
+ placeholderCollector.memberPlaceholders
+ .forEach((String memberName, Set<Identifier> identifiers) {
renamables.add(new MemberRenamable(memberName, identifiers));
});
for (Set<Node> localIdentifiers in allLocals) {
@@ -225,30 +223,28 @@
void _computeNonMinifiedRenames(PlaceholderCollector placeholderCollector) {
_generator = new ConservativeGenerator();
// Rename elements.
- placeholderCollector.elementNodes.forEach(
- (Element element, Set<Node> nodes) {
+ placeholderCollector.elementNodes
+ .forEach((Element element, Set<Node> nodes) {
_renameNodes(nodes, (_) => _renameGlobal(element));
});
// Rename locals.
- placeholderCollector.functionScopes.forEach(
- (functionElement, functionScope) {
-
+ placeholderCollector.functionScopes
+ .forEach((functionElement, functionScope) {
Set<String> memberIdentifiers = new Set<String>();
Set<LocalPlaceholder> placeholders = functionScope.localPlaceholders;
if (functionElement != null && functionElement.enclosingClass != null) {
- functionElement.enclosingClass.forEachMember(
- (enclosingClass, member) {
- memberIdentifiers.add(member.name);
- });
+ functionElement.enclosingClass.forEachMember((enclosingClass, member) {
+ memberIdentifiers.add(member.name);
+ });
}
Set<String> usedLocalIdentifiers = new Set<String>();
for (LocalPlaceholder placeholder in placeholders) {
String nextId = _generator.generate(placeholder.identifier, (name) {
- return functionScope.parameterIdentifiers.contains(name)
- || _forbiddenIdentifiers.contains(name)
- || usedLocalIdentifiers.contains(name)
- || memberIdentifiers.contains(name);
+ return functionScope.parameterIdentifiers.contains(name) ||
+ _forbiddenIdentifiers.contains(name) ||
+ usedLocalIdentifiers.contains(name) ||
+ memberIdentifiers.contains(name);
});
usedLocalIdentifiers.add(nextId);
_renameNodes(placeholder.nodes, (_) => nextId);
@@ -268,8 +264,8 @@
/// Also adds to [platformImports] all the platform-libraries that are used.
void computeRenames(PlaceholderCollector placeholderCollector) {
_allNamedParameterIdentifiers = new Set<String>();
- for (FunctionScope functionScope in
- placeholderCollector.functionScopes.values) {
+ for (FunctionScope functionScope
+ in placeholderCollector.functionScopes.values) {
_allNamedParameterIdentifiers.addAll(functionScope.parameterIdentifiers);
}
@@ -285,15 +281,15 @@
}
// Rename constructors.
- for (ConstructorPlaceholder placeholder in
- placeholderCollector.constructorPlaceholders) {
- renames[placeholder.node] =
- _renameConstructor(placeholder);
- };
+ for (ConstructorPlaceholder placeholder
+ in placeholderCollector.constructorPlaceholders) {
+ renames[placeholder.node] = _renameConstructor(placeholder);
+ }
+ ;
// Rename private identifiers uniquely for each library.
- placeholderCollector.privateNodes.forEach(
- (LibraryElement library, Set<Identifier> identifiers) {
+ placeholderCollector.privateNodes
+ .forEach((LibraryElement library, Set<Identifier> identifiers) {
for (Identifier identifier in identifiers) {
renames[identifier] = _getPrivateName(library, identifier.source);
}
@@ -310,8 +306,8 @@
}
if (cutDeclarationTypes) {
- for (DeclarationTypePlaceholder placeholder in
- placeholderCollector.declarationTypePlaceholders) {
+ for (DeclarationTypePlaceholder placeholder
+ in placeholderCollector.declarationTypePlaceholders) {
renames[placeholder.typeNode] = placeholder.requiresVar ? 'var' : '';
}
}
@@ -332,7 +328,7 @@
if (index < firstCharAlphabet.length) return firstCharAlphabet[index];
StringBuffer resultBuilder = new StringBuffer();
resultBuilder.writeCharCode(
- firstCharAlphabet.codeUnitAt(index % firstCharAlphabet.length));
+ firstCharAlphabet.codeUnitAt(index % firstCharAlphabet.length));
index ~/= firstCharAlphabet.length;
int length = otherCharsAlphabet.length;
while (index >= length) {
@@ -352,7 +348,8 @@
String generate(String originalName, bool isForbidden(String name)) {
String result = originalName;
int index = 0;
- while (isForbidden(result) ){ //|| result == originalName) {
+ while (isForbidden(result)) {
+ //|| result == originalName) {
result = '${originalName}_${generateMiniId(index++)}';
}
return result;
@@ -372,4 +369,4 @@
} while (isForbidden(result));
return result;
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/dart_types.dart b/pkg/compiler/lib/src/dart_types.dart
index 5262138..41ce1e5 100644
--- a/pkg/compiler/lib/src/dart_types.dart
+++ b/pkg/compiler/lib/src/dart_types.dart
@@ -7,18 +7,13 @@
import 'dart:math' show min;
import 'common.dart';
-import 'common/resolution.dart' show
- Resolution;
+import 'common/resolution.dart' show Resolution;
import 'core_types.dart';
-import 'elements/modelx.dart' show
- LibraryElementX,
- TypeDeclarationElementX,
- TypedefElementX;
+import 'elements/modelx.dart'
+ show LibraryElementX, TypeDeclarationElementX, TypedefElementX;
import 'elements/elements.dart';
-import 'ordered_typeset.dart' show
- OrderedTypeSet;
-import 'util/util.dart' show
- equalElements;
+import 'ordered_typeset.dart' show OrderedTypeSet;
+import 'util/util.dart' show equalElements;
enum TypeKind {
FUNCTION,
@@ -79,7 +74,6 @@
// TODO(johnniwinther): Maybe move this to [TypedefType].
void computeUnaliased(Resolution resolution) {}
-
/// Returns the unaliased type of this type.
///
/// The unaliased type of a typedef'd type is the unaliased type to which its
@@ -165,8 +159,8 @@
void visitChildren(DartTypeVisitor visitor, var argument) {}
- static void visitList(List<DartType> types,
- DartTypeVisitor visitor, var argument) {
+ static void visitList(
+ List<DartType> types, DartTypeVisitor visitor, var argument) {
for (DartType type in types) {
type.accept(visitor, argument);
}
@@ -234,7 +228,7 @@
int get hashCode => 17 * element.hashCode;
bool operator ==(other) {
- if (other is !TypeVariableType) return false;
+ if (other is! TypeVariableType) return false;
return identical(other.element, element);
}
@@ -306,7 +300,7 @@
static int nextHash = 43765;
MalformedType(this.element, this.userProvidedBadType,
- [this.typeArguments = null]);
+ [this.typeArguments = null]);
TypeKind get kind => TypeKind.MALFORMED_TYPE;
@@ -348,21 +342,21 @@
final TypeDeclarationElement element;
final List<DartType> typeArguments;
- GenericType(TypeDeclarationElement element,
- this.typeArguments,
- {bool checkTypeArgumentCount: true})
+ GenericType(TypeDeclarationElement element, this.typeArguments,
+ {bool checkTypeArgumentCount: true})
: this.element = element {
assert(invariant(CURRENT_ELEMENT_SPANNABLE, element != null,
message: "Missing element for generic type."));
assert(invariant(element, () {
- if (!checkTypeArgumentCount) return true;
- if (element is TypeDeclarationElementX) {
- return element.thisTypeCache == null ||
- typeArguments.length == element.typeVariables.length;
- }
- return true;
- }, message: () => 'Invalid type argument count on ${element.thisType}. '
- 'Provided type arguments: $typeArguments.'));
+ if (!checkTypeArgumentCount) return true;
+ if (element is TypeDeclarationElementX) {
+ return element.thisTypeCache == null ||
+ typeArguments.length == element.typeVariables.length;
+ }
+ return true;
+ },
+ message: () => 'Invalid type argument count on ${element.thisType}. '
+ 'Provided type arguments: $typeArguments.'));
}
/// Creates a new instance of this type using the provided type arguments.
@@ -422,10 +416,10 @@
}
bool operator ==(other) {
- if (other is !GenericType) return false;
- return kind == other.kind
- && element == other.element
- && equalElements(typeArguments, other.typeArguments);
+ if (other is! GenericType) return false;
+ return kind == other.kind &&
+ element == other.element &&
+ equalElements(typeArguments, other.typeArguments);
}
/// Returns `true` if the declaration of this type has type variables.
@@ -448,13 +442,12 @@
int _hashCode;
InterfaceType(ClassElement element,
- [List<DartType> typeArguments = const <DartType>[]])
+ [List<DartType> typeArguments = const <DartType>[]])
: super(element, typeArguments) {
assert(invariant(element, element.isDeclaration));
}
- InterfaceType.forUserProvidedBadType(
- ClassElement element,
+ InterfaceType.forUserProvidedBadType(ClassElement element,
[List<DartType> typeArguments = const <DartType>[]])
: super(element, typeArguments, checkTypeArgumentCount: false);
@@ -481,9 +474,8 @@
if (element == other) return this;
InterfaceType supertype = element.asInstanceOf(other);
if (supertype != null) {
- List<DartType> arguments = Types.substTypes(supertype.typeArguments,
- typeArguments,
- element.typeVariables);
+ List<DartType> arguments = Types.substTypes(
+ supertype.typeArguments, typeArguments, element.typeVariables);
return new InterfaceType(supertype.element, arguments);
}
return null;
@@ -530,8 +522,7 @@
class BadInterfaceType extends InterfaceType {
final InterfaceType userProvidedBadType;
- BadInterfaceType(ClassElement element,
- InterfaceType this.userProvidedBadType)
+ BadInterfaceType(ClassElement element, InterfaceType this.userProvidedBadType)
: super(element, element.rawType.typeArguments);
String toString() {
@@ -539,7 +530,6 @@
}
}
-
/**
* Special subclass of [TypedefType] used for generic typedef types created
* with the wrong number of type arguments.
@@ -549,8 +539,7 @@
class BadTypedefType extends TypedefType {
final TypedefType userProvidedBadType;
- BadTypedefType(TypedefElement element,
- TypedefType this.userProvidedBadType)
+ BadTypedefType(TypedefElement element, TypedefType this.userProvidedBadType)
: super(element, element.rawType.typeArguments);
String toString() {
@@ -575,39 +564,36 @@
*/
final List<DartType> namedParameterTypes;
- factory FunctionType(
- FunctionTypedElement element,
+ factory FunctionType(FunctionTypedElement element,
[DartType returnType = const DynamicType(),
- List<DartType> parameterTypes = const <DartType>[],
- List<DartType> optionalParameterTypes = const <DartType>[],
- List<String> namedParameters = const <String>[],
- List<DartType> namedParameterTypes = const <DartType>[]]) {
+ List<DartType> parameterTypes = const <DartType>[],
+ List<DartType> optionalParameterTypes = const <DartType>[],
+ List<String> namedParameters = const <String>[],
+ List<DartType> namedParameterTypes = const <DartType>[]]) {
assert(invariant(CURRENT_ELEMENT_SPANNABLE, element != null));
assert(invariant(element, element.isDeclaration));
- return new FunctionType.internal(element,
- returnType, parameterTypes, optionalParameterTypes,
- namedParameters, namedParameterTypes);
+ return new FunctionType.internal(element, returnType, parameterTypes,
+ optionalParameterTypes, namedParameters, namedParameterTypes);
}
factory FunctionType.synthesized(
[DartType returnType = const DynamicType(),
- List<DartType> parameterTypes = const <DartType>[],
- List<DartType> optionalParameterTypes = const <DartType>[],
- List<String> namedParameters = const <String>[],
- List<DartType> namedParameterTypes = const <DartType>[]]) {
- return new FunctionType.internal(null,
- returnType, parameterTypes, optionalParameterTypes,
- namedParameters, namedParameterTypes);
+ List<DartType> parameterTypes = const <DartType>[],
+ List<DartType> optionalParameterTypes = const <DartType>[],
+ List<String> namedParameters = const <String>[],
+ List<DartType> namedParameterTypes = const <DartType>[]]) {
+ return new FunctionType.internal(null, returnType, parameterTypes,
+ optionalParameterTypes, namedParameters, namedParameterTypes);
}
FunctionType.internal(FunctionTypedElement this.element,
- [DartType this.returnType = const DynamicType(),
- this.parameterTypes = const <DartType>[],
- this.optionalParameterTypes = const <DartType>[],
- this.namedParameters = const <String>[],
- this.namedParameterTypes = const <DartType>[]]) {
- assert(invariant(CURRENT_ELEMENT_SPANNABLE,
- element == null || element.isDeclaration));
+ [DartType this.returnType = const DynamicType(),
+ this.parameterTypes = const <DartType>[],
+ this.optionalParameterTypes = const <DartType>[],
+ this.namedParameters = const <String>[],
+ this.namedParameterTypes = const <DartType>[]]) {
+ assert(invariant(
+ CURRENT_ELEMENT_SPANNABLE, element == null || element.isDeclaration));
// Assert that optional and named parameters are not used at the same time.
assert(optionalParameterTypes.isEmpty || namedParameterTypes.isEmpty);
assert(namedParameters.length == namedParameterTypes.length);
@@ -640,18 +626,19 @@
Types.substTypes(namedParameterTypes, arguments, parameters);
if (!changed &&
(!identical(parameterTypes, newParameterTypes) ||
- !identical(optionalParameterTypes, newOptionalParameterTypes) ||
- !identical(namedParameterTypes, newNamedParameterTypes))) {
+ !identical(optionalParameterTypes, newOptionalParameterTypes) ||
+ !identical(namedParameterTypes, newNamedParameterTypes))) {
changed = true;
}
if (changed) {
// Create a new type only if necessary.
- return new FunctionType.internal(element,
- newReturnType,
- newParameterTypes,
- newOptionalParameterTypes,
- namedParameters,
- newNamedParameterTypes);
+ return new FunctionType.internal(
+ element,
+ newReturnType,
+ newParameterTypes,
+ newOptionalParameterTypes,
+ namedParameters,
+ newNamedParameterTypes);
}
return this;
}
@@ -687,10 +674,10 @@
}
void visitChildren(DartTypeVisitor visitor, var argument) {
- returnType.accept(visitor, argument);
- DartType.visitList(parameterTypes, visitor, argument);
- DartType.visitList(optionalParameterTypes, visitor, argument);
- DartType.visitList(namedParameterTypes, visitor, argument);
+ returnType.accept(visitor, argument);
+ DartType.visitList(parameterTypes, visitor, argument);
+ DartType.visitList(optionalParameterTypes, visitor, argument);
+ DartType.visitList(namedParameterTypes, visitor, argument);
}
String toString() {
@@ -719,7 +706,7 @@
}
sb.write(namedParameterTypes[i]);
sb.write(' ');
- sb.write(namedParameters[i]);
+ sb.write(namedParameters[i]);
first = false;
}
sb.write('}');
@@ -734,23 +721,23 @@
int get hashCode {
int hash = 3 * returnType.hashCode;
- for (DartType parameter in parameterTypes) {
+ for (DartType parameter in parameterTypes) {
hash = 17 * hash + 5 * parameter.hashCode;
}
- for (DartType parameter in optionalParameterTypes) {
+ for (DartType parameter in optionalParameterTypes) {
hash = 19 * hash + 7 * parameter.hashCode;
}
- for (String name in namedParameters) {
+ for (String name in namedParameters) {
hash = 23 * hash + 11 * name.hashCode;
}
- for (DartType parameter in namedParameterTypes) {
+ for (DartType parameter in namedParameterTypes) {
hash = 29 * hash + 13 * parameter.hashCode;
}
return hash;
}
bool operator ==(other) {
- if (other is !FunctionType) return false;
+ if (other is! FunctionType) return false;
return returnType == other.returnType &&
equalElements(parameterTypes, other.parameterTypes) &&
equalElements(optionalParameterTypes, other.optionalParameterTypes) &&
@@ -763,12 +750,11 @@
DartType _unaliased;
TypedefType(TypedefElement element,
- [List<DartType> typeArguments = const <DartType>[]])
+ [List<DartType> typeArguments = const <DartType>[]])
: super(element, typeArguments);
TypedefType.forUserProvidedBadType(TypedefElement element,
- [List<DartType> typeArguments =
- const <DartType>[]])
+ [List<DartType> typeArguments = const <DartType>[]])
: super(element, typeArguments, checkTypeArgumentCount: false);
TypedefElement get element => super.element;
@@ -900,8 +886,7 @@
R visitType(DartType type, A argument);
@override
- R visitVoidType(VoidType type, A argument) =>
- visitType(type, argument);
+ R visitVoidType(VoidType type, A argument) => visitType(type, argument);
@override
R visitTypeVariableType(TypeVariableType type, A argument) =>
@@ -919,8 +904,7 @@
R visitStatementType(StatementType type, A argument) =>
visitType(type, argument);
- R visitGenericType(GenericType type, A argument) =>
- visitType(type, argument);
+ R visitGenericType(GenericType type, A argument) => visitType(type, argument);
@override
R visitInterfaceType(InterfaceType type, A argument) =>
@@ -931,8 +915,7 @@
visitGenericType(type, argument);
@override
- R visitDynamicType(DynamicType type, A argument) =>
- visitType(type, argument);
+ R visitDynamicType(DynamicType type, A argument) => visitType(type, argument);
}
/**
@@ -968,7 +951,6 @@
bool visitMalformedType(MalformedType t, DartType s) => true;
bool visitInterfaceType(InterfaceType t, DartType s) {
-
// TODO(johnniwinther): Currently needed since literal types like int,
// double, bool etc. might not have been resolved yet.
t.element.ensureResolved(resolution);
@@ -997,7 +979,7 @@
if (s == coreTypes.functionType) {
return true;
}
- if (s is !FunctionType) return false;
+ if (s is! FunctionType) return false;
FunctionType tf = t;
FunctionType sf = s;
if (invalidFunctionReturnTypes(tf.returnType, sf.returnType)) {
@@ -1036,7 +1018,7 @@
return false;
}
if (!sf.namedParameters.isEmpty) {
- // We must have [: len(t.p) == len(s.p) :].
+ // We must have [: len(t.p) == len(s.p) :].
if (sNotEmpty) {
return false;
}
@@ -1166,7 +1148,6 @@
* Type visitor that determines the subtype relation two types.
*/
class SubtypeVisitor extends MoreSpecificVisitor {
-
SubtypeVisitor(Resolution resolution) : super(resolution);
bool isSubtype(DartType t, DartType s) {
@@ -1211,10 +1192,8 @@
* substitute for the bound of [typeVariable]. [bound] holds the bound against
* which [typeArgument] should be checked.
*/
-typedef void CheckTypeVariableBound(GenericType type,
- DartType typeArgument,
- TypeVariableType typeVariable,
- DartType bound);
+typedef void CheckTypeVariableBound(GenericType type, DartType typeArgument,
+ TypeVariableType typeVariable, DartType bound);
/// Basic interface for the Dart type system.
abstract class DartTypes {
@@ -1327,8 +1306,8 @@
* declared on [element]. Calls [checkTypeVariableBound] on each type
* argument and bound.
*/
- void checkTypeVariableBounds(GenericType type,
- CheckTypeVariableBound checkTypeVariableBound) {
+ void checkTypeVariableBounds(
+ GenericType type, CheckTypeVariableBound checkTypeVariableBound) {
TypeDeclarationElement element = type.element;
List<DartType> typeArguments = type.typeArguments;
List<DartType> typeVariables = element.typeVariables;
@@ -1348,8 +1327,7 @@
* instead of a newly created list.
*/
static List<DartType> substTypes(List<DartType> types,
- List<DartType> arguments,
- List<DartType> parameters) {
+ List<DartType> arguments, List<DartType> parameters) {
bool changed = false;
List<DartType> result = new List<DartType>.generate(types.length, (index) {
DartType type = types[index];
@@ -1409,9 +1387,7 @@
return 1;
}
bool isDefinedByDeclaration(DartType type) {
- return type.isInterfaceType ||
- type.isTypedef ||
- type.isTypeVariable;
+ return type.isInterfaceType || type.isTypedef || type.isTypeVariable;
}
if (isDefinedByDeclaration(a)) {
@@ -1428,7 +1404,7 @@
return -1;
} else {
return compareList((a as GenericType).typeArguments,
- (b as GenericType).typeArguments);
+ (b as GenericType).typeArguments);
}
}
} else {
@@ -1449,8 +1425,8 @@
if (result != 0) return result;
result = compareList(aFunc.parameterTypes, bFunc.parameterTypes);
if (result != 0) return result;
- result = compareList(aFunc.optionalParameterTypes,
- bFunc.optionalParameterTypes);
+ result = compareList(
+ aFunc.optionalParameterTypes, bFunc.optionalParameterTypes);
if (result != 0) return result;
// TODO(karlklose): reuse [compareList].
Iterator<String> aNames = aFunc.namedParameters.iterator;
@@ -1466,8 +1442,8 @@
// [bNames] is longer that [aNames] => a < b.
return -1;
}
- return compareList(aFunc.namedParameterTypes,
- bFunc.namedParameterTypes);
+ return compareList(
+ aFunc.namedParameterTypes, bFunc.namedParameterTypes);
} else {
// [b] is a malformed or statement type => a < b.
return -1;
@@ -1487,8 +1463,8 @@
// [a] is a malformed type => a < b.
return -1;
}
- assert (a.isMalformed);
- assert (b.isMalformed);
+ assert(a.isMalformed);
+ assert(b.isMalformed);
// TODO(johnniwinther): Can we do this better?
return Elements.compareByPosition(a.element, b.element);
}
@@ -1511,9 +1487,8 @@
}
/// Computes the least upper bound of two interface types [a] and [b].
- InterfaceType computeLeastUpperBoundInterfaces(InterfaceType a,
- InterfaceType b) {
-
+ InterfaceType computeLeastUpperBoundInterfaces(
+ InterfaceType a, InterfaceType b) {
/// Returns the set of supertypes of [type] at depth [depth].
Set<DartType> getSupertypesAtDepth(InterfaceType type, int depth) {
OrderedTypeSet types = type.element.allSupertypesAndSelf;
@@ -1543,8 +1518,8 @@
/// Computes the least upper bound of the types in the longest prefix of [a]
/// and [b].
- List<DartType> computeLeastUpperBoundsTypes(List<DartType> a,
- List<DartType> b) {
+ List<DartType> computeLeastUpperBoundsTypes(
+ List<DartType> a, List<DartType> b) {
if (a.isEmpty || b.isEmpty) return const <DartType>[];
int prefixLength = min(a.length, b.length);
List<DartType> types = new List<DartType>(prefixLength);
@@ -1565,17 +1540,15 @@
/// bound of the longest common prefix of the optional parameters of [a] and
/// [b], and the named parameters are the least upper bound of those common to
/// [a] and [b].
- DartType computeLeastUpperBoundFunctionTypes(FunctionType a,
- FunctionType b) {
+ DartType computeLeastUpperBoundFunctionTypes(FunctionType a, FunctionType b) {
if (a.parameterTypes.length != b.parameterTypes.length) {
return coreTypes.functionType;
}
DartType returnType = computeLeastUpperBound(a.returnType, b.returnType);
List<DartType> parameterTypes =
computeLeastUpperBoundsTypes(a.parameterTypes, b.parameterTypes);
- List<DartType> optionalParameterTypes =
- computeLeastUpperBoundsTypes(a.optionalParameterTypes,
- b.optionalParameterTypes);
+ List<DartType> optionalParameterTypes = computeLeastUpperBoundsTypes(
+ a.optionalParameterTypes, b.optionalParameterTypes);
List<String> namedParameters = <String>[];
List<String> aNamedParameters = a.namedParameters;
List<String> bNamedParameters = b.namedParameters;
@@ -1584,8 +1557,8 @@
List<DartType> bNamedParameterTypes = b.namedParameterTypes;
int aIndex = 0;
int bIndex = 0;
- while (aIndex < aNamedParameters.length &&
- bIndex < bNamedParameters.length) {
+ while (
+ aIndex < aNamedParameters.length && bIndex < bNamedParameters.length) {
String aNamedParameter = aNamedParameters[aIndex];
String bNamedParameter = bNamedParameters[bIndex];
int result = aNamedParameter.compareTo(bNamedParameter);
@@ -1601,18 +1574,15 @@
bIndex++;
}
}
- return new FunctionType.synthesized(
- returnType,
- parameterTypes, optionalParameterTypes,
- namedParameters, namedParameterTypes);
+ return new FunctionType.synthesized(returnType, parameterTypes,
+ optionalParameterTypes, namedParameters, namedParameterTypes);
}
/// Computes the least upper bound of two types of which at least one is a
/// type variable. The least upper bound of a type variable is defined in
/// terms of its bound, but to ensure reflexivity we need to check for common
/// bounds transitively.
- DartType computeLeastUpperBoundTypeVariableTypes(DartType a,
- DartType b) {
+ DartType computeLeastUpperBoundTypeVariableTypes(DartType a, DartType b) {
Set<DartType> typeVariableBounds = new Set<DartType>();
while (a.isTypeVariable) {
if (a == b) return a;
@@ -1688,9 +1658,7 @@
/// unaliasedBound(U) = unaliasedBound(Baz) = ()->dynamic
/// unaliasedBound(X) = unaliasedBound(Y) = `Object`
///
- static DartType computeUnaliasedBound(
- Resolution resolution,
- DartType type) {
+ static DartType computeUnaliasedBound(Resolution resolution, DartType type) {
DartType originalType = type;
while (type.isTypeVariable) {
TypeVariableType variable = type;
@@ -1734,8 +1702,7 @@
/// used to lookup the existence and type of `foo`.
///
static InterfaceType computeInterfaceType(
- Resolution resolution,
- DartType type) {
+ Resolution resolution, DartType type) {
type = computeUnaliasedBound(resolution, type);
if (type.treatAsDynamic) {
return null;
@@ -1783,8 +1750,8 @@
///
/// Note that this computation is a heuristic. It does not find a suggestion
/// in all possible cases.
- InterfaceType computeMoreSpecific(ClassElement element,
- InterfaceType supertype) {
+ InterfaceType computeMoreSpecific(
+ ClassElement element, InterfaceType supertype) {
InterfaceType supertypeInstance =
element.thisType.asInstanceOf(supertype.element);
if (supertypeInstance == null) return null;
@@ -1815,16 +1782,14 @@
}
bool visitTypeVariableType(TypeVariableType type, DartType argument) {
- DartType constraint =
- types.getMostSpecific(constraintMap[type], argument);
+ DartType constraint = types.getMostSpecific(constraintMap[type], argument);
constraintMap[type] = constraint;
return constraint != null;
}
bool visitFunctionType(FunctionType type, DartType argument) {
if (argument is FunctionType) {
- if (type.parameterTypes.length !=
- argument.parameterTypes.length) {
+ if (type.parameterTypes.length != argument.parameterTypes.length) {
return false;
}
if (type.optionalParameterTypes.length !=
@@ -1839,8 +1804,8 @@
if (visitTypes(type.parameterTypes, argument.parameterTypes)) {
return false;
}
- if (visitTypes(type.optionalParameterTypes,
- argument.optionalParameterTypes)) {
+ if (visitTypes(
+ type.optionalParameterTypes, argument.optionalParameterTypes)) {
return false;
}
return visitTypes(type.namedParameterTypes, argument.namedParameterTypes);
@@ -1964,4 +1929,3 @@
sb.write(')');
}
}
-
diff --git a/pkg/compiler/lib/src/deferred_load.dart b/pkg/compiler/lib/src/deferred_load.dart
index 81ffd69..0d377aa 100644
--- a/pkg/compiler/lib/src/deferred_load.dart
+++ b/pkg/compiler/lib/src/deferred_load.dart
@@ -5,63 +5,52 @@
library deferred_load;
import 'common.dart';
-import 'common/backend_api.dart' show
- Backend;
-import 'common/tasks.dart' show
- CompilerTask;
-import 'compiler.dart' show
- Compiler;
-import 'constants/values.dart' show
- ConstantValue,
- ConstructedConstantValue,
- DeferredConstantValue,
- StringConstantValue;
+import 'common/backend_api.dart' show Backend;
+import 'common/tasks.dart' show CompilerTask;
+import 'compiler.dart' show Compiler;
+import 'constants/values.dart'
+ show
+ ConstantValue,
+ ConstructedConstantValue,
+ DeferredConstantValue,
+ StringConstantValue;
import 'dart_types.dart';
-import 'elements/elements.dart' show
- AccessorElement,
- AstElement,
- ClassElement,
- Element,
- ElementKind,
- Elements,
- ExportElement,
- FunctionElement,
- ImportElement,
- LibraryElement,
- LocalFunctionElement,
- MetadataAnnotation,
- PrefixElement,
- ScopeContainerElement,
- TypedefElement;
-import 'js_backend/js_backend.dart' show
- JavaScriptBackend;
-import 'resolution/resolution.dart' show
- AnalyzableElementX;
-import 'resolution/tree_elements.dart' show
- TreeElements;
+import 'elements/elements.dart'
+ show
+ AccessorElement,
+ AstElement,
+ ClassElement,
+ Element,
+ ElementKind,
+ Elements,
+ ExportElement,
+ FunctionElement,
+ ImportElement,
+ LibraryElement,
+ LocalFunctionElement,
+ MetadataAnnotation,
+ PrefixElement,
+ ScopeContainerElement,
+ TypedefElement;
+import 'js_backend/js_backend.dart' show JavaScriptBackend;
+import 'resolution/resolution.dart' show AnalyzableElementX;
+import 'resolution/tree_elements.dart' show TreeElements;
import 'tree/tree.dart' as ast;
-import 'tree/tree.dart' show
- Import,
- LibraryTag,
- LibraryDependency,
- LiteralDartString,
- LiteralString,
- NewExpression,
- Node;
-import 'universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse,
- TypeUseKind;
-import 'universe/world_impact.dart' show
- ImpactUseCase,
- WorldImpact,
- WorldImpactVisitorImpl;
-import 'util/setlet.dart' show
- Setlet;
+import 'tree/tree.dart'
+ show
+ Import,
+ LibraryTag,
+ LibraryDependency,
+ LiteralDartString,
+ LiteralString,
+ NewExpression,
+ Node;
+import 'universe/use.dart' show DynamicUse, StaticUse, TypeUse, TypeUseKind;
+import 'universe/world_impact.dart'
+ show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
+import 'util/setlet.dart' show Setlet;
import 'util/uri_extras.dart' as uri_extras;
-import 'util/util.dart' show
- Link, makeUnique;
+import 'util/util.dart' show Link, makeUnique;
/// A "hunk" of the program that will be loaded whenever one of its [imports]
/// are loaded.
@@ -88,7 +77,7 @@
String toString() => "OutputUnit($name)";
- bool operator==(OutputUnit other) {
+ bool operator ==(OutputUnit other) {
return imports.length == other.imports.length &&
imports.containsAll(other.imports);
}
@@ -96,7 +85,7 @@
int get hashCode {
int sum = 0;
for (_DeferredImport import in imports) {
- sum = (sum + import.hashCode) & 0x3FFFFFFF; // Stay in 30 bit range.
+ sum = (sum + import.hashCode) & 0x3FFFFFFF; // Stay in 30 bit range.
}
return sum;
}
@@ -229,8 +218,8 @@
return outputUnitTo.imports.containsAll(outputUnitFrom.imports);
}
- void registerConstantDeferredUse(DeferredConstantValue constant,
- PrefixElement prefix) {
+ void registerConstantDeferredUse(
+ DeferredConstantValue constant, PrefixElement prefix) {
OutputUnit outputUnit = new OutputUnit();
outputUnit.imports.add(new _DeclaredDeferredImport(prefix.deferredImport));
_constantToOutputUnit[constant] = outputUnit;
@@ -265,12 +254,8 @@
/// (not the transitive closure.)
///
/// Adds the results to [elements] and [constants].
- void _collectAllElementsAndConstantsResolvedFrom(
- Element element,
- Set<Element> elements,
- Set<ConstantValue> constants,
- isMirrorUsage) {
-
+ void _collectAllElementsAndConstantsResolvedFrom(Element element,
+ Set<Element> elements, Set<ConstantValue> constants, isMirrorUsage) {
if (element.isMalformed) {
// Malformed elements are ignored.
return;
@@ -327,32 +312,30 @@
compiler.impactStrategy.visitImpact(
analyzableElement,
worldImpact,
- new WorldImpactVisitorImpl(
- visitStaticUse: (StaticUse staticUse) {
- elements.add(staticUse.element);
- },
- visitTypeUse: (TypeUse typeUse) {
- DartType type = typeUse.type;
- switch (typeUse.kind) {
- case TypeUseKind.TYPE_LITERAL:
- if (type.isTypedef || type.isInterfaceType) {
- elements.add(type.element);
- }
- break;
- case TypeUseKind.INSTANTIATION:
- case TypeUseKind.IS_CHECK:
- case TypeUseKind.AS_CAST:
- case TypeUseKind.CATCH_TYPE:
- collectTypeDependencies(type);
- break;
- case TypeUseKind.CHECKED_MODE_CHECK:
- if (compiler.options.enableTypeAssertions) {
- collectTypeDependencies(type);
- }
- break;
+ new WorldImpactVisitorImpl(visitStaticUse: (StaticUse staticUse) {
+ elements.add(staticUse.element);
+ }, visitTypeUse: (TypeUse typeUse) {
+ DartType type = typeUse.type;
+ switch (typeUse.kind) {
+ case TypeUseKind.TYPE_LITERAL:
+ if (type.isTypedef || type.isInterfaceType) {
+ elements.add(type.element);
}
- }),
- IMPACT_USE);
+ break;
+ case TypeUseKind.INSTANTIATION:
+ case TypeUseKind.IS_CHECK:
+ case TypeUseKind.AS_CAST:
+ case TypeUseKind.CATCH_TYPE:
+ collectTypeDependencies(type);
+ break;
+ case TypeUseKind.CHECKED_MODE_CHECK:
+ if (compiler.options.enableTypeAssertions) {
+ collectTypeDependencies(type);
+ }
+ break;
+ }
+ }),
+ IMPACT_USE);
TreeElements treeElements = analyzableElement.resolvedAst.elements;
assert(treeElements != null);
@@ -403,8 +386,7 @@
elements.add(type.element.implementation);
}
elements.add(cls.implementation);
- } else if (Elements.isStaticOrTopLevel(element) ||
- element.isConstructor) {
+ } else if (Elements.isStaticOrTopLevel(element) || element.isConstructor) {
elements.add(element);
collectDependencies(element);
}
@@ -412,8 +394,7 @@
// When instantiating a class, we record a reference to the
// constructor, not the class itself. We must add all the
// instance members of the constructor's class.
- ClassElement implementation =
- element.enclosingClass.implementation;
+ ClassElement implementation = element.enclosingClass.implementation;
_collectAllElementsAndConstantsResolvedFrom(
implementation, elements, constants, isMirrorUsage);
}
@@ -457,10 +438,10 @@
}
/// Add all dependencies of [constant] to the mapping of [import].
- void _mapConstantDependencies(ConstantValue constant,
- _DeferredImport import) {
- Set<ConstantValue> constants = _constantsDeferredBy.putIfAbsent(import,
- () => new Set<ConstantValue>());
+ void _mapConstantDependencies(
+ ConstantValue constant, _DeferredImport import) {
+ Set<ConstantValue> constants = _constantsDeferredBy.putIfAbsent(
+ import, () => new Set<ConstantValue>());
if (constants.contains(constant)) return;
constants.add(constant);
if (constant is ConstructedConstantValue) {
@@ -475,13 +456,10 @@
/// or [constant], mapping deferred imports to each dependency it needs in the
/// sets [_importedDeferredBy] and [_constantsDeferredBy].
/// Only one of [element] and [constant] should be given.
- void _mapDependencies({Element element,
- _DeferredImport import,
- isMirrorUsage: false}) {
-
- Set<Element> elements = _importedDeferredBy.putIfAbsent(import,
- () => new Set<Element>());
-
+ void _mapDependencies(
+ {Element element, _DeferredImport import, isMirrorUsage: false}) {
+ Set<Element> elements =
+ _importedDeferredBy.putIfAbsent(import, () => new Set<Element>());
Set<Element> dependentElements = new Set<Element>();
Set<ConstantValue> dependentConstants = new Set<ConstantValue>();
@@ -497,7 +475,6 @@
if (import != _fakeMainImport && _mainElements.contains(element)) return;
elements.add(element);
-
// This call can modify [dependentElements] and [dependentConstants].
_collectAllElementsAndConstantsResolvedFrom(
element, dependentElements, dependentConstants, isMirrorUsage);
@@ -508,7 +485,8 @@
for (Element dependency in dependentElements) {
if (_isExplicitlyDeferred(dependency, library)) {
for (ImportElement deferredImport in _getImports(dependency, library)) {
- _mapDependencies(element: dependency,
+ _mapDependencies(
+ element: dependency,
import: new _DeclaredDeferredImport(deferredImport));
}
} else {
@@ -530,8 +508,8 @@
///
/// The elements are added with [_mapDependencies].
void _addMirrorElements() {
- void mapDependenciesIfResolved(Element element,
- _DeferredImport deferredImport) {
+ void mapDependenciesIfResolved(
+ Element element, _DeferredImport deferredImport) {
// If an element is the target of a MirrorsUsed annotation but never used
// It will not be resolved, and we should not call isNeededForReflection.
// TODO(sigurdm): Unresolved elements should just answer false when
@@ -568,8 +546,8 @@
for (_DeferredImport deferredImport in _allDeferredImports.keys) {
LibraryElement deferredLibrary = _allDeferredImports[deferredImport];
- for (LibraryElement library in
- _nonDeferredReachableLibraries(deferredLibrary)) {
+ for (LibraryElement library
+ in _nonDeferredReachableLibraries(deferredLibrary)) {
handleLibrary(library, deferredImport);
}
}
@@ -642,7 +620,6 @@
_importedDeferredBy[_fakeMainImport] = _mainElements;
measureElement(mainLibrary, () {
-
// Starting from main, traverse the program and find all dependencies.
_mapDependencies(element: compiler.mainFunction, import: _fakeMainImport);
@@ -676,7 +653,8 @@
} else {
elementToOutputUnitBuilder
.putIfAbsent(element, () => new OutputUnit())
- .imports.add(import);
+ .imports
+ .add(import);
}
}
}
@@ -689,7 +667,8 @@
} else {
constantToOutputUnitBuilder
.putIfAbsent(constant, () => new OutputUnit())
- .imports.add(import);
+ .imports
+ .add(import);
}
}
}
@@ -700,8 +679,8 @@
// Find all the output units elements/constants have been mapped to, and
// canonicalize them.
- elementToOutputUnitBuilder.forEach(
- (Element element, OutputUnit outputUnit) {
+ elementToOutputUnitBuilder
+ .forEach((Element element, OutputUnit outputUnit) {
OutputUnit representative = allOutputUnits.lookup(outputUnit);
if (representative == null) {
representative = outputUnit;
@@ -709,8 +688,8 @@
}
_elementToOutputUnit[element] = representative;
});
- constantToOutputUnitBuilder.forEach(
- (ConstantValue constant, OutputUnit outputUnit) {
+ constantToOutputUnitBuilder
+ .forEach((ConstantValue constant, OutputUnit outputUnit) {
OutputUnit representative = allOutputUnits.lookup(outputUnit);
if (representative == null) {
representative = outputUnit;
@@ -768,15 +747,13 @@
compiler.constants.getConstantValue(metadata.constant);
Element element = value.getType(compiler.coreTypes).element;
if (element == deferredLibraryClass) {
- reporter.reportErrorMessage(
- import, MessageKind.DEFERRED_OLD_SYNTAX);
+ reporter.reportErrorMessage(
+ import, MessageKind.DEFERRED_OLD_SYNTAX);
}
}
}
- String prefix = (import.prefix != null)
- ? import.prefix.name
- : null;
+ String prefix = (import.prefix != null) ? import.prefix.name : null;
// The last import we saw with the same prefix.
ImportElement previousDeferredImport = prefixDeferredImport[prefix];
if (import.isDeferred) {
@@ -786,8 +763,7 @@
if (prefix == null) {
reporter.reportErrorMessage(
- import,
- MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX);
+ import, MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX);
} else {
prefixDeferredImport[prefix] = import;
_deferredImportDescriptions[key] =
@@ -802,8 +778,7 @@
ImportElement failingImport = (previousDeferredImport != null)
? previousDeferredImport
: import;
- reporter.reportErrorMessage(
- failingImport.prefix,
+ reporter.reportErrorMessage(failingImport.prefix,
MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX);
}
usedPrefixes.add(prefix);
@@ -813,7 +788,7 @@
}
if (isProgramSplit) {
isProgramSplit = compiler.backend.enableDeferredLoadingIfSupported(
- lastDeferred, compiler.globalDependencies);
+ lastDeferred, compiler.globalDependencies);
}
}
@@ -893,15 +868,17 @@
_deferredImportDescriptions.keys.forEach((_DeferredImport import) {
List<OutputUnit> outputUnits = hunksToLoad[importDeferName[import]];
ImportDescription description = _deferredImportDescriptions[import];
- Map<String, dynamic> libraryMap =
- mapping.putIfAbsent(description.importingUri,
- () => <String, dynamic>{"name": description.importingLibraryName,
- "imports": <String, List<String>>{}});
+ Map<String, dynamic> libraryMap = mapping.putIfAbsent(
+ description.importingUri,
+ () => <String, dynamic>{
+ "name": description.importingLibraryName,
+ "imports": <String, List<String>>{}
+ });
- libraryMap["imports"][importDeferName[import]] = outputUnits.map(
- (OutputUnit outputUnit) {
- return backend.deferredPartFileName(outputUnit.name);
- }).toList();
+ libraryMap["imports"][importDeferName[import]] =
+ outputUnits.map((OutputUnit outputUnit) {
+ return backend.deferredPartFileName(outputUnit.name);
+ }).toList();
});
return mapping;
}
@@ -909,13 +886,13 @@
/// Creates a textual representation of the output unit content.
String dump() {
Map<OutputUnit, List<String>> elementMap = <OutputUnit, List<String>>{};
- Map<OutputUnit, List<String>> constantMap =
- <OutputUnit, List<String>>{};
+ Map<OutputUnit, List<String>> constantMap = <OutputUnit, List<String>>{};
_elementToOutputUnit.forEach((Element element, OutputUnit output) {
elementMap.putIfAbsent(output, () => <String>[]).add('$element');
});
_constantToOutputUnit.forEach((ConstantValue value, OutputUnit output) {
- constantMap.putIfAbsent(output, () => <String>[])
+ constantMap
+ .putIfAbsent(output, () => <String>[])
.add(value.toStructuredString());
});
@@ -939,28 +916,27 @@
}
return sb.toString();
}
-
}
class ImportDescription {
/// Relative uri to the importing library.
final String importingUri;
+
/// The prefix this import is imported as.
final String prefix;
final LibraryElement _importingLibrary;
- ImportDescription(ImportElement import,
- LibraryElement importingLibrary,
- Compiler compiler)
- : importingUri = uri_extras.relativize(
- compiler.mainApp.canonicalUri,
- importingLibrary.canonicalUri, false),
+ ImportDescription(
+ ImportElement import, LibraryElement importingLibrary, Compiler compiler)
+ : importingUri = uri_extras.relativize(compiler.mainApp.canonicalUri,
+ importingLibrary.canonicalUri, false),
prefix = import.prefix.name,
_importingLibrary = importingLibrary;
String get importingLibraryName {
return _importingLibrary.hasLibraryName
- ? _importingLibrary.libraryName : "<unnamed>";
+ ? _importingLibrary.libraryName
+ : "<unnamed>";
}
}
diff --git a/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart b/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
index bd57506..3cb959f 100644
--- a/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
+++ b/pkg/compiler/lib/src/diagnostics/diagnostic_listener.dart
@@ -4,14 +4,10 @@
library dart2js.diagnostic_listener;
-import '../options.dart' show
- DiagnosticOptions;
-import 'source_span.dart' show
- SourceSpan;
-import 'spannable.dart' show
- Spannable;
-import '../elements/elements.dart' show
- Element;
+import '../options.dart' show DiagnosticOptions;
+import 'source_span.dart' show SourceSpan;
+import 'spannable.dart' show Spannable;
+import '../elements/elements.dart' show Element;
import 'messages.dart';
// TODO(johnniwinther): Rename and cleanup this interface. Add severity enum.
@@ -30,51 +26,39 @@
/// element.
SourceSpan spanFromSpannable(Spannable node);
- void reportErrorMessage(
- Spannable spannable,
- MessageKind messageKind,
+ void reportErrorMessage(Spannable spannable, MessageKind messageKind,
[Map arguments = const {}]) {
reportError(createMessage(spannable, messageKind, arguments));
}
- void reportError(
- DiagnosticMessage message,
+ void reportError(DiagnosticMessage message,
[List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]);
- void reportWarningMessage(
- Spannable spannable,
- MessageKind messageKind,
+ void reportWarningMessage(Spannable spannable, MessageKind messageKind,
[Map arguments = const {}]) {
reportWarning(createMessage(spannable, messageKind, arguments));
}
- void reportWarning(
- DiagnosticMessage message,
+ void reportWarning(DiagnosticMessage message,
[List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]);
- void reportHintMessage(
- Spannable spannable,
- MessageKind messageKind,
+ void reportHintMessage(Spannable spannable, MessageKind messageKind,
[Map arguments = const {}]) {
reportHint(createMessage(spannable, messageKind, arguments));
}
- void reportHint(
- DiagnosticMessage message,
+ void reportHint(DiagnosticMessage message,
[List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]);
-
@deprecated
void reportInfo(Spannable node, MessageKind errorCode,
- [Map arguments = const {}]);
+ [Map arguments = const {}]);
/// Set current element of this reporter to [element]. This is used for
/// creating [SourceSpan] in [spanFromSpannable].
withCurrentElement(Element element, f());
- DiagnosticMessage createMessage(
- Spannable spannable,
- MessageKind messageKind,
+ DiagnosticMessage createMessage(Spannable spannable, MessageKind messageKind,
[Map arguments = const {}]);
}
@@ -84,4 +68,4 @@
final Message message;
DiagnosticMessage(this.sourceSpan, this.spannable, this.message);
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/diagnostics/invariant.dart b/pkg/compiler/lib/src/diagnostics/invariant.dart
index 349d89b..7ad6f35 100644
--- a/pkg/compiler/lib/src/diagnostics/invariant.dart
+++ b/pkg/compiler/lib/src/diagnostics/invariant.dart
@@ -46,7 +46,7 @@
throw new SpannableAssertionFailure(CURRENT_ELEMENT_SPANNABLE,
"Spannable was null for invariant. Use CURRENT_ELEMENT_SPANNABLE.");
}
- if (condition is Function){
+ if (condition is Function) {
condition = condition();
if (condition is String) {
message = condition;
diff --git a/pkg/compiler/lib/src/diagnostics/messages.dart b/pkg/compiler/lib/src/diagnostics/messages.dart
index d18628c..f442dd1 100644
--- a/pkg/compiler/lib/src/diagnostics/messages.dart
+++ b/pkg/compiler/lib/src/diagnostics/messages.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-
/**
* The messages in this file should meet the following guide lines:
*
@@ -63,14 +62,10 @@
library dart2js.messages;
-import '../tokens/token.dart' show
- ErrorToken,
- Token;
+import '../tokens/token.dart' show ErrorToken, Token;
-import 'invariant.dart' show
- invariant;
-import 'spannable.dart' show
- CURRENT_ELEMENT_SPANNABLE;
+import 'invariant.dart' show invariant;
+import 'spannable.dart' show CURRENT_ELEMENT_SPANNABLE;
import 'generated/shared_messages.dart' as shared_messages;
@@ -498,155 +493,150 @@
/// Additional options needed for the examples to work.
final List<String> options;
- const MessageTemplate(
- this.kind,
- this.template,
- {this.howToFix,
- this.examples,
- this.options: const <String>[]});
+ const MessageTemplate(this.kind, this.template,
+ {this.howToFix, this.examples, this.options: const <String>[]});
/// All templates used by the compiler.
///
/// The map is complete mapping from [MessageKind] to their corresponding
/// [MessageTemplate].
// The key type is a union of MessageKind and SharedMessageKind.
- static final Map<dynamic, MessageTemplate> TEMPLATES =
- <dynamic, MessageTemplate>{}
+ static final Map<dynamic, MessageTemplate> TEMPLATES = <dynamic,
+ MessageTemplate>{}
..addAll(shared_messages.TEMPLATES)
- ..addAll(const<MessageKind, MessageTemplate>{
+ ..addAll(const <MessageKind, MessageTemplate>{
/// Do not use this. It is here for legacy and debugging. It violates item
/// 4 of the guide lines for error messages in the beginning of the file.
MessageKind.GENERIC:
- const MessageTemplate(MessageKind.GENERIC, '#{text}'),
+ const MessageTemplate(MessageKind.GENERIC, '#{text}'),
- MessageKind.VOID_EXPRESSION:
- const MessageTemplate(MessageKind.VOID_EXPRESSION,
- "Expression does not yield a value."),
+ MessageKind.VOID_EXPRESSION: const MessageTemplate(
+ MessageKind.VOID_EXPRESSION, "Expression does not yield a value."),
- MessageKind.VOID_VARIABLE:
- const MessageTemplate(MessageKind.VOID_VARIABLE,
- "Variable cannot be of type void."),
+ MessageKind.VOID_VARIABLE: const MessageTemplate(
+ MessageKind.VOID_VARIABLE, "Variable cannot be of type void."),
- MessageKind.RETURN_VALUE_IN_VOID:
- const MessageTemplate(MessageKind.RETURN_VALUE_IN_VOID,
+ MessageKind.RETURN_VALUE_IN_VOID: const MessageTemplate(
+ MessageKind.RETURN_VALUE_IN_VOID,
"Cannot return value from void function."),
- MessageKind.RETURN_NOTHING:
- const MessageTemplate(MessageKind.RETURN_NOTHING,
+ MessageKind.RETURN_NOTHING: const MessageTemplate(
+ MessageKind.RETURN_NOTHING,
"Value of type '#{returnType}' expected."),
- MessageKind.MISSING_ARGUMENT:
- const MessageTemplate(MessageKind.MISSING_ARGUMENT,
+ MessageKind.MISSING_ARGUMENT: const MessageTemplate(
+ MessageKind.MISSING_ARGUMENT,
"Missing argument of type '#{argumentType}'."),
- MessageKind.ADDITIONAL_ARGUMENT:
- const MessageTemplate(MessageKind.ADDITIONAL_ARGUMENT,
- "Additional argument."),
+ MessageKind.ADDITIONAL_ARGUMENT: const MessageTemplate(
+ MessageKind.ADDITIONAL_ARGUMENT, "Additional argument."),
- MessageKind.NAMED_ARGUMENT_NOT_FOUND:
- const MessageTemplate(MessageKind.NAMED_ARGUMENT_NOT_FOUND,
+ MessageKind.NAMED_ARGUMENT_NOT_FOUND: const MessageTemplate(
+ MessageKind.NAMED_ARGUMENT_NOT_FOUND,
"No named argument '#{argumentName}' found on method."),
- MessageKind.AWAIT_MEMBER_NOT_FOUND:
- const MessageTemplate(MessageKind.AWAIT_MEMBER_NOT_FOUND,
+ MessageKind.AWAIT_MEMBER_NOT_FOUND: const MessageTemplate(
+ MessageKind.AWAIT_MEMBER_NOT_FOUND,
"No member named 'await' in class '#{className}'.",
howToFix: "Did you mean to add the 'async' marker "
- "to '#{functionName}'?",
- examples: const ["""
+ "to '#{functionName}'?",
+ examples: const [
+ """
class A {
m() => await -3;
}
main() => new A().m();
-"""]),
+"""
+ ]),
- MessageKind.AWAIT_MEMBER_NOT_FOUND_IN_CLOSURE:
- const MessageTemplate(MessageKind.AWAIT_MEMBER_NOT_FOUND_IN_CLOSURE,
+ MessageKind.AWAIT_MEMBER_NOT_FOUND_IN_CLOSURE: const MessageTemplate(
+ MessageKind.AWAIT_MEMBER_NOT_FOUND_IN_CLOSURE,
"No member named 'await' in class '#{className}'.",
howToFix: "Did you mean to add the 'async' marker "
- "to the enclosing function?",
- examples: const ["""
+ "to the enclosing function?",
+ examples: const [
+ """
class A {
m() => () => await -3;
}
main() => new A().m();
-"""]),
+"""
+ ]),
- MessageKind.NOT_CALLABLE:
- const MessageTemplate(MessageKind.NOT_CALLABLE,
- "'#{elementName}' is not callable."),
+ MessageKind.NOT_CALLABLE: const MessageTemplate(
+ MessageKind.NOT_CALLABLE, "'#{elementName}' is not callable."),
- MessageKind.MEMBER_NOT_STATIC:
- const MessageTemplate(MessageKind.MEMBER_NOT_STATIC,
+ MessageKind.MEMBER_NOT_STATIC: const MessageTemplate(
+ MessageKind.MEMBER_NOT_STATIC,
"'#{className}.#{memberName}' is not static."),
- MessageKind.NO_INSTANCE_AVAILABLE:
- const MessageTemplate(MessageKind.NO_INSTANCE_AVAILABLE,
+ MessageKind.NO_INSTANCE_AVAILABLE: const MessageTemplate(
+ MessageKind.NO_INSTANCE_AVAILABLE,
"'#{name}' is only available in instance methods."),
- MessageKind.NO_THIS_AVAILABLE:
- const MessageTemplate(MessageKind.NO_THIS_AVAILABLE,
+ MessageKind.NO_THIS_AVAILABLE: const MessageTemplate(
+ MessageKind.NO_THIS_AVAILABLE,
"'this' is only available in instance methods."),
- MessageKind.PRIVATE_ACCESS:
- const MessageTemplate(MessageKind.PRIVATE_ACCESS,
+ MessageKind.PRIVATE_ACCESS: const MessageTemplate(
+ MessageKind.PRIVATE_ACCESS,
"'#{name}' is declared private within library "
"'#{libraryName}'."),
- MessageKind.THIS_IS_THE_DECLARATION:
- const MessageTemplate(MessageKind.THIS_IS_THE_DECLARATION,
+ MessageKind.THIS_IS_THE_DECLARATION: const MessageTemplate(
+ MessageKind.THIS_IS_THE_DECLARATION,
"This is the declaration of '#{name}'."),
- MessageKind.THIS_IS_THE_METHOD:
- const MessageTemplate(MessageKind.THIS_IS_THE_METHOD,
- "This is the method declaration."),
+ MessageKind.THIS_IS_THE_METHOD: const MessageTemplate(
+ MessageKind.THIS_IS_THE_METHOD, "This is the method declaration."),
- MessageKind.CANNOT_RESOLVE:
- const MessageTemplate(MessageKind.CANNOT_RESOLVE,
- "Cannot resolve '#{name}'."),
+ MessageKind.CANNOT_RESOLVE: const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE, "Cannot resolve '#{name}'."),
- MessageKind.CANNOT_RESOLVE_AWAIT:
- const MessageTemplate(MessageKind.CANNOT_RESOLVE_AWAIT,
- "Cannot resolve '#{name}'.",
+ MessageKind.CANNOT_RESOLVE_AWAIT: const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE_AWAIT, "Cannot resolve '#{name}'.",
howToFix: "Did you mean to add the 'async' marker "
- "to '#{functionName}'?",
+ "to '#{functionName}'?",
examples: const [
- "main() => await -3;",
- "foo() => await -3; main() => foo();"
+ "main() => await -3;",
+ "foo() => await -3; main() => foo();"
]),
- MessageKind.CANNOT_RESOLVE_AWAIT_IN_CLOSURE:
- const MessageTemplate(MessageKind.CANNOT_RESOLVE_AWAIT_IN_CLOSURE,
+ MessageKind.CANNOT_RESOLVE_AWAIT_IN_CLOSURE: const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE_AWAIT_IN_CLOSURE,
"Cannot resolve '#{name}'.",
howToFix: "Did you mean to add the 'async' marker "
- "to the enclosing function?",
- examples: const [
- "main() { (() => await -3)(); }",
- ]),
+ "to the enclosing function?",
+ examples: const ["main() { (() => await -3)(); }",]),
- MessageKind.CANNOT_RESOLVE_IN_INITIALIZER:
- const MessageTemplate(MessageKind.CANNOT_RESOLVE_IN_INITIALIZER,
+ MessageKind.CANNOT_RESOLVE_IN_INITIALIZER: const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE_IN_INITIALIZER,
"Cannot resolve '#{name}'. It would be implicitly looked up on this "
"instance, but instances are not available in initializers.",
howToFix: "Try correcting the unresolved reference or move the "
"initialization to a constructor body.",
- examples: const ["""
+ examples: const [
+ """
class A {
var test = unresolvedName;
}
main() => new A();
-"""]),
+"""
+ ]),
- MessageKind.CANNOT_RESOLVE_CONSTRUCTOR:
- const MessageTemplate(MessageKind.CANNOT_RESOLVE_CONSTRUCTOR,
+ MessageKind.CANNOT_RESOLVE_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE_CONSTRUCTOR,
"Cannot resolve constructor '#{constructorName}'."),
MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT:
- const MessageTemplate(
- MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT,
- "cannot resolve constructor '#{constructorName}' "
- "for implicit super call.",
- howToFix: "Try explicitly invoking a constructor of the super class",
- examples: const ["""
+ const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT,
+ "cannot resolve constructor '#{constructorName}' "
+ "for implicit super call.",
+ howToFix:
+ "Try explicitly invoking a constructor of the super class",
+ examples: const [
+ """
class A {
A.foo() {}
}
@@ -654,25 +644,27 @@
B();
}
main() => new B();
-"""]),
+"""
+ ]),
- MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME:
- const MessageTemplate(MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME,
+ MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME: const MessageTemplate(
+ MessageKind.INVALID_UNNAMED_CONSTRUCTOR_NAME,
"Unnamed constructor name must be '#{name}'."),
- MessageKind.INVALID_CONSTRUCTOR_NAME:
- const MessageTemplate(MessageKind.INVALID_CONSTRUCTOR_NAME,
+ MessageKind.INVALID_CONSTRUCTOR_NAME: const MessageTemplate(
+ MessageKind.INVALID_CONSTRUCTOR_NAME,
"Constructor name must start with '#{name}'."),
- MessageKind.CANNOT_RESOLVE_TYPE:
- const MessageTemplate(MessageKind.CANNOT_RESOLVE_TYPE,
+ MessageKind.CANNOT_RESOLVE_TYPE: const MessageTemplate(
+ MessageKind.CANNOT_RESOLVE_TYPE,
"Cannot resolve type '#{typeName}'."),
- MessageKind.DUPLICATE_DEFINITION:
- const MessageTemplate(MessageKind.DUPLICATE_DEFINITION,
+ MessageKind.DUPLICATE_DEFINITION: const MessageTemplate(
+ MessageKind.DUPLICATE_DEFINITION,
"Duplicate definition of '#{name}'.",
howToFix: "Try to rename or remove this definition.",
- examples: const ["""
+ examples: const [
+ """
class C {
void f() {}
int get f => 1;
@@ -682,127 +674,106 @@
new C();
}
-"""]),
+"""
+ ]),
- MessageKind.EXISTING_DEFINITION:
- const MessageTemplate(MessageKind.EXISTING_DEFINITION,
- "Existing definition of '#{name}'."),
+ MessageKind.EXISTING_DEFINITION: const MessageTemplate(
+ MessageKind.EXISTING_DEFINITION, "Existing definition of '#{name}'."),
- MessageKind.DUPLICATE_IMPORT:
- const MessageTemplate(MessageKind.DUPLICATE_IMPORT,
- "Duplicate import of '#{name}'."),
+ MessageKind.DUPLICATE_IMPORT: const MessageTemplate(
+ MessageKind.DUPLICATE_IMPORT, "Duplicate import of '#{name}'."),
- MessageKind.HIDDEN_IMPORT:
- const MessageTemplate(MessageKind.HIDDEN_IMPORT,
+ MessageKind.HIDDEN_IMPORT: const MessageTemplate(
+ MessageKind.HIDDEN_IMPORT,
"'#{name}' from library '#{hiddenUri}' is hidden by '#{name}' "
"from library '#{hidingUri}'.",
howToFix:
- "Try adding 'hide #{name}' to the import of '#{hiddenUri}'.",
+ "Try adding 'hide #{name}' to the import of '#{hiddenUri}'.",
examples: const [
- const {
-'main.dart':
-"""
+ const {
+ 'main.dart': """
import 'dart:async'; // This imports a class Future.
import 'future.dart';
void main() => new Future();""",
-
-'future.dart':
-"""
+ 'future.dart': """
library future;
-class Future {}"""},
-
- const {
-'main.dart':
-"""
+class Future {}"""
+ },
+ const {
+ 'main.dart': """
import 'future.dart';
import 'dart:async'; // This imports a class Future.
void main() => new Future();""",
-
-'future.dart':
-"""
+ 'future.dart': """
library future;
-class Future {}"""},
-
- const {
-'main.dart':
-"""
+class Future {}"""
+ },
+ const {
+ 'main.dart': """
import 'export.dart';
import 'dart:async'; // This imports a class Future.
void main() => new Future();""",
-
-'future.dart':
-"""
+ 'future.dart': """
library future;
class Future {}""",
-
-'export.dart':
-"""
+ 'export.dart': """
library export;
-export 'future.dart';"""},
-
- const {
-'main.dart':
-"""
+export 'future.dart';"""
+ },
+ const {
+ 'main.dart': """
import 'future.dart' as prefix;
import 'dart:async' as prefix; // This imports a class Future.
void main() => new prefix.Future();""",
-
-'future.dart':
-"""
+ 'future.dart': """
library future;
-class Future {}"""}]),
+class Future {}"""
+ }
+ ]),
-
- MessageKind.HIDDEN_IMPLICIT_IMPORT:
- const MessageTemplate(MessageKind.HIDDEN_IMPLICIT_IMPORT,
+ MessageKind.HIDDEN_IMPLICIT_IMPORT: const MessageTemplate(
+ MessageKind.HIDDEN_IMPLICIT_IMPORT,
"'#{name}' from library '#{hiddenUri}' is hidden by '#{name}' "
"from library '#{hidingUri}'.",
howToFix: "Try adding an explicit "
- "'import \"#{hiddenUri}\" hide #{name}'.",
+ "'import \"#{hiddenUri}\" hide #{name}'.",
examples: const [
- const {
-'main.dart':
-"""
+ const {
+ 'main.dart': """
// This hides the implicit import of class Type from dart:core.
import 'type.dart';
void main() => new Type();""",
-
-'type.dart':
-"""
+ 'type.dart': """
library type;
-class Type {}"""},
- const {
-'conflictsWithDart.dart':
-"""
+class Type {}"""
+ },
+ const {
+ 'conflictsWithDart.dart': """
library conflictsWithDart;
class Duration {
static var x = 100;
}
""",
-
-'conflictsWithDartAsWell.dart':
-"""
+ 'conflictsWithDartAsWell.dart': """
library conflictsWithDartAsWell;
class Duration {
static var x = 100;
}
""",
-
-'main.dart':
-r"""
+ 'main.dart': r"""
library testDartConflicts;
import 'conflictsWithDart.dart';
@@ -811,166 +782,169 @@
main() {
print("Hail Caesar ${Duration.x}");
}
-"""}]),
+"""
+ }
+ ]),
- MessageKind.DUPLICATE_EXPORT:
- const MessageTemplate(MessageKind.DUPLICATE_EXPORT,
- "Duplicate export of '#{name}'.",
+ MessageKind.DUPLICATE_EXPORT: const MessageTemplate(
+ MessageKind.DUPLICATE_EXPORT, "Duplicate export of '#{name}'.",
howToFix: "Try adding 'hide #{name}' to one of the exports.",
- examples: const [const {
-'main.dart': """
+ examples: const [
+ const {
+ 'main.dart': """
export 'decl1.dart';
export 'decl2.dart';
main() {}""",
-'decl1.dart': "class Class {}",
-'decl2.dart': "class Class {}"}]),
+ 'decl1.dart': "class Class {}",
+ 'decl2.dart': "class Class {}"
+ }
+ ]),
- MessageKind.DUPLICATE_EXPORT_CONT:
- const MessageTemplate(MessageKind.DUPLICATE_EXPORT_CONT,
+ MessageKind.DUPLICATE_EXPORT_CONT: const MessageTemplate(
+ MessageKind.DUPLICATE_EXPORT_CONT,
"This is another export of '#{name}'."),
- MessageKind.DUPLICATE_EXPORT_DECL:
- const MessageTemplate(MessageKind.DUPLICATE_EXPORT_DECL,
+ MessageKind.DUPLICATE_EXPORT_DECL: const MessageTemplate(
+ MessageKind.DUPLICATE_EXPORT_DECL,
"The exported '#{name}' from export #{uriString} is defined here."),
- MessageKind.EMPTY_HIDE:
- const MessageTemplate(MessageKind.EMPTY_HIDE,
- "Library '#{uri}' doesn't export a '#{name}' declaration.",
- howToFix: "Try removing '#{name}' the 'hide' clause.",
- examples: const [
- const {
- 'main.dart': """
+ MessageKind.EMPTY_HIDE: const MessageTemplate(MessageKind.EMPTY_HIDE,
+ "Library '#{uri}' doesn't export a '#{name}' declaration.",
+ howToFix: "Try removing '#{name}' the 'hide' clause.",
+ examples: const [
+ const {
+ 'main.dart': """
import 'dart:core' hide Foo;
-main() {}"""},
- const {
-'main.dart': """
+main() {}"""
+ },
+ const {
+ 'main.dart': """
export 'dart:core' hide Foo;
-main() {}"""},
-]),
+main() {}"""
+ },
+ ]),
- MessageKind.EMPTY_SHOW:
- const MessageTemplate(MessageKind.EMPTY_SHOW,
- "Library '#{uri}' doesn't export a '#{name}' declaration.",
- howToFix: "Try removing '#{name}' from the 'show' clause.",
- examples: const [
- const {
- 'main.dart': """
+ MessageKind.EMPTY_SHOW: const MessageTemplate(MessageKind.EMPTY_SHOW,
+ "Library '#{uri}' doesn't export a '#{name}' declaration.",
+ howToFix: "Try removing '#{name}' from the 'show' clause.",
+ examples: const [
+ const {
+ 'main.dart': """
import 'dart:core' show Foo;
-main() {}"""},
- const {
-'main.dart': """
+main() {}"""
+ },
+ const {
+ 'main.dart': """
export 'dart:core' show Foo;
-main() {}"""},
-]),
+main() {}"""
+ },
+ ]),
- MessageKind.NOT_A_TYPE:
- const MessageTemplate(MessageKind.NOT_A_TYPE,
- "'#{node}' is not a type."),
+ MessageKind.NOT_A_TYPE: const MessageTemplate(
+ MessageKind.NOT_A_TYPE, "'#{node}' is not a type."),
- MessageKind.NOT_A_PREFIX:
- const MessageTemplate(MessageKind.NOT_A_PREFIX,
- "'#{node}' is not a prefix."),
+ MessageKind.NOT_A_PREFIX: const MessageTemplate(
+ MessageKind.NOT_A_PREFIX, "'#{node}' is not a prefix."),
- MessageKind.PREFIX_AS_EXPRESSION:
- const MessageTemplate(MessageKind.PREFIX_AS_EXPRESSION,
+ MessageKind.PREFIX_AS_EXPRESSION: const MessageTemplate(
+ MessageKind.PREFIX_AS_EXPRESSION,
"Library prefix '#{prefix}' is not a valid expression."),
- MessageKind.CANNOT_FIND_CONSTRUCTOR:
- const MessageTemplate(MessageKind.CANNOT_FIND_CONSTRUCTOR,
+ MessageKind.CANNOT_FIND_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.CANNOT_FIND_CONSTRUCTOR,
"Cannot find constructor '#{constructorName}' in class "
"'#{className}'."),
- MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR:
- const MessageTemplate(MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR,
+ MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR,
"Cannot find unnamed constructor in class "
"'#{className}'."),
- MessageKind.CYCLIC_CLASS_HIERARCHY:
- const MessageTemplate(MessageKind.CYCLIC_CLASS_HIERARCHY,
+ MessageKind.CYCLIC_CLASS_HIERARCHY: const MessageTemplate(
+ MessageKind.CYCLIC_CLASS_HIERARCHY,
"'#{className}' creates a cycle in the class hierarchy."),
- MessageKind.CYCLIC_REDIRECTING_FACTORY:
- const MessageTemplate(MessageKind.CYCLIC_REDIRECTING_FACTORY,
+ MessageKind.CYCLIC_REDIRECTING_FACTORY: const MessageTemplate(
+ MessageKind.CYCLIC_REDIRECTING_FACTORY,
'Redirecting factory leads to a cyclic redirection.'),
- MessageKind.INVALID_RECEIVER_IN_INITIALIZER:
- const MessageTemplate(MessageKind.INVALID_RECEIVER_IN_INITIALIZER,
+ MessageKind.INVALID_RECEIVER_IN_INITIALIZER: const MessageTemplate(
+ MessageKind.INVALID_RECEIVER_IN_INITIALIZER,
"Field initializer expected."),
- MessageKind.NO_SUPER_IN_STATIC:
- const MessageTemplate(MessageKind.NO_SUPER_IN_STATIC,
+ MessageKind.NO_SUPER_IN_STATIC: const MessageTemplate(
+ MessageKind.NO_SUPER_IN_STATIC,
"'super' is only available in instance methods."),
- MessageKind.DUPLICATE_INITIALIZER:
- const MessageTemplate(MessageKind.DUPLICATE_INITIALIZER,
+ MessageKind.DUPLICATE_INITIALIZER: const MessageTemplate(
+ MessageKind.DUPLICATE_INITIALIZER,
"Field '#{fieldName}' is initialized more than once."),
- MessageKind.ALREADY_INITIALIZED:
- const MessageTemplate(MessageKind.ALREADY_INITIALIZED,
+ MessageKind.ALREADY_INITIALIZED: const MessageTemplate(
+ MessageKind.ALREADY_INITIALIZED,
"'#{fieldName}' was already initialized here."),
- MessageKind.INIT_STATIC_FIELD:
- const MessageTemplate(MessageKind.INIT_STATIC_FIELD,
+ MessageKind.INIT_STATIC_FIELD: const MessageTemplate(
+ MessageKind.INIT_STATIC_FIELD,
"Cannot initialize static field '#{fieldName}'."),
- MessageKind.NOT_A_FIELD:
- const MessageTemplate(MessageKind.NOT_A_FIELD,
- "'#{fieldName}' is not a field."),
+ MessageKind.NOT_A_FIELD: const MessageTemplate(
+ MessageKind.NOT_A_FIELD, "'#{fieldName}' is not a field."),
- MessageKind.CONSTRUCTOR_CALL_EXPECTED:
- const MessageTemplate(MessageKind.CONSTRUCTOR_CALL_EXPECTED,
+ MessageKind.CONSTRUCTOR_CALL_EXPECTED: const MessageTemplate(
+ MessageKind.CONSTRUCTOR_CALL_EXPECTED,
"only call to 'this' or 'super' constructor allowed."),
- MessageKind.INVALID_FOR_IN:
- const MessageTemplate(MessageKind.INVALID_FOR_IN,
- "Invalid for-in variable declaration."),
+ MessageKind.INVALID_FOR_IN: const MessageTemplate(
+ MessageKind.INVALID_FOR_IN, "Invalid for-in variable declaration."),
- MessageKind.INVALID_INITIALIZER:
- const MessageTemplate(MessageKind.INVALID_INITIALIZER,
- "Invalid initializer."),
+ MessageKind.INVALID_INITIALIZER: const MessageTemplate(
+ MessageKind.INVALID_INITIALIZER, "Invalid initializer."),
- MessageKind.FUNCTION_WITH_INITIALIZER:
- const MessageTemplate(MessageKind.FUNCTION_WITH_INITIALIZER,
+ MessageKind.FUNCTION_WITH_INITIALIZER: const MessageTemplate(
+ MessageKind.FUNCTION_WITH_INITIALIZER,
"Only constructors can have initializers."),
- MessageKind.REDIRECTING_CONSTRUCTOR_CYCLE:
- const MessageTemplate(MessageKind.REDIRECTING_CONSTRUCTOR_CYCLE,
+ MessageKind.REDIRECTING_CONSTRUCTOR_CYCLE: const MessageTemplate(
+ MessageKind.REDIRECTING_CONSTRUCTOR_CYCLE,
"Cyclic constructor redirection."),
- MessageKind.REDIRECTING_CONSTRUCTOR_HAS_BODY:
- const MessageTemplate(MessageKind.REDIRECTING_CONSTRUCTOR_HAS_BODY,
+ MessageKind.REDIRECTING_CONSTRUCTOR_HAS_BODY: const MessageTemplate(
+ MessageKind.REDIRECTING_CONSTRUCTOR_HAS_BODY,
"Redirecting constructor can't have a body."),
MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER:
- const MessageTemplate(
- MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER,
- "Redirecting constructor cannot have other initializers."),
+ const MessageTemplate(
+ MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER,
+ "Redirecting constructor cannot have other initializers."),
- MessageKind.SUPER_INITIALIZER_IN_OBJECT:
- const MessageTemplate(MessageKind.SUPER_INITIALIZER_IN_OBJECT,
+ MessageKind.SUPER_INITIALIZER_IN_OBJECT: const MessageTemplate(
+ MessageKind.SUPER_INITIALIZER_IN_OBJECT,
"'Object' cannot have a super initializer."),
- MessageKind.DUPLICATE_SUPER_INITIALIZER:
- const MessageTemplate(MessageKind.DUPLICATE_SUPER_INITIALIZER,
+ MessageKind.DUPLICATE_SUPER_INITIALIZER: const MessageTemplate(
+ MessageKind.DUPLICATE_SUPER_INITIALIZER,
"Cannot have more than one super initializer."),
- MessageKind.SUPER_CALL_TO_FACTORY:
- const MessageTemplate(MessageKind.SUPER_CALL_TO_FACTORY,
+ MessageKind.SUPER_CALL_TO_FACTORY: const MessageTemplate(
+ MessageKind.SUPER_CALL_TO_FACTORY,
"The target of the superinitializer must be a generative "
"constructor.",
howToFix: "Try calling another constructor on the superclass.",
- examples: const ["""
+ examples: const [
+ """
class Super {
factory Super() => null;
}
class Class extends Super {}
main() => new Class();
-""", """
+""",
+ """
class Super {
factory Super() => null;
}
@@ -978,7 +952,8 @@
Class();
}
main() => new Class();
-""", """
+""",
+ """
class Super {
factory Super() => null;
}
@@ -986,7 +961,8 @@
Class() : super();
}
main() => new Class();
-""", """
+""",
+ """
class Super {
factory Super.foo() => null;
}
@@ -994,52 +970,57 @@
Class() : super.foo();
}
main() => new Class();
-"""]),
+"""
+ ]),
- MessageKind.THIS_CALL_TO_FACTORY:
- const MessageTemplate(MessageKind.THIS_CALL_TO_FACTORY,
+ MessageKind.THIS_CALL_TO_FACTORY: const MessageTemplate(
+ MessageKind.THIS_CALL_TO_FACTORY,
"The target of the redirection clause must be a generative "
"constructor",
- howToFix: "Try redirecting to another constructor.",
- examples: const ["""
+ howToFix: "Try redirecting to another constructor.",
+ examples: const [
+ """
class Class {
factory Class() => null;
Class.foo() : this();
}
main() => new Class.foo();
-""", """
+""",
+ """
class Class {
factory Class.foo() => null;
Class() : this.foo();
}
main() => new Class();
-"""]),
+"""
+ ]),
- MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS:
- const MessageTemplate(MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS,
+ MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS: const MessageTemplate(
+ MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS,
"Arguments do not match the expected parameters of constructor "
"'#{constructorName}'."),
- MessageKind.NO_MATCHING_CONSTRUCTOR:
- const MessageTemplate(MessageKind.NO_MATCHING_CONSTRUCTOR,
+ MessageKind.NO_MATCHING_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.NO_MATCHING_CONSTRUCTOR,
"'super' call arguments and constructor parameters do not match."),
- MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT:
- const MessageTemplate(MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT,
- "Implicit 'super' call arguments and constructor parameters "
- "do not match."),
+ MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT: const MessageTemplate(
+ MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT,
+ "Implicit 'super' call arguments and constructor parameters "
+ "do not match."),
- MessageKind.CONST_CALLS_NON_CONST:
- const MessageTemplate(MessageKind.CONST_CALLS_NON_CONST,
+ MessageKind.CONST_CALLS_NON_CONST: const MessageTemplate(
+ MessageKind.CONST_CALLS_NON_CONST,
"'const' constructor cannot call a non-const constructor."),
- MessageKind.CONST_CALLS_NON_CONST_FOR_IMPLICIT:
- const MessageTemplate(MessageKind.CONST_CALLS_NON_CONST_FOR_IMPLICIT,
- "'const' constructor cannot call a non-const constructor. "
- "This constructor has an implicit call to a "
- "super non-const constructor.",
- howToFix: "Try making the super constructor const.",
- examples: const ["""
+ MessageKind.CONST_CALLS_NON_CONST_FOR_IMPLICIT: const MessageTemplate(
+ MessageKind.CONST_CALLS_NON_CONST_FOR_IMPLICIT,
+ "'const' constructor cannot call a non-const constructor. "
+ "This constructor has an implicit call to a "
+ "super non-const constructor.",
+ howToFix: "Try making the super constructor const.",
+ examples: const [
+ """
class C {
C(); // missing const
}
@@ -1047,123 +1028,119 @@
final d;
const D(this.d);
}
-main() => new D(0);"""]),
+main() => new D(0);"""
+ ]),
- MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS:
- const MessageTemplate(
+ MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS: const MessageTemplate(
MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS,
"Can't declare constructor 'const' on class #{className} "
"because the class contains non-final instance fields.",
howToFix: "Try making all fields final.",
- examples: const ["""
+ examples: const [
+ """
class C {
// 'a' must be declared final to allow for the const constructor.
var a;
const C(this.a);
}
-main() => new C(0);"""]),
+main() => new C(0);"""
+ ]),
MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD:
- const MessageTemplate(
- MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD,
- "This non-final field prevents using const constructors."),
+ const MessageTemplate(
+ MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD,
+ "This non-final field prevents using const constructors."),
MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR:
- const MessageTemplate(
- MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR,
- "This const constructor is not allowed due to "
- "non-final fields."),
+ const MessageTemplate(
+ MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR,
+ "This const constructor is not allowed due to "
+ "non-final fields."),
-
- MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED:
- const MessageTemplate(MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED,
+ MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED: const MessageTemplate(
+ MessageKind.INITIALIZING_FORMAL_NOT_ALLOWED,
"Initializing formal parameter only allowed in generative "
"constructor."),
- MessageKind.INVALID_PARAMETER:
- const MessageTemplate(MessageKind.INVALID_PARAMETER,
- "Cannot resolve parameter."),
+ MessageKind.INVALID_PARAMETER: const MessageTemplate(
+ MessageKind.INVALID_PARAMETER, "Cannot resolve parameter."),
- MessageKind.NOT_INSTANCE_FIELD:
- const MessageTemplate(MessageKind.NOT_INSTANCE_FIELD,
+ MessageKind.NOT_INSTANCE_FIELD: const MessageTemplate(
+ MessageKind.NOT_INSTANCE_FIELD,
"'#{fieldName}' is not an instance field."),
- MessageKind.THIS_PROPERTY:
- const MessageTemplate(MessageKind.THIS_PROPERTY,
- "Expected an identifier."),
+ MessageKind.THIS_PROPERTY: const MessageTemplate(
+ MessageKind.THIS_PROPERTY, "Expected an identifier."),
- MessageKind.NO_CATCH_NOR_FINALLY:
- const MessageTemplate(MessageKind.NO_CATCH_NOR_FINALLY,
- "Expected 'catch' or 'finally'."),
+ MessageKind.NO_CATCH_NOR_FINALLY: const MessageTemplate(
+ MessageKind.NO_CATCH_NOR_FINALLY, "Expected 'catch' or 'finally'."),
- MessageKind.EMPTY_CATCH_DECLARATION:
- const MessageTemplate(MessageKind.EMPTY_CATCH_DECLARATION,
+ MessageKind.EMPTY_CATCH_DECLARATION: const MessageTemplate(
+ MessageKind.EMPTY_CATCH_DECLARATION,
"Expected an identifier in catch declaration."),
- MessageKind.EXTRA_CATCH_DECLARATION:
- const MessageTemplate(MessageKind.EXTRA_CATCH_DECLARATION,
+ MessageKind.EXTRA_CATCH_DECLARATION: const MessageTemplate(
+ MessageKind.EXTRA_CATCH_DECLARATION,
"Extra parameter in catch declaration."),
- MessageKind.PARAMETER_WITH_TYPE_IN_CATCH:
- const MessageTemplate(MessageKind.PARAMETER_WITH_TYPE_IN_CATCH,
+ MessageKind.PARAMETER_WITH_TYPE_IN_CATCH: const MessageTemplate(
+ MessageKind.PARAMETER_WITH_TYPE_IN_CATCH,
"Cannot use type annotations in catch."),
- MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH:
- const MessageTemplate(MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH,
+ MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH: const MessageTemplate(
+ MessageKind.PARAMETER_WITH_MODIFIER_IN_CATCH,
"Cannot use modifiers in catch."),
- MessageKind.OPTIONAL_PARAMETER_IN_CATCH:
- const MessageTemplate(MessageKind.OPTIONAL_PARAMETER_IN_CATCH,
+ MessageKind.OPTIONAL_PARAMETER_IN_CATCH: const MessageTemplate(
+ MessageKind.OPTIONAL_PARAMETER_IN_CATCH,
"Cannot use optional parameters in catch."),
- MessageKind.UNBOUND_LABEL:
- const MessageTemplate(MessageKind.UNBOUND_LABEL,
- "Cannot resolve label '#{labelName}'."),
+ MessageKind.UNBOUND_LABEL: const MessageTemplate(
+ MessageKind.UNBOUND_LABEL, "Cannot resolve label '#{labelName}'."),
- MessageKind.NO_BREAK_TARGET:
- const MessageTemplate(MessageKind.NO_BREAK_TARGET,
+ MessageKind.NO_BREAK_TARGET: const MessageTemplate(
+ MessageKind.NO_BREAK_TARGET,
"'break' statement not inside switch or loop."),
- MessageKind.NO_CONTINUE_TARGET:
- const MessageTemplate(MessageKind.NO_CONTINUE_TARGET,
+ MessageKind.NO_CONTINUE_TARGET: const MessageTemplate(
+ MessageKind.NO_CONTINUE_TARGET,
"'continue' statement not inside loop."),
- MessageKind.EXISTING_LABEL:
- const MessageTemplate(MessageKind.EXISTING_LABEL,
+ MessageKind.EXISTING_LABEL: const MessageTemplate(
+ MessageKind.EXISTING_LABEL,
"Original declaration of duplicate label '#{labelName}'."),
- MessageKind.DUPLICATE_LABEL:
- const MessageTemplate(MessageKind.DUPLICATE_LABEL,
+ MessageKind.DUPLICATE_LABEL: const MessageTemplate(
+ MessageKind.DUPLICATE_LABEL,
"Duplicate declaration of label '#{labelName}'."),
- MessageKind.UNUSED_LABEL:
- const MessageTemplate(MessageKind.UNUSED_LABEL,
- "Unused label '#{labelName}'."),
+ MessageKind.UNUSED_LABEL: const MessageTemplate(
+ MessageKind.UNUSED_LABEL, "Unused label '#{labelName}'."),
- MessageKind.INVALID_CONTINUE:
- const MessageTemplate(MessageKind.INVALID_CONTINUE,
+ MessageKind.INVALID_CONTINUE: const MessageTemplate(
+ MessageKind.INVALID_CONTINUE,
"Target of continue is not a loop or switch case."),
- MessageKind.INVALID_BREAK:
- const MessageTemplate(MessageKind.INVALID_BREAK,
- "Target of break is not a statement."),
+ MessageKind.INVALID_BREAK: const MessageTemplate(
+ MessageKind.INVALID_BREAK, "Target of break is not a statement."),
- MessageKind.DUPLICATE_TYPE_VARIABLE_NAME:
- const MessageTemplate(MessageKind.DUPLICATE_TYPE_VARIABLE_NAME,
+ MessageKind.DUPLICATE_TYPE_VARIABLE_NAME: const MessageTemplate(
+ MessageKind.DUPLICATE_TYPE_VARIABLE_NAME,
"Type variable '#{typeVariableName}' already declared."),
- MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER:
- const MessageTemplate(MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
- "Cannot refer to type variable '#{typeVariableName}' "
- "within a static member."),
+ MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER: const MessageTemplate(
+ MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
+ "Cannot refer to type variable '#{typeVariableName}' "
+ "within a static member."),
- MessageKind.TYPE_VARIABLE_IN_CONSTANT:
- const MessageTemplate(MessageKind.TYPE_VARIABLE_IN_CONSTANT,
+ MessageKind.TYPE_VARIABLE_IN_CONSTANT: const MessageTemplate(
+ MessageKind.TYPE_VARIABLE_IN_CONSTANT,
"Constant expressions can't refer to type variables.",
howToFix: "Try removing the type variable or replacing it with a "
- "concrete type.",
- examples: const ["""
+ "concrete type.",
+ examples: const [
+ """
class C<T> {
const C();
@@ -1172,194 +1149,209 @@
void main() => new C().m(null);
"""
-]),
+ ]),
- MessageKind.INVALID_TYPE_VARIABLE_BOUND:
- const MessageTemplate(MessageKind.INVALID_TYPE_VARIABLE_BOUND,
+ MessageKind.INVALID_TYPE_VARIABLE_BOUND: const MessageTemplate(
+ MessageKind.INVALID_TYPE_VARIABLE_BOUND,
"'#{typeArgument}' is not a subtype of bound '#{bound}' for "
"type variable '#{typeVariable}' of type '#{thisType}'.",
howToFix: "Try to change or remove the type argument.",
- examples: const ["""
+ examples: const [
+ """
class C<T extends num> {}
// 'String' is not a valid instantiation of T with bound num.'.
main() => new C<String>();
-"""]),
+"""
+ ]),
- MessageKind.INVALID_USE_OF_SUPER:
- const MessageTemplate(MessageKind.INVALID_USE_OF_SUPER,
- "'super' not allowed here."),
+ MessageKind.INVALID_USE_OF_SUPER: const MessageTemplate(
+ MessageKind.INVALID_USE_OF_SUPER, "'super' not allowed here."),
- MessageKind.INVALID_CASE_DEFAULT:
- const MessageTemplate(MessageKind.INVALID_CASE_DEFAULT,
+ MessageKind.INVALID_CASE_DEFAULT: const MessageTemplate(
+ MessageKind.INVALID_CASE_DEFAULT,
"'default' only allowed on last case of a switch."),
- MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL:
- const MessageTemplate(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
+ MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL: const MessageTemplate(
+ MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
"'case' expressions do not all have type '#{type}'."),
- MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE:
- const MessageTemplate(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+ MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE: const MessageTemplate(
+ MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
"'case' expression of type '#{type}'."),
- MessageKind.SWITCH_CASE_FORBIDDEN:
- const MessageTemplate(MessageKind.SWITCH_CASE_FORBIDDEN,
+ MessageKind.SWITCH_CASE_FORBIDDEN: const MessageTemplate(
+ MessageKind.SWITCH_CASE_FORBIDDEN,
"'case' expression may not be of type '#{type}'."),
- MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS:
- const MessageTemplate(MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
- "'case' expression type '#{type}' overrides 'operator =='."),
+ MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS: const MessageTemplate(
+ MessageKind.SWITCH_CASE_VALUE_OVERRIDES_EQUALS,
+ "'case' expression type '#{type}' overrides 'operator =='."),
- MessageKind.INVALID_ARGUMENT_AFTER_NAMED:
- const MessageTemplate(MessageKind.INVALID_ARGUMENT_AFTER_NAMED,
+ MessageKind.INVALID_ARGUMENT_AFTER_NAMED: const MessageTemplate(
+ MessageKind.INVALID_ARGUMENT_AFTER_NAMED,
"Unnamed argument after named argument."),
- MessageKind.INVALID_AWAIT_FOR_IN:
- const MessageTemplate(MessageKind.INVALID_AWAIT_FOR_IN,
+ MessageKind.INVALID_AWAIT_FOR_IN: const MessageTemplate(
+ MessageKind.INVALID_AWAIT_FOR_IN,
"'await' is only supported in methods with an 'async' or "
- "'async*' body modifier.",
+ "'async*' body modifier.",
howToFix: "Try adding 'async' or 'async*' to the method body or "
"removing the 'await' keyword.",
examples: const [
"""
main(o) sync* {
await for (var e in o) {}
-}"""]),
+}"""
+ ]),
- MessageKind.INVALID_AWAIT:
- const MessageTemplate(MessageKind.INVALID_AWAIT,
+ MessageKind.INVALID_AWAIT: const MessageTemplate(
+ MessageKind.INVALID_AWAIT,
"'await' is only supported in methods with an 'async' or "
- "'async*' body modifier.",
+ "'async*' body modifier.",
howToFix: "Try adding 'async' or 'async*' to the method body.",
examples: const [
- """
+ """
main(o) sync* {
await null;
-}"""]),
+}"""
+ ]),
- MessageKind.INVALID_YIELD:
- const MessageTemplate(MessageKind.INVALID_YIELD,
+ MessageKind.INVALID_YIELD: const MessageTemplate(
+ MessageKind.INVALID_YIELD,
"'yield' is only supported in methods with a 'sync*' or "
- "'async*' body modifier.",
+ "'async*' body modifier.",
howToFix: "Try adding 'sync*' or 'async*' to the method body.",
examples: const [
"""
main(o) async {
yield 0;
-}"""]),
+}"""
+ ]),
- MessageKind.NOT_A_COMPILE_TIME_CONSTANT:
- const MessageTemplate(MessageKind.NOT_A_COMPILE_TIME_CONSTANT,
+ MessageKind.NOT_A_COMPILE_TIME_CONSTANT: const MessageTemplate(
+ MessageKind.NOT_A_COMPILE_TIME_CONSTANT,
"Not a compile-time constant."),
- MessageKind.DEFERRED_COMPILE_TIME_CONSTANT:
- const MessageTemplate(MessageKind.DEFERRED_COMPILE_TIME_CONSTANT,
+ MessageKind.DEFERRED_COMPILE_TIME_CONSTANT: const MessageTemplate(
+ MessageKind.DEFERRED_COMPILE_TIME_CONSTANT,
"A deferred value cannot be used as a compile-time constant."),
MessageKind.DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION:
- const MessageTemplate(
- MessageKind.DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION,
- "A deferred class cannot be used to create a "
- "compile-time constant."),
+ const MessageTemplate(
+ MessageKind.DEFERRED_COMPILE_TIME_CONSTANT_CONSTRUCTION,
+ "A deferred class cannot be used to create a "
+ "compile-time constant."),
- MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS:
- const MessageTemplate(MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS,
+ MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS: const MessageTemplate(
+ MessageKind.CYCLIC_COMPILE_TIME_CONSTANTS,
"Cycle in the compile-time constant computation."),
- MessageKind.CONSTRUCTOR_IS_NOT_CONST:
- const MessageTemplate(MessageKind.CONSTRUCTOR_IS_NOT_CONST,
+ MessageKind.CONSTRUCTOR_IS_NOT_CONST: const MessageTemplate(
+ MessageKind.CONSTRUCTOR_IS_NOT_CONST,
"Constructor is not a 'const' constructor."),
- MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS:
- const MessageTemplate(MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS,
- "Const-map key type '#{type}' overrides 'operator =='."),
+ MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS: const MessageTemplate(
+ MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS,
+ "Const-map key type '#{type}' overrides 'operator =='."),
- MessageKind.NO_SUCH_LIBRARY_MEMBER:
- const MessageTemplate(MessageKind.NO_SUCH_LIBRARY_MEMBER,
+ MessageKind.NO_SUCH_LIBRARY_MEMBER: const MessageTemplate(
+ MessageKind.NO_SUCH_LIBRARY_MEMBER,
"'#{libraryName}' has no member named '#{memberName}'."),
- MessageKind.CANNOT_INSTANTIATE_TYPEDEF:
- const MessageTemplate(MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
+ MessageKind.CANNOT_INSTANTIATE_TYPEDEF: const MessageTemplate(
+ MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
"Cannot instantiate typedef '#{typedefName}'."),
- MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT:
- const MessageTemplate(MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT,
+ MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT: const MessageTemplate(
+ MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT,
"Non-optional parameters can't have a default value.",
howToFix:
- "Try removing the default value or making the parameter optional.",
- examples: const ["""
+ "Try removing the default value or making the parameter optional.",
+ examples: const [
+ """
main() {
foo(a: 1) => print(a);
foo(2);
-}""", """
+}""",
+ """
main() {
foo(a = 1) => print(a);
foo(2);
-}"""]),
+}"""
+ ]),
- MessageKind.NAMED_PARAMETER_WITH_EQUALS:
- const MessageTemplate(MessageKind.NAMED_PARAMETER_WITH_EQUALS,
+ MessageKind.NAMED_PARAMETER_WITH_EQUALS: const MessageTemplate(
+ MessageKind.NAMED_PARAMETER_WITH_EQUALS,
"Named optional parameters can't use '=' to specify a default "
"value.",
howToFix: "Try replacing '=' with ':'.",
- examples: const ["""
+ examples: const [
+ """
main() {
foo({a = 1}) => print(a);
foo(a: 2);
-}"""]),
+}"""
+ ]),
- MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS:
- const MessageTemplate(MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS,
+ MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS: const MessageTemplate(
+ MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS,
"Positional optional parameters can't use ':' to specify a "
"default value.",
howToFix: "Try replacing ':' with '='.",
- examples: const ["""
+ examples: const [
+ """
main() {
foo([a: 1]) => print(a);
foo(2);
-}"""]),
+}"""
+ ]),
- MessageKind.TYPEDEF_FORMAL_WITH_DEFAULT:
- const MessageTemplate(MessageKind.TYPEDEF_FORMAL_WITH_DEFAULT,
+ MessageKind.TYPEDEF_FORMAL_WITH_DEFAULT: const MessageTemplate(
+ MessageKind.TYPEDEF_FORMAL_WITH_DEFAULT,
"A parameter of a typedef can't specify a default value.",
- howToFix:
- "Try removing the default value.",
- examples: const ["""
+ howToFix: "Try removing the default value.",
+ examples: const [
+ """
typedef void F([int arg = 0]);
main() {
F f;
-}""", """
+}""",
+ """
typedef void F({int arg: 0});
main() {
F f;
-}"""]),
+}"""
+ ]),
- MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT:
- const MessageTemplate(MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT,
+ MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT: const MessageTemplate(
+ MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT,
"A function type parameter can't specify a default value.",
- howToFix:
- "Try removing the default value.",
- examples: const ["""
+ howToFix: "Try removing the default value.",
+ examples: const [
+ """
foo(f(int i, [a = 1])) {}
main() {
foo(1, 2);
-}""", """
+}""",
+ """
foo(f(int i, {a: 1})) {}
main() {
foo(1, a: 2);
-}"""]),
+}"""
+ ]),
- MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT:
- const MessageTemplate(MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT,
+ MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT: const MessageTemplate(
+ MessageKind.REDIRECTING_FACTORY_WITH_DEFAULT,
"A parameter of a redirecting factory constructor can't specify a "
"default value.",
- howToFix:
- "Try removing the default value.",
- examples: const ["""
+ howToFix: "Try removing the default value.",
+ examples: const [
+ """
class A {
A([a]);
factory A.foo([a = 1]) = A;
@@ -1367,7 +1359,8 @@
main() {
new A.foo(1);
-}""", """
+}""",
+ """
class A {
A({a});
factory A.foo({a: 1}) = A;
@@ -1375,841 +1368,879 @@
main() {
new A.foo(a: 1);
-}"""]),
+}"""
+ ]),
- MessageKind.FORMAL_DECLARED_CONST:
- const MessageTemplate(MessageKind.FORMAL_DECLARED_CONST,
+ MessageKind.FORMAL_DECLARED_CONST: const MessageTemplate(
+ MessageKind.FORMAL_DECLARED_CONST,
"A formal parameter can't be declared const.",
howToFix: "Try removing 'const'.",
- examples: const ["""
+ examples: const [
+ """
foo(const x) {}
main() => foo(42);
-""", """
+""",
+ """
foo({const x}) {}
main() => foo(42);
-""", """
+""",
+ """
foo([const x]) {}
main() => foo(42);
-"""]),
+"""
+ ]),
- MessageKind.FORMAL_DECLARED_STATIC:
- const MessageTemplate(MessageKind.FORMAL_DECLARED_STATIC,
+ MessageKind.FORMAL_DECLARED_STATIC: const MessageTemplate(
+ MessageKind.FORMAL_DECLARED_STATIC,
"A formal parameter can't be declared static.",
howToFix: "Try removing 'static'.",
- examples: const ["""
+ examples: const [
+ """
foo(static x) {}
main() => foo(42);
-""", """
+""",
+ """
foo({static x}) {}
main() => foo(42);
-""", """
+""",
+ """
foo([static x]) {}
main() => foo(42);
-"""]),
+"""
+ ]),
- MessageKind.FINAL_FUNCTION_TYPE_PARAMETER:
- const MessageTemplate(MessageKind.FINAL_FUNCTION_TYPE_PARAMETER,
+ MessageKind.FINAL_FUNCTION_TYPE_PARAMETER: const MessageTemplate(
+ MessageKind.FINAL_FUNCTION_TYPE_PARAMETER,
"A function type parameter can't be declared final.",
howToFix: "Try removing 'final'.",
- examples: const ["""
+ examples: const [
+ """
foo(final int x(int a)) {}
main() => foo((y) => 42);
-""", """
+""",
+ """
foo({final int x(int a)}) {}
main() => foo((y) => 42);
-""", """
+""",
+ """
foo([final int x(int a)]) {}
main() => foo((y) => 42);
-"""]),
+"""
+ ]),
- MessageKind.VAR_FUNCTION_TYPE_PARAMETER:
- const MessageTemplate(MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
+ MessageKind.VAR_FUNCTION_TYPE_PARAMETER: const MessageTemplate(
+ MessageKind.VAR_FUNCTION_TYPE_PARAMETER,
"A function type parameter can't be declared with 'var'.",
howToFix: "Try removing 'var'.",
- examples: const ["""
+ examples: const [
+ """
foo(var int x(int a)) {}
main() => foo((y) => 42);
-""", """
+""",
+ """
foo({var int x(int a)}) {}
main() => foo((y) => 42);
-""", """
+""",
+ """
foo([var int x(int a)]) {}
main() => foo((y) => 42);
-"""]),
+"""
+ ]),
- MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE:
- const MessageTemplate(MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
+ MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE: const MessageTemplate(
+ MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
"Cannot instantiate type variable '#{typeVariableName}'."),
- MessageKind.CYCLIC_TYPE_VARIABLE:
- const MessageTemplate(MessageKind.CYCLIC_TYPE_VARIABLE,
+ MessageKind.CYCLIC_TYPE_VARIABLE: const MessageTemplate(
+ MessageKind.CYCLIC_TYPE_VARIABLE,
"Type variable '#{typeVariableName}' is a supertype of itself."),
- MessageKind.CYCLIC_TYPEDEF:
- const MessageTemplate(MessageKind.CYCLIC_TYPEDEF,
- "A typedef can't refer to itself.",
+ MessageKind.CYCLIC_TYPEDEF: const MessageTemplate(
+ MessageKind.CYCLIC_TYPEDEF, "A typedef can't refer to itself.",
howToFix: "Try removing all references to '#{typedefName}' "
- "in the definition of '#{typedefName}'.",
- examples: const ["""
+ "in the definition of '#{typedefName}'.",
+ examples: const [
+ """
typedef F F(); // The return type 'F' is a self-reference.
-main() { F f = null; }"""]),
+main() { F f = null; }"""
+ ]),
- MessageKind.CYCLIC_TYPEDEF_ONE:
- const MessageTemplate(MessageKind.CYCLIC_TYPEDEF_ONE,
+ MessageKind.CYCLIC_TYPEDEF_ONE: const MessageTemplate(
+ MessageKind.CYCLIC_TYPEDEF_ONE,
"A typedef can't refer to itself through another typedef.",
- howToFix:
- "Try removing all references to "
- "'#{otherTypedefName}' in the definition of '#{typedefName}'.",
- examples: const ["""
+ howToFix: "Try removing all references to "
+ "'#{otherTypedefName}' in the definition of '#{typedefName}'.",
+ examples: const [
+ """
typedef G F(); // The return type 'G' is a self-reference through typedef 'G'.
typedef F G(); // The return type 'F' is a self-reference through typedef 'F'.
main() { F f = null; }""",
-"""
+ """
typedef G F(); // The return type 'G' creates a self-reference.
typedef H G(); // The return type 'H' creates a self-reference.
typedef H(F f); // The argument type 'F' creates a self-reference.
-main() { F f = null; }"""]),
+main() { F f = null; }"""
+ ]),
- MessageKind.CLASS_NAME_EXPECTED:
- const MessageTemplate(MessageKind.CLASS_NAME_EXPECTED,
- "Class name expected."),
+ MessageKind.CLASS_NAME_EXPECTED: const MessageTemplate(
+ MessageKind.CLASS_NAME_EXPECTED, "Class name expected."),
- MessageKind.CANNOT_EXTEND:
- const MessageTemplate(MessageKind.CANNOT_EXTEND,
- "'#{type}' cannot be extended."),
+ MessageKind.CANNOT_EXTEND: const MessageTemplate(
+ MessageKind.CANNOT_EXTEND, "'#{type}' cannot be extended."),
- MessageKind.CANNOT_IMPLEMENT:
- const MessageTemplate(MessageKind.CANNOT_IMPLEMENT,
- "'#{type}' cannot be implemented."),
+ MessageKind.CANNOT_IMPLEMENT: const MessageTemplate(
+ MessageKind.CANNOT_IMPLEMENT, "'#{type}' cannot be implemented."),
// TODO(johnnwinther): Split messages into reasons for malformedness.
- MessageKind.CANNOT_EXTEND_MALFORMED:
- const MessageTemplate(MessageKind.CANNOT_EXTEND_MALFORMED,
+ MessageKind.CANNOT_EXTEND_MALFORMED: const MessageTemplate(
+ MessageKind.CANNOT_EXTEND_MALFORMED,
"Class '#{className}' can't extend the type '#{malformedType}' "
"because it is malformed.",
howToFix:
- "Try correcting the malformed type annotation or removing the "
- "'extends' clause.",
- examples: const ["""
+ "Try correcting the malformed type annotation or removing the "
+ "'extends' clause.",
+ examples: const [
+ """
class A extends Malformed {}
-main() => new A();"""]),
+main() => new A();"""
+ ]),
- MessageKind.CANNOT_IMPLEMENT_MALFORMED:
- const MessageTemplate(MessageKind.CANNOT_IMPLEMENT_MALFORMED,
+ MessageKind.CANNOT_IMPLEMENT_MALFORMED: const MessageTemplate(
+ MessageKind.CANNOT_IMPLEMENT_MALFORMED,
"Class '#{className}' can't implement the type '#{malformedType}' "
"because it is malformed.",
howToFix:
- "Try correcting the malformed type annotation or removing the "
- "type from the 'implements' clause.",
- examples: const ["""
+ "Try correcting the malformed type annotation or removing the "
+ "type from the 'implements' clause.",
+ examples: const [
+ """
class A implements Malformed {}
-main() => new A();"""]),
+main() => new A();"""
+ ]),
- MessageKind.CANNOT_MIXIN_MALFORMED:
- const MessageTemplate(MessageKind.CANNOT_MIXIN_MALFORMED,
+ MessageKind.CANNOT_MIXIN_MALFORMED: const MessageTemplate(
+ MessageKind.CANNOT_MIXIN_MALFORMED,
"Class '#{className}' can't mixin the type '#{malformedType}' "
"because it is malformed.",
howToFix:
- "Try correcting the malformed type annotation or removing the "
- "type from the 'with' clause.",
- examples: const ["""
+ "Try correcting the malformed type annotation or removing the "
+ "type from the 'with' clause.",
+ examples: const [
+ """
class A extends Object with Malformed {}
-main() => new A();"""]),
+main() => new A();"""
+ ]),
- MessageKind.CANNOT_MIXIN:
- const MessageTemplate(MessageKind.CANNOT_MIXIN,
- "The type '#{type}' can't be mixed in.",
+ MessageKind.CANNOT_MIXIN: const MessageTemplate(
+ MessageKind.CANNOT_MIXIN, "The type '#{type}' can't be mixed in.",
howToFix: "Try removing '#{type}' from the 'with' clause.",
- examples: const ["""
+ examples: const [
+ """
class C extends Object with String {}
main() => new C();
-""", """
+""",
+ """
typedef C = Object with String;
main() => new C();
-"""]),
+"""
+ ]),
- MessageKind.CANNOT_EXTEND_ENUM:
- const MessageTemplate(MessageKind.CANNOT_EXTEND_ENUM,
+ MessageKind.CANNOT_EXTEND_ENUM: const MessageTemplate(
+ MessageKind.CANNOT_EXTEND_ENUM,
"Class '#{className}' can't extend the type '#{enumType}' because "
"it is declared by an enum.",
howToFix: "Try making '#{enumType}' a normal class or removing the "
- "'extends' clause.",
- examples: const ["""
+ "'extends' clause.",
+ examples: const [
+ """
enum Enum { A }
class B extends Enum {}
-main() => new B();"""]),
+main() => new B();"""
+ ]),
- MessageKind.CANNOT_IMPLEMENT_ENUM:
- const MessageTemplate(MessageKind.CANNOT_IMPLEMENT_ENUM,
+ MessageKind.CANNOT_IMPLEMENT_ENUM: const MessageTemplate(
+ MessageKind.CANNOT_IMPLEMENT_ENUM,
"Class '#{className}' can't implement the type '#{enumType}' "
"because it is declared by an enum.",
howToFix: "Try making '#{enumType}' a normal class or removing the "
- "type from the 'implements' clause.",
- examples: const ["""
+ "type from the 'implements' clause.",
+ examples: const [
+ """
enum Enum { A }
class B implements Enum {}
-main() => new B();"""]),
+main() => new B();"""
+ ]),
- MessageKind.CANNOT_MIXIN_ENUM:
- const MessageTemplate(MessageKind.CANNOT_MIXIN_ENUM,
+ MessageKind.CANNOT_MIXIN_ENUM: const MessageTemplate(
+ MessageKind.CANNOT_MIXIN_ENUM,
"Class '#{className}' can't mixin the type '#{enumType}' because it "
"is declared by an enum.",
howToFix: "Try making '#{enumType}' a normal class or removing the "
- "type from the 'with' clause.",
- examples: const ["""
+ "type from the 'with' clause.",
+ examples: const [
+ """
enum Enum { A }
class B extends Object with Enum {}
-main() => new B();"""]),
+main() => new B();"""
+ ]),
- MessageKind.CANNOT_INSTANTIATE_ENUM:
- const MessageTemplate(MessageKind.CANNOT_INSTANTIATE_ENUM,
+ MessageKind.CANNOT_INSTANTIATE_ENUM: const MessageTemplate(
+ MessageKind.CANNOT_INSTANTIATE_ENUM,
"Enum type '#{enumName}' cannot be instantiated.",
howToFix: "Try making '#{enumType}' a normal class or use an enum "
- "constant.",
- examples: const ["""
+ "constant.",
+ examples: const [
+ """
enum Enum { A }
-main() => new Enum(0);""", """
+main() => new Enum(0);""",
+ """
enum Enum { A }
-main() => const Enum(0);"""]),
+main() => const Enum(0);"""
+ ]),
- MessageKind.EMPTY_ENUM_DECLARATION:
- const MessageTemplate(MessageKind.EMPTY_ENUM_DECLARATION,
+ MessageKind.EMPTY_ENUM_DECLARATION: const MessageTemplate(
+ MessageKind.EMPTY_ENUM_DECLARATION,
"Enum '#{enumName}' must contain at least one value.",
howToFix: "Try adding an enum constant or making #{enumName} a "
- "normal class.",
- examples: const ["""
+ "normal class.",
+ examples: const [
+ """
enum Enum {}
-main() { Enum e; }"""]),
+main() { Enum e; }"""
+ ]),
- MessageKind.MISSING_ENUM_CASES:
- const MessageTemplate(MessageKind.MISSING_ENUM_CASES,
+ MessageKind.MISSING_ENUM_CASES: const MessageTemplate(
+ MessageKind.MISSING_ENUM_CASES,
"Missing enum constants in switch statement: #{enumValues}.",
howToFix: "Try adding the missing constants or a default case.",
- examples: const ["""
+ examples: const [
+ """
enum Enum { A, B }
main() {
switch (Enum.A) {
case Enum.B: break;
}
-}""", """
+}""",
+ """
enum Enum { A, B, C }
main() {
switch (Enum.A) {
case Enum.B: break;
}
-}"""]),
+}"""
+ ]),
- MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS:
- const MessageTemplate(MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS,
+ MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS: const MessageTemplate(
+ MessageKind.DUPLICATE_EXTENDS_IMPLEMENTS,
"'#{type}' can not be both extended and implemented."),
- MessageKind.DUPLICATE_IMPLEMENTS:
- const MessageTemplate(MessageKind.DUPLICATE_IMPLEMENTS,
+ MessageKind.DUPLICATE_IMPLEMENTS: const MessageTemplate(
+ MessageKind.DUPLICATE_IMPLEMENTS,
"'#{type}' must not occur more than once "
"in the implements clause."),
- MessageKind.MULTI_INHERITANCE:
- const MessageTemplate(MessageKind.MULTI_INHERITANCE,
+ MessageKind.MULTI_INHERITANCE: const MessageTemplate(
+ MessageKind.MULTI_INHERITANCE,
"Dart2js does not currently support inheritance of the same class "
"with different type arguments: Both #{firstType} and #{secondType} "
"are supertypes of #{thisType}."),
- MessageKind.ILLEGAL_SUPER_SEND:
- const MessageTemplate(MessageKind.ILLEGAL_SUPER_SEND,
+ MessageKind.ILLEGAL_SUPER_SEND: const MessageTemplate(
+ MessageKind.ILLEGAL_SUPER_SEND,
"'#{name}' cannot be called on super."),
- MessageKind.ADDITIONAL_TYPE_ARGUMENT:
- const MessageTemplate(MessageKind.ADDITIONAL_TYPE_ARGUMENT,
- "Additional type argument."),
+ MessageKind.ADDITIONAL_TYPE_ARGUMENT: const MessageTemplate(
+ MessageKind.ADDITIONAL_TYPE_ARGUMENT, "Additional type argument."),
- MessageKind.MISSING_TYPE_ARGUMENT:
- const MessageTemplate(MessageKind.MISSING_TYPE_ARGUMENT,
- "Missing type argument."),
+ MessageKind.MISSING_TYPE_ARGUMENT: const MessageTemplate(
+ MessageKind.MISSING_TYPE_ARGUMENT, "Missing type argument."),
// TODO(johnniwinther): Use ADDITIONAL_TYPE_ARGUMENT or
// MISSING_TYPE_ARGUMENT instead.
- MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH:
- const MessageTemplate(MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH,
+ MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH: const MessageTemplate(
+ MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH,
"Incorrect number of type arguments on '#{type}'."),
- MessageKind.GETTER_MISMATCH:
- const MessageTemplate(MessageKind.GETTER_MISMATCH,
- "Setter disagrees on: '#{modifiers}'."),
+ MessageKind.GETTER_MISMATCH: const MessageTemplate(
+ MessageKind.GETTER_MISMATCH, "Setter disagrees on: '#{modifiers}'."),
- MessageKind.SETTER_MISMATCH:
- const MessageTemplate(MessageKind.SETTER_MISMATCH,
- "Getter disagrees on: '#{modifiers}'."),
+ MessageKind.SETTER_MISMATCH: const MessageTemplate(
+ MessageKind.SETTER_MISMATCH, "Getter disagrees on: '#{modifiers}'."),
- MessageKind.ILLEGAL_SETTER_FORMALS:
- const MessageTemplate(MessageKind.ILLEGAL_SETTER_FORMALS,
+ MessageKind.ILLEGAL_SETTER_FORMALS: const MessageTemplate(
+ MessageKind.ILLEGAL_SETTER_FORMALS,
"A setter must have exactly one argument."),
- MessageKind.NO_STATIC_OVERRIDE:
- const MessageTemplate(MessageKind.NO_STATIC_OVERRIDE,
+ MessageKind.NO_STATIC_OVERRIDE: const MessageTemplate(
+ MessageKind.NO_STATIC_OVERRIDE,
"Static member cannot override instance member '#{memberName}' of "
"'#{className}'."),
- MessageKind.NO_STATIC_OVERRIDE_CONT:
- const MessageTemplate(MessageKind.NO_STATIC_OVERRIDE_CONT,
+ MessageKind.NO_STATIC_OVERRIDE_CONT: const MessageTemplate(
+ MessageKind.NO_STATIC_OVERRIDE_CONT,
"This is the instance member that cannot be overridden "
"by a static member."),
- MessageKind.INSTANCE_STATIC_SAME_NAME:
- const MessageTemplate(MessageKind.INSTANCE_STATIC_SAME_NAME,
+ MessageKind.INSTANCE_STATIC_SAME_NAME: const MessageTemplate(
+ MessageKind.INSTANCE_STATIC_SAME_NAME,
"Instance member '#{memberName}' and static member of "
"superclass '#{className}' have the same name."),
- MessageKind.INSTANCE_STATIC_SAME_NAME_CONT:
- const MessageTemplate(MessageKind.INSTANCE_STATIC_SAME_NAME_CONT,
+ MessageKind.INSTANCE_STATIC_SAME_NAME_CONT: const MessageTemplate(
+ MessageKind.INSTANCE_STATIC_SAME_NAME_CONT,
"This is the static member with the same name."),
- MessageKind.INVALID_OVERRIDE_METHOD:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_METHOD,
+ MessageKind.INVALID_OVERRIDE_METHOD: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_METHOD,
"The type '#{declaredType}' of method '#{name}' declared in "
"'#{class}' is not a subtype of the overridden method type "
"'#{inheritedType}' inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDDEN_METHOD:
- const MessageTemplate(MessageKind.INVALID_OVERRIDDEN_METHOD,
+ MessageKind.INVALID_OVERRIDDEN_METHOD: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDDEN_METHOD,
"This is the overridden method '#{name}' declared in class "
"'#{class}'."),
- MessageKind.INVALID_OVERRIDE_GETTER:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_GETTER,
+ MessageKind.INVALID_OVERRIDE_GETTER: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_GETTER,
"The type '#{declaredType}' of getter '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden getter inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDDEN_GETTER:
- const MessageTemplate(MessageKind.INVALID_OVERRIDDEN_GETTER,
+ MessageKind.INVALID_OVERRIDDEN_GETTER: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDDEN_GETTER,
"This is the overridden getter '#{name}' declared in class "
"'#{class}'."),
- MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
+ MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
"The type '#{declaredType}' of field '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden getter inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
+ MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
"The type '#{declaredType}' of getter '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden field inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDE_SETTER:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_SETTER,
+ MessageKind.INVALID_OVERRIDE_SETTER: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_SETTER,
"The type '#{declaredType}' of setter '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden setter inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDDEN_SETTER:
- const MessageTemplate(MessageKind.INVALID_OVERRIDDEN_SETTER,
+ MessageKind.INVALID_OVERRIDDEN_SETTER: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDDEN_SETTER,
"This is the overridden setter '#{name}' declared in class "
"'#{class}'."),
- MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
+ MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
"The type '#{declaredType}' of field '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden setter inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
+ MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
"The type '#{declaredType}' of setter '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden field inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDE_FIELD:
- const MessageTemplate(MessageKind.INVALID_OVERRIDE_FIELD,
+ MessageKind.INVALID_OVERRIDE_FIELD: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDE_FIELD,
"The type '#{declaredType}' of field '#{name}' declared in "
"'#{class}' is not assignable to the type '#{inheritedType}' of the "
"overridden field inherited from '#{inheritedClass}'."),
- MessageKind.INVALID_OVERRIDDEN_FIELD:
- const MessageTemplate(MessageKind.INVALID_OVERRIDDEN_FIELD,
+ MessageKind.INVALID_OVERRIDDEN_FIELD: const MessageTemplate(
+ MessageKind.INVALID_OVERRIDDEN_FIELD,
"This is the overridden field '#{name}' declared in class "
"'#{class}'."),
- MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD:
- const MessageTemplate(MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
+ MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD: const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
"Method '#{name}' in '#{class}' can't override field from "
"'#{inheritedClass}'."),
- MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT:
- const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT: const MessageTemplate(
MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT,
"This is the field that cannot be overridden by a method."),
- MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD:
- const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD: const MessageTemplate(
MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
"Field '#{name}' in '#{class}' can't override method from "
"'#{inheritedClass}'."),
- MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT:
- const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT: const MessageTemplate(
MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT,
"This is the method that cannot be overridden by a field."),
- MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD:
- const MessageTemplate(MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
- "Method '#{name}' in '#{class}' can't override getter from "
- "'#{inheritedClass}'."),
+ MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD: const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
+ "Method '#{name}' in '#{class}' can't override getter from "
+ "'#{inheritedClass}'."),
MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT:
- const MessageTemplate(
- MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT,
- "This is the getter that cannot be overridden by a method."),
+ const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT,
+ "This is the getter that cannot be overridden by a method."),
- MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER:
- const MessageTemplate(MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER: const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
"Getter '#{name}' in '#{class}' can't override method from "
"'#{inheritedClass}'."),
MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT:
- const MessageTemplate(
- MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT,
- "This is the method that cannot be overridden by a getter."),
+ const MessageTemplate(
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT,
+ "This is the method that cannot be overridden by a getter."),
- MessageKind.MISSING_FORMALS:
- const MessageTemplate(MessageKind.MISSING_FORMALS,
- "Formal parameters are missing."),
+ MessageKind.MISSING_FORMALS: const MessageTemplate(
+ MessageKind.MISSING_FORMALS, "Formal parameters are missing."),
- MessageKind.EXTRA_FORMALS:
- const MessageTemplate(MessageKind.EXTRA_FORMALS,
- "Formal parameters are not allowed here."),
+ MessageKind.EXTRA_FORMALS: const MessageTemplate(
+ MessageKind.EXTRA_FORMALS, "Formal parameters are not allowed here."),
- MessageKind.UNARY_OPERATOR_BAD_ARITY:
- const MessageTemplate(MessageKind.UNARY_OPERATOR_BAD_ARITY,
+ MessageKind.UNARY_OPERATOR_BAD_ARITY: const MessageTemplate(
+ MessageKind.UNARY_OPERATOR_BAD_ARITY,
"Operator '#{operatorName}' must have no parameters."),
- MessageKind.MINUS_OPERATOR_BAD_ARITY:
- const MessageTemplate(MessageKind.MINUS_OPERATOR_BAD_ARITY,
+ MessageKind.MINUS_OPERATOR_BAD_ARITY: const MessageTemplate(
+ MessageKind.MINUS_OPERATOR_BAD_ARITY,
"Operator '-' must have 0 or 1 parameters."),
- MessageKind.BINARY_OPERATOR_BAD_ARITY:
- const MessageTemplate(MessageKind.BINARY_OPERATOR_BAD_ARITY,
+ MessageKind.BINARY_OPERATOR_BAD_ARITY: const MessageTemplate(
+ MessageKind.BINARY_OPERATOR_BAD_ARITY,
"Operator '#{operatorName}' must have exactly 1 parameter."),
- MessageKind.TERNARY_OPERATOR_BAD_ARITY:
- const MessageTemplate(MessageKind.TERNARY_OPERATOR_BAD_ARITY,
+ MessageKind.TERNARY_OPERATOR_BAD_ARITY: const MessageTemplate(
+ MessageKind.TERNARY_OPERATOR_BAD_ARITY,
"Operator '#{operatorName}' must have exactly 2 parameters."),
- MessageKind.OPERATOR_OPTIONAL_PARAMETERS:
- const MessageTemplate(MessageKind.OPERATOR_OPTIONAL_PARAMETERS,
+ MessageKind.OPERATOR_OPTIONAL_PARAMETERS: const MessageTemplate(
+ MessageKind.OPERATOR_OPTIONAL_PARAMETERS,
"Operator '#{operatorName}' cannot have optional parameters."),
- MessageKind.OPERATOR_NAMED_PARAMETERS:
- const MessageTemplate(MessageKind.OPERATOR_NAMED_PARAMETERS,
+ MessageKind.OPERATOR_NAMED_PARAMETERS: const MessageTemplate(
+ MessageKind.OPERATOR_NAMED_PARAMETERS,
"Operator '#{operatorName}' cannot have named parameters."),
- MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER:
- const MessageTemplate(MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER,
+ MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER: const MessageTemplate(
+ MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER,
"Cannot have final modifier on method."),
- MessageKind.ILLEGAL_CONST_FIELD_MODIFIER:
- const MessageTemplate(MessageKind.ILLEGAL_CONST_FIELD_MODIFIER,
+ MessageKind.ILLEGAL_CONST_FIELD_MODIFIER: const MessageTemplate(
+ MessageKind.ILLEGAL_CONST_FIELD_MODIFIER,
"Cannot have const modifier on non-static field.",
howToFix:
- "Try adding a static modifier, or removing the const modifier.",
- examples: const ["""
+ "Try adding a static modifier, or removing the const modifier.",
+ examples: const [
+ """
class C {
const int a = 1;
}
-main() => new C();"""]),
+main() => new C();"""
+ ]),
- MessageKind.ILLEGAL_CONSTRUCTOR_MODIFIERS:
- const MessageTemplate(MessageKind.ILLEGAL_CONSTRUCTOR_MODIFIERS,
+ MessageKind.ILLEGAL_CONSTRUCTOR_MODIFIERS: const MessageTemplate(
+ MessageKind.ILLEGAL_CONSTRUCTOR_MODIFIERS,
"Illegal constructor modifiers: '#{modifiers}'."),
- MessageKind.ILLEGAL_MIXIN_APPLICATION_MODIFIERS:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_APPLICATION_MODIFIERS,
- "Illegal mixin application modifiers: '#{modifiers}'."),
+ MessageKind.ILLEGAL_MIXIN_APPLICATION_MODIFIERS: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_APPLICATION_MODIFIERS,
+ "Illegal mixin application modifiers: '#{modifiers}'."),
- MessageKind.ILLEGAL_MIXIN_SUPERCLASS:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_SUPERCLASS,
+ MessageKind.ILLEGAL_MIXIN_SUPERCLASS: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_SUPERCLASS,
"Class used as mixin must have Object as superclass."),
- MessageKind.ILLEGAL_MIXIN_OBJECT:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_OBJECT,
- "Cannot use Object as mixin."),
+ MessageKind.ILLEGAL_MIXIN_OBJECT: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_OBJECT, "Cannot use Object as mixin."),
- MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR,
+ MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR,
"Class used as mixin cannot have non-factory constructor."),
- MessageKind.ILLEGAL_MIXIN_CYCLE:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_CYCLE,
+ MessageKind.ILLEGAL_MIXIN_CYCLE: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_CYCLE,
"Class used as mixin introduces mixin cycle: "
"'#{mixinName1}' <-> '#{mixinName2}'."),
- MessageKind.ILLEGAL_MIXIN_WITH_SUPER:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_WITH_SUPER,
+ MessageKind.ILLEGAL_MIXIN_WITH_SUPER: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_WITH_SUPER,
"Cannot use class '#{className}' as a mixin because it uses "
"'super'."),
- MessageKind.ILLEGAL_MIXIN_SUPER_USE:
- const MessageTemplate(MessageKind.ILLEGAL_MIXIN_SUPER_USE,
+ MessageKind.ILLEGAL_MIXIN_SUPER_USE: const MessageTemplate(
+ MessageKind.ILLEGAL_MIXIN_SUPER_USE,
"Use of 'super' in class used as mixin."),
- MessageKind.PARAMETER_NAME_EXPECTED:
- const MessageTemplate(MessageKind.PARAMETER_NAME_EXPECTED,
- "parameter name expected."),
+ MessageKind.PARAMETER_NAME_EXPECTED: const MessageTemplate(
+ MessageKind.PARAMETER_NAME_EXPECTED, "parameter name expected."),
- MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER:
- const MessageTemplate(MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+ MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER: const MessageTemplate(
+ MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
"Cannot resolve setter."),
- MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER:
- const MessageTemplate(MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
+ MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER: const MessageTemplate(
+ MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
"Cannot assign a value to final field '#{name}' "
"in superclass '#{superclassName}'."),
- MessageKind.ASSIGNING_METHOD:
- const MessageTemplate(MessageKind.ASSIGNING_METHOD,
- "Cannot assign a value to a method."),
+ MessageKind.ASSIGNING_METHOD: const MessageTemplate(
+ MessageKind.ASSIGNING_METHOD, "Cannot assign a value to a method."),
- MessageKind.ASSIGNING_METHOD_IN_SUPER:
- const MessageTemplate(MessageKind.ASSIGNING_METHOD_IN_SUPER,
+ MessageKind.ASSIGNING_METHOD_IN_SUPER: const MessageTemplate(
+ MessageKind.ASSIGNING_METHOD_IN_SUPER,
"Cannot assign a value to method '#{name}' "
"in superclass '#{superclassName}'."),
- MessageKind.ASSIGNING_TYPE:
- const MessageTemplate(MessageKind.ASSIGNING_TYPE,
- "Cannot assign a value to a type."),
+ MessageKind.ASSIGNING_TYPE: const MessageTemplate(
+ MessageKind.ASSIGNING_TYPE, "Cannot assign a value to a type."),
- MessageKind.IF_NULL_ASSIGNING_TYPE:
- const MessageTemplate(MessageKind.IF_NULL_ASSIGNING_TYPE,
+ MessageKind.IF_NULL_ASSIGNING_TYPE: const MessageTemplate(
+ MessageKind.IF_NULL_ASSIGNING_TYPE,
"Cannot assign a value to a type. Note that types are never null, "
"so this ??= assignment has no effect.",
howToFix: "Try removing the '??=' assignment.",
- examples: const [
- "class A {} main() { print(A ??= 3);}",
- ]),
+ examples: const ["class A {} main() { print(A ??= 3);}",]),
- MessageKind.VOID_NOT_ALLOWED:
- const MessageTemplate(MessageKind.VOID_NOT_ALLOWED,
+ MessageKind.VOID_NOT_ALLOWED: const MessageTemplate(
+ MessageKind.VOID_NOT_ALLOWED,
"Type 'void' can't be used here because it isn't a return type.",
howToFix:
- "Try removing 'void' keyword or replace it with 'var', 'final', "
- "or a type.",
+ "Try removing 'void' keyword or replace it with 'var', 'final', "
+ "or a type.",
examples: const [
- "void x; main() {}",
- "foo(void x) {} main() { foo(null); }",
+ "void x; main() {}",
+ "foo(void x) {} main() { foo(null); }",
]),
- MessageKind.NULL_NOT_ALLOWED:
- const MessageTemplate(MessageKind.NULL_NOT_ALLOWED,
- "`null` can't be used here."),
+ MessageKind.NULL_NOT_ALLOWED: const MessageTemplate(
+ MessageKind.NULL_NOT_ALLOWED, "`null` can't be used here."),
- MessageKind.BEFORE_TOP_LEVEL:
- const MessageTemplate(MessageKind.BEFORE_TOP_LEVEL,
+ MessageKind.BEFORE_TOP_LEVEL: const MessageTemplate(
+ MessageKind.BEFORE_TOP_LEVEL,
"Part header must come before top-level definitions."),
- MessageKind.IMPORT_PART_OF:
- const MessageTemplate(MessageKind.IMPORT_PART_OF,
+ MessageKind.IMPORT_PART_OF: const MessageTemplate(
+ MessageKind.IMPORT_PART_OF,
"The imported library must not have a 'part-of' directive.",
howToFix: "Try removing the 'part-of' directive or replacing the "
- "import of the library with a 'part' directive.",
- examples: const [const {
-'main.dart': """
+ "import of the library with a 'part' directive.",
+ examples: const [
+ const {
+ 'main.dart': """
library library;
import 'part.dart';
main() {}
""",
-
-'part.dart': """
+ 'part.dart': """
part of library;
-"""}]),
+"""
+ }
+ ]),
- MessageKind.IMPORT_PART_OF_HERE:
- const MessageTemplate(MessageKind.IMPORT_PART_OF_HERE,
- "The library is imported here."),
+ MessageKind.IMPORT_PART_OF_HERE: const MessageTemplate(
+ MessageKind.IMPORT_PART_OF_HERE, "The library is imported here."),
- MessageKind.MAIN_HAS_PART_OF:
- const MessageTemplate(MessageKind.MAIN_HAS_PART_OF,
+ MessageKind.MAIN_HAS_PART_OF: const MessageTemplate(
+ MessageKind.MAIN_HAS_PART_OF,
"The main application file must not have a 'part-of' directive.",
- howToFix: "Try removing the 'part-of' directive or starting "
+ howToFix: "Try removing the 'part-of' directive or starting "
"compilation from another file.",
- examples: const [const {
-'main.dart': """
+ examples: const [
+ const {
+ 'main.dart': """
part of library;
main() {}
-"""}]),
+"""
+ }
+ ]),
- MessageKind.LIBRARY_NAME_MISMATCH:
- const MessageTemplate(MessageKind.LIBRARY_NAME_MISMATCH,
+ MessageKind.LIBRARY_NAME_MISMATCH: const MessageTemplate(
+ MessageKind.LIBRARY_NAME_MISMATCH,
"Expected part of library name '#{libraryName}'.",
howToFix: "Try changing the directive to 'part of #{libraryName};'.",
- examples: const [const {
-'main.dart': """
+ examples: const [
+ const {
+ 'main.dart': """
library lib.foo;
part 'part.dart';
main() {}
""",
-
-'part.dart': """
+ 'part.dart': """
part of lib.bar;
-"""}]),
+"""
+ }
+ ]),
- MessageKind.MISSING_LIBRARY_NAME:
- const MessageTemplate(MessageKind.MISSING_LIBRARY_NAME,
+ MessageKind.MISSING_LIBRARY_NAME: const MessageTemplate(
+ MessageKind.MISSING_LIBRARY_NAME,
"Library has no name. Part directive expected library name "
"to be '#{libraryName}'.",
howToFix: "Try adding 'library #{libraryName};' to the library.",
- examples: const [const {
-'main.dart': """
+ examples: const [
+ const {
+ 'main.dart': """
part 'part.dart';
main() {}
""",
-
-'part.dart': """
+ 'part.dart': """
part of lib.foo;
-"""}]),
+"""
+ }
+ ]),
- MessageKind.THIS_IS_THE_PART_OF_TAG:
- const MessageTemplate(MessageKind.THIS_IS_THE_PART_OF_TAG,
+ MessageKind.THIS_IS_THE_PART_OF_TAG: const MessageTemplate(
+ MessageKind.THIS_IS_THE_PART_OF_TAG,
"This is the part of directive."),
- MessageKind.MISSING_PART_OF_TAG:
- const MessageTemplate(MessageKind.MISSING_PART_OF_TAG,
+ MessageKind.MISSING_PART_OF_TAG: const MessageTemplate(
+ MessageKind.MISSING_PART_OF_TAG,
"This file has no part-of tag, but it is being used as a part."),
- MessageKind.DUPLICATED_PART_OF:
- const MessageTemplate(MessageKind.DUPLICATED_PART_OF,
- "Duplicated part-of directive."),
+ MessageKind.DUPLICATED_PART_OF: const MessageTemplate(
+ MessageKind.DUPLICATED_PART_OF, "Duplicated part-of directive."),
- MessageKind.DUPLICATED_LIBRARY_NAME:
- const MessageTemplate(MessageKind.DUPLICATED_LIBRARY_NAME,
+ MessageKind.DUPLICATED_LIBRARY_NAME: const MessageTemplate(
+ MessageKind.DUPLICATED_LIBRARY_NAME,
"Duplicated library name '#{libraryName}'."),
- MessageKind.DUPLICATED_RESOURCE:
- const MessageTemplate(MessageKind.DUPLICATED_RESOURCE,
+ MessageKind.DUPLICATED_RESOURCE: const MessageTemplate(
+ MessageKind.DUPLICATED_RESOURCE,
"The resource '#{resourceUri}' is loaded through both "
"'#{canonicalUri1}' and '#{canonicalUri2}'."),
- MessageKind.DUPLICATED_LIBRARY_RESOURCE:
- const MessageTemplate(MessageKind.DUPLICATED_LIBRARY_RESOURCE,
+ MessageKind.DUPLICATED_LIBRARY_RESOURCE: const MessageTemplate(
+ MessageKind.DUPLICATED_LIBRARY_RESOURCE,
"The library '#{libraryName}' in '#{resourceUri}' is loaded through "
"both '#{canonicalUri1}' and '#{canonicalUri2}'."),
// This is used as an exception.
- MessageKind.INVALID_SOURCE_FILE_LOCATION:
- const MessageTemplate(MessageKind.INVALID_SOURCE_FILE_LOCATION, '''
+ MessageKind.INVALID_SOURCE_FILE_LOCATION: const MessageTemplate(
+ MessageKind.INVALID_SOURCE_FILE_LOCATION,
+ '''
Invalid offset (#{offset}) in source map.
File: #{fileName}
Length: #{length}'''),
- MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC:
- const MessageTemplate(MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC,
- "Top-level variable cannot be declared static."),
+ MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC: const MessageTemplate(
+ MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC,
+ "Top-level variable cannot be declared static."),
- MessageKind.REFERENCE_IN_INITIALIZATION:
- const MessageTemplate(MessageKind.REFERENCE_IN_INITIALIZATION,
- "Variable '#{variableName}' is referenced during its "
- "initialization.",
- howToFix:
- "If you are trying to reference a shadowed variable, rename "
- "one of the variables.",
- examples: const ["""
+ MessageKind.REFERENCE_IN_INITIALIZATION: const MessageTemplate(
+ MessageKind.REFERENCE_IN_INITIALIZATION,
+ "Variable '#{variableName}' is referenced during its "
+ "initialization.",
+ howToFix:
+ "If you are trying to reference a shadowed variable, rename "
+ "one of the variables.",
+ examples: const [
+ """
foo(t) {
var t = t;
return t;
}
main() => foo(1);
-"""]),
+"""
+ ]),
- MessageKind.CONST_WITHOUT_INITIALIZER:
- const MessageTemplate(MessageKind.CONST_WITHOUT_INITIALIZER,
+ MessageKind.CONST_WITHOUT_INITIALIZER: const MessageTemplate(
+ MessageKind.CONST_WITHOUT_INITIALIZER,
"A constant variable must be initialized.",
howToFix: "Try adding an initializer or "
- "removing the 'const' modifier.",
- examples: const ["""
+ "removing the 'const' modifier.",
+ examples: const [
+ """
void main() {
const c; // This constant variable must be initialized.
-}"""]),
+}"""
+ ]),
- MessageKind.FINAL_WITHOUT_INITIALIZER:
- const MessageTemplate(MessageKind.FINAL_WITHOUT_INITIALIZER,
+ MessageKind.FINAL_WITHOUT_INITIALIZER: const MessageTemplate(
+ MessageKind.FINAL_WITHOUT_INITIALIZER,
"A final variable must be initialized.",
howToFix: "Try adding an initializer or "
- "removing the 'final' modifier.",
+ "removing the 'final' modifier.",
examples: const [
- "class C { static final field; } main() => C.field;"]),
+ "class C { static final field; } main() => C.field;"
+ ]),
- MessageKind.CONST_LOOP_VARIABLE:
- const MessageTemplate(MessageKind.CONST_LOOP_VARIABLE,
+ MessageKind.CONST_LOOP_VARIABLE: const MessageTemplate(
+ MessageKind.CONST_LOOP_VARIABLE,
"A loop variable cannot be constant.",
howToFix: "Try remove the 'const' modifier or "
- "replacing it with a 'final' modifier.",
- examples: const ["""
+ "replacing it with a 'final' modifier.",
+ examples: const [
+ """
void main() {
for (const c in []) {}
-}"""]),
+}"""
+ ]),
- MessageKind.MEMBER_USES_CLASS_NAME:
- const MessageTemplate(MessageKind.MEMBER_USES_CLASS_NAME,
+ MessageKind.MEMBER_USES_CLASS_NAME: const MessageTemplate(
+ MessageKind.MEMBER_USES_CLASS_NAME,
"Member variable can't have the same name as the class it is "
"declared in.",
howToFix: "Try renaming the variable.",
- examples: const ["""
+ examples: const [
+ """
class A { var A; }
main() {
var a = new A();
a.A = 1;
}
-""", """
+""",
+ """
class A { static var A; }
main() => A.A = 1;
-"""]),
+"""
+ ]),
- MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT:
- const MessageTemplate(
+ MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT: const MessageTemplate(
MessageKind.WRONG_NUMBER_OF_ARGUMENTS_FOR_ASSERT,
"Wrong number of arguments to assert. Should be 1, but given "
"#{argumentCount}."),
- MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS:
- const MessageTemplate(MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS,
+ MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS: const MessageTemplate(
+ MessageKind.ASSERT_IS_GIVEN_NAMED_ARGUMENTS,
"'assert' takes no named arguments, but given #{argumentCount}."),
- MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY:
- const MessageTemplate(MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY,
+ MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY: const MessageTemplate(
+ MessageKind.FACTORY_REDIRECTION_IN_NON_FACTORY,
"Factory redirection only allowed in factories."),
- MessageKind.MISSING_FACTORY_KEYWORD:
- const MessageTemplate(MessageKind.MISSING_FACTORY_KEYWORD,
+ MessageKind.MISSING_FACTORY_KEYWORD: const MessageTemplate(
+ MessageKind.MISSING_FACTORY_KEYWORD,
"Did you forget a factory keyword here?"),
- MessageKind.NO_SUCH_METHOD_IN_NATIVE:
- const MessageTemplate(MessageKind.NO_SUCH_METHOD_IN_NATIVE,
+ MessageKind.NO_SUCH_METHOD_IN_NATIVE: const MessageTemplate(
+ MessageKind.NO_SUCH_METHOD_IN_NATIVE,
"'NoSuchMethod' is not supported for classes that extend native "
"classes."),
- MessageKind.DEFERRED_LIBRARY_DART_2_DART:
- const MessageTemplate(MessageKind.DEFERRED_LIBRARY_DART_2_DART,
+ MessageKind.DEFERRED_LIBRARY_DART_2_DART: const MessageTemplate(
+ MessageKind.DEFERRED_LIBRARY_DART_2_DART,
"Deferred loading is not supported by the dart backend yet. "
"The output will not be split."),
- MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX:
- const MessageTemplate(MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX,
+ MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX: const MessageTemplate(
+ MessageKind.DEFERRED_LIBRARY_WITHOUT_PREFIX,
"This import is deferred but there is no prefix keyword.",
howToFix: "Try adding a prefix to the import."),
- MessageKind.DEFERRED_OLD_SYNTAX:
- const MessageTemplate(MessageKind.DEFERRED_OLD_SYNTAX,
+ MessageKind.DEFERRED_OLD_SYNTAX: const MessageTemplate(
+ MessageKind.DEFERRED_OLD_SYNTAX,
"The DeferredLibrary annotation is obsolete.",
howToFix:
- "Use the \"import 'lib.dart' deferred as prefix\" syntax instead."),
+ "Use the \"import 'lib.dart' deferred as prefix\" syntax instead."),
- MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX:
- const MessageTemplate(MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX,
+ MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX: const MessageTemplate(
+ MessageKind.DEFERRED_LIBRARY_DUPLICATE_PREFIX,
"The prefix of this deferred import is not unique.",
howToFix: "Try changing the import prefix."),
- MessageKind.DEFERRED_TYPE_ANNOTATION:
- const MessageTemplate(MessageKind.DEFERRED_TYPE_ANNOTATION,
+ MessageKind.DEFERRED_TYPE_ANNOTATION: const MessageTemplate(
+ MessageKind.DEFERRED_TYPE_ANNOTATION,
"The type #{node} is deferred. "
"Deferred types are not valid as type annotations.",
- howToFix:
- "Try using a non-deferred abstract class as an interface."),
+ howToFix: "Try using a non-deferred abstract class as an interface."),
- MessageKind.ILLEGAL_STATIC:
- const MessageTemplate(MessageKind.ILLEGAL_STATIC,
+ MessageKind.ILLEGAL_STATIC: const MessageTemplate(
+ MessageKind.ILLEGAL_STATIC,
"Modifier static is only allowed on functions declared in "
"a class."),
- MessageKind.STATIC_FUNCTION_BLOAT:
- const MessageTemplate(MessageKind.STATIC_FUNCTION_BLOAT,
+ MessageKind.STATIC_FUNCTION_BLOAT: const MessageTemplate(
+ MessageKind.STATIC_FUNCTION_BLOAT,
"Using '#{class}.#{name}' may lead to unnecessarily large "
"generated code.",
- howToFix:
- "Try adding '@MirrorsUsed(...)' as described at "
+ howToFix: "Try adding '@MirrorsUsed(...)' as described at "
"https://goo.gl/Akrrog."),
- MessageKind.NON_CONST_BLOAT:
- const MessageTemplate(MessageKind.NON_CONST_BLOAT,
+ MessageKind.NON_CONST_BLOAT: const MessageTemplate(
+ MessageKind.NON_CONST_BLOAT,
"Using 'new #{name}' may lead to unnecessarily large generated "
"code.",
howToFix:
"Try using 'const #{name}' or adding '@MirrorsUsed(...)' as "
"described at https://goo.gl/Akrrog."),
- MessageKind.STRING_EXPECTED:
- const MessageTemplate(MessageKind.STRING_EXPECTED,
+ MessageKind.STRING_EXPECTED: const MessageTemplate(
+ MessageKind.STRING_EXPECTED,
"Expected a 'String', but got an instance of '#{type}'."),
- MessageKind.PRIVATE_IDENTIFIER:
- const MessageTemplate(MessageKind.PRIVATE_IDENTIFIER,
+ MessageKind.PRIVATE_IDENTIFIER: const MessageTemplate(
+ MessageKind.PRIVATE_IDENTIFIER,
"'#{value}' is not a valid Symbol name because it starts with "
"'_'."),
- MessageKind.PRIVATE_NAMED_PARAMETER:
- const MessageTemplate(MessageKind.PRIVATE_NAMED_PARAMETER,
+ MessageKind.PRIVATE_NAMED_PARAMETER: const MessageTemplate(
+ MessageKind.PRIVATE_NAMED_PARAMETER,
"Named optional parameter can't have a library private name.",
howToFix:
- "Try removing the '_' or making the parameter positional or "
- "required.",
+ "Try removing the '_' or making the parameter positional or "
+ "required.",
examples: const ["""foo({int _p}) {} main() => foo();"""]),
- MessageKind.UNSUPPORTED_LITERAL_SYMBOL:
- const MessageTemplate(MessageKind.UNSUPPORTED_LITERAL_SYMBOL,
+ MessageKind.UNSUPPORTED_LITERAL_SYMBOL: const MessageTemplate(
+ MessageKind.UNSUPPORTED_LITERAL_SYMBOL,
"Symbol literal '##{value}' is currently unsupported by dart2js."),
- MessageKind.INVALID_SYMBOL:
- const MessageTemplate(MessageKind.INVALID_SYMBOL, '''
+ MessageKind.INVALID_SYMBOL: const MessageTemplate(
+ MessageKind.INVALID_SYMBOL,
+ '''
'#{value}' is not a valid Symbol name because is not:
* an empty String,
* a user defined operator,
* a qualified non-private identifier optionally followed by '=', or
* a qualified non-private identifier followed by '.' and a user-defined '''
-"operator."),
+ "operator."),
- MessageKind.AMBIGUOUS_REEXPORT:
- const MessageTemplate(MessageKind.AMBIGUOUS_REEXPORT,
+ MessageKind.AMBIGUOUS_REEXPORT: const MessageTemplate(
+ MessageKind.AMBIGUOUS_REEXPORT,
"'#{name}' is (re)exported by multiple libraries."),
- MessageKind.AMBIGUOUS_LOCATION:
- const MessageTemplate(MessageKind.AMBIGUOUS_LOCATION,
- "'#{name}' is defined here."),
+ MessageKind.AMBIGUOUS_LOCATION: const MessageTemplate(
+ MessageKind.AMBIGUOUS_LOCATION, "'#{name}' is defined here."),
- MessageKind.IMPORTED_HERE:
- const MessageTemplate(MessageKind.IMPORTED_HERE,
- "'#{name}' is imported here."),
+ MessageKind.IMPORTED_HERE: const MessageTemplate(
+ MessageKind.IMPORTED_HERE, "'#{name}' is imported here."),
- MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE:
- const MessageTemplate(MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE,
+ MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE: const MessageTemplate(
+ MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE,
"The class '#{class}' overrides 'operator==', "
"but not 'get hashCode'."),
- MessageKind.INTERNAL_LIBRARY_FROM:
- const MessageTemplate(MessageKind.INTERNAL_LIBRARY_FROM,
+ MessageKind.INTERNAL_LIBRARY_FROM: const MessageTemplate(
+ MessageKind.INTERNAL_LIBRARY_FROM,
"Internal library '#{resolvedUri}' is not accessible from "
"'#{importingUri}'."),
- MessageKind.INTERNAL_LIBRARY:
- const MessageTemplate(MessageKind.INTERNAL_LIBRARY,
+ MessageKind.INTERNAL_LIBRARY: const MessageTemplate(
+ MessageKind.INTERNAL_LIBRARY,
"Internal library '#{resolvedUri}' is not accessible."),
MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS:
- const MessageTemplate(
- MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
- "Js-interop class '#{cls}' cannot extend from the non js-interop "
- "class '#{superclass}'.",
- howToFix: "Annotate the superclass with @JS.",
- examples: const [
- """
+ const MessageTemplate(
+ MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS,
+ "Js-interop class '#{cls}' cannot extend from the non js-interop "
+ "class '#{superclass}'.",
+ howToFix: "Annotate the superclass with @JS.",
+ examples: const [
+ """
import 'package:js/js.dart';
class Foo { }
@@ -2220,15 +2251,15 @@
main() {
new Bar();
}
- """]),
+ """
+ ]),
- MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER:
- const MessageTemplate(
+ MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER: const MessageTemplate(
MessageKind.JS_INTEROP_CLASS_NON_EXTERNAL_MEMBER,
"Member '#{member}' in js-interop class '#{cls}' is not external.",
howToFix: "Mark all interop methods external",
examples: const [
- """
+ """
import 'package:js/js.dart';
@JS()
@@ -2239,18 +2270,18 @@
main() {
new Foo().bar();
}
- """]),
+ """
+ ]),
- MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS:
- const MessageTemplate(
+ MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS: const MessageTemplate(
MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
"Js-interop method '#{method}' has named arguments but is not "
"a factory constructor of an @anonymous @JS class.",
howToFix: "Remove all named arguments from js-interop method or "
- "in the case of a factory constructor annotate the class "
- "as @anonymous.",
+ "in the case of a factory constructor annotate the class "
+ "as @anonymous.",
examples: const [
- """
+ """
import 'package:js/js.dart';
@JS()
@@ -2261,15 +2292,15 @@
main() {
new Foo().bar(4, baz: 5);
}
- """]),
- MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED:
- const MessageTemplate(
- MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED,
- "Js-interop does not support [] and []= operator methods.",
- howToFix: "Try replacing [] and []= operator methods with normal "
- "methods.",
- examples: const [
- """
+ """
+ ]),
+ MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED: const MessageTemplate(
+ MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED,
+ "Js-interop does not support [] and []= operator methods.",
+ howToFix: "Try replacing [] and []= operator methods with normal "
+ "methods.",
+ examples: const [
+ """
import 'package:js/js.dart';
@JS()
@@ -2280,7 +2311,8 @@
main() {
new Foo()[0];
}
- """, """
+ """,
+ """
import 'package:js/js.dart';
@JS()
@@ -2291,18 +2323,20 @@
main() {
new Foo()[0] = 1;
}
- """]),
+ """
+ ]),
MessageKind.JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS:
- const MessageTemplate(
- MessageKind.JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
- "Parameter '#{parameter}' in anonymous js-interop class '#{cls}' "
- "object literal constructor is positional instead of named."
- ".",
- howToFix: "Make all arguments in external factory object literal "
- "constructors named.",
- examples: const [
- """
+ const MessageTemplate(
+ MessageKind
+ .JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
+ "Parameter '#{parameter}' in anonymous js-interop class '#{cls}' "
+ "object literal constructor is positional instead of named."
+ ".",
+ howToFix: "Make all arguments in external factory object literal "
+ "constructors named.",
+ examples: const [
+ """
import 'package:js/js.dart';
@anonymous
@@ -2314,63 +2348,65 @@
main() {
new Foo(5, baz: 5);
}
- """]),
+ """
+ ]),
- MessageKind.LIBRARY_NOT_FOUND:
- const MessageTemplate(MessageKind.LIBRARY_NOT_FOUND,
- "Library not found '#{resolvedUri}'."),
+ MessageKind.LIBRARY_NOT_FOUND: const MessageTemplate(
+ MessageKind.LIBRARY_NOT_FOUND, "Library not found '#{resolvedUri}'."),
- MessageKind.LIBRARY_NOT_SUPPORTED:
- const MessageTemplate(MessageKind.LIBRARY_NOT_SUPPORTED,
+ MessageKind.LIBRARY_NOT_SUPPORTED: const MessageTemplate(
+ MessageKind.LIBRARY_NOT_SUPPORTED,
"Library not supported '#{resolvedUri}'.",
howToFix: "Try removing the dependency or enabling support using "
- "the '--categories' option.",
- examples: const [/*
+ "the '--categories' option.",
+ examples: const [
+ /*
"""
import 'dart:io';
main() {}
"""
- */]),
- // TODO(johnniwinther): Enable example when message_kind_test.dart
- // supports library loader callbacks.
+ */
+ ]),
+ // TODO(johnniwinther): Enable example when message_kind_test.dart
+ // supports library loader callbacks.
- MessageKind.UNSUPPORTED_EQ_EQ_EQ:
- const MessageTemplate(MessageKind.UNSUPPORTED_EQ_EQ_EQ,
+ MessageKind.UNSUPPORTED_EQ_EQ_EQ: const MessageTemplate(
+ MessageKind.UNSUPPORTED_EQ_EQ_EQ,
"'===' is not an operator. "
"Did you mean '#{lhs} == #{rhs}' or 'identical(#{lhs}, #{rhs})'?"),
- MessageKind.UNSUPPORTED_BANG_EQ_EQ:
- const MessageTemplate(MessageKind.UNSUPPORTED_BANG_EQ_EQ,
+ MessageKind.UNSUPPORTED_BANG_EQ_EQ: const MessageTemplate(
+ MessageKind.UNSUPPORTED_BANG_EQ_EQ,
"'!==' is not an operator. "
"Did you mean '#{lhs} != #{rhs}' or '!identical(#{lhs}, #{rhs})'?"),
- MessageKind.UNSUPPORTED_PREFIX_PLUS:
- const MessageTemplate(MessageKind.UNSUPPORTED_PREFIX_PLUS,
- "'+' is not a prefix operator. ",
+ MessageKind.UNSUPPORTED_PREFIX_PLUS: const MessageTemplate(
+ MessageKind.UNSUPPORTED_PREFIX_PLUS, "'+' is not a prefix operator. ",
howToFix: "Try removing '+'.",
examples: const [
- "main() => +2; // No longer a valid way to write '2'"
+ "main() => +2; // No longer a valid way to write '2'"
]),
- MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX:
- const MessageTemplate(MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX,
+ MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX: const MessageTemplate(
+ MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX,
"'typedef' not allowed here. ",
howToFix: "Try replacing 'typedef' with 'class'.",
examples: const [
- """
+ """
class B { }
class M1 { }
typedef C = B with M1; // Need to replace 'typedef' with 'class'.
main() { new C(); }
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_EXPECTED_STRING:
- const MessageTemplate(MessageKind.MIRRORS_EXPECTED_STRING,
+ MessageKind.MIRRORS_EXPECTED_STRING: const MessageTemplate(
+ MessageKind.MIRRORS_EXPECTED_STRING,
"Can't use '#{name}' here because it's an instance of '#{type}' "
"and a 'String' value is expected.",
howToFix: "Did you forget to add quotes?",
examples: const [
- """
+ """
// 'Foo' is a type literal, not a string.
@MirrorsUsed(symbols: const [Foo])
import 'dart:mirrors';
@@ -2378,29 +2414,31 @@
class Foo {}
main() {}
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_EXPECTED_STRING_OR_TYPE:
- const MessageTemplate(MessageKind.MIRRORS_EXPECTED_STRING_OR_TYPE,
+ MessageKind.MIRRORS_EXPECTED_STRING_OR_TYPE: const MessageTemplate(
+ MessageKind.MIRRORS_EXPECTED_STRING_OR_TYPE,
"Can't use '#{name}' here because it's an instance of '#{type}' "
"and a 'String' or 'Type' value is expected.",
howToFix: "Did you forget to add quotes?",
examples: const [
- """
+ """
// 'main' is a method, not a class.
@MirrorsUsed(targets: const [main])
import 'dart:mirrors';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_EXPECTED_STRING_OR_LIST:
- const MessageTemplate(MessageKind.MIRRORS_EXPECTED_STRING_OR_LIST,
+ MessageKind.MIRRORS_EXPECTED_STRING_OR_LIST: const MessageTemplate(
+ MessageKind.MIRRORS_EXPECTED_STRING_OR_LIST,
"Can't use '#{name}' here because it's an instance of '#{type}' "
"and a 'String' or 'List' value is expected.",
howToFix: "Did you forget to add quotes?",
examples: const [
- """
+ """
// 'Foo' is not a string.
@MirrorsUsed(symbols: Foo)
import 'dart:mirrors';
@@ -2408,68 +2446,71 @@
class Foo {}
main() {}
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_EXPECTED_STRING_TYPE_OR_LIST:
- const MessageTemplate(MessageKind.MIRRORS_EXPECTED_STRING_TYPE_OR_LIST,
+ MessageKind.MIRRORS_EXPECTED_STRING_TYPE_OR_LIST: const MessageTemplate(
+ MessageKind.MIRRORS_EXPECTED_STRING_TYPE_OR_LIST,
"Can't use '#{name}' here because it's an instance of '#{type}' "
"but a 'String', 'Type', or 'List' value is expected.",
howToFix: "Did you forget to add quotes?",
examples: const [
- """
+ """
// '1' is not a string.
@MirrorsUsed(targets: 1)
import 'dart:mirrors';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_CANNOT_RESOLVE_IN_CURRENT_LIBRARY:
- const MessageTemplate(
+ MessageKind.MIRRORS_CANNOT_RESOLVE_IN_CURRENT_LIBRARY: const MessageTemplate(
MessageKind.MIRRORS_CANNOT_RESOLVE_IN_CURRENT_LIBRARY,
"Can't find '#{name}' in the current library.",
// TODO(ahe): The closest identifiers in edit distance would be nice.
howToFix: "Did you forget to add an import?",
examples: const [
- """
+ """
// 'window' is not in scope because dart:html isn't imported.
@MirrorsUsed(targets: 'window')
import 'dart:mirrors';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY:
- const MessageTemplate(MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY,
+ MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY: const MessageTemplate(
+ MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY,
"Can't find '#{name}' in the library '#{library}'.",
// TODO(ahe): The closest identifiers in edit distance would be nice.
howToFix: "Is '#{name}' spelled right?",
examples: const [
- """
+ """
// 'List' is misspelled.
@MirrorsUsed(targets: 'dart.core.Lsit')
import 'dart:mirrors';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT:
- const MessageTemplate(MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT,
+ MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT: const MessageTemplate(
+ MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT,
"Can't find '#{name}' in '#{element}'.",
// TODO(ahe): The closest identifiers in edit distance would be nice.
howToFix: "Is '#{name}' spelled right?",
examples: const [
- """
+ """
// 'addAll' is misspelled.
@MirrorsUsed(targets: 'dart.core.List.addAl')
import 'dart:mirrors';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.INVALID_URI:
- const MessageTemplate(MessageKind.INVALID_URI,
- "'#{uri}' is not a valid URI.",
+ MessageKind.INVALID_URI: const MessageTemplate(
+ MessageKind.INVALID_URI, "'#{uri}' is not a valid URI.",
howToFix: DONT_KNOW_HOW_TO_FIX,
examples: const [
"""
@@ -2477,17 +2518,17 @@
import '../../Udyn[mic ils/expect.dart';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.INVALID_PACKAGE_CONFIG:
- const MessageTemplate(MessageKind.INVALID_PACKAGE_CONFIG,
- """Package config file '#{uri}' is invalid.
+ MessageKind.INVALID_PACKAGE_CONFIG: const MessageTemplate(
+ MessageKind.INVALID_PACKAGE_CONFIG,
+ """Package config file '#{uri}' is invalid.
#{exception}""",
- howToFix: DONT_KNOW_HOW_TO_FIX
- ),
+ howToFix: DONT_KNOW_HOW_TO_FIX),
- MessageKind.INVALID_PACKAGE_URI:
- const MessageTemplate(MessageKind.INVALID_PACKAGE_URI,
+ MessageKind.INVALID_PACKAGE_URI: const MessageTemplate(
+ MessageKind.INVALID_PACKAGE_URI,
"'#{uri}' is not a valid package URI (#{exception}).",
howToFix: DONT_KNOW_HOW_TO_FIX,
examples: const [
@@ -2496,157 +2537,158 @@
import 'package:foo.dart';
main() {}
-""", """
+""",
+ """
// can't have 2 slashes
import 'package://foo/foo.dart';
main() {}
-""", """
+""",
+ """
// package name must be valid
import 'package:not\valid/foo.dart';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.READ_SCRIPT_ERROR:
- const MessageTemplate(MessageKind.READ_SCRIPT_ERROR,
- "Can't read '#{uri}' (#{exception}).",
+ MessageKind.READ_SCRIPT_ERROR: const MessageTemplate(
+ MessageKind.READ_SCRIPT_ERROR, "Can't read '#{uri}' (#{exception}).",
// Don't know how to fix since the underlying error is unknown.
howToFix: DONT_KNOW_HOW_TO_FIX,
examples: const [
- """
+ """
// 'foo.dart' does not exist.
import 'foo.dart';
main() {}
-"""]),
+"""
+ ]),
MessageKind.READ_SELF_ERROR:
- const MessageTemplate(MessageKind.READ_SELF_ERROR,
- "#{exception}",
- // Don't know how to fix since the underlying error is unknown.
- howToFix: DONT_KNOW_HOW_TO_FIX),
+ const MessageTemplate(MessageKind.READ_SELF_ERROR, "#{exception}",
+ // Don't know how to fix since the underlying error is unknown.
+ howToFix: DONT_KNOW_HOW_TO_FIX),
- MessageKind.ABSTRACT_CLASS_INSTANTIATION:
- const MessageTemplate(MessageKind.ABSTRACT_CLASS_INSTANTIATION,
+ MessageKind.ABSTRACT_CLASS_INSTANTIATION: const MessageTemplate(
+ MessageKind.ABSTRACT_CLASS_INSTANTIATION,
"Can't instantiate abstract class.",
howToFix: DONT_KNOW_HOW_TO_FIX,
examples: const ["abstract class A {} main() { new A(); }"]),
- MessageKind.BODY_EXPECTED:
- const MessageTemplate(MessageKind.BODY_EXPECTED,
- "Expected a function body or '=>'.",
+ MessageKind.BODY_EXPECTED: const MessageTemplate(
+ MessageKind.BODY_EXPECTED, "Expected a function body or '=>'.",
// TODO(ahe): In some scenarios, we can suggest removing the 'static'
// keyword.
howToFix: "Try adding {}.",
- examples: const [
- "main();"]),
+ examples: const ["main();"]),
- MessageKind.MIRROR_BLOAT:
- const MessageTemplate(MessageKind.MIRROR_BLOAT,
+ MessageKind.MIRROR_BLOAT: const MessageTemplate(
+ MessageKind.MIRROR_BLOAT,
"#{count} methods retained for use by dart:mirrors out of #{total}"
" total methods (#{percentage}%)."),
- MessageKind.MIRROR_IMPORT:
- const MessageTemplate(MessageKind.MIRROR_IMPORT,
- "Import of 'dart:mirrors'."),
+ MessageKind.MIRROR_IMPORT: const MessageTemplate(
+ MessageKind.MIRROR_IMPORT, "Import of 'dart:mirrors'."),
- MessageKind.MIRROR_IMPORT_NO_USAGE:
- const MessageTemplate(MessageKind.MIRROR_IMPORT_NO_USAGE,
+ MessageKind.MIRROR_IMPORT_NO_USAGE: const MessageTemplate(
+ MessageKind.MIRROR_IMPORT_NO_USAGE,
"This import is not annotated with @MirrorsUsed, which may lead to "
"unnecessarily large generated code.",
- howToFix:
- "Try adding '@MirrorsUsed(...)' as described at "
+ howToFix: "Try adding '@MirrorsUsed(...)' as described at "
"https://goo.gl/Akrrog."),
- MessageKind.JS_PLACEHOLDER_CAPTURE:
- const MessageTemplate(
- MessageKind.JS_PLACEHOLDER_CAPTURE,
- "JS code must not use '#' placeholders inside functions.",
- howToFix:
- "Use an immediately called JavaScript function to capture the"
- " the placeholder values as JavaScript function parameters."),
+ MessageKind.JS_PLACEHOLDER_CAPTURE: const MessageTemplate(
+ MessageKind.JS_PLACEHOLDER_CAPTURE,
+ "JS code must not use '#' placeholders inside functions.",
+ howToFix:
+ "Use an immediately called JavaScript function to capture the"
+ " the placeholder values as JavaScript function parameters."),
MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT:
- const MessageTemplate(
- MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT,
- "Argument for 'JS_INTERCEPTOR_CONSTANT' must be a type constant."),
+ const MessageTemplate(
+ MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT,
+ "Argument for 'JS_INTERCEPTOR_CONSTANT' must be a type constant."),
- MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD:
- const MessageTemplate(MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
- "'#{keyword}' is a reserved word and can't be used here.",
- howToFix: "Try using a different name.",
- examples: const ["do() {} main() {}"]),
+ MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD: const MessageTemplate(
+ MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
+ "'#{keyword}' is a reserved word and can't be used here.",
+ howToFix: "Try using a different name.",
+ examples: const ["do() {} main() {}"]),
- MessageKind. NAMED_FUNCTION_EXPRESSION:
- const MessageTemplate(MessageKind.NAMED_FUNCTION_EXPRESSION,
+ MessageKind.NAMED_FUNCTION_EXPRESSION: const MessageTemplate(
+ MessageKind.NAMED_FUNCTION_EXPRESSION,
"Function expression '#{name}' cannot be named.",
howToFix: "Try removing the name.",
examples: const ["main() { var f = func() {}; }"]),
- MessageKind.UNUSED_METHOD:
- const MessageTemplate(MessageKind.UNUSED_METHOD,
- "The method '#{name}' is never called.",
+ MessageKind.UNUSED_METHOD: const MessageTemplate(
+ MessageKind.UNUSED_METHOD, "The method '#{name}' is never called.",
howToFix: "Consider deleting it.",
examples: const ["deadCode() {} main() {}"]),
- MessageKind.UNUSED_CLASS:
- const MessageTemplate(MessageKind.UNUSED_CLASS,
- "The class '#{name}' is never used.",
+ MessageKind.UNUSED_CLASS: const MessageTemplate(
+ MessageKind.UNUSED_CLASS, "The class '#{name}' is never used.",
howToFix: "Consider deleting it.",
examples: const ["class DeadCode {} main() {}"]),
- MessageKind.UNUSED_TYPEDEF:
- const MessageTemplate(MessageKind.UNUSED_TYPEDEF,
- "The typedef '#{name}' is never used.",
+ MessageKind.UNUSED_TYPEDEF: const MessageTemplate(
+ MessageKind.UNUSED_TYPEDEF, "The typedef '#{name}' is never used.",
howToFix: "Consider deleting it.",
examples: const ["typedef DeadCode(); main() {}"]),
- MessageKind.ABSTRACT_METHOD:
- const MessageTemplate(MessageKind.ABSTRACT_METHOD,
+ MessageKind.ABSTRACT_METHOD: const MessageTemplate(
+ MessageKind.ABSTRACT_METHOD,
"The method '#{name}' has no implementation in "
"class '#{class}'.",
howToFix: "Try adding a body to '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
class Class {
method();
}
main() => new Class().method();
-"""]),
+"""
+ ]),
- MessageKind.ABSTRACT_GETTER:
- const MessageTemplate(MessageKind.ABSTRACT_GETTER,
+ MessageKind.ABSTRACT_GETTER: const MessageTemplate(
+ MessageKind.ABSTRACT_GETTER,
"The getter '#{name}' has no implementation in "
"class '#{class}'.",
howToFix: "Try adding a body to '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
class Class {
get getter;
}
main() => new Class();
-"""]),
+"""
+ ]),
- MessageKind.ABSTRACT_SETTER:
- const MessageTemplate(MessageKind.ABSTRACT_SETTER,
+ MessageKind.ABSTRACT_SETTER: const MessageTemplate(
+ MessageKind.ABSTRACT_SETTER,
"The setter '#{name}' has no implementation in "
"class '#{class}'.",
howToFix: "Try adding a body to '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
class Class {
set setter(_);
}
main() => new Class();
-"""]),
+"""
+ ]),
- MessageKind.INHERIT_GETTER_AND_METHOD:
- const MessageTemplate(MessageKind.INHERIT_GETTER_AND_METHOD,
+ MessageKind.INHERIT_GETTER_AND_METHOD: const MessageTemplate(
+ MessageKind.INHERIT_GETTER_AND_METHOD,
"The class '#{class}' can't inherit both getters and methods "
"by the named '#{name}'.",
howToFix: DONT_KNOW_HOW_TO_FIX,
- examples: const ["""
+ examples: const [
+ """
class A {
get member => null;
}
@@ -2656,49 +2698,54 @@
class Class implements A, B {
}
main() => new Class();
-"""]),
+"""
+ ]),
- MessageKind.INHERITED_METHOD:
- const MessageTemplate(MessageKind.INHERITED_METHOD,
+ MessageKind.INHERITED_METHOD: const MessageTemplate(
+ MessageKind.INHERITED_METHOD,
"The inherited method '#{name}' is declared here in class "
"'#{class}'."),
- MessageKind.INHERITED_EXPLICIT_GETTER:
- const MessageTemplate(MessageKind.INHERITED_EXPLICIT_GETTER,
+ MessageKind.INHERITED_EXPLICIT_GETTER: const MessageTemplate(
+ MessageKind.INHERITED_EXPLICIT_GETTER,
"The inherited getter '#{name}' is declared here in class "
"'#{class}'."),
- MessageKind.INHERITED_IMPLICIT_GETTER:
- const MessageTemplate(MessageKind.INHERITED_IMPLICIT_GETTER,
+ MessageKind.INHERITED_IMPLICIT_GETTER: const MessageTemplate(
+ MessageKind.INHERITED_IMPLICIT_GETTER,
"The inherited getter '#{name}' is implicitly declared by this "
"field in class '#{class}'."),
- MessageKind.UNIMPLEMENTED_METHOD_ONE:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_METHOD_ONE,
+ MessageKind.UNIMPLEMENTED_METHOD_ONE: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_METHOD_ONE,
"'#{class}' doesn't implement '#{method}' "
"declared in '#{declarer}'.",
howToFix: "Try adding an implementation of '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
abstract class I {
m();
}
class C implements I {}
main() => new C();
-""", """
+""",
+ """
abstract class I {
m();
}
class C extends I {}
main() => new C();
-"""]),
+"""
+ ]),
- MessageKind.UNIMPLEMENTED_METHOD:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_METHOD,
+ MessageKind.UNIMPLEMENTED_METHOD: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_METHOD,
"'#{class}' doesn't implement '#{method}'.",
howToFix: "Try adding an implementation of '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
abstract class I {
m();
}
@@ -2712,7 +2759,8 @@
main() {
new C();
}
-""", """
+""",
+ """
abstract class I {
m();
}
@@ -2726,19 +2774,21 @@
main() {
new C();
}
-"""]),
+"""
+ ]),
- MessageKind.UNIMPLEMENTED_METHOD_CONT:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_METHOD_CONT,
+ MessageKind.UNIMPLEMENTED_METHOD_CONT: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_METHOD_CONT,
"The method '#{name}' is declared here in class '#{class}'."),
- MessageKind.UNIMPLEMENTED_SETTER_ONE:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_SETTER_ONE,
+ MessageKind.UNIMPLEMENTED_SETTER_ONE: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_SETTER_ONE,
"'#{class}' doesn't implement the setter '#{name}' "
"declared in '#{declarer}'.",
howToFix: "Try adding an implementation of '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
abstract class I {
set m(_);
}
@@ -2750,14 +2800,16 @@
new D().m = 0;
new C();
}
-"""]),
+"""
+ ]),
- MessageKind.UNIMPLEMENTED_SETTER:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_SETTER,
+ MessageKind.UNIMPLEMENTED_SETTER: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_SETTER,
"'#{class}' doesn't implement the setter '#{name}'.",
howToFix: "Try adding an implementation of '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
abstract class I {
set m(_);
}
@@ -2766,7 +2818,8 @@
}
class C implements I, J {}
main() => new C();
-""", """
+""",
+ """
abstract class I {
set m(_);
}
@@ -2775,43 +2828,48 @@
}
class C extends I implements J {}
main() => new C();
-"""]),
+"""
+ ]),
- MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
+ MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
"The setter '#{name}' is declared here in class '#{class}'."),
- MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
+ MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
"The setter '#{name}' is implicitly declared by this field "
"in class '#{class}'."),
- MessageKind.UNIMPLEMENTED_GETTER_ONE:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_GETTER_ONE,
+ MessageKind.UNIMPLEMENTED_GETTER_ONE: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_GETTER_ONE,
"'#{class}' doesn't implement the getter '#{name}' "
"declared in '#{declarer}'.",
howToFix: "Try adding an implementation of '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
abstract class I {
get m;
}
class C implements I {}
main() => new C();
-""", """
+""",
+ """
abstract class I {
get m;
}
class C extends I {}
main() => new C();
-"""]),
+"""
+ ]),
- MessageKind.UNIMPLEMENTED_GETTER:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_GETTER,
+ MessageKind.UNIMPLEMENTED_GETTER: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_GETTER,
"'#{class}' doesn't implement the getter '#{name}'.",
howToFix: "Try adding an implementation of '#{name}' or declaring "
- "'#{class}' to be 'abstract'.",
- examples: const ["""
+ "'#{class}' to be 'abstract'.",
+ examples: const [
+ """
abstract class I {
get m;
}
@@ -2820,7 +2878,8 @@
}
class C implements I, J {}
main() => new C();
-""", """
+""",
+ """
abstract class I {
get m;
}
@@ -2829,239 +2888,248 @@
}
class C extends I implements J {}
main() => new C();
-"""]),
+"""
+ ]),
- MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
+ MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
"The getter '#{name}' is declared here in class '#{class}'."),
- MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER:
- const MessageTemplate(MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
+ MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER: const MessageTemplate(
+ MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
"The getter '#{name}' is implicitly declared by this field "
"in class '#{class}'."),
- MessageKind.INVALID_METADATA:
- const MessageTemplate(MessageKind.INVALID_METADATA,
+ MessageKind.INVALID_METADATA: const MessageTemplate(
+ MessageKind.INVALID_METADATA,
"A metadata annotation must be either a reference to a compile-time "
"constant variable or a call to a constant constructor.",
howToFix:
- "Try using a different constant value or referencing it through a "
- "constant variable.",
- examples: const [
-'@Object main() {}',
-'@print main() {}']),
+ "Try using a different constant value or referencing it through a "
+ "constant variable.",
+ examples: const ['@Object main() {}', '@print main() {}']),
- MessageKind.INVALID_METADATA_GENERIC:
- const MessageTemplate(MessageKind.INVALID_METADATA_GENERIC,
+ MessageKind.INVALID_METADATA_GENERIC: const MessageTemplate(
+ MessageKind.INVALID_METADATA_GENERIC,
"A metadata annotation using a constant constructor cannot use type "
"arguments.",
howToFix:
- "Try removing the type arguments or referencing the constant "
- "through a constant variable.",
- examples: const ['''
+ "Try removing the type arguments or referencing the constant "
+ "through a constant variable.",
+ examples: const [
+ '''
class C<T> {
const C();
}
@C<int>() main() {}
-''']),
+'''
+ ]),
- MessageKind.EQUAL_MAP_ENTRY_KEY:
- const MessageTemplate(MessageKind.EQUAL_MAP_ENTRY_KEY,
+ MessageKind.EQUAL_MAP_ENTRY_KEY: const MessageTemplate(
+ MessageKind.EQUAL_MAP_ENTRY_KEY,
"An entry with the same key already exists in the map.",
howToFix:
- "Try removing the previous entry or changing the key in one "
- "of the entries.",
- examples: const ["""
+ "Try removing the previous entry or changing the key in one "
+ "of the entries.",
+ examples: const [
+ """
main() {
var m = const {'foo': 1, 'foo': 2};
-}"""]),
+}"""
+ ]),
- MessageKind.BAD_INPUT_CHARACTER:
- const MessageTemplate(MessageKind.BAD_INPUT_CHARACTER,
+ MessageKind.BAD_INPUT_CHARACTER: const MessageTemplate(
+ MessageKind.BAD_INPUT_CHARACTER,
"Character U+#{characterHex} isn't allowed here.",
howToFix: DONT_KNOW_HOW_TO_FIX,
- examples: const ["""
+ examples: const [
+ """
main() {
String x = ç;
}
-"""]),
+"""
+ ]),
- MessageKind.UNTERMINATED_STRING:
- const MessageTemplate(MessageKind.UNTERMINATED_STRING,
- "String must end with #{quote}.",
+ MessageKind.UNTERMINATED_STRING: const MessageTemplate(
+ MessageKind.UNTERMINATED_STRING, "String must end with #{quote}.",
howToFix: DONT_KNOW_HOW_TO_FIX,
- examples: const ["""
+ examples: const [
+ """
main() {
return '
;
}
""",
-"""
+ """
main() {
return \"
;
}
""",
-"""
+ """
main() {
return r'
;
}
""",
-"""
+ """
main() {
return r\"
;
}
""",
-"""
+ """
main() => '''
""",
-"""
+ """
main() => \"\"\"
""",
-"""
+ """
main() => r'''
""",
-"""
+ """
main() => r\"\"\"
-"""]),
+"""
+ ]),
- MessageKind.UNMATCHED_TOKEN:
- const MessageTemplate(MessageKind.UNMATCHED_TOKEN,
+ MessageKind.UNMATCHED_TOKEN: const MessageTemplate(
+ MessageKind.UNMATCHED_TOKEN,
"Can't find '#{end}' to match '#{begin}'.",
howToFix: DONT_KNOW_HOW_TO_FIX,
- examples: const[
- "main(",
- "main(){",
- "main(){]}",
- ]),
+ examples: const ["main(", "main(){", "main(){]}",]),
- MessageKind.UNTERMINATED_TOKEN:
- const MessageTemplate(MessageKind.UNTERMINATED_TOKEN,
+ MessageKind.UNTERMINATED_TOKEN: const MessageTemplate(
+ MessageKind.UNTERMINATED_TOKEN,
// This is a fall-back message that shouldn't happen.
"Incomplete token."),
- MessageKind.EXPONENT_MISSING:
- const MessageTemplate(MessageKind.EXPONENT_MISSING,
+ MessageKind.EXPONENT_MISSING: const MessageTemplate(
+ MessageKind.EXPONENT_MISSING,
"Numbers in exponential notation should always contain an exponent"
" (an integer number with an optional sign).",
- howToFix:
- "Make sure there is an exponent, and remove any whitespace "
- "before it.",
- examples: const ["""
+ howToFix: "Make sure there is an exponent, and remove any whitespace "
+ "before it.",
+ examples: const [
+ """
main() {
var i = 1e;
}
-"""]),
+"""
+ ]),
- MessageKind.HEX_DIGIT_EXPECTED:
- const MessageTemplate(MessageKind.HEX_DIGIT_EXPECTED,
+ MessageKind.HEX_DIGIT_EXPECTED: const MessageTemplate(
+ MessageKind.HEX_DIGIT_EXPECTED,
"A hex digit (0-9 or A-F) must follow '0x'.",
howToFix:
- DONT_KNOW_HOW_TO_FIX, // Seems obvious from the error message.
- examples: const ["""
+ DONT_KNOW_HOW_TO_FIX, // Seems obvious from the error message.
+ examples: const [
+ """
main() {
var i = 0x;
}
-"""]),
+"""
+ ]),
- MessageKind.MALFORMED_STRING_LITERAL:
- const MessageTemplate(MessageKind.MALFORMED_STRING_LITERAL,
+ MessageKind.MALFORMED_STRING_LITERAL: const MessageTemplate(
+ MessageKind.MALFORMED_STRING_LITERAL,
r"A '$' has special meaning inside a string, and must be followed by "
"an identifier or an expression in curly braces ({}).",
howToFix: r"Try adding a backslash (\) to escape the '$'.",
- examples: const [r"""
+ examples: const [
+ r"""
main() {
return '$';
}
""",
-r'''
+ r'''
main() {
return "$";
}
''',
-r"""
+ r"""
main() {
return '''$''';
}
""",
-r'''
+ r'''
main() {
return """$""";
}
-''']),
+'''
+ ]),
- MessageKind.UNTERMINATED_COMMENT:
- const MessageTemplate(MessageKind.UNTERMINATED_COMMENT,
+ MessageKind.UNTERMINATED_COMMENT: const MessageTemplate(
+ MessageKind.UNTERMINATED_COMMENT,
"Comment starting with '/*' must end with '*/'.",
howToFix: DONT_KNOW_HOW_TO_FIX,
- examples: const [r"""
+ examples: const [
+ r"""
main() {
}
-/*"""]),
+/*"""
+ ]),
- MessageKind.MISSING_TOKEN_BEFORE_THIS:
- const MessageTemplate(MessageKind.MISSING_TOKEN_BEFORE_THIS,
+ MessageKind.MISSING_TOKEN_BEFORE_THIS: const MessageTemplate(
+ MessageKind.MISSING_TOKEN_BEFORE_THIS,
"Expected '#{token}' before this.",
// Consider the second example below: the parser expects a ')' before
// 'y', but a ',' would also have worked. We don't have enough
// information to give a good suggestion.
howToFix: DONT_KNOW_HOW_TO_FIX,
examples: const [
- "main() => true ? 1;",
- "main() => foo(x: 1 y: 2);",
- ]),
+ "main() => true ? 1;",
+ "main() => foo(x: 1 y: 2);",
+ ]),
- MessageKind.MISSING_TOKEN_AFTER_THIS:
- const MessageTemplate(MessageKind.MISSING_TOKEN_AFTER_THIS,
+ MessageKind.MISSING_TOKEN_AFTER_THIS: const MessageTemplate(
+ MessageKind.MISSING_TOKEN_AFTER_THIS,
"Expected '#{token}' after this.",
// See [MISSING_TOKEN_BEFORE_THIS], we don't have enough information
// to give a good suggestion.
howToFix: DONT_KNOW_HOW_TO_FIX,
examples: const [
- "main(x) {x}",
-"""
+ "main(x) {x}",
+ """
class S1 {}
class S2 {}
class S3 {}
class A = S1 with S2, S3
main() => new A();
"""
-]),
+ ]),
- MessageKind.CONSIDER_ANALYZE_ALL:
- const MessageTemplate(MessageKind.CONSIDER_ANALYZE_ALL,
+ MessageKind.CONSIDER_ANALYZE_ALL: const MessageTemplate(
+ MessageKind.CONSIDER_ANALYZE_ALL,
"Could not find '#{main}'. Nothing will be analyzed.",
howToFix: "Try using '--analyze-all' to analyze everything.",
examples: const ['']),
- MessageKind.MISSING_MAIN:
- const MessageTemplate(MessageKind.MISSING_MAIN,
- "Could not find '#{main}'.",
+ MessageKind.MISSING_MAIN: const MessageTemplate(
+ MessageKind.MISSING_MAIN, "Could not find '#{main}'.",
howToFix: "Try adding a method named '#{main}' to your program."
/* No example, test uses '--analyze-only' which will produce the above
* message [CONSIDER_ANALYZE_ALL]. An example for a human operator
- * would be an empty file.*/),
+ * would be an empty file.*/
+ ),
- MessageKind.MAIN_NOT_A_FUNCTION:
- const MessageTemplate(MessageKind.MAIN_NOT_A_FUNCTION,
- "'#{main}' is not a function.",
+ MessageKind.MAIN_NOT_A_FUNCTION: const MessageTemplate(
+ MessageKind.MAIN_NOT_A_FUNCTION, "'#{main}' is not a function.",
howToFix: DONT_KNOW_HOW_TO_FIX, /* Don't state the obvious. */
examples: const ['var main;']),
- MessageKind.MAIN_WITH_EXTRA_PARAMETER:
- const MessageTemplate(MessageKind.MAIN_WITH_EXTRA_PARAMETER,
+ MessageKind.MAIN_WITH_EXTRA_PARAMETER: const MessageTemplate(
+ MessageKind.MAIN_WITH_EXTRA_PARAMETER,
"'#{main}' cannot have more than two parameters.",
howToFix: DONT_KNOW_HOW_TO_FIX, /* Don't state the obvious. */
examples: const ['main(a, b, c) {}']),
- MessageKind.COMPILER_CRASHED:
- const MessageTemplate(MessageKind.COMPILER_CRASHED,
+ MessageKind.COMPILER_CRASHED: const MessageTemplate(
+ MessageKind.COMPILER_CRASHED,
"The compiler crashed when compiling this element."),
- MessageKind.PLEASE_REPORT_THE_CRASH:
- const MessageTemplate(MessageKind.PLEASE_REPORT_THE_CRASH, '''
+ MessageKind.PLEASE_REPORT_THE_CRASH: const MessageTemplate(
+ MessageKind.PLEASE_REPORT_THE_CRASH,
+ '''
The compiler is broken.
When compiling the above element, the compiler crashed. It is not
@@ -3081,105 +3149,104 @@
below as well as the source location above).
'''),
- MessageKind.POTENTIAL_MUTATION:
- const MessageTemplate(MessageKind.POTENTIAL_MUTATION,
+ MessageKind.POTENTIAL_MUTATION: const MessageTemplate(
+ MessageKind.POTENTIAL_MUTATION,
"Variable '#{variableName}' is not known to be of type "
"'#{shownType}' because it is potentially mutated in the scope for "
"promotion."),
- MessageKind.POTENTIAL_MUTATION_HERE:
- const MessageTemplate(MessageKind.POTENTIAL_MUTATION_HERE,
+ MessageKind.POTENTIAL_MUTATION_HERE: const MessageTemplate(
+ MessageKind.POTENTIAL_MUTATION_HERE,
"Variable '#{variableName}' is potentially mutated here."),
- MessageKind.POTENTIAL_MUTATION_IN_CLOSURE:
- const MessageTemplate(MessageKind.POTENTIAL_MUTATION_IN_CLOSURE,
+ MessageKind.POTENTIAL_MUTATION_IN_CLOSURE: const MessageTemplate(
+ MessageKind.POTENTIAL_MUTATION_IN_CLOSURE,
"Variable '#{variableName}' is not known to be of type "
"'#{shownType}' because it is potentially mutated within a closure."),
- MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE:
- const MessageTemplate(MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE,
- "Variable '#{variableName}' is potentially mutated in a "
- "closure here."),
+ MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE: const MessageTemplate(
+ MessageKind.POTENTIAL_MUTATION_IN_CLOSURE_HERE,
+ "Variable '#{variableName}' is potentially mutated in a "
+ "closure here."),
- MessageKind.ACCESSED_IN_CLOSURE:
- const MessageTemplate(MessageKind.ACCESSED_IN_CLOSURE,
+ MessageKind.ACCESSED_IN_CLOSURE: const MessageTemplate(
+ MessageKind.ACCESSED_IN_CLOSURE,
"Variable '#{variableName}' is not known to be of type "
"'#{shownType}' because it is accessed by a closure in the scope for "
"promotion and potentially mutated in the scope of "
"'#{variableName}'."),
- MessageKind.ACCESSED_IN_CLOSURE_HERE:
- const MessageTemplate(MessageKind.ACCESSED_IN_CLOSURE_HERE,
+ MessageKind.ACCESSED_IN_CLOSURE_HERE: const MessageTemplate(
+ MessageKind.ACCESSED_IN_CLOSURE_HERE,
"Variable '#{variableName}' is accessed in a closure here."),
- MessageKind.NOT_MORE_SPECIFIC:
- const MessageTemplate(MessageKind.NOT_MORE_SPECIFIC,
+ MessageKind.NOT_MORE_SPECIFIC: const MessageTemplate(
+ MessageKind.NOT_MORE_SPECIFIC,
"Variable '#{variableName}' is not shown to have type "
"'#{shownType}' because '#{shownType}' is not more specific than the "
"known type '#{knownType}' of '#{variableName}'."),
- MessageKind.NOT_MORE_SPECIFIC_SUBTYPE:
- const MessageTemplate(MessageKind.NOT_MORE_SPECIFIC_SUBTYPE,
+ MessageKind.NOT_MORE_SPECIFIC_SUBTYPE: const MessageTemplate(
+ MessageKind.NOT_MORE_SPECIFIC_SUBTYPE,
"Variable '#{variableName}' is not shown to have type "
"'#{shownType}' because '#{shownType}' is not a subtype of the "
"known type '#{knownType}' of '#{variableName}'."),
- MessageKind.NOT_MORE_SPECIFIC_SUGGESTION:
- const MessageTemplate(MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
+ MessageKind.NOT_MORE_SPECIFIC_SUGGESTION: const MessageTemplate(
+ MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
"Variable '#{variableName}' is not shown to have type "
"'#{shownType}' because '#{shownType}' is not more specific than the "
"known type '#{knownType}' of '#{variableName}'.",
howToFix:
- "Try replacing '#{shownType}' with '#{shownTypeSuggestion}'."),
+ "Try replacing '#{shownType}' with '#{shownTypeSuggestion}'."),
- MessageKind.NO_COMMON_SUBTYPES:
- const MessageTemplate(MessageKind.NO_COMMON_SUBTYPES,
- "Types '#{left}' and '#{right}' have no common subtypes."),
+ MessageKind.NO_COMMON_SUBTYPES: const MessageTemplate(
+ MessageKind.NO_COMMON_SUBTYPES,
+ "Types '#{left}' and '#{right}' have no common subtypes."),
- MessageKind.HIDDEN_WARNINGS_HINTS:
- const MessageTemplate(MessageKind.HIDDEN_WARNINGS_HINTS,
+ MessageKind.HIDDEN_WARNINGS_HINTS: const MessageTemplate(
+ MessageKind.HIDDEN_WARNINGS_HINTS,
"#{warnings} warning(s) and #{hints} hint(s) suppressed in #{uri}."),
- MessageKind.HIDDEN_WARNINGS:
- const MessageTemplate(MessageKind.HIDDEN_WARNINGS,
+ MessageKind.HIDDEN_WARNINGS: const MessageTemplate(
+ MessageKind.HIDDEN_WARNINGS,
"#{warnings} warning(s) suppressed in #{uri}."),
- MessageKind.HIDDEN_HINTS:
- const MessageTemplate(MessageKind.HIDDEN_HINTS,
- "#{hints} hint(s) suppressed in #{uri}."),
+ MessageKind.HIDDEN_HINTS: const MessageTemplate(
+ MessageKind.HIDDEN_HINTS, "#{hints} hint(s) suppressed in #{uri}."),
- MessageKind.PREAMBLE:
- const MessageTemplate(MessageKind.PREAMBLE,
- "When run on the command-line, the compiled output might"
- " require a preamble file located in:\n"
- " <sdk>/lib/_internal/js_runtime/lib/preambles."),
+ MessageKind.PREAMBLE: const MessageTemplate(
+ MessageKind.PREAMBLE,
+ "When run on the command-line, the compiled output might"
+ " require a preamble file located in:\n"
+ " <sdk>/lib/_internal/js_runtime/lib/preambles."),
- MessageKind.INVALID_SYNC_MODIFIER:
- const MessageTemplate(MessageKind.INVALID_SYNC_MODIFIER,
- "Invalid modifier 'sync'.",
+ MessageKind.INVALID_SYNC_MODIFIER: const MessageTemplate(
+ MessageKind.INVALID_SYNC_MODIFIER, "Invalid modifier 'sync'.",
howToFix: "Try replacing 'sync' with 'sync*'.",
- examples: const [
- "main() sync {}"
- ]),
+ examples: const ["main() sync {}"]),
- MessageKind.INVALID_AWAIT_FOR:
- const MessageTemplate(MessageKind.INVALID_AWAIT_FOR,
+ MessageKind.INVALID_AWAIT_FOR: const MessageTemplate(
+ MessageKind.INVALID_AWAIT_FOR,
"'await' is only supported on for-in loops.",
howToFix: "Try rewriting the loop as a for-in loop or removing the "
- "'await' keyword.",
- examples: const ["""
+ "'await' keyword.",
+ examples: const [
+ """
main() async* {
await for (int i = 0; i < 10; i++) {}
}
-"""]),
+"""
+ ]),
- MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD:
- const MessageTemplate(MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD,
+ MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD: const MessageTemplate(
+ MessageKind.ASYNC_MODIFIER_ON_ABSTRACT_METHOD,
"The modifier '#{modifier}' is not allowed on an abstract method.",
options: const ['--enable-async'],
howToFix: "Try removing the '#{modifier}' modifier or adding a "
- "body to the method.",
- examples: const ["""
+ "body to the method.",
+ examples: const [
+ """
abstract class A {
method() async;
}
@@ -3190,300 +3257,316 @@
A a = new B();
a.method();
}
-"""]),
+"""
+ ]),
- MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR:
- const MessageTemplate(MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR,
- "The modifier '#{modifier}' is not allowed on constructors.",
- options: const ['--enable-async'],
- howToFix: "Try removing the '#{modifier}' modifier.",
- examples: const ["""
+ MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.ASYNC_MODIFIER_ON_CONSTRUCTOR,
+ "The modifier '#{modifier}' is not allowed on constructors.",
+ options: const ['--enable-async'],
+ howToFix: "Try removing the '#{modifier}' modifier.",
+ examples: const [
+ """
class A {
A() async;
}
main() => new A();""",
-
-"""
+ """
class A {
A();
factory A.a() async* {}
}
-main() => new A.a();"""]),
+main() => new A.a();"""
+ ]),
- MessageKind.ASYNC_MODIFIER_ON_SETTER:
- const MessageTemplate(MessageKind.ASYNC_MODIFIER_ON_SETTER,
- "The modifier '#{modifier}' is not allowed on setters.",
- options: const ['--enable-async'],
- howToFix: "Try removing the '#{modifier}' modifier.",
- examples: const ["""
+ MessageKind.ASYNC_MODIFIER_ON_SETTER: const MessageTemplate(
+ MessageKind.ASYNC_MODIFIER_ON_SETTER,
+ "The modifier '#{modifier}' is not allowed on setters.",
+ options: const ['--enable-async'],
+ howToFix: "Try removing the '#{modifier}' modifier.",
+ examples: const [
+ """
class A {
set foo(v) async {}
}
-main() => new A().foo = 0;"""]),
+main() => new A().foo = 0;"""
+ ]),
- MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY:
- const MessageTemplate(MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY,
+ MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY: const MessageTemplate(
+ MessageKind.YIELDING_MODIFIER_ON_ARROW_BODY,
"The modifier '#{modifier}' is not allowed on methods implemented "
"using '=>'.",
options: const ['--enable-async'],
howToFix: "Try removing the '#{modifier}' modifier or implementing "
- "the method body using a block: '{ ... }'.",
+ "the method body using a block: '{ ... }'.",
examples: const ["main() sync* => null;", "main() async* => null;"]),
// TODO(johnniwinther): Check for 'async' as identifier.
- MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER:
- const MessageTemplate(MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER,
+ MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER: const MessageTemplate(
+ MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER,
"'#{keyword}' cannot be used as an identifier in a function body "
"marked with '#{modifier}'.",
options: const ['--enable-async'],
howToFix: "Try removing the '#{modifier}' modifier or renaming the "
- "identifier.",
- examples: const ["""
+ "identifier.",
+ examples: const [
+ """
main() async {
var await;
}""",
-"""
+ """
main() async* {
var yield;
}""",
-"""
+ """
main() sync* {
var yield;
-}"""]),
+}"""
+ ]),
- MessageKind.NATIVE_NOT_SUPPORTED:
- const MessageTemplate(MessageKind.NATIVE_NOT_SUPPORTED,
+ MessageKind.NATIVE_NOT_SUPPORTED: const MessageTemplate(
+ MessageKind.NATIVE_NOT_SUPPORTED,
"'native' modifier is not supported.",
howToFix: "Try removing the 'native' implementation or analyzing the "
- "code with the --allow-native-extensions option.",
- examples: const ["""
+ "code with the --allow-native-extensions option.",
+ examples: const [
+ """
main() native "Main";
-"""]),
+"""
+ ]),
- MessageKind.DART_EXT_NOT_SUPPORTED:
- const MessageTemplate(MessageKind.DART_EXT_NOT_SUPPORTED,
+ MessageKind.DART_EXT_NOT_SUPPORTED: const MessageTemplate(
+ MessageKind.DART_EXT_NOT_SUPPORTED,
"The 'dart-ext' scheme is not supported.",
howToFix: "Try analyzing the code with the --allow-native-extensions "
- "option.",
- examples: const ["""
+ "option.",
+ examples: const [
+ """
import 'dart-ext:main';
main() {}
-"""]),
+"""
+ ]),
- MessageKind.LIBRARY_TAG_MUST_BE_FIRST:
- const MessageTemplate(MessageKind.LIBRARY_TAG_MUST_BE_FIRST,
+ MessageKind.LIBRARY_TAG_MUST_BE_FIRST: const MessageTemplate(
+ MessageKind.LIBRARY_TAG_MUST_BE_FIRST,
"The library declaration should come before other declarations.",
howToFix: "Try moving the declaration to the top of the file.",
examples: const [
-"""
+ """
import 'dart:core';
library foo;
main() {}
""",
- ]),
+ ]),
- MessageKind.ONLY_ONE_LIBRARY_TAG:
- const MessageTemplate(MessageKind.ONLY_ONE_LIBRARY_TAG,
+ MessageKind.ONLY_ONE_LIBRARY_TAG: const MessageTemplate(
+ MessageKind.ONLY_ONE_LIBRARY_TAG,
"There can only be one library declaration.",
howToFix: "Try removing all other library declarations.",
examples: const [
-"""
+ """
library foo;
library bar;
main() {}
""",
-"""
+ """
library foo;
import 'dart:core';
library bar;
main() {}
""",
- ]),
+ ]),
- MessageKind.IMPORT_BEFORE_PARTS:
- const MessageTemplate(MessageKind.IMPORT_BEFORE_PARTS,
+ MessageKind.IMPORT_BEFORE_PARTS: const MessageTemplate(
+ MessageKind.IMPORT_BEFORE_PARTS,
"Import declarations should come before parts.",
howToFix: "Try moving this import further up in the file.",
examples: const [
- const <String, String>{
- 'main.dart': """
+ const <String, String>{
+ 'main.dart': """
library test.main;
part 'part.dart';
import 'dart:core';
main() {}
""",
- 'part.dart': """
+ 'part.dart': """
part of test.main;
""",
- }]),
+ }
+ ]),
- MessageKind.EXPORT_BEFORE_PARTS:
- const MessageTemplate(MessageKind.EXPORT_BEFORE_PARTS,
+ MessageKind.EXPORT_BEFORE_PARTS: const MessageTemplate(
+ MessageKind.EXPORT_BEFORE_PARTS,
"Export declarations should come before parts.",
howToFix: "Try moving this export further up in the file.",
examples: const [
- const <String, String>{
- 'main.dart': """
+ const <String, String>{
+ 'main.dart': """
library test.main;
part 'part.dart';
export 'dart:core';
main() {}
""",
- 'part.dart': """
+ 'part.dart': """
part of test.main;
""",
- }]),
+ }
+ ]),
- //////////////////////////////////////////////////////////////////////////////
- // Patch errors start.
- //////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+ // Patch errors start.
+ //////////////////////////////////////////////////////////////////////////////
- MessageKind.PATCH_RETURN_TYPE_MISMATCH:
- const MessageTemplate(MessageKind.PATCH_RETURN_TYPE_MISMATCH,
+ MessageKind.PATCH_RETURN_TYPE_MISMATCH: const MessageTemplate(
+ MessageKind.PATCH_RETURN_TYPE_MISMATCH,
"Patch return type '#{patchReturnType}' does not match "
"'#{originReturnType}' on origin method '#{methodName}'."),
- MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH:
- const MessageTemplate(
+ MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH: const MessageTemplate(
MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH,
"Required parameter count of patch method "
"(#{patchParameterCount}) does not match parameter count on origin "
"method '#{methodName}' (#{originParameterCount})."),
- MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH:
- const MessageTemplate(
+ MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH: const MessageTemplate(
MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH,
"Optional parameter count of patch method "
"(#{patchParameterCount}) does not match parameter count on origin "
"method '#{methodName}' (#{originParameterCount})."),
MessageKind.PATCH_OPTIONAL_PARAMETER_NAMED_MISMATCH:
- const MessageTemplate(
- MessageKind.PATCH_OPTIONAL_PARAMETER_NAMED_MISMATCH,
- "Optional parameters of origin and patch method "
- "'#{methodName}' must both be either named or positional."),
+ const MessageTemplate(
+ MessageKind.PATCH_OPTIONAL_PARAMETER_NAMED_MISMATCH,
+ "Optional parameters of origin and patch method "
+ "'#{methodName}' must both be either named or positional."),
- MessageKind.PATCH_PARAMETER_MISMATCH:
- const MessageTemplate(MessageKind.PATCH_PARAMETER_MISMATCH,
+ MessageKind.PATCH_PARAMETER_MISMATCH: const MessageTemplate(
+ MessageKind.PATCH_PARAMETER_MISMATCH,
"Patch method parameter '#{patchParameter}' does not match "
"'#{originParameter}' on origin method '#{methodName}'."),
- MessageKind.PATCH_PARAMETER_TYPE_MISMATCH:
- const MessageTemplate(MessageKind.PATCH_PARAMETER_TYPE_MISMATCH,
+ MessageKind.PATCH_PARAMETER_TYPE_MISMATCH: const MessageTemplate(
+ MessageKind.PATCH_PARAMETER_TYPE_MISMATCH,
"Patch method parameter '#{parameterName}' type "
"'#{patchParameterType}' does not match '#{originParameterType}' on "
"origin method '#{methodName}'."),
- MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION:
- const MessageTemplate(MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION,
+ MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION: const MessageTemplate(
+ MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION,
"External method without an implementation."),
- MessageKind.PATCH_POINT_TO_FUNCTION:
- const MessageTemplate(MessageKind.PATCH_POINT_TO_FUNCTION,
+ MessageKind.PATCH_POINT_TO_FUNCTION: const MessageTemplate(
+ MessageKind.PATCH_POINT_TO_FUNCTION,
"This is the function patch '#{functionName}'."),
- MessageKind.PATCH_POINT_TO_CLASS:
- const MessageTemplate(MessageKind.PATCH_POINT_TO_CLASS,
+ MessageKind.PATCH_POINT_TO_CLASS: const MessageTemplate(
+ MessageKind.PATCH_POINT_TO_CLASS,
"This is the class patch '#{className}'."),
- MessageKind.PATCH_POINT_TO_GETTER:
- const MessageTemplate(MessageKind.PATCH_POINT_TO_GETTER,
+ MessageKind.PATCH_POINT_TO_GETTER: const MessageTemplate(
+ MessageKind.PATCH_POINT_TO_GETTER,
"This is the getter patch '#{getterName}'."),
- MessageKind.PATCH_POINT_TO_SETTER:
- const MessageTemplate(MessageKind.PATCH_POINT_TO_SETTER,
+ MessageKind.PATCH_POINT_TO_SETTER: const MessageTemplate(
+ MessageKind.PATCH_POINT_TO_SETTER,
"This is the setter patch '#{setterName}'."),
- MessageKind.PATCH_POINT_TO_CONSTRUCTOR:
- const MessageTemplate(MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
+ MessageKind.PATCH_POINT_TO_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
"This is the constructor patch '#{constructorName}'."),
- MessageKind.PATCH_POINT_TO_PARAMETER:
- const MessageTemplate(MessageKind.PATCH_POINT_TO_PARAMETER,
+ MessageKind.PATCH_POINT_TO_PARAMETER: const MessageTemplate(
+ MessageKind.PATCH_POINT_TO_PARAMETER,
"This is the patch parameter '#{parameterName}'."),
- MessageKind.PATCH_NON_EXISTING:
- const MessageTemplate(MessageKind.PATCH_NON_EXISTING,
+ MessageKind.PATCH_NON_EXISTING: const MessageTemplate(
+ MessageKind.PATCH_NON_EXISTING,
"Origin does not exist for patch '#{name}'."),
// TODO(ahe): Eventually, this error should be removed as it will be
// handled by the regular parser.
- MessageKind.PATCH_NONPATCHABLE:
- const MessageTemplate(MessageKind.PATCH_NONPATCHABLE,
+ MessageKind.PATCH_NONPATCHABLE: const MessageTemplate(
+ MessageKind.PATCH_NONPATCHABLE,
"Only classes and functions can be patched."),
- MessageKind.PATCH_NON_EXTERNAL:
- const MessageTemplate(MessageKind.PATCH_NON_EXTERNAL,
+ MessageKind.PATCH_NON_EXTERNAL: const MessageTemplate(
+ MessageKind.PATCH_NON_EXTERNAL,
"Only external functions can be patched."),
- MessageKind.PATCH_NON_CLASS:
- const MessageTemplate(MessageKind.PATCH_NON_CLASS,
+ MessageKind.PATCH_NON_CLASS: const MessageTemplate(
+ MessageKind.PATCH_NON_CLASS,
"Patching non-class with class patch '#{className}'."),
- MessageKind.PATCH_NON_GETTER:
- const MessageTemplate(MessageKind.PATCH_NON_GETTER,
+ MessageKind.PATCH_NON_GETTER: const MessageTemplate(
+ MessageKind.PATCH_NON_GETTER,
"Cannot patch non-getter '#{name}' with getter patch."),
- MessageKind.PATCH_NO_GETTER:
- const MessageTemplate(MessageKind.PATCH_NO_GETTER,
+ MessageKind.PATCH_NO_GETTER: const MessageTemplate(
+ MessageKind.PATCH_NO_GETTER,
"No getter found for getter patch '#{getterName}'."),
- MessageKind.PATCH_NON_SETTER:
- const MessageTemplate(MessageKind.PATCH_NON_SETTER,
+ MessageKind.PATCH_NON_SETTER: const MessageTemplate(
+ MessageKind.PATCH_NON_SETTER,
"Cannot patch non-setter '#{name}' with setter patch."),
- MessageKind.PATCH_NO_SETTER:
- const MessageTemplate(MessageKind.PATCH_NO_SETTER,
+ MessageKind.PATCH_NO_SETTER: const MessageTemplate(
+ MessageKind.PATCH_NO_SETTER,
"No setter found for setter patch '#{setterName}'."),
- MessageKind.PATCH_NON_CONSTRUCTOR:
- const MessageTemplate(MessageKind.PATCH_NON_CONSTRUCTOR,
+ MessageKind.PATCH_NON_CONSTRUCTOR: const MessageTemplate(
+ MessageKind.PATCH_NON_CONSTRUCTOR,
"Cannot patch non-constructor with constructor patch "
"'#{constructorName}'."),
- MessageKind.PATCH_NON_FUNCTION:
- const MessageTemplate(MessageKind.PATCH_NON_FUNCTION,
+ MessageKind.PATCH_NON_FUNCTION: const MessageTemplate(
+ MessageKind.PATCH_NON_FUNCTION,
"Cannot patch non-function with function patch "
"'#{functionName}'."),
- MessageKind.INJECTED_PUBLIC_MEMBER:
- const MessageTemplate(MessageKind.INJECTED_PUBLIC_MEMBER,
- "Non-patch members in patch libraries must be private."),
+ MessageKind.INJECTED_PUBLIC_MEMBER: const MessageTemplate(
+ MessageKind.INJECTED_PUBLIC_MEMBER,
+ "Non-patch members in patch libraries must be private."),
- MessageKind.EXTERNAL_WITH_BODY:
- const MessageTemplate(MessageKind.EXTERNAL_WITH_BODY,
+ MessageKind.EXTERNAL_WITH_BODY: const MessageTemplate(
+ MessageKind.EXTERNAL_WITH_BODY,
"External function '#{functionName}' cannot have a function body.",
options: const ["--output-type=dart"],
howToFix:
- "Try removing the 'external' modifier or the function body.",
- examples: const ["""
+ "Try removing the 'external' modifier or the function body.",
+ examples: const [
+ """
external foo() => 0;
main() => foo();
-""", """
+""",
+ """
external foo() {}
main() => foo();
-"""]),
+"""
+ ]),
- //////////////////////////////////////////////////////////////////////////////
- // Patch errors end.
- //////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////
+ // Patch errors end.
+ //////////////////////////////////////////////////////////////////////////////
- MessageKind.EXPERIMENTAL_ASSERT_MESSAGE:
- const MessageTemplate(MessageKind.EXPERIMENTAL_ASSERT_MESSAGE,
+ MessageKind.EXPERIMENTAL_ASSERT_MESSAGE: const MessageTemplate(
+ MessageKind.EXPERIMENTAL_ASSERT_MESSAGE,
"Experimental language feature 'assertion with message'"
" is not supported.",
howToFix:
- "Use option '--assert-message' to use assertions with messages.",
- examples: const [r'''
+ "Use option '--assert-message' to use assertions with messages.",
+ examples: const [
+ r'''
main() {
int n = -7;
assert(n > 0, 'must be positive: $n');
}
-''']),
+'''
+ ]),
- MessageKind.IMPORT_EXPERIMENTAL_MIRRORS:
- const MessageTemplate(MessageKind.IMPORT_EXPERIMENTAL_MIRRORS, r'''
+ MessageKind.IMPORT_EXPERIMENTAL_MIRRORS: const MessageTemplate(
+ MessageKind.IMPORT_EXPERIMENTAL_MIRRORS,
+ r'''
****************************************************************
* WARNING: dart:mirrors support in dart2js is experimental,
@@ -3492,7 +3575,8 @@
* and often greatly increases the size of the generated
* JavaScript code.
*
-* Your app imports dart:mirrors via:''''''
+* Your app imports dart:mirrors via:'''
+ '''
$IMPORT_EXPERIMENTAL_MIRRORS_PADDING#{importChain}
*
* You can disable this message by using the --enable-experimental-mirrors
@@ -3503,57 +3587,58 @@
****************************************************************
'''),
- MessageKind.DISALLOWED_LIBRARY_IMPORT:
- const MessageTemplate(MessageKind.DISALLOWED_LIBRARY_IMPORT, '''
+ MessageKind.DISALLOWED_LIBRARY_IMPORT: const MessageTemplate(
+ MessageKind.DISALLOWED_LIBRARY_IMPORT,
+ '''
Your app imports the unsupported library '#{uri}' via:
-''''''
+'''
+ '''
$DISALLOWED_LIBRARY_IMPORT_PADDING#{importChain}
Use the --categories option to support import of '#{uri}'.
'''),
- MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND:
- const MessageTemplate(
+ MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND: const MessageTemplate(
MessageKind.MIRRORS_LIBRARY_NOT_SUPPORT_BY_BACKEND,
"""
dart:mirrors library is not supported when using this backend.
-Your app imports dart:mirrors via:""""""
+Your app imports dart:mirrors via:"""
+ """
$MIRRORS_NOT_SUPPORTED_BY_BACKEND_PADDING#{importChain}"""),
- MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS:
- const MessageTemplate(MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS,
+ MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS: const MessageTemplate(
+ MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS,
"Non-supported 'call' member on a native class, or a "
"subclass of a native class."),
- MessageKind.DIRECTLY_THROWING_NSM:
- const MessageTemplate(MessageKind.DIRECTLY_THROWING_NSM,
+ MessageKind.DIRECTLY_THROWING_NSM: const MessageTemplate(
+ MessageKind.DIRECTLY_THROWING_NSM,
"This 'noSuchMethod' implementation is guaranteed to throw an "
"exception. The generated code will be smaller if it is "
"rewritten.",
howToFix: "Rewrite to "
- "'noSuchMethod(Invocation i) => super.noSuchMethod(i);'."),
+ "'noSuchMethod(Invocation i) => super.noSuchMethod(i);'."),
- MessageKind.COMPLEX_THROWING_NSM:
- const MessageTemplate(MessageKind.COMPLEX_THROWING_NSM,
+ MessageKind.COMPLEX_THROWING_NSM: const MessageTemplate(
+ MessageKind.COMPLEX_THROWING_NSM,
"This 'noSuchMethod' implementation is guaranteed to throw an "
"exception. The generated code will be smaller and the compiler "
"will be able to perform more optimizations if it is rewritten.",
howToFix: "Rewrite to "
- "'noSuchMethod(Invocation i) => super.noSuchMethod(i);'."),
+ "'noSuchMethod(Invocation i) => super.noSuchMethod(i);'."),
- MessageKind.COMPLEX_RETURNING_NSM:
- const MessageTemplate(MessageKind.COMPLEX_RETURNING_NSM,
+ MessageKind.COMPLEX_RETURNING_NSM: const MessageTemplate(
+ MessageKind.COMPLEX_RETURNING_NSM,
"Overriding 'noSuchMethod' causes the compiler to generate "
"more code and prevents the compiler from doing some optimizations.",
howToFix: "Consider removing this 'noSuchMethod' implementation."),
- MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP:
- const MessageTemplate(MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP,
+ MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP: const MessageTemplate(
+ MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP,
"Unsupported version of package:lookup_map.",
howToFix: DONT_KNOW_HOW_TO_FIX),
-
- }); // End of TEMPLATES.
+ }); // End of TEMPLATES.
/// Padding used before and between import chains in the message for
/// [MessageKind.IMPORT_EXPERIMENTAL_MIRRORS].
@@ -3583,7 +3668,10 @@
String message;
Message(this.template, this.arguments, this.terse) {
- assert(() { computeMessage(); return true; });
+ assert(() {
+ computeMessage();
+ return true;
+ });
}
MessageKind get kind => template.kind;
@@ -3597,7 +3685,7 @@
assert(invariant(
CURRENT_ELEMENT_SPANNABLE,
kind == MessageKind.GENERIC ||
- !message.contains(new RegExp(r'#\{.+\}')),
+ !message.contains(new RegExp(r'#\{.+\}')),
message: 'Missing arguments in error message: "$message"'));
if (!terse && template.hasHowToFix) {
String howToFix = template.howToFix;
@@ -3614,8 +3702,8 @@
return computeMessage();
}
- bool operator==(other) {
- if (other is !Message) return false;
+ bool operator ==(other) {
+ if (other is! Message) return false;
return (template == other.template) && (toString() == other.toString());
}
diff --git a/pkg/compiler/lib/src/diagnostics/source_span.dart b/pkg/compiler/lib/src/diagnostics/source_span.dart
index 25bdc6c..d53ebae 100644
--- a/pkg/compiler/lib/src/diagnostics/source_span.dart
+++ b/pkg/compiler/lib/src/diagnostics/source_span.dart
@@ -4,12 +4,9 @@
library dart2js.diagnostics.source_span;
-import '../tokens/token.dart' show
- Token;
-import '../tree/tree.dart' show
- Node;
-import 'spannable.dart' show
- Spannable;
+import '../tokens/token.dart' show Token;
+import '../tree/tree.dart' show Node;
+import 'spannable.dart' show Spannable;
class SourceSpan implements Spannable {
final Uri uri;
@@ -34,17 +31,13 @@
}
int get hashCode {
- return 13 * uri.hashCode +
- 17 * begin.hashCode +
- 19 * end.hashCode;
+ return 13 * uri.hashCode + 17 * begin.hashCode + 19 * end.hashCode;
}
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! SourceSpan) return false;
- return uri == other.uri &&
- begin == other.begin &&
- end == other.end;
+ return uri == other.uri && begin == other.begin && end == other.end;
}
String toString() => 'SourceSpan($uri, $begin, $end)';
diff --git a/pkg/compiler/lib/src/diagnostics/spannable.dart b/pkg/compiler/lib/src/diagnostics/spannable.dart
index ea9ae1f..3c8b6d1 100644
--- a/pkg/compiler/lib/src/diagnostics/spannable.dart
+++ b/pkg/compiler/lib/src/diagnostics/spannable.dart
@@ -28,8 +28,7 @@
/// Sentinel spannable used to mark that there might be no location for the
/// diagnostic. Use this only when it is not an error not to have a current
/// element.
-const Spannable NO_LOCATION_SPANNABLE =
- const _SpannableSentinel("No location");
+const Spannable NO_LOCATION_SPANNABLE = const _SpannableSentinel("No location");
class SpannableAssertionFailure {
final Spannable node;
@@ -37,5 +36,5 @@
SpannableAssertionFailure(this.node, this.message);
String toString() => 'Assertion failure'
- '${message != null ? ': $message' : ''}';
+ '${message != null ? ': $message' : ''}';
}
diff --git a/pkg/compiler/lib/src/dump_info.dart b/pkg/compiler/lib/src/dump_info.dart
index 109cd312..726d914 100644
--- a/pkg/compiler/lib/src/dump_info.dart
+++ b/pkg/compiler/lib/src/dump_info.dart
@@ -4,41 +4,26 @@
library dump_info;
-import 'dart:convert' show
- ChunkedConversionSink,
- HtmlEscape,
- JsonEncoder,
- StringConversionSink;
+import 'dart:convert'
+ show ChunkedConversionSink, HtmlEscape, JsonEncoder, StringConversionSink;
import 'package:dart2js_info/info.dart';
import 'common.dart';
-import 'common/tasks.dart' show
- CompilerTask;
-import 'constants/values.dart' show
- ConstantValue,
- InterceptorConstantValue;
-import 'compiler.dart' show
- Compiler;
-import 'deferred_load.dart' show
- OutputUnit;
+import 'common/tasks.dart' show CompilerTask;
+import 'constants/values.dart' show ConstantValue, InterceptorConstantValue;
+import 'compiler.dart' show Compiler;
+import 'deferred_load.dart' show OutputUnit;
import 'elements/elements.dart';
import 'elements/visitor.dart';
-import 'info/send_info.dart' show
- collectSendMeasurements;
-import 'js_backend/js_backend.dart' show
- JavaScriptBackend;
-import 'js_emitter/full_emitter/emitter.dart' as full show
- Emitter;
+import 'info/send_info.dart' show collectSendMeasurements;
+import 'js_backend/js_backend.dart' show JavaScriptBackend;
+import 'js_emitter/full_emitter/emitter.dart' as full show Emitter;
import 'js/js.dart' as jsAst;
-import 'types/types.dart' show
- TypeMask;
-import 'universe/universe.dart' show
- ReceiverConstraint;
-import 'universe/world_impact.dart' show
- ImpactUseCase,
- WorldImpact,
- WorldImpactVisitorImpl;
+import 'types/types.dart' show TypeMask;
+import 'universe/universe.dart' show ReceiverConstraint;
+import 'universe/world_impact.dart'
+ show ImpactUseCase, WorldImpact, WorldImpactVisitorImpl;
class ElementInfoCollector extends BaseElementVisitor<Info, dynamic> {
final Compiler compiler;
@@ -453,16 +438,13 @@
compiler.impactStrategy.visitImpact(
element,
impact,
- new WorldImpactVisitorImpl(
- visitDynamicUse: (dynamicUse) {
- selections.addAll(compiler.world.allFunctions
- .filter(dynamicUse.selector, dynamicUse.mask)
- .map((e) => new Selection(e, dynamicUse.mask)));
- },
- visitStaticUse: (staticUse) {
- selections.add(new Selection(staticUse.element, null));
- }
- ),
+ new WorldImpactVisitorImpl(visitDynamicUse: (dynamicUse) {
+ selections.addAll(compiler.world.allFunctions
+ .filter(dynamicUse.selector, dynamicUse.mask)
+ .map((e) => new Selection(e, dynamicUse.mask)));
+ }, visitStaticUse: (staticUse) {
+ selections.add(new Selection(staticUse.element, null));
+ }),
IMPACT_USE);
return selections;
}
diff --git a/pkg/compiler/lib/src/elements/common.dart b/pkg/compiler/lib/src/elements/common.dart
index 85fd159..bbc682a 100644
--- a/pkg/compiler/lib/src/elements/common.dart
+++ b/pkg/compiler/lib/src/elements/common.dart
@@ -6,17 +6,10 @@
library elements.common;
-import '../common/names.dart' show
- Names,
- Uris;
-import '../core_types.dart' show
- CoreClasses;
-import '../dart_types.dart' show
- DartType,
- InterfaceType,
- FunctionType;
-import '../util/util.dart' show
- Link;
+import '../common/names.dart' show Names, Uris;
+import '../core_types.dart' show CoreClasses;
+import '../dart_types.dart' show DartType, InterfaceType, FunctionType;
+import '../util/util.dart' show Link;
import 'elements.dart';
@@ -52,7 +45,7 @@
bool get isSetter => kind == ElementKind.SETTER;
@override
- bool get isConstructor => isGenerativeConstructor || isFactoryConstructor;
+ bool get isConstructor => isGenerativeConstructor || isFactoryConstructor;
@override
bool get isGenerativeConstructor =>
@@ -62,8 +55,7 @@
bool get isGenerativeConstructorBody =>
kind == ElementKind.GENERATIVE_CONSTRUCTOR_BODY;
- bool get isFactoryConstructor =>
- kind == ElementKind.FACTORY_CONSTRUCTOR;
+ bool get isFactoryConstructor => kind == ElementKind.FACTORY_CONSTRUCTOR;
@override
bool get isVariable => kind == ElementKind.VARIABLE;
@@ -178,7 +170,6 @@
}
abstract class ClassElementCommon implements ClassElement {
-
@override
Link<DartType> get allSupertypes => allSupertypesAndSelf.supertypes;
@@ -197,7 +188,6 @@
return result != null && result.isConstructor ? result : null;
}
-
/**
* Find the first member in the class chain with the given [memberName].
*
@@ -221,8 +211,8 @@
bool isPrivate = memberName.isPrivate;
LibraryElement library = memberName.library;
for (ClassElement current = isSuperLookup ? superclass : this;
- current != null;
- current = current.superclass) {
+ current != null;
+ current = current.superclass) {
Element member = current.lookupLocalMember(name);
if (member == null && current.isPatched) {
// Doing lookups on selectors is done after resolution, so it
@@ -251,7 +241,7 @@
return getter;
}
}
- // Abstract members can be defined in a super class.
+ // Abstract members can be defined in a super class.
} else if (!member.isAbstract) {
return member;
}
@@ -295,8 +285,8 @@
* This will ignore constructors.
*/
@override
- Element lookupSuperMemberInLibrary(String memberName,
- LibraryElement library) {
+ Element lookupSuperMemberInLibrary(
+ String memberName, LibraryElement library) {
bool isPrivate = Name.isPrivateName(memberName);
for (ClassElement s = superclass; s != null; s = s.superclass) {
// Private members from a different library are not visible.
@@ -332,8 +322,7 @@
// TODO(johnniwinther): Clean up lookup to get rid of the include predicates.
@override
void forEachMember(void f(ClassElement enclosingClass, Element member),
- {includeBackendMembers: false,
- includeSuperAndInjectedMembers: false}) {
+ {includeBackendMembers: false, includeSuperAndInjectedMembers: false}) {
bool includeInjectedMembers = includeSuperAndInjectedMembers || isPatch;
ClassElement classElement = declaration;
do {
@@ -352,9 +341,8 @@
});
}
}
- classElement = includeSuperAndInjectedMembers
- ? classElement.superclass
- : null;
+ classElement =
+ includeSuperAndInjectedMembers ? classElement.superclass : null;
} while (classElement != null);
}
@@ -368,9 +356,9 @@
* origin and in the patch are included.
*/
@override
- void forEachInstanceField(void f(ClassElement enclosingClass,
- FieldElement field),
- {bool includeSuperAndInjectedMembers: false}) {
+ void forEachInstanceField(
+ void f(ClassElement enclosingClass, FieldElement field),
+ {bool includeSuperAndInjectedMembers: false}) {
// Filters so that [f] is only invoked with instance fields.
void fieldFilter(ClassElement enclosingClass, Element member) {
if (member.isInstanceMember && member.kind == ElementKind.FIELD) {
@@ -433,8 +421,7 @@
@override
bool implementsFunction(CoreClasses coreClasses) {
- return asInstanceOf(coreClasses.functionClass) != null ||
- callType != null;
+ return asInstanceOf(coreClasses.functionClass) != null || callType != null;
}
@override
@@ -498,8 +485,8 @@
if (requiredParameterCount != signature.requiredParameterCount) {
return false;
}
- Set<String> names = optionalParameters.map(
- (Element element) => element.name).toSet();
+ Set<String> names =
+ optionalParameters.map((Element element) => element.name).toSet();
for (Element namedParameter in signature.optionalParameters) {
if (!names.contains(namedParameter.name)) {
return false;
@@ -512,8 +499,8 @@
// optional parameters is not a problem, they simply are never provided
// by call sites of a call to a method with the other signature.
int otherTotalCount = signature.parameterCount;
- return requiredParameterCount <= otherTotalCount
- && parameterCount >= otherTotalCount;
+ return requiredParameterCount <= otherTotalCount &&
+ parameterCount >= otherTotalCount;
}
return true;
}
@@ -526,9 +513,7 @@
}
FunctionElement _lookupLocalConstructor(String name) {
- for (Link<Element> link = constructors;
- !link.isEmpty;
- link = link.tail) {
+ for (Link<Element> link = constructors; !link.isEmpty; link = link.tail) {
if (link.head.name == name) return link.head;
}
return null;
@@ -547,8 +532,9 @@
@override
void forEachLocalMember(void f(Element member)) {
constructors.forEach(f);
- if (mixin != null) mixin.forEachLocalMember((Element mixedInElement) {
+ if (mixin != null)
+ mixin.forEachLocalMember((Element mixedInElement) {
if (mixedInElement.isInstanceMember) f(mixedInElement);
});
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/elements/elements.dart b/pkg/compiler/lib/src/elements/elements.dart
index 2e70d1f31..86a5f41 100644
--- a/pkg/compiler/lib/src/elements/elements.dart
+++ b/pkg/compiler/lib/src/elements/elements.dart
@@ -5,25 +5,18 @@
library elements;
import '../common.dart';
-import '../common/resolution.dart' show
- Resolution;
-import '../compiler.dart' show
- Compiler;
+import '../common/resolution.dart' show Resolution;
+import '../compiler.dart' show Compiler;
import '../constants/constructors.dart';
import '../constants/expressions.dart';
-import '../core_types.dart' show
- CoreClasses;
+import '../core_types.dart' show CoreClasses;
import '../dart_types.dart';
-import '../resolution/scope.dart' show
- Scope;
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/scope.dart' show Scope;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../ordered_typeset.dart' show OrderedTypeSet;
import '../script.dart';
-import '../tokens/token.dart' show
- Token,
- isUserDefinableOperator,
- isMinusOperator;
+import '../tokens/token.dart'
+ show Token, isUserDefinableOperator, isMinusOperator;
import '../tree/tree.dart';
import '../util/characters.dart' show $_;
import '../util/util.dart';
@@ -430,9 +423,8 @@
}
/// Unwraps [element] reporting any warnings attached to it, if any.
- static Element unwrap(Element element,
- DiagnosticReporter listener,
- Spannable spannable) {
+ static Element unwrap(
+ Element element, DiagnosticReporter listener, Spannable spannable) {
if (element != null && element.isWarnOnUse) {
WarnOnUseElement wrappedElement = element;
element = wrappedElement.unwrap(listener, spannable);
@@ -450,11 +442,11 @@
}
static bool isInstanceField(Element element) {
- return !Elements.isUnresolved(element)
- && element.isInstanceMember
- && (identical(element.kind, ElementKind.FIELD)
- || identical(element.kind, ElementKind.GETTER)
- || identical(element.kind, ElementKind.SETTER));
+ return !Elements.isUnresolved(element) &&
+ element.isInstanceMember &&
+ (identical(element.kind, ElementKind.FIELD) ||
+ identical(element.kind, ElementKind.GETTER) ||
+ identical(element.kind, ElementKind.SETTER));
}
static bool isStaticOrTopLevel(Element element) {
@@ -464,14 +456,14 @@
// `element.isTopLevel` is true.
if (Elements.isUnresolved(element)) return false;
if (element.isStatic || element.isTopLevel) return true;
- return !element.isAmbiguous
- && !element.isInstanceMember
- && !element.isPrefix
- && element.enclosingElement != null
- && (element.enclosingElement.kind == ElementKind.CLASS ||
- element.enclosingElement.kind == ElementKind.COMPILATION_UNIT ||
- element.enclosingElement.kind == ElementKind.LIBRARY ||
- element.enclosingElement.kind == ElementKind.PREFIX);
+ return !element.isAmbiguous &&
+ !element.isInstanceMember &&
+ !element.isPrefix &&
+ element.enclosingElement != null &&
+ (element.enclosingElement.kind == ElementKind.CLASS ||
+ element.enclosingElement.kind == ElementKind.COMPILATION_UNIT ||
+ element.enclosingElement.kind == ElementKind.LIBRARY ||
+ element.enclosingElement.kind == ElementKind.PREFIX);
}
static bool isInStaticContext(Element element) {
@@ -495,10 +487,10 @@
}
static bool isStaticOrTopLevelField(Element element) {
- return isStaticOrTopLevel(element)
- && (identical(element.kind, ElementKind.FIELD)
- || identical(element.kind, ElementKind.GETTER)
- || identical(element.kind, ElementKind.SETTER));
+ return isStaticOrTopLevel(element) &&
+ (identical(element.kind, ElementKind.FIELD) ||
+ identical(element.kind, ElementKind.GETTER) ||
+ identical(element.kind, ElementKind.SETTER));
}
static bool isStaticOrTopLevelFunction(Element element) {
@@ -506,9 +498,9 @@
}
static bool isInstanceMethod(Element element) {
- return !Elements.isUnresolved(element)
- && element.isInstanceMember
- && (identical(element.kind, ElementKind.FUNCTION));
+ return !Elements.isUnresolved(element) &&
+ element.isInstanceMember &&
+ (identical(element.kind, ElementKind.FUNCTION));
}
/// Also returns true for [ConstructorBodyElement]s and getters/setters.
@@ -526,8 +518,8 @@
Element element = elements[send];
if (element == null) return !isClosureSend(send, element);
return isInstanceMethod(element) ||
- isInstanceField(element) ||
- (send.isConditional && !element.isStatic);
+ isInstanceField(element) ||
+ (send.isConditional && !element.isStatic);
}
static bool isClosureSend(Send send, Element element) {
@@ -561,8 +553,8 @@
}
}
- static String constructorNameForDiagnostics(String className,
- String constructorName) {
+ static String constructorNameForDiagnostics(
+ String className, String constructorName) {
String classNameString = className;
String constructorNameString = constructorName;
return (constructorName == '')
@@ -644,8 +636,10 @@
static String constructOperatorName(String op, bool isUnary) {
String operatorName = constructOperatorNameOrNull(op, isUnary);
- if (operatorName == null) throw 'Unhandled operator: $op';
- else return operatorName;
+ if (operatorName == null)
+ throw 'Unhandled operator: $op';
+ else
+ return operatorName;
}
static String mapToUserOperatorOrNull(String op) {
@@ -706,49 +700,46 @@
return elements.toList()..sort(compareByPosition);
}
- static bool isFixedListConstructorCall(Element element,
- Send node,
- Compiler compiler) {
- return element == compiler.unnamedListConstructor
- && node.isCall
- && !node.arguments.isEmpty
- && node.arguments.tail.isEmpty;
+ static bool isFixedListConstructorCall(
+ Element element, Send node, Compiler compiler) {
+ return element == compiler.unnamedListConstructor &&
+ node.isCall &&
+ !node.arguments.isEmpty &&
+ node.arguments.tail.isEmpty;
}
- static bool isGrowableListConstructorCall(Element element,
- Send node,
- Compiler compiler) {
- return element == compiler.unnamedListConstructor
- && node.isCall
- && node.arguments.isEmpty;
+ static bool isGrowableListConstructorCall(
+ Element element, Send node, Compiler compiler) {
+ return element == compiler.unnamedListConstructor &&
+ node.isCall &&
+ node.arguments.isEmpty;
}
- static bool isFilledListConstructorCall(Element element,
- Send node,
- Compiler compiler) {
- return element == compiler.filledListConstructor
- && node.isCall
- && !node.arguments.isEmpty
- && !node.arguments.tail.isEmpty
- && node.arguments.tail.tail.isEmpty;
+ static bool isFilledListConstructorCall(
+ Element element, Send node, Compiler compiler) {
+ return element == compiler.filledListConstructor &&
+ node.isCall &&
+ !node.arguments.isEmpty &&
+ !node.arguments.tail.isEmpty &&
+ node.arguments.tail.tail.isEmpty;
}
- static bool isConstructorOfTypedArraySubclass(Element element,
- Compiler compiler) {
+ static bool isConstructorOfTypedArraySubclass(
+ Element element, Compiler compiler) {
if (compiler.typedDataLibrary == null) return false;
if (!element.isConstructor) return false;
ConstructorElement constructor = element.implementation;
constructor = constructor.effectiveTarget;
ClassElement cls = constructor.enclosingClass;
- return cls.library == compiler.typedDataLibrary
- && compiler.backend.isNative(cls)
- && compiler.world.isSubtypeOf(cls, compiler.typedDataClass)
- && compiler.world.isSubtypeOf(cls, compiler.coreClasses.listClass)
- && constructor.name == '';
+ return cls.library == compiler.typedDataLibrary &&
+ compiler.backend.isNative(cls) &&
+ compiler.world.isSubtypeOf(cls, compiler.typedDataClass) &&
+ compiler.world.isSubtypeOf(cls, compiler.coreClasses.listClass) &&
+ constructor.name == '';
}
- static bool switchStatementHasContinue(SwitchStatement node,
- TreeElements elements) {
+ static bool switchStatementHasContinue(
+ SwitchStatement node, TreeElements elements) {
for (SwitchCase switchCase in node.cases) {
for (Node labelOrCase in switchCase.labelsAndCases) {
Node label = labelOrCase.asLabel();
@@ -946,7 +937,6 @@
/// A type alias definition.
abstract class TypedefElement extends Element
implements AstElement, TypeDeclarationElement, FunctionTypedElement {
-
/// The type defined by this typedef with the type variables as its type
/// arguments.
///
@@ -997,8 +987,7 @@
/// A function, variable or parameter defined in an executable context.
abstract class LocalElement extends Element
- implements AstElement, TypedElement, Local {
-}
+ implements AstElement, TypedElement, Local {}
/// A top level, static or instance field, a formal parameter or local variable.
abstract class VariableElement extends ExecutableElement {
@@ -1033,12 +1022,10 @@
/// The executable context is the [ExecutableElement] in which this variable
/// is defined.
abstract class LocalVariableElement extends VariableElement
- implements LocalElement {
-}
+ implements LocalElement {}
/// A top-level, static or instance field.
-abstract class FieldElement extends VariableElement implements MemberElement {
-}
+abstract class FieldElement extends VariableElement implements MemberElement {}
/// A parameter-like element of a function signature.
///
@@ -1086,8 +1073,7 @@
/// A formal parameter on a function or constructor that introduces a local
/// variable in the scope of the function or constructor.
abstract class LocalParameterElement extends ParameterElement
- implements LocalVariableElement {
-}
+ implements LocalVariableElement {}
/// A formal parameter in a constructor that directly initializes a field.
///
@@ -1138,10 +1124,11 @@
/// A top level, static or instance method, constructor, local function, or
/// closure (anonymous local function).
abstract class FunctionElement extends Element
- implements AstElement,
- TypedElement,
- FunctionTypedElement,
- ExecutableElement {
+ implements
+ AstElement,
+ TypedElement,
+ FunctionTypedElement,
+ ExecutableElement {
FunctionExpression get node;
FunctionElement get patch;
@@ -1212,14 +1199,11 @@
}
/// A top level, static or instance function.
-abstract class MethodElement extends FunctionElement
- implements MemberElement {
-}
+abstract class MethodElement extends FunctionElement implements MemberElement {}
/// A local function or closure (anonymous local function).
abstract class LocalFunctionElement extends FunctionElement
- implements LocalElement {
-}
+ implements LocalElement {}
/// A constructor.
abstract class ConstructorElement extends FunctionElement
@@ -1466,19 +1450,18 @@
Element lookupBackendMember(String memberName);
Element lookupSuperMember(String memberName);
- Element lookupSuperMemberInLibrary(String memberName,
- LibraryElement library);
+ Element lookupSuperMemberInLibrary(String memberName, LibraryElement library);
ConstructorElement lookupDefaultConstructor();
ConstructorElement lookupConstructor(String name);
void forEachMember(void f(ClassElement enclosingClass, Element member),
- {bool includeBackendMembers: false,
- bool includeSuperAndInjectedMembers: false});
+ {bool includeBackendMembers: false,
+ bool includeSuperAndInjectedMembers: false});
- void forEachInstanceField(void f(ClassElement enclosingClass,
- FieldElement field),
- {bool includeSuperAndInjectedMembers: false});
+ void forEachInstanceField(
+ void f(ClassElement enclosingClass, FieldElement field),
+ {bool includeSuperAndInjectedMembers: false});
/// Similar to [forEachInstanceField] but visits static fields.
void forEachStaticField(void f(ClassElement enclosingClass, Element field));
@@ -1510,7 +1493,16 @@
/// Enum declaration.
abstract class EnumClassElement extends ClassElement {
/// The static fields implied by the enum values.
- List<FieldElement> get enumValues;
+ List<EnumConstantElement> get enumValues;
+}
+
+/// An enum constant value.
+abstract class EnumConstantElement extends FieldElement {
+ /// The enum that declared this constant.
+ EnumClassElement get enclosingClass;
+
+ /// The index of this constant within the values of the enum.
+ int get index;
}
/// The label entity defined by a labeled statement.
@@ -1723,4 +1715,3 @@
/// if any. Otherwise [implementation] points to the member itself.
Member get implementation;
}
-
diff --git a/pkg/compiler/lib/src/elements/modelx.dart b/pkg/compiler/lib/src/elements/modelx.dart
index bed7cea..fe64aec 100644
--- a/pkg/compiler/lib/src/elements/modelx.dart
+++ b/pkg/compiler/lib/src/elements/modelx.dart
@@ -5,45 +5,29 @@
library elements.modelx;
import '../common.dart';
-import '../common/resolution.dart' show
- Resolution,
- Parsing;
-import '../compiler.dart' show
- Compiler;
+import '../common/resolution.dart' show Resolution, Parsing;
+import '../compiler.dart' show Compiler;
import '../constants/constant_constructors.dart';
import '../constants/constructors.dart';
import '../constants/expressions.dart';
import '../dart_types.dart';
-import '../diagnostics/messages.dart' show
- MessageTemplate;
-import '../ordered_typeset.dart' show
- OrderedTypeSet;
-import '../resolution/class_members.dart' show
- ClassMemberMixin;
-import '../resolution/scope.dart' show
- ClassScope,
- LibraryScope,
- Scope,
- TypeDeclarationScope;
-import '../resolution/resolution.dart' show
- AnalyzableElementX;
-import '../resolution/tree_elements.dart' show
- TreeElements;
-import '../resolution/typedefs.dart' show
- TypedefCyclicVisitor;
+import '../diagnostics/messages.dart' show MessageTemplate;
+import '../ordered_typeset.dart' show OrderedTypeSet;
+import '../resolution/class_members.dart' show ClassMemberMixin;
+import '../resolution/scope.dart'
+ show ClassScope, LibraryScope, Scope, TypeDeclarationScope;
+import '../resolution/resolution.dart' show AnalyzableElementX;
+import '../resolution/tree_elements.dart' show TreeElements;
+import '../resolution/typedefs.dart' show TypedefCyclicVisitor;
import '../script.dart';
-import '../tokens/token.dart' show
- ErrorToken,
- Token;
-import '../tokens/token_constants.dart' as Tokens show
- EOF_TOKEN;
+import '../tokens/token.dart' show ErrorToken, Token;
+import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN;
import '../tree/tree.dart';
import '../util/util.dart';
import 'common.dart';
import 'elements.dart';
-import 'visitor.dart' show
- ElementVisitor;
+import 'visitor.dart' show ElementVisitor;
/// Object that identifies a declaration site.
///
@@ -51,8 +35,7 @@
/// where multi-declarations like `var a, b, c` are allowed, the declaration
/// site is a separate object.
// TODO(johnniwinther): Add [beginToken] and [endToken] getters.
-abstract class DeclarationSite {
-}
+abstract class DeclarationSite {}
abstract class ElementX extends Element with ElementCommon {
static int elementHashCode = 0;
@@ -70,8 +53,7 @@
Modifiers get modifiers => Modifiers.EMPTY;
Node parseNode(Parsing parsing) {
- parsing.reporter.internalError(this,
- 'parseNode not implemented on $this.');
+ parsing.reporter.internalError(this, 'parseNode not implemented on $this.');
return null;
}
@@ -90,12 +72,13 @@
return metadataInternal;
} else {
return <MetadataAnnotation>[]
- ..addAll(origin.metadata)
- ..addAll(metadataInternal);
+ ..addAll(origin.metadata)
+ ..addAll(metadataInternal);
}
}
return metadataInternal != null
- ? metadataInternal : const <MetadataAnnotation>[];
+ ? metadataInternal
+ : const <MetadataAnnotation>[];
}
bool get isClosure => false;
@@ -103,6 +86,7 @@
// Check that this element is defined in the scope of a Class.
return enclosingElement != null && enclosingElement.isClass;
}
+
bool get isInstanceMember => false;
bool get isDeferredLoaderGetter => false;
@@ -144,8 +128,8 @@
return findNameToken(token, isConstructor, name, enclosingElement.name);
}
- static Token findNameToken(Token token, bool isConstructor, String name,
- String enclosingClassName) {
+ static Token findNameToken(
+ Token token, bool isConstructor, String name, String enclosingClassName) {
// We search for the token that has the name of this element.
// For constructors, that doesn't work because they may have
// named formed out of multiple tokens (named constructors) so
@@ -154,7 +138,7 @@
// The unary '-' operator has a special element name (specified).
if (needle == 'unary-') needle = '-';
for (Token t = token; Tokens.EOF_TOKEN != t.kind; t = t.next) {
- if (t is !ErrorToken && needle == t.value) return t;
+ if (t is! ErrorToken && needle == t.value) return t;
}
return token;
}
@@ -187,7 +171,7 @@
}
Element get enclosingClassOrCompilationUnit {
- for (Element e = this; e != null; e = e.enclosingElement) {
+ for (Element e = this; e != null; e = e.enclosingElement) {
if (e.isClass || e.isCompilationUnit) return e;
}
return null;
@@ -250,8 +234,8 @@
final MessageKind messageKind;
final Map messageArguments;
- ErroneousElementX(this.messageKind, this.messageArguments,
- String name, Element enclosing)
+ ErroneousElementX(
+ this.messageKind, this.messageArguments, String name, Element enclosing)
: super(name, ElementKind.ERROR, enclosing);
bool get isTopLevel => false;
@@ -306,7 +290,8 @@
String get message {
return MessageTemplate.TEMPLATES[messageKind]
- .message(messageArguments).toString();
+ .message(messageArguments)
+ .toString();
}
String toString() => '<$name: $message>';
@@ -326,19 +311,17 @@
/// A constructor that was synthesized to recover from a compile-time error.
class ErroneousConstructorElementX extends ErroneousElementX
- with PatchMixin<FunctionElement>,
- AnalyzableElementX,
- ConstantConstructorMixin
+ with
+ PatchMixin<FunctionElement>,
+ AnalyzableElementX,
+ ConstantConstructorMixin
implements ConstructorElementX {
// TODO(ahe): Instead of subclassing [ErroneousElementX], this class should
// be more like [ErroneousFieldElementX]. In particular, its kind should be
// [ElementKind.GENERATIVE_CONSTRUCTOR], and it shouldn't throw as much.
- ErroneousConstructorElementX(
- MessageKind messageKind,
- Map messageArguments,
- String name,
- Element enclosing)
+ ErroneousConstructorElementX(MessageKind messageKind, Map messageArguments,
+ String name, Element enclosing)
: super(messageKind, messageArguments, name, enclosing);
@override
@@ -408,9 +391,8 @@
}
@override
- void setEffectiveTarget(ConstructorElement target,
- InterfaceType type,
- {bool isMalformed: false}) {
+ void setEffectiveTarget(ConstructorElement target, InterfaceType type,
+ {bool isMalformed: false}) {
throw new UnsupportedError("setEffectiveTarget");
}
@@ -500,7 +482,7 @@
final Element wrappedElement;
WarnOnUseElementX(WrappedMessage this.warning, WrappedMessage this.info,
- Element enclosingElement, Element wrappedElement)
+ Element enclosingElement, Element wrappedElement)
: this.wrappedElement = wrappedElement,
super(wrappedElement.name, ElementKind.WARN_ON_USE, enclosingElement);
@@ -570,8 +552,8 @@
return set;
}
- List<DiagnosticMessage> computeInfos(Element context,
- DiagnosticReporter reporter) {
+ List<DiagnosticMessage> computeInfos(
+ Element context, DiagnosticReporter reporter) {
return const <DiagnosticMessage>[];
}
@@ -586,20 +568,18 @@
/// Element synthesized to diagnose an ambiguous import.
class AmbiguousImportX extends AmbiguousElementX {
- AmbiguousImportX(
- MessageKind messageKind,
- Map messageArguments,
+ AmbiguousImportX(MessageKind messageKind, Map messageArguments,
Element enclosingElement, Element existingElement, Element newElement)
: super(messageKind, messageArguments, enclosingElement, existingElement,
- newElement);
+ newElement);
List<DiagnosticMessage> computeInfos(
- Element context,
- DiagnosticReporter reporter) {
+ Element context, DiagnosticReporter reporter) {
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
Setlet ambiguousElements = flatten();
MessageKind code = (ambiguousElements.length == 1)
- ? MessageKind.AMBIGUOUS_REEXPORT : MessageKind.AMBIGUOUS_LOCATION;
+ ? MessageKind.AMBIGUOUS_REEXPORT
+ : MessageKind.AMBIGUOUS_LOCATION;
LibraryElementX importer = context.library;
for (Element element in ambiguousElements) {
Map arguments = {'name': element.name};
@@ -617,12 +597,10 @@
/// Element synthesized to recover from a duplicated member of an element.
class DuplicatedElementX extends AmbiguousElementX {
- DuplicatedElementX(
- MessageKind messageKind,
- Map messageArguments,
+ DuplicatedElementX(MessageKind messageKind, Map messageArguments,
Element enclosingElement, Element existingElement, Element newElement)
: super(messageKind, messageArguments, enclosingElement, existingElement,
- newElement);
+ newElement);
bool get isMalformed => true;
}
@@ -646,14 +624,10 @@
if (!identical(existing, element)) {
reporter.reportError(
reporter.createMessage(
- element,
- MessageKind.DUPLICATE_DEFINITION,
- {'name': name}),
+ element, MessageKind.DUPLICATE_DEFINITION, {'name': name}),
<DiagnosticMessage>[
- reporter.createMessage(
- existing,
- MessageKind.EXISTING_DEFINITION,
- {'name': name}),
+ reporter.createMessage(
+ existing, MessageKind.EXISTING_DEFINITION, {'name': name}),
]);
}
}
@@ -672,25 +646,23 @@
* element, they are enclosed by the class or compilation unit, as is the
* abstract field.
*/
- void addAccessor(AccessorElementX accessor,
- Element existing,
- DiagnosticReporter reporter) {
+ void addAccessor(AccessorElementX accessor, Element existing,
+ DiagnosticReporter reporter) {
void reportError(Element other) {
reporter.reportError(
- reporter.createMessage(
- accessor,
- MessageKind.DUPLICATE_DEFINITION,
+ reporter.createMessage(accessor, MessageKind.DUPLICATE_DEFINITION,
{'name': accessor.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- other,
- MessageKind.EXISTING_DEFINITION,
- {'name': accessor.name}),
+ reporter.createMessage(other, MessageKind.EXISTING_DEFINITION,
+ {'name': accessor.name}),
]);
contents[accessor.name] = new DuplicatedElementX(
- MessageKind.DUPLICATE_DEFINITION, {'name': accessor.name},
- accessor.memberContext.enclosingElement, other, accessor);
+ MessageKind.DUPLICATE_DEFINITION,
+ {'name': accessor.name},
+ accessor.memberContext.enclosingElement,
+ other,
+ accessor);
}
if (existing != null) {
@@ -738,10 +710,8 @@
Link<Element> localMembers = const Link<Element>();
CompilationUnitElementX(Script script, LibraryElementX library)
- : this.script = script,
- super(script.name,
- ElementKind.COMPILATION_UNIT,
- library) {
+ : this.script = script,
+ super(script.name, ElementKind.COMPILATION_UNIT, library) {
library.addCompilationUnit(this);
}
@@ -785,8 +755,7 @@
return;
}
if (!localMembers.isEmpty) {
- reporter.reportErrorMessage(
- tag, MessageKind.BEFORE_TOP_LEVEL);
+ reporter.reportErrorMessage(tag, MessageKind.BEFORE_TOP_LEVEL);
return;
}
if (partTag != null) {
@@ -799,21 +768,16 @@
if (libraryTag != null) {
String expectedName = libraryTag.name.toString();
if (expectedName != actualName) {
- reporter.reportWarningMessage(
- tag.name,
- MessageKind.LIBRARY_NAME_MISMATCH,
- {'libraryName': expectedName});
+ reporter.reportWarningMessage(tag.name,
+ MessageKind.LIBRARY_NAME_MISMATCH, {'libraryName': expectedName});
}
} else {
reporter.reportWarning(
- reporter.createMessage(
- library,
- MessageKind.MISSING_LIBRARY_NAME,
+ reporter.createMessage(library, MessageKind.MISSING_LIBRARY_NAME,
{'libraryName': actualName}),
<DiagnosticMessage>[
- reporter.createMessage(
- tag.name,
- MessageKind.THIS_IS_THE_PART_OF_TAG),
+ reporter.createMessage(
+ tag.name, MessageKind.THIS_IS_THE_PART_OF_TAG),
]);
}
}
@@ -857,8 +821,7 @@
* Addition to the map is performed by [addImport]. Lookup is done trough
* [find].
*/
- final Map<String, Element> importScope =
- new Map<String, Element>();
+ final Map<String, Element> importScope = new Map<String, Element>();
/**
* Adds [element] to the import scope of this library.
@@ -867,10 +830,8 @@
* [ErroneousElement] will be put in the imported scope, allowing for
* detection of ambiguous uses of imported names.
*/
- void addImport(Element enclosingElement,
- Element element,
- ImportElement import,
- DiagnosticReporter reporter) {
+ void addImport(Element enclosingElement, Element element,
+ ImportElement import, DiagnosticReporter reporter) {
LibraryElementX library = enclosingElement.library;
Importers importers = library.importers;
@@ -884,10 +845,8 @@
Element existing = importScope.putIfAbsent(name, () => element);
importers.registerImport(element, import);
- void registerWarnOnUseElement(ImportElement import,
- MessageKind messageKind,
- Element hidingElement,
- Element hiddenElement) {
+ void registerWarnOnUseElement(ImportElement import, MessageKind messageKind,
+ Element hidingElement, Element hiddenElement) {
Uri hiddenUri = hiddenElement.library.canonicalUri;
Uri hidingUri = hidingElement.library.canonicalUri;
Element element = new WarnOnUseElementX(
@@ -895,11 +854,10 @@
null, // Report on reference to [hidingElement].
messageKind,
{'name': name, 'hiddenUri': hiddenUri, 'hidingUri': hidingUri}),
- new WrappedMessage(
- reporter.spanFromSpannable(import),
- MessageKind.IMPORTED_HERE,
- {'name': name}),
- enclosingElement, hidingElement);
+ new WrappedMessage(reporter.spanFromSpannable(import),
+ MessageKind.IMPORTED_HERE, {'name': name}),
+ enclosingElement,
+ hidingElement);
importScope[name] = element;
importers.registerImport(element, import);
}
@@ -912,21 +870,23 @@
registerWarnOnUseElement(
import, MessageKind.HIDDEN_IMPORT, element, existing);
} else if (!existing.library.isPlatformLibrary &&
- element.library.isPlatformLibrary) {
+ element.library.isPlatformLibrary) {
// [element] is implicitly hidden.
if (import.isSynthesized) {
// [element] is imported implicitly (probably through dart:core).
- registerWarnOnUseElement(
- existingImport, MessageKind.HIDDEN_IMPLICIT_IMPORT,
- existing, element);
+ registerWarnOnUseElement(existingImport,
+ MessageKind.HIDDEN_IMPLICIT_IMPORT, existing, element);
} else {
registerWarnOnUseElement(
import, MessageKind.HIDDEN_IMPORT, existing, element);
}
} else {
Element ambiguousElement = new AmbiguousImportX(
- MessageKind.DUPLICATE_IMPORT, {'name': name},
- enclosingElement, existing, element);
+ MessageKind.DUPLICATE_IMPORT,
+ {'name': name},
+ enclosingElement,
+ existing,
+ element);
importScope[name] = ambiguousElement;
importers.registerImport(ambiguousElement, import);
importers.registerImport(ambiguousElement, existingImport);
@@ -945,9 +905,7 @@
LibraryElement libraryDependency;
LibraryDependencyElementX(CompilationUnitElement enclosingElement,
- ElementKind kind,
- this.node,
- this.uri)
+ ElementKind kind, this.node, this.uri)
: super('', kind, enclosingElement);
@override
@@ -1009,10 +967,8 @@
SourceSpan get sourcePosition => library.sourcePosition;
}
-
class ExportElementX extends LibraryDependencyElementX
implements ExportElement {
-
ExportElementX(CompilationUnitElement enclosingElement, Export node, Uri uri)
: super(enclosingElement, ElementKind.EXPORT, node, uri);
@@ -1025,11 +981,8 @@
accept(ElementVisitor visitor, arg) => visitor.visitExportElement(this, arg);
}
-class LibraryElementX
- extends ElementX
- with LibraryElementCommon,
- AnalyzableElementX,
- PatchMixin<LibraryElementX>
+class LibraryElementX extends ElementX
+ with LibraryElementCommon, AnalyzableElementX, PatchMixin<LibraryElementX>
implements LibraryElement {
final Uri canonicalUri;
@@ -1065,12 +1018,11 @@
final Map<LibraryDependency, LibraryElement> tagMapping =
new Map<LibraryDependency, LibraryElement>();
- LibraryElementX(Script script,
- [Uri canonicalUri, LibraryElementX origin])
- : this.canonicalUri =
- ((canonicalUri == null) ? script.readableUri : canonicalUri),
- this.isSynthesized = script.isSynthesized,
- super(script.name, ElementKind.LIBRARY, null) {
+ LibraryElementX(Script script, [Uri canonicalUri, LibraryElementX origin])
+ : this.canonicalUri =
+ ((canonicalUri == null) ? script.readableUri : canonicalUri),
+ this.isSynthesized = script.isSynthesized,
+ super(script.name, ElementKind.LIBRARY, null) {
entryCompilationUnit = new CompilationUnitElementX(script, this);
if (origin != null) {
origin.applyPatch(this);
@@ -1099,8 +1051,8 @@
void addTag(LibraryTag tag, DiagnosticReporter reporter) {
if (tagsCache != null) {
- reporter.internalError(tag,
- "Library tags for $this have already been computed.");
+ reporter.internalError(
+ tag, "Library tags for $this have already been computed.");
}
tagsBuilder.addLast(tag);
}
@@ -1132,9 +1084,8 @@
* [ErroneousElement] will be put in the imported scope, allowing for
* detection of ambiguous uses of imported names.
*/
- void addImport(Element element,
- ImportElement import,
- DiagnosticReporter reporter) {
+ void addImport(
+ Element element, ImportElement import, DiagnosticReporter reporter) {
importScope.addImport(this, element, import, reporter);
}
@@ -1213,7 +1164,7 @@
Element findExported(String elementName) {
assert(invariant(this, exportsHandled,
- message: 'Exports not handled on $this'));
+ message: 'Exports not handled on $this'));
for (Link link = slotForExports; !link.isEmpty; link = link.tail) {
Element element = link.head;
if (element.name == elementName) return element;
@@ -1223,7 +1174,7 @@
void forEachExport(f(Element element)) {
assert(invariant(this, exportsHandled,
- message: 'Exports not handled on $this'));
+ message: 'Exports not handled on $this'));
slotForExports.forEach((Element e) => f(e));
}
@@ -1306,10 +1257,8 @@
// Only needed for deferred imports.
final ImportElement deferredImport;
- PrefixElementX(String prefix,
- Element enclosing,
- this.firstPosition,
- this.deferredImport)
+ PrefixElementX(
+ String prefix, Element enclosing, this.firstPosition, this.deferredImport)
: super(prefix, ElementKind.PREFIX, enclosing);
bool get isTopLevel => false;
@@ -1320,9 +1269,8 @@
Token get position => firstPosition;
- void addImport(Element element,
- ImportElement import,
- DiagnosticReporter reporter) {
+ void addImport(
+ Element element, ImportElement import, DiagnosticReporter reporter) {
importScope.addImport(this, element, import, reporter);
}
@@ -1334,9 +1282,10 @@
}
class TypedefElementX extends ElementX
- with AstElementMixin,
- AnalyzableElementX,
- TypeDeclarationElementX<TypedefType>
+ with
+ AstElementMixin,
+ AnalyzableElementX,
+ TypeDeclarationElementX<TypedefType>
implements TypedefElement {
Typedef cachedNode;
@@ -1434,7 +1383,8 @@
Iterable<MetadataAnnotation> get metadata {
return metadataInternal != null
- ? metadataInternal : const <MetadataAnnotation>[];
+ ? metadataInternal
+ : const <MetadataAnnotation>[];
}
void set metadata(List<MetadataAnnotation> metadata) {
@@ -1477,12 +1427,11 @@
originVariable.constant = value;
return;
}
- assert(invariant(
- this, constantCache == null || constantCache == value,
+ assert(invariant(this, constantCache == null || constantCache == value,
message: "Constant has already been computed for $this. "
- "Existing constant: "
- "${constantCache != null ? constantCache.getText() : ''}, "
- "New constant: ${value != null ? value.getText() : ''}."));
+ "Existing constant: "
+ "${constantCache != null ? constantCache.getText() : ''}, "
+ "New constant: ${value != null ? value.getText() : ''}."));
constantCache = value;
}
}
@@ -1497,13 +1446,10 @@
Modifiers get modifiers => variables.modifiers;
- VariableElementX(String name,
- ElementKind kind,
- Element enclosingElement,
- VariableList variables,
- this.token)
- : this.variables = variables,
- super(name, kind, enclosingElement);
+ VariableElementX(String name, ElementKind kind, Element enclosingElement,
+ VariableList variables, this.token)
+ : this.variables = variables,
+ super(name, kind, enclosingElement);
// TODO(johnniwinther): Ensure that the [TreeElements] for this variable hold
// the mappings for all its metadata.
@@ -1548,7 +1494,8 @@
Expression node;
int count = 0;
for (Link<Node> link = definitions.definitions.nodes;
- !link.isEmpty; link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
Expression initializedIdentifier = link.head;
Identifier identifier = initializedIdentifier.asIdentifier();
if (identifier == null) {
@@ -1569,8 +1516,10 @@
} else {
// Create a [VariableDefinitions] node for the single definition of
// [node].
- definitionsCache = new VariableDefinitions(definitions.type,
- definitions.modifiers, new NodeList(
+ definitionsCache = new VariableDefinitions(
+ definitions.type,
+ definitions.modifiers,
+ new NodeList(
definitions.definitions.beginToken,
const Link<Node>().prepend(node),
definitions.definitions.endToken));
@@ -1597,19 +1546,13 @@
// cases, for example, for function typed parameters.
Token get position => token;
- accept(ElementVisitor visitor, arg) {
- return visitor.visitVariableElement(this, arg);
- }
-
DeclarationSite get declarationSite => variables;
}
class LocalVariableElementX extends VariableElementX
implements LocalVariableElement {
- LocalVariableElementX(String name,
- ExecutableElement enclosingElement,
- VariableList variables,
- Token token)
+ LocalVariableElementX(String name, ExecutableElement enclosingElement,
+ VariableList variables, Token token)
: super(name, ElementKind.VARIABLE, enclosingElement, variables, token) {
createDefinitions(variables.definitions);
}
@@ -1619,17 +1562,21 @@
MemberElement get memberContext => executableContext.memberContext;
bool get isLocal => true;
+
+ accept(ElementVisitor visitor, arg) {
+ return visitor.visitLocalVariableElement(this, arg);
+ }
}
class FieldElementX extends VariableElementX
- with AnalyzableElementX implements FieldElement {
+ with AnalyzableElementX
+ implements FieldElement {
List<FunctionElement> nestedClosures = new List<FunctionElement>();
- FieldElementX(Identifier name,
- Element enclosingElement,
- VariableList variables)
- : super(name.source, ElementKind.FIELD, enclosingElement,
- variables, name.token);
+ FieldElementX(
+ Identifier name, Element enclosingElement, VariableList variables)
+ : super(name.source, ElementKind.FIELD, enclosingElement, variables,
+ name.token);
accept(ElementVisitor visitor, arg) {
return visitor.visitFieldElement(this, arg);
@@ -1650,14 +1597,15 @@
/// A field that was synthesized to recover from a compile-time error.
class ErroneousFieldElementX extends ElementX
- with ConstantVariableMixin implements FieldElementX {
+ with ConstantVariableMixin
+ implements FieldElementX {
final VariableList variables;
ErroneousFieldElementX(Identifier name, Element enclosingElement)
: variables = new VariableList(Modifiers.EMPTY)
- ..definitions = new VariableDefinitions(
- null, Modifiers.EMPTY, new NodeList.singleton(name))
- ..type = const DynamicType(),
+ ..definitions = new VariableDefinitions(
+ null, Modifiers.EMPTY, new NodeList.singleton(name))
+ ..type = const DynamicType(),
super(name.source, ElementKind.FIELD, enclosingElement);
VariableDefinitions get definitionsCache => variables.definitions;
@@ -1741,10 +1689,8 @@
*/
FunctionSignature _functionSignatureCache;
- FormalElementX(ElementKind elementKind,
- FunctionTypedElement enclosingElement,
- this.definitions,
- Identifier identifier)
+ FormalElementX(ElementKind elementKind, FunctionTypedElement enclosingElement,
+ this.definitions, Identifier identifier)
: this.identifier = identifier,
super(identifier.source, elementKind, enclosingElement);
@@ -1764,8 +1710,8 @@
DartType get type {
assert(invariant(this, typeCache != null,
- message: "Parameter type has not been set for $this."));
- return typeCache;
+ message: "Parameter type has not been set for $this."));
+ return typeCache;
}
FunctionSignature get functionSignature {
@@ -1802,20 +1748,20 @@
/// to ensure that default values on parameters are computed once (on the
/// origin parameter) but can be found through both the origin and the patch.
abstract class ParameterElementX extends FormalElementX
- with PatchMixin<ParameterElement>,
- ConstantVariableMixin
+ with PatchMixin<ParameterElement>, ConstantVariableMixin
implements ParameterElement {
final Expression initializer;
final bool isOptional;
final bool isNamed;
- ParameterElementX(ElementKind elementKind,
- FunctionElement functionDeclaration,
- VariableDefinitions definitions,
- Identifier identifier,
- this.initializer,
- {this.isOptional: false,
- this.isNamed: false})
+ ParameterElementX(
+ ElementKind elementKind,
+ FunctionElement functionDeclaration,
+ VariableDefinitions definitions,
+ Identifier identifier,
+ this.initializer,
+ {this.isOptional: false,
+ this.isNamed: false})
: super(elementKind, functionDeclaration, definitions, identifier);
FunctionElement get functionDeclaration => enclosingElement;
@@ -1842,17 +1788,16 @@
class LocalParameterElementX extends ParameterElementX
implements LocalParameterElement {
-
-
- LocalParameterElementX(FunctionElement functionDeclaration,
- VariableDefinitions definitions,
- Identifier identifier,
- Expression initializer,
- {bool isOptional: false,
- bool isNamed: false})
- : super(ElementKind.PARAMETER, functionDeclaration,
- definitions, identifier, initializer,
- isOptional: isOptional, isNamed: isNamed);
+ LocalParameterElementX(
+ FunctionElement functionDeclaration,
+ VariableDefinitions definitions,
+ Identifier identifier,
+ Expression initializer,
+ {bool isOptional: false,
+ bool isNamed: false})
+ : super(ElementKind.PARAMETER, functionDeclaration, definitions,
+ identifier, initializer,
+ isOptional: isOptional, isNamed: isNamed);
}
/// Parameters in constructors that directly initialize fields. For example:
@@ -1861,16 +1806,17 @@
implements InitializingFormalElement {
final FieldElement fieldElement;
- InitializingFormalElementX(ConstructorElement constructorDeclaration,
- VariableDefinitions variables,
- Identifier identifier,
- Expression initializer,
- this.fieldElement,
- {bool isOptional: false,
- bool isNamed: false})
+ InitializingFormalElementX(
+ ConstructorElement constructorDeclaration,
+ VariableDefinitions variables,
+ Identifier identifier,
+ Expression initializer,
+ this.fieldElement,
+ {bool isOptional: false,
+ bool isNamed: false})
: super(ElementKind.INITIALIZING_FORMAL, constructorDeclaration,
- variables, identifier, initializer,
- isOptional: isOptional, isNamed: isNamed);
+ variables, identifier, initializer,
+ isOptional: isOptional, isNamed: isNamed);
accept(ElementVisitor visitor, arg) {
return visitor.visitFieldParameterElement(this, arg);
@@ -1886,13 +1832,11 @@
final ErroneousFieldElementX fieldElement;
ErroneousInitializingFormalElementX(
- Identifier identifier,
- Element enclosingElement)
+ Identifier identifier, Element enclosingElement)
: this.fieldElement =
new ErroneousFieldElementX(identifier, enclosingElement),
- super(
- ElementKind.INITIALIZING_FORMAL,
- enclosingElement, null, identifier, null);
+ super(ElementKind.INITIALIZING_FORMAL, enclosingElement, null,
+ identifier, null);
VariableDefinitions get definitions => fieldElement.node;
@@ -1930,8 +1874,7 @@
//
// We need to make sure that the position returned is relative to
// the compilation unit of the abstract element.
- if (getter != null
- && identical(getter.compilationUnit, compilationUnit)) {
+ if (getter != null && identical(getter.compilationUnit, compilationUnit)) {
return getter.position;
} else {
return setter.position;
@@ -1941,12 +1884,10 @@
Modifiers get modifiers {
// The resolver ensures that the flags match (ignoring abstract).
if (getter != null) {
- return new Modifiers.withFlags(
- getter.modifiers.nodes,
+ return new Modifiers.withFlags(getter.modifiers.nodes,
getter.modifiers.flags | Modifiers.FLAG_ABSTRACT);
} else {
- return new Modifiers.withFlags(
- setter.modifiers.nodes,
+ return new Modifiers.withFlags(setter.modifiers.nodes,
setter.modifiers.flags | Modifiers.FLAG_ABSTRACT);
}
}
@@ -1960,8 +1901,8 @@
}
bool get isAbstract {
- return getter != null && getter.isAbstract
- || setter != null && setter.isAbstract;
+ return getter != null && getter.isAbstract ||
+ setter != null && setter.isAbstract;
}
}
@@ -1979,19 +1920,20 @@
final FunctionType type;
final bool hasOptionalParameters;
- FunctionSignatureX({this.requiredParameters: const <Element>[],
- this.requiredParameterCount: 0,
- List<Element> optionalParameters: const <Element>[],
- this.optionalParameterCount: 0,
- this.optionalParametersAreNamed: false,
- this.orderedOptionalParameters: const <Element>[],
- this.type})
+ FunctionSignatureX(
+ {this.requiredParameters: const <Element>[],
+ this.requiredParameterCount: 0,
+ List<Element> optionalParameters: const <Element>[],
+ this.optionalParameterCount: 0,
+ this.optionalParametersAreNamed: false,
+ this.orderedOptionalParameters: const <Element>[],
+ this.type})
: optionalParameters = optionalParameters,
hasOptionalParameters = !optionalParameters.isEmpty;
}
-abstract class BaseFunctionElementX
- extends ElementX with PatchMixin<FunctionElement>, AstElementMixin
+abstract class BaseFunctionElementX extends ElementX
+ with PatchMixin<FunctionElement>, AstElementMixin
implements FunctionElement {
DartType typeCache;
final Modifiers modifiers;
@@ -2002,10 +1944,8 @@
AsyncMarker asyncMarker = AsyncMarker.SYNC;
- BaseFunctionElementX(String name,
- ElementKind kind,
- Modifiers this.modifiers,
- Element enclosing)
+ BaseFunctionElementX(String name, ElementKind kind, Modifiers this.modifiers,
+ Element enclosing)
: super(name, kind, enclosing) {
assert(modifiers != null);
}
@@ -2013,9 +1953,7 @@
bool get isExternal => modifiers.isExternal;
bool get isInstanceMember {
- return isClassMember
- && !isConstructor
- && !isStatic;
+ return isClassMember && !isConstructor && !isStatic;
}
bool get hasFunctionSignature => _functionSignatureCache != null;
@@ -2081,12 +2019,10 @@
}
abstract class FunctionElementX extends BaseFunctionElementX
- with AnalyzableElementX implements MethodElement {
-
- FunctionElementX(String name,
- ElementKind kind,
- Modifiers modifiers,
- Element enclosing)
+ with AnalyzableElementX
+ implements MethodElement {
+ FunctionElementX(
+ String name, ElementKind kind, Modifiers modifiers, Element enclosing)
: super(name, kind, modifiers, enclosing);
MemberElement get memberContext => this;
@@ -2114,12 +2050,13 @@
abstract class MethodElementX extends FunctionElementX {
final bool hasBody;
- MethodElementX(String name,
- ElementKind kind,
- Modifiers modifiers,
- Element enclosing,
- // TODO(15101): Make this a named parameter.
- this.hasBody)
+ MethodElementX(
+ String name,
+ ElementKind kind,
+ Modifiers modifiers,
+ Element enclosing,
+ // TODO(15101): Make this a named parameter.
+ this.hasBody)
: super(name, kind, modifiers, enclosing);
@override
@@ -2136,21 +2073,15 @@
implements AccessorElement {
AbstractFieldElement abstractField;
- AccessorElementX(String name,
- ElementKind kind,
- Modifiers modifiers,
- Element enclosing,
- bool hasBody)
+ AccessorElementX(String name, ElementKind kind, Modifiers modifiers,
+ Element enclosing, bool hasBody)
: super(name, kind, modifiers, enclosing, hasBody);
}
abstract class GetterElementX extends AccessorElementX
implements GetterElement {
-
- GetterElementX(String name,
- Modifiers modifiers,
- Element enclosing,
- bool hasBody)
+ GetterElementX(
+ String name, Modifiers modifiers, Element enclosing, bool hasBody)
: super(name, ElementKind.GETTER, modifiers, enclosing, hasBody);
accept(ElementVisitor visitor, arg) {
@@ -2160,11 +2091,8 @@
abstract class SetterElementX extends AccessorElementX
implements SetterElement {
-
- SetterElementX(String name,
- Modifiers modifiers,
- Element enclosing,
- bool hasBody)
+ SetterElementX(
+ String name, Modifiers modifiers, Element enclosing, bool hasBody)
: super(name, ElementKind.SETTER, modifiers, enclosing, hasBody);
accept(ElementVisitor visitor, arg) {
@@ -2176,11 +2104,8 @@
implements LocalFunctionElement {
final FunctionExpression node;
- LocalFunctionElementX(String name,
- FunctionExpression this.node,
- ElementKind kind,
- Modifiers modifiers,
- ExecutableElement enclosing)
+ LocalFunctionElementX(String name, FunctionExpression this.node,
+ ElementKind kind, Modifiers modifiers, ExecutableElement enclosing)
: super(name, kind, modifiers, enclosing);
ExecutableElement get executableContext => enclosingElement;
@@ -2229,36 +2154,35 @@
} else {
assert(invariant(this, isConst,
message: "Constant constructor set on non-constant "
- "constructor $this."));
+ "constructor $this."));
assert(invariant(this, !isFromEnvironmentConstructor,
message: "Constant constructor set on fromEnvironment "
- "constructor: $this."));
- assert(invariant(this,
- _constantConstructor == null || _constantConstructor == value,
+ "constructor: $this."));
+ assert(invariant(
+ this, _constantConstructor == null || _constantConstructor == value,
message: "Constant constructor already computed for $this:"
- "Existing: $_constantConstructor, new: $value"));
+ "Existing: $_constantConstructor, new: $value"));
_constantConstructor = value;
}
}
bool get isFromEnvironmentConstructor {
return name == 'fromEnvironment' &&
- library.isDartCore &&
- (enclosingClass.name == 'bool' ||
+ library.isDartCore &&
+ (enclosingClass.name == 'bool' ||
enclosingClass.name == 'int' ||
enclosingClass.name == 'String');
}
}
abstract class ConstructorElementX extends FunctionElementX
- with ConstantConstructorMixin implements ConstructorElement {
+ with ConstantConstructorMixin
+ implements ConstructorElement {
bool isRedirectingGenerative = false;
- ConstructorElementX(String name,
- ElementKind kind,
- Modifiers modifiers,
- Element enclosing)
- : super(name, kind, modifiers, enclosing);
+ ConstructorElementX(
+ String name, ElementKind kind, Modifiers modifiers, Element enclosing)
+ : super(name, kind, modifiers, enclosing);
FunctionElement immediateRedirectionTarget;
PrefixElement redirectionDeferredPrefix;
@@ -2274,9 +2198,8 @@
DartType _effectiveTargetType;
bool _isEffectiveTargetMalformed;
- void setEffectiveTarget(ConstructorElement target,
- DartType type,
- {bool isMalformed: false}) {
+ void setEffectiveTarget(ConstructorElement target, DartType type,
+ {bool isMalformed: false}) {
assert(invariant(this, target != null,
message: 'No effective target provided for $this.'));
assert(invariant(this, effectiveTargetInternal == null,
@@ -2314,7 +2237,7 @@
bool get isEffectiveTargetMalformed {
if (!isRedirectingFactory) return false;
assert(invariant(this, _isEffectiveTargetMalformed != null,
- message: 'Malformedness has not yet been computed for $this.'));
+ message: 'Malformedness has not yet been computed for $this.'));
return _isEffectiveTargetMalformed == true;
}
@@ -2333,10 +2256,7 @@
DeferredLoaderGetterElementX(PrefixElement prefix)
: this.prefix = prefix,
- super("loadLibrary",
- Modifiers.EMPTY,
- prefix,
- false) {
+ super("loadLibrary", Modifiers.EMPTY, prefix, false) {
functionSignature = new FunctionSignatureX(type: new FunctionType(this));
}
@@ -2367,10 +2287,8 @@
ConstructorBodyElementX(ConstructorElementX constructor)
: this.constructor = constructor,
- super(constructor.name,
- ElementKind.GENERATIVE_CONSTRUCTOR_BODY,
- Modifiers.EMPTY,
- constructor.enclosingElement) {
+ super(constructor.name, ElementKind.GENERATIVE_CONSTRUCTOR_BODY,
+ Modifiers.EMPTY, constructor.enclosingElement) {
functionSignature = constructor.functionSignature;
}
@@ -2412,22 +2330,17 @@
final ConstructorElement definingConstructor;
final bool isDefaultConstructor;
- SynthesizedConstructorElementX.notForDefault(String name,
- this.definingConstructor,
- Element enclosing)
+ SynthesizedConstructorElementX.notForDefault(
+ String name, this.definingConstructor, Element enclosing)
: isDefaultConstructor = false,
- super(name,
- ElementKind.GENERATIVE_CONSTRUCTOR,
- Modifiers.EMPTY,
- enclosing) ;
+ super(name, ElementKind.GENERATIVE_CONSTRUCTOR, Modifiers.EMPTY,
+ enclosing);
- SynthesizedConstructorElementX.forDefault(this.definingConstructor,
- Element enclosing)
+ SynthesizedConstructorElementX.forDefault(
+ this.definingConstructor, Element enclosing)
: isDefaultConstructor = true,
- super('',
- ElementKind.GENERATIVE_CONSTRUCTOR,
- Modifiers.EMPTY,
- enclosing) {
+ super('', ElementKind.GENERATIVE_CONSTRUCTOR, Modifiers.EMPTY,
+ enclosing) {
functionSignature = new FunctionSignatureX(
type: new FunctionType.synthesized(enclosingClass.thisType));
}
@@ -2506,13 +2419,13 @@
T get thisType {
assert(invariant(this, thisTypeCache != null,
- message: 'This type has not been computed for $this'));
+ message: 'This type has not been computed for $this'));
return thisTypeCache;
}
T get rawType {
assert(invariant(this, rawTypeCache != null,
- message: 'Raw type has not been computed for $this'));
+ message: 'Raw type has not been computed for $this'));
return rawTypeCache;
}
@@ -2565,12 +2478,13 @@
}
abstract class BaseClassElementX extends ElementX
- with AstElementMixin,
- AnalyzableElementX,
- ClassElementCommon,
- TypeDeclarationElementX<InterfaceType>,
- PatchMixin<ClassElement>,
- ClassMemberMixin
+ with
+ AstElementMixin,
+ AnalyzableElementX,
+ ClassElementCommon,
+ TypeDeclarationElementX<InterfaceType>,
+ PatchMixin<ClassElement>,
+ ClassMemberMixin
implements ClassElement {
final int id;
@@ -2587,10 +2501,7 @@
OrderedTypeSet allSupertypesAndSelf;
- BaseClassElementX(String name,
- Element enclosing,
- this.id,
- int initialState)
+ BaseClassElementX(String name, Element enclosing, this.id, int initialState)
: supertypeLoadState = initialState,
resolutionState = initialState,
super(name, ElementKind.CLASS, enclosing);
@@ -2616,8 +2527,8 @@
return thisTypeCache;
}
- void computeThisAndRawType(Resolution resolution,
- List<DartType> typeVariables) {
+ void computeThisAndRawType(
+ Resolution resolution, List<DartType> typeVariables) {
if (thisTypeCache == null) {
if (origin == null) {
setThisAndRawTypes(typeVariables);
@@ -2648,8 +2559,8 @@
}
}
- void setDefaultConstructor(FunctionElement constructor,
- DiagnosticReporter reporter);
+ void setDefaultConstructor(
+ FunctionElement constructor, DiagnosticReporter reporter);
void addBackendMember(Element member) {
// TODO(ngeoffray): Deprecate this method.
@@ -2734,8 +2645,7 @@
void addToScope(Element element, DiagnosticReporter reporter) {
if (element.isField && element.name == name) {
- reporter.reportErrorMessage(
- element, MessageKind.MEMBER_USES_CLASS_NAME);
+ reporter.reportErrorMessage(element, MessageKind.MEMBER_USES_CLASS_NAME);
}
localScope.add(element, reporter);
}
@@ -2760,8 +2670,8 @@
return false;
}
- void setDefaultConstructor(FunctionElement constructor,
- DiagnosticReporter reporter) {
+ void setDefaultConstructor(
+ FunctionElement constructor, DiagnosticReporter reporter) {
// The default constructor, although synthetic, is part of a class' API.
addMember(constructor, reporter);
}
@@ -2830,28 +2740,29 @@
class EnumConstructorElementX extends ConstructorElementX {
final FunctionExpression node;
- EnumConstructorElementX(EnumClassElementX enumClass,
- Modifiers modifiers,
- this.node)
- : super('', // Name.
- ElementKind.GENERATIVE_CONSTRUCTOR,
- modifiers,
- enumClass);
+ EnumConstructorElementX(
+ EnumClassElementX enumClass, Modifiers modifiers, this.node)
+ : super(
+ '', // Name.
+ ElementKind.GENERATIVE_CONSTRUCTOR,
+ modifiers,
+ enumClass);
@override
bool get hasNode => true;
@override
FunctionExpression parseNode(Parsing parsing) => node;
+
+ @override
+ SourceSpan get sourcePosition => enclosingClass.sourcePosition;
}
class EnumMethodElementX extends MethodElementX {
final FunctionExpression node;
- EnumMethodElementX(String name,
- EnumClassElementX enumClass,
- Modifiers modifiers,
- this.node)
+ EnumMethodElementX(
+ String name, EnumClassElementX enumClass, Modifiers modifiers, this.node)
: super(name, ElementKind.FUNCTION, modifiers, enumClass, true);
@override
@@ -2859,30 +2770,58 @@
@override
FunctionExpression parseNode(Parsing parsing) => node;
+
+ @override
+ SourceSpan get sourcePosition => enclosingClass.sourcePosition;
}
class EnumFormalElementX extends InitializingFormalElementX {
- EnumFormalElementX(ConstructorElement constructor,
- VariableDefinitions variables,
- Identifier identifier,
- EnumFieldElementX fieldElement)
+ EnumFormalElementX(
+ ConstructorElement constructor,
+ VariableDefinitions variables,
+ Identifier identifier,
+ EnumFieldElementX fieldElement)
: super(constructor, variables, identifier, null, fieldElement) {
typeCache = fieldElement.type;
}
+
+ @override
+ SourceSpan get sourcePosition => enclosingClass.sourcePosition;
}
class EnumFieldElementX extends FieldElementX {
-
- EnumFieldElementX(Identifier name,
- EnumClassElementX enumClass,
- VariableList variableList,
- Node definition,
- [Expression initializer])
+ EnumFieldElementX(Identifier name, EnumClassElementX enumClass,
+ VariableList variableList, Node definition,
+ [Expression initializer])
: super(name, enumClass, variableList) {
- definitionsCache = new VariableDefinitions(null,
- variableList.modifiers, new NodeList.singleton(definition));
+ definitionsCache = new VariableDefinitions(
+ null, variableList.modifiers, new NodeList.singleton(definition));
initializerCache = initializer;
}
+
+ @override
+ SourceSpan get sourcePosition => enclosingClass.sourcePosition;
+}
+
+class EnumConstantElementX extends EnumFieldElementX
+ implements EnumConstantElement {
+ final int index;
+
+ EnumConstantElementX(
+ Identifier name,
+ EnumClassElementX enumClass,
+ VariableList variableList,
+ Node definition,
+ Expression initializer,
+ this.index)
+ : super(name, enumClass, variableList, definition, initializer);
+
+ @override
+ SourceSpan get sourcePosition {
+ return new SourceSpan(
+ enclosingClass.sourcePosition.uri,
+ position.charOffset, position.charEnd);
+ }
}
abstract class MixinApplicationElementX extends BaseClassElementX
@@ -2923,8 +2862,8 @@
constructors = constructors.prepend(constructor);
}
- void setDefaultConstructor(FunctionElement constructor,
- DiagnosticReporter reporter) {
+ void setDefaultConstructor(
+ FunctionElement constructor, DiagnosticReporter reporter) {
assert(!hasConstructor);
addConstructor(constructor);
}
@@ -2932,7 +2871,8 @@
List<DartType> computeTypeParameters(Parsing parsing) {
NamedMixinApplication named = node.asNamedMixinApplication();
if (named == null) {
- throw new SpannableAssertionFailure(node,
+ throw new SpannableAssertionFailure(
+ node,
"Type variables on unnamed mixin applications must be set on "
"creation.");
}
@@ -2949,10 +2889,7 @@
final NamedMixinApplication node;
NamedMixinApplicationElementX(
- String name,
- CompilationUnitElement enclosing,
- int id,
- this.node)
+ String name, CompilationUnitElement enclosing, int id, this.node)
: super(name, enclosing, id);
Modifiers get modifiers => node.modifiers;
@@ -2964,10 +2901,7 @@
final Node node;
UnnamedMixinApplicationElementX(
- String name,
- CompilationUnitElement enclosing,
- int id,
- this.node)
+ String name, CompilationUnitElement enclosing, int id, this.node)
: super(name, enclosing, id);
bool get isAbstract => true;
@@ -3028,18 +2962,17 @@
String toString() => 'Target:$statement';
}
-class TypeVariableElementX extends ElementX with AstElementMixin
+class TypeVariableElementX extends ElementX
+ with AstElementMixin
implements TypeVariableElement {
final int index;
final Node node;
TypeVariableType typeCache;
DartType boundCache;
- TypeVariableElementX(String name,
- TypeDeclarationElement enclosing,
- this.index,
- this.node)
- : super(name, ElementKind.TYPE_VARIABLE, enclosing);
+ TypeVariableElementX(
+ String name, TypeDeclarationElement enclosing, this.index, this.node)
+ : super(name, ElementKind.TYPE_VARIABLE, enclosing);
TypeDeclarationElement get typeDeclaration => enclosingElement;
@@ -3149,8 +3082,8 @@
/// See [:patch_parser.dart:] for a description of the terminology.
abstract class PatchMixin<E extends Element> implements Element {
// TODO(johnniwinther): Use type variables when issue 18630 is fixed.
- Element/*E*/ patch = null;
- Element/*E*/ origin = null;
+ Element /*E*/ patch = null;
+ Element /*E*/ origin = null;
bool get isPatch => origin != null;
bool get isPatched => patch != null;
@@ -3158,19 +3091,19 @@
bool get isImplementation => !isPatched;
bool get isDeclaration => !isPatch;
- Element/*E*/ get implementation => isPatched ? patch : this;
- Element/*E*/ get declaration => isPatch ? origin : this;
+ Element /*E*/ get implementation => isPatched ? patch : this;
+ Element /*E*/ get declaration => isPatch ? origin : this;
/// Applies a patch to this element. This method must be called at most once.
void applyPatch(PatchMixin<E> patch) {
assert(invariant(this, this.patch == null,
- message: "Element is patched twice."));
+ message: "Element is patched twice."));
assert(invariant(this, this.origin == null,
- message: "Origin element is a patch."));
+ message: "Origin element is a patch."));
assert(invariant(patch, patch.origin == null,
- message: "Element is patched twice."));
+ message: "Element is patched twice."));
assert(invariant(patch, patch.patch == null,
- message: "Patch element is patched."));
+ message: "Patch element is patched."));
this.patch = patch;
patch.origin = this;
}
@@ -3188,11 +3121,12 @@
/// itself.
AstElement get definingElement;
- bool get hasResolvedAst => definingElement.hasTreeElements;
-
- ResolvedAst get resolvedAst {
- return new ResolvedAst(declaration,
- definingElement.node, definingElement.treeElements);
+ bool get hasResolvedAst {
+ return definingElement.hasNode && definingElement.hasTreeElements;
}
+ ResolvedAst get resolvedAst {
+ return new ResolvedAst(
+ declaration, definingElement.node, definingElement.treeElements);
+ }
}
diff --git a/pkg/compiler/lib/src/elements/names.dart b/pkg/compiler/lib/src/elements/names.dart
index 314a94b..e38def0 100644
--- a/pkg/compiler/lib/src/elements/names.dart
+++ b/pkg/compiler/lib/src/elements/names.dart
@@ -49,7 +49,6 @@
LibraryElement get library;
-
/// Returns `true` when [s] is private if used as an identifier.
static bool isPrivateName(String s) => !s.isEmpty && s.codeUnitAt(0) == $_;
@@ -107,7 +106,7 @@
bool operator ==(other) {
if (other is! PrivateName) return false;
- return super==(other) && library == other.library;
+ return super == (other) && library == other.library;
}
String toString() => '${library.libraryName}#${super.toString()}';
diff --git a/pkg/compiler/lib/src/elements/visitor.dart b/pkg/compiler/lib/src/elements/visitor.dart
index b571e56..2a1c917 100644
--- a/pkg/compiler/lib/src/elements/visitor.dart
+++ b/pkg/compiler/lib/src/elements/visitor.dart
@@ -6,9 +6,7 @@
import 'elements.dart';
import '../closure.dart'
- show BoxFieldElement,
- ClosureClassElement,
- ClosureFieldElement;
+ show BoxFieldElement, ClosureClassElement, ClosureFieldElement;
abstract class ElementVisitor<R, A> {
const ElementVisitor();
@@ -24,7 +22,7 @@
R visitExportElement(ExportElement e, A arg) => null;
R visitPrefixElement(PrefixElement e, A arg) => null;
R visitTypedefElement(TypedefElement e, A arg) => null;
- R visitVariableElement(VariableElement e, A arg) => null;
+ R visitLocalVariableElement(LocalVariableElement e, A arg) => null;
R visitParameterElement(ParameterElement e, A arg) => null;
R visitFormalElement(FormalElement e, A arg) => null;
R visitFieldElement(FieldElement e, A arg) => null;
@@ -45,7 +43,6 @@
R visitClosureFieldElement(ClosureFieldElement e, A arg) => null;
}
-
abstract class BaseElementVisitor<R, A> extends ElementVisitor<R, A> {
const BaseElementVisitor();
@@ -100,12 +97,16 @@
return visitElement(e, arg);
}
- @override
R visitVariableElement(VariableElement e, A arg) {
return visitElement(e, arg);
}
@override
+ R visitLocalVariableElement(LocalVariableElement e, A arg) {
+ return visitVariableElement(e, arg);
+ }
+
+ @override
R visitParameterElement(ParameterElement e, A arg) {
return visitVariableElement(e, arg);
}
@@ -202,4 +203,4 @@
R visitClosureFieldElement(ClosureFieldElement e, A arg) {
return visitVariableElement(e, arg);
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/enqueue.dart b/pkg/compiler/lib/src/enqueue.dart
index 38c02bf..ff3c21c 100644
--- a/pkg/compiler/lib/src/enqueue.dart
+++ b/pkg/compiler/lib/src/enqueue.dart
@@ -4,66 +4,44 @@
library dart2js.enqueue;
-import 'dart:collection' show
- Queue;
+import 'dart:collection' show Queue;
import 'common.dart';
-import 'common/names.dart' show
- Identifiers;
-import 'common/resolution.dart' show
- Resolution;
-import 'common/work.dart' show
- ItemCompilationContext,
- WorkItem;
-import 'common/tasks.dart' show
- CompilerTask,
- DeferredAction,
- DeferredTask;
-import 'common/codegen.dart' show
- CodegenWorkItem;
-import 'common/resolution.dart' show
- ResolutionWorkItem;
-import 'compiler.dart' show
- Compiler;
-import 'dart_types.dart' show
- DartType,
- InterfaceType;
-import 'elements/elements.dart' show
- AnalyzableElement,
- AstElement,
- ClassElement,
- ConstructorElement,
- Element,
- Elements,
- FunctionElement,
- LibraryElement,
- LocalFunctionElement,
- Member,
- MemberElement,
- MethodElement,
- Name,
- TypedElement,
- TypedefElement;
+import 'common/names.dart' show Identifiers;
+import 'common/resolution.dart' show Resolution;
+import 'common/work.dart' show ItemCompilationContext, WorkItem;
+import 'common/tasks.dart' show CompilerTask, DeferredAction, DeferredTask;
+import 'common/codegen.dart' show CodegenWorkItem;
+import 'common/resolution.dart' show ResolutionWorkItem;
+import 'compiler.dart' show Compiler;
+import 'dart_types.dart' show DartType, InterfaceType;
+import 'elements/elements.dart'
+ show
+ AnalyzableElement,
+ AstElement,
+ ClassElement,
+ ConstructorElement,
+ Element,
+ Elements,
+ FunctionElement,
+ LibraryElement,
+ LocalFunctionElement,
+ Member,
+ MemberElement,
+ MethodElement,
+ Name,
+ TypedElement,
+ TypedefElement;
import 'js/js.dart' as js;
import 'native/native.dart' as native;
-import 'types/types.dart' show
- TypeMaskStrategy;
-import 'universe/selector.dart' show
- Selector;
+import 'types/types.dart' show TypeMaskStrategy;
+import 'universe/selector.dart' show Selector;
import 'universe/universe.dart';
-import 'universe/use.dart' show
- DynamicUse,
- StaticUse,
- StaticUseKind,
- TypeUse,
- TypeUseKind;
-import 'universe/world_impact.dart' show
- ImpactUseCase,
- WorldImpact,
- WorldImpactVisitor;
-import 'util/util.dart' show
- Link,
- Setlet;
+import 'universe/use.dart'
+ show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind;
+import 'universe/world_impact.dart'
+ show ImpactUseCase, WorldImpact, WorldImpactVisitor;
+import 'util/util.dart' show Link, Setlet;
typedef ItemCompilationContext ItemCompilationContextCreator();
@@ -74,14 +52,17 @@
String get name => 'Enqueue';
EnqueueTask(Compiler compiler)
- : resolution = new ResolutionEnqueuer(
- compiler, compiler.backend.createItemCompilationContext,
- compiler.options.analyzeOnly && compiler.options.analyzeMain
- ? const EnqueuerStrategy() : const TreeShakingEnqueuerStrategy()),
- codegen = new CodegenEnqueuer(
- compiler, compiler.backend.createItemCompilationContext,
- const TreeShakingEnqueuerStrategy()),
- super(compiler) {
+ : resolution = new ResolutionEnqueuer(
+ compiler,
+ compiler.backend.createItemCompilationContext,
+ compiler.options.analyzeOnly && compiler.options.analyzeMain
+ ? const EnqueuerStrategy()
+ : const TreeShakingEnqueuerStrategy()),
+ codegen = new CodegenEnqueuer(
+ compiler,
+ compiler.backend.createItemCompilationContext,
+ const TreeShakingEnqueuerStrategy()),
+ super(compiler) {
codegen.task = this;
resolution.task = this;
@@ -101,10 +82,10 @@
final Compiler compiler; // TODO(ahe): Remove this dependency.
final EnqueuerStrategy strategy;
final ItemCompilationContextCreator itemCompilationContextCreator;
- final Map<String, Set<Element>> instanceMembersByName
- = new Map<String, Set<Element>>();
- final Map<String, Set<Element>> instanceFunctionsByName
- = new Map<String, Set<Element>>();
+ final Map<String, Set<Element>> instanceMembersByName =
+ new Map<String, Set<Element>>();
+ final Map<String, Set<Element>> instanceFunctionsByName =
+ new Map<String, Set<Element>>();
final Set<ClassElement> _processedClasses = new Set<ClassElement>();
Set<ClassElement> recentClasses = new Setlet<ClassElement>();
final Universe universe = new Universe(const TypeMaskStrategy());
@@ -114,17 +95,15 @@
bool queueIsClosed = false;
EnqueueTask task;
- native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
+ native.NativeEnqueuer nativeEnqueuer; // Set by EnqueueTask
bool hasEnqueuedReflectiveElements = false;
bool hasEnqueuedReflectiveStaticFields = false;
WorldImpactVisitor impactVisitor;
- Enqueuer(this.name,
- this.compiler,
- this.itemCompilationContextCreator,
- this.strategy) {
+ Enqueuer(this.name, this.compiler, this.itemCompilationContextCreator,
+ this.strategy) {
impactVisitor = new _EnqueuerImpactVisitor(this);
}
@@ -160,8 +139,8 @@
if (internalAddToWorkList(element) && compiler.options.dumpInfo) {
// TODO(sigmund): add other missing dependencies (internals, selectors
// enqueued after allocations), also enable only for the codegen enqueuer.
- compiler.dumpInfoTask.registerDependency(
- compiler.currentElement, element);
+ compiler.dumpInfoTask
+ .registerDependency(compiler.currentElement, element);
}
}
@@ -174,23 +153,20 @@
/// Apply the [worldImpact] of processing [element] to this enqueuer.
void applyImpact(Element element, WorldImpact worldImpact) {
- compiler.impactStrategy.visitImpact(
- element, worldImpact, impactVisitor, impactUse);
+ compiler.impactStrategy
+ .visitImpact(element, worldImpact, impactVisitor, impactUse);
}
- void registerInstantiatedType(InterfaceType type,
- {bool mirrorUsage: false}) {
+ void registerInstantiatedType(InterfaceType type, {bool mirrorUsage: false}) {
task.measure(() {
ClassElement cls = type.element;
cls.ensureResolved(resolution);
bool isNative = compiler.backend.isNative(cls);
- universe.registerTypeInstantiation(
- type,
+ universe.registerTypeInstantiation(type,
isNative: isNative,
- byMirrors: mirrorUsage,
- onImplemented: (ClassElement cls) {
- compiler.backend.registerImplementedClass(
- cls, this, compiler.globalDependencies);
+ byMirrors: mirrorUsage, onImplemented: (ClassElement cls) {
+ compiler.backend
+ .registerImplementedClass(cls, this, compiler.globalDependencies);
});
// TODO(johnniwinther): Share this reasoning with [Universe].
if (!cls.isAbstract || isNative || mirrorUsage) {
@@ -260,8 +236,7 @@
if (function.name == Identifiers.noSuchMethod_) {
registerNoSuchMethod(function);
}
- if (function.name == Identifiers.call &&
- !cls.typeVariables.isEmpty) {
+ if (function.name == Identifiers.call && !cls.typeVariables.isEmpty) {
registerCallMethodWithFreeTypeVariables(function);
}
// If there is a property access with the same name as a method we
@@ -273,7 +248,8 @@
}
// Store the member in [instanceFunctionsByName] to catch
// getters on the function.
- instanceFunctionsByName.putIfAbsent(memberName, () => new Set<Element>())
+ instanceFunctionsByName
+ .putIfAbsent(memberName, () => new Set<Element>())
.add(member);
if (universe.hasInvocation(function, compiler.world)) {
addToWorkList(function);
@@ -303,7 +279,8 @@
// The element is not yet used. Add it to the list of instance
// members to still be processed.
- instanceMembersByName.putIfAbsent(memberName, () => new Set<Element>())
+ instanceMembersByName
+ .putIfAbsent(memberName, () => new Set<Element>())
.add(member);
}
@@ -368,7 +345,7 @@
* The actual implementation depends on the current compiler phase.
*/
bool shouldIncludeElementDueToMirrors(Element element,
- {bool includedEnclosing});
+ {bool includedEnclosing});
void logEnqueueReflectiveAction(action, [msg = ""]) {
if (TRACE_MIRROR_ENQUEUING) {
@@ -380,16 +357,14 @@
///
/// [enclosingWasIncluded] provides a hint whether the enclosing element was
/// needed for reflection.
- void enqueueReflectiveConstructor(ConstructorElement ctor,
- bool enclosingWasIncluded) {
+ void enqueueReflectiveConstructor(
+ ConstructorElement ctor, bool enclosingWasIncluded) {
if (shouldIncludeElementDueToMirrors(ctor,
includedEnclosing: enclosingWasIncluded)) {
logEnqueueReflectiveAction(ctor);
ClassElement cls = ctor.declaration.enclosingClass;
compiler.backend.registerInstantiatedType(
- cls.rawType,
- this,
- compiler.mirrorDependencies,
+ cls.rawType, this, compiler.mirrorDependencies,
mirrorUsage: true);
registerStaticUse(new StaticUse.foreignUse(ctor.declaration));
}
@@ -401,7 +376,7 @@
/// needed for reflection.
void enqueueReflectiveMember(Element element, bool enclosingWasIncluded) {
if (shouldIncludeElementDueToMirrors(element,
- includedEnclosing: enclosingWasIncluded)) {
+ includedEnclosing: enclosingWasIncluded)) {
logEnqueueReflectiveAction(element);
if (element.isTypedef) {
TypedefElement typedef = element;
@@ -413,13 +388,14 @@
// We need to enqueue all members matching this one in subclasses, as
// well.
// TODO(herhut): Use TypedSelector.subtype for enqueueing
- DynamicUse dynamicUse = new DynamicUse(
- new Selector.fromElement(element), null);
+ DynamicUse dynamicUse =
+ new DynamicUse(new Selector.fromElement(element), null);
registerDynamicUse(dynamicUse);
if (element.isField) {
DynamicUse dynamicUse = new DynamicUse(
- new Selector.setter(new Name(
- element.name, element.library, isSetter: true)), null);
+ new Selector.setter(
+ new Name(element.name, element.library, isSetter: true)),
+ null);
registerDynamicUse(dynamicUse);
}
}
@@ -431,8 +407,7 @@
/// [enclosingWasIncluded] provides a hint whether the enclosing element was
/// needed for reflection.
void enqueueReflectiveElementsInClass(ClassElement cls,
- Iterable<ClassElement> recents,
- bool enclosingWasIncluded) {
+ Iterable<ClassElement> recents, bool enclosingWasIncluded) {
if (cls.library.isInternalLibrary || cls.isInjected) return;
bool includeClass = shouldIncludeElementDueToMirrors(cls,
includedEnclosing: enclosingWasIncluded);
@@ -441,9 +416,7 @@
ClassElement decl = cls.declaration;
decl.ensureResolved(resolution);
compiler.backend.registerInstantiatedType(
- decl.rawType,
- this,
- compiler.mirrorDependencies,
+ decl.rawType, this, compiler.mirrorDependencies,
mirrorUsage: true);
}
// If the class is never instantiated, we know nothing of it can possibly
@@ -475,9 +448,7 @@
logEnqueueReflectiveAction(cls);
cls.ensureResolved(resolution);
compiler.backend.registerInstantiatedType(
- cls.rawType,
- this,
- compiler.mirrorDependencies,
+ cls.rawType, this, compiler.mirrorDependencies,
mirrorUsage: true);
}
}
@@ -485,10 +456,10 @@
/// Enqeue all local members of the library [lib] if they are required for
/// reflection.
- void enqueueReflectiveElementsInLibrary(LibraryElement lib,
- Iterable<ClassElement> recents) {
- bool includeLibrary = shouldIncludeElementDueToMirrors(lib,
- includedEnclosing: false);
+ void enqueueReflectiveElementsInLibrary(
+ LibraryElement lib, Iterable<ClassElement> recents) {
+ bool includeLibrary =
+ shouldIncludeElementDueToMirrors(lib, includedEnclosing: false);
lib.forEachLocalMember((Element member) {
if (member.isClass) {
enqueueReflectiveElementsInClass(member, recents, includeLibrary);
@@ -522,7 +493,9 @@
// Keep looking at new classes until fixpoint is reached.
logEnqueueReflectiveAction("!START enqueueRecents");
recents.forEach((ClassElement cls) {
- enqueueReflectiveElementsInClass(cls, recents,
+ enqueueReflectiveElementsInClass(
+ cls,
+ recents,
shouldIncludeElementDueToMirrors(cls.library,
includedEnclosing: false));
});
@@ -541,9 +514,7 @@
}
void processSet(
- Map<String, Set<Element>> map,
- String memberName,
- bool f(Element e)) {
+ Map<String, Set<Element>> map, String memberName, bool f(Element e)) {
Set<Element> members = map[memberName];
if (members == null) return;
// [f] might add elements to [: map[memberName] :] during the loop below
@@ -577,7 +548,8 @@
if (member.isFunction && selector.isGetter) {
registerClosurizedMember(member);
}
- if (member.isField && compiler.backend.isNative(member.enclosingClass)) {
+ if (member.isField &&
+ compiler.backend.isNative(member.enclosingClass)) {
if (selector.isGetter || selector.isCall) {
nativeEnqueuer.registerFieldLoad(member);
// We have to also handle storing to the field because we only get
@@ -677,8 +649,7 @@
// Even in checked mode, type annotations for return type and argument
// types do not imply type checks, so there should never be a check
// against the type variable of a typedef.
- assert(!type.isTypeVariable ||
- !type.element.enclosingElement.isTypedef);
+ assert(!type.isTypeVariable || !type.element.enclosingElement.isTypedef);
}
void registerCallMethodWithFreeTypeVariables(Element element) {
@@ -748,17 +719,17 @@
*/
final Queue<DeferredTask> deferredTaskQueue;
- static const ImpactUseCase IMPACT_USE = const ImpactUseCase('ResolutionEnqueuer');
+ static const ImpactUseCase IMPACT_USE =
+ const ImpactUseCase('ResolutionEnqueuer');
ImpactUseCase get impactUse => IMPACT_USE;
- ResolutionEnqueuer(Compiler compiler,
- ItemCompilationContext itemCompilationContextCreator(),
- EnqueuerStrategy strategy)
- : super('resolution enqueuer',
- compiler,
- itemCompilationContextCreator,
- strategy),
+ ResolutionEnqueuer(
+ Compiler compiler,
+ ItemCompilationContext itemCompilationContextCreator(),
+ EnqueuerStrategy strategy)
+ : super('resolution enqueuer', compiler, itemCompilationContextCreator,
+ strategy),
processedElements = new Set<AstElement>(),
queue = new Queue<ResolutionWorkItem>(),
deferredTaskQueue = new Queue<DeferredTask>();
@@ -786,8 +757,9 @@
* yet.
*/
bool shouldIncludeElementDueToMirrors(Element element,
- {bool includedEnclosing}) {
- return includedEnclosing || compiler.backend.requiredByMirrorSystem(element);
+ {bool includedEnclosing}) {
+ return includedEnclosing ||
+ compiler.backend.requiredByMirrorSystem(element);
}
bool internalAddToWorkList(Element element) {
@@ -797,22 +769,21 @@
message: 'Element $element is not analyzable.'));
if (hasBeenProcessed(element)) return false;
if (queueIsClosed) {
- throw new SpannableAssertionFailure(element,
- "Resolution work list is closed. Trying to add $element.");
+ throw new SpannableAssertionFailure(
+ element, "Resolution work list is closed. Trying to add $element.");
}
compiler.world.registerUsedElement(element);
- ResolutionWorkItem workItem = compiler.resolution.createWorkItem(
- element, itemCompilationContextCreator());
+ ResolutionWorkItem workItem = compiler.resolution
+ .createWorkItem(element, itemCompilationContextCreator());
queue.add(workItem);
// Enable isolate support if we start using something from the isolate
// library, or timers for the async library. We exclude constant fields,
// which are ending here because their initializing expression is compiled.
LibraryElement library = element.library;
- if (!compiler.hasIsolateSupport &&
- (!element.isField || !element.isConst)) {
+ if (!compiler.hasIsolateSupport && (!element.isField || !element.isConst)) {
String uri = library.canonicalUri.toString();
if (uri == 'dart:isolate') {
enableIsolateSupport();
@@ -861,7 +832,8 @@
*/
void addDeferredAction(Element element, DeferredAction action) {
if (queueIsClosed) {
- throw new SpannableAssertionFailure(element,
+ throw new SpannableAssertionFailure(
+ element,
"Resolution work list is closed. "
"Trying to add deferred action for $element");
}
@@ -901,18 +873,20 @@
bool enabledNoSuchMethod = false;
- static const ImpactUseCase IMPACT_USE = const ImpactUseCase('CodegenEnqueuer');
+ static const ImpactUseCase IMPACT_USE =
+ const ImpactUseCase('CodegenEnqueuer');
ImpactUseCase get impactUse => IMPACT_USE;
- CodegenEnqueuer(Compiler compiler,
- ItemCompilationContext itemCompilationContextCreator(),
- EnqueuerStrategy strategy)
+ CodegenEnqueuer(
+ Compiler compiler,
+ ItemCompilationContext itemCompilationContextCreator(),
+ EnqueuerStrategy strategy)
: queue = new Queue<CodegenWorkItem>(),
newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
newlySeenSelectors = compiler.cacheStrategy.newSet(),
super('codegen enqueuer', compiler, itemCompilationContextCreator,
- strategy);
+ strategy);
bool isProcessed(Element member) =>
member.isAbstract || generatedCode.containsKey(member);
@@ -925,7 +899,7 @@
* subtyping constraints into account.
*/
bool shouldIncludeElementDueToMirrors(Element element,
- {bool includedEnclosing}) {
+ {bool includedEnclosing}) {
return compiler.backend.isAccessibleByReflection(element);
}
@@ -936,8 +910,8 @@
// Codegen inlines field initializers. It only needs to generate
// code for checked setters.
if (element.isField && element.isInstanceMember) {
- if (!compiler.options.enableTypeAssertions
- || element.enclosingElement.isClosure) {
+ if (!compiler.options.enableTypeAssertions ||
+ element.enclosingElement.isClosure) {
return false;
}
}
@@ -947,11 +921,11 @@
}
if (queueIsClosed) {
- throw new SpannableAssertionFailure(element,
- "Codegen work list is closed. Trying to add $element");
+ throw new SpannableAssertionFailure(
+ element, "Codegen work list is closed. Trying to add $element");
}
- CodegenWorkItem workItem = new CodegenWorkItem(
- compiler, element, itemCompilationContextCreator());
+ CodegenWorkItem workItem =
+ new CodegenWorkItem(compiler, element, itemCompilationContextCreator());
queue.add(workItem);
return true;
}
@@ -992,11 +966,11 @@
bool checkNoEnqueuedInvokedInstanceMethods(Enqueuer enqueuer) {
enqueuer.task.measure(() {
// Run through the classes and see if we need to compile methods.
- for (ClassElement classElement in
- enqueuer.universe.directlyInstantiatedClasses) {
+ for (ClassElement classElement
+ in enqueuer.universe.directlyInstantiatedClasses) {
for (ClassElement currentClass = classElement;
- currentClass != null;
- currentClass = currentClass.superclass) {
+ currentClass != null;
+ currentClass = currentClass.superclass) {
enqueuer.processInstantiatedClassMembers(currentClass);
}
}
diff --git a/pkg/compiler/lib/src/hash/sha1.dart b/pkg/compiler/lib/src/hash/sha1.dart
index 02eae83..8e5eec2 100644
--- a/pkg/compiler/lib/src/hash/sha1.dart
+++ b/pkg/compiler/lib/src/hash/sha1.dart
@@ -54,15 +54,11 @@
*
*/
String _bytesToBase64(List<int> bytes,
- {bool urlSafe : false,
- bool addLineSeparator : false}) {
- return _CryptoUtils.bytesToBase64(bytes,
- urlSafe,
- addLineSeparator);
+ {bool urlSafe: false, bool addLineSeparator: false}) {
+ return _CryptoUtils.bytesToBase64(bytes, urlSafe, addLineSeparator);
}
}
-
// Constants.
const _MASK_8 = 0xff;
const _MASK_32 = 0xffffffff;
@@ -73,9 +69,9 @@
// Rotate left limiting to unsigned 32-bit values.
int _rotl32(int val, int shift) {
-var mod_shift = shift & 31;
-return ((val << mod_shift) & _MASK_32) |
- ((val & _MASK_32) >> (32 - mod_shift));
+ var mod_shift = shift & 31;
+ return ((val << mod_shift) & _MASK_32) |
+ ((val & _MASK_32) >> (32 - mod_shift));
}
// Base class encapsulating common behavior for cryptographic hash
@@ -90,9 +86,8 @@
List<int> _pendingData;
bool _digestCalled = false;
- _HashBase(int chunkSizeInWords,
- int digestSizeInWords,
- bool this._bigEndianWords)
+ _HashBase(
+ int chunkSizeInWords, int digestSizeInWords, bool this._bigEndianWords)
: _pendingData = [],
_currentChunk = new List(chunkSizeInWords),
_h = new List(digestSizeInWords),
@@ -101,13 +96,13 @@
// Update the hasher with more data.
void add(List<int> data) {
- if (_digestCalled) {
- throw new StateError(
- 'Hash update method called after digest was retrieved');
- }
- _lengthInBytes += data.length;
- _pendingData.addAll(data);
- _iterate();
+ if (_digestCalled) {
+ throw new StateError(
+ 'Hash update method called after digest was retrieved');
+ }
+ _lengthInBytes += data.length;
+ _pendingData.addAll(data);
+ _iterate();
}
// Finish the hash computation and return the digest string.
@@ -124,7 +119,7 @@
// Returns the block size of the hash in bytes.
int get blockSize {
- return _chunkSizeInWords * _BYTES_PER_WORD;
+ return _chunkSizeInWords * _BYTES_PER_WORD;
}
// One round of the hash computation.
@@ -209,7 +204,6 @@
}
}
-
/**
* Interface for cryptographic hash functions.
*
@@ -252,7 +246,9 @@
final List<int> _w;
// Construct a SHA1 hasher object.
- SHA1() : _w = new List(80), super(16, 5, true) {
+ SHA1()
+ : _w = new List(80),
+ super(16, 5, true) {
_h[0] = 0x67452301;
_h[1] = 0xEFCDAB89;
_h[2] = 0x98BADCFE;
@@ -305,10 +301,9 @@
}
abstract class _CryptoUtils {
-
static const int PAD = 61; // '='
- static const int CR = 13; // '\r'
- static const int LF = 10; // '\n'
+ static const int CR = 13; // '\r'
+ static const int LF = 10; // '\n'
static const int LINE_LENGTH = 76;
static const String _encodeTable =
@@ -318,8 +313,7 @@
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
static String bytesToBase64(List<int> bytes,
- [bool urlSafe = false,
- bool addLineSeparator = false]) {
+ [bool urlSafe = false, bool addLineSeparator = false]) {
int len = bytes.length;
if (len == 0) {
return "";
@@ -340,11 +334,11 @@
int j = 0, i = 0, c = 0;
while (i < chunkLength) {
int x = ((bytes[i++] << 16) & 0xFFFFFF) |
- ((bytes[i++] << 8) & 0xFFFFFF) |
- bytes[i++];
+ ((bytes[i++] << 8) & 0xFFFFFF) |
+ bytes[i++];
out[j++] = lookup.codeUnitAt(x >> 18);
out[j++] = lookup.codeUnitAt((x >> 12) & 0x3F);
- out[j++] = lookup.codeUnitAt((x >> 6) & 0x3F);
+ out[j++] = lookup.codeUnitAt((x >> 6) & 0x3F);
out[j++] = lookup.codeUnitAt(x & 0x3f);
// Add optional line separator for each 76 char output.
if (addLineSeparator && ++c == 19 && j < outputLen - 2) {
diff --git a/pkg/compiler/lib/src/helpers/debug_collection.dart b/pkg/compiler/lib/src/helpers/debug_collection.dart
index 74a3d2e..c0276cf 100644
--- a/pkg/compiler/lib/src/helpers/debug_collection.dart
+++ b/pkg/compiler/lib/src/helpers/debug_collection.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-
typedef void DebugCallback(String methodName, var arg1, var arg2);
class DebugMap<K, V> implements Map<K, V> {
@@ -84,8 +83,8 @@
E reduce(E combine(E value, E element)) => iterable.reduce(combine);
- dynamic fold(var initialValue,
- dynamic combine(var previousValue, E element)) {
+ dynamic fold(
+ var initialValue, dynamic combine(var previousValue, E element)) {
return iterable.fold(initialValue, combine);
}
@@ -95,7 +94,7 @@
bool any(bool test(E element)) => iterable.any(test);
- List<E> toList({ bool growable: true }) {
+ List<E> toList({bool growable: true}) {
return iterable.toList(growable: growable);
}
@@ -121,7 +120,7 @@
E get single => iterable.single;
- E firstWhere(bool test(E element), { E orElse() }) {
+ E firstWhere(bool test(E element), {E orElse()}) {
return iterable.firstWhere(test, orElse: orElse);
}
@@ -132,7 +131,6 @@
E singleWhere(bool test(E element)) => iterable.singleWhere(test);
E elementAt(int index) => iterable.elementAt(index);
-
}
class DebugList<E> extends DebugIterable<E> implements List<E> {
@@ -268,11 +266,11 @@
/// at the call site by running test programs and adding to [runtimeTypes] when
/// new type are found.
void assertType(String name, List<String> runtimeTypes, var object,
- {bool showObjects: false}) {
+ {bool showObjects: false}) {
String runtimeType = '${object.runtimeType}';
if (runtimeTypes != null && runtimeTypes.contains(runtimeType)) return;
throw '$name: $runtimeType'
- '${showObjects ? ' ($object)' : ''}';
+ '${showObjects ? ' ($object)' : ''}';
}
/// Callback for the [addCallback] of [DebugMap] that throws an exception if
@@ -287,7 +285,7 @@
final bool showObjects;
const MapTypeAsserter(this.name, this.runtimeTypes,
- {bool this.showObjects: false});
+ {bool this.showObjects: false});
void call(String methodName, var key, var value) {
check(key, value, '$methodName: ');
@@ -299,7 +297,7 @@
List<String> valuesTypes = runtimeTypes[keyType];
if (valuesTypes != null && valuesTypes.contains(valueType)) return;
throw '$name: $text$keyType => $valueType'
- '${showObjects ? ' ($key => $value)' : ''}';
+ '${showObjects ? ' ($key => $value)' : ''}';
}
}
@@ -315,7 +313,7 @@
final bool showObjects;
const CollectionTypeAsserter(this.name, this.runtimeTypes,
- {bool this.showObjects: false});
+ {bool this.showObjects: false});
void call(String methodName, var element, _) {
check(element, '$methodName: ');
@@ -325,6 +323,6 @@
String elementType = '${element.runtimeType}';
if (runtimeTypes.contains(elementType)) return;
throw '$name: $text$elementType'
- '${showObjects ? ' ($element)' : ''}';
+ '${showObjects ? ' ($element)' : ''}';
}
}
diff --git a/pkg/compiler/lib/src/helpers/expensive_map.dart b/pkg/compiler/lib/src/helpers/expensive_map.dart
index 68d106e..8b382d9 100644
--- a/pkg/compiler/lib/src/helpers/expensive_map.dart
+++ b/pkg/compiler/lib/src/helpers/expensive_map.dart
@@ -2,14 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-
/**
* The expensive map is a data structure useful for tracking down
* excessive memory usage due to large maps. It acts as an ordinary
* hash map, but it uses 10 times more memory (by default).
*/
class ExpensiveMap<K, V> implements Map<K, V> {
-
final List _maps;
ExpensiveMap([int copies = 10]) : _maps = new List(copies) {
@@ -29,13 +27,13 @@
bool containsKey(K key) => _maps[0].containsKey(key);
bool containsValue(V value) => _maps[0].containsValue(value);
- V operator[](K key) => _maps[0][key];
+ V operator [](K key) => _maps[0][key];
void forEach(void action(K key, V value)) {
_maps[0].forEach(action);
}
- void operator[]=(K key, V value) {
+ void operator []=(K key, V value) {
for (int i = 0; i < _maps.length; i++) {
_maps[i][key] = value;
}
diff --git a/pkg/compiler/lib/src/helpers/expensive_set.dart b/pkg/compiler/lib/src/helpers/expensive_set.dart
index c74588b..2b34cfb 100644
--- a/pkg/compiler/lib/src/helpers/expensive_set.dart
+++ b/pkg/compiler/lib/src/helpers/expensive_set.dart
@@ -10,7 +10,6 @@
* hash set, but it uses 10 times more memory (by default).
*/
class ExpensiveSet<E> extends IterableBase<E> implements Set<E> {
-
final List _sets;
ExpensiveSet([int copies = 10]) : _sets = new List(copies) {
diff --git a/pkg/compiler/lib/src/helpers/helpers.dart b/pkg/compiler/lib/src/helpers/helpers.dart
index 4754edd..6c4cc63 100644
--- a/pkg/compiler/lib/src/helpers/helpers.dart
+++ b/pkg/compiler/lib/src/helpers/helpers.dart
@@ -8,8 +8,7 @@
library dart2js.helpers;
import '../common.dart';
-import '../diagnostics/invariant.dart' show
- DEBUG_MODE;
+import '../diagnostics/invariant.dart' show DEBUG_MODE;
import '../util/util.dart';
import 'trace.dart';
@@ -36,6 +35,7 @@
class _DebugIndentation extends Indentation {
final String indentationUnit = " ";
}
+
_DebugIndentation _indentation = new _DebugIndentation();
/// Function signature of [debugPrint].
@@ -79,9 +79,8 @@
}
/// Function signature of [reportHere].
-typedef ReportHere(DiagnosticReporter reporter,
- Spannable node,
- String debugMessage);
+typedef ReportHere(
+ DiagnosticReporter reporter, Spannable node, String debugMessage);
/// Print a message with a source location.
ReportHere get reportHere {
@@ -91,8 +90,8 @@
/// Implementation of [reportHere]
_reportHere(DiagnosticReporter reporter, Spannable node, String debugMessage) {
- reporter.reportInfo(node,
- MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});
+ reporter
+ .reportInfo(node, MessageKind.GENERIC, {'text': 'HERE: $debugMessage'});
}
/// Set of tracked objects used by [track] and [ifTracked].
diff --git a/pkg/compiler/lib/src/helpers/stats.dart b/pkg/compiler/lib/src/helpers/stats.dart
index 1d5675f..c8f6c0da0 100644
--- a/pkg/compiler/lib/src/helpers/stats.dart
+++ b/pkg/compiler/lib/src/helpers/stats.dart
@@ -2,18 +2,15 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import 'dart:async' show
- EventSink;
+import 'dart:async' show EventSink;
import 'dart:collection';
import 'dart:convert';
import '../../compiler.dart';
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../util/util.dart';
-
// Helper methods for statistics.
/// Current stats collector. Use [enableStatsOutput] to enable recording of
@@ -37,11 +34,12 @@
/// If [xml] is `true`, stats output is formatted as XML with a default
/// extension of 'xml', otherwise the output is indented text with a default
/// extension of 'log'.
-void enableStatsOutput({CompilerOutputProvider outputProvider,
- bool xml: true,
- String name: 'stats',
- String extension,
- int examples: 10}) {
+void enableStatsOutput(
+ {CompilerOutputProvider outputProvider,
+ bool xml: true,
+ String name: 'stats',
+ String extension,
+ int examples: 10}) {
if (_stats != null) {
throw new StateError('Stats have already been initialized.');
}
@@ -197,7 +195,7 @@
/// elements are looked up in [dataA] or [dataB] using [dataA] as the primary
/// source.
void dumpCorrelation(idA, Iterable a, idB, Iterable b,
- {Map dataA, Map dataB}) {}
+ {Map dataA, Map dataB}) {}
}
/// Interface for printing output data.
@@ -250,13 +248,13 @@
/// Start a stat entry for [id] with additional [data].
void open(String id,
- [Map<String, dynamic> data = const <String, dynamic>{}]) {}
+ [Map<String, dynamic> data = const <String, dynamic>{}]) {}
/// Create a stat entry for [id] with additional [data] and content created by
/// [createChildContent].
void child(String id,
- [Map<String, dynamic> data = const <String, dynamic>{},
- void createChildContent()]) {
+ [Map<String, dynamic> data = const <String, dynamic>{},
+ void createChildContent()]) {
open(id, data);
if (createChildContent != null) createChildContent();
close(id);
@@ -277,8 +275,7 @@
final int examples;
final StatsOutput output;
- BasePrinter({this.output: const DebugOutput(),
- this.examples: 10}) {
+ BasePrinter({this.output: const DebugOutput(), this.examples: 10}) {
indentationUnit = " ";
}
}
@@ -287,12 +284,11 @@
class ConsolePrinter extends BasePrinter {
int extraLevel = 0;
- ConsolePrinter({StatsOutput output: const DebugOutput(),
- int examples: 10})
+ ConsolePrinter({StatsOutput output: const DebugOutput(), int examples: 10})
: super(output: output, examples: examples);
void open(String id,
- [Map<String, dynamic> data = const <String, dynamic>{}]) {
+ [Map<String, dynamic> data = const <String, dynamic>{}]) {
if (extraLevel > 0) return;
StringBuffer sb = new StringBuffer();
@@ -341,8 +337,7 @@
static const HtmlEscape escape = const HtmlEscape();
bool opened = false;
- XMLPrinter({output: const DebugOutput(),
- int examples: 10})
+ XMLPrinter({output: const DebugOutput(), int examples: 10})
: super(output: output, examples: examples);
void start(String id) {
@@ -358,7 +353,7 @@
}
void open(String id,
- [Map<String, dynamic> data = const <String, dynamic>{}]) {
+ [Map<String, dynamic> data = const <String, dynamic>{}]) {
StringBuffer sb = new StringBuffer();
sb.write(indentation);
sb.write('<$id');
@@ -400,9 +395,8 @@
_StackTraceNode.leaf(StackTraceLines stackTrace)
: this(stackTrace.lines, 1, const []);
- _StackTraceNode.node(List<StackTraceLine> commonPrefix,
- _StackTraceNode first,
- _StackTraceNode second)
+ _StackTraceNode.node(List<StackTraceLine> commonPrefix, _StackTraceNode first,
+ _StackTraceNode second)
: this(commonPrefix, first.count + second.count, [first, second]);
void add(StackTraceLines stackTrace) {
@@ -503,7 +497,8 @@
printer.open('trace', {
'id': id,
'totalCount': totalCount,
- 'sampleFrequency': sampleFrequency});
+ 'sampleFrequency': sampleFrequency
+ });
dumpSubtraces(printer);
printer.close('trace');
}
@@ -576,9 +571,9 @@
if (sampleFrequency == null) {
sampleFrequency = stackTraceSampleFrequency;
}
- traceMap.putIfAbsent(key,
- () => new _StackTraceTree(key, sampleFrequency)).sample();
-
+ traceMap
+ .putIfAbsent(key, () => new _StackTraceTree(key, sampleFrequency))
+ .sample();
}
Iterable getList(String key) {
@@ -606,7 +601,6 @@
limit: printer.examples, dataMap: set);
});
});
-
}
void dumpFrequencies() {
@@ -667,14 +661,11 @@
(examplesLimit == 0 || !hasData(examples.first))) {
printer.child('examples', {'count': count, 'example': examples.first});
} else {
- printer.child('examples',
- {'count': count, 'examples': examples.length},
+ printer.child('examples', {'count': count, 'examples': examples.length},
() {
examples.forEach((example) {
- dumpIterable(
- 'examples', '$example', map[example],
- limit: examplesLimit,
- includeCount: false);
+ dumpIterable('examples', '$example', map[example],
+ limit: examplesLimit, includeCount: false);
});
});
}
@@ -698,22 +689,22 @@
}
void dumpCorrelation(keyA, Iterable a, keyB, Iterable b,
- {Map dataA, Map dataB}) {
+ {Map dataA, Map dataB}) {
printer.child('correlations', {'title': '$keyA vs $keyB'}, () {
List aAndB = a.where((e) => e != null && b.contains(e)).toList();
List aAndNotB = a.where((e) => e != null && !b.contains(e)).toList();
List notAandB = b.where((e) => e != null && !a.contains(e)).toList();
- dumpIterable('correlation', '$keyA && $keyB', aAndB, dataMap: dataA,
- limit: printer.examples);
- dumpIterable('correlation', '$keyA && !$keyB', aAndNotB, dataMap: dataA,
- limit: printer.examples);
- dumpIterable('correlation', '!$keyA && $keyB', notAandB, dataMap: dataB,
- limit: printer.examples);
+ dumpIterable('correlation', '$keyA && $keyB', aAndB,
+ dataMap: dataA, limit: printer.examples);
+ dumpIterable('correlation', '$keyA && !$keyB', aAndNotB,
+ dataMap: dataA, limit: printer.examples);
+ dumpIterable('correlation', '!$keyA && $keyB', notAandB,
+ dataMap: dataB, limit: printer.examples);
});
}
void dumpIterable(String tag, String title, Iterable iterable,
- {int limit, Map dataMap, bool includeCount: true}) {
+ {int limit, Map dataMap, bool includeCount: true}) {
if (limit == 0) return;
Map childData = {};
@@ -758,9 +749,9 @@
/// If [isValidKey] is provided, this is used to determine with a value of [map]
/// is a potential key of the inversion map.
Map<dynamic, Set> inverseMap(Map map,
- {bool equals(key1, key2),
- int hashCode(key),
- bool isValidKey(potentialKey)}) {
+ {bool equals(key1, key2),
+ int hashCode(key),
+ bool isValidKey(potentialKey)}) {
Map<dynamic, Set> result = new LinkedHashMap<dynamic, Set>(
equals: equals, hashCode: hashCode, isValidKey: isValidKey);
map.forEach((k, v) {
@@ -788,11 +779,10 @@
/// Returns a new map in which the keys of [map] are sorted using [compare].
/// If [compare] is null, the keys must be [Comparable].
-Map sortMap(Map map, [int compare(a,b)]) {
+Map sortMap(Map map, [int compare(a, b)]) {
List keys = map.keys.toList();
keys.sort(compare);
Map sortedMap = new Map();
keys.forEach((k) => sortedMap[k] = map[k]);
return sortedMap;
}
-
diff --git a/pkg/compiler/lib/src/helpers/trace.dart b/pkg/compiler/lib/src/helpers/trace.dart
index 671d842..021ba97 100644
--- a/pkg/compiler/lib/src/helpers/trace.dart
+++ b/pkg/compiler/lib/src/helpers/trace.dart
@@ -7,9 +7,7 @@
/// Function signature for [trace].
typedef void Trace(String message,
- {bool condition(String stackTrace),
- int limit,
- bool throwOnPrint});
+ {bool condition(String stackTrace), int limit, bool throwOnPrint});
/**
* Helper method for printing stack traces for debugging.
@@ -33,15 +31,15 @@
return _trace;
}
-void _trace(String message, {bool condition(String stackTrace), int limit,
- bool throwOnPrint: false}) {
+void _trace(String message,
+ {bool condition(String stackTrace), int limit, bool throwOnPrint: false}) {
try {
throw '';
} catch (e, s) {
String stackTrace;
try {
- stackTrace = prettifyStackTrace(
- s, rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix);
+ stackTrace = prettifyStackTrace(s,
+ rangeStart: 1, rangeEnd: limit, filePrefix: stackTraceFilePrefix);
} catch (e) {
print(e);
stackTrace = '$s';
@@ -61,12 +59,9 @@
}
/// Function signature of [traceAndReport].
-typedef void TraceAndReport(DiagnosticReporter reporter,
- Spannable node,
- String message,
- {bool condition(String stackTrace),
- int limit,
- bool throwOnPrint});
+typedef void TraceAndReport(
+ DiagnosticReporter reporter, Spannable node, String message,
+ {bool condition(String stackTrace), int limit, bool throwOnPrint});
/// Calls [reportHere] and [trace] with the same message.
TraceAndReport get traceAndReport {
@@ -78,14 +73,11 @@
TraceAndReport get reportAndTrace => traceAndReport;
/// Implementation of [traceAndReport].
-void _traceAndReport(DiagnosticReporter reporter,
- Spannable node,
- String message,
- {bool condition(String stackTrace), int limit,
- bool throwOnPrint: false}) {
-
+void _traceAndReport(
+ DiagnosticReporter reporter, Spannable node, String message,
+ {bool condition(String stackTrace), int limit, bool throwOnPrint: false}) {
trace(message, limit: limit, throwOnPrint: throwOnPrint,
- condition: (String stackTrace) {
+ condition: (String stackTrace) {
bool result = condition != null ? condition(stackTrace) : true;
if (result) {
reportHere(reporter, node, message);
@@ -99,15 +91,15 @@
/// Use [offset] to discard the first [offset] calls of the call stack. Defaults
/// to `1`, that is, discard the call to [stackTrace] itself. Use [limit] to
/// limit the length of the stack trace lines.
-StackTraceLines stackTrace({int offset: 1,
- int limit: null}) {
+StackTraceLines stackTrace({int offset: 1, int limit: null}) {
int rangeStart = offset;
int rangeEnd = limit == null ? null : rangeStart + limit;
try {
throw '';
} catch (_, stackTrace) {
return new StackTraceLines.fromTrace(stackTrace,
- rangeStart: offset, rangeEnd: rangeEnd,
+ rangeStart: offset,
+ rangeEnd: rangeEnd,
filePrefix: stackTraceFilePrefix);
}
return null;
@@ -121,10 +113,7 @@
final int maxColumnNoLength;
factory StackTraceLines.fromTrace(StackTrace s,
- {int rangeStart,
- int rangeEnd,
- String filePrefix,
- String lambda: r'?'}) {
+ {int rangeStart, int rangeEnd, String filePrefix, String lambda: r'?'}) {
final RegExp indexPattern = new RegExp(r'#\d+\s*');
int index = -1;
int maxFileLength = 0;
@@ -153,13 +142,13 @@
int leftParenPos = line.indexOf('(');
int rightParenPos = line.indexOf(')', leftParenPos);
int lastColon = line.lastIndexOf(':', rightParenPos);
- int nextToLastColon = line.lastIndexOf(':', lastColon-1);
+ int nextToLastColon = line.lastIndexOf(':', lastColon - 1);
String lineNo;
String columnNo;
if (nextToLastColon != -1) {
- lineNo = line.substring(nextToLastColon+1, lastColon);
- columnNo = line.substring(lastColon+1, rightParenPos);
+ lineNo = line.substring(nextToLastColon + 1, lastColon);
+ columnNo = line.substring(lastColon + 1, rightParenPos);
try {
int.parse(columnNo);
try {
@@ -177,7 +166,7 @@
nextToLastColon = rightParenPos;
}
} else {
- lineNo = line.substring(lastColon+1, rightParenPos);
+ lineNo = line.substring(lastColon + 1, rightParenPos);
columnNo = '';
try {
int.parse(lineNo);
@@ -197,14 +186,14 @@
maxColumnNoLength = columnNo.length;
}
- String file = line.substring(leftParenPos+1, nextToLastColon);
+ String file = line.substring(leftParenPos + 1, nextToLastColon);
if (filePrefix != null && file.startsWith(filePrefix)) {
file = file.substring(filePrefix.length);
}
if (file.length > maxFileLength) {
maxFileLength = file.length;
}
- String method = line.substring(0, leftParenPos-1);
+ String method = line.substring(0, leftParenPos - 1);
if (lambda != null) {
method = method.replaceAll('<anonymous closure>', lambda);
}
@@ -217,31 +206,25 @@
lines, maxFileLength, maxLineNoLength, maxColumnNoLength);
}
- StackTraceLines.fromLines(this.lines,
- this.maxFileLength,
- this.maxLineNoLength,
- this.maxColumnNoLength);
+ StackTraceLines.fromLines(this.lines, this.maxFileLength,
+ this.maxLineNoLength, this.maxColumnNoLength);
StackTraceLines subtrace(int offset) {
- return new StackTraceLines.fromLines(
- lines.sublist(offset),
- maxFileLength,
- maxLineNoLength,
- maxColumnNoLength);
+ return new StackTraceLines.fromLines(lines.sublist(offset), maxFileLength,
+ maxLineNoLength, maxColumnNoLength);
}
- String prettify({bool showColumnNo: false,
- bool showDots: true}) {
+ String prettify({bool showColumnNo: false, bool showDots: true}) {
StringBuffer sb = new StringBuffer();
bool dots = true;
for (StackTraceLine line in lines) {
sb.write(' ');
line.printOn(sb,
- fileLength: maxFileLength,
- padding: showDots && dots ? ' .' : ' ',
- lineNoLength: maxLineNoLength,
- showColumnNo: showColumnNo,
- columnNoLength: maxColumnNoLength);
+ fileLength: maxFileLength,
+ padding: showDots && dots ? ' .' : ' ',
+ lineNoLength: maxLineNoLength,
+ showColumnNo: showColumnNo,
+ columnNoLength: maxColumnNoLength);
dots = !dots;
}
@@ -261,15 +244,15 @@
final String columnNo;
final String method;
- StackTraceLine(this.index, this.file, this.lineNo,
- this.columnNo, this.method);
+ StackTraceLine(
+ this.index, this.file, this.lineNo, this.columnNo, this.method);
void printOn(StringBuffer sb,
- {String padding: ' ',
- int fileLength,
- int lineNoLength,
- int columnNoLength,
- bool showColumnNo: false}) {
+ {String padding: ' ',
+ int fileLength,
+ int lineNoLength,
+ int columnNoLength,
+ bool showColumnNo: false}) {
String fileText = '${file} ';
if (fileLength != null) {
fileText = pad(fileText, fileLength, dots: padding);
@@ -278,29 +261,29 @@
if (lineNoLength != null) {
lineNoText = pad(lineNoText, lineNoLength, padLeft: true);
}
- String columnNoText = showColumnNo ? '': columnNo;
+ String columnNoText = showColumnNo ? '' : columnNo;
if (columnNoLength != null) {
- columnNoText = ':${pad(columnNoText, columnNoLength)}';
+ columnNoText = ':${pad(columnNoText, columnNoLength)}';
}
sb.write('$fileText $lineNoText$columnNoText $method\n');
}
int get hashCode {
return 13 * index +
- 17 * file.hashCode +
- 19 * lineNo.hashCode +
- 23 * columnNo.hashCode +
- 29 * method.hashCode;
+ 17 * file.hashCode +
+ 19 * lineNo.hashCode +
+ 23 * columnNo.hashCode +
+ 29 * method.hashCode;
}
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! StackTraceLine) return false;
return index == other.index &&
- file == other.file &&
- lineNo == other.lineNo &&
- columnNo == other.columnNo &&
- method == other.method;
+ file == other.file &&
+ lineNo == other.lineNo &&
+ columnNo == other.columnNo &&
+ method == other.method;
}
String toString() => "$method @ $file [$lineNo:$columnNo]";
@@ -324,16 +307,18 @@
* If [lambda] is non-null, anonymous closures are printed as [lambda].
*/
String prettifyStackTrace(StackTrace stackTrace,
- {int rangeStart,
- int rangeEnd,
- bool showColumnNo: false,
- bool showDots: true,
- String filePrefix,
- String lambda: r'?'}) {
+ {int rangeStart,
+ int rangeEnd,
+ bool showColumnNo: false,
+ bool showDots: true,
+ String filePrefix,
+ String lambda: r'?'}) {
return new StackTraceLines.fromTrace(stackTrace,
- rangeStart: rangeStart, rangeEnd: rangeEnd,
- filePrefix: filePrefix, lambda: lambda)
- .prettify(showColumnNo: showColumnNo, showDots: showDots);
+ rangeStart: rangeStart,
+ rangeEnd: rangeEnd,
+ filePrefix: filePrefix,
+ lambda: lambda)
+ .prettify(showColumnNo: showColumnNo, showDots: showDots);
}
/**
@@ -343,7 +328,7 @@
* A repetition of the [dots] text is used for padding.
*/
String pad(String text, int intendedLength,
- {bool padLeft: false, String dots: ' '}) {
+ {bool padLeft: false, String dots: ' '}) {
if (text.length == intendedLength) return text;
if (text.length > intendedLength) return text.substring(0, intendedLength);
if (dots == null || dots.isEmpty) dots = ' ';
@@ -352,7 +337,7 @@
if (!padLeft) {
sb.write(text);
}
- for (int index = text.length ; index < intendedLength ; index ++) {
+ for (int index = text.length; index < intendedLength; index++) {
int dotsIndex = index % dotsLength;
sb.write(dots.substring(dotsIndex, dotsIndex + 1));
}
diff --git a/pkg/compiler/lib/src/helpers/track_map.dart b/pkg/compiler/lib/src/helpers/track_map.dart
index b57be3a..8445efe 100644
--- a/pkg/compiler/lib/src/helpers/track_map.dart
+++ b/pkg/compiler/lib/src/helpers/track_map.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-
/**
* The track map is a simple wrapper around a map that keeps track
* of the 'final' size of maps grouped by description. It allows
@@ -22,7 +21,7 @@
TrackMap._internal(this._counts) : _map = new Map<K, V>();
factory TrackMap(String description) {
- List counts = _countsMap.putIfAbsent(description, () => [ 0 ]);
+ List counts = _countsMap.putIfAbsent(description, () => [0]);
Map result = new TrackMap<K, V>._internal(counts);
counts[0]++;
return result;
@@ -61,14 +60,14 @@
bool containsKey(K key) => _map.containsKey(key);
bool containsValue(V value) => _map.containsValue(value);
- V operator[](K key) => _map[key];
+ V operator [](K key) => _map[key];
String toString() => _map.toString();
void forEach(void action(K key, V value)) {
_map.forEach(action);
}
- void operator[]=(K key, V value) {
+ void operator []=(K key, V value) {
if (!_map.containsKey(key)) {
_notifyLengthChanged(1);
_map[key] = value;
diff --git a/pkg/compiler/lib/src/id_generator.dart b/pkg/compiler/lib/src/id_generator.dart
new file mode 100644
index 0000000..4c92ea9
--- /dev/null
+++ b/pkg/compiler/lib/src/id_generator.dart
@@ -0,0 +1,13 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+/// A generator of globally unique identifiers.
+class IdGenerator {
+ int _nextFreeId = 0;
+
+ /// Returns the next free identifier.
+ ///
+ /// This identifier is guaranteed to be unique.
+ int getNextFreeId() => _nextFreeId++;
+}
\ No newline at end of file
diff --git a/pkg/compiler/lib/src/inferrer/closure_tracer.dart b/pkg/compiler/lib/src/inferrer/closure_tracer.dart
index b7d1ef7..ed2d198 100644
--- a/pkg/compiler/lib/src/inferrer/closure_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/closure_tracer.dart
@@ -12,7 +12,6 @@
import 'type_graph_nodes.dart';
import 'debug.dart' as debug;
-
class ClosureTracerVisitor extends TracerVisitor<ApplyableTypeInformation> {
final Iterable<FunctionElement> tracedElements;
final List<CallSiteTypeInformation> _callsToAnalyze =
@@ -25,7 +24,7 @@
analyze();
if (!continueAnalyzing) return;
_callsToAnalyze.forEach(_analyzeCall);
- for(FunctionElement e in tracedElements) {
+ for (FunctionElement e in tracedElements) {
e.functionSignature.forEachParameter((Element parameter) {
ElementTypeInformation info =
inferrer.types.getInferredTypeOf(parameter);
@@ -50,8 +49,9 @@
TypeMask mask = info.mask;
tracedElements.forEach((FunctionElement functionElement) {
if (!selector.signatureApplies(functionElement)) return;
- inferrer.updateParameterAssignments(info, functionElement, info.arguments,
- selector, mask, remove: false, addToQueue: false);
+ inferrer.updateParameterAssignments(
+ info, functionElement, info.arguments, selector, mask,
+ remove: false, addToQueue: false);
});
}
@@ -75,10 +75,10 @@
bailout('Used in JS ${info.call}');
}
}
- if (called.isGetter
- && info.selector != null
- && info.selector.isCall
- && inferrer.types.getInferredTypeOf(called) == currentUser) {
+ if (called.isGetter &&
+ info.selector != null &&
+ info.selector.isCall &&
+ inferrer.types.getInferredTypeOf(called) == currentUser) {
// This node can be a closure call as well. For example, `foo()`
// where `foo` is a getter.
_registerCallForLaterAnalysis(info);
@@ -125,9 +125,9 @@
@override
visitStaticCallSiteTypeInformation(StaticCallSiteTypeInformation info) {
super.visitStaticCallSiteTypeInformation(info);
- if (info.calledElement == tracedElements.first
- && info.selector != null
- && info.selector.isGetter) {
+ if (info.calledElement == tracedElements.first &&
+ info.selector != null &&
+ info.selector.isGetter) {
addNewEscapeInformation(info);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
index 85a81bc..5d4623a 100644
--- a/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
+++ b/pkg/compiler/lib/src/inferrer/inferrer_visitor.dart
@@ -4,32 +4,24 @@
library inferrer_visitor;
-import 'dart:collection' show
- IterableMixin;
+import 'dart:collection' show IterableMixin;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constants/expressions.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
import '../resolution/operators.dart';
import '../resolution/semantic_visitor.dart';
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../tree/tree.dart';
-import '../types/types.dart' show
- TypeMask;
-import '../types/constants.dart' show
- computeTypeMask;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
+import '../types/types.dart' show TypeMask;
+import '../types/constants.dart' show computeTypeMask;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld;
+import '../world.dart' show ClassWorld;
/**
* The interface [InferrerVisitor] will use when working on types.
@@ -67,13 +59,11 @@
bool isNull(T type);
TypeMask newTypedSelector(T receiver, TypeMask mask);
- T allocateList(T type,
- Node node,
- Element enclosing,
- [T elementType, int length]);
+ T allocateList(T type, Node node, Element enclosing,
+ [T elementType, int length]);
- T allocateMap(T type, Node node, Element element, [List<T> keyType,
- List<T> valueType]);
+ T allocateMap(T type, Node node, Element element,
+ [List<T> keyType, List<T> valueType]);
T allocateClosure(Node node, Element element);
@@ -106,7 +96,6 @@
*/
T allocatePhi(Node node, Local variable, T inputType);
-
/**
* Returns a new type for holding the potential types of [element].
* [inputType] is the first incoming type of the phi. [allocateLoopPhi]
@@ -143,10 +132,8 @@
* conditional send (e.g. `a?.selector`), in which case the returned type may
* be null.
*/
- T refineReceiver(Selector selector,
- TypeMask mask,
- T receiverType,
- bool isConditional);
+ T refineReceiver(
+ Selector selector, TypeMask mask, T receiverType, bool isConditional);
/**
* Returns the internal inferrer representation for [mask].
@@ -211,9 +198,8 @@
variables.forEach(f);
}
- void forEachLocalUntilNode(Node node,
- void f(Local variable, T type),
- [Setlet<Local> seenLocals]) {
+ void forEachLocalUntilNode(Node node, void f(Local variable, T type),
+ [Setlet<Local> seenLocals]) {
if (seenLocals == null) seenLocals = new Setlet<Local>();
if (variables != null) {
variables.forEach((variable, type) {
@@ -273,7 +259,7 @@
}
void mergeDiamondFlow(FieldInitializationScope<T> thenScope,
- FieldInitializationScope<T> elseScope) {
+ FieldInitializationScope<T> elseScope) {
// Quick bailout check. If [isThisExposed] is true, we know the
// code following won't do anything.
if (isThisExposed) return;
@@ -297,12 +283,14 @@
final List<T> positional;
final Map<String, T> named;
ArgumentsTypes(this.positional, named)
- : this.named = (named == null || named.isEmpty) ? const {} : named {
+ : this.named = (named == null || named.isEmpty) ? const {} : named {
assert(this.positional.every((T type) => type != null));
assert(this.named.values.every((T type) => type != null));
}
- ArgumentsTypes.empty() : positional = const [], named = const {};
+ ArgumentsTypes.empty()
+ : positional = const [],
+ named = const {};
int get length => positional.length + named.length;
@@ -310,7 +298,7 @@
String toString() => "{ positional = $positional, named = $named }";
- bool operator==(other) {
+ bool operator ==(other) {
if (positional.length != other.positional.length) return false;
if (named.length != other.named.length) return false;
for (int i = 0; i < positional.length; i++) {
@@ -366,7 +354,6 @@
}
}
-
abstract class MinimalInferrerEngine<T> {
/**
* Returns the type of [element].
@@ -408,21 +395,18 @@
bool get aborts {
return seenReturnOrThrow || seenBreakOrContinue;
}
+
bool get inTryBlock => tryBlock != null;
- LocalsHandler(this.inferrer,
- this.types,
- this.compiler,
- Node block,
- [this.fieldScope])
+ LocalsHandler(this.inferrer, this.types, this.compiler, Node block,
+ [this.fieldScope])
: locals = new VariableScope<T>(block),
captured = new Map<Local, Element>(),
capturedAndBoxed = new Map<Local, Element>(),
tryBlock = null;
- LocalsHandler.from(LocalsHandler<T> other,
- Node block,
- {bool useOtherTryBlock: true})
+ LocalsHandler.from(LocalsHandler<T> other, Node block,
+ {bool useOtherTryBlock: true})
: locals = new VariableScope<T>(block, other.locals),
fieldScope = new FieldInitializationScope<T>.from(other.fieldScope),
captured = other.captured,
@@ -479,8 +463,8 @@
// narrowed to non-null.
type = types.addPhiInput(
local,
- types.allocatePhi(locals.block, local,
- types.narrowNotNull(currentType)),
+ types.allocatePhi(
+ locals.block, local, types.narrowNotNull(currentType)),
type);
}
locals[local] = type;
@@ -489,8 +473,7 @@
}
}
if (capturedAndBoxed.containsKey(local)) {
- inferrer.recordTypeOfNonFinalField(
- node, capturedAndBoxed[local], type);
+ inferrer.recordTypeOfNonFinalField(node, capturedAndBoxed[local], type);
} else if (inTryBlock) {
// We don't know if an assignment in a try block
// will be executed, so all assigments in that block are
@@ -519,17 +502,17 @@
capturedAndBoxed[local] = field;
}
- void mergeDiamondFlow(LocalsHandler<T> thenBranch,
- LocalsHandler<T> elseBranch) {
+ void mergeDiamondFlow(
+ LocalsHandler<T> thenBranch, LocalsHandler<T> elseBranch) {
if (fieldScope != null && elseBranch != null) {
fieldScope.mergeDiamondFlow(thenBranch.fieldScope, elseBranch.fieldScope);
}
- seenReturnOrThrow = thenBranch.seenReturnOrThrow
- && elseBranch != null
- && elseBranch.seenReturnOrThrow;
- seenBreakOrContinue = thenBranch.seenBreakOrContinue
- && elseBranch != null
- && elseBranch.seenBreakOrContinue;
+ seenReturnOrThrow = thenBranch.seenReturnOrThrow &&
+ elseBranch != null &&
+ elseBranch.seenReturnOrThrow;
+ seenBreakOrContinue = thenBranch.seenBreakOrContinue &&
+ elseBranch != null &&
+ elseBranch.seenBreakOrContinue;
if (aborts) return;
void mergeOneBranch(LocalsHandler<T> other) {
@@ -612,7 +595,7 @@
* labeled statement that do not break out.
*/
void mergeAfterBreaks(List<LocalsHandler<T>> handlers,
- {bool keepOwnLocals: true}) {
+ {bool keepOwnLocals: true}) {
Node level = locals.block;
// Use a separate locals handler to perform the merge in, so that Phi
// creation does not invalidate previous type knowledge while we might
@@ -631,9 +614,8 @@
for (Local variable in seenLocals) {
T originalType = locals[variable];
if (originalType != null) {
- merged.locals[variable] = types.addPhiInput(variable,
- merged.locals[variable],
- originalType);
+ merged.locals[variable] = types.addPhiInput(
+ variable, merged.locals[variable], originalType);
}
}
}
@@ -642,8 +624,8 @@
merged.locals.forEachOwnLocal((Local variable, T type) {
locals[variable] = types.simplifyPhi(level, variable, type);
});
- seenReturnOrThrow = allBranchesAbort &&
- (!keepOwnLocals || seenReturnOrThrow);
+ seenReturnOrThrow =
+ allBranchesAbort && (!keepOwnLocals || seenReturnOrThrow);
}
/**
@@ -711,14 +693,15 @@
abstract class InferrerVisitor<T, E extends MinimalInferrerEngine<T>>
extends Visitor<T>
- with SemanticSendResolvedMixin<T, dynamic>,
- CompoundBulkMixin<T, dynamic>,
- SetIfNullBulkMixin<T, dynamic>,
- PrefixBulkMixin<T, dynamic>,
- PostfixBulkMixin<T, dynamic>,
- ErrorBulkMixin<T, dynamic>,
- NewBulkMixin<T, dynamic>,
- SetBulkMixin<T, dynamic>
+ with
+ SemanticSendResolvedMixin<T, dynamic>,
+ CompoundBulkMixin<T, dynamic>,
+ SetIfNullBulkMixin<T, dynamic>,
+ PrefixBulkMixin<T, dynamic>,
+ PostfixBulkMixin<T, dynamic>,
+ ErrorBulkMixin<T, dynamic>,
+ NewBulkMixin<T, dynamic>,
+ SetBulkMixin<T, dynamic>
implements SemanticSendVisitor<T, dynamic> {
final Compiler compiler;
final AstElement analyzedElement;
@@ -743,20 +726,19 @@
? locals.fieldScope.isThisExposed
: true;
}
+
void set isThisExposed(value) {
if (analyzedElement.isGenerativeConstructor) {
locals.fieldScope.isThisExposed = value;
}
}
- InferrerVisitor(AstElement analyzedElement,
- this.inferrer,
- this.types,
- this.compiler,
- [LocalsHandler<T> handler])
- : this.analyzedElement = analyzedElement,
- this.locals = handler,
- this.elements = analyzedElement.resolvedAst.elements {
+ InferrerVisitor(
+ AstElement analyzedElement, this.inferrer, this.types, this.compiler,
+ [LocalsHandler<T> handler])
+ : this.analyzedElement = analyzedElement,
+ this.locals = handler,
+ this.elements = analyzedElement.resolvedAst.elements {
if (handler != null) return;
Node node = analyzedElement.node;
FieldInitializationScope<T> fieldScope =
@@ -905,91 +887,55 @@
return types.dynamicType;
}
-
@override
T bulkHandleNode(Node node, String message, _) {
return internalError(node, message.replaceAll('#', '$node'));
}
@override
- T visitConstantGet(
- Send node,
- ConstantExpression constant,
- _) {
+ T visitConstantGet(Send node, ConstantExpression constant, _) {
return bulkHandleNode(node, "Constant read `#` unhandled.", _);
}
@override
- T visitConstantInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitConstantInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, _) {
return bulkHandleNode(node, "Constant invoke `#` unhandled.", _);
}
- T visitClassTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- _) {
+ T visitClassTypeLiteralGet(Send node, ConstantExpression constant, _) {
return handleTypeLiteralGet();
}
- T visitClassTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, _) {
return handleTypeLiteralInvoke(arguments);
}
- T visitTypedefTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- _) {
+ T visitTypedefTypeLiteralGet(Send node, ConstantExpression constant, _) {
return handleTypeLiteralGet();
}
- T visitTypedefTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, _) {
return handleTypeLiteralInvoke(arguments);
}
- T visitTypeVariableTypeLiteralGet(
- Send node,
- TypeVariableElement element,
- _) {
+ T visitTypeVariableTypeLiteralGet(Send node, TypeVariableElement element, _) {
return handleTypeLiteralGet();
}
- T visitTypeVariableTypeLiteralInvoke(
- Send node,
- TypeVariableElement element,
- NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element,
+ NodeList arguments, CallStructure callStructure, _) {
return handleTypeLiteralInvoke(arguments);
}
- T visitDynamicTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- _) {
+ T visitDynamicTypeLiteralGet(Send node, ConstantExpression constant, _) {
return handleTypeLiteralGet();
}
- T visitDynamicTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, _) {
return handleTypeLiteralInvoke(arguments);
}
@@ -1014,8 +960,8 @@
T _superType;
T get superType {
if (_superType != null) return _superType;
- return _superType = types.nonNullExact(
- outermostElement.enclosingClass.superclass);
+ return _superType =
+ types.nonNullExact(outermostElement.enclosingClass.superclass);
}
@override
@@ -1073,8 +1019,8 @@
Element receiverElement = elements[node.receiver];
Element argumentElement = elements[node.arguments.first];
String operator = node.selector.asOperator().source;
- if ((operator == '==' && usePositive)
- || (operator == '!=' && !usePositive)) {
+ if ((operator == '==' && usePositive) ||
+ (operator == '!=' && !usePositive)) {
// Type the elements as null.
if (Elements.isLocal(receiverElement)) {
locals.update(receiverElement, types.nullType, node);
@@ -1103,30 +1049,19 @@
@override
T visitDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- _) {
+ Send node, Node receiver, NodeList arguments, Selector selector, _) {
return handleDynamicInvoke(node);
}
@override
T visitIfNotNullDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- _) {
+ Send node, Node receiver, NodeList arguments, Selector selector, _) {
return handleDynamicInvoke(node);
}
@override
T visitThisPropertyInvoke(
- Send node,
- NodeList arguments,
- Selector selector,
- _) {
+ Send node, NodeList arguments, Selector selector, _) {
return handleDynamicInvoke(node);
}
@@ -1159,8 +1094,7 @@
}
visit(right);
if (oldAccumulateIsChecks) {
-
- bool invalidatedInRightHandSide (Send test) {
+ bool invalidatedInRightHandSide(Send test) {
Element receiver = elements[test.receiver];
if (receiver is LocalElement) {
return narrowed.locals[receiver] != locals.locals[receiver];
@@ -1267,8 +1201,8 @@
T visitVariableDefinitions(VariableDefinitions node) {
for (Link<Node> link = node.definitions.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
Node definition = link.head;
if (definition is Identifier) {
locals.update(elements[definition], types.nullType, node);
@@ -1353,8 +1287,7 @@
loopLevel--;
saved.endLoop(node);
bool keepOwnLocals = node.asDoWhile() == null;
- saved.mergeAfterBreaks(
- getBreaks(target), keepOwnLocals: keepOwnLocals);
+ saved.mergeAfterBreaks(getBreaks(target), keepOwnLocals: keepOwnLocals);
locals = saved;
clearBreaksAndContinues(target);
return null;
@@ -1391,8 +1324,7 @@
T visitTryStatement(TryStatement node) {
LocalsHandler<T> saved = locals;
- locals = new LocalsHandler<T>.from(
- locals, node, useOtherTryBlock: false);
+ locals = new LocalsHandler<T>.from(locals, node, useOtherTryBlock: false);
visit(node.tryBlock);
saved.mergeDiamondFlow(locals, null);
locals = saved;
@@ -1417,9 +1349,7 @@
Node exception = node.exception;
if (exception != null) {
DartType type = elements.getType(node.type);
- T mask = type == null ||
- type.treatAsDynamic ||
- type.isTypeVariable
+ T mask = type == null || type.treatAsDynamic || type.isTypeVariable
? types.dynamicType
: types.nonNullSubtype(type.element);
locals.update(elements[exception], mask, node);
@@ -1448,9 +1378,9 @@
T visitLabeledStatement(LabeledStatement node) {
Statement body = node.statement;
- if (body is Loop
- || body is SwitchStatement
- || Elements.isUnusedLabel(node, elements)) {
+ if (body is Loop ||
+ body is SwitchStatement ||
+ Elements.isUnusedLabel(node, elements)) {
// Loops and switches handle their own labels.
visit(body);
} else {
diff --git a/pkg/compiler/lib/src/inferrer/list_tracer.dart b/pkg/compiler/lib/src/inferrer/list_tracer.dart
index a57087f..83f2e8b 100644
--- a/pkg/compiler/lib/src/inferrer/list_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/list_tracer.dart
@@ -16,122 +16,119 @@
* change the element type of the list, or let the list escape to code
* that might change the element type.
*/
-Set<String> okListSelectorsSet = new Set<String>.from(
- const <String>[
- // From Object.
- '==',
- 'hashCode',
- 'toString',
- 'noSuchMethod',
- 'runtimeType',
+Set<String> okListSelectorsSet = new Set<String>.from(const <String>[
+ // From Object.
+ '==',
+ 'hashCode',
+ 'toString',
+ 'noSuchMethod',
+ 'runtimeType',
- // From Iterable.
- 'iterator',
- 'map',
- 'where',
- 'expand',
- 'contains',
- 'forEach',
- 'reduce',
- 'fold',
- 'every',
- 'join',
- 'any',
- 'toList',
- 'toSet',
- 'length',
- 'isEmpty',
- 'isNotEmpty',
- 'take',
- 'takeWhile',
- 'skip',
- 'skipWhile',
- 'first',
- 'last',
- 'single',
- 'firstWhere',
- 'lastWhere',
- 'singleWhere',
- 'elementAt',
+ // From Iterable.
+ 'iterator',
+ 'map',
+ 'where',
+ 'expand',
+ 'contains',
+ 'forEach',
+ 'reduce',
+ 'fold',
+ 'every',
+ 'join',
+ 'any',
+ 'toList',
+ 'toSet',
+ 'length',
+ 'isEmpty',
+ 'isNotEmpty',
+ 'take',
+ 'takeWhile',
+ 'skip',
+ 'skipWhile',
+ 'first',
+ 'last',
+ 'single',
+ 'firstWhere',
+ 'lastWhere',
+ 'singleWhere',
+ 'elementAt',
- // From List.
- '[]',
- 'length',
- 'reversed',
- 'sort',
- 'indexOf',
- 'lastIndexOf',
- 'clear',
- 'remove',
- 'removeAt',
- 'removeLast',
- 'removeWhere',
- 'retainWhere',
- 'sublist',
- 'getRange',
- 'removeRange',
- 'asMap',
+ // From List.
+ '[]',
+ 'length',
+ 'reversed',
+ 'sort',
+ 'indexOf',
+ 'lastIndexOf',
+ 'clear',
+ 'remove',
+ 'removeAt',
+ 'removeLast',
+ 'removeWhere',
+ 'retainWhere',
+ 'sublist',
+ 'getRange',
+ 'removeRange',
+ 'asMap',
- // From JSArray.
- 'checkMutable',
- 'checkGrowable',
- ]);
+ // From JSArray.
+ 'checkMutable',
+ 'checkGrowable',
+]);
-Set<String> doNotChangeLengthSelectorsSet = new Set<String>.from(
- const <String>[
- // From Object.
- '==',
- 'hashCode',
- 'toString',
- 'noSuchMethod',
- 'runtimeType',
+Set<String> doNotChangeLengthSelectorsSet = new Set<String>.from(const <String>[
+ // From Object.
+ '==',
+ 'hashCode',
+ 'toString',
+ 'noSuchMethod',
+ 'runtimeType',
- // From Iterable.
- 'iterator',
- 'map',
- 'where',
- 'expand',
- 'contains',
- 'forEach',
- 'reduce',
- 'fold',
- 'every',
- 'join',
- 'any',
- 'toList',
- 'toSet',
- 'length',
- 'isEmpty',
- 'isNotEmpty',
- 'take',
- 'takeWhile',
- 'skip',
- 'skipWhile',
- 'first',
- 'last',
- 'single',
- 'firstWhere',
- 'lastWhere',
- 'singleWhere',
- 'elementAt',
+ // From Iterable.
+ 'iterator',
+ 'map',
+ 'where',
+ 'expand',
+ 'contains',
+ 'forEach',
+ 'reduce',
+ 'fold',
+ 'every',
+ 'join',
+ 'any',
+ 'toList',
+ 'toSet',
+ 'length',
+ 'isEmpty',
+ 'isNotEmpty',
+ 'take',
+ 'takeWhile',
+ 'skip',
+ 'skipWhile',
+ 'first',
+ 'last',
+ 'single',
+ 'firstWhere',
+ 'lastWhere',
+ 'singleWhere',
+ 'elementAt',
- // From List.
- '[]',
- '[]=',
- 'length',
- 'reversed',
- 'sort',
- 'indexOf',
- 'lastIndexOf',
- 'sublist',
- 'getRange',
- 'asMap',
+ // From List.
+ '[]',
+ '[]=',
+ 'length',
+ 'reversed',
+ 'sort',
+ 'indexOf',
+ 'lastIndexOf',
+ 'sublist',
+ 'getRange',
+ 'asMap',
- // From JSArray.
- 'checkMutable',
- 'checkGrowable',
- ]);
-
+ // From JSArray.
+ 'checkMutable',
+ 'checkGrowable',
+]);
class ListTracerVisitor extends TracerVisitor<ListTypeInformation> {
// The [Set] of found assignments to the list.
@@ -208,7 +205,7 @@
assignments.add(inferrer.types.nullType);
}
} else if (selector.isCall &&
- !info.targets.every((element) => element.isFunction)) {
+ !info.targets.every((element) => element.isFunction)) {
bailout('Passed to a closure');
return;
}
diff --git a/pkg/compiler/lib/src/inferrer/map_tracer.dart b/pkg/compiler/lib/src/inferrer/map_tracer.dart
index 1ab3c24..3bd0e41 100644
--- a/pkg/compiler/lib/src/inferrer/map_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/map_tracer.dart
@@ -10,26 +10,26 @@
import 'node_tracer.dart';
import 'type_graph_nodes.dart';
-Set<String> okMapSelectorsSet = new Set.from(
- const <String>[
- // From Object.
- "==",
- "hashCode",
- "toString",
- "noSuchMethod",
- "runtimeType",
- // From Map
- "[]",
- "isEmpty",
- "isNotEmpty",
- "keys",
- "length",
- "values",
- "clear",
- "containsKey",
- "containsValue",
- "forEach",
- "remove"]);
+Set<String> okMapSelectorsSet = new Set.from(const <String>[
+ // From Object.
+ "==",
+ "hashCode",
+ "toString",
+ "noSuchMethod",
+ "runtimeType",
+ // From Map
+ "[]",
+ "isEmpty",
+ "isNotEmpty",
+ "keys",
+ "length",
+ "values",
+ "clear",
+ "containsKey",
+ "containsValue",
+ "forEach",
+ "remove"
+]);
class MapTracerVisitor extends TracerVisitor<MapTypeInformation> {
// These lists are used to keep track of newly discovered assignments to
@@ -121,7 +121,7 @@
}
}
} else if (selector.isCall &&
- !info.targets.every((element) => element.isFunction)) {
+ !info.targets.every((element) => element.isFunction)) {
bailout('Passed to a closure');
return;
}
diff --git a/pkg/compiler/lib/src/inferrer/node_tracer.dart b/pkg/compiler/lib/src/inferrer/node_tracer.dart
index 174ae56..c50929d 100644
--- a/pkg/compiler/lib/src/inferrer/node_tracer.dart
+++ b/pkg/compiler/lib/src/inferrer/node_tracer.dart
@@ -16,63 +16,61 @@
// A set of selectors we know do not escape the elements inside the
// list.
-Set<String> doesNotEscapeListSet = new Set<String>.from(
- const <String>[
- // From Object.
- '==',
- 'hashCode',
- 'toString',
- 'noSuchMethod',
- 'runtimeType',
+Set<String> doesNotEscapeListSet = new Set<String>.from(const <String>[
+ // From Object.
+ '==',
+ 'hashCode',
+ 'toString',
+ 'noSuchMethod',
+ 'runtimeType',
- // From Iterable.
- 'isEmpty',
- 'isNotEmpty',
- 'length',
- 'contains',
- 'join',
+ // From Iterable.
+ 'isEmpty',
+ 'isNotEmpty',
+ 'length',
+ 'contains',
+ 'join',
- // From List.
- 'add',
- 'addAll',
- 'clear',
- 'fillRange',
- 'indexOf',
- 'insert',
- 'insertAll',
- 'lastIndexOf',
- 'remove',
- 'removeRange',
- 'replaceRange',
- 'setAll',
- 'setRange',
- 'shuffle',
- '[]=',
+ // From List.
+ 'add',
+ 'addAll',
+ 'clear',
+ 'fillRange',
+ 'indexOf',
+ 'insert',
+ 'insertAll',
+ 'lastIndexOf',
+ 'remove',
+ 'removeRange',
+ 'replaceRange',
+ 'setAll',
+ 'setRange',
+ 'shuffle',
+ '[]=',
- // From JSArray.
- 'checkMutable',
- 'checkGrowable',
- ]);
+ // From JSArray.
+ 'checkMutable',
+ 'checkGrowable',
+]);
-Set<String> doesNotEscapeMapSet = new Set<String>.from(
- const <String>[
- // From Object.
- '==',
- 'hashCode',
- 'toString',
- 'noSuchMethod',
- 'runtimeType',
- // from Map.
- 'isEmpty',
- 'isNotEmpty',
- 'length',
- 'clear',
- 'containsKey',
- 'containsValue',
- '[]=',
- // [keys] only allows key values to escape, which we do not track.
- 'keys'
- ]);
+Set<String> doesNotEscapeMapSet = new Set<String>.from(const <String>[
+ // From Object.
+ '==',
+ 'hashCode',
+ 'toString',
+ 'noSuchMethod',
+ 'runtimeType',
+ // from Map.
+ 'isEmpty',
+ 'isNotEmpty',
+ 'length',
+ 'clear',
+ 'containsKey',
+ 'containsValue',
+ '[]=',
+ // [keys] only allows key values to escape, which we do not track.
+ 'keys'
+]);
/// Common logic to trace a value through the type inference graph nodes.
abstract class TracerVisitor<T extends TypeInformation>
@@ -85,7 +83,8 @@
final Setlet<Element> analyzedElements = new Setlet<Element>();
TracerVisitor(this.tracedType, TypeGraphInferrerEngine inferrer)
- : this.inferrer = inferrer, this.compiler = inferrer.compiler;
+ : this.inferrer = inferrer,
+ this.compiler = inferrer.compiler;
// Work list that gets populated with [TypeInformation] that could
// contain the container.
@@ -94,8 +93,7 @@
// Work list of lists to analyze after analyzing the users of a
// [TypeInformation]. We know the [tracedType] has been stored in these
// lists and we must check how it escapes from these lists.
- final List<ListTypeInformation> listsToAnalyze =
- <ListTypeInformation>[];
+ final List<ListTypeInformation> listsToAnalyze = <ListTypeInformation>[];
// Work list of maps to analyze after analyzing the users of a
// [TypeInformation]. We know the [tracedType] has been stored in these
// maps and we must check how it escapes from these maps.
@@ -186,6 +184,7 @@
void visitMapTypeInformation(MapTypeInformation info) {
mapsToAnalyze.add(info);
}
+
void visitConcreteTypeInformation(ConcreteTypeInformation info) {}
void visitStringLiteralTypeInformation(StringLiteralTypeInformation info) {}
@@ -211,7 +210,7 @@
} else {
list.flowsInto.forEach((flow) {
flow.users.forEach((user) {
- if (user is !DynamicCallSiteTypeInformation) return;
+ if (user is! DynamicCallSiteTypeInformation) return;
if (user.receiver != flow) return;
if (inferrer.returnsListElementTypeSet.contains(user.selector)) {
addNewEscapeInformation(user);
@@ -230,7 +229,7 @@
} else {
map.flowsInto.forEach((flow) {
flow.users.forEach((user) {
- if (user is !DynamicCallSiteTypeInformation) return;
+ if (user is! DynamicCallSiteTypeInformation) return;
if (user.receiver != flow) return;
if (user.selector.isIndex) {
addNewEscapeInformation(user);
@@ -253,9 +252,9 @@
if (!receiverType.isContainer) return false;
String selectorName = info.selector.name;
List<TypeInformation> arguments = info.arguments.positional;
- return (selectorName == '[]=' && currentUser == arguments[1])
- || (selectorName == 'insert' && currentUser == arguments[1])
- || (selectorName == 'add' && currentUser == arguments[0]);
+ return (selectorName == '[]=' && currentUser == arguments[1]) ||
+ (selectorName == 'insert' && currentUser == arguments[1]) ||
+ (selectorName == 'add' && currentUser == arguments[0]);
}
bool isIndexSetOnMap(DynamicCallSiteTypeInformation info) {
@@ -271,8 +270,7 @@
* [isParameterOfMapAddingMethod].
*/
bool isValueAddedToMap(DynamicCallSiteTypeInformation info) {
- return isIndexSetOnMap(info) &&
- currentUser == info.arguments.positional[1];
+ return isIndexSetOnMap(info) && currentUser == info.arguments.positional[1];
}
/**
@@ -281,8 +279,7 @@
* [isParameterOfMapAddingMethod].
*/
bool isKeyAddedToMap(DynamicCallSiteTypeInformation info) {
- return isIndexSetOnMap(info) &&
- currentUser == info.arguments.positional[0];
+ return isIndexSetOnMap(info) && currentUser == info.arguments.positional[0];
}
void visitDynamicCallSiteTypeInformation(
@@ -341,9 +338,9 @@
return false;
}
Element method = element.enclosingElement;
- return (method.name == '[]=')
- || (method.name == 'add')
- || (method.name == 'insert');
+ return (method.name == '[]=') ||
+ (method.name == 'add') ||
+ (method.name == 'insert');
}
/**
@@ -362,13 +359,13 @@
bool isClosure(Element element) {
if (!element.isFunction) return false;
+
/// Creating an instance of a class that implements [Function] also
/// closurizes the corresponding [call] member. We do not currently
/// track these, thus the check for [isClosurized] on such a method will
/// return false. Instead we catch that case here for now.
// TODO(herhut): Handle creation of closures from instances of Function.
- if (element.isInstanceMember &&
- element.name == Identifiers.call) {
+ if (element.isInstanceMember && element.name == Identifiers.call) {
return true;
}
Element outermost = element.outermostEnclosingMemberOrTopLevel;
diff --git a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
index 468aa72..e3b2327c 100644
--- a/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/simple_types_inferrer.dart
@@ -4,49 +4,32 @@
library simple_types_inferrer;
-import '../closure.dart' show
- ClosureClassMap,
- ClosureScope;
+import '../closure.dart' show ClosureClassMap, ClosureScope;
import '../common.dart';
-import '../common/names.dart' show
- Selectors;
-import '../compiler.dart' show
- Compiler;
-import '../constants/values.dart' show
- ConstantValue,
- IntConstantValue;
-import '../core_types.dart' show
- CoreClasses,
- CoreTypes;
-import '../cps_ir/cps_ir_nodes.dart' as cps_ir show
- Node;
-import '../dart_types.dart' show
- DartType,
- FunctionType,
- InterfaceType,
- TypeKind;
+import '../common/names.dart' show Selectors;
+import '../compiler.dart' show Compiler;
+import '../constants/values.dart' show ConstantValue, IntConstantValue;
+import '../core_types.dart' show CoreClasses, CoreTypes;
+import '../cps_ir/cps_ir_nodes.dart' as cps_ir show Node;
+import '../dart_types.dart'
+ show DartType, FunctionType, InterfaceType, TypeKind;
import '../elements/elements.dart';
import '../js_backend/js_backend.dart' as js;
import '../native/native.dart' as native;
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../resolution/operators.dart' as op;
import '../tree/tree.dart' as ast;
-import '../types/types.dart' show
- TypesInferrer,
- FlatTypeMask,
- TypeMask,
- ContainerTypeMask,
- ValueTypeMask;
-import '../util/util.dart' show
- Link,
- Setlet;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/side_effects.dart' show
- SideEffects;
+import '../types/types.dart'
+ show
+ TypesInferrer,
+ FlatTypeMask,
+ TypeMask,
+ ContainerTypeMask,
+ ValueTypeMask;
+import '../util/util.dart' show Link, Setlet;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/side_effects.dart' show SideEffects;
import '../world.dart' show ClassWorld;
import 'inferrer_visitor.dart';
@@ -102,10 +85,8 @@
*
* [nodeHolder] is the element holder of [node].
*/
- void recordTypeOfFinalField(ast.Node node,
- Element nodeHolder,
- Element field,
- T type);
+ void recordTypeOfFinalField(
+ ast.Node node, Element nodeHolder, Element field, T type);
/**
* Records that [node] sets non-final field [element] to be of type
@@ -133,14 +114,15 @@
*
* [inLoop] tells whether the call happens in a loop.
*/
- T registerCalledElement(Spannable node,
- Selector selector,
- TypeMask mask,
- Element caller,
- Element callee,
- ArgumentsTypes<T> arguments,
- SideEffects sideEffects,
- bool inLoop);
+ T registerCalledElement(
+ Spannable node,
+ Selector selector,
+ TypeMask mask,
+ Element caller,
+ Element callee,
+ ArgumentsTypes<T> arguments,
+ SideEffects sideEffects,
+ bool inLoop);
/**
* Registers that [caller] calls [selector] with [receiverType] as
@@ -151,14 +133,15 @@
*
* [inLoop] tells whether the call happens in a loop.
*/
- T registerCalledSelector(ast.Node node,
- Selector selector,
- TypeMask mask,
- T receiverType,
- Element caller,
- ArgumentsTypes<T> arguments,
- SideEffects sideEffects,
- bool inLoop);
+ T registerCalledSelector(
+ ast.Node node,
+ Selector selector,
+ TypeMask mask,
+ T receiverType,
+ Element caller,
+ ArgumentsTypes<T> arguments,
+ SideEffects sideEffects,
+ bool inLoop);
/**
* Registers that [caller] calls [closure] with [arguments].
@@ -168,14 +151,15 @@
*
* [inLoop] tells whether the call happens in a loop.
*/
- T registerCalledClosure(ast.Node node,
- Selector selector,
- TypeMask mask,
- T closure,
- Element caller,
- ArgumentsTypes<T> arguments,
- SideEffects sideEffects,
- bool inLoop);
+ T registerCalledClosure(
+ ast.Node node,
+ Selector selector,
+ TypeMask mask,
+ T closure,
+ Element caller,
+ ArgumentsTypes<T> arguments,
+ SideEffects sideEffects,
+ bool inLoop);
/**
* Registers a call to await with an expression of type [argumentType] as
@@ -196,9 +180,8 @@
* Applies [f] to all elements in the universe that match
* [selector] and [mask]. If [f] returns false, aborts the iteration.
*/
- void forEachElementMatching(Selector selector,
- TypeMask mask,
- bool f(Element element)) {
+ void forEachElementMatching(
+ Selector selector, TypeMask mask, bool f(Element element)) {
Iterable<Element> elements =
compiler.world.allFunctions.filter(selector, mask);
for (Element e in elements) {
@@ -210,9 +193,8 @@
* Update [sideEffects] with the side effects of [callee] being
* called with [selector].
*/
- void updateSideEffects(SideEffects sideEffects,
- Selector selector,
- Element callee) {
+ void updateSideEffects(
+ SideEffects sideEffects, Selector selector, Element callee) {
if (callee.isField) {
if (callee.isInstanceMember) {
if (selector.isSetter) {
@@ -258,8 +240,7 @@
mappedType = types.stringType;
} else if (type == coreTypes.intType) {
mappedType = types.intType;
- } else if (type == coreTypes.numType ||
- type == coreTypes.doubleType) {
+ } else if (type == coreTypes.numType || type == coreTypes.doubleType) {
// Note: the backend double class is specifically for non-integer
// doubles, and a native behavior returning 'double' does not guarantee
// a non-integer return type, so we return the number type for those.
@@ -317,9 +298,9 @@
bool isNativeElement(Element element) {
if (compiler.backend.isNative(element)) return true;
- return element.isClassMember
- && compiler.backend.isNative(element.enclosingClass)
- && element.isField;
+ return element.isClassMember &&
+ compiler.backend.isNative(element.enclosingClass) &&
+ element.isField;
}
void analyze(Element element, ArgumentsTypes arguments);
@@ -357,23 +338,21 @@
final InferrerEngine<T, TypeSystem<T>> inferrer;
final Setlet<Entity> capturedVariables = new Setlet<Entity>();
- SimpleTypeInferrerVisitor.internal(analyzedElement,
- this.outermostElement,
- inferrer,
- compiler,
- locals)
- : super(analyzedElement, inferrer, inferrer.types, compiler, locals),
- this.inferrer = inferrer {
+ SimpleTypeInferrerVisitor.internal(
+ analyzedElement, this.outermostElement, inferrer, compiler, locals)
+ : super(analyzedElement, inferrer, inferrer.types, compiler, locals),
+ this.inferrer = inferrer {
assert(outermostElement != null);
}
- SimpleTypeInferrerVisitor(Element element,
- Compiler compiler,
- InferrerEngine<T, TypeSystem<T>> inferrer,
- [LocalsHandler<T> handler])
- : this.internal(element,
- element.outermostEnclosingMemberOrTopLevel.implementation,
- inferrer, compiler, handler);
+ SimpleTypeInferrerVisitor(Element element, Compiler compiler,
+ InferrerEngine<T, TypeSystem<T>> inferrer, [LocalsHandler<T> handler])
+ : this.internal(
+ element,
+ element.outermostEnclosingMemberOrTopLevel.implementation,
+ inferrer,
+ compiler,
+ handler);
void analyzeSuperConstructorCall(Element target, ArgumentsTypes arguments) {
inferrer.analyze(target, arguments);
@@ -396,9 +375,8 @@
// be handled specially, in that we are computing their LUB at
// each update, and reading them yields the type that was found in a
// previous analysis of [outermostElement].
- ClosureClassMap closureData =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- analyzedElement, node, elements);
+ ClosureClassMap closureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(analyzedElement, node, elements);
closureData.forEachCapturedVariable((variable, field) {
locals.setCaptured(variable, field);
});
@@ -445,17 +423,12 @@
if (element.isInitializingFormal) {
InitializingFormalElement initializingFormal = element;
if (initializingFormal.fieldElement.isFinal) {
- inferrer.recordTypeOfFinalField(
- node,
- analyzedElement,
- initializingFormal.fieldElement,
- parameterType);
+ inferrer.recordTypeOfFinalField(node, analyzedElement,
+ initializingFormal.fieldElement, parameterType);
} else {
locals.updateField(initializingFormal.fieldElement, parameterType);
- inferrer.recordTypeOfNonFinalField(
- initializingFormal.node,
- initializingFormal.fieldElement,
- parameterType);
+ inferrer.recordTypeOfNonFinalField(initializingFormal.node,
+ initializingFormal.fieldElement, parameterType);
}
}
locals.update(element, parameterType, node);
@@ -484,20 +457,14 @@
// a call to the default super constructor (the one that takes
// no argument). Resolution ensures that such a constructor
// exists.
- if (!isConstructorRedirect
- && !seenSuperConstructorCall
- && !cls.isObject) {
+ if (!isConstructorRedirect &&
+ !seenSuperConstructorCall &&
+ !cls.isObject) {
FunctionElement target = cls.superclass.lookupDefaultConstructor();
ArgumentsTypes arguments = new ArgumentsTypes([], {});
analyzeSuperConstructorCall(target, arguments);
- inferrer.registerCalledElement(node,
- null,
- null,
- outermostElement,
- target.implementation,
- arguments,
- sideEffects,
- inLoop);
+ inferrer.registerCalledElement(node, null, null, outermostElement,
+ target.implementation, arguments, sideEffects, inLoop);
}
visit(node.body);
inferrer.recordExposesThis(analyzedElement, isThisExposed);
@@ -519,7 +486,7 @@
returnType = types.nonNullExact(cls);
} else if (compiler.world.isIndirectlyInstantiated(cls)) {
returnType = types.nonNullSubclass(cls);
- } else {
+ } else {
// TODO(johnniwinther): Avoid analyzing [analyzedElement] in this
// case; it's never called.
returnType = types.nonNullEmpty();
@@ -537,7 +504,7 @@
if (returnType == null) {
// No return in the body.
returnType = locals.seenReturnOrThrow
- ? types.nonNullEmpty() // Body always throws.
+ ? types.nonNullEmpty() // Body always throws.
: types.nullType;
} else if (!locals.seenReturnOrThrow) {
// We haven't seen returns on all branches. So the method may
@@ -556,12 +523,12 @@
case AsyncMarker.ASYNC:
returnType = inferrer.addReturnTypeFor(
- analyzedElement, returnType, types.asyncFutureType);
+ analyzedElement, returnType, types.asyncFutureType);
break;
case AsyncMarker.ASYNC_STAR:
returnType = inferrer.addReturnTypeFor(
- analyzedElement, returnType, types.asyncStarStreamType);
+ analyzedElement, returnType, types.asyncStarStreamType);
break;
}
}
@@ -582,8 +549,8 @@
// We don't put the closure in the work queue of the
// inferrer, because it will share information with its enclosing
// method, like for example the types of local variables.
- LocalsHandler closureLocals = new LocalsHandler<T>.from(
- locals, node, useOtherTryBlock: false);
+ LocalsHandler closureLocals =
+ new LocalsHandler<T>.from(locals, node, useOtherTryBlock: false);
SimpleTypeInferrerVisitor visitor = new SimpleTypeInferrerVisitor<T>(
element, compiler, inferrer, closureLocals);
visitor.run();
@@ -612,7 +579,8 @@
}
T visitFunctionDeclaration(ast.FunctionDeclaration node) {
- LocalFunctionElement element = elements.getFunctionDefinition(node.function);
+ LocalFunctionElement element =
+ elements.getFunctionDefinition(node.function);
T type = inferrer.concreteTypes.putIfAbsent(node.function, () {
return types.allocateClosure(node.function, element);
});
@@ -650,15 +618,10 @@
elementType = elementType == null
? types.nonNullEmpty()
: types.simplifyPhi(null, null, elementType);
- T containerType = node.isConst
- ? types.constListType
- : types.growableListType;
+ T containerType =
+ node.isConst ? types.constListType : types.growableListType;
return types.allocateList(
- containerType,
- node,
- outermostElement,
- elementType,
- length);
+ containerType, node, outermostElement, elementType, length);
});
}
@@ -674,11 +637,8 @@
}
T type = node.isConst ? types.constMapType : types.mapType;
- return types.allocateMap(type,
- node,
- outermostElement,
- keyTypes,
- valueTypes);
+ return types.allocateMap(
+ type, node, outermostElement, keyTypes, valueTypes);
});
}
@@ -694,17 +654,16 @@
if (isThisExposed) return;
inferrer.forEachElementMatching(selector, mask, (element) {
if (element.isField) {
- if (!selector.isSetter
- && isInClassOrSubclass(element)
- && !element.modifiers.isFinal
- && locals.fieldScope.readField(element) == null
- && element.initializer == null) {
+ if (!selector.isSetter &&
+ isInClassOrSubclass(element) &&
+ !element.modifiers.isFinal &&
+ locals.fieldScope.readField(element) == null &&
+ element.initializer == null) {
// If the field is being used before this constructor
// actually had a chance to initialize it, say it can be
// null.
inferrer.recordTypeOfNonFinalField(
- analyzedElement.node, element,
- types.nullType);
+ analyzedElement.node, element, types.nullType);
}
// Accessing a field does not expose [:this:].
return true;
@@ -717,13 +676,13 @@
}
bool get inInstanceContext {
- return (outermostElement.isInstanceMember && !outermostElement.isField)
- || outermostElement.isGenerativeConstructor;
+ return (outermostElement.isInstanceMember && !outermostElement.isField) ||
+ outermostElement.isGenerativeConstructor;
}
bool treatAsInstanceMember(Element element) {
- return (Elements.isUnresolved(element) && inInstanceContext)
- || (element != null && element.isInstanceMember);
+ return (Elements.isUnresolved(element) && inInstanceContext) ||
+ (element != null && element.isInstanceMember);
}
@override
@@ -734,12 +693,9 @@
return types.dynamicType;
}
- Selector getterSelector =
- elements.getGetterSelectorInComplexSendSet(node);
- TypeMask getterMask =
- elements.getGetterTypeMaskInComplexSendSet(node);
- TypeMask operatorMask =
- elements.getOperatorTypeMaskInComplexSendSet(node);
+ Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node);
+ TypeMask getterMask = elements.getGetterTypeMaskInComplexSendSet(node);
+ TypeMask operatorMask = elements.getOperatorTypeMaskInComplexSendSet(node);
Selector setterSelector = elements.getSelector(node);
TypeMask setterMask = elements.getTypeMask(node);
@@ -785,12 +741,10 @@
}
if (!isThisExposed && isCallOnThis) {
checkIfExposesThis(
- setterSelector,
- types.newTypedSelector(receiverType, setterMask));
+ setterSelector, types.newTypedSelector(receiverType, setterMask));
if (getterSelector != null) {
checkIfExposesThis(
- getterSelector,
- types.newTypedSelector(receiverType, getterMask));
+ getterSelector, types.newTypedSelector(receiverType, getterMask));
}
}
}
@@ -798,9 +752,8 @@
if (node.isIndex) {
return internalError(node, "Unexpected index operation");
} else if (op == '=') {
- return handlePlainAssignment(
- node, element, setterSelector, setterMask, receiverType, rhsType,
- node.arguments.head);
+ return handlePlainAssignment(node, element, setterSelector, setterMask,
+ receiverType, rhsType, node.arguments.head);
} else {
// [foo ??= bar], [: foo++ :] or [: foo += 1 :].
T getterType;
@@ -812,9 +765,9 @@
Element getterElement = elements[node.selector];
getterType = handleStaticSend(
node, getterSelector, getterMask, getterElement, null);
- } else if (Elements.isUnresolved(element)
- || element.isSetter
- || element.isField) {
+ } else if (Elements.isUnresolved(element) ||
+ element.isSetter ||
+ element.isField) {
getterType = handleDynamicSend(
node, getterSelector, getterMask, receiverType, null);
} else if (element.isLocal) {
@@ -829,21 +782,19 @@
newType = types.allocateDiamondPhi(getterType, rhsType);
} else {
Selector operatorSelector =
- elements.getOperatorSelectorInComplexSendSet(node);
- newType = handleDynamicSend(
- node, operatorSelector, operatorMask,
+ elements.getOperatorSelectorInComplexSendSet(node);
+ newType = handleDynamicSend(node, operatorSelector, operatorMask,
getterType, new ArgumentsTypes<T>([rhsType], null));
}
if (Elements.isStaticOrTopLevelField(element)) {
- handleStaticSend(
- node, setterSelector, setterMask, element,
+ handleStaticSend(node, setterSelector, setterMask, element,
new ArgumentsTypes<T>([newType], null));
- } else if (Elements.isUnresolved(element)
- || element.isSetter
- || element.isField) {
+ } else if (Elements.isUnresolved(element) ||
+ element.isSetter ||
+ element.isField) {
handleDynamicSend(node, setterSelector, setterMask, receiverType,
- new ArgumentsTypes<T>([newType], null));
+ new ArgumentsTypes<T>([newType], null));
} else if (element.isLocal) {
locals.update(element, newType, node);
}
@@ -854,44 +805,26 @@
/// Handle compound index set, like `foo[0] += 42` or `foo[0]++`.
T handleCompoundIndexSet(
- ast.SendSet node,
- T receiverType,
- T indexType,
- T rhsType) {
- Selector getterSelector =
- elements.getGetterSelectorInComplexSendSet(node);
- TypeMask getterMask =
- elements.getGetterTypeMaskInComplexSendSet(node);
+ ast.SendSet node, T receiverType, T indexType, T rhsType) {
+ Selector getterSelector = elements.getGetterSelectorInComplexSendSet(node);
+ TypeMask getterMask = elements.getGetterTypeMaskInComplexSendSet(node);
Selector operatorSelector =
elements.getOperatorSelectorInComplexSendSet(node);
- TypeMask operatorMask =
- elements.getOperatorTypeMaskInComplexSendSet(node);
+ TypeMask operatorMask = elements.getOperatorTypeMaskInComplexSendSet(node);
Selector setterSelector = elements.getSelector(node);
TypeMask setterMask = elements.getTypeMask(node);
- T getterType = handleDynamicSend(
- node,
- getterSelector,
- getterMask,
- receiverType,
- new ArgumentsTypes<T>([indexType], null));
+ T getterType = handleDynamicSend(node, getterSelector, getterMask,
+ receiverType, new ArgumentsTypes<T>([indexType], null));
T returnType;
if (node.isIfNullAssignment) {
returnType = types.allocateDiamondPhi(getterType, rhsType);
} else {
- returnType = handleDynamicSend(
- node,
- operatorSelector,
- operatorMask,
- getterType,
- new ArgumentsTypes<T>([rhsType], null));
+ returnType = handleDynamicSend(node, operatorSelector, operatorMask,
+ getterType, new ArgumentsTypes<T>([rhsType], null));
}
- handleDynamicSend(
- node,
- setterSelector,
- setterMask,
- receiverType,
+ handleDynamicSend(node, setterSelector, setterMask, receiverType,
new ArgumentsTypes<T>([indexType, returnType], null));
if (node.isPostfix) {
@@ -902,46 +835,30 @@
}
/// Handle compound prefix/postfix operations, like `a[0]++`.
- T handleCompoundPrefixPostfix(
- ast.Send node,
- T receiverType,
- T indexType) {
+ T handleCompoundPrefixPostfix(ast.Send node, T receiverType, T indexType) {
return handleCompoundIndexSet(
node, receiverType, indexType, types.uint31Type);
}
@override
- T visitIndexPostfix(
- ast.Send node,
- ast.Node receiver,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitIndexPostfix(ast.Send node, ast.Node receiver, ast.Node index,
+ op.IncDecOperator operator, _) {
T receiverType = visit(receiver);
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, receiverType, indexType);
}
@override
- T visitIndexPrefix(
- ast.Send node,
- ast.Node receiver,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitIndexPrefix(ast.Send node, ast.Node receiver, ast.Node index,
+ op.IncDecOperator operator, _) {
T receiverType = visit(receiver);
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, receiverType, indexType);
}
@override
- T visitCompoundIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- op.AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ T visitCompoundIndexSet(ast.SendSet node, ast.Node receiver, ast.Node index,
+ op.AssignmentOperator operator, ast.Node rhs, _) {
T receiverType = visit(receiver);
T indexType = visit(index);
T rhsType = visit(rhs);
@@ -950,11 +867,7 @@
@override
T visitIndexSetIfNull(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, _) {
T receiverType = visit(receiver);
T indexType = visit(index);
T rhsType = visit(rhs);
@@ -962,34 +875,22 @@
}
@override
- T visitSuperIndexPrefix(
- ast.Send node,
- MethodElement getter,
- MethodElement setter,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitSuperIndexPrefix(ast.Send node, MethodElement getter,
+ MethodElement setter, ast.Node index, op.IncDecOperator operator, _) {
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, superType, indexType);
}
@override
- T visitSuperIndexPostfix(
- ast.Send node,
- MethodElement getter,
- MethodElement setter,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitSuperIndexPostfix(ast.Send node, MethodElement getter,
+ MethodElement setter, ast.Node index, op.IncDecOperator operator, _) {
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, superType, indexType);
}
/// Handle compound super index set, like `super[42] =+ 2`.
T handleSuperCompoundIndexSet(
- ast.SendSet node,
- ast.Node index,
- ast.Node rhs) {
+ ast.SendSet node, ast.Node index, ast.Node rhs) {
T receiverType = superType;
T indexType = visit(index);
T rhsType = visit(rhs);
@@ -1009,34 +910,20 @@
}
@override
- T visitSuperIndexSetIfNull(
- ast.SendSet node,
- MethodElement getter,
- MethodElement setter,
- ast.Node index,
- ast.Node rhs,
- _) {
+ T visitSuperIndexSetIfNull(ast.SendSet node, MethodElement getter,
+ MethodElement setter, ast.Node index, ast.Node rhs, _) {
return handleSuperCompoundIndexSet(node, index, rhs);
}
@override
- T visitUnresolvedSuperCompoundIndexSet(
- ast.Send node,
- Element element,
- ast.Node index,
- op.AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ T visitUnresolvedSuperCompoundIndexSet(ast.Send node, Element element,
+ ast.Node index, op.AssignmentOperator operator, ast.Node rhs, _) {
return handleSuperCompoundIndexSet(node, index, rhs);
}
@override
T visitUnresolvedSuperIndexSetIfNull(
- ast.Send node,
- Element element,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.Send node, Element element, ast.Node index, ast.Node rhs, _) {
return handleSuperCompoundIndexSet(node, index, rhs);
}
@@ -1053,13 +940,8 @@
}
@override
- T visitUnresolvedSuperGetterIndexSetIfNull(
- ast.SendSet node,
- Element element,
- MethodElement setter,
- ast.Node index,
- ast.Node rhs,
- _) {
+ T visitUnresolvedSuperGetterIndexSetIfNull(ast.SendSet node, Element element,
+ MethodElement setter, ast.Node index, ast.Node rhs, _) {
return handleSuperCompoundIndexSet(node, index, rhs);
}
@@ -1076,35 +958,21 @@
}
@override
- T visitUnresolvedSuperSetterIndexSetIfNull(
- ast.SendSet node,
- MethodElement getter,
- Element element,
- ast.Node index,
- ast.Node rhs,
- _) {
+ T visitUnresolvedSuperSetterIndexSetIfNull(ast.SendSet node,
+ MethodElement getter, Element element, ast.Node index, ast.Node rhs, _) {
return handleSuperCompoundIndexSet(node, index, rhs);
}
@override
- T visitUnresolvedSuperIndexPrefix(
- ast.Send node,
- Element element,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitUnresolvedSuperIndexPrefix(ast.Send node, Element element,
+ ast.Node index, op.IncDecOperator operator, _) {
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, superType, indexType);
}
@override
- T visitUnresolvedSuperGetterIndexPrefix(
- ast.SendSet node,
- Element element,
- MethodElement setter,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitUnresolvedSuperGetterIndexPrefix(ast.SendSet node, Element element,
+ MethodElement setter, ast.Node index, op.IncDecOperator operator, _) {
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, superType, indexType);
}
@@ -1122,24 +990,15 @@
}
@override
- T visitUnresolvedSuperIndexPostfix(
- ast.Send node,
- Element element,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitUnresolvedSuperIndexPostfix(ast.Send node, Element element,
+ ast.Node index, op.IncDecOperator operator, _) {
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, superType, indexType);
}
@override
- T visitUnresolvedSuperGetterIndexPostfix(
- ast.SendSet node,
- Element element,
- MethodElement setter,
- ast.Node index,
- op.IncDecOperator operator,
- _) {
+ T visitUnresolvedSuperGetterIndexPostfix(ast.SendSet node, Element element,
+ MethodElement setter, ast.Node index, op.IncDecOperator operator, _) {
T indexType = visit(index);
return handleCompoundPrefixPostfix(node, superType, indexType);
}
@@ -1160,22 +1019,14 @@
T handleIndexSet(ast.SendSet node, T receiverType, T indexType, T rhsType) {
Selector setterSelector = elements.getSelector(node);
TypeMask setterMask = elements.getTypeMask(node);
- handleDynamicSend(
- node,
- setterSelector,
- setterMask,
- receiverType,
+ handleDynamicSend(node, setterSelector, setterMask, receiverType,
new ArgumentsTypes<T>([indexType, rhsType], null));
return rhsType;
}
@override
T visitIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, _) {
T receiverType = visit(receiver);
T indexType = visit(index);
T rhsType = visit(rhs);
@@ -1183,10 +1034,7 @@
}
/// Handle super index set, like `super[42] = true`.
- T handleSuperIndexSet(
- ast.SendSet node,
- ast.Node index,
- ast.Node rhs) {
+ T handleSuperIndexSet(ast.SendSet node, ast.Node index, ast.Node rhs) {
T receiverType = superType;
T indexType = visit(index);
T rhsType = visit(rhs);
@@ -1194,45 +1042,37 @@
}
@override
- T visitSuperIndexSet(
- ast.SendSet node,
- FunctionElement function,
- ast.Node index,
- ast.Node rhs,
- _) {
+ T visitSuperIndexSet(ast.SendSet node, FunctionElement function,
+ ast.Node index, ast.Node rhs, _) {
return handleSuperIndexSet(node, index, rhs);
}
@override
T visitUnresolvedSuperIndexSet(
- ast.SendSet node,
- Element element,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.SendSet node, Element element, ast.Node index, ast.Node rhs, _) {
return handleSuperIndexSet(node, index, rhs);
}
- T handlePlainAssignment(ast.Node node,
- Element element,
- Selector setterSelector,
- TypeMask setterMask,
- T receiverType,
- T rhsType,
- ast.Node rhs) {
+ T handlePlainAssignment(
+ ast.Node node,
+ Element element,
+ Selector setterSelector,
+ TypeMask setterMask,
+ T receiverType,
+ T rhsType,
+ ast.Node rhs) {
ArgumentsTypes arguments = new ArgumentsTypes<T>([rhsType], null);
if (Elements.isMalformed(element)) {
// Code will always throw.
} else if (Elements.isStaticOrTopLevelField(element)) {
handleStaticSend(node, setterSelector, setterMask, element, arguments);
} else if (Elements.isUnresolved(element) || element.isSetter) {
- if (analyzedElement.isGenerativeConstructor
- && (node.asSendSet() != null)
- && (node.asSendSet().receiver != null)
- && node.asSendSet().receiver.isThis()) {
+ if (analyzedElement.isGenerativeConstructor &&
+ (node.asSendSet() != null) &&
+ (node.asSendSet().receiver != null) &&
+ node.asSendSet().receiver.isThis()) {
Iterable<Element> targets = compiler.world.allFunctions.filter(
- setterSelector,
- types.newTypedSelector(thisType, setterMask));
+ setterSelector, types.newTypedSelector(thisType, setterMask));
// We just recognized a field initialization of the form:
// `this.foo = 42`. If there is only one target, we can update
// its type.
@@ -1268,9 +1108,8 @@
/// Handle a super access or invocation that results in a `noSuchMethod` call.
T handleErroneousSuperSend(ast.Send node) {
- ArgumentsTypes arguments = node.isPropertyAccess
- ? null
- : analyzeArguments(node.arguments);
+ ArgumentsTypes arguments =
+ node.isPropertyAccess ? null : analyzeArguments(node.arguments);
Selector selector = elements.getSelector(node);
TypeMask mask = elements.getTypeMask(node);
// TODO(herhut): We could do better here if we knew what we
@@ -1284,9 +1123,7 @@
/// Handle a .call invocation on the values retrieved from the super
/// [element]. For instance `super.foo(bar)` where `foo` is a field or getter.
T handleSuperClosureCall(
- ast.Send node,
- Element element,
- ast.NodeList arguments) {
+ ast.Send node, Element element, ast.NodeList arguments) {
ArgumentsTypes argumentTypes = analyzeArguments(arguments.nodes);
Selector selector = elements.getSelector(node);
TypeMask mask = elements.getTypeMask(node);
@@ -1294,188 +1131,130 @@
// are calling does not expose this.
isThisExposed = true;
return inferrer.registerCalledClosure(
- node, selector, mask, inferrer.typeOfElement(element),
- outermostElement, argumentTypes, sideEffects, inLoop);
+ node,
+ selector,
+ mask,
+ inferrer.typeOfElement(element),
+ outermostElement,
+ argumentTypes,
+ sideEffects,
+ inLoop);
}
/// Handle an invocation of super [method].
- T handleSuperMethodInvoke(ast.Send node,
- MethodElement method,
- ArgumentsTypes arguments) {
+ T handleSuperMethodInvoke(
+ ast.Send node, MethodElement method, ArgumentsTypes arguments) {
// TODO(herhut): We could do better here if we knew what we
// are calling does not expose this.
isThisExposed = true;
Selector selector = elements.getSelector(node);
TypeMask mask = elements.getTypeMask(node);
- return handleStaticSend(
- node, selector, mask, method, arguments);
+ return handleStaticSend(node, selector, mask, method, arguments);
}
/// Handle access to a super field or getter [element].
- T handleSuperGet(ast.Send node,
- Element element) {
+ T handleSuperGet(ast.Send node, Element element) {
// TODO(herhut): We could do better here if we knew what we
// are calling does not expose this.
isThisExposed = true;
Selector selector = elements.getSelector(node);
TypeMask mask = elements.getTypeMask(node);
- return handleStaticSend(
- node, selector, mask, element, null);
+ return handleStaticSend(node, selector, mask, element, null);
}
@override
T visitUnresolvedSuperIndex(
- ast.Send node,
- Element element,
- ast.Node index,
- _) {
+ ast.Send node, Element element, ast.Node index, _) {
return handleErroneousSuperSend(node);
}
@override
T visitUnresolvedSuperUnary(
- ast.Send node,
- op.UnaryOperator operator,
- Element element,
- _) {
+ ast.Send node, op.UnaryOperator operator, Element element, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitUnresolvedSuperBinary(
- ast.Send node,
- Element element,
- op.BinaryOperator operator,
- ast.Node argument,
- _) {
+ T visitUnresolvedSuperBinary(ast.Send node, Element element,
+ op.BinaryOperator operator, ast.Node argument, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitUnresolvedSuperGet(
- ast.Send node,
- Element element,
- _) {
+ T visitUnresolvedSuperGet(ast.Send node, Element element, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitSuperSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ T visitSuperSetterGet(ast.Send node, MethodElement setter, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitSuperGetterSet(
- ast.Send node,
- MethodElement getter,
- ast.Node rhs,
- _) {
+ T visitSuperGetterSet(ast.Send node, MethodElement getter, ast.Node rhs, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitUnresolvedSuperSet(
- ast.Send node,
- Element element,
- ast.Node rhs,
- _) {
+ T visitUnresolvedSuperSet(ast.Send node, Element element, ast.Node rhs, _) {
return handleErroneousSuperSend(node);
}
@override
T visitUnresolvedSuperInvoke(
- ast.Send node,
- Element element,
- ast.Node argument,
- Selector selector,
- _) {
+ ast.Send node, Element element, ast.Node argument, Selector selector, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitSuperFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ T visitSuperFieldGet(ast.Send node, FieldElement field, _) {
return handleSuperGet(node, field);
}
@override
- T visitSuperGetterGet(
- ast.Send node,
- MethodElement method,
- _) {
+ T visitSuperGetterGet(ast.Send node, MethodElement method, _) {
return handleSuperGet(node, method);
}
@override
- T visitSuperMethodGet(
- ast.Send node,
- MethodElement method,
- _) {
+ T visitSuperMethodGet(ast.Send node, MethodElement method, _) {
return handleSuperGet(node, method);
}
@override
- T visitSuperFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitSuperFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleSuperClosureCall(node, field, arguments);
}
@override
- T visitSuperGetterInvoke(
- ast.Send node,
- MethodElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitSuperGetterInvoke(ast.Send node, MethodElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleSuperClosureCall(node, getter, arguments);
}
@override
- T visitSuperMethodInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitSuperMethodInvoke(ast.Send node, MethodElement method,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleSuperMethodInvoke(
node, method, analyzeArguments(arguments.nodes));
}
@override
- T visitSuperSetterInvoke(
- ast.Send node,
- FunctionElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitSuperSetterInvoke(ast.Send node, FunctionElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleErroneousSuperSend(node);
}
@override
- T visitSuperIndex(
- ast.Send node,
- MethodElement method,
- ast.Node index,
- _) {
+ T visitSuperIndex(ast.Send node, MethodElement method, ast.Node index, _) {
return handleSuperMethodInvoke(
node, method, analyzeArguments(node.arguments));
}
@override
T visitSuperEquals(
- ast.Send node,
- MethodElement method,
- ast.Node argument,
- _) {
+ ast.Send node, MethodElement method, ast.Node argument, _) {
// TODO(johnniwinther): Special case ==.
return handleSuperMethodInvoke(
node, method, analyzeArguments(node.arguments));
@@ -1483,43 +1262,29 @@
@override
T visitSuperNotEquals(
- ast.Send node,
- MethodElement method,
- ast.Node argument,
- _) {
+ ast.Send node, MethodElement method, ast.Node argument, _) {
// TODO(johnniwinther): Special case !=.
return handleSuperMethodInvoke(
node, method, analyzeArguments(node.arguments));
}
@override
- T visitSuperBinary(
- ast.Send node,
- MethodElement method,
- op.BinaryOperator operator,
- ast.Node argument,
- _) {
+ T visitSuperBinary(ast.Send node, MethodElement method,
+ op.BinaryOperator operator, ast.Node argument, _) {
return handleSuperMethodInvoke(
node, method, analyzeArguments(node.arguments));
}
@override
T visitSuperUnary(
- ast.Send node,
- op.UnaryOperator operator,
- MethodElement method,
- _) {
+ ast.Send node, op.UnaryOperator operator, MethodElement method, _) {
return handleSuperMethodInvoke(
node, method, analyzeArguments(node.arguments));
}
@override
- T visitSuperMethodIncompatibleInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitSuperMethodIncompatibleInvoke(ast.Send node, MethodElement method,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleErroneousSuperSend(node);
}
@@ -1530,10 +1295,10 @@
ast.LiteralInt length = firstArgument.asLiteralInt();
if (length != null) {
return length.value;
- } else if (element != null
- && element.isField
- && Elements.isStaticOrTopLevelField(element)
- && compiler.world.fieldNeverChanges(element)) {
+ } else if (element != null &&
+ element.isField &&
+ Elements.isStaticOrTopLevelField(element) &&
+ compiler.world.fieldNeverChanges(element)) {
ConstantValue value =
compiler.backend.constants.getConstantValueForVariable(element);
if (value != null && value.isInt) {
@@ -1594,12 +1359,12 @@
T returnType = handleStaticSend(node, selector, mask, target, arguments);
if (Elements.isGrowableListConstructorCall(constructor, node, compiler)) {
return inferrer.concreteTypes.putIfAbsent(
- node, () => types.allocateList(
- types.growableListType, node, outermostElement,
- types.nonNullEmpty(), 0));
- } else if (Elements.isFixedListConstructorCall(constructor, node, compiler)
- || Elements.isFilledListConstructorCall(constructor, node, compiler)) {
-
+ node,
+ () => types.allocateList(types.growableListType, node,
+ outermostElement, types.nonNullEmpty(), 0));
+ } else if (Elements.isFixedListConstructorCall(
+ constructor, node, compiler) ||
+ Elements.isFilledListConstructorCall(constructor, node, compiler)) {
int length = findLength(node);
T elementType =
Elements.isFixedListConstructorCall(constructor, node, compiler)
@@ -1607,18 +1372,18 @@
: arguments.positional[1];
return inferrer.concreteTypes.putIfAbsent(
- node, () => types.allocateList(
- types.fixedListType, node, outermostElement,
+ node,
+ () => types.allocateList(types.fixedListType, node, outermostElement,
elementType, length));
- } else if (
- Elements.isConstructorOfTypedArraySubclass(constructor, compiler)) {
+ } else if (Elements.isConstructorOfTypedArraySubclass(
+ constructor, compiler)) {
int length = findLength(node);
- T elementType = inferrer.returnTypeOfElement(
- target.enclosingClass.lookupMember('[]'));
+ T elementType = inferrer
+ .returnTypeOfElement(target.enclosingClass.lookupMember('[]'));
return inferrer.concreteTypes.putIfAbsent(
- node, () => types.allocateList(
- types.nonNullExact(target.enclosingClass), node,
- outermostElement, elementType, length));
+ node,
+ () => types.allocateList(types.nonNullExact(target.enclosingClass),
+ node, outermostElement, elementType, length));
} else {
return returnType;
}
@@ -1631,13 +1396,8 @@
}
@override
- T errorNonConstantConstructorInvoke(
- ast.NewExpression node,
- Element element,
- DartType type,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T errorNonConstantConstructorInvoke(ast.NewExpression node, Element element,
+ DartType type, ast.NodeList arguments, CallStructure callStructure, _) {
return bulkHandleNew(node, _);
}
@@ -1648,8 +1408,14 @@
TypeMask mask = elements.getTypeMask(node);
handleStaticSend(node, selector, mask, element, arguments);
return inferrer.registerCalledClosure(
- node, selector, mask, inferrer.typeOfElement(element),
- outermostElement, arguments, sideEffects, inLoop);
+ node,
+ selector,
+ mask,
+ inferrer.typeOfElement(element),
+ outermostElement,
+ arguments,
+ sideEffects,
+ inLoop);
}
/// Handle invocation of a top level or static [function].
@@ -1671,62 +1437,38 @@
}
@override
- T visitStaticFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitStaticFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleStaticFieldOrGetterInvoke(node, field);
}
@override
- T visitStaticFunctionInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitStaticFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleStaticFunctionInvoke(node, function);
}
@override
- T visitStaticFunctionIncompatibleInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitStaticFunctionIncompatibleInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleInvalidStaticInvoke(node);
}
@override
- T visitStaticGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitStaticGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleStaticFieldOrGetterInvoke(node, getter);
}
@override
- T visitTopLevelFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitTopLevelFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleStaticFieldOrGetterInvoke(node, field);
}
@override
- T visitTopLevelFunctionInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitTopLevelFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleStaticFunctionInvoke(node, function);
}
@@ -1741,42 +1483,26 @@
}
@override
- T visitTopLevelGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitTopLevelGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleStaticFieldOrGetterInvoke(node, getter);
}
@override
- T visitStaticSetterInvoke(
- ast.Send node,
- MethodElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitStaticSetterInvoke(ast.Send node, MethodElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleInvalidStaticInvoke(node);
}
@override
- T visitTopLevelSetterInvoke(
- ast.Send node,
- MethodElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitTopLevelSetterInvoke(ast.Send node, MethodElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleInvalidStaticInvoke(node);
}
@override
- T visitUnresolvedInvoke(
- ast.Send node,
- Element element,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ T visitUnresolvedInvoke(ast.Send node, Element element,
+ ast.NodeList arguments, Selector selector, _) {
return handleInvalidStaticInvoke(node);
}
@@ -1846,124 +1572,78 @@
}
@override
- T visitDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ T visitDynamicPropertyGet(ast.Send node, ast.Node receiver, Name name, _) {
return handleDynamicGet(node);
}
@override
T visitIfNotNullDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ ast.Send node, ast.Node receiver, Name name, _) {
return handleDynamicGet(node);
}
@override
- T visitLocalVariableGet(
- ast.Send node,
- LocalVariableElement variable,
- _) {
+ T visitLocalVariableGet(ast.Send node, LocalVariableElement variable, _) {
return handleLocalGet(node, variable);
}
@override
- T visitParameterGet(
- ast.Send node,
- ParameterElement parameter,
- _) {
+ T visitParameterGet(ast.Send node, ParameterElement parameter, _) {
return handleLocalGet(node, parameter);
}
@override
- T visitLocalFunctionGet(
- ast.Send node,
- LocalFunctionElement function,
- _) {
+ T visitLocalFunctionGet(ast.Send node, LocalFunctionElement function, _) {
return handleLocalGet(node, function);
}
@override
- T visitStaticFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ T visitStaticFieldGet(ast.Send node, FieldElement field, _) {
return handleStaticFieldGet(node, field);
}
@override
- T visitStaticFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ T visitStaticFunctionGet(ast.Send node, MethodElement function, _) {
return handleStaticFunctionGet(node, function);
}
@override
- T visitStaticGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ T visitStaticGetterGet(ast.Send node, FunctionElement getter, _) {
return handleStaticGetterGet(node, getter);
}
@override
- T visitThisPropertyGet(
- ast.Send node,
- Name name,
- _) {
+ T visitThisPropertyGet(ast.Send node, Name name, _) {
return handleDynamicGet(node);
}
@override
- T visitTopLevelFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ T visitTopLevelFieldGet(ast.Send node, FieldElement field, _) {
return handleStaticFieldGet(node, field);
}
@override
- T visitTopLevelFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ T visitTopLevelFunctionGet(ast.Send node, MethodElement function, _) {
return handleStaticFunctionGet(node, function);
}
@override
- T visitTopLevelGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ T visitTopLevelGetterGet(ast.Send node, FunctionElement getter, _) {
return handleStaticGetterGet(node, getter);
}
@override
- T visitStaticSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ T visitStaticSetterGet(ast.Send node, MethodElement setter, _) {
return types.dynamicType;
}
@override
- T visitTopLevelSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ T visitTopLevelSetterGet(ast.Send node, MethodElement setter, _) {
return types.dynamicType;
}
@override
- T visitUnresolvedGet(
- ast.Send node,
- Element element,
- _) {
+ T visitUnresolvedGet(ast.Send node, Element element, _) {
return types.dynamicType;
}
@@ -1972,66 +1652,45 @@
ArgumentsTypes arguments = analyzeArguments(node.arguments);
Selector selector = elements.getSelector(node);
TypeMask mask = elements.getTypeMask(node);
- return inferrer.registerCalledClosure(
- node, selector, mask, closure, outermostElement, arguments,
- sideEffects, inLoop);
+ return inferrer.registerCalledClosure(node, selector, mask, closure,
+ outermostElement, arguments, sideEffects, inLoop);
}
@override
- T visitExpressionInvoke(
- ast.Send node,
- ast.Node expression,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitExpressionInvoke(ast.Send node, ast.Node expression,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleCallInvoke(node, expression.accept(this));
- }
+ }
@override
T visitThisInvoke(
- ast.Send node,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ ast.Send node, ast.NodeList arguments, CallStructure callStructure, _) {
return handleCallInvoke(node, thisType);
}
@override
- T visitParameterInvoke(
- ast.Send node,
- ParameterElement parameter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitParameterInvoke(ast.Send node, ParameterElement parameter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleCallInvoke(node, locals.use(parameter));
}
@override
- T visitLocalVariableInvoke(
- ast.Send node,
- LocalVariableElement variable,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitLocalVariableInvoke(ast.Send node, LocalVariableElement variable,
+ ast.NodeList arguments, CallStructure callStructure, _) {
return handleCallInvoke(node, locals.use(variable));
}
@override
- T visitLocalFunctionInvoke(
- ast.Send node,
- LocalFunctionElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ T visitLocalFunctionInvoke(ast.Send node, LocalFunctionElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
ArgumentsTypes argumentTypes = analyzeArguments(node.arguments);
Selector selector = elements.getSelector(node);
TypeMask mask = elements.getTypeMask(node);
// This only works for function statements. We need a
// more sophisticated type system with function types to support
// more.
- return inferrer.registerCalledElement(
- node, selector, mask, outermostElement, function, argumentTypes,
- sideEffects, inLoop);
+ return inferrer.registerCalledElement(node, selector, mask,
+ outermostElement, function, argumentTypes, sideEffects, inLoop);
}
@override
@@ -2045,28 +1704,21 @@
return types.dynamicType;
}
- T handleStaticSend(ast.Node node,
- Selector selector,
- TypeMask mask,
- Element element,
- ArgumentsTypes arguments) {
+ T handleStaticSend(ast.Node node, Selector selector, TypeMask mask,
+ Element element, ArgumentsTypes arguments) {
assert(!element.isFactoryConstructor ||
- !(element as ConstructorElement).isRedirectingFactory);
+ !(element as ConstructorElement).isRedirectingFactory);
// Erroneous elements may be unresolved, for example missing getters.
if (Elements.isUnresolved(element)) return types.dynamicType;
// TODO(herhut): should we follow redirecting constructors here? We would
// need to pay attention if the constructor is pointing to an erroneous
// element.
- return inferrer.registerCalledElement(
- node, selector, mask, outermostElement, element, arguments,
- sideEffects, inLoop);
+ return inferrer.registerCalledElement(node, selector, mask,
+ outermostElement, element, arguments, sideEffects, inLoop);
}
- T handleDynamicSend(ast.Node node,
- Selector selector,
- TypeMask mask,
- T receiverType,
- ArgumentsTypes arguments) {
+ T handleDynamicSend(ast.Node node, Selector selector, TypeMask mask,
+ T receiverType, ArgumentsTypes arguments) {
assert(receiverType != null);
if (types.selectorNeedsUpdate(receiverType, mask)) {
mask = receiverType == types.dynamicType
@@ -2091,9 +1743,8 @@
}
}
- return inferrer.registerCalledSelector(
- node, selector, mask, receiverType, outermostElement, arguments,
- sideEffects, inLoop);
+ return inferrer.registerCalledSelector(node, selector, mask, receiverType,
+ outermostElement, arguments, sideEffects, inLoop);
}
T handleDynamicInvoke(ast.Send node) {
@@ -2125,11 +1776,9 @@
checkIfExposesThis(selector, types.newTypedSelector(receiverType, mask));
}
- ArgumentsTypes arguments = node.isPropertyAccess
- ? null
- : analyzeArguments(node.arguments);
- if (selector.name == '==' ||
- selector.name == '!=') {
+ ArgumentsTypes arguments =
+ node.isPropertyAccess ? null : analyzeArguments(node.arguments);
+ if (selector.name == '==' || selector.name == '!=') {
if (types.isNull(receiverType)) {
potentiallyAddNullCheck(node, node.arguments.head);
return types.boolType;
@@ -2173,14 +1822,8 @@
}
ArgumentsTypes arguments = new ArgumentsTypes<T>(unnamed, named);
- return inferrer.registerCalledElement(node,
- null,
- null,
- outermostElement,
- element,
- arguments,
- sideEffects,
- inLoop);
+ return inferrer.registerCalledElement(node, null, null, outermostElement,
+ element, arguments, sideEffects, inLoop);
}
T visitRedirectingFactoryBody(ast.RedirectingFactoryBody node) {
@@ -2201,25 +1844,18 @@
T visitReturn(ast.Return node) {
ast.Node expression = node.expression;
- recordReturnType(expression == null
- ? types.nullType
- : expression.accept(this));
+ recordReturnType(
+ expression == null ? types.nullType : expression.accept(this));
locals.seenReturnOrThrow = true;
return null;
}
- T handleForInLoop(ast.ForIn node,
- T iteratorType,
- Selector currentSelector,
- TypeMask currentMask,
- Selector moveNextSelector,
- TypeMask moveNextMask) {
- handleDynamicSend(
- node, moveNextSelector, moveNextMask, iteratorType,
+ T handleForInLoop(ast.ForIn node, T iteratorType, Selector currentSelector,
+ TypeMask currentMask, Selector moveNextSelector, TypeMask moveNextMask) {
+ handleDynamicSend(node, moveNextSelector, moveNextMask, iteratorType,
new ArgumentsTypes<T>.empty());
- T currentType = handleDynamicSend(
- node, currentSelector, currentMask, iteratorType,
- new ArgumentsTypes<T>.empty());
+ T currentType = handleDynamicSend(node, currentSelector, currentMask,
+ iteratorType, new ArgumentsTypes<T>.empty());
if (node.expression.isThis()) {
// Any reasonable implementation of an iterator would expose
@@ -2239,9 +1875,8 @@
receiverType = types.dynamicType;
}
- handlePlainAssignment(identifier, element, selector, mask,
- receiverType, currentType,
- node.expression);
+ handlePlainAssignment(identifier, element, selector, mask, receiverType,
+ currentType, node.expression);
return handleLoop(node, () {
visit(node.body);
});
@@ -2259,12 +1894,11 @@
Element ctor = backend.helpers.streamIteratorConstructor;
/// Synthesize a call to the [StreamIterator] constructor.
- T iteratorType = handleStaticSend(node, null, null, ctor,
- new ArgumentsTypes<T>([expressionType],
- null));
+ T iteratorType = handleStaticSend(
+ node, null, null, ctor, new ArgumentsTypes<T>([expressionType], null));
return handleForInLoop(node, iteratorType, currentSelector, currentMask,
- moveNextSelector, moveNextMask);
+ moveNextSelector, moveNextMask);
}
T visitSyncForIn(ast.SyncForIn node) {
@@ -2276,11 +1910,10 @@
Selector moveNextSelector = Selectors.moveNext;
TypeMask moveNextMask = elements.getMoveNextTypeMask(node);
- T iteratorType = handleDynamicSend(
- node, iteratorSelector, iteratorMask, expressionType,
- new ArgumentsTypes<T>.empty());
+ T iteratorType = handleDynamicSend(node, iteratorSelector, iteratorMask,
+ expressionType, new ArgumentsTypes<T>.empty());
return handleForInLoop(node, iteratorType, currentSelector, currentMask,
- moveNextSelector, moveNextMask);
+ moveNextSelector, moveNextMask);
}
}
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
index a3520a0..a651852 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_dump.dart
@@ -29,10 +29,10 @@
static const String outputDir = 'typegraph';
final TypeGraphInferrerEngine inferrer;
- final Map<TypeInformation, Set<TypeInformation>> assignmentsBeforeAnalysis
- = <TypeInformation, Set<TypeInformation>>{};
- final Map<TypeInformation, Set<TypeInformation>> assignmentsBeforeTracing
- = <TypeInformation, Set<TypeInformation>>{};
+ final Map<TypeInformation, Set<TypeInformation>> assignmentsBeforeAnalysis =
+ <TypeInformation, Set<TypeInformation>>{};
+ final Map<TypeInformation, Set<TypeInformation>> assignmentsBeforeTracing =
+ <TypeInformation, Set<TypeInformation>>{};
final Set<String> usedFilenames = new Set<String>();
TypeGraphDump(this.inferrer);
@@ -65,8 +65,9 @@
<Element, List<TypeInformation>>{};
for (TypeInformation node in inferrer.types.allTypes) {
if (node.contextMember != null) {
- nodes.putIfAbsent(node.contextMember, () => <TypeInformation>[])
- .add(node);
+ nodes
+ .putIfAbsent(node.contextMember, () => <TypeInformation>[])
+ .add(node);
}
}
// Print every group separately.
@@ -100,9 +101,8 @@
List<String> parts = <String>[];
parts.add(element.library?.libraryName);
parts.add(element.enclosingClass?.name);
- Element namedElement = element is LocalElement
- ? element.executableContext
- : element;
+ Element namedElement =
+ element is LocalElement ? element.executableContext : element;
if (namedElement.isGetter) {
parts.add('get-${namedElement.name}');
} else if (namedElement.isSetter) {
@@ -114,7 +114,8 @@
parts.add(namedElement.name);
}
} else if (namedElement.isOperator) {
- parts.add(Elements.operatorNameToIdentifier(namedElement.name)
+ parts.add(Elements
+ .operatorNameToIdentifier(namedElement.name)
.replaceAll(r'$', '-'));
} else {
parts.add(namedElement.name);
@@ -205,10 +206,8 @@
///
/// If [dst] is a record type node, [port] may refer to one of the fields
/// defined in that record (e.g. `obj`, `arg0`, `arg1`, etc)
- void addEdge(TypeInformation src,
- TypeInformation dst,
- {String port,
- String color: 'black'}) {
+ void addEdge(TypeInformation src, TypeInformation dst,
+ {String port, String color: 'black'}) {
if (isExternal(src) && isExternal(dst)) {
return; // Do not add edges between external nodes.
}
@@ -270,10 +269,8 @@
///
/// [inputs] specify named inputs to the node. If omitted, edges will be
/// based on [node.assignments].
- void addNode(TypeInformation node,
- String text,
- {String color: defaultNodeColor,
- Map<String, TypeInformation> inputs}) {
+ void addNode(TypeInformation node, String text,
+ {String color: defaultNodeColor, Map<String, TypeInformation> inputs}) {
seen.add(node);
String style = getStyleForNode(node, color);
text = appendDetails(node, text);
@@ -297,9 +294,8 @@
var tracerSet = global.assignmentsBeforeTracing[node] ?? const [];
var currentSet = node.assignments.toSet();
for (TypeInformation assignment in currentSet) {
- String color = originalSet.contains(assignment)
- ? unchangedEdge
- : addedEdge;
+ String color =
+ originalSet.contains(assignment) ? unchangedEdge : addedEdge;
addEdge(assignment, node, color: color);
}
for (TypeInformation assignment in originalSet) {
@@ -351,7 +347,7 @@
}
void visitStringLiteralTypeInformation(StringLiteralTypeInformation info) {
- String text = shorten(info.value.slowToString()).replaceAll('\n','\\n');
+ String text = shorten(info.value.slowToString()).replaceAll('\n', '\\n');
addNode(info, 'StringLiteral\n"$text"');
}
@@ -373,7 +369,8 @@
addNode(info, text, color: callColor, inputs: inputs);
}
- void visitClosureCallSiteTypeInformation(ClosureCallSiteTypeInformation info) {
+ void visitClosureCallSiteTypeInformation(
+ ClosureCallSiteTypeInformation info) {
handleCall(info, 'ClosureCallSite', {});
}
@@ -381,10 +378,9 @@
handleCall(info, 'StaticCallSite', {});
}
- void visitDynamicCallSiteTypeInformation(DynamicCallSiteTypeInformation info) {
- handleCall(info, 'DynamicCallSite', {
- 'obj': info.receiver
- });
+ void visitDynamicCallSiteTypeInformation(
+ DynamicCallSiteTypeInformation info) {
+ handleCall(info, 'DynamicCallSite', {'obj': info.receiver});
}
void visitMemberTypeInformation(MemberTypeInformation info) {
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
index f12a8b4..e19436f 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_inferrer.dart
@@ -7,52 +7,26 @@
import 'dart:collection' show Queue;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers,
- Names;
-import '../compiler.dart' show
- Compiler;
+import '../common/names.dart' show Identifiers, Names;
+import '../compiler.dart' show Compiler;
import '../constants/values.dart';
-import '../dart_types.dart' show
- DartType,
- FunctionType,
- InterfaceType,
- TypeKind;
+import '../dart_types.dart'
+ show DartType, FunctionType, InterfaceType, TypeKind;
import '../elements/elements.dart';
-import '../js_backend/js_backend.dart' show
- Annotations,
- JavaScriptBackend;
-import '../resolution/tree_elements.dart' show
- TreeElementMapping;
-import '../tree/tree.dart' as ast show
- DartString,
- Node,
- LiteralBool,
- Send,
- SendSet,
- TryStatement;
-import '../types/types.dart' show
- ContainerTypeMask,
- MapTypeMask,
- TypeMask,
- TypesInferrer;
-import '../types/constants.dart' show
- computeTypeMask;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/side_effects.dart' show
- SideEffects;
-import '../util/util.dart' show
- ImmutableEmptySet,
- Setlet;
-import '../world.dart' show
- ClassWorld;
+import '../js_backend/js_backend.dart' show Annotations, JavaScriptBackend;
+import '../resolution/tree_elements.dart' show TreeElementMapping;
+import '../tree/tree.dart' as ast
+ show DartString, Node, LiteralBool, Send, SendSet, TryStatement;
+import '../types/types.dart'
+ show ContainerTypeMask, MapTypeMask, TypeMask, TypesInferrer;
+import '../types/constants.dart' show computeTypeMask;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/side_effects.dart' show SideEffects;
+import '../util/util.dart' show ImmutableEmptySet, Setlet;
+import '../world.dart' show ClassWorld;
-import 'inferrer_visitor.dart' show
- ArgumentsTypes,
- TypeSystem;
+import 'inferrer_visitor.dart' show ArgumentsTypes, TypeSystem;
import 'simple_types_inferrer.dart';
import 'closure_tracer.dart';
@@ -62,7 +36,6 @@
import 'type_graph_dump.dart';
import 'debug.dart' as debug;
-
class TypeInformationSystem extends TypeSystem<TypeInformation> {
final Compiler compiler;
final ClassWorld classWorld;
@@ -90,13 +63,14 @@
/// narrowing, phis, and containers).
final List<TypeInformation> allocatedTypes = <TypeInformation>[];
- Iterable<TypeInformation> get allTypes =>
- [typeInformations.values,
- allocatedLists.values,
- allocatedMaps.values,
- allocatedClosures,
- concreteTypes.values,
- allocatedTypes].expand((x) => x);
+ Iterable<TypeInformation> get allTypes => [
+ typeInformations.values,
+ allocatedLists.values,
+ allocatedMaps.values,
+ allocatedClosures,
+ concreteTypes.values,
+ allocatedTypes
+ ].expand((x) => x);
TypeInformationSystem(Compiler compiler)
: this.compiler = compiler,
@@ -264,8 +238,8 @@
return new BoolLiteralTypeInformation(value, compiler.typesTask.boolType);
}
- TypeInformation computeLUB(TypeInformation firstType,
- TypeInformation secondType) {
+ TypeInformation computeLUB(
+ TypeInformation firstType, TypeInformation secondType) {
if (firstType == null) return secondType;
if (firstType == secondType) return firstType;
if (firstType == nonNullEmptyType) return secondType;
@@ -281,11 +255,8 @@
return info.type != mask;
}
- TypeInformation refineReceiver(
- Selector selector,
- TypeMask mask,
- TypeInformation receiver,
- bool isConditional) {
+ TypeInformation refineReceiver(Selector selector, TypeMask mask,
+ TypeInformation receiver, bool isConditional) {
if (receiver.type.isExact) return receiver;
TypeMask otherType =
compiler.world.allFunctions.receiverType(selector, mask);
@@ -307,9 +278,8 @@
return newType;
}
- TypeInformation narrowType(TypeInformation type,
- DartType annotation,
- {bool isNullable: true}) {
+ TypeInformation narrowType(TypeInformation type, DartType annotation,
+ {bool isNullable: true}) {
if (annotation.treatAsDynamic) return type;
if (annotation.isVoid) return nullType;
if (annotation.element == classWorld.objectClass && isNullable) return type;
@@ -396,24 +366,21 @@
return type == nullType;
}
- TypeInformation allocateList(TypeInformation type,
- ast.Node node,
- Element enclosing,
- [TypeInformation elementType, int length]) {
- bool isTypedArray =
- compiler.typedDataClass != null &&
+ TypeInformation allocateList(
+ TypeInformation type, ast.Node node, Element enclosing,
+ [TypeInformation elementType, int length]) {
+ bool isTypedArray = compiler.typedDataClass != null &&
classWorld.isInstantiated(compiler.typedDataClass) &&
type.type.satisfies(compiler.typedDataClass, classWorld);
bool isConst = (type.type == compiler.typesTask.constListType);
bool isFixed = (type.type == compiler.typesTask.fixedListType) ||
- isConst ||
- isTypedArray;
+ isConst ||
+ isTypedArray;
bool isElementInferred = isConst || isTypedArray;
int inferredLength = isFixed ? length : null;
- TypeMask elementTypeMask = isElementInferred
- ? elementType.type
- : dynamicType.type;
+ TypeMask elementTypeMask =
+ isElementInferred ? elementType.type : dynamicType.type;
ContainerTypeMask mask = new ContainerTypeMask(
type.type, node, enclosing, elementTypeMask, inferredLength);
ElementInContainerTypeInformation element =
@@ -432,11 +399,9 @@
return result;
}
- TypeInformation allocateMap(ConcreteTypeInformation type,
- ast.Node node,
- Element element,
- [List<TypeInformation> keyTypes,
- List<TypeInformation> valueTypes]) {
+ TypeInformation allocateMap(
+ ConcreteTypeInformation type, ast.Node node, Element element,
+ [List<TypeInformation> keyTypes, List<TypeInformation> valueTypes]) {
assert(keyTypes.length == valueTypes.length);
bool isFixed = (type.type == compiler.typesTask.constMapType);
@@ -449,11 +414,8 @@
} else {
keyType = valueType = dynamicType.type;
}
- MapTypeMask mask = new MapTypeMask(type.type,
- node,
- element,
- keyType,
- valueType);
+ MapTypeMask mask =
+ new MapTypeMask(type.type, node, element, keyType, valueType);
TypeInformation keyTypeInfo =
new KeyInMapTypeInformation(currentMember, null);
@@ -486,8 +448,8 @@
return info.isConcrete ? info.type : mask;
}
- TypeInformation allocateDiamondPhi(TypeInformation firstInput,
- TypeInformation secondInput) {
+ TypeInformation allocateDiamondPhi(
+ TypeInformation firstInput, TypeInformation secondInput) {
PhiElementTypeInformation result =
new PhiElementTypeInformation(currentMember, null, false, null);
result.addAssignment(firstInput);
@@ -496,10 +458,8 @@
return result;
}
- PhiElementTypeInformation _addPhi(ast.Node node,
- Local variable,
- inputType,
- bool isLoop) {
+ PhiElementTypeInformation _addPhi(
+ ast.Node node, Local variable, inputType, bool isLoop) {
PhiElementTypeInformation result =
new PhiElementTypeInformation(currentMember, node, isLoop, variable);
allocatedTypes.add(result);
@@ -507,9 +467,8 @@
return result;
}
- PhiElementTypeInformation allocatePhi(ast.Node node,
- Local variable,
- inputType) {
+ PhiElementTypeInformation allocatePhi(
+ ast.Node node, Local variable, inputType) {
// Check if [inputType] is a phi for a local updated in
// the try/catch block [node]. If it is, no need to allocate a new
// phi.
@@ -521,23 +480,20 @@
return _addPhi(node, variable, inputType, false);
}
- PhiElementTypeInformation allocateLoopPhi(ast.Node node,
- Local variable,
- inputType) {
+ PhiElementTypeInformation allocateLoopPhi(
+ ast.Node node, Local variable, inputType) {
return _addPhi(node, variable, inputType, true);
}
- TypeInformation simplifyPhi(ast.Node node,
- Local variable,
- PhiElementTypeInformation phiType) {
+ TypeInformation simplifyPhi(
+ ast.Node node, Local variable, PhiElementTypeInformation phiType) {
assert(phiType.branchNode == node);
if (phiType.assignments.length == 1) return phiType.assignments.first;
return phiType;
}
PhiElementTypeInformation addPhiInput(Local variable,
- PhiElementTypeInformation phiType,
- TypeInformation newType) {
+ PhiElementTypeInformation phiType, TypeInformation newType) {
phiType.addAssignment(newType);
return phiType;
}
@@ -628,7 +584,7 @@
int addedInGraph = 0;
TypeGraphInferrerEngine(Compiler compiler, this.mainElement)
- : super(compiler, new TypeInformationSystem(compiler));
+ : super(compiler, new TypeInformationSystem(compiler));
JavaScriptBackend get backend => compiler.backend;
Annotations get annotations => backend.annotations;
@@ -638,28 +594,26 @@
* A set of selector names that [List] implements, that we know return
* their element type.
*/
- final Set<Selector> returnsListElementTypeSet = new Set<Selector>.from(
- <Selector>[
- new Selector.getter(const PublicName('first')),
- new Selector.getter(const PublicName('last')),
- new Selector.getter(const PublicName('single')),
- new Selector.call(const PublicName('singleWhere'), CallStructure.ONE_ARG),
- new Selector.call(const PublicName('elementAt'), CallStructure.ONE_ARG),
- new Selector.index(),
- new Selector.call(const PublicName('removeAt'), CallStructure.ONE_ARG),
- new Selector.call(const PublicName('removeLast'), CallStructure.NO_ARGS)
- ]);
+ final Set<Selector> returnsListElementTypeSet =
+ new Set<Selector>.from(<Selector>[
+ new Selector.getter(const PublicName('first')),
+ new Selector.getter(const PublicName('last')),
+ new Selector.getter(const PublicName('single')),
+ new Selector.call(const PublicName('singleWhere'), CallStructure.ONE_ARG),
+ new Selector.call(const PublicName('elementAt'), CallStructure.ONE_ARG),
+ new Selector.index(),
+ new Selector.call(const PublicName('removeAt'), CallStructure.ONE_ARG),
+ new Selector.call(const PublicName('removeLast'), CallStructure.NO_ARGS)
+ ]);
bool returnsListElementType(Selector selector, TypeMask mask) {
return mask != null &&
- mask.isContainer &&
- returnsListElementTypeSet.contains(selector);
+ mask.isContainer &&
+ returnsListElementTypeSet.contains(selector);
}
bool returnsMapValueType(Selector selector, TypeMask mask) {
- return mask != null &&
- mask.isMap &&
- selector.isIndex;
+ return mask != null && mask.isMap && selector.isIndex;
}
void analyzeListAndEnqueue(ListTypeInformation info) {
@@ -745,18 +699,17 @@
// Trace closures to potentially infer argument types.
types.allocatedClosures.forEach((info) {
-
- void trace(Iterable<FunctionElement> elements,
- ClosureTracerVisitor tracer) {
+ void trace(
+ Iterable<FunctionElement> elements, ClosureTracerVisitor tracer) {
tracer.run();
if (!tracer.continueAnalyzing) {
elements.forEach((FunctionElement e) {
compiler.world.registerMightBePassedToApply(e);
if (debug.VERBOSE) print("traced closure $e as ${true} (bail)");
e.functionSignature.forEachParameter((parameter) {
- types.getInferredTypeOf(parameter).giveUp(
- this,
- clearAssignments: false);
+ types
+ .getInferredTypeOf(parameter)
+ .giveUp(this, clearAssignments: false);
});
});
bailedOutOn.addAll(elements);
@@ -772,7 +725,8 @@
});
if (tracer.tracedType.mightBePassedToFunctionApply) {
compiler.world.registerMightBePassedToApply(e);
- };
+ }
+ ;
if (debug.VERBOSE) {
print("traced closure $e as "
"${compiler.world.getMightBePassedToApply(e)}");
@@ -799,9 +753,8 @@
// We only are interested in functions here, as other targets
// of this closure call are not a root to trace but an intermediate
// for some other function.
- Iterable<FunctionElement> elements =
- new List<FunctionElement>.from(
- info.callees.where((e) => e.isFunction));
+ Iterable<FunctionElement> elements = new List<FunctionElement>.from(
+ info.callees.where((e) => e.isFunction));
trace(elements, new ClosureTracerVisitor(elements, info, this));
}
} else {
@@ -832,23 +785,23 @@
if (debug.PRINT_SUMMARY) {
types.allocatedLists.values.forEach((ListTypeInformation info) {
print('${info.type} '
- 'for ${info.originalType.allocationNode} '
- 'at ${info.originalType.allocationElement} '
- 'after ${info.refineCount}');
+ 'for ${info.originalType.allocationNode} '
+ 'at ${info.originalType.allocationElement} '
+ 'after ${info.refineCount}');
});
types.allocatedMaps.values.forEach((MapTypeInformation info) {
print('${info.type} '
- 'for ${info.originalType.allocationNode} '
- 'at ${info.originalType.allocationElement} '
- 'after ${info.refineCount}');
+ 'for ${info.originalType.allocationNode} '
+ 'at ${info.originalType.allocationElement} '
+ 'after ${info.refineCount}');
});
types.allocatedClosures.forEach((TypeInformation info) {
if (info is ElementTypeInformation) {
print('${types.getInferredSignatureOf(info.element)} for '
- '${info.element}');
+ '${info.element}');
} else if (info is ClosureTypeInformation) {
print('${types.getInferredSignatureOf(info.element)} for '
- '${info.element}');
+ '${info.element}');
} else if (info is DynamicCallSiteTypeInformation) {
for (Element target in info.targets) {
if (target is FunctionElement) {
@@ -900,8 +853,8 @@
if (type is! ListTypeInformation && type is! MapTypeInformation) {
// For non-container types, the constant handler does
// constant folding that could give more precise results.
- ConstantValue value = compiler.backend.constants
- .getConstantValueForVariable(element);
+ ConstantValue value =
+ compiler.backend.constants.getConstantValueForVariable(element);
if (value != null) {
if (value.isFunction) {
FunctionConstantValue functionConstant = value;
@@ -951,8 +904,7 @@
if (!info.inLoop) return;
if (info is StaticCallSiteTypeInformation) {
compiler.world.addFunctionCalledInLoop(info.calledElement);
- } else if (info.mask != null &&
- !info.mask.containsAll(compiler.world)) {
+ } else if (info.mask != null && !info.mask.containsAll(compiler.world)) {
// For instance methods, we only register a selector called in a
// loop if it is a typed selector, to avoid marking too many
// methods as being called from within a loop. This cuts down
@@ -1005,12 +957,9 @@
* wheter assignments must be added or removed. If [init] is false,
* parameters are added to the work queue.
*/
- void updateParameterAssignments(TypeInformation caller,
- Element callee,
- ArgumentsTypes arguments,
- Selector selector,
- TypeMask mask,
- {bool remove, bool addToQueue: true}) {
+ void updateParameterAssignments(TypeInformation caller, Element callee,
+ ArgumentsTypes arguments, Selector selector, TypeMask mask,
+ {bool remove, bool addToQueue: true}) {
if (callee.name == Identifiers.noSuchMethod_) return;
if (callee.isField) {
if (selector.isSetter) {
@@ -1060,10 +1009,10 @@
TypeInformation type = visitingRequiredParameter
? arguments.positional[parameterIndex]
: signature.optionalParametersAreNamed
- ? arguments.named[parameter.name]
- : parameterIndex < arguments.positional.length
- ? arguments.positional[parameterIndex]
- : null;
+ ? arguments.named[parameter.name]
+ : parameterIndex < arguments.positional.length
+ ? arguments.positional[parameterIndex]
+ : null;
if (type == null) type = getDefaultTypeOfParameter(parameter);
TypeInformation info = types.getInferredTypeOf(parameter);
if (remove) {
@@ -1083,8 +1032,8 @@
* a [PlaceholderTypeInformation], which will be replaced. All its uses are
* updated.
*/
- void setDefaultTypeOfParameter(ParameterElement parameter,
- TypeInformation type) {
+ void setDefaultTypeOfParameter(
+ ParameterElement parameter, TypeInformation type) {
assert(parameter.functionDeclaration.isImplementation);
TypeInformation existing = defaultTypeOfParameter[parameter];
defaultTypeOfParameter[parameter] = type;
@@ -1141,20 +1090,17 @@
}
TypeInformation returnTypeOfElement(Element element) {
- if (element is !FunctionElement) return types.dynamicType;
+ if (element is! FunctionElement) return types.dynamicType;
return types.getInferredTypeOf(element);
}
- void recordTypeOfFinalField(Spannable node,
- Element analyzed,
- Element element,
- TypeInformation type) {
+ void recordTypeOfFinalField(
+ Spannable node, Element analyzed, Element element, TypeInformation type) {
types.getInferredTypeOf(element).addAssignment(type);
}
- void recordTypeOfNonFinalField(Spannable node,
- Element element,
- TypeInformation type) {
+ void recordTypeOfNonFinalField(
+ Spannable node, Element element, TypeInformation type) {
types.getInferredTypeOf(element).addAssignment(type);
}
@@ -1174,9 +1120,8 @@
if (info.assignments.isEmpty) info.addAssignment(type);
}
- TypeInformation addReturnTypeFor(Element element,
- TypeInformation unused,
- TypeInformation newType) {
+ TypeInformation addReturnTypeFor(
+ Element element, TypeInformation unused, TypeInformation newType) {
TypeInformation type = types.getInferredTypeOf(element);
// TODO(ngeoffray): Clean up. We do this check because
// [SimpleTypesInferrer] deals with two different inferrers.
@@ -1185,17 +1130,24 @@
return type;
}
- TypeInformation registerCalledElement(Spannable node,
- Selector selector,
- TypeMask mask,
- Element caller,
- Element callee,
- ArgumentsTypes arguments,
- SideEffects sideEffects,
- bool inLoop) {
+ TypeInformation registerCalledElement(
+ Spannable node,
+ Selector selector,
+ TypeMask mask,
+ Element caller,
+ Element callee,
+ ArgumentsTypes arguments,
+ SideEffects sideEffects,
+ bool inLoop) {
CallSiteTypeInformation info = new StaticCallSiteTypeInformation(
- types.currentMember, node, caller, callee, selector, mask, arguments,
- inLoop);
+ types.currentMember,
+ node,
+ caller,
+ callee,
+ selector,
+ mask,
+ arguments,
+ inLoop);
// If this class has a 'call' method then we have essentially created a
// closure here. Register it as such so that it is traced.
if (selector != null && selector.isCall && callee.isConstructor) {
@@ -1210,18 +1162,18 @@
return info;
}
- TypeInformation registerCalledSelector(ast.Node node,
- Selector selector,
- TypeMask mask,
- TypeInformation receiverType,
- Element caller,
- ArgumentsTypes arguments,
- SideEffects sideEffects,
- bool inLoop) {
+ TypeInformation registerCalledSelector(
+ ast.Node node,
+ Selector selector,
+ TypeMask mask,
+ TypeInformation receiverType,
+ Element caller,
+ ArgumentsTypes arguments,
+ SideEffects sideEffects,
+ bool inLoop) {
if (selector.isClosureCall) {
- return registerCalledClosure(
- node, selector, mask, receiverType,
- caller, arguments, sideEffects, inLoop);
+ return registerCalledClosure(node, selector, mask, receiverType, caller,
+ arguments, sideEffects, inLoop);
}
compiler.world.allFunctions.filter(selector, mask).forEach((callee) {
@@ -1229,8 +1181,14 @@
});
CallSiteTypeInformation info = new DynamicCallSiteTypeInformation(
- types.currentMember, node, caller, selector, mask,
- receiverType, arguments, inLoop);
+ types.currentMember,
+ node,
+ caller,
+ selector,
+ mask,
+ receiverType,
+ arguments,
+ inLoop);
info.addToGraph(this);
allocatedCalls.add(info);
@@ -1238,26 +1196,33 @@
}
TypeInformation registerAwait(ast.Node node, TypeInformation argument) {
- AwaitTypeInformation info = new AwaitTypeInformation(types.currentMember,
- node);
+ AwaitTypeInformation info =
+ new AwaitTypeInformation(types.currentMember, node);
info.addAssignment(argument);
types.allocatedTypes.add(info);
return info;
}
- TypeInformation registerCalledClosure(ast.Node node,
- Selector selector,
- TypeMask mask,
- TypeInformation closure,
- Element caller,
- ArgumentsTypes arguments,
- SideEffects sideEffects,
- bool inLoop) {
+ TypeInformation registerCalledClosure(
+ ast.Node node,
+ Selector selector,
+ TypeMask mask,
+ TypeInformation closure,
+ Element caller,
+ ArgumentsTypes arguments,
+ SideEffects sideEffects,
+ bool inLoop) {
sideEffects.setDependsOnSomething();
sideEffects.setAllSideEffects();
CallSiteTypeInformation info = new ClosureCallSiteTypeInformation(
- types.currentMember, node, caller, selector, mask, closure, arguments,
- inLoop);
+ types.currentMember,
+ node,
+ caller,
+ selector,
+ mask,
+ closure,
+ arguments,
+ inLoop);
info.addToGraph(this);
allocatedCalls.add(info);
return info;
@@ -1269,28 +1234,30 @@
Iterable<Element> sortResolvedElements() {
int max = 0;
Map<int, Setlet<Element>> methodSizes = new Map<int, Setlet<Element>>();
- compiler.enqueuer.resolution.processedElements.forEach((AstElement element) {
- // TODO(ngeoffray): Not sure why the resolver would put a null
- // mapping.
- if (!compiler.enqueuer.resolution.hasBeenProcessed(element)) return;
- TreeElementMapping mapping = element.resolvedAst.elements;
- element = element.implementation;
- if (element.impliesType) return;
- assert(invariant(element,
- element.isField ||
- element.isFunction ||
- element.isConstructor ||
- element.isGetter ||
- element.isSetter,
- message: 'Unexpected element kind: ${element.kind}'));
- if (element.isAbstract) return;
- // Put the other operators in buckets by length, later to be added in
- // length order.
- int length = mapping.getSelectorCount();
- max = length > max ? length : max;
- Setlet<Element> set = methodSizes.putIfAbsent(
- length, () => new Setlet<Element>());
- set.add(element);
+ compiler.enqueuer.resolution.processedElements
+ .forEach((AstElement element) {
+ // TODO(ngeoffray): Not sure why the resolver would put a null
+ // mapping.
+ if (!compiler.enqueuer.resolution.hasBeenProcessed(element)) return;
+ TreeElementMapping mapping = element.resolvedAst.elements;
+ element = element.implementation;
+ if (element.impliesType) return;
+ assert(invariant(
+ element,
+ element.isField ||
+ element.isFunction ||
+ element.isConstructor ||
+ element.isGetter ||
+ element.isSetter,
+ message: 'Unexpected element kind: ${element.kind}'));
+ if (element.isAbstract) return;
+ // Put the other operators in buckets by length, later to be added in
+ // length order.
+ int length = mapping.getSelectorCount();
+ max = length > max ? length : max;
+ Setlet<Element> set =
+ methodSizes.putIfAbsent(length, () => new Setlet<Element>());
+ set.add(element);
});
List<Element> result = <Element>[];
@@ -1338,8 +1305,8 @@
/**
* Returns the type of [element] when being called with [selector].
*/
- TypeInformation typeOfElementWithSelector(Element element,
- Selector selector) {
+ TypeInformation typeOfElementWithSelector(
+ Element element, Selector selector) {
if (element.name == Identifiers.noSuchMethod_ &&
selector.name != element.name) {
// An invocation can resolve to a [noSuchMethod], in which case
@@ -1426,8 +1393,7 @@
if (inferrer.returnsMapValueType(selector, mask)) {
MapTypeMask mapTypeMask = mask;
TypeMask valueType = mapTypeMask.valueType;
- return valueType == null ? compiler.typesTask.dynamicType
- : valueType;
+ return valueType == null ? compiler.typesTask.dynamicType : valueType;
}
TypeMask result = const TypeMask.nonNullEmpty();
diff --git a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
index 0ed437c..1815539 100644
--- a/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
+++ b/pkg/compiler/lib/src/inferrer/type_graph_nodes.dart
@@ -11,34 +11,26 @@
import '../compiler.dart' show Compiler;
import '../constants/values.dart';
import '../cps_ir/cps_ir_nodes.dart' as cps_ir show Node;
-import '../dart_types.dart' show
- DartType,
- FunctionType,
- InterfaceType,
- TypeKind;
+import '../dart_types.dart'
+ show DartType, FunctionType, InterfaceType, TypeKind;
import '../elements/elements.dart';
import '../native/native.dart' as native;
-import '../tree/tree.dart' as ast show
- DartString,
- Node,
- LiteralBool,
- Send,
- SendSet,
- TryStatement;
-import '../types/types.dart' show
- ContainerTypeMask,
- DictionaryTypeMask,
- MapTypeMask,
- TypeMask,
- ValueTypeMask;
+import '../tree/tree.dart' as ast
+ show DartString, Node, LiteralBool, Send, SendSet, TryStatement;
+import '../types/types.dart'
+ show
+ ContainerTypeMask,
+ DictionaryTypeMask,
+ MapTypeMask,
+ TypeMask,
+ ValueTypeMask;
import '../universe/selector.dart' show Selector;
import '../util/util.dart' show ImmutableEmptySet, Setlet;
import '../world.dart' show ClassWorld;
import 'inferrer_visitor.dart' show ArgumentsTypes;
-import 'type_graph_inferrer.dart' show
- TypeGraphInferrerEngine,
- TypeInformationSystem;
+import 'type_graph_inferrer.dart'
+ show TypeGraphInferrerEngine, TypeInformationSystem;
import 'debug.dart' as debug;
/**
@@ -105,8 +97,9 @@
bool get isConcrete => false;
- TypeInformation(this.context) : _assignments = <TypeInformation>[],
- users = new Setlet<TypeInformation>();
+ TypeInformation(this.context)
+ : _assignments = <TypeInformation>[],
+ users = new Setlet<TypeInformation>();
TypeInformation.noAssignments(this.context)
: _assignments = const <TypeInformation>[],
@@ -220,7 +213,9 @@
}
void removeAndClearReferences(TypeGraphInferrerEngine inferrer) {
- assignments.forEach((info) { info.removeUser(this); });
+ assignments.forEach((info) {
+ info.removeUser(this);
+ });
}
void stabilize(TypeGraphInferrerEngine inferrer) {
@@ -279,8 +274,7 @@
* called.
*/
class ParameterAssignments extends IterableBase<TypeInformation> {
- final Map<TypeInformation, int> assignments =
- new Map<TypeInformation, int>();
+ final Map<TypeInformation, int> assignments = new Map<TypeInformation, int>();
void remove(TypeInformation info) {
int existing = assignments[info];
@@ -365,8 +359,8 @@
ElementTypeInformation._internal(MemberTypeInformation context, this.element)
: super(context);
- ElementTypeInformation._withAssignments(MemberTypeInformation context,
- this.element, assignments)
+ ElementTypeInformation._withAssignments(
+ MemberTypeInformation context, this.element, assignments)
: super.withAssignments(context, assignments);
}
@@ -467,7 +461,7 @@
TypeMask handleSpecialCases(TypeGraphInferrerEngine inferrer) {
if (element.isField &&
(!inferrer.backend.canBeUsedForGlobalOptimizations(element) ||
- inferrer.annotations.assumeDynamic(element))) {
+ inferrer.annotations.assumeDynamic(element))) {
// Do not infer types for fields that have a corresponding annotation or
// are assigned by synthesized calls
@@ -480,20 +474,24 @@
// goes in the work queue.
giveUp(inferrer);
if (element.isField) {
- return inferrer.typeOfNativeBehavior(
- native.NativeBehavior.ofFieldLoad(element, inferrer.compiler)).type;
+ return inferrer
+ .typeOfNativeBehavior(
+ native.NativeBehavior.ofFieldLoad(element, inferrer.compiler))
+ .type;
} else {
assert(element.isFunction ||
- element.isGetter ||
- element.isSetter ||
- element.isConstructor);
+ element.isGetter ||
+ element.isSetter ||
+ element.isConstructor);
TypedElement typedElement = element;
var elementType = typedElement.type;
if (elementType.kind != TypeKind.FUNCTION) {
return safeType(inferrer);
} else {
- return inferrer.typeOfNativeBehavior(
- native.NativeBehavior.ofMethod(element, inferrer.compiler)).type;
+ return inferrer
+ .typeOfNativeBehavior(
+ native.NativeBehavior.ofMethod(element, inferrer.compiler))
+ .type;
}
}
}
@@ -512,24 +510,22 @@
return null;
}
- TypeMask potentiallyNarrowType(TypeMask mask,
- TypeGraphInferrerEngine inferrer) {
+ TypeMask potentiallyNarrowType(
+ TypeMask mask, TypeGraphInferrerEngine inferrer) {
Compiler compiler = inferrer.compiler;
if (!compiler.options.trustTypeAnnotations &&
!compiler.options.enableTypeAssertions &&
!inferrer.annotations.trustTypeAnnotations(element)) {
return mask;
}
- if (element.isGenerativeConstructor ||
- element.isSetter) {
+ if (element.isGenerativeConstructor || element.isSetter) {
return mask;
}
if (element.isField) {
return _narrowType(compiler, mask, element.type);
}
- assert(element.isFunction ||
- element.isGetter ||
- element.isFactoryConstructor);
+ assert(
+ element.isFunction || element.isGetter || element.isFactoryConstructor);
FunctionType type = element.type;
return _narrowType(compiler, mask, type.returnType);
@@ -586,19 +582,19 @@
ParameterElement get element => super.element;
FunctionElement get declaration => element.functionDeclaration;
- ParameterTypeInformation._internal(ParameterElement element,
- TypeInformationSystem types)
- : super._internal(types.getInferredTypeOf(element.functionDeclaration),
- element) {
+ ParameterTypeInformation._internal(
+ ParameterElement element, TypeInformationSystem types)
+ : super._internal(
+ types.getInferredTypeOf(element.functionDeclaration), element) {
assert(!element.functionDeclaration.isInstanceMember);
}
- ParameterTypeInformation._instanceMember(ParameterElement element,
- TypeInformationSystem types)
+ ParameterTypeInformation._instanceMember(
+ ParameterElement element, TypeInformationSystem types)
: super._withAssignments(
- types.getInferredTypeOf(element.functionDeclaration),
- element,
- new ParameterAssignments()) {
+ types.getInferredTypeOf(element.functionDeclaration),
+ element,
+ new ParameterAssignments()) {
assert(element.functionDeclaration.isInstanceMember);
}
@@ -637,8 +633,8 @@
}
if (declaration.isInstanceMember &&
(declaration.name == Identifiers.noSuchMethod_ ||
- (declaration.name == Identifiers.call &&
- disableInferenceForClosures))) {
+ (declaration.name == Identifiers.call &&
+ disableInferenceForClosures))) {
// Do not infer types for parameters of [noSuchMethod] and
// [call] instance methods.
giveUp(inferrer);
@@ -661,8 +657,8 @@
return null;
}
- TypeMask potentiallyNarrowType(TypeMask mask,
- TypeGraphInferrerEngine inferrer) {
+ TypeMask potentiallyNarrowType(
+ TypeMask mask, TypeGraphInferrerEngine inferrer) {
Compiler compiler = inferrer.compiler;
if (!compiler.options.trustTypeAnnotations &&
!inferrer.annotations.trustTypeAnnotations(declaration)) {
@@ -678,8 +674,8 @@
TypeMask computeType(TypeGraphInferrerEngine inferrer) {
TypeMask special = handleSpecialCases(inferrer);
if (special != null) return special;
- return potentiallyNarrowType(inferrer.types.computeTypeMask(assignments),
- inferrer);
+ return potentiallyNarrowType(
+ inferrer.types.computeTypeMask(assignments), inferrer);
}
TypeMask safeType(TypeGraphInferrerEngine inferrer) {
@@ -721,14 +717,9 @@
final ArgumentsTypes arguments;
final bool inLoop;
- CallSiteTypeInformation(
- MemberTypeInformation context,
- this.call,
- this.caller,
- this.selector,
- this.mask,
- this.arguments,
- this.inLoop) : super.noAssignments(context);
+ CallSiteTypeInformation(MemberTypeInformation context, this.call, this.caller,
+ this.selector, this.mask, this.arguments, this.inLoop)
+ : super.noAssignments(context);
String toString() => 'Call site $call $type';
@@ -762,8 +753,8 @@
arguments.forEach((info) => info.addUser(this));
}
inferrer.updateParameterAssignments(
- this, calledElement, arguments, selector, mask, remove: false,
- addToQueue: false);
+ this, calledElement, arguments, selector, mask,
+ remove: false, addToQueue: false);
}
bool get isSynthesized {
@@ -808,6 +799,7 @@
class DynamicCallSiteTypeInformation extends CallSiteTypeInformation {
final TypeInformation receiver;
+
/// Cached targets of this call.
Iterable<Element> targets;
@@ -835,8 +827,8 @@
callee.addCall(caller, call);
callee.addUser(this);
inferrer.updateParameterAssignments(
- this, element, arguments, selector, typeMask, remove: false,
- addToQueue: false);
+ this, element, arguments, selector, typeMask,
+ remove: false, addToQueue: false);
}
}
@@ -847,7 +839,8 @@
if (mask != receiverType) {
return receiverType == inferrer.compiler.typesTask.dynamicType
- ? null : receiverType;
+ ? null
+ : receiverType;
} else {
return mask;
}
@@ -856,9 +849,9 @@
bool targetsIncludeComplexNoSuchMethod(TypeGraphInferrerEngine inferrer) {
return targets.any((Element e) {
return e is FunctionElement &&
- e.isInstanceMember &&
- e.name == Identifiers.noSuchMethod_ &&
- inferrer.backend.isComplexNoSuchMethod(e);
+ e.isInstanceMember &&
+ e.name == Identifiers.noSuchMethod_ &&
+ inferrer.backend.isComplexNoSuchMethod(e);
});
}
@@ -868,9 +861,8 @@
* example, we know int + int returns an int. The Dart code for
* [int.operator+] only says it returns a [num].
*/
- TypeInformation handleIntrisifiedSelector(Selector selector,
- TypeMask mask,
- TypeGraphInferrerEngine inferrer) {
+ TypeInformation handleIntrisifiedSelector(
+ Selector selector, TypeMask mask, TypeGraphInferrerEngine inferrer) {
ClassWorld classWorld = inferrer.classWorld;
if (!classWorld.backend.intImplementation.isResolved) return null;
if (mask == null) return null;
@@ -888,8 +880,8 @@
return info.type.satisfies(uint31Implementation, classWorld);
}
bool isPositiveInt(info) {
- return info.type.satisfies(
- classWorld.backend.positiveIntImplementation, classWorld);
+ return info.type
+ .satisfies(classWorld.backend.positiveIntImplementation, classWorld);
}
String name = selector.name;
@@ -897,12 +889,16 @@
// Dart code, for example:
// int + int -> int
// uint31 | uint31 -> uint31
- if (name == '*' || name == '+' || name == '%' || name == 'remainder' ||
+ if (name == '*' ||
+ name == '+' ||
+ name == '%' ||
+ name == 'remainder' ||
name == '~/') {
if (isPositiveInt(receiver) &&
arguments.hasOnePositionalArgumentThatMatches(isPositiveInt)) {
// uint31 + uint31 -> uint32
- if (name == '+' && isUInt31(receiver) &&
+ if (name == '+' &&
+ isUInt31(receiver) &&
arguments.hasOnePositionalArgumentThatMatches(isUInt31)) {
return inferrer.types.uint32Type;
} else {
@@ -954,8 +950,7 @@
Compiler compiler = inferrer.compiler;
TypeMask maskToUse =
compiler.world.extendMaskIfReachesAll(selector, typeMask);
- bool canReachAll = compiler.enabledInvokeOn &&
- (maskToUse != typeMask);
+ bool canReachAll = compiler.enabledInvokeOn && (maskToUse != typeMask);
// If this call could potentially reach all methods that satisfy
// the untyped selector (through noSuchMethod's `Invocation`
@@ -972,27 +967,27 @@
targets
.where((target) => !oldTargets.contains(target))
.forEach((element) {
- MemberTypeInformation callee =
- inferrer.types.getInferredTypeOf(element);
- callee.addCall(caller, call);
- callee.addUser(this);
- inferrer.updateParameterAssignments(
- this, element, arguments, selector, typeMask, remove: false,
- addToQueue: true);
- });
+ MemberTypeInformation callee =
+ inferrer.types.getInferredTypeOf(element);
+ callee.addCall(caller, call);
+ callee.addUser(this);
+ inferrer.updateParameterAssignments(
+ this, element, arguments, selector, typeMask,
+ remove: false, addToQueue: true);
+ });
// Walk over the old targets, and remove calls that cannot happen anymore.
oldTargets
.where((target) => !targets.contains(target))
.forEach((element) {
- MemberTypeInformation callee =
- inferrer.types.getInferredTypeOf(element);
- callee.removeCall(caller, call);
- callee.removeUser(this);
- inferrer.updateParameterAssignments(
- this, element, arguments, selector, typeMask, remove: true,
- addToQueue: true);
- });
+ MemberTypeInformation callee =
+ inferrer.types.getInferredTypeOf(element);
+ callee.removeCall(caller, call);
+ callee.removeUser(this);
+ inferrer.updateParameterAssignments(
+ this, element, arguments, selector, typeMask,
+ remove: true, addToQueue: true);
+ });
}
// Walk over the found targets, and compute the joined union type mask
@@ -1020,7 +1015,7 @@
if (dictionaryTypeMask.typeMap.containsKey(key)) {
if (debug.VERBOSE) {
print("Dictionary lookup for $key yields "
- "${dictionaryTypeMask.typeMap[key]}.");
+ "${dictionaryTypeMask.typeMap[key]}.");
}
return dictionaryTypeMask.typeMap[key];
} else {
@@ -1034,8 +1029,7 @@
}
MapTypeMask mapTypeMask = typeMask;
if (debug.VERBOSE) {
- print(
- "Map lookup for $selector yields ${mapTypeMask.valueType}.");
+ print("Map lookup for $selector yields ${mapTypeMask.valueType}.");
}
return mapTypeMask.valueType;
} else {
@@ -1067,8 +1061,8 @@
inferrer.types.getInferredTypeOf(element);
callee.addCall(caller, call);
inferrer.updateParameterAssignments(
- this, element, arguments, selector, mask, remove: false,
- addToQueue: true);
+ this, element, arguments, selector, mask,
+ remove: false, addToQueue: true);
}
}
}
@@ -1171,8 +1165,7 @@
// needs to notify its users.
}
- void removeUser(TypeInformation user) {
- }
+ void removeUser(TypeInformation user) {}
void addAssignment(TypeInformation assignment) {
throw "Not supported";
@@ -1261,8 +1254,8 @@
TypeMask computeType(TypeGraphInferrerEngine inferrer) {
TypeMask input = assignments.first.type;
- TypeMask intersection = input.intersection(typeAnnotation,
- inferrer.classWorld);
+ TypeMask intersection =
+ input.intersection(typeAnnotation, inferrer.classWorld);
if (debug.ANOMALY_WARN) {
if (!input.containsMask(intersection, inferrer.classWorld) ||
!typeAnnotation.containsMask(intersection, inferrer.classWorld)) {
@@ -1292,8 +1285,8 @@
/** Whether the element type in that container has been inferred. */
bool inferred = false;
- InferredTypeInformation(MemberTypeInformation context,
- TypeInformation parentType)
+ InferredTypeInformation(
+ MemberTypeInformation context, TypeInformation parentType)
: super(context) {
if (parentType != null) addAssignment(parentType);
}
@@ -1312,8 +1305,7 @@
* A [ListTypeInformation] is a [TypeInformation] created
* for each `List` instantiations.
*/
-class ListTypeInformation extends TypeInformation
- with TracedTypeInformation {
+class ListTypeInformation extends TypeInformation with TracedTypeInformation {
final ElementInContainerTypeInformation elementType;
/** The container type before it is inferred. */
@@ -1331,10 +1323,8 @@
*/
bool checksGrowable = true;
- ListTypeInformation(MemberTypeInformation context,
- this.originalType,
- this.elementType,
- this.originalLength)
+ ListTypeInformation(MemberTypeInformation context, this.originalType,
+ this.elementType, this.originalLength)
: super(context) {
type = originalType;
inferredLength = originalType.length;
@@ -1356,11 +1346,12 @@
if (!mask.isContainer ||
mask.elementType != elementType.type ||
mask.length != inferredLength) {
- return new ContainerTypeMask(originalType.forwardTo,
- originalType.allocationNode,
- originalType.allocationElement,
- elementType.type,
- inferredLength);
+ return new ContainerTypeMask(
+ originalType.forwardTo,
+ originalType.allocationNode,
+ originalType.allocationElement,
+ elementType.type,
+ inferredLength);
}
return mask;
}
@@ -1379,8 +1370,7 @@
* elements in a [ListTypeInformation].
*/
class ElementInContainerTypeInformation extends InferredTypeInformation {
- ElementInContainerTypeInformation(MemberTypeInformation context,
- elementType)
+ ElementInContainerTypeInformation(MemberTypeInformation context, elementType)
: super(context, elementType);
String toString() => 'Element in container $type';
@@ -1394,8 +1384,7 @@
* A [MapTypeInformation] is a [TypeInformation] created
* for maps.
*/
-class MapTypeInformation extends TypeInformation
- with TracedTypeInformation {
+class MapTypeInformation extends TypeInformation with TracedTypeInformation {
// When in Dictionary mode, this map tracks the type of the values that
// have been assigned to a specific [String] key.
final Map<String, ValueInMapTypeInformation> typeInfoMap = {};
@@ -1409,25 +1398,22 @@
bool get inDictionaryMode => !bailedOut && _allKeysAreStrings;
- MapTypeInformation(MemberTypeInformation context,
- this.originalType,
- this.keyType,
- this.valueType)
+ MapTypeInformation(MemberTypeInformation context, this.originalType,
+ this.keyType, this.valueType)
: super(context) {
keyType.addUser(this);
valueType.addUser(this);
type = originalType;
}
- TypeInformation addEntryAssignment(TypeInformation key,
- TypeInformation value,
- [bool nonNull = false]) {
+ TypeInformation addEntryAssignment(TypeInformation key, TypeInformation value,
+ [bool nonNull = false]) {
TypeInformation newInfo = null;
if (_allKeysAreStrings && key is StringLiteralTypeInformation) {
String keyString = key.asString();
typeInfoMap.putIfAbsent(keyString, () {
- newInfo = new ValueInMapTypeInformation(context, null, nonNull);
- return newInfo;
+ newInfo = new ValueInMapTypeInformation(context, null, nonNull);
+ return newInfo;
});
typeInfoMap[keyString].addAssignment(value);
} else {
@@ -1482,18 +1468,20 @@
for (var key in typeInfoMap.keys) {
mappings[key] = typeInfoMap[key].type;
}
- return new DictionaryTypeMask(originalType.forwardTo,
- originalType.allocationNode,
- originalType.allocationElement,
- keyType.type,
- valueType.type,
- mappings);
+ return new DictionaryTypeMask(
+ originalType.forwardTo,
+ originalType.allocationNode,
+ originalType.allocationElement,
+ keyType.type,
+ valueType.type,
+ mappings);
} else {
- return new MapTypeMask(originalType.forwardTo,
- originalType.allocationNode,
- originalType.allocationElement,
- keyType.type,
- valueType.type);
+ return new MapTypeMask(
+ originalType.forwardTo,
+ originalType.allocationNode,
+ originalType.allocationElement,
+ keyType.type,
+ valueType.type);
}
}
@@ -1516,8 +1504,7 @@
}
} else if (type.isMap) {
MapTypeMask mask = type;
- if (mask.keyType != keyType.type ||
- mask.valueType != valueType.type) {
+ if (mask.keyType != keyType.type || mask.valueType != valueType.type) {
return toTypeMask(inferrer);
}
} else {
@@ -1531,8 +1518,8 @@
bool hasStableType(TypeGraphInferrerEngine inferrer) {
return keyType.isStable &&
- valueType.isStable &&
- super.hasStableType(inferrer);
+ valueType.isStable &&
+ super.hasStableType(inferrer);
}
void cleanup() {
@@ -1555,8 +1542,8 @@
* for the keys in a [MapTypeInformation]
*/
class KeyInMapTypeInformation extends InferredTypeInformation {
- KeyInMapTypeInformation(MemberTypeInformation context,
- TypeInformation keyType)
+ KeyInMapTypeInformation(
+ MemberTypeInformation context, TypeInformation keyType)
: super(context, keyType);
accept(TypeInformationVisitor visitor) {
@@ -1576,8 +1563,9 @@
// mode can ever be marked as [nonNull].
final bool nonNull;
- ValueInMapTypeInformation(MemberTypeInformation context,
- TypeInformation valueType, [this.nonNull = false])
+ ValueInMapTypeInformation(
+ MemberTypeInformation context, TypeInformation valueType,
+ [this.nonNull = false])
: super(context, valueType);
accept(TypeInformationVisitor visitor) {
@@ -1585,8 +1573,9 @@
}
TypeMask computeType(TypeGraphInferrerEngine inferrer) {
- return nonNull ? super.computeType(inferrer)
- : super.computeType(inferrer).nullable();
+ return nonNull
+ ? super.computeType(inferrer)
+ : super.computeType(inferrer).nullable();
}
String toString() => 'Value in Map $type';
@@ -1602,7 +1591,7 @@
final Local variable;
PhiElementTypeInformation(MemberTypeInformation context, this.branchNode,
- this.isLoopPhi, this.variable)
+ this.isLoopPhi, this.variable)
: super(context);
TypeMask computeType(TypeGraphInferrerEngine inferrer) {
@@ -1621,8 +1610,7 @@
final ast.Node node;
final Element element;
- ClosureTypeInformation(MemberTypeInformation context, this.node,
- this.element)
+ ClosureTypeInformation(MemberTypeInformation context, this.node, this.element)
: super(context);
TypeMask computeType(TypeGraphInferrerEngine inferrer) => safeType(inferrer);
@@ -1648,6 +1636,7 @@
abstract class TracedTypeInformation implements TypeInformation {
/// Set to false once analysis has succeeded.
bool bailedOut = true;
+
/// Set to true once analysis is completed.
bool analyzed = false;
@@ -1658,8 +1647,9 @@
* flow in.
*/
Set<TypeInformation> get flowsInto {
- return (_flowsInto == null) ? const ImmutableEmptySet<TypeInformation>()
- : _flowsInto;
+ return (_flowsInto == null)
+ ? const ImmutableEmptySet<TypeInformation>()
+ : _flowsInto;
}
/**
diff --git a/pkg/compiler/lib/src/info/naive_analysis_result.dart b/pkg/compiler/lib/src/info/naive_analysis_result.dart
index 0061be4..d18dc91 100644
--- a/pkg/compiler/lib/src/info/naive_analysis_result.dart
+++ b/pkg/compiler/lib/src/info/naive_analysis_result.dart
@@ -17,9 +17,9 @@
NaiveAnalysisResult();
ReceiverInfo infoForReceiver(Node receiver) =>
- new NaiveReceiverInfo(receiver);
+ new NaiveReceiverInfo(receiver);
SelectorInfo infoForSelector(Node receiver, Selector selector) =>
- new NaiveSelectorInfo(receiver, selector);
+ new NaiveSelectorInfo(receiver, selector);
}
class NaiveReceiverInfo implements ReceiverInfo {
diff --git a/pkg/compiler/lib/src/info/send_info.dart b/pkg/compiler/lib/src/info/send_info.dart
index 0985360..b0f5f1e 100644
--- a/pkg/compiler/lib/src/info/send_info.dart
+++ b/pkg/compiler/lib/src/info/send_info.dart
@@ -6,28 +6,22 @@
library compiler.src.info.send_info;
import 'package:dart2js_info/src/measurements.dart';
-import 'package:dart2js_info/src/util.dart' show
- recursiveDiagnosticString;
+import 'package:dart2js_info/src/util.dart' show recursiveDiagnosticString;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../dart_types.dart';
import '../closure.dart';
import '../elements/elements.dart';
-import '../elements/visitor.dart' show
- ElementVisitor;
+import '../elements/visitor.dart' show ElementVisitor;
import '../resolution/operators.dart';
import '../resolution/semantic_visitor.dart';
import '../resolution/tree_elements.dart';
import '../constants/expressions.dart';
-import '../parser/partial_elements.dart' show
- PartialElement;
+import '../parser/partial_elements.dart' show PartialElement;
import '../tree/tree.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
import 'analysis_result.dart';
import 'naive_analysis_result.dart';
@@ -35,8 +29,7 @@
/// Collects a set of [Measurements] about send expressions in the function [f].
// TODO(sigmund): collect information on initializers too.
-Measurements collectSendMeasurements(FunctionElement f,
- Compiler compiler) {
+Measurements collectSendMeasurements(FunctionElement f, Compiler compiler) {
DiagnosticReporter reporter = compiler.reporter;
return reporter.withCurrentElement(f, () {
// TODO(sigmund): enable for platform too.
@@ -44,7 +37,7 @@
var name = _qualifiedName(f);
if (!f.hasNode) {
if (f is PartialElement) return const Measurements.unreachableFunction();
- assert (f is ConstructorElement && f.isSynthesized);
+ assert(f is ConstructorElement && f.isSynthesized);
// TODO(sigmund): measure synthethic forwarding sends, measure
// initializers
return new Measurements.reachableFunction();
@@ -60,12 +53,11 @@
}
var def = resolvedAst.elements.getFunctionDefinition(resolvedAst.node);
if (def == null) {
- assert (f is PartialElement);
+ assert(f is PartialElement);
return const Measurements.unreachableFunction();
}
- var visitor = new _StatsTraversalVisitor(
- compiler, resolvedAst.elements,
+ var visitor = new _StatsTraversalVisitor(compiler, resolvedAst.elements,
reporter.spanFromSpannable(resolvedAst.node).uri);
resolvedAst.node.accept(visitor);
return visitor.measurements;
@@ -81,7 +73,6 @@
class _StatsVisitor<T> extends Visitor
with SemanticSendResolvedMixin<dynamic, T>
implements SemanticSendVisitor<dynamic, T> {
-
// TODO(sigmund): consider passing in several AnalysisResults at once, so we
// can compute the different metrics together.
/// Information we know about the program from static analysis.
@@ -108,9 +99,9 @@
measurements.record(Metric.send, span.begin, span.end);
if (node is SendSet) {
if ((node.assignmentOperator != null &&
- node.assignmentOperator.source != '=') ||
- node.isPrefix ||
- node.isPostfix) {
+ node.assignmentOperator.source != '=') ||
+ node.isPrefix ||
+ node.isPostfix) {
assert(!node.isIfNullAssignment);
// We count get and set separately in case one of them is defined by the
// other could be a nSM error.
@@ -224,11 +215,13 @@
measurements.record(Metric.monomorphicSend, span.begin, span.end);
measurements.record(Metric.superSend, span.begin, span.end);
}
+
handleTypeVariable(Node node) {
var span = reporter.spanFromSpannable(node);
measurements.record(Metric.monomorphicSend, span.begin, span.end);
measurements.record(Metric.typeVariableSend, span.begin, span.end);
}
+
handleStatic(Node node) {
var span = reporter.spanFromSpannable(node);
measurements.record(Metric.monomorphicSend, span.begin, span.end);
@@ -288,7 +281,7 @@
Boolish usesInterceptor = selectorInfo.usesInterceptor;
if (hasSelector == Boolish.yes) {
if (selectorInfo.isAccurate && selectorInfo.possibleTargets == 1) {
- assert (usesInterceptor != Boolish.maybe);
+ assert(usesInterceptor != Boolish.maybe);
if (usesInterceptor == Boolish.yes) {
handleSingleInterceptor(node);
} else {
@@ -330,9 +323,13 @@
// Constructors
- void visitAbstractClassConstructorInvoke(NewExpression node,
- ConstructorElement element, InterfaceType type, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitAbstractClassConstructorInvoke(
+ NewExpression node,
+ ConstructorElement element,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleConstructor(node);
}
@@ -346,9 +343,13 @@
handleConstructor(node);
}
- void visitGenerativeConstructorInvoke(NewExpression node,
- ConstructorElement constructor, InterfaceType type, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitGenerativeConstructorInvoke(
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleConstructor(node);
}
@@ -357,16 +358,25 @@
handleConstructor(node);
}
- void visitRedirectingFactoryConstructorInvoke(NewExpression node,
- ConstructorElement constructor, InterfaceType type,
- ConstructorElement effectiveTarget, InterfaceType effectiveTargetType,
- NodeList arguments, CallStructure callStructure, T arg) {
+ void visitRedirectingFactoryConstructorInvoke(
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ ConstructorElement effectiveTarget,
+ InterfaceType effectiveTargetType,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleConstructor(node);
}
- void visitRedirectingGenerativeConstructorInvoke(NewExpression node,
- ConstructorElement constructor, InterfaceType type, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitRedirectingGenerativeConstructorInvoke(
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleConstructor(node);
}
@@ -377,7 +387,6 @@
// Dynamic sends
-
// TODO(sigmund): many many things to add:
// -- support for operators, indexers, etc.
// -- logic about nullables
@@ -396,16 +405,14 @@
handleIndex(node); // receiver[index] = t2
}
- void visitDynamicPropertyCompound(Send node, Node receiver,
- Name name, AssignmentOperator operator, Node rhs, T arg) {
+ void visitDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, T arg) {
handleDynamicProperty(node, receiver, new Selector.getter(name));
handleOperator(node);
handleDynamicProperty(node, receiver, new Selector.setter(name));
}
-
- void visitDynamicPropertyGet(
- Send node, Node receiver, Name name, T arg) {
+ void visitDynamicPropertyGet(Send node, Node receiver, Name name, T arg) {
handleDynamicProperty(node, receiver, new Selector.getter(name));
}
@@ -414,15 +421,15 @@
handleDynamicProperty(node, receiver, selector);
}
- void visitDynamicPropertyPostfix(Send node, Node receiver,
- Name name, IncDecOperator operator, T arg) {
+ void visitDynamicPropertyPostfix(
+ Send node, Node receiver, Name name, IncDecOperator operator, T arg) {
handleDynamicProperty(node, receiver, new Selector.getter(name));
handleOperator(node);
handleDynamicProperty(node, receiver, new Selector.setter(name));
}
- void visitDynamicPropertyPrefix(Send node, Node receiver, Name name,
- IncDecOperator operator, T arg) {
+ void visitDynamicPropertyPrefix(
+ Send node, Node receiver, Name name, IncDecOperator operator, T arg) {
handleDynamicProperty(node, receiver, new Selector.getter(name));
handleOperator(node);
handleDynamicProperty(node, receiver, new Selector.setter(name));
@@ -466,15 +473,15 @@
handleDynamicProperty(node, receiver, selector);
}
- void visitIfNotNullDynamicPropertyPostfix(Send node, Node receiver, Name name,
- IncDecOperator operator, T arg) {
+ void visitIfNotNullDynamicPropertyPostfix(
+ Send node, Node receiver, Name name, IncDecOperator operator, T arg) {
handleDynamicProperty(node, receiver, new Selector.getter(name));
handleOperator(node);
handleDynamicProperty(node, receiver, new Selector.setter(name));
}
- void visitIfNotNullDynamicPropertyPrefix(Send node, Node receiver, Name name,
- IncDecOperator operator, T arg) {
+ void visitIfNotNullDynamicPropertyPrefix(
+ Send node, Node receiver, Name name, IncDecOperator operator, T arg) {
handleDynamicProperty(node, receiver, new Selector.getter(name));
handleOperator(node);
handleDynamicProperty(node, receiver, new Selector.setter(name));
@@ -649,9 +656,8 @@
handleSuper(node);
}
- void visitSuperFieldFieldSetIfNull(
- Send node, FieldElement readField, FieldElement writtenField, Node rhs,
- T arg) {
+ void visitSuperFieldFieldSetIfNull(Send node, FieldElement readField,
+ FieldElement writtenField, Node rhs, T arg) {
handleSuper(node);
handleNSMSuper(node, readField.enclosingClass);
}
@@ -696,8 +702,8 @@
handleSuper(node);
}
- void visitSuperFieldSetterSetIfNull(Send node, FieldElement field,
- FunctionElement setter, Node rhs, T arg) {
+ void visitSuperFieldSetterSetIfNull(
+ Send node, FieldElement field, FunctionElement setter, Node rhs, T arg) {
handleSuper(node);
handleSuper(node);
}
@@ -723,8 +729,8 @@
handleSuper(node);
}
- void visitSuperGetterFieldSetIfNull(Send node, FunctionElement getter,
- FieldElement field, Node rhs, T arg) {
+ void visitSuperGetterFieldSetIfNull(
+ Send node, FunctionElement getter, FieldElement field, Node rhs, T arg) {
handleSuper(node);
handleSuper(node);
}
@@ -761,16 +767,24 @@
handleSuper(node);
}
- void visitSuperIndexPostfix(Send node, MethodElement indexFunction,
- MethodElement indexSetFunction, Node index, IncDecOperator operator,
+ void visitSuperIndexPostfix(
+ Send node,
+ MethodElement indexFunction,
+ MethodElement indexSetFunction,
+ Node index,
+ IncDecOperator operator,
T arg) {
handleSuper(node);
handleOperator(node);
handleSuper(node);
}
- void visitSuperIndexPrefix(Send node, MethodElement indexFunction,
- MethodElement indexSetFunction, Node index, IncDecOperator operator,
+ void visitSuperIndexPrefix(
+ Send node,
+ MethodElement indexFunction,
+ MethodElement indexSetFunction,
+ Node index,
+ IncDecOperator operator,
T arg) {
handleSuper(node);
handleOperator(node);
@@ -804,8 +818,8 @@
handleSuper(node);
}
- void visitThisPropertyCompound(Send node, Name name,
- AssignmentOperator operator, Node rhs, T arg) {
+ void visitThisPropertyCompound(
+ Send node, Name name, AssignmentOperator operator, Node rhs, T arg) {
handleThisProperty(node, new Selector.getter(name));
handleOperator(node);
handleThisProperty(node, new Selector.setter(name));
@@ -816,15 +830,15 @@
handleThisProperty(node, selector);
}
- void visitThisPropertyPostfix(Send node, Name name, IncDecOperator operator,
- T arg) {
+ void visitThisPropertyPostfix(
+ Send node, Name name, IncDecOperator operator, T arg) {
handleThisProperty(node, new Selector.getter(name));
handleOperator(node);
handleThisProperty(node, new Selector.setter(name));
}
- void visitThisPropertyPrefix(Send node, Name name, IncDecOperator operator,
- T arg) {
+ void visitThisPropertyPrefix(
+ Send node, Name name, IncDecOperator operator, T arg) {
handleThisProperty(node, new Selector.getter(name));
handleOperator(node);
handleThisProperty(node, new Selector.setter(name));
@@ -997,9 +1011,13 @@
// Statically known "no such method" sends
- void visitConstructorIncompatibleInvoke(NewExpression node,
- ConstructorElement constructor, InterfaceType type, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitConstructorIncompatibleInvoke(
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleNSMError(node);
}
@@ -1099,8 +1117,8 @@
handleNSMError(node);
}
- void visitFinalSuperFieldSetIfNull(Send node, FieldElement field,
- Node rhs, T arg) {
+ void visitFinalSuperFieldSetIfNull(
+ Send node, FieldElement field, Node rhs, T arg) {
handleSuper(node);
handleNSMSuper(node, field.enclosingClass);
}
@@ -1175,15 +1193,18 @@
handleStatic(node);
}
- void visitTopLevelMethodSetIfNull(Send node, FunctionElement method,
- Node rhs, T arg) {
+ void visitTopLevelMethodSetIfNull(
+ Send node, FunctionElement method, Node rhs, T arg) {
handleStatic(node);
handleNSMError(node);
}
- void visitLocalFunctionIncompatibleInvoke(Send node,
- LocalFunctionElement function, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitLocalFunctionIncompatibleInvoke(
+ Send node,
+ LocalFunctionElement function,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleNSMError(node);
}
@@ -1327,8 +1348,11 @@
handleNSMSuper(node, setter.enclosingClass);
}
- void visitTopLevelFunctionIncompatibleInvoke(Send node,
- MethodElement function, NodeList arguments, CallStructure callStructure,
+ void visitTopLevelFunctionIncompatibleInvoke(
+ Send node,
+ MethodElement function,
+ NodeList arguments,
+ CallStructure callStructure,
T arg) {
handleNSMError(node);
}
@@ -1394,8 +1418,11 @@
handleNSMError(node);
}
- void visitTypeVariableTypeLiteralCompound(Send node,
- TypeVariableElement element, AssignmentOperator operator, Node rhs,
+ void visitTypeVariableTypeLiteralCompound(
+ Send node,
+ TypeVariableElement element,
+ AssignmentOperator operator,
+ Node rhs,
T arg) {
handleTypeVariable(node);
handleNSMError(node); // operator on a method closure yields nSM
@@ -1407,9 +1434,12 @@
handleTypeVariable(node);
}
- void visitTypeVariableTypeLiteralInvoke(Send node,
- TypeVariableElement element, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitTypeVariableTypeLiteralInvoke(
+ Send node,
+ TypeVariableElement element,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleNSMError(node);
}
@@ -1480,8 +1510,12 @@
handleNSMError(node);
}
- void visitUnresolvedClassConstructorInvoke(NewExpression node,
- Element element, DartType type, NodeList arguments, Selector selector,
+ void visitUnresolvedClassConstructorInvoke(
+ NewExpression node,
+ Element element,
+ DartType type,
+ NodeList arguments,
+ Selector selector,
T arg) {
handleNSMError(node);
}
@@ -1521,9 +1555,13 @@
handleNoSend(node);
}
- void visitUnresolvedRedirectingFactoryConstructorInvoke(NewExpression node,
- ConstructorElement constructor, InterfaceType type, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitUnresolvedRedirectingFactoryConstructorInvoke(
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleNSMError(node);
}
@@ -1557,8 +1595,8 @@
handleNoSend(node);
}
- void visitUnresolvedStaticGetterSetIfNull(Send node, Element element,
- MethodElement setter, Node rhs, T arg) {
+ void visitUnresolvedStaticGetterSetIfNull(
+ Send node, Element element, MethodElement setter, Node rhs, T arg) {
handleNSMError(node);
handleNoSend(node);
}
@@ -1584,8 +1622,8 @@
handleNoSend(node);
}
- void visitUnresolvedStaticSetterSetIfNull(Send node, MethodElement getter,
- Element element, Node rhs, T arg) {
+ void visitUnresolvedStaticSetterSetIfNull(
+ Send node, MethodElement getter, Element element, Node rhs, T arg) {
handleNSMError(node);
handleNoSend(node);
}
@@ -1632,8 +1670,13 @@
handleSuper(node);
}
- void visitUnresolvedSuperGetterCompoundIndexSet(Send node, Element element,
- MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
+ void visitUnresolvedSuperGetterCompoundIndexSet(
+ Send node,
+ Element element,
+ MethodElement setter,
+ Node index,
+ AssignmentOperator operator,
+ Node rhs,
T arg) {
handleNSMSuper(node, element.enclosingClass);
handleOperator(node);
@@ -1668,8 +1711,8 @@
handleSuper(node);
}
- void visitUnresolvedSuperGetterSetIfNull(Send node, Element element,
- MethodElement setter, Node rhs, T arg) {
+ void visitUnresolvedSuperGetterSetIfNull(
+ Send node, Element element, MethodElement setter, Node rhs, T arg) {
handleNSMSuper(node, element.enclosingClass);
handleSuper(node);
}
@@ -1724,25 +1767,38 @@
handleNSMSuper(node, element.enclosingClass);
}
- void visitUnresolvedSuperSetterCompoundIndexSet(Send node,
- MethodElement getter, Element element, Node index,
- AssignmentOperator operator, Node rhs, T arg) {
+ void visitUnresolvedSuperSetterCompoundIndexSet(
+ Send node,
+ MethodElement getter,
+ Element element,
+ Node index,
+ AssignmentOperator operator,
+ Node rhs,
+ T arg) {
handleSuper(node);
handleOperator(node);
handleNSMSuper(node, element.enclosingClass);
}
- void visitUnresolvedSuperSetterIndexPostfix(Send node,
- MethodElement indexFunction, Element element, Node index,
- IncDecOperator operator, T arg) {
+ void visitUnresolvedSuperSetterIndexPostfix(
+ Send node,
+ MethodElement indexFunction,
+ Element element,
+ Node index,
+ IncDecOperator operator,
+ T arg) {
handleSuper(node);
handleOperator(node);
handleNSMSuper(node, element.enclosingClass);
}
- void visitUnresolvedSuperSetterIndexPrefix(Send node,
- MethodElement indexFunction, Element element, Node index,
- IncDecOperator operator, T arg) {
+ void visitUnresolvedSuperSetterIndexPrefix(
+ Send node,
+ MethodElement indexFunction,
+ Element element,
+ Node index,
+ IncDecOperator operator,
+ T arg) {
handleSuper(node);
handleOperator(node);
handleNSMSuper(node, element.enclosingClass);
@@ -1762,8 +1818,8 @@
handleNSMSuper(node, element.enclosingClass);
}
- void visitUnresolvedSuperSetterSetIfNull(Send node, MethodElement getter,
- Element element, Node rhs, T arg) {
+ void visitUnresolvedSuperSetterSetIfNull(
+ Send node, MethodElement getter, Element element, Node rhs, T arg) {
handleSuper(node);
handleNSMSuper(node, element.enclosingClass);
}
@@ -1794,8 +1850,8 @@
handleNoSend(node);
}
- void visitUnresolvedTopLevelGetterSetIfNull(Send node, Element element,
- MethodElement setter, Node rhs, T arg) {
+ void visitUnresolvedTopLevelGetterSetIfNull(
+ Send node, Element element, MethodElement setter, Node rhs, T arg) {
handleNSMError(node);
handleNoSend(node);
}
@@ -1821,8 +1877,8 @@
handleNoSend(node);
}
- void visitUnresolvedTopLevelSetterSetIfNull(Send node, MethodElement getter,
- Element element, Node rhs, T arg) {
+ void visitUnresolvedTopLevelSetterSetIfNull(
+ Send node, MethodElement getter, Element element, Node rhs, T arg) {
handleNSMError(node);
handleNoSend(node);
}
@@ -1838,9 +1894,13 @@
handleStatic(node);
}
- void visitFactoryConstructorInvoke(NewExpression node,
- ConstructorElement constructor, InterfaceType type, NodeList arguments,
- CallStructure callStructure, T arg) {
+ void visitFactoryConstructorInvoke(
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ T arg) {
handleStatic(node);
}
@@ -1881,31 +1941,20 @@
handleStatic(node);
}
- void visitStaticGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- T arg) {
+ void visitStaticGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, T arg) {
handleStatic(node);
handleStatic(node);
}
void visitStaticMethodSetterSetIfNull(
- Send node,
- MethodElement method,
- MethodElement setter,
- Node rhs,
- T arg) {
+ Send node, MethodElement method, MethodElement setter, Node rhs, T arg) {
handleStatic(node);
handleStatic(node);
}
void visitStaticMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- T arg) {
+ Send node, FunctionElement method, Node rhs, T arg) {
handleStatic(node);
handleNSMError(node);
}
@@ -1945,8 +1994,13 @@
// Virtual
- void visitSuperCompoundIndexSet(SendSet node, MethodElement getter,
- MethodElement setter, Node index, AssignmentOperator operator, Node rhs,
+ void visitSuperCompoundIndexSet(
+ SendSet node,
+ MethodElement getter,
+ MethodElement setter,
+ Node index,
+ AssignmentOperator operator,
+ Node rhs,
T arg) {
handleSuper(node);
handleOperator(node);
@@ -1993,27 +2047,16 @@
handleNoSend(node);
}
- void errorInvalidGet(
- Send node,
- ErroneousElement error,
- T arg) {
+ void errorInvalidGet(Send node, ErroneousElement error, T arg) {
handleNoSend(node);
}
- void errorInvalidInvoke(
- Send node,
- ErroneousElement error,
- NodeList arguments,
- Selector selector,
- T arg) {
+ void errorInvalidInvoke(Send node, ErroneousElement error, NodeList arguments,
+ Selector selector, T arg) {
handleNoSend(node);
}
- void errorInvalidSet(
- Send node,
- ErroneousElement error,
- Node rhs,
- T arg) {
+ void errorInvalidSet(Send node, ErroneousElement error, Node rhs, T arg) {
handleNoSend(node);
}
@@ -2023,120 +2066,70 @@
handleNoSend(node);
}
-
void errorInvalidPrefix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- T arg) {
+ Send node, ErroneousElement error, IncDecOperator operator, T arg) {
handleNoSend(node);
}
void errorInvalidPostfix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- T arg) {
+ Send node, ErroneousElement error, IncDecOperator operator, T arg) {
handleNoSend(node);
}
- void errorInvalidCompound(
- Send node,
- ErroneousElement error,
- AssignmentOperator operator,
- Node rhs,
- T arg) {
+ void errorInvalidCompound(Send node, ErroneousElement error,
+ AssignmentOperator operator, Node rhs, T arg) {
handleNoSend(node);
}
void errorInvalidUnary(
- Send node,
- UnaryOperator operator,
- ErroneousElement error,
- T arg) {
+ Send node, UnaryOperator operator, ErroneousElement error, T arg) {
handleNoSend(node);
}
void errorInvalidEquals(
- Send node,
- ErroneousElement error,
- Node right,
- T arg) {
+ Send node, ErroneousElement error, Node right, T arg) {
handleNoSend(node);
}
void errorInvalidNotEquals(
- Send node,
- ErroneousElement error,
- Node right,
- T arg) {
+ Send node, ErroneousElement error, Node right, T arg) {
handleNoSend(node);
}
- void errorInvalidBinary(
- Send node,
- ErroneousElement error,
- BinaryOperator operator,
- Node right,
- T arg) {
+ void errorInvalidBinary(Send node, ErroneousElement error,
+ BinaryOperator operator, Node right, T arg) {
handleNoSend(node);
}
- void errorInvalidIndex(
- Send node,
- ErroneousElement error,
- Node index,
- T arg) {
+ void errorInvalidIndex(Send node, ErroneousElement error, Node index, T arg) {
handleNoSend(node);
}
void errorInvalidIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- Node rhs,
- T arg) {
+ Send node, ErroneousElement error, Node index, Node rhs, T arg) {
handleNoSend(node);
}
- void errorInvalidCompoundIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- T arg) {
+ void errorInvalidCompoundIndexSet(Send node, ErroneousElement error,
+ Node index, AssignmentOperator operator, Node rhs, T arg) {
handleNoSend(node);
handleNoSend(node);
handleNoSend(node);
}
- void errorInvalidIndexPrefix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- T arg) {
+ void errorInvalidIndexPrefix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, T arg) {
handleNoSend(node);
handleNoSend(node);
}
- void errorInvalidIndexPostfix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- T arg) {
+ void errorInvalidIndexPostfix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, T arg) {
handleNoSend(node);
handleNoSend(node);
}
- void previsitDeferredAccess(
- Send node,
- PrefixElement prefix,
- T arg) {
- }
-
+ void previsitDeferredAccess(Send node, PrefixElement prefix, T arg) {}
void visitAs(Send node, Node expression, DartType type, T arg) {
handleNoSend(node);
@@ -2226,14 +2219,14 @@
}
@override
- errorInvalidIndexSetIfNull(SendSet node, ErroneousElement error, Node index,
- Node rhs, T arg) {
+ errorInvalidIndexSetIfNull(
+ SendSet node, ErroneousElement error, Node index, Node rhs, T arg) {
handleNoSend(node);
}
@override
- visitIndexSetIfNull(SendSet node, Node receiver, Node index, Node rhs,
- T arg) {
+ visitIndexSetIfNull(
+ SendSet node, Node receiver, Node index, Node rhs, T arg) {
handleIndex(node); // t1 = receiver[index]
handleIndex(node); // receiver[index] = t2
}
@@ -2253,8 +2246,8 @@
}
@override
- visitUnresolvedSuperIndexSetIfNull(Send node, Element element, Node index,
- Node rhs, T arg) {
+ visitUnresolvedSuperIndexSetIfNull(
+ Send node, Element element, Node index, Node rhs, T arg) {
handleNSMSuper(node, element.enclosingClass);
handleNSMSuper(node, element.enclosingClass);
}
@@ -2296,8 +2289,8 @@
if (!measurements.checkInvariant(Metric.send) ||
!measurements.checkInvariant(Metric.monomorphicSend) ||
!measurements.checkInvariant(Metric.polymorphicSend)) {
- reporter.reportErrorMessage(node,
- MessageKind.GENERIC, {'text': 'bad\n-- $msg\nlast:\n-- $last\n'});
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'bad\n-- $msg\nlast:\n-- $last\n'});
last = msg;
} else {
last = msg;
@@ -2314,12 +2307,14 @@
_StatsTraversalVisitor(
Compiler compiler, TreeElements elements, Uri sourceUri)
: reporter = compiler.reporter,
- statsVisitor = new _StatsVisitor(compiler.reporter, elements,
- // TODO(sigmund): accept a list of analyses, so we can compare them
- // together.
- true
- ? new TrustTypesAnalysisResult(elements, compiler.world)
- : new NaiveAnalysisResult(),
+ statsVisitor = new _StatsVisitor(
+ compiler.reporter,
+ elements,
+ // TODO(sigmund): accept a list of analyses, so we can compare them
+ // together.
+ true
+ ? new TrustTypesAnalysisResult(elements, compiler.world)
+ : new NaiveAnalysisResult(),
sourceUri),
super(elements);
@@ -2327,8 +2322,8 @@
try {
node.accept(statsVisitor);
} catch (e, t) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC, {'text': '$e\n$t'});
+ reporter
+ .reportErrorMessage(node, MessageKind.GENERIC, {'text': '$e\n$t'});
}
super.visitSend(node);
}
@@ -2337,8 +2332,8 @@
try {
node.accept(statsVisitor);
} catch (e, t) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC, {'text': '$e\n$t'});
+ reporter
+ .reportErrorMessage(node, MessageKind.GENERIC, {'text': '$e\n$t'});
}
super.visitNewExpression(node);
}
@@ -2347,7 +2342,6 @@
/// Helper to visit elements recursively
// TODO(sigmund): maybe generalize and move to elements/visitor.dart?
abstract class RecursiveElementVisitor<R, A> extends ElementVisitor<R, A> {
-
@override
R visitWarnOnUseElement(WarnOnUseElement e, A arg) =>
e.wrappedElement.accept(this, arg);
diff --git a/pkg/compiler/lib/src/info/trusted_types_analysis_result.dart b/pkg/compiler/lib/src/info/trusted_types_analysis_result.dart
index 8de59ae..5653f2e 100644
--- a/pkg/compiler/lib/src/info/trusted_types_analysis_result.dart
+++ b/pkg/compiler/lib/src/info/trusted_types_analysis_result.dart
@@ -21,11 +21,11 @@
TrustTypesAnalysisResult(this.elements, this.world);
- ReceiverInfo infoForReceiver(Node receiver) =>
- new TrustTypesReceiverInfo(receiver, elements.typesCache[receiver], world);
+ ReceiverInfo infoForReceiver(Node receiver) => new TrustTypesReceiverInfo(
+ receiver, elements.typesCache[receiver], world);
SelectorInfo infoForSelector(Node receiver, Selector selector) =>
- new TrustTypesSelectorInfo(
- receiver, elements.typesCache[receiver], selector, world);
+ new TrustTypesSelectorInfo(
+ receiver, elements.typesCache[receiver], selector, world);
}
class _SelectorLookupResult {
@@ -37,7 +37,8 @@
_SelectorLookupResult(this.exists, this.possibleTargets);
const _SelectorLookupResult.dontKnow()
- : exists = Boolish.maybe, possibleTargets = -1;
+ : exists = Boolish.maybe,
+ possibleTargets = -1;
}
_SelectorLookupResult _lookupSelector(
@@ -48,17 +49,19 @@
var uniqueTargets = new Set();
for (var cls in world.subtypesOf(type.element)) {
var member = cls.lookupMember(selectorName);
- if (member != null && !member.isAbstract
+ if (member != null &&
+ !member.isAbstract
// Don't match nsm in Object
- && (!isNsm || !member.enclosingClass.isObject)) {
+ &&
+ (!isNsm || !member.enclosingClass.isObject)) {
uniqueTargets.add(member);
} else {
notFound = true;
}
}
Boolish exists = uniqueTargets.length > 0
- ? (notFound ? Boolish.maybe : Boolish.yes)
- : Boolish.no;
+ ? (notFound ? Boolish.maybe : Boolish.yes)
+ : Boolish.no;
return new _SelectorLookupResult(exists, uniqueTargets.length);
}
@@ -72,12 +75,12 @@
Node receiver, InterfaceType type, ClassWorld world) {
// TODO(sigmund): refactor, maybe just store nsm as a SelectorInfo
var res = _lookupSelector('noSuchMethod', type, world);
- return new TrustTypesReceiverInfo._(receiver,
- res.exists, res.possibleTargets);
+ return new TrustTypesReceiverInfo._(
+ receiver, res.exists, res.possibleTargets);
}
- TrustTypesReceiverInfo._(this.receiver, this.hasNoSuchMethod,
- this.possibleNsmTargets);
+ TrustTypesReceiverInfo._(
+ this.receiver, this.hasNoSuchMethod, this.possibleNsmTargets);
}
class TrustTypesSelectorInfo implements SelectorInfo {
@@ -89,16 +92,13 @@
final int possibleTargets;
final bool isAccurate;
- factory TrustTypesSelectorInfo(Node receiver, InterfaceType type,
- Selector selector, ClassWorld world) {
- var res = _lookupSelector(
- selector != null ? selector.name : null, type, world);
+ factory TrustTypesSelectorInfo(
+ Node receiver, InterfaceType type, Selector selector, ClassWorld world) {
+ var res =
+ _lookupSelector(selector != null ? selector.name : null, type, world);
return new TrustTypesSelectorInfo._(receiver, selector, res.exists,
- res.usesInterceptor, res.possibleTargets,
- res.exists != Boolish.maybe);
+ res.usesInterceptor, res.possibleTargets, res.exists != Boolish.maybe);
}
- TrustTypesSelectorInfo._(
- this.receiver, this.selector, this.exists, this.usesInterceptor,
- this.possibleTargets, this.isAccurate);
+ TrustTypesSelectorInfo._(this.receiver, this.selector, this.exists,
+ this.usesInterceptor, this.possibleTargets, this.isAccurate);
}
-
diff --git a/pkg/compiler/lib/src/io/code_output.dart b/pkg/compiler/lib/src/io/code_output.dart
index 7f5b996..e43cbbb 100644
--- a/pkg/compiler/lib/src/io/code_output.dart
+++ b/pkg/compiler/lib/src/io/code_output.dart
@@ -23,8 +23,8 @@
void addSourceLocation(int targetOffset, SourceLocation sourcePosition);
/// Applies [f] to every target offset and associated source location.
- void forEachSourceLocation(void f(int targetOffset,
- SourceLocation sourceLocation));
+ void forEachSourceLocation(
+ void f(int targetOffset, SourceLocation sourceLocation));
}
abstract class CodeOutput implements SourceLocations {
@@ -66,9 +66,10 @@
@override
void addBuffer(CodeBuffer other) {
if (other.markers.length > 0) {
- other.markers.forEach(
- (int targetOffset, List<SourceLocation> sourceLocations) {
- markers.putIfAbsent(length + targetOffset, () => <SourceLocation>[])
+ other.markers
+ .forEach((int targetOffset, List<SourceLocation> sourceLocations) {
+ markers
+ .putIfAbsent(length + targetOffset, () => <SourceLocation>[])
.addAll(sourceLocations);
});
}
@@ -78,8 +79,7 @@
_addInternal(other.getText());
}
- void addSourceLocation(int targetOffset,
- SourceLocation sourceLocation) {
+ void addSourceLocation(int targetOffset, SourceLocation sourceLocation) {
assert(targetOffset <= length);
List<SourceLocation> sourceLocations =
markers.putIfAbsent(targetOffset, () => <SourceLocation>[]);
diff --git a/pkg/compiler/lib/src/io/position_information.dart b/pkg/compiler/lib/src/io/position_information.dart
index 79e58c3..83460d5 100644
--- a/pkg/compiler/lib/src/io/position_information.dart
+++ b/pkg/compiler/lib/src/io/position_information.dart
@@ -8,20 +8,13 @@
library dart2js.source_information.position;
import '../common.dart';
-import '../elements/elements.dart' show
- AstElement,
- FieldElement,
- LocalElement;
+import '../elements/elements.dart' show AstElement, FieldElement, LocalElement;
import '../js/js.dart' as js;
import '../js/js_source_mapping.dart';
import '../js/js_debug.dart';
-import '../tree/tree.dart' show
- FunctionExpression,
- Node,
- Send;
+import '../tree/tree.dart' show FunctionExpression, Node, Send;
-import 'code_output.dart' show
- CodeBuffer;
+import 'code_output.dart' show CodeBuffer;
import 'source_file.dart';
import 'source_information.dart';
@@ -34,8 +27,7 @@
@override
final SourceLocation closingPosition;
- PositionSourceInformation(this.startPosition,
- [this.closingPosition]);
+ PositionSourceInformation(this.startPosition, [this.closingPosition]);
@override
List<SourceLocation> get sourceLocations {
@@ -60,14 +52,14 @@
int get hashCode {
return 0x7FFFFFFF &
- (startPosition.hashCode * 17 + closingPosition.hashCode * 19);
+ (startPosition.hashCode * 17 + closingPosition.hashCode * 19);
}
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! PositionSourceInformation) return false;
return startPosition == other.startPosition &&
- closingPosition == other.closingPosition;
+ closingPosition == other.closingPosition;
}
/// Create a textual representation of the source information using [uriText]
@@ -78,11 +70,11 @@
// Use 1-based line/column info to match usual dart tool output.
if (startPosition != null) {
sb.write('[${startPosition.line + 1},'
- '${startPosition.column + 1}]');
+ '${startPosition.column + 1}]');
}
if (closingPosition != null) {
sb.write('-[${closingPosition.line + 1},'
- '${closingPosition.column + 1}]');
+ '${closingPosition.column + 1}]');
}
return sb.toString();
}
@@ -158,9 +150,8 @@
SourceInformation buildDeclaration(AstElement element) {
if (element.isSynthesized) {
- return new PositionSourceInformation(
- new OffsetSourceLocation(
- sourceFile, element.position.charOffset, name));
+ return new PositionSourceInformation(new OffsetSourceLocation(
+ sourceFile, element.position.charOffset, name));
} else {
return new PositionSourceInformation(
new OffsetSourceLocation(sourceFile,
@@ -188,16 +179,13 @@
@override
SourceInformation buildImplicitReturn(AstElement element) {
if (element.isSynthesized) {
- return new PositionSourceInformation(
- new OffsetSourceLocation(
- sourceFile, element.position.charOffset, name));
+ return new PositionSourceInformation(new OffsetSourceLocation(
+ sourceFile, element.position.charOffset, name));
} else {
- return new PositionSourceInformation(
- new OffsetSourceLocation(sourceFile,
- element.resolvedAst.node.getEndToken().charOffset, name));
+ return new PositionSourceInformation(new OffsetSourceLocation(
+ sourceFile, element.resolvedAst.node.getEndToken().charOffset, name));
}
- }
-
+ }
@override
SourceInformation buildLoop(Node node) => buildBegin(node);
@@ -333,7 +321,7 @@
String toString() {
return 'CodePosition(start=$startPosition,'
- 'end=$endPosition,closing=$closingPosition)';
+ 'end=$endPosition,closing=$closingPosition)';
}
}
@@ -347,12 +335,10 @@
Map<js.Node, CodePosition> _codePositionMap =
new Map<js.Node, CodePosition>.identity();
- void registerPositions(js.Node node,
- int startPosition,
- int endPosition,
- int closingPosition) {
- registerCodePosition(node,
- new CodePosition(startPosition, endPosition, closingPosition));
+ void registerPositions(
+ js.Node node, int startPosition, int endPosition, int closingPosition) {
+ registerCodePosition(
+ node, new CodePosition(startPosition, endPosition, closingPosition));
}
void registerCodePosition(js.Node node, CodePosition codePosition) {
@@ -396,8 +382,7 @@
INNER,
}
-SourceLocation getSourceLocation(
- SourceInformation sourceInformation,
+SourceLocation getSourceLocation(SourceInformation sourceInformation,
[SourcePositionKind sourcePositionKind = SourcePositionKind.START]) {
if (sourceInformation == null) return null;
switch (sourcePositionKind) {
@@ -449,12 +434,11 @@
CodePositionMap codePositionMap;
List<TraceListener> traceListeners;
- PositionSourceInformationProcessor(
- SourceMapper sourceMapper,
+ PositionSourceInformationProcessor(SourceMapper sourceMapper,
[Coverage coverage]) {
codePositionMap = coverage != null
- ? new CodePositionCoverage(codePositionRecorder, coverage)
- : codePositionRecorder;
+ ? new CodePositionCoverage(codePositionRecorder, coverage)
+ : codePositionRecorder;
traceListeners = [new PositionTraceListener(sourceMapper)];
if (coverage != null) {
traceListeners.add(new CoverageListener(coverage));
@@ -466,10 +450,8 @@
}
@override
- void onPositions(js.Node node,
- int startPosition,
- int endPosition,
- int closingPosition) {
+ void onPositions(
+ js.Node node, int startPosition, int endPosition, int closingPosition) {
codePositionRecorder.registerPositions(
node, startPosition, endPosition, closingPosition);
}
@@ -524,7 +506,6 @@
}
return visit(node.value);
}
-
}
/// Mixin that add support for computing [SourceInformation] for a [js.Node].
@@ -535,8 +516,8 @@
}
/// [TraceListener] that register [SourceLocation]s with a [SourceMapper].
-class PositionTraceListener extends TraceListener with
- NodeToSourceInformationMixin {
+class PositionTraceListener extends TraceListener
+ with NodeToSourceInformationMixin {
final SourceMapper sourceMapper;
PositionTraceListener(this.sourceMapper);
@@ -617,47 +598,35 @@
// a.m() this.m() a.b.c.d.m()
// ^ ^ ^
return new CallPosition(
- node,
- CodePositionKind.START,
- SourcePositionKind.START);
+ node, CodePositionKind.START, SourcePositionKind.START);
} else {
// *.m() *.a.b.c.d.m()
// ^ ^
return new CallPosition(
- access.selector,
- CodePositionKind.START,
- SourcePositionKind.INNER);
+ access.selector, CodePositionKind.START, SourcePositionKind.INNER);
}
} else if (node.target is js.VariableUse) {
// m()
// ^
return new CallPosition(
- node,
- CodePositionKind.START,
- SourcePositionKind.START);
+ node, CodePositionKind.START, SourcePositionKind.START);
} else if (node.target is js.Fun || node.target is js.New) {
// function(){}() new Function("...")()
// ^ ^
return new CallPosition(
- node.target,
- CodePositionKind.END,
- SourcePositionKind.INNER);
+ node.target, CodePositionKind.END, SourcePositionKind.INNER);
} else if (node.target is js.Binary || node.target is js.Call) {
// (0,a)() m()()
// ^ ^
return new CallPosition(
- node.target,
- CodePositionKind.END,
- SourcePositionKind.INNER);
+ node.target, CodePositionKind.END, SourcePositionKind.INNER);
} else {
assert(invariant(NO_LOCATION_SPANNABLE, false,
message: "Unexpected property access ${nodeToString(node)}:\n"
- "${DebugPrinter.prettyPrint(node)}"));
+ "${DebugPrinter.prettyPrint(node)}"));
// Don't know....
return new CallPosition(
- node,
- CodePositionKind.START,
- SourcePositionKind.START);
+ node, CodePositionKind.START, SourcePositionKind.START);
}
}
}
@@ -708,7 +677,8 @@
///
final int leftToRightOffset;
- Offset(this.statementOffset, this.leftToRightOffset, this.subexpressionOffset);
+ Offset(
+ this.statementOffset, this.leftToRightOffset, this.subexpressionOffset);
String toString() {
return 'Offset[statementOffset=$statementOffset,'
@@ -717,13 +687,7 @@
}
}
-enum BranchKind {
- CONDITION,
- LOOP,
- CATCH,
- FINALLY,
- CASE,
-}
+enum BranchKind { CONDITION, LOOP, CATCH, FINALLY, CASE, }
enum StepKind {
FUN_ENTRY,
@@ -767,7 +731,7 @@
/// Visitor that computes the [js.Node]s the are part of the JavaScript
/// steppable execution and thus needs source mapping locations.
-class JavaScriptTracer extends js.BaseVisitor {
+class JavaScriptTracer extends js.BaseVisitor {
final CodePositionMap codePositions;
final List<TraceListener> listeners;
@@ -785,9 +749,7 @@
bool active;
- JavaScriptTracer(this.codePositions,
- this.listeners,
- {this.active: false});
+ JavaScriptTracer(this.codePositions, this.listeners, {this.active: false});
void notifyStart(js.Node node) {
listeners.forEach((listener) => listener.onStart(node));
@@ -852,15 +814,15 @@
if (!active) {
active = node.sourceInformation != null;
}
- leftToRightOffset = statementOffset =
- getSyntaxOffset(node, kind: CodePositionKind.START);
+ leftToRightOffset =
+ statementOffset = getSyntaxOffset(node, kind: CodePositionKind.START);
Offset entryOffset = getOffsetForNode(node, statementOffset);
notifyStep(node, entryOffset, StepKind.FUN_ENTRY);
visit(node.body);
- leftToRightOffset = statementOffset =
- getSyntaxOffset(node, kind: CodePositionKind.CLOSING);
+ leftToRightOffset =
+ statementOffset = getSyntaxOffset(node, kind: CodePositionKind.CLOSING);
Offset exitOffset = getOffsetForNode(node, statementOffset);
notifyStep(node, exitOffset, StepKind.FUN_EXIT);
active = activeBefore;
@@ -874,7 +836,7 @@
}
int getSyntaxOffset(js.Node node,
- {CodePositionKind kind: CodePositionKind.START}) {
+ {CodePositionKind kind: CodePositionKind.START}) {
CodePosition codePosition = codePositions[node];
if (codePosition != null) {
return codePosition.getPosition(kind);
@@ -882,18 +844,14 @@
return null;
}
- visitSubexpression(js.Node parent,
- js.Expression child,
- int codeOffset,
- StepKind kind) {
+ visitSubexpression(
+ js.Node parent, js.Expression child, int codeOffset, StepKind kind) {
var oldSteps = steps;
steps = [];
offsetPosition = codeOffset;
visit(child);
if (steps.isEmpty) {
- notifyStep(parent,
- getOffsetForNode(parent, offsetPosition),
- kind);
+ notifyStep(parent, getOffsetForNode(parent, offsetPosition), kind);
// The [offsetPosition] should only be used by the first subexpression.
offsetPosition = null;
}
@@ -904,8 +862,7 @@
visitExpressionStatement(js.ExpressionStatement node) {
statementOffset = getSyntaxOffset(node);
visitSubexpression(
- node, node.expression, statementOffset,
- StepKind.EXPRESSION_STATEMENT);
+ node, node.expression, statementOffset, StepKind.EXPRESSION_STATEMENT);
statementOffset = null;
leftToRightOffset = null;
}
@@ -920,11 +877,10 @@
offsetPosition = null;
visitList(node.arguments);
offsetPosition = oldPosition;
- CallPosition callPosition =
- CallPosition.getSemanticPositionForCall(node);
+ CallPosition callPosition = CallPosition.getSemanticPositionForCall(node);
js.Node positionNode = callPosition.node;
- int callOffset = getSyntaxOffset(
- positionNode, kind: callPosition.codePositionKind);
+ int callOffset =
+ getSyntaxOffset(positionNode, kind: callPosition.codePositionKind);
if (offsetPosition == null) {
// Use the call offset if this is not the first subexpression.
offsetPosition = callOffset;
@@ -943,8 +899,7 @@
// Use the syntax offset if this is not the first subexpression.
offsetPosition = getSyntaxOffset(node);
}
- notifyStep(
- node, getOffsetForNode(node, offsetPosition), StepKind.NEW);
+ notifyStep(node, getOffsetForNode(node, offsetPosition), StepKind.NEW);
steps.add(node);
offsetPosition = null;
}
@@ -996,8 +951,8 @@
@override
visitIf(js.If node) {
statementOffset = getSyntaxOffset(node);
- visitSubexpression(node, node.condition, statementOffset,
- StepKind.IF_CONDITION);
+ visitSubexpression(
+ node, node.condition, statementOffset, StepKind.IF_CONDITION);
statementOffset = null;
visit(node.then, BranchKind.CONDITION, true);
visit(node.otherwise, BranchKind.CONDITION, false);
@@ -1009,8 +964,8 @@
statementOffset = offset;
leftToRightOffset = null;
if (node.init != null) {
- visitSubexpression(node, node.init, getSyntaxOffset(node),
- StepKind.FOR_INITIALIZER);
+ visitSubexpression(
+ node, node.init, getSyntaxOffset(node), StepKind.FOR_INITIALIZER);
}
if (node.condition != null) {
@@ -1023,8 +978,8 @@
statementOffset = offset;
if (node.update != null) {
- visitSubexpression(node, node.update, getSyntaxOffset(node.update),
- StepKind.FOR_UPDATE);
+ visitSubexpression(
+ node, node.update, getSyntaxOffset(node.update), StepKind.FOR_UPDATE);
}
notifyPopBranch();
@@ -1150,8 +1105,8 @@
@override
visitSwitch(js.Switch node) {
statementOffset = getSyntaxOffset(node);
- visitSubexpression(node, node.key, getSyntaxOffset(node),
- StepKind.SWITCH_EXPRESSION);
+ visitSubexpression(
+ node, node.key, getSyntaxOffset(node), StepKind.SWITCH_EXPRESSION);
statementOffset = null;
leftToRightOffset = null;
for (int i = 0; i < node.cases.length; i++) {
@@ -1202,7 +1157,6 @@
}
}
-
class Coverage {
Set<js.Node> _nodesWithInfo = new Set<js.Node>();
int _nodesWithInfoCount = 0;
@@ -1237,8 +1191,7 @@
node.expression.runtimeType, () => 0);
_nodesWithoutInfoCountByType[node.expression.runtimeType]++;
} else {
- _nodesWithoutInfoCountByType.putIfAbsent(
- node.runtimeType, () => 0);
+ _nodesWithoutInfoCountByType.putIfAbsent(node.runtimeType, () => 0);
_nodesWithoutInfoCountByType[node.runtimeType]++;
}
}
@@ -1274,8 +1227,8 @@
sb.write(') by runtime type:');
List<Type> types = _nodesWithoutInfoCountByType.keys.toList();
types.sort((a, b) {
- return -_nodesWithoutInfoCountByType[a].compareTo(
- _nodesWithoutInfoCountByType[b]);
+ return -_nodesWithoutInfoCountByType[a]
+ .compareTo(_nodesWithoutInfoCountByType[b]);
});
types.forEach((Type type) {
@@ -1331,7 +1284,7 @@
CodePosition codePosition = codePositions[node];
if (codePosition == null) {
coverage.registerNodesWithoutOffset(node);
- }
+ }
return codePosition;
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/io/source_file.dart b/pkg/compiler/lib/src/io/source_file.dart
index f2058ad..93e6189 100644
--- a/pkg/compiler/lib/src/io/source_file.dart
+++ b/pkg/compiler/lib/src/io/source_file.dart
@@ -89,7 +89,7 @@
List<int> starts = lineStarts;
if (position < 0 || starts.last <= position) {
throw 'bad position #$position in file $filename with '
- 'length ${length}.';
+ 'length ${length}.';
}
int first = 0;
int count = starts.length;
@@ -132,8 +132,7 @@
* escape codes.
*/
String getLocationMessage(String message, int start, int end,
- {bool includeSourceLine: true,
- String colorize(String text)}) {
+ {bool includeSourceLine: true, String colorize(String text)}) {
if (colorize == null) {
colorize = (text) => text;
}
@@ -158,7 +157,7 @@
if (lineStart == lineEnd) {
String textLine = getLineText(lineStart);
- int toColumn = min(columnStart + (end-start), textLine.length);
+ int toColumn = min(columnStart + (end - start), textLine.length);
buf.write(textLine.substring(0, columnStart));
buf.write(colorize(textLine.substring(columnStart, toColumn)));
buf.write(textLine.substring(toColumn));
@@ -196,7 +195,7 @@
String getLineText(int index) {
// +1 for 0-indexing, +1 again to avoid the last line of the file
if ((index + 2) < lineStarts.length) {
- return slowSubstring(lineStarts[index], lineStarts[index+1]);
+ return slowSubstring(lineStarts[index], lineStarts[index + 1]);
} else if ((index + 1) < lineStarts.length) {
return '${slowSubstring(lineStarts[index], length)}\n';
} else {
@@ -226,12 +225,12 @@
* the constructor clones the content and adds a trailing 0.
*/
Utf8BytesSourceFile(this.uri, List<int> content)
- : this.zeroTerminatedContent = _zeroTerminateIfNecessary(content);
+ : this.zeroTerminatedContent = _zeroTerminateIfNecessary(content);
String slowText() {
// Don't convert the trailing zero byte.
- return UTF8.decoder.convert(
- zeroTerminatedContent, 0, zeroTerminatedContent.length - 1);
+ return UTF8.decoder
+ .convert(zeroTerminatedContent, 0, zeroTerminatedContent.length - 1);
}
List<int> slowUtf8ZeroTerminatedBytes() => zeroTerminatedContent;
@@ -249,6 +248,7 @@
}
return lengthCache;
}
+
set length(int v) => lengthCache = v;
int lengthCache = -1;
}
@@ -282,7 +282,7 @@
: this(new Uri(path: filename), filename, text);
int get length => text.length;
- set length(int v) { }
+ set length(int v) {}
String slowText() => text;
diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index 8a24759..ec2b933 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -5,14 +5,9 @@
library dart2js.source_information;
import '../common.dart';
-import '../elements/elements.dart' show
- AstElement,
- LocalElement;
-import '../tree/tree.dart' show
- Node,
- Send;
-import '../js/js.dart' show
- JavaScriptNodeSourceInformation;
+import '../elements/elements.dart' show AstElement, LocalElement;
+import '../tree/tree.dart' show Node, Send;
+import '../js/js.dart' show JavaScriptNodeSourceInformation;
import 'source_file.dart';
/// Interface for passing source information, for instance for use in source
@@ -181,16 +176,16 @@
int get hashCode {
return sourceUri.hashCode * 17 +
- offset.hashCode * 17 +
- sourceName.hashCode * 23;
+ offset.hashCode * 17 +
+ sourceName.hashCode * 23;
}
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! SourceLocation) return false;
return sourceUri == other.sourceUri &&
- offset == other.offset &&
- sourceName == other.sourceName;
+ offset == other.offset &&
+ sourceName == other.sourceName;
}
String get shortText {
diff --git a/pkg/compiler/lib/src/io/source_map_builder.dart b/pkg/compiler/lib/src/io/source_map_builder.dart
index 28b52a5..f6fa478 100644
--- a/pkg/compiler/lib/src/io/source_map_builder.dart
+++ b/pkg/compiler/lib/src/io/source_map_builder.dart
@@ -10,18 +10,17 @@
import 'source_information.dart' show SourceLocation;
class SourceMapBuilder {
-
/// The URI of the source map file.
final Uri sourceMapUri;
+
/// The URI of the target language file.
final Uri targetFileUri;
final LineColumnProvider lineColumnProvider;
final List<SourceMapEntry> entries = new List<SourceMapEntry>();
- SourceMapBuilder(this.sourceMapUri,
- this.targetFileUri,
- this.lineColumnProvider);
+ SourceMapBuilder(
+ this.sourceMapUri, this.targetFileUri, this.lineColumnProvider);
void addMapping(int targetOffset, SourceLocation sourceLocation) {
entries.add(new SourceMapEntry(sourceLocation, targetOffset));
@@ -41,7 +40,6 @@
}
String build() {
-
LineColumnMap<SourceMapEntry> lineColumnMap =
new LineColumnMap<SourceMapEntry>();
Map<Uri, LineColumnMap<SourceMapEntry>> sourceLocationMap =
@@ -55,8 +53,8 @@
SourceLocation location = sourceMapEntry.sourceLocation;
if (location != null) {
LineColumnMap<SourceMapEntry> sourceLineColumnMap =
- sourceLocationMap.putIfAbsent(location.sourceUri,
- () => new LineColumnMap<SourceMapEntry>());
+ sourceLocationMap.putIfAbsent(
+ location.sourceUri, () => new LineColumnMap<SourceMapEntry>());
sourceLineColumnMap.add(location.line, location.column, sourceMapEntry);
}
});
@@ -92,8 +90,8 @@
buffer.write(' "sources": ');
Iterable<String> relativeSourceUriList = const <String>[];
if (sourceMapUri != null) {
- relativeSourceUriList = uriMap.elements
- .map((u) => relativize(sourceMapUri, u, false));
+ relativeSourceUriList =
+ uriMap.elements.map((u) => relativize(sourceMapUri, u, false));
}
printStringListOn(relativeSourceUriList, buffer);
buffer.write(',\n');
@@ -106,10 +104,8 @@
return buffer.toString();
}
- void writeEntries(LineColumnMap<SourceMapEntry> entries,
- IndexMap<Uri> uriMap,
- IndexMap<String> nameMap,
- StringBuffer output) {
+ void writeEntries(LineColumnMap<SourceMapEntry> entries, IndexMap<Uri> uriMap,
+ IndexMap<String> nameMap, StringBuffer output) {
SourceLocation previousSourceLocation;
int previousTargetLine = 0;
DeltaEncoder targetColumnEncoder = new DeltaEncoder();
@@ -119,9 +115,7 @@
DeltaEncoder sourceColumnEncoder = new DeltaEncoder();
DeltaEncoder sourceNameIndexEncoder = new DeltaEncoder();
- entries.forEach((int targetLine,
- int targetColumn,
- SourceMapEntry entry) {
+ entries.forEach((int targetLine, int targetColumn, SourceMapEntry entry) {
SourceLocation sourceLocation = entry.sourceLocation;
if (sourceLocation == previousSourceLocation) {
return;
@@ -184,7 +178,7 @@
static const int VLQ_CONTINUATION_BIT = 1 << 5;
static const int VLQ_CONTINUATION_MASK = 1 << 5;
static const String BASE64_DIGITS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmn'
- 'opqrstuvwxyz0123456789+/';
+ 'opqrstuvwxyz0123456789+/';
/// Writes the VLQ of delta between [value] and [offset] into [output] and
/// return [value].
diff --git a/pkg/compiler/lib/src/io/start_end_information.dart b/pkg/compiler/lib/src/io/start_end_information.dart
index 8cae566..b08477f 100644
--- a/pkg/compiler/lib/src/io/start_end_information.dart
+++ b/pkg/compiler/lib/src/io/start_end_information.dart
@@ -8,11 +8,8 @@
library dart2js.source_information.start_end;
import '../common.dart';
-import '../diagnostics/messages.dart' show
- MessageTemplate;
-import '../elements/elements.dart' show
- AstElement,
- LocalElement;
+import '../diagnostics/messages.dart' show MessageTemplate;
+import '../elements/elements.dart' show AstElement, LocalElement;
import '../js/js.dart' as js;
import '../js/js_source_mapping.dart';
import '../tokens/token.dart' show Token;
@@ -51,21 +48,20 @@
int get hashCode {
return 0x7FFFFFFF &
- (startPosition.hashCode * 17 + endPosition.hashCode * 19);
+ (startPosition.hashCode * 17 + endPosition.hashCode * 19);
}
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! StartEndSourceInformation) return false;
return startPosition == other.startPosition &&
- endPosition == other.endPosition;
+ endPosition == other.endPosition;
}
// TODO(johnniwinther): Inline this in
// [StartEndSourceInformationBuilder.buildDeclaration].
static StartEndSourceInformation _computeSourceInformation(
AstElement element) {
-
AstElement implementation = element.implementation;
SourceFile sourceFile = implementation.compilationUnit.script.file;
String name = computeElementNameForSourceMaps(element);
@@ -140,10 +136,8 @@
StartEndSourceInformationProcessor(this.sourceMapper);
@override
- void onPositions(js.Node node,
- int startPosition,
- int endPosition,
- int closingPosition) {
+ void onPositions(
+ js.Node node, int startPosition, int endPosition, int closingPosition) {
if (node.sourceInformation != null) {
StartEndSourceInformation sourceInformation = node.sourceInformation;
sourceMapper.register(
@@ -183,10 +177,11 @@
SourceLocation location, SourceFile sourceFile, int offset) {
if (!location.isValid) {
throw MessageTemplate.TEMPLATES[MessageKind.INVALID_SOURCE_FILE_LOCATION]
- .message(
- {'offset': offset,
- 'fileName': sourceFile.filename,
- 'length': sourceFile.length});
+ .message({
+ 'offset': offset,
+ 'fileName': sourceFile.filename,
+ 'length': sourceFile.length
+ });
}
}
@@ -224,11 +219,8 @@
SourceInformation buildIf(Node node) => buildGeneric(node);
@override
- SourceInformationBuilder forContext(
- AstElement element, {SourceInformation sourceInformation}) {
+ SourceInformationBuilder forContext(AstElement element,
+ {SourceInformation sourceInformation}) {
return new StartEndSourceInformationBuilder(element);
}
}
-
-
-
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index 837b9fe..cefac18 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -8,23 +8,16 @@
export 'package:js_ast/js_ast.dart';
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
-import '../dump_info.dart' show
- DumpInfoTask;
-import '../io/code_output.dart' show
- CodeBuffer,
- CodeOutput;
-import '../js_emitter/js_emitter.dart' show
- USE_LAZY_EMITTER;
+import '../compiler.dart' show Compiler;
+import '../dump_info.dart' show DumpInfoTask;
+import '../io/code_output.dart' show CodeBuffer, CodeOutput;
+import '../js_emitter/js_emitter.dart' show USE_LAZY_EMITTER;
import 'js_source_mapping.dart';
-String prettyPrint(
- Node node,
- Compiler compiler,
+String prettyPrint(Node node, Compiler compiler,
{bool allowVariableMinification: true,
- Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer}) {
+ Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer}) {
// TODO(johnniwinther): Do we need all the options here?
JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
shouldCompressOutput: compiler.options.enableMinification,
@@ -38,12 +31,10 @@
return context.getText();
}
-CodeBuffer createCodeBuffer(
- Node node,
- Compiler compiler,
+CodeBuffer createCodeBuffer(Node node, Compiler compiler,
{DumpInfoTask monitor,
- bool allowVariableMinification: true,
- Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer}) {
+ bool allowVariableMinification: true,
+ Renamer renamerForNames: JavaScriptPrintingOptions.identityRenamer}) {
JavaScriptSourceInformationStrategy sourceInformationFactory =
compiler.backend.sourceInformationStrategy;
JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
@@ -53,8 +44,8 @@
renamerForNames: renamerForNames);
CodeBuffer outBuffer = new CodeBuffer();
SourceInformationProcessor sourceInformationProcessor =
- sourceInformationFactory.createProcessor(
- new SourceLocationsMapper(outBuffer));
+ sourceInformationFactory
+ .createProcessor(new SourceLocationsMapper(outBuffer));
Dart2JSJavaScriptPrintingContext context =
new Dart2JSJavaScriptPrintingContext(
compiler.reporter, monitor, outBuffer, sourceInformationProcessor);
@@ -71,10 +62,7 @@
final CodePositionListener codePositionListener;
Dart2JSJavaScriptPrintingContext(
- this.reporter,
- this.monitor,
- this.outBuffer,
- this.codePositionListener);
+ this.reporter, this.monitor, this.outBuffer, this.codePositionListener);
@override
void error(String message) {
@@ -90,10 +78,8 @@
void enterNode(Node, int startPosition) {}
@override
- void exitNode(Node node,
- int startPosition,
- int endPosition,
- int closingPosition) {
+ void exitNode(
+ Node node, int startPosition, int endPosition, int closingPosition) {
if (monitor != null) {
monitor.recordAstSize(node, endPosition - startPosition);
}
@@ -142,8 +128,7 @@
///
/// This is used when generated code needs to be represented as a string,
/// for example by the lazy emitter or when generating code generators.
-class UnparsedNode extends DeferredString
- implements AstContainer {
+class UnparsedNode extends DeferredString implements AstContainer {
@override
final Node tree;
final Compiler _compiler;
@@ -167,8 +152,7 @@
if (tree is LiteralExpression) {
LiteralExpression literalExpression = tree;
String template = literalExpression.template;
- if (template.startsWith("function ") ||
- template.startsWith("{")) {
+ if (template.startsWith("function ") || template.startsWith("{")) {
text = '($text)';
}
}
diff --git a/pkg/compiler/lib/src/js/js_debug.dart b/pkg/compiler/lib/src/js/js_debug.dart
index c8cbd0de..8851aa6 100644
--- a/pkg/compiler/lib/src/js/js_debug.dart
+++ b/pkg/compiler/lib/src/js/js_debug.dart
@@ -8,19 +8,15 @@
import 'package:js_ast/js_ast.dart';
-import '../io/code_output.dart' show
- BufferedCodeOutput;
-import '../util/util.dart' show
- Indentation,
- Tagging;
+import '../io/code_output.dart' show BufferedCodeOutput;
+import '../util/util.dart' show Indentation, Tagging;
/// Unparse the JavaScript [node].
String nodeToString(Node node) {
JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
shouldCompressOutput: true,
preferSemicolonToNewlineInMinifiedOutput: true);
- LenientPrintingContext printingContext =
- new LenientPrintingContext();
+ LenientPrintingContext printingContext = new LenientPrintingContext();
new Printer(options, printingContext).visit(node);
return printingContext.getText();
}
diff --git a/pkg/compiler/lib/src/js/js_source_mapping.dart b/pkg/compiler/lib/src/js/js_source_mapping.dart
index cd72e35..86b2601 100644
--- a/pkg/compiler/lib/src/js/js_source_mapping.dart
+++ b/pkg/compiler/lib/src/js/js_source_mapping.dart
@@ -5,19 +5,14 @@
library js.source_mapping;
import 'js.dart';
-import '../io/code_output.dart' show
- BufferedCodeOutput,
- CodeBuffer,
- SourceLocations;
-import '../io/source_information.dart' show
- SourceLocation,
- SourceInformation,
- SourceInformationStrategy;
+import '../io/code_output.dart'
+ show BufferedCodeOutput, CodeBuffer, SourceLocations;
+import '../io/source_information.dart'
+ show SourceLocation, SourceInformation, SourceInformationStrategy;
/// [SourceInformationStrategy] that can associate source information with
/// JavaScript output.
-class JavaScriptSourceInformationStrategy
- extends SourceInformationStrategy {
+class JavaScriptSourceInformationStrategy extends SourceInformationStrategy {
const JavaScriptSourceInformationStrategy();
/// Creates a processor that can associate source information on [Node] with
@@ -34,10 +29,7 @@
/// Called to associate [node] with the provided start, end and closing
/// positions.
void onPositions(
- Node node,
- int startPosition,
- int endPosition,
- int closingPosition) {}
+ Node node, int startPosition, int endPosition, int closingPosition) {}
}
/// An interface for mapping code offsets with [SourceLocation]s for JavaScript
diff --git a/pkg/compiler/lib/src/js/placeholder_safety.dart b/pkg/compiler/lib/src/js/placeholder_safety.dart
index b103489..62140ea 100644
--- a/pkg/compiler/lib/src/js/placeholder_safety.dart
+++ b/pkg/compiler/lib/src/js/placeholder_safety.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-
library js.safety;
import "js.dart" as js;
@@ -29,8 +28,8 @@
// exceptions. The possible values of expressions are represented by
// integers. Small non-negative integers 0, 1, 2, ... represent the values of
// the placeholders. Other values are:
- static const int NONNULL_VALUE = -1; // Unknown but not null.
- static const int UNKNOWN_VALUE = -2; // Unknown and might be null.
+ static const int NONNULL_VALUE = -1; // Unknown but not null.
+ static const int UNKNOWN_VALUE = -2; // Unknown and might be null.
PlaceholderSafetyAnalysis._(this.isNullableInput);
@@ -147,14 +146,14 @@
safe = false;
return leftToRight();
}
-
+
// Assignment operators dereference the LHS before evaluating the RHS.
if (node.op != null) return leftToRight();
// Assignment (1) evaluates the LHS as a Reference `lval`, (2) evaluates the
// RHS as a value, (3) dereferences the `lval` in PutValue.
if (left is js.VariableReference) {
- int value = visit(right);
+ int value = visit(right);
// Assignment could change an observed global or cause a ReferenceError.
safe = false;
return value;
@@ -213,7 +212,7 @@
case "|":
int left = visit(node.left);
int right = visit(node.right);
- return NONNULL_VALUE; // Number, String, Boolean.
+ return NONNULL_VALUE; // Number, String, Boolean.
case ',':
int left = visit(node.left);
@@ -258,7 +257,7 @@
// "typeof a" first evaluates to a Reference. If the Reference is to a
// variable that is not present, "undefined" is returned without
// dereferencing.
- if (node.argument is js.VariableUse) return NONNULL_VALUE; // A string.
+ if (node.argument is js.VariableUse) return NONNULL_VALUE; // A string.
}
visit(node.argument);
@@ -273,14 +272,14 @@
return NONNULL_VALUE;
case 'typeof':
- return NONNULL_VALUE; // Always a string.
+ return NONNULL_VALUE; // Always a string.
case 'void':
return UNKNOWN_VALUE;
case '--':
case '++':
- return NONNULL_VALUE; // Always a number.
+ return NONNULL_VALUE; // Always a number.
default:
safe = false;
@@ -291,7 +290,7 @@
int visitPostfix(js.Postfix node) {
assert(node.op == '--' || node.op == '++');
visit(node.argument);
- return NONNULL_VALUE; // Always a number, even for "(a=null, a++)".
+ return NONNULL_VALUE; // Always a number, even for "(a=null, a++)".
}
int visitVariableUse(js.VariableUse node) {
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 970cc1c..2a9d8bf 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -7,14 +7,12 @@
import "dart:math" show max;
import 'dart:collection';
-import 'package:js_runtime/shared/async_await_error_codes.dart'
- as error_codes;
+import 'package:js_runtime/shared/async_await_error_codes.dart' as error_codes;
import "js.dart" as js;
import '../common.dart';
-import '../util/util.dart' show
- Pair;
+import '../util/util.dart' show Pair;
/// Rewrites a [js.Fun] with async/sync*/async* functions and await and yield
/// (with dart-like semantics) to an equivalent function without these.
@@ -28,7 +26,6 @@
/// Look at [rewriteFunction], [visitDartYield] and [visitAwait] for more
/// explanation.
abstract class AsyncRewriterBase extends js.NodeVisitor {
-
// Local variables are hoisted to the top of the function, so they are
// collected here.
List<js.VariableDeclaration> localVariables =
@@ -176,10 +173,8 @@
bool get isSyncStar => false;
bool get isAsyncStar => false;
- AsyncRewriterBase(this.reporter,
- this._spannable,
- this.safeVariableName,
- this.bodyName);
+ AsyncRewriterBase(
+ this.reporter, this._spannable, this.safeVariableName, this.bodyName);
/// Initialize names used by the subClass.
void initializeNames();
@@ -212,8 +207,8 @@
}
js.Expression get currentErrorHandler {
- return js.number(handlerLabels[jumpTargets.lastWhere(
- (node) => handlerLabels[node] != null)]);
+ return js.number(handlerLabels[
+ jumpTargets.lastWhere((node) => handlerLabels[node] != null)]);
}
int allocateTempVar() {
@@ -349,8 +344,7 @@
}
void unreachable(js.Node node) {
- reporter.internalError(
- spannable, "Internal error, trying to visit $node");
+ reporter.internalError(spannable, "Internal error, trying to visit $node");
}
visitStatement(js.Statement node) {
@@ -373,7 +367,6 @@
return node.accept(this);
}
-
/// Calls [fn] with the value of evaluating [node1] and [node2].
///
/// Both nodes are evaluated in order.
@@ -429,8 +422,8 @@
/// evaluation order we can write:
/// temp = <receiver>;
/// temp.m();
- withCallTargetExpression(js.Expression node,
- fn(js.Expression result), {bool store}) {
+ withCallTargetExpression(js.Expression node, fn(js.Expression result),
+ {bool store}) {
int oldTempVarIndex = currentTempVarIndex;
js.Expression visited = visitExpression(node);
js.Expression selector;
@@ -455,7 +448,6 @@
return result;
}
-
/// Calls [fn] with the value of evaluating [node1] and [node2].
///
/// If `shouldTransform(node2)` the first expression is stored in a temporary
@@ -525,9 +517,10 @@
}
/// Returns the rewritten function.
- js.Fun finishFunction(List<js.Parameter> parameters,
- js.Statement rewrittenBody,
- js.VariableDeclarationList variableDeclarations);
+ js.Fun finishFunction(
+ List<js.Parameter> parameters,
+ js.Statement rewrittenBody,
+ js.VariableDeclarationList variableDeclarations);
Iterable<js.VariableInitialization> variableInitializations();
@@ -684,8 +677,7 @@
List<js.SwitchClause> clauses = labelledParts.keys.map((label) {
return new js.Case(js.number(label), new js.Block(labelledParts[label]));
}).toList();
- js.Statement rewrittenBody =
- new js.Switch(goto, clauses);
+ js.Statement rewrittenBody = new js.Switch(goto, clauses);
if (hasJumpThoughOuterLabel) {
rewrittenBody = new js.LabeledStatement(outerLabelName, rewrittenBody);
}
@@ -695,20 +687,18 @@
variables.add(_makeVariableInitializer(goto, js.number(0)));
variables.addAll(variableInitializations());
- variables.add(
- _makeVariableInitializer(handler, js.number(rethrowLabel)));
+ variables.add(_makeVariableInitializer(handler, js.number(rethrowLabel)));
variables.add(_makeVariableInitializer(currentError, null));
if (analysis.hasFinally || (isAsyncStar && analysis.hasYield)) {
- variables.add(_makeVariableInitializer(next,
- new js.ArrayInitializer(<js.Expression>[])));
+ variables.add(_makeVariableInitializer(
+ next, new js.ArrayInitializer(<js.Expression>[])));
}
if (analysis.hasThis && !isSyncStar) {
// Sync* functions must remember `this` on the level of the outer
// function.
variables.add(_makeVariableInitializer(self, js.js('this')));
}
- variables.addAll(localVariables.map(
- (js.VariableDeclaration declaration) {
+ variables.addAll(localVariables.map((js.VariableDeclaration declaration) {
return new js.VariableInitialization(declaration, null);
}));
variables.addAll(new Iterable.generate(tempVarHighWaterMark,
@@ -725,8 +715,8 @@
// The translation does not handle nested functions that are generators
// or asynchronous. These functions should only be ones that are
// introduced by JS foreign code from our own libraries.
- reporter.internalError(spannable,
- 'Nested function is a generator or asynchronous.');
+ reporter.internalError(
+ spannable, 'Nested function is a generator or asynchronous.');
}
return node;
}
@@ -761,18 +751,16 @@
// A non-compound [js.Assignment] has `op==null`. So it works out to
// use [js.Assignment.compound] for all cases.
// Visit the [js.VariableUse] to ensure renaming is done correctly.
- return new js.Assignment.compound(visitExpression(leftHandSide),
- node.op,
- value);
+ return new js.Assignment.compound(
+ visitExpression(leftHandSide), node.op, value);
}, store: false);
} else if (leftHandSide is js.PropertyAccess) {
- return withExpressions([
- leftHandSide.receiver,
- leftHandSide.selector,
- node.value
- ], (evaluated) {
+ return withExpressions(
+ [leftHandSide.receiver, leftHandSide.selector, node.value],
+ (evaluated) {
return new js.Assignment.compound(
- new js.PropertyAccess(evaluated[0], evaluated[1]), node.op,
+ new js.PropertyAccess(evaluated[0], evaluated[1]),
+ node.op,
evaluated[2]);
});
} else {
@@ -887,9 +875,11 @@
@override
js.Expression visitConditional(js.Conditional node) {
if (!shouldTransform(node.then) && !shouldTransform(node.otherwise)) {
- return js.js('# ? # : #', [visitExpression(node.condition),
- visitExpression(node.then),
- visitExpression(node.otherwise)]);
+ return js.js('# ? # : #', [
+ visitExpression(node.condition),
+ visitExpression(node.then),
+ visitExpression(node.otherwise)
+ ]);
}
int thenLabel = newLabel("then");
int joinLabel = newLabel("join");
@@ -977,8 +967,7 @@
bool oldInsideUntranslatedBreakable = insideUntranslatedBreakable;
insideUntranslatedBreakable = true;
addStatement(js.js.statement('do {#} while (#)',
- [translateInBlock(node.body),
- visitExpression(node.condition)]));
+ [translateInBlock(node.body), visitExpression(node.condition)]));
insideUntranslatedBreakable = oldInsideUntranslatedBreakable;
return;
}
@@ -998,8 +987,8 @@
beginLabel(continueLabel);
withExpression(node.condition, (js.Expression condition) {
- addStatement(js.js.statement('if (#) #',
- [condition, gotoAndBreak(startLabel)]));
+ addStatement(
+ js.js.statement('if (#) #', [condition, gotoAndBreak(startLabel)]));
}, store: false);
beginLabel(afterLabel);
}
@@ -1009,7 +998,6 @@
addStatement(node);
}
-
@override
void visitExpressionStatement(js.ExpressionStatement node) {
visitExpressionIgnoreResult(node.expression);
@@ -1022,13 +1010,10 @@
insideUntranslatedBreakable = true;
// Note that node.init, node.condition, node.update all can be null, but
// withExpressions handles that.
- withExpressions([
- node.init,
- node.condition,
- node.update
- ], (List<js.Expression> transformed) {
+ withExpressions([node.init, node.condition, node.update],
+ (List<js.Expression> transformed) {
addStatement(new js.For(transformed[0], transformed[1], transformed[2],
- translateInBlock(node.body)));
+ translateInBlock(node.body)));
});
insideUntranslatedBreakable = oldInsideUntranslated;
return;
@@ -1100,18 +1085,14 @@
}
int thenLabel = newLabel("then");
int joinLabel = newLabel("join");
- int elseLabel = (node.otherwise is js.EmptyStatement)
- ? joinLabel
- : newLabel("else");
+ int elseLabel =
+ (node.otherwise is js.EmptyStatement) ? joinLabel : newLabel("else");
withExpression(node.condition, (js.Expression condition) {
- addExpressionStatement(
- new js.Assignment(
- goto,
- new js.Conditional(
- condition,
- js.number(thenLabel),
- js.number(elseLabel))));
+ addExpressionStatement(new js.Assignment(
+ goto,
+ new js.Conditional(
+ condition, js.number(thenLabel), js.number(elseLabel))));
}, store: false);
addBreak();
beginLabel(thenLabel);
@@ -1295,7 +1276,7 @@
void visitReturn(js.Return node) {
js.Node target = analysis.targets[node];
if (node.value != null) {
- if(isSyncStar || isAsyncStar) {
+ if (isSyncStar || isAsyncStar) {
// Even though `return expr;` is not allowed in the dart sync* and
// async* code, the backend sometimes generates code like this, but
// only when it is known that the 'expr' throws, and the return is just
@@ -1377,15 +1358,14 @@
for (js.SwitchClause clause in node.cases) {
if (clause is js.Case) {
labels[i] = newLabel("case");
- clauses.add(new js.Case(visitExpression(clause.expression),
- gotoAndBreak(labels[i])));
+ clauses.add(new js.Case(
+ visitExpression(clause.expression), gotoAndBreak(labels[i])));
} else if (clause is js.Default) {
labels[i] = newLabel("default");
clauses.add(new js.Default(gotoAndBreak(labels[i])));
hasDefault = true;
} else {
- reporter.internalError(
- spannable, "Unknown clause type $clause");
+ reporter.internalError(spannable, "Unknown clause type $clause");
}
i++;
}
@@ -1421,10 +1401,9 @@
}
setErrorHandler([int errorHandler]) {
- js.Expression label = (errorHandler == null)
- ? currentErrorHandler
- : js.number(errorHandler);
- addStatement(js.js.statement('# = #;',[handler, label]));
+ js.Expression label =
+ (errorHandler == null) ? currentErrorHandler : js.number(errorHandler);
+ addStatement(js.js.statement('# = #;', [handler, label]));
}
List<int> _finalliesUpToAndEnclosingHandler() {
@@ -1461,9 +1440,8 @@
hasTryBlocks = true;
int uncaughtLabel = newLabel("uncaught");
- int handlerLabel = (node.catchPart == null)
- ? uncaughtLabel
- : newLabel("catch");
+ int handlerLabel =
+ (node.catchPart == null) ? uncaughtLabel : newLabel("catch");
int finallyLabel = newLabel("finally");
int afterFinallyLabel = newLabel("after finally");
@@ -1514,9 +1492,8 @@
if (node.finallyPart != null) {
// The error has been caught, so after the finally, continue after the
// try.
- addStatement(
- js.js.statement("#.push(#);",
- [next, js.number(afterFinallyLabel)]));
+ addStatement(js.js
+ .statement("#.push(#);", [next, js.number(afterFinallyLabel)]));
addGoto(finallyLabel);
} else {
addGoto(afterFinallyLabel);
@@ -1535,9 +1512,10 @@
if (enclosingFinallies.isNotEmpty) {
// [enclosingFinallies] can be empty if there is no surrounding finally
// blocks. Then [nextLabel] will be [rethrowLabel].
- addStatement(
- js.js.statement("# = #;", [next, new js.ArrayInitializer(
- enclosingFinallies.map(js.number).toList())]));
+ addStatement(js.js.statement("# = #;", [
+ next,
+ new js.ArrayInitializer(enclosingFinallies.map(js.number).toList())
+ ]));
}
if (node.finallyPart == null) {
// The finally-block belonging to [node] will be visited because of
@@ -1586,7 +1564,8 @@
@override
js.Expression visitVariableUse(js.VariableUse node) {
Pair<String, String> renaming = variableRenamings.lastWhere(
- (Pair renaming) => renaming.a == node.name, orElse: () => null);
+ (Pair renaming) => renaming.a == node.name,
+ orElse: () => null);
if (renaming == null) return node;
return new js.VariableUse(renaming.b);
}
@@ -1639,8 +1618,8 @@
}
}
-js.VariableInitialization
- _makeVariableInitializer(dynamic variable, js.Expression initValue) {
+js.VariableInitialization _makeVariableInitializer(
+ dynamic variable, js.Expression initValue) {
js.VariableDeclaration declaration;
if (variable is js.VariableUse) {
declaration = new js.VariableDeclaration(variable.name);
@@ -1654,7 +1633,6 @@
}
class AsyncRewriter extends AsyncRewriterBase {
-
bool get isAsync => true;
/// The Completer that will finish an async function.
@@ -1691,32 +1669,28 @@
final js.Expression wrapBody;
- AsyncRewriter(DiagnosticReporter reporter,
- Spannable spannable,
- {this.asyncHelper,
- this.newCompleter,
- this.wrapBody,
- String safeVariableName(String proposedName),
- js.Name bodyName})
- : super(reporter,
- spannable,
- safeVariableName,
- bodyName);
+ AsyncRewriter(DiagnosticReporter reporter, Spannable spannable,
+ {this.asyncHelper,
+ this.newCompleter,
+ this.wrapBody,
+ String safeVariableName(String proposedName),
+ js.Name bodyName})
+ : super(reporter, spannable, safeVariableName, bodyName);
@override
void addYield(js.DartYield node, js.Expression expression) {
- reporter.internalError(spannable,
- "Yield in non-generating async function");
+ reporter.internalError(spannable, "Yield in non-generating async function");
}
void addErrorExit() {
beginLabel(rethrowLabel);
addStatement(js.js.statement(
"return #thenHelper(#currentError, #errorCode, #completer);", {
- "thenHelper": asyncHelper,
- "errorCode": js.number(error_codes.ERROR),
- "currentError": currentError,
- "completer": completer}));
+ "thenHelper": asyncHelper,
+ "errorCode": js.number(error_codes.ERROR),
+ "currentError": currentError,
+ "completer": completer
+ }));
}
/// Returning from an async method calls [asyncStarHelper] with the result.
@@ -1730,21 +1704,22 @@
}
addStatement(js.js.statement(
"return #runtimeHelper(#returnValue, #successCode, "
- "#completer, null);", {
- "runtimeHelper": asyncHelper,
- "successCode": js.number(error_codes.SUCCESS),
- "returnValue": analysis.hasExplicitReturns
- ? returnValue
- : new js.LiteralNull(),
- "completer": completer}));
+ "#completer, null);",
+ {
+ "runtimeHelper": asyncHelper,
+ "successCode": js.number(error_codes.SUCCESS),
+ "returnValue":
+ analysis.hasExplicitReturns ? returnValue : new js.LiteralNull(),
+ "completer": completer
+ }));
}
@override
Iterable<js.VariableInitialization> variableInitializations() {
List<js.VariableInitialization> variables =
new List<js.VariableInitialization>();
- variables.add(_makeVariableInitializer(completer,
- new js.New(newCompleter, [])));
+ variables
+ .add(_makeVariableInitializer(completer, new js.New(newCompleter, [])));
if (analysis.hasExplicitReturns) {
variables.add(_makeVariableInitializer(returnValue, null));
}
@@ -1758,22 +1733,27 @@
@override
js.Statement awaitStatement(js.Expression value) {
- return js.js.statement("""
+ return js.js.statement(
+ """
return #asyncHelper(#value,
#bodyName,
#completer);
- """, {
- "asyncHelper": asyncHelper,
- "value": value,
- "bodyName": bodyName,
- "completer": completer});
+ """,
+ {
+ "asyncHelper": asyncHelper,
+ "value": value,
+ "bodyName": bodyName,
+ "completer": completer
+ });
}
@override
- js.Fun finishFunction(List<js.Parameter> parameters,
- js.Statement rewrittenBody,
- js.VariableDeclarationList variableDeclarations) {
- return js.js("""
+ js.Fun finishFunction(
+ List<js.Parameter> parameters,
+ js.Statement rewrittenBody,
+ js.VariableDeclarationList variableDeclarations) {
+ return js.js(
+ """
function (#parameters) {
#variableDeclarations;
var #bodyName = #wrapBody(function (#errorCode, #result) {
@@ -1784,7 +1764,8 @@
#rewrittenBody;
});
return #asyncHelper(null, #bodyName, #completer, null);
- }""", {
+ }""",
+ {
"parameters": parameters,
"variableDeclarations": variableDeclarations,
"ERROR": js.number(error_codes.ERROR),
@@ -1803,7 +1784,6 @@
}
class SyncStarRewriter extends AsyncRewriterBase {
-
bool get isSyncStar => true;
/// Contructor creating the Iterable for a sync* method. Called with
@@ -1823,18 +1803,14 @@
/// Used by sync* functions to throw exeptions.
final js.Expression uncaughtErrorExpression;
- SyncStarRewriter(DiagnosticReporter diagnosticListener,
- spannable,
- {this.endOfIteration,
- this.newIterable,
- this.yieldStarExpression,
- this.uncaughtErrorExpression,
- String safeVariableName(String proposedName),
- js.Name bodyName})
- : super(diagnosticListener,
- spannable,
- safeVariableName,
- bodyName);
+ SyncStarRewriter(DiagnosticReporter diagnosticListener, spannable,
+ {this.endOfIteration,
+ this.newIterable,
+ this.yieldStarExpression,
+ this.uncaughtErrorExpression,
+ String safeVariableName(String proposedName),
+ js.Name bodyName})
+ : super(diagnosticListener, spannable, safeVariableName, bodyName);
/// Translates a yield/yield* in an sync*.
///
@@ -1851,9 +1827,10 @@
}
@override
- js.Fun finishFunction(List<js.Parameter> parameters,
- js.Statement rewrittenBody,
- js.VariableDeclarationList variableDeclarations) {
+ js.Fun finishFunction(
+ List<js.Parameter> parameters,
+ js.Statement rewrittenBody,
+ js.VariableDeclarationList variableDeclarations) {
// Each iterator invocation on the iterable should work on its own copy of
// the parameters.
// TODO(sigurdm): We only need to do this copying for parameters that are
@@ -1865,13 +1842,13 @@
String name = parameter.name;
String renamedName = freshName(name);
renamedParameters.add(new js.Parameter(renamedName));
- declarations.add(
- new js.VariableInitialization(new js.VariableDeclaration(name),
- new js.VariableUse(renamedName)));
+ declarations.add(new js.VariableInitialization(
+ new js.VariableDeclaration(name), new js.VariableUse(renamedName)));
}
js.VariableDeclarationList copyParameters =
new js.VariableDeclarationList(declarations);
- return js.js("""
+ return js.js(
+ """
function (#renamedParameters) {
if (#needsThis)
var #self = this;
@@ -1889,29 +1866,30 @@
};
});
}
- """, {
- "renamedParameters": renamedParameters,
- "needsThis": analysis.hasThis,
- "helperBody": rewrittenBody,
- "hasParameters": parameters.isNotEmpty,
- "copyParameters": copyParameters,
- "varDecl": variableDeclarations,
- "errorCode": errorCodeName,
- "newIterable": newIterable,
- "body": bodyName,
- "self": selfName,
- "result": resultName,
- "goto": goto,
- "handler": handler,
- "currentError": currentErrorName,
- "ERROR": js.number(error_codes.ERROR),
- });
+ """,
+ {
+ "renamedParameters": renamedParameters,
+ "needsThis": analysis.hasThis,
+ "helperBody": rewrittenBody,
+ "hasParameters": parameters.isNotEmpty,
+ "copyParameters": copyParameters,
+ "varDecl": variableDeclarations,
+ "errorCode": errorCodeName,
+ "newIterable": newIterable,
+ "body": bodyName,
+ "self": selfName,
+ "result": resultName,
+ "goto": goto,
+ "handler": handler,
+ "currentError": currentErrorName,
+ "ERROR": js.number(error_codes.ERROR),
+ });
}
void addErrorExit() {
beginLabel(rethrowLabel);
- addStatement(js.js.statement('return #(#);',
- [uncaughtErrorExpression, currentError]));
+ addStatement(js.js
+ .statement('return #(#);', [uncaughtErrorExpression, currentError]));
}
/// Returning from a sync* function returns an [endOfIteration] marker.
@@ -1933,8 +1911,8 @@
@override
js.Statement awaitStatement(js.Expression value) {
- throw reporter.internalError(spannable,
- "Sync* functions cannot contain await statements.");
+ throw reporter.internalError(
+ spannable, "Sync* functions cannot contain await statements.");
}
@override
@@ -1942,7 +1920,6 @@
}
class AsyncStarRewriter extends AsyncRewriterBase {
-
bool get isAsyncStar => true;
/// The stack of labels of finally blocks to assign to [next] if the
@@ -1950,6 +1927,7 @@
js.VariableUse get nextWhenCanceled {
return new js.VariableUse(nextWhenCanceledName);
}
+
String nextWhenCanceledName;
/// The StreamController that controls an async* function.
@@ -1994,21 +1972,16 @@
final js.Expression wrapBody;
- AsyncStarRewriter(DiagnosticReporter reporter,
- Spannable spannable,
- {this.asyncStarHelper,
- this.streamOfController,
- this.newController,
- this.yieldExpression,
- this.yieldStarExpression,
- this.wrapBody,
- String safeVariableName(String proposedName),
- js.Name bodyName})
- : super(reporter,
- spannable,
- safeVariableName,
- bodyName);
-
+ AsyncStarRewriter(DiagnosticReporter reporter, Spannable spannable,
+ {this.asyncStarHelper,
+ this.streamOfController,
+ this.newController,
+ this.yieldExpression,
+ this.yieldStarExpression,
+ this.wrapBody,
+ String safeVariableName(String proposedName),
+ js.Name bodyName})
+ : super(reporter, spannable, safeVariableName, bodyName);
/// Translates a yield/yield* in an async* function.
///
@@ -2027,25 +2000,31 @@
enclosingFinallyLabels.addAll(jumpTargets
.where((js.Node node) => finallyLabels[node] != null)
.map((js.Block node) => finallyLabels[node]));
- addStatement(js.js.statement("# = #;",
- [nextWhenCanceled, new js.ArrayInitializer(
- enclosingFinallyLabels.map(js.number).toList())]));
- addStatement(js.js.statement("""
+ addStatement(js.js.statement("# = #;", [
+ nextWhenCanceled,
+ new js.ArrayInitializer(enclosingFinallyLabels.map(js.number).toList())
+ ]));
+ addStatement(js.js.statement(
+ """
return #asyncStarHelper(#yieldExpression(#expression), #bodyName,
- #controller);""", {
- "asyncStarHelper": asyncStarHelper,
- "yieldExpression": node.hasStar ? yieldStarExpression : yieldExpression,
- "expression": expression,
- "bodyName": bodyName,
- "controller": controllerName,
- }));
+ #controller);""",
+ {
+ "asyncStarHelper": asyncStarHelper,
+ "yieldExpression":
+ node.hasStar ? yieldStarExpression : yieldExpression,
+ "expression": expression,
+ "bodyName": bodyName,
+ "controller": controllerName,
+ }));
}
@override
- js.Fun finishFunction(List<js.Parameter> parameters,
- js.Statement rewrittenBody,
- js.VariableDeclarationList variableDeclarations) {
- return js.js("""
+ js.Fun finishFunction(
+ List<js.Parameter> parameters,
+ js.Statement rewrittenBody,
+ js.VariableDeclarationList variableDeclarations) {
+ return js.js(
+ """
function (#parameters) {
var #bodyName = #wrapBody(function (#errorCode, #result) {
if (#hasYield) {
@@ -2068,7 +2047,8 @@
});
#variableDeclarations;
return #streamOfController(#controller);
- }""", {
+ }""",
+ {
"parameters": parameters,
"variableDeclarations": variableDeclarations,
"STREAM_WAS_CANCELED": js.number(error_codes.STREAM_WAS_CANCELED),
@@ -2094,10 +2074,11 @@
beginLabel(rethrowLabel);
addStatement(js.js.statement(
"return #asyncHelper(#currentError, #errorCode, #controller);", {
- "asyncHelper": asyncStarHelper,
- "errorCode": js.number(error_codes.ERROR),
- "currentError": currentError,
- "controller": controllerName}));
+ "asyncHelper": asyncStarHelper,
+ "errorCode": js.number(error_codes.ERROR),
+ "currentError": currentError,
+ "controller": controllerName
+ }));
}
/// Returning from an async* function calls the [streamHelper] with an
@@ -2106,20 +2087,20 @@
void addSuccesExit() {
beginLabel(exitLabel);
- addStatement(js.js.statement(
- "return #streamHelper(null, #successCode, #controller);", {
+ addStatement(js.js
+ .statement("return #streamHelper(null, #successCode, #controller);", {
"streamHelper": asyncStarHelper,
"successCode": js.number(error_codes.SUCCESS),
- "controller": controllerName}));
+ "controller": controllerName
+ }));
}
@override
Iterable<js.VariableInitialization> variableInitializations() {
List<js.VariableInitialization> variables =
new List<js.VariableInitialization>();
- variables.add(_makeVariableInitializer(controller,
- js.js('#(#)',
- [newController, bodyName])));
+ variables.add(_makeVariableInitializer(
+ controller, js.js('#(#)', [newController, bodyName])));
if (analysis.hasYield) {
variables.add(_makeVariableInitializer(nextWhenCanceled, null));
}
@@ -2134,15 +2115,18 @@
@override
js.Statement awaitStatement(js.Expression value) {
- return js.js.statement("""
+ return js.js.statement(
+ """
return #asyncHelper(#value,
#bodyName,
#controller);
- """, {
- "asyncHelper": asyncStarHelper,
- "value": value,
- "bodyName": bodyName,
- "controller": controllerName});
+ """,
+ {
+ "asyncHelper": asyncStarHelper,
+ "value": value,
+ "bodyName": bodyName,
+ "controller": controllerName
+ });
}
}
@@ -2244,8 +2228,8 @@
@override
bool visitBreak(js.Break node) {
if (node.targetLabel != null) {
- targets[node] = labelledStatements.lastWhere(
- (js.LabeledStatement statement) {
+ targets[node] =
+ labelledStatements.lastWhere((js.LabeledStatement statement) {
return statement.label == node.targetLabel;
});
} else {
diff --git a/pkg/compiler/lib/src/js_backend/backend.dart b/pkg/compiler/lib/src/js_backend/backend.dart
index f8afee0..7f751db 100644
--- a/pkg/compiler/lib/src/js_backend/backend.dart
+++ b/pkg/compiler/lib/src/js_backend/backend.dart
@@ -107,7 +107,8 @@
if (insideLoop) {
switch (oldDecision) {
case _mustNotInline:
- throw new SpannableAssertionFailure(element,
+ throw new SpannableAssertionFailure(
+ element,
"Can't mark a function as non-inlinable and inlinable at the "
"same time.");
@@ -133,7 +134,8 @@
case _mustNotInline:
case _mayInlineInLoopMustNotOutside:
case _canInlineInLoopMustNotOutside:
- throw new SpannableAssertionFailure(element,
+ throw new SpannableAssertionFailure(
+ element,
"Can't mark a function as non-inlinable and inlinable at the "
"same time.");
@@ -146,7 +148,6 @@
case _mustInline:
// Do nothing.
break;
-
}
}
}
@@ -164,7 +165,8 @@
case _canInlineInLoopMayInlineOutside:
case _canInline:
case _mustInline:
- throw new SpannableAssertionFailure(element,
+ throw new SpannableAssertionFailure(
+ element,
"Can't mark a function as non-inlinable and inlinable at the "
"same time.");
@@ -181,7 +183,8 @@
switch (oldDecision) {
case _canInline:
case _mustInline:
- throw new SpannableAssertionFailure(element,
+ throw new SpannableAssertionFailure(
+ element,
"Can't mark a function as non-inlinable and inlinable at the "
"same time.");
@@ -215,7 +218,7 @@
enum SyntheticConstantKind {
DUMMY_INTERCEPTOR,
EMPTY_VALUE,
- TYPEVARIABLE_REFERENCE, // Reference to a type in reflection data.
+ TYPEVARIABLE_REFERENCE, // Reference to a type in reflection data.
NAME
}
@@ -226,7 +229,6 @@
final Annotations annotations;
-
/// Set of classes that need to be considered for reflection although not
/// otherwise visible during resolution.
Iterable<ClassElement> get classesRequiredForReflection {
@@ -253,7 +255,7 @@
/// information will be sent to a server via a POST request.
static const String TRACE_METHOD = const String.fromEnvironment('traceCalls');
static const bool TRACE_CALLS =
- TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
+ TRACE_METHOD == 'post' || TRACE_METHOD == 'console';
Element traceHelper;
TypeMask get stringType => compiler.typesTask.stringType;
@@ -271,8 +273,8 @@
TypeMask _indexablePrimitiveTypeCache;
TypeMask get indexablePrimitiveType {
if (_indexablePrimitiveTypeCache == null) {
- _indexablePrimitiveTypeCache = new TypeMask.nonNullSubtype(
- helpers.jsIndexableClass, compiler.world);
+ _indexablePrimitiveTypeCache =
+ new TypeMask.nonNullSubtype(helpers.jsIndexableClass, compiler.world);
}
return _indexablePrimitiveTypeCache;
}
@@ -280,8 +282,8 @@
TypeMask _readableArrayTypeCache;
TypeMask get readableArrayType {
if (_readableArrayTypeCache == null) {
- _readableArrayTypeCache = new TypeMask.nonNullSubclass(
- helpers.jsArrayClass, compiler.world);
+ _readableArrayTypeCache =
+ new TypeMask.nonNullSubclass(helpers.jsArrayClass, compiler.world);
}
return _readableArrayTypeCache;
}
@@ -298,8 +300,8 @@
TypeMask _fixedArrayTypeCache;
TypeMask get fixedArrayType {
if (_fixedArrayTypeCache == null) {
- _fixedArrayTypeCache = new TypeMask.nonNullExact(
- helpers.jsFixedArrayClass, compiler.world);
+ _fixedArrayTypeCache =
+ new TypeMask.nonNullExact(helpers.jsFixedArrayClass, compiler.world);
}
return _fixedArrayTypeCache;
}
@@ -325,8 +327,7 @@
TypeMask _nonNullTypeCache;
TypeMask get nonNullType {
if (_nonNullTypeCache == null) {
- _nonNullTypeCache =
- compiler.typesTask.dynamicType.nonNullable();
+ _nonNullTypeCache = compiler.typesTask.dynamicType.nonNullable();
}
return _nonNullTypeCache;
}
@@ -472,8 +473,7 @@
// Checked mode helpers indexed by name.
Map<String, CheckedModeHelper> checkedModeHelperByName =
- new Map<String, CheckedModeHelper>.fromIterable(
- checkedModeHelpers,
+ new Map<String, CheckedModeHelper>.fromIterable(checkedModeHelpers,
key: (helper) => helper.name);
TypeVariableHandler typeVariableHandler;
@@ -512,9 +512,9 @@
final BackendImpacts impacts;
JavaScriptBackend(Compiler compiler,
- {bool generateSourceMap: true,
- bool useStartupEmitter: false,
- bool useNewSourceInfo: false})
+ {bool generateSourceMap: true,
+ bool useStartupEmitter: false,
+ bool useNewSourceInfo: false})
: namer = determineNamer(compiler),
oneShotInterceptors = new Map<jsAst.Name, Selector>(),
interceptedElements = new Map<String, Set<Element>>(),
@@ -522,12 +522,11 @@
rtiEncoder = new _RuntimeTypesEncoder(compiler),
specializedGetInterceptors = new Map<jsAst.Name, Set<ClassElement>>(),
annotations = new Annotations(compiler),
- this.sourceInformationStrategy =
- generateSourceMap
- ? (useNewSourceInfo
- ? new PositionSourceInformationStrategy()
- : const StartEndSourceInformationStrategy())
- : const JavaScriptSourceInformationStrategy(),
+ this.sourceInformationStrategy = generateSourceMap
+ ? (useNewSourceInfo
+ ? new PositionSourceInformationStrategy()
+ : const StartEndSourceInformationStrategy())
+ : const JavaScriptSourceInformationStrategy(),
helpers = new BackendHelpers(compiler),
impacts = new BackendImpacts(compiler),
super(compiler) {
@@ -543,9 +542,8 @@
impactTransformer = new JavaScriptImpactTransformer(this);
patchResolverTask = new PatchResolverTask(compiler);
functionCompiler = compiler.options.useCpsIr
- ? new CpsFunctionCompiler(
- compiler, this, sourceInformationStrategy)
- : new SsaFunctionCompiler(this, sourceInformationStrategy);
+ ? new CpsFunctionCompiler(compiler, this, sourceInformationStrategy)
+ : new SsaFunctionCompiler(this, sourceInformationStrategy);
serialization = new JavaScriptBackendSerialization(this);
}
@@ -569,11 +567,11 @@
if (isForeign(element)) {
return element;
}
- if (isJsInterop(element)) {
+ if (isJsInterop(element)) {
if (element.memberName == const PublicName('[]') ||
element.memberName == const PublicName('[]=')) {
- reporter.reportErrorMessage(element,
- MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED);
+ reporter.reportErrorMessage(
+ element, MessageKind.JS_INTEROP_INDEX_NOT_SUPPORTED);
}
return element;
}
@@ -586,15 +584,15 @@
bool isBackendLibrary(LibraryElement library) {
return library == helpers.interceptorsLibrary ||
- library == helpers.jsHelperLibrary;
+ library == helpers.jsHelperLibrary;
}
static Namer determineNamer(Compiler compiler) {
- return compiler.options.enableMinification ?
- compiler.options.useFrequencyNamer ?
- new FrequencyBasedNamer(compiler) :
- new MinifyNamer(compiler) :
- new Namer(compiler);
+ return compiler.options.enableMinification
+ ? compiler.options.useFrequencyNamer
+ ? new FrequencyBasedNamer(compiler)
+ : new MinifyNamer(compiler)
+ : new Namer(compiler);
}
/// The backend must *always* call this method when enqueuing an
@@ -618,8 +616,7 @@
}
bool _isValidBackendUse(Element element) {
- assert(invariant(element, element.isDeclaration,
- message: ""));
+ assert(invariant(element, element.isDeclaration, message: ""));
if (element == helpers.streamIteratorConstructor ||
element == helpers.compiler.symbolConstructor ||
element == helpers.compiler.symbolValidatedConstructor ||
@@ -629,20 +626,20 @@
// TODO(johnniwinther): These are valid but we could be more precise.
return true;
} else if (element.implementationLibrary.isPatch ||
- // Needed to detect deserialized injected elements, that is
- // element declared in patch files.
- (element.library.isPlatformLibrary &&
- element.sourcePosition.uri.path.contains(
- '_internal/js_runtime/lib/')) ||
- element.library == helpers.jsHelperLibrary ||
- element.library == helpers.interceptorsLibrary ||
- element.library == helpers.isolateHelperLibrary) {
+ // Needed to detect deserialized injected elements, that is
+ // element declared in patch files.
+ (element.library.isPlatformLibrary &&
+ element.sourcePosition.uri.path
+ .contains('_internal/js_runtime/lib/')) ||
+ element.library == helpers.jsHelperLibrary ||
+ element.library == helpers.interceptorsLibrary ||
+ element.library == helpers.isolateHelperLibrary) {
// TODO(johnniwinther): We should be more precise about these.
return true;
} else if (element == coreClasses.listClass ||
- element == helpers.mapLiteralClass ||
- element == coreClasses.functionClass ||
- element == coreClasses.stringClass) {
+ element == helpers.mapLiteralClass ||
+ element == coreClasses.functionClass ||
+ element == coreClasses.stringClass) {
// TODO(johnniwinther): Avoid these.
return true;
}
@@ -650,9 +647,9 @@
}
bool usedByBackend(Element element) {
- if (element.isParameter
- || element.isInitializingFormal
- || element.isField) {
+ if (element.isParameter ||
+ element.isInitializingFormal ||
+ element.isField) {
if (usedByBackend(element.enclosingElement)) return true;
}
return helpersUsed.contains(element.declaration);
@@ -665,8 +662,8 @@
}
if (element.isField) {
- if (Elements.isStaticOrTopLevel(element)
- && (element.isFinal || element.isConst)) {
+ if (Elements.isStaticOrTopLevel(element) &&
+ (element.isFinal || element.isConst)) {
return false;
}
}
@@ -775,23 +772,21 @@
* explicit receiver' optimization.
*/
bool isInterceptedMixinSelector(Selector selector, TypeMask mask) {
- Set<Element> elements = interceptedMixinElements.putIfAbsent(
- selector.name,
- () {
- Set<Element> elements = interceptedElements[selector.name];
- if (elements == null) return null;
- return elements
- .where((element) =>
- classesMixedIntoInterceptedClasses.contains(
- element.enclosingClass))
- .toSet();
- });
+ Set<Element> elements =
+ interceptedMixinElements.putIfAbsent(selector.name, () {
+ Set<Element> elements = interceptedElements[selector.name];
+ if (elements == null) return null;
+ return elements
+ .where((element) => classesMixedIntoInterceptedClasses
+ .contains(element.enclosingClass))
+ .toSet();
+ });
if (elements == null) return false;
if (elements.isEmpty) return false;
return elements.any((element) {
return selector.applies(element, compiler.world) &&
- (mask == null || mask.canHit(element, selector, compiler.world));
+ (mask == null || mask.canHit(element, selector, compiler.world));
});
}
@@ -799,12 +794,12 @@
/// and never exists at runtime.
bool isCompileTimeOnlyClass(ClassElement class_) {
return class_ == helpers.jsPositiveIntClass ||
- class_ == helpers.jsUInt32Class ||
- class_ == helpers.jsUInt31Class ||
- class_ == helpers.jsFixedArrayClass ||
- class_ == helpers.jsUnmodifiableArrayClass ||
- class_ == helpers.jsMutableArrayClass ||
- class_ == helpers.jsExtendableArrayClass;
+ class_ == helpers.jsUInt32Class ||
+ class_ == helpers.jsUInt31Class ||
+ class_ == helpers.jsFixedArrayClass ||
+ class_ == helpers.jsUnmodifiableArrayClass ||
+ class_ == helpers.jsMutableArrayClass ||
+ class_ == helpers.jsExtendableArrayClass;
}
/// Maps compile-time classes to their runtime class. The runtime class is
@@ -832,8 +827,8 @@
for (Element element in intercepted) {
ClassElement classElement = element.enclosingClass;
if (isCompileTimeOnlyClass(classElement)) continue;
- if (isNativeOrExtendsNative(classElement)
- || interceptedClasses.contains(classElement)) {
+ if (isNativeOrExtendsNative(classElement) ||
+ interceptedClasses.contains(classElement)) {
result.add(classElement);
}
if (classesMixedIntoInterceptedClasses.contains(classElement)) {
@@ -862,8 +857,7 @@
}
bool operatorEqHandlesNullArgument(FunctionElement operatorEqfunction) {
- return specialOperatorEqClasses.contains(
- operatorEqfunction.enclosingClass);
+ return specialOperatorEqClasses.contains(operatorEqfunction.enclosingClass);
}
void validateInterceptorImplementsAllObjectMethods(
@@ -875,13 +869,12 @@
Element interceptorMember = interceptorClass.lookupMember(member.name);
// Interceptors must override all Object methods due to calling convention
// differences.
- assert(invariant(
- interceptorMember,
+ assert(invariant(interceptorMember,
interceptorMember.enclosingClass == interceptorClass,
message:
- "Member ${member.name} not overridden in ${interceptorClass}. "
- "Found $interceptorMember from "
- "${interceptorMember.enclosingClass}."));
+ "Member ${member.name} not overridden in ${interceptorClass}. "
+ "Found $interceptorMember from "
+ "${interceptorMember.enclosingClass}."));
});
}
@@ -892,8 +885,7 @@
cls.forEachMember((ClassElement classElement, Element member) {
if (member.name == Identifiers.call) {
reporter.reportErrorMessage(
- member,
- MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS);
+ member, MessageKind.CALL_NOT_SUPPORTED_ON_NATIVE_CLASS);
return;
}
if (member.isSynthesized) return;
@@ -902,8 +894,7 @@
Set<Element> set = interceptedElements.putIfAbsent(
member.name, () => new Set<Element>());
set.add(member);
- },
- includeSuperAndInjectedMembers: true);
+ }, includeSuperAndInjectedMembers: true);
// Walk superclass chain to find mixins.
for (; cls != null; cls = cls.superclass) {
@@ -915,21 +906,18 @@
}
}
- void addInterceptors(ClassElement cls,
- Enqueuer enqueuer,
- Registry registry) {
+ void addInterceptors(ClassElement cls, Enqueuer enqueuer, Registry registry) {
if (enqueuer.isResolutionQueue) {
_interceptedClasses.add(helpers.jsInterceptorClass);
_interceptedClasses.add(cls);
cls.ensureResolved(resolution);
cls.forEachMember((ClassElement classElement, Element member) {
- // All methods on [Object] are shadowed by [Interceptor].
- if (classElement == coreClasses.objectClass) return;
- Set<Element> set = interceptedElements.putIfAbsent(
- member.name, () => new Set<Element>());
- set.add(member);
- },
- includeSuperAndInjectedMembers: true);
+ // All methods on [Object] are shadowed by [Interceptor].
+ if (classElement == coreClasses.objectClass) return;
+ Set<Element> set = interceptedElements.putIfAbsent(
+ member.name, () => new Set<Element>());
+ set.add(member);
+ }, includeSuperAndInjectedMembers: true);
}
enqueueClass(enqueuer, cls, registry);
}
@@ -953,8 +941,7 @@
void registerCompileTimeConstant(ConstantValue constant, Registry registry) {
registerCompileTimeConstantInternal(constant, registry);
- if (!registry.isForResolution &&
- lookupMapAnalysis.isLookupMap(constant)) {
+ if (!registry.isForResolution && lookupMapAnalysis.isLookupMap(constant)) {
// Note: internally, this registration will temporarily remove the
// constant dependencies and add them later on-demand.
lookupMapAnalysis.registerLookupMapReference(constant);
@@ -969,8 +956,8 @@
constants.addCompileTimeConstantForEmission(constant);
}
- void registerCompileTimeConstantInternal(ConstantValue constant,
- Registry registry) {
+ void registerCompileTimeConstantInternal(
+ ConstantValue constant, Registry registry) {
DartType type = constant.getType(compiler.coreTypes);
registerInstantiatedConstantType(type, registry);
@@ -994,51 +981,46 @@
if (type is InterfaceType) {
registry.registerInstantiation(instantiatedType);
if (!type.treatAsRaw && classNeedsRti(type.element)) {
- registry.registerStaticUse(
- new StaticUse.staticInvoke(
- // TODO(johnniwinther): Find the right [CallStructure].
- helpers.setRuntimeTypeInfo, null));
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ // TODO(johnniwinther): Find the right [CallStructure].
+ helpers.setRuntimeTypeInfo,
+ null));
}
if (type.element == typeImplementation) {
// If we use a type literal in a constant, the compile time
// constant emitter will generate a call to the createRuntimeType
// helper so we register a use of that.
- registry.registerStaticUse(
- new StaticUse.staticInvoke(
- // TODO(johnniwinther): Find the right [CallStructure].
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ // TODO(johnniwinther): Find the right [CallStructure].
- helpers.createRuntimeType, null));
+ helpers.createRuntimeType,
+ null));
}
}
}
void registerMetadataConstant(MetadataAnnotation metadata,
- Element annotatedElement,
- Registry registry) {
+ Element annotatedElement, Registry registry) {
assert(registry.isForResolution);
ConstantValue constant = constants.getConstantValueForMetadata(metadata);
registerCompileTimeConstant(constant, registry);
metadataConstants.add(new Dependency(constant, annotatedElement));
}
- void registerInstantiatedClass(ClassElement cls,
- Enqueuer enqueuer,
- Registry registry) {
+ void registerInstantiatedClass(
+ ClassElement cls, Enqueuer enqueuer, Registry registry) {
_processClass(cls, enqueuer, registry);
}
- void registerImplementedClass(ClassElement cls,
- Enqueuer enqueuer,
- Registry registry) {
+ void registerImplementedClass(
+ ClassElement cls, Enqueuer enqueuer, Registry registry) {
_processClass(cls, enqueuer, registry);
}
- void _processClass(ClassElement cls,
- Enqueuer enqueuer,
- Registry registry) {
+ void _processClass(ClassElement cls, Enqueuer enqueuer, Registry registry) {
if (!cls.typeVariables.isEmpty) {
- typeVariableHandler.registerClassWithTypeVariables(cls, enqueuer,
- registry);
+ typeVariableHandler.registerClassWithTypeVariables(
+ cls, enqueuer, registry);
}
// Register any helper that will be needed by the backend.
@@ -1050,7 +1032,7 @@
// `iae` helper directly.
enqueue(enqueuer, helpers.throwIllegalArgumentException, registry);
} else if (cls == coreClasses.listClass ||
- cls == coreClasses.stringClass) {
+ cls == coreClasses.stringClass) {
// The backend will try to optimize array and string access and use the
// `ioore` and `iae` helpers directly.
enqueue(enqueuer, helpers.throwIndexOutOfRangeException, registry);
@@ -1070,8 +1052,8 @@
enqueueClass(enqueuer, helpers.boundClosureClass, registry);
} else if (isNativeOrExtendsNative(cls)) {
enqueue(enqueuer, helpers.getNativeInterceptorMethod, registry);
- enqueueClass(enqueuer, helpers.jsInterceptorClass,
- compiler.globalDependencies);
+ enqueueClass(
+ enqueuer, helpers.jsInterceptorClass, compiler.globalDependencies);
enqueueClass(enqueuer, helpers.jsJavaScriptObjectClass, registry);
enqueueClass(enqueuer, helpers.jsPlainJavaScriptObjectClass, registry);
enqueueClass(enqueuer, helpers.jsJavaScriptFunctionClass, registry);
@@ -1085,7 +1067,7 @@
ConstructorElement ctor = implementation.lookupConstructor(name);
if (ctor == null ||
(Name.isPrivateName(name) &&
- ctor.library != helpers.mapLiteralClass.library)) {
+ ctor.library != helpers.mapLiteralClass.library)) {
reporter.internalError(
helpers.mapLiteralClass,
"Map literal class ${helpers.mapLiteralClass} missing "
@@ -1100,7 +1082,8 @@
ClassElement implementation = cls.implementation;
Element element = implementation.lookupLocalMember(name);
if (element == null || !element.isFunction || !element.isStatic) {
- reporter.internalError(helpers.mapLiteralClass,
+ reporter.internalError(
+ helpers.mapLiteralClass,
"Map literal class ${helpers.mapLiteralClass} missing "
"'$name' static member function");
}
@@ -1120,14 +1103,13 @@
if (cls == helpers.closureClass) {
enqueue(enqueuer, helpers.closureFromTearOff, registry);
}
- if (cls == coreClasses.stringClass ||
- cls == helpers.jsStringClass) {
+ if (cls == coreClasses.stringClass || cls == helpers.jsStringClass) {
addInterceptors(helpers.jsStringClass, enqueuer, registry);
} else if (cls == coreClasses.listClass ||
- cls == helpers.jsArrayClass ||
- cls == helpers.jsFixedArrayClass ||
- cls == helpers.jsExtendableArrayClass ||
- cls == helpers.jsUnmodifiableArrayClass) {
+ cls == helpers.jsArrayClass ||
+ cls == helpers.jsFixedArrayClass ||
+ cls == helpers.jsExtendableArrayClass ||
+ cls == helpers.jsUnmodifiableArrayClass) {
addInterceptors(helpers.jsArrayClass, enqueuer, registry);
addInterceptors(helpers.jsMutableArrayClass, enqueuer, registry);
addInterceptors(helpers.jsFixedArrayClass, enqueuer, registry);
@@ -1137,25 +1119,20 @@
enqueueInResolution(helpers.jsArrayTypedConstructor, registry);
enqueueInResolution(helpers.setRuntimeTypeInfo, registry);
enqueueInResolution(helpers.getTypeArgumentByIndex, registry);
- } else if (cls == coreClasses.intClass ||
- cls == helpers.jsIntClass) {
+ } else if (cls == coreClasses.intClass || cls == helpers.jsIntClass) {
addInterceptors(helpers.jsIntClass, enqueuer, registry);
addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry);
addInterceptors(helpers.jsUInt32Class, enqueuer, registry);
addInterceptors(helpers.jsUInt31Class, enqueuer, registry);
addInterceptors(helpers.jsNumberClass, enqueuer, registry);
- } else if (cls == coreClasses.doubleClass ||
- cls == helpers.jsDoubleClass) {
+ } else if (cls == coreClasses.doubleClass || cls == helpers.jsDoubleClass) {
addInterceptors(helpers.jsDoubleClass, enqueuer, registry);
addInterceptors(helpers.jsNumberClass, enqueuer, registry);
- } else if (cls == coreClasses.boolClass ||
- cls == helpers.jsBoolClass) {
+ } else if (cls == coreClasses.boolClass || cls == helpers.jsBoolClass) {
addInterceptors(helpers.jsBoolClass, enqueuer, registry);
- } else if (cls == coreClasses.nullClass ||
- cls == helpers.jsNullClass) {
+ } else if (cls == coreClasses.nullClass || cls == helpers.jsNullClass) {
addInterceptors(helpers.jsNullClass, enqueuer, registry);
- } else if (cls == coreClasses.numClass ||
- cls == helpers.jsNumberClass) {
+ } else if (cls == coreClasses.numClass || cls == helpers.jsNumberClass) {
addInterceptors(helpers.jsIntClass, enqueuer, registry);
addInterceptors(helpers.jsPositiveIntClass, enqueuer, registry);
addInterceptors(helpers.jsUInt32Class, enqueuer, registry);
@@ -1167,7 +1144,8 @@
} else if (cls == helpers.jsPlainJavaScriptObjectClass) {
addInterceptors(helpers.jsPlainJavaScriptObjectClass, enqueuer, registry);
} else if (cls == helpers.jsUnknownJavaScriptObjectClass) {
- addInterceptors(helpers.jsUnknownJavaScriptObjectClass, enqueuer, registry);
+ addInterceptors(
+ helpers.jsUnknownJavaScriptObjectClass, enqueuer, registry);
} else if (cls == helpers.jsJavaScriptFunctionClass) {
addInterceptors(helpers.jsJavaScriptFunctionClass, enqueuer, registry);
} else if (isNativeOrExtendsNative(cls)) {
@@ -1185,13 +1163,12 @@
}
}
- void registerInstantiatedType(InterfaceType type,
- Enqueuer enqueuer,
- Registry registry,
- {bool mirrorUsage: false}) {
+ void registerInstantiatedType(
+ InterfaceType type, Enqueuer enqueuer, Registry registry,
+ {bool mirrorUsage: false}) {
lookupMapAnalysis.registerInstantiatedType(type, registry);
- super.registerInstantiatedType(
- type, enqueuer, registry, mirrorUsage: mirrorUsage);
+ super.registerInstantiatedType(type, enqueuer, registry,
+ mirrorUsage: mirrorUsage);
}
void registerUseInterceptor(Enqueuer enqueuer) {
@@ -1227,7 +1204,8 @@
if (TRACE_CALLS) {
traceHelper = TRACE_METHOD == 'console'
- ? helpers.consoleTraceHelper : helpers.postTraceHelper;
+ ? helpers.consoleTraceHelper
+ : helpers.postTraceHelper;
assert(traceHelper != null);
enqueueInResolution(traceHelper, registry);
}
@@ -1248,24 +1226,18 @@
void registerGetRuntimeTypeArgument(Registry registry) {
enqueueImpact(
- compiler.enqueuer.resolution,
- impacts.getRuntimeTypeArgument,
- registry);
+ compiler.enqueuer.resolution, impacts.getRuntimeTypeArgument, registry);
}
void registerCallMethodWithFreeTypeVariables(
- Element callMethod,
- Enqueuer enqueuer,
- Registry registry) {
+ Element callMethod, Enqueuer enqueuer, Registry registry) {
if (enqueuer.isResolutionQueue || methodNeedsRti(callMethod)) {
registerComputeSignature(enqueuer, registry);
}
}
void registerClosureWithFreeTypeVariables(
- Element closure,
- Enqueuer enqueuer,
- Registry registry) {
+ Element closure, Enqueuer enqueuer, Registry registry) {
if (enqueuer.isResolutionQueue || methodNeedsRti(closure)) {
registerComputeSignature(enqueuer, registry);
}
@@ -1284,9 +1256,7 @@
void registerGetOfStaticFunction(Enqueuer enqueuer) {
helpers.closureClass.ensureResolved(resolution);
registerInstantiatedType(
- helpers.closureClass.rawType,
- enqueuer,
- compiler.globalDependencies);
+ helpers.closureClass.rawType, enqueuer, compiler.globalDependencies);
}
void registerComputeSignature(Enqueuer enqueuer, Registry registry) {
@@ -1304,8 +1274,8 @@
enqueueClass(enqueuer, coreClasses.listClass, registry);
}
- void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
- DartType bound) {
+ void registerTypeVariableBoundsSubtypeCheck(
+ DartType typeArgument, DartType bound) {
rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
}
@@ -1321,10 +1291,8 @@
}
/// Called when resolving a call to a foreign function.
- void registerForeignCall(Send node,
- Element element,
- CallStructure callStructure,
- ForeignResolver resolver) {
+ void registerForeignCall(Send node, Element element,
+ CallStructure callStructure, ForeignResolver resolver) {
native.NativeResolutionEnqueuer nativeEnqueuer =
compiler.enqueuer.resolution.nativeEnqueuer;
if (element.name == 'JS') {
@@ -1349,15 +1317,13 @@
}
}
reporter.reportErrorMessage(
- node,
- MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
+ node, MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
}
}
void enableNoSuchMethod(Enqueuer world) {
enqueue(world, helpers.createInvocationMirror, compiler.globalDependencies);
- world.registerDynamicUse(
- new DynamicUse(Selectors.noSuchMethod_, null));
+ world.registerDynamicUse(new DynamicUse(Selectors.noSuchMethod_, null));
}
void enableIsolateSupport(Enqueuer enqueuer) {
@@ -1375,7 +1341,6 @@
new StaticUse.staticTearOff(compiler.mainFunction));
}
if (enqueuer.isResolutionQueue) {
-
void enqueue(Element element) {
enqueuer.addToWorkList(element);
compiler.globalDependencies.registerDependency(element);
@@ -1396,19 +1361,19 @@
}
bool isComplexNoSuchMethod(FunctionElement element) =>
- noSuchMethodRegistry.isComplex(element);
+ noSuchMethodRegistry.isComplex(element);
bool isDefaultEqualityImplementation(Element element) {
assert(element.name == '==');
ClassElement classElement = element.enclosingClass;
- return classElement == coreClasses.objectClass
- || classElement == helpers.jsInterceptorClass
- || classElement == helpers.jsNullClass;
+ return classElement == coreClasses.objectClass ||
+ classElement == helpers.jsInterceptorClass ||
+ classElement == helpers.jsNullClass;
}
bool methodNeedsRti(FunctionElement function) {
return rti.methodsNeedingRti.contains(function) ||
- compiler.enabledRuntimeType;
+ compiler.enabledRuntimeType;
}
/// Enqueue [e] in [enqueuer].
@@ -1459,9 +1424,8 @@
registerInstantiatedType(type, enqueuer, registry);
}
- void enqueueImpact(Enqueuer enqueuer,
- BackendImpact impact,
- Registry registry) {
+ void enqueueImpact(
+ Enqueuer enqueuer, BackendImpact impact, Registry registry) {
for (Element staticUse in impact.staticUses) {
enqueue(enqueuer, staticUse, registry);
}
@@ -1502,17 +1466,16 @@
// variables. For instance variables, we may need to generate
// the checked setter.
if (Elements.isStaticOrTopLevel(element)) {
- return impactTransformer.transformCodegenImpact(
- work.registry.worldImpact);
+ return impactTransformer
+ .transformCodegenImpact(work.registry.worldImpact);
}
} else {
// If the constant-handler was not able to produce a result we have to
// go through the builder (below) to generate the lazy initializer for
// the static variable.
// We also need to register the use of the cyclic-error helper.
- compiler.enqueuer.codegen.registerStaticUse(
- new StaticUse.staticInvoke(
- helpers.cyclicThrowHelper, CallStructure.ONE_ARG));
+ compiler.enqueuer.codegen.registerStaticUse(new StaticUse.staticInvoke(
+ helpers.cyclicThrowHelper, CallStructure.ONE_ARG));
}
}
@@ -1542,7 +1505,8 @@
}
// Native classes inherit from Interceptor.
return isNative(element)
- ? helpers.jsInterceptorClass : coreClasses.objectClass;
+ ? helpers.jsInterceptorClass
+ : coreClasses.objectClass;
}
/**
@@ -1562,11 +1526,12 @@
if (totalMethodCount != preMirrorsMethodCount) {
int mirrorCount = totalMethodCount - preMirrorsMethodCount;
double percentage = (mirrorCount / totalMethodCount) * 100;
- DiagnosticMessage hint = reporter.createMessage(
- compiler.mainApp, MessageKind.MIRROR_BLOAT,
- {'count': mirrorCount,
- 'total': totalMethodCount,
- 'percentage': percentage.round()});
+ DiagnosticMessage hint =
+ reporter.createMessage(compiler.mainApp, MessageKind.MIRROR_BLOAT, {
+ 'count': mirrorCount,
+ 'total': totalMethodCount,
+ 'percentage': percentage.round()
+ });
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
for (LibraryElement library in compiler.libraryLoader.libraries) {
@@ -1576,8 +1541,8 @@
if (importedLibrary != compiler.mirrorsLibrary) continue;
MessageKind kind =
compiler.mirrorUsageAnalyzerTask.hasMirrorUsage(library)
- ? MessageKind.MIRROR_IMPORT
- : MessageKind.MIRROR_IMPORT_NO_USAGE;
+ ? MessageKind.MIRROR_IMPORT
+ : MessageKind.MIRROR_IMPORT_NO_USAGE;
reporter.withCurrentElement(library, () {
infos.add(reporter.createMessage(import, kind));
});
@@ -1604,8 +1569,8 @@
* backend with implementation types (JSInt, JSString, ...).
*/
CheckedModeHelper getCheckedModeHelper(DartType type, {bool typeCast}) {
- return getCheckedModeHelperInternal(
- type, typeCast: typeCast, nativeCheckOnly: false);
+ return getCheckedModeHelperInternal(type,
+ typeCast: typeCast, nativeCheckOnly: false);
}
/**
@@ -1614,8 +1579,8 @@
* [type], [:null:] is returned.
*/
CheckedModeHelper getNativeCheckedModeHelper(DartType type, {bool typeCast}) {
- return getCheckedModeHelperInternal(
- type, typeCast: typeCast, nativeCheckOnly: true);
+ return getCheckedModeHelperInternal(type,
+ typeCast: typeCast, nativeCheckOnly: true);
}
/**
@@ -1623,8 +1588,7 @@
* [nativeCheckOnly] is [:true:], only names for native helpers are returned.
*/
CheckedModeHelper getCheckedModeHelperInternal(DartType type,
- {bool typeCast,
- bool nativeCheckOnly}) {
+ {bool typeCast, bool nativeCheckOnly}) {
String name = getCheckedModeHelperNameInternal(type,
typeCast: typeCast, nativeCheckOnly: nativeCheckOnly);
if (name == null) return null;
@@ -1634,8 +1598,7 @@
}
String getCheckedModeHelperNameInternal(DartType type,
- {bool typeCast,
- bool nativeCheckOnly}) {
+ {bool typeCast, bool nativeCheckOnly}) {
assert(type.kind != TypeKind.TYPEDEF);
if (type.isMalformed) {
// The same error is thrown for type test and type cast of a malformed
@@ -1643,8 +1606,8 @@
return 'checkMalformedType';
}
Element element = type.element;
- bool nativeCheck = nativeCheckOnly ||
- emitter.nativeEmitter.requiresNativeIsCheck(element);
+ bool nativeCheck =
+ nativeCheckOnly || emitter.nativeEmitter.requiresNativeIsCheck(element);
// TODO(13955), TODO(9731). The test for non-primitive types should use an
// interceptor. The interceptor should be an argument to HTypeConversion so
@@ -1656,38 +1619,28 @@
if (nativeCheckOnly) return null;
return 'voidTypeCheck';
} else if (element == helpers.jsStringClass ||
- element == coreClasses.stringClass) {
+ element == coreClasses.stringClass) {
if (nativeCheckOnly) return null;
- return typeCast
- ? 'stringTypeCast'
- : 'stringTypeCheck';
+ return typeCast ? 'stringTypeCast' : 'stringTypeCheck';
} else if (element == helpers.jsDoubleClass ||
- element == coreClasses.doubleClass) {
+ element == coreClasses.doubleClass) {
if (nativeCheckOnly) return null;
- return typeCast
- ? 'doubleTypeCast'
- : 'doubleTypeCheck';
+ return typeCast ? 'doubleTypeCast' : 'doubleTypeCheck';
} else if (element == helpers.jsNumberClass ||
- element == coreClasses.numClass) {
+ element == coreClasses.numClass) {
if (nativeCheckOnly) return null;
- return typeCast
- ? 'numTypeCast'
- : 'numTypeCheck';
+ return typeCast ? 'numTypeCast' : 'numTypeCheck';
} else if (element == helpers.jsBoolClass ||
- element == coreClasses.boolClass) {
+ element == coreClasses.boolClass) {
if (nativeCheckOnly) return null;
- return typeCast
- ? 'boolTypeCast'
- : 'boolTypeCheck';
+ return typeCast ? 'boolTypeCast' : 'boolTypeCheck';
} else if (element == helpers.jsIntClass ||
- element == coreClasses.intClass ||
- element == helpers.jsUInt32Class ||
- element == helpers.jsUInt31Class ||
- element == helpers.jsPositiveIntClass) {
+ element == coreClasses.intClass ||
+ element == helpers.jsUInt32Class ||
+ element == helpers.jsUInt31Class ||
+ element == helpers.jsPositiveIntClass) {
if (nativeCheckOnly) return null;
- return typeCast
- ? 'intTypeCast'
- : 'intTypeCheck';
+ return typeCast ? 'intTypeCast' : 'intTypeCheck';
} else if (Elements.isNumberOrStringSupertype(element, compiler)) {
if (nativeCheck) {
return typeCast
@@ -1695,8 +1648,8 @@
: 'numberOrStringSuperNativeTypeCheck';
} else {
return typeCast
- ? 'numberOrStringSuperTypeCast'
- : 'numberOrStringSuperTypeCheck';
+ ? 'numberOrStringSuperTypeCast'
+ : 'numberOrStringSuperTypeCheck';
}
} else if (Elements.isStringOnlySupertype(element, compiler)) {
if (nativeCheck) {
@@ -1704,17 +1657,13 @@
? 'stringSuperNativeTypeCast'
: 'stringSuperNativeTypeCheck';
} else {
- return typeCast
- ? 'stringSuperTypeCast'
- : 'stringSuperTypeCheck';
+ return typeCast ? 'stringSuperTypeCast' : 'stringSuperTypeCheck';
}
} else if ((element == coreClasses.listClass ||
- element == helpers.jsArrayClass) &&
- type.treatAsRaw) {
+ element == helpers.jsArrayClass) &&
+ type.treatAsRaw) {
if (nativeCheckOnly) return null;
- return typeCast
- ? 'listTypeCast'
- : 'listTypeCheck';
+ return typeCast ? 'listTypeCast' : 'listTypeCheck';
} else {
if (Elements.isListSupertype(element, compiler)) {
if (nativeCheck) {
@@ -1722,15 +1671,11 @@
? 'listSuperNativeTypeCast'
: 'listSuperNativeTypeCheck';
} else {
- return typeCast
- ? 'listSuperTypeCast'
- : 'listSuperTypeCheck';
+ return typeCast ? 'listSuperTypeCast' : 'listSuperTypeCheck';
}
} else {
if (type.isInterfaceType && !type.treatAsRaw) {
- return typeCast
- ? 'subtypeCast'
- : 'assertSubtype';
+ return typeCast ? 'subtypeCast' : 'assertSubtype';
} else if (type.isTypeVariable) {
return typeCast
? 'subtypeOfRuntimeTypeCast'
@@ -1741,13 +1686,9 @@
if (nativeCheck) {
// TODO(karlklose): can we get rid of this branch when we use
// interceptors?
- return typeCast
- ? 'interceptedTypeCast'
- : 'interceptedTypeCheck';
+ return typeCast ? 'interceptedTypeCast' : 'interceptedTypeCheck';
} else {
- return typeCast
- ? 'propertyTypeCast'
- : 'propertyTypeCheck';
+ return typeCast ? 'propertyTypeCast' : 'propertyTypeCheck';
}
}
}
@@ -1831,8 +1772,8 @@
// TODO(sigurdm): Create a function registerLoadLibraryAccess.
if (compiler.loadLibraryFunction == null) {
compiler.loadLibraryFunction = helpers.loadLibraryWrapper;
- enqueueInResolution(compiler.loadLibraryFunction,
- compiler.globalDependencies);
+ enqueueInResolution(
+ compiler.loadLibraryFunction, compiler.globalDependencies);
}
} else if (element == helpers.requiresPreambleMarker) {
requiresPreamble = true;
@@ -1849,8 +1790,7 @@
}
/// Called when [:new Symbol(...):] is seen.
- void registerNewSymbol(Registry registry) {
- }
+ void registerNewSymbol(Registry registry) {}
/// Should [element] (a getter) that would normally not be generated due to
/// treeshaking be retained for reflection?
@@ -1930,13 +1870,13 @@
implementationClasses[coreClasses.nullClass] = helpers.jsNullClass;
// These methods are overwritten with generated versions.
- inlineCache.markAsNonInlinable(
- helpers.getInterceptorMethod, insideLoop: true);
+ inlineCache.markAsNonInlinable(helpers.getInterceptorMethod,
+ insideLoop: true);
specialOperatorEqClasses
- ..add(coreClasses.objectClass)
- ..add(helpers.jsInterceptorClass)
- ..add(helpers.jsNullClass);
+ ..add(coreClasses.objectClass)
+ ..add(helpers.jsInterceptorClass)
+ ..add(helpers.jsNullClass);
validateInterceptorImplementsAllObjectMethods(helpers.jsInterceptorClass);
// The null-interceptor must also implement *all* methods.
@@ -1945,9 +1885,8 @@
return new Future.value();
}
- void registerMirrorUsage(Set<String> symbols,
- Set<Element> targets,
- Set<Element> metaTargets) {
+ void registerMirrorUsage(
+ Set<String> symbols, Set<Element> targets, Set<Element> metaTargets) {
if (symbols == null && targets == null && metaTargets == null) {
// The user didn't specify anything, or there are imports of
// 'dart:mirrors' without @MirrorsUsed.
@@ -1992,8 +1931,8 @@
*/
bool requiredByMirrorSystem(Element element) {
return hasInsufficientMirrorsUsed && isTreeShakingDisabled ||
- matchesMirrorsMetaTarget(element) ||
- targetsUsed.contains(element);
+ matchesMirrorsMetaTarget(element) ||
+ targetsUsed.contains(element);
}
/**
@@ -2005,9 +1944,9 @@
Element enclosing = recursive ? element.enclosingElement : null;
return hasInsufficientMirrorsUsed ||
- matchesMirrorsMetaTarget(element) ||
- targetsUsed.contains(element) ||
- (enclosing != null && referencedFromMirrorSystem(enclosing));
+ matchesMirrorsMetaTarget(element) ||
+ targetsUsed.contains(element) ||
+ (enclosing != null && referencedFromMirrorSystem(enclosing));
}
/**
@@ -2180,8 +2119,8 @@
_membersNeededForReflection.add(globalizedElement);
}
- jsAst.Call generateIsJsIndexableCall(jsAst.Expression use1,
- jsAst.Expression use2) {
+ jsAst.Call generateIsJsIndexableCall(
+ jsAst.Expression use1, jsAst.Expression use2) {
String dispatchPropertyName = embeddedNames.DISPATCH_PROPERTY_NAME;
jsAst.Expression dispatchProperty =
emitter.generateEmbeddedGlobalAccess(dispatchPropertyName);
@@ -2202,8 +2141,7 @@
// Just checking for [:TypedData:] is not sufficient, as it is an
// abstract class any user-defined class can implement. So we also
// check for the interface [JavaScriptIndexingBehavior].
- return
- compiler.typedDataClass != null &&
+ return compiler.typedDataClass != null &&
compiler.world.isInstantiated(compiler.typedDataClass) &&
mask.satisfies(compiler.typedDataClass, compiler.world) &&
mask.satisfies(helpers.jsIndexingBehaviorInterface, compiler.world);
@@ -2214,13 +2152,14 @@
!type1.intersection(type2, compiler.world).isEmpty;
// TODO(herhut): Maybe cache the TypeMask for typedDataClass and
// jsIndexingBehaviourInterface.
- return
- compiler.typedDataClass != null &&
+ return compiler.typedDataClass != null &&
compiler.world.isInstantiated(compiler.typedDataClass) &&
intersects(mask,
new TypeMask.subtype(compiler.typedDataClass, compiler.world)) &&
- intersects(mask,
- new TypeMask.subtype(helpers.jsIndexingBehaviorInterface, compiler.world));
+ intersects(
+ mask,
+ new TypeMask.subtype(
+ helpers.jsIndexingBehaviorInterface, compiler.world));
}
/// Returns all static fields that are referenced through [targetsUsed].
@@ -2260,7 +2199,7 @@
noSuchMethodRegistry.onQueueEmpty();
if (!enabledNoSuchMethod &&
(noSuchMethodRegistry.hasThrowingNoSuchMethod ||
- noSuchMethodRegistry.hasComplexNoSuchMethod)) {
+ noSuchMethodRegistry.hasComplexNoSuchMethod)) {
enableNoSuchMethod(enqueuer);
enabledNoSuchMethod = true;
}
@@ -2294,8 +2233,7 @@
compiler.libraryLoader.libraries.forEach(retainMetadataOf);
for (Dependency dependency in metadataConstants) {
- registerCompileTimeConstant(
- dependency.constant,
+ registerCompileTimeConstant(dependency.constant,
new EagerRegistry('EagerRegistry for ${dependency}', enqueuer));
}
if (!enqueuer.isResolutionQueue) {
@@ -2343,53 +2281,46 @@
hasForceInline = true;
if (VERBOSE_OPTIMIZER_HINTS) {
reporter.reportHintMessage(
- element,
- MessageKind.GENERIC,
- {'text': "Must inline"});
+ element, MessageKind.GENERIC, {'text': "Must inline"});
}
inlineCache.markAsMustInline(element);
} else if (cls == helpers.noInlineClass) {
hasNoInline = true;
if (VERBOSE_OPTIMIZER_HINTS) {
reporter.reportHintMessage(
- element,
- MessageKind.GENERIC,
- {'text': "Cannot inline"});
+ element, MessageKind.GENERIC, {'text': "Cannot inline"});
}
inlineCache.markAsNonInlinable(element);
} else if (cls == helpers.noThrowsClass) {
hasNoThrows = true;
if (!Elements.isStaticOrTopLevelFunction(element) &&
!element.isFactoryConstructor) {
- reporter.internalError(element,
+ reporter.internalError(
+ element,
"@NoThrows() is currently limited to top-level"
" or static functions and factory constructors.");
}
if (VERBOSE_OPTIMIZER_HINTS) {
reporter.reportHintMessage(
- element,
- MessageKind.GENERIC,
- {'text': "Cannot throw"});
+ element, MessageKind.GENERIC, {'text': "Cannot throw"});
}
compiler.world.registerCannotThrow(element);
} else if (cls == helpers.noSideEffectsClass) {
hasNoSideEffects = true;
if (VERBOSE_OPTIMIZER_HINTS) {
reporter.reportHintMessage(
- element,
- MessageKind.GENERIC,
- {'text': "Has no side effects"});
+ element, MessageKind.GENERIC, {'text': "Has no side effects"});
}
compiler.world.registerSideEffectsFree(element);
}
}
if (hasForceInline && hasNoInline) {
- reporter.internalError(element,
- "@ForceInline() must not be used with @NoInline.");
+ reporter.internalError(
+ element, "@ForceInline() must not be used with @NoInline.");
}
if (hasNoThrows && !hasNoInline) {
- reporter.internalError(element,
- "@NoThrows() should always be combined with @NoInline.");
+ reporter.internalError(
+ element, "@NoThrows() should always be combined with @NoInline.");
}
if (hasNoSideEffects && !hasNoInline) {
reporter.internalError(element,
@@ -2399,6 +2330,7 @@
compiler.enabledInvokeOn = true;
}
}
+
/*
CodeBuffer codeOf(Element element) {
return generatedCode.containsKey(element)
@@ -2450,66 +2382,55 @@
bool enableCodegenWithErrorsIfSupported(Spannable node) {
if (compiler.options.useCpsIr) {
// TODO(25747): Support code generation with compile-time errors.
- reporter.reportHintMessage(
- node,
- MessageKind.GENERIC,
- {'text': "Generation of code with compile time errors is currently "
- "not supported with the CPS IR."});
+ reporter.reportHintMessage(node, MessageKind.GENERIC, {
+ 'text': "Generation of code with compile time errors is currently "
+ "not supported with the CPS IR."
+ });
return false;
}
return true;
}
- jsAst.Expression rewriteAsync(FunctionElement element,
- jsAst.Expression code) {
+ jsAst.Expression rewriteAsync(
+ FunctionElement element, jsAst.Expression code) {
AsyncRewriterBase rewriter = null;
jsAst.Name name = namer.methodPropertyName(element);
switch (element.asyncMarker) {
case AsyncMarker.ASYNC:
- rewriter = new AsyncRewriter(
- reporter,
- element,
- asyncHelper:
- emitter.staticFunctionAccess(helpers.asyncHelper),
- wrapBody:
- emitter.staticFunctionAccess(helpers.wrapBody),
- newCompleter: emitter.staticFunctionAccess(
- helpers.syncCompleterConstructor),
+ rewriter = new AsyncRewriter(reporter, element,
+ asyncHelper: emitter.staticFunctionAccess(helpers.asyncHelper),
+ wrapBody: emitter.staticFunctionAccess(helpers.wrapBody),
+ newCompleter:
+ emitter.staticFunctionAccess(helpers.syncCompleterConstructor),
safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
bodyName: namer.deriveAsyncBodyName(name));
break;
case AsyncMarker.SYNC_STAR:
- rewriter = new SyncStarRewriter(
- reporter,
- element,
- endOfIteration: emitter.staticFunctionAccess(
- helpers.endOfIteration),
- newIterable: emitter.staticFunctionAccess(
- helpers.syncStarIterableConstructor),
- yieldStarExpression: emitter.staticFunctionAccess(
- helpers.yieldStar),
- uncaughtErrorExpression: emitter.staticFunctionAccess(
- helpers.syncStarUncaughtError),
+ rewriter = new SyncStarRewriter(reporter, element,
+ endOfIteration:
+ emitter.staticFunctionAccess(helpers.endOfIteration),
+ newIterable: emitter
+ .staticFunctionAccess(helpers.syncStarIterableConstructor),
+ yieldStarExpression:
+ emitter.staticFunctionAccess(helpers.yieldStar),
+ uncaughtErrorExpression:
+ emitter.staticFunctionAccess(helpers.syncStarUncaughtError),
safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
bodyName: namer.deriveAsyncBodyName(name));
- break;
+ break;
case AsyncMarker.ASYNC_STAR:
- rewriter = new AsyncStarRewriter(
- reporter,
- element,
- asyncStarHelper: emitter.staticFunctionAccess(
- helpers.asyncStarHelper),
- streamOfController: emitter.staticFunctionAccess(
- helpers.streamOfController),
- wrapBody:
- emitter.staticFunctionAccess(helpers.wrapBody),
- newController: emitter.staticFunctionAccess(
- helpers.asyncStarControllerConstructor),
+ rewriter = new AsyncStarRewriter(reporter, element,
+ asyncStarHelper:
+ emitter.staticFunctionAccess(helpers.asyncStarHelper),
+ streamOfController:
+ emitter.staticFunctionAccess(helpers.streamOfController),
+ wrapBody: emitter.staticFunctionAccess(helpers.wrapBody),
+ newController: emitter
+ .staticFunctionAccess(helpers.asyncStarControllerConstructor),
safeVariableName: namer.safeVariablePrefixForAsyncRewrite,
- yieldExpression: emitter.staticFunctionAccess(
- helpers.yieldSingle),
- yieldStarExpression: emitter.staticFunctionAccess(
- helpers.yieldStar),
+ yieldExpression: emitter.staticFunctionAccess(helpers.yieldSingle),
+ yieldStarExpression:
+ emitter.staticFunctionAccess(helpers.yieldStar),
bodyName: namer.deriveAsyncBodyName(name));
break;
default:
@@ -2522,7 +2443,7 @@
/// The locations of js patch-files relative to the sdk-descriptors.
static const _patchLocations = const <String, String>{
"async": "_internal/js_runtime/lib/async_patch.dart",
- "collection": "_internal/js_runtime/lib/collection_patch.dart",
+ "collection": "_internal/js_runtime/lib/collection_patch.dart",
"convert": "_internal/js_runtime/lib/convert_patch.dart",
"core": "_internal/js_runtime/lib/core_patch.dart",
"developer": "_internal/js_runtime/lib/developer_patch.dart",
@@ -2544,11 +2465,9 @@
@override
ImpactStrategy createImpactStrategy(
{bool supportDeferredLoad: true,
- bool supportDumpInfo: true,
- bool supportSerialization: true}) {
- return new JavaScriptImpactStrategy(
- resolution,
- compiler.dumpInfoTask,
+ bool supportDumpInfo: true,
+ bool supportSerialization: true}) {
+ return new JavaScriptImpactStrategy(resolution, compiler.dumpInfoTask,
supportDeferredLoad: supportDeferredLoad,
supportDumpInfo: supportDumpInfo,
supportSerialization: supportSerialization);
@@ -2758,8 +2677,8 @@
}
if (hasTypeLiteral) {
- transformed.registerTypeUse(new TypeUse.instantiation(
- backend.compiler.coreTypes.typeType));
+ transformed.registerTypeUse(
+ new TypeUse.instantiation(backend.compiler.coreTypes.typeType));
registerBackendImpact(transformed, impacts.typeLiteral);
}
@@ -2769,8 +2688,8 @@
if (mapLiteralUse.isConstant) {
registerBackendImpact(transformed, impacts.constantMapLiteral);
} else {
- transformed.registerTypeUse(
- new TypeUse.instantiation(mapLiteralUse.type));
+ transformed
+ .registerTypeUse(new TypeUse.instantiation(mapLiteralUse.type));
}
registerRequiredType(mapLiteralUse.type);
}
@@ -2778,8 +2697,8 @@
for (ListLiteralUse listLiteralUse in worldImpact.listLiterals) {
// TODO(johnniwinther): Use the [isConstant] and [isEmpty] property when
// factory constructors are registered directly.
- transformed.registerTypeUse(
- new TypeUse.instantiation(listLiteralUse.type));
+ transformed
+ .registerTypeUse(new TypeUse.instantiation(listLiteralUse.type));
registerRequiredType(listLiteralUse.type);
}
@@ -2796,7 +2715,8 @@
LocalFunctionElement closure = staticUse.element;
if (closure.type.containsTypeVariables) {
backend.compiler.enqueuer.resolution.universe
- .closuresWithFreeTypeVariables.add(closure);
+ .closuresWithFreeTypeVariables
+ .add(closure);
registerBackendImpact(transformed, impacts.computeSignature);
}
}
@@ -2828,8 +2748,8 @@
return transformed;
}
- void registerBackendImpact(TransformedWorldImpact worldImpact,
- BackendImpact backendImpact) {
+ void registerBackendImpact(
+ TransformedWorldImpact worldImpact, BackendImpact backendImpact) {
for (Element staticUse in backendImpact.staticUses) {
assert(staticUse != null);
backend.registerBackendUse(staticUse);
@@ -2839,14 +2759,12 @@
}
for (InterfaceType instantiatedType in backendImpact.instantiatedTypes) {
backend.registerBackendUse(instantiatedType.element);
- worldImpact.registerTypeUse(
- new TypeUse.instantiation(instantiatedType));
+ worldImpact.registerTypeUse(new TypeUse.instantiation(instantiatedType));
}
for (ClassElement cls in backendImpact.instantiatedClasses) {
cls.ensureResolved(backend.resolution);
backend.registerBackendUse(cls);
- worldImpact.registerTypeUse(
- new TypeUse.instantiation(cls.rawType));
+ worldImpact.registerTypeUse(new TypeUse.instantiation(cls.rawType));
}
for (BackendImpact otherImpact in backendImpact.otherImpacts) {
registerBackendImpact(worldImpact, otherImpact);
@@ -2888,8 +2806,8 @@
if (type.isTypeVariable) {
registerBackendImpact(transformed, impacts.typeVariableTypeCheck);
if (inCheckedMode) {
- registerBackendImpact(transformed,
- impacts.typeVariableCheckedModeTypeCheck);
+ registerBackendImpact(
+ transformed, impacts.typeVariableCheckedModeTypeCheck);
}
}
}
@@ -2963,18 +2881,17 @@
backend.addCompileTimeConstantForEmission(constant);
}
- for (Pair<DartType, DartType> check in
- impact.typeVariableBoundsSubtypeChecks) {
+ for (Pair<DartType, DartType> check
+ in impact.typeVariableBoundsSubtypeChecks) {
backend.registerTypeVariableBoundsSubtypeCheck(check.a, check.b);
}
-
for (StaticUse staticUse in impact.staticUses) {
if (staticUse.kind == StaticUseKind.CLOSURE) {
LocalFunctionElement closure = staticUse.element;
if (backend.methodNeedsRti(closure)) {
- registerBackendImpact(transformed, impacts.computeSignature);
- }
+ registerBackendImpact(transformed, impacts.computeSignature);
+ }
}
}
@@ -3029,17 +2946,14 @@
final bool supportDumpInfo;
final bool supportSerialization;
- JavaScriptImpactStrategy(this.resolution,
- this.dumpInfoTask,
- {this.supportDeferredLoad,
- this.supportDumpInfo,
- this.supportSerialization});
+ JavaScriptImpactStrategy(this.resolution, this.dumpInfoTask,
+ {this.supportDeferredLoad,
+ this.supportDumpInfo,
+ this.supportSerialization});
@override
- void visitImpact(Element element,
- WorldImpact impact,
- WorldImpactVisitor visitor,
- ImpactUseCase impactUse) {
+ void visitImpact(Element element, WorldImpact impact,
+ WorldImpactVisitor visitor, ImpactUseCase impactUse) {
// TODO(johnniwinther): Compute the application strategy once for each use.
if (impactUse == ResolutionEnqueuer.IMPACT_USE) {
if (supportDeferredLoad || supportSerialization) {
@@ -3061,8 +2975,7 @@
@override
void onImpactUsed(ImpactUseCase impactUse) {
- if (impactUse == DeferredLoadTask.IMPACT_USE &&
- !supportSerialization) {
+ if (impactUse == DeferredLoadTask.IMPACT_USE && !supportSerialization) {
// TODO(johnniwinther): Allow emptying when serialization has been
// performed.
resolution.emptyCache();
diff --git a/pkg/compiler/lib/src/js_backend/backend_helpers.dart b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
index 804594c..aac308d 100644
--- a/pkg/compiler/lib/src/js_backend/backend_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_helpers.dart
@@ -5,26 +5,21 @@
library dart2js.js_backend.helpers;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers,
- Uris;
-import '../common/resolution.dart' show
- Resolution;
-import '../compiler.dart' show
- Compiler;
-import '../core_types.dart' show
- CoreClasses;
-import '../elements/elements.dart' show
- AbstractFieldElement,
- ClassElement,
- ConstructorElement,
- Element,
- EnumClassElement,
- FunctionElement,
- LibraryElement,
- MethodElement;
-import '../library_loader.dart' show
- LoadedLibraries;
+import '../common/names.dart' show Identifiers, Uris;
+import '../common/resolution.dart' show Resolution;
+import '../compiler.dart' show Compiler;
+import '../core_types.dart' show CoreClasses;
+import '../elements/elements.dart'
+ show
+ AbstractFieldElement,
+ ClassElement,
+ ConstructorElement,
+ Element,
+ EnumClassElement,
+ FunctionElement,
+ LibraryElement,
+ MethodElement;
+import '../library_loader.dart' show LoadedLibraries;
import 'js_backend.dart';
@@ -37,14 +32,12 @@
new Uri(scheme: 'dart', path: '_foreign_helper');
static final Uri DART_JS_MIRRORS =
new Uri(scheme: 'dart', path: '_js_mirrors');
- static final Uri DART_JS_NAMES =
- new Uri(scheme: 'dart', path: '_js_names');
+ static final Uri DART_JS_NAMES = new Uri(scheme: 'dart', path: '_js_names');
static final Uri DART_EMBEDDED_NAMES =
new Uri(scheme: 'dart', path: '_js_embedded_names');
static final Uri DART_ISOLATE_HELPER =
new Uri(scheme: 'dart', path: '_isolate_helper');
- static final Uri PACKAGE_JS =
- new Uri(scheme: 'package', path: 'js/js.dart');
+ static final Uri PACKAGE_JS = new Uri(scheme: 'package', path: 'js/js.dart');
static const String INVOKE_ON = '_getCachedInvocation';
static const String START_ROOT_ISOLATE = 'startRootIsolate';
@@ -67,7 +60,6 @@
MethodElement assertThrow;
MethodElement assertHelper;
-
LibraryElement jsHelperLibrary;
LibraryElement asyncLibrary;
LibraryElement interceptorsLibrary;
@@ -203,9 +195,9 @@
asyncLibrary = library;
} else if (uri == Uris.dart__internal) {
internalLibrary = library;
- } else if (uri == DART_INTERCEPTORS) {
+ } else if (uri == DART_INTERCEPTORS) {
interceptorsLibrary = library;
- } else if (uri == DART_FOREIGN_HELPER) {
+ } else if (uri == DART_FOREIGN_HELPER) {
foreignLibrary = library;
} else if (uri == DART_ISOLATE_HELPER) {
isolateHelperLibrary = library;
@@ -225,7 +217,8 @@
boundClosureClass = lookupHelperClass('BoundClosure');
closureClass = lookupHelperClass('Closure');
if (!missingHelperClasses.isEmpty) {
- reporter.internalError(jsHelperLibrary,
+ reporter.internalError(
+ jsHelperLibrary,
'dart:_js_helper library does not contain required classes: '
'$missingHelperClasses');
}
@@ -309,7 +302,6 @@
}
}
-
void onLibrariesLoaded(LoadedLibraries loadedLibraries) {
assert(loadedLibraries.containsLibrary(Uris.dart_core));
assert(loadedLibraries.containsLibrary(DART_INTERCEPTORS));
@@ -340,8 +332,7 @@
}
jsIndexableClass.ensureResolved(resolution);
- jsIndexableLength = compiler.lookupElementIn(
- jsIndexableClass, 'length');
+ jsIndexableLength = compiler.lookupElementIn(jsIndexableClass, 'length');
if (jsIndexableLength != null && jsIndexableLength.isAbstractField) {
AbstractFieldElement element = jsIndexableLength;
jsIndexableLength = element.getter;
@@ -396,7 +387,6 @@
return findHelper('isJsIndexable');
}
-
Element get throwIllegalArgumentException {
return findHelper('iae');
}
@@ -608,8 +598,7 @@
}
Element get asyncStarController {
- ClassElement classElement =
- findAsyncHelper("_AsyncStarStreamController");
+ ClassElement classElement = findAsyncHelper("_AsyncStarStreamController");
classElement.ensureResolved(resolution);
return classElement;
}
diff --git a/pkg/compiler/lib/src/js_backend/backend_impact.dart b/pkg/compiler/lib/src/js_backend/backend_impact.dart
index aae737b..3edac4f 100644
--- a/pkg/compiler/lib/src/js_backend/backend_impact.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_impact.dart
@@ -4,15 +4,10 @@
library dart2js.js_helpers.impact;
-import '../compiler.dart' show
- Compiler;
-import '../core_types.dart' show
- CoreClasses;
-import '../dart_types.dart' show
- InterfaceType;
-import '../elements/elements.dart' show
- ClassElement,
- Element;
+import '../compiler.dart' show Compiler;
+import '../core_types.dart' show CoreClasses;
+import '../dart_types.dart' show InterfaceType;
+import '../elements/elements.dart' show ClassElement, Element;
import 'backend_helpers.dart';
import 'constant_system_javascript.dart';
@@ -25,10 +20,11 @@
final List<ClassElement> instantiatedClasses;
final List<BackendImpact> otherImpacts;
- BackendImpact({this.staticUses: const <Element>[],
- this.instantiatedTypes: const <InterfaceType>[],
- this.instantiatedClasses: const <ClassElement>[],
- this.otherImpacts: const <BackendImpact>[]});
+ BackendImpact(
+ {this.staticUses: const <Element>[],
+ this.instantiatedTypes: const <InterfaceType>[],
+ this.instantiatedClasses: const <ClassElement>[],
+ this.otherImpacts: const <BackendImpact>[]});
}
/// The JavaScript backend dependencies for various features.
@@ -47,11 +43,11 @@
BackendImpact get getRuntimeTypeArgument {
if (_getRuntimeTypeArgument == null) {
- _getRuntimeTypeArgument = new BackendImpact(
- staticUses: [
- helpers.getRuntimeTypeArgument,
- helpers.getTypeArgumentByIndex,
- helpers.copyTypeArguments]);
+ _getRuntimeTypeArgument = new BackendImpact(staticUses: [
+ helpers.getRuntimeTypeArgument,
+ helpers.getTypeArgumentByIndex,
+ helpers.copyTypeArguments
+ ]);
}
return _getRuntimeTypeArgument;
}
@@ -60,14 +56,14 @@
BackendImpact get computeSignature {
if (_computeSignature == null) {
- _computeSignature = new BackendImpact(
- staticUses: [
- helpers.setRuntimeTypeInfo,
- helpers.getRuntimeTypeInfo,
- helpers.computeSignature,
- helpers.getRuntimeTypeArguments],
- otherImpacts: [
- listValues]);
+ _computeSignature = new BackendImpact(staticUses: [
+ helpers.setRuntimeTypeInfo,
+ helpers.getRuntimeTypeInfo,
+ helpers.computeSignature,
+ helpers.getRuntimeTypeArguments
+ ], otherImpacts: [
+ listValues
+ ]);
}
return _computeSignature;
}
@@ -76,12 +72,12 @@
BackendImpact get asyncBody {
if (_asyncBody == null) {
- _asyncBody = new BackendImpact(
- staticUses: [
- helpers.asyncHelper,
- helpers.syncCompleterConstructor,
- helpers.streamIteratorConstructor,
- helpers.wrapBody]);
+ _asyncBody = new BackendImpact(staticUses: [
+ helpers.asyncHelper,
+ helpers.syncCompleterConstructor,
+ helpers.streamIteratorConstructor,
+ helpers.wrapBody
+ ]);
}
return _asyncBody;
}
@@ -90,14 +86,14 @@
BackendImpact get syncStarBody {
if (_syncStarBody == null) {
- _syncStarBody = new BackendImpact(
- staticUses: [
- helpers.syncStarIterableConstructor,
- helpers.endOfIteration,
- helpers.yieldStar,
- helpers.syncStarUncaughtError],
- instantiatedClasses: [
- helpers.syncStarIterable]);
+ _syncStarBody = new BackendImpact(staticUses: [
+ helpers.syncStarIterableConstructor,
+ helpers.endOfIteration,
+ helpers.yieldStar,
+ helpers.syncStarUncaughtError
+ ], instantiatedClasses: [
+ helpers.syncStarIterable
+ ]);
}
return _syncStarBody;
}
@@ -106,17 +102,17 @@
BackendImpact get asyncStarBody {
if (_asyncStarBody == null) {
- _asyncStarBody = new BackendImpact(
- staticUses: [
- helpers.asyncStarHelper,
- helpers.streamOfController,
- helpers.yieldSingle,
- helpers.yieldStar,
- helpers.asyncStarControllerConstructor,
- helpers.streamIteratorConstructor,
- helpers.wrapBody],
- instantiatedClasses: [
- helpers.asyncStarController]);
+ _asyncStarBody = new BackendImpact(staticUses: [
+ helpers.asyncStarHelper,
+ helpers.streamOfController,
+ helpers.yieldSingle,
+ helpers.yieldStar,
+ helpers.asyncStarControllerConstructor,
+ helpers.streamIteratorConstructor,
+ helpers.wrapBody
+ ], instantiatedClasses: [
+ helpers.asyncStarController
+ ]);
}
return _asyncStarBody;
}
@@ -126,9 +122,7 @@
BackendImpact get typeVariableBoundCheck {
if (_typeVariableBoundCheck == null) {
_typeVariableBoundCheck = new BackendImpact(
- staticUses: [
- helpers.throwTypeError,
- helpers.assertIsSubtype]);
+ staticUses: [helpers.throwTypeError, helpers.assertIsSubtype]);
}
return _typeVariableBoundCheck;
}
@@ -138,10 +132,8 @@
BackendImpact get abstractClassInstantiation {
if (_abstractClassInstantiation == null) {
_abstractClassInstantiation = new BackendImpact(
- staticUses: [
- helpers.throwAbstractClassInstantiationError],
- otherImpacts: [
- _needsString('Needed to encode the message.')]);
+ staticUses: [helpers.throwAbstractClassInstantiationError],
+ otherImpacts: [_needsString('Needed to encode the message.')]);
}
return _abstractClassInstantiation;
}
@@ -150,9 +142,8 @@
BackendImpact get fallThroughError {
if (_fallThroughError == null) {
- _fallThroughError = new BackendImpact(
- staticUses: [
- helpers.fallThroughError]);
+ _fallThroughError =
+ new BackendImpact(staticUses: [helpers.fallThroughError]);
}
return _fallThroughError;
}
@@ -161,9 +152,7 @@
BackendImpact get asCheck {
if (_asCheck == null) {
- _asCheck = new BackendImpact(
- staticUses: [
- helpers.throwRuntimeError]);
+ _asCheck = new BackendImpact(staticUses: [helpers.throwRuntimeError]);
}
return _asCheck;
}
@@ -172,15 +161,14 @@
BackendImpact get throwNoSuchMethod {
if (_throwNoSuchMethod == null) {
- _throwNoSuchMethod = new BackendImpact(
- staticUses: [
- helpers.throwNoSuchMethod],
- otherImpacts: [
- // Also register the types of the arguments passed to this method.
- _needsList(
- 'Needed to encode the arguments for throw NoSuchMethodError.'),
- _needsString(
- 'Needed to encode the name for throw NoSuchMethodError.')]);
+ _throwNoSuchMethod = new BackendImpact(staticUses: [
+ helpers.throwNoSuchMethod
+ ], otherImpacts: [
+ // Also register the types of the arguments passed to this method.
+ _needsList(
+ 'Needed to encode the arguments for throw NoSuchMethodError.'),
+ _needsString('Needed to encode the name for throw NoSuchMethodError.')
+ ]);
}
return _throwNoSuchMethod;
}
@@ -189,9 +177,8 @@
BackendImpact get stringValues {
if (_stringValues == null) {
- _stringValues = new BackendImpact(
- instantiatedClasses: [
- helpers.jsStringClass]);
+ _stringValues =
+ new BackendImpact(instantiatedClasses: [helpers.jsStringClass]);
}
return _stringValues;
}
@@ -200,14 +187,14 @@
BackendImpact get numValues {
if (_numValues == null) {
- _numValues = new BackendImpact(
- instantiatedClasses: [
- helpers.jsIntClass,
- helpers.jsPositiveIntClass,
- helpers.jsUInt32Class,
- helpers.jsUInt31Class,
- helpers.jsNumberClass,
- helpers.jsDoubleClass]);
+ _numValues = new BackendImpact(instantiatedClasses: [
+ helpers.jsIntClass,
+ helpers.jsPositiveIntClass,
+ helpers.jsUInt32Class,
+ helpers.jsUInt31Class,
+ helpers.jsNumberClass,
+ helpers.jsDoubleClass
+ ]);
}
return _numValues;
}
@@ -220,9 +207,8 @@
BackendImpact get boolValues {
if (_boolValues == null) {
- _boolValues = new BackendImpact(
- instantiatedClasses: [
- helpers.jsBoolClass]);
+ _boolValues =
+ new BackendImpact(instantiatedClasses: [helpers.jsBoolClass]);
}
return _boolValues;
}
@@ -231,9 +217,8 @@
BackendImpact get nullValue {
if (_nullValue == null) {
- _nullValue = new BackendImpact(
- instantiatedClasses: [
- helpers.jsNullClass]);
+ _nullValue =
+ new BackendImpact(instantiatedClasses: [helpers.jsNullClass]);
}
return _nullValue;
}
@@ -242,13 +227,13 @@
BackendImpact get listValues {
if (_listValues == null) {
- _listValues = new BackendImpact(
- instantiatedClasses: [
- helpers.jsArrayClass,
- helpers.jsMutableArrayClass,
- helpers.jsFixedArrayClass,
- helpers.jsExtendableArrayClass,
- helpers.jsUnmodifiableArrayClass]);
+ _listValues = new BackendImpact(instantiatedClasses: [
+ helpers.jsArrayClass,
+ helpers.jsMutableArrayClass,
+ helpers.jsFixedArrayClass,
+ helpers.jsExtendableArrayClass,
+ helpers.jsUnmodifiableArrayClass
+ ]);
}
return _listValues;
}
@@ -257,12 +242,12 @@
BackendImpact get throwRuntimeError {
if (_throwRuntimeError == null) {
- _throwRuntimeError = new BackendImpact(
- staticUses: [
- helpers.throwRuntimeError],
- otherImpacts: [
- // Also register the types of the arguments passed to this method.
- stringValues]);
+ _throwRuntimeError = new BackendImpact(staticUses: [
+ helpers.throwRuntimeError
+ ], otherImpacts: [
+ // Also register the types of the arguments passed to this method.
+ stringValues
+ ]);
}
return _throwRuntimeError;
}
@@ -271,17 +256,15 @@
BackendImpact get superNoSuchMethod {
if (_superNoSuchMethod == null) {
- _superNoSuchMethod = new BackendImpact(
- staticUses: [
- helpers.createInvocationMirror,
- helpers.objectNoSuchMethod],
- otherImpacts: [
- _needsInt(
- 'Needed to encode the invocation kind of super.noSuchMethod.'),
- _needsList(
- 'Needed to encode the arguments of super.noSuchMethod.'),
- _needsString(
- 'Needed to encode the name of super.noSuchMethod.')]);
+ _superNoSuchMethod = new BackendImpact(staticUses: [
+ helpers.createInvocationMirror,
+ helpers.objectNoSuchMethod
+ ], otherImpacts: [
+ _needsInt(
+ 'Needed to encode the invocation kind of super.noSuchMethod.'),
+ _needsList('Needed to encode the arguments of super.noSuchMethod.'),
+ _needsString('Needed to encode the name of super.noSuchMethod.')
+ ]);
}
return _superNoSuchMethod;
}
@@ -290,17 +273,16 @@
BackendImpact get constantMapLiteral {
if (_constantMapLiteral == null) {
-
ClassElement find(String name) {
return helpers.find(helpers.jsHelperLibrary, name);
}
- _constantMapLiteral = new BackendImpact(
- instantiatedClasses: [
- find(JavaScriptMapConstant.DART_CLASS),
- find(JavaScriptMapConstant.DART_PROTO_CLASS),
- find(JavaScriptMapConstant.DART_STRING_CLASS),
- find(JavaScriptMapConstant.DART_GENERAL_CLASS)]);
+ _constantMapLiteral = new BackendImpact(instantiatedClasses: [
+ find(JavaScriptMapConstant.DART_CLASS),
+ find(JavaScriptMapConstant.DART_PROTO_CLASS),
+ find(JavaScriptMapConstant.DART_STRING_CLASS),
+ find(JavaScriptMapConstant.DART_GENERAL_CLASS)
+ ]);
}
return _constantMapLiteral;
}
@@ -310,8 +292,7 @@
BackendImpact get symbolConstructor {
if (_symbolConstructor == null) {
_symbolConstructor = new BackendImpact(
- staticUses: [
- helpers.compiler.symbolValidatedConstructor]);
+ staticUses: [helpers.compiler.symbolValidatedConstructor]);
}
return _symbolConstructor;
}
@@ -321,10 +302,8 @@
BackendImpact get constSymbol {
if (_constSymbol == null) {
_constSymbol = new BackendImpact(
- instantiatedClasses: [
- coreClasses.symbolClass],
- staticUses: [
- compiler.symbolConstructor.declaration]);
+ instantiatedClasses: [coreClasses.symbolClass],
+ staticUses: [compiler.symbolConstructor.declaration]);
}
return _constSymbol;
}
@@ -361,9 +340,8 @@
BackendImpact get assertWithoutMessage {
if (_assertWithoutMessage == null) {
- _assertWithoutMessage = new BackendImpact(
- staticUses: [
- helpers.assertHelper]);
+ _assertWithoutMessage =
+ new BackendImpact(staticUses: [helpers.assertHelper]);
}
return _assertWithoutMessage;
}
@@ -373,9 +351,7 @@
BackendImpact get assertWithMessage {
if (_assertWithMessage == null) {
_assertWithMessage = new BackendImpact(
- staticUses: [
- helpers.assertTest,
- helpers.assertThrow]);
+ staticUses: [helpers.assertTest, helpers.assertThrow]);
}
return _assertWithMessage;
}
@@ -384,9 +360,8 @@
BackendImpact get asyncForIn {
if (_asyncForIn == null) {
- _asyncForIn = new BackendImpact(
- staticUses: [
- helpers.streamIteratorConstructor]);
+ _asyncForIn =
+ new BackendImpact(staticUses: [helpers.streamIteratorConstructor]);
}
return _asyncForIn;
}
@@ -396,10 +371,8 @@
BackendImpact get stringInterpolation {
if (_stringInterpolation == null) {
_stringInterpolation = new BackendImpact(
- staticUses: [
- helpers.stringInterpolationHelper],
- otherImpacts: [
- _needsString('Strings are created.')]);
+ staticUses: [helpers.stringInterpolationHelper],
+ otherImpacts: [_needsString('Strings are created.')]);
}
return _stringInterpolation;
}
@@ -427,12 +400,12 @@
BackendImpact get catchStatement {
if (_catchStatement == null) {
- _catchStatement = new BackendImpact(
- staticUses: [
- helpers.exceptionUnwrapper],
- instantiatedClasses: [
- helpers.jsPlainJavaScriptObjectClass,
- helpers.jsUnknownJavaScriptObjectClass]);
+ _catchStatement = new BackendImpact(staticUses: [
+ helpers.exceptionUnwrapper
+ ], instantiatedClasses: [
+ helpers.jsPlainJavaScriptObjectClass,
+ helpers.jsUnknownJavaScriptObjectClass
+ ]);
}
return _catchStatement;
}
@@ -447,7 +420,8 @@
// here, even though we may not need the throwExpression helper.
staticUses: [
helpers.wrapExceptionHelper,
- helpers.throwExpressionHelper]);
+ helpers.throwExpressionHelper
+ ]);
}
return _throwExpression;
}
@@ -456,9 +430,7 @@
BackendImpact get lazyField {
if (_lazyField == null) {
- _lazyField = new BackendImpact(
- staticUses: [
- helpers.cyclicThrowHelper]);
+ _lazyField = new BackendImpact(staticUses: [helpers.cyclicThrowHelper]);
}
return _lazyField;
}
@@ -468,10 +440,8 @@
BackendImpact get typeLiteral {
if (_typeLiteral == null) {
_typeLiteral = new BackendImpact(
- instantiatedClasses: [
- backend.typeImplementation],
- staticUses: [
- helpers.createRuntimeType]);
+ instantiatedClasses: [backend.typeImplementation],
+ staticUses: [helpers.createRuntimeType]);
}
return _typeLiteral;
}
@@ -481,10 +451,8 @@
BackendImpact get stackTraceInCatch {
if (_stackTraceInCatch == null) {
_stackTraceInCatch = new BackendImpact(
- instantiatedClasses: [
- helpers.stackTraceClass],
- staticUses: [
- helpers.traceFromException]);
+ instantiatedClasses: [helpers.stackTraceClass],
+ staticUses: [helpers.traceFromException]);
}
return _stackTraceInCatch;
}
@@ -496,8 +464,7 @@
_syncForIn = new BackendImpact(
// The SSA builder recognizes certain for-in loops and can generate
// calls to throwConcurrentModificationError.
- staticUses: [
- helpers.checkConcurrentModificationError]);
+ staticUses: [helpers.checkConcurrentModificationError]);
}
return _syncForIn;
}
@@ -506,17 +473,16 @@
BackendImpact get typeVariableExpression {
if (_typeVariableExpression == null) {
- _typeVariableExpression = new BackendImpact(
- staticUses: [
- helpers.setRuntimeTypeInfo,
- helpers.getRuntimeTypeInfo,
- helpers.runtimeTypeToString,
- helpers.createRuntimeType],
- otherImpacts: [
- listValues,
- getRuntimeTypeArgument,
- _needsInt('Needed for accessing a type variable literal on this.')
- ]);
+ _typeVariableExpression = new BackendImpact(staticUses: [
+ helpers.setRuntimeTypeInfo,
+ helpers.getRuntimeTypeInfo,
+ helpers.runtimeTypeToString,
+ helpers.createRuntimeType
+ ], otherImpacts: [
+ listValues,
+ getRuntimeTypeArgument,
+ _needsInt('Needed for accessing a type variable literal on this.')
+ ]);
}
return _typeVariableExpression;
}
@@ -525,9 +491,7 @@
BackendImpact get typeCheck {
if (_typeCheck == null) {
- _typeCheck = new BackendImpact(
- otherImpacts: [
- boolValues]);
+ _typeCheck = new BackendImpact(otherImpacts: [boolValues]);
}
return _typeCheck;
}
@@ -536,9 +500,8 @@
BackendImpact get checkedModeTypeCheck {
if (_checkedModeTypeCheck == null) {
- _checkedModeTypeCheck = new BackendImpact(
- staticUses: [
- helpers.throwRuntimeError]);
+ _checkedModeTypeCheck =
+ new BackendImpact(staticUses: [helpers.throwRuntimeError]);
}
return _checkedModeTypeCheck;
}
@@ -547,9 +510,8 @@
BackendImpact get malformedTypeCheck {
if (_malformedTypeCheck == null) {
- _malformedTypeCheck = new BackendImpact(
- staticUses: [
- helpers.throwTypeError]);
+ _malformedTypeCheck =
+ new BackendImpact(staticUses: [helpers.throwTypeError]);
}
return _malformedTypeCheck;
}
@@ -558,15 +520,15 @@
BackendImpact get genericTypeCheck {
if (_genericTypeCheck == null) {
- _genericTypeCheck = new BackendImpact(
- staticUses: [
- helpers.checkSubtype,
- // TODO(johnniwinther): Investigate why this is needed.
- helpers.setRuntimeTypeInfo,
- helpers.getRuntimeTypeInfo],
- otherImpacts: [
- listValues,
- getRuntimeTypeArgument]);
+ _genericTypeCheck = new BackendImpact(staticUses: [
+ helpers.checkSubtype,
+ // TODO(johnniwinther): Investigate why this is needed.
+ helpers.setRuntimeTypeInfo,
+ helpers.getRuntimeTypeInfo
+ ], otherImpacts: [
+ listValues,
+ getRuntimeTypeArgument
+ ]);
}
return _genericTypeCheck;
}
@@ -575,9 +537,7 @@
BackendImpact get genericIsCheck {
if (_genericIsCheck == null) {
- _genericIsCheck = new BackendImpact(
- otherImpacts: [
- intValues]);
+ _genericIsCheck = new BackendImpact(otherImpacts: [intValues]);
}
return _genericIsCheck;
}
@@ -586,9 +546,8 @@
BackendImpact get genericCheckedModeTypeCheck {
if (_genericCheckedModeTypeCheck == null) {
- _genericCheckedModeTypeCheck = new BackendImpact(
- staticUses: [
- helpers.assertSubtype]);
+ _genericCheckedModeTypeCheck =
+ new BackendImpact(staticUses: [helpers.assertSubtype]);
}
return _genericCheckedModeTypeCheck;
}
@@ -597,9 +556,8 @@
BackendImpact get typeVariableTypeCheck {
if (_typeVariableTypeCheck == null) {
- _typeVariableTypeCheck = new BackendImpact(
- staticUses: [
- helpers.checkSubtypeOfRuntimeType]);
+ _typeVariableTypeCheck =
+ new BackendImpact(staticUses: [helpers.checkSubtypeOfRuntimeType]);
}
return _typeVariableTypeCheck;
}
@@ -608,9 +566,8 @@
BackendImpact get typeVariableCheckedModeTypeCheck {
if (_typeVariableCheckedModeTypeCheck == null) {
- _typeVariableCheckedModeTypeCheck = new BackendImpact(
- staticUses: [
- helpers.assertSubtypeOfRuntimeType]);
+ _typeVariableCheckedModeTypeCheck =
+ new BackendImpact(staticUses: [helpers.assertSubtypeOfRuntimeType]);
}
return _typeVariableCheckedModeTypeCheck;
}
@@ -619,9 +576,8 @@
BackendImpact get functionTypeCheck {
if (_functionTypeCheck == null) {
- _functionTypeCheck = new BackendImpact(
- staticUses: [
- helpers.functionTypeTestMetaHelper]);
+ _functionTypeCheck =
+ new BackendImpact(staticUses: [helpers.functionTypeTestMetaHelper]);
}
return _functionTypeCheck;
}
@@ -630,12 +586,12 @@
BackendImpact get nativeTypeCheck {
if (_nativeTypeCheck == null) {
- _nativeTypeCheck = new BackendImpact(
- staticUses: [
- // We will neeed to add the "$is" and "$as" properties on the
- // JavaScript object prototype, so we make sure
- // [:defineProperty:] is compiled.
- helpers.defineProperty]);
+ _nativeTypeCheck = new BackendImpact(staticUses: [
+ // We will neeed to add the "$is" and "$as" properties on the
+ // JavaScript object prototype, so we make sure
+ // [:defineProperty:] is compiled.
+ helpers.defineProperty
+ ]);
}
return _nativeTypeCheck;
}
@@ -644,9 +600,8 @@
BackendImpact get closure {
if (_closure == null) {
- _closure = new BackendImpact(
- instantiatedClasses: [
- coreClasses.functionClass]);
+ _closure =
+ new BackendImpact(instantiatedClasses: [coreClasses.functionClass]);
}
return _closure;
}
diff --git a/pkg/compiler/lib/src/js_backend/backend_serialization.dart b/pkg/compiler/lib/src/js_backend/backend_serialization.dart
index 8a4923f..c7c2039 100644
--- a/pkg/compiler/lib/src/js_backend/backend_serialization.dart
+++ b/pkg/compiler/lib/src/js_backend/backend_serialization.dart
@@ -4,14 +4,10 @@
library js_backend.serialization;
-import '../common/backend_api.dart' show
- BackendSerialization;
+import '../common/backend_api.dart' show BackendSerialization;
import '../elements/elements.dart';
-import '../serialization/serialization.dart' show
- DeserializerPlugin,
- ObjectDecoder,
- ObjectEncoder,
- SerializerPlugin;
+import '../serialization/serialization.dart'
+ show DeserializerPlugin, ObjectDecoder, ObjectEncoder, SerializerPlugin;
import '../serialization/keys.dart';
import 'js_backend.dart';
@@ -57,4 +53,3 @@
}
}
}
-
diff --git a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
index a40caad..409c44d 100644
--- a/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
+++ b/pkg/compiler/lib/src/js_backend/checked_mode_helpers.dart
@@ -17,8 +17,8 @@
CallStructure get callStructure => CallStructure.ONE_ARG;
- jsAst.Expression generateCall(SsaCodeGenerator codegen,
- HTypeConversion node) {
+ jsAst.Expression generateCall(
+ SsaCodeGenerator codegen, HTypeConversion node) {
StaticUse staticUse = getStaticUse(codegen.compiler);
codegen.registry.registerStaticUse(staticUse);
List<jsAst.Expression> arguments = <jsAst.Expression>[];
@@ -31,46 +31,46 @@
}
void generateAdditionalArguments(SsaCodeGenerator codegen,
- HTypeConversion node,
- List<jsAst.Expression> arguments) {
+ HTypeConversion node, List<jsAst.Expression> arguments) {
// No additional arguments needed.
}
- static const List<CheckedModeHelper> helpers = const <CheckedModeHelper> [
- const MalformedCheckedModeHelper('checkMalformedType'),
- const CheckedModeHelper('voidTypeCheck'),
- const CheckedModeHelper('stringTypeCast'),
- const CheckedModeHelper('stringTypeCheck'),
- const CheckedModeHelper('doubleTypeCast'),
- const CheckedModeHelper('doubleTypeCheck'),
- const CheckedModeHelper('numTypeCast'),
- const CheckedModeHelper('numTypeCheck'),
- const CheckedModeHelper('boolTypeCast'),
- const CheckedModeHelper('boolTypeCheck'),
- const CheckedModeHelper('intTypeCast'),
- const CheckedModeHelper('intTypeCheck'),
- const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCast'),
- const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCheck'),
- const PropertyCheckedModeHelper('numberOrStringSuperTypeCast'),
- const PropertyCheckedModeHelper('numberOrStringSuperTypeCheck'),
- const PropertyCheckedModeHelper('stringSuperNativeTypeCast'),
- const PropertyCheckedModeHelper('stringSuperNativeTypeCheck'),
- const PropertyCheckedModeHelper('stringSuperTypeCast'),
- const PropertyCheckedModeHelper('stringSuperTypeCheck'),
- const CheckedModeHelper('listTypeCast'),
- const CheckedModeHelper('listTypeCheck'),
- const PropertyCheckedModeHelper('listSuperNativeTypeCast'),
- const PropertyCheckedModeHelper('listSuperNativeTypeCheck'),
- const PropertyCheckedModeHelper('listSuperTypeCast'),
- const PropertyCheckedModeHelper('listSuperTypeCheck'),
- const PropertyCheckedModeHelper('interceptedTypeCast'),
- const PropertyCheckedModeHelper('interceptedTypeCheck'),
- const SubtypeCheckedModeHelper('subtypeCast'),
- const SubtypeCheckedModeHelper('assertSubtype'),
- const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'),
- const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'),
- const PropertyCheckedModeHelper('propertyTypeCast'),
- const PropertyCheckedModeHelper('propertyTypeCheck')];
+ static const List<CheckedModeHelper> helpers = const <CheckedModeHelper>[
+ const MalformedCheckedModeHelper('checkMalformedType'),
+ const CheckedModeHelper('voidTypeCheck'),
+ const CheckedModeHelper('stringTypeCast'),
+ const CheckedModeHelper('stringTypeCheck'),
+ const CheckedModeHelper('doubleTypeCast'),
+ const CheckedModeHelper('doubleTypeCheck'),
+ const CheckedModeHelper('numTypeCast'),
+ const CheckedModeHelper('numTypeCheck'),
+ const CheckedModeHelper('boolTypeCast'),
+ const CheckedModeHelper('boolTypeCheck'),
+ const CheckedModeHelper('intTypeCast'),
+ const CheckedModeHelper('intTypeCheck'),
+ const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCast'),
+ const PropertyCheckedModeHelper('numberOrStringSuperNativeTypeCheck'),
+ const PropertyCheckedModeHelper('numberOrStringSuperTypeCast'),
+ const PropertyCheckedModeHelper('numberOrStringSuperTypeCheck'),
+ const PropertyCheckedModeHelper('stringSuperNativeTypeCast'),
+ const PropertyCheckedModeHelper('stringSuperNativeTypeCheck'),
+ const PropertyCheckedModeHelper('stringSuperTypeCast'),
+ const PropertyCheckedModeHelper('stringSuperTypeCheck'),
+ const CheckedModeHelper('listTypeCast'),
+ const CheckedModeHelper('listTypeCheck'),
+ const PropertyCheckedModeHelper('listSuperNativeTypeCast'),
+ const PropertyCheckedModeHelper('listSuperNativeTypeCheck'),
+ const PropertyCheckedModeHelper('listSuperTypeCast'),
+ const PropertyCheckedModeHelper('listSuperTypeCheck'),
+ const PropertyCheckedModeHelper('interceptedTypeCast'),
+ const PropertyCheckedModeHelper('interceptedTypeCheck'),
+ const SubtypeCheckedModeHelper('subtypeCast'),
+ const SubtypeCheckedModeHelper('assertSubtype'),
+ const TypeVariableCheckedModeHelper('subtypeOfRuntimeTypeCast'),
+ const TypeVariableCheckedModeHelper('assertSubtypeOfRuntimeType'),
+ const PropertyCheckedModeHelper('propertyTypeCast'),
+ const PropertyCheckedModeHelper('propertyTypeCheck')
+ ];
}
class MalformedCheckedModeHelper extends CheckedModeHelper {
@@ -79,8 +79,7 @@
CallStructure get callStructure => CallStructure.TWO_ARGS;
void generateAdditionalArguments(SsaCodeGenerator codegen,
- HTypeConversion node,
- List<jsAst.Expression> arguments) {
+ HTypeConversion node, List<jsAst.Expression> arguments) {
ErroneousElement element = node.typeExpression.element;
arguments.add(js.escapedString(element.message));
}
@@ -92,8 +91,7 @@
CallStructure get callStructure => CallStructure.TWO_ARGS;
void generateAdditionalArguments(SsaCodeGenerator codegen,
- HTypeConversion node,
- List<jsAst.Expression> arguments) {
+ HTypeConversion node, List<jsAst.Expression> arguments) {
DartType type = node.typeExpression;
jsAst.Name additionalArgument = codegen.backend.namer.operatorIsType(type);
arguments.add(js.quoteName(additionalArgument));
@@ -106,8 +104,7 @@
CallStructure get callStructure => CallStructure.TWO_ARGS;
void generateAdditionalArguments(SsaCodeGenerator codegen,
- HTypeConversion node,
- List<jsAst.Expression> arguments) {
+ HTypeConversion node, List<jsAst.Expression> arguments) {
assert(node.typeExpression.isTypeVariable);
codegen.use(node.typeRepresentation);
arguments.add(codegen.pop());
@@ -120,8 +117,7 @@
CallStructure get callStructure => const CallStructure.unnamed(4);
void generateAdditionalArguments(SsaCodeGenerator codegen,
- HTypeConversion node,
- List<jsAst.Expression> arguments) {
+ HTypeConversion node, List<jsAst.Expression> arguments) {
DartType type = node.typeExpression;
Element element = type.element;
jsAst.Name isField = codegen.backend.namer.operatorIs(element);
diff --git a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
index 4040656..d2c539d 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/codegen.dart
@@ -6,31 +6,20 @@
import 'glue.dart';
-import '../../closure.dart' show
- ClosureClassElement;
-import '../../common/codegen.dart' show
- CodegenRegistry;
+import '../../closure.dart' show ClosureClassElement;
+import '../../common/codegen.dart' show CodegenRegistry;
import '../../constants/values.dart';
import '../../dart_types.dart';
import '../../elements/elements.dart';
-import '../../io/source_information.dart' show
- SourceInformation;
+import '../../io/source_information.dart' show SourceInformation;
import '../../js/js.dart' as js;
import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
-import '../../tree_ir/tree_ir_nodes.dart' show
- BuiltinMethod,
- BuiltinOperator,
- isCompoundableOperator;
-import '../../types/types.dart' show
- TypeMask;
-import '../../universe/call_structure.dart' show
- CallStructure;
-import '../../universe/selector.dart' show
- Selector;
-import '../../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
+import '../../tree_ir/tree_ir_nodes.dart'
+ show BuiltinMethod, BuiltinOperator, isCompoundableOperator;
+import '../../types/types.dart' show TypeMask;
+import '../../universe/call_structure.dart' show CallStructure;
+import '../../universe/selector.dart' show Selector;
+import '../../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
import '../../util/maplet.dart';
class CodegenBailout {
@@ -43,7 +32,7 @@
}
class CodeGenerator extends tree_ir.StatementVisitor
- with tree_ir.ExpressionVisitor<js.Expression> {
+ with tree_ir.ExpressionVisitor<js.Expression> {
final CodegenRegistry registry;
final Glue glue;
@@ -65,8 +54,7 @@
/// Stacks whose top element is the current target of an unlabeled break
/// or continue. For continues, this is the loop node itself.
final tree_ir.FallthroughStack shortBreak = new tree_ir.FallthroughStack();
- final tree_ir.FallthroughStack shortContinue =
- new tree_ir.FallthroughStack();
+ final tree_ir.FallthroughStack shortContinue = new tree_ir.FallthroughStack();
/// When the top element is true, [Unreachable] statements will be emitted
/// as [Return]s, otherwise they are emitted as empty because they are
@@ -130,8 +118,7 @@
if (!declaredVariables.add(use.name)) break;
js.VariableInitialization jsVariable = new js.VariableInitialization(
- new js.VariableDeclaration(use.name),
- assign.value);
+ new js.VariableDeclaration(use.name), assign.value);
jsVariables.add(jsVariable);
++accumulatorIndex;
@@ -139,8 +126,7 @@
// If the last statement is a for loop with an initializer expression, try
// to pull that expression into an initializer as well.
- pullFromForLoop:
- if (accumulatorIndex < accumulator.length &&
+ pullFromForLoop: if (accumulatorIndex < accumulator.length &&
accumulator[accumulatorIndex] is js.For) {
js.For forLoop = accumulator[accumulatorIndex];
if (forLoop.init is! js.Assignment) break pullFromForLoop;
@@ -156,8 +142,7 @@
if (!declaredVariables.add(use.name)) break pullFromForLoop;
js.VariableInitialization jsVariable = new js.VariableInitialization(
- new js.VariableDeclaration(use.name),
- assign.value);
+ new js.VariableDeclaration(use.name), assign.value);
jsVariables.add(jsVariable);
// Remove the initializer from the for loop.
@@ -174,16 +159,16 @@
for (tree_ir.Variable variable in variableNames.keys) {
String name = getVariableName(variable);
if (declaredVariables.contains(name)) continue;
- js.VariableInitialization jsVariable = new js.VariableInitialization(
- new js.VariableDeclaration(name),
- null);
+ js.VariableInitialization jsVariable =
+ new js.VariableInitialization(new js.VariableDeclaration(name), null);
jsVariables.add(jsVariable);
}
if (jsVariables.length > 0) {
// Would be nice to avoid inserting at the beginning of list.
- accumulator.insert(0, new js.ExpressionStatement(
- new js.VariableDeclarationList(jsVariables)
+ accumulator.insert(
+ 0,
+ new js.ExpressionStatement(new js.VariableDeclarationList(jsVariables)
.withSourceInformation(function.sourceInformation)));
}
return new js.Fun(parameters, new js.Block(accumulator));
@@ -213,9 +198,8 @@
// Synthesize a variable name that isn't used elsewhere.
String prefix = variable.element == null ? 'v' : variable.element.name;
int counter = 0;
- name = glue.safeVariableName(variable.element == null
- ? '$prefix$counter'
- : variable.element.name);
+ name = glue.safeVariableName(
+ variable.element == null ? '$prefix$counter' : variable.element.name);
while (!usedVariableNames.add(name)) {
++counter;
name = '$prefix$counter';
@@ -235,7 +219,7 @@
}
giveup(tree_ir.Node node,
- [String reason = 'unimplemented in CodeGenerator']) {
+ [String reason = 'unimplemented in CodeGenerator']) {
throw new CodegenBailout(node, reason);
}
@@ -248,32 +232,28 @@
}
js.Expression buildConstant(ConstantValue constant,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
registry.registerCompileTimeConstant(constant);
- return glue.constantReference(constant)
+ return glue
+ .constantReference(constant)
.withSourceInformation(sourceInformation);
}
@override
js.Expression visitConstant(tree_ir.Constant node) {
- return buildConstant(
- node.value,
- sourceInformation: node.sourceInformation);
+ return buildConstant(node.value, sourceInformation: node.sourceInformation);
}
- js.Expression buildStaticInvoke(Element target,
- List<js.Expression> arguments,
- {SourceInformation sourceInformation}) {
+ js.Expression buildStaticInvoke(Element target, List<js.Expression> arguments,
+ {SourceInformation sourceInformation}) {
if (target.isConstructor) {
// TODO(johnniwinther): Avoid dependency on [isGenerativeConstructor] by
// using backend-specific [StatisUse] classes.
- registry.registerStaticUse(
- new StaticUse.constructorInvoke(target.declaration,
- new CallStructure.unnamed(arguments.length)));
+ registry.registerStaticUse(new StaticUse.constructorInvoke(
+ target.declaration, new CallStructure.unnamed(arguments.length)));
} else {
- registry.registerStaticUse(
- new StaticUse.staticInvoke(target.declaration,
- new CallStructure.unnamed(arguments.length)));
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ target.declaration, new CallStructure.unnamed(arguments.length)));
}
js.Expression elementAccess = glue.staticFunctionAccess(target);
return new js.Call(elementAccess, arguments,
@@ -287,9 +267,7 @@
registry.registerInstantiation(node.type);
FunctionElement target = node.target;
List<js.Expression> arguments = visitExpressionList(node.arguments);
- return buildStaticInvoke(
- target,
- arguments,
+ return buildStaticInvoke(target, arguments,
sourceInformation: node.sourceInformation);
}
@@ -306,9 +284,11 @@
js.Expression visitInvokeMethod(tree_ir.InvokeMethod node) {
TypeMask mask = glue.extendMaskIfReachesAll(node.selector, node.mask);
registerMethodInvoke(node.selector, mask);
- return js.propertyCall(visitExpression(node.receiver),
- glue.invocationName(node.selector),
- visitExpressionList(node.arguments))
+ return js
+ .propertyCall(
+ visitExpression(node.receiver),
+ glue.invocationName(node.selector),
+ visitExpressionList(node.arguments))
.withSourceInformation(node.sourceInformation);
}
@@ -317,7 +297,7 @@
FunctionElement target = node.target;
List<js.Expression> arguments = visitExpressionList(node.arguments);
return buildStaticInvoke(target, arguments,
- sourceInformation: node.sourceInformation);
+ sourceInformation: node.sourceInformation);
}
@override
@@ -327,44 +307,43 @@
// will be created, and that this tear-off must bypass ordinary
// dispatch to ensure the super method is invoked.
registry.registerStaticUse(new StaticUse.staticInvoke(
- glue.closureFromTearOff, new CallStructure.unnamed(
- glue.closureFromTearOff.parameters.length)));
+ glue.closureFromTearOff,
+ new CallStructure.unnamed(
+ glue.closureFromTearOff.parameters.length)));
registry.registerStaticUse(new StaticUse.superTearOff(node.target));
}
if (node.target is ConstructorBodyElement) {
- registry.registerStaticUse(
- new StaticUse.constructorBodyInvoke(
- node.target.declaration,
- new CallStructure.unnamed(node.arguments.length)));
+ registry.registerStaticUse(new StaticUse.constructorBodyInvoke(
+ node.target.declaration,
+ new CallStructure.unnamed(node.arguments.length)));
// A constructor body cannot be overriden or intercepted, so we can
// use the short form for this invocation.
- return js.js('#.#(#)',
- [visitExpression(node.receiver),
- glue.instanceMethodName(node.target),
- visitExpressionList(node.arguments)])
- .withSourceInformation(node.sourceInformation);
+ return js.js('#.#(#)', [
+ visitExpression(node.receiver),
+ glue.instanceMethodName(node.target),
+ visitExpressionList(node.arguments)
+ ]).withSourceInformation(node.sourceInformation);
}
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- node.target.declaration,
- new CallStructure.unnamed(node.arguments.length)));
- return js.js('#.#.call(#, #)',
- [glue.prototypeAccess(node.target.enclosingClass),
- glue.invocationName(node.selector),
- visitExpression(node.receiver),
- visitExpressionList(node.arguments)])
- .withSourceInformation(node.sourceInformation);
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ node.target.declaration,
+ new CallStructure.unnamed(node.arguments.length)));
+ return js.js('#.#.call(#, #)', [
+ glue.prototypeAccess(node.target.enclosingClass),
+ glue.invocationName(node.selector),
+ visitExpression(node.receiver),
+ visitExpressionList(node.arguments)
+ ]).withSourceInformation(node.sourceInformation);
}
@override
js.Expression visitOneShotInterceptor(tree_ir.OneShotInterceptor node) {
registerMethodInvoke(node.selector, node.mask);
registry.registerUseInterceptor();
- return js.js('#.#(#)',
- [glue.getInterceptorLibrary(),
- glue.registerOneShotInterceptor(node.selector),
- visitExpressionList(node.arguments)])
- .withSourceInformation(node.sourceInformation);
+ return js.js('#.#(#)', [
+ glue.getInterceptorLibrary(),
+ glue.registerOneShotInterceptor(node.selector),
+ visitExpressionList(node.arguments)
+ ]).withSourceInformation(node.sourceInformation);
}
@override
@@ -377,9 +356,7 @@
@override
js.Expression visitLogicalOperator(tree_ir.LogicalOperator node) {
return new js.Binary(
- node.operator,
- visitExpression(node.left),
- visitExpression(node.right));
+ node.operator, visitExpression(node.left), visitExpression(node.right));
}
@override
@@ -431,9 +408,9 @@
}
// TODO(sra): Implement fast cast via calling 'boolTypeCast'.
} else if (node.isTypeTest &&
- node.typeArguments.isEmpty &&
- glue.mayGenerateInstanceofCheck(type) &&
- tryRegisterInstanceofCheck(clazz)) {
+ node.typeArguments.isEmpty &&
+ glue.mayGenerateInstanceofCheck(type) &&
+ tryRegisterInstanceofCheck(clazz)) {
return js.js('# instanceof #', [value, glue.constructorAccess(clazz)]);
}
@@ -449,9 +426,8 @@
//
// Any of the last two arguments may be null if there are no type
// arguments, and/or if no substitution is required.
- Element function = node.isTypeTest
- ? glue.getCheckSubtype()
- : glue.getSubtypeCast();
+ Element function =
+ node.isTypeTest ? glue.getCheckSubtype() : glue.getSubtypeCast();
js.Expression isT = js.quoteName(glue.getTypeTestTag(type));
@@ -464,8 +440,7 @@
: new js.LiteralNull();
return buildStaticHelperInvocation(
- function,
- <js.Expression>[value, isT, typeArgumentArray, asT]);
+ function, <js.Expression>[value, isT, typeArgumentArray, asT]);
} else if (type is TypeVariableType || type is FunctionType) {
registry.registerTypeUse(new TypeUse.isCheck(type));
@@ -477,8 +452,7 @@
js.Expression typeValue = typeArguments.single;
return buildStaticHelperInvocation(
- function,
- <js.Expression>[value, typeValue]);
+ function, <js.Expression>[value, typeValue]);
}
return giveup(node, 'type check unimplemented for $type.');
}
@@ -526,19 +500,16 @@
bool isCompoundableBuiltin(tree_ir.Expression exp) {
return exp is tree_ir.ApplyBuiltinOperator &&
- exp.arguments.length == 2 &&
- isCompoundableOperator(exp.operator);
+ exp.arguments.length == 2 &&
+ isCompoundableOperator(exp.operator);
}
bool isOneConstant(tree_ir.Expression exp) {
return exp is tree_ir.Constant && exp.value.isOne;
}
- js.Expression makeAssignment(
- js.Expression leftHand,
- tree_ir.Expression value,
- {SourceInformation sourceInformation,
- BuiltinOperator compound}) {
+ js.Expression makeAssignment(js.Expression leftHand, tree_ir.Expression value,
+ {SourceInformation sourceInformation, BuiltinOperator compound}) {
if (isOneConstant(value)) {
if (compound == BuiltinOperator.NumAdd) {
return new js.Prefix('++', leftHand)
@@ -550,8 +521,8 @@
}
}
if (compound != null) {
- return new js.Assignment.compound(leftHand,
- getAsCompoundOperator(compound), visitExpression(value))
+ return new js.Assignment.compound(
+ leftHand, getAsCompoundOperator(compound), visitExpression(value))
.withSourceInformation(sourceInformation);
}
return new js.Assignment(leftHand, visitExpression(value))
@@ -566,12 +537,12 @@
tree_ir.Expression left = rhs.arguments[0];
tree_ir.Expression right = rhs.arguments[1];
if (left is tree_ir.VariableUse && left.variable == node.variable) {
- return makeAssignment(variable, right, compound: rhs.operator,
- sourceInformation: node.sourceInformation);
+ return makeAssignment(variable, right,
+ compound: rhs.operator, sourceInformation: node.sourceInformation);
}
}
- return makeAssignment(
- variable, node.value, sourceInformation: node.sourceInformation);
+ return makeAssignment(variable, node.value,
+ sourceInformation: node.sourceInformation);
}
@override
@@ -594,14 +565,14 @@
/// target. This means jumping to [other] is equivalent to executing [node].
bool isEffectiveBreakTarget(tree_ir.Break node, tree_ir.Statement other) {
return node.target.binding.next == other ||
- other is tree_ir.Break && node.target == other.target;
+ other is tree_ir.Break && node.target == other.target;
}
/// True if the given break is equivalent to an unlabeled continue.
bool isShortContinue(tree_ir.Break node) {
tree_ir.Statement next = node.target.binding.next;
return next is tree_ir.Continue &&
- next.target.binding == shortContinue.target;
+ next.target.binding == shortContinue.target;
}
@override
@@ -628,8 +599,8 @@
if (node.next is tree_ir.Unreachable && emitUnreachableAsReturn.last) {
// Emit as 'return exp' to assist local analysis in the VM.
SourceInformation sourceInformation = node.expression.sourceInformation;
- accumulator.add(
- new js.Return(exp).withSourceInformation(sourceInformation));
+ accumulator
+ .add(new js.Return(exp).withSourceInformation(sourceInformation));
return null;
} else {
accumulator.add(new js.ExpressionStatement(exp));
@@ -643,7 +614,7 @@
bool isEndOfMethod(tree_ir.Statement node) {
return isNullReturn(node) ||
- node is tree_ir.Break && isNullReturn(node.target.binding.next);
+ node is tree_ir.Break && isNullReturn(node.target.binding.next);
}
@override
@@ -728,7 +699,7 @@
}
js.Expression makeSequence(List<tree_ir.Expression> list) {
- return list.map(visitExpression).reduce((x,y) => new js.Binary(',', x, y));
+ return list.map(visitExpression).reduce((x, y) => new js.Binary(',', x, y));
}
@override
@@ -746,7 +717,8 @@
js.Statement loopNode;
if (node.updates.isEmpty) {
loopNode = new js.While(condition, body);
- } else { // Compile as a for loop.
+ } else {
+ // Compile as a for loop.
js.Expression init;
if (accumulator.isNotEmpty &&
accumulator.last is js.ExpressionStatement) {
@@ -778,8 +750,8 @@
fallthrough.use();
}
shortBreak.pop();
- accumulator.add(
- insertLabel(node.label, new js.For(null, null, null, jsBody)));
+ accumulator
+ .add(insertLabel(node.label, new js.For(null, null, null, jsBody)));
}
bool isNull(tree_ir.Expression node) {
@@ -794,7 +766,7 @@
fallthrough.use();
} else {
accumulator.add(new js.Return(visitExpression(node.value))
- .withSourceInformation(node.sourceInformation));
+ .withSourceInformation(node.sourceInformation));
}
}
@@ -838,8 +810,7 @@
if (classElement is ClosureClassElement) {
registry.registerInstantiatedClosure(classElement.methodElement);
}
- js.Expression instance = new js.New(
- glue.constructorAccess(classElement),
+ js.Expression instance = new js.New(glue.constructorAccess(classElement),
visitExpressionList(node.arguments))
.withSourceInformation(node.sourceInformation);
@@ -847,8 +818,8 @@
if (typeInformation != null) {
FunctionElement helper = glue.getAddRuntimeTypeInformation();
js.Expression typeArguments = visitExpression(typeInformation);
- return buildStaticHelperInvocation(helper,
- <js.Expression>[instance, typeArguments],
+ return buildStaticHelperInvocation(
+ helper, <js.Expression>[instance, typeArguments],
sourceInformation: node.sourceInformation);
} else {
return instance;
@@ -862,8 +833,8 @@
js.Expression internalName =
js.quoteName(glue.invocationName(node.selector));
js.Expression kind = js.number(node.selector.invocationMirrorKind);
- js.Expression arguments = new js.ArrayInitializer(
- visitExpressionList(node.arguments));
+ js.Expression arguments =
+ new js.ArrayInitializer(visitExpressionList(node.arguments));
js.Expression argumentNames = new js.ArrayInitializer(
node.selector.namedArguments.map(js.string).toList(growable: false));
return buildStaticHelperInvocation(glue.createInvocationMirrorMethod,
@@ -881,29 +852,29 @@
registry.registerSpecializedGetInterceptor(interceptedClasses);
js.Name helperName = glue.getInterceptorName(interceptedClasses);
js.Expression globalHolder = glue.getInterceptorLibrary();
- return js.js('#.#(#)',
- [globalHolder, helperName, visitExpression(node.input)])
- .withSourceInformation(node.sourceInformation);
+ return js.js('#.#(#)', [
+ globalHolder,
+ helperName,
+ visitExpression(node.input)
+ ]).withSourceInformation(node.sourceInformation);
}
@override
js.Expression visitGetField(tree_ir.GetField node) {
registry.registerStaticUse(new StaticUse.fieldGet(node.field));
- return new js.PropertyAccess(
- visitExpression(node.object),
- glue.instanceFieldPropertyName(node.field))
+ return new js.PropertyAccess(visitExpression(node.object),
+ glue.instanceFieldPropertyName(node.field))
.withSourceInformation(node.sourceInformation);
}
@override
js.Expression visitSetField(tree_ir.SetField node) {
registry.registerStaticUse(new StaticUse.fieldSet(node.field));
- js.PropertyAccess field =
- new js.PropertyAccess(
- visitExpression(node.object),
- glue.instanceFieldPropertyName(node.field));
- return makeAssignment(field, node.value, compound: node.compound,
- sourceInformation: node.sourceInformation);
+ js.PropertyAccess field = new js.PropertyAccess(
+ visitExpression(node.object),
+ glue.instanceFieldPropertyName(node.field));
+ return makeAssignment(field, node.value,
+ compound: node.compound, sourceInformation: node.sourceInformation);
}
@override
@@ -913,8 +884,9 @@
// Tear off a method.
registry.registerStaticUse(
new StaticUse.staticTearOff(node.element.declaration));
- return glue.isolateStaticClosureAccess(node.element)
- .withSourceInformation(node.sourceInformation);
+ return glue
+ .isolateStaticClosureAccess(node.element)
+ .withSourceInformation(node.sourceInformation);
}
if (node.useLazyGetter) {
// Read a lazily initialized field.
@@ -925,20 +897,21 @@
sourceInformation: node.sourceInformation);
}
// Read an eagerly initialized field.
- registry.registerStaticUse(
- new StaticUse.staticGet(node.element.declaration));
- return glue.staticFieldAccess(node.element)
+ registry
+ .registerStaticUse(new StaticUse.staticGet(node.element.declaration));
+ return glue
+ .staticFieldAccess(node.element)
.withSourceInformation(node.sourceInformation);
}
@override
js.Expression visitSetStatic(tree_ir.SetStatic node) {
assert(node.element is FieldElement);
- registry.registerStaticUse(
- new StaticUse.staticSet(node.element.declaration));
+ registry
+ .registerStaticUse(new StaticUse.staticSet(node.element.declaration));
js.Expression field = glue.staticFieldAccess(node.element);
- return makeAssignment(field, node.value, compound: node.compound,
- sourceInformation: node.sourceInformation);
+ return makeAssignment(field, node.value,
+ compound: node.compound, sourceInformation: node.sourceInformation);
}
@override
@@ -949,8 +922,7 @@
@override
js.Expression visitGetIndex(tree_ir.GetIndex node) {
return new js.PropertyAccess(
- visitExpression(node.object),
- visitExpression(node.index));
+ visitExpression(node.object), visitExpression(node.index));
}
@override
@@ -961,24 +933,21 @@
}
js.Expression buildStaticHelperInvocation(
- FunctionElement helper,
- List<js.Expression> arguments,
+ FunctionElement helper, List<js.Expression> arguments,
{SourceInformation sourceInformation}) {
registry.registerStaticUse(new StaticUse.staticInvoke(
helper, new CallStructure.unnamed(arguments.length)));
- return buildStaticInvoke(
- helper, arguments, sourceInformation: sourceInformation);
+ return buildStaticInvoke(helper, arguments,
+ sourceInformation: sourceInformation);
}
@override
js.Expression visitReifyRuntimeType(tree_ir.ReifyRuntimeType node) {
js.Expression typeToString = buildStaticHelperInvocation(
- glue.getRuntimeTypeToString(),
- [visitExpression(node.value)],
+ glue.getRuntimeTypeToString(), [visitExpression(node.value)],
sourceInformation: node.sourceInformation);
return buildStaticHelperInvocation(
- glue.getCreateRuntimeType(),
- [typeToString],
+ glue.getCreateRuntimeType(), [typeToString],
sourceInformation: node.sourceInformation);
}
@@ -988,14 +957,12 @@
js.Expression index = js.number(glue.getTypeVariableIndex(node.variable));
if (glue.needsSubstitutionForTypeVariableAccess(context)) {
js.Expression typeName = glue.getRuntimeTypeName(context);
- return buildStaticHelperInvocation(
- glue.getRuntimeTypeArgument(),
+ return buildStaticHelperInvocation(glue.getRuntimeTypeArgument(),
[visitExpression(node.target), typeName, index],
sourceInformation: node.sourceInformation);
} else {
return buildStaticHelperInvocation(
- glue.getTypeArgumentByIndex(),
- [visitExpression(node.target), index],
+ glue.getTypeArgumentByIndex(), [visitExpression(node.target), index],
sourceInformation: node.sourceInformation);
}
}
@@ -1009,8 +976,8 @@
node.dartType, arguments, registry);
case tree_ir.TypeExpressionKind.INSTANCE:
// We expect only flat types for the INSTANCE representation.
- assert(node.dartType ==
- (node.dartType.element as ClassElement).thisType);
+ assert(
+ node.dartType == (node.dartType.element as ClassElement).thisType);
registry.registerInstantiatedClass(glue.listClass);
return new js.ArrayInitializer(arguments);
}
@@ -1020,14 +987,13 @@
if (node.dependency != null) {
// Dependency is only used if [node] calls a Dart function. Currently only
// through foreign function `RAW_DART_FUNCTION_REF`.
- registry.registerStaticUse(
- new StaticUse.staticInvoke(
- node.dependency,
- new CallStructure.unnamed(node.arguments.length)));
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ node.dependency, new CallStructure.unnamed(node.arguments.length)));
}
// TODO(sra,johnniwinther): Should this be in CodegenRegistry?
glue.registerNativeBehavior(node.nativeBehavior, node);
- return node.codeTemplate.instantiate(visitExpressionList(node.arguments))
+ return node.codeTemplate
+ .instantiate(visitExpressionList(node.arguments))
.withSourceInformation(node.sourceInformation);
}
@@ -1120,7 +1086,7 @@
return js.js('-#', args);
case BuiltinOperator.StringConcatenate:
if (args.isEmpty) return js.string('');
- return args.reduce((e1,e2) => new js.Binary('+', e1, e2));
+ return args.reduce((e1, e2) => new js.Binary('+', e1, e2));
case BuiltinOperator.CharCodeAt:
return js.js('#.charCodeAt(#)', args);
case BuiltinOperator.Identical:
@@ -1169,8 +1135,8 @@
/// Add a uint32 normalization `op >>> 0` to [op] if it is not in 31-bit
/// range.
- js.Expression normalizeBitOp(js.Expression op,
- tree_ir.ApplyBuiltinOperator node) {
+ js.Expression normalizeBitOp(
+ js.Expression op, tree_ir.ApplyBuiltinOperator node) {
const MAX_UINT31 = 0x7fffffff;
const MAX_UINT32 = 0xffffffff;
diff --git a/pkg/compiler/lib/src/js_backend/codegen/glue.dart b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
index 5b3f572..eafef0e 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/glue.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/glue.dart
@@ -4,30 +4,21 @@
library code_generator_dependencies;
-import '../backend_helpers.dart' show
- BackendHelpers;
+import '../backend_helpers.dart' show BackendHelpers;
import '../js_backend.dart';
import '../../common.dart';
-import '../../common/codegen.dart' show
- CodegenRegistry;
-import '../../compiler.dart' show
- Compiler;
+import '../../common/codegen.dart' show CodegenRegistry;
+import '../../compiler.dart' show Compiler;
import '../../constants/values.dart';
-import '../../dart_types.dart' show
- DartType,
- TypeVariableType,
- InterfaceType;
-import '../../enqueue.dart' show
- CodegenEnqueuer;
+import '../../dart_types.dart' show DartType, TypeVariableType, InterfaceType;
+import '../../enqueue.dart' show CodegenEnqueuer;
import '../../elements/elements.dart';
import '../../js_emitter/js_emitter.dart';
import '../../js/js.dart' as js;
import '../../native/native.dart' show NativeBehavior;
-import '../../universe/selector.dart' show
- Selector;
-import '../../world.dart' show
- ClassWorld;
+import '../../universe/selector.dart' show Selector;
+import '../../world.dart' show ClassWorld;
import '../../types/types.dart';
/// Encapsulates the dependencies of the function-compiler to the compiler,
@@ -148,7 +139,7 @@
}
js.Expression prototypeAccess(ClassElement e,
- {bool hasBeenInstantiated: false}) {
+ {bool hasBeenInstantiated: false}) {
return _emitter.prototypeAccess(e,
hasBeenInstantiated: hasBeenInstantiated);
}
@@ -232,12 +223,10 @@
}
js.Expression generateTypeRepresentation(DartType dartType,
- List<js.Expression> arguments,
- CodegenRegistry registry) {
+ List<js.Expression> arguments, CodegenRegistry registry) {
int variableIndex = 0;
- js.Expression representation = _backend.rtiEncoder.getTypeRepresentation(
- dartType,
- (_) => arguments[variableIndex++]);
+ js.Expression representation = _backend.rtiEncoder
+ .getTypeRepresentation(dartType, (_) => arguments[variableIndex++]);
assert(variableIndex == arguments.length);
// Representation contains JavaScript Arrays.
registry.registerInstantiatedClass(_helpers.jsArrayClass);
diff --git a/pkg/compiler/lib/src/js_backend/codegen/task.dart b/pkg/compiler/lib/src/js_backend/codegen/task.dart
index 853554f..061e44a 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/task.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/task.dart
@@ -12,13 +12,9 @@
import '../js_backend.dart';
import '../../common.dart';
-import '../../common/codegen.dart' show
- CodegenWorkItem;
-import '../../common/tasks.dart' show
- CompilerTask,
- GenericTask;
-import '../../compiler.dart' show
- Compiler;
+import '../../common/codegen.dart' show CodegenWorkItem;
+import '../../common/tasks.dart' show CompilerTask, GenericTask;
+import '../../compiler.dart' show Compiler;
import '../../constants/constant_system.dart';
import '../../cps_ir/cps_ir_builder_task.dart';
import '../../cps_ir/cps_ir_nodes.dart' as cps;
@@ -28,13 +24,11 @@
import '../../cps_ir/optimizers.dart' as cps_opt;
import '../../cps_ir/type_mask_system.dart';
import '../../cps_ir/finalize.dart' show Finalize;
-import '../../diagnostics/invariant.dart' show
- DEBUG_MODE;
+import '../../diagnostics/invariant.dart' show DEBUG_MODE;
import '../../elements/elements.dart';
import '../../js/js.dart' as js;
import '../../js_backend/codegen/codegen.dart';
-import '../../io/source_information.dart' show
- SourceInformationStrategy;
+import '../../io/source_information.dart' show SourceInformationStrategy;
import '../../tree_ir/tree_ir_builder.dart' as tree_builder;
import '../../tracer.dart';
import '../../ssa/ssa.dart' as ssa;
@@ -42,11 +36,8 @@
import '../../tree_ir/optimization/optimization.dart' as tree_opt;
import '../../tree_ir/tree_ir_integrity.dart';
import '../../tree_ir/tree_ir_nodes.dart' as tree_ir;
-import '../../types/types.dart' show
- FlatTypeMask,
- ForwardingTypeMask,
- TypeMask,
- UnionTypeMask;
+import '../../types/types.dart'
+ show FlatTypeMask, ForwardingTypeMask, TypeMask, UnionTypeMask;
class CpsFunctionCompiler implements FunctionCompiler {
final ConstantSystem constantSystem;
@@ -69,7 +60,7 @@
Inliner inliner;
CpsFunctionCompiler(Compiler compiler, JavaScriptBackend backend,
- SourceInformationStrategy sourceInformationFactory)
+ SourceInformationStrategy sourceInformationFactory)
: fallbackCompiler =
new ssa.SsaFunctionCompiler(backend, sourceInformationFactory),
cpsBuilderTask = new IrBuilderTask(compiler, sourceInformationFactory),
@@ -79,7 +70,7 @@
glue = new Glue(compiler),
cpsOptimizationTask = new GenericTask('CPS optimization', compiler),
treeBuilderTask = new GenericTask('Tree builder', compiler),
- treeOptimizationTask = new GenericTask('Tree optimization', compiler) {
+ treeOptimizationTask = new GenericTask('Tree optimization', compiler) {
inliner = new Inliner(this);
}
@@ -144,9 +135,8 @@
///
/// If [targetName] is given, functions whose name contains that substring
/// will be dumped out if the idempotency test fails.
- void debugCpsPass(cps_opt.Pass makePass(),
- cps.FunctionDefinition cpsFunction,
- [String targetName]) {
+ void debugCpsPass(cps_opt.Pass makePass(), cps.FunctionDefinition cpsFunction,
+ [String targetName]) {
String original = stringify(cpsFunction);
cps_opt.Pass pass = makePass();
pass.rewrite(cpsFunction);
@@ -165,9 +155,15 @@
print(before);
print('\n-->\n');
print(after);
- compiler.outputProvider('original', 'dump')..add(original)..close();
- compiler.outputProvider('before', 'dump')..add(before)..close();
- compiler.outputProvider('after', 'dump')..add(after)..close();
+ compiler.outputProvider('original', 'dump')
+ ..add(original)
+ ..close();
+ compiler.outputProvider('before', 'dump')
+ ..add(before)
+ ..close();
+ compiler.outputProvider('after', 'dump')
+ ..add(after)
+ ..close();
}
}
traceGraph(pass.passName, cpsFunction);
@@ -230,9 +226,8 @@
if (PRINT_TYPED_IR_FILTER != null &&
PRINT_TYPED_IR_FILTER.matchAsPrefix(cpsFunction.element.name) != null) {
String printType(nodeOrRef, String s) {
- cps.Node node = nodeOrRef is cps.Reference
- ? nodeOrRef.definition
- : nodeOrRef;
+ cps.Node node =
+ nodeOrRef is cps.Reference ? nodeOrRef.definition : nodeOrRef;
return node is cps.Variable && node.type != null
? '$s:${formatTypeMask(node.type)}'
: s;
@@ -294,8 +289,8 @@
tree_ir.FunctionDefinition compileToTreeIr(cps.FunctionDefinition cpsNode) {
applyCpsPass(new Finalize(backend), cpsNode);
- tree_builder.Builder builder = new tree_builder.Builder(
- reporter.internalError, glue);
+ tree_builder.Builder builder =
+ new tree_builder.Builder(reporter.internalError, glue);
tree_ir.FunctionDefinition treeNode =
treeBuilderTask.measure(() => builder.buildFunction(cpsNode));
assert(treeNode != null);
@@ -322,8 +317,8 @@
treeOptimizationTask.measure(() {
applyTreePass(new StatementRewriter());
- applyTreePass(new VariableMerger(minifying:
- compiler.options.enableMinification));
+ applyTreePass(
+ new VariableMerger(minifying: compiler.options.enableMinification));
applyTreePass(new LoopRewriter());
applyTreePass(new LogicalRewriter());
applyTreePass(new PullIntoInitializers());
@@ -332,8 +327,8 @@
return node;
}
- js.Fun compileToJavaScript(CodegenWorkItem work,
- tree_ir.FunctionDefinition definition) {
+ js.Fun compileToJavaScript(
+ CodegenWorkItem work, tree_ir.FunctionDefinition definition) {
CodeGenerator codeGen = new CodeGenerator(glue, work.registry);
Element element = work.element;
js.Fun code = codeGen.buildFunction(definition);
@@ -346,16 +341,16 @@
Iterable<CompilerTask> get tasks {
return <CompilerTask>[
- cpsBuilderTask,
- cpsOptimizationTask,
- treeBuilderTask,
- treeOptimizationTask]
- ..addAll(fallbackCompiler.tasks);
+ cpsBuilderTask,
+ cpsOptimizationTask,
+ treeBuilderTask,
+ treeOptimizationTask
+ ]..addAll(fallbackCompiler.tasks);
}
js.Node attachPosition(js.Node node, AstElement element) {
- return node.withSourceInformation(
- sourceInformationFactory.createBuilderForContext(element)
- .buildDeclaration(element));
+ return node.withSourceInformation(sourceInformationFactory
+ .createBuilderForContext(element)
+ .buildDeclaration(element));
}
}
diff --git a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
index f7ff67f..3c0f485 100644
--- a/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
+++ b/pkg/compiler/lib/src/js_backend/codegen/unsugar.dart
@@ -107,18 +107,17 @@
// body;
//
CpsFragment cps = new CpsFragment();
- Primitive isNull = cps.applyBuiltin(
- BuiltinOperator.Identical,
+ Primitive isNull = cps.applyBuiltin(BuiltinOperator.Identical,
<Primitive>[function.parameters.single, cps.makeNull()]);
CpsFragment trueBranch = cps.ifTruthy(isNull);
- trueBranch.invokeContinuation(function.returnContinuation,
- <Primitive>[trueBranch.makeFalse()]);
+ trueBranch.invokeContinuation(
+ function.returnContinuation, <Primitive>[trueBranch.makeFalse()]);
cps.insertAbove(function.body);
}
/// Insert a static call to [function] immediately above [node].
- Primitive insertStaticCallAbove(FunctionElement function,
- List<Primitive> arguments, Expression node) {
+ Primitive insertStaticCallAbove(
+ FunctionElement function, List<Primitive> arguments, Expression node) {
// TODO(johnniwinther): Come up with an implementation of SourceInformation
// for calls such as this one that don't appear in the original source.
InvokeStatic invoke = new InvokeStatic(
@@ -152,9 +151,7 @@
if (stackTraceParameter.hasAtLeastOneUse) {
InvokeStatic stackTraceValue = insertStaticCallAbove(
- _glue.getTraceFromException(),
- [_exceptionParameter],
- body);
+ _glue.getTraceFromException(), [_exceptionParameter], body);
stackTraceParameter.replaceUsesWith(stackTraceValue);
}
}
@@ -171,9 +168,7 @@
processThrow(Throw node) {
// The subexpression of throw is wrapped in the JavaScript output.
Primitive wrappedException = insertStaticCallAbove(
- _glue.getWrapExceptionHelper(),
- [node.value],
- node);
+ _glue.getWrapExceptionHelper(), [node.value], node);
node.valueRef.changeTo(wrappedException);
}
@@ -201,10 +196,8 @@
if (node.selector == Selectors.equals &&
node.argumentRefs.length == 1 &&
isNullConstant(node.argument(0))) {
- node.replaceWith(new ApplyBuiltinOperator(
- BuiltinOperator.Identical,
- [node.receiver, node.argument(0)],
- node.sourceInformation));
+ node.replaceWith(new ApplyBuiltinOperator(BuiltinOperator.Identical,
+ [node.receiver, node.argument(0)], node.sourceInformation));
return;
}
diff --git a/pkg/compiler/lib/src/js_backend/constant_emitter.dart b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
index 9bb1417..fc53cb4 100644
--- a/pkg/compiler/lib/src/js_backend/constant_emitter.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_emitter.dart
@@ -15,13 +15,11 @@
* (if there are some). It is hence up to that function to decide which
* constants should be inlined or not.
*/
-class ConstantEmitter
- implements ConstantValueVisitor<jsAst.Expression, Null> {
-
+class ConstantEmitter implements ConstantValueVisitor<jsAst.Expression, Null> {
// Matches blank lines, comment lines and trailing comments that can't be part
// of a string.
static final RegExp COMMENT_RE =
- new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''' , multiLine: true);
+ new RegExp(r'''^ *(//.*)?\n| *//[^''"\n]*$''', multiLine: true);
final Compiler compiler;
final Namer namer;
@@ -66,12 +64,11 @@
return new jsAst.LiteralNull();
}
- static final _exponentialRE = new RegExp(
- '^'
- '\([-+]?\)' // 1: sign
- '\([0-9]+\)' // 2: leading digit(s)
+ static final _exponentialRE = new RegExp('^'
+ '\([-+]?\)' // 1: sign
+ '\([0-9]+\)' // 2: leading digit(s)
'\(\.\([0-9]*\)\)?' // 4: fraction digits
- 'e\([-+]?[0-9]+\)' // 5: exponent with sign
+ 'e\([-+]?[0-9]+\)' // 5: exponent with sign
r'$');
/// Reduces the size of exponential representations when minification is
@@ -154,7 +151,7 @@
@override
jsAst.Expression visitString(StringConstantValue constant, [_]) {
return js.escapedString(constant.primitiveValue.slowToString(),
- ascii: true);
+ ascii: true);
}
@override
@@ -189,7 +186,8 @@
jsAst.Expression jsGeneralMap() {
List<jsAst.Expression> data = <jsAst.Expression>[];
for (int i = 0; i < constant.keys.length; i++) {
- jsAst.Expression keyExpression = constantReferenceGenerator(constant.keys[i]);
+ jsAst.Expression keyExpression =
+ constantReferenceGenerator(constant.keys[i]);
jsAst.Expression valueExpression =
constantReferenceGenerator(constant.values[i]);
data.add(keyExpression);
@@ -208,32 +206,32 @@
int emittedArgumentCount = 0;
classElement.implementation.forEachInstanceField(
(ClassElement enclosing, Element field) {
- if (field.name == JavaScriptMapConstant.LENGTH_NAME) {
- arguments.add(
- new jsAst.LiteralNumber('${constant.keyList.entries.length}'));
- } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) {
- arguments.add(jsMap());
- } else if (field.name == JavaScriptMapConstant.KEYS_NAME) {
- arguments.add(constantReferenceGenerator(constant.keyList));
- } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) {
- assert(constant.protoValue != null);
- arguments.add(constantReferenceGenerator(constant.protoValue));
- } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
- arguments.add(jsGeneralMap());
- } else {
- reporter.internalError(field,
- "Compiler has unexpected field ${field.name} for "
- "${className}.");
- }
- emittedArgumentCount++;
- },
- includeSuperAndInjectedMembers: true);
+ if (field.name == JavaScriptMapConstant.LENGTH_NAME) {
+ arguments
+ .add(new jsAst.LiteralNumber('${constant.keyList.entries.length}'));
+ } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) {
+ arguments.add(jsMap());
+ } else if (field.name == JavaScriptMapConstant.KEYS_NAME) {
+ arguments.add(constantReferenceGenerator(constant.keyList));
+ } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) {
+ assert(constant.protoValue != null);
+ arguments.add(constantReferenceGenerator(constant.protoValue));
+ } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
+ arguments.add(jsGeneralMap());
+ } else {
+ reporter.internalError(
+ field,
+ "Compiler has unexpected field ${field.name} for "
+ "${className}.");
+ }
+ emittedArgumentCount++;
+ }, includeSuperAndInjectedMembers: true);
if ((className == JavaScriptMapConstant.DART_STRING_CLASS &&
- emittedArgumentCount != 3) ||
+ emittedArgumentCount != 3) ||
(className == JavaScriptMapConstant.DART_PROTO_CLASS &&
- emittedArgumentCount != 4) ||
+ emittedArgumentCount != 4) ||
(className == JavaScriptMapConstant.DART_GENERAL_CLASS &&
- emittedArgumentCount != 1)) {
+ emittedArgumentCount != 1)) {
reporter.internalError(classElement,
"Compiler and ${className} disagree on number of fields.");
}
@@ -255,7 +253,7 @@
DartType type = constant.representedType;
jsAst.Name typeName = namer.runtimeTypeName(type.element);
return new jsAst.Call(getHelperProperty(backend.helpers.createRuntimeType),
- [js.quoteName(typeName)]);
+ [js.quoteName(typeName)]);
}
@override
@@ -275,7 +273,7 @@
return constant.payload;
default:
reporter.internalError(NO_LOCATION_SPANNABLE,
- "Unexpected DummyConstantKind ${constant.kind}");
+ "Unexpected DummyConstantKind ${constant.kind}");
return null;
}
}
@@ -283,16 +281,15 @@
@override
jsAst.Expression visitConstructed(ConstructedConstantValue constant, [_]) {
Element element = constant.type.element;
- if (backend.isForeign(element)
- && element.name == 'JS_CONST') {
+ if (backend.isForeign(element) && element.name == 'JS_CONST') {
StringConstantValue str = constant.fields.values.single;
String value = str.primitiveValue.slowToString();
return new jsAst.LiteralExpression(stripComments(value));
}
jsAst.Expression constructor =
backend.emitter.constructorAccess(constant.type.element);
- List<jsAst.Expression> fields =
- constant.fields.values.map(constantReferenceGenerator)
+ List<jsAst.Expression> fields = constant.fields.values
+ .map(constantReferenceGenerator)
.toList(growable: false);
jsAst.New instantiation = new jsAst.New(constructor, fields);
return maybeAddTypeArguments(constant.type, instantiation);
@@ -302,16 +299,16 @@
return rawJavaScript.replaceAll(COMMENT_RE, '');
}
- jsAst.Expression maybeAddTypeArguments(InterfaceType type,
- jsAst.Expression value) {
+ jsAst.Expression maybeAddTypeArguments(
+ InterfaceType type, jsAst.Expression value) {
if (type is InterfaceType &&
!type.treatAsRaw &&
backend.classNeedsRti(type.element)) {
InterfaceType interface = type;
RuntimeTypesEncoder rtiEncoder = backend.rtiEncoder;
- Iterable<jsAst.Expression> arguments = interface.typeArguments
- .map((DartType type) =>
- rtiEncoder.getTypeRepresentationWithPlaceholders(type, (_){}));
+ Iterable<jsAst.Expression> arguments = interface.typeArguments.map(
+ (DartType type) =>
+ rtiEncoder.getTypeRepresentationWithPlaceholders(type, (_) {}));
jsAst.Expression argumentList =
new jsAst.ArrayInitializer(arguments.toList());
return new jsAst.Call(
diff --git a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
index dcb5661..f300312 100644
--- a/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_handler_javascript.dart
@@ -17,8 +17,7 @@
JavaScriptConstantTask(Compiler compiler)
: this.dartConstantCompiler = new DartConstantCompiler(compiler),
- this.jsConstantCompiler =
- new JavaScriptConstantCompiler(compiler),
+ this.jsConstantCompiler = new JavaScriptConstantCompiler(compiler),
super(compiler);
String get name => 'ConstantHandler';
@@ -66,20 +65,18 @@
}
ConstantExpression compileNode(Node node, TreeElements elements,
- {bool enforceConst: true}) {
+ {bool enforceConst: true}) {
return measure(() {
- ConstantExpression result =
- dartConstantCompiler.compileNode(node, elements,
- enforceConst: enforceConst);
+ ConstantExpression result = dartConstantCompiler
+ .compileNode(node, elements, enforceConst: enforceConst);
jsConstantCompiler.compileNode(node, elements,
enforceConst: enforceConst);
return result;
});
}
- ConstantExpression compileMetadata(MetadataAnnotation metadata,
- Node node,
- TreeElements elements) {
+ ConstantExpression compileMetadata(
+ MetadataAnnotation metadata, Node node, TreeElements elements) {
return measure(() {
ConstantExpression constant =
dartConstantCompiler.compileMetadata(metadata, node, elements);
@@ -92,10 +89,10 @@
// expressions.
@override
void copyConstantValues(JavaScriptConstantTask task) {
- jsConstantCompiler.constantValueMap.addAll(
- task.jsConstantCompiler.constantValueMap);
- dartConstantCompiler.constantValueMap.addAll(
- task.dartConstantCompiler.constantValueMap);
+ jsConstantCompiler.constantValueMap
+ .addAll(task.jsConstantCompiler.constantValueMap);
+ dartConstantCompiler.constantValueMap
+ .addAll(task.dartConstantCompiler.constantValueMap);
}
}
@@ -106,7 +103,6 @@
*/
class JavaScriptConstantCompiler extends ConstantCompilerBase
implements BackendConstantEnvironment {
-
/** Set of all registered compiled constants. */
final Set<ConstantValue> compiledConstants = new Set<ConstantValue>();
@@ -125,15 +121,15 @@
JavaScriptConstantCompiler(Compiler compiler)
: super(compiler, JAVA_SCRIPT_CONSTANT_SYSTEM);
- ConstantExpression compileVariableWithDefinitions(VariableElement element,
- TreeElements definitions,
- {bool isConst: false,
- bool checkType: true}) {
+ ConstantExpression compileVariableWithDefinitions(
+ VariableElement element, TreeElements definitions,
+ {bool isConst: false, bool checkType: true}) {
if (!isConst && lazyStatics.contains(element)) {
return null;
}
ConstantExpression value = super.compileVariableWithDefinitions(
- element, definitions, isConst: isConst, checkType: checkType);
+ element, definitions,
+ isConst: isConst, checkType: checkType);
if (!isConst && value == null) {
lazyStatics.add(element);
}
@@ -152,10 +148,10 @@
Iterable<VariableElement> getStaticNonFinalFieldsForEmission() {
return initialVariableValues.keys.where((element) {
return element.kind == ElementKind.FIELD &&
- !element.isInstanceMember &&
- !element.modifiers.isFinal &&
- // The const fields are all either emitted elsewhere or inlined.
- !element.modifiers.isConst;
+ !element.isInstanceMember &&
+ !element.modifiers.isFinal &&
+ // The const fields are all either emitted elsewhere or inlined.
+ !element.modifiers.isConst;
});
}
@@ -202,13 +198,13 @@
}
ConstantExpression compileNode(Node node, TreeElements elements,
- {bool enforceConst: true}) {
+ {bool enforceConst: true}) {
return compileNodeWithDefinitions(node, elements, isConst: enforceConst);
}
- ConstantExpression compileNodeWithDefinitions(Node node,
- TreeElements definitions,
- {bool isConst: true}) {
+ ConstantExpression compileNodeWithDefinitions(
+ Node node, TreeElements definitions,
+ {bool isConst: true}) {
ConstantExpression constant = nodeConstantMap[node];
if (constant != null && getConstantValue(constant) != null) {
return constant;
@@ -238,9 +234,7 @@
}
ConstantExpression compileMetadata(
- MetadataAnnotation metadata,
- Node node,
- TreeElements elements) {
+ MetadataAnnotation metadata, Node node, TreeElements elements) {
ConstantExpression constant =
super.compileMetadata(metadata, node, elements);
metadataConstantMap[metadata] = constant;
@@ -269,8 +263,8 @@
}
}
- void visitFunctionElement(FunctionElement e,
- JavaScriptConstantCompiler constants) {
+ void visitFunctionElement(
+ FunctionElement e, JavaScriptConstantCompiler constants) {
super.visitFunctionElement(e, constants);
if (e.hasFunctionSignature) {
e.functionSignature.forEachParameter((p) => visit(p, constants));
@@ -288,12 +282,12 @@
constants.nodeConstantMap.remove(node);
// TODO(ahe): This doesn't belong here. Rename this class and generalize.
- var closureClassMap =
- constants.compiler.closureToClassMapper.closureMappingCache
+ var closureClassMap = constants
+ .compiler.closureToClassMapper.closureMappingCache
.remove(node);
if (closureClassMap != null) {
- closureClassMap.removeMyselfFrom(
- constants.compiler.enqueuer.codegen.universe);
+ closureClassMap
+ .removeMyselfFrom(constants.compiler.enqueuer.codegen.universe);
}
}
}
diff --git a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
index f6ebd07..add7563 100644
--- a/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
+++ b/pkg/compiler/lib/src/js_backend/constant_system_javascript.dart
@@ -4,19 +4,14 @@
library dart2js.constant_system.js;
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constants/values.dart';
import '../constant_system_dart.dart';
-import '../core_types.dart' show
- CoreTypes;
+import '../core_types.dart' show CoreTypes;
import '../dart_types.dart';
-import '../elements/elements.dart' show
- ClassElement;
-import '../tree/tree.dart' show
- DartString,
- LiteralDartString;
+import '../elements/elements.dart' show ClassElement;
+import '../tree/tree.dart' show DartString, LiteralDartString;
import 'js_backend.dart';
const JAVA_SCRIPT_CONSTANT_SYSTEM = const JavaScriptConstantSystem();
@@ -30,8 +25,8 @@
if (constant.isMinusZero) constant = DART_CONSTANT_SYSTEM.createInt(0);
IntConstantValue intConstant = constant;
// We convert the result of bit-operations to 32 bit unsigned integers.
- return
- JAVA_SCRIPT_CONSTANT_SYSTEM.createInt32(~intConstant.primitiveValue);
+ return JAVA_SCRIPT_CONSTANT_SYSTEM
+ .createInt32(~intConstant.primitiveValue);
}
return null;
}
@@ -236,7 +231,8 @@
} else if (constant.isDouble) {
DoubleConstantValue doubleResult = constant;
double doubleValue = doubleResult.primitiveValue;
- if (!doubleValue.isInfinite && !doubleValue.isNaN &&
+ if (!doubleValue.isInfinite &&
+ !doubleValue.isNaN &&
!constant.isMinusZero) {
int intValue = doubleValue.truncate();
if (intValue == doubleValue) {
@@ -253,24 +249,23 @@
}
NumConstantValue createInt32(int i) => new IntConstantValue(i & BITS32);
- NumConstantValue createDouble(double d)
- => convertToJavaScriptConstant(new DoubleConstantValue(d));
+ NumConstantValue createDouble(double d) =>
+ convertToJavaScriptConstant(new DoubleConstantValue(d));
StringConstantValue createString(DartString string) {
return new StringConstantValue(string);
}
+
BoolConstantValue createBool(bool value) => new BoolConstantValue(value);
NullConstantValue createNull() => new NullConstantValue();
@override
- ListConstantValue createList(InterfaceType type,
- List<ConstantValue> values) {
+ ListConstantValue createList(InterfaceType type, List<ConstantValue> values) {
return new ListConstantValue(type, values);
}
@override
ConstantValue createType(Compiler compiler, DartType type) {
- return new TypeConstantValue(
- type,
+ return new TypeConstantValue(type,
compiler.backend.typeImplementation.computeType(compiler.resolution));
}
@@ -281,12 +276,14 @@
//
// We consistently match that runtime semantics at compile time as well.
bool isInt(ConstantValue constant) {
- return constant.isInt || constant.isMinusZero ||
+ return constant.isInt ||
+ constant.isMinusZero ||
constant.isPositiveInfinity ||
constant.isNegativeInfinity;
}
- bool isDouble(ConstantValue constant)
- => constant.isDouble && !constant.isMinusZero;
+
+ bool isDouble(ConstantValue constant) =>
+ constant.isDouble && !constant.isMinusZero;
bool isString(ConstantValue constant) => constant.isString;
bool isBool(ConstantValue constant) => constant.isBool;
bool isNull(ConstantValue constant) => constant.isNull;
@@ -302,16 +299,14 @@
return types.isSubtype(s, t);
}
- MapConstantValue createMap(Compiler compiler,
- InterfaceType sourceType,
- List<ConstantValue> keys,
- List<ConstantValue> values) {
+ MapConstantValue createMap(Compiler compiler, InterfaceType sourceType,
+ List<ConstantValue> keys, List<ConstantValue> values) {
JavaScriptBackend backend = compiler.backend;
CoreTypes coreTypes = compiler.coreTypes;
bool onlyStringKeys = true;
ConstantValue protoValue = null;
- for (int i = 0; i < keys.length ; i++) {
+ for (int i = 0; i < keys.length; i++) {
var key = keys[i];
if (key.isString) {
if (key.primitiveValue == JavaScriptMapConstant.PROTO_PROPERTY) {
@@ -334,8 +329,9 @@
}
ListConstantValue keysList = new ListConstantValue(keysType, keys);
String className = onlyStringKeys
- ? (hasProtoKey ? JavaScriptMapConstant.DART_PROTO_CLASS
- : JavaScriptMapConstant.DART_STRING_CLASS)
+ ? (hasProtoKey
+ ? JavaScriptMapConstant.DART_PROTO_CLASS
+ : JavaScriptMapConstant.DART_STRING_CLASS)
: JavaScriptMapConstant.DART_GENERAL_CLASS;
ClassElement classElement = backend.helpers.jsHelperLibrary.find(className);
classElement.ensureResolved(compiler.resolution);
@@ -348,7 +344,6 @@
}
return new JavaScriptMapConstant(
type, keysList, values, protoValue, onlyStringKeys);
-
}
}
@@ -375,11 +370,8 @@
final ConstantValue protoValue;
final bool onlyStringKeys;
- JavaScriptMapConstant(InterfaceType type,
- ListConstantValue keyList,
- List<ConstantValue> values,
- this.protoValue,
- this.onlyStringKeys)
+ JavaScriptMapConstant(InterfaceType type, ListConstantValue keyList,
+ List<ConstantValue> values, this.protoValue, this.onlyStringKeys)
: this.keyList = keyList,
super(type, keyList.entries, values);
bool get isMap => true;
diff --git a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
index 1a5e287..450b826 100644
--- a/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/custom_elements_analysis.dart
@@ -120,7 +120,6 @@
codegenJoin.computeEscapingConstructors(classElement);
}
-
class CustomElementsAnalysisJoin {
final JavaScriptBackend backend;
Compiler get compiler => backend.compiler;
@@ -200,8 +199,7 @@
}
}
classElement.forEachMember(selectGenerativeConstructors,
- includeBackendMembers: false,
- includeSuperAndInjectedMembers: false);
+ includeBackendMembers: false, includeSuperAndInjectedMembers: false);
return result;
}
}
diff --git a/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart b/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart
index c821aea..cfc0136 100644
--- a/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart
+++ b/pkg/compiler/lib/src/js_backend/field_naming_mixin.dart
@@ -146,8 +146,8 @@
}
factory _FieldNamingScope.forBox(Local box, _FieldNamingRegistry registry) {
- return registry.scopes.putIfAbsent(
- box, () => new _BoxFieldNamingScope(box, registry));
+ return registry.scopes
+ .putIfAbsent(box, () => new _BoxFieldNamingScope(box, registry));
}
_FieldNamingScope.rootScope(this.container, this.registry)
diff --git a/pkg/compiler/lib/src/js_backend/frequency_namer.dart b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
index fa3b79b..7698c3d 100644
--- a/pkg/compiler/lib/src/js_backend/frequency_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/frequency_namer.dart
@@ -4,8 +4,9 @@
part of js_backend;
-class FrequencyBasedNamer extends Namer with _MinifiedFieldNamer,
- _MinifiedOneShotInterceptorNamer implements jsAst.TokenFinalizer {
+class FrequencyBasedNamer extends Namer
+ with _MinifiedFieldNamer, _MinifiedOneShotInterceptorNamer
+ implements jsAst.TokenFinalizer {
_FieldNamingRegistry fieldRegistry;
List<TokenName> tokens = new List<TokenName>();
@@ -45,19 +46,15 @@
@override
jsAst.Name getFreshName(NamingScope scope, String proposedName,
- {bool sanitizeForNatives: false,
- bool sanitizeForAnnotations: false}) {
+ {bool sanitizeForNatives: false, bool sanitizeForAnnotations: false}) {
// Grab the scope for this token
- TokenScope tokenScope = _tokenScopes.putIfAbsent(scope,
- () => newScopeFor(scope));
+ TokenScope tokenScope =
+ _tokenScopes.putIfAbsent(scope, () => newScopeFor(scope));
// Get the name the normal namer would use as a key.
- String proposed = _generateFreshStringForName(proposedName,
- scope,
- sanitizeForNatives:
- sanitizeForNatives,
- sanitizeForAnnotations:
- sanitizeForAnnotations);
+ String proposed = _generateFreshStringForName(proposedName, scope,
+ sanitizeForNatives: sanitizeForNatives,
+ sanitizeForAnnotations: sanitizeForAnnotations);
TokenName name = new TokenName(tokenScope, proposed);
tokens.add(name);
@@ -136,9 +133,8 @@
proposal = new String.fromCharCodes(_nextName);
_incrementName();
} while (MinifyNamer._hasBannedPrefix(proposal) ||
- illegalNames.contains(proposal));
+ illegalNames.contains(proposal));
return proposal;
}
}
-
diff --git a/pkg/compiler/lib/src/js_backend/js_backend.dart b/pkg/compiler/lib/src/js_backend/js_backend.dart
index 2704c0a..ca13518 100644
--- a/pkg/compiler/lib/src/js_backend/js_backend.dart
+++ b/pkg/compiler/lib/src/js_backend/js_backend.dart
@@ -12,117 +12,75 @@
import '../closure.dart';
import '../common.dart';
-import '../common/backend_api.dart' show
- Backend,
- BackendSerialization,
- ImpactTransformer,
- ForeignResolver;
-import '../common/codegen.dart' show
- CodegenImpact,
- CodegenRegistry,
- CodegenWorkItem;
-import '../common/names.dart' show
- Identifiers,
- Names,
- Selectors,
- Uris;
-import '../common/registry.dart' show
- EagerRegistry,
- Registry;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../common/resolution.dart' show
- Feature,
- ListLiteralUse,
- MapLiteralUse,
- Resolution,
- ResolutionImpact;
-import '../common/work.dart' show
- ItemCompilationContext;
-import '../compiler.dart' show
- Compiler;
+import '../common/backend_api.dart'
+ show Backend, BackendSerialization, ImpactTransformer, ForeignResolver;
+import '../common/codegen.dart'
+ show CodegenImpact, CodegenRegistry, CodegenWorkItem;
+import '../common/names.dart' show Identifiers, Names, Selectors, Uris;
+import '../common/registry.dart' show EagerRegistry, Registry;
+import '../common/tasks.dart' show CompilerTask;
+import '../common/resolution.dart'
+ show Feature, ListLiteralUse, MapLiteralUse, Resolution, ResolutionImpact;
+import '../common/work.dart' show ItemCompilationContext;
+import '../compiler.dart' show Compiler;
import '../compile_time_constants.dart';
import '../constants/constant_system.dart';
import '../constants/expressions.dart';
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreClasses,
- CoreTypes;
+import '../core_types.dart' show CoreClasses, CoreTypes;
import '../dart_types.dart';
-import '../deferred_load.dart' show
- DeferredLoadTask;
-import '../diagnostics/invariant.dart' show
- DEBUG_MODE;
-import '../dump_info.dart' show
- DumpInfoTask;
+import '../deferred_load.dart' show DeferredLoadTask;
+import '../diagnostics/invariant.dart' show DEBUG_MODE;
+import '../dump_info.dart' show DumpInfoTask;
import '../elements/elements.dart';
-import '../elements/visitor.dart' show
- BaseElementVisitor;
-import '../enqueue.dart' show
- Enqueuer,
- ResolutionEnqueuer;
+import '../elements/visitor.dart' show BaseElementVisitor;
+import '../enqueue.dart' show Enqueuer, ResolutionEnqueuer;
import '../io/code_output.dart';
-import '../io/source_information.dart' show
- SourceInformationStrategy;
-import '../io/position_information.dart' show
- PositionSourceInformationStrategy;
-import '../io/start_end_information.dart' show
- StartEndSourceInformationStrategy;
+import '../io/source_information.dart' show SourceInformationStrategy;
+import '../io/position_information.dart' show PositionSourceInformationStrategy;
+import '../io/start_end_information.dart'
+ show StartEndSourceInformationStrategy;
import '../js/js.dart' as jsAst;
import '../js/js.dart' show js;
-import '../js/js_source_mapping.dart' show
- JavaScriptSourceInformationStrategy;
+import '../js/js_source_mapping.dart' show JavaScriptSourceInformationStrategy;
import '../js/rewrite_async.dart';
-import '../js_emitter/js_emitter.dart' show
- CodeEmitterTask,
- Emitter,
- MetadataCollector,
- Placeholder,
- USE_LAZY_EMITTER;
+import '../js_emitter/js_emitter.dart'
+ show
+ CodeEmitterTask,
+ Emitter,
+ MetadataCollector,
+ Placeholder,
+ USE_LAZY_EMITTER;
import '../library_loader.dart' show LibraryLoader, LoadedLibraries;
import '../native/native.dart' as native;
-import '../resolution/tree_elements.dart' show
- TreeElements;
-import '../ssa/builder.dart' show
- SsaFunctionCompiler;
-import '../ssa/nodes.dart' show
- HTypeConversion,
- HInstruction;
-import '../ssa/codegen.dart' show
- SsaCodeGenerator;
+import '../resolution/tree_elements.dart' show TreeElements;
+import '../ssa/builder.dart' show SsaFunctionCompiler;
+import '../ssa/nodes.dart' show HTypeConversion, HInstruction;
+import '../ssa/codegen.dart' show SsaCodeGenerator;
import '../tree/tree.dart';
import '../types/types.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector,
- SelectorKind;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector, SelectorKind;
import '../universe/universe.dart';
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- StaticUseKind,
- TypeUse,
- TypeUseKind;
-import '../universe/world_impact.dart' show
- ImpactStrategy,
- ImpactUseCase,
- TransformedWorldImpact,
- WorldImpact,
- WorldImpactVisitor;
+import '../universe/use.dart'
+ show DynamicUse, StaticUse, StaticUseKind, TypeUse, TypeUseKind;
+import '../universe/world_impact.dart'
+ show
+ ImpactStrategy,
+ ImpactUseCase,
+ TransformedWorldImpact,
+ WorldImpact,
+ WorldImpactVisitor;
import '../util/characters.dart';
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld;
+import '../world.dart' show ClassWorld;
import 'backend_helpers.dart';
import 'backend_impact.dart';
-import 'backend_serialization.dart' show
- JavaScriptBackendSerialization;
+import 'backend_serialization.dart' show JavaScriptBackendSerialization;
import 'codegen/task.dart';
import 'constant_system_javascript.dart';
-import 'native_data.dart' show
- NativeData;
+import 'native_data.dart' show NativeData;
import 'js_interop_analysis.dart' show JsInteropAnalysis;
import 'lookup_map_analysis.dart' show LookupMapAnalysis;
import 'patch_resolver.dart';
diff --git a/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart b/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart
index 1ba5398..2798ac3 100644
--- a/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/js_interop_analysis.dart
@@ -62,16 +62,16 @@
void processJsInteropAnnotation(Element e) {
for (MetadataAnnotation annotation in e.implementation.metadata) {
- ConstantValue constant = backend.compiler.constants.getConstantValue(
- annotation.constant);
+ ConstantValue constant =
+ backend.compiler.constants.getConstantValue(annotation.constant);
if (constant == null || constant is! ConstructedConstantValue) continue;
ConstructedConstantValue constructedConstant = constant;
if (constructedConstant.type.element == helpers.jsAnnotationClass) {
ConstantValue value = constructedConstant.fields[nameField];
if (value.isString) {
StringConstantValue stringValue = value;
- backend.nativeData.setJsInteropName(
- e, stringValue.primitiveValue.slowToString());
+ backend.nativeData
+ .setJsInteropName(e, stringValue.primitiveValue.slowToString());
} else {
// TODO(jacobr): report a warning if the value is not a String.
backend.nativeData.setJsInteropName(e, '');
@@ -85,10 +85,10 @@
bool hasAnonymousAnnotation(Element element) {
if (backend.helpers.jsAnonymousClass == null) return false;
return element.metadata.any((MetadataAnnotation annotation) {
- ConstantValue constant = backend.compiler.constants.getConstantValue(
- annotation.constant);
- if (constant == null ||
- constant is! ConstructedConstantValue) return false;
+ ConstantValue constant =
+ backend.compiler.constants.getConstantValue(annotation.constant);
+ if (constant == null || constant is! ConstructedConstantValue)
+ return false;
ConstructedConstantValue constructedConstant = constant;
return constructedConstant.type.element ==
backend.helpers.jsAnonymousClass;
@@ -98,10 +98,10 @@
void _checkFunctionParameters(FunctionElement fn) {
if (fn.hasFunctionSignature &&
fn.functionSignature.optionalParametersAreNamed) {
- backend.reporter.reportErrorMessage(fn,
- MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS, {
- 'method': fn.name
- });
+ backend.reporter.reportErrorMessage(
+ fn,
+ MessageKind.JS_INTEROP_METHOD_WITH_NAMED_ARGUMENTS,
+ {'method': fn.name});
}
}
@@ -122,8 +122,7 @@
// when all of jsinterop types are unreachable from main.
if (!backend.compiler.world.isImplemented(classElement)) return;
- if (!classElement
- .implementsInterface(helpers.jsJavaScriptObjectClass)) {
+ if (!classElement.implementsInterface(helpers.jsJavaScriptObjectClass)) {
backend.reporter.reportErrorMessage(classElement,
MessageKind.JS_INTEROP_CLASS_CANNOT_EXTEND_DART_CLASS, {
'cls': classElement.name,
@@ -131,15 +130,16 @@
});
}
- classElement.forEachMember(
- (ClassElement classElement, Element member) {
+ classElement.forEachMember((ClassElement classElement, Element member) {
processJsInteropAnnotation(member);
if (!member.isSynthesized &&
backend.isJsInterop(classElement) &&
member is FunctionElement) {
FunctionElement fn = member;
- if (!fn.isExternal && !fn.isAbstract && !fn.isConstructor &&
+ if (!fn.isExternal &&
+ !fn.isAbstract &&
+ !fn.isConstructor &&
!fn.isStatic) {
backend.reporter.reportErrorMessage(
fn,
@@ -148,16 +148,14 @@
}
if (fn.isFactoryConstructor && hasAnonymousAnnotation(classElement)) {
- fn.functionSignature.orderedForEachParameter(
- (ParameterElement parameter) {
- if (!parameter.isNamed) {
- backend.reporter.reportErrorMessage(parameter,
+ fn.functionSignature
+ .orderedForEachParameter((ParameterElement parameter) {
+ if (!parameter.isNamed) {
+ backend.reporter.reportErrorMessage(
+ parameter,
MessageKind
.JS_OBJECT_LITERAL_CONSTRUCTOR_WITH_POSITIONAL_ARGUMENTS,
- {
- 'parameter': parameter.name,
- 'cls': classElement.name
- });
+ {'parameter': parameter.name, 'cls': classElement.name});
}
});
} else {
diff --git a/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart b/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
index ca97a3a..a1543bd 100644
--- a/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
+++ b/pkg/compiler/lib/src/js_backend/lookup_map_analysis.dart
@@ -8,23 +8,25 @@
import '../common.dart';
import '../common/registry.dart' show Registry;
import '../compiler.dart' show Compiler;
-import '../constants/values.dart' show
- ConstantValue,
- ConstructedConstantValue,
- ListConstantValue,
- NullConstantValue,
- StringConstantValue,
- TypeConstantValue;
+import '../constants/values.dart'
+ show
+ ConstantValue,
+ ConstructedConstantValue,
+ ListConstantValue,
+ NullConstantValue,
+ StringConstantValue,
+ TypeConstantValue;
import '../dart_types.dart' show DartType;
-import '../elements/elements.dart' show
- ClassElement,
- Element,
- Elements,
- FieldElement,
- FunctionElement,
- FunctionSignature,
- LibraryElement,
- VariableElement;
+import '../elements/elements.dart'
+ show
+ ClassElement,
+ Element,
+ Elements,
+ FieldElement,
+ FunctionElement,
+ FunctionSignature,
+ LibraryElement,
+ VariableElement;
import 'js_backend.dart' show JavaScriptBackend;
import '../dart_types.dart' show DynamicType, InterfaceType;
import 'package:pub_semver/pub_semver.dart';
@@ -143,11 +145,11 @@
// the lookup_map package. We otherwise produce a warning.
lookupMapVersionVariable = library.implementation.findLocal('_version');
if (lookupMapVersionVariable == null) {
- reporter.reportInfo(library,
- MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP);
+ reporter.reportInfo(
+ library, MessageKind.UNRECOGNIZED_VERSION_OF_LOOKUP_MAP);
} else {
- backend.compiler.enqueuer.resolution.addToWorkList(
- lookupMapVersionVariable);
+ backend.compiler.enqueuer.resolution
+ .addToWorkList(lookupMapVersionVariable);
}
}
@@ -199,16 +201,16 @@
void registerLookupMapReference(ConstantValue lookupMap) {
if (!_isEnabled || !_inCodegen) return;
assert(isLookupMap(lookupMap));
- _lookupMaps.putIfAbsent(lookupMap,
- () => new _LookupMapInfo(lookupMap, this).._updateUsed());
+ _lookupMaps.putIfAbsent(
+ lookupMap, () => new _LookupMapInfo(lookupMap, this).._updateUsed());
}
/// Whether [key] is a constant value whose type overrides equals.
bool _overridesEquals(ConstantValue key) {
if (key is ConstructedConstantValue) {
ClassElement element = key.type.element;
- return _typesWithEquals.putIfAbsent(element, () =>
- !element.lookupMember('==').enclosingClass.isObject);
+ return _typesWithEquals.putIfAbsent(
+ element, () => !element.lookupMember('==').enclosingClass.isObject);
}
return false;
}
@@ -299,7 +301,7 @@
if (!_isEnabled || !_inCodegen) return;
_lookupMaps.values.forEach((info) {
- assert (!info.emitted);
+ assert(!info.emitted);
info.emitted = true;
info._prepareForEmission();
});
@@ -356,11 +358,11 @@
/// Entries in the lookup map whose keys have not been seen in the rest of the
/// program.
Map<ConstantValue, ConstantValue> unusedEntries =
- <ConstantValue, ConstantValue> {};
+ <ConstantValue, ConstantValue>{};
/// Entries that have been used, and thus will be part of the generated code.
Map<ConstantValue, ConstantValue> usedEntries =
- <ConstantValue, ConstantValue> {};
+ <ConstantValue, ConstantValue>{};
/// Creates and initializes the information containing all keys of the
/// original map marked as unused.
@@ -412,8 +414,8 @@
assert(!usedEntries.containsKey(key));
ConstantValue constant = unusedEntries.remove(key);
usedEntries[key] = constant;
- analysis.backend.registerCompileTimeConstant(constant,
- analysis.backend.compiler.globalDependencies);
+ analysis.backend.registerCompileTimeConstant(
+ constant, analysis.backend.compiler.globalDependencies);
}
/// Restores [original] to contain all of the entries marked as possibly used.
@@ -428,7 +430,7 @@
// Note: we are restoring the entries here, see comment in [original].
if (singlePair) {
- assert (keyValuePairs.length == 0 || keyValuePairs.length == 2);
+ assert(keyValuePairs.length == 0 || keyValuePairs.length == 2);
if (keyValuePairs.length == 2) {
original.fields[analysis.keyField] = keyValuePairs[0];
original.fields[analysis.valueField] = keyValuePairs[1];
@@ -440,5 +442,4 @@
}
}
-final _validLookupMapVersionConstraint =
- new VersionConstraint.parse('^0.0.1');
+final _validLookupMapVersionConstraint = new VersionConstraint.parse('^0.0.1');
diff --git a/pkg/compiler/lib/src/js_backend/minify_namer.dart b/pkg/compiler/lib/src/js_backend/minify_namer.dart
index 0ba2e4e..ff76d87 100644
--- a/pkg/compiler/lib/src/js_backend/minify_namer.dart
+++ b/pkg/compiler/lib/src/js_backend/minify_namer.dart
@@ -7,8 +7,11 @@
/**
* Assigns JavaScript identifiers to Dart variables, class-names and members.
*/
-class MinifyNamer extends Namer with _MinifiedFieldNamer,
- _MinifyConstructorBodyNamer, _MinifiedOneShotInterceptorNamer {
+class MinifyNamer extends Namer
+ with
+ _MinifiedFieldNamer,
+ _MinifyConstructorBodyNamer,
+ _MinifiedOneShotInterceptorNamer {
MinifyNamer(Compiler compiler) : super(compiler) {
reserveBackendNames();
fieldRegistry = new _FieldNamingRegistry(this);
@@ -24,8 +27,8 @@
final String setterPrefix = 's';
final String callPrefix = ''; // this will create function names $<n>
- final ALPHABET_CHARACTERS = 52; // a-zA-Z.
- final ALPHANUMERIC_CHARACTERS = 62; // a-zA-Z0-9.
+ final ALPHABET_CHARACTERS = 52; // a-zA-Z.
+ final ALPHANUMERIC_CHARACTERS = 62; // a-zA-Z0-9.
/// You can pass an invalid identifier to this and unlike its non-minifying
/// counterpart it will never return the proposedName as the new fresh name.
@@ -33,10 +36,8 @@
/// [sanitizeForNatives] and [sanitizeForAnnotations] are ignored because the
/// minified names will always avoid clashing with annotated names or natives.
@override
- String _generateFreshStringForName(String proposedName,
- NamingScope scope,
- {bool sanitizeForNatives: false,
- bool sanitizeForAnnotations: false}) {
+ String _generateFreshStringForName(String proposedName, NamingScope scope,
+ {bool sanitizeForNatives: false, bool sanitizeForAnnotations: false}) {
String freshName;
String suggestion = scope.suggestName(proposedName);
if (suggestion != null && scope.isUnused(suggestion)) {
@@ -53,28 +54,29 @@
// OK to use them as fields, as we only access fields directly if we know
// the receiver type.
static const List<String> _reservedNativeProperties = const <String>[
- 'a', 'b', 'c', 'd', 'e', 'f', 'r', 'x', 'y', 'z', 'Q',
- // 2-letter:
- 'ch', 'cx', 'cy', 'db', 'dx', 'dy', 'fr', 'fx', 'fy', 'go', 'id', 'k1',
- 'k2', 'k3', 'k4', 'r1', 'r2', 'rx', 'ry', 'x1', 'x2', 'y1', 'y2',
- // 3-letter:
- 'add', 'all', 'alt', 'arc', 'CCW', 'cmp', 'dir', 'end', 'get', 'in1',
- 'in2', 'INT', 'key', 'log', 'low', 'm11', 'm12', 'm13', 'm14', 'm21',
- 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34', 'm41', 'm42', 'm43',
- 'm44', 'max', 'min', 'now', 'ONE', 'put', 'red', 'rel', 'rev', 'RGB',
- 'sdp', 'set', 'src', 'tag', 'top', 'uid', 'uri', 'url', 'URL',
- // 4-letter:
- 'abbr', 'atob', 'Attr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias',
- 'Blob', 'blue', 'blur', 'BLUR', 'body', 'BOOL', 'BOTH', 'btoa', 'BYTE',
- 'cite', 'clip', 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'face',
- 'file', 'File', 'fill', 'find', 'font', 'form', 'gain', 'hash', 'head',
- 'high', 'hint', 'host', 'href', 'HRTF', 'IDLE', 'INCR', 'info', 'INIT',
- 'isId', 'item', 'KEEP', 'kind', 'knee', 'lang', 'left', 'LESS', 'line',
- 'link', 'list', 'load', 'loop', 'mode', 'name', 'Node', 'None', 'NONE',
- 'only', 'open', 'OPEN', 'ping', 'play', 'port', 'rect', 'Rect', 'refX',
- 'refY', 'RGBA', 'root', 'rows', 'save', 'seed', 'seek', 'self', 'send',
- 'show', 'SINE', 'size', 'span', 'stat', 'step', 'stop', 'tags', 'text',
- 'Text', 'time', 'type', 'view', 'warn', 'wrap', 'ZERO'];
+ 'a', 'b', 'c', 'd', 'e', 'f', 'r', 'x', 'y', 'z', 'Q',
+ // 2-letter:
+ 'ch', 'cx', 'cy', 'db', 'dx', 'dy', 'fr', 'fx', 'fy', 'go', 'id', 'k1',
+ 'k2', 'k3', 'k4', 'r1', 'r2', 'rx', 'ry', 'x1', 'x2', 'y1', 'y2',
+ // 3-letter:
+ 'add', 'all', 'alt', 'arc', 'CCW', 'cmp', 'dir', 'end', 'get', 'in1',
+ 'in2', 'INT', 'key', 'log', 'low', 'm11', 'm12', 'm13', 'm14', 'm21',
+ 'm22', 'm23', 'm24', 'm31', 'm32', 'm33', 'm34', 'm41', 'm42', 'm43',
+ 'm44', 'max', 'min', 'now', 'ONE', 'put', 'red', 'rel', 'rev', 'RGB',
+ 'sdp', 'set', 'src', 'tag', 'top', 'uid', 'uri', 'url', 'URL',
+ // 4-letter:
+ 'abbr', 'atob', 'Attr', 'axes', 'axis', 'back', 'BACK', 'beta', 'bias',
+ 'Blob', 'blue', 'blur', 'BLUR', 'body', 'BOOL', 'BOTH', 'btoa', 'BYTE',
+ 'cite', 'clip', 'code', 'cols', 'cues', 'data', 'DECR', 'DONE', 'face',
+ 'file', 'File', 'fill', 'find', 'font', 'form', 'gain', 'hash', 'head',
+ 'high', 'hint', 'host', 'href', 'HRTF', 'IDLE', 'INCR', 'info', 'INIT',
+ 'isId', 'item', 'KEEP', 'kind', 'knee', 'lang', 'left', 'LESS', 'line',
+ 'link', 'list', 'load', 'loop', 'mode', 'name', 'Node', 'None', 'NONE',
+ 'only', 'open', 'OPEN', 'ping', 'play', 'port', 'rect', 'Rect', 'refX',
+ 'refY', 'RGBA', 'root', 'rows', 'save', 'seed', 'seek', 'self', 'send',
+ 'show', 'SINE', 'size', 'span', 'stat', 'step', 'stop', 'tags', 'text',
+ 'Text', 'time', 'type', 'view', 'warn', 'wrap', 'ZERO'
+ ];
void reserveBackendNames() {
for (String name in _reservedNativeProperties) {
@@ -98,43 +100,89 @@
// individually per program, but that would mean that the output of the
// minifier was less stable from version to version of the program being
// minified.
- _populateSuggestedNames(
- instanceScope,
- const <String>[
- r'$add', r'add$1', r'$and',
- r'$or',
- r'current', r'$shr', r'$eq', r'$ne',
- r'$index', r'$indexSet',
- r'$xor', r'clone$0',
- r'iterator', r'length',
- r'$lt', r'$gt', r'$le', r'$ge',
- r'moveNext$0', r'node', r'on', r'$negate', r'push', r'self',
- r'start', r'target', r'$shl', r'value', r'width', r'style',
- r'noSuchMethod$1', r'$mul', r'$div', r'$sub', r'$not', r'$mod',
- r'$tdiv', r'toString$0']);
+ _populateSuggestedNames(instanceScope, const <String>[
+ r'$add',
+ r'add$1',
+ r'$and',
+ r'$or',
+ r'current',
+ r'$shr',
+ r'$eq',
+ r'$ne',
+ r'$index',
+ r'$indexSet',
+ r'$xor',
+ r'clone$0',
+ r'iterator',
+ r'length',
+ r'$lt',
+ r'$gt',
+ r'$le',
+ r'$ge',
+ r'moveNext$0',
+ r'node',
+ r'on',
+ r'$negate',
+ r'push',
+ r'self',
+ r'start',
+ r'target',
+ r'$shl',
+ r'value',
+ r'width',
+ r'style',
+ r'noSuchMethod$1',
+ r'$mul',
+ r'$div',
+ r'$sub',
+ r'$not',
+ r'$mod',
+ r'$tdiv',
+ r'toString$0'
+ ]);
- _populateSuggestedNames(
- globalScope,
- const <String>[
- r'Object', 'wrapException', r'$eq', r'S', r'ioore',
- r'UnsupportedError$', r'length', r'$sub',
- r'$add', r'$gt', r'$ge', r'$lt', r'$le', r'add',
- r'iae',
- r'ArgumentError$', r'BoundClosure', r'Closure', r'StateError$',
- r'getInterceptor', r'max', r'$mul',
- r'Map', r'Key_Key', r'$div',
- r'List_List$from',
- r'LinkedHashMap_LinkedHashMap$_empty',
- r'LinkedHashMap_LinkedHashMap$_literal',
- r'min',
- r'RangeError$value', r'JSString', r'JSNumber',
- r'JSArray', r'createInvocationMirror', r'String',
- r'setRuntimeTypeInfo', r'createRuntimeType'
- ]);
+ _populateSuggestedNames(globalScope, const <String>[
+ r'Object',
+ 'wrapException',
+ r'$eq',
+ r'S',
+ r'ioore',
+ r'UnsupportedError$',
+ r'length',
+ r'$sub',
+ r'$add',
+ r'$gt',
+ r'$ge',
+ r'$lt',
+ r'$le',
+ r'add',
+ r'iae',
+ r'ArgumentError$',
+ r'BoundClosure',
+ r'Closure',
+ r'StateError$',
+ r'getInterceptor',
+ r'max',
+ r'$mul',
+ r'Map',
+ r'Key_Key',
+ r'$div',
+ r'List_List$from',
+ r'LinkedHashMap_LinkedHashMap$_empty',
+ r'LinkedHashMap_LinkedHashMap$_literal',
+ r'min',
+ r'RangeError$value',
+ r'JSString',
+ r'JSNumber',
+ r'JSArray',
+ r'createInvocationMirror',
+ r'String',
+ r'setRuntimeTypeInfo',
+ r'createRuntimeType'
+ ]);
}
- void _populateSuggestedNames(NamingScope scope,
- List<String> suggestions) {
+ void _populateSuggestedNames(NamingScope scope, List<String> suggestions) {
int c = $a - 1;
String letter;
for (String name in suggestions) {
@@ -148,7 +196,6 @@
}
}
-
// This gets a minified name based on a hash of the proposed name. This
// is slightly less efficient than just getting the next name in a series,
// but it means that small changes in the input program will give smallish
@@ -156,7 +203,7 @@
String _getUnusedName(String proposedName, NamingScope scope) {
int hash = _calculateHash(proposedName);
// Avoid very small hashes that won't try many names.
- hash = hash < 1000 ? hash * 314159 : hash; // Yes, it's prime.
+ hash = hash < 1000 ? hash * 314159 : hash; // Yes, it's prime.
// Try other n-character names based on the hash. We try one to three
// character identifiers. For each length we try around 10 different names
@@ -275,16 +322,16 @@
_startIndex = 0,
_constructors = cls.constructors.toList(growable: false);
- _ConstructorBodyNamingScope.forClass(ClassElement cls,
- _ConstructorBodyNamingScope superScope)
+ _ConstructorBodyNamingScope.forClass(
+ ClassElement cls, _ConstructorBodyNamingScope superScope)
: _superScope = superScope,
_startIndex = superScope._startIndex + superScope.numberOfConstructors,
_constructors = cls.constructors.toList(growable: false);
// Mixin Applications have constructors but we never generate code for them,
// so they do not count in the inheritance chain.
- _ConstructorBodyNamingScope.forMixinApplication(ClassElement cls,
- _ConstructorBodyNamingScope superScope)
+ _ConstructorBodyNamingScope.forMixinApplication(
+ ClassElement cls, _ConstructorBodyNamingScope superScope)
: _superScope = superScope,
_startIndex = superScope._startIndex + superScope.numberOfConstructors,
_constructors = const [];
@@ -295,11 +342,11 @@
if (cls.superclass == null) {
return new _ConstructorBodyNamingScope.rootScope(cls);
} else if (cls.isMixinApplication) {
- return new _ConstructorBodyNamingScope.forMixinApplication(cls,
- new _ConstructorBodyNamingScope(cls.superclass, registry));
+ return new _ConstructorBodyNamingScope.forMixinApplication(
+ cls, new _ConstructorBodyNamingScope(cls.superclass, registry));
} else {
- return new _ConstructorBodyNamingScope.forClass(cls,
- new _ConstructorBodyNamingScope(cls.superclass, registry));
+ return new _ConstructorBodyNamingScope.forClass(
+ cls, new _ConstructorBodyNamingScope(cls.superclass, registry));
}
});
}
@@ -317,12 +364,11 @@
@override
jsAst.Name constructorBodyName(FunctionElement method) {
- _ConstructorBodyNamingScope scope =
- new _ConstructorBodyNamingScope(method.enclosingClass,
- _constructorBodyScopes);
+ _ConstructorBodyNamingScope scope = new _ConstructorBodyNamingScope(
+ method.enclosingClass, _constructorBodyScopes);
String key = scope.constructorBodyKeyFor(method);
- return _disambiguateMemberByKey(key,
- () => _proposeNameForConstructorBody(method));
+ return _disambiguateMemberByKey(
+ key, () => _proposeNameForConstructorBody(method));
}
}
@@ -330,20 +376,18 @@
/// Property name used for the one-shot interceptor method for the given
/// [selector] and return-type specialization.
@override
- jsAst.Name nameForGetOneShotInterceptor(Selector selector,
- Iterable<ClassElement> classes) {
+ jsAst.Name nameForGetOneShotInterceptor(
+ Selector selector, Iterable<ClassElement> classes) {
String root = selector.isOperator
? operatorNameToIdentifier(selector.name)
: privateName(selector.memberName);
- String prefix = selector.isGetter
- ? r"$get"
- : selector.isSetter ? r"$set" : "";
- String callSuffix =
- selector.isCall ? callSuffixForStructure(selector.callStructure).join()
- : "";
+ String prefix =
+ selector.isGetter ? r"$get" : selector.isSetter ? r"$set" : "";
+ String callSuffix = selector.isCall
+ ? callSuffixForStructure(selector.callStructure).join()
+ : "";
String suffix = suffixForGetInterceptor(classes);
String fullName = "\$intercepted$prefix\$$root$callSuffix\$$suffix";
return _disambiguateInternalGlobal(fullName);
}
}
-
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 7ffe502..70d7eb7 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -102,7 +102,6 @@
* must be disambiguated elsewhere.
*/
class Namer {
-
static const List<String> javaScriptKeywords = const <String>[
// These are current keywords.
"break", "delete", "function", "return", "typeof", "case", "do", "if",
@@ -118,13 +117,13 @@
"long", "short", "volatile"
];
- static const List<String> reservedPropertySymbols =
- const <String>[
- "__proto__", "prototype", "constructor", "call",
- // "use strict" disallows the use of "arguments" and "eval" as
- // variable names or property names. See ECMA-262, Edition 5.1,
- // section 11.1.5 (for the property names).
- "eval", "arguments"];
+ static const List<String> reservedPropertySymbols = const <String>[
+ "__proto__", "prototype", "constructor", "call",
+ // "use strict" disallows the use of "arguments" and "eval" as
+ // variable names or property names. See ECMA-262, Edition 5.1,
+ // section 11.1.5 (for the property names).
+ "eval", "arguments"
+ ];
// Symbols that we might be using in our JS snippets.
static const List<String> reservedGlobalSymbols = const <String>[
@@ -251,48 +250,49 @@
];
static const List<String> reservedGlobalObjectNames = const <String>[
- "A",
- "B",
- "C", // Global object for *C*onstants.
- "D",
- "E",
- "F",
- "G",
- "H", // Global object for internal (*H*elper) libraries.
- // I is used for used for the Isolate function.
- "J", // Global object for the interceptor library.
- "K",
- "L",
- "M",
- "N",
- "O",
- "P", // Global object for other *P*latform libraries.
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W", // Global object for *W*eb libraries (dart:html).
- "X",
- "Y",
- "Z",
+ "A",
+ "B",
+ "C", // Global object for *C*onstants.
+ "D",
+ "E",
+ "F",
+ "G",
+ "H", // Global object for internal (*H*elper) libraries.
+ // I is used for used for the Isolate function.
+ "J", // Global object for the interceptor library.
+ "K",
+ "L",
+ "M",
+ "N",
+ "O",
+ "P", // Global object for other *P*latform libraries.
+ "Q",
+ "R",
+ "S",
+ "T",
+ "U",
+ "V",
+ "W", // Global object for *W*eb libraries (dart:html).
+ "X",
+ "Y",
+ "Z",
];
static const List<String> reservedGlobalHelperFunctions = const <String>[
- "init",
- "Isolate",
+ "init",
+ "Isolate",
];
static final List<String> userGlobalObjects =
new List.from(reservedGlobalObjectNames)
- ..remove('C')
- ..remove('H')
- ..remove('J')
- ..remove('P')
- ..remove('W');
+ ..remove('C')
+ ..remove('H')
+ ..remove('J')
+ ..remove('P')
+ ..remove('W');
Set<String> _jsReserved = null;
+
/// Names that cannot be used by members, top level and static
/// methods.
Set<String> get jsReserved {
@@ -305,6 +305,7 @@
}
Set<String> _jsVariableReserved = null;
+
/// Names that cannot be used by local variables and parameters.
Set<String> get jsVariableReserved {
if (_jsVariableReserved == null) {
@@ -456,33 +457,48 @@
bool get shouldMinify => false;
NamingScope _getPrivateScopeFor(PrivatelyNamedJSEntity entity) {
- return _privateNamingScopes.putIfAbsent(entity.rootOfScope,
- () => new NamingScope());
+ return _privateNamingScopes.putIfAbsent(
+ entity.rootOfScope, () => new NamingScope());
}
/// Returns the string that is to be used as the result of a call to
/// [JS_GET_NAME] at [node] with argument [name].
jsAst.Name getNameForJsGetName(Node node, JsGetName name) {
switch (name) {
- case JsGetName.GETTER_PREFIX: return asName(getterPrefix);
- case JsGetName.SETTER_PREFIX: return asName(setterPrefix);
- case JsGetName.CALL_PREFIX: return asName(callPrefix);
- case JsGetName.CALL_PREFIX0: return asName('${callPrefix}\$0');
- case JsGetName.CALL_PREFIX1: return asName('${callPrefix}\$1');
- case JsGetName.CALL_PREFIX2: return asName('${callPrefix}\$2');
- case JsGetName.CALL_PREFIX3: return asName('${callPrefix}\$3');
- case JsGetName.CALL_CATCH_ALL: return asName(callCatchAllName);
- case JsGetName.REFLECTABLE: return asName(reflectableField);
+ case JsGetName.GETTER_PREFIX:
+ return asName(getterPrefix);
+ case JsGetName.SETTER_PREFIX:
+ return asName(setterPrefix);
+ case JsGetName.CALL_PREFIX:
+ return asName(callPrefix);
+ case JsGetName.CALL_PREFIX0:
+ return asName('${callPrefix}\$0');
+ case JsGetName.CALL_PREFIX1:
+ return asName('${callPrefix}\$1');
+ case JsGetName.CALL_PREFIX2:
+ return asName('${callPrefix}\$2');
+ case JsGetName.CALL_PREFIX3:
+ return asName('${callPrefix}\$3');
+ case JsGetName.CALL_CATCH_ALL:
+ return asName(callCatchAllName);
+ case JsGetName.REFLECTABLE:
+ return asName(reflectableField);
case JsGetName.CLASS_DESCRIPTOR_PROPERTY:
return asName(classDescriptorProperty);
case JsGetName.REQUIRED_PARAMETER_PROPERTY:
return asName(requiredParameterField);
- case JsGetName.DEFAULT_VALUES_PROPERTY: return asName(defaultValuesField);
- case JsGetName.CALL_NAME_PROPERTY: return asName(callNameField);
- case JsGetName.DEFERRED_ACTION_PROPERTY: return asName(deferredAction);
- case JsGetName.OPERATOR_AS_PREFIX: return asName(operatorAsPrefix);
- case JsGetName.SIGNATURE_NAME: return asName(operatorSignature);
- case JsGetName.TYPEDEF_TAG: return asName(typedefTag);
+ case JsGetName.DEFAULT_VALUES_PROPERTY:
+ return asName(defaultValuesField);
+ case JsGetName.CALL_NAME_PROPERTY:
+ return asName(callNameField);
+ case JsGetName.DEFERRED_ACTION_PROPERTY:
+ return asName(deferredAction);
+ case JsGetName.OPERATOR_AS_PREFIX:
+ return asName(operatorAsPrefix);
+ case JsGetName.SIGNATURE_NAME:
+ return asName(operatorSignature);
+ case JsGetName.TYPEDEF_TAG:
+ return asName(typedefTag);
case JsGetName.FUNCTION_TYPE_VOID_RETURN_TAG:
return asName(functionTypeVoidReturnTag);
case JsGetName.FUNCTION_TYPE_RETURN_TYPE_TAG:
@@ -502,10 +518,8 @@
case JsGetName.FUNCTION_CLASS_TYPE_NAME:
return runtimeTypeName(coreClasses.functionClass);
default:
- reporter.reportErrorMessage(
- node,
- MessageKind.GENERIC,
- {'text': 'Error: Namer has no name for "$name".'});
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Namer has no name for "$name".'});
return asName('BROKEN');
}
}
@@ -539,8 +553,8 @@
String constantLongName(ConstantValue constant) {
String longName = constantLongNames[constant];
if (longName == null) {
- longName = new ConstantNamingVisitor(compiler, constantHasher)
- .getName(constant);
+ longName =
+ new ConstantNamingVisitor(compiler, constantHasher).getName(constant);
constantLongNames[constant] = longName;
}
return longName;
@@ -611,8 +625,8 @@
/// Name for a constructor body.
jsAst.Name constructorBodyName(FunctionElement ctor) {
- return _disambiguateInternalMember(ctor,
- () => _proposeNameForConstructorBody(ctor));
+ return _disambiguateInternalMember(
+ ctor, () => _proposeNameForConstructorBody(ctor));
}
/// Annotated name for [method] encoding arity and named parameters.
@@ -625,8 +639,7 @@
String _jsNameHelper(Element e) {
String jsInteropName = backend.nativeData.getJsInteropName(e);
- if (jsInteropName != null && jsInteropName.isNotEmpty)
- return jsInteropName;
+ if (jsInteropName != null && jsInteropName.isNotEmpty) return jsInteropName;
return e.isLibrary ? 'self' : e.name;
}
@@ -694,13 +707,11 @@
jsAst.Name invocationName(Selector selector) {
switch (selector.kind) {
case SelectorKind.GETTER:
- jsAst.Name disambiguatedName =
- _disambiguateMember(selector.memberName);
+ jsAst.Name disambiguatedName = _disambiguateMember(selector.memberName);
return deriveGetterName(disambiguatedName);
case SelectorKind.SETTER:
- jsAst.Name disambiguatedName =
- _disambiguateMember(selector.memberName);
+ jsAst.Name disambiguatedName = _disambiguateMember(selector.memberName);
return deriveSetterName(disambiguatedName);
case SelectorKind.OPERATOR:
@@ -721,8 +732,7 @@
return disambiguatedName; // Methods other than call are not annotated.
default:
- reporter.internalError(
- CURRENT_ELEMENT_SPANNABLE,
+ reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
'Unexpected selector kind: ${selector.kind}');
return null;
}
@@ -731,8 +741,8 @@
/**
* Returns the internal name used for an invocation mirror of this selector.
*/
- jsAst.Name invocationMirrorInternalName(Selector selector)
- => invocationName(selector);
+ jsAst.Name invocationMirrorInternalName(Selector selector) =>
+ invocationName(selector);
/**
* Returns the disambiguated name for the given field, used for constructing
@@ -793,8 +803,8 @@
// apply. So we can directly grab a name.
Entity asEntity = element;
if (asEntity is JSEntity) {
- return _disambiguateInternalMember(element,
- () => asEntity.declaredEntity.name);
+ return _disambiguateInternalMember(
+ element, () => asEntity.declaredEntity.name);
}
// If the name of the field might clash with another field,
@@ -825,7 +835,7 @@
/// True if [class_] is a non-native class that inherits from a native class.
bool _isUserClassExtendingNative(ClassElement class_) {
return !backend.isNative(class_) &&
- backend.isNativeOrExtendsNative(class_.superclass);
+ backend.isNativeOrExtendsNative(class_.superclass);
}
/// Annotated name for the setter of [element].
@@ -901,7 +911,7 @@
int counter = 0;
String key = keyBase;
while (_libraryKeys.values.contains(key)) {
- key ="$keyBase${counter++}";
+ key = "$keyBase${counter++}";
}
return key;
});
@@ -940,11 +950,10 @@
/// to the ([originalName], [suffixes]) pair within the instance-member
/// namespace.
jsAst.Name _disambiguateMember(Name originalName,
- [List<String> suffixes = const []]) {
+ [List<String> suffixes = const []]) {
// Build a string encoding the library name, if the name is private.
- String libraryKey = originalName.isPrivate
- ? _generateLibraryKey(originalName.library)
- : '';
+ String libraryKey =
+ originalName.isPrivate ? _generateLibraryKey(originalName.library) : '';
// In the unique key, separate the name parts by '@'.
// This avoids clashes since the original names cannot contain that symbol.
@@ -958,7 +967,7 @@
proposedName += r'$' + suffixes.join(r'$');
}
newName = getFreshName(instanceScope, proposedName,
- sanitizeForAnnotations: true);
+ sanitizeForAnnotations: true);
userInstanceMembers[key] = newName;
}
return _newReference(newName);
@@ -980,8 +989,7 @@
jsAst.Name newName = userInstanceMembers[key];
if (newName == null) {
String name = proposeName();
- newName = getFreshName(instanceScope, name,
- sanitizeForAnnotations: true);
+ newName = getFreshName(instanceScope, name, sanitizeForAnnotations: true);
userInstanceMembers[key] = newName;
}
return _newReference(newName);
@@ -995,8 +1003,7 @@
///
/// Using [_disambiguateMember] with the given [originalName] and no suffixes
/// will subsequently return [disambiguatedName].
- void reservePublicMemberName(String originalName,
- String disambiguatedName) {
+ void reservePublicMemberName(String originalName, String disambiguatedName) {
// Build a key that corresponds to the one built in disambiguateMember.
String libraryPrefix = ''; // Public names have an empty library prefix.
String suffix = ''; // We don't need any suffixes.
@@ -1013,8 +1020,8 @@
/// constructor bodies, and super-accessors.
///
/// The resulting name is unique within the instance-member namespace.
- jsAst.Name _disambiguateInternalMember(Element element,
- String proposeName()) {
+ jsAst.Name _disambiguateInternalMember(
+ Element element, String proposeName()) {
jsAst.Name newName = internalInstanceMembers[element];
if (newName == null) {
String name = proposeName();
@@ -1023,15 +1030,13 @@
if (asEntity is PrivatelyNamedJSEntity) {
NamingScope scope = _getPrivateScopeFor(asEntity);
newName = getFreshName(scope, name,
- sanitizeForAnnotations: true,
- sanitizeForNatives: false);
+ sanitizeForAnnotations: true, sanitizeForNatives: false);
internalInstanceMembers[element] = newName;
} else {
bool mayClashNative =
_isUserClassExtendingNative(element.enclosingClass);
newName = getFreshName(instanceScope, name,
- sanitizeForAnnotations: true,
- sanitizeForNatives: mayClashNative);
+ sanitizeForAnnotations: true, sanitizeForNatives: mayClashNative);
internalInstanceMembers[element] = newName;
}
}
@@ -1053,10 +1058,8 @@
return _newReference(newName);
}
- String _generateFreshStringForName(String proposedName,
- NamingScope scope,
- {bool sanitizeForAnnotations: false,
- bool sanitizeForNatives: false}) {
+ String _generateFreshStringForName(String proposedName, NamingScope scope,
+ {bool sanitizeForAnnotations: false, bool sanitizeForNatives: false}) {
if (sanitizeForAnnotations) {
proposedName = _sanitizeForAnnotations(proposedName);
}
@@ -1092,16 +1095,11 @@
///
/// Note that [MinifyNamer] overrides this method with one that produces
/// minified names.
- jsAst.Name getFreshName(NamingScope scope,
- String proposedName,
- {bool sanitizeForAnnotations: false,
- bool sanitizeForNatives: false}) {
- String candidate =
- _generateFreshStringForName(proposedName,
- scope,
- sanitizeForAnnotations:
- sanitizeForAnnotations,
- sanitizeForNatives: sanitizeForNatives);
+ jsAst.Name getFreshName(NamingScope scope, String proposedName,
+ {bool sanitizeForAnnotations: false, bool sanitizeForNatives: false}) {
+ String candidate = _generateFreshStringForName(proposedName, scope,
+ sanitizeForAnnotations: sanitizeForAnnotations,
+ sanitizeForNatives: sanitizeForNatives);
return new StringBackedName(candidate);
}
@@ -1152,7 +1150,7 @@
String name;
if (element.isGenerativeConstructor) {
name = "${element.enclosingClass.name}\$"
- "${element.name}";
+ "${element.name}";
} else if (element.isFactoryConstructor) {
// TODO(johnniwinther): Change factory name encoding as to not include
// the class-name twice.
@@ -1162,7 +1160,7 @@
if (element.isClassMember) {
ClassElement enclosingClass = element.enclosingClass;
name = "${enclosingClass.name}_"
- "${element.name}";
+ "${element.name}";
} else {
name = element.name.replaceAll('+', '_');
}
@@ -1184,14 +1182,15 @@
if (!IDENTIFIER.hasMatch(name)) {
name = name.replaceAllMapped(NON_IDENTIFIER_CHAR,
(match) => match[0].codeUnitAt(0).toRadixString(16));
- if (!IDENTIFIER.hasMatch(name)) { // e.g. starts with digit.
+ if (!IDENTIFIER.hasMatch(name)) {
+ // e.g. starts with digit.
name = 'lib_$name';
}
}
// Names constructed based on a libary name will be further disambiguated.
// However, as names from the same libary should have the same libary
// name part, we disambiguate the library name here.
- String disambiguated = name;
+ String disambiguated = name;
for (int c = 0; libraryLongNames.containsValue(disambiguated); c++) {
disambiguated = "$name$c";
}
@@ -1248,8 +1247,8 @@
/// Property name used for the one-shot interceptor method for the given
/// [selector] and return-type specialization.
- jsAst.Name nameForGetOneShotInterceptor(Selector selector,
- Iterable<ClassElement> classes) {
+ jsAst.Name nameForGetOneShotInterceptor(
+ Selector selector, Iterable<ClassElement> classes) {
// The one-shot name is a global name derived from the invocation name. To
// avoid instability we would like the names to be unique and not clash with
// other global names.
@@ -1264,8 +1263,8 @@
return new CompoundName([root, _literalDollar]);
} else {
String suffix = suffixForGetInterceptor(classes);
- return new CompoundName([root, _literalDollar,
- new StringBackedName(suffix)]);
+ return new CompoundName(
+ [root, _literalDollar, new StringBackedName(suffix)]);
}
}
@@ -1354,11 +1353,11 @@
// other elements, such as bound closures also live in
// [staticStateHolder].
!element.isAccessor &&
- !element.isClass &&
- !element.isTypedef &&
- !element.isConstructor &&
- !element.isFunction &&
- !element.isLibrary;
+ !element.isClass &&
+ !element.isTypedef &&
+ !element.isConstructor &&
+ !element.isFunction &&
+ !element.isLibrary;
}
/// Returns [staticStateHolder] or one of [reservedGlobalObjectNames].
@@ -1389,8 +1388,8 @@
jsAst.Name staticClosureName(Element element) {
assert(Elements.isStaticOrTopLevelFunction(element));
- String enclosing = element.enclosingClass == null
- ? "" : element.enclosingClass.name;
+ String enclosing =
+ element.enclosingClass == null ? "" : element.enclosingClass.name;
String library = _proposeNameForGlobal(element.library);
return _disambiguateInternalGlobal(
"${library}_${enclosing}_${element.name}\$closure");
@@ -1440,17 +1439,19 @@
jsAst.Name operatorIsType(DartType type) {
if (type.isFunctionType) {
// TODO(erikcorry): Reduce from $isx to ix when we are minifying.
- return new CompoundName([new StringBackedName(operatorIsPrefix),
- _literalUnderscore,
- getFunctionTypeName(type)]);
+ return new CompoundName([
+ new StringBackedName(operatorIsPrefix),
+ _literalUnderscore,
+ getFunctionTypeName(type)
+ ]);
}
return operatorIs(type.element);
}
jsAst.Name operatorIs(ClassElement element) {
// TODO(erikcorry): Reduce from $isx to ix when we are minifying.
- return new CompoundName([new StringBackedName(operatorIsPrefix),
- runtimeTypeName(element)]);
+ return new CompoundName(
+ [new StringBackedName(operatorIsPrefix), runtimeTypeName(element)]);
}
/// Returns a name that does not clash with reserved JS keywords.
@@ -1463,8 +1464,8 @@
}
jsAst.Name substitutionName(Element element) {
- return new CompoundName([new StringBackedName(operatorAsPrefix),
- runtimeTypeName(element)]);
+ return new CompoundName(
+ [new StringBackedName(operatorAsPrefix), runtimeTypeName(element)]);
}
/// Translates a [String] into the corresponding [Name] data structure as
@@ -1475,13 +1476,11 @@
jsAst.Name asName(String name) {
if (name.startsWith(getterPrefix) && name.length > getterPrefix.length) {
return new GetterName(_literalGetterPrefix,
- new StringBackedName(
- name.substring(getterPrefix.length)));
+ new StringBackedName(name.substring(getterPrefix.length)));
}
if (name.startsWith(setterPrefix) && name.length > setterPrefix.length) {
return new GetterName(_literalSetterPrefix,
- new StringBackedName(
- name.substring(setterPrefix.length)));
+ new StringBackedName(name.substring(setterPrefix.length)));
}
return new StringBackedName(name);
@@ -1589,7 +1588,6 @@
*
*/
class ConstantNamingVisitor implements ConstantValueVisitor {
-
static final RegExp IDENTIFIER = new RegExp(r'^[A-Za-z_$][A-Za-z0-9_$]*$');
static const MAX_FRAGMENTS = 5;
static const MAX_EXTRA_LENGTH = 30;
@@ -1598,8 +1596,8 @@
final Compiler compiler;
final ConstantCanonicalHasher hasher;
- String root = null; // First word, usually a type name.
- bool failed = false; // Failed to generate something pretty.
+ String root = null; // First word, usually a type name.
+ bool failed = false; // Failed to generate something pretty.
List<String> fragments = <String>[];
int length = 0;
@@ -1623,8 +1621,8 @@
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int digit = hash % 62;
- sb.write('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
- [digit]);
+ sb.write('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'[
+ digit]);
hash ~/= 62;
if (hash == 0) break;
}
@@ -1742,7 +1740,8 @@
addRoot('Type');
DartType type = constant.representedType;
String name = type.element?.name;
- if (name == null) { // e.g. DartType 'dynamic' has no element.
+ if (name == null) {
+ // e.g. DartType 'dynamic' has no element.
JavaScriptBackend backend = compiler.backend;
name = backend.rtiEncoder.getTypeRepresentationForTypeConstant(type);
}
@@ -1769,8 +1768,8 @@
add('name');
break;
default:
- reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
- "Unexpected SyntheticConstantValue");
+ reporter.internalError(
+ CURRENT_ELEMENT_SPANNABLE, "Unexpected SyntheticConstantValue");
}
}
@@ -1789,11 +1788,9 @@
* their hashCodes.
*/
class ConstantCanonicalHasher implements ConstantValueVisitor<int, Null> {
-
static const _MASK = 0x1fffffff;
static const _UINT32_LIMIT = 4 * 1024 * 1024 * 1024;
-
final Compiler compiler;
final Map<ConstantValue, int> hashes = new Map<ConstantValue, int>();
@@ -1926,7 +1923,8 @@
static int _hashDouble(double value) {
double magnitude = value.abs();
int sign = value < 0 ? 1 : 0;
- if (magnitude < _UINT32_LIMIT) { // 2^32
+ if (magnitude < _UINT32_LIMIT) {
+ // 2^32
int intValue = value.toInt();
// Integer valued doubles in 32-bit range hash to the same values as ints.
int hash = _hashInt(intValue);
@@ -1964,7 +1962,7 @@
}
static int _finish(int hash) {
- hash = _MASK & (hash + (((_MASK >> 3) & hash) << 3));
+ hash = _MASK & (hash + (((_MASK >> 3) & hash) << 3));
hash = hash & (hash >> 11);
return _MASK & (hash + (((_MASK >> 15) & hash) << 15));
}
@@ -2004,7 +2002,7 @@
visit(parameter);
}
bool first = false;
- for (DartType parameter in type.optionalParameterTypes) {
+ for (DartType parameter in type.optionalParameterTypes) {
if (!first) {
sb.write('_');
}
@@ -2026,7 +2024,6 @@
}
}
-
class NamingScope {
/// Maps proposed names to *suggested* disambiguated names.
///
@@ -2047,6 +2044,7 @@
assert(!_suggestedNames.containsKey(original));
_suggestedNames[original] = suggestion;
}
+
bool hasSuggestion(String original) => _suggestedNames.containsKey(original);
bool isSuggestion(String candidate) {
return _suggestedNames.containsValue(candidate);
diff --git a/pkg/compiler/lib/src/js_backend/namer_names.dart b/pkg/compiler/lib/src/js_backend/namer_names.dart
index 31a1747..4baffb5 100644
--- a/pkg/compiler/lib/src/js_backend/namer_names.dart
+++ b/pkg/compiler/lib/src/js_backend/namer_names.dart
@@ -16,14 +16,7 @@
}
}
-enum _NamerNameKinds {
- StringBacked,
- Getter,
- Setter,
- Async,
- Compound,
- Token
-}
+enum _NamerNameKinds { StringBacked, Getter, Setter, Async, Compound, Token }
class StringBackedName extends _NamerName {
final String name;
@@ -33,7 +26,7 @@
String get key => name;
- operator==(other) {
+ operator ==(other) {
if (other is _NameReference) other = other._target;
if (identical(this, other)) return true;
return (other is StringBackedName) && other.name == name;
@@ -61,7 +54,7 @@
String get key => prefix.key + base.key;
- bool operator==(other) {
+ bool operator ==(other) {
if (other is _NameReference) other = other._target;
if (identical(this, other)) return true;
if (other is! _PrefixedName) return false;
@@ -125,7 +118,7 @@
String get key => _parts.map((_NamerName name) => name.key).join();
- bool operator==(other) {
+ bool operator ==(other) {
if (other is _NameReference) other = other._target;
if (identical(this, other)) return true;
if (other is! CompoundName) return false;
@@ -188,7 +181,7 @@
markSeen(jsAst.TokenCounter counter) => _rc++;
@override
- bool operator==(other) {
+ bool operator ==(other) {
if (other is _NameReference) other = other._target;
if (identical(this, other)) return true;
return false;
@@ -220,8 +213,8 @@
int compareTo(_NamerName other) => _target.compareTo(other);
@override
- bool operator==(other) => _target == other;
+ bool operator ==(other) => _target == other;
@override
int get hashCode => _target.hashCode;
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/js_backend/native_data.dart b/pkg/compiler/lib/src/js_backend/native_data.dart
index 1929548..49a207d 100644
--- a/pkg/compiler/lib/src/js_backend/native_data.dart
+++ b/pkg/compiler/lib/src/js_backend/native_data.dart
@@ -5,11 +5,8 @@
library js_backend.native_data;
import '../common.dart';
-import '../elements/elements.dart' show
- ClassElement,
- Element,
- FunctionElement,
- MemberElement;
+import '../elements/elements.dart'
+ show ClassElement, Element, FunctionElement, MemberElement;
/// Additional element information for native classes and methods and js-interop
/// methods.
@@ -38,10 +35,9 @@
/// Sets the explicit js interop [name] for [element].
void setJsInteropName(Element element, String name) {
- assert(invariant(element,
- isJsInterop(element),
+ assert(invariant(element, isJsInterop(element),
message:
- 'Element $element is not js interop but given a js interop name.'));
+ 'Element $element is not js interop but given a js interop name.'));
jsInteropNames[element.declaration] = name;
}
@@ -77,8 +73,7 @@
String _jsNameHelper(Element element) {
String jsInteropName = jsInteropNames[element.declaration];
- assert(invariant(element,
- !(_isJsInterop(element) && jsInteropName == null),
+ assert(invariant(element, !(_isJsInterop(element) && jsInteropName == null),
message:
'Element $element is js interop but js interop name has not yet '
'been computed.'));
@@ -121,13 +116,13 @@
// TODO(johnniwinther): Avoid setting this more than once. The enqueuer
// might enqueue [element] several times (before processing it) and computes
// name on each call to `internalAddToWorkList`.
- assert(invariant(element,
+ assert(invariant(
+ element,
nativeMemberName[element.declaration] == null ||
- nativeMemberName[element.declaration] == name,
- message:
- "Native member name set inconsistently on $element: "
- "Existing name '${nativeMemberName[element.declaration]}', "
- "new name '$name'."));
+ nativeMemberName[element.declaration] == name,
+ message: "Native member name set inconsistently on $element: "
+ "Existing name '${nativeMemberName[element.declaration]}', "
+ "new name '$name'."));
nativeMemberName[element.declaration] = name;
}
@@ -141,13 +136,13 @@
// compiler copies pre-processed elements into a new compiler through
// [Compiler.onLibraryScanned] and thereby causes multiple calls to this
// method.
- assert(invariant(cls,
+ assert(invariant(
+ cls,
nativeClassTagInfo[cls.declaration] == null ||
- nativeClassTagInfo[cls.declaration] == tagInfo,
- message:
- "Native tag info set inconsistently on $cls: "
- "Existing tag info '${nativeClassTagInfo[cls.declaration]}', "
- "new tag info '$tagInfo'."));
+ nativeClassTagInfo[cls.declaration] == tagInfo,
+ message: "Native tag info set inconsistently on $cls: "
+ "Existing tag info '${nativeClassTagInfo[cls.declaration]}', "
+ "new tag info '$tagInfo'."));
nativeClassTagInfo[cls.declaration] = tagInfo;
}
@@ -159,12 +154,13 @@
/// Returns the list of non-directive native tag words for [cls].
List<String> getNativeTagsOfClass(ClassElement cls) {
- return getNativeTagsOfClassRaw(cls).where(
- (s) => !s.startsWith('!')).toList();
+ return getNativeTagsOfClassRaw(cls)
+ .where((s) => !s.startsWith('!'))
+ .toList();
}
/// Returns `true` if [cls] has a `!nonleaf` tag word.
bool hasNativeTagsForcedNonLeaf(ClassElement cls) {
return getNativeTagsOfClassRaw(cls).contains('!nonleaf');
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
index 4db2387..4bc5384 100644
--- a/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
+++ b/pkg/compiler/lib/src/js_backend/no_such_method_registry.dart
@@ -44,15 +44,19 @@
class NoSuchMethodRegistry {
/// The implementations that fall into category A, described above.
final Set<FunctionElement> defaultImpls = new Set<FunctionElement>();
+
/// The implementations that fall into category B, described above.
final Set<FunctionElement> throwingImpls = new Set<FunctionElement>();
+
/// The implementations that fall into category C, described above.
final Set<FunctionElement> notApplicableImpls = new Set<FunctionElement>();
+
/// The implementations that fall into category D, described above.
final Set<FunctionElement> otherImpls = new Set<FunctionElement>();
/// The implementations that fall into category D1
final Set<FunctionElement> complexNoReturnImpls = new Set<FunctionElement>();
+
/// The implementations that fall into category D2
final Set<FunctionElement> complexReturningImpls = new Set<FunctionElement>();
@@ -90,23 +94,20 @@
/// Emits a diagnostic
void emitDiagnostic() {
throwingImpls.forEach((e) {
- if (!_hasForwardingSyntax(e)) {
- reporter.reportHintMessage(
- e, MessageKind.DIRECTLY_THROWING_NSM);
- }
- });
+ if (!_hasForwardingSyntax(e)) {
+ reporter.reportHintMessage(e, MessageKind.DIRECTLY_THROWING_NSM);
+ }
+ });
complexNoReturnImpls.forEach((e) {
- if (!_hasForwardingSyntax(e)) {
- reporter.reportHintMessage(
- e, MessageKind.COMPLEX_THROWING_NSM);
- }
- });
+ if (!_hasForwardingSyntax(e)) {
+ reporter.reportHintMessage(e, MessageKind.COMPLEX_THROWING_NSM);
+ }
+ });
complexReturningImpls.forEach((e) {
- if (!_hasForwardingSyntax(e)) {
- reporter.reportHintMessage(
- e, MessageKind.COMPLEX_RETURNING_NSM);
- }
- });
+ if (!_hasForwardingSyntax(e)) {
+ reporter.reportHintMessage(e, MessageKind.COMPLEX_RETURNING_NSM);
+ }
+ });
}
/// Returns [true] if the given element is a complex [noSuchMethod]
@@ -154,7 +155,7 @@
Element superCall =
element.enclosingClass.lookupSuperByName(Names.noSuchMethod_);
NsmCategory category = _categorizeImpl(superCall);
- switch(category) {
+ switch (category) {
case NsmCategory.DEFAULT:
defaultImpls.add(element);
break;
@@ -183,9 +184,9 @@
bool _isDefaultNoSuchMethodImplementation(FunctionElement element) {
ClassElement classElement = element.enclosingClass;
- return classElement == _compiler.coreClasses.objectClass
- || classElement == _backend.helpers.jsInterceptorClass
- || classElement == _backend.helpers.jsNullClass;
+ return classElement == _compiler.coreClasses.objectClass ||
+ classElement == _backend.helpers.jsInterceptorClass ||
+ classElement == _backend.helpers.jsNullClass;
}
bool _hasForwardingSyntax(FunctionElement element) {
@@ -240,9 +241,4 @@
}
}
-enum NsmCategory {
- DEFAULT,
- THROWING,
- NOT_APPLICABLE,
- OTHER,
-}
+enum NsmCategory { DEFAULT, THROWING, NOT_APPLICABLE, OTHER, }
diff --git a/pkg/compiler/lib/src/js_backend/patch_resolver.dart b/pkg/compiler/lib/src/js_backend/patch_resolver.dart
index 60573ed..521dd2d 100644
--- a/pkg/compiler/lib/src/js_backend/patch_resolver.dart
+++ b/pkg/compiler/lib/src/js_backend/patch_resolver.dart
@@ -5,12 +5,9 @@
library dart2js.js_backend.patch_resolver;
import '../common.dart';
-import '../common/resolution.dart' show
- Resolution;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/resolution.dart' show Resolution;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../elements/modelx.dart';
@@ -33,15 +30,13 @@
element = patch;
} else if (!compiler.backend.isJsInterop(element)) {
reporter.reportErrorMessage(
- element, MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
+ element, MessageKind.PATCH_EXTERNAL_WITHOUT_IMPLEMENTATION);
}
return element;
}
void checkMatchingPatchParameters(FunctionElement origin,
- List<Element> originParameters,
- List<Element> patchParameters) {
-
+ List<Element> originParameters, List<Element> patchParameters) {
assert(originParameters.length == patchParameters.length);
for (int index = 0; index < originParameters.length; index++) {
ParameterElementX originParameter = originParameters[index];
@@ -52,19 +47,19 @@
originParameter.applyPatch(patchParameter);
} else {
assert(invariant(origin, originParameter.patch == patchParameter,
- message: "Inconsistent repatch of $originParameter."));
+ message: "Inconsistent repatch of $originParameter."));
}
DartType originParameterType = originParameter.computeType(resolution);
DartType patchParameterType = patchParameter.computeType(resolution);
if (originParameterType != patchParameterType) {
reporter.reportError(
reporter.createMessage(
- originParameter,
- MessageKind.PATCH_PARAMETER_TYPE_MISMATCH,
- {'methodName': origin.name,
- 'parameterName': originParameter.name,
- 'originParameterType': originParameterType,
- 'patchParameterType': patchParameterType}),
+ originParameter, MessageKind.PATCH_PARAMETER_TYPE_MISMATCH, {
+ 'methodName': origin.name,
+ 'parameterName': originParameter.name,
+ 'originParameterType': originParameterType,
+ 'patchParameterType': patchParameterType
+ }),
<DiagnosticMessage>[
reporter.createMessage(
patchParameter,
@@ -83,28 +78,28 @@
if (originParameterText != patchParameterText
// We special case the list constructor because of the
// optional parameter.
- && origin != compiler.unnamedListConstructor) {
+ &&
+ origin != compiler.unnamedListConstructor) {
reporter.reportError(
reporter.createMessage(
- originParameter,
- MessageKind.PATCH_PARAMETER_MISMATCH,
- {'methodName': origin.name,
- 'originParameter': originParameterText,
- 'patchParameter': patchParameterText}),
+ originParameter, MessageKind.PATCH_PARAMETER_MISMATCH, {
+ 'methodName': origin.name,
+ 'originParameter': originParameterText,
+ 'patchParameter': patchParameterText
+ }),
<DiagnosticMessage>[
- reporter.createMessage(
- patchParameter,
- MessageKind.PATCH_POINT_TO_PARAMETER,
- {'parameterName': patchParameter.name}),
+ reporter.createMessage(
+ patchParameter,
+ MessageKind.PATCH_POINT_TO_PARAMETER,
+ {'parameterName': patchParameter.name}),
]);
-
}
}
}
}
- void checkMatchingPatchSignatures(FunctionElement origin,
- FunctionElement patch) {
+ void checkMatchingPatchSignatures(
+ FunctionElement origin, FunctionElement patch) {
// TODO(johnniwinther): Show both origin and patch locations on errors.
FunctionSignature originSignature = origin.functionSignature;
FunctionExpression patchTree = patch.node;
@@ -115,26 +110,26 @@
Node errorNode =
patchTree.returnType != null ? patchTree.returnType : patchTree;
reporter.reportErrorMessage(
- errorNode, MessageKind.PATCH_RETURN_TYPE_MISMATCH,
- {'methodName': origin.name,
- 'originReturnType': originSignature.type.returnType,
- 'patchReturnType': patchSignature.type.returnType});
+ errorNode, MessageKind.PATCH_RETURN_TYPE_MISMATCH, {
+ 'methodName': origin.name,
+ 'originReturnType': originSignature.type.returnType,
+ 'patchReturnType': patchSignature.type.returnType
+ });
});
}
if (originSignature.requiredParameterCount !=
patchSignature.requiredParameterCount) {
reporter.withCurrentElement(patch, () {
reporter.reportErrorMessage(
- patchTree,
- MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH,
- {'methodName': origin.name,
- 'originParameterCount': originSignature.requiredParameterCount,
- 'patchParameterCount': patchSignature.requiredParameterCount});
+ patchTree, MessageKind.PATCH_REQUIRED_PARAMETER_COUNT_MISMATCH, {
+ 'methodName': origin.name,
+ 'originParameterCount': originSignature.requiredParameterCount,
+ 'patchParameterCount': patchSignature.requiredParameterCount
+ });
});
} else {
- checkMatchingPatchParameters(origin,
- originSignature.requiredParameters,
- patchSignature.requiredParameters);
+ checkMatchingPatchParameters(origin, originSignature.requiredParameters,
+ patchSignature.requiredParameters);
}
if (originSignature.optionalParameterCount != 0 &&
patchSignature.optionalParameterCount != 0) {
@@ -152,17 +147,15 @@
patchSignature.optionalParameterCount) {
reporter.withCurrentElement(patch, () {
reporter.reportErrorMessage(
- patchTree,
- MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH,
- {'methodName': origin.name,
- 'originParameterCount': originSignature.optionalParameterCount,
- 'patchParameterCount': patchSignature.optionalParameterCount});
+ patchTree, MessageKind.PATCH_OPTIONAL_PARAMETER_COUNT_MISMATCH, {
+ 'methodName': origin.name,
+ 'originParameterCount': originSignature.optionalParameterCount,
+ 'patchParameterCount': patchSignature.optionalParameterCount
+ });
});
} else {
- checkMatchingPatchParameters(origin,
- originSignature.optionalParameters,
- patchSignature.optionalParameters);
+ checkMatchingPatchParameters(origin, originSignature.optionalParameters,
+ patchSignature.optionalParameters);
}
}
-
}
diff --git a/pkg/compiler/lib/src/js_backend/runtime_types.dart b/pkg/compiler/lib/src/js_backend/runtime_types.dart
index 29aade6..036e52a 100644
--- a/pkg/compiler/lib/src/js_backend/runtime_types.dart
+++ b/pkg/compiler/lib/src/js_backend/runtime_types.dart
@@ -7,7 +7,8 @@
/// For each class, stores the possible class subtype tests that could succeed.
abstract class TypeChecks {
/// Get the set of checks required for class [element].
- Iterable<TypeCheck> operator[](ClassElement element);
+ Iterable<TypeCheck> operator [](ClassElement element);
+
/// Get the iterable for all classes that need type checks.
Iterable<ClassElement> get classes;
}
@@ -28,24 +29,24 @@
void registerClassUsingTypeVariableExpression(ClassElement cls);
void registerRtiDependency(Element element, Element dependency);
- void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
- DartType bound);
+ void registerTypeVariableBoundsSubtypeCheck(
+ DartType typeArgument, DartType bound);
- Set<ClassElement> getClassesUsedInSubstitutions(JavaScriptBackend backend,
- TypeChecks checks);
+ Set<ClassElement> getClassesUsedInSubstitutions(
+ JavaScriptBackend backend, TypeChecks checks);
void computeClassesNeedingRti();
/// Compute the required type checkes and substitutions for the given
/// instantitated and checked classes.
- TypeChecks computeChecks(Set<ClassElement> instantiated,
- Set<ClassElement> checked);
+ TypeChecks computeChecks(
+ Set<ClassElement> instantiated, Set<ClassElement> checked);
/// Compute type arguments of classes that use one of their type variables in
/// is-checks and add the is-checks that they imply.
///
/// This function must be called after all is-checks have been registered.
- void addImplicitChecks(Universe universe,
- Iterable<ClassElement> classesUsingChecks);
+ void addImplicitChecks(
+ Universe universe, Iterable<ClassElement> classesUsingChecks);
/// Return all classes that are referenced in the type of the function, i.e.,
/// in the return type or the argument types.
@@ -73,8 +74,7 @@
jsAst.Expression getSignatureEncoding(DartType type, jsAst.Expression this_);
jsAst.Expression getSubstitutionRepresentation(
- List<DartType> types,
- OnVariableCallback onVariable);
+ List<DartType> types, OnVariableCallback onVariable);
jsAst.Expression getSubstitutionCode(Substitution substitution);
jsAst.Expression getSubstitutionCodeForVariable(
Substitution substitution, int index);
@@ -89,9 +89,8 @@
jsAst.Name get getFunctionThatReturnsNullName;
jsAst.Expression getTypeRepresentation(
- DartType type,
- OnVariableCallback onVariable,
- [ShouldEncodeTypedefCallback shouldEncodeTypedef]);
+ DartType type, OnVariableCallback onVariable,
+ [ShouldEncodeTypedefCallback shouldEncodeTypedef]);
/**
* Returns a [jsAst.Expression] representing the given [type]. Type
* variables are replaced by placeholders in the ast.
@@ -100,8 +99,9 @@
* This is useful if the returned [jsAst.Expression] is only part of a
* larger template. By default, indexing starts with 0.
*/
- jsAst.Expression getTypeRepresentationWithPlaceholders(DartType type,
- OnVariableCallback onVariable, {int firstPlaceholderIndex : 0});
+ jsAst.Expression getTypeRepresentationWithPlaceholders(
+ DartType type, OnVariableCallback onVariable,
+ {int firstPlaceholderIndex: 0});
String getTypeRepresentationForTypeConstant(DartType type);
}
@@ -157,8 +157,8 @@
}
@override
- void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
- DartType bound) {
+ void registerTypeVariableBoundsSubtypeCheck(
+ DartType typeArgument, DartType bound) {
checkedTypeArguments.add(typeArgument);
checkedBounds.add(bound);
}
@@ -178,8 +178,8 @@
* immutable datastructure.
*/
@override
- void addImplicitChecks(Universe universe,
- Iterable<ClassElement> classesUsingChecks) {
+ void addImplicitChecks(
+ Universe universe, Iterable<ClassElement> classesUsingChecks) {
// If there are no classes that use their variables in checks, there is
// nothing to do.
if (classesUsingChecks.isEmpty) return;
@@ -293,10 +293,10 @@
methodsNeedingRti.add(method);
}
}
- compiler.resolverWorld.closuresWithFreeTypeVariables.forEach(
- analyzeMethod);
- compiler.resolverWorld.callMethodsWithFreeTypeVariables.forEach(
- analyzeMethod);
+ compiler.resolverWorld.closuresWithFreeTypeVariables
+ .forEach(analyzeMethod);
+ compiler.resolverWorld.callMethodsWithFreeTypeVariables
+ .forEach(analyzeMethod);
}
}
});
@@ -309,10 +309,10 @@
methodsNeedingRti.add(method);
}
}
- compiler.resolverWorld.closuresWithFreeTypeVariables.forEach(
- analyzeMethod);
- compiler.resolverWorld.callMethodsWithFreeTypeVariables.forEach(
- analyzeMethod);
+ compiler.resolverWorld.closuresWithFreeTypeVariables
+ .forEach(analyzeMethod);
+ compiler.resolverWorld.callMethodsWithFreeTypeVariables
+ .forEach(analyzeMethod);
}
// Add the classes that need RTI because they use a type variable as
// expression.
@@ -329,8 +329,8 @@
}
@override
- TypeChecks computeChecks(Set<ClassElement> instantiated,
- Set<ClassElement> checked) {
+ TypeChecks computeChecks(
+ Set<ClassElement> instantiated, Set<ClassElement> checked) {
// Run through the combination of instantiated and checked
// arguments and record all combination where the element of a checked
// argument is a superclass of the element of an instantiated type.
@@ -342,7 +342,7 @@
// Find all supertypes of [element] in [checkedArguments] and add checks
// and precompute the substitutions for them.
assert(invariant(element, element.allSupertypes != null,
- message: 'Supertypes have not been computed for $element.'));
+ message: 'Supertypes have not been computed for $element.'));
for (DartType supertype in element.allSupertypes) {
ClassElement superelement = supertype.element;
if (checked.contains(superelement)) {
@@ -398,8 +398,8 @@
* have a type check against this supertype that includes a check against
* the type arguments.
*/
- void computeInstantiatedArguments(Set<DartType> instantiatedTypes,
- Set<DartType> isChecks) {
+ void computeInstantiatedArguments(
+ Set<DartType> instantiatedTypes, Set<DartType> isChecks) {
ArgumentCollector superCollector = new ArgumentCollector(backend);
ArgumentCollector directCollector = new ArgumentCollector(backend);
FunctionArgumentCollector functionArgumentCollector =
@@ -416,7 +416,7 @@
collectFunctionTypeArguments(checkedBounds);
void collectTypeArguments(Iterable<DartType> types,
- {bool isTypeArgument: false}) {
+ {bool isTypeArgument: false}) {
for (DartType type in types) {
directCollector.collect(type, isTypeArgument: isTypeArgument);
if (type.isInterfaceType) {
@@ -436,15 +436,15 @@
}
}
- directlyInstantiatedArguments =
- directCollector.classes..addAll(functionArgumentCollector.classes);
- allInstantiatedArguments =
- superCollector.classes..addAll(directlyInstantiatedArguments);
+ directlyInstantiatedArguments = directCollector.classes
+ ..addAll(functionArgumentCollector.classes);
+ allInstantiatedArguments = superCollector.classes
+ ..addAll(directlyInstantiatedArguments);
}
/// Collects all type arguments used in is-checks.
- void computeCheckedArguments(Set<DartType> instantiatedTypes,
- Set<DartType> isChecks) {
+ void computeCheckedArguments(
+ Set<DartType> instantiatedTypes, Set<DartType> isChecks) {
ArgumentCollector collector = new ArgumentCollector(backend);
FunctionArgumentCollector functionArgumentCollector =
new FunctionArgumentCollector(backend);
@@ -461,7 +461,7 @@
collectFunctionTypeArguments(checkedTypeArguments);
void collectTypeArguments(Iterable<DartType> types,
- {bool isTypeArgument: false}) {
+ {bool isTypeArgument: false}) {
for (DartType type in types) {
collector.collect(type, isTypeArgument: isTypeArgument);
}
@@ -469,13 +469,13 @@
collectTypeArguments(isChecks);
collectTypeArguments(checkedBounds, isTypeArgument: true);
- checkedArguments =
- collector.classes..addAll(functionArgumentCollector.classes);
+ checkedArguments = collector.classes
+ ..addAll(functionArgumentCollector.classes);
}
@override
- Set<ClassElement> getClassesUsedInSubstitutions(JavaScriptBackend backend,
- TypeChecks checks) {
+ Set<ClassElement> getClassesUsedInSubstitutions(
+ JavaScriptBackend backend, TypeChecks checks) {
Set<ClassElement> instantiated = new Set<ClassElement>();
ArgumentCollector collector = new ArgumentCollector(backend);
for (ClassElement target in checks.classes) {
@@ -492,12 +492,11 @@
@override
Set<ClassElement> getRequiredArgumentClasses(JavaScriptBackend backend) {
- Set<ClassElement> requiredArgumentClasses =
- new Set<ClassElement>.from(
- getClassesUsedInSubstitutions(backend, requiredChecks));
+ Set<ClassElement> requiredArgumentClasses = new Set<ClassElement>.from(
+ getClassesUsedInSubstitutions(backend, requiredChecks));
return requiredArgumentClasses
- ..addAll(directlyInstantiatedArguments)
- ..addAll(checkedArguments);
+ ..addAll(directlyInstantiatedArguments)
+ ..addAll(checkedArguments);
}
@override
@@ -558,7 +557,7 @@
}
Substitution computeSubstitution(ClassElement cls, ClassElement check,
- { bool alwaysGenerateFunction: false }) {
+ {bool alwaysGenerateFunction: false}) {
if (isTrivialSubstitution(cls, check)) return null;
// Unnamed mixin application classes do not need substitutions, because they
@@ -602,16 +601,16 @@
@override
jsAst.Expression getTypeRepresentation(
- DartType type,
- OnVariableCallback onVariable,
+ DartType type, OnVariableCallback onVariable,
[ShouldEncodeTypedefCallback shouldEncodeTypedef]) {
return representationGenerator.getTypeRepresentation(
type, onVariable, shouldEncodeTypedef);
}
@override
- jsAst.Expression getTypeRepresentationWithPlaceholders(DartType type,
- OnVariableCallback onVariable, {int firstPlaceholderIndex : 0}) {
+ jsAst.Expression getTypeRepresentationWithPlaceholders(
+ DartType type, OnVariableCallback onVariable,
+ {int firstPlaceholderIndex: 0}) {
// Create a type representation. For type variables call the original
// callback for side effects and return a template placeholder.
int positions = firstPlaceholderIndex;
@@ -624,8 +623,7 @@
@override
jsAst.Expression getSubstitutionRepresentation(
- List<DartType> types,
- OnVariableCallback onVariable) {
+ List<DartType> types, OnVariableCallback onVariable) {
List<jsAst.Expression> elements = types
.map((DartType type) => getTypeRepresentation(type, onVariable))
.toList(growable: false);
@@ -633,11 +631,12 @@
}
jsAst.Expression getTypeEncoding(DartType type,
- {bool alwaysGenerateFunction: false}) {
+ {bool alwaysGenerateFunction: false}) {
ClassElement contextClass = Types.getClassContext(type);
jsAst.Expression onVariable(TypeVariableType v) {
return new jsAst.VariableUse(v.name);
- };
+ }
+ ;
jsAst.Expression encoding = getTypeRepresentation(type, onVariable);
if (contextClass == null && !alwaysGenerateFunction) {
return encoding;
@@ -645,7 +644,7 @@
List<String> parameters = const <String>[];
if (contextClass != null) {
parameters = contextClass.typeVariables.map((type) {
- return type.toString();
+ return type.toString();
}).toList();
}
return js('function(#) { return # }', [parameters, encoding]);
@@ -660,10 +659,12 @@
if (contextClass != null) {
JavaScriptBackend backend = compiler.backend;
jsAst.Name contextName = backend.namer.className(contextClass);
- return js('function () { return #(#, #, #); }',
- [ backend.emitter.staticFunctionAccess(
- backend.helpers.computeSignature),
- encoding, this_, js.quoteName(contextName) ]);
+ return js('function () { return #(#, #, #); }', [
+ backend.emitter.staticFunctionAccess(backend.helpers.computeSignature),
+ encoding,
+ this_,
+ js.quoteName(contextName)
+ ]);
} else {
return encoding;
}
@@ -709,8 +710,8 @@
}
@override
- jsAst.Expression getSubstitutionCodeForVariable(Substitution substitution,
- int index) {
+ jsAst.Expression getSubstitutionCodeForVariable(
+ Substitution substitution, int index) {
jsAst.Expression declaration(TypeVariableType variable) {
return new jsAst.Parameter(getVariableName(variable.name));
}
@@ -735,8 +736,8 @@
}
@override
- jsAst.Name get getFunctionThatReturnsNullName
- => backend.namer.internalGlobal('functionThatReturnsNull');
+ jsAst.Name get getFunctionThatReturnsNullName =>
+ backend.namer.internalGlobal('functionThatReturnsNull');
@override
String getTypeRepresentationForTypeConstant(DartType type) {
@@ -753,8 +754,7 @@
// names, it would result in more readable names if the final string was a
// legal JavaScript identifer.
if (variables.isEmpty) return name;
- String arguments =
- new List.filled(variables.length, 'dynamic').join(', ');
+ String arguments = new List.filled(variables.length, 'dynamic').join(', ');
return '$name<$arguments>';
}
@@ -763,7 +763,7 @@
if (!type.returnType.isDynamic) return false;
if (!type.optionalParameterTypes.isEmpty) return false;
if (!type.namedParameterTypes.isEmpty) return false;
- for (DartType parameter in type.parameterTypes ) {
+ for (DartType parameter in type.parameterTypes) {
if (!parameter.isDynamic) return false;
}
return true;
@@ -845,8 +845,8 @@
jsAst.Template get templateForCreateFunctionType {
// The value of the functionTypeTag can be anything. We use "dynaFunc" for
// easier debugging.
- return jsAst.js.expressionTemplateFor(
- '{ ${namer.functionTypeTag}: "dynafunc" }');
+ return jsAst.js
+ .expressionTemplateFor('{ ${namer.functionTypeTag}: "dynafunc" }');
}
visitFunctionType(FunctionType type, _) {
@@ -866,11 +866,11 @@
}
if (!type.parameterTypes.isEmpty) {
addProperty(namer.functionTypeRequiredParametersTag,
- visitList(type.parameterTypes));
+ visitList(type.parameterTypes));
}
if (!type.optionalParameterTypes.isEmpty) {
addProperty(namer.functionTypeOptionalParametersTag,
- visitList(type.optionalParameterTypes));
+ visitList(type.optionalParameterTypes));
}
if (!type.namedParameterTypes.isEmpty) {
List<jsAst.Property> namedArguments = <jsAst.Property>[];
@@ -882,7 +882,7 @@
namedArguments.add(new jsAst.Property(name, visit(types[index])));
}
addProperty(namer.functionTypeNamedParametersTag,
- new jsAst.ObjectInitializer(namedArguments));
+ new jsAst.ObjectInitializer(namedArguments));
}
return new jsAst.ObjectInitializer(properties);
}
@@ -917,17 +917,16 @@
}
visitStatementType(StatementType type, _) {
- reporter.internalError(NO_LOCATION_SPANNABLE,
- 'Unexpected type: $type (${type.kind}).');
+ reporter.internalError(
+ NO_LOCATION_SPANNABLE, 'Unexpected type: $type (${type.kind}).');
}
}
-
class TypeCheckMapping implements TypeChecks {
final Map<ClassElement, Set<TypeCheck>> map =
new Map<ClassElement, Set<TypeCheck>>();
- Iterable<TypeCheck> operator[](ClassElement element) {
+ Iterable<TypeCheck> operator [](ClassElement element) {
Set<TypeCheck> result = map[element];
return result != null ? result : const <TypeCheck>[];
}
@@ -1035,8 +1034,7 @@
: isFunction = false,
parameters = const <DartType>[];
- Substitution.function(this.arguments, this.parameters)
- : isFunction = true;
+ Substitution.function(this.arguments, this.parameters) : isFunction = true;
}
/**
diff --git a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
index 3fb220a..b3b4354 100644
--- a/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
+++ b/pkg/compiler/lib/src/js_backend/type_variable_handler.dart
@@ -38,8 +38,8 @@
JavaScriptBackend get _backend => _compiler.backend;
DiagnosticReporter get reporter => _compiler.reporter;
- void registerClassWithTypeVariables(ClassElement cls, Enqueuer enqueuer,
- Registry registry) {
+ void registerClassWithTypeVariables(
+ ClassElement cls, Enqueuer enqueuer, Registry registry) {
if (enqueuer.isResolutionQueue) {
// On first encounter, we have to ensure that the support classes get
// resolved.
@@ -55,10 +55,9 @@
_backend.enqueueInResolution(_typeVariableConstructor, registry);
_backend.registerInstantiatedType(
_typeVariableClass.rawType, enqueuer, registry);
- enqueuer.registerStaticUse(
- new StaticUse.staticInvoke(
- _backend.registerBackendUse(_backend.helpers.createRuntimeType),
- CallStructure.ONE_ARG));
+ enqueuer.registerStaticUse(new StaticUse.staticInvoke(
+ _backend.registerBackendUse(_backend.helpers.createRuntimeType),
+ CallStructure.ONE_ARG));
_seenClassesWithTypeVariables = true;
}
} else {
@@ -82,21 +81,16 @@
typeVariableElement,
typeVariableElement.node,
new StringConstantExpression(currentTypeVariable.name),
- _backend.constantSystem.createString(
- new DartString.literal(currentTypeVariable.name)));
+ _backend.constantSystem
+ .createString(new DartString.literal(currentTypeVariable.name)));
jsAst.Expression boundIndex =
_metadataCollector.reifyType(typeVariableElement.bound);
- ConstantValue boundValue =
- new SyntheticConstantValue(
- SyntheticConstantKind.TYPEVARIABLE_REFERENCE,
- boundIndex);
+ ConstantValue boundValue = new SyntheticConstantValue(
+ SyntheticConstantKind.TYPEVARIABLE_REFERENCE, boundIndex);
ConstantExpression boundExpression =
new SyntheticConstantExpression(boundValue);
- AstConstant bound = new AstConstant(
- typeVariableElement,
- typeVariableElement.node,
- boundExpression,
- boundValue);
+ AstConstant bound = new AstConstant(typeVariableElement,
+ typeVariableElement.node, boundExpression, boundValue);
AstConstant type = new AstConstant(
typeVariableElement,
typeVariableElement.node,
@@ -123,8 +117,8 @@
_backend.registerCompileTimeConstant(value, _compiler.globalDependencies);
_backend.addCompileTimeConstantForEmission(value);
_backend.constants.addCompileTimeConstantForEmission(value);
- constants.add(
- _reifyTypeVariableConstant(value, currentTypeVariable.element));
+ constants
+ .add(_reifyTypeVariableConstant(value, currentTypeVariable.element));
}
_typeVariables[cls] = constants;
}
@@ -137,8 +131,8 @@
* entry in the list has already been reserved and the constant is added
* there, otherwise a new entry for [c] is created.
*/
- jsAst.Expression _reifyTypeVariableConstant(ConstantValue c,
- TypeVariableElement variable) {
+ jsAst.Expression _reifyTypeVariableConstant(
+ ConstantValue c, TypeVariableElement variable) {
jsAst.Expression name = _task.constantReference(c);
jsAst.Expression result = _metadataCollector.reifyExpression(name);
if (_typeVariableConstants.containsKey(variable)) {
diff --git a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
index c727d56..447710d 100644
--- a/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/class_stub_generator.dart
@@ -11,8 +11,8 @@
ClassStubGenerator(this.compiler, this.namer, this.backend);
- jsAst.Expression generateClassConstructor(ClassElement classElement,
- Iterable<jsAst.Name> fields) {
+ jsAst.Expression generateClassConstructor(
+ ClassElement classElement, Iterable<jsAst.Name> fields) {
// TODO(sra): Implement placeholders in VariableDeclaration position:
//
// String constructorName = namer.getNameOfClass(classElement);
@@ -20,10 +20,11 @@
// [ constructorName, fields,
// fields.map(
// (name) => js('this.# = #', [name, name]))]));
- return js('function(#) { #; this.#();}',
- [fields,
- fields.map((name) => js('this.# = #', [name, name])),
- namer.deferredAction]);
+ return js('function(#) { #; this.#();}', [
+ fields,
+ fields.map((name) => js('this.# = #', [name, name])),
+ namer.deferredAction
+ ]);
}
jsAst.Expression generateGetter(Element member, jsAst.Name fieldName) {
@@ -38,8 +39,8 @@
String receiver = backend.isInterceptorClass(cls) ? 'receiver' : 'this';
List<String> args = backend.isInterceptedMethod(member) ? ['receiver'] : [];
// TODO(floitsch): remove 'return'?
- return js('function(#, v) { return #.# = v; }',
- [args, receiver, fieldName]);
+ return js(
+ 'function(#, v) { return #.# = v; }', [args, receiver, fieldName]);
}
/**
@@ -54,8 +55,7 @@
// If the method is intercepted, the stub gets the
// receiver explicitely and we need to pass it to the getter call.
bool isInterceptedMethod = backend.isInterceptedMethod(member);
- bool isInterceptorClass =
- backend.isInterceptorClass(member.enclosingClass);
+ bool isInterceptorClass = backend.isInterceptorClass(member.enclosingClass);
const String receiverArgumentName = r'$receiver';
@@ -75,7 +75,7 @@
}
Map<jsAst.Name, jsAst.Expression> generatedStubs =
- <jsAst.Name, jsAst.Expression>{};
+ <jsAst.Name, jsAst.Expression>{};
// Two selectors may match but differ only in type. To avoid generating
// identical stubs for each we track untyped selectors which already have
@@ -103,9 +103,8 @@
arguments.add(js('#', name));
}
- jsAst.Fun function = js(
- 'function(#) { return #.#(#); }',
- [ parameters, buildGetter(), closureCallName, arguments]);
+ jsAst.Fun function = js('function(#) { return #.#(#); }',
+ [parameters, buildGetter(), closureCallName, arguments]);
generatedStubs[invocationName] = function;
}
@@ -115,7 +114,6 @@
}
Map<jsAst.Name, Selector> computeSelectorsForNsmHandlers() {
-
Map<jsAst.Name, Selector> jsNames = <jsAst.Name, Selector>{};
// Do not generate no such method handlers if there is no class.
@@ -123,8 +121,8 @@
return jsNames;
}
- void addNoSuchMethodHandlers(String ignore,
- Map<Selector, SelectorConstraints> selectors) {
+ void addNoSuchMethodHandlers(
+ String ignore, Map<Selector, SelectorConstraints> selectors) {
for (Selector selector in selectors.keys) {
SelectorConstraints maskSet = selectors[selector];
if (maskSet.needsNoSuchMethodHandling(selector, compiler.world)) {
@@ -140,47 +138,47 @@
return jsNames;
}
- StubMethod generateStubForNoSuchMethod(jsAst.Name name,
- Selector selector) {
+ StubMethod generateStubForNoSuchMethod(jsAst.Name name, Selector selector) {
// Values match JSInvocationMirror in js-helper library.
int type = selector.invocationMirrorKind;
List<String> parameterNames =
new List.generate(selector.argumentCount, (i) => '\$$i');
- List<jsAst.Expression> argNames =
- selector.callStructure.getOrderedNamedArguments().map((String name) =>
- js.string(name)).toList();
+ List<jsAst.Expression> argNames = selector.callStructure
+ .getOrderedNamedArguments()
+ .map((String name) => js.string(name))
+ .toList();
jsAst.Name methodName = namer.asName(selector.invocationMirrorMemberName);
jsAst.Name internalName = namer.invocationMirrorInternalName(selector);
assert(backend.isInterceptedName(Identifiers.noSuchMethod_));
bool isIntercepted = backend.isInterceptedName(selector.name);
- jsAst.Expression expression =
- js('''this.#noSuchMethodName(#receiver,
+ jsAst.Expression expression = js(
+ '''this.#noSuchMethodName(#receiver,
#createInvocationMirror(#methodName,
#internalName,
#type,
#arguments,
#namedArguments))''',
- {'receiver': isIntercepted ? r'$receiver' : 'this',
- 'noSuchMethodName': namer.noSuchMethodName,
- 'createInvocationMirror':
- backend.emitter.staticFunctionAccess(
- backend.helpers.createInvocationMirror),
- 'methodName':
- js.quoteName(compiler.options.enableMinification
- ? internalName : methodName),
- 'internalName': js.quoteName(internalName),
- 'type': js.number(type),
- 'arguments':
- new jsAst.ArrayInitializer(parameterNames.map(js).toList()),
- 'namedArguments': new jsAst.ArrayInitializer(argNames)});
+ {
+ 'receiver': isIntercepted ? r'$receiver' : 'this',
+ 'noSuchMethodName': namer.noSuchMethodName,
+ 'createInvocationMirror': backend.emitter
+ .staticFunctionAccess(backend.helpers.createInvocationMirror),
+ 'methodName': js.quoteName(
+ compiler.options.enableMinification ? internalName : methodName),
+ 'internalName': js.quoteName(internalName),
+ 'type': js.number(type),
+ 'arguments':
+ new jsAst.ArrayInitializer(parameterNames.map(js).toList()),
+ 'namedArguments': new jsAst.ArrayInitializer(argNames)
+ });
jsAst.Expression function;
if (isIntercepted) {
- function = js(r'function($receiver, #) { return # }',
- [parameterNames, expression]);
+ function = js(
+ r'function($receiver, #) { return # }', [parameterNames, expression]);
} else {
function = js(r'function(#) { return # }', [parameterNames, expression]);
}
@@ -219,8 +217,8 @@
js.string(namer.globalObjectFor(closureFromTearOff));
} else {
// Default values for mocked-up test libraries.
- tearOffAccessExpression = js(
- r'''function() { throw "Helper 'closureFromTearOff' missing." }''');
+ tearOffAccessExpression =
+ js(r'''function() { throw "Helper 'closureFromTearOff' missing." }''');
tearOffGlobalObjectString = js.string('MissingHelperFunction');
tearOffGlobalObject = js(
r'''(function() { throw "Helper 'closureFromTearOff' missing." })()''');
@@ -230,7 +228,8 @@
if (!compiler.options.useContentSecurityPolicy) {
jsAst.Expression tearOffAccessText =
new jsAst.UnparsedNode(tearOffAccessExpression, compiler, false);
- tearOffGetter = js.statement('''
+ tearOffGetter = js.statement(
+ '''
function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) {
return isIntercepted
? new Function("funcs", "reflectionInfo", "name",
@@ -247,11 +246,15 @@
"this, funcs, reflectionInfo, false, [], name);" +
"return new c(this, funcs[0], null, name);" +
"}")(funcs, reflectionInfo, name, #tearOffGlobalObject, null);
-}''', {'tearOffAccessText': tearOffAccessText,
- 'tearOffGlobalObject': tearOffGlobalObject,
- 'tearOffGlobalObjectString': tearOffGlobalObjectString});
+}''',
+ {
+ 'tearOffAccessText': tearOffAccessText,
+ 'tearOffGlobalObject': tearOffGlobalObject,
+ 'tearOffGlobalObjectString': tearOffGlobalObjectString
+ });
} else {
- tearOffGetter = js.statement('''
+ tearOffGetter = js.statement(
+ '''
function tearOffGetter(funcs, reflectionInfo, name, isIntercepted) {
var cache = null;
return isIntercepted
@@ -265,10 +268,12 @@
this, funcs, reflectionInfo, false, [], name);
return new cache(this, funcs[0], null, name);
};
- }''', [tearOffAccessExpression, tearOffAccessExpression]);
+ }''',
+ [tearOffAccessExpression, tearOffAccessExpression]);
}
- jsAst.Statement tearOff = js.statement('''
+ jsAst.Statement tearOff = js.statement(
+ '''
function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
var cache;
return isStatic
@@ -278,7 +283,8 @@
return cache;
}
: tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
- }''', {'tearOff': tearOffAccessExpression});
+ }''',
+ {'tearOff': tearOffAccessExpression});
return <jsAst.Statement>[tearOffGetter, tearOff];
}
diff --git a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
index bea4320..28583fc 100644
--- a/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
+++ b/pkg/compiler/lib/src/js_emitter/code_emitter_task.dart
@@ -34,7 +34,7 @@
Set<ClassElement> neededClasses;
CodeEmitterTask(Compiler compiler, Namer namer, bool generateSourceMap,
- bool useStartupEmitter)
+ bool useStartupEmitter)
: super(compiler),
this.namer = namer,
this.typeTestRegistry = new TypeTestRegistry(compiler) {
@@ -98,7 +98,7 @@
/// Returns the JS prototype of the given class [e].
jsAst.Expression prototypeAccess(ClassElement e,
- {bool hasBeenInstantiated: false}) {
+ {bool hasBeenInstantiated: false}) {
return emitter.prototypeAccess(e, hasBeenInstantiated);
}
@@ -141,8 +141,8 @@
emitter.invalidateCaches();
Set<ClassElement> rtiNeededClasses = _finalizeRti();
- ProgramBuilder programBuilder = new ProgramBuilder(
- compiler, namer, this, emitter, rtiNeededClasses);
+ ProgramBuilder programBuilder =
+ new ProgramBuilder(compiler, namer, this, emitter, rtiNeededClasses);
int size = emitter.emitProgram(programBuilder);
// TODO(floitsch): we shouldn't need the `neededClasses` anymore.
neededClasses = programBuilder.collector.neededClasses;
diff --git a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
index 462d0e4..a2a0d7d 100644
--- a/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
+++ b/pkg/compiler/lib/src/js_emitter/constant_ordering.dart
@@ -7,10 +7,7 @@
import '../constants/values.dart';
import '../dart_types.dart';
-import '../elements/elements.dart'
- show Element,
- Elements,
- FieldElement;
+import '../elements/elements.dart' show Element, Elements, FieldElement;
import '../tree/tree.dart' show DartString;
import '../js_backend/js_backend.dart' show SyntheticConstantKind;
@@ -64,8 +61,8 @@
if (a is GenericType) {
GenericType aGeneric = a;
GenericType bGeneric = b;
- r = compareLists(compareDartTypes,
- aGeneric.typeArguments, bGeneric.typeArguments);
+ r = compareLists(
+ compareDartTypes, aGeneric.typeArguments, bGeneric.typeArguments);
if (r != 0) return r;
}
throw 'unexpected compareDartTypes $a $b';
@@ -125,7 +122,8 @@
r = compareLists(compareElements, aFields, bFields);
if (r != 0) return r;
- return compareLists(compareValues,
+ return compareLists(
+ compareValues,
aFields.map((field) => a.fields[field]).toList(),
aFields.map((field) => b.fields[field]).toList());
}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart
index 6220c4e..2e0cb0e 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_builder.dart
@@ -79,9 +79,8 @@
List<jsAst.Property> fieldsAndProperties;
if (emitClassDescriptor) {
fieldsAndProperties = <jsAst.Property>[];
- fieldsAndProperties.add(
- new jsAst.Property(
- js.string(namer.classDescriptorProperty), classData));
+ fieldsAndProperties.add(new jsAst.Property(
+ js.string(namer.classDescriptorProperty), classData));
fieldsAndProperties.addAll(properties);
} else {
fieldsAndProperties = properties;
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
index 77f606a..0538a2d 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/class_emitter.dart
@@ -5,7 +5,6 @@
part of dart2js.js_emitter.full_emitter;
class ClassEmitter extends CodeEmitterHelper {
-
ClassStubGenerator get _stubGenerator =>
new ClassStubGenerator(compiler, namer, backend);
@@ -28,8 +27,7 @@
if (cls.isMixinApplication) {
MixinApplication mixinApplication = cls;
jsAst.Name mixinName = mixinApplication.mixinClass.name;
- superName =
- new CompoundName([superName, Namer.literalPlus, mixinName]);
+ superName = new CompoundName([superName, Namer.literalPlus, mixinName]);
emitter.needsMixinSupport = true;
}
@@ -53,9 +51,10 @@
builder.addProperty(name, function);
}
- emitClassBuilderWithReflectionData(cls, builder, enclosingBuilder,
- fragment);
+ emitClassBuilderWithReflectionData(
+ cls, builder, enclosingBuilder, fragment);
}
+
/**
* Emits the precompiled constructor when in CSP mode.
*/
@@ -81,10 +80,8 @@
}
/// Returns `true` if fields added.
- bool emitFields(FieldContainer container,
- ClassBuilder builder,
- { bool classIsNative: false,
- bool emitStatics: false }) {
+ bool emitFields(FieldContainer container, ClassBuilder builder,
+ {bool classIsNative: false, bool emitStatics: false}) {
Iterable<Field> fields;
if (container is Class) {
if (emitStatics) {
@@ -111,7 +108,7 @@
bool needsGetter = field.needsGetter;
bool needsSetter = field.needsUncheckedSetter;
- // Ignore needsCheckedSetter - that is handled below.
+ // Ignore needsCheckedSetter - that is handled below.
bool needsAccessor = (needsGetter || needsSetter);
// We need to output the fields for non-native classes so we can auto-
// generate the constructor. For native classes there are no
@@ -143,21 +140,21 @@
}
fieldNameParts.add(name);
if (field.needsInterceptedGetter) {
- emitter.interceptorEmitter.interceptorInvocationNames.add(
- namer.getterForElement(fieldElement));
+ emitter.interceptorEmitter.interceptorInvocationNames
+ .add(namer.getterForElement(fieldElement));
}
// TODO(16168): The setter creator only looks at the getter-name.
// Even though the setter could avoid the interceptor convention we
// currently still need to add the additional argument.
if (field.needsInterceptedGetter || field.needsInterceptedSetter) {
- emitter.interceptorEmitter.interceptorInvocationNames.add(
- namer.setterForElement(fieldElement));
+ emitter.interceptorEmitter.interceptorInvocationNames
+ .add(namer.setterForElement(fieldElement));
}
int code = field.getterFlags + (field.setterFlags << 2);
if (code == 0) {
- reporter.internalError(fieldElement,
- 'Field code is 0 ($fieldElement).');
+ reporter.internalError(
+ fieldElement, 'Field code is 0 ($fieldElement).');
}
fieldNameParts.add(
js.stringPart(FIELD_CODE_CHARACTERS[code - FIRST_FIELD_CODE]));
@@ -198,16 +195,15 @@
assert(member != null);
jsAst.Expression code = method.code;
jsAst.Name setterName = method.name;
- compiler.dumpInfoTask.registerElementAst(member,
- builder.addProperty(setterName, code));
- generateReflectionDataForFieldGetterOrSetter(
- member, setterName, builder, isGetter: false);
+ compiler.dumpInfoTask
+ .registerElementAst(member, builder.addProperty(setterName, code));
+ generateReflectionDataForFieldGetterOrSetter(member, setterName, builder,
+ isGetter: false);
}
}
/// Emits getters/setters for fields if compiling in CSP mode.
void emitClassGettersSettersForCSP(Class cls, ClassBuilder builder) {
-
if (!compiler.options.useContentSecurityPolicy || cls.onlyForRti) return;
for (Field field in cls.fields) {
@@ -235,8 +231,7 @@
*
* Invariant: [classElement] must be a declaration element.
*/
- void emitInstanceMembers(Class cls,
- ClassBuilder builder) {
+ void emitInstanceMembers(Class cls, ClassBuilder builder) {
ClassElement classElement = cls.element;
assert(invariant(classElement, classElement.isDeclaration));
@@ -281,10 +276,8 @@
}
}
- void emitClassBuilderWithReflectionData(Class cls,
- ClassBuilder classBuilder,
- ClassBuilder enclosingBuilder,
- Fragment fragment) {
+ void emitClassBuilderWithReflectionData(Class cls, ClassBuilder classBuilder,
+ ClassBuilder enclosingBuilder, Fragment fragment) {
ClassElement classElement = cls.element;
jsAst.Name className = cls.name;
@@ -295,15 +288,15 @@
if (backend.isAccessibleByReflection(classElement)) {
List<DartType> typeVars = classElement.typeVariables;
- Iterable typeVariableProperties = emitter.typeVariableHandler
- .typeVariablesOf(classElement);
+ Iterable typeVariableProperties =
+ emitter.typeVariableHandler.typeVariablesOf(classElement);
ClassElement superclass = classElement.superclass;
bool hasSuper = superclass != null;
if ((!typeVariableProperties.isEmpty && !hasSuper) ||
(hasSuper && !equalElements(superclass.typeVariables, typeVars))) {
- classBuilder.addPropertyByName('<>',
- new jsAst.ArrayInitializer(typeVariableProperties.toList()));
+ classBuilder.addPropertyByName(
+ '<>', new jsAst.ArrayInitializer(typeVariableProperties.toList()));
}
}
@@ -312,9 +305,8 @@
new ClassBuilder.forStatics(classElement, namer);
if (emitFields(cls, staticsBuilder, emitStatics: true)) {
jsAst.ObjectInitializer initializer =
- staticsBuilder.toObjectInitializer();
- compiler.dumpInfoTask.registerElementAst(classElement,
- initializer);
+ staticsBuilder.toObjectInitializer();
+ compiler.dumpInfoTask.registerElementAst(classElement, initializer);
jsAst.Node property = initializer.properties.single;
compiler.dumpInfoTask.registerElementAst(classElement, property);
statics.add(property);
@@ -334,9 +326,9 @@
}
// TODO(ahe): This method (generateClass) should return a jsAst.Expression.
- jsAst.ObjectInitializer propertyValue =
- classBuilder.toObjectInitializer();
- compiler.dumpInfoTask.registerElementAst(classBuilder.element, propertyValue);
+ jsAst.ObjectInitializer propertyValue = classBuilder.toObjectInitializer();
+ compiler.dumpInfoTask
+ .registerElementAst(classBuilder.element, propertyValue);
enclosingBuilder.addProperty(className, propertyValue);
String reflectionName = emitter.getReflectionName(classElement, className);
@@ -353,33 +345,29 @@
types.add(task.metadataCollector.reifyType(interface));
}
// TODO(herhut): Fix use of reflection name here.
- enclosingBuilder.addPropertyByName("+$reflectionName",
- new jsAst.ArrayInitializer(types));
+ enclosingBuilder.addPropertyByName(
+ "+$reflectionName", new jsAst.ArrayInitializer(types));
}
}
}
- void recordMangledField(Element member,
- jsAst.Name accessorName,
- String memberName) {
+ void recordMangledField(
+ Element member, jsAst.Name accessorName, String memberName) {
if (!backend.shouldRetainGetter(member)) return;
String previousName;
if (member.isInstanceMember) {
- previousName = emitter.mangledFieldNames.putIfAbsent(
- namer.deriveGetterName(accessorName),
- () => memberName);
+ previousName = emitter.mangledFieldNames
+ .putIfAbsent(namer.deriveGetterName(accessorName), () => memberName);
} else {
- previousName = emitter.mangledGlobalFieldNames.putIfAbsent(
- accessorName,
- () => memberName);
+ previousName = emitter.mangledGlobalFieldNames
+ .putIfAbsent(accessorName, () => memberName);
}
assert(invariant(member, previousName == memberName,
- message: '$previousName != ${memberName}'));
+ message: '$previousName != ${memberName}'));
}
void emitGetterForCSP(Element member, jsAst.Name fieldName,
- jsAst.Name accessorName,
- ClassBuilder builder) {
+ jsAst.Name accessorName, ClassBuilder builder) {
jsAst.Expression function =
_stubGenerator.generateGetter(member, fieldName);
@@ -388,18 +376,18 @@
jsAst.Name className = namer.className(cls);
OutputUnit outputUnit =
compiler.deferredLoadTask.outputUnitForElement(member);
- emitter.cspPrecompiledFunctionFor(outputUnit).add(
- js('#.prototype.# = #', [className, getterName, function]));
+ emitter
+ .cspPrecompiledFunctionFor(outputUnit)
+ .add(js('#.prototype.# = #', [className, getterName, function]));
if (backend.isAccessibleByReflection(member)) {
- emitter.cspPrecompiledFunctionFor(outputUnit).add(
- js('#.prototype.#.${namer.reflectableField} = 1',
- [className, getterName]));
+ emitter.cspPrecompiledFunctionFor(outputUnit).add(js(
+ '#.prototype.#.${namer.reflectableField} = 1',
+ [className, getterName]));
}
}
void emitSetterForCSP(Element member, jsAst.Name fieldName,
- jsAst.Name accessorName,
- ClassBuilder builder) {
+ jsAst.Name accessorName, ClassBuilder builder) {
jsAst.Expression function =
_stubGenerator.generateSetter(member, fieldName);
@@ -408,22 +396,21 @@
jsAst.Name className = namer.className(cls);
OutputUnit outputUnit =
compiler.deferredLoadTask.outputUnitForElement(member);
- emitter.cspPrecompiledFunctionFor(outputUnit).add(
- js('#.prototype.# = #', [className, setterName, function]));
+ emitter
+ .cspPrecompiledFunctionFor(outputUnit)
+ .add(js('#.prototype.# = #', [className, setterName, function]));
if (backend.isAccessibleByReflection(member)) {
- emitter.cspPrecompiledFunctionFor(outputUnit).add(
- js('#.prototype.#.${namer.reflectableField} = 1',
- [className, setterName]));
+ emitter.cspPrecompiledFunctionFor(outputUnit).add(js(
+ '#.prototype.#.${namer.reflectableField} = 1',
+ [className, setterName]));
}
}
- void generateReflectionDataForFieldGetterOrSetter(Element member,
- jsAst.Name name,
- ClassBuilder builder,
- {bool isGetter}) {
+ void generateReflectionDataForFieldGetterOrSetter(
+ Element member, jsAst.Name name, ClassBuilder builder,
+ {bool isGetter}) {
Selector selector = isGetter
- ? new Selector.getter(
- new Name(member.name, member.library))
+ ? new Selector.getter(new Name(member.name, member.library))
: new Selector.setter(
new Name(member.name, member.library, isSetter: true));
String reflectionName = emitter.getReflectionName(selector, name);
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart
index ebd7d1a..d0c0d93 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/container_builder.dart
@@ -9,7 +9,6 @@
/// Initially, it is just a placeholder for code that is moved from
/// [CodeEmitterTask].
class ContainerBuilder extends CodeEmitterHelper {
-
void addMemberMethod(DartMethod method, ClassBuilder builder) {
MethodElement member = method.element;
jsAst.Name name = method.name;
@@ -31,8 +30,8 @@
emitter.interceptorEmitter.recordMangledNameOfMemberMethod(member, name);
if (!needStructuredInfo) {
- compiler.dumpInfoTask.registerElementAst(member,
- builder.addProperty(name, code));
+ compiler.dumpInfoTask
+ .registerElementAst(member, builder.addProperty(name, code));
for (ParameterStubMethod stub in method.parameterStubs) {
assert(stub.callName == null);
@@ -87,9 +86,9 @@
if (onlyNeedsSuperAlias) {
jsAst.ArrayInitializer arrayInit =
- new jsAst.ArrayInitializer(expressions);
- compiler.dumpInfoTask.registerElementAst(member,
- builder.addProperty(name, arrayInit));
+ new jsAst.ArrayInitializer(expressions);
+ compiler.dumpInfoTask
+ .registerElementAst(member, builder.addProperty(name, arrayInit));
return;
}
@@ -126,13 +125,14 @@
}
expressions
- ..addAll(tearOffInfo)
- ..add((tearOffName == null || member.isAccessor)
- ? js("null") : js.quoteName(tearOffName))
- ..add(js.number(requiredParameterCount))
- ..add(js.number(optionalParameterCount))
- ..add(memberTypeExpression == null ? js("null") : memberTypeExpression)
- ..addAll(task.metadataCollector.reifyDefaultArguments(member));
+ ..addAll(tearOffInfo)
+ ..add((tearOffName == null || member.isAccessor)
+ ? js("null")
+ : js.quoteName(tearOffName))
+ ..add(js.number(requiredParameterCount))
+ ..add(js.number(optionalParameterCount))
+ ..add(memberTypeExpression == null ? js("null") : memberTypeExpression)
+ ..addAll(task.metadataCollector.reifyDefaultArguments(member));
if (canBeReflected || canBeApplied) {
parameters.forEachParameter((Element parameter) {
@@ -155,24 +155,22 @@
// TODO(herhut): This registers name as a mangled name. Do we need this
// given that we use a different name below?
emitter.getReflectionName(member, name);
- reflectionName =
- new jsAst.LiteralString(
- '"new ${Elements.reconstructConstructorName(member)}"');
+ reflectionName = new jsAst.LiteralString(
+ '"new ${Elements.reconstructConstructorName(member)}"');
} else {
- reflectionName =
- js.string(namer.privateName(member.memberName));
+ reflectionName = js.string(namer.privateName(member.memberName));
}
expressions
- ..add(reflectionName)
- ..addAll(task.metadataCollector.computeMetadata(member));
+ ..add(reflectionName)
+ ..addAll(task.metadataCollector.computeMetadata(member));
} else if (isClosure && canBeApplied) {
expressions.add(js.string(namer.privateName(member.memberName)));
}
jsAst.ArrayInitializer arrayInit =
- new jsAst.ArrayInitializer(expressions.toList());
- compiler.dumpInfoTask.registerElementAst(member,
- builder.addProperty(name, arrayInit));
+ new jsAst.ArrayInitializer(expressions.toList());
+ compiler.dumpInfoTask
+ .registerElementAst(member, builder.addProperty(name, arrayInit));
}
void addMemberField(Field field, ClassBuilder builder) {
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart
index 0bc38d3..ac14c66 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/declarations.dart
@@ -10,8 +10,8 @@
/**
* Call-back for adding property with [name] and [value].
*/
-typedef jsAst.Property AddPropertyFunction(jsAst.Name name,
- jsAst.Expression value);
+typedef jsAst.Property AddPropertyFunction(
+ jsAst.Name name, jsAst.Expression value);
// Compact field specifications. The format of the field specification is
// <accessorName>:<fieldName><suffix> where the suffix and accessor name
@@ -29,9 +29,9 @@
const FIELD_CODE_CHARACTERS = r"<=>?@{|}~%&'()*";
const NO_FIELD_CODE = 0;
const FIRST_FIELD_CODE = 1;
-const RANGE1_FIRST = 0x3c; // <=>?@ encodes 1..5
+const RANGE1_FIRST = 0x3c; // <=>?@ encodes 1..5
const RANGE1_LAST = 0x40;
-const RANGE2_FIRST = 0x7b; // {|}~ encodes 6..9
+const RANGE2_FIRST = 0x7b; // {|}~ encodes 6..9
const RANGE2_LAST = 0x7e;
-const RANGE3_FIRST = 0x25; // %&'()*+ encodes 10..16
+const RANGE3_FIRST = 0x25; // %&'()*+ encodes 10..16
const RANGE3_LAST = 0x2b;
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
index 7c9b6d8..cb4dc4f 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/emitter.dart
@@ -8,9 +8,8 @@
import 'dart:collection' show HashMap;
import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
-import 'package:js_runtime/shared/embedded_names.dart' show
- JsBuiltin,
- JsGetName;
+import 'package:js_runtime/shared/embedded_names.dart'
+ show JsBuiltin, JsGetName;
import '../headers.dart';
import '../js_emitter.dart' hide Emitter;
@@ -20,76 +19,60 @@
import '../constant_ordering.dart' show deepCompareConstants;
import '../../common.dart';
-import '../../common/names.dart' show
- Names;
-import '../../compiler.dart' show
- Compiler;
+import '../../common/names.dart' show Names;
+import '../../compiler.dart' show Compiler;
import '../../constants/values.dart';
-import '../../core_types.dart' show
- CoreClasses;
-import '../../dart_types.dart' show
- DartType;
+import '../../core_types.dart' show CoreClasses;
+import '../../dart_types.dart' show DartType;
import '../../deferred_load.dart' show OutputUnit;
-import '../../elements/elements.dart' show
- ClassElement,
- ConstructorBodyElement,
- Element,
- Elements,
- ElementKind,
- FieldElement,
- FunctionElement,
- FunctionSignature,
- LibraryElement,
- MetadataAnnotation,
- MethodElement,
- MemberElement,
- Name,
- ParameterElement,
- TypedefElement,
- TypeVariableElement,
- VariableElement;
+import '../../elements/elements.dart'
+ show
+ ClassElement,
+ ConstructorBodyElement,
+ Element,
+ Elements,
+ ElementKind,
+ FieldElement,
+ FunctionElement,
+ FunctionSignature,
+ LibraryElement,
+ MetadataAnnotation,
+ MethodElement,
+ MemberElement,
+ Name,
+ ParameterElement,
+ TypedefElement,
+ TypeVariableElement,
+ VariableElement;
import '../../hash/sha1.dart' show Hasher;
import '../../io/code_output.dart';
-import '../../io/line_column_provider.dart' show
- LineColumnCollector,
- LineColumnProvider;
-import '../../io/source_map_builder.dart' show
- SourceMapBuilder;
+import '../../io/line_column_provider.dart'
+ show LineColumnCollector, LineColumnProvider;
+import '../../io/source_map_builder.dart' show SourceMapBuilder;
import '../../js/js.dart' as jsAst;
import '../../js/js.dart' show js;
-import '../../js_backend/backend_helpers.dart' show
- BackendHelpers;
-import '../../js_backend/js_backend.dart' show
- CheckedModeHelper,
- CompoundName,
- ConstantEmitter,
- CustomElementsAnalysis,
- GetterName,
- JavaScriptBackend,
- JavaScriptConstantCompiler,
- Namer,
- RuntimeTypes,
- SetterName,
- Substitution,
- TypeCheck,
- TypeChecks,
- TypeVariableHandler;
-import '../../universe/call_structure.dart' show
- CallStructure;
-import '../../universe/selector.dart' show
- Selector;
-import '../../util/characters.dart' show
- $$,
- $A,
- $HASH,
- $PERIOD,
- $Z,
- $a,
- $z;
-import '../../util/uri_extras.dart' show
- relativize;
-import '../../util/util.dart' show
- equalElements;
+import '../../js_backend/backend_helpers.dart' show BackendHelpers;
+import '../../js_backend/js_backend.dart'
+ show
+ CheckedModeHelper,
+ CompoundName,
+ ConstantEmitter,
+ CustomElementsAnalysis,
+ GetterName,
+ JavaScriptBackend,
+ JavaScriptConstantCompiler,
+ Namer,
+ RuntimeTypes,
+ SetterName,
+ Substitution,
+ TypeCheck,
+ TypeChecks,
+ TypeVariableHandler;
+import '../../universe/call_structure.dart' show CallStructure;
+import '../../universe/selector.dart' show Selector;
+import '../../util/characters.dart' show $$, $A, $HASH, $PERIOD, $Z, $a, $z;
+import '../../util/uri_extras.dart' show relativize;
+import '../../util/util.dart' show equalElements;
part 'class_builder.dart';
part 'class_emitter.dart';
@@ -101,7 +84,6 @@
part 'nsm_emitter.dart';
part 'setup_program_builder.dart';
-
class Emitter implements js_emitter.Emitter {
final Compiler compiler;
final CodeEmitterTask task;
@@ -202,15 +184,13 @@
List<jsAst.Node> cspPrecompiledFunctionFor(OutputUnit outputUnit) {
return _cspPrecompiledFunctions.putIfAbsent(
- outputUnit,
- () => new List<jsAst.Node>());
+ outputUnit, () => new List<jsAst.Node>());
}
List<jsAst.Expression> cspPrecompiledConstructorNamesFor(
OutputUnit outputUnit) {
return _cspPrecompiledConstructorNames.putIfAbsent(
- outputUnit,
- () => new List<jsAst.Expression>());
+ outputUnit, () => new List<jsAst.Expression>());
}
/// Erases the precompiled information for csp mode for all output units.
@@ -225,9 +205,9 @@
@override
bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) {
- if (constant.isFunction) return true; // Already emitted.
- if (constant.isPrimitive) return true; // Inlined.
- if (constant.isDummy) return true; // Inlined.
+ if (constant.isFunction) return true; // Already emitted.
+ if (constant.isPrimitive) return true; // Inlined.
+ if (constant.isDummy) return true; // Inlined.
// The name is null when the constant is already a JS constant.
// TODO(floitsch): every constant should be registered, so that we can
// share the ones that take up too much space (like some strings).
@@ -270,8 +250,8 @@
if (isConstantInlinedOrAlreadyEmitted(value)) {
return constantEmitter.generate(value);
}
- return js('#.#', [namer.globalObjectForConstant(value),
- namer.constantName(value)]);
+ return js('#.#',
+ [namer.globalObjectForConstant(value), namer.constantName(value)]);
}
jsAst.Expression constantInitializerExpression(ConstantValue value) {
@@ -280,18 +260,17 @@
String get name => 'CodeEmitter';
- String get finishIsolateConstructorName
- => '${namer.isolateName}.\$finishIsolateConstructor';
- String get isolatePropertiesName
- => '${namer.isolateName}.${namer.isolatePropertiesName}';
- String get lazyInitializerProperty
- => r'$lazy';
- String get lazyInitializerName
- => '${namer.isolateName}.${lazyInitializerProperty}';
+ String get finishIsolateConstructorName =>
+ '${namer.isolateName}.\$finishIsolateConstructor';
+ String get isolatePropertiesName =>
+ '${namer.isolateName}.${namer.isolatePropertiesName}';
+ String get lazyInitializerProperty => r'$lazy';
+ String get lazyInitializerName =>
+ '${namer.isolateName}.${lazyInitializerProperty}';
String get initName => 'init';
- jsAst.Name get makeConstListProperty
- => namer.internalGlobal('makeConstantList');
+ jsAst.Name get makeConstListProperty =>
+ namer.internalGlobal('makeConstantList');
/// The name of the property that contains all field names.
///
@@ -321,22 +300,21 @@
jsAst.PropertyAccess globalPropertyAccess(Element element) {
jsAst.Name name = namer.globalPropertyName(element);
jsAst.PropertyAccess pa = new jsAst.PropertyAccess(
- new jsAst.VariableUse(namer.globalObjectFor(element)),
- name);
+ new jsAst.VariableUse(namer.globalObjectFor(element)), name);
return pa;
}
@override
jsAst.Expression isolateLazyInitializerAccess(FieldElement element) {
- return jsAst.js('#.#', [namer.globalObjectFor(element),
- namer.lazyInitializerName(element)]);
- }
+ return jsAst.js('#.#',
+ [namer.globalObjectFor(element), namer.lazyInitializerName(element)]);
+ }
@override
jsAst.Expression isolateStaticClosureAccess(FunctionElement element) {
- return jsAst.js('#.#()',
- [namer.globalObjectFor(element), namer.staticClosureName(element)]);
- }
+ return jsAst.js('#.#()',
+ [namer.globalObjectFor(element), namer.staticClosureName(element)]);
+ }
@override
jsAst.PropertyAccess staticFieldAccess(FieldElement element) {
@@ -354,8 +332,8 @@
}
@override
- jsAst.PropertyAccess prototypeAccess(ClassElement element,
- bool hasBeenInstantiated) {
+ jsAst.PropertyAccess prototypeAccess(
+ ClassElement element, bool hasBeenInstantiated) {
return jsAst.js('#.prototype', constructorAccess(element));
}
@@ -373,8 +351,8 @@
jsAst.Template templateForBuiltin(JsBuiltin builtin) {
switch (builtin) {
case JsBuiltin.dartObjectConstructor:
- return jsAst.js.expressionTemplateYielding(
- typeAccess(coreClasses.objectClass));
+ return jsAst.js
+ .expressionTemplateYielding(typeAccess(coreClasses.objectClass));
case JsBuiltin.isCheckPropertyToJsConstructorName:
int isPrefixLength = namer.operatorIsPrefix.length;
@@ -396,8 +374,8 @@
// TODO(floitsch): move this closer to where is-check properties are
// built.
String isPrefix = namer.operatorIsPrefix;
- return jsAst.js.expressionTemplateFor(
- "('$isPrefix' + #) in #.prototype");
+ return jsAst.js
+ .expressionTemplateFor("('$isPrefix' + #) in #.prototype");
case JsBuiltin.isGivenTypeRti:
return jsAst.js.expressionTemplateFor('#.$typeNameProperty === #');
@@ -420,13 +398,13 @@
return jsAst.js.expressionTemplateFor("$functionGettersMap[#]()");
default:
- reporter.internalError(NO_LOCATION_SPANNABLE,
- "Unhandled Builtin: $builtin");
+ reporter.internalError(
+ NO_LOCATION_SPANNABLE, "Unhandled Builtin: $builtin");
return null;
}
}
- List<jsAst.Statement> buildTrivialNsmHandlers(){
+ List<jsAst.Statement> buildTrivialNsmHandlers() {
return nsmEmitter.buildTrivialNsmHandlers();
}
@@ -437,9 +415,7 @@
jsAst.Expression interceptorsByTagAccess,
jsAst.Expression leafTagsAccess) {
return NativeGenerator.buildNativeInfoHandler(infoAccess, constructorAccess,
- subclassReadGenerator,
- interceptorsByTagAccess,
- leafTagsAccess);
+ subclassReadGenerator, interceptorsByTagAccess, leafTagsAccess);
}
jsAst.ObjectInitializer generateInterceptedNamesSet() {
@@ -450,12 +426,12 @@
bool _isNativeTypeNeedingReflectionName(Element element) {
if (!element.isClass) return false;
return (element == coreClasses.intClass ||
- element == coreClasses.doubleClass ||
- element == coreClasses.numClass ||
- element == coreClasses.stringClass ||
- element == coreClasses.boolClass ||
- element == coreClasses.nullClass ||
- element == coreClasses.listClass);
+ element == coreClasses.doubleClass ||
+ element == coreClasses.numClass ||
+ element == coreClasses.stringClass ||
+ element == coreClasses.boolClass ||
+ element == coreClasses.nullClass ||
+ element == coreClasses.listClass);
}
/// Returns the "reflection name" of an [Element] or [Selector].
@@ -473,12 +449,11 @@
String name = elementOrSelector.name;
if (backend.shouldRetainName(name) ||
elementOrSelector is Element &&
- // Make sure to retain names of unnamed constructors, and
- // for common native types.
- ((name == '' &&
- backend.isAccessibleByReflection(elementOrSelector)) ||
- _isNativeTypeNeedingReflectionName(elementOrSelector))) {
-
+ // Make sure to retain names of unnamed constructors, and
+ // for common native types.
+ ((name == '' &&
+ backend.isAccessibleByReflection(elementOrSelector)) ||
+ _isNativeTypeNeedingReflectionName(elementOrSelector))) {
// TODO(ahe): Enable the next line when I can tell the difference between
// an instance method and a global. They may have the same mangled name.
// if (recordedMangledNames.contains(mangledName)) return null;
@@ -488,8 +463,7 @@
return null;
}
- String getReflectionNameInternal(elementOrSelector,
- jsAst.Name mangledName) {
+ String getReflectionNameInternal(elementOrSelector, jsAst.Name mangledName) {
String name = namer.privateName(elementOrSelector.memberName);
if (elementOrSelector.isGetter) return name;
if (elementOrSelector.isSetter) {
@@ -511,9 +485,9 @@
// with each other.
return " $name";
}
- if (elementOrSelector is Selector
- || elementOrSelector.isFunction
- || elementOrSelector.isConstructor) {
+ if (elementOrSelector is Selector ||
+ elementOrSelector.isFunction ||
+ elementOrSelector.isConstructor) {
int positionalParameterCount;
String namedArguments = '';
bool isConstructor = false;
@@ -559,8 +533,8 @@
} else if (element.isTypedef) {
return element.name;
}
- throw reporter.internalError(element,
- 'Do not know how to reflect on this $element.');
+ throw reporter.internalError(
+ element, 'Do not know how to reflect on this $element.');
}
String namedParametersAsReflectionNames(CallStructure structure) {
@@ -569,43 +543,45 @@
return ':$names';
}
- jsAst.Statement buildCspPrecompiledFunctionFor(
- OutputUnit outputUnit) {
+ jsAst.Statement buildCspPrecompiledFunctionFor(OutputUnit outputUnit) {
if (compiler.options.useContentSecurityPolicy) {
// TODO(ahe): Compute a hash code.
// TODO(sigurdm): Avoid this precompiled function. Generated
// constructor-functions and getter/setter functions can be stored in the
// library-description table. Setting properties on these can be moved to
// finishClasses.
- return js.statement(r"""
+ return js.statement(
+ r"""
#precompiled = function ($collectedClasses$) {
#norename;
var $desc;
#functions;
return #result;
};""",
- {'norename': new jsAst.Comment("// ::norenaming:: "),
- 'precompiled': generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED),
- 'functions': cspPrecompiledFunctionFor(outputUnit),
- 'result': new jsAst.ArrayInitializer(
- cspPrecompiledConstructorNamesFor(outputUnit))});
+ {
+ 'norename': new jsAst.Comment("// ::norenaming:: "),
+ 'precompiled':
+ generateEmbeddedGlobalAccess(embeddedNames.PRECOMPILED),
+ 'functions': cspPrecompiledFunctionFor(outputUnit),
+ 'result': new jsAst.ArrayInitializer(
+ cspPrecompiledConstructorNamesFor(outputUnit))
+ });
} else {
return js.comment("Constructors are generated at runtime.");
}
}
- void assembleClass(Class cls, ClassBuilder enclosingBuilder,
- Fragment fragment) {
+ void assembleClass(
+ Class cls, ClassBuilder enclosingBuilder, Fragment fragment) {
ClassElement classElement = cls.element;
reporter.withCurrentElement(classElement, () {
if (compiler.options.hasIncrementalSupport) {
ClassBuilder cachedBuilder =
cachedClassBuilders.putIfAbsent(classElement, () {
- ClassBuilder builder =
- new ClassBuilder.forClass(classElement, namer);
- classEmitter.emitClass(cls, builder, fragment);
- return builder;
- });
+ ClassBuilder builder = new ClassBuilder.forClass(classElement, namer);
+ classEmitter.emitClass(cls, builder, fragment);
+ return builder;
+ });
invariant(classElement, cachedBuilder.fields.isEmpty);
invariant(classElement, cachedBuilder.superName == null);
invariant(classElement, cachedBuilder.functionType == null);
@@ -617,8 +593,8 @@
});
}
- void assembleStaticFunctions(Iterable<Method> staticFunctions,
- Fragment fragment) {
+ void assembleStaticFunctions(
+ Iterable<Method> staticFunctions, Fragment fragment) {
if (staticFunctions == null) return;
for (Method method in staticFunctions) {
@@ -628,17 +604,18 @@
if (element == null) continue;
ClassBuilder builder = new ClassBuilder.forStatics(element, namer);
containerBuilder.addMemberMethod(method, builder);
- getElementDescriptor(element, fragment).properties
+ getElementDescriptor(element, fragment)
+ .properties
.addAll(builder.properties);
}
}
jsAst.Statement buildStaticNonFinalFieldInitializations(
OutputUnit outputUnit) {
- jsAst.Statement buildInitialization(Element element,
- jsAst.Expression initialValue) {
+ jsAst.Statement buildInitialization(
+ Element element, jsAst.Expression initialValue) {
return js.statement('${namer.staticStateHolder}.# = #',
- [namer.globalPropertyName(element), initialValue]);
+ [namer.globalPropertyName(element), initialValue]);
}
bool inMainUnit = (outputUnit == compiler.deferredLoadTask.mainOutputUnit);
@@ -662,7 +639,7 @@
// variables, so that `isolateProperties` stays a fast object.
outputStaticNonFinalFieldLists.forEach(
(OutputUnit fieldsOutputUnit, Iterable<VariableElement> fields) {
- if (fieldsOutputUnit == outputUnit) return; // Skip the main unit.
+ if (fieldsOutputUnit == outputUnit) return; // Skip the main unit.
for (Element element in fields) {
reporter.withCurrentElement(element, () {
parts.add(buildInitialization(element, jsAst.number(0)));
@@ -675,12 +652,14 @@
}
jsAst.Statement buildLazilyInitializedStaticFields(
- Iterable<StaticField> lazyFields, {bool isMainFragment: true}) {
+ Iterable<StaticField> lazyFields,
+ {bool isMainFragment: true}) {
if (lazyFields.isNotEmpty) {
needsLazyInitializer = true;
List<jsAst.Expression> laziesInfo =
buildLaziesInfo(lazyFields, isMainFragment);
- return js.statement('''
+ return js.statement(
+ '''
(function(lazies) {
for (var i = 0; i < lazies.length; ) {
var fieldName = lazies[i++];
@@ -711,11 +690,14 @@
}
}
})(#laziesInfo)
- ''', {'notMinified': !compiler.options.enableMinification,
+ ''',
+ {
+ 'notMinified': !compiler.options.enableMinification,
'laziesInfo': new jsAst.ArrayInitializer(laziesInfo),
'lazy': js(lazyInitializerName),
'isMainFragment': isMainFragment,
- 'isDeferredFragment': !isMainFragment});
+ 'isDeferredFragment': !isMainFragment
+ });
} else {
return js.comment("No lazy statics.");
}
@@ -739,8 +721,8 @@
}
// TODO(sra): Remove this unused function.
- jsAst.Expression buildLazilyInitializedStaticField(
- VariableElement element, {String isolateProperties}) {
+ jsAst.Expression buildLazilyInitializedStaticField(VariableElement element,
+ {String isolateProperties}) {
jsAst.Expression code = backend.generatedCode[element];
// The code is null if we ended up not needing the lazily
// initialized field after all because of constant folding
@@ -754,28 +736,31 @@
if (isolateProperties != null) {
// This is currently only used in incremental compilation to patch
// in new lazy values.
- return js('#(#,#,#,#,#)',
- [js(lazyInitializerName),
- js.quoteName(namer.globalPropertyName(element)),
- js.quoteName(namer.lazyInitializerName(element)),
- code,
- js.string(element.name),
- isolateProperties]);
+ return js('#(#,#,#,#,#)', [
+ js(lazyInitializerName),
+ js.quoteName(namer.globalPropertyName(element)),
+ js.quoteName(namer.lazyInitializerName(element)),
+ code,
+ js.string(element.name),
+ isolateProperties
+ ]);
}
if (compiler.options.enableMinification) {
- return js('#(#,#,#)',
- [js(lazyInitializerName),
- js.quoteName(namer.globalPropertyName(element)),
- js.quoteName(namer.lazyInitializerName(element)),
- code]);
+ return js('#(#,#,#)', [
+ js(lazyInitializerName),
+ js.quoteName(namer.globalPropertyName(element)),
+ js.quoteName(namer.lazyInitializerName(element)),
+ code
+ ]);
} else {
- return js('#(#,#,#,#)',
- [js(lazyInitializerName),
- js.quoteName(namer.globalPropertyName(element)),
- js.quoteName(namer.lazyInitializerName(element)),
- code,
- js.string(element.name)]);
+ return js('#(#,#,#,#)', [
+ js(lazyInitializerName),
+ js.quoteName(namer.globalPropertyName(element)),
+ js.quoteName(namer.lazyInitializerName(element)),
+ code,
+ js.string(element.name)
+ ]);
}
}
@@ -790,17 +775,17 @@
jsAst.Expression typesAccess =
generateEmbeddedGlobalAccess(embeddedNames.TYPES);
- parts..add(js.statement('# = #;', [metadataAccess, program.metadata]))
- ..add(js.statement('# = #;', [typesAccess, types]));
+ parts
+ ..add(js.statement('# = #;', [metadataAccess, program.metadata]))
+ ..add(js.statement('# = #;', [typesAccess, types]));
} else if (types != null) {
- parts.add(js.statement('var ${namer.deferredTypesName} = #;',
- types));
+ parts.add(js.statement('var ${namer.deferredTypesName} = #;', types));
}
return new jsAst.Block(parts);
}
jsAst.Statement buildCompileTimeConstants(List<Constant> constants,
- {bool isMainFragment}) {
+ {bool isMainFragment}) {
assert(isMainFragment != null);
if (constants.isEmpty) return js.comment("No constants in program.");
@@ -822,9 +807,11 @@
jsAst.Statement buildConstantInitializer(ConstantValue constant) {
jsAst.Name name = namer.constantName(constant);
- jsAst.Statement initializer = js.statement('#.# = #',
- [namer.globalObjectForConstant(constant), name,
- constantInitializerExpression(constant)]);
+ jsAst.Statement initializer = js.statement('#.# = #', [
+ namer.globalObjectForConstant(constant),
+ name,
+ constantInitializerExpression(constant)
+ ]);
compiler.dumpInfoTask.registerConstantAst(constant, initializer);
return initializer;
}
@@ -836,7 +823,8 @@
jsAst.Statement buildMakeConstantList(bool outputContainsConstantList) {
if (outputContainsConstantList) {
- return js.statement(r'''
+ return js.statement(
+ r'''
// Functions are stored in the hidden class and not as properties in
// the object. We never actually look at the value, but only want
// to know if the property exists.
@@ -853,13 +841,12 @@
jsAst.Statement buildFunctionThatReturnsNull() {
return js.statement('#.# = function() {}',
- [namer.isolateName,
- backend.rtiEncoder.getFunctionThatReturnsNullName]);
+ [namer.isolateName, backend.rtiEncoder.getFunctionThatReturnsNullName]);
}
jsAst.Expression generateFunctionThatReturnsNull() {
- return js("#.#", [namer.isolateName,
- backend.rtiEncoder.getFunctionThatReturnsNullName]);
+ return js("#.#",
+ [namer.isolateName, backend.rtiEncoder.getFunctionThatReturnsNullName]);
}
buildMain(jsAst.Statement invokeMain) {
@@ -868,23 +855,25 @@
List<jsAst.Statement> parts = <jsAst.Statement>[];
if (NativeGenerator.needsIsolateAffinityTagInitialization(backend)) {
- parts.add(
- NativeGenerator.generateIsolateAffinityTagInitialization(
- backend,
- generateEmbeddedGlobalAccess,
- js("""
+ parts.add(NativeGenerator.generateIsolateAffinityTagInitialization(
+ backend,
+ generateEmbeddedGlobalAccess,
+ js(
+ """
// On V8, the 'intern' function converts a string to a symbol, which
// makes property access much faster.
function (s) {
var o = {};
o[s] = 1;
return Object.keys(convertToFastObject(o))[0];
- }""", [])));
+ }""",
+ [])));
}
- parts..add(js.comment('BEGIN invoke [main].'))
- ..add(invokeMain)
- ..add(js.comment('END invoke [main].'));
+ parts
+ ..add(js.comment('BEGIN invoke [main].'))
+ ..add(invokeMain)
+ ..add(js.comment('END invoke [main].'));
return new jsAst.Block(parts);
}
@@ -905,7 +894,8 @@
jsAst.Expression laziesAccess =
generateEmbeddedGlobalAccess(embeddedNames.LAZIES);
- return js.statement('''
+ return js.statement(
+ '''
function init() {
$isolatePropertiesName = Object.create(null);
#allClasses = map();
@@ -1015,20 +1005,24 @@
return Isolate;
}
- }''', {'allClasses': allClassesAccess,
- 'getTypeFromName': getTypeFromNameAccess,
- 'interceptorsByTag': interceptorsByTagAccess,
- 'leafTags': leafTagsAccess,
- 'finishedClasses': finishedClassesAccess,
- 'needsLazyInitializer': needsLazyInitializer,
- 'lazies': laziesAccess, 'cyclicThrow': cyclicThrow,
- 'isolatePropertiesName': namer.isolatePropertiesName,
- 'outputContainsConstantList': outputContainsConstantList,
- 'makeConstListProperty': makeConstListProperty,
- 'functionThatReturnsNullProperty':
- backend.rtiEncoder.getFunctionThatReturnsNullName,
- 'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
- 'lazyInitializerProperty': lazyInitializerProperty,});
+ }''',
+ {
+ 'allClasses': allClassesAccess,
+ 'getTypeFromName': getTypeFromNameAccess,
+ 'interceptorsByTag': interceptorsByTagAccess,
+ 'leafTags': leafTagsAccess,
+ 'finishedClasses': finishedClassesAccess,
+ 'needsLazyInitializer': needsLazyInitializer,
+ 'lazies': laziesAccess,
+ 'cyclicThrow': cyclicThrow,
+ 'isolatePropertiesName': namer.isolatePropertiesName,
+ 'outputContainsConstantList': outputContainsConstantList,
+ 'makeConstListProperty': makeConstListProperty,
+ 'functionThatReturnsNullProperty':
+ backend.rtiEncoder.getFunctionThatReturnsNullName,
+ 'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
+ 'lazyInitializerProperty': lazyInitializerProperty,
+ });
}
jsAst.Statement buildConvertToFastObjectFunction() {
@@ -1047,7 +1041,8 @@
}'''));
}
- return js.statement(r'''
+ return js.statement(
+ r'''
function convertToFastObject(properties) {
// Create an instance that uses 'properties' as prototype. This should
// make 'properties' a fast object.
@@ -1056,7 +1051,8 @@
new MyClass();
#;
return properties;
- }''', [debugCode]);
+ }''',
+ [debugCode]);
}
jsAst.Statement buildConvertToSlowObjectFunction() {
@@ -1092,14 +1088,14 @@
return supportsDirectProtoAccess;
}
- jsAst.Expression generateLibraryDescriptor(LibraryElement library,
- Fragment fragment) {
+ jsAst.Expression generateLibraryDescriptor(
+ LibraryElement library, Fragment fragment) {
var uri = "";
if (!compiler.options.enableMinification || backend.mustPreserveUris) {
uri = library.canonicalUri;
if (uri.scheme == 'file' && compiler.options.outputUri != null) {
- uri = relativize(
- compiler.options.outputUri, library.canonicalUri, false);
+ uri =
+ relativize(compiler.options.outputUri, library.canonicalUri, false);
}
}
@@ -1125,11 +1121,12 @@
compiler.dumpInfoTask.registerElementAst(library, initializer);
List<jsAst.Expression> parts = <jsAst.Expression>[];
- parts..add(js.string(libraryName))
- ..add(js.string(uri.toString()))
- ..add(metadata == null ? new jsAst.ArrayHole() : metadata)
- ..add(js('#', namer.globalObjectFor(library)))
- ..add(initializer);
+ parts
+ ..add(js.string(libraryName))
+ ..add(js.string(uri.toString()))
+ ..add(metadata == null ? new jsAst.ArrayHole() : metadata)
+ ..add(js('#', namer.globalObjectFor(library)))
+ ..add(initializer);
if (library == compiler.mainApp) {
parts.add(js.number(1));
}
@@ -1137,12 +1134,13 @@
return new jsAst.ArrayInitializer(parts);
}
- void assemblePrecompiledConstructor(OutputUnit outputUnit,
- jsAst.Name constructorName,
- jsAst.Expression constructorAst,
- List<jsAst.Name> fields) {
- cspPrecompiledFunctionFor(outputUnit).add(
- new jsAst.FunctionDeclaration(constructorName, constructorAst));
+ void assemblePrecompiledConstructor(
+ OutputUnit outputUnit,
+ jsAst.Name constructorName,
+ jsAst.Expression constructorAst,
+ List<jsAst.Name> fields) {
+ cspPrecompiledFunctionFor(outputUnit)
+ .add(new jsAst.FunctionDeclaration(constructorName, constructorAst));
String fieldNamesProperty = FIELD_NAMES_PROPERTY_NAME;
bool hasIsolateSupport = compiler.hasIsolateSupport;
@@ -1154,7 +1152,8 @@
fieldNamesArray = new jsAst.LiteralNull();
}
- cspPrecompiledFunctionFor(outputUnit).add(js.statement(r'''
+ cspPrecompiledFunctionFor(outputUnit).add(js.statement(
+ r'''
{
#constructorName.#typeNameProperty = #constructorNameString;
// IE does not have a name property.
@@ -1167,11 +1166,13 @@
#constructorName.$fieldNamesProperty = #fieldNamesArray;
}
}''',
- {"constructorName": constructorName,
- "typeNameProperty": typeNameProperty,
- "constructorNameString": js.quoteName(constructorName),
- "hasIsolateSupport": hasIsolateSupport,
- "fieldNamesArray": fieldNamesArray}));
+ {
+ "constructorName": constructorName,
+ "typeNameProperty": typeNameProperty,
+ "constructorNameString": js.quoteName(constructorName),
+ "hasIsolateSupport": hasIsolateSupport,
+ "fieldNamesArray": fieldNamesArray
+ }));
cspPrecompiledConstructorNamesFor(outputUnit).add(js('#', constructorName));
}
@@ -1192,10 +1193,10 @@
jsAst.Expression typeIndex =
task.metadataCollector.reifyType(type, ignoreTypeVariables: true);
ClassBuilder builder = new ClassBuilder.forStatics(typedef, namer);
- builder.addPropertyByName(embeddedNames.TYPEDEF_TYPE_PROPERTY_NAME,
- typeIndex);
- builder.addPropertyByName(embeddedNames.TYPEDEF_PREDICATE_PROPERTY_NAME,
- js.boolean(true));
+ builder.addPropertyByName(
+ embeddedNames.TYPEDEF_TYPE_PROPERTY_NAME, typeIndex);
+ builder.addPropertyByName(
+ embeddedNames.TYPEDEF_PREDICATE_PROPERTY_NAME, js.boolean(true));
// We can be pretty sure that the objectClass is initialized, since
// typedefs are only emitted with reflection, which requires lots of
@@ -1206,16 +1207,14 @@
jsAst.Name mangledName = namer.globalPropertyName(typedef);
String reflectionName = getReflectionName(typedef, mangledName);
getElementDescriptor(library, mainFragment)
- ..addProperty(mangledName, declaration)
- ..addPropertyByName("+$reflectionName", js.string(''));
+ ..addProperty(mangledName, declaration)
+ ..addPropertyByName("+$reflectionName", js.string(''));
// Also emit a trivial constructor for CSP mode.
jsAst.Name constructorName = mangledName;
jsAst.Expression constructorAst = js('function() {}');
List<jsAst.Name> fieldNames = [];
- assemblePrecompiledConstructor(mainOutputUnit,
- constructorName,
- constructorAst,
- fieldNames);
+ assemblePrecompiledConstructor(
+ mainOutputUnit, constructorName, constructorAst, fieldNames);
}
}
@@ -1234,13 +1233,12 @@
if (isProgramSplit) {
String template =
"var #globalObject = #globalsHolder.#globalObject = map();";
- parts.add(js.statement(template, {"globalObject": globalObject,
- "globalsHolder": globalsHolder}));
+ parts.add(js.statement(template,
+ {"globalObject": globalObject, "globalsHolder": globalsHolder}));
} else {
- parts.add(js.statement("var #globalObject = map();",
- {"globalObject": globalObject}));
+ parts.add(js.statement(
+ "var #globalObject = map();", {"globalObject": globalObject}));
}
-
}
return new jsAst.Block(parts);
@@ -1292,13 +1290,15 @@
'''));
for (String object in Namer.userGlobalObjects) {
- parts.add(js.statement('''
+ parts.add(js.statement(
+ '''
if (typeof print === "function") {
print("Size of " + #objectString + ": "
+ String(Object.getOwnPropertyNames(#object).length)
+ ", fast properties " + HasFastProperties(#object));
}
- ''', {"object": object, "objectString": js.string(object)}));
+ ''',
+ {"object": object, "objectString": js.string(object)}));
}
}
@@ -1323,8 +1323,7 @@
}
if (!mangledGlobalFieldNames.isEmpty) {
- List<jsAst.Name> keys = mangledGlobalFieldNames.keys.toList()
- ..sort();
+ List<jsAst.Name> keys = mangledGlobalFieldNames.keys.toList()..sort();
List<jsAst.Property> properties = <jsAst.Property>[];
for (jsAst.Name key in keys) {
jsAst.Literal value = js.string(mangledGlobalFieldNames[key]);
@@ -1345,14 +1344,13 @@
pendingStatics =
Elements.sortedByPosition(elements.where((e) => !e.isLibrary));
- pendingStatics.forEach((element) =>
- reporter.reportInfo(
- element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
+ pendingStatics.forEach((element) => reporter.reportInfo(
+ element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
}
if (pendingStatics != null && !pendingStatics.isEmpty) {
- reporter.internalError(pendingStatics.first,
- 'Pending statics (see above).');
+ reporter.internalError(
+ pendingStatics.first, 'Pending statics (see above).');
}
}
@@ -1384,9 +1382,10 @@
/// variable. The deferred hunks will add their initialization to this.
/// The semicolon is important in minified mode, without it the
/// following parenthesis looks like a call to the object literal.
- return js.statement('self.#deferredInitializers = '
- 'self.#deferredInitializers || Object.create(null);',
- {'deferredInitializers': deferredInitializers});
+ return js.statement(
+ 'self.#deferredInitializers = '
+ 'self.#deferredInitializers || Object.create(null);',
+ {'deferredInitializers': deferredInitializers});
}
jsAst.Program buildOutputAstForMain(Program program,
@@ -1397,8 +1396,7 @@
List<jsAst.Statement> statements = <jsAst.Statement>[];
- statements..add(buildGeneratedBy())
- ..add(js.comment(HOOKS_API_USAGE));
+ statements..add(buildGeneratedBy())..add(js.comment(HOOKS_API_USAGE));
if (isProgramSplit) {
statements.add(buildDeferredHeader());
@@ -1420,9 +1418,8 @@
}
if (descriptors.isNotEmpty) {
- List<Element> remainingLibraries = descriptors.keys
- .where((Element e) => e is LibraryElement)
- .toList();
+ List<Element> remainingLibraries =
+ descriptors.keys.where((Element e) => e is LibraryElement).toList();
// The remaining descriptors are only accessible through reflection.
// The program builder does not collect libraries that only
@@ -1440,7 +1437,8 @@
// Using a named function here produces easier to read stack traces in
// Chrome/V8.
- statements.add(js.statement("""
+ statements.add(js.statement(
+ """
(function() {
// No renaming in the top-level function to save the locals for the
// nested context where they will be used more. We have to put the
@@ -1550,47 +1548,52 @@
#main;
})();
- """, {
- "disableVariableRenaming": js.comment("/* ::norenaming:: */"),
- "hasIncrementalSupport": compiler.options.hasIncrementalSupport,
- "helper": js('this.#', [namer.incrementalHelperName]),
- "schemaChange": buildSchemaChangeFunction(),
- "addMethod": buildIncrementalAddMethod(),
- "isProgramSplit": isProgramSplit,
- "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(),
- "globalsHolder": globalsHolder,
- "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit),
- "isolateName": namer.isolateName,
- "isolatePropertiesName": js(isolatePropertiesName),
- "initName": initName,
- "functionThatReturnsNull": buildFunctionThatReturnsNull(),
- "mangledNames": buildMangledNames(),
- "setupProgram": buildSetupProgram(program, compiler, backend, namer, this),
- "setupProgramName": setupProgramName,
- "descriptors": descriptorsAst,
- "cspPrecompiledFunctions": buildCspPrecompiledFunctionFor(mainOutputUnit),
- "getInterceptorMethods": interceptorEmitter.buildGetInterceptorMethods(),
- "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(),
- "makeConstantList":
- buildMakeConstantList(program.outputContainsConstantList),
- "compileTimeConstants": buildCompileTimeConstants(mainFragment.constants,
- isMainFragment: true),
- "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes),
- "staticNonFinalInitializers": buildStaticNonFinalFieldInitializations(
- mainOutputUnit),
- "typeToInterceptorMap":
- interceptorEmitter.buildTypeToInterceptorMap(program),
- "lazyStaticFields": buildLazilyInitializedStaticFields(
- mainFragment.staticLazilyInitializedFields),
- "metadata": buildMetadata(program, mainOutputUnit),
- "convertToFastObject": buildConvertToFastObjectFunction(),
- "convertToSlowObject": buildConvertToSlowObjectFunction(),
- "convertGlobalObjectsToFastObjects":
- buildConvertGlobalObjectToFastObjects(),
- "debugFastObjects": buildDebugFastObjectCode(),
- "init": buildInitFunction(program.outputContainsConstantList),
- "main": buildMain(mainFragment.invokeMain)
- }));
+ """,
+ {
+ "disableVariableRenaming": js.comment("/* ::norenaming:: */"),
+ "hasIncrementalSupport": compiler.options.hasIncrementalSupport,
+ "helper": js('this.#', [namer.incrementalHelperName]),
+ "schemaChange": buildSchemaChangeFunction(),
+ "addMethod": buildIncrementalAddMethod(),
+ "isProgramSplit": isProgramSplit,
+ "supportsDirectProtoAccess": buildSupportsDirectProtoAccess(),
+ "globalsHolder": globalsHolder,
+ "globalObjectSetup": buildGlobalObjectSetup(isProgramSplit),
+ "isolateName": namer.isolateName,
+ "isolatePropertiesName": js(isolatePropertiesName),
+ "initName": initName,
+ "functionThatReturnsNull": buildFunctionThatReturnsNull(),
+ "mangledNames": buildMangledNames(),
+ "setupProgram":
+ buildSetupProgram(program, compiler, backend, namer, this),
+ "setupProgramName": setupProgramName,
+ "descriptors": descriptorsAst,
+ "cspPrecompiledFunctions":
+ buildCspPrecompiledFunctionFor(mainOutputUnit),
+ "getInterceptorMethods":
+ interceptorEmitter.buildGetInterceptorMethods(),
+ "oneShotInterceptors": interceptorEmitter.buildOneShotInterceptors(),
+ "makeConstantList":
+ buildMakeConstantList(program.outputContainsConstantList),
+ "compileTimeConstants": buildCompileTimeConstants(
+ mainFragment.constants,
+ isMainFragment: true),
+ "deferredBoilerPlate": buildDeferredBoilerPlate(deferredLoadHashes),
+ "staticNonFinalInitializers":
+ buildStaticNonFinalFieldInitializations(mainOutputUnit),
+ "typeToInterceptorMap":
+ interceptorEmitter.buildTypeToInterceptorMap(program),
+ "lazyStaticFields": buildLazilyInitializedStaticFields(
+ mainFragment.staticLazilyInitializedFields),
+ "metadata": buildMetadata(program, mainOutputUnit),
+ "convertToFastObject": buildConvertToFastObjectFunction(),
+ "convertToSlowObject": buildConvertToSlowObjectFunction(),
+ "convertGlobalObjectsToFastObjects":
+ buildConvertGlobalObjectToFastObjects(),
+ "debugFastObjects": buildDebugFastObjectCode(),
+ "init": buildInitFunction(program.outputContainsConstantList),
+ "main": buildMain(mainFragment.invokeMain)
+ }));
return new jsAst.Program(statements);
}
@@ -1603,14 +1606,12 @@
codeOutputListeners = <CodeOutputListener>[lineColumnCollector];
}
- CodeOutput mainOutput =
- new StreamCodeOutput(compiler.outputProvider('', 'js'),
- codeOutputListeners);
+ CodeOutput mainOutput = new StreamCodeOutput(
+ compiler.outputProvider('', 'js'), codeOutputListeners);
outputBuffers[mainOutputUnit] = mainOutput;
-
- mainOutput.addBuffer(jsAst.createCodeBuffer(
- program, compiler, monitor: compiler.dumpInfoTask));
+ mainOutput.addBuffer(jsAst.createCodeBuffer(program, compiler,
+ monitor: compiler.dumpInfoTask));
if (compiler.options.deferredMapUri != null) {
outputDeferredMap();
@@ -1774,8 +1775,8 @@
return outputs;
}
- void finalizeTokensInAst(jsAst.Program main,
- Iterable<jsAst.Program> deferredParts) {
+ void finalizeTokensInAst(
+ jsAst.Program main, Iterable<jsAst.Program> deferredParts) {
jsAst.TokenCounter counter = new jsAst.TokenCounter();
counter.countTokens(main);
deferredParts.forEach(counter.countTokens);
@@ -1794,7 +1795,7 @@
programBuilder.collector.outputStaticNonFinalFieldLists;
outputLibraryLists = programBuilder.collector.outputLibraryLists;
typedefsNeededForReflection =
- programBuilder.collector.typedefsNeededForReflection;
+ programBuilder.collector.typedefsNeededForReflection;
assembleProgram(program);
@@ -1804,11 +1805,9 @@
Map<OutputUnit, _DeferredOutputUnitHash> deferredHashTokens =
new Map<OutputUnit, _DeferredOutputUnitHash>.fromIterables(
- deferredParts.keys,
- deferredParts.keys.map((OutputUnit unit) {
- return new _DeferredOutputUnitHash(unit);
- })
- );
+ deferredParts.keys, deferredParts.keys.map((OutputUnit unit) {
+ return new _DeferredOutputUnitHash(unit);
+ }));
jsAst.Program mainOutput =
buildOutputAstForMain(program, deferredHashTokens);
@@ -1828,10 +1827,8 @@
});
emitMainOutputUnit(program.mainFragment.outputUnit, mainOutput);
- if (backend.requiresPreamble &&
- !backend.htmlLibraryIsLoaded) {
- reporter.reportHintMessage(
- NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
+ if (backend.requiresPreamble && !backend.htmlLibraryIsLoaded) {
+ reporter.reportHintMessage(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
}
// Return the total program size.
return outputBuffers.values.fold(0, (a, b) => a + b.length);
@@ -1856,8 +1853,7 @@
// For static (not top level) elements, record their code in a buffer
// specific to the class. For now, not supported for native classes and
// native elements.
- ClassElement cls =
- element.enclosingClassOrCompilationUnit.declaration;
+ ClassElement cls = element.enclosingClassOrCompilationUnit.declaration;
if (compiler.codegenWorld.directlyInstantiatedClasses.contains(cls) &&
!backend.isNative(cls) &&
compiler.deferredLoadTask.outputUnitForElement(element) ==
@@ -1871,8 +1867,8 @@
return elementDescriptors
.putIfAbsent(fragment, () => new Map<Element, ClassBuilder>())
.putIfAbsent(owner, () {
- return new ClassBuilder(owner, namer, owner.isClass);
- });
+ return new ClassBuilder(owner, namer, owner.isClass);
+ });
}
/// Emits support-code for deferred loading into [output].
@@ -1880,7 +1876,8 @@
Map<OutputUnit, _DeferredOutputUnitHash> deferredLoadHashes) {
List<jsAst.Statement> parts = <jsAst.Statement>[];
- parts.add(js.statement('''
+ parts.add(js.statement(
+ '''
{
// Function for checking if a hunk is loaded given its hash.
#isHunkLoaded = function(hunkHash) {
@@ -1898,15 +1895,18 @@
#deferredInitialized[hunkHash] = true;
};
}
- ''', {"globalsHolder": globalsHolder,
- "isHunkLoaded": generateEmbeddedGlobalAccess(
- embeddedNames.IS_HUNK_LOADED),
- "isHunkInitialized": generateEmbeddedGlobalAccess(
- embeddedNames.IS_HUNK_INITIALIZED),
- "initializeLoadedHunk": generateEmbeddedGlobalAccess(
- embeddedNames.INITIALIZE_LOADED_HUNK),
- "deferredInitialized": generateEmbeddedGlobalAccess(
- embeddedNames.DEFERRED_INITIALIZED)}));
+ ''',
+ {
+ "globalsHolder": globalsHolder,
+ "isHunkLoaded":
+ generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_LOADED),
+ "isHunkInitialized":
+ generateEmbeddedGlobalAccess(embeddedNames.IS_HUNK_INITIALIZED),
+ "initializeLoadedHunk": generateEmbeddedGlobalAccess(
+ embeddedNames.INITIALIZE_LOADED_HUNK),
+ "deferredInitialized":
+ generateEmbeddedGlobalAccess(embeddedNames.DEFERRED_INITIALIZED)
+ }));
// Write a javascript mapping from Deferred import load ids (derrived
// from the import prefix.) to a list of lists of uris of hunks to load,
@@ -1916,15 +1916,15 @@
new Map<String, List<jsAst.LiteralString>>();
Map<String, List<_DeferredOutputUnitHash>> deferredLibraryHashes =
new Map<String, List<_DeferredOutputUnitHash>>();
- compiler.deferredLoadTask.hunksToLoad.forEach(
- (String loadId, List<OutputUnit>outputUnits) {
+ compiler.deferredLoadTask.hunksToLoad
+ .forEach((String loadId, List<OutputUnit> outputUnits) {
List<jsAst.LiteralString> uris = new List<jsAst.LiteralString>();
List<_DeferredOutputUnitHash> hashes =
new List<_DeferredOutputUnitHash>();
deferredLibraryHashes[loadId] = new List<_DeferredOutputUnitHash>();
for (OutputUnit outputUnit in outputUnits) {
- uris.add(js.escapedString(
- backend.deferredPartFileName(outputUnit.name)));
+ uris.add(
+ js.escapedString(backend.deferredPartFileName(outputUnit.name)));
hashes.add(deferredLoadHashes[outputUnit]);
}
@@ -1935,8 +1935,8 @@
void emitMapping(String name, Map<String, List<jsAst.Expression>> mapping) {
List<jsAst.Property> properties = new List<jsAst.Property>();
mapping.forEach((String key, List<jsAst.Expression> values) {
- properties.add(new jsAst.Property(js.escapedString(key),
- new jsAst.ArrayInitializer(values)));
+ properties.add(new jsAst.Property(
+ js.escapedString(key), new jsAst.ArrayInitializer(values)));
});
jsAst.Node initializer =
new jsAst.ObjectInitializer(properties, isOneLiner: true);
@@ -1946,13 +1946,12 @@
}
emitMapping(embeddedNames.DEFERRED_LIBRARY_URIS, deferredLibraryUris);
- emitMapping(embeddedNames.DEFERRED_LIBRARY_HASHES,
- deferredLibraryHashes);
+ emitMapping(embeddedNames.DEFERRED_LIBRARY_HASHES, deferredLibraryHashes);
return new jsAst.Block(parts);
}
- Map <OutputUnit, jsAst.Program> buildOutputAstForDeferredCode(
+ Map<OutputUnit, jsAst.Program> buildOutputAstForDeferredCode(
Program program) {
if (!program.isSplit) return const <OutputUnit, jsAst.Program>{};
@@ -1973,17 +1972,19 @@
for (String globalObject in Namer.reservedGlobalObjectNames) {
body.add(js.statement('var #object = #globalsHolder.#object;',
- {'globalsHolder': globalsHolder,
- 'object': globalObject}));
+ {'globalsHolder': globalsHolder, 'object': globalObject}));
}
- body..add(js.statement('var init = #globalsHolder.init;',
- {'globalsHolder': globalsHolder}))
- ..add(js.statement('var $setupProgramName = '
- '#globalsHolder.$setupProgramName;',
- {'globalsHolder': globalsHolder}))
- ..add(js.statement('var ${namer.isolateName} = '
- '#globalsHolder.${namer.isolateName};',
- {'globalsHolder': globalsHolder}));
+ body
+ ..add(js.statement('var init = #globalsHolder.init;',
+ {'globalsHolder': globalsHolder}))
+ ..add(js.statement(
+ 'var $setupProgramName = '
+ '#globalsHolder.$setupProgramName;',
+ {'globalsHolder': globalsHolder}))
+ ..add(js.statement(
+ 'var ${namer.isolateName} = '
+ '#globalsHolder.${namer.isolateName};',
+ {'globalsHolder': globalsHolder}));
String typesAccess =
generateEmbeddedGlobalAccessString(embeddedNames.TYPES);
if (libraryDescriptor != null) {
@@ -1999,26 +2000,30 @@
js.statement('$setupProgramName(dart, ${typesAccess}.length);'));
}
- body..add(buildMetadata(program, outputUnit))
- ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, '
- '${namer.deferredTypesName});'));
+ body
+ ..add(buildMetadata(program, outputUnit))
+ ..add(js.statement('${typesAccess}.push.apply(${typesAccess}, '
+ '${namer.deferredTypesName});'));
- body.add(buildCompileTimeConstants(fragment.constants,
- isMainFragment: false));
+ body.add(
+ buildCompileTimeConstants(fragment.constants, isMainFragment: false));
body.add(buildStaticNonFinalFieldInitializations(outputUnit));
body.add(buildLazilyInitializedStaticFields(
- fragment.staticLazilyInitializedFields, isMainFragment: false));
+ fragment.staticLazilyInitializedFields,
+ isMainFragment: false));
List<jsAst.Statement> statements = <jsAst.Statement>[];
statements
- ..add(buildGeneratedBy())
- ..add(buildDeferredHeader())
- ..add(js.statement('${deferredInitializers}.current = '
- """function (#, ${namer.staticStateHolder}) {
+ ..add(buildGeneratedBy())
+ ..add(buildDeferredHeader())
+ ..add(js.statement(
+ '${deferredInitializers}.current = '
+ """function (#, ${namer.staticStateHolder}) {
#
}
- """, [globalsHolder, body]));
+ """,
+ [globalsHolder, body]));
result[outputUnit] = new jsAst.Program(statements);
}
@@ -2032,7 +2037,6 @@
/// itself.
Map<OutputUnit, String> emitDeferredOutputUnits(
Map<OutputUnit, jsAst.Program> outputAsts) {
-
Map<OutputUnit, String> hunkHashes = new Map<OutputUnit, String>();
for (OutputUnit outputUnit in outputAsts.keys) {
@@ -2049,13 +2053,12 @@
String partPrefix =
backend.deferredPartFileName(outputUnit.name, addExtension: false);
CodeOutput output = new StreamCodeOutput(
- compiler.outputProvider(partPrefix, 'part.js'),
- outputListeners);
+ compiler.outputProvider(partPrefix, 'part.js'), outputListeners);
outputBuffers[outputUnit] = output;
- output.addBuffer(jsAst.createCodeBuffer(
- outputAsts[outputUnit], compiler, monitor: compiler.dumpInfoTask));
+ output.addBuffer(jsAst.createCodeBuffer(outputAsts[outputUnit], compiler,
+ monitor: compiler.dumpInfoTask));
// Make a unique hash of the code (before the sourcemaps are added)
// This will be used to retrieve the initializing function from the global
@@ -2063,7 +2066,7 @@
String hash = hasher.getHash();
output.add('$N${deferredInitializers}["$hash"]$_=$_'
- '${deferredInitializers}.current$N');
+ '${deferredInitializers}.current$N');
if (generateSourceMap) {
Uri mapUri, partUri;
@@ -2076,22 +2079,21 @@
String mapFileName = partName + ".js.map";
List<String> mapSegments = sourceMapUri.pathSegments.toList();
mapSegments[mapSegments.length - 1] = mapFileName;
- mapUri = compiler.options.sourceMapUri
- .replace(pathSegments: mapSegments);
+ mapUri =
+ compiler.options.sourceMapUri.replace(pathSegments: mapSegments);
}
if (outputUri != null) {
String partFileName = partName + ".js";
List<String> partSegments = outputUri.pathSegments.toList();
partSegments[partSegments.length - 1] = partFileName;
- partUri = compiler.options.outputUri.replace(
- pathSegments: partSegments);
+ partUri =
+ compiler.options.outputUri.replace(pathSegments: partSegments);
}
output.add(generateSourceMapTag(mapUri, partUri));
output.close();
- outputSourceMap(output, lineColumnCollector, partName,
- mapUri, partUri);
+ outputSourceMap(output, lineColumnCollector, partName, mapUri, partUri);
} else {
output.close();
}
@@ -2108,21 +2110,19 @@
return new jsAst.Comment(generatedBy(compiler, flavor: options.join(", ")));
}
- void outputSourceMap(CodeOutput output,
- LineColumnProvider lineColumnProvider,
- String name,
- [Uri sourceMapUri,
- Uri fileUri]) {
+ void outputSourceMap(
+ CodeOutput output, LineColumnProvider lineColumnProvider, String name,
+ [Uri sourceMapUri, Uri fileUri]) {
if (!generateSourceMap) return;
// Create a source file for the compilation output. This allows using
// [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
SourceMapBuilder sourceMapBuilder =
- new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
+ new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
output.forEachSourceLocation(sourceMapBuilder.addMapping);
String sourceMap = sourceMapBuilder.build();
compiler.outputProvider(name, 'js.map')
- ..add(sourceMap)
- ..close();
+ ..add(sourceMap)
+ ..close();
}
void outputDeferredMap() {
@@ -2133,9 +2133,9 @@
"needed for a given deferred library import.";
mapping.addAll(compiler.deferredLoadTask.computeDeferredMap());
compiler.outputProvider(
- compiler.options.deferredMapUri.path, 'deferred_map')
- ..add(const JsonEncoder.withIndent(" ").convert(mapping))
- ..close();
+ compiler.options.deferredMapUri.path, 'deferred_map')
+ ..add(const JsonEncoder.withIndent(" ").convert(mapping))
+ ..close();
}
void invalidateCaches() {
@@ -2146,7 +2146,6 @@
cachedClassBuilders.remove(element.enclosingClass);
nativeEmitter.cachedBuilders.remove(element.enclosingClass);
-
}
}
}
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
index 573dc34..51f06f8 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/interceptor_emitter.dart
@@ -5,18 +5,17 @@
part of dart2js.js_emitter.full_emitter;
class InterceptorEmitter extends CodeEmitterHelper {
- final Set<jsAst.Name> interceptorInvocationNames =
- new Set<jsAst.Name>();
+ final Set<jsAst.Name> interceptorInvocationNames = new Set<jsAst.Name>();
- void recordMangledNameOfMemberMethod(FunctionElement member,
- jsAst.Name name) {
+ void recordMangledNameOfMemberMethod(
+ FunctionElement member, jsAst.Name name) {
if (backend.isInterceptedMethod(member)) {
interceptorInvocationNames.add(name);
}
}
- jsAst.Expression buildGetInterceptorMethod(jsAst.Name key,
- Set<ClassElement> classes) {
+ jsAst.Expression buildGetInterceptorMethod(
+ jsAst.Name key, Set<ClassElement> classes) {
InterceptorStubGenerator stubGenerator =
new InterceptorStubGenerator(compiler, namer, backend);
jsAst.Expression function =
@@ -35,15 +34,14 @@
Map<jsAst.Name, Set<ClassElement>> specializedGetInterceptors =
backend.specializedGetInterceptors;
- List<jsAst.Name> names = specializedGetInterceptors.keys.toList()
- ..sort();
+ List<jsAst.Name> names = specializedGetInterceptors.keys.toList()..sort();
for (jsAst.Name name in names) {
Set<ClassElement> classes = specializedGetInterceptors[name];
- parts.add(
- js.statement('#.# = #',
- [namer.globalObjectFor(backend.helpers.interceptorsLibrary),
- name,
- buildGetInterceptorMethod(name, classes)]));
+ parts.add(js.statement('#.# = #', [
+ namer.globalObjectFor(backend.helpers.interceptorsLibrary),
+ name,
+ buildGetInterceptorMethod(name, classes)
+ ]));
}
return new jsAst.Block(parts);
@@ -52,7 +50,7 @@
jsAst.Statement buildOneShotInterceptors() {
List<jsAst.Statement> parts = <jsAst.Statement>[];
Iterable<jsAst.Name> names = backend.oneShotInterceptors.keys.toList()
- ..sort();
+ ..sort();
InterceptorStubGenerator stubGenerator =
new InterceptorStubGenerator(compiler, namer, backend);
@@ -81,7 +79,8 @@
if (!compiler.enabledInvokeOn) return null;
Iterable<jsAst.Name> invocationNames = interceptorInvocationNames.toList()
- ..sort();;
+ ..sort();
+ ;
List<jsAst.Property> properties = invocationNames.map((jsAst.Name name) {
return new jsAst.Property(js.quoteName(name), js.number(1));
}).toList();
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
index d342642..906eb73 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/nsm_emitter.dart
@@ -19,22 +19,20 @@
static const MAX_MINIFIED_LENGTH_FOR_DIFF_ENCODING = 4;
void emitNoSuchMethodHandlers(AddPropertyFunction addProperty) {
-
ClassStubGenerator generator =
new ClassStubGenerator(compiler, namer, backend);
// Keep track of the JavaScript names we've already added so we
// do not introduce duplicates (bad for code size).
- Map<jsAst.Name, Selector> addedJsNames
- = generator.computeSelectorsForNsmHandlers();
+ Map<jsAst.Name, Selector> addedJsNames =
+ generator.computeSelectorsForNsmHandlers();
// Set flag used by generateMethod helper below. If we have very few
// handlers we use addProperty for them all, rather than try to generate
// them at runtime.
bool haveVeryFewNoSuchMemberHandlers =
(addedJsNames.length < VERY_FEW_NO_SUCH_METHOD_HANDLERS);
- List<jsAst.Name> names = addedJsNames.keys.toList()
- ..sort();
+ List<jsAst.Name> names = addedJsNames.keys.toList()..sort();
for (jsAst.Name jsName in names) {
Selector selector = addedJsNames[jsName];
String reflectionName = emitter.getReflectionName(selector, jsName);
@@ -43,9 +41,10 @@
emitter.mangledFieldNames[jsName] = reflectionName;
}
- List<jsAst.Expression> argNames =
- selector.callStructure.getOrderedNamedArguments().map((String name) =>
- js.string(name)).toList();
+ List<jsAst.Expression> argNames = selector.callStructure
+ .getOrderedNamedArguments()
+ .map((String name) => js.string(name))
+ .toList();
int type = selector.invocationMirrorKind;
if (!haveVeryFewNoSuchMemberHandlers &&
isTrivialNsmHandler(type, argNames, selector, jsName) &&
@@ -56,11 +55,11 @@
generator.generateStubForNoSuchMethod(jsName, selector);
addProperty(method.name, method.code);
if (reflectionName != null) {
- bool accessible =
- compiler.world.allFunctions.filter(selector, null).any(
- (Element e) => backend.isAccessibleByReflection(e));
- addProperty(namer.asName('+$reflectionName'),
- js(accessible ? '2' : '0'));
+ bool accessible = compiler.world.allFunctions
+ .filter(selector, null)
+ .any((Element e) => backend.isAccessibleByReflection(e));
+ addProperty(
+ namer.asName('+$reflectionName'), js(accessible ? '2' : '0'));
}
}
}
@@ -127,10 +126,10 @@
// Find out how many selectors there are with the special calling
// convention.
- Iterable<Selector> interceptedSelectors = trivialNsmHandlers.where(
- (Selector s) => backend.isInterceptedName(s.name));
- Iterable<Selector> ordinarySelectors = trivialNsmHandlers.where(
- (Selector s) => !backend.isInterceptedName(s.name));
+ Iterable<Selector> interceptedSelectors = trivialNsmHandlers
+ .where((Selector s) => backend.isInterceptedName(s.name));
+ Iterable<Selector> ordinarySelectors = trivialNsmHandlers
+ .where((Selector s) => !backend.isInterceptedName(s.name));
// Get the short names (JS names, perhaps minified).
Iterable<jsAst.Name> interceptedShorts =
@@ -142,20 +141,19 @@
Iterable<String> sortedLongs;
if (useDiffEncoding) {
assert(minify);
- sortedShorts = new _DiffEncodedListOfNames(
- [interceptedShorts, ordinaryShorts]);
+ sortedShorts =
+ new _DiffEncodedListOfNames([interceptedShorts, ordinaryShorts]);
} else {
Iterable<Selector> sorted =
[interceptedSelectors, ordinarySelectors].expand((e) => (e));
sortedShorts = js.concatenateStrings(
- js.joinLiterals(
- sorted.map(namer.invocationMirrorInternalName),
+ js.joinLiterals(sorted.map(namer.invocationMirrorInternalName),
js.stringPart(",")),
addQuotes: true);
if (!minify) {
- sortedLongs = sorted.map((selector) =>
- selector.invocationMirrorMemberName);
+ sortedLongs =
+ sorted.map((selector) => selector.invocationMirrorMemberName);
}
}
// Startup code that loops over the method names and puts handlers on the
@@ -164,7 +162,8 @@
jsAst.Expression createInvocationMirror = backend.emitter
.staticFunctionAccess(backend.helpers.createInvocationMirror);
if (useDiffEncoding) {
- statements.add(js.statement('''{
+ statements.add(js.statement(
+ '''{
var objectClassObject = processedClasses.collected[#objectClass],
nameSequences = #diffEncoding.split("."),
shortNames = [];
@@ -204,32 +203,37 @@
Array.prototype.push.apply(shortNames, sequence.shift());
}
}
- }''', {'objectClass': js.quoteName(namer.className(objectClass)),
- 'diffEncoding': sortedShorts}));
+ }''',
+ {
+ 'objectClass': js.quoteName(namer.className(objectClass)),
+ 'diffEncoding': sortedShorts
+ }));
} else {
// No useDiffEncoding version.
statements.add(js.statement(
'var objectClassObject = processedClasses.collected[#objectClass],'
' shortNames = #diffEncoding.split(",")',
- {'objectClass': js.quoteName(namer.className(objectClass)),
- 'diffEncoding': sortedShorts}));
+ {
+ 'objectClass': js.quoteName(namer.className(objectClass)),
+ 'diffEncoding': sortedShorts
+ }));
if (!minify) {
statements.add(js.statement('var longNames = #longs.split(",")',
- {'longs': js.string(sortedLongs.join(','))}));
+ {'longs': js.string(sortedLongs.join(','))}));
}
- statements.add(js.statement(
- 'if (objectClassObject instanceof Array)'
+ statements.add(js.statement('if (objectClassObject instanceof Array)'
' objectClassObject = objectClassObject[1];'));
}
- dynamic isIntercepted = // jsAst.Expression or bool.
+ dynamic isIntercepted = // jsAst.Expression or bool.
interceptedSelectors.isEmpty
? false
: ordinarySelectors.isEmpty
? true
: js('j < #', js.number(interceptedSelectors.length));
- statements.add(js.statement('''
+ statements.add(js.statement(
+ '''
// If we are loading a deferred library the object class will not be in
// the collectedClasses so objectClassObject is undefined, and we skip
// setting up the names.
@@ -276,11 +280,13 @@
})(#names[j], shortName, type);
}
}
- }''', {
+ }''',
+ {
'noSuchMethodName': namer.noSuchMethodName,
'createInvocationMirror': createInvocationMirror,
'names': minify ? 'shortNames' : 'longNames',
- 'isIntercepted': isIntercepted}));
+ 'isIntercepted': isIntercepted
+ }));
return statements;
}
@@ -291,7 +297,7 @@
///
/// See [buildTrivialNsmHandlers].
class _DiffEncodedListOfNames extends jsAst.DeferredString
- implements jsAst.AstContainer {
+ implements jsAst.AstContainer {
String _cachedValue;
List<jsAst.ArrayInitializer> ast;
@@ -300,12 +306,13 @@
_DiffEncodedListOfNames(Iterable<Iterable<jsAst.Name>> names) {
// Store the names in ArrayInitializer nodes to make them discoverable
// by traversals of the ast.
- ast = names.map((Iterable i) => new jsAst.ArrayInitializer(i.toList()))
- .toList();
+ ast = names
+ .map((Iterable i) => new jsAst.ArrayInitializer(i.toList()))
+ .toList();
}
- void _computeDiffEncodingForList(Iterable<jsAst.Name> names,
- StringBuffer diffEncoding) {
+ void _computeDiffEncodingForList(
+ Iterable<jsAst.Name> names, StringBuffer diffEncoding) {
// Treat string as a number in base 88 with digits in ASCII order from # to
// z. The short name sorting is based on length, and uses ASCII order for
// equal length strings so this means that names are ascending. The hash
@@ -344,10 +351,8 @@
return a.compareTo(b);
}
- List<String> shorts =
- names.map((jsAst.Name name) => name.name)
- .toList()
- ..sort(compare);
+ List<String> shorts = names.map((jsAst.Name name) => name.name).toList()
+ ..sort(compare);
int previous = 0;
for (String short in shorts) {
diff --git a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
index 2481d12..3eb4c8c 100644
--- a/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/full_emitter/setup_program_builder.dart
@@ -16,21 +16,18 @@
const RANGE1_SIZE = RANGE1_LAST - RANGE1_FIRST + 1;
const RANGE2_SIZE = RANGE2_LAST - RANGE2_FIRST + 1;
-const RANGE1_ADJUST = - (FIRST_FIELD_CODE - RANGE1_FIRST);
-const RANGE2_ADJUST = - (FIRST_FIELD_CODE + RANGE1_SIZE - RANGE2_FIRST);
+const RANGE1_ADJUST = -(FIRST_FIELD_CODE - RANGE1_FIRST);
+const RANGE2_ADJUST = -(FIRST_FIELD_CODE + RANGE1_SIZE - RANGE2_FIRST);
const RANGE3_ADJUST =
- - (FIRST_FIELD_CODE + RANGE1_SIZE + RANGE2_SIZE - RANGE3_FIRST);
+ -(FIRST_FIELD_CODE + RANGE1_SIZE + RANGE2_SIZE - RANGE3_FIRST);
-const String setupProgramName ='setupProgram';
+const String setupProgramName = 'setupProgram';
// TODO(floitsch): make sure this property can't clash with anything. It's
// unlikely since it lives on types, but still.
const String typeNameProperty = r'builtin$cls';
jsAst.Statement buildSetupProgram(Program program, Compiler compiler,
- JavaScriptBackend backend,
- Namer namer,
- Emitter emitter) {
-
+ JavaScriptBackend backend, Namer namer, Emitter emitter) {
jsAst.Expression typeInformationAccess =
emitter.generateEmbeddedGlobalAccess(embeddedNames.TYPE_INFORMATION);
jsAst.Expression globalFunctionsAccess =
@@ -61,15 +58,12 @@
emitter.generateEmbeddedGlobalAccess(embeddedNames.INTERCEPTORS_BY_TAG);
jsAst.Expression leafTagsAccess =
emitter.generateEmbeddedGlobalAccess(embeddedNames.LEAF_TAGS);
- jsAst.Expression initializeEmptyInstanceAccess =
- emitter.generateEmbeddedGlobalAccess(
- embeddedNames.INITIALIZE_EMPTY_INSTANCE);
- jsAst.Expression classFieldsExtractorAccess =
- emitter.generateEmbeddedGlobalAccess(
- embeddedNames.CLASS_FIELDS_EXTRACTOR);
- jsAst.Expression instanceFromClassIdAccess =
- emitter.generateEmbeddedGlobalAccess(
- embeddedNames.INSTANCE_FROM_CLASS_ID);
+ jsAst.Expression initializeEmptyInstanceAccess = emitter
+ .generateEmbeddedGlobalAccess(embeddedNames.INITIALIZE_EMPTY_INSTANCE);
+ jsAst.Expression classFieldsExtractorAccess = emitter
+ .generateEmbeddedGlobalAccess(embeddedNames.CLASS_FIELDS_EXTRACTOR);
+ jsAst.Expression instanceFromClassIdAccess = emitter
+ .generateEmbeddedGlobalAccess(embeddedNames.INSTANCE_FROM_CLASS_ID);
String reflectableField = namer.reflectableField;
String reflectionInfoField = namer.reflectionInfoField;
@@ -81,73 +75,76 @@
String unmangledNameIndex = backend.mustRetainMetadata
? ' 3 * optionalParameterCount + 2 * requiredParameterCount + 3'
: ' 2 * optionalParameterCount + requiredParameterCount + 3';
- String receiverParamName = compiler.options.enableMinification
- ? "r" : "receiver";
+ String receiverParamName =
+ compiler.options.enableMinification ? "r" : "receiver";
String valueParamName = compiler.options.enableMinification ? "v" : "value";
String space = compiler.options.enableMinification ? "" : " ";
String _ = space;
- String specProperty = '"${namer.nativeSpecProperty}"'; // "%"
+ String specProperty = '"${namer.nativeSpecProperty}"'; // "%"
jsAst.Expression nativeInfoAccess = js('prototype[$specProperty]', []);
jsAst.Expression constructorAccess = js('constructor', []);
Function subclassReadGenerator =
(jsAst.Expression subclass) => js('allClasses[#]', subclass);
- jsAst.Statement nativeInfoHandler = emitter.
- buildNativeInfoHandler(nativeInfoAccess, constructorAccess,
- subclassReadGenerator, interceptorsByTagAccess,
- leafTagsAccess);
+ jsAst.Statement nativeInfoHandler = emitter.buildNativeInfoHandler(
+ nativeInfoAccess,
+ constructorAccess,
+ subclassReadGenerator,
+ interceptorsByTagAccess,
+ leafTagsAccess);
- Map<String, dynamic> holes =
- {'needsClassSupport': emitter.needsClassSupport,
- 'libraries': librariesAccess,
- 'mangledNames': mangledNamesAccess,
- 'mangledGlobalNames': mangledGlobalNamesAccess,
- 'statics': staticsAccess,
- 'staticsPropertyName': namer.staticsPropertyName,
- 'staticsPropertyNameString': js.quoteName(namer.staticsPropertyName),
- 'typeInformation': typeInformationAccess,
- 'globalFunctions': globalFunctionsAccess,
- 'enabledInvokeOn': compiler.enabledInvokeOn,
- 'interceptedNames': interceptedNamesAccess,
- 'interceptedNamesSet': emitter.generateInterceptedNamesSet(),
- 'notInCspMode': !compiler.options.useContentSecurityPolicy,
- 'inCspMode': compiler.options.useContentSecurityPolicy,
- 'deferredAction': namer.deferredAction,
- 'hasIsolateSupport': program.hasIsolateSupport,
- 'fieldNamesProperty': js.string(Emitter.FIELD_NAMES_PROPERTY_NAME),
- 'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
- 'incrementalHelper': namer.accessIncrementalHelper,
- 'createNewIsolateFunction': createNewIsolateFunctionAccess,
- 'isolateName': namer.isolateName,
- 'classIdExtractor': classIdExtractorAccess,
- 'classFieldsExtractor': classFieldsExtractorAccess,
- 'instanceFromClassId': instanceFromClassIdAccess,
- 'initializeEmptyInstance': initializeEmptyInstanceAccess,
- 'allClasses': allClassesAccess,
- 'debugFastObjects': DEBUG_FAST_OBJECTS,
- 'isTreeShakingDisabled': backend.isTreeShakingDisabled,
- 'precompiled': precompiledAccess,
- 'finishedClassesAccess': finishedClassesAccess,
- 'needsMixinSupport': emitter.needsMixinSupport,
- 'needsNativeSupport': program.needsNativeSupport,
- 'enabledJsInterop': backend.jsInteropAnalysis.enabledJsInterop,
- 'jsInteropBoostrap':backend.jsInteropAnalysis.buildJsInteropBootstrap(),
- 'isInterceptorClass': namer.operatorIs(backend.helpers.jsInterceptorClass),
- 'isObject' : namer.operatorIs(compiler.coreClasses.objectClass),
- 'specProperty': js.string(namer.nativeSpecProperty),
- 'trivialNsmHandlers': emitter.buildTrivialNsmHandlers(),
- 'hasRetainedMetadata': backend.hasRetainedMetadata,
- 'types': typesAccess,
- 'objectClassName': js.quoteName(
- namer.runtimeTypeName(compiler.coreClasses.objectClass)),
- 'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
- 'usesMangledNames':
- compiler.mirrorsLibrary != null || compiler.enabledFunctionApply,
- 'tearOffCode': buildTearOffCode(backend),
- 'nativeInfoHandler': nativeInfoHandler,
- 'operatorIsPrefix' : js.string(namer.operatorIsPrefix),
- 'deferredActionString': js.string(namer.deferredAction)};
- String skeleton = '''
+ Map<String, dynamic> holes = {
+ 'needsClassSupport': emitter.needsClassSupport,
+ 'libraries': librariesAccess,
+ 'mangledNames': mangledNamesAccess,
+ 'mangledGlobalNames': mangledGlobalNamesAccess,
+ 'statics': staticsAccess,
+ 'staticsPropertyName': namer.staticsPropertyName,
+ 'staticsPropertyNameString': js.quoteName(namer.staticsPropertyName),
+ 'typeInformation': typeInformationAccess,
+ 'globalFunctions': globalFunctionsAccess,
+ 'enabledInvokeOn': compiler.enabledInvokeOn,
+ 'interceptedNames': interceptedNamesAccess,
+ 'interceptedNamesSet': emitter.generateInterceptedNamesSet(),
+ 'notInCspMode': !compiler.options.useContentSecurityPolicy,
+ 'inCspMode': compiler.options.useContentSecurityPolicy,
+ 'deferredAction': namer.deferredAction,
+ 'hasIsolateSupport': program.hasIsolateSupport,
+ 'fieldNamesProperty': js.string(Emitter.FIELD_NAMES_PROPERTY_NAME),
+ 'hasIncrementalSupport': compiler.options.hasIncrementalSupport,
+ 'incrementalHelper': namer.accessIncrementalHelper,
+ 'createNewIsolateFunction': createNewIsolateFunctionAccess,
+ 'isolateName': namer.isolateName,
+ 'classIdExtractor': classIdExtractorAccess,
+ 'classFieldsExtractor': classFieldsExtractorAccess,
+ 'instanceFromClassId': instanceFromClassIdAccess,
+ 'initializeEmptyInstance': initializeEmptyInstanceAccess,
+ 'allClasses': allClassesAccess,
+ 'debugFastObjects': DEBUG_FAST_OBJECTS,
+ 'isTreeShakingDisabled': backend.isTreeShakingDisabled,
+ 'precompiled': precompiledAccess,
+ 'finishedClassesAccess': finishedClassesAccess,
+ 'needsMixinSupport': emitter.needsMixinSupport,
+ 'needsNativeSupport': program.needsNativeSupport,
+ 'enabledJsInterop': backend.jsInteropAnalysis.enabledJsInterop,
+ 'jsInteropBoostrap': backend.jsInteropAnalysis.buildJsInteropBootstrap(),
+ 'isInterceptorClass': namer.operatorIs(backend.helpers.jsInterceptorClass),
+ 'isObject': namer.operatorIs(compiler.coreClasses.objectClass),
+ 'specProperty': js.string(namer.nativeSpecProperty),
+ 'trivialNsmHandlers': emitter.buildTrivialNsmHandlers(),
+ 'hasRetainedMetadata': backend.hasRetainedMetadata,
+ 'types': typesAccess,
+ 'objectClassName':
+ js.quoteName(namer.runtimeTypeName(compiler.coreClasses.objectClass)),
+ 'needsStructuredMemberInfo': emitter.needsStructuredMemberInfo,
+ 'usesMangledNames':
+ compiler.mirrorsLibrary != null || compiler.enabledFunctionApply,
+ 'tearOffCode': buildTearOffCode(backend),
+ 'nativeInfoHandler': nativeInfoHandler,
+ 'operatorIsPrefix': js.string(namer.operatorIsPrefix),
+ 'deferredActionString': js.string(namer.deferredAction)
+ };
+ String skeleton = '''
function $setupProgramName(programData, typesOffset) {
"use strict";
if (#needsClassSupport) {
@@ -835,14 +832,16 @@
String readInt(String array, String index) {
return readChecked(
- array, index,
+ array,
+ index,
'result != null && (typeof result != "number" || (result|0) !== result)',
'int');
}
String readFunctionType(String array, String index) {
return readChecked(
- array, index,
+ array,
+ index,
'result != null && '
'(typeof result != "number" || (result|0) !== result) && '
'typeof result != "function"',
diff --git a/pkg/compiler/lib/src/js_emitter/headers.dart b/pkg/compiler/lib/src/js_emitter/headers.dart
index 2d15d11..2bdb761 100644
--- a/pkg/compiler/lib/src/js_emitter/headers.dart
+++ b/pkg/compiler/lib/src/js_emitter/headers.dart
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
library dart2js.js_emitter.headers;
+
import '../compiler.dart' show Compiler;
String generatedBy(Compiler compiler, {String flavor: ""}) {
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index 73eeeb74..1ccb101 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -30,13 +30,13 @@
if (cls == helpers.jsBoolClass) {
condition = js('(typeof receiver) == "boolean"');
} else if (cls == helpers.jsIntClass ||
- cls == helpers.jsDoubleClass ||
- cls == helpers.jsNumberClass) {
+ cls == helpers.jsDoubleClass ||
+ cls == helpers.jsNumberClass) {
throw 'internal error';
} else if (cls == helpers.jsArrayClass ||
- cls == helpers.jsMutableArrayClass ||
- cls == helpers.jsFixedArrayClass ||
- cls == helpers.jsExtendableArrayClass) {
+ cls == helpers.jsMutableArrayClass ||
+ cls == helpers.jsFixedArrayClass ||
+ cls == helpers.jsExtendableArrayClass) {
condition = js('receiver.constructor == Array');
} else if (cls == helpers.jsStringClass) {
condition = js('(typeof receiver) == "string"');
@@ -56,20 +56,27 @@
bool hasNumber = false;
bool hasString = false;
bool hasNative = false;
- bool anyNativeClasses = compiler.enqueuer.codegen.nativeEnqueuer
- .hasInstantiatedNativeClasses();
+ bool anyNativeClasses =
+ compiler.enqueuer.codegen.nativeEnqueuer.hasInstantiatedNativeClasses();
for (ClassElement cls in classes) {
if (cls == helpers.jsArrayClass ||
cls == helpers.jsMutableArrayClass ||
cls == helpers.jsFixedArrayClass ||
- cls == helpers.jsExtendableArrayClass) hasArray = true;
- else if (cls == helpers.jsBoolClass) hasBool = true;
- else if (cls == helpers.jsDoubleClass) hasDouble = true;
- else if (cls == helpers.jsIntClass) hasInt = true;
- else if (cls == helpers.jsNullClass) hasNull = true;
- else if (cls == helpers.jsNumberClass) hasNumber = true;
- else if (cls == helpers.jsStringClass) hasString = true;
+ cls == helpers.jsExtendableArrayClass)
+ hasArray = true;
+ else if (cls == helpers.jsBoolClass)
+ hasBool = true;
+ else if (cls == helpers.jsDoubleClass)
+ hasDouble = true;
+ else if (cls == helpers.jsIntClass)
+ hasInt = true;
+ else if (cls == helpers.jsNullClass)
+ hasNull = true;
+ else if (cls == helpers.jsNumberClass)
+ hasNumber = true;
+ else if (cls == helpers.jsStringClass)
+ hasString = true;
else {
// The set of classes includes classes mixed-in to interceptor classes
// and user extensions of native classes.
@@ -108,15 +115,17 @@
hasDouble ? helpers.jsDoubleClass : helpers.jsNumberClass);
if (hasInt) {
- whenNumber = js.statement('''{
+ whenNumber = js.statement(
+ '''{
if (Math.floor(receiver) == receiver) return #;
return #;
- }''', [interceptorFor(helpers.jsIntClass), interceptorForNumber]);
+ }''',
+ [interceptorFor(helpers.jsIntClass), interceptorForNumber]);
} else {
whenNumber = js.statement('return #', interceptorForNumber);
}
- statements.add(
- js.statement('if (typeof receiver == "number") #;', whenNumber));
+ statements
+ .add(js.statement('if (typeof receiver == "number") #;', whenNumber));
}
if (hasString) {
@@ -128,8 +137,7 @@
// Returning "undefined" or "null" here will provoke a JavaScript
// TypeError which is later identified as a null-error by
// [unwrapException] in js_helper.dart.
- statements.add(
- js.statement('if (receiver == null) return receiver'));
+ statements.add(js.statement('if (receiver == null) return receiver'));
}
if (hasBool) {
statements.add(buildInterceptorCheck(helpers.jsBoolClass));
@@ -141,28 +149,29 @@
}
if (hasNative) {
- statements.add(js.statement(r'''{
+ statements.add(js.statement(
+ r'''{
if (typeof receiver != "object") {
if (typeof receiver == "function" ) return #;
return receiver;
}
if (receiver instanceof #) return receiver;
return #(receiver);
- }''', [
- interceptorFor(helpers.jsJavaScriptFunctionClass),
- backend.emitter.constructorAccess(compiler.coreClasses.objectClass),
- backend.emitter
- .staticFunctionAccess(helpers.getNativeInterceptorMethod)]));
-
+ }''',
+ [
+ interceptorFor(helpers.jsJavaScriptFunctionClass),
+ backend.emitter.constructorAccess(compiler.coreClasses.objectClass),
+ backend.emitter
+ .staticFunctionAccess(helpers.getNativeInterceptorMethod)
+ ]));
} else {
ClassElement jsUnknown = helpers.jsUnknownJavaScriptObjectClass;
- if (compiler.codegenWorld
- .directlyInstantiatedClasses.contains(jsUnknown)) {
- statements.add(
- js.statement('if (!(receiver instanceof #)) return #;',
- [backend.emitter.constructorAccess(
- compiler.coreClasses.objectClass),
- interceptorFor(jsUnknown)]));
+ if (compiler.codegenWorld.directlyInstantiatedClasses
+ .contains(jsUnknown)) {
+ statements.add(js.statement('if (!(receiver instanceof #)) return #;', [
+ backend.emitter.constructorAccess(compiler.coreClasses.objectClass),
+ interceptorFor(jsUnknown)
+ ]));
}
statements.add(js.statement('return receiver'));
@@ -174,9 +183,8 @@
// Returns a statement that takes care of performance critical
// common case for a one-shot interceptor, or null if there is no
// fast path.
- jsAst.Statement _fastPathForOneShotInterceptor(Selector selector,
- Set<ClassElement> classes) {
-
+ jsAst.Statement _fastPathForOneShotInterceptor(
+ Selector selector, Set<ClassElement> classes) {
if (selector.isOperator) {
String name = selector.name;
if (name == '==') {
@@ -186,9 +194,9 @@
return a0 != null && receiver === a0;
}''');
}
- if (!classes.contains(helpers.jsIntClass)
- && !classes.contains(helpers.jsNumberClass)
- && !classes.contains(helpers.jsDoubleClass)) {
+ if (!classes.contains(helpers.jsIntClass) &&
+ !classes.contains(helpers.jsNumberClass) &&
+ !classes.contains(helpers.jsDoubleClass)) {
return null;
}
if (selector.argumentCount == 1) {
@@ -205,8 +213,8 @@
' return #;',
result);
} else if (name == 'unary-') {
- return js.statement(
- 'if (typeof receiver == "number") return -receiver');
+ return js
+ .statement('if (typeof receiver == "number") return -receiver');
} else {
assert(name == '~');
return js.statement('''
@@ -238,15 +246,16 @@
bool containsArray = classes.contains(helpers.jsArrayClass);
bool containsString = classes.contains(helpers.jsStringClass);
bool containsJsIndexable =
- helpers.jsIndexingBehaviorInterface.isResolved && classes.any((cls) {
- return compiler.world.isSubtypeOf(cls,
- helpers.jsIndexingBehaviorInterface);
- });
+ helpers.jsIndexingBehaviorInterface.isResolved &&
+ classes.any((cls) {
+ return compiler.world
+ .isSubtypeOf(cls, helpers.jsIndexingBehaviorInterface);
+ });
// The index set operator requires a check on its set value in
// checked mode, so we don't optimize the interceptor if the
// compiler has type assertions enabled.
- if (selector.isIndexSet
- && (compiler.options.enableTypeAssertions || !containsArray)) {
+ if (selector.isIndexSet &&
+ (compiler.options.enableTypeAssertions || !containsArray)) {
return null;
}
if (!containsArray && !containsString) {
@@ -274,12 +283,14 @@
typeCheck = orExp(typeCheck, indexableCheck);
}
- return js.statement('''
+ return js.statement(
+ '''
if (typeof a0 === "number")
if (#)
if ((a0 >>> 0) === a0 && a0 < receiver.length)
return receiver[a0];
- ''', typeCheck);
+ ''',
+ typeCheck);
} else {
jsAst.Expression typeCheck;
if (containsArray) {
@@ -290,12 +301,14 @@
typeCheck = orExp(typeCheck, indexableCheck);
}
- return js.statement(r'''
+ return js.statement(
+ r'''
if (typeof a0 === "number")
if (# && !receiver.immutable$list &&
(a0 >>> 0) === a0 && a0 < receiver.length)
return receiver[a0] = a1;
- ''', typeCheck);
+ ''',
+ typeCheck);
}
}
return null;
@@ -303,8 +316,7 @@
jsAst.Expression generateOneShotInterceptor(jsAst.Name name) {
Selector selector = backend.oneShotInterceptors[name];
- Set<ClassElement> classes =
- backend.getInterceptedClassesOn(selector.name);
+ Set<ClassElement> classes = backend.getInterceptedClassesOn(selector.name);
jsAst.Name getInterceptorName = namer.nameForGetInterceptor(classes);
List<String> parameterNames = <String>[];
@@ -325,11 +337,14 @@
_fastPathForOneShotInterceptor(selector, classes);
if (optimizedPath == null) optimizedPath = js.statement(';');
- return js(
- 'function(#) { #; return #.#(receiver).#(#) }',
- [parameterNames,
- optimizedPath,
- globalObject, getInterceptorName, invocationName, parameterNames]);
+ return js('function(#) { #; return #.#(receiver).#(#) }', [
+ parameterNames,
+ optimizedPath,
+ globalObject,
+ getInterceptorName,
+ invocationName,
+ parameterNames
+ ]);
}
jsAst.ArrayInitializer generateTypeToInterceptorMap() {
@@ -369,10 +384,8 @@
// We expect most of the time the map will be a singleton.
var properties = [];
for (Element member in analysis.constructors(classElement)) {
- properties.add(
- new jsAst.Property(
- js.string(member.name),
- backend.emitter.staticFunctionAccess(member)));
+ properties.add(new jsAst.Property(js.string(member.name),
+ backend.emitter.staticFunctionAccess(member)));
}
var map = new jsAst.ObjectInitializer(properties);
diff --git a/pkg/compiler/lib/src/js_emitter/js_emitter.dart b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
index be7be0c..0a305ed 100644
--- a/pkg/compiler/lib/src/js_emitter/js_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/js_emitter.dart
@@ -8,76 +8,68 @@
import 'package:js_runtime/shared/embedded_names.dart' as embeddedNames;
import 'package:js_runtime/shared/embedded_names.dart' show JsBuiltin;
-
import '../common.dart';
-import '../common/names.dart' show
- Identifiers;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/names.dart' show Identifiers;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../constants/values.dart';
-import '../closure.dart' show
- ClosureClassElement,
- ClosureClassMap,
- ClosureFieldElement,
- CapturedVariable;
-import '../core_types.dart' show
- CoreClasses;
-import '../dart_types.dart' show
- DartType,
- FunctionType,
- InterfaceType,
- TypedefType,
- Types,
- TypeVariableType;
-import '../deferred_load.dart' show
- OutputUnit;
-import '../elements/elements.dart' show
- ClassElement,
- ConstructorBodyElement,
- ConstructorElement,
- Element,
- Elements,
- ElementKind,
- FieldElement,
- FunctionElement,
- FunctionSignature,
- MetadataAnnotation,
- MethodElement,
- MemberElement,
- MixinApplicationElement,
- ParameterElement,
- TypeVariableElement;
+import '../closure.dart'
+ show
+ ClosureClassElement,
+ ClosureClassMap,
+ ClosureFieldElement,
+ CapturedVariable;
+import '../core_types.dart' show CoreClasses;
+import '../dart_types.dart'
+ show
+ DartType,
+ FunctionType,
+ InterfaceType,
+ TypedefType,
+ Types,
+ TypeVariableType;
+import '../deferred_load.dart' show OutputUnit;
+import '../elements/elements.dart'
+ show
+ ClassElement,
+ ConstructorBodyElement,
+ ConstructorElement,
+ Element,
+ Elements,
+ ElementKind,
+ FieldElement,
+ FunctionElement,
+ FunctionSignature,
+ MetadataAnnotation,
+ MethodElement,
+ MemberElement,
+ MixinApplicationElement,
+ ParameterElement,
+ TypeVariableElement;
import '../js/js.dart' as jsAst;
import '../js/js.dart' show js;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
-import '../js_backend/js_backend.dart' show
- CheckedModeHelper,
- CompoundName,
- ConstantEmitter,
- CustomElementsAnalysis,
- GetterName,
- JavaScriptBackend,
- JavaScriptConstantCompiler,
- Namer,
- RuntimeTypes,
- RuntimeTypesEncoder,
- SetterName,
- Substitution,
- TypeCheck,
- TypeChecks,
- TypeVariableHandler;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/universe.dart' show
- SelectorConstraints;
-import '../util/util.dart' show
- Setlet;
-
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
+import '../js_backend/js_backend.dart'
+ show
+ CheckedModeHelper,
+ CompoundName,
+ ConstantEmitter,
+ CustomElementsAnalysis,
+ GetterName,
+ JavaScriptBackend,
+ JavaScriptConstantCompiler,
+ Namer,
+ RuntimeTypes,
+ RuntimeTypesEncoder,
+ SetterName,
+ Substitution,
+ TypeCheck,
+ TypeChecks,
+ TypeVariableHandler;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/universe.dart' show SelectorConstraints;
+import '../util/util.dart' show Setlet;
import 'full_emitter/emitter.dart' as full_js_emitter;
import 'lazy_emitter/emitter.dart' as lazy_js_emitter;
diff --git a/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart
index b2db5ab..e3f287b 100644
--- a/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/lazy_emitter/emitter.dart
@@ -4,33 +4,21 @@
library dart2js.js_emitter.lazy_emitter;
-import 'package:js_runtime/shared/embedded_names.dart' show
- JsBuiltin,
- METADATA,
- TYPES;
+import 'package:js_runtime/shared/embedded_names.dart'
+ show JsBuiltin, METADATA, TYPES;
import '../../common.dart';
-import '../../compiler.dart' show
- Compiler;
-import '../../constants/values.dart' show
- ConstantValue;
-import '../../elements/elements.dart' show
- ClassElement,
- Element,
- FieldElement,
- FunctionElement;
+import '../../compiler.dart' show Compiler;
+import '../../constants/values.dart' show ConstantValue;
+import '../../elements/elements.dart'
+ show ClassElement, Element, FieldElement, FunctionElement;
import '../../js/js.dart' as js;
-import '../../js_backend/js_backend.dart' show
- JavaScriptBackend,
- Namer;
+import '../../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
-import '../js_emitter.dart' show
- NativeEmitter;
-import '../js_emitter.dart' as emitterTask show
- Emitter;
+import '../js_emitter.dart' show NativeEmitter;
+import '../js_emitter.dart' as emitterTask show Emitter;
import '../model.dart';
-import '../program_builder/program_builder.dart' show
- ProgramBuilder;
+import '../program_builder/program_builder.dart' show ProgramBuilder;
import 'model_emitter.dart';
@@ -97,8 +85,8 @@
@override
js.Expression isolateLazyInitializerAccess(FieldElement element) {
- return js.js('#.#', [namer.globalObjectFor(element),
- namer.lazyInitializerName(element)]);
+ return js.js('#.#',
+ [namer.globalObjectFor(element), namer.lazyInitializerName(element)]);
}
@override
@@ -122,8 +110,8 @@
}
@override
- js.PropertyAccess prototypeAccess(ClassElement element,
- bool hasBeenInstantiated) {
+ js.PropertyAccess prototypeAccess(
+ ClassElement element, bool hasBeenInstantiated) {
js.Expression constructor =
hasBeenInstantiated ? constructorAccess(element) : typeAccess(element);
return js.js('#.prototype', constructor);
@@ -187,13 +175,12 @@
throw new UnsupportedError('createDartClosureFromNameOfStaticFunction');
default:
- reporter.internalError(NO_LOCATION_SPANNABLE,
- "Unhandled Builtin: $builtin");
+ reporter.internalError(
+ NO_LOCATION_SPANNABLE, "Unhandled Builtin: $builtin");
return null;
}
}
@override
- void invalidateCaches() {
- }
+ void invalidateCaches() {}
}
diff --git a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
index d2dd9fd..138062e 100644
--- a/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/lazy_emitter/model_emitter.dart
@@ -4,39 +4,32 @@
library dart2js.js_emitter.lazy_emitter.model_emitter;
-import '../../compiler.dart' show
- Compiler;
-import '../../constants/values.dart' show
- ConstantValue,
- FunctionConstantValue;
-import '../../core_types.dart' show
- CoreClasses;
-import '../../elements/elements.dart' show
- ClassElement,
- FunctionElement;
+import '../../compiler.dart' show Compiler;
+import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
+import '../../core_types.dart' show CoreClasses;
+import '../../elements/elements.dart' show ClassElement, FunctionElement;
import '../../js/js.dart' as js;
-import '../../js_backend/js_backend.dart' show
- JavaScriptBackend,
- Namer,
- ConstantEmitter;
+import '../../js_backend/js_backend.dart'
+ show JavaScriptBackend, Namer, ConstantEmitter;
import '../js_emitter.dart' show NativeEmitter;
import '../constant_ordering.dart' show deepCompareConstants;
-import 'package:js_runtime/shared/embedded_names.dart' show
- CREATE_NEW_ISOLATE,
- DEFERRED_LIBRARY_URIS,
- DEFERRED_LIBRARY_HASHES,
- GET_TYPE_FROM_NAME,
- INITIALIZE_LOADED_HUNK,
- INTERCEPTORS_BY_TAG,
- IS_HUNK_INITIALIZED,
- IS_HUNK_LOADED,
- LEAF_TAGS,
- MANGLED_GLOBAL_NAMES,
- METADATA,
- TYPE_TO_INTERCEPTOR_MAP,
- TYPES;
+import 'package:js_runtime/shared/embedded_names.dart'
+ show
+ CREATE_NEW_ISOLATE,
+ DEFERRED_LIBRARY_URIS,
+ DEFERRED_LIBRARY_HASHES,
+ GET_TYPE_FROM_NAME,
+ INITIALIZE_LOADED_HUNK,
+ INTERCEPTORS_BY_TAG,
+ IS_HUNK_INITIALIZED,
+ IS_HUNK_LOADED,
+ LEAF_TAGS,
+ MANGLED_GLOBAL_NAMES,
+ METADATA,
+ TYPE_TO_INTERCEPTOR_MAP,
+ TYPES;
import '../js_emitter.dart' show NativeGenerator, buildTearOffCode;
import '../model.dart';
@@ -60,10 +53,8 @@
ModelEmitter(Compiler compiler, Namer namer, this.nativeEmitter)
: this.compiler = compiler,
this.namer = namer {
-
this.constantEmitter = new ConstantEmitter(
- compiler, namer, this.generateConstantReference,
- constantListGenerator);
+ compiler, namer, this.generateConstantReference, constantListGenerator);
}
js.Expression constantListGenerator(js.Expression array) {
@@ -81,9 +72,9 @@
}
bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) {
- if (constant.isFunction) return true; // Already emitted.
- if (constant.isPrimitive) return true; // Inlined.
- if (constant.isDummy) return true; // Inlined.
+ if (constant.isFunction) return true; // Already emitted.
+ if (constant.isPrimitive) return true; // Inlined.
+ if (constant.isDummy) return true; // Inlined.
// The name is null when the constant is already a JS constant.
// TODO(floitsch): every constant should be registered, so that we can
// share the ones that take up too much space (like some strings).
@@ -130,8 +121,8 @@
if (isConstantInlinedOrAlreadyEmitted(value)) {
return constantEmitter.generate(value);
}
- return js.js('#.#()', [namer.globalObjectForConstant(value),
- namer.constantName(value)]);
+ return js.js('#.#()',
+ [namer.globalObjectForConstant(value), namer.constantName(value)]);
}
int emitProgram(Program program) {
@@ -144,8 +135,8 @@
// We have to emit the deferred fragments first, since we need their
// deferred hash (which depends on the output) when emitting the main
// fragment.
- List<js.Expression> fragmentsCode = deferredFragments.map(
- (DeferredFragment deferredUnit) {
+ List<js.Expression> fragmentsCode =
+ deferredFragments.map((DeferredFragment deferredUnit) {
js.Expression types =
program.metadataTypesForOutputUnit(deferredUnit.outputUnit);
return emitDeferredFragment(types, deferredUnit, program.holders);
@@ -163,16 +154,17 @@
for (int i = 0; i < fragmentsCode.length; ++i) {
String code = js.createCodeBuffer(fragmentsCode[i], compiler).getText();
totalSize += code.length;
- compiler.outputProvider(fragments[i+1].outputFileName, deferredExtension)
+ compiler.outputProvider(
+ fragments[i + 1].outputFileName, deferredExtension)
..add(code)
..close();
}
String mainCode = js.createCodeBuffer(mainAst, compiler).getText();
compiler.outputProvider(mainFragment.outputFileName, 'js')
- ..add(buildGeneratedBy(compiler))
- ..add(mainCode)
- ..close();
+ ..add(buildGeneratedBy(compiler))
+ ..add(mainCode)
+ ..close();
totalSize += mainCode.length;
return totalSize;
@@ -187,7 +179,7 @@
///
/// See [_UnparsedNode] for details.
js.Literal unparse(Compiler compiler, js.Node value,
- {bool protectForEval: true}) {
+ {bool protectForEval: true}) {
return new js.UnparsedNode(value, compiler, protectForEval);
}
@@ -208,31 +200,31 @@
js.Expression code = new js.ArrayInitializer(elements);
- Map<String, dynamic> holes =
- {'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap),
- 'holders': emitHolders(program.holders),
- 'tearOff': buildTearOffCode(backend),
- 'parseFunctionDescriptor':
- js.js.statement(parseFunctionDescriptorBoilerplate,
- {'argumentCount': js.string(namer.requiredParameterField),
- 'defaultArgumentValues': js.string(namer.defaultValuesField),
- 'callName': js.string(namer.callNameField)}),
-
- 'cyclicThrow':
- backend.emitter.staticFunctionAccess(
- backend.helpers.cyclicThrowHelper),
- 'outputContainsConstantList': program.outputContainsConstantList,
- 'embeddedGlobals': emitEmbeddedGlobals(program),
- 'readMetadataTypeFunction': readMetadataTypeFunction,
- 'staticNonFinals':
- emitStaticNonFinalFields(fragment.staticNonFinalFields),
- 'operatorIsPrefix': js.string(namer.operatorIsPrefix),
- 'callName': js.string(namer.callNameField),
- 'argumentCount': js.string(namer.requiredParameterField),
- 'defaultArgumentValues': js.string(namer.defaultValuesField),
- 'eagerClasses': emitEagerClassInitializations(fragment.libraries),
- 'invokeMain': fragment.invokeMain,
- 'code': code};
+ Map<String, dynamic> holes = {
+ 'deferredInitializer': emitDeferredInitializerGlobal(program.loadMap),
+ 'holders': emitHolders(program.holders),
+ 'tearOff': buildTearOffCode(backend),
+ 'parseFunctionDescriptor':
+ js.js.statement(parseFunctionDescriptorBoilerplate, {
+ 'argumentCount': js.string(namer.requiredParameterField),
+ 'defaultArgumentValues': js.string(namer.defaultValuesField),
+ 'callName': js.string(namer.callNameField)
+ }),
+ 'cyclicThrow': backend.emitter
+ .staticFunctionAccess(backend.helpers.cyclicThrowHelper),
+ 'outputContainsConstantList': program.outputContainsConstantList,
+ 'embeddedGlobals': emitEmbeddedGlobals(program),
+ 'readMetadataTypeFunction': readMetadataTypeFunction,
+ 'staticNonFinals':
+ emitStaticNonFinalFields(fragment.staticNonFinalFields),
+ 'operatorIsPrefix': js.string(namer.operatorIsPrefix),
+ 'callName': js.string(namer.callNameField),
+ 'argumentCount': js.string(namer.requiredParameterField),
+ 'defaultArgumentValues': js.string(namer.defaultValuesField),
+ 'eagerClasses': emitEagerClassInitializations(fragment.libraries),
+ 'invokeMain': fragment.invokeMain,
+ 'code': code
+ };
holes.addAll(nativeHoles(program));
@@ -256,7 +248,6 @@
nativeHoles['nativeIsolateAffinityTagInitialization'] =
nativeIsolateAffinityTagInitialization;
-
js.Expression nativeInfoAccess = js.js('nativeInfo', []);
js.Expression constructorAccess = js.js('constructor', []);
Function subclassReadGenerator = (js.Expression subclass) {
@@ -264,8 +255,7 @@
};
js.Expression interceptorsByTagAccess =
generateEmbeddedGlobalAccess(INTERCEPTORS_BY_TAG);
- js.Expression leafTagsAccess =
- generateEmbeddedGlobalAccess(LEAF_TAGS);
+ js.Expression leafTagsAccess = generateEmbeddedGlobalAccess(LEAF_TAGS);
js.Statement nativeInfoHandler = NativeGenerator.buildNativeInfoHandler(
nativeInfoAccess,
constructorAccess,
@@ -292,15 +282,17 @@
// that covers the entire program.
List<js.Statement> statements = [
- new js.ExpressionStatement(
- new js.VariableDeclarationList(holders.map((e) =>
- new js.VariableInitialization(
- new js.VariableDeclaration(e.name, allowRename: false),
- new js.ObjectInitializer(const []))).toList())),
- js.js.statement('var holders = #', new js.ArrayInitializer(
- holders.map((e) => new js.VariableUse(e.name))
- .toList(growable: false))),
- js.js.statement('var holdersMap = Object.create(null)')
+ new js.ExpressionStatement(new js.VariableDeclarationList(holders
+ .map((e) => new js.VariableInitialization(
+ new js.VariableDeclaration(e.name, allowRename: false),
+ new js.ObjectInitializer(const [])))
+ .toList())),
+ js.js.statement(
+ 'var holders = #',
+ new js.ArrayInitializer(holders
+ .map((e) => new js.VariableUse(e.name))
+ .toList(growable: false))),
+ js.js.statement('var holdersMap = Object.create(null)')
];
return new js.Block(statements);
}
@@ -313,15 +305,14 @@
}
if (program.typeToInterceptorMap != null) {
- globals.add(new js.Property(js.string(TYPE_TO_INTERCEPTOR_MAP),
- program.typeToInterceptorMap));
+ globals.add(new js.Property(
+ js.string(TYPE_TO_INTERCEPTOR_MAP), program.typeToInterceptorMap));
}
if (program.hasIsolateSupport) {
String isolateName = namer.staticStateHolder;
- globals.add(
- new js.Property(js.string(CREATE_NEW_ISOLATE),
- js.js('function () { return $isolateName; }')));
+ globals.add(new js.Property(js.string(CREATE_NEW_ISOLATE),
+ js.js('function () { return $isolateName; }')));
// TODO(floitsch): add remaining isolate functions.
}
@@ -332,20 +323,21 @@
globals.addAll(emitMetadata(program));
if (program.needsNativeSupport) {
- globals.add(new js.Property(js.string(INTERCEPTORS_BY_TAG),
- js.js('Object.create(null)', [])));
- globals.add(new js.Property(js.string(LEAF_TAGS),
- js.js('Object.create(null)', [])));
+ globals.add(new js.Property(
+ js.string(INTERCEPTORS_BY_TAG), js.js('Object.create(null)', [])));
+ globals.add(new js.Property(
+ js.string(LEAF_TAGS), js.js('Object.create(null)', [])));
}
js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals);
- List<js.Statement> statements =
- [new js.ExpressionStatement(
- new js.VariableDeclarationList(
- [new js.VariableInitialization(
- new js.VariableDeclaration("init", allowRename: false),
- globalsObject)]))];
+ List<js.Statement> statements = [
+ new js.ExpressionStatement(new js.VariableDeclarationList([
+ new js.VariableInitialization(
+ new js.VariableDeclaration("init", allowRename: false),
+ globalsObject)
+ ]))
+ ];
return new js.Block(statements);
}
@@ -355,17 +347,22 @@
CoreClasses coreClasses = compiler.coreClasses;
// We want to keep the original names for the most common core classes when
// calling toString on them.
- List<ClassElement> nativeClassesNeedingUnmangledName =
- [coreClasses.intClass, coreClasses.doubleClass, coreClasses.numClass,
- coreClasses.stringClass, coreClasses.boolClass, coreClasses.nullClass,
- coreClasses.listClass];
+ List<ClassElement> nativeClassesNeedingUnmangledName = [
+ coreClasses.intClass,
+ coreClasses.doubleClass,
+ coreClasses.numClass,
+ coreClasses.stringClass,
+ coreClasses.boolClass,
+ coreClasses.nullClass,
+ coreClasses.listClass
+ ];
nativeClassesNeedingUnmangledName.forEach((element) {
- names.add(new js.Property(js.quoteName(namer.className(element)),
- js.string(element.name)));
+ names.add(new js.Property(
+ js.quoteName(namer.className(element)), js.string(element.name)));
});
- return new js.Property(js.string(MANGLED_GLOBAL_NAMES),
- new js.ObjectInitializer(names));
+ return new js.Property(
+ js.string(MANGLED_GLOBAL_NAMES), new js.ObjectInitializer(names));
}
js.Statement emitDeferredInitializerGlobal(Map loadMap) {
@@ -378,7 +375,6 @@
Iterable<js.Property> emitEmbeddedGlobalsForDeferredLoading(
Map<String, List<Fragment>> loadMap) {
-
List<js.Property> globals = <js.Property>[];
js.ArrayInitializer fragmentUris(List<Fragment> fragments) {
@@ -402,44 +398,44 @@
count++;
});
- globals.add(new js.Property(js.string(DEFERRED_LIBRARY_URIS),
- new js.ObjectInitializer(uris)));
- globals.add(new js.Property(js.string(DEFERRED_LIBRARY_HASHES),
- new js.ObjectInitializer(hashes)));
+ globals.add(new js.Property(
+ js.string(DEFERRED_LIBRARY_URIS), new js.ObjectInitializer(uris)));
+ globals.add(new js.Property(
+ js.string(DEFERRED_LIBRARY_HASHES), new js.ObjectInitializer(hashes)));
js.Expression isHunkLoadedFunction =
js.js("function(hash) { return !!$deferredInitializersGlobal[hash]; }");
- globals.add(new js.Property(js.string(IS_HUNK_LOADED),
- isHunkLoadedFunction));
+ globals
+ .add(new js.Property(js.string(IS_HUNK_LOADED), isHunkLoadedFunction));
js.Expression isHunkInitializedFunction =
js.js("function(hash) { return false; }");
- globals.add(new js.Property(js.string(IS_HUNK_INITIALIZED),
- isHunkInitializedFunction));
+ globals.add(new js.Property(
+ js.string(IS_HUNK_INITIALIZED), isHunkInitializedFunction));
js.Expression typesAccess = generateEmbeddedGlobalAccess(TYPES);
/// See [emitEmbeddedGlobalsForDeferredLoading] for the format of the
/// deferred hunk.
- js.Expression initializeLoadedHunkFunction =
- js.js("""
+ js.Expression initializeLoadedHunkFunction = js.js(
+ """
function(hash) {
var hunk = $deferredInitializersGlobal[hash];
$setupProgramName(hunk[0], #typesAccess.length);
eval(hunk[1]);
var deferredTypes = eval(hunk[2]);
#typesAccess.push.apply(#typesAccess, deferredTypes);
- }""", {'typesAccess': typesAccess});
+ }""",
+ {'typesAccess': typesAccess});
- globals.add(new js.Property(js.string(INITIALIZE_LOADED_HUNK),
- initializeLoadedHunkFunction));
+ globals.add(new js.Property(
+ js.string(INITIALIZE_LOADED_HUNK), initializeLoadedHunkFunction));
return globals;
}
js.Property emitGetTypeFromName() {
- js.Expression function =
- js.js( """function(name) {
+ js.Expression function = js.js("""function(name) {
return holdersMap[name][name].ensureResolved();
}""");
return new js.Property(js.string(GET_TYPE_FROM_NAME), function);
@@ -451,14 +447,16 @@
// Types are non-evaluated and must be compiled at first use.
// Compiled strings are guaranteed not to be strings, and it's thus safe
// to use a type-test to determine if a type has already been compiled.
- return js.js.statement('''function $readMetadataTypeName(index) {
+ return js.js.statement(
+ '''function $readMetadataTypeName(index) {
var type = #typesAccess[index];
if (typeof type == 'string') {
type = expressionCompile(type);
#typesAccess[index] = type;
}
return type;
- }''', {"typesAccess": generateEmbeddedGlobalAccess(TYPES)});
+ }''',
+ {"typesAccess": generateEmbeddedGlobalAccess(TYPES)});
}
js.Template get templateForReadType {
@@ -474,17 +472,19 @@
// Types are non-evaluated and must be compiled at first use.
// Compiled strings are guaranteed not to be strings, and it's thus safe
// to use a type-test to determine if a type has already been compiled.
- return js.js.statement('''function $readMetadataName(index) {
+ return js.js.statement(
+ '''function $readMetadataName(index) {
var lazyMetadata = #lazyMetadataAccess[index];
if (typeof lazyMetadata == 'string') {
#metadataAccess[index] = expressionCompile(lazyMetadata);
#lazyMetadataAccess[index] = null;
}
return #metadataAccess[index];
- }''', {
- "lazyMetadataAccess": generateEmbeddedGlobalAccess(lazyMetadataName),
- "metadataAccess": generateEmbeddedGlobalAccess(METADATA)
- });
+ }''',
+ {
+ "lazyMetadataAccess": generateEmbeddedGlobalAccess(lazyMetadataName),
+ "metadataAccess": generateEmbeddedGlobalAccess(METADATA)
+ });
}
js.Template get templateForReadMetadata {
@@ -509,8 +509,7 @@
}
js.Expression emitDeferredFragment(js.Expression deferredTypes,
- DeferredFragment fragment,
- List<Holder> holders) {
+ DeferredFragment fragment, List<Holder> holders) {
// TODO(floitsch): initialize eager classes.
// TODO(floitsch): the hash must depend on the output.
int hash = fragment.hashCode;
@@ -527,15 +526,14 @@
// This is the code that must be evaluated after all deferred classes have
// been setup.
js.Statement immediateCode = new js.Block([
- emitStaticNonFinalFields(fragment.staticNonFinalFields),
- emitEagerClassInitializations(fragment.libraries)]);
-
+ emitStaticNonFinalFields(fragment.staticNonFinalFields),
+ emitEagerClassInitializations(fragment.libraries)
+ ]);
js.Literal immediateString = unparse(compiler, immediateCode);
- js.ArrayInitializer hunk =
- new js.ArrayInitializer([deferredArray, immediateString,
- deferredTypes]);
+ js.ArrayInitializer hunk = new js.ArrayInitializer(
+ [deferredArray, immediateString, deferredTypes]);
return js.js("$deferredInitializersGlobal[$hash] = #", hunk);
}
@@ -563,18 +561,19 @@
js.Block emitStaticNonFinalFields(List<StaticField> fields) {
Iterable<js.Statement> statements = fields.map((StaticField field) {
- return js.js.statement("#.# = #;",
- [field.holder.name, field.name, field.code]);
+ return js.js
+ .statement("#.# = #;", [field.holder.name, field.name, field.code]);
});
return new js.Block(statements.toList());
}
js.Expression emitLazilyInitializedStatics(List<StaticField> fields) {
- Iterable fieldDescriptors = fields.expand((field) =>
- [ js.quoteName(field.name),
+ Iterable fieldDescriptors = fields.expand((field) => [
+ js.quoteName(field.name),
js.quoteName(namer.deriveLazyInitializerName(field.name)),
js.number(field.holder.index),
- emitLazyInitializer(field) ]);
+ emitLazyInitializer(field)
+ ]);
return new js.ArrayInitializer(fieldDescriptors.toList(growable: false));
}
@@ -583,18 +582,17 @@
return js.js.statement('new #.#()', [cls.holder.name, cls.name]);
}
- List<js.Statement> instantiations =
- libraries.expand((Library library) => library.classes)
- .where((Class cls) => cls.isEager)
- .map(createInstantiation)
- .toList(growable: false);
+ List<js.Statement> instantiations = libraries
+ .expand((Library library) => library.classes)
+ .where((Class cls) => cls.isEager)
+ .map(createInstantiation)
+ .toList(growable: false);
return new js.Block(instantiations);
}
// This string should be referenced wherever JavaScript code makes assumptions
// on the mixin format.
- static final String nativeInfoDescription =
- "A class is encoded as follows:"
+ static final String nativeInfoDescription = "A class is encoded as follows:"
" [name, class-code, holder-index], or "
" [name, class-code, native-info, holder-index].";
@@ -632,8 +630,8 @@
js.Name name = cls.name;
Iterable<js.Name> assignments = fieldNames.map((js.Name field) {
- return js.js("this.#field = #field", {"field": field});
- });
+ return js.js("this.#field = #field", {"field": field});
+ });
return js.js('function #(#) { # }', [name, fieldNames, assignments]);
}
@@ -641,9 +639,12 @@
Method _generateGetter(Field field) {
String getterTemplateFor(int flags) {
switch (flags) {
- case 1: return "function() { return this[#]; }";
- case 2: return "function(receiver) { return receiver[#]; }";
- case 3: return "function(receiver) { return this[#]; }";
+ case 1:
+ return "function() { return this[#]; }";
+ case 2:
+ return "function(receiver) { return receiver[#]; }";
+ case 3:
+ return "function(receiver) { return this[#]; }";
}
return null;
}
@@ -657,9 +658,12 @@
Method _generateSetter(Field field) {
String setterTemplateFor(int flags) {
switch (flags) {
- case 1: return "function(val) { return this[#] = val; }";
- case 2: return "function(receiver, val) { return receiver[#] = val; }";
- case 3: return "function(receiver, val) { return this[#] = val; }";
+ case 1:
+ return "function(val) { return this[#] = val; }";
+ case 2:
+ return "function(receiver, val) { return receiver[#] = val; }";
+ case 3:
+ return "function(receiver, val) { return this[#] = val; }";
}
return null;
}
@@ -689,8 +693,10 @@
"reference.";
js.Expression emitClass(Class cls) {
- List elements = [js.quoteName(cls.superclassName, allowNull: true),
- js.number(cls.superclassHolderIndex)];
+ List elements = [
+ js.quoteName(cls.superclassName, allowNull: true),
+ js.number(cls.superclassHolderIndex)
+ ];
if (cls.isMixinApplication) {
MixinApplication mixin = cls;
@@ -708,9 +714,14 @@
Iterable<Method> typeVariableReaderStubs = cls.typeVariableReaderStubs;
Iterable<Method> noSuchMethodStubs = cls.noSuchMethodStubs;
Iterable<Method> gettersSetters = _generateGettersSetters(cls);
- Iterable<Method> allMethods =
- [methods, isChecks, callStubs, typeVariableReaderStubs,
- noSuchMethodStubs, gettersSetters].expand((x) => x);
+ Iterable<Method> allMethods = [
+ methods,
+ isChecks,
+ callStubs,
+ typeVariableReaderStubs,
+ noSuchMethodStubs,
+ gettersSetters
+ ].expand((x) => x);
elements.addAll(allMethods.expand(emitInstanceMethod));
return unparse(compiler, new js.ArrayInitializer(elements));
@@ -813,15 +824,14 @@
method.optionalParameterDefaultValues;
List<js.Property> properties = <js.Property>[];
defaultValues.forEach((String name, ConstantValue value) {
- properties.add(new js.Property(js.string(name),
- generateConstantReference(value)));
+ properties.add(
+ new js.Property(js.string(name), generateConstantReference(value)));
});
return new js.ObjectInitializer(properties);
}
}
Iterable<js.Expression> emitInstanceMethod(Method method) {
-
List<js.Expression> makeNameCodePair(Method method) {
return [js.quoteName(method.name), method.code];
}
@@ -905,8 +915,11 @@
data.add(js.number(method.requiredParameterCount));
data.add(_encodeOptionalParameterDefaultValues(method));
}
- return [js.quoteName(method.name), holderIndex,
- new js.ArrayInitializer(data)];
+ return [
+ js.quoteName(method.name),
+ holderIndex,
+ new js.ArrayInitializer(data)
+ ];
} else {
method.parameterStubs.forEach(_addMethod);
}
@@ -1257,5 +1270,4 @@
})(Date.now(), #code)
}""";
-
}
diff --git a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
index 2efc6e4..b38e403 100644
--- a/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/main_call_stub_generator.dart
@@ -15,8 +15,8 @@
/// Returns the code equivalent to:
/// `function(args) { $.startRootIsolate(X.main$closure(), args); }`
- jsAst.Expression _buildIsolateSetupClosure(Element appMain,
- Element isolateMain) {
+ jsAst.Expression _buildIsolateSetupClosure(
+ Element appMain, Element isolateMain) {
jsAst.Expression mainAccess =
emitterTask.isolateStaticClosureAccess(appMain);
// Since we pass the closurized version of the main method to
@@ -30,12 +30,11 @@
jsAst.Expression mainCallClosure = null;
if (compiler.hasIsolateSupport) {
Element isolateMain =
- helpers.isolateHelperLibrary.find(BackendHelpers.START_ROOT_ISOLATE);
+ helpers.isolateHelperLibrary.find(BackendHelpers.START_ROOT_ISOLATE);
mainCallClosure = _buildIsolateSetupClosure(main, isolateMain);
} else if (compiler.options.hasIncrementalSupport) {
mainCallClosure = js(
- 'function() { return #(); }',
- emitterTask.staticFunctionAccess(main));
+ 'function() { return #(); }', emitterTask.staticFunctionAccess(main));
} else {
mainCallClosure = emitterTask.staticFunctionAccess(main);
}
@@ -47,7 +46,8 @@
// onload event of all script tags and getting the first script which
// finishes. Since onload is called immediately after execution this should
// not substantially change execution order.
- return js.statement('''
+ return js.statement(
+ '''
(function (callback) {
if (typeof document === "undefined") {
callback(null);
@@ -79,7 +79,9 @@
#mainCallClosure([]);
}
})''',
- {'currentScript': currentScriptAccess,
- 'mainCallClosure': mainCallClosure});
+ {
+ 'currentScript': currentScriptAccess,
+ 'mainCallClosure': mainCallClosure
+ });
}
}
diff --git a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
index b51c470..0fc56db 100644
--- a/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/metadata_collector.dart
@@ -63,9 +63,9 @@
_ForwardingMetadataEntry([this.debug]);
_MetadataEntry get forwardTo {
- assert(isBound);
- return _forwardTo;
- }
+ assert(isBound);
+ return _forwardTo;
+ }
jsAst.Expression get entry {
assert(isBound);
@@ -172,8 +172,8 @@
}
}
if (metadata.isEmpty) return null;
- return js('function() { return # }',
- new jsAst.ArrayInitializer(metadata));
+ return js(
+ 'function() { return # }', new jsAst.ArrayInitializer(metadata));
});
}
@@ -193,7 +193,7 @@
ConstructorElement constructor = function;
while (constructor.isRedirectingFactory &&
- !constructor.isCyclicRedirection) {
+ !constructor.isCyclicRedirection) {
// TODO(sra): Remove the loop once effectiveTarget forwards to patches.
constructor = constructor.effectiveTarget.implementation;
}
@@ -222,8 +222,7 @@
return defaultValues;
}
- Map<ParameterElement, ParameterElement>
- mapRedirectingFactoryConstructorOptionalParameters(
+ Map<ParameterElement, ParameterElement> mapRedirectingFactoryConstructorOptionalParameters(
FunctionSignature source, FunctionSignature target) {
var map = <ParameterElement, ParameterElement>{};
@@ -247,8 +246,8 @@
int i = source.requiredParameterCount;
for (ParameterElement element in source.orderedOptionalParameters) {
if (i >= target.requiredParameterCount && i < target.parameterCount) {
- map[element] =
- target.orderedOptionalParameters[i - target.requiredParameterCount];
+ map[element] = target.orderedOptionalParameters[
+ i - target.requiredParameterCount];
}
++i;
}
@@ -267,16 +266,15 @@
}
jsAst.Expression reifyType(DartType type, {ignoreTypeVariables: false}) {
- return reifyTypeForOutputUnit(type,
- _compiler.deferredLoadTask.mainOutputUnit,
- ignoreTypeVariables: ignoreTypeVariables);
+ return reifyTypeForOutputUnit(
+ type, _compiler.deferredLoadTask.mainOutputUnit,
+ ignoreTypeVariables: ignoreTypeVariables);
}
- jsAst.Expression reifyTypeForOutputUnit(DartType type,
- OutputUnit outputUnit,
- {ignoreTypeVariables: false}) {
+ jsAst.Expression reifyTypeForOutputUnit(DartType type, OutputUnit outputUnit,
+ {ignoreTypeVariables: false}) {
return addTypeInOutputUnit(type, outputUnit,
- ignoreTypeVariables: ignoreTypeVariables);
+ ignoreTypeVariables: ignoreTypeVariables);
}
jsAst.Expression reifyName(String name) {
@@ -293,8 +291,8 @@
_MetadataEntry _addGlobalMetadata(jsAst.Node node) {
String nameToKey(jsAst.Name name) => "${name.key}";
- String printed = jsAst.prettyPrint(
- node, _compiler, renamerForNames: nameToKey);
+ String printed =
+ jsAst.prettyPrint(node, _compiler, renamerForNames: nameToKey);
return _globalMetadataMap.putIfAbsent(printed, () {
_BoundMetadataEntry result = new _BoundMetadataEntry(node);
if (_compiler.options.hasIncrementalSupport) {
@@ -305,16 +303,14 @@
}
jsAst.Expression _computeTypeRepresentation(DartType type,
- {ignoreTypeVariables: false}) {
- jsAst.Expression representation = _backend.rtiEncoder.getTypeRepresentation(
- type,
- (variable) {
- if (ignoreTypeVariables) return new jsAst.LiteralNull();
- return _typeVariableHandler.reifyTypeVariable(variable.element);
- },
- (TypedefType typedef) {
- return _backend.isAccessibleByReflection(typedef.element);
- });
+ {ignoreTypeVariables: false}) {
+ jsAst.Expression representation =
+ _backend.rtiEncoder.getTypeRepresentation(type, (variable) {
+ if (ignoreTypeVariables) return new jsAst.LiteralNull();
+ return _typeVariableHandler.reifyTypeVariable(variable.element);
+ }, (TypedefType typedef) {
+ return _backend.isAccessibleByReflection(typedef.element);
+ });
if (representation is jsAst.LiteralString) {
// We don't want the representation to be a string, since we use
@@ -324,19 +320,17 @@
}
return representation;
-
}
- jsAst.Expression addTypeInOutputUnit(DartType type,
- OutputUnit outputUnit,
- {ignoreTypeVariables: false}) {
+ jsAst.Expression addTypeInOutputUnit(DartType type, OutputUnit outputUnit,
+ {ignoreTypeVariables: false}) {
if (_typesMap[outputUnit] == null) {
_typesMap[outputUnit] = new Map<DartType, _BoundMetadataEntry>();
}
return _typesMap[outputUnit].putIfAbsent(type, () {
_BoundMetadataEntry result = new _BoundMetadataEntry(
_computeTypeRepresentation(type,
- ignoreTypeVariables: ignoreTypeVariables));
+ ignoreTypeVariables: ignoreTypeVariables));
if (_compiler.options.hasIncrementalSupport) {
result.finalize(_globalTypesCounter++);
}
@@ -369,9 +363,10 @@
}
void countTokensInTypes(Iterable<_BoundMetadataEntry> entries) {
jsAst.TokenCounter counter = new jsAst.TokenCounter();
- entries.where((_BoundMetadataEntry e) => e._rc > 0)
- .map((_BoundMetadataEntry e) => e.entry)
- .forEach(counter.countTokens);
+ entries
+ .where((_BoundMetadataEntry e) => e._rc > 0)
+ .map((_BoundMetadataEntry e) => e.entry)
+ .forEach(counter.countTokens);
}
jsAst.ArrayInitializer finalizeMap(Map<dynamic, _BoundMetadataEntry> map) {
@@ -394,7 +389,7 @@
List<jsAst.Node> values =
entries.map((_BoundMetadataEntry e) => e.entry).toList();
- return new jsAst.ArrayInitializer(values);
+ return new jsAst.ArrayInitializer(values);
}
_globalMetadata.setExpression(finalizeMap(_globalMetadataMap));
diff --git a/pkg/compiler/lib/src/js_emitter/model.dart b/pkg/compiler/lib/src/js_emitter/model.dart
index 7141627..c7adf76 100644
--- a/pkg/compiler/lib/src/js_emitter/model.dart
+++ b/pkg/compiler/lib/src/js_emitter/model.dart
@@ -4,18 +4,11 @@
library dart2js.new_js_emitter.model;
-import '../constants/values.dart' show
- ConstantValue;
-import '../deferred_load.dart' show
- OutputUnit;
-import '../elements/elements.dart' show
- Element;
-import '../js/js.dart' as js show
- Expression,
- Literal,
- Name,
- Statement,
- TokenFinalizer;
+import '../constants/values.dart' show ConstantValue;
+import '../deferred_load.dart' show OutputUnit;
+import '../elements/elements.dart' show Element;
+import '../js/js.dart' as js
+ show Expression, Literal, Name, Statement, TokenFinalizer;
import 'js_emitter.dart' show MetadataCollector;
@@ -25,8 +18,10 @@
final bool outputContainsConstantList;
final bool needsNativeSupport;
final bool hasIsolateSupport;
+
/// A map from load id to the list of fragments that need to be loaded.
final Map<String, List<Fragment>> loadMap;
+
/// A map from names to strings.
///
/// This map is needed to support `const Symbol` expressions;
@@ -41,16 +36,11 @@
final MetadataCollector _metadataCollector;
final Iterable<js.TokenFinalizer> finalizers;
- Program(this.fragments,
- this.holders,
- this.loadMap,
- this.symbolsMap,
- this.typeToInterceptorMap,
- this._metadataCollector,
- this.finalizers,
- {this.needsNativeSupport,
- this.outputContainsConstantList,
- this.hasIsolateSupport}) {
+ Program(this.fragments, this.holders, this.loadMap, this.symbolsMap,
+ this.typeToInterceptorMap, this._metadataCollector, this.finalizers,
+ {this.needsNativeSupport,
+ this.outputContainsConstantList,
+ this.hasIsolateSupport}) {
assert(needsNativeSupport != null);
assert(outputContainsConstantList != null);
assert(hasIsolateSupport != null);
@@ -121,12 +111,13 @@
/// Output file name without extension.
final String outputFileName;
- Fragment(this.outputUnit,
- this.outputFileName,
- this.libraries,
- this.staticNonFinalFields,
- this.staticLazilyInitializedFields,
- this.constants);
+ Fragment(
+ this.outputUnit,
+ this.outputFileName,
+ this.libraries,
+ this.staticNonFinalFields,
+ this.staticLazilyInitializedFields,
+ this.constants);
bool get isMainFragment;
}
@@ -140,19 +131,16 @@
class MainFragment extends Fragment {
final js.Statement invokeMain;
- MainFragment(OutputUnit outputUnit,
- String outputFileName,
- this.invokeMain,
- List<Library> libraries,
- List<StaticField> staticNonFinalFields,
- List<StaticField> staticLazilyInitializedFields,
- List<Constant> constants)
- : super(outputUnit,
- outputFileName,
- libraries,
- staticNonFinalFields,
- staticLazilyInitializedFields,
- constants);
+ MainFragment(
+ OutputUnit outputUnit,
+ String outputFileName,
+ this.invokeMain,
+ List<Library> libraries,
+ List<StaticField> staticNonFinalFields,
+ List<StaticField> staticLazilyInitializedFields,
+ List<Constant> constants)
+ : super(outputUnit, outputFileName, libraries, staticNonFinalFields,
+ staticLazilyInitializedFields, constants);
bool get isMainFragment => true;
}
@@ -163,19 +151,16 @@
class DeferredFragment extends Fragment {
final String name;
- DeferredFragment(OutputUnit outputUnit,
- String outputFileName,
- this.name,
- List<Library> libraries,
- List<StaticField> staticNonFinalFields,
- List<StaticField> staticLazilyInitializedFields,
- List<Constant> constants)
- : super(outputUnit,
- outputFileName,
- libraries,
- staticNonFinalFields,
- staticLazilyInitializedFields,
- constants);
+ DeferredFragment(
+ OutputUnit outputUnit,
+ String outputFileName,
+ this.name,
+ List<Library> libraries,
+ List<StaticField> staticNonFinalFields,
+ List<StaticField> staticLazilyInitializedFields,
+ List<Constant> constants)
+ : super(outputUnit, outputFileName, libraries, staticNonFinalFields,
+ staticLazilyInitializedFields, constants);
bool get isMainFragment => false;
}
@@ -204,7 +189,7 @@
final List<Field> staticFieldsForReflection;
Library(this.element, this.uri, this.statics, this.classes,
- this.staticFieldsForReflection);
+ this.staticFieldsForReflection);
}
class StaticField {
@@ -220,9 +205,8 @@
final bool isFinal;
final bool isLazy;
- StaticField(this.element,
- this.name, this.holder, this.code,
- this.isFinal, this.isLazy);
+ StaticField(this.element, this.name, this.holder, this.code, this.isFinal,
+ this.isLazy);
}
class Class implements FieldContainer {
@@ -267,19 +251,22 @@
/// Native extensions. See [NativeEmitter.prepareNativeClasses].
List<Class> nativeExtensions;
- Class(this.element, this.name, this.holder,
- this.methods,
- this.fields,
- this.staticFieldsForReflection,
- this.callStubs,
- this.typeVariableReaderStubs,
- this.noSuchMethodStubs,
- this.checkedSetters,
- this.isChecks,
- this.functionTypeIndex,
- {this.onlyForRti,
- this.isDirectlyInstantiated,
- this.isNative}) {
+ Class(
+ this.element,
+ this.name,
+ this.holder,
+ this.methods,
+ this.fields,
+ this.staticFieldsForReflection,
+ this.callStubs,
+ this.typeVariableReaderStubs,
+ this.noSuchMethodStubs,
+ this.checkedSetters,
+ this.isChecks,
+ this.functionTypeIndex,
+ {this.onlyForRti,
+ this.isDirectlyInstantiated,
+ this.isNative}) {
assert(onlyForRti != null);
assert(isDirectlyInstantiated != null);
assert(isNative != null);
@@ -292,40 +279,44 @@
_superclass = superclass;
}
- js.Name get superclassName
- => superclass == null ? null : superclass.name;
+ js.Name get superclassName => superclass == null ? null : superclass.name;
- int get superclassHolderIndex
- => (superclass == null) ? 0 : superclass.holder.index;
+ int get superclassHolderIndex =>
+ (superclass == null) ? 0 : superclass.holder.index;
}
class MixinApplication extends Class {
Class _mixinClass;
- MixinApplication(Element element, js.Name name, Holder holder,
- List<Field> instanceFields,
- List<Field> staticFieldsForReflection,
- List<StubMethod> callStubs,
- List<StubMethod> typeVariableReaderStubs,
- List<StubMethod> checkedSetters,
- List<StubMethod> isChecks,
- js.Expression functionTypeIndex,
- {bool onlyForRti,
- bool isDirectlyInstantiated})
- : super(element,
- name, holder,
- const <Method>[],
- instanceFields,
- staticFieldsForReflection,
- callStubs,
- typeVariableReaderStubs,
- const <StubMethod>[],
- checkedSetters,
- isChecks,
- functionTypeIndex,
- onlyForRti: onlyForRti,
- isDirectlyInstantiated: isDirectlyInstantiated,
- isNative: false);
+ MixinApplication(
+ Element element,
+ js.Name name,
+ Holder holder,
+ List<Field> instanceFields,
+ List<Field> staticFieldsForReflection,
+ List<StubMethod> callStubs,
+ List<StubMethod> typeVariableReaderStubs,
+ List<StubMethod> checkedSetters,
+ List<StubMethod> isChecks,
+ js.Expression functionTypeIndex,
+ {bool onlyForRti,
+ bool isDirectlyInstantiated})
+ : super(
+ element,
+ name,
+ holder,
+ const <Method>[],
+ instanceFields,
+ staticFieldsForReflection,
+ callStubs,
+ typeVariableReaderStubs,
+ const <StubMethod>[],
+ checkedSetters,
+ isChecks,
+ functionTypeIndex,
+ onlyForRti: onlyForRti,
+ isDirectlyInstantiated: isDirectlyInstantiated,
+ isNative: false);
bool get isMixinApplication => true;
Class get mixinClass => _mixinClass;
@@ -362,9 +353,8 @@
final bool needsCheckedSetter;
// TODO(floitsch): support renamed fields.
- Field(this.element, this.name, this.accessorName,
- this.getterFlags, this.setterFlags,
- this.needsCheckedSetter);
+ Field(this.element, this.name, this.accessorName, this.getterFlags,
+ this.setterFlags, this.needsCheckedSetter);
bool get needsGetter => getterFlags != 0;
bool get needsUncheckedSetter => setterFlags != 0;
@@ -383,6 +373,7 @@
/// The element should only be used during the transition to the new model.
/// Uses indicate missing information in the model.
final Element element;
+
/// The name of the method. If the method is a [ParameterStubMethod] for a
/// static function, then the name can be `null`. In that case, only the
/// [ParameterStubMethod.callName] should be used.
@@ -418,17 +409,21 @@
final js.Name callName;
DartMethod(Element element, js.Name name, js.Expression code,
- this.parameterStubs, this.callName,
- {this.needsTearOff, this.tearOffName, this.canBeApplied,
- this.canBeReflected, this.requiredParameterCount,
- this.optionalParameterDefaultValues, this.functionType})
+ this.parameterStubs, this.callName,
+ {this.needsTearOff,
+ this.tearOffName,
+ this.canBeApplied,
+ this.canBeReflected,
+ this.requiredParameterCount,
+ this.optionalParameterDefaultValues,
+ this.functionType})
: super(element, name, code) {
assert(needsTearOff != null);
assert(!needsTearOff || tearOffName != null);
assert(canBeApplied != null);
assert(canBeReflected != null);
assert((!canBeReflected && !canBeApplied) ||
- (requiredParameterCount != null &&
+ (requiredParameterCount != null &&
optionalParameterDefaultValues != null));
}
@@ -447,27 +442,25 @@
/// functions that can be torn off.
final bool isClosureCallMethod;
-
InstanceMethod(Element element, js.Name name, js.Expression code,
- List<ParameterStubMethod> parameterStubs,
- js.Name callName,
- {bool needsTearOff,
- js.Name tearOffName,
- this.aliasName,
- bool canBeApplied,
- bool canBeReflected,
- int requiredParameterCount,
- /* List | Map */ optionalParameterDefaultValues,
- this.isClosureCallMethod,
- js.Expression functionType})
+ List<ParameterStubMethod> parameterStubs, js.Name callName,
+ {bool needsTearOff,
+ js.Name tearOffName,
+ this.aliasName,
+ bool canBeApplied,
+ bool canBeReflected,
+ int requiredParameterCount,
+ /* List | Map */ optionalParameterDefaultValues,
+ this.isClosureCallMethod,
+ js.Expression functionType})
: super(element, name, code, parameterStubs, callName,
- needsTearOff: needsTearOff,
- tearOffName: tearOffName,
- canBeApplied: canBeApplied,
- canBeReflected: canBeReflected,
- requiredParameterCount: requiredParameterCount,
- optionalParameterDefaultValues: optionalParameterDefaultValues,
- functionType: functionType) {
+ needsTearOff: needsTearOff,
+ tearOffName: tearOffName,
+ canBeApplied: canBeApplied,
+ canBeReflected: canBeReflected,
+ requiredParameterCount: requiredParameterCount,
+ optionalParameterDefaultValues: optionalParameterDefaultValues,
+ functionType: functionType) {
assert(isClosureCallMethod != null);
}
@@ -478,8 +471,7 @@
/// to a method in the original Dart program. Examples are getter and setter
/// stubs and stubs to dispatch calls to methods with optional parameters.
class StubMethod extends Method {
- StubMethod(js.Name name, js.Expression code,
- {Element element})
+ StubMethod(js.Name name, js.Expression code, {Element element})
: super(element, name, code);
}
@@ -511,22 +503,28 @@
class StaticDartMethod extends DartMethod implements StaticMethod {
final Holder holder;
- StaticDartMethod(Element element, js.Name name, this.holder,
- js.Expression code, List<ParameterStubMethod> parameterStubs,
- js.Name callName,
- {bool needsTearOff, js.Name tearOffName,
- bool canBeApplied, bool canBeReflected,
- int requiredParameterCount,
- /* List | Map */ optionalParameterDefaultValues,
- js.Expression functionType})
+ StaticDartMethod(
+ Element element,
+ js.Name name,
+ this.holder,
+ js.Expression code,
+ List<ParameterStubMethod> parameterStubs,
+ js.Name callName,
+ {bool needsTearOff,
+ js.Name tearOffName,
+ bool canBeApplied,
+ bool canBeReflected,
+ int requiredParameterCount,
+ /* List | Map */ optionalParameterDefaultValues,
+ js.Expression functionType})
: super(element, name, code, parameterStubs, callName,
- needsTearOff: needsTearOff,
- tearOffName : tearOffName,
- canBeApplied : canBeApplied,
- canBeReflected : canBeReflected,
- requiredParameterCount: requiredParameterCount,
- optionalParameterDefaultValues: optionalParameterDefaultValues,
- functionType: functionType);
+ needsTearOff: needsTearOff,
+ tearOffName: tearOffName,
+ canBeApplied: canBeApplied,
+ canBeReflected: canBeReflected,
+ requiredParameterCount: requiredParameterCount,
+ optionalParameterDefaultValues: optionalParameterDefaultValues,
+ functionType: functionType);
bool get isStatic => true;
}
diff --git a/pkg/compiler/lib/src/js_emitter/native_emitter.dart b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
index dab8fe0..6377d27 100644
--- a/pkg/compiler/lib/src/js_emitter/native_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_emitter.dart
@@ -5,7 +5,6 @@
part of dart2js.js_emitter;
class NativeEmitter {
-
// TODO(floitsch): the native-emitter should not know about ClassBuilders.
final Map<Element, full_js_emitter.ClassBuilder> cachedBuilders;
@@ -71,7 +70,8 @@
* [classesModifiedByEmitRTISupport] contains the list of classes that must
* exist, because runtime-type support adds information to the class.
*/
- Set<Class> prepareNativeClasses(List<Class> classes,
+ Set<Class> prepareNativeClasses(
+ List<Class> classes,
Set<ClassElement> interceptorClassesNeededByConstants,
Set<ClassElement> classesModifiedByEmitRTISupport) {
assert(classes.every((Class cls) => cls != null));
@@ -137,9 +137,9 @@
needed = true;
}
if (backend.isJsInterop(classElement)) {
- needed = true; // TODO(jacobr): we don't need all interop classes.
+ needed = true; // TODO(jacobr): we don't need all interop classes.
} else if (cls.isNative &&
- backend.nativeData.hasNativeTagsForcedNonLeaf(classElement)) {
+ backend.nativeData.hasNativeTagsForcedNonLeaf(classElement)) {
needed = true;
nonLeafClasses.add(cls);
}
@@ -162,8 +162,7 @@
List<String> nativeTags =
backend.nativeData.getNativeTagsOfClass(cls.element);
- if (nonLeafClasses.contains(cls) ||
- extensionPoints.containsKey(cls)) {
+ if (nonLeafClasses.contains(cls) || extensionPoints.containsKey(cls)) {
nonleafTags
.putIfAbsent(cls, () => new Set<String>())
.addAll(nativeTags);
@@ -237,9 +236,7 @@
if (cls.isNative) continue;
Class nativeAncestor = nativeAncestorOf(cls);
if (nativeAncestor != null) {
- map
- .putIfAbsent(nativeAncestor, () => <Class>[])
- .add(cls);
+ map.putIfAbsent(nativeAncestor, () => <Class>[]).add(cls);
}
}
return map;
@@ -252,18 +249,15 @@
field.needsCheckedSetter;
}
- return
- cls.methods.isEmpty &&
+ return cls.methods.isEmpty &&
cls.isChecks.isEmpty &&
cls.callStubs.isEmpty &&
!cls.superclass.isMixinApplication &&
!cls.fields.any(needsAccessor);
}
- void potentiallyConvertDartClosuresToJs(
- List<jsAst.Statement> statements,
- FunctionElement member,
- List<jsAst.Parameter> stubParameters) {
+ void potentiallyConvertDartClosuresToJs(List<jsAst.Statement> statements,
+ FunctionElement member, List<jsAst.Parameter> stubParameters) {
FunctionSignature parameters = member.functionSignature;
Element converter = helpers.closureConverter;
jsAst.Expression closureConverter =
@@ -280,9 +274,8 @@
// typedef(s).
FunctionType functionType = type;
int arity = functionType.computeArity();
- statements.add(
- js.statement('# = #(#, $arity)',
- [name, closureConverter, name]));
+ statements.add(js
+ .statement('# = #(#, $arity)', [name, closureConverter, name]));
break;
}
}
@@ -320,13 +313,13 @@
if (isInterceptedMethod) {
receiver = argumentsBuffer[0];
- arguments = argumentsBuffer.sublist(1,
- indexOfLastOptionalArgumentInParameters + 1);
+ arguments = argumentsBuffer.sublist(
+ 1, indexOfLastOptionalArgumentInParameters + 1);
} else {
// Native methods that are not intercepted must be static.
assert(invariant(member, member.isStatic));
- arguments = argumentsBuffer.sublist(0,
- indexOfLastOptionalArgumentInParameters + 1);
+ arguments = argumentsBuffer.sublist(
+ 0, indexOfLastOptionalArgumentInParameters + 1);
if (backend.isJsInterop(member)) {
// fixedBackendPath is allowed to have the form foo.bar.baz for
// interop. This template is uncached to avoid possibly running out of
@@ -334,14 +327,15 @@
// caching these templates causing an issue is very low as each class
// and library that uses typed JavaScript interop will create only 1
// unique template.
- receiver = js.uncachedExpressionTemplate(
- backend.namer.fixedBackendPath(member)).instantiate([]);
+ receiver = js
+ .uncachedExpressionTemplate(backend.namer.fixedBackendPath(member))
+ .instantiate([]);
} else {
receiver = js('this');
}
}
- statements.add(
- js.statement('return #.#(#)', [receiver, target, arguments]));
+ statements
+ .add(js.statement('return #.#(#)', [receiver, target, arguments]));
return statements;
}
@@ -366,4 +360,4 @@
if (backend.isNativeOrExtendsNative(cls)) return true;
return isSupertypeOfNativeClass(element);
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/js_emitter/native_generator.dart b/pkg/compiler/lib/src/js_emitter/native_generator.dart
index fd15d8a..4dfa36c 100644
--- a/pkg/compiler/lib/src/js_emitter/native_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/native_generator.dart
@@ -5,7 +5,6 @@
part of dart2js.js_emitter;
class NativeGenerator {
-
static bool needsIsolateAffinityTagInitialization(JavaScriptBackend backend) {
return backend.needToInitializeIsolateAffinityTag;
}
@@ -27,7 +26,8 @@
jsAst.Expression dispatchPropertyNameAccess =
generateEmbeddedGlobalAccess(embeddedNames.DISPATCH_PROPERTY_NAME);
- return js.statement('''
+ return js.statement(
+ '''
!function() {
var intern = #internStringFunction;
@@ -56,11 +56,14 @@
}
}();
''',
- {'initializeDispatchProperty': backend.needToInitializeDispatchProperty,
- 'internStringFunction': internStringFunction,
- 'getIsolateTag': getIsolateTagAccess,
- 'isolateTag': isolateTagAccess,
- 'dispatchPropertyName': dispatchPropertyNameAccess});
+ {
+ 'initializeDispatchProperty':
+ backend.needToInitializeDispatchProperty,
+ 'internStringFunction': internStringFunction,
+ 'getIsolateTag': getIsolateTagAccess,
+ 'isolateTag': isolateTagAccess,
+ 'dispatchPropertyName': dispatchPropertyNameAccess
+ });
}
static String generateIsolateTagRoot() {
@@ -83,8 +86,7 @@
String formatTags(Iterable<String> tags) {
if (tags == null) return '';
- return (tags.toList()
- ..sort()).join('|');
+ return (tags.toList()..sort()).join('|');
}
String leafStr = formatTags(leafTags);
@@ -92,9 +94,7 @@
StringBuffer sb = new StringBuffer(leafStr);
if (nonLeafStr != '') {
- sb
- ..write(';')
- ..write(nonLeafStr);
+ sb..write(';')..write(nonLeafStr);
}
String encoding = sb.toString();
@@ -104,9 +104,8 @@
if (extensions != null) {
parts
..add(js.stringPart(';'))
- ..addAll(
- js.joinLiterals(extensions.map((Class cls) => cls.name),
- js.stringPart('|')));
+ ..addAll(js.joinLiterals(
+ extensions.map((Class cls) => cls.name), js.stringPart('|')));
}
return jsAst.concatenateStrings(parts, addQuotes: true);
}
@@ -148,7 +147,8 @@
jsAst.Expression leafTagsAccess) {
jsAst.Expression subclassRead =
subclassReadGenerator(js('subclasses[i]', []));
- return js.statement('''
+ return js.statement(
+ '''
// The native info looks like this:
//
// HtmlElement: {
@@ -196,12 +196,15 @@
}
}
}
- ''', {'info': infoAccess,
+ ''',
+ {
+ 'info': infoAccess,
'constructor': constructorAccess,
'subclassRead': subclassRead,
'interceptorsByTagAccess': interceptorsByTagAccess,
'leafTagsAccess': leafTagsAccess,
'nativeSuperclassTagName': embeddedNames.NATIVE_SUPERCLASS_TAG_NAME,
- 'allowNativesSubclassing': true});
+ 'allowNativesSubclassing': true
+ });
}
}
diff --git a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
index 8325fe1..bc1de29 100644
--- a/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/parameter_stub_generator.dart
@@ -18,7 +18,7 @@
DiagnosticReporter get reporter => compiler.reporter;
bool needsSuperGetter(FunctionElement element) =>
- compiler.codegenWorld.methodsNeedingSuperGetter.contains(element);
+ compiler.codegenWorld.methodsNeedingSuperGetter.contains(element);
/**
* Generates stubs to handle invocation of methods with optional
@@ -36,9 +36,8 @@
* name [ParameterStubMethod.name] and [ParameterStubMethod.callName] set if
* the input selector is non-null (and the member needs a stub).
*/
- ParameterStubMethod generateParameterStub(FunctionElement member,
- Selector selector,
- Selector callSelector) {
+ ParameterStubMethod generateParameterStub(
+ FunctionElement member, Selector selector, Selector callSelector) {
CallStructure callStructure = selector.callStructure;
FunctionSignature parameters = member.functionSignature;
int positionalArgumentCount = callStructure.positionalArgumentCount;
@@ -69,9 +68,8 @@
List<jsAst.Parameter> parametersBuffer =
new List<jsAst.Parameter>(selector.argumentCount + extraArgumentCount);
// The arguments that will be passed to the real method.
- List<jsAst.Expression> argumentsBuffer =
- new List<jsAst.Expression>(
- parameters.parameterCount + extraArgumentCount);
+ List<jsAst.Expression> argumentsBuffer = new List<jsAst.Expression>(
+ parameters.parameterCount + extraArgumentCount);
int count = 0;
if (isInterceptedMethod) {
@@ -117,11 +115,14 @@
count++;
});
- var body; // List or jsAst.Statement.
+ var body; // List or jsAst.Statement.
if (backend.nativeData.hasFixedBackendName(member)) {
body = emitterTask.nativeEmitter.generateParameterStubStatements(
- member, isInterceptedMethod, namer.invocationName(selector),
- parametersBuffer, argumentsBuffer,
+ member,
+ isInterceptedMethod,
+ namer.invocationName(selector),
+ parametersBuffer,
+ argumentsBuffer,
indexOfLastOptionalArgumentInParameters);
} else if (member.isInstanceMember) {
if (needsSuperGetter(member)) {
@@ -131,15 +132,14 @@
// We thus can't just invoke `this.foo$1.call(filledInArguments)`.
// Instead we need to call the statically resolved target.
// `<class>.prototype.bar$1.call(this, argument0, ...)`.
- body = js.statement(
- 'return #.#.call(this, #);',
- [backend.emitter.prototypeAccess(superClass,
- hasBeenInstantiated: true),
- methodName,
- argumentsBuffer]);
+ body = js.statement('return #.#.call(this, #);', [
+ backend.emitter
+ .prototypeAccess(superClass, hasBeenInstantiated: true),
+ methodName,
+ argumentsBuffer
+ ]);
} else {
- body = js.statement(
- 'return this.#(#);',
+ body = js.statement('return this.#(#);',
[namer.instanceMethodName(member), argumentsBuffer]);
}
} else {
@@ -187,7 +187,7 @@
// (2) foo$3$c(a, b, c) => MyClass.foo$4$c$d(this, a, b, c, null);
// (3) foo$3$d(a, b, d) => MyClass.foo$4$c$d(this, a, b, null, d);
List<ParameterStubMethod> generateParameterStubs(MethodElement member,
- {bool canTearOff: true}) {
+ {bool canTearOff: true}) {
if (member.enclosingElement.isClosure) {
ClosureClassElement cls = member.enclosingElement;
if (cls.supertype.element == backend.helpers.boundClosureClass) {
@@ -212,7 +212,7 @@
// Only instance members (not static methods) need stubs.
if (member.isInstanceMember) {
- selectors = compiler.codegenWorld.invocationsByName(member.name);
+ selectors = compiler.codegenWorld.invocationsByName(member.name);
}
if (canTearOff) {
@@ -222,8 +222,8 @@
assert(emptySelectorSet.isEmpty);
if (selectors == null) selectors = const <Selector, SelectorConstraints>{};
- if (callSelectors == null) callSelectors =
- const <Selector, SelectorConstraints>{};
+ if (callSelectors == null)
+ callSelectors = const <Selector, SelectorConstraints>{};
List<ParameterStubMethod> stubs = <ParameterStubMethod>[];
@@ -244,9 +244,8 @@
// Start with the callSelectors since they imply the generation of the
// non-call version.
for (Selector selector in callSelectors.keys) {
- Selector renamedSelector = new Selector.call(
- member.memberName,
- selector.callStructure);
+ Selector renamedSelector =
+ new Selector.call(member.memberName, selector.callStructure);
renamedCallSelectors.add(renamedSelector);
if (!renamedSelector.appliesUnnamed(member, compiler.world)) continue;
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
index 2f5d257..6c76418 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/collector.dart
@@ -76,19 +76,18 @@
// Go over specialized interceptors and then constants to know which
// interceptors are needed.
Set<ClassElement> needed = new Set<ClassElement>();
- backend.specializedGetInterceptors.forEach(
- (_, Iterable<ClassElement> elements) {
- needed.addAll(elements);
- }
- );
+ backend.specializedGetInterceptors
+ .forEach((_, Iterable<ClassElement> elements) {
+ needed.addAll(elements);
+ });
// Add interceptors referenced by constants.
needed.addAll(computeInterceptorsReferencedFromConstants());
// Add unneeded interceptors to the [unneededClasses] set.
for (ClassElement interceptor in backend.interceptedClasses) {
- if (!needed.contains(interceptor)
- && interceptor != coreClasses.objectClass) {
+ if (!needed.contains(interceptor) &&
+ interceptor != coreClasses.objectClass) {
unneededClasses.add(interceptor);
}
}
@@ -117,11 +116,12 @@
if (backend.isAccessibleByReflection(element)) {
bool shouldRetainMetadata = backend.retainMetadataOf(element);
if (shouldRetainMetadata &&
- (element.isFunction || element.isConstructor ||
- element.isSetter)) {
+ (element.isFunction ||
+ element.isConstructor ||
+ element.isSetter)) {
FunctionElement function = element;
- function.functionSignature.forEachParameter(
- backend.retainMetadataOf);
+ function.functionSignature
+ .forEachParameter(backend.retainMetadataOf);
}
}
}
@@ -130,12 +130,8 @@
if (!onlyForRti) {
backend.retainMetadataOf(cls);
new FieldVisitor(compiler, namer).visitFields(cls, false,
- (Element member,
- js.Name name,
- js.Name accessorName,
- bool needsGetter,
- bool needsSetter,
- bool needsCheckedSetter) {
+ (Element member, js.Name name, js.Name accessorName,
+ bool needsGetter, bool needsSetter, bool needsCheckedSetter) {
bool needsAccessor = needsGetter || needsSetter;
if (needsAccessor && backend.isAccessibleByReflection(member)) {
backend.retainMetadataOf(member);
@@ -147,9 +143,8 @@
}
JavaScriptConstantCompiler handler = backend.constants;
- List<ConstantValue> constants = handler.getConstantsForEmission(
- compiler.options.hasIncrementalSupport ? null
- : emitter.compareConstants);
+ List<ConstantValue> constants = handler.getConstantsForEmission(compiler
+ .options.hasIncrementalSupport ? null : emitter.compareConstants);
for (ConstantValue constant in constants) {
if (emitter.isConstantInlinedOrAlreadyEmitted(constant)) continue;
@@ -163,23 +158,25 @@
// TODO(sigurdm): We should track those constants.
constantUnit = compiler.deferredLoadTask.mainOutputUnit;
}
- outputConstantLists.putIfAbsent(
- constantUnit, () => new List<ConstantValue>()).add(constant);
+ outputConstantLists
+ .putIfAbsent(constantUnit, () => new List<ConstantValue>())
+ .add(constant);
}
}
/// Compute all the classes and typedefs that must be emitted.
void computeNeededDeclarations() {
// Compute needed typedefs.
- typedefsNeededForReflection = Elements.sortedByPosition(
- compiler.world.allTypedefs
- .where(backend.isAccessibleByReflection)
- .toList());
+ typedefsNeededForReflection = Elements.sortedByPosition(compiler
+ .world.allTypedefs
+ .where(backend.isAccessibleByReflection)
+ .toList());
// Compute needed classes.
- Set<ClassElement> instantiatedClasses =
- compiler.codegenWorld.directlyInstantiatedClasses
- .where(computeClassFilter()).toSet();
+ Set<ClassElement> instantiatedClasses = compiler
+ .codegenWorld.directlyInstantiatedClasses
+ .where(computeClassFilter())
+ .toSet();
void addClassWithSuperclasses(ClassElement cls) {
neededClasses.add(cls);
@@ -245,14 +242,17 @@
!classesOnlyNeededForRti.contains(element)) {
// For now, native classes and related classes cannot be deferred.
nativeClassesAndSubclasses.add(element);
- assert(invariant(element,
- !compiler.deferredLoadTask.isDeferred(element)));
- outputClassLists.putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
- () => new List<ClassElement>()).add(element);
+ assert(
+ invariant(element, !compiler.deferredLoadTask.isDeferred(element)));
+ outputClassLists
+ .putIfAbsent(compiler.deferredLoadTask.mainOutputUnit,
+ () => new List<ClassElement>())
+ .add(element);
} else {
- outputClassLists.putIfAbsent(
- compiler.deferredLoadTask.outputUnitForElement(element),
- () => new List<ClassElement>())
+ outputClassLists
+ .putIfAbsent(
+ compiler.deferredLoadTask.outputUnitForElement(element),
+ () => new List<ClassElement>())
.add(element);
}
}
@@ -278,7 +278,7 @@
addToOutputUnit(Element element) {
List<VariableElement> list = outputStaticNonFinalFieldLists.putIfAbsent(
compiler.deferredLoadTask.outputUnitForElement(element),
- () => new List<VariableElement>());
+ () => new List<VariableElement>());
list.add(element);
}
@@ -300,7 +300,8 @@
void addSurroundingLibraryToSet(Element element) {
OutputUnit unit = compiler.deferredLoadTask.outputUnitForElement(element);
LibraryElement library = element.library;
- outputLibraryLists.putIfAbsent(unit, () => new Set<LibraryElement>())
+ outputLibraryLists
+ .putIfAbsent(unit, () => new Set<LibraryElement>())
.add(library);
}
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
index 09eabaf..935fa5f 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/field_visitor.dart
@@ -22,13 +22,13 @@
* case, [needsSetter] is always false. [needsCheckedSetter] is only true when
* type assertions are enabled (checked mode).
*/
-typedef void AcceptField(VariableElement member,
- js.Name name,
- js.Name accessorName,
- bool needsGetter,
- bool needsSetter,
- bool needsCheckedSetter);
-
+typedef void AcceptField(
+ VariableElement member,
+ js.Name name,
+ js.Name accessorName,
+ bool needsGetter,
+ bool needsSetter,
+ bool needsCheckedSetter);
class FieldVisitor {
final Compiler compiler;
@@ -93,15 +93,15 @@
needsSetter = fieldNeedsSetter(field);
}
- if ((isInstantiated && !backend.isNative(holder))
- || needsGetter
- || needsSetter) {
+ if ((isInstantiated && !backend.isNative(holder)) ||
+ needsGetter ||
+ needsSetter) {
js.Name accessorName = namer.fieldAccessorName(field);
js.Name fieldName = namer.fieldPropertyName(field);
bool needsCheckedSetter = false;
- if (compiler.options.enableTypeAssertions
- && needsSetter
- && !canAvoidGeneratedCheckedSetter(field)) {
+ if (compiler.options.enableTypeAssertions &&
+ needsSetter &&
+ !canAvoidGeneratedCheckedSetter(field)) {
needsCheckedSetter = true;
needsSetter = false;
}
@@ -130,8 +130,8 @@
// generate the field getter/setter dynamically. Since this is only
// allowed on fields that are in [element] we don't need to visit
// superclasses for non-instantiated classes.
- cls.implementation.forEachInstanceField(
- visitField, includeSuperAndInjectedMembers: isInstantiated);
+ cls.implementation.forEachInstanceField(visitField,
+ includeSuperAndInjectedMembers: isInstantiated);
}
}
@@ -140,7 +140,7 @@
if (fieldAccessNeverThrows(field)) return false;
if (backend.shouldRetainGetter(field)) return true;
return field.isClassMember &&
- compiler.codegenWorld.hasInvokedGetter(field, compiler.world);
+ compiler.codegenWorld.hasInvokedGetter(field, compiler.world);
}
bool fieldNeedsSetter(VariableElement field) {
@@ -154,11 +154,11 @@
static bool fieldAccessNeverThrows(VariableElement field) {
return
- // We never access a field in a closure (a captured variable) without
- // knowing that it is there. Therefore we don't need to use a getter
- // (that will throw if the getter method is missing), but can always
- // access the field directly.
- field is ClosureFieldElement;
+ // We never access a field in a closure (a captured variable) without
+ // knowing that it is there. Therefore we don't need to use a getter
+ // (that will throw if the getter method is missing), but can always
+ // access the field directly.
+ field is ClosureFieldElement;
}
bool canAvoidGeneratedCheckedSetter(VariableElement member) {
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
index 7aef3a3..5d5afe6 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/program_builder.dart
@@ -4,65 +4,49 @@
library dart2js.js_emitter.program_builder;
-import '../js_emitter.dart' show
- ClassStubGenerator,
- CodeEmitterTask,
- computeMixinClass,
- Emitter,
- InterceptorStubGenerator,
- MainCallStubGenerator,
- ParameterStubGenerator,
- RuntimeTypeGenerator,
- TypeTestProperties;
+import '../js_emitter.dart'
+ show
+ ClassStubGenerator,
+ CodeEmitterTask,
+ computeMixinClass,
+ Emitter,
+ InterceptorStubGenerator,
+ MainCallStubGenerator,
+ ParameterStubGenerator,
+ RuntimeTypeGenerator,
+ TypeTestProperties;
import '../model.dart';
-import '../../closure.dart' show
- ClosureFieldElement;
+import '../../closure.dart' show ClosureFieldElement;
import '../../common.dart';
-import '../../common/names.dart' show
- Names,
- Selectors;
-import '../../compiler.dart' show
- Compiler;
-import '../../constants/values.dart' show
- ConstantValue,
- InterceptorConstantValue;
-import '../../core_types.dart' show
- CoreClasses;
-import '../../dart_types.dart' show
- DartType,
- FunctionType,
- TypedefType;
-import '../../elements/elements.dart' show
- ClassElement,
- Element,
- Elements,
- FieldElement,
- FunctionElement,
- FunctionSignature,
- GetterElement,
- LibraryElement,
- MethodElement,
- Name,
- ParameterElement,
- TypedefElement,
- VariableElement;
+import '../../common/names.dart' show Names, Selectors;
+import '../../compiler.dart' show Compiler;
+import '../../constants/values.dart'
+ show ConstantValue, InterceptorConstantValue;
+import '../../core_types.dart' show CoreClasses;
+import '../../dart_types.dart' show DartType, FunctionType, TypedefType;
+import '../../elements/elements.dart'
+ show
+ ClassElement,
+ Element,
+ Elements,
+ FieldElement,
+ FunctionElement,
+ FunctionSignature,
+ GetterElement,
+ LibraryElement,
+ MethodElement,
+ Name,
+ ParameterElement,
+ TypedefElement,
+ VariableElement;
import '../../js/js.dart' as js;
-import '../../js_backend/backend_helpers.dart' show
- BackendHelpers;
-import '../../js_backend/js_backend.dart' show
- Namer,
- JavaScriptBackend,
- JavaScriptConstantCompiler,
- StringBackedName;
-import '../../universe/selector.dart' show
- Selector;
-import '../../universe/universe.dart' show
- Universe,
- SelectorConstraints;
-import '../../deferred_load.dart' show
- DeferredLoadTask,
- OutputUnit;
+import '../../js_backend/backend_helpers.dart' show BackendHelpers;
+import '../../js_backend/js_backend.dart'
+ show Namer, JavaScriptBackend, JavaScriptConstantCompiler, StringBackedName;
+import '../../universe/selector.dart' show Selector;
+import '../../universe/universe.dart' show Universe, SelectorConstraints;
+import '../../deferred_load.dart' show DeferredLoadTask, OutputUnit;
part 'collector.dart';
part 'registry.dart';
@@ -87,11 +71,8 @@
/// True if the program should store function types in the metadata.
bool _storeFunctionTypesInMetadata = false;
- ProgramBuilder(Compiler compiler,
- Namer namer,
- this._task,
- Emitter emitter,
- Set<ClassElement> rtiNeededClasses)
+ ProgramBuilder(Compiler compiler, Namer namer, this._task, Emitter emitter,
+ Set<ClassElement> rtiNeededClasses)
: this._compiler = compiler,
this.namer = namer,
this.collector =
@@ -130,13 +111,13 @@
// Note: In rare cases (mostly tests) output units can be empty. This
// happens when the deferred code is dead-code eliminated but we still need
// to check that the library has been loaded.
- _compiler.deferredLoadTask.allOutputUnits.forEach(
- _registry.registerOutputUnit);
+ _compiler.deferredLoadTask.allOutputUnits
+ .forEach(_registry.registerOutputUnit);
collector.outputClassLists.forEach(_registry.registerElements);
collector.outputStaticLists.forEach(_registry.registerElements);
collector.outputConstantLists.forEach(_registerConstants);
- collector.outputStaticNonFinalFieldLists.forEach(
- _registry.registerElements);
+ collector.outputStaticNonFinalFieldLists
+ .forEach(_registry.registerElements);
// We always add the current isolate holder.
_registerStaticStateHolder();
@@ -144,7 +125,8 @@
// We need to run the native-preparation before we build the output. The
// preparation code, in turn needs the classes to be set up.
// We thus build the classes before building their containers.
- collector.outputClassLists.forEach((OutputUnit _, List<ClassElement> classes) {
+ collector.outputClassLists
+ .forEach((OutputUnit _, List<ClassElement> classes) {
classes.forEach(_buildClass);
});
@@ -169,9 +151,9 @@
Set<ClassElement> classesModifiedByEmitRTISupport =
_task.typeTestRegistry.computeClassesModifiedByEmitRuntimeTypeSupport();
-
_unneededNativeClasses = _task.nativeEmitter.prepareNativeClasses(
- nativeClasses, interceptorClassesNeededByConstants,
+ nativeClasses,
+ interceptorClassesNeededByConstants,
classesModifiedByEmitRTISupport);
_addJsInteropStubs(_registry.mainLibrariesMap);
@@ -199,14 +181,8 @@
finalizers.add(namingFinalizer);
}
- return new Program(
- fragments,
- holders,
- _buildLoadMap(),
- _symbolsMap,
- _buildTypeToInterceptorMap(),
- _task.metadataCollector,
- finalizers,
+ return new Program(fragments, holders, _buildLoadMap(), _symbolsMap,
+ _buildTypeToInterceptorMap(), _task.metadataCollector, finalizers,
needsNativeSupport: needsNativeSupport,
outputContainsConstantList: collector.outputContainsConstantList,
hasIsolateSupport: _compiler.hasIsolateSupport);
@@ -238,7 +214,7 @@
// Construct the main output from the libraries and the registered holders.
MainFragment result = new MainFragment(
librariesMap.outputUnit,
- "", // The empty string is the name for the main output file.
+ "", // The empty string is the name for the main output file.
_buildInvokeMain(),
_buildLibraries(librariesMap),
_buildStaticNonFinalFields(librariesMap),
@@ -260,7 +236,7 @@
DeferredFragment result = new DeferredFragment(
librariesMap.outputUnit,
backend.deferredPartFileName(librariesMap.name, addExtension: false),
- librariesMap.name,
+ librariesMap.name,
_buildLibraries(librariesMap),
_buildStaticNonFinalFields(librariesMap),
_buildStaticLazilyInitializedFields(librariesMap),
@@ -273,18 +249,17 @@
List<ConstantValue> constantValues =
collector.outputConstantLists[librariesMap.outputUnit];
if (constantValues == null) return const <Constant>[];
- return constantValues.map((ConstantValue value) => _constants[value])
+ return constantValues
+ .map((ConstantValue value) => _constants[value])
.toList(growable: false);
}
List<StaticField> _buildStaticNonFinalFields(LibrariesMap librariesMap) {
List<VariableElement> staticNonFinalFields =
- collector.outputStaticNonFinalFieldLists[librariesMap.outputUnit];
+ collector.outputStaticNonFinalFieldLists[librariesMap.outputUnit];
if (staticNonFinalFields == null) return const <StaticField>[];
- return staticNonFinalFields
- .map(_buildStaticField)
- .toList(growable: false);
+ return staticNonFinalFields.map(_buildStaticField).toList(growable: false);
}
StaticField _buildStaticField(Element element) {
@@ -292,8 +267,8 @@
ConstantValue initialValue = handler.getInitialValueFor(element);
// TODO(zarah): The holder should not be registered during building of
// a static field.
- _registry.registerHolder(
- namer.globalObjectForConstant(initialValue), isConstantsHolder: true);
+ _registry.registerHolder(namer.globalObjectForConstant(initialValue),
+ isConstantsHolder: true);
js.Expression code = _task.emitter.constantReference(initialValue);
js.Name name = namer.globalPropertyName(element);
bool isFinal = false;
@@ -303,9 +278,8 @@
// building a static field. (Note that the static-state holder was
// already registered earlier, and that we just call the register to get
// the holder-instance.
- return new StaticField(element,
- name, _registerStaticStateHolder(), code,
- isFinal, isLazy);
+ return new StaticField(
+ element, name, _registerStaticStateHolder(), code, isFinal, isLazy);
}
List<StaticField> _buildStaticLazilyInitializedFields(
@@ -316,9 +290,10 @@
.getLazilyInitializedFieldsForEmission()
.where((element) =>
loadTask.outputUnitForElement(element) == librariesMap.outputUnit);
- return Elements.sortedByPosition(lazyFields)
+ return Elements
+ .sortedByPosition(lazyFields)
.map(_buildLazyField)
- .where((field) => field != null) // Happens when the field was unused.
+ .where((field) => field != null) // Happens when the field was unused.
.toList(growable: false);
}
@@ -336,9 +311,8 @@
// building a static field. (Note that the static-state holder was
// already registered earlier, and that we just call the register to get
// the holder-instance.
- return new StaticField(element,
- name, _registerStaticStateHolder(), code,
- isFinal, isLazy);
+ return new StaticField(
+ element, name, _registerStaticStateHolder(), code, isFinal, isLazy);
}
List<Library> _buildLibraries(LibrariesMap librariesMap) {
@@ -356,8 +330,7 @@
// TODO(jacobr): register toString as used so that it is always accessible
// from JavaScript.
_classes[_compiler.coreClasses.objectClass].callStubs.add(
- _buildStubMethod(
- new StringBackedName("toString"),
+ _buildStubMethod(new StringBackedName("toString"),
js.js('function() { return this.#(this) }', toStringInvocation)));
}
@@ -382,10 +355,8 @@
for (var selector in selectors.keys) {
var stubName = namer.invocationName(selector);
if (stubNames.add(stubName.key)) {
- interceptorClass.callStubs.add(_buildStubMethod(
- stubName,
- js.js(
- 'function(obj) { return obj.# }', [member.name]),
+ interceptorClass.callStubs.add(_buildStubMethod(stubName,
+ js.js('function(obj) { return obj.# }', [member.name]),
element: member));
}
}
@@ -422,8 +393,8 @@
if (returnType.isFunctionType) {
functionType = returnType;
} else if (returnType.treatAsDynamic ||
- _compiler.types.isSubtype(returnType,
- backend.coreTypes.functionType)) {
+ _compiler.types.isSubtype(
+ returnType, backend.coreTypes.functionType)) {
if (returnType.isTypedef) {
TypedefType typedef = returnType;
// TODO(jacobr): can we just use typdef.unaliased instead?
@@ -464,8 +435,8 @@
if (argumentCount > maxArgs) break;
var stubName = namer.invocationName(selector);
if (!stubNames.add(stubName.key)) break;
- var parameters = new List<String>.generate(argumentCount,
- (i) => 'p$i');
+ var parameters =
+ new List<String>.generate(argumentCount, (i) => 'p$i');
// We intentionally generate the same stub method for direct
// calls and call-throughs of getters so that calling a
@@ -514,8 +485,8 @@
bool visitStatics = true;
List<Field> staticFieldsForReflection = _buildFields(library, visitStatics);
- return new Library(library, uri, statics, classes,
- staticFieldsForReflection);
+ return new Library(
+ library, uri, statics, classes, staticFieldsForReflection);
}
/// HACK for Incremental Compilation.
@@ -563,7 +534,6 @@
Map<Selector, SelectorConstraints> selectors =
_compiler.codegenWorld.invocationsByName(member.name);
if (selectors != null && !selectors.isEmpty) {
-
Map<js.Name, js.Expression> callStubsForMember =
classStubGenerator.generateCallStubsForGetter(member, selectors);
callStubsForMember.forEach((js.Name name, js.Expression code) {
@@ -588,9 +558,8 @@
if (backend.symbolsUsed.contains(selectorName)) {
_symbolsMap[name] = selectorName;
}
- noSuchMethodStubs
- .add(classStubGenerator.generateStubForNoSuchMethod(name,
- selector));
+ noSuchMethodStubs.add(
+ classStubGenerator.generateStubForNoSuchMethod(name, selector));
});
}
@@ -615,17 +584,16 @@
List<Field> staticFieldsForReflection =
onlyForRti ? const <Field>[] : _buildFields(element, true);
- TypeTestProperties typeTests =
- runtimeTypeGenerator.generateIsTests(
- element,
- storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata);
+ TypeTestProperties typeTests = runtimeTypeGenerator.generateIsTests(element,
+ storeFunctionTypeInMetadata: _storeFunctionTypesInMetadata);
List<StubMethod> checkedSetters = <StubMethod>[];
List<StubMethod> isChecks = <StubMethod>[];
if (backend.isJsInterop(element)) {
typeTests.properties.forEach((js.Name name, js.Node code) {
- _classes[helpers.jsInterceptorClass].isChecks.add(
- _buildStubMethod(name, code));
+ _classes[helpers.jsInterceptorClass]
+ .isChecks
+ .add(_buildStubMethod(name, code));
});
} else {
for (Field field in instanceFields) {
@@ -657,30 +625,36 @@
assert(!backend.isNative(element));
assert(methods.isEmpty);
- result = new MixinApplication(element,
- name, holder,
- instanceFields,
- staticFieldsForReflection,
- callStubs,
- typeVariableReaderStubs,
- checkedSetters,
- isChecks,
- typeTests.functionTypeIndex,
- isDirectlyInstantiated: isInstantiated,
- onlyForRti: onlyForRti);
+ result = new MixinApplication(
+ element,
+ name,
+ holder,
+ instanceFields,
+ staticFieldsForReflection,
+ callStubs,
+ typeVariableReaderStubs,
+ checkedSetters,
+ isChecks,
+ typeTests.functionTypeIndex,
+ isDirectlyInstantiated: isInstantiated,
+ onlyForRti: onlyForRti);
} else {
- result = new Class(element,
- name, holder, methods, instanceFields,
- staticFieldsForReflection,
- callStubs,
- typeVariableReaderStubs,
- noSuchMethodStubs,
- checkedSetters,
- isChecks,
- typeTests.functionTypeIndex,
- isDirectlyInstantiated: isInstantiated,
- onlyForRti: onlyForRti,
- isNative: backend.isNative(element));
+ result = new Class(
+ element,
+ name,
+ holder,
+ methods,
+ instanceFields,
+ staticFieldsForReflection,
+ callStubs,
+ typeVariableReaderStubs,
+ noSuchMethodStubs,
+ checkedSetters,
+ isChecks,
+ typeTests.functionTypeIndex,
+ isDirectlyInstantiated: isInstantiated,
+ onlyForRti: onlyForRti,
+ isNative: backend.isNative(element));
}
_classes[element] = result;
return result;
@@ -762,7 +736,7 @@
canTearOff = universe.hasInvokedGetter(element, _compiler.world) ||
(canBeReflected && !element.isOperator);
assert(canTearOff ||
- !universe.methodsNeedingSuperGetter.contains(element));
+ !universe.methodsNeedingSuperGetter.contains(element));
tearOffName = namer.getterForElement(element);
}
}
@@ -809,9 +783,12 @@
return new InstanceMethod(element, name, code,
_generateParameterStubs(element, canTearOff), callName,
- needsTearOff: canTearOff, tearOffName: tearOffName,
- isClosureCallMethod: isClosureCallMethod, aliasName: aliasName,
- canBeApplied: canBeApplied, canBeReflected: canBeReflected,
+ needsTearOff: canTearOff,
+ tearOffName: tearOffName,
+ isClosureCallMethod: isClosureCallMethod,
+ aliasName: aliasName,
+ canBeApplied: canBeApplied,
+ canBeReflected: canBeReflected,
requiredParameterCount: requiredParameterCount,
optionalParameterDefaultValues: optionalParameterDefaultValues,
functionType: functionType);
@@ -827,9 +804,8 @@
}
}
- List<ParameterStubMethod> _generateParameterStubs(MethodElement element,
- bool canTearOff) {
-
+ List<ParameterStubMethod> _generateParameterStubs(
+ MethodElement element, bool canTearOff) {
if (!_methodNeedsStubs(element)) return const <ParameterStubMethod>[];
ParameterStubGenerator generator =
@@ -841,8 +817,7 @@
///
/// Stub methods may have an element that can be used for code-size
/// attribution.
- Method _buildStubMethod(js.Name name, js.Expression code,
- {Element element}) {
+ Method _buildStubMethod(js.Name name, js.Expression code, {Element element}) {
return new StubMethod(name, code, element: element);
}
@@ -881,13 +856,9 @@
List<Field> _buildFields(Element holder, bool visitStatics) {
List<Field> fields = <Field>[];
- new FieldVisitor(_compiler, namer).visitFields(
- holder, visitStatics, (VariableElement field,
- js.Name name,
- js.Name accessorName,
- bool needsGetter,
- bool needsSetter,
- bool needsCheckedSetter) {
+ new FieldVisitor(_compiler, namer).visitFields(holder, visitStatics,
+ (VariableElement field, js.Name name, js.Name accessorName,
+ bool needsGetter, bool needsSetter, bool needsCheckedSetter) {
assert(invariant(field, field.isDeclaration));
int getterFlags = 0;
@@ -917,9 +888,8 @@
}
}
- fields.add(new Field(field, name, accessorName,
- getterFlags, setterFlags,
- needsCheckedSetter));
+ fields.add(new Field(field, name, accessorName, getterFlags, setterFlags,
+ needsCheckedSetter));
});
return fields;
@@ -957,7 +927,6 @@
js.Name tearOffName =
needsTearOff ? namer.staticClosureName(element) : null;
-
js.Name callName = null;
if (needsTearOff) {
Selector callSelector =
@@ -983,22 +952,19 @@
// TODO(floitsch): we shouldn't update the registry in the middle of
// building a static method.
- return new StaticDartMethod(element,
- name, _registry.registerHolder(holder), code,
- _generateParameterStubs(element, needsTearOff),
- callName,
- needsTearOff: needsTearOff,
- tearOffName: tearOffName,
- canBeApplied: canBeApplied,
- canBeReflected: canBeReflected,
- requiredParameterCount: requiredParameterCount,
- optionalParameterDefaultValues:
- optionalParameterDefaultValues,
- functionType: functionType);
+ return new StaticDartMethod(element, name, _registry.registerHolder(holder),
+ code, _generateParameterStubs(element, needsTearOff), callName,
+ needsTearOff: needsTearOff,
+ tearOffName: tearOffName,
+ canBeApplied: canBeApplied,
+ canBeReflected: canBeReflected,
+ requiredParameterCount: requiredParameterCount,
+ optionalParameterDefaultValues: optionalParameterDefaultValues,
+ functionType: functionType);
}
- void _registerConstants(OutputUnit outputUnit,
- Iterable<ConstantValue> constantValues) {
+ void _registerConstants(
+ OutputUnit outputUnit, Iterable<ConstantValue> constantValues) {
// `constantValues` is null if an outputUnit doesn't contain any constants.
if (constantValues == null) return;
for (ConstantValue constantValue in constantValues) {
@@ -1014,7 +980,7 @@
}
Holder _registerStaticStateHolder() {
- return _registry.registerHolder(
- namer.staticStateHolder, isStaticStateHolder: true);
+ return _registry.registerHolder(namer.staticStateHolder,
+ isStaticStateHolder: true);
}
}
diff --git a/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart b/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart
index 5614bf9..192f158 100644
--- a/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/program_builder/registry.dart
@@ -113,12 +113,11 @@
// Ignore for now.
}
- Holder registerHolder(
- String name,
+ Holder registerHolder(String name,
{bool isStaticStateHolder: false, bool isConstantsHolder: false}) {
assert(_holdersMap[name] == null ||
(_holdersMap[name].isStaticStateHolder == isStaticStateHolder &&
- _holdersMap[name].isConstantsHolder == isConstantsHolder));
+ _holdersMap[name].isConstantsHolder == isConstantsHolder));
return _holdersMap.putIfAbsent(name, () {
return new Holder(name, _holdersMap.length,
diff --git a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
index 9c48f4d..f2997aa 100644
--- a/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/runtime_type_generator.dart
@@ -5,8 +5,8 @@
part of dart2js.js_emitter;
// Function signatures used in the generation of runtime type information.
-typedef void FunctionTypeSignatureEmitter(Element method,
- FunctionType methodType);
+typedef void FunctionTypeSignatureEmitter(
+ Element method, FunctionType methodType);
typedef void SubstitutionEmitter(Element element, {bool emitNull});
@@ -37,8 +37,7 @@
TypeTestRegistry get typeTestRegistry => emitterTask.typeTestRegistry;
CoreClasses get coreClasses => compiler.coreClasses;
- Set<ClassElement> get checkedClasses =>
- typeTestRegistry.checkedClasses;
+ Set<ClassElement> get checkedClasses => typeTestRegistry.checkedClasses;
Iterable<ClassElement> get classesUsingTypeVariableTests =>
typeTestRegistry.classesUsingTypeVariableTests;
@@ -56,9 +55,8 @@
/// type (if class has one) in the metadata object and stores its index in
/// the result. This is only possible for function types that do not contain
/// type variables.
- TypeTestProperties generateIsTests(
- ClassElement classElement,
- { bool storeFunctionTypeInMetadata: true}) {
+ TypeTestProperties generateIsTests(ClassElement classElement,
+ {bool storeFunctionTypeInMetadata: true}) {
assert(invariant(classElement, classElement.isDeclaration));
TypeTestProperties result = new TypeTestProperties();
@@ -69,14 +67,13 @@
/// native classes.
/// TODO(herhut): Generate tests for native classes dynamically, as well.
void generateIsTest(Element other) {
- if (backend.isNative(classElement) ||
- !classElement.isSubclassOf(other)) {
+ if (backend.isNative(classElement) || !classElement.isSubclassOf(other)) {
result.properties[namer.operatorIs(other)] = js('1');
}
}
- void generateFunctionTypeSignature(FunctionElement method,
- FunctionType type) {
+ void generateFunctionTypeSignature(
+ FunctionElement method, FunctionType type) {
assert(method.isImplementation);
jsAst.Expression thisAccess = new jsAst.This();
ClosureClassMap closureData =
@@ -97,8 +94,7 @@
RuntimeTypesEncoder rtiEncoder = backend.rtiEncoder;
jsAst.Expression encoding =
rtiEncoder.getSignatureEncoding(type, thisAccess);
- jsAst.Name operatorSignature =
- namer.asName(namer.operatorSignature);
+ jsAst.Name operatorSignature = namer.asName(namer.operatorSignature);
result.properties[operatorSignature] = encoding;
}
}
@@ -134,9 +130,7 @@
}
_generateIsTestsOn(classElement, generateIsTest,
- generateFunctionTypeSignature,
- generateSubstitution,
- generateTypeCheck);
+ generateFunctionTypeSignature, generateSubstitution, generateTypeCheck);
return result;
}
@@ -211,7 +205,8 @@
}
}
- void emitNothing(_, {emitNull}) {};
+ void emitNothing(_, {emitNull}) {}
+ ;
generateSubstitution = emitNothing;
}
@@ -230,10 +225,8 @@
// A superclass might already implement the Function interface. In such
// a case, we can avoid emiting the is test here.
if (!cls.superclass.implementsFunction(coreClasses)) {
- _generateInterfacesIsTests(coreClasses.functionClass,
- generateIsTest,
- generateSubstitution,
- generated);
+ _generateInterfacesIsTests(coreClasses.functionClass, generateIsTest,
+ generateSubstitution, generated);
}
FunctionType callType = callFunction.computeType(compiler.resolution);
generateFunctionTypeSignature(callFunction, callType);
@@ -242,40 +235,42 @@
for (DartType interfaceType in cls.interfaces) {
_generateInterfacesIsTests(interfaceType.element, generateIsTest,
- generateSubstitution, generated);
+ generateSubstitution, generated);
}
}
/**
* Generate "is tests" where [cls] is being implemented.
*/
- void _generateInterfacesIsTests(ClassElement cls,
- void generateIsTest(ClassElement element),
- SubstitutionEmitter generateSubstitution,
- Set<Element> alreadyGenerated) {
+ void _generateInterfacesIsTests(
+ ClassElement cls,
+ void generateIsTest(ClassElement element),
+ SubstitutionEmitter generateSubstitution,
+ Set<Element> alreadyGenerated) {
void tryEmitTest(ClassElement check) {
if (!alreadyGenerated.contains(check) && checkedClasses.contains(check)) {
alreadyGenerated.add(check);
generateIsTest(check);
generateSubstitution(check);
}
- };
+ }
+ ;
tryEmitTest(cls);
for (DartType interfaceType in cls.interfaces) {
Element element = interfaceType.element;
tryEmitTest(element);
- _generateInterfacesIsTests(element, generateIsTest, generateSubstitution,
- alreadyGenerated);
+ _generateInterfacesIsTests(
+ element, generateIsTest, generateSubstitution, alreadyGenerated);
}
// We need to also emit "is checks" for the superclass and its supertypes.
ClassElement superclass = cls.superclass;
if (superclass != null) {
tryEmitTest(superclass);
- _generateInterfacesIsTests(superclass, generateIsTest,
- generateSubstitution, alreadyGenerated);
+ _generateInterfacesIsTests(
+ superclass, generateIsTest, generateSubstitution, alreadyGenerated);
}
}
@@ -283,20 +278,20 @@
List<StubMethod> stubs = <StubMethod>[];
ClassElement superclass = classElement;
while (superclass != null) {
- for (TypeVariableType parameter in superclass.typeVariables) {
- if (backend.emitter.readTypeVariables.contains(parameter.element)) {
- stubs.add(
- _generateTypeVariableReader(classElement, parameter.element));
- }
+ for (TypeVariableType parameter in superclass.typeVariables) {
+ if (backend.emitter.readTypeVariables.contains(parameter.element)) {
+ stubs.add(
+ _generateTypeVariableReader(classElement, parameter.element));
}
- superclass = superclass.superclass;
}
+ superclass = superclass.superclass;
+ }
return stubs;
}
- StubMethod _generateTypeVariableReader(ClassElement cls,
- TypeVariableElement element) {
+ StubMethod _generateTypeVariableReader(
+ ClassElement cls, TypeVariableElement element) {
jsAst.Name name = namer.nameForReadTypeVariable(element);
int index = element.index;
jsAst.Expression computeTypeVariable;
@@ -304,21 +299,22 @@
Substitution substitution =
backend.rti.getSubstitution(cls, element.typeDeclaration);
if (substitution != null) {
- computeTypeVariable =
- js(r'#.apply(null, this.$builtinTypeInfo)',
- backend.rtiEncoder.getSubstitutionCodeForVariable(
- substitution, index));
+ computeTypeVariable = js(
+ r'#.apply(null, this.$builtinTypeInfo)',
+ backend.rtiEncoder
+ .getSubstitutionCodeForVariable(substitution, index));
} else {
// TODO(ahe): These can be generated dynamically.
- computeTypeVariable =
- js(r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]',
- js.number(index));
+ computeTypeVariable = js(
+ r'this.$builtinTypeInfo && this.$builtinTypeInfo[#]',
+ js.number(index));
}
jsAst.Expression convertRtiToRuntimeType = backend.emitter
- .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType);
+ .staticFunctionAccess(backend.helpers.convertRtiToRuntimeType);
- return new StubMethod(name,
- js('function () { return #(#) }',
- [convertRtiToRuntimeType, computeTypeVariable]));
+ return new StubMethod(
+ name,
+ js('function () { return #(#) }',
+ [convertRtiToRuntimeType, computeTypeVariable]));
}
}
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
index 40fd877..072e8cb 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/emitter.dart
@@ -4,31 +4,19 @@
library dart2js.js_emitter.startup_emitter;
-import 'package:js_runtime/shared/embedded_names.dart' show
- JsBuiltin,
- METADATA,
- STATIC_FUNCTION_NAME_TO_CLOSURE,
- TYPES;
+import 'package:js_runtime/shared/embedded_names.dart'
+ show JsBuiltin, METADATA, STATIC_FUNCTION_NAME_TO_CLOSURE, TYPES;
import '../../common.dart';
-import '../../compiler.dart' show
- Compiler;
-import '../../constants/values.dart' show
- ConstantValue;
-import '../../elements/elements.dart' show
- ClassElement,
- Element,
- FieldElement,
- FunctionElement;
+import '../../compiler.dart' show Compiler;
+import '../../constants/values.dart' show ConstantValue;
+import '../../elements/elements.dart'
+ show ClassElement, Element, FieldElement, FunctionElement;
import '../../js/js.dart' as js;
-import '../../js_backend/js_backend.dart' show
- JavaScriptBackend,
- Namer;
+import '../../js_backend/js_backend.dart' show JavaScriptBackend, Namer;
-import '../js_emitter.dart' show
- NativeEmitter;
-import '../js_emitter.dart' as emitterTask show
- Emitter;
+import '../js_emitter.dart' show NativeEmitter;
+import '../js_emitter.dart' as emitterTask show Emitter;
import '../program_builder/program_builder.dart' show ProgramBuilder;
import '../model.dart';
@@ -97,8 +85,8 @@
@override
js.Expression isolateLazyInitializerAccess(FieldElement element) {
- return js.js('#.#', [namer.globalObjectFor(element),
- namer.lazyInitializerName(element)]);
+ return js.js('#.#',
+ [namer.globalObjectFor(element), namer.lazyInitializerName(element)]);
}
@override
@@ -122,8 +110,8 @@
}
@override
- js.PropertyAccess prototypeAccess(ClassElement element,
- bool hasBeenInstantiated) {
+ js.PropertyAccess prototypeAccess(
+ ClassElement element, bool hasBeenInstantiated) {
js.Expression constructor =
hasBeenInstantiated ? constructorAccess(element) : typeAccess(element);
return js.js('#.prototype', constructor);
@@ -165,8 +153,8 @@
return _backend.rtiEncoder.templateForCreateFunctionType;
case JsBuiltin.isSubtype:
- // TODO(floitsch): move this closer to where is-check properties are
- // built.
+ // TODO(floitsch): move this closer to where is-check properties are
+ // built.
String isPrefix = namer.operatorIsPrefix;
return js.js.expressionTemplateFor("('$isPrefix' + #) in #.prototype");
@@ -179,8 +167,7 @@
return js.js.expressionTemplateFor("$metadataAccess[#]");
case JsBuiltin.getType:
- String typesAccess =
- _emitter.generateEmbeddedGlobalAccessString(TYPES);
+ String typesAccess = _emitter.generateEmbeddedGlobalAccessString(TYPES);
return js.js.expressionTemplateFor("$typesAccess[#]");
case JsBuiltin.createDartClosureFromNameOfStaticFunction:
@@ -189,13 +176,12 @@
return js.js.expressionTemplateFor("$functionAccess(#)");
default:
- reporter.internalError(NO_LOCATION_SPANNABLE,
- "Unhandled Builtin: $builtin");
+ reporter.internalError(
+ NO_LOCATION_SPANNABLE, "Unhandled Builtin: $builtin");
return null;
}
}
@override
- void invalidateCaches() {
- }
+ void invalidateCaches() {}
}
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
index 14dea34..48ccd6d 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/fragment_emitter.dart
@@ -427,54 +427,53 @@
return js.js('#.#', [cls.holder.name, cls.name]);
}
- js.Statement emitMainFragment(
- Program program,
+ js.Statement emitMainFragment(Program program,
Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
MainFragment fragment = program.fragments.first;
- Iterable<Holder> nonStaticStateHolders = program.holders
- .where((Holder holder) => !holder.isStaticStateHolder);
+ Iterable<Holder> nonStaticStateHolders =
+ program.holders.where((Holder holder) => !holder.isStaticStateHolder);
- return js.js.statement(mainBoilerplate,
- {'typeNameProperty': js.string(ModelEmitter.typeNameProperty),
- 'cyclicThrow': backend.emitter.staticFunctionAccess(
- backend.helpers.cyclicThrowHelper),
- 'operatorIsPrefix': js.string(namer.operatorIsPrefix),
- 'tearOffCode': new js.Block(buildTearOffCode(backend)),
- 'embeddedTypes': generateEmbeddedGlobalAccess(TYPES),
- 'embeddedInterceptorTags':
- generateEmbeddedGlobalAccess(INTERCEPTORS_BY_TAG),
- 'embeddedLeafTags': generateEmbeddedGlobalAccess(LEAF_TAGS),
- 'embeddedGlobalsObject': js.js("init"),
- 'holdersList': new js.ArrayInitializer(nonStaticStateHolders
- .map((holder) => js.js("#", holder.name))
- .toList(growable: false)),
- 'staticStateDeclaration': new js.VariableDeclaration(
- namer.staticStateHolder, allowRename: false),
- 'staticState': js.js('#', namer.staticStateHolder),
- 'constantHolderReference': buildConstantHolderReference(program),
- 'holders': emitHolders(program.holders, fragment),
- 'callName': js.string(namer.callNameField),
- 'argumentCount': js.string(namer.requiredParameterField),
- 'defaultArgumentValues': js.string(namer.defaultValuesField),
- 'prototypes': emitPrototypes(fragment),
- 'inheritance': emitInheritance(fragment),
- 'aliases': emitInstanceMethodAliases(fragment),
- 'tearOffs': emitInstallTearOffs(fragment),
- 'constants': emitConstants(fragment),
- 'staticNonFinalFields': emitStaticNonFinalFields(fragment),
- 'lazyStatics': emitLazilyInitializedStatics(fragment),
- 'embeddedGlobals': emitEmbeddedGlobals(program, deferredLoadHashes),
- 'nativeSupport': program.needsNativeSupport
- ? emitNativeSupport(fragment)
- : new js.EmptyStatement(),
- 'invokeMain': fragment.invokeMain,
- });
+ return js.js.statement(mainBoilerplate, {
+ 'typeNameProperty': js.string(ModelEmitter.typeNameProperty),
+ 'cyclicThrow': backend.emitter
+ .staticFunctionAccess(backend.helpers.cyclicThrowHelper),
+ 'operatorIsPrefix': js.string(namer.operatorIsPrefix),
+ 'tearOffCode': new js.Block(buildTearOffCode(backend)),
+ 'embeddedTypes': generateEmbeddedGlobalAccess(TYPES),
+ 'embeddedInterceptorTags':
+ generateEmbeddedGlobalAccess(INTERCEPTORS_BY_TAG),
+ 'embeddedLeafTags': generateEmbeddedGlobalAccess(LEAF_TAGS),
+ 'embeddedGlobalsObject': js.js("init"),
+ 'holdersList': new js.ArrayInitializer(nonStaticStateHolders
+ .map((holder) => js.js("#", holder.name))
+ .toList(growable: false)),
+ 'staticStateDeclaration': new js.VariableDeclaration(
+ namer.staticStateHolder,
+ allowRename: false),
+ 'staticState': js.js('#', namer.staticStateHolder),
+ 'constantHolderReference': buildConstantHolderReference(program),
+ 'holders': emitHolders(program.holders, fragment),
+ 'callName': js.string(namer.callNameField),
+ 'argumentCount': js.string(namer.requiredParameterField),
+ 'defaultArgumentValues': js.string(namer.defaultValuesField),
+ 'prototypes': emitPrototypes(fragment),
+ 'inheritance': emitInheritance(fragment),
+ 'aliases': emitInstanceMethodAliases(fragment),
+ 'tearOffs': emitInstallTearOffs(fragment),
+ 'constants': emitConstants(fragment),
+ 'staticNonFinalFields': emitStaticNonFinalFields(fragment),
+ 'lazyStatics': emitLazilyInitializedStatics(fragment),
+ 'embeddedGlobals': emitEmbeddedGlobals(program, deferredLoadHashes),
+ 'nativeSupport': program.needsNativeSupport
+ ? emitNativeSupport(fragment)
+ : new js.EmptyStatement(),
+ 'invokeMain': fragment.invokeMain,
+ });
}
js.Expression emitDeferredFragment(DeferredFragment fragment,
- js.Expression deferredTypes,
- List<Holder> holders) {
+ js.Expression deferredTypes, List<Holder> holders) {
List<Holder> nonStaticStateHolders = holders
.where((Holder holder) => !holder.isStaticStateHolder)
.toList(growable: false);
@@ -484,29 +483,28 @@
Holder holder = nonStaticStateHolders[i];
updateHolderAssignments.add(js.js.statement(
'#holder = updateHolder(holdersList[#index], #holder)',
- {'index': js.number(i),
- 'holder': new js.VariableUse(holder.name)}));
+ {'index': js.number(i), 'holder': new js.VariableUse(holder.name)}));
}
// TODO(floitsch): don't just reference 'init'.
- return js.js(deferredBoilerplate,
- {'embeddedGlobalsObject': new js.Parameter('init'),
- 'staticState': new js.Parameter(namer.staticStateHolder),
- 'holders': emitHolders(holders, fragment),
- 'deferredHoldersList': new js.ArrayInitializer(nonStaticStateHolders
- .map((holder) => js.js("#", holder.name))
- .toList(growable: false)),
- 'updateHolders': new js.Block(updateHolderAssignments),
- 'prototypes': emitPrototypes(fragment),
- 'inheritance': emitInheritance(fragment),
- 'aliases': emitInstanceMethodAliases(fragment),
- 'tearOffs': emitInstallTearOffs(fragment),
- 'constants': emitConstants(fragment),
- 'staticNonFinalFields': emitStaticNonFinalFields(fragment),
- 'lazyStatics': emitLazilyInitializedStatics(fragment),
- 'types': deferredTypes,
- // TODO(floitsch): only call emitNativeSupport if we need native.
- 'nativeSupport': emitNativeSupport(fragment),
+ return js.js(deferredBoilerplate, {
+ 'embeddedGlobalsObject': new js.Parameter('init'),
+ 'staticState': new js.Parameter(namer.staticStateHolder),
+ 'holders': emitHolders(holders, fragment),
+ 'deferredHoldersList': new js.ArrayInitializer(nonStaticStateHolders
+ .map((holder) => js.js("#", holder.name))
+ .toList(growable: false)),
+ 'updateHolders': new js.Block(updateHolderAssignments),
+ 'prototypes': emitPrototypes(fragment),
+ 'inheritance': emitInheritance(fragment),
+ 'aliases': emitInstanceMethodAliases(fragment),
+ 'tearOffs': emitInstallTearOffs(fragment),
+ 'constants': emitConstants(fragment),
+ 'staticNonFinalFields': emitStaticNonFinalFields(fragment),
+ 'lazyStatics': emitLazilyInitializedStatics(fragment),
+ 'types': deferredTypes,
+ // TODO(floitsch): only call emitNativeSupport if we need native.
+ 'nativeSupport': emitNativeSupport(fragment),
});
}
@@ -557,22 +555,22 @@
// }
List<js.Statement> statements = [
- new js.ExpressionStatement(
- new js.VariableDeclarationList(holders
- .map(emitHolderInitialization)
- .toList())),
- js.js.statement('var holders = #', new js.ArrayInitializer(
- holders
+ new js.ExpressionStatement(new js.VariableDeclarationList(
+ holders.map(emitHolderInitialization).toList())),
+ js.js.statement(
+ 'var holders = #',
+ new js.ArrayInitializer(holders
.map((holder) => new js.VariableUse(holder.name))
- .toList(growable: false)))];
+ .toList(growable: false)))
+ ];
return new js.Block(statements);
}
/// Returns a reference to the constant holder, or the JS-literal `null`.
js.Expression buildConstantHolderReference(Program program) {
- Holder constantHolder = program.holders
- .firstWhere((Holder holder) => holder.isConstantsHolder,
- orElse: () => null);
+ Holder constantHolder = program.holders.firstWhere(
+ (Holder holder) => holder.isConstantsHolder,
+ orElse: () => null);
if (constantHolder == null) return new js.LiteralNull();
return new js.VariableUse(constantHolder.name);
}
@@ -626,8 +624,7 @@
List<js.Statement> assignments = fragment.libraries
.expand((Library library) => library.classes)
.map((Class cls) => js.js.statement(
- '#.prototype = #;',
- [classReference(cls), emitPrototype(cls)]))
+ '#.prototype = #;', [classReference(cls), emitPrototype(cls)]))
.toList(growable: false);
return new js.Block(assignments);
@@ -648,17 +645,23 @@
Iterable<Method> typeVariableReaderStubs = cls.typeVariableReaderStubs;
Iterable<Method> noSuchMethodStubs = cls.noSuchMethodStubs;
Iterable<Method> gettersSetters = generateGettersSetters(cls);
- Iterable<Method> allMethods =
- [methods, checkedSetters, isChecks, callStubs, typeVariableReaderStubs,
- noSuchMethodStubs, gettersSetters].expand((x) => x);
+ Iterable<Method> allMethods = [
+ methods,
+ checkedSetters,
+ isChecks,
+ callStubs,
+ typeVariableReaderStubs,
+ noSuchMethodStubs,
+ gettersSetters
+ ].expand((x) => x);
List<js.Property> properties = <js.Property>[];
if (cls.superclass == null) {
- properties.add(new js.Property(js.string("constructor"),
- classReference(cls)));
- properties.add(new js.Property(namer.operatorIs(cls.element),
- js.number(1)));
+ properties
+ .add(new js.Property(js.string("constructor"), classReference(cls)));
+ properties
+ .add(new js.Property(namer.operatorIs(cls.element), js.number(1)));
}
allMethods.forEach((Method method) {
@@ -747,7 +750,7 @@
properties[js.string(namer.requiredParameterField)] =
js.number(method.requiredParameterCount);
properties[js.string(namer.defaultValuesField)] =
- _encodeOptionalParameterDefaultValues(method);
+ _encodeOptionalParameterDefaultValues(method);
}
}
@@ -774,8 +777,8 @@
? new js.LiteralNull()
: classReference(superclass);
- inheritCalls.add(js.js('inherit(#, #)',
- [classReference(cls), superclassReference]));
+ inheritCalls.add(
+ js.js('inherit(#, #)', [classReference(cls), superclassReference]));
emittedClasses.add(cls);
}
@@ -809,11 +812,12 @@
for (Class cls in library.classes) {
for (InstanceMethod method in cls.methods) {
if (method.aliasName != null) {
- assignments.add(js.js.statement(
- '#.prototype.# = #.prototype.#',
- [classReference(cls), js.quoteName(method.aliasName),
- classReference(cls), js.quoteName(method.name)]));
-
+ assignments.add(js.js.statement('#.prototype.# = #.prototype.#', [
+ classReference(cls),
+ js.quoteName(method.aliasName),
+ classReference(cls),
+ js.quoteName(method.name)
+ ]));
}
}
}
@@ -842,11 +846,11 @@
for (String name in names) {
ConstantValue value = defaultValues[name];
- properties.add(new js.Property(js.string(name),
- generateConstantReference(value)));
+ properties.add(
+ new js.Property(js.string(name), generateConstantReference(value)));
}
- return js.js('function() { return #; }',
- new js.ObjectInitializer(properties));
+ return js.js(
+ 'function() { return #; }', new js.ObjectInitializer(properties));
}
}
@@ -899,7 +903,8 @@
_encodeOptionalParameterDefaultValues(method);
}
- return js.js.statement('''
+ return js.js.statement(
+ '''
installTearOff(#container, #getterName, #isStatic, #isIntercepted,
#requiredParameterCount, #optionalParameterDefaultValues,
#callNames, #funsOrNames, #funType)''',
@@ -951,15 +956,15 @@
// find the constants that don't have any dependency on other constants
// and create an object-literal with them (and assign it to the
// constant-holder variable).
- assignments.add(js.js.statement('#.# = #',
- [constant.holder.name,
- constant.name,
- constantEmitter.generate(constant.value)]));
+ assignments.add(js.js.statement('#.# = #', [
+ constant.holder.name,
+ constant.name,
+ constantEmitter.generate(constant.value)
+ ]));
}
return new js.Block(assignments);
}
-
/// Emits the static non-final fields section.
///
/// This section initializes all static non-final fields that don't require
@@ -973,8 +978,8 @@
// `$.x = $.y = $.z = null;`.
Iterable<js.Statement> statements = fields.map((StaticField field) {
assert(field.holder.isStaticStateHolder);
- return js.js.statement("#.# = #;",
- [field.holder.name, field.name, field.code]);
+ return js.js
+ .statement("#.# = #;", [field.holder.name, field.name, field.code]);
});
return new js.Block(statements.toList());
}
@@ -987,11 +992,12 @@
List<StaticField> fields = fragment.staticLazilyInitializedFields;
Iterable<js.Statement> statements = fields.map((StaticField field) {
assert(field.holder.isStaticStateHolder);
- return js.js.statement("lazy(#, #, #, #);",
- [field.holder.name,
- js.quoteName(field.name),
- js.quoteName(namer.deriveLazyInitializerName(field.name)),
- field.code]);
+ return js.js.statement("lazy(#, #, #, #);", [
+ field.holder.name,
+ js.quoteName(field.name),
+ js.quoteName(namer.deriveLazyInitializerName(field.name)),
+ field.code
+ ]);
});
return new js.Block(statements.toList());
@@ -1016,10 +1022,9 @@
"${fragment.outputFileName}.${ModelEmitter.deferredExtension}"));
}
js.ArrayInitializer fragmentHashes(List<Fragment> fragments) {
- return new js.ArrayInitializer(
- fragments
- .map((fragment) => deferredLoadHashes[fragment])
- .toList(growable: false));
+ return new js.ArrayInitializer(fragments
+ .map((fragment) => deferredLoadHashes[fragment])
+ .toList(growable: false));
}
List<js.Property> uris = new List<js.Property>(loadMap.length);
@@ -1033,38 +1038,41 @@
count++;
});
- globals.add(new js.Property(js.string(DEFERRED_LIBRARY_URIS),
- new js.ObjectInitializer(uris)));
- globals.add(new js.Property(js.string(DEFERRED_LIBRARY_HASHES),
- new js.ObjectInitializer(hashes)));
- globals.add(new js.Property(js.string(DEFERRED_INITIALIZED),
- js.js("Object.create(null)")));
+ globals.add(new js.Property(
+ js.string(DEFERRED_LIBRARY_URIS), new js.ObjectInitializer(uris)));
+ globals.add(new js.Property(
+ js.string(DEFERRED_LIBRARY_HASHES), new js.ObjectInitializer(hashes)));
+ globals.add(new js.Property(
+ js.string(DEFERRED_INITIALIZED), js.js("Object.create(null)")));
String deferredGlobal = ModelEmitter.deferredInitializersGlobal;
js.Expression isHunkLoadedFunction =
js.js("function(hash) { return !!$deferredGlobal[hash]; }");
- globals.add(new js.Property(js.string(IS_HUNK_LOADED),
- isHunkLoadedFunction));
+ globals
+ .add(new js.Property(js.string(IS_HUNK_LOADED), isHunkLoadedFunction));
- js.Expression isHunkInitializedFunction =
- js.js("function(hash) { return !!#deferredInitialized[hash]; }",
- {'deferredInitialized':
- generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED)});
- globals.add(new js.Property(js.string(IS_HUNK_INITIALIZED),
- isHunkInitializedFunction));
+ js.Expression isHunkInitializedFunction = js.js(
+ "function(hash) { return !!#deferredInitialized[hash]; }", {
+ 'deferredInitialized': generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED)
+ });
+ globals.add(new js.Property(
+ js.string(IS_HUNK_INITIALIZED), isHunkInitializedFunction));
/// See [emitEmbeddedGlobalsForDeferredLoading] for the format of the
/// deferred hunk.
- js.Expression initializeLoadedHunkFunction =
- js.js("""
+ js.Expression initializeLoadedHunkFunction = js.js(
+ """
function(hash) {
initializeDeferredHunk($deferredGlobal[hash]);
#deferredInitialized[hash] = true;
- }""", {'deferredInitialized':
- generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED)});
+ }""",
+ {
+ 'deferredInitialized':
+ generateEmbeddedGlobalAccess(DEFERRED_INITIALIZED)
+ });
- globals.add(new js.Property(js.string(INITIALIZE_LOADED_HUNK),
- initializeLoadedHunkFunction));
+ globals.add(new js.Property(
+ js.string(INITIALIZE_LOADED_HUNK), initializeLoadedHunkFunction));
return globals;
}
@@ -1079,18 +1087,23 @@
CoreClasses coreClasses = compiler.coreClasses;
// We want to keep the original names for the most common core classes when
// calling toString on them.
- List<ClassElement> nativeClassesNeedingUnmangledName =
- [coreClasses.intClass, coreClasses.doubleClass, coreClasses.numClass,
- coreClasses.stringClass, coreClasses.boolClass, coreClasses.nullClass,
- coreClasses.listClass];
+ List<ClassElement> nativeClassesNeedingUnmangledName = [
+ coreClasses.intClass,
+ coreClasses.doubleClass,
+ coreClasses.numClass,
+ coreClasses.stringClass,
+ coreClasses.boolClass,
+ coreClasses.nullClass,
+ coreClasses.listClass
+ ];
// TODO(floitsch): this should probably be on a per-fragment basis.
nativeClassesNeedingUnmangledName.forEach((element) {
- names.add(new js.Property(js.quoteName(namer.className(element)),
- js.string(element.name)));
+ names.add(new js.Property(
+ js.quoteName(namer.className(element)), js.string(element.name)));
});
- return new js.Property(js.string(MANGLED_GLOBAL_NAMES),
- new js.ObjectInitializer(names));
+ return new js.Property(
+ js.string(MANGLED_GLOBAL_NAMES), new js.ObjectInitializer(names));
}
/// Emits the [GET_TYPE_FROM_NAME] embedded global.
@@ -1122,8 +1135,7 @@
}
/// Emits all embedded globals.
- js.Statement emitEmbeddedGlobals(
- Program program,
+ js.Statement emitEmbeddedGlobals(Program program,
Map<DeferredFragment, _DeferredFragmentHash> deferredLoadHashes) {
List<js.Property> globals = <js.Property>[];
@@ -1133,8 +1145,8 @@
}
if (program.typeToInterceptorMap != null) {
- globals.add(new js.Property(js.string(TYPE_TO_INTERCEPTOR_MAP),
- program.typeToInterceptorMap));
+ globals.add(new js.Property(
+ js.string(TYPE_TO_INTERCEPTOR_MAP), program.typeToInterceptorMap));
}
if (program.hasIsolateSupport) {
@@ -1143,9 +1155,8 @@
// the current static state. Since we don't run multiple isolates in the
// same JavaScript context (except for testing) this shouldn't have any
// impact on real-world programs, though.
- globals.add(
- new js.Property(js.string(CREATE_NEW_ISOLATE),
- js.js('function () { return $staticStateName; }')));
+ globals.add(new js.Property(js.string(CREATE_NEW_ISOLATE),
+ js.js('function () { return $staticStateName; }')));
js.Expression nameToClosureFunction = js.js('''
// First fetch the static function. From there we can execute its
@@ -1155,12 +1166,11 @@
var getterFunction = staticFunction.$tearOffPropertyName;
return getterFunction();
}''');
- globals.add(new js.Property(js.string(STATIC_FUNCTION_NAME_TO_CLOSURE),
- nameToClosureFunction));
+ globals.add(new js.Property(
+ js.string(STATIC_FUNCTION_NAME_TO_CLOSURE), nameToClosureFunction));
- globals.add(
- new js.Property(js.string(CLASS_ID_EXTRACTOR),
- js.js('function(o) { return o.constructor.name; }')));
+ globals.add(new js.Property(js.string(CLASS_ID_EXTRACTOR),
+ js.js('function(o) { return o.constructor.name; }')));
js.Expression extractFieldsFunction = js.js('''
function(o) {
@@ -1178,8 +1188,8 @@
}
return result;
}''');
- globals.add(new js.Property(js.string(CLASS_FIELDS_EXTRACTOR),
- extractFieldsFunction));
+ globals.add(new js.Property(
+ js.string(CLASS_FIELDS_EXTRACTOR), extractFieldsFunction));
js.Expression createInstanceFromClassIdFunction = js.js('''
function(name) {
@@ -1188,7 +1198,7 @@
}
''');
globals.add(new js.Property(js.string(INSTANCE_FROM_CLASS_ID),
- createInstanceFromClassIdFunction));
+ createInstanceFromClassIdFunction));
js.Expression initializeEmptyInstanceFunction = js.js('''
function(name, o, fields) {
@@ -1205,7 +1215,7 @@
return o;
}''');
globals.add(new js.Property(js.string(INITIALIZE_EMPTY_INSTANCE),
- initializeEmptyInstanceFunction));
+ initializeEmptyInstanceFunction));
}
globals.add(emitMangledGlobalNames());
@@ -1215,11 +1225,10 @@
// therefore unused in this emitter.
List<js.Property> mangledNamesProperties = <js.Property>[];
program.symbolsMap.forEach((js.Name mangledName, String unmangledName) {
- mangledNamesProperties.add(
- new js.Property(mangledName, js.string(unmangledName)));
+ mangledNamesProperties
+ .add(new js.Property(mangledName, js.string(unmangledName)));
});
- globals.add(new js.Property(
- js.string(MANGLED_NAMES),
+ globals.add(new js.Property(js.string(MANGLED_NAMES),
new js.ObjectInitializer(mangledNamesProperties)));
globals.add(emitGetTypeFromName());
@@ -1227,10 +1236,9 @@
globals.addAll(emitMetadata(program));
if (program.needsNativeSupport) {
- globals.add(new js.Property(js.string(INTERCEPTORS_BY_TAG),
- new js.LiteralNull()));
- globals.add(new js.Property(js.string(LEAF_TAGS),
- new js.LiteralNull()));
+ globals.add(new js.Property(
+ js.string(INTERCEPTORS_BY_TAG), new js.LiteralNull()));
+ globals.add(new js.Property(js.string(LEAF_TAGS), new js.LiteralNull()));
}
js.ObjectInitializer globalsObject = new js.ObjectInitializer(globals);
@@ -1253,16 +1261,18 @@
if (fragment.isMainFragment &&
NativeGenerator.needsIsolateAffinityTagInitialization(backend)) {
statements.add(NativeGenerator.generateIsolateAffinityTagInitialization(
- backend,
- generateEmbeddedGlobalAccess,
- js.js("""
+ backend,
+ generateEmbeddedGlobalAccess,
+ js.js(
+ """
// On V8, the 'intern' function converts a string to a symbol, which
// makes property access much faster.
function (s) {
var o = {};
o[s] = 1;
return Object.keys(convertToFastObject(o))[0];
- }""", [])));
+ }""",
+ [])));
}
Map<String, js.Expression> interceptorsByTag = <String, js.Expression>{};
@@ -1286,10 +1296,11 @@
List<Class> subclasses = cls.nativeExtensions;
js.Expression value = js.string(cls.nativeNonLeafTags[0]);
for (Class subclass in subclasses) {
- value = js.js('#.# = #',
- [classReference(subclass),
- NATIVE_SUPERCLASS_TAG_NAME,
- js.string(cls.nativeNonLeafTags[0])]);
+ value = js.js('#.# = #', [
+ classReference(subclass),
+ NATIVE_SUPERCLASS_TAG_NAME,
+ js.string(cls.nativeNonLeafTags[0])
+ ]);
}
subclassAssignment = new js.ExpressionStatement(value);
}
@@ -1298,8 +1309,8 @@
}
statements.add(js.js.statement("setOrUpdateInterceptorsByTag(#);",
js.objectLiteral(interceptorsByTag)));
- statements.add(js.js.statement("setOrUpdateLeafTags(#);",
- js.objectLiteral(leafTags)));
+ statements.add(
+ js.js.statement("setOrUpdateLeafTags(#);", js.objectLiteral(leafTags)));
statements.add(subclassAssignment);
return new js.Block(statements);
diff --git a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
index 056345b..b3be363 100644
--- a/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/startup_emitter/model_emitter.dart
@@ -6,64 +6,50 @@
import 'dart:convert' show JsonEncoder;
-import 'package:js_runtime/shared/embedded_names.dart' show
- CLASS_FIELDS_EXTRACTOR,
- CLASS_ID_EXTRACTOR,
- CREATE_NEW_ISOLATE,
- DEFERRED_INITIALIZED,
- DEFERRED_LIBRARY_URIS,
- DEFERRED_LIBRARY_HASHES,
- GET_TYPE_FROM_NAME,
- INITIALIZE_EMPTY_INSTANCE,
- INITIALIZE_LOADED_HUNK,
- INSTANCE_FROM_CLASS_ID,
- INTERCEPTORS_BY_TAG,
- IS_HUNK_INITIALIZED,
- IS_HUNK_LOADED,
- LEAF_TAGS,
- MANGLED_GLOBAL_NAMES,
- MANGLED_NAMES,
- METADATA,
- NATIVE_SUPERCLASS_TAG_NAME,
- STATIC_FUNCTION_NAME_TO_CLOSURE,
- TYPE_TO_INTERCEPTOR_MAP,
- TYPES;
+import 'package:js_runtime/shared/embedded_names.dart'
+ show
+ CLASS_FIELDS_EXTRACTOR,
+ CLASS_ID_EXTRACTOR,
+ CREATE_NEW_ISOLATE,
+ DEFERRED_INITIALIZED,
+ DEFERRED_LIBRARY_URIS,
+ DEFERRED_LIBRARY_HASHES,
+ GET_TYPE_FROM_NAME,
+ INITIALIZE_EMPTY_INSTANCE,
+ INITIALIZE_LOADED_HUNK,
+ INSTANCE_FROM_CLASS_ID,
+ INTERCEPTORS_BY_TAG,
+ IS_HUNK_INITIALIZED,
+ IS_HUNK_LOADED,
+ LEAF_TAGS,
+ MANGLED_GLOBAL_NAMES,
+ MANGLED_NAMES,
+ METADATA,
+ NATIVE_SUPERCLASS_TAG_NAME,
+ STATIC_FUNCTION_NAME_TO_CLOSURE,
+ TYPE_TO_INTERCEPTOR_MAP,
+ TYPES;
import '../../common.dart';
-import '../../constants/values.dart' show
- ConstantValue,
- FunctionConstantValue;
-import '../../compiler.dart' show
- Compiler;
-import '../../core_types.dart' show
- CoreClasses;
-import '../../elements/elements.dart' show
- ClassElement,
- FunctionElement;
-import '../../hash/sha1.dart' show
- Hasher;
+import '../../constants/values.dart' show ConstantValue, FunctionConstantValue;
+import '../../compiler.dart' show Compiler;
+import '../../core_types.dart' show CoreClasses;
+import '../../elements/elements.dart' show ClassElement, FunctionElement;
+import '../../hash/sha1.dart' show Hasher;
import '../../io/code_output.dart';
-import '../../io/line_column_provider.dart' show
- LineColumnCollector,
- LineColumnProvider;
-import '../../io/source_map_builder.dart' show
- SourceMapBuilder;
+import '../../io/line_column_provider.dart'
+ show LineColumnCollector, LineColumnProvider;
+import '../../io/source_map_builder.dart' show SourceMapBuilder;
import '../../js/js.dart' as js;
-import '../../js_backend/js_backend.dart' show
- JavaScriptBackend,
- Namer,
- ConstantEmitter;
-import '../../util/uri_extras.dart' show
- relativize;
+import '../../js_backend/js_backend.dart'
+ show JavaScriptBackend, Namer, ConstantEmitter;
+import '../../util/uri_extras.dart' show relativize;
import '../constant_ordering.dart' show deepCompareConstants;
import '../headers.dart';
-import '../js_emitter.dart' show
- NativeEmitter;
+import '../js_emitter.dart' show NativeEmitter;
-import '../js_emitter.dart' show
- buildTearOffCode,
- NativeGenerator;
+import '../js_emitter.dart' show buildTearOffCode, NativeGenerator;
import '../model.dart';
part 'deferred_fragment_hash.dart';
@@ -79,7 +65,6 @@
// The full code that is written to each hunk part-file.
final Map<Fragment, CodeOutput> outputBuffers = <Fragment, CodeOutput>{};
-
JavaScriptBackend get backend => compiler.backend;
/// For deferred loading we communicate the initializers via this global var.
@@ -92,12 +77,11 @@
static const String typeNameProperty = r"builtin$cls";
ModelEmitter(Compiler compiler, Namer namer, this.nativeEmitter,
- this.shouldGenerateSourceMap)
+ this.shouldGenerateSourceMap)
: this.compiler = compiler,
this.namer = namer {
this.constantEmitter = new ConstantEmitter(
- compiler, namer, this.generateConstantReference,
- constantListGenerator);
+ compiler, namer, this.generateConstantReference, constantListGenerator);
}
DiagnosticReporter get reporter => compiler.reporter;
@@ -117,9 +101,9 @@
}
bool isConstantInlinedOrAlreadyEmitted(ConstantValue constant) {
- if (constant.isFunction) return true; // Already emitted.
- if (constant.isPrimitive) return true; // Inlined.
- if (constant.isDummy) return true; // Inlined.
+ if (constant.isFunction) return true; // Already emitted.
+ if (constant.isPrimitive) return true; // Inlined.
+ if (constant.isDummy) return true; // Inlined.
return false;
}
@@ -162,8 +146,8 @@
if (isConstantInlinedOrAlreadyEmitted(value)) {
return constantEmitter.generate(value);
}
- return js.js('#.#', [namer.globalObjectForConstant(value),
- namer.constantName(value)]);
+ return js.js('#.#',
+ [namer.globalObjectForConstant(value), namer.constantName(value)]);
}
int emitProgram(Program program) {
@@ -175,7 +159,7 @@
new FragmentEmitter(compiler, namer, backend, constantEmitter, this);
Map<DeferredFragment, _DeferredFragmentHash> deferredHashTokens =
- new Map<DeferredFragment, _DeferredFragmentHash>();
+ new Map<DeferredFragment, _DeferredFragmentHash>();
for (DeferredFragment fragment in deferredFragments) {
deferredHashTokens[fragment] = new _DeferredFragmentHash(fragment);
}
@@ -190,7 +174,7 @@
js.Expression types =
program.metadataTypesForOutputUnit(fragment.outputUnit);
deferredFragmentsCode[fragment] = fragmentEmitter.emitDeferredFragment(
- fragment, types, program.holders);
+ fragment, types, program.holders);
}
js.TokenCounter counter = new js.TokenCounter();
@@ -204,18 +188,16 @@
// Now that we have written the deferred hunks, we can update the hash
// tokens in the main-fragment.
- deferredHashTokens.forEach((DeferredFragment key,
- _DeferredFragmentHash token) {
+ deferredHashTokens
+ .forEach((DeferredFragment key, _DeferredFragmentHash token) {
token.setHash(hunkHashes[key]);
});
writeMainFragment(mainFragment, mainCode,
- isSplit: program.deferredFragments.isNotEmpty);
+ isSplit: program.deferredFragments.isNotEmpty);
- if (backend.requiresPreamble &&
- !backend.htmlLibraryIsLoaded) {
- reporter.reportHintMessage(
- NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
+ if (backend.requiresPreamble && !backend.htmlLibraryIsLoaded) {
+ reporter.reportHintMessage(NO_LOCATION_SPANNABLE, MessageKind.PREAMBLE);
}
if (compiler.options.deferredMapUri != null) {
@@ -252,7 +234,8 @@
}
js.Statement buildDeferredInitializerGlobal() {
- return js.js.statement('self.#deferredInitializers = '
+ return js.js.statement(
+ 'self.#deferredInitializers = '
'self.#deferredInitializers || Object.create(null);',
{'deferredInitializers': deferredInitializersGlobal});
}
@@ -270,18 +253,18 @@
}
CodeOutput mainOutput = new StreamCodeOutput(
- compiler.outputProvider('', 'js'),
- codeOutputListeners);
+ compiler.outputProvider('', 'js'), codeOutputListeners);
outputBuffers[fragment] = mainOutput;
js.Program program = new js.Program([
- buildGeneratedBy(),
- new js.Comment(HOOKS_API_USAGE),
- isSplit ? buildDeferredInitializerGlobal() : new js.Block.empty(),
- code]);
+ buildGeneratedBy(),
+ new js.Comment(HOOKS_API_USAGE),
+ isSplit ? buildDeferredInitializerGlobal() : new js.Block.empty(),
+ code
+ ]);
- mainOutput.addBuffer(js.createCodeBuffer(program, compiler,
- monitor: compiler.dumpInfoTask));
+ mainOutput.addBuffer(
+ js.createCodeBuffer(program, compiler, monitor: compiler.dumpInfoTask));
if (shouldGenerateSourceMap) {
mainOutput.add(generateSourceMapTag(
@@ -330,12 +313,13 @@
// deferredInitializer[<hash>] = deferredInitializer.current;
js.Program program = new js.Program([
- buildGeneratedBy(),
- buildDeferredInitializerGlobal(),
- js.js.statement('$deferredInitializersGlobal.current = #', code)]);
+ buildGeneratedBy(),
+ buildDeferredInitializerGlobal(),
+ js.js.statement('$deferredInitializersGlobal.current = #', code)
+ ]);
- output.addBuffer(js.createCodeBuffer(program, compiler,
- monitor: compiler.dumpInfoTask));
+ output.addBuffer(
+ js.createCodeBuffer(program, compiler, monitor: compiler.dumpInfoTask));
// Make a unique hash of the code (before the sourcemaps are added)
// This will be used to retrieve the initializing function from the global
@@ -357,15 +341,15 @@
String mapFileName = hunkFileName + ".map";
List<String> mapSegments = sourceMapUri.pathSegments.toList();
mapSegments[mapSegments.length - 1] = mapFileName;
- mapUri = compiler.options.sourceMapUri
- .replace(pathSegments: mapSegments);
+ mapUri =
+ compiler.options.sourceMapUri.replace(pathSegments: mapSegments);
}
if (outputUri != null) {
List<String> partSegments = outputUri.pathSegments.toList();
partSegments[partSegments.length - 1] = hunkFileName;
- partUri = compiler.options.outputUri
- .replace(pathSegments: partSegments);
+ partUri =
+ compiler.options.outputUri.replace(pathSegments: partSegments);
}
output.add(generateSourceMapTag(mapUri, partUri));
@@ -389,17 +373,14 @@
return '';
}
-
- void outputSourceMap(CodeOutput output,
- LineColumnProvider lineColumnProvider,
- String name,
- [Uri sourceMapUri,
- Uri fileUri]) {
+ void outputSourceMap(
+ CodeOutput output, LineColumnProvider lineColumnProvider, String name,
+ [Uri sourceMapUri, Uri fileUri]) {
if (!shouldGenerateSourceMap) return;
// Create a source file for the compilation output. This allows using
// [:getLine:] to transform offsets to line numbers in [SourceMapBuilder].
SourceMapBuilder sourceMapBuilder =
- new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
+ new SourceMapBuilder(sourceMapUri, fileUri, lineColumnProvider);
output.forEachSourceLocation(sourceMapBuilder.addMapping);
String sourceMap = sourceMapBuilder.build();
compiler.outputProvider(name, 'js.map')
@@ -419,7 +400,7 @@
"needed for a given deferred library import.";
mapping.addAll(compiler.deferredLoadTask.computeDeferredMap());
compiler.outputProvider(
- compiler.options.deferredMapUri.path, 'deferred_map')
+ compiler.options.deferredMapUri.path, 'deferred_map')
..add(const JsonEncoder.withIndent(" ").convert(mapping))
..close();
}
diff --git a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
index 6f64a81..0a6e271 100644
--- a/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
+++ b/pkg/compiler/lib/src/js_emitter/type_test_registry.dart
@@ -79,8 +79,7 @@
// TODO(karlklose): merge this case with 2 when unifying argument and
// object checks.
RuntimeTypes rti = backend.rti;
- rti.getRequiredArgumentClasses(backend)
- .forEach(addClassWithSuperclasses);
+ rti.getRequiredArgumentClasses(backend).forEach(addClassWithSuperclasses);
// 2. Add classes that are referenced by substitutions in object checks and
// their superclasses.
@@ -106,8 +105,8 @@
return false;
} else if (function.isInstanceMember) {
if (!function.enclosingClass.isClosure) {
- return compiler.codegenWorld.hasInvokedGetter(
- function, compiler.world);
+ return compiler.codegenWorld
+ .hasInvokedGetter(function, compiler.world);
}
}
return false;
@@ -144,8 +143,8 @@
void computeRequiredTypeChecks() {
assert(checkedClasses == null && checkedFunctionTypes == null);
- backend.rti.addImplicitChecks(compiler.codegenWorld,
- classesUsingTypeVariableTests);
+ backend.rti.addImplicitChecks(
+ compiler.codegenWorld, classesUsingTypeVariableTests);
checkedClasses = new Set<ClassElement>();
checkedFunctionTypes = new Set<FunctionType>();
diff --git a/pkg/compiler/lib/src/library_loader.dart b/pkg/compiler/lib/src/library_loader.dart
index e6eaf88..b666bfa 100644
--- a/pkg/compiler/lib/src/library_loader.dart
+++ b/pkg/compiler/lib/src/library_loader.dart
@@ -7,36 +7,33 @@
import 'dart:async';
import 'common.dart';
-import 'common/names.dart' show
- Uris;
-import 'common/tasks.dart' show
- CompilerTask;
-import 'compiler.dart' show
- Compiler;
-import 'elements/elements.dart' show
- CompilationUnitElement,
- Element,
- ImportElement,
- ExportElement,
- LibraryElement,
- PrefixElement;
-import 'elements/modelx.dart' show
- CompilationUnitElementX,
- DeferredLoaderGetterElementX,
- ErroneousElementX,
- ExportElementX,
- ImportElementX,
- LibraryElementX,
- LibraryDependencyElementX,
- PrefixElementX,
- SyntheticImportElement;
+import 'common/names.dart' show Uris;
+import 'common/tasks.dart' show CompilerTask;
+import 'compiler.dart' show Compiler;
+import 'elements/elements.dart'
+ show
+ CompilationUnitElement,
+ Element,
+ ImportElement,
+ ExportElement,
+ LibraryElement,
+ PrefixElement;
+import 'elements/modelx.dart'
+ show
+ CompilationUnitElementX,
+ DeferredLoaderGetterElementX,
+ ErroneousElementX,
+ ExportElementX,
+ ImportElementX,
+ LibraryElementX,
+ LibraryDependencyElementX,
+ PrefixElementX,
+ SyntheticImportElement;
import 'environment.dart';
import 'script.dart';
import 'serialization/serialization.dart' show LibraryDeserializer;
import 'tree/tree.dart';
-import 'util/util.dart' show
- Link,
- LinkBuilder;
+import 'util/util.dart' show Link, LinkBuilder;
/**
* [CompilerTask] for loading libraries and setting up the import/export scopes.
@@ -133,7 +130,8 @@
*
*/
abstract class LibraryLoaderTask implements CompilerTask {
- factory LibraryLoaderTask(Compiler compiler,
+ factory LibraryLoaderTask(
+ Compiler compiler,
ResolvedUriTranslator uriTranslator,
ScriptLoader scriptLoader,
ElementScanner scriptScanner,
@@ -158,8 +156,7 @@
/// If [skipFileWithPartOfTag] is `true`, `null` is returned if the
/// compilation unit for [resolvedUri] contains a `part of` tag. This is only
/// used for analysis through [Compiler.analyzeUri].
- Future<LibraryElement> loadLibrary(
- Uri resolvedUri,
+ Future<LibraryElement> loadLibrary(Uri resolvedUri,
{bool skipFileWithPartOfTag: false});
/// Reset the library loader task to prepare for compilation. If provided,
@@ -293,8 +290,7 @@
/// conditional imports.
final Environment environment;
- _LibraryLoaderTask(
- Compiler compiler, this.uriTranslator, this.scriptLoader,
+ _LibraryLoaderTask(Compiler compiler, this.uriTranslator, this.scriptLoader,
this.scanner, this.deserializer, this.listener, this.environment)
// TODO(sigmund): make measurements separate from compiler
: super(compiler);
@@ -355,10 +351,11 @@
compiler.reuseLibraryTask.measure(
() => libraryCanonicalUriMap.values.map(wrapper).toList());
- return Future.wait(reusedLibrariesFuture).then(
- (List<LibraryElement> reusedLibraries) {
- resetImplementation(reusedLibraries.where((e) => e != null));
- });
+ return Future
+ .wait(reusedLibrariesFuture)
+ .then((List<LibraryElement> reusedLibraries) {
+ resetImplementation(reusedLibraries.where((e) => e != null));
+ });
});
}
@@ -383,7 +380,7 @@
// loading of a library cluster.
currentHandler = new LibraryDependencyHandler(this);
return createLibrary(currentHandler, null, resolvedUri,
- skipFileWithPartOfTag: skipFileWithPartOfTag)
+ skipFileWithPartOfTag: skipFileWithPartOfTag)
.then((LibraryElement library) {
if (library == null) {
currentHandler = null;
@@ -392,13 +389,11 @@
return reporter.withCurrentElement(library, () {
return measure(() {
currentHandler.computeExports();
- LoadedLibraries loadedLibraries = new _LoadedLibraries(
- library,
- currentHandler.newLibraries,
- currentHandler.nodeMap,
- this);
+ LoadedLibraries loadedLibraries = new _LoadedLibraries(library,
+ currentHandler.newLibraries, currentHandler.nodeMap, this);
currentHandler = null;
- return listener.onLibrariesLoaded(loadedLibraries)
+ return listener
+ .onLibrariesLoaded(loadedLibraries)
.then((_) => library);
});
});
@@ -412,8 +407,8 @@
* The imported/exported libraries are loaded and processed recursively but
* the import/export scopes are not set up.
*/
- Future processLibraryTags(LibraryDependencyHandler handler,
- LibraryElementX library) {
+ Future processLibraryTags(
+ LibraryDependencyHandler handler, LibraryElementX library) {
TagState tagState = new TagState();
bool importsDartCore = false;
@@ -423,7 +418,6 @@
return Future.forEach(library.tags, (LibraryTag tag) {
return reporter.withCurrentElement(library, () {
-
Uri computeUri(LibraryDependency node) {
StringNode uriNode = node.uri;
if (node.conditionalUris != null) {
@@ -444,8 +438,7 @@
return Uri.parse(tagUriString);
} on FormatException {
reporter.reportErrorMessage(
- node.uri,
- MessageKind.INVALID_URI, {'uri': tagUriString});
+ node.uri, MessageKind.INVALID_URI, {'uri': tagUriString});
return null;
}
}
@@ -504,7 +497,8 @@
if (!importsDartCore && library.canonicalUri != Uris.dart_core) {
return createLibrary(handler, null, Uris.dart_core)
.then((LibraryElement coreLibrary) {
- handler.registerDependency(library,
+ handler.registerDependency(
+ library,
new SyntheticImportElement(
library.entryCompilationUnit, Uris.dart_core),
coreLibrary);
@@ -531,36 +525,31 @@
if (library.hasLibraryName) {
reporter.withCurrentElement(library, () {
reporter.reportWarningMessage(
- library,
- MessageKind.DUPLICATED_LIBRARY_RESOURCE,
- {'libraryName': library.libraryName,
- 'resourceUri': resourceUri,
- 'canonicalUri1': library.canonicalUri,
- 'canonicalUri2': existing.canonicalUri});
+ library, MessageKind.DUPLICATED_LIBRARY_RESOURCE, {
+ 'libraryName': library.libraryName,
+ 'resourceUri': resourceUri,
+ 'canonicalUri1': library.canonicalUri,
+ 'canonicalUri2': existing.canonicalUri
+ });
});
} else {
- reporter.reportHintMessage(
- library,
- MessageKind.DUPLICATED_RESOURCE,
- {'resourceUri': resourceUri,
- 'canonicalUri1': library.canonicalUri,
- 'canonicalUri2': existing.canonicalUri});
+ reporter.reportHintMessage(library, MessageKind.DUPLICATED_RESOURCE, {
+ 'resourceUri': resourceUri,
+ 'canonicalUri1': library.canonicalUri,
+ 'canonicalUri2': existing.canonicalUri
+ });
}
} else if (library.hasLibraryName) {
String name = library.libraryName;
existing = libraryNames.putIfAbsent(name, () => library);
if (!identical(existing, library)) {
reporter.withCurrentElement(library, () {
- reporter.reportWarningMessage(
- library,
- MessageKind.DUPLICATED_LIBRARY_NAME,
- {'libraryName': name});
+ reporter.reportWarningMessage(library,
+ MessageKind.DUPLICATED_LIBRARY_NAME, {'libraryName': name});
});
reporter.withCurrentElement(existing, () {
- reporter.reportWarningMessage(
- existing,
- MessageKind.DUPLICATED_LIBRARY_NAME,
- {'libraryName': name});
+ reporter.reportWarningMessage(existing,
+ MessageKind.DUPLICATED_LIBRARY_NAME, {'libraryName': name});
});
}
}
@@ -588,21 +577,18 @@
* export scope. If the tag does not contain a valid URI, then its dependency
* is not registered in [handler].
*/
- Future<Null> registerLibraryFromImportExport(
- LibraryDependencyHandler handler,
- LibraryElement library,
- LibraryDependencyElementX libraryDependency) {
+ Future<Null> registerLibraryFromImportExport(LibraryDependencyHandler handler,
+ LibraryElement library, LibraryDependencyElementX libraryDependency) {
Uri base = library.canonicalUri;
Uri resolvedUri = base.resolveUri(libraryDependency.uri);
return createLibrary(handler, library, resolvedUri, node: libraryDependency)
.then((LibraryElement loadedLibrary) {
- if (loadedLibrary == null) return;
- reporter.withCurrentElement(library, () {
- libraryDependency.libraryDependency = loadedLibrary;
- handler.registerDependency(
- library, libraryDependency, loadedLibrary);
- });
- });
+ if (loadedLibrary == null) return;
+ reporter.withCurrentElement(library, () {
+ libraryDependency.libraryDependency = loadedLibrary;
+ handler.registerDependency(library, libraryDependency, loadedLibrary);
+ });
+ });
}
/// Loads the deserialized [library] with the [handler].
@@ -610,8 +596,7 @@
/// All libraries imported or exported transitively from [library] will be
/// loaded as well.
Future<LibraryElement> loadDeserializedLibrary(
- LibraryDependencyHandler handler,
- LibraryElement library) {
+ LibraryDependencyHandler handler, LibraryElement library) {
libraryCanonicalUriMap[library.canonicalUri] = library;
handler.registerNewLibrary(library);
return listener.onLibraryScanned(library, handler).then((_) {
@@ -625,8 +610,8 @@
});
}
- Future<Script> _readScript(Spannable spannable,
- Uri readableUri, Uri resolvedUri) {
+ Future<Script> _readScript(
+ Spannable spannable, Uri readableUri, Uri resolvedUri) {
if (readableUri == null) {
return new Future.value(new Script.synthetic(resolvedUri));
} else {
@@ -640,66 +625,65 @@
*
* If a new library is created, the [handler] is notified.
*/
- Future<LibraryElement> createLibrary(
- LibraryDependencyHandler handler,
- LibraryElement importingLibrary,
- Uri resolvedUri,
- {Spannable node,
- bool skipFileWithPartOfTag: false}) {
+ Future<LibraryElement> createLibrary(LibraryDependencyHandler handler,
+ LibraryElement importingLibrary, Uri resolvedUri,
+ {Spannable node, bool skipFileWithPartOfTag: false}) {
Uri readableUri =
uriTranslator.translate(importingLibrary, resolvedUri, node);
LibraryElement library = libraryCanonicalUriMap[resolvedUri];
if (library != null) {
return new Future.value(library);
}
- library = deserializer.readLibrary(resolvedUri);
- if (library != null) {
- return loadDeserializedLibrary(handler, library);
- }
- return reporter.withCurrentElement(importingLibrary, () {
- return _readScript(node, readableUri, resolvedUri).then((Script script) {
- if (script == null) return null;
- LibraryElement element =
- createLibrarySync(handler, script, resolvedUri);
- CompilationUnitElementX compilationUnit = element.entryCompilationUnit;
- if (compilationUnit.partTag != null) {
- if (skipFileWithPartOfTag) {
- // TODO(johnniwinther): Avoid calling [listener.onLibraryCreated]
- // for this library.
- libraryCanonicalUriMap.remove(resolvedUri);
- return null;
+ return deserializer.readLibrary(resolvedUri).then((LibraryElement library) {
+ if (library != null) {
+ return loadDeserializedLibrary(handler, library);
+ }
+ return reporter.withCurrentElement(importingLibrary, () {
+ return _readScript(node, readableUri, resolvedUri)
+ .then((Script script) {
+ if (script == null) return null;
+ LibraryElement element =
+ createLibrarySync(handler, script, resolvedUri);
+ CompilationUnitElementX compilationUnit =
+ element.entryCompilationUnit;
+ if (compilationUnit.partTag != null) {
+ if (skipFileWithPartOfTag) {
+ // TODO(johnniwinther): Avoid calling [listener.onLibraryCreated]
+ // for this library.
+ libraryCanonicalUriMap.remove(resolvedUri);
+ return null;
+ }
+ if (importingLibrary == null) {
+ DiagnosticMessage error = reporter.withCurrentElement(
+ compilationUnit,
+ () => reporter.createMessage(
+ compilationUnit.partTag, MessageKind.MAIN_HAS_PART_OF));
+ reporter.reportError(error);
+ } else {
+ DiagnosticMessage error = reporter.withCurrentElement(
+ compilationUnit,
+ () => reporter.createMessage(
+ compilationUnit.partTag, MessageKind.IMPORT_PART_OF));
+ DiagnosticMessage info = reporter.withCurrentElement(
+ importingLibrary,
+ () => reporter.createMessage(
+ node, MessageKind.IMPORT_PART_OF_HERE));
+ reporter.reportError(error, [info]);
+ }
}
- if (importingLibrary == null) {
- DiagnosticMessage error = reporter.withCurrentElement(
- compilationUnit,
- () => reporter.createMessage(
- compilationUnit.partTag, MessageKind.MAIN_HAS_PART_OF));
- reporter.reportError(error);
- } else {
- DiagnosticMessage error = reporter.withCurrentElement(
- compilationUnit,
- () => reporter.createMessage(
- compilationUnit.partTag, MessageKind.IMPORT_PART_OF));
- DiagnosticMessage info = reporter.withCurrentElement(
- importingLibrary,
- () => reporter.createMessage(
- node,
- MessageKind.IMPORT_PART_OF_HERE));
- reporter.reportError(error, [info]);
- }
- }
- return processLibraryTags(handler, element).then((_) {
- reporter.withCurrentElement(element, () {
- handler.registerLibraryExports(element);
+ return processLibraryTags(handler, element).then((_) {
+ reporter.withCurrentElement(element, () {
+ handler.registerLibraryExports(element);
+ });
+ return element;
});
- return element;
});
});
});
}
- LibraryElement createLibrarySync(LibraryDependencyHandler handler,
- Script script, Uri resolvedUri) {
+ LibraryElement createLibrarySync(
+ LibraryDependencyHandler handler, Script script, Uri resolvedUri) {
LibraryElement element = new LibraryElementX(script, resolvedUri);
return reporter.withCurrentElement(element, () {
if (handler != null) {
@@ -723,7 +707,6 @@
}
}
-
/// A state machine for checking script tags come in the correct order.
class TagState {
/// Initial state.
@@ -745,11 +728,11 @@
/// Encodes transition function for state machine.
static const List<int> NEXT = const <int>[
- NO_TAG_SEEN,
- AFTER_LIBRARY_DECLARATION, // Only one library tag is allowed.
- IMPORT_OR_EXPORT,
- IMPORT_OR_EXPORT,
- PART,
+ NO_TAG_SEEN,
+ AFTER_LIBRARY_DECLARATION, // Only one library tag is allowed.
+ IMPORT_OR_EXPORT,
+ IMPORT_OR_EXPORT,
+ PART,
];
int tagState = TagState.NO_TAG_SEEN;
@@ -804,14 +787,12 @@
/**
* Imports the library into the [importingLibrary].
*/
- void importLibrary(DiagnosticReporter reporter,
- LibraryElementX importingLibrary) {
- assert(invariant(importingLibrary,
- importedLibrary.exportsHandled,
- message: 'Exports not handled on $importedLibrary'));
+ void importLibrary(
+ DiagnosticReporter reporter, LibraryElementX importingLibrary) {
+ assert(invariant(importingLibrary, importedLibrary.exportsHandled,
+ message: 'Exports not handled on $importedLibrary'));
Import tag = import.node;
- CombinatorFilter combinatorFilter =
- new CombinatorFilter.fromTag(tag);
+ CombinatorFilter combinatorFilter = new CombinatorFilter.fromTag(tag);
if (tag != null && tag.prefix != null) {
String prefix = tag.prefix.source;
Element existingElement = importingLibrary.find(prefix);
@@ -833,8 +814,7 @@
import.prefix = prefixElement;
if (prefixElement.isDeferred) {
prefixElement.addImport(
- new DeferredLoaderGetterElementX(prefixElement),
- import, reporter);
+ new DeferredLoaderGetterElementX(prefixElement), import, reporter);
}
} else {
importedLibrary.forEachExport((Element element) {
@@ -887,7 +867,6 @@
final int hashCode = ++hashCodeCounter;
static int hashCodeCounter = 0;
-
/**
* A linked list of the import tags that import [library] mapped to the
* corresponding libraries. This is used to propagate exports into imports
@@ -929,8 +908,8 @@
* Registers that the library of this node imports [importLibrary] through the
* [import] tag.
*/
- void registerImportDependency(ImportElementX import,
- LibraryElement importedLibrary) {
+ void registerImportDependency(
+ ImportElementX import, LibraryElement importedLibrary) {
imports = imports.prepend(new ImportLink(import, importedLibrary));
}
@@ -938,8 +917,8 @@
* Registers that the library of this node is exported by
* [exportingLibraryNode] through the [export] tag.
*/
- void registerExportDependency(ExportElementX export,
- LibraryDependencyNode exportingLibraryNode) {
+ void registerExportDependency(
+ ExportElementX export, LibraryDependencyNode exportingLibraryNode) {
// Register the exported library in the exporting library node.
exportingLibraryNode.exports =
exportingLibraryNode.exports.prepend(library);
@@ -965,16 +944,16 @@
///
/// Additionally, check that all names in the show/hide combinators are in the
/// export scope of [exportedLibraryElement].
- void registerHandledExports(DiagnosticReporter reporter,
- LibraryElement exportedLibraryElement,
- ExportElementX export,
- CombinatorFilter filter) {
+ void registerHandledExports(
+ DiagnosticReporter reporter,
+ LibraryElement exportedLibraryElement,
+ ExportElementX export,
+ CombinatorFilter filter) {
assert(invariant(library, exportedLibraryElement.exportsHandled));
exportedLibraryElement.forEachExport((Element exportedElement) {
if (!filter.exclude(exportedElement)) {
- Link<ExportElement> exports =
- pendingExportMap.putIfAbsent(exportedElement,
- () => const Link<ExportElement>());
+ Link<ExportElement> exports = pendingExportMap.putIfAbsent(
+ exportedElement, () => const Link<ExportElement>());
pendingExportMap[exportedElement] = exports.prepend(export);
}
});
@@ -1015,46 +994,38 @@
* Adds [element] to the export scope for this node. If the [element] name
* is a duplicate, an error element is inserted into the export scope.
*/
- Element addElementToExportScope(
- DiagnosticReporter reporter,
- Element element,
+ Element addElementToExportScope(DiagnosticReporter reporter, Element element,
Link<ExportElement> exports) {
String name = element.name;
DiagnosticMessage error;
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
void createDuplicateExportMessage(
- Element duplicate,
- Link<ExportElement> duplicateExports) {
+ Element duplicate, Link<ExportElement> duplicateExports) {
assert(invariant(library, !duplicateExports.isEmpty,
message: "No export for $duplicate from ${duplicate.library} "
- "in $library."));
+ "in $library."));
reporter.withCurrentElement(library, () {
for (ExportElement export in duplicateExports) {
if (error == null) {
error = reporter.createMessage(
- export,
- MessageKind.DUPLICATE_EXPORT,
- {'name': name});
+ export, MessageKind.DUPLICATE_EXPORT, {'name': name});
} else {
infos.add(reporter.createMessage(
- export,
- MessageKind.DUPLICATE_EXPORT_CONT,
- {'name': name}));
+ export, MessageKind.DUPLICATE_EXPORT_CONT, {'name': name}));
}
}
});
}
void createDuplicateExportDeclMessage(
- Element duplicate,
- Link<ExportElement> duplicateExports) {
+ Element duplicate, Link<ExportElement> duplicateExports) {
assert(invariant(library, !duplicateExports.isEmpty,
message: "No export for $duplicate from ${duplicate.library} "
- "in $library."));
+ "in $library."));
infos.add(reporter.createMessage(
duplicate,
- MessageKind.DUPLICATE_EXPORT_DECL,
+ MessageKind.DUPLICATE_EXPORT_DECL,
{'name': name, 'uriString': duplicateExports.head.uri}));
}
@@ -1140,10 +1111,8 @@
/// Check that all names in the show/hide combinators of [tag] are in the
/// export scope of [library].
- void checkLibraryDependency(
- DiagnosticReporter reporter,
- LibraryDependency tag,
- LibraryElement library) {
+ void checkLibraryDependency(DiagnosticReporter reporter,
+ LibraryDependency tag, LibraryElement library) {
if (tag == null || tag.combinators == null) return;
for (Combinator combinator in tag.combinators) {
for (Identifier identifier in combinator.identifiers) {
@@ -1158,23 +1127,16 @@
// which case you shouldn't remove the combinator.
continue;
}
- reporter.reportHintMessage(
- identifier,
- MessageKind.EMPTY_HIDE,
- {'uri': library.canonicalUri,
- 'name': name});
+ reporter.reportHintMessage(identifier, MessageKind.EMPTY_HIDE,
+ {'uri': library.canonicalUri, 'name': name});
} else {
- reporter.reportHintMessage(
- identifier,
- MessageKind.EMPTY_SHOW,
- {'uri': library.canonicalUri,
- 'name': name});
+ reporter.reportHintMessage(identifier, MessageKind.EMPTY_SHOW,
+ {'uri': library.canonicalUri, 'name': name});
}
}
}
}
}
-
}
/**
@@ -1228,7 +1190,7 @@
tasks[node] = pendingExports;
});
tasks.forEach((LibraryDependencyNode node,
- Map<Element, Link<ExportElement>> pendingExports) {
+ Map<Element, Link<ExportElement>> pendingExports) {
pendingExports.forEach((Element element, Link<ExportElement> exports) {
element = node.addElementToExportScope(reporter, element, exports);
if (node.propagateElement(element)) {
@@ -1259,9 +1221,10 @@
/// Registers that [library] depends on [loadedLibrary] through
/// [libraryDependency].
- void registerDependency(LibraryElementX library,
- LibraryDependencyElementX libraryDependency,
- LibraryElement loadedLibrary) {
+ void registerDependency(
+ LibraryElementX library,
+ LibraryDependencyElementX libraryDependency,
+ LibraryElement loadedLibrary) {
if (libraryDependency.isExport) {
// [loadedLibrary] is exported by [library].
LibraryDependencyNode exportingNode = nodeMap[library];
@@ -1336,7 +1299,7 @@
/// [callback] is called once for each chain of imports leading to [uri] until
/// [callback] returns `false`.
void forEachImportChain(Uri uri,
- {bool callback(Link<Uri> importChainReversed)});
+ {bool callback(Link<Uri> importChainReversed)});
}
class _LoadedLibraries implements LoadedLibraries {
@@ -1345,11 +1308,8 @@
final Map<Uri, LibraryElement> loadedLibraries = <Uri, LibraryElement>{};
final Map<LibraryElement, LibraryDependencyNode> nodeMap;
- _LoadedLibraries(
- this.rootLibrary,
- Iterable<LibraryElement> libraries,
- this.nodeMap,
- this.task) {
+ _LoadedLibraries(this.rootLibrary, Iterable<LibraryElement> libraries,
+ this.nodeMap, this.task) {
libraries.forEach((LibraryElement loadedLibrary) {
loadedLibraries[loadedLibrary.canonicalUri] = loadedLibrary;
});
@@ -1364,7 +1324,7 @@
void forEachLibrary(f(LibraryElement library)) => nodeMap.keys.forEach(f);
void forEachImportChain(Uri targetUri,
- {bool callback(Link<Uri> importChainReversed)}) {
+ {bool callback(Link<Uri> importChainReversed)}) {
bool aborted = false;
/// Map from libraries to the set of (unreversed) paths to [uri].
@@ -1378,8 +1338,7 @@
///
/// For every found suffix it prepends the given [prefix] and the canonical
/// uri of [library] and invokes the [callback] with the concatenated chain.
- void computeSuffixes(LibraryElement library,
- Link<Uri> prefix) {
+ void computeSuffixes(LibraryElement library, Link<Uri> prefix) {
if (aborted) return;
Uri canonicalUri = library.canonicalUri;
@@ -1428,7 +1387,8 @@
processLibrary(exportedLibrary);
if (aborted) return;
}
- } else { // Here `targetUri == canonicalUri`.
+ } else {
+ // Here `targetUri == canonicalUri`.
if (!callback(prefix)) {
aborted = true;
return;
@@ -1452,11 +1412,10 @@
/// Translate the resolved [uri] in the context of [importingLibrary].
///
/// Use [spannable] for error reporting.
- Uri translate(
- LibraryElement importingLibrary, Uri uri, [Spannable spannable]);
+ Uri translate(LibraryElement importingLibrary, Uri uri,
+ [Spannable spannable]);
}
-
// TODO(sigmund): remove ScriptLoader & ElementScanner. Such abstraction seems
// rather low-level. It might be more practical to split the library-loading
// task itself. The task would continue to do the work of recursively loading
@@ -1509,7 +1468,6 @@
void scanUnit(CompilationUnitElement unit);
}
-
/// TODO(sigmund): remove this abstraction. Ideally the loader can produce the
/// LoadedLibraries results once, and the compiler and choose what to do with
/// it instead.
diff --git a/pkg/compiler/lib/src/mirror_renamer/mirror_renamer.dart b/pkg/compiler/lib/src/mirror_renamer/mirror_renamer.dart
index d157b74..e838f8e 100644
--- a/pkg/compiler/lib/src/mirror_renamer/mirror_renamer.dart
+++ b/pkg/compiler/lib/src/mirror_renamer/mirror_renamer.dart
@@ -4,14 +4,11 @@
library mirror_renamer;
-import '../compiler.dart' show
- Compiler;
-import '../dart_backend/dart_backend.dart' show
- DartBackend,
- PlaceholderCollector;
+import '../compiler.dart' show Compiler;
+import '../dart_backend/dart_backend.dart'
+ show DartBackend, PlaceholderCollector;
import '../elements/elements.dart';
-import '../tokens/token.dart' show
- Token;
+import '../tokens/token.dart' show Token;
import '../tree/tree.dart';
part 'renamer.dart';
@@ -28,5 +25,5 @@
void registerStaticSend(Element currentElement, Element target, Node node) {}
void addRenames(Map<Node, String> renames, List<Node> topLevelNodes,
- PlaceholderCollector placeholderCollector) {}
+ PlaceholderCollector placeholderCollector) {}
}
diff --git a/pkg/compiler/lib/src/mirror_renamer/renamer.dart b/pkg/compiler/lib/src/mirror_renamer/renamer.dart
index 4f206c1..5b2daa1 100644
--- a/pkg/compiler/lib/src/mirror_renamer/renamer.dart
+++ b/pkg/compiler/lib/src/mirror_renamer/renamer.dart
@@ -40,10 +40,10 @@
MirrorRenamerImpl(this.compiler, this.backend, LibraryElement library)
: this.helperLibrary = library,
- getNameFunction = library.find(
- MirrorRenamerImpl.MIRROR_HELPER_GET_NAME_FUNCTION),
- symbolsMapVariable = library.find(
- MirrorRenamerImpl.MIRROR_HELPER_SYMBOLS_MAP_NAME);
+ getNameFunction =
+ library.find(MirrorRenamerImpl.MIRROR_HELPER_GET_NAME_FUNCTION),
+ symbolsMapVariable =
+ library.find(MirrorRenamerImpl.MIRROR_HELPER_SYMBOLS_MAP_NAME);
bool isMirrorHelperLibrary(LibraryElement element) {
return element == helperLibrary;
@@ -67,7 +67,7 @@
* contain all the toplevel ast nodes that will be emitted in the output.
*/
void addRenames(Map<Node, String> renames, List<Node> topLevelNodes,
- PlaceholderCollector placeholderCollector) {
+ PlaceholderCollector placeholderCollector) {
// Right now we only support instances of MirrorSystem.getName,
// hence if there are no occurence of these we don't do anything.
if (mirrorSystemGetNameNodes.isEmpty) {
diff --git a/pkg/compiler/lib/src/mirrors/analyze.dart b/pkg/compiler/lib/src/mirrors/analyze.dart
index 4f7f09f..d6ab956 100644
--- a/pkg/compiler/lib/src/mirrors/analyze.dart
+++ b/pkg/compiler/lib/src/mirrors/analyze.dart
@@ -23,14 +23,15 @@
* static inspection of the source code.
*/
// TODO(johnniwinther): Move this to [compiler/compiler.dart].
-Future<MirrorSystem> analyze(List<Uri> libraries,
- Uri libraryRoot,
- Uri packageRoot,
- api.CompilerInputProvider inputProvider,
- api.DiagnosticHandler diagnosticHandler,
- [List<String> options = const <String>[],
- Uri packageConfig,
- api.PackagesDiscoveryProvider findPackages]) {
+Future<MirrorSystem> analyze(
+ List<Uri> libraries,
+ Uri libraryRoot,
+ Uri packageRoot,
+ api.CompilerInputProvider inputProvider,
+ api.DiagnosticHandler diagnosticHandler,
+ [List<String> options = const <String>[],
+ Uri packageConfig,
+ api.PackagesDiscoveryProvider findPackages]) {
if (!libraryRoot.path.endsWith("/")) {
throw new ArgumentError("libraryRoot must end with a /");
}
@@ -46,10 +47,9 @@
options.add('--allow-native-extensions');
bool compilationFailed = false;
- void internalDiagnosticHandler(Uri uri, int begin, int end,
- String message, api.Diagnostic kind) {
- if (kind == api.Diagnostic.ERROR ||
- kind == api.Diagnostic.CRASH) {
+ void internalDiagnosticHandler(
+ Uri uri, int begin, int end, String message, api.Diagnostic kind) {
+ if (kind == api.Diagnostic.ERROR || kind == api.Diagnostic.CRASH) {
compilationFailed = true;
}
diagnosticHandler(uri, begin, end, message, kind);
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart
index 55d8789..039f5af 100644
--- a/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart
+++ b/pkg/compiler/lib/src/mirrors/dart2js_instance_mirrors.dart
@@ -13,9 +13,8 @@
throw new UnsupportedError('ObjectMirror.setField unsupported.');
}
- InstanceMirror invoke(Symbol memberName,
- List positionalArguments,
- [Map<Symbol, dynamic> namedArguments]) {
+ InstanceMirror invoke(Symbol memberName, List positionalArguments,
+ [Map<Symbol, dynamic> namedArguments]) {
throw new UnsupportedError('ObjectMirror.invoke unsupported.');
}
@@ -36,7 +35,6 @@
Dart2JsMirrorSystem mirrorSystem,
ConstantExpression constant,
ConstantValue value) {
-
if (value.isBool) {
return new Dart2JsBoolConstantMirror(mirrorSystem, constant, value);
} else if (value.isNum) {
@@ -56,12 +54,11 @@
} else if (value.isConstructedObject) {
return new Dart2JsConstructedConstantMirror(mirrorSystem, constant, value);
}
- mirrorSystem.compiler.reporter.internalError(NO_LOCATION_SPANNABLE,
- "Unexpected constant value $value");
+ mirrorSystem.compiler.reporter
+ .internalError(NO_LOCATION_SPANNABLE, "Unexpected constant value $value");
return null;
}
-
////////////////////////////////////////////////////////////////////////////////
// Mirrors on constant values used for metadata.
////////////////////////////////////////////////////////////////////////////////
@@ -97,8 +94,7 @@
class Dart2JsNullConstantMirror extends Dart2JsConstantMirror {
Dart2JsNullConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- NullConstantValue value)
+ ConstantExpression constant, NullConstantValue value)
: super(mirrorSystem, constant, value);
NullConstantValue get _value => super._value;
@@ -110,14 +106,13 @@
class Dart2JsBoolConstantMirror extends Dart2JsConstantMirror {
Dart2JsBoolConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- BoolConstantValue value)
+ ConstantExpression constant, BoolConstantValue value)
: super(mirrorSystem, constant, value);
- Dart2JsBoolConstantMirror.fromBool(Dart2JsMirrorSystem mirrorSystem,
- bool value)
+ Dart2JsBoolConstantMirror.fromBool(
+ Dart2JsMirrorSystem mirrorSystem, bool value)
: super(mirrorSystem, null,
- value ? new TrueConstantValue() : new FalseConstantValue());
+ value ? new TrueConstantValue() : new FalseConstantValue());
BoolConstantValue get _value => super._value;
@@ -128,14 +123,13 @@
class Dart2JsStringConstantMirror extends Dart2JsConstantMirror {
Dart2JsStringConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- StringConstantValue value)
+ ConstantExpression constant, StringConstantValue value)
: super(mirrorSystem, constant, value);
- Dart2JsStringConstantMirror.fromString(Dart2JsMirrorSystem mirrorSystem,
- String text)
+ Dart2JsStringConstantMirror.fromString(
+ Dart2JsMirrorSystem mirrorSystem, String text)
: super(mirrorSystem, null,
- new StringConstantValue(new DartString.literal(text)));
+ new StringConstantValue(new DartString.literal(text)));
StringConstantValue get _value => super._value;
@@ -146,8 +140,7 @@
class Dart2JsNumConstantMirror extends Dart2JsConstantMirror {
Dart2JsNumConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- NumConstantValue value)
+ ConstantExpression constant, NumConstantValue value)
: super(mirrorSystem, constant, value);
NumConstantValue get _value => super._value;
@@ -160,8 +153,7 @@
class Dart2JsListConstantMirror extends Dart2JsConstantMirror
implements ListInstanceMirror {
Dart2JsListConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- ListConstantValue value)
+ ConstantExpression constant, ListConstantValue value)
: super(mirrorSystem, constant, value);
ListConstantValue get _value => super._value;
@@ -181,8 +173,7 @@
List<String> _listCache;
Dart2JsMapConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- MapConstantValue value)
+ ConstantExpression constant, MapConstantValue value)
: super(mirrorSystem, constant, value);
MapConstantValue get _value => super._value;
@@ -216,10 +207,8 @@
class Dart2JsTypeConstantMirror extends Dart2JsConstantMirror
implements TypeInstanceMirror {
-
Dart2JsTypeConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- TypeConstantValue value)
+ ConstantExpression constant, TypeConstantValue value)
: super(mirrorSystem, constant, value);
TypeConstantValue get _value => super._value;
@@ -232,8 +221,7 @@
Map<String, ConstantValue> _fieldMapCache;
Dart2JsConstructedConstantMirror(Dart2JsMirrorSystem mirrorSystem,
- ConstantExpression constant,
- ConstructedConstantValue value)
+ ConstantExpression constant, ConstructedConstantValue value)
: super(mirrorSystem, constant, value);
ConstructedConstantValue get _value => super._value;
@@ -262,8 +250,8 @@
}
class Dart2JsCommentInstanceMirror extends Object
- with ObjectMirrorMixin, InstanceMirrorMixin
- implements CommentInstanceMirror {
+ with ObjectMirrorMixin, InstanceMirrorMixin
+ implements CommentInstanceMirror {
final Dart2JsMirrorSystem mirrorSystem;
final String text;
String _trimmedText;
@@ -271,8 +259,8 @@
Dart2JsCommentInstanceMirror(this.mirrorSystem, this.text);
ClassMirror get type {
- return mirrorSystem._getTypeDeclarationMirror(
- mirrorSystem.compiler.documentClass);
+ return mirrorSystem
+ ._getTypeDeclarationMirror(mirrorSystem.compiler.documentClass);
}
bool get isDocComment => text.startsWith('/**') || text.startsWith('///');
@@ -290,8 +278,8 @@
} else if (fieldName == #text) {
return new Dart2JsStringConstantMirror.fromString(mirrorSystem, text);
} else if (fieldName == #trimmedText) {
- return new Dart2JsStringConstantMirror.fromString(mirrorSystem,
- trimmedText);
+ return new Dart2JsStringConstantMirror.fromString(
+ mirrorSystem, trimmedText);
}
return super.getField(fieldName);
}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart b/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart
index feaf549..39468d3 100644
--- a/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart
+++ b/pkg/compiler/lib/src/mirrors/dart2js_library_mirror.dart
@@ -4,8 +4,7 @@
part of dart2js.mirrors;
-class Dart2JsLibraryMirror
- extends Dart2JsElementMirror
+class Dart2JsLibraryMirror extends Dart2JsElementMirror
with ObjectMirrorMixin, ContainerMixin
implements LibrarySourceMirror {
List<LibraryDependencySourceMirror> _libraryDependencies;
@@ -80,7 +79,7 @@
<LibraryDependency, Dart2JsLibraryDependencyMirror>{};
void addLibraryDependency(LibraryDependency libraryDependency,
- LibraryElement targetLibraryElement) {
+ LibraryElement targetLibraryElement) {
assert(targetLibraryElement != null);
LibraryMirror targetLibrary =
mirrorSystem._getLibrary(targetLibraryElement);
@@ -119,14 +118,13 @@
final Dart2JsLibraryMirror _targetLibrary;
List<CombinatorMirror> _combinators;
- Dart2JsLibraryDependencyMirror(this._node,
- this._sourceLibrary,
- this._targetLibrary);
+ Dart2JsLibraryDependencyMirror(
+ this._node, this._sourceLibrary, this._targetLibrary);
SourceLocation get location {
return new Dart2JsSourceLocation(
- _sourceLibrary._element.entryCompilationUnit.script,
- _sourceLibrary.mirrorSystem.compiler.reporter.spanFromSpannable(_node));
+ _sourceLibrary._element.entryCompilationUnit.script,
+ _sourceLibrary.mirrorSystem.compiler.reporter.spanFromSpannable(_node));
}
List<CombinatorMirror> get combinators {
@@ -138,8 +136,8 @@
for (Identifier identifier in combinator.identifiers.nodes) {
identifiers.add(identifier.source);
}
- _combinators.add(new Dart2JsCombinatorMirror(
- identifiers, isShow: combinator.isShow));
+ _combinators.add(new Dart2JsCombinatorMirror(identifiers,
+ isShow: combinator.isShow));
}
}
}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart
index bd510c2..88ffbf9 100644
--- a/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart
+++ b/pkg/compiler/lib/src/mirrors/dart2js_member_mirrors.dart
@@ -9,14 +9,12 @@
//------------------------------------------------------------------------------
abstract class Dart2JsMemberMirror extends Dart2JsElementMirror {
-
Dart2JsMemberMirror(Dart2JsMirrorSystem system, AstElement element)
: super(system, element);
bool get isStatic => false;
}
-
class Dart2JsMethodKind {
static const Dart2JsMethodKind REGULAR = const Dart2JsMethodKind("regular");
static const Dart2JsMethodKind GENERATIVE =
@@ -36,21 +34,21 @@
String toString() => text;
}
-class Dart2JsMethodMirror extends Dart2JsMemberMirror
- implements MethodMirror {
+class Dart2JsMethodMirror extends Dart2JsMemberMirror implements MethodMirror {
final Dart2JsDeclarationMirror owner;
final String _simpleNameString;
final Dart2JsMethodKind _kind;
- Dart2JsMethodMirror._internal(Dart2JsDeclarationMirror owner,
+ Dart2JsMethodMirror._internal(
+ Dart2JsDeclarationMirror owner,
FunctionElement function,
String this._simpleNameString,
Dart2JsMethodKind this._kind)
: this.owner = owner,
super(owner.mirrorSystem, function);
- factory Dart2JsMethodMirror(Dart2JsDeclarationMirror owner,
- FunctionElement function) {
+ factory Dart2JsMethodMirror(
+ Dart2JsDeclarationMirror owner, FunctionElement function) {
String simpleName = function.name;
// TODO(ahe): This method should not be calling
// Elements.operatorNameToIdentifier.
@@ -75,8 +73,7 @@
} else {
kind = Dart2JsMethodKind.REGULAR;
}
- return new Dart2JsMethodMirror._internal(owner, function,
- simpleName, kind);
+ return new Dart2JsMethodMirror._internal(owner, function, simpleName, kind);
}
FunctionElement get _function => _element;
@@ -86,21 +83,22 @@
// TODO(johnniwinther): This seems stale and broken.
Symbol get constructorName => isConstructor ? simpleName : const Symbol('');
- bool get isConstructor
- => isGenerativeConstructor || isConstConstructor ||
- isFactoryConstructor || isRedirectingConstructor;
+ bool get isConstructor =>
+ isGenerativeConstructor ||
+ isConstConstructor ||
+ isFactoryConstructor ||
+ isRedirectingConstructor;
bool get isSynthetic => false;
bool get isStatic => _function.isStatic;
List<ParameterMirror> get parameters {
- return _parametersFromFunctionSignature(this,
- _function.functionSignature);
+ return _parametersFromFunctionSignature(this, _function.functionSignature);
}
- TypeMirror get returnType => owner._getTypeMirror(
- _function.functionSignature.type.returnType);
+ TypeMirror get returnType =>
+ owner._getTypeMirror(_function.functionSignature.type.returnType);
bool get isAbstract => _function.isAbstract;
@@ -140,8 +138,7 @@
final Dart2JsDeclarationMirror owner;
VariableElement _variable;
- Dart2JsFieldMirror(Dart2JsDeclarationMirror owner,
- VariableElement variable)
+ Dart2JsFieldMirror(Dart2JsDeclarationMirror owner, VariableElement variable)
: this.owner = owner,
this._variable = variable,
super(owner.mirrorSystem, variable);
@@ -155,8 +152,6 @@
bool get isConst => _variable.isConst;
TypeMirror get type => owner._getTypeMirror(_variable.type);
-
-
}
class Dart2JsParameterMirror extends Dart2JsMemberMirror
@@ -165,10 +160,9 @@
final bool isOptional;
final bool isNamed;
- factory Dart2JsParameterMirror(Dart2JsDeclarationMirror owner,
- FormalElement element,
- {bool isOptional: false,
- bool isNamed: false}) {
+ factory Dart2JsParameterMirror(
+ Dart2JsDeclarationMirror owner, FormalElement element,
+ {bool isOptional: false, bool isNamed: false}) {
if (element is InitializingFormalElement) {
return new Dart2JsFieldParameterMirror(
owner, element, isOptional, isNamed);
@@ -179,11 +173,9 @@
}
Dart2JsParameterMirror._normal(Dart2JsDeclarationMirror owner,
- FormalElement element,
- this.isOptional,
- this.isNamed)
- : this.owner = owner,
- super(owner.mirrorSystem, element);
+ FormalElement element, this.isOptional, this.isNamed)
+ : this.owner = owner,
+ super(owner.mirrorSystem, element);
FormalElement get _element => super._element;
@@ -198,13 +190,13 @@
// TODO(johnniwinther): Get the constant from the [TreeElements]
// associated with the enclosing method.
ParameterElement parameter = _element;
- ConstantExpression constant = mirrorSystem.compiler.constants
- .getConstantForVariable(parameter);
+ ConstantExpression constant =
+ mirrorSystem.compiler.constants.getConstantForVariable(parameter);
assert(invariant(parameter, constant != null,
message: "Missing constant for parameter "
- "$parameter with default value."));
- return _convertConstantToInstanceMirror(mirrorSystem,
- constant, mirrorSystem.compiler.constants.getConstantValue(constant));
+ "$parameter with default value."));
+ return _convertConstantToInstanceMirror(mirrorSystem, constant,
+ mirrorSystem.compiler.constants.getConstantValue(constant));
}
return null;
}
@@ -223,17 +215,14 @@
}
class Dart2JsFieldParameterMirror extends Dart2JsParameterMirror {
-
Dart2JsFieldParameterMirror(Dart2JsDeclarationMirror method,
- InitializingFormalElement element,
- bool isOptional,
- bool isNamed)
+ InitializingFormalElement element, bool isOptional, bool isNamed)
: super._normal(method, element, isOptional, isNamed);
InitializingFormalElement get _fieldParameterElement => _element;
bool get isInitializingFormal => true;
- VariableMirror get initializedField => new Dart2JsFieldMirror(
- owner.owner, _fieldParameterElement.fieldElement);
+ VariableMirror get initializedField =>
+ new Dart2JsFieldMirror(owner.owner, _fieldParameterElement.fieldElement);
}
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart
index 0e64cc3..745712a 100644
--- a/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart
+++ b/pkg/compiler/lib/src/mirrors/dart2js_mirrors.dart
@@ -7,23 +7,18 @@
import 'dart:collection' show UnmodifiableListView, UnmodifiableMapView;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../constants/expressions.dart';
import '../constants/values.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- LibraryElementX;
-import '../resolution/scope.dart' show
- Scope;
+import '../elements/modelx.dart' show LibraryElementX;
+import '../resolution/scope.dart' show Scope;
import '../script.dart';
import '../tokens/token.dart';
import '../tokens/token_constants.dart' as Tokens;
import '../tree/tree.dart';
-import '../util/util.dart'
- show Link,
- LinkBuilder;
+import '../util/util.dart' show Link, LinkBuilder;
import '../util/characters.dart' show $CR, $LF;
import 'source_mirrors.dart';
@@ -48,17 +43,16 @@
}
List<ParameterMirror> _parametersFromFunctionSignature(
- Dart2JsDeclarationMirror owner,
- FunctionSignature signature) {
+ Dart2JsDeclarationMirror owner, FunctionSignature signature) {
var parameters = <ParameterMirror>[];
signature.requiredParameters.forEach((FormalElement parameter) {
- parameters.add(new Dart2JsParameterMirror(
- owner, parameter, isOptional: false, isNamed: false));
+ parameters.add(new Dart2JsParameterMirror(owner, parameter,
+ isOptional: false, isNamed: false));
});
bool isNamed = signature.optionalParametersAreNamed;
signature.optionalParameters.forEach((FormalElement parameter) {
- parameters.add(new Dart2JsParameterMirror(
- owner, parameter, isOptional: true, isNamed: isNamed));
+ parameters.add(new Dart2JsParameterMirror(owner, parameter,
+ isOptional: true, isNamed: isNamed));
});
return parameters;
}
@@ -82,7 +76,6 @@
abstract class Dart2JsDeclarationMirror extends Dart2JsMirror
implements DeclarationSourceMirror {
-
bool get isTopLevel => owner != null && owner is LibraryMirror;
bool get isPrivate => _isPrivate(_simpleNameString);
@@ -130,8 +123,8 @@
}
return members;
}
- mirrorSystem.compiler.reporter.internalError(element,
- "Unexpected member type $element ${element.kind}.");
+ mirrorSystem.compiler.reporter.internalError(
+ element, "Unexpected member type $element ${element.kind}.");
return null;
}
}
@@ -142,8 +135,8 @@
List<InstanceMirror> _metadata;
Dart2JsElementMirror(this.mirrorSystem, this._element) {
- assert (mirrorSystem != null);
- assert (_element != null);
+ assert(mirrorSystem != null);
+ assert(_element != null);
}
String get _simpleNameString => _element.name;
@@ -203,8 +196,8 @@
span = new SourceSpan(script.resourceUri, 0, 0);
} else {
Token endToken = getEndToken();
- span = new SourceSpan.fromTokens(
- script.resourceUri, beginToken, endToken);
+ span =
+ new SourceSpan.fromTokens(script.resourceUri, beginToken, endToken);
}
return new Dart2JsSourceLocation(script, span);
}
@@ -213,8 +206,8 @@
void _appendCommentTokens(Token commentToken) {
while (commentToken != null && commentToken.kind == Tokens.COMMENT_TOKEN) {
- _metadata.add(new Dart2JsCommentInstanceMirror(
- mirrorSystem, commentToken.value));
+ _metadata.add(
+ new Dart2JsCommentInstanceMirror(mirrorSystem, commentToken.value));
commentToken = commentToken.next;
}
}
@@ -227,9 +220,10 @@
mirrorSystem.compiler.commentMap[metadata.beginToken]);
metadata.ensureResolved(mirrorSystem.compiler.resolution);
_metadata.add(_convertConstantToInstanceMirror(
- mirrorSystem, metadata.constant,
- mirrorSystem.compiler.constants.getConstantValue(
- metadata.constant)));
+ mirrorSystem,
+ metadata.constant,
+ mirrorSystem.compiler.constants
+ .getConstantValue(metadata.constant)));
}
_appendCommentTokens(mirrorSystem.compiler.commentMap[getBeginToken()]);
}
@@ -245,7 +239,7 @@
if (index != -1) {
// Lookup [: prefix.id :].
String prefix = name.substring(0, index);
- String id = name.substring(index+1);
+ String id = name.substring(index + 1);
result = scope.lookup(prefix);
if (result != null && result.isPrefix) {
PrefixElement prefix = result;
@@ -265,8 +259,7 @@
if (identical(this, other)) return true;
if (other == null) return false;
if (other is! Dart2JsElementMirror) return false;
- return _element == other._element &&
- owner == other.owner;
+ return _element == other._element && owner == other.owner;
}
int get hashCode {
@@ -314,11 +307,9 @@
Dart2JsMirrorSystem get mirrorSystem => this;
- TypeMirror get dynamicType =>
- _convertTypeToTypeMirror(const DynamicType());
+ TypeMirror get dynamicType => _convertTypeToTypeMirror(const DynamicType());
- TypeMirror get voidType =>
- _convertTypeToTypeMirror(const VoidType());
+ TypeMirror get voidType => _convertTypeToTypeMirror(const VoidType());
TypeMirror _convertTypeToTypeMirror(DartType type) {
assert(type != null);
@@ -343,8 +334,8 @@
return new Dart2JsTypedefMirror(this, type);
}
}
- compiler.reporter.internalError(type.element,
- "Unexpected type $type of kind ${type.kind}.");
+ compiler.reporter.internalError(
+ type.element, "Unexpected type $type of kind ${type.kind}.");
return null;
}
@@ -367,10 +358,10 @@
var declarations = <Symbol, DeclarationMirror>{};
_forEachElement((Element element) {
for (DeclarationMirror mirror in _getDeclarationMirrors(element)) {
- assert(invariant(_element,
- !declarations.containsKey(mirror.simpleName),
- message: "Declaration name '${nameOf(mirror)}' "
- "is not unique in $_element."));
+ assert(
+ invariant(_element, !declarations.containsKey(mirror.simpleName),
+ message: "Declaration name '${nameOf(mirror)}' "
+ "is not unique in $_element."));
declarations[mirror.simpleName] = mirror;
}
});
@@ -397,8 +388,8 @@
* If [element] is an [AbstractFieldElement] the mirror for its getter is
* returned or, if not present, the mirror for its setter.
*/
-DeclarationMirror _convertElementToDeclarationMirror(Dart2JsMirrorSystem system,
- Element element) {
+DeclarationMirror _convertElementToDeclarationMirror(
+ Dart2JsMirrorSystem system, Element element) {
if (element.isTypeVariable) {
TypeVariableElement typeVariable = element;
return new Dart2JsTypeVariableMirror(system, typeVariable.type);
@@ -421,8 +412,8 @@
Dart2JsMethodMirror method = _convertElementMethodToMethodMirror(
container, element.outermostEnclosingMemberOrTopLevel);
// TODO(johnniwinther): Find the right info for [isOptional] and [isNamed].
- return new Dart2JsParameterMirror(
- method, element, isOptional: false, isNamed: false);
+ return new Dart2JsParameterMirror(method, element,
+ isOptional: false, isNamed: false);
}
Iterable<DeclarationMirror> members =
container._getDeclarationMirrors(element);
@@ -462,8 +453,8 @@
class BackDoor {
/// Return the compilation units comprising [library].
static List<Mirror> compilationUnitsOf(Dart2JsLibraryMirror library) {
- return library._element.compilationUnits.mapToList(
- (cu) => new Dart2JsCompilationUnitMirror(cu, library));
+ return library._element.compilationUnits
+ .mapToList((cu) => new Dart2JsCompilationUnitMirror(cu, library));
}
static Iterable<ConstantExpression> metadataSyntaxOf(
@@ -477,7 +468,7 @@
}
static ConstantExpression defaultValueSyntaxOf(
- Dart2JsParameterMirror parameter) {
+ Dart2JsParameterMirror parameter) {
if (!parameter.hasDefaultValue) return null;
ParameterElement parameterElement = parameter._element;
Compiler compiler = parameter.mirrorSystem.compiler;
diff --git a/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart b/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart
index b2a2ea5..6bf227c 100644
--- a/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart
+++ b/pkg/compiler/lib/src/mirrors/dart2js_type_mirrors.dart
@@ -9,9 +9,9 @@
Type get reflectedType {
throw new UnsupportedError("ClassMirror.reflectedType is not supported.");
}
- InstanceMirror newInstance(Symbol constructorName,
- List positionalArguments,
- [Map<Symbol, dynamic> namedArguments]) {
+
+ InstanceMirror newInstance(Symbol constructorName, List positionalArguments,
+ [Map<Symbol, dynamic> namedArguments]) {
throw new UnsupportedError("ClassMirror.newInstance is not supported.");
}
}
@@ -64,19 +64,17 @@
}
String toString() => _type.toString();
-
}
/// Base implementations for mirrors on element based types.
-abstract class Dart2JsTypeElementMirror
- extends Dart2JsElementMirror
+abstract class Dart2JsTypeElementMirror extends Dart2JsElementMirror
with Dart2JsTypeMirror
implements TypeSourceMirror {
final DartType _type;
Dart2JsTypeElementMirror(Dart2JsMirrorSystem system, DartType type)
- : super(system, type.element),
- this._type = type;
+ : super(system, type.element),
+ this._type = type;
Dart2JsLibraryMirror get library {
return mirrorSystem._getLibrary(_type.element.library);
@@ -84,7 +82,6 @@
}
abstract class DeclarationMixin implements TypeMirror {
-
bool get isOriginalDeclaration => true;
TypeMirror get originalDeclaration => this;
@@ -124,8 +121,8 @@
if (_typeVariables == null) {
_typeVariables = <TypeVariableMirror>[];
for (TypeVariableType typeVariable in _element.typeVariables) {
- _typeVariables.add(
- new Dart2JsTypeVariableMirror(mirrorSystem, typeVariable));
+ _typeVariables
+ .add(new Dart2JsTypeVariableMirror(mirrorSystem, typeVariable));
}
}
return _typeVariables;
@@ -152,8 +149,8 @@
if (newTypeArguments.isEmpty) return owner._getTypeMirror(_type.asRaw());
if (newTypeArguments.length != typeVariables.length) {
throw new ArgumentError('Cannot create generic instantiation of $_type '
- 'with ${newTypeArguments.length} arguments, '
- 'expect ${typeVariables.length} arguments.');
+ 'with ${newTypeArguments.length} arguments, '
+ 'expect ${typeVariables.length} arguments.');
}
List<DartType> builder = <DartType>[];
for (TypeSourceMirror newTypeArgument in newTypeArguments) {
@@ -163,8 +160,7 @@
if (newTypeArgument is Dart2JsTypeMirror) {
builder.add(newTypeArgument._type);
} else {
- throw new UnsupportedError(
- 'Cannot create instantiation using a type '
+ throw new UnsupportedError('Cannot create instantiation using a type '
'mirror from a different mirrorSystem implementation.');
}
}
@@ -172,19 +168,18 @@
}
}
-class Dart2JsInterfaceTypeMirror
- extends Dart2JsGenericTypeMirror
+class Dart2JsInterfaceTypeMirror extends Dart2JsGenericTypeMirror
with ObjectMirrorMixin, ClassMirrorMixin, ContainerMixin
implements ClassMirror {
- Dart2JsInterfaceTypeMirror(Dart2JsMirrorSystem system,
- InterfaceType interfaceType)
+ Dart2JsInterfaceTypeMirror(
+ Dart2JsMirrorSystem system, InterfaceType interfaceType)
: super(system, interfaceType);
ClassElement get _element => super._element;
InterfaceType get _type => super._type;
- bool get isNameSynthetic {
+ bool get isNameSynthetic {
if (_element.isMixinApplication) {
MixinApplicationElement mixinApplication = _element;
return mixinApplication.isUnnamedMixinApplication;
@@ -206,7 +201,7 @@
bool isSubclassOf(Mirror other) {
if (other is Dart2JsTypeMirror) {
return other._type.element != null &&
- _element.isSubclassOf(other._type.element);
+ _element.isSubclassOf(other._type.element);
} else {
throw new ArgumentError(other);
}
@@ -251,12 +246,9 @@
String toString() => 'Mirror on interface type $_type';
}
-class Dart2JsClassDeclarationMirror
- extends Dart2JsInterfaceTypeMirror
+class Dart2JsClassDeclarationMirror extends Dart2JsInterfaceTypeMirror
with DeclarationMixin {
-
- Dart2JsClassDeclarationMirror(Dart2JsMirrorSystem system,
- InterfaceType type)
+ Dart2JsClassDeclarationMirror(Dart2JsMirrorSystem system, InterfaceType type)
: super(system, type);
bool isSubclassOf(ClassMirror other) {
@@ -273,8 +265,7 @@
String toString() => 'Mirror on class ${_type.name}';
}
-class Dart2JsTypedefMirror
- extends Dart2JsGenericTypeMirror
+class Dart2JsTypedefMirror extends Dart2JsGenericTypeMirror
implements TypedefMirror {
final Dart2JsLibraryMirror _library;
List<TypeVariableMirror> _typeVariables;
@@ -284,8 +275,8 @@
: this._library = system._getLibrary(_typedef.element.library),
super(system, _typedef);
- Dart2JsTypedefMirror.fromLibrary(Dart2JsLibraryMirror library,
- TypedefType _typedef)
+ Dart2JsTypedefMirror.fromLibrary(
+ Dart2JsLibraryMirror library, TypedefType _typedef)
: this._library = library,
super(library.mirrorSystem, _typedef);
@@ -311,11 +302,9 @@
String toString() => 'Mirror on typedef $_type';
}
-class Dart2JsTypedefDeclarationMirror
- extends Dart2JsTypedefMirror
+class Dart2JsTypedefDeclarationMirror extends Dart2JsTypedefMirror
with DeclarationMixin {
- Dart2JsTypedefDeclarationMirror(Dart2JsMirrorSystem system,
- TypedefType type)
+ Dart2JsTypedefDeclarationMirror(Dart2JsMirrorSystem system, TypedefType type)
: super(system, type);
String toString() => 'Mirror on typedef ${_type.name}';
@@ -325,16 +314,16 @@
implements TypeVariableMirror {
Dart2JsDeclarationMirror _owner;
- Dart2JsTypeVariableMirror(Dart2JsMirrorSystem system,
- TypeVariableType typeVariableType)
- : super(system, typeVariableType);
+ Dart2JsTypeVariableMirror(
+ Dart2JsMirrorSystem system, TypeVariableType typeVariableType)
+ : super(system, typeVariableType);
TypeVariableType get _type => super._type;
Dart2JsDeclarationMirror get owner {
if (_owner == null) {
- _owner = mirrorSystem._getTypeDeclarationMirror(
- _type.element.typeDeclaration);
+ _owner =
+ mirrorSystem._getTypeDeclarationMirror(_type.element.typeDeclaration);
}
return _owner;
}
@@ -364,10 +353,10 @@
implements FunctionTypeMirror {
List<ParameterMirror> _parameters;
- Dart2JsFunctionTypeMirror(Dart2JsMirrorSystem system,
- FunctionType functionType)
+ Dart2JsFunctionTypeMirror(
+ Dart2JsMirrorSystem system, FunctionType functionType)
: super(system, functionType) {
- assert (functionType.element != null);
+ assert(functionType.element != null);
}
FunctionType get _type => super._type;
@@ -392,12 +381,10 @@
bool get isFunction => true;
MethodMirror get callMethod => _convertElementMethodToMethodMirror(
- mirrorSystem._getLibrary(_type.element.library),
- _type.element);
+ mirrorSystem._getLibrary(_type.element.library), _type.element);
- ClassMirror get originalDeclaration =>
- mirrorSystem._getTypeDeclarationMirror(
- mirrorSystem.compiler.coreClasses.functionClass);
+ ClassMirror get originalDeclaration => mirrorSystem._getTypeDeclarationMirror(
+ mirrorSystem.compiler.coreClasses.functionClass);
// TODO(johnniwinther): Substitute type arguments for type variables.
ClassMirror get superclass => originalDeclaration.superclass;
@@ -441,8 +428,8 @@
final Dart2JsMirrorSystem mirrorSystem;
final DartType _type;
- Dart2JsBuiltinTypeMirror(Dart2JsMirrorSystem this.mirrorSystem,
- DartType this._type);
+ Dart2JsBuiltinTypeMirror(
+ Dart2JsMirrorSystem this.mirrorSystem, DartType this._type);
Symbol get qualifiedName => simpleName;
diff --git a/pkg/compiler/lib/src/mirrors/mirrors_util.dart b/pkg/compiler/lib/src/mirrors/mirrors_util.dart
index d1d4f5f2..52eb0a9 100644
--- a/pkg/compiler/lib/src/mirrors/mirrors_util.dart
+++ b/pkg/compiler/lib/src/mirrors/mirrors_util.dart
@@ -42,7 +42,7 @@
String simpleName = nameOf(mirror);
if (mirror.isSetter) {
// Remove trailing '='.
- return simpleName.substring(0, simpleName.length-1);
+ return simpleName.substring(0, simpleName.length - 1);
} else if (mirror.isOperator) {
return 'operator ${operatorName(mirror)}';
} else if (mirror.isConstructor) {
@@ -77,8 +77,8 @@
* Returns an iterable over the type declarations directly inheriting from
* the declaration of [type] within [mirrors].
*/
-Iterable<ClassMirror> computeSubdeclarations(MirrorSystem mirrors,
- ClassMirror type) {
+Iterable<ClassMirror> computeSubdeclarations(
+ MirrorSystem mirrors, ClassMirror type) {
type = type.originalDeclaration;
var subtypes = <ClassMirror>[];
mirrors.libraries.forEach((_, library) {
@@ -174,22 +174,19 @@
Iterable<DeclarationMirror> membersOf(
Map<Symbol, DeclarationMirror> declarations) {
- return declarations.values.where(
- (mirror) => mirror is MethodMirror || mirror is VariableMirror);
+ return declarations.values
+ .where((mirror) => mirror is MethodMirror || mirror is VariableMirror);
}
-Iterable<TypeMirror> classesOf(
- Map<Symbol, DeclarationMirror> declarations) {
+Iterable<TypeMirror> classesOf(Map<Symbol, DeclarationMirror> declarations) {
return new _TypeOfIterable<ClassMirror>(declarations.values);
}
-Iterable<TypeMirror> typesOf(
- Map<Symbol, DeclarationMirror> declarations) {
+Iterable<TypeMirror> typesOf(Map<Symbol, DeclarationMirror> declarations) {
return new _TypeOfIterable<TypeMirror>(declarations.values);
}
-Iterable<MethodMirror> methodsOf(
- Map<Symbol, DeclarationMirror> declarations) {
+Iterable<MethodMirror> methodsOf(Map<Symbol, DeclarationMirror> declarations) {
return anyMethodOf(declarations).where((mirror) => mirror.isRegularMethod);
}
@@ -198,13 +195,11 @@
return anyMethodOf(declarations).where((mirror) => mirror.isConstructor);
}
-Iterable<MethodMirror> settersOf(
- Map<Symbol, DeclarationMirror> declarations) {
+Iterable<MethodMirror> settersOf(Map<Symbol, DeclarationMirror> declarations) {
return anyMethodOf(declarations).where((mirror) => mirror.isSetter);
}
-Iterable<MethodMirror> gettersOf(
- Map<Symbol, DeclarationMirror> declarations) {
+Iterable<MethodMirror> gettersOf(Map<Symbol, DeclarationMirror> declarations) {
return anyMethodOf(declarations).where((mirror) => mirror.isGetter);
}
@@ -234,7 +229,7 @@
_TypeOfIterator(this._source);
bool moveNext() {
- while(_source.moveNext()) {
+ while (_source.moveNext()) {
if (_source.current is T) {
return true;
}
@@ -350,7 +345,7 @@
comment = match[1];
var sb = new StringBuffer();
List<String> lines = comment.split('\n');
- for (int index = 0 ; index < lines.length ; index++) {
+ for (int index = 0; index < lines.length; index++) {
String line = lines[index];
if (index == 0) {
sb.write(line); // Add the first line unprocessed.
@@ -360,7 +355,7 @@
match = _multiLineCommentLineStart.firstMatch(line);
if (match != null) {
sb.write(match[1]);
- } else if (index < lines.length-1 || !line.trim().isEmpty) {
+ } else if (index < lines.length - 1 || !line.trim().isEmpty) {
// Do not add the last line if it only contains white space.
// This interprets cases like
// /*
@@ -388,8 +383,8 @@
* variable of [:Iterable:] and 'col.Iterable.contains.element' finds the
* [:element:] parameter of the [:contains:] method on [:Iterable:].
*/
-DeclarationMirror lookupQualifiedInScope(DeclarationSourceMirror declaration,
- String name) {
+DeclarationMirror lookupQualifiedInScope(
+ DeclarationSourceMirror declaration, String name) {
// TODO(11653): Support lookup of constructors using the [:new Foo:]
// syntax.
int offset = 1;
@@ -419,11 +414,12 @@
if (result != null) return result;
// Try type variables.
result = mirror.typeVariables.firstWhere(
- (TypeVariableMirror v) => v.simpleName == id, orElse: () => null);
+ (TypeVariableMirror v) => v.simpleName == id,
+ orElse: () => null);
} else if (mirror is MethodMirror) {
result = mirror.parameters.firstWhere(
- (ParameterMirror p) => p.simpleName == id, orElse: () => null);
+ (ParameterMirror p) => p.simpleName == id,
+ orElse: () => null);
}
return result;
-
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/mirrors/source_mirrors.dart b/pkg/compiler/lib/src/mirrors/source_mirrors.dart
index 14e6c13..6bf555c 100644
--- a/pkg/compiler/lib/src/mirrors/source_mirrors.dart
+++ b/pkg/compiler/lib/src/mirrors/source_mirrors.dart
@@ -118,8 +118,8 @@
}
/// A mirror on an import or export declaration.
-abstract class LibraryDependencySourceMirror
- extends Mirror implements LibraryDependencyMirror {
+abstract class LibraryDependencySourceMirror extends Mirror
+ implements LibraryDependencyMirror {
/// Is `true` if this dependency is an import.
bool get isImport;
@@ -149,8 +149,8 @@
}
/// A mirror on a show/hide combinator declared on a library dependency.
-abstract class CombinatorSourceMirror
- extends Mirror implements CombinatorMirror {
+abstract class CombinatorSourceMirror extends Mirror
+ implements CombinatorMirror {
/// The list of identifiers on the combinator.
List/*<String>*/ get identifiers;
diff --git a/pkg/compiler/lib/src/mirrors_used.dart b/pkg/compiler/lib/src/mirrors_used.dart
index 1928d10..15f7c6d 100644
--- a/pkg/compiler/lib/src/mirrors_used.dart
+++ b/pkg/compiler/lib/src/mirrors_used.dart
@@ -5,39 +5,30 @@
library dart2js.mirrors_used;
import 'common.dart';
-import 'common/tasks.dart' show
- CompilerTask;
-import 'compile_time_constants.dart' show
- ConstantCompiler;
-import 'compiler.dart' show
- Compiler;
+import 'common/tasks.dart' show CompilerTask;
+import 'compile_time_constants.dart' show ConstantCompiler;
+import 'compiler.dart' show Compiler;
import 'constants/expressions.dart';
-import 'constants/values.dart' show
- ConstantValue,
- ConstructedConstantValue,
- ListConstantValue,
- StringConstantValue,
- TypeConstantValue;
-import 'dart_types.dart' show
- DartType,
- InterfaceType,
- TypeKind;
-import 'elements/elements.dart' show
- ClassElement,
- Element,
- ImportElement,
- LibraryElement,
- MetadataAnnotation,
- ScopeContainerElement,
- VariableElement;
-import 'resolution/tree_elements.dart' show
- TreeElements;
-import 'tree/tree.dart' show
- Import,
- LibraryTag,
- NamedArgument,
- NewExpression,
- Node;
+import 'constants/values.dart'
+ show
+ ConstantValue,
+ ConstructedConstantValue,
+ ListConstantValue,
+ StringConstantValue,
+ TypeConstantValue;
+import 'dart_types.dart' show DartType, InterfaceType, TypeKind;
+import 'elements/elements.dart'
+ show
+ ClassElement,
+ Element,
+ ImportElement,
+ LibraryElement,
+ MetadataAnnotation,
+ ScopeContainerElement,
+ VariableElement;
+import 'resolution/tree_elements.dart' show TreeElements;
+import 'tree/tree.dart'
+ show Import, LibraryTag, NamedArgument, NewExpression, Node;
/**
* Compiler task that analyzes MirrorsUsed annotations.
@@ -91,8 +82,7 @@
Set<LibraryElement> librariesWithUsage;
MirrorUsageAnalyzer analyzer;
- MirrorUsageAnalyzerTask(Compiler compiler)
- : super(compiler) {
+ MirrorUsageAnalyzerTask(Compiler compiler) : super(compiler) {
analyzer = new MirrorUsageAnalyzer(compiler, this);
}
@@ -117,9 +107,8 @@
bool hasMirrorUsage(Element element) {
LibraryElement library = element.library;
// Internal libraries always have implicit mirror usage.
- return library.isInternalLibrary
- || (librariesWithUsage != null
- && librariesWithUsage.contains(library));
+ return library.isInternalLibrary ||
+ (librariesWithUsage != null && librariesWithUsage.contains(library));
}
/// Call-back from the resolver to analyze MirorsUsed annotations. The result
@@ -130,14 +119,11 @@
NamedArgument named = argument.asNamedArgument();
if (named == null) continue;
ConstantCompiler constantCompiler = compiler.resolver.constantCompiler;
- ConstantValue value =
- constantCompiler.getConstantValue(
- constantCompiler.compileNode(named.expression, mapping));
+ ConstantValue value = constantCompiler.getConstantValue(
+ constantCompiler.compileNode(named.expression, mapping));
- MirrorUsageBuilder builder =
- new MirrorUsageBuilder(
- analyzer, mapping.analyzedElement.library, named.expression,
- value, mapping);
+ MirrorUsageBuilder builder = new MirrorUsageBuilder(analyzer,
+ mapping.analyzedElement.library, named.expression, value, mapping);
if (named.name.source == 'symbols') {
analyzer.cachedStrings[value] =
@@ -201,8 +187,7 @@
if (library.isInternalLibrary) continue;
for (ImportElement import in library.imports) {
reporter.withCurrentElement(library, () {
- List<MirrorUsage> usages =
- mirrorsUsedOnLibraryTag(library, import);
+ List<MirrorUsage> usages = mirrorsUsedOnLibraryTag(library, import);
if (usages != null) {
List<MirrorUsage> existing = result[library];
if (existing != null) {
@@ -242,8 +227,8 @@
}
}
});
- propagatedOverrides.forEach((LibraryElement overridden,
- List<MirrorUsage> overriddenUsages) {
+ propagatedOverrides.forEach(
+ (LibraryElement overridden, List<MirrorUsage> overriddenUsages) {
List<MirrorUsage> usages =
usageMap.putIfAbsent(overridden, () => <MirrorUsage>[]);
usages.addAll(overriddenUsages);
@@ -252,8 +237,8 @@
/// Find @MirrorsUsed annotations on the given import [tag] in [library]. The
/// annotations are represented as [MirrorUsage].
- List<MirrorUsage> mirrorsUsedOnLibraryTag(LibraryElement library,
- ImportElement import) {
+ List<MirrorUsage> mirrorsUsedOnLibraryTag(
+ LibraryElement library, ImportElement import) {
LibraryElement importedLibrary = import.importedLibrary;
if (importedLibrary != compiler.mirrorsLibrary) {
return null;
@@ -296,8 +281,9 @@
// TOOO(ahe): Should be an instance method on MirrorUsage.
if (a.symbols == null && a.targets == null && a.metaTargets == null) {
return b;
- } else if (
- b.symbols == null && b.targets == null && b.metaTargets == null) {
+ } else if (b.symbols == null &&
+ b.targets == null &&
+ b.metaTargets == null) {
return a;
}
// TODO(ahe): Test the following cases.
@@ -326,15 +312,14 @@
/// that was resolved during [MirrorUsageAnalyzerTask.validate].
MirrorUsage buildUsage(ConstructedConstantValue constant) {
Map<Element, ConstantValue> fields = constant.fields;
- VariableElement symbolsField = compiler.mirrorsUsedClass.lookupLocalMember(
- 'symbols');
- VariableElement targetsField = compiler.mirrorsUsedClass.lookupLocalMember(
- 'targets');
+ VariableElement symbolsField =
+ compiler.mirrorsUsedClass.lookupLocalMember('symbols');
+ VariableElement targetsField =
+ compiler.mirrorsUsedClass.lookupLocalMember('targets');
VariableElement metaTargetsField =
- compiler.mirrorsUsedClass.lookupLocalMember(
- 'metaTargets');
- VariableElement overrideField = compiler.mirrorsUsedClass.lookupLocalMember(
- 'override');
+ compiler.mirrorsUsedClass.lookupLocalMember('metaTargets');
+ VariableElement overrideField =
+ compiler.mirrorsUsedClass.lookupLocalMember('override');
return new MirrorUsage(
cachedStrings[fields[symbolsField]],
@@ -354,14 +339,12 @@
MirrorUsage(this.symbols, this.targets, this.metaTargets, this.override);
String toString() {
- return
- 'MirrorUsage('
+ return 'MirrorUsage('
'symbols = $symbols, '
'targets = $targets, '
'metaTargets = $metaTargets, '
'override = $override'
')';
-
}
}
@@ -372,12 +355,8 @@
final ConstantValue constant;
final TreeElements elements;
- MirrorUsageBuilder(
- this.analyzer,
- this.enclosingLibrary,
- this.spannable,
- this.constant,
- this.elements);
+ MirrorUsageBuilder(this.analyzer, this.enclosingLibrary, this.spannable,
+ this.constant, this.elements);
Compiler get compiler => analyzer.compiler;
@@ -391,13 +370,13 @@
/// [onlyStrings] is true, the returned list is a [:List<String>:] and any
/// [Type] values are treated as an error (meaning that the value is ignored
/// and a hint is emitted).
- List convertConstantToUsageList(
- ConstantValue constant, { bool onlyStrings: false }) {
+ List convertConstantToUsageList(ConstantValue constant,
+ {bool onlyStrings: false}) {
if (constant.isNull) {
return null;
} else if (constant.isList) {
ListConstantValue list = constant;
- List result = onlyStrings ? <String> [] : [];
+ List result = onlyStrings ? <String>[] : [];
for (ConstantValue entry in list.entries) {
if (entry.isString) {
StringConstantValue string = entry;
@@ -443,8 +422,8 @@
ClassElement cls = type.element;
cls.ensureResolved(compiler.resolution);
for (DartType supertype in cls.allSupertypes) {
- if (supertype.isInterfaceType
- && !supertype.element.library.isInternalLibrary) {
+ if (supertype.isInterfaceType &&
+ !supertype.element.library.isInternalLibrary) {
return interface.asInstanceOf(supertype.element);
}
}
@@ -482,8 +461,8 @@
libraryNameCandiate = libraryName;
break;
} else if (string.startsWith('$libraryName.')) {
- if (libraryNameCandiate == null
- || libraryNameCandiate.length < libraryName.length) {
+ if (libraryNameCandiate == null ||
+ libraryNameCandiate.length < libraryName.length) {
// Found a better candiate
libraryCandiate = l;
libraryNameCandiate = libraryName;
@@ -495,8 +474,7 @@
if (libraryNameCandiate == string) {
e = libraryCandiate;
} else if (libraryNameCandiate != null) {
- e = resolveLocalExpression(
- libraryCandiate,
+ e = resolveLocalExpression(libraryCandiate,
string.substring(libraryNameCandiate.length + 1).split('.'));
} else {
e = resolveExpression(string);
@@ -532,12 +510,13 @@
if (current.isLibrary) {
LibraryElement library = current;
reporter.reportHintMessage(
- spannable, MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY,
- {'name': identifiers[0],
- 'library': library.libraryOrScriptName});
+ spannable,
+ MessageKind.MIRRORS_CANNOT_RESOLVE_IN_LIBRARY,
+ {'name': identifiers[0], 'library': library.libraryOrScriptName});
} else {
reporter.reportHintMessage(
- spannable, MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT,
+ spannable,
+ MessageKind.MIRRORS_CANNOT_FIND_IN_ELEMENT,
{'name': identifier, 'element': current.name});
}
return current;
diff --git a/pkg/compiler/lib/src/native/behavior.dart b/pkg/compiler/lib/src/native/behavior.dart
index d0fd80f..edca67c 100644
--- a/pkg/compiler/lib/src/native/behavior.dart
+++ b/pkg/compiler/lib/src/native/behavior.dart
@@ -3,23 +3,17 @@
// BSD-style license that can be found in the LICENSE file.
import '../common.dart';
-import '../common/backend_api.dart' show
- ForeignResolver;
-import '../common/resolution.dart' show
- Parsing,
- Resolution;
-import '../compiler.dart' show
- Compiler;
+import '../common/backend_api.dart' show ForeignResolver;
+import '../common/resolution.dart' show Parsing, Resolution;
+import '../compiler.dart' show Compiler;
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreTypes;
+import '../core_types.dart' show CoreTypes;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../js/js.dart' as js;
import '../js_backend/js_backend.dart';
import '../tree/tree.dart';
-import '../universe/side_effects.dart' show
- SideEffects;
+import '../universe/side_effects.dart' show SideEffects;
import '../util/util.dart';
import 'enqueue.dart';
@@ -109,7 +103,6 @@
* `null` may be returned.
*/
class NativeBehavior {
-
/// [DartType]s or [SpecialType]s returned or yielded by the native element.
final List typesReturned = [];
@@ -135,7 +128,6 @@
static NativeBehavior get CHANGES_OTHER => NativeBehavior._makeChangesOther();
static NativeBehavior get DEPENDS_OTHER => NativeBehavior._makeDependsOther();
-
String toString() {
return 'NativeBehavior('
'returns: ${typesReturned}'
@@ -238,20 +230,17 @@
/// latter is used for the type strings of the form '' and 'var'.
/// [validTags] can be used to restrict which tags are accepted.
static void processSpecString(
- DiagnosticReporter reporter,
- Spannable spannable,
- String specString,
+ DiagnosticReporter reporter, Spannable spannable, String specString,
{Iterable<String> validTags,
- void setSideEffects(SideEffects newEffects),
- void setThrows(NativeThrowBehavior throwKind),
- void setIsAllocation(bool isAllocation),
- void setUseGvn(bool useGvn),
- dynamic resolveType(String typeString),
- List typesReturned,
- List typesInstantiated,
- objectType, nullType}) {
-
-
+ void setSideEffects(SideEffects newEffects),
+ void setThrows(NativeThrowBehavior throwKind),
+ void setIsAllocation(bool isAllocation),
+ void setUseGvn(bool useGvn),
+ dynamic resolveType(String typeString),
+ List typesReturned,
+ List typesInstantiated,
+ objectType,
+ nullType}) {
bool seenError = false;
void reportError(String message) {
@@ -261,15 +250,21 @@
}
const List<String> knownTags = const [
- 'creates', 'returns', 'depends', 'effects',
- 'throws', 'gvn', 'new'];
+ 'creates',
+ 'returns',
+ 'depends',
+ 'effects',
+ 'throws',
+ 'gvn',
+ 'new'
+ ];
/// Resolve a type string of one of the three forms:
/// * 'void' - in which case [onVoid] is called,
/// * '' or 'var' - in which case [onVar] is called,
/// * 'T1|...|Tn' - in which case [onType] is called for each resolved Ti.
void resolveTypesString(String typesString,
- {onVoid(), onVar(), onType(type)}) {
+ {onVoid(), onVar(), onType(type)}) {
// Various things that are not in fact types.
if (typesString == 'void') {
if (onVoid != null) {
@@ -300,13 +295,11 @@
return;
}
- List<String> specs = specString.split(';')
- .map((s) => s.trim())
- .toList();
- if (specs.last == "") specs.removeLast(); // Allow separator to terminate.
+ List<String> specs = specString.split(';').map((s) => s.trim()).toList();
+ if (specs.last == "") specs.removeLast(); // Allow separator to terminate.
- assert(validTags == null ||
- (validTags.toSet()..removeAll(validTags)).isEmpty);
+ assert(
+ validTags == null || (validTags.toSet()..removeAll(validTags)).isEmpty);
if (validTags == null) validTags = knownTags;
Map<String, String> values = <String, String>{};
@@ -351,42 +344,38 @@
String returns = values['returns'];
if (returns != null) {
- resolveTypesString(returns,
- onVar: () {
- typesReturned.add(objectType);
- typesReturned.add(nullType);
- },
- onType: (type) {
- typesReturned.add(type);
- });
+ resolveTypesString(returns, onVar: () {
+ typesReturned.add(objectType);
+ typesReturned.add(nullType);
+ }, onType: (type) {
+ typesReturned.add(type);
+ });
}
String creates = values['creates'];
if (creates != null) {
- resolveTypesString(creates,
- onVoid: () {
- reportError("Invalid type string 'creates:$creates'");
- },
- onType: (type) {
- typesInstantiated.add(type);
- });
+ resolveTypesString(creates, onVoid: () {
+ reportError("Invalid type string 'creates:$creates'");
+ }, onType: (type) {
+ typesInstantiated.add(type);
+ });
} else if (returns != null) {
- resolveTypesString(returns,
- onType: (type) {
- typesInstantiated.add(type);
- });
+ resolveTypesString(returns, onType: (type) {
+ typesInstantiated.add(type);
+ });
}
const throwsOption = const <String, NativeThrowBehavior>{
'never': NativeThrowBehavior.NEVER,
'null(1)': NativeThrowBehavior.MAY_THROW_ONLY_ON_FIRST_ARGUMENT_ACCESS,
'may': NativeThrowBehavior.MAY,
- 'must': NativeThrowBehavior.MUST };
+ 'must': NativeThrowBehavior.MUST
+ };
- const boolOptions = const<String, bool>{'true': true, 'false': false};
+ const boolOptions = const <String, bool>{'true': true, 'false': false};
- SideEffects sideEffects = processEffects(reportError,
- values['effects'], values['depends']);
+ SideEffects sideEffects =
+ processEffects(reportError, values['effects'], values['depends']);
NativeThrowBehavior throwsKind = tagValueLookup('throws', throwsOption);
bool isAllocation = tagValueLookup('new', boolOptions);
bool useGvn = tagValueLookup('gvn', boolOptions);
@@ -395,7 +384,7 @@
reportError("'new' and 'gvn' are incompatible");
}
- if (seenError) return; // Avoid callbacks.
+ if (seenError) return; // Avoid callbacks.
// TODO(sra): Simplify [throwBehavior] using [sideEffects].
@@ -406,10 +395,7 @@
}
static SideEffects processEffects(
- void reportError(String message),
- String effects,
- String depends) {
-
+ void reportError(String message), String effects, String depends) {
if (effects == null && depends == null) return null;
if (effects == null || depends == null) {
@@ -473,12 +459,8 @@
return sideEffects;
}
- static NativeBehavior ofJsCall(
- Send jsCall,
- DiagnosticReporter reporter,
- Parsing parsing,
- CoreTypes coreTypes,
- ForeignResolver resolver) {
+ static NativeBehavior ofJsCall(Send jsCall, DiagnosticReporter reporter,
+ Parsing parsing, CoreTypes coreTypes, ForeignResolver resolver) {
// The first argument of a JS-call is a string encoding various attributes
// of the code.
//
@@ -489,25 +471,21 @@
var argNodes = jsCall.arguments;
if (argNodes.isEmpty || argNodes.tail.isEmpty) {
- reporter.reportErrorMessage(
- jsCall,
- MessageKind.GENERIC,
+ reporter.reportErrorMessage(jsCall, MessageKind.GENERIC,
{'text': "JS expression takes two or more arguments."});
return behavior;
}
var specArgument = argNodes.head;
- if (specArgument is !StringNode || specArgument.isInterpolation) {
- reporter.reportErrorMessage(
- specArgument, MessageKind.GENERIC,
+ if (specArgument is! StringNode || specArgument.isInterpolation) {
+ reporter.reportErrorMessage(specArgument, MessageKind.GENERIC,
{'text': "JS first argument must be a string literal."});
return behavior;
}
var codeArgument = argNodes.tail.head;
- if (codeArgument is !StringNode || codeArgument.isInterpolation) {
- reporter.reportErrorMessage(
- codeArgument, MessageKind.GENERIC,
+ if (codeArgument is! StringNode || codeArgument.isInterpolation) {
+ reporter.reportErrorMessage(codeArgument, MessageKind.GENERIC,
{'text': "JS second argument must be a string literal."});
return behavior;
}
@@ -546,10 +524,7 @@
behavior.useGvn = useGvn;
}
- processSpecString(
- reporter,
- specArgument,
- specString,
+ processSpecString(reporter, specArgument, specString,
setSideEffects: setSideEffects,
setThrows: setThrows,
setIsAllocation: setIsAllocation,
@@ -580,7 +555,7 @@
CoreTypes coreTypes,
ForeignResolver resolver,
{bool isBuiltin,
- List<String> validTags}) {
+ List<String> validTags}) {
// The first argument of a JS-embedded global call is a string encoding
// the type of the code.
//
@@ -631,10 +606,7 @@
behavior.sideEffects.setTo(newEffects);
}
- processSpecString(
- reporter,
- jsBuiltinOrEmbeddedGlobalCall,
- specString,
+ processSpecString(reporter, jsBuiltinOrEmbeddedGlobalCall, specString,
validTags: validTags,
resolveType: resolveType,
setSideEffects: setSideEffects,
@@ -654,12 +626,7 @@
behavior.sideEffects.setTo(new SideEffects());
_fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
- behavior,
- jsBuiltinCall,
- reporter,
- parsing,
- coreTypes,
- resolver,
+ behavior, jsBuiltinCall, reporter, parsing, coreTypes, resolver,
isBuiltin: true);
return behavior;
@@ -679,19 +646,13 @@
behavior.throwBehavior = NativeThrowBehavior.NEVER;
_fillNativeBehaviorOfBuiltinOrEmbeddedGlobal(
- behavior,
- jsEmbeddedGlobalCall,
- reporter,
- parsing,
- coreTypes,
- resolver,
- isBuiltin: false,
- validTags: const ['returns', 'creates']);
+ behavior, jsEmbeddedGlobalCall, reporter, parsing, coreTypes, resolver,
+ isBuiltin: false, validTags: const ['returns', 'creates']);
return behavior;
}
- static NativeBehavior ofMethod(FunctionElement method, Compiler compiler) {
+ static NativeBehavior ofMethod(FunctionElement method, Compiler compiler) {
FunctionType type = method.computeType(compiler.resolution);
var behavior = new NativeBehavior();
var returnType = type.returnType;
@@ -707,7 +668,8 @@
// TODO(sigmund,sra): consider doing something better for numeric types.
behavior.typesReturned.add(
!isInterop || compiler.options.trustJSInteropTypeAnnotations
- ? returnType : const DynamicType());
+ ? returnType
+ : const DynamicType());
if (!type.returnType.isVoid) {
// Declared types are nullable.
behavior.typesReturned.add(compiler.coreTypes.nullType);
@@ -718,10 +680,10 @@
// TODO(sra): Optional arguments are currently missing from the
// DartType. This should be fixed so the following work-around can be
// removed.
- method.functionSignature.forEachOptionalParameter(
- (ParameterElement parameter) {
- behavior._escape(parameter.type, compiler.resolution);
- });
+ method.functionSignature
+ .forEachOptionalParameter((ParameterElement parameter) {
+ behavior._escape(parameter.type, compiler.resolution);
+ });
behavior._overrideWithAnnotations(method, compiler);
return behavior;
@@ -735,7 +697,8 @@
// TODO(sigmund,sra): consider doing something better for numeric types.
behavior.typesReturned.add(
!isInterop || compiler.options.trustJSInteropTypeAnnotations
- ? type : const DynamicType());
+ ? type
+ : const DynamicType());
// Declared types are nullable.
behavior.typesReturned.add(resolution.coreTypes.nullType);
behavior._capture(type, resolution,
@@ -767,16 +730,20 @@
}
NativeEnqueuer enqueuer = compiler.enqueuer.resolution.nativeEnqueuer;
- var creates = _collect(element, compiler, enqueuer.annotationCreatesClass,
- lookup);
- var returns = _collect(element, compiler, enqueuer.annotationReturnsClass,
- lookup);
+ var creates =
+ _collect(element, compiler, enqueuer.annotationCreatesClass, lookup);
+ var returns =
+ _collect(element, compiler, enqueuer.annotationReturnsClass, lookup);
if (creates != null) {
- typesInstantiated..clear()..addAll(creates);
+ typesInstantiated
+ ..clear()
+ ..addAll(creates);
}
if (returns != null) {
- typesReturned..clear()..addAll(returns);
+ typesReturned
+ ..clear()
+ ..addAll(returns);
}
}
@@ -786,7 +753,7 @@
* Returns `null` if no constraints.
*/
static _collect(Element element, Compiler compiler, Element annotationClass,
- lookup(str)) {
+ lookup(str)) {
DiagnosticReporter reporter = compiler.reporter;
var types = null;
for (MetadataAnnotation annotation in element.implementation.metadata) {
@@ -800,8 +767,8 @@
Iterable<ConstantValue> fields = constructedObject.fields.values;
// TODO(sra): Better validation of the constant.
if (fields.length != 1 || !fields.single.isString) {
- reporter.internalError(annotation,
- 'Annotations needs one string: ${annotation.node}');
+ reporter.internalError(
+ annotation, 'Annotations needs one string: ${annotation.node}');
}
StringConstantValue specStringConstant = fields.single;
String specString = specStringConstant.toDartString().slowToString();
@@ -860,7 +827,8 @@
}
if (!compiler.options.trustJSInteropTypeAnnotations ||
- type.isDynamic || type.isObject) {
+ type.isDynamic ||
+ type.isObject) {
// By saying that only JS-interop types can be created, we prevent
// pulling in every other native type (e.g. all of dart:html) when a
// JS interop API returns dynamic or when we don't trust the type
@@ -881,10 +849,7 @@
}
static dynamic _parseType(
- String typeString,
- Parsing parsing,
- lookup(name),
- locationNodeOrElement) {
+ String typeString, Parsing parsing, lookup(name), locationNodeOrElement) {
DiagnosticReporter reporter = parsing.reporter;
if (typeString == '=Object') return SpecialType.JsObject;
if (typeString == 'dynamic') {
@@ -895,21 +860,17 @@
int index = typeString.indexOf('<');
if (index < 1) {
- reporter.reportErrorMessage(
- _errorNode(locationNodeOrElement, parsing),
- MessageKind.GENERIC,
- {'text': "Type '$typeString' not found."});
+ reporter.reportErrorMessage(_errorNode(locationNodeOrElement, parsing),
+ MessageKind.GENERIC, {'text': "Type '$typeString' not found."});
return const DynamicType();
}
type = lookup(typeString.substring(0, index));
- if (type != null) {
+ if (type != null) {
// TODO(sra): Parse type parameters.
return type;
}
- reporter.reportErrorMessage(
- _errorNode(locationNodeOrElement, parsing),
- MessageKind.GENERIC,
- {'text': "Type '$typeString' not found."});
+ reporter.reportErrorMessage(_errorNode(locationNodeOrElement, parsing),
+ MessageKind.GENERIC, {'text': "Type '$typeString' not found."});
return const DynamicType();
}
diff --git a/pkg/compiler/lib/src/native/enqueue.dart b/pkg/compiler/lib/src/native/enqueue.dart
index 0f5b985..03f3fc2 100644
--- a/pkg/compiler/lib/src/native/enqueue.dart
+++ b/pkg/compiler/lib/src/native/enqueue.dart
@@ -5,40 +5,22 @@
import 'dart:collection' show Queue;
import '../common.dart';
-import '../common/backend_api.dart' show
- ForeignResolver;
-import '../common/registry.dart' show
- Registry;
-import '../common/resolution.dart' show
- Parsing,
- Resolution;
-import '../compiler.dart' show
- Compiler;
+import '../common/backend_api.dart' show ForeignResolver;
+import '../common/registry.dart' show Registry;
+import '../common/resolution.dart' show Parsing, Resolution;
+import '../compiler.dart' show Compiler;
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreTypes;
+import '../core_types.dart' show CoreTypes;
import '../dart_types.dart';
-import '../enqueue.dart' show
- Enqueuer,
- ResolutionEnqueuer;
+import '../enqueue.dart' show Enqueuer, ResolutionEnqueuer;
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- BaseClassElementX,
- ElementX,
- FunctionElementX,
- LibraryElementX;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
+import '../elements/modelx.dart'
+ show BaseClassElementX, ElementX, FunctionElementX, LibraryElementX;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show
- CodeEmitterTask,
- NativeEmitter;
-import '../tokens/token.dart' show
- BeginGroupToken,
- Token;
-import '../tokens/token_constants.dart' as Tokens show
- EOF_TOKEN,
- STRING_TOKEN;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
+import '../tokens/token.dart' show BeginGroupToken, Token;
+import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN, STRING_TOKEN;
import '../tree/tree.dart';
import 'behavior.dart';
@@ -82,7 +64,6 @@
ClassElement get annotationJsNameClass => null;
}
-
abstract class NativeEnqueuerBase implements NativeEnqueuer {
static final RegExp _identifier = new RegExp(r'^[a-zA-Z_$][a-zA-Z0-9_$]*$');
@@ -188,10 +169,8 @@
if (element.isClass) {
String extendsName = findExtendsNameOfClass(element);
if (extendsName != null) {
- Set<ClassElement> potentialSubclasses =
- potentialExtends.putIfAbsent(
- extendsName,
- () => new Set<ClassElement>());
+ Set<ClassElement> potentialSubclasses = potentialExtends
+ .putIfAbsent(extendsName, () => new Set<ClassElement>());
potentialSubclasses.add(element);
}
}
@@ -215,9 +194,9 @@
if (nativeSuperclass != null) {
nativeClassesAndSubclasses.add(element);
if (!backend.isNative(element)) {
- nonNativeSubclasses.putIfAbsent(nativeSuperclass,
- () => new Set<ClassElement>())
- .add(element);
+ nonNativeSubclasses
+ .putIfAbsent(nativeSuperclass, () => new Set<ClassElement>())
+ .add(element);
}
Set<ClassElement> potentialSubclasses = potentialExtends[element.name];
if (potentialSubclasses != null) {
@@ -348,16 +327,16 @@
Iterable<ConstantValue> fields = constructedObject.fields.values;
// TODO(sra): Better validation of the constant.
if (fields.length != 1 || fields.single is! StringConstantValue) {
- reporter.internalError(annotation,
- 'Annotations needs one string: ${annotation.node}');
+ reporter.internalError(
+ annotation, 'Annotations needs one string: ${annotation.node}');
}
StringConstantValue specStringConstant = fields.single;
String specString = specStringConstant.toDartString().slowToString();
if (name == null) {
name = specString;
} else {
- reporter.internalError(annotation,
- 'Too many JSName annotations: ${annotation.node}');
+ reporter.internalError(
+ annotation, 'Too many JSName annotations: ${annotation.node}');
}
}
return name;
@@ -367,7 +346,9 @@
assert(unusedClasses.contains(classElement));
unusedClasses.remove(classElement);
pendingClasses.add(classElement);
- queue.add(() { processClass(classElement, cause); });
+ queue.add(() {
+ processClass(classElement, cause);
+ });
}
void flushQueue() {
@@ -382,7 +363,7 @@
processClass(ClassElement classElement, cause) {
// TODO(ahe): Fix this assertion to work in incremental compilation.
assert(compiler.options.hasIncrementalSupport ||
- !registeredClasses.contains(classElement));
+ !registeredClasses.contains(classElement));
bool firstTime = registeredClasses.isEmpty;
pendingClasses.remove(classElement);
@@ -469,12 +450,13 @@
List<String> nativeNames =
backend.nativeData.getNativeTagsOfClassRaw(element.enclosingClass);
if (nativeNames.length != 1) {
- reporter.internalError(element,
+ reporter.internalError(
+ element,
'Unable to determine a native name for the enclosing class, '
'options: $nativeNames');
}
- backend.nativeData.setNativeMemberName(
- element, '${nativeNames[0]}.$name');
+ backend.nativeData
+ .setNativeMemberName(element, '${nativeNames[0]}.$name');
} else {
backend.nativeData.setNativeMemberName(element, name);
}
@@ -537,16 +519,15 @@
} else if (type == coreTypes.numType) {
backend.registerInstantiatedType(
coreTypes.doubleType, world, registry);
- backend.registerInstantiatedType(
- coreTypes.intType, world, registry);
+ backend.registerInstantiatedType(coreTypes.intType, world, registry);
} else if (type == coreTypes.stringType) {
backend.registerInstantiatedType(type, world, registry);
} else if (type == coreTypes.nullType) {
backend.registerInstantiatedType(type, world, registry);
} else if (type == coreTypes.boolType) {
backend.registerInstantiatedType(type, world, registry);
- } else if (compiler.types.isSubtype(
- type, backend.listImplementation.rawType)) {
+ } else if (compiler.types
+ .isSubtype(type, backend.listImplementation.rawType)) {
backend.registerInstantiatedType(type, world, registry);
}
}
@@ -564,9 +545,8 @@
}
}
- enqueueUnusedClassesMatching(bool predicate(classElement),
- cause,
- [String reason]) {
+ enqueueUnusedClassesMatching(bool predicate(classElement), cause,
+ [String reason]) {
Iterable matches = unusedClasses.where(predicate);
matches.toList().forEach((c) => enqueueClass(c, cause));
}
@@ -586,23 +566,20 @@
addNativeExceptions() {
enqueueUnusedClassesMatching((classElement) {
- // TODO(sra): Annotate exception classes in dart:html.
- String name = classElement.name;
- if (name.contains('Exception')) return true;
- if (name.contains('Error')) return true;
- return false;
- },
- 'native exception');
+ // TODO(sra): Annotate exception classes in dart:html.
+ String name = classElement.name;
+ if (name.contains('Exception')) return true;
+ if (name.contains('Error')) return true;
+ return false;
+ }, 'native exception');
}
}
-
class NativeResolutionEnqueuer extends NativeEnqueuerBase {
-
Map<String, ClassElement> tagOwner = new Map<String, ClassElement>();
NativeResolutionEnqueuer(Enqueuer world, Compiler compiler)
- : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis);
+ : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis);
void processNativeClass(ClassElement classElement) {
super.processNativeClass(classElement);
@@ -645,7 +622,6 @@
nativeBehaviors[node] = behavior;
}
-
/**
* Handles JS-embedded global calls, which can be an instantiation point for
* types.
@@ -662,7 +638,6 @@
nativeBehaviors[node] = behavior;
}
-
/**
* Handles JS-compiler builtin calls, which can be an instantiation point for
* types.
@@ -680,15 +655,13 @@
}
}
-
class NativeCodegenEnqueuer extends NativeEnqueuerBase {
-
final CodeEmitterTask emitter;
final Set<ClassElement> doneAddSubtypes = new Set<ClassElement>();
NativeCodegenEnqueuer(Enqueuer world, Compiler compiler, this.emitter)
- : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis);
+ : super(world, compiler, compiler.options.enableNativeLiveTypeAnalysis);
void processNativeClasses(Iterable<LibraryElement> libraries) {
super.processNativeClasses(libraries);
@@ -720,9 +693,8 @@
addSubtypes(cls.superclass, emitter);
for (DartType type in cls.allSupertypes) {
- List<Element> subtypes = emitter.subtypes.putIfAbsent(
- type.element,
- () => <ClassElement>[]);
+ List<Element> subtypes =
+ emitter.subtypes.putIfAbsent(type.element, () => <ClassElement>[]);
subtypes.add(cls);
}
@@ -735,9 +707,8 @@
superclass = superclass.superclass;
}
- List<Element> directSubtypes = emitter.directSubtypes.putIfAbsent(
- superclass,
- () => <ClassElement>[]);
+ List<Element> directSubtypes =
+ emitter.directSubtypes.putIfAbsent(superclass, () => <ClassElement>[]);
directSubtypes.add(cls);
}
diff --git a/pkg/compiler/lib/src/native/js.dart b/pkg/compiler/lib/src/native/js.dart
index 9108b90..1251fe5 100644
--- a/pkg/compiler/lib/src/native/js.dart
+++ b/pkg/compiler/lib/src/native/js.dart
@@ -8,7 +8,6 @@
import 'behavior.dart';
class HasCapturedPlaceholders extends js.BaseVisitor {
-
HasCapturedPlaceholders._();
static bool check(js.Node node) {
@@ -113,7 +112,6 @@
}
}
-
/// ThrowBehaviorVisitor generates a NativeThrowBehavior describing the
/// exception behavior of a JavaScript expression.
///
@@ -128,7 +126,6 @@
/// in the calling context.
///
class ThrowBehaviorVisitor extends js.BaseVisitor<NativeThrowBehavior> {
-
ThrowBehaviorVisitor();
NativeThrowBehavior analyze(js.Node node) {
@@ -138,8 +135,8 @@
// TODO(sra): Add [sequence] functionality to NativeThrowBehavior.
/// Returns the combined behavior of sequential execution of code having
/// behavior [first] followed by code having behavior [second].
- static NativeThrowBehavior sequence(NativeThrowBehavior first,
- NativeThrowBehavior second) {
+ static NativeThrowBehavior sequence(
+ NativeThrowBehavior first, NativeThrowBehavior second) {
if (first == NativeThrowBehavior.MUST) return first;
if (second == NativeThrowBehavior.MUST) return second;
if (second == NativeThrowBehavior.NEVER) return first;
@@ -151,9 +148,9 @@
// TODO(sra): Add [choice] functionality to NativeThrowBehavior.
/// Returns the combined behavior of a choice between two paths with behaviors
/// [first] and [second].
- static NativeThrowBehavior choice(NativeThrowBehavior first,
- NativeThrowBehavior second) {
- if (first == second) return first; // Both paths have same behaviour.
+ static NativeThrowBehavior choice(
+ NativeThrowBehavior first, NativeThrowBehavior second) {
+ if (first == second) return first; // Both paths have same behaviour.
return NativeThrowBehavior.MAY;
}
diff --git a/pkg/compiler/lib/src/native/native.dart b/pkg/compiler/lib/src/native/native.dart
index 5a1af7c..805196a 100644
--- a/pkg/compiler/lib/src/native/native.dart
+++ b/pkg/compiler/lib/src/native/native.dart
@@ -13,24 +13,23 @@
export 'scanner.dart';
export 'ssa.dart';
-bool maybeEnableNative(Compiler compiler,
- LibraryElement library) {
+bool maybeEnableNative(Compiler compiler, LibraryElement library) {
String libraryName = library.canonicalUri.toString();
- if (library.entryCompilationUnit.script.name.contains(
- 'sdk/tests/compiler/dart2js_native')
- || library.entryCompilationUnit.script.name.contains(
- 'sdk/tests/compiler/dart2js_extra')
- || libraryName == 'dart:async'
- || libraryName == 'dart:html'
- || libraryName == 'dart:html_common'
- || libraryName == 'dart:indexed_db'
- || libraryName == 'dart:js'
- || libraryName == 'dart:svg'
- || libraryName == 'dart:_native_typed_data'
- || libraryName == 'dart:web_audio'
- || libraryName == 'dart:web_gl'
- || libraryName == 'dart:web_sql'
- || compiler.options.allowNativeExtensions) {
+ if (library.entryCompilationUnit.script.name
+ .contains('sdk/tests/compiler/dart2js_native') ||
+ library.entryCompilationUnit.script.name
+ .contains('sdk/tests/compiler/dart2js_extra') ||
+ libraryName == 'dart:async' ||
+ libraryName == 'dart:html' ||
+ libraryName == 'dart:html_common' ||
+ libraryName == 'dart:indexed_db' ||
+ libraryName == 'dart:js' ||
+ libraryName == 'dart:svg' ||
+ libraryName == 'dart:_native_typed_data' ||
+ libraryName == 'dart:web_audio' ||
+ libraryName == 'dart:web_gl' ||
+ libraryName == 'dart:web_sql' ||
+ compiler.options.allowNativeExtensions) {
return true;
}
return false;
diff --git a/pkg/compiler/lib/src/native/scanner.dart b/pkg/compiler/lib/src/native/scanner.dart
index c54b937..f402431 100644
--- a/pkg/compiler/lib/src/native/scanner.dart
+++ b/pkg/compiler/lib/src/native/scanner.dart
@@ -3,16 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
import '../common.dart';
-import '../parser/listener.dart' show
- Listener;
-import '../parser/element_listener.dart' show
- ElementListener;
-import '../tokens/token.dart' show
- BeginGroupToken,
- Token;
-import '../tokens/token_constants.dart' as Tokens show
- EOF_TOKEN,
- STRING_TOKEN;
+import '../parser/listener.dart' show Listener;
+import '../parser/element_listener.dart' show ElementListener;
+import '../tokens/token.dart' show BeginGroupToken, Token;
+import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN, STRING_TOKEN;
void checkAllowedLibrary(ElementListener listener, Token token) {
if (listener.scannerOptions.canUseNative) return;
diff --git a/pkg/compiler/lib/src/native/ssa.dart b/pkg/compiler/lib/src/native/ssa.dart
index a14f7ad..7ab20c5 100644
--- a/pkg/compiler/lib/src/native/ssa.dart
+++ b/pkg/compiler/lib/src/native/ssa.dart
@@ -3,24 +3,17 @@
// BSD-style license that can be found in the LICENSE file.
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../constants/values.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
import '../js/js.dart' as js;
import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show
- CodeEmitterTask,
- NativeEmitter;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
import '../ssa/builder.dart' show SsaBuilder;
-import '../ssa/nodes.dart' show
- HInstruction,
- HForeignCode,
- HReturn;
+import '../ssa/nodes.dart' show HInstruction, HForeignCode, HReturn;
import '../tree/tree.dart';
-import '../universe/side_effects.dart' show
- SideEffects;
+import '../universe/side_effects.dart' show SideEffects;
final RegExp nativeRedirectionRegExp = new RegExp(r'^[a-zA-Z][a-zA-Z_$0-9]*$');
@@ -31,8 +24,8 @@
JavaScriptBackend backend = builder.backend;
DiagnosticReporter reporter = compiler.reporter;
- HInstruction convertDartClosure(ParameterElement parameter,
- FunctionType type) {
+ HInstruction convertDartClosure(
+ ParameterElement parameter, FunctionType type) {
HInstruction local = builder.localsHandler.readLocal(parameter);
ConstantValue arityConstant =
builder.constantSystem.createInt(type.computeArity());
@@ -99,25 +92,26 @@
} else if (element.kind == ElementKind.SETTER) {
nativeMethodCall = '$receiver$nativeMethodName = $foreignParameters';
} else {
- builder.reporter.internalError(element,
- 'Unexpected kind: "${element.kind}".');
+ builder.reporter
+ .internalError(element, 'Unexpected kind: "${element.kind}".');
}
- builder.push(
- new HForeignCode(
- // TODO(sra): This could be cached. The number of templates should
- // be proportional to the number of native methods, which is bounded
- // by the dart: libraries.
- js.js.uncachedExpressionTemplate(nativeMethodCall),
- backend.dynamicType,
- inputs, effects: new SideEffects()));
+ builder.push(new HForeignCode(
+ // TODO(sra): This could be cached. The number of templates should
+ // be proportional to the number of native methods, which is bounded
+ // by the dart: libraries.
+ js.js.uncachedExpressionTemplate(nativeMethodCall),
+ backend.dynamicType,
+ inputs,
+ effects: new SideEffects()));
// TODO(johnniwinther): Provide source information.
builder
.close(new HReturn(builder.pop(), null))
.addSuccessor(builder.graph.exit);
} else {
if (parameters.parameterCount != 0) {
- reporter.internalError(nativeBody,
+ reporter.internalError(
+ nativeBody,
'native "..." syntax is restricted to '
'functions with zero parameters.');
}
diff --git a/pkg/compiler/lib/src/old_to_new_api.dart b/pkg/compiler/lib/src/old_to_new_api.dart
index 59bbc19..7954091 100644
--- a/pkg/compiler/lib/src/old_to_new_api.dart
+++ b/pkg/compiler/lib/src/old_to_new_api.dart
@@ -31,8 +31,8 @@
LegacyCompilerDiagnostics(this._handler);
@override
- void report(var code, Uri uri, int begin, int end,
- String message, Diagnostic kind) {
+ void report(
+ var code, Uri uri, int begin, int end, String message, Diagnostic kind) {
_handler(uri, begin, end, message, kind);
}
}
diff --git a/pkg/compiler/lib/src/options.dart b/pkg/compiler/lib/src/options.dart
index e6d915b..cede0d1 100644
--- a/pkg/compiler/lib/src/options.dart
+++ b/pkg/compiler/lib/src/options.dart
@@ -16,6 +16,10 @@
/// Support conditional directives, e.g., configurable imports.
bool get enableConditionalDirectives;
+
+ /// Support parsing of generic method declarations, and invocations of
+ /// methods where type arguments are passed.
+ bool get enableGenericMethodSyntax;
}
/// Options used for controlling diagnostic messages.
@@ -147,6 +151,10 @@
/// Whether to enable the experimental conditional directives feature.
final bool enableConditionalDirectives;
+ /// Support parsing of generic method declarations, and invocations of
+ /// methods where type arguments are passed.
+ final bool enableGenericMethodSyntax;
+
/// Whether the user specified a flag to allow the use of dart:mirrors. This
/// silences a warning produced by the compiler.
final bool enableExperimentalMirrors;
@@ -279,6 +287,8 @@
enableAssertMessage: _hasOption(options, Flags.enableAssertMessage),
enableConditionalDirectives:
_hasOption(options, Flags.conditionalDirectives),
+ enableGenericMethodSyntax:
+ _hasOption(options, Flags.genericMethodSyntax),
enableExperimentalMirrors:
_hasOption(options, Flags.enableExperimentalMirrors),
enableMinification: _hasOption(options, Flags.minify),
@@ -345,6 +355,7 @@
bool emitJavaScript: true,
bool enableAssertMessage: false,
bool enableConditionalDirectives: false,
+ bool enableGenericMethodSyntax: false,
bool enableExperimentalMirrors: false,
bool enableMinification: false,
bool enableNativeLiveTypeAnalysis: true,
@@ -414,6 +425,7 @@
emitJavaScript: emitJavaScript,
enableAssertMessage: enableAssertMessage,
enableConditionalDirectives: enableConditionalDirectives,
+ enableGenericMethodSyntax: enableGenericMethodSyntax,
enableExperimentalMirrors: enableExperimentalMirrors,
enableMinification: enableMinification,
enableNativeLiveTypeAnalysis: enableNativeLiveTypeAnalysis,
@@ -464,6 +476,7 @@
this.emitJavaScript: true,
this.enableAssertMessage: false,
this.enableConditionalDirectives: false,
+ this.enableGenericMethodSyntax: false,
this.enableExperimentalMirrors: false,
this.enableMinification: false,
this.enableNativeLiveTypeAnalysis: false,
diff --git a/pkg/compiler/lib/src/ordered_typeset.dart b/pkg/compiler/lib/src/ordered_typeset.dart
index 1afc0e0..e3cffb5 100644
--- a/pkg/compiler/lib/src/ordered_typeset.dart
+++ b/pkg/compiler/lib/src/ordered_typeset.dart
@@ -6,15 +6,10 @@
import 'common.dart';
import 'dart_types.dart';
-import 'diagnostics/diagnostic_listener.dart' show
- DiagnosticReporter;
-import 'elements/elements.dart' show
- ClassElement;
-import 'util/util.dart' show
- Link,
- LinkBuilder;
-import 'util/util_implementation.dart' show
- LinkEntry;
+import 'diagnostics/diagnostic_listener.dart' show DiagnosticReporter;
+import 'elements/elements.dart' show ClassElement;
+import 'util/util.dart' show Link, LinkBuilder;
+import 'util/util_implementation.dart' show LinkEntry;
/**
* An ordered set of the supertypes of a class. The supertypes of a class are
@@ -39,8 +34,7 @@
final Link<DartType> _supertypes;
OrderedTypeSet.internal(List<Link<DartType>> this._levels,
- Link<DartType> this.types,
- Link<DartType> this._supertypes);
+ Link<DartType> this.types, Link<DartType> this._supertypes);
factory OrderedTypeSet.singleton(DartType type) {
Link<DartType> types =
@@ -56,9 +50,8 @@
OrderedTypeSet extendClass(InterfaceType type) {
assert(invariant(type.element, types.head.treatAsRaw,
message: 'Cannot extend generic class ${types.head} using '
- 'OrderedTypeSet.extendClass'));
- Link<DartType> extendedTypes =
- new LinkEntry<DartType>(type, types);
+ 'OrderedTypeSet.extendClass'));
+ Link<DartType> extendedTypes = new LinkEntry<DartType>(type, types);
List<Link<DartType>> list = new List<Link<DartType>>(levels + 1);
for (int i = 0; i < levels; i++) {
list[i] = _levels[i];
@@ -161,9 +154,7 @@
: this._objectType = objectType;
OrderedTypeSet createOrderedTypeSet(
- InterfaceType supertype,
- Link<DartType> interfaces) {
-
+ InterfaceType supertype, Link<DartType> interfaces) {
if (_objectType == null) {
// Find `Object` through in hierarchy. This is used for serialization
// where it is assumed that the hierarchy is valid.
@@ -197,7 +188,7 @@
Link<DartType> supertypes = classElement.allSupertypes;
assert(invariant(cls, supertypes != null,
message: "Supertypes not computed on $classElement "
- "during resolution of $cls"));
+ "during resolution of $cls"));
while (!supertypes.isEmpty) {
DartType supertype = supertypes.head;
add(supertype.substByContext(type));
@@ -227,12 +218,11 @@
if (existingType == type) return;
if (existingType.element == type.element) {
if (reporter != null) {
- reporter.reportErrorMessage(
- cls,
- MessageKind.MULTI_INHERITANCE,
- {'thisType': cls.thisType,
- 'firstType': existingType,
- 'secondType': type});
+ reporter.reportErrorMessage(cls, MessageKind.MULTI_INHERITANCE, {
+ 'thisType': cls.thisType,
+ 'firstType': existingType,
+ 'secondType': type
+ });
} else {
assert(invariant(cls, false,
message: 'Invalid ordered typeset for $cls'));
diff --git a/pkg/compiler/lib/src/parser/class_element_parser.dart b/pkg/compiler/lib/src/parser/class_element_parser.dart
index ab3516e..b85114d 100644
--- a/pkg/compiler/lib/src/parser/class_element_parser.dart
+++ b/pkg/compiler/lib/src/parser/class_element_parser.dart
@@ -4,15 +4,11 @@
library dart2js.parser.classes;
-import '../tokens/token.dart' show
- Token;
+import '../tokens/token.dart' show Token;
-import 'listener.dart' show
- Listener;
-import '../options.dart' show
- ParserOptions;
-import 'partial_parser.dart' show
- PartialParser;
+import 'listener.dart' show Listener;
+import '../options.dart' show ParserOptions;
+import 'partial_parser.dart' show PartialParser;
class ClassElementParser extends PartialParser {
ClassElementParser(Listener listener, ParserOptions options)
diff --git a/pkg/compiler/lib/src/parser/diet_parser_task.dart b/pkg/compiler/lib/src/parser/diet_parser_task.dart
index d2db818..6d9302e 100644
--- a/pkg/compiler/lib/src/parser/diet_parser_task.dart
+++ b/pkg/compiler/lib/src/parser/diet_parser_task.dart
@@ -5,43 +5,36 @@
library dart2js.parser.diet.task;
import '../common.dart';
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
-import '../elements/elements.dart' show
- CompilationUnitElement;
-import '../tokens/token.dart' show
- Token;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
+import '../elements/elements.dart' show CompilationUnitElement;
+import '../id_generator.dart';
+import '../tokens/token.dart' show Token;
-import 'listener.dart' show
- ParserError;
-import 'element_listener.dart' show
- ElementListener,
- ScannerOptions;
-import '../options.dart' show
- ParserOptions;
-import 'partial_parser.dart' show
- PartialParser;
+import 'listener.dart' show ParserError;
+import 'element_listener.dart' show ElementListener, ScannerOptions;
+import '../options.dart' show ParserOptions;
+import 'partial_parser.dart' show PartialParser;
class DietParserTask extends CompilerTask {
final ParserOptions _parserOptions;
+ final IdGenerator _idGenerator;
- DietParserTask(Compiler compiler, this._parserOptions) : super(compiler);
+ DietParserTask(Compiler compiler, this._parserOptions, this._idGenerator)
+ : super(compiler);
final String name = 'Diet Parser';
dietParse(CompilationUnitElement compilationUnit, Token tokens) {
measure(() {
- Function idGenerator = compiler.getNextFreeClassId;
ScannerOptions scannerOptions =
new ScannerOptions.from(compiler, compilationUnit.library);
ElementListener listener = new ElementListener(
- scannerOptions, compiler.reporter, compilationUnit, idGenerator);
+ scannerOptions, compiler.reporter, compilationUnit, _idGenerator);
PartialParser parser = new PartialParser(listener, _parserOptions);
try {
parser.parseUnit(tokens);
- } on ParserError catch(_) {
+ } on ParserError catch (_) {
assert(invariant(compilationUnit, compiler.compilationFailed));
}
});
diff --git a/pkg/compiler/lib/src/parser/element_listener.dart b/pkg/compiler/lib/src/parser/element_listener.dart
index fa524cc..b089ae5 100644
--- a/pkg/compiler/lib/src/parser/element_listener.dart
+++ b/pkg/compiler/lib/src/parser/element_listener.dart
@@ -4,57 +4,41 @@
library dart2js.parser.element_listener;
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../common.dart';
-import '../diagnostics/messages.dart' show
- MessageTemplate;
-import '../elements/elements.dart' show
- Element,
- LibraryElement,
- MetadataAnnotation;
-import '../elements/modelx.dart' show
- CompilationUnitElementX,
- DeclarationSite,
- ElementX,
- EnumClassElementX,
- FieldElementX,
- LibraryElementX,
- NamedMixinApplicationElementX,
- VariableList;
+import '../diagnostics/messages.dart' show MessageTemplate;
+import '../elements/elements.dart'
+ show Element, LibraryElement, MetadataAnnotation;
+import '../elements/modelx.dart'
+ show
+ CompilationUnitElementX,
+ DeclarationSite,
+ ElementX,
+ EnumClassElementX,
+ FieldElementX,
+ LibraryElementX,
+ NamedMixinApplicationElementX,
+ VariableList;
+import '../id_generator.dart';
import '../native/native.dart' as native;
-import '../string_validator.dart' show
- StringValidator;
-import '../tokens/keyword.dart' show
- Keyword;
-import '../tokens/precedence_constants.dart' as Precedence show
- BAD_INPUT_INFO;
-import '../tokens/token.dart' show
- BeginGroupToken,
- ErrorToken,
- KeywordToken,
- Token;
-import '../tokens/token_constants.dart' as Tokens show
- EOF_TOKEN;
+import '../string_validator.dart' show StringValidator;
+import '../tokens/keyword.dart' show Keyword;
+import '../tokens/precedence_constants.dart' as Precedence show BAD_INPUT_INFO;
+import '../tokens/token.dart'
+ show BeginGroupToken, ErrorToken, KeywordToken, Token;
+import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link,
- LinkBuilder;
+import '../util/util.dart' show Link, LinkBuilder;
-import 'partial_elements.dart' show
- PartialClassElement,
- PartialElement,
- PartialFieldList,
- PartialFunctionElement,
- PartialMetadataAnnotation,
- PartialTypedefElement;
-import 'listener.dart' show
- closeBraceFor,
- Listener,
- ParserError,
- VERBOSE;
-
-typedef int IdGenerator();
+import 'partial_elements.dart'
+ show
+ PartialClassElement,
+ PartialElement,
+ PartialFieldList,
+ PartialFunctionElement,
+ PartialMetadataAnnotation,
+ PartialTypedefElement;
+import 'listener.dart' show closeBraceFor, Listener, ParserError, VERBOSE;
/// Options used for scanning.
///
@@ -68,8 +52,8 @@
const ScannerOptions({this.canUseNative: false});
- ScannerOptions.from(Compiler compiler, LibraryElement libraryElement) :
- canUseNative = compiler.backend.canLibraryUseNative(libraryElement);
+ ScannerOptions.from(Compiler compiler, LibraryElement libraryElement)
+ : canUseNative = compiler.backend.canLibraryUseNative(libraryElement);
}
/**
@@ -102,11 +86,8 @@
bool suppressParseErrors = false;
- ElementListener(
- this.scannerOptions,
- DiagnosticReporter reporter,
- this.compilationUnitElement,
- this.idGenerator)
+ ElementListener(this.scannerOptions, DiagnosticReporter reporter,
+ this.compilationUnitElement, this.idGenerator)
: this.reporter = reporter,
stringValidator = new StringValidator(reporter),
interpolationScope = const Link<StringQuoting>();
@@ -129,8 +110,8 @@
StringNode node = popNode();
// TODO(lrn): Handle interpolations in script tags.
if (node.isInterpolation) {
- reporter.internalError(node,
- "String interpolation not supported in library tags.");
+ reporter.internalError(
+ node, "String interpolation not supported in library tags.");
return null;
}
return node;
@@ -141,17 +122,17 @@
// in sourced files.
LibraryElement library = compilationUnitElement.implementationLibrary;
return !compilationUnitElement.hasMembers &&
- library.entryCompilationUnit == compilationUnitElement;
+ library.entryCompilationUnit == compilationUnitElement;
}
void endLibraryName(Token libraryKeyword, Token semicolon) {
Expression name = popNode();
- addLibraryTag(new LibraryName(libraryKeyword, name,
- popMetadata(compilationUnitElement)));
+ addLibraryTag(new LibraryName(
+ libraryKeyword, name, popMetadata(compilationUnitElement)));
}
void endImport(Token importKeyword, Token deferredKeyword, Token asKeyword,
- Token semicolon) {
+ Token semicolon) {
NodeList combinators = popNode();
bool isDeferred = deferredKeyword != null;
Identifier prefix;
@@ -160,10 +141,9 @@
}
NodeList conditionalUris = popNode();
StringNode uri = popLiteralString();
- addLibraryTag(new Import(importKeyword, uri, conditionalUris,
- prefix, combinators,
- popMetadata(compilationUnitElement),
- isDeferred: isDeferred));
+ addLibraryTag(new Import(importKeyword, uri, conditionalUris, prefix,
+ combinators, popMetadata(compilationUnitElement),
+ isDeferred: isDeferred));
}
void endDottedName(int count, Token token) {
@@ -190,10 +170,10 @@
NodeList names = makeNodeList(count, enumKeyword.next.next, endBrace, ",");
Identifier name = popNode();
- int id = idGenerator();
+ int id = idGenerator.getNextFreeId();
Element enclosing = compilationUnitElement;
- pushElement(new EnumClassElementX(name.source, enclosing, id,
- new Enum(enumKeyword, name, names)));
+ pushElement(new EnumClassElementX(
+ name.source, enclosing, id, new Enum(enumKeyword, name, names)));
rejectBuiltInIdentifier(name);
}
@@ -202,7 +182,7 @@
NodeList conditionalUris = popNode();
StringNode uri = popNode();
addLibraryTag(new Export(exportKeyword, uri, conditionalUris, combinators,
- popMetadata(compilationUnitElement)));
+ popMetadata(compilationUnitElement)));
}
void endCombinators(int count) {
@@ -232,14 +212,14 @@
void endPart(Token partKeyword, Token semicolon) {
StringNode uri = popLiteralString();
- addLibraryTag(new Part(partKeyword, uri,
- popMetadata(compilationUnitElement)));
+ addLibraryTag(
+ new Part(partKeyword, uri, popMetadata(compilationUnitElement)));
}
void endPartOf(Token partKeyword, Token semicolon) {
Expression name = popNode();
- addPartOfTag(new PartOf(partKeyword, name,
- popMetadata(compilationUnitElement)));
+ addPartOfTag(
+ new PartOf(partKeyword, name, popMetadata(compilationUnitElement)));
}
void addPartOfTag(PartOf tag) {
@@ -256,20 +236,19 @@
void endTopLevelDeclaration(Token token) {
if (!metadata.isEmpty) {
- recoverableError(metadata.first.beginToken,
- 'Metadata not supported here.');
+ recoverableError(
+ metadata.first.beginToken, 'Metadata not supported here.');
metadata.clear();
}
}
void endClassDeclaration(int interfacesCount, Token beginToken,
- Token extendsKeyword, Token implementsKeyword,
- Token endToken) {
+ Token extendsKeyword, Token implementsKeyword, Token endToken) {
makeNodeList(interfacesCount, implementsKeyword, null, ","); // interfaces
popNode(); // superType
popNode(); // typeParameters
Identifier name = popNode();
- int id = idGenerator();
+ int id = idGenerator.getNextFreeId();
PartialClassElement element = new PartialClassElement(
name.source, beginToken, endToken, compilationUnitElement, id);
pushElement(element);
@@ -289,25 +268,28 @@
popNode(); // TODO(karlklose): do not throw away typeVariables.
Identifier name = popNode();
popNode(); // returnType
- pushElement(
- new PartialTypedefElement(
- name.source, compilationUnitElement, typedefKeyword, endToken));
+ pushElement(new PartialTypedefElement(
+ name.source, compilationUnitElement, typedefKeyword, endToken));
rejectBuiltInIdentifier(name);
}
- void endNamedMixinApplication(Token classKeyword,
- Token implementsKeyword,
- Token endToken) {
+ void endNamedMixinApplication(
+ Token classKeyword, Token implementsKeyword, Token endToken) {
NodeList interfaces = (implementsKeyword != null) ? popNode() : null;
MixinApplication mixinApplication = popNode();
Modifiers modifiers = popNode();
NodeList typeParameters = popNode();
Identifier name = popNode();
NamedMixinApplication namedMixinApplication = new NamedMixinApplication(
- name, typeParameters, modifiers, mixinApplication, interfaces,
- classKeyword, endToken);
+ name,
+ typeParameters,
+ modifiers,
+ mixinApplication,
+ interfaces,
+ classKeyword,
+ endToken);
- int id = idGenerator();
+ int id = idGenerator.getNextFreeId();
Element enclosing = compilationUnitElement;
pushElement(new NamedMixinApplicationElementX(
name.source, enclosing, id, namedMixinApplication));
@@ -327,12 +309,12 @@
void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
bool hasParseError = currentMemberHasParseError;
memberErrors = memberErrors.tail;
+ popNode(); // typeVariables
Identifier name = popNode();
popNode(); // type
Modifiers modifiers = popNode();
- PartialFunctionElement element = new PartialFunctionElement(
- name.source, beginToken, getOrSet, endToken,
- modifiers, compilationUnitElement);
+ PartialFunctionElement element = new PartialFunctionElement(name.source,
+ beginToken, getOrSet, endToken, modifiers, compilationUnitElement);
element.hasParseError = hasParseError;
pushElement(element);
}
@@ -341,29 +323,28 @@
bool hasParseError = currentMemberHasParseError;
memberErrors = memberErrors.tail;
void buildFieldElement(Identifier name, VariableList fields) {
- pushElement(
- new FieldElementX(name, compilationUnitElement, fields));
+ pushElement(new FieldElementX(name, compilationUnitElement, fields));
}
NodeList variables = makeNodeList(count, null, null, ",");
popNode(); // type
Modifiers modifiers = popNode();
buildFieldElements(modifiers, variables, compilationUnitElement,
- buildFieldElement,
- beginToken, endToken, hasParseError);
+ buildFieldElement, beginToken, endToken, hasParseError);
}
- void buildFieldElements(Modifiers modifiers,
- NodeList variables,
- Element enclosingElement,
- void buildFieldElement(Identifier name,
- VariableList fields),
- Token beginToken, Token endToken,
- bool hasParseError) {
+ void buildFieldElements(
+ Modifiers modifiers,
+ NodeList variables,
+ Element enclosingElement,
+ void buildFieldElement(Identifier name, VariableList fields),
+ Token beginToken,
+ Token endToken,
+ bool hasParseError) {
VariableList fields =
new PartialFieldList(beginToken, endToken, modifiers, hasParseError);
for (Link<Node> variableNodes = variables.nodes;
- !variableNodes.isEmpty;
- variableNodes = variableNodes.tail) {
+ !variableNodes.isEmpty;
+ variableNodes = variableNodes.tail) {
Expression initializedIdentifier = variableNodes.head;
Identifier identifier = initializedIdentifier.asIdentifier();
if (identifier == null) {
@@ -398,7 +379,7 @@
pushNode(makeNodeList(count, beginToken, endToken, ','));
}
- void handleNoTypeVariables(token) {
+ void handleNoTypeVariables(Token token) {
pushNode(null);
}
@@ -518,15 +499,13 @@
Token expectedIdentifier(Token token) {
if (token is KeywordToken) {
- reportError(
- token, MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
+ reportError(token, MessageKind.EXPECTED_IDENTIFIER_NOT_RESERVED_WORD,
{'keyword': token.value});
} else if (token is ErrorToken) {
reportErrorToken(token);
return synthesizeIdentifier(token);
} else {
- reportFatalError(token,
- "Expected identifier, but got '${token.value}'.");
+ reportFatalError(token, "Expected identifier, but got '${token.value}'.");
}
return token;
}
@@ -537,8 +516,7 @@
reportErrorToken(token);
return synthesizeIdentifier(token);
} else {
- reportFatalError(
- token, "Expected a type, but got '${token.value}'.");
+ reportFatalError(token, "Expected a type, but got '${token.value}'.");
return skipToEof(token);
}
}
@@ -549,8 +527,8 @@
pushNode(new ErrorExpression(token));
return token.next;
} else {
- reportFatalError(token,
- "Expected an expression, but got '${token.value}'.");
+ reportFatalError(
+ token, "Expected an expression, but got '${token.value}'.");
pushNode(null);
return skipToEof(token);
}
@@ -582,8 +560,8 @@
reportErrorToken(token);
} else {
String printString = token.value;
- reportFatalError(token,
- "Expected a function body, but got '$printString'.");
+ reportFatalError(
+ token, "Expected a function body, but got '$printString'.");
}
return skipToEof(token);
}
@@ -592,8 +570,8 @@
if (token is ErrorToken) {
reportErrorToken(token);
} else {
- reportFatalError(token,
- "Expected a class body, but got '${token.value}'.");
+ reportFatalError(
+ token, "Expected a class body, but got '${token.value}'.");
}
return skipToEof(token);
}
@@ -606,8 +584,8 @@
if (token is ErrorToken) {
reportErrorToken(token);
} else {
- reportFatalError(token,
- "Expected a declaration, but got '${token.value}'.");
+ reportFatalError(
+ token, "Expected a declaration, but got '${token.value}'.");
}
return skipToEof(token);
}
@@ -677,8 +655,8 @@
print(message);
}
- NodeList makeNodeList(int count, Token beginToken, Token endToken,
- String delimiter) {
+ NodeList makeNodeList(
+ int count, Token beginToken, Token endToken, String delimiter) {
Link<Node> poppedNodes = const Link<Node>();
for (; count > 0; --count) {
// This effectively reverses the order of nodes so they end up
@@ -706,17 +684,15 @@
void endLiteralString(int count) {
StringQuoting quoting = popQuoting();
- Link<StringInterpolationPart> parts =
- const Link<StringInterpolationPart>();
+ Link<StringInterpolationPart> parts = const Link<StringInterpolationPart>();
// Parts of the string interpolation are popped in reverse order,
// starting with the last literal string part.
bool isLast = true;
for (int i = 0; i < count; i++) {
LiteralString string = popNode();
- DartString validation =
- stringValidator.validateInterpolationPart(string.token, quoting,
- isFirst: false,
- isLast: isLast);
+ DartString validation = stringValidator.validateInterpolationPart(
+ string.token, quoting,
+ isFirst: false, isLast: isLast);
// Replace the unvalidated LiteralString with a new LiteralString
// object that has the validation result included.
string = new LiteralString(string.token, validation);
@@ -726,10 +702,9 @@
}
LiteralString string = popNode();
- DartString validation =
- stringValidator.validateInterpolationPart(string.token, quoting,
- isFirst: true,
- isLast: isLast);
+ DartString validation = stringValidator.validateInterpolationPart(
+ string.token, quoting,
+ isFirst: true, isLast: isLast);
string = new LiteralString(string.token, validation);
if (isLast) {
pushNode(string);
@@ -783,9 +758,8 @@
throw new ParserError(message);
}
- void reportError(Spannable spannable,
- MessageKind errorCode,
- [Map arguments = const {}]) {
+ void reportError(Spannable spannable, MessageKind errorCode,
+ [Map arguments = const {}]) {
if (currentMemberHasParseError) return; // Error already reported.
if (suppressParseErrors) return;
if (!memberErrors.isEmpty) {
diff --git a/pkg/compiler/lib/src/parser/listener.dart b/pkg/compiler/lib/src/parser/listener.dart
index 618b86a..e1e4c3c 100644
--- a/pkg/compiler/lib/src/parser/listener.dart
+++ b/pkg/compiler/lib/src/parser/listener.dart
@@ -5,19 +5,18 @@
library dart2js.parser.listener;
import '../common.dart';
-import '../diagnostics/messages.dart' show
- MessageTemplate;
-import '../tokens/precedence_constants.dart' as Precedence show
- EOF_INFO,
- IDENTIFIER_INFO;
-import '../tokens/token.dart' show
- BadInputToken,
- BeginGroupToken,
- ErrorToken,
- StringToken,
- Token,
- UnmatchedToken,
- UnterminatedToken;
+import '../diagnostics/messages.dart' show MessageTemplate;
+import '../tokens/precedence_constants.dart' as Precedence
+ show EOF_INFO, IDENTIFIER_INFO;
+import '../tokens/token.dart'
+ show
+ BadInputToken,
+ BeginGroupToken,
+ ErrorToken,
+ StringToken,
+ Token,
+ UnmatchedToken,
+ UnterminatedToken;
import '../tree/tree.dart';
const bool VERBOSE = false;
@@ -27,582 +26,404 @@
* on parser errors.
*/
class Listener {
- set suppressParseErrors(bool value) {
- }
+ set suppressParseErrors(bool value) {}
- void beginArguments(Token token) {
- }
+ void beginArguments(Token token) {}
- void endArguments(int count, Token beginToken, Token endToken) {
- }
+ void endArguments(int count, Token beginToken, Token endToken) {}
/// Handle async modifiers `async`, `async*`, `sync`.
- void handleAsyncModifier(Token asyncToken, Token startToken) {
- }
+ void handleAsyncModifier(Token asyncToken, Token startToken) {}
- void beginAwaitExpression(Token token) {
- }
+ void beginAwaitExpression(Token token) {}
- void endAwaitExpression(Token beginToken, Token endToken) {
- }
+ void endAwaitExpression(Token beginToken, Token endToken) {}
- void beginBlock(Token token) {
- }
+ void beginBlock(Token token) {}
- void endBlock(int count, Token beginToken, Token endToken) {
- }
+ void endBlock(int count, Token beginToken, Token endToken) {}
- void beginCascade(Token token) {
- }
+ void beginCascade(Token token) {}
- void endCascade() {
- }
+ void endCascade() {}
- void beginClassBody(Token token) {
- }
+ void beginClassBody(Token token) {}
- void endClassBody(int memberCount, Token beginToken, Token endToken) {
- }
+ void endClassBody(int memberCount, Token beginToken, Token endToken) {}
- void beginClassDeclaration(Token token) {
- }
+ void beginClassDeclaration(Token token) {}
void endClassDeclaration(int interfacesCount, Token beginToken,
- Token extendsKeyword, Token implementsKeyword,
- Token endToken) {
- }
+ Token extendsKeyword, Token implementsKeyword, Token endToken) {}
- void beginCombinators(Token token) {
- }
+ void beginCombinators(Token token) {}
- void endCombinators(int count) {
- }
+ void endCombinators(int count) {}
- void beginCompilationUnit(Token token) {
- }
+ void beginCompilationUnit(Token token) {}
- void endCompilationUnit(int count, Token token) {
- }
+ void endCompilationUnit(int count, Token token) {}
- void beginConstructorReference(Token start) {
- }
+ void beginConstructorReference(Token start) {}
- void endConstructorReference(Token start, Token periodBeforeName,
- Token endToken) {
- }
+ void endConstructorReference(
+ Token start, Token periodBeforeName, Token endToken) {}
- void beginDoWhileStatement(Token token) {
- }
+ void beginDoWhileStatement(Token token) {}
- void endDoWhileStatement(Token doKeyword, Token whileKeyword,
- Token endToken) {
- }
+ void endDoWhileStatement(
+ Token doKeyword, Token whileKeyword, Token endToken) {}
- void beginEnum(Token enumKeyword) {
- }
+ void beginEnum(Token enumKeyword) {}
- void endEnum(Token enumKeyword, Token endBrace, int count) {
- }
+ void endEnum(Token enumKeyword, Token endBrace, int count) {}
- void beginExport(Token token) {
- }
+ void beginExport(Token token) {}
- void endExport(Token exportKeyword, Token semicolon) {
- }
+ void endExport(Token exportKeyword, Token semicolon) {}
- void beginExpressionStatement(Token token) {
- }
+ void beginExpressionStatement(Token token) {}
- void endExpressionStatement(Token token) {
- }
+ void endExpressionStatement(Token token) {}
- void beginFactoryMethod(Token token) {
- }
+ void beginFactoryMethod(Token token) {}
- void endFactoryMethod(Token beginToken, Token endToken) {
- }
+ void endFactoryMethod(Token beginToken, Token endToken) {}
- void beginFormalParameter(Token token) {
- }
+ void beginFormalParameter(Token token) {}
- void endFormalParameter(Token thisKeyword) {
- }
+ void endFormalParameter(Token thisKeyword) {}
- void handleNoFormalParameters(Token token) {
- }
+ void handleNoFormalParameters(Token token) {}
- void beginFormalParameters(Token token) {
- }
+ void beginFormalParameters(Token token) {}
- void endFormalParameters(int count, Token beginToken, Token endToken) {
- }
+ void endFormalParameters(int count, Token beginToken, Token endToken) {}
- void endFields(int count, Token beginToken, Token endToken) {
- }
+ void endFields(int count, Token beginToken, Token endToken) {}
- void beginForStatement(Token token) {
- }
+ void beginForStatement(Token token) {}
- void endForStatement(int updateExpressionCount,
- Token beginToken, Token endToken) {
- }
+ void endForStatement(
+ int updateExpressionCount, Token beginToken, Token endToken) {}
- void endForIn(Token awaitToken, Token forToken,
- Token inKeyword, Token endToken) {
- }
+ void endForIn(
+ Token awaitToken, Token forToken, Token inKeyword, Token endToken) {}
- void beginFunction(Token token) {
- }
+ void beginFunction(Token token) {}
- void endFunction(Token getOrSet, Token endToken) {
- }
+ void endFunction(Token getOrSet, Token endToken) {}
- void beginFunctionDeclaration(Token token) {
- }
+ void beginFunctionDeclaration(Token token) {}
- void endFunctionDeclaration(Token token) {
- }
+ void endFunctionDeclaration(Token token) {}
- void beginFunctionBody(Token token) {
- }
+ void beginFunctionBody(Token token) {}
- void endFunctionBody(int count, Token beginToken, Token endToken) {
- }
+ void endFunctionBody(int count, Token beginToken, Token endToken) {}
- void handleNoFunctionBody(Token token) {
- }
+ void handleNoFunctionBody(Token token) {}
- void skippedFunctionBody(Token token) {
- }
+ void skippedFunctionBody(Token token) {}
- void beginFunctionName(Token token) {
- }
+ void beginFunctionName(Token token) {}
- void endFunctionName(Token token) {
- }
+ void endFunctionName(Token token) {}
- void beginFunctionTypeAlias(Token token) {
- }
+ void beginFunctionTypeAlias(Token token) {}
- void endFunctionTypeAlias(Token typedefKeyword, Token endToken) {
- }
+ void endFunctionTypeAlias(Token typedefKeyword, Token endToken) {}
- void beginMixinApplication(Token token) {
- }
+ void beginMixinApplication(Token token) {}
- void endMixinApplication() {
- }
+ void endMixinApplication() {}
- void beginNamedMixinApplication(Token token) {
- }
+ void beginNamedMixinApplication(Token token) {}
- void endNamedMixinApplication(Token classKeyword,
- Token implementsKeyword,
- Token endToken) {
- }
+ void endNamedMixinApplication(
+ Token classKeyword, Token implementsKeyword, Token endToken) {}
- void beginHide(Token hideKeyword) {
- }
+ void beginHide(Token hideKeyword) {}
- void endHide(Token hideKeyword) {
- }
+ void endHide(Token hideKeyword) {}
- void beginIdentifierList(Token token) {
- }
+ void beginIdentifierList(Token token) {}
- void endIdentifierList(int count) {
- }
+ void endIdentifierList(int count) {}
- void beginTypeList(Token token) {
- }
+ void beginTypeList(Token token) {}
- void endTypeList(int count) {
- }
+ void endTypeList(int count) {}
- void beginIfStatement(Token token) {
- }
+ void beginIfStatement(Token token) {}
- void endIfStatement(Token ifToken, Token elseToken) {
- }
+ void endIfStatement(Token ifToken, Token elseToken) {}
- void beginImport(Token importKeyword) {
- }
+ void beginImport(Token importKeyword) {}
- void endImport(Token importKeyword, Token DeferredKeyword,
- Token asKeyword, Token semicolon) {
- }
+ void endImport(Token importKeyword, Token DeferredKeyword, Token asKeyword,
+ Token semicolon) {}
- void beginConditionalUris(Token token) {
- }
+ void beginConditionalUris(Token token) {}
- void endConditionalUris(int count) {
- }
+ void endConditionalUris(int count) {}
- void beginConditionalUri(Token ifKeyword) {
- }
+ void beginConditionalUri(Token ifKeyword) {}
- void endConditionalUri(Token ifKeyword, Token equalitySign) {
- }
+ void endConditionalUri(Token ifKeyword, Token equalitySign) {}
- void beginDottedName(Token token) {
- }
+ void beginDottedName(Token token) {}
- void endDottedName(int count, Token firstIdentifier) {
- }
+ void endDottedName(int count, Token firstIdentifier) {}
- void beginInitializedIdentifier(Token token) {
- }
+ void beginInitializedIdentifier(Token token) {}
- void endInitializedIdentifier() {
- }
+ void endInitializedIdentifier() {}
- void beginInitializer(Token token) {
- }
+ void beginInitializer(Token token) {}
- void endInitializer(Token assignmentOperator) {
- }
+ void endInitializer(Token assignmentOperator) {}
- void beginInitializers(Token token) {
- }
+ void beginInitializers(Token token) {}
- void endInitializers(int count, Token beginToken, Token endToken) {
- }
+ void endInitializers(int count, Token beginToken, Token endToken) {}
- void handleNoInitializers() {
- }
+ void handleNoInitializers() {}
- void handleLabel(Token token) {
- }
+ void handleLabel(Token token) {}
- void beginLabeledStatement(Token token, int labelCount) {
- }
+ void beginLabeledStatement(Token token, int labelCount) {}
- void endLabeledStatement(int labelCount) {
- }
+ void endLabeledStatement(int labelCount) {}
- void beginLibraryName(Token token) {
- }
+ void beginLibraryName(Token token) {}
- void endLibraryName(Token libraryKeyword, Token semicolon) {
- }
+ void endLibraryName(Token libraryKeyword, Token semicolon) {}
- void beginLiteralMapEntry(Token token) {
- }
+ void beginLiteralMapEntry(Token token) {}
- void endLiteralMapEntry(Token colon, Token endToken) {
- }
+ void endLiteralMapEntry(Token colon, Token endToken) {}
- void beginLiteralString(Token token) {
- }
+ void beginLiteralString(Token token) {}
- void endLiteralString(int interpolationCount) {
- }
+ void endLiteralString(int interpolationCount) {}
- void handleStringJuxtaposition(int literalCount) {
- }
+ void handleStringJuxtaposition(int literalCount) {}
- void beginMember(Token token) {
- }
+ void beginMember(Token token) {}
- void endMethod(Token getOrSet, Token beginToken, Token endToken) {
- }
+ void endMethod(Token getOrSet, Token beginToken, Token endToken) {}
- void beginMetadataStar(Token token) {
- }
+ void beginMetadataStar(Token token) {}
- void endMetadataStar(int count, bool forParameter) {
- }
+ void endMetadataStar(int count, bool forParameter) {}
- void beginMetadata(Token token) {
- }
+ void beginMetadata(Token token) {}
- void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {
- }
+ void endMetadata(Token beginToken, Token periodBeforeName, Token endToken) {}
- void beginOptionalFormalParameters(Token token) {
- }
+ void beginOptionalFormalParameters(Token token) {}
- void endOptionalFormalParameters(int count,
- Token beginToken, Token endToken) {
- }
+ void endOptionalFormalParameters(
+ int count, Token beginToken, Token endToken) {}
- void beginPart(Token token) {
- }
+ void beginPart(Token token) {}
- void endPart(Token partKeyword, Token semicolon) {
- }
+ void endPart(Token partKeyword, Token semicolon) {}
- void beginPartOf(Token token) {
- }
+ void beginPartOf(Token token) {}
- void endPartOf(Token partKeyword, Token semicolon) {
- }
+ void endPartOf(Token partKeyword, Token semicolon) {}
- void beginRedirectingFactoryBody(Token token) {
- }
+ void beginRedirectingFactoryBody(Token token) {}
- void endRedirectingFactoryBody(Token beginToken, Token endToken) {
- }
+ void endRedirectingFactoryBody(Token beginToken, Token endToken) {}
- void beginReturnStatement(Token token) {
- }
+ void beginReturnStatement(Token token) {}
- void endReturnStatement(bool hasExpression,
- Token beginToken, Token endToken) {
- }
+ void endReturnStatement(
+ bool hasExpression, Token beginToken, Token endToken) {}
- void beginSend(Token token) {
- }
+ void beginSend(Token token) {}
- void endSend(Token token) {
- }
+ void endSend(Token token) {}
- void beginShow(Token showKeyword) {
- }
+ void beginShow(Token showKeyword) {}
- void endShow(Token showKeyword) {
- }
+ void endShow(Token showKeyword) {}
- void beginSwitchStatement(Token token) {
- }
+ void beginSwitchStatement(Token token) {}
- void endSwitchStatement(Token switchKeyword, Token endToken) {
- }
+ void endSwitchStatement(Token switchKeyword, Token endToken) {}
- void beginSwitchBlock(Token token) {
- }
+ void beginSwitchBlock(Token token) {}
- void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
- }
+ void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {}
- void beginLiteralSymbol(Token token) {
- }
+ void beginLiteralSymbol(Token token) {}
- void endLiteralSymbol(Token hashToken, int identifierCount) {
- }
+ void endLiteralSymbol(Token hashToken, int identifierCount) {}
- void beginThrowExpression(Token token) {
- }
+ void beginThrowExpression(Token token) {}
- void endThrowExpression(Token throwToken, Token endToken) {
- }
+ void endThrowExpression(Token throwToken, Token endToken) {}
- void beginRethrowStatement(Token token) {
- }
+ void beginRethrowStatement(Token token) {}
- void endRethrowStatement(Token throwToken, Token endToken) {
- }
+ void endRethrowStatement(Token throwToken, Token endToken) {}
- void endTopLevelDeclaration(Token token) {
- }
+ void endTopLevelDeclaration(Token token) {}
- void beginTopLevelMember(Token token) {
- }
+ void beginTopLevelMember(Token token) {}
- void endTopLevelFields(int count, Token beginToken, Token endToken) {
- }
+ void endTopLevelFields(int count, Token beginToken, Token endToken) {}
- void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
- }
+ void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {}
- void beginTryStatement(Token token) {
- }
+ void beginTryStatement(Token token) {}
- void handleCaseMatch(Token caseKeyword, Token colon) {
- }
+ void handleCaseMatch(Token caseKeyword, Token colon) {}
- void handleCatchBlock(Token onKeyword, Token catchKeyword) {
- }
+ void handleCatchBlock(Token onKeyword, Token catchKeyword) {}
- void handleFinallyBlock(Token finallyKeyword) {
- }
+ void handleFinallyBlock(Token finallyKeyword) {}
- void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
- }
+ void endTryStatement(
+ int catchCount, Token tryKeyword, Token finallyKeyword) {}
- void endType(Token beginToken, Token endToken) {
- }
+ void endType(Token beginToken, Token endToken) {}
- void beginTypeArguments(Token token) {
- }
+ void beginTypeArguments(Token token) {}
- void endTypeArguments(int count, Token beginToken, Token endToken) {
- }
+ void endTypeArguments(int count, Token beginToken, Token endToken) {}
- void handleNoTypeArguments(Token token) {
- }
+ void handleNoTypeArguments(Token token) {}
- void beginTypeVariable(Token token) {
- }
+ void beginTypeVariable(Token token) {}
- void endTypeVariable(Token token) {
- }
+ void endTypeVariable(Token token) {}
- void beginTypeVariables(Token token) {
- }
+ void beginTypeVariables(Token token) {}
- void endTypeVariables(int count, Token beginToken, Token endToken) {
- }
+ void endTypeVariables(int count, Token beginToken, Token endToken) {}
- void beginUnnamedFunction(Token token) {
- }
+ void beginUnnamedFunction(Token token) {}
- void endUnnamedFunction(Token token) {
- }
+ void endUnnamedFunction(Token token) {}
- void beginVariablesDeclaration(Token token) {
- }
+ void beginVariablesDeclaration(Token token) {}
- void endVariablesDeclaration(int count, Token endToken) {
- }
+ void endVariablesDeclaration(int count, Token endToken) {}
- void beginWhileStatement(Token token) {
- }
+ void beginWhileStatement(Token token) {}
- void endWhileStatement(Token whileKeyword, Token endToken) {
- }
+ void endWhileStatement(Token whileKeyword, Token endToken) {}
void handleAsOperator(Token operathor, Token endToken) {
// TODO(ahe): Rename [operathor] to "operator" when VM bug is fixed.
}
- void handleAssignmentExpression(Token token) {
- }
+ void handleAssignmentExpression(Token token) {}
- void handleBinaryExpression(Token token) {
- }
+ void handleBinaryExpression(Token token) {}
- void handleConditionalExpression(Token question, Token colon) {
- }
+ void handleConditionalExpression(Token question, Token colon) {}
- void handleConstExpression(Token token) {
- }
+ void handleConstExpression(Token token) {}
- void handleFunctionTypedFormalParameter(Token token) {
- }
+ void handleFunctionTypedFormalParameter(Token token) {}
- void handleIdentifier(Token token) {
- }
+ void handleIdentifier(Token token) {}
- void handleIndexedExpression(Token openCurlyBracket,
- Token closeCurlyBracket) {
- }
+ void handleIndexedExpression(
+ Token openCurlyBracket, Token closeCurlyBracket) {}
void handleIsOperator(Token operathor, Token not, Token endToken) {
// TODO(ahe): Rename [operathor] to "operator" when VM bug is fixed.
}
- void handleLiteralBool(Token token) {
- }
+ void handleLiteralBool(Token token) {}
- void handleBreakStatement(bool hasTarget,
- Token breakKeyword, Token endToken) {
- }
+ void handleBreakStatement(
+ bool hasTarget, Token breakKeyword, Token endToken) {}
- void handleContinueStatement(bool hasTarget,
- Token continueKeyword, Token endToken) {
- }
+ void handleContinueStatement(
+ bool hasTarget, Token continueKeyword, Token endToken) {}
- void handleEmptyStatement(Token token) {
- }
+ void handleEmptyStatement(Token token) {}
- void handleAssertStatement(Token assertKeyword,
- Token commaToken, Token semicolonToken) {
- }
+ void handleAssertStatement(
+ Token assertKeyword, Token commaToken, Token semicolonToken) {}
/** Called with either the token containing a double literal, or
* an immediately preceding "unary plus" token.
*/
- void handleLiteralDouble(Token token) {
- }
+ void handleLiteralDouble(Token token) {}
/** Called with either the token containing an integer literal,
* or an immediately preceding "unary plus" token.
*/
- void handleLiteralInt(Token token) {
- }
+ void handleLiteralInt(Token token) {}
- void handleLiteralList(int count, Token beginToken, Token constKeyword,
- Token endToken) {
- }
+ void handleLiteralList(
+ int count, Token beginToken, Token constKeyword, Token endToken) {}
- void handleLiteralMap(int count, Token beginToken, Token constKeyword,
- Token endToken) {
- }
+ void handleLiteralMap(
+ int count, Token beginToken, Token constKeyword, Token endToken) {}
- void handleLiteralNull(Token token) {
- }
+ void handleLiteralNull(Token token) {}
- void handleModifier(Token token) {
- }
+ void handleModifier(Token token) {}
- void handleModifiers(int count) {
- }
+ void handleModifiers(int count) {}
- void handleNamedArgument(Token colon) {
- }
+ void handleNamedArgument(Token colon) {}
- void handleNewExpression(Token token) {
- }
+ void handleNewExpression(Token token) {}
- void handleNoArguments(Token token) {
- }
+ void handleNoArguments(Token token) {}
- void handleNoExpression(Token token) {
- }
+ void handleNoExpression(Token token) {}
- void handleNoType(Token token) {
- }
+ void handleNoType(Token token) {}
- void handleNoTypeVariables(Token token) {
- }
+ void handleNoTypeVariables(Token token) {}
- void handleOperator(Token token) {
- }
+ void handleOperator(Token token) {}
- void handleOperatorName(Token operatorKeyword, Token token) {
- }
+ void handleOperatorName(Token operatorKeyword, Token token) {}
- void handleParenthesizedExpression(BeginGroupToken token) {
- }
+ void handleParenthesizedExpression(BeginGroupToken token) {}
- void handleQualified(Token period) {
- }
+ void handleQualified(Token period) {}
- void handleStringPart(Token token) {
- }
+ void handleStringPart(Token token) {}
- void handleSuperExpression(Token token) {
- }
+ void handleSuperExpression(Token token) {}
- void handleSwitchCase(int labelCount, int expressionCount,
- Token defaultKeyword, int statementCount,
- Token firstToken, Token endToken) {
- }
+ void handleSwitchCase(
+ int labelCount,
+ int expressionCount,
+ Token defaultKeyword,
+ int statementCount,
+ Token firstToken,
+ Token endToken) {}
- void handleThisExpression(Token token) {
- }
+ void handleThisExpression(Token token) {}
- void handleUnaryPostfixAssignmentExpression(Token token) {
- }
+ void handleUnaryPostfixAssignmentExpression(Token token) {}
- void handleUnaryPrefixExpression(Token token) {
- }
+ void handleUnaryPrefixExpression(Token token) {}
- void handleUnaryPrefixAssignmentExpression(Token token) {
- }
+ void handleUnaryPrefixAssignmentExpression(Token token) {}
- void handleValuedFormalParameter(Token equals, Token token) {
- }
+ void handleValuedFormalParameter(Token equals, Token token) {}
- void handleVoidKeyword(Token token) {
- }
+ void handleVoidKeyword(Token token) {}
- void beginYieldStatement(Token token) {
- }
+ void beginYieldStatement(Token token) {}
- void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {
- }
+ void endYieldStatement(Token yieldToken, Token starToken, Token endToken) {}
Token expected(String string, Token token) {
if (token is ErrorToken) {
@@ -614,9 +435,8 @@
}
Token synthesizeIdentifier(Token token) {
- Token synthesizedToken =
- new StringToken.fromString(
- Precedence.IDENTIFIER_INFO, '?', token.charOffset);
+ Token synthesizedToken = new StringToken.fromString(
+ Precedence.IDENTIFIER_INFO, '?', token.charOffset);
synthesizedToken.next = token.next;
return synthesizedToken;
}
@@ -726,9 +546,8 @@
throw new ParserError("$message @ ${token.charOffset}");
}
- void reportError(Spannable spannable,
- MessageKind messageKind,
- [Map arguments = const {}]) {
+ void reportError(Spannable spannable, MessageKind messageKind,
+ [Map arguments = const {}]) {
MessageTemplate template = MessageTemplate.TEMPLATES[messageKind];
String message = template.message(arguments, true).toString();
Token token;
@@ -795,13 +614,7 @@
}
String closeBraceFor(String openBrace) {
- return const {
- '(': ')',
- '[': ']',
- '{': '}',
- '<': '>',
- r'${': '}',
- }[openBrace];
+ return const {'(': ')', '[': ']', '{': '}', '<': '>', r'${': '}',}[openBrace];
}
class ParserError {
diff --git a/pkg/compiler/lib/src/parser/member_listener.dart b/pkg/compiler/lib/src/parser/member_listener.dart
index 36ebc34..a13024c 100644
--- a/pkg/compiler/lib/src/parser/member_listener.dart
+++ b/pkg/compiler/lib/src/parser/member_listener.dart
@@ -5,41 +5,31 @@
library dart2js.parser.member_listener;
import '../common.dart';
-import '../elements/elements.dart' show
- Element,
- ElementKind,
- Elements,
- MetadataAnnotation;
-import '../elements/modelx.dart' show
- ClassElementX,
- ElementX,
- FieldElementX,
- VariableList;
-import '../tokens/token.dart' show
- Token;
+import '../elements/elements.dart'
+ show Element, ElementKind, Elements, MetadataAnnotation;
+import '../elements/modelx.dart'
+ show ClassElementX, ElementX, FieldElementX, VariableList;
+import '../tokens/token.dart' show Token;
import '../tree/tree.dart';
-import 'element_listener.dart' show
- ScannerOptions;
-import 'node_listener.dart' show
- NodeListener;
-import 'partial_elements.dart' show
- PartialConstructorElement,
- PartialFunctionElement,
- PartialMetadataAnnotation;
+import 'element_listener.dart' show ScannerOptions;
+import 'node_listener.dart' show NodeListener;
+import 'partial_elements.dart'
+ show
+ PartialConstructorElement,
+ PartialFunctionElement,
+ PartialMetadataAnnotation;
class MemberListener extends NodeListener {
final ClassElementX enclosingClass;
- MemberListener(ScannerOptions scannerOptions,
- DiagnosticReporter listener,
- ClassElementX enclosingElement)
+ MemberListener(ScannerOptions scannerOptions, DiagnosticReporter listener,
+ ClassElementX enclosingElement)
: this.enclosingClass = enclosingElement,
super(scannerOptions, listener, enclosingElement.compilationUnit);
bool isConstructorName(Node nameNode) {
- if (enclosingClass == null ||
- enclosingClass.kind != ElementKind.CLASS) {
+ if (enclosingClass == null || enclosingClass.kind != ElementKind.CLASS) {
return false;
}
String name;
@@ -90,15 +80,12 @@
if (getOrSet != null) {
recoverableError(getOrSet, 'illegal modifier');
}
- memberElement = new PartialConstructorElement(
- name, beginToken, endToken,
- ElementKind.GENERATIVE_CONSTRUCTOR,
- method.modifiers,
- enclosingClass);
+ memberElement = new PartialConstructorElement(name, beginToken, endToken,
+ ElementKind.GENERATIVE_CONSTRUCTOR, method.modifiers, enclosingClass);
} else {
- memberElement = new PartialFunctionElement(
- name, beginToken, getOrSet, endToken,
- method.modifiers, enclosingClass, hasBody: method.hasBody);
+ memberElement = new PartialFunctionElement(name, beginToken, getOrSet,
+ endToken, method.modifiers, enclosingClass,
+ hasBody: method.hasBody);
}
addMember(memberElement);
}
@@ -118,7 +105,9 @@
}
}
Element memberElement = new PartialConstructorElement(
- name, beginToken, endToken,
+ name,
+ beginToken,
+ endToken,
ElementKind.FACTORY_CONSTRUCTOR,
method.modifiers,
enclosingClass);
@@ -132,19 +121,16 @@
Modifiers modifiers = variableDefinitions.modifiers;
pushNode(null);
void buildFieldElement(Identifier name, VariableList fields) {
- Element element =
- new FieldElementX(name, enclosingClass, fields);
+ Element element = new FieldElementX(name, enclosingClass, fields);
addMember(element);
}
buildFieldElements(modifiers, variableDefinitions.definitions,
- enclosingClass,
- buildFieldElement, beginToken, endToken,
- hasParseError);
+ enclosingClass, buildFieldElement, beginToken, endToken, hasParseError);
}
void endInitializer(Token assignmentOperator) {
pushNode(null); // Super expects an expression, but
- // ClassElementParser just skips expressions.
+ // ClassElementParser just skips expressions.
super.endInitializer(assignmentOperator);
}
diff --git a/pkg/compiler/lib/src/parser/node_listener.dart b/pkg/compiler/lib/src/parser/node_listener.dart
index b5f1db2..df288b6 100644
--- a/pkg/compiler/lib/src/parser/node_listener.dart
+++ b/pkg/compiler/lib/src/parser/node_listener.dart
@@ -5,33 +5,21 @@
library dart2js.parser.node_listener;
import '../common.dart';
-import '../elements/elements.dart' show
- CompilationUnitElement;
+import '../elements/elements.dart' show CompilationUnitElement;
import '../native/native.dart' as native;
-import '../tokens/precedence_constants.dart' as Precedence show
- BAD_INPUT_INFO,
- EOF_INFO,
- INDEX_INFO;
-import '../tokens/token.dart' show
- ErrorToken,
- StringToken,
- Token;
+import '../tokens/precedence_constants.dart' as Precedence
+ show BAD_INPUT_INFO, EOF_INFO, INDEX_INFO;
+import '../tokens/token.dart' show ErrorToken, StringToken, Token;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link;
+import '../util/util.dart' show Link;
-import 'element_listener.dart' show
- ElementListener,
- ScannerOptions;
-import 'partial_elements.dart' show
- PartialFunctionElement;
+import 'element_listener.dart' show ElementListener, ScannerOptions;
+import 'partial_elements.dart' show PartialFunctionElement;
class NodeListener extends ElementListener {
- NodeListener(
- ScannerOptions scannerOptions,
- DiagnosticReporter reporter,
+ NodeListener(ScannerOptions scannerOptions, DiagnosticReporter reporter,
CompilationUnitElement element)
- : super(scannerOptions, reporter, element, null);
+ : super(scannerOptions, reporter, element, null);
void addLibraryTag(LibraryTag tag) {
pushNode(tag);
@@ -42,8 +30,7 @@
}
void endClassDeclaration(int interfacesCount, Token beginToken,
- Token extendsKeyword, Token implementsKeyword,
- Token endToken) {
+ Token extendsKeyword, Token implementsKeyword, Token endToken) {
NodeList body = popNode();
NodeList interfaces =
makeNodeList(interfacesCount, implementsKeyword, null, ",");
@@ -52,8 +39,7 @@
Identifier name = popNode();
Modifiers modifiers = popNode();
pushNode(new ClassNode(modifiers, name, typeParameters, supertype,
- interfaces, beginToken, extendsKeyword, body,
- endToken));
+ interfaces, beginToken, extendsKeyword, body, endToken));
}
void endCompilationUnit(int count, Token token) {
@@ -65,22 +51,19 @@
NodeList typeParameters = popNode();
Identifier name = popNode();
TypeAnnotation returnType = popNode();
- pushNode(new Typedef(returnType, name, typeParameters, formals,
- typedefKeyword, endToken));
+ pushNode(new Typedef(
+ returnType, name, typeParameters, formals, typedefKeyword, endToken));
}
- void endNamedMixinApplication(Token classKeyword,
- Token implementsKeyword,
- Token endToken) {
+ void endNamedMixinApplication(
+ Token classKeyword, Token implementsKeyword, Token endToken) {
NodeList interfaces = (implementsKeyword != null) ? popNode() : null;
Node mixinApplication = popNode();
Modifiers modifiers = popNode();
NodeList typeParameters = popNode();
Identifier name = popNode();
- pushNode(new NamedMixinApplication(name, typeParameters,
- modifiers, mixinApplication,
- interfaces,
- classKeyword, endToken));
+ pushNode(new NamedMixinApplication(name, typeParameters, modifiers,
+ mixinApplication, interfaces, classKeyword, endToken));
}
void endEnum(Token enumKeyword, Token endBrace, int count) {
@@ -103,12 +86,12 @@
void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
popNode(); // body
popNode(); // formalParameters
+ popNode(); // typeVariables
Identifier name = popNode();
popNode(); // type
Modifiers modifiers = popNode();
- PartialFunctionElement element = new PartialFunctionElement(
- name.source, beginToken, getOrSet, endToken,
- modifiers, compilationUnitElement);
+ PartialFunctionElement element = new PartialFunctionElement(name.source,
+ beginToken, getOrSet, endToken, modifiers, compilationUnitElement);
pushElement(element);
}
@@ -145,8 +128,8 @@
pushNode(null);
}
- void endConstructorReference(Token start, Token periodBeforeName,
- Token endToken) {
+ void endConstructorReference(
+ Token start, Token periodBeforeName, Token endToken) {
Identifier name = null;
if (periodBeforeName != null) {
name = popNode();
@@ -176,13 +159,12 @@
pushNode(constructor);
}
- void endRedirectingFactoryBody(Token beginToken,
- Token endToken) {
+ void endRedirectingFactoryBody(Token beginToken, Token endToken) {
pushNode(new RedirectingFactoryBody(beginToken, endToken, popNode()));
}
- void endReturnStatement(bool hasExpression,
- Token beginToken, Token endToken) {
+ void endReturnStatement(
+ bool hasExpression, Token beginToken, Token endToken) {
Expression expression = hasExpression ? popNode() : null;
pushNode(new Return(beginToken, endToken, expression));
}
@@ -207,8 +189,8 @@
pushNode(null);
reportErrorToken(token);
} else {
- reportFatalError(token,
- "Expected a function body, but got '${token.value}'.");
+ reportFatalError(
+ token, "Expected a function body, but got '${token.value}'.");
}
return skipToEof(token);
}
@@ -218,8 +200,8 @@
reportErrorToken(token);
return skipToEof(token);
} else {
- reportFatalError(token,
- "Expected a class body, but got '${token.value}'.");
+ reportFatalError(
+ token, "Expected a class body, but got '${token.value}'.");
return skipToEof(token);
}
}
@@ -256,27 +238,23 @@
if (argumentSend == null) {
// TODO(ahe): The parser should diagnose this problem, not
// this listener.
- reportFatalError(argument,
- 'Expected an identifier.');
+ reportFatalError(argument, 'Expected an identifier.');
}
if (argumentSend.receiver != null) internalError(node: argument);
if (argument is SendSet) internalError(node: argument);
- pushNode(argument.asSend().copyWithReceiver(receiver,
- identical(tokenString, '?.')));
+ pushNode(argument
+ .asSend()
+ .copyWithReceiver(receiver, identical(tokenString, '?.')));
} else {
NodeList arguments = new NodeList.singleton(argument);
pushNode(new Send(receiver, new Operator(token), arguments));
}
if (identical(tokenString, '===')) {
- reporter.reportErrorMessage(
- token,
- MessageKind.UNSUPPORTED_EQ_EQ_EQ,
+ reporter.reportErrorMessage(token, MessageKind.UNSUPPORTED_EQ_EQ_EQ,
{'lhs': receiver, 'rhs': argument});
}
if (identical(tokenString, '!==')) {
- reporter.reportErrorMessage(
- token,
- MessageKind.UNSUPPORTED_BANG_EQ_EQ,
+ reporter.reportErrorMessage(token, MessageKind.UNSUPPORTED_BANG_EQ_EQ,
{'lhs': receiver, 'rhs': argument});
}
}
@@ -313,15 +291,14 @@
arguments = new NodeList.singleton(arg);
}
Operator op = new Operator(token);
- pushNode(new SendSet(send.receiver, send.selector, op, arguments,
- send.isConditional));
+ pushNode(new SendSet(
+ send.receiver, send.selector, op, arguments, send.isConditional));
}
void reportNotAssignable(Node node) {
// TODO(ahe): The parser should diagnose this problem, not this
// listener.
- reportFatalError(node,
- 'Not assignable.');
+ reportFatalError(node, 'Not assignable.');
}
void handleConditionalExpression(Token question, Token colon) {
@@ -334,6 +311,7 @@
void endSend(Token token) {
NodeList arguments = popNode();
+ popNode(); // typeArguments
Node selector = popNode();
// TODO(ahe): Handle receiver.
pushNode(new Send(null, selector, arguments));
@@ -368,13 +346,13 @@
AsyncModifier asyncModifier = popNode();
NodeList initializers = popNode();
NodeList formals = popNode();
+ popNode(); // typeVariables
// The name can be an identifier or a send in case of named constructors.
Expression name = popNode();
TypeAnnotation type = popNode();
Modifiers modifiers = popNode();
- pushNode(new FunctionExpression(name, formals, body, type,
- modifiers, initializers, getOrSet,
- asyncModifier));
+ pushNode(new FunctionExpression(name, formals, body, type, modifiers,
+ initializers, getOrSet, asyncModifier));
}
void endFunctionDeclaration(Token endToken) {
@@ -406,8 +384,8 @@
pushNode(new If(condition, thenPart, elsePart, ifToken, elseToken));
}
- void endForStatement(int updateExpressionCount,
- Token beginToken, Token endToken) {
+ void endForStatement(
+ int updateExpressionCount, Token beginToken, Token endToken) {
Statement body = popNode();
NodeList updates = makeNodeList(updateExpressionCount, null, null, ',');
Statement condition = popNode();
@@ -419,8 +397,8 @@
pushNode(null);
}
- void endDoWhileStatement(Token doKeyword, Token whileKeyword,
- Token endToken) {
+ void endDoWhileStatement(
+ Token doKeyword, Token whileKeyword, Token endToken) {
Expression condition = popNode();
Statement body = popNode();
pushNode(new DoWhile(body, condition, doKeyword, whileKeyword, endToken));
@@ -481,11 +459,11 @@
Operator op = new Operator(token);
if (isPrefix) {
- pushNode(new SendSet.prefix(send.receiver, send.selector, op, argument,
- send.isConditional));
+ pushNode(new SendSet.prefix(
+ send.receiver, send.selector, op, argument, send.isConditional));
} else {
- pushNode(new SendSet.postfix(send.receiver, send.selector, op, argument,
- send.isConditional));
+ pushNode(new SendSet.postfix(
+ send.receiver, send.selector, op, argument, send.isConditional));
}
}
@@ -517,16 +495,16 @@
AsyncModifier asyncModifier = popNode();
NodeList initializers = popNode();
NodeList formalParameters = popNode();
+ popNode(); // typeVariables
Expression name = popNode();
TypeAnnotation returnType = popNode();
Modifiers modifiers = popNode();
pushNode(new FunctionExpression(name, formalParameters, body, returnType,
- modifiers, initializers, getOrSet,
- asyncModifier));
+ modifiers, initializers, getOrSet, asyncModifier));
}
- void handleLiteralMap(int count, Token beginToken, Token constKeyword,
- Token endToken) {
+ void handleLiteralMap(
+ int count, Token beginToken, Token constKeyword, Token endToken) {
NodeList entries = makeNodeList(count, beginToken, endToken, ',');
NodeList typeArguments = popNode();
pushNode(new LiteralMap(typeArguments, entries, constKeyword));
@@ -538,19 +516,19 @@
pushNode(new LiteralMapEntry(key, colon, value));
}
- void handleLiteralList(int count, Token beginToken, Token constKeyword,
- Token endToken) {
+ void handleLiteralList(
+ int count, Token beginToken, Token constKeyword, Token endToken) {
NodeList elements = makeNodeList(count, beginToken, endToken, ',');
pushNode(new LiteralList(popNode(), elements, constKeyword));
}
- void handleIndexedExpression(Token openSquareBracket,
- Token closeSquareBracket) {
+ void handleIndexedExpression(
+ Token openSquareBracket, Token closeSquareBracket) {
NodeList arguments =
makeNodeList(1, openSquareBracket, closeSquareBracket, null);
Node receiver = popNode();
- Token token = new StringToken.fromString(Precedence.INDEX_INFO, '[]',
- openSquareBracket.charOffset);
+ Token token = new StringToken.fromString(
+ Precedence.INDEX_INFO, '[]', openSquareBracket.charOffset);
Node selector = new Operator(token);
pushNode(new Send(receiver, selector, arguments));
}
@@ -581,8 +559,8 @@
pushNode(new NamedArgument(name, colon, expression));
}
- void endOptionalFormalParameters(int count,
- Token beginToken, Token endToken) {
+ void endOptionalFormalParameters(
+ int count, Token beginToken, Token endToken) {
pushNode(makeNodeList(count, beginToken, endToken, ','));
}
@@ -591,15 +569,15 @@
Identifier name = popNode();
TypeAnnotation returnType = popNode();
pushNode(null); // Signal "no type" to endFormalParameter.
- pushNode(new FunctionExpression(name, formals, null, returnType,
- Modifiers.EMPTY, null, null, null));
+ pushNode(new FunctionExpression(
+ name, formals, null, returnType, Modifiers.EMPTY, null, null, null));
}
void handleValuedFormalParameter(Token equals, Token token) {
Expression defaultValue = popNode();
Expression parameterName = popNode();
pushNode(new SendSet(null, parameterName, new Operator(equals),
- new NodeList.singleton(defaultValue)));
+ new NodeList.singleton(defaultValue)));
}
void endTryStatement(int catchCount, Token tryKeyword, Token finallyKeyword) {
@@ -609,8 +587,8 @@
}
NodeList catchBlocks = makeNodeList(catchCount, null, null, null);
Block tryBlock = popNode();
- pushNode(new TryStatement(tryBlock, catchBlocks, finallyBlock,
- tryKeyword, finallyKeyword));
+ pushNode(new TryStatement(
+ tryBlock, catchBlocks, finallyBlock, tryKeyword, finallyKeyword));
}
void handleCaseMatch(Token caseKeyword, Token colon) {
@@ -619,7 +597,7 @@
void handleCatchBlock(Token onKeyword, Token catchKeyword) {
Block block = popNode();
- NodeList formals = catchKeyword != null? popNode(): null;
+ NodeList formals = catchKeyword != null ? popNode() : null;
TypeAnnotation type = onKeyword != null ? popNode() : null;
pushNode(new CatchBlock(type, formals, block, onKeyword, catchKeyword));
}
@@ -640,18 +618,17 @@
pushNode(new NodeList(beginToken, caseNodes, endToken, null));
}
- void handleSwitchCase(int labelCount, int caseCount,
- Token defaultKeyword, int statementCount,
- Token firstToken, Token endToken) {
+ void handleSwitchCase(int labelCount, int caseCount, Token defaultKeyword,
+ int statementCount, Token firstToken, Token endToken) {
NodeList statements = makeNodeList(statementCount, null, null, null);
NodeList labelsAndCases =
makeNodeList(labelCount + caseCount, null, null, null);
- pushNode(new SwitchCase(labelsAndCases, defaultKeyword, statements,
- firstToken));
+ pushNode(
+ new SwitchCase(labelsAndCases, defaultKeyword, statements, firstToken));
}
- void handleBreakStatement(bool hasTarget,
- Token breakKeyword, Token endToken) {
+ void handleBreakStatement(
+ bool hasTarget, Token breakKeyword, Token endToken) {
Identifier target = null;
if (hasTarget) {
target = popNode();
@@ -659,8 +636,8 @@
pushNode(new BreakStatement(target, breakKeyword, endToken));
}
- void handleContinueStatement(bool hasTarget,
- Token continueKeyword, Token endToken) {
+ void handleContinueStatement(
+ bool hasTarget, Token continueKeyword, Token endToken) {
Identifier target = null;
if (hasTarget) {
target = popNode();
@@ -698,21 +675,21 @@
handleModifiers(modifierCount);
Modifiers modifiers = popNode();
- pushNode(new FunctionExpression(name, formals, body, null,
- modifiers, null, null, asyncModifier));
+ pushNode(new FunctionExpression(
+ name, formals, body, null, modifiers, null, null, asyncModifier));
}
- void endForIn(Token awaitToken, Token forToken,
- Token inKeyword, Token endToken) {
+ void endForIn(
+ Token awaitToken, Token forToken, Token inKeyword, Token endToken) {
Statement body = popNode();
Expression expression = popNode();
Node declaredIdentifier = popNode();
if (awaitToken == null) {
- pushNode(new SyncForIn(declaredIdentifier, expression, body,
- forToken, inKeyword));
+ pushNode(new SyncForIn(
+ declaredIdentifier, expression, body, forToken, inKeyword));
} else {
pushNode(new AsyncForIn(declaredIdentifier, expression, body, awaitToken,
- forToken, inKeyword));
+ forToken, inKeyword));
}
}
@@ -739,8 +716,7 @@
Node receiver = popNode();
if (typeArguments != null) {
receiver = new TypeAnnotation(receiver, typeArguments);
- recoverableError(typeArguments,
- 'Type arguments are not allowed here.');
+ recoverableError(typeArguments, 'Type arguments are not allowed here.');
} else {
Identifier identifier = receiver.asIdentifier();
Send send = receiver.asSend();
@@ -760,30 +736,27 @@
endConstructorReference(beginToken, periodBeforeName, endToken);
Node constructor = popNode();
pushNode(new Metadata(beginToken,
- new NewExpression(null,
- new Send(null, constructor, arguments))));
+ new NewExpression(null, new Send(null, constructor, arguments))));
}
}
- void handleAssertStatement(Token assertKeyword,
- Token commaToken, Token semicolonToken) {
+ void handleAssertStatement(
+ Token assertKeyword, Token commaToken, Token semicolonToken) {
Node message;
Node condition;
if (commaToken != null) {
message = popNode();
}
condition = popNode();
- pushNode(new Assert(assertKeyword, condition,
- message, semicolonToken));
+ pushNode(new Assert(assertKeyword, condition, message, semicolonToken));
}
void endUnnamedFunction(Token token) {
Statement body = popNode();
AsyncModifier asyncModifier = popNode();
NodeList formals = popNode();
- pushNode(new FunctionExpression(null, formals, body, null,
- Modifiers.EMPTY, null, null,
- asyncModifier));
+ pushNode(new FunctionExpression(
+ null, formals, body, null, Modifiers.EMPTY, null, null, asyncModifier));
}
void handleIsOperator(Token operathor, Token not, Token endToken) {
diff --git a/pkg/compiler/lib/src/parser/parser.dart b/pkg/compiler/lib/src/parser/parser.dart
index 80e6de2..0a8d68d 100644
--- a/pkg/compiler/lib/src/parser/parser.dart
+++ b/pkg/compiler/lib/src/parser/parser.dart
@@ -4,64 +4,63 @@
library dart2js.parser;
-import '../options.dart' show
- ParserOptions;
+import '../options.dart' show ParserOptions;
import '../common.dart';
-import '../tokens/keyword.dart' show
- Keyword;
-import '../tokens/precedence.dart' show
- PrecedenceInfo;
-import '../tokens/precedence_constants.dart' show
- AS_INFO,
- ASSIGNMENT_PRECEDENCE,
- CASCADE_PRECEDENCE,
- EQUALITY_PRECEDENCE,
- GT_INFO,
- GT_GT_INFO,
- IS_INFO,
- MINUS_MINUS_INFO,
- OPEN_PAREN_INFO,
- OPEN_SQUARE_BRACKET_INFO,
- PERIOD_INFO,
- PLUS_PLUS_INFO,
- POSTFIX_PRECEDENCE,
- QUESTION_INFO,
- QUESTION_PERIOD_INFO,
- RELATIONAL_PRECEDENCE;
-import '../tokens/token.dart' show
- BeginGroupToken,
- isUserDefinableOperator,
- KeywordToken,
- SymbolToken,
- Token;
-import '../tokens/token_constants.dart' show
- BAD_INPUT_TOKEN,
- COMMA_TOKEN,
- DOUBLE_TOKEN,
- EOF_TOKEN,
- EQ_TOKEN,
- FUNCTION_TOKEN,
- HASH_TOKEN,
- HEXADECIMAL_TOKEN,
- IDENTIFIER_TOKEN,
- INT_TOKEN,
- KEYWORD_TOKEN,
- LT_TOKEN,
- OPEN_CURLY_BRACKET_TOKEN,
- OPEN_PAREN_TOKEN,
- OPEN_SQUARE_BRACKET_TOKEN,
- PERIOD_TOKEN,
- SEMICOLON_TOKEN,
- STRING_INTERPOLATION_IDENTIFIER_TOKEN,
- STRING_INTERPOLATION_TOKEN,
- STRING_TOKEN;
-import '../util/characters.dart' as Characters show
- $CLOSE_CURLY_BRACKET;
-import '../util/util.dart' show
- Link;
+import '../tokens/keyword.dart' show Keyword;
+import '../tokens/precedence.dart' show PrecedenceInfo;
+import '../tokens/precedence_constants.dart'
+ show
+ AS_INFO,
+ ASSIGNMENT_PRECEDENCE,
+ CASCADE_PRECEDENCE,
+ EQUALITY_PRECEDENCE,
+ GT_INFO,
+ GT_GT_INFO,
+ IS_INFO,
+ MINUS_MINUS_INFO,
+ OPEN_PAREN_INFO,
+ OPEN_SQUARE_BRACKET_INFO,
+ PERIOD_INFO,
+ PLUS_PLUS_INFO,
+ POSTFIX_PRECEDENCE,
+ QUESTION_INFO,
+ QUESTION_PERIOD_INFO,
+ RELATIONAL_PRECEDENCE;
+import '../tokens/token.dart'
+ show
+ BeginGroupToken,
+ isUserDefinableOperator,
+ KeywordToken,
+ SymbolToken,
+ Token;
+import '../tokens/token_constants.dart'
+ show
+ BAD_INPUT_TOKEN,
+ COMMA_TOKEN,
+ DOUBLE_TOKEN,
+ EOF_TOKEN,
+ EQ_TOKEN,
+ FUNCTION_TOKEN,
+ GT_TOKEN,
+ GT_GT_TOKEN,
+ HASH_TOKEN,
+ HEXADECIMAL_TOKEN,
+ IDENTIFIER_TOKEN,
+ INT_TOKEN,
+ KEYWORD_TOKEN,
+ LT_TOKEN,
+ OPEN_CURLY_BRACKET_TOKEN,
+ OPEN_PAREN_TOKEN,
+ OPEN_SQUARE_BRACKET_TOKEN,
+ PERIOD_TOKEN,
+ SEMICOLON_TOKEN,
+ STRING_INTERPOLATION_IDENTIFIER_TOKEN,
+ STRING_INTERPOLATION_TOKEN,
+ STRING_TOKEN;
+import '../util/characters.dart' as Characters show $CLOSE_CURLY_BRACKET;
+import '../util/util.dart' show Link;
-import 'listener.dart' show
- Listener;
+import 'listener.dart' show Listener;
class FormalParameterType {
final String type;
@@ -103,8 +102,12 @@
bool mayParseFunctionExpressions = true;
bool asyncAwaitKeywordsEnabled;
- Parser(this.listener, this.parserOptions,
- {this.asyncAwaitKeywordsEnabled: false});
+ final bool enableGenericMethodSyntax;
+
+ Parser(this.listener, ParserOptions parserOptions,
+ {this.asyncAwaitKeywordsEnabled: false}) :
+ parserOptions = parserOptions,
+ enableGenericMethodSyntax = parserOptions.enableGenericMethodSyntax;
Token parseUnit(Token token) {
listener.beginCompilationUnit(token);
@@ -121,8 +124,8 @@
Token parseTopLevelDeclaration(Token token) {
token = parseMetadataStar(token);
final String value = token.stringValue;
- if ((identical(value, 'abstract') && optional('class', token.next))
- || identical(value, 'class')) {
+ if ((identical(value, 'abstract') && optional('class', token.next)) ||
+ identical(value, 'class')) {
return parseClassOrNamedMixinApplication(token);
} else if (identical(value, 'enum')) {
return parseEnum(token);
@@ -470,13 +473,13 @@
token = parseExpression(token.next);
listener.handleValuedFormalParameter(equal, token);
if (type.isRequired) {
- listener.reportError(equal,
- MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT);
+ listener.reportError(
+ equal, MessageKind.REQUIRED_PARAMETER_WITH_DEFAULT);
} else if (type.isNamed && identical('=', value)) {
listener.reportError(equal, MessageKind.NAMED_PARAMETER_WITH_EQUALS);
} else if (type.isPositional && identical(':', value)) {
- listener.reportError(equal,
- MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS);
+ listener.reportError(
+ equal, MessageKind.POSITIONAL_PARAMETER_WITH_EQUALS);
}
}
listener.endFormalParameter(thisKeyword);
@@ -490,8 +493,8 @@
int parameterCount = 0;
do {
token = token.next;
- var type = isNamed ? FormalParameterType.NAMED
- : FormalParameterType.POSITIONAL;
+ var type =
+ isNamed ? FormalParameterType.NAMED : FormalParameterType.POSITIONAL;
token = parseFormalParameter(token, type);
++parameterCount;
} while (optional(',', token));
@@ -518,13 +521,88 @@
if (identical(kind, KEYWORD_TOKEN)) {
Keyword keyword = (token as KeywordToken).keyword;
String value = keyword.syntax;
- return keyword.isPseudo
- || (identical(value, 'dynamic'))
- || (identical(value, 'void'));
+ return keyword.isPseudo ||
+ (identical(value, 'dynamic')) ||
+ (identical(value, 'void'));
}
return false;
}
+ /// Returns true if [token] matches '<' type (',' type)* '>' '(', and
+ /// otherwise returns false. The final '(' is not part of the grammar
+ /// construct `typeArguments`, but it is required here such that type
+ /// arguments in generic method invocations can be recognized, and as few as
+ /// possible other constructs will pass (e.g., 'a < C, D > 3').
+ bool isValidMethodTypeArguments(Token token) {
+ return tryParseMethodTypeArguments(token) != null;
+ }
+
+ /// Returns token after match if [token] matches '<' type (',' type)* '>' '(',
+ /// and otherwise returns null. Does not produce listener events. With respect
+ /// to the final '(', please see the description of
+ /// [isValidMethodTypeArguments].
+ Token tryParseMethodTypeArguments(Token token) {
+ if (!identical(token.kind, LT_TOKEN)) return null;
+ BeginGroupToken beginToken = token;
+ Token endToken = beginToken.endGroup;
+ if (endToken == null || !identical(endToken.next.kind, OPEN_PAREN_TOKEN)) {
+ return null;
+ }
+ token = tryParseType(token.next);
+ while (token != null && identical(token.kind, COMMA_TOKEN)) {
+ token = tryParseType(token.next);
+ }
+ if (token == null || !identical(token.kind, GT_TOKEN)) return null;
+ return token.next;
+ }
+
+ /// Returns token after match if [token] matches typeName typeArguments?, and
+ /// otherwise returns null. Does not produce listener events.
+ Token tryParseType(Token token) {
+ token = tryParseQualified(token);
+ if (token == null) return null;
+ Token tokenAfterQualified = token;
+ token = tryParseNestedTypeArguments(token);
+ return token == null ? tokenAfterQualified : token;
+ }
+
+ /// Returns token after match if [token] matches identifier ('.' identifier)?,
+ /// and otherwise returns null. Does not produce listener events.
+ Token tryParseQualified(Token token) {
+ if (!identical(token.kind, IDENTIFIER_TOKEN)) return null;
+ token = token.next;
+ if (!identical(token.kind, PERIOD_TOKEN)) return token;
+ token = token.next;
+ if (!identical(token.kind, IDENTIFIER_TOKEN)) return null;
+ return token.next;
+ }
+
+ /// Returns token after match if [token] matches '<' type (',' type)* '>',
+ /// and otherwise returns null. Does not produce listener events. The final
+ /// '>' may be the first character in a '>>' token, in which case a synthetic
+ /// '>' token is created and returned, representing the second '>' in the
+ /// '>>' token.
+ Token tryParseNestedTypeArguments(Token token) {
+ if (!identical(token.kind, LT_TOKEN)) return null;
+ // If the initial '<' matches the first '>' in a '>>' token, we will have
+ // `token.endGroup == null`, so we cannot rely on `token.endGroup == null`
+ // to imply that the match must fail. Hence no `token.endGroup == null`
+ // test here.
+ token = tryParseType(token.next);
+ while (token != null && identical(token.kind, COMMA_TOKEN)) {
+ token = tryParseType(token.next);
+ }
+ if (token == null) return null;
+ if (identical(token.kind, GT_TOKEN)) return token.next;
+ if (!identical(token.kind, GT_GT_TOKEN)) return null;
+ // [token] is '>>' of which the final '>' that we are parsing is the first
+ // character. In order to keep the parsing process on track we must return
+ // a synthetic '>' corresponding to the second character of that '>>'.
+ Token syntheticToken = new SymbolToken(GT_INFO, token.charOffset + 1);
+ syntheticToken.next = token.next;
+ return syntheticToken;
+ }
+
Token parseQualified(Token token) {
token = parseIdentifier(token);
while (optional('.', token)) {
@@ -628,8 +706,7 @@
implementsKeyword = token;
token = parseTypeList(token.next);
}
- listener.endNamedMixinApplication(
- classKeyword, implementsKeyword, token);
+ listener.endNamedMixinApplication(classKeyword, implementsKeyword, token);
return expect(';', token);
}
@@ -658,8 +735,8 @@
} while (optional(',', token));
}
token = parseClassBody(token);
- listener.endClassDeclaration(interfacesCount, begin, extendsKeyword,
- implementsKeyword, token);
+ listener.endClassDeclaration(
+ interfacesCount, begin, extendsKeyword, implementsKeyword, token);
return token.next;
}
@@ -712,8 +789,7 @@
*/
bool isOneOf3(Token token, String value1, String value2, String value3) {
String stringValue = token.stringValue;
- return
- value1 == stringValue ||
+ return value1 == stringValue ||
value2 == stringValue ||
value3 == stringValue;
}
@@ -722,18 +798,18 @@
* Returns true if the stringValue of the [token] is either [value1],
* [value2], [value3], or [value4].
*/
- bool isOneOf4(Token token,
- String value1, String value2, String value3, String value4) {
+ bool isOneOf4(
+ Token token, String value1, String value2, String value3, String value4) {
String stringValue = token.stringValue;
return value1 == stringValue ||
- value2 == stringValue ||
- value3 == stringValue ||
- value4 == stringValue;
+ value2 == stringValue ||
+ value3 == stringValue ||
+ value4 == stringValue;
}
bool notEofOrValue(String value, Token token) {
return !identical(token.kind, EOF_TOKEN) &&
- !identical(value, token.stringValue);
+ !identical(value, token.stringValue);
}
Token parseType(Token token) {
@@ -750,24 +826,26 @@
}
Token parseTypeArgumentsOpt(Token token) {
- return parseStuff(token,
- (t) => listener.beginTypeArguments(t),
- (t) => parseType(t),
- (c, bt, et) => listener.endTypeArguments(c, bt, et),
- (t) => listener.handleNoTypeArguments(t));
+ return parseStuff(
+ token,
+ (t) => listener.beginTypeArguments(t),
+ (t) => parseType(t),
+ (c, bt, et) => listener.endTypeArguments(c, bt, et),
+ (t) => listener.handleNoTypeArguments(t));
}
Token parseTypeVariablesOpt(Token token) {
- return parseStuff(token,
- (t) => listener.beginTypeVariables(t),
- (t) => parseTypeVariable(t),
- (c, bt, et) => listener.endTypeVariables(c, bt, et),
- (t) => listener.handleNoTypeVariables(t));
+ return parseStuff(
+ token,
+ (t) => listener.beginTypeVariables(t),
+ (t) => parseTypeVariable(t),
+ (c, bt, et) => listener.endTypeVariables(c, bt, et),
+ (t) => listener.handleNoTypeVariables(t));
}
// TODO(ahe): Clean this up.
Token parseStuff(Token token, Function beginStuff, Function stuffParser,
- Function endStuff, Function handleNoStuff) {
+ Function endStuff, Function handleNoStuff) {
if (optional('<', token)) {
Token begin = token;
beginStuff(begin);
@@ -827,8 +905,9 @@
// Loop to allow the listener to rewrite the token stream for
// error handling.
final String value = token.stringValue;
- if ((identical(value, '(')) || (identical(value, '{'))
- || (identical(value, '=>'))) {
+ if ((identical(value, '(')) ||
+ (identical(value, '{')) ||
+ (identical(value, '=>'))) {
isField = false;
break;
} else if ((identical(value, '=')) || (identical(value, ','))) {
@@ -857,18 +936,18 @@
bool isVarFinalOrConst(Token token) {
String value = token.stringValue;
- return identical('var', value)
- || identical('final', value)
- || identical('const', value);
+ return identical('var', value) ||
+ identical('final', value) ||
+ identical('const', value);
}
- Token expectVarFinalOrConst(Link<Token> modifiers,
- bool hasType,
- bool allowStatic) {
+ Token expectVarFinalOrConst(
+ Link<Token> modifiers, bool hasType, bool allowStatic) {
int modifierCount = 0;
Token staticModifier;
- if (allowStatic && !modifiers.isEmpty
- && optional('static', modifiers.head)) {
+ if (allowStatic &&
+ !modifiers.isEmpty &&
+ optional('static', modifiers.head)) {
staticModifier = modifiers.head;
modifierCount++;
parseModifier(staticModifier);
@@ -895,9 +974,9 @@
Token varFinalOrConst =
modifierList.firstWhere(isVarFinalOrConst, orElse: () => null);
if (allowStatic && staticModifier == null) {
- staticModifier =
- modifierList.firstWhere(
- (modifier) => optional('static', modifier), orElse: () => null);
+ staticModifier = modifierList.firstWhere(
+ (modifier) => optional('static', modifier),
+ orElse: () => null);
if (staticModifier != null) {
modifierCount++;
parseModifier(staticModifier);
@@ -921,12 +1000,8 @@
return null;
}
- Token parseFields(Token start,
- Link<Token> modifiers,
- Token type,
- Token getOrSet,
- Token name,
- bool isTopLevel) {
+ Token parseFields(Token start, Link<Token> modifiers, Token type,
+ Token getOrSet, Token name, bool isTopLevel) {
bool hasType = type != null;
Token varFinalOrConst =
expectVarFinalOrConst(modifiers, hasType, !isTopLevel);
@@ -955,8 +1030,7 @@
} else {
parseType(type);
if (isVar) {
- listener.reportError(
- modifiers.head, MessageKind.EXTRANEOUS_MODIFIER,
+ listener.reportError(modifiers.head, MessageKind.EXTRANEOUS_MODIFIER,
{'modifier': modifiers.head});
}
}
@@ -980,12 +1054,8 @@
return token;
}
- Token parseTopLevelMethod(Token start,
- Link<Token> modifiers,
- Token type,
- Token getOrSet,
- Token name) {
-
+ Token parseTopLevelMethod(Token start, Link<Token> modifiers, Token type,
+ Token getOrSet, Token name) {
Token externalModifier;
// TODO(johnniwinther): Move error reporting to resolution to give more
// specific error messages.
@@ -1011,6 +1081,11 @@
}
Token token = parseIdentifier(name);
+ if (enableGenericMethodSyntax && getOrSet == null) {
+ token = parseTypeVariablesOpt(token);
+ } else {
+ listener.handleNoTypeVariables(token);
+ }
token = parseFormalParametersOpt(token);
bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled;
token = parseAsyncModifier(token);
@@ -1062,8 +1137,7 @@
String value = token.stringValue;
if (value == 'get') {
isGetter = true;
- } else if (hasName &&
- (value == 'sync' || value == 'async')) {
+ } else if (hasName && (value == 'sync' || value == 'async')) {
// Skip.
token = token.next;
value = token.stringValue;
@@ -1072,15 +1146,11 @@
token = token.next;
}
continue;
- } else if (value == '(' ||
- value == '{' ||
- value == '=>') {
+ } else if (value == '(' || value == '{' || value == '=>') {
// A method.
identifiers = identifiers.prepend(token);
return identifiers;
- } else if (value == '=' ||
- value == ';' ||
- value == ',') {
+ } else if (value == '=' || value == ';' || value == ',') {
// A field or abstract getter.
identifiers = identifiers.prepend(token);
return identifiers;
@@ -1163,11 +1233,11 @@
bool isModifier(Token token) {
final String value = token.stringValue;
return (identical('final', value)) ||
- (identical('var', value)) ||
- (identical('const', value)) ||
- (identical('abstract', value)) ||
- (identical('static', value)) ||
- (identical('external', value));
+ (identical('var', value)) ||
+ (identical('const', value)) ||
+ (identical('abstract', value)) ||
+ (identical('static', value)) ||
+ (identical('external', value));
}
Token parseModifier(Token token) {
@@ -1195,8 +1265,7 @@
Token parseModifiers(Token token) {
int count = 0;
while (identical(token.kind, KEYWORD_TOKEN)) {
- if (!isModifier(token))
- break;
+ if (!isModifier(token)) break;
token = parseModifier(token);
count++;
}
@@ -1318,8 +1387,11 @@
// Loop to allow the listener to rewrite the token stream for
// error handling.
final String value = token.stringValue;
- if ((identical(value, '(')) || (identical(value, '.'))
- || (identical(value, '{')) || (identical(value, '=>'))) {
+ if ((identical(value, '(')) ||
+ (identical(value, '.')) ||
+ (identical(value, '{')) ||
+ (identical(value, '=>')) ||
+ (enableGenericMethodSyntax && identical(value, '<'))) {
isField = false;
break;
} else if (identical(value, ';')) {
@@ -1349,14 +1421,10 @@
return isField
? parseFields(start, modifiers, type, getOrSet, name, false)
: parseMethod(start, modifiers, type, getOrSet, name);
-
}
- Token parseMethod(Token start,
- Link<Token> modifiers,
- Token type,
- Token getOrSet,
- Token name) {
+ Token parseMethod(Token start, Link<Token> modifiers, Token type,
+ Token getOrSet, Token name) {
Token externalModifier;
Token staticModifier;
Token constModifier;
@@ -1369,35 +1437,31 @@
modifierCount++;
externalModifier = modifier;
if (modifierCount != allowedModifierCount) {
- listener.reportError(
- modifier,
- MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+ listener.reportError(modifier, MessageKind.EXTRANEOUS_MODIFIER,
+ {'modifier': modifier});
}
allowedModifierCount++;
} else if (staticModifier == null && optional('static', modifier)) {
modifierCount++;
staticModifier = modifier;
if (modifierCount != allowedModifierCount) {
- listener.reportError(
- modifier,
- MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+ listener.reportError(modifier, MessageKind.EXTRANEOUS_MODIFIER,
+ {'modifier': modifier});
}
} else if (constModifier == null && optional('const', modifier)) {
modifierCount++;
constModifier = modifier;
if (modifierCount != allowedModifierCount) {
- listener.reportError(
- modifier,
- MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
+ listener.reportError(modifier, MessageKind.EXTRANEOUS_MODIFIER,
+ {'modifier': modifier});
}
} else {
listener.reportError(
modifier, MessageKind.EXTRANEOUS_MODIFIER, {'modifier': modifier});
}
}
- if (getOrSet != null && constModifier != null) {
- listener.reportError(
- constModifier, MessageKind.EXTRANEOUS_MODIFIER,
+ if (getOrSet != null && constModifier != null) {
+ listener.reportError(constModifier, MessageKind.EXTRANEOUS_MODIFIER,
{'modifier': constModifier});
}
parseModifierList(modifiers);
@@ -1411,8 +1475,7 @@
if (optional('operator', name)) {
token = parseOperatorName(name);
if (staticModifier != null) {
- listener.reportError(
- staticModifier, MessageKind.EXTRANEOUS_MODIFIER,
+ listener.reportError(staticModifier, MessageKind.EXTRANEOUS_MODIFIER,
{'modifier': staticModifier});
}
} else {
@@ -1420,6 +1483,11 @@
}
token = parseQualifiedRestOpt(token);
+ if (enableGenericMethodSyntax && getOrSet == null) {
+ token = parseTypeVariablesOpt(token);
+ } else {
+ listener.handleNoTypeVariables(token);
+ }
token = parseFormalParametersOpt(token);
token = parseInitializersOpt(token);
bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled;
@@ -1506,6 +1574,11 @@
}
token = parseQualifiedRestOpt(token);
listener.endFunctionName(token);
+ if (enableGenericMethodSyntax && getOrSet == null) {
+ token = parseTypeVariablesOpt(token);
+ } else {
+ listener.handleNoTypeVariables(token);
+ }
token = parseFormalParametersOpt(token);
token = parseInitializersOpt(token);
bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled;
@@ -1546,6 +1619,11 @@
listener.beginFunctionName(token);
token = parseIdentifier(token);
listener.endFunctionName(token);
+ if (enableGenericMethodSyntax) {
+ token = parseTypeVariablesOpt(token);
+ } else {
+ listener.handleNoTypeVariables(token);
+ }
token = parseFormalParameters(token);
listener.handleNoInitializers();
bool previousAsyncAwaitKeywordsEnabled = asyncAwaitKeywordsEnabled;
@@ -1638,8 +1716,7 @@
star = token;
token = token.next;
} else {
- listener.reportError(async,
- MessageKind.INVALID_SYNC_MODIFIER);
+ listener.reportError(async, MessageKind.INVALID_SYNC_MODIFIER);
}
}
listener.handleAsyncModifier(async, star);
@@ -1715,7 +1792,6 @@
return expectSemicolon(token);
}
-
Token parseReturnStatement(Token token) {
Token begin = token;
listener.beginReturnStatement(begin);
@@ -1870,8 +1946,8 @@
return token;
}
- Token parsePrecedenceExpression(Token token, int precedence,
- bool allowCascades) {
+ Token parsePrecedenceExpression(
+ Token token, int precedence, bool allowCascades) {
assert(precedence >= 1);
assert(precedence <= POSTFIX_PRECEDENCE);
token = parseUnaryExpression(token, allowCascades);
@@ -1900,10 +1976,10 @@
token = parseUnaryExpression(token.next, allowCascades);
listener.handleBinaryExpression(operator);
} else if ((identical(info, OPEN_PAREN_INFO)) ||
- (identical(info, OPEN_SQUARE_BRACKET_INFO))) {
+ (identical(info, OPEN_SQUARE_BRACKET_INFO))) {
token = parseArgumentOrIndexStar(token);
} else if ((identical(info, PLUS_PLUS_INFO)) ||
- (identical(info, MINUS_MINUS_INFO))) {
+ (identical(info, MINUS_MINUS_INFO))) {
listener.handleUnaryPostfixAssignmentExpression(token);
token = token.next;
} else {
@@ -1918,8 +1994,8 @@
} else {
// Left associative, so we recurse at the next higher
// precedence level.
- token = parsePrecedenceExpression(token.next, level + 1,
- allowCascades);
+ token =
+ parsePrecedenceExpression(token.next, level + 1, allowCascades);
listener.handleBinaryExpression(operator);
}
info = token.info;
@@ -1978,21 +2054,21 @@
listener.reportError(token, MessageKind.UNSUPPORTED_PREFIX_PLUS);
return parseUnaryExpression(token.next, allowCascades);
} else if ((identical(value, '!')) ||
- (identical(value, '-')) ||
- (identical(value, '~'))) {
+ (identical(value, '-')) ||
+ (identical(value, '~'))) {
Token operator = token;
// Right associative, so we recurse at the same precedence
// level.
- token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE,
- allowCascades);
+ token = parsePrecedenceExpression(
+ token.next, POSTFIX_PRECEDENCE, allowCascades);
listener.handleUnaryPrefixExpression(operator);
} else if ((identical(value, '++')) || identical(value, '--')) {
// TODO(ahe): Validate this is used correctly.
Token operator = token;
// Right associative, so we recurse at the same precedence
// level.
- token = parsePrecedenceExpression(token.next, POSTFIX_PRECEDENCE,
- allowCascades);
+ token = parsePrecedenceExpression(
+ token.next, POSTFIX_PRECEDENCE, allowCascades);
listener.handleUnaryPrefixAssignmentExpression(operator);
} else {
token = parsePrimary(token);
@@ -2011,6 +2087,7 @@
listener.handleIndexedExpression(openSquareBracket, token);
token = expect(']', token);
} else if (optional('(', token)) {
+ listener.handleNoTypeArguments(token);
token = parseArguments(token);
listener.endSend(token);
} else {
@@ -2024,8 +2101,7 @@
final kind = token.kind;
if (kind == IDENTIFIER_TOKEN) {
return parseSendOrFunctionLiteral(token);
- } else if (kind == INT_TOKEN
- || kind == HEXADECIMAL_TOKEN) {
+ } else if (kind == INT_TOKEN || kind == HEXADECIMAL_TOKEN) {
return parseLiteralInt(token);
} else if (kind == DOUBLE_TOKEN) {
return parseLiteralDouble(token);
@@ -2050,7 +2126,7 @@
} else if (value == 'void') {
return parseFunctionExpression(token);
} else if (asyncAwaitKeywordsEnabled &&
- (value == 'yield' || value == 'async')) {
+ (value == 'yield' || value == 'async')) {
return listener.expectedExpression(token);
} else if (token.isIdentifier()) {
return parseSendOrFunctionLiteral(token);
@@ -2060,9 +2136,9 @@
} else if (kind == OPEN_PAREN_TOKEN) {
return parseParenthesizedExpressionOrFunctionLiteral(token);
} else if ((kind == LT_TOKEN) ||
- (kind == OPEN_SQUARE_BRACKET_TOKEN) ||
- (kind == OPEN_CURLY_BRACKET_TOKEN) ||
- token.stringValue == '[]') {
+ (kind == OPEN_SQUARE_BRACKET_TOKEN) ||
+ (kind == OPEN_CURLY_BRACKET_TOKEN) ||
+ token.stringValue == '[]') {
return parseLiteralListOrMap(token);
} else {
return listener.expectedExpression(token);
@@ -2075,9 +2151,9 @@
int kind = nextToken.kind;
if (mayParseFunctionExpressions &&
(identical(kind, FUNCTION_TOKEN) ||
- identical(kind, OPEN_CURLY_BRACKET_TOKEN) ||
- (identical(kind, KEYWORD_TOKEN) &&
- (nextToken.value == 'async' || nextToken.value == 'sync')))) {
+ identical(kind, OPEN_CURLY_BRACKET_TOKEN) ||
+ (identical(kind, KEYWORD_TOKEN) &&
+ (nextToken.value == 'async' || nextToken.value == 'sync')))) {
return parseUnnamedFunction(token);
} else {
bool old = mayParseFunctionExpressions;
@@ -2108,6 +2184,7 @@
token = token.next;
if (optional('(', token)) {
// Constructor forwarding.
+ listener.handleNoTypeArguments(token);
token = parseArguments(token);
listener.endSend(token);
}
@@ -2119,6 +2196,7 @@
token = token.next;
if (optional('(', token)) {
// Super constructor.
+ listener.handleNoTypeArguments(token);
token = parseArguments(token);
listener.endSend(token);
}
@@ -2335,6 +2413,11 @@
Token parseSend(Token token) {
listener.beginSend(token);
token = parseIdentifier(token);
+ if (enableGenericMethodSyntax && isValidMethodTypeArguments(token)) {
+ token = parseTypeArgumentsOpt(token);
+ } else {
+ listener.handleNoTypeArguments(token);
+ }
token = parseArgumentsOpt(token);
listener.endSend(token);
return token;
@@ -2416,8 +2499,8 @@
return parseVariablesDeclarationMaybeSemicolon(token, false);
}
- Token parseVariablesDeclarationMaybeSemicolon(Token token,
- bool endWithSemicolon) {
+ Token parseVariablesDeclarationMaybeSemicolon(
+ Token token, bool endWithSemicolon) {
int count = 1;
listener.beginVariablesDeclaration(token);
token = parseModifiers(token);
@@ -2568,8 +2651,7 @@
Token awaitToken = token;
listener.beginAwaitExpression(awaitToken);
token = expect('await', token);
- token = parsePrecedenceExpression(token, POSTFIX_PRECEDENCE,
- allowCascades);
+ token = parsePrecedenceExpression(token, POSTFIX_PRECEDENCE, allowCascades);
listener.endAwaitExpression(awaitToken, token);
return token;
}
@@ -2732,7 +2814,7 @@
peek = peekPastLabels(token);
}
listener.handleSwitchCase(labelCount, expressionCount, defaultKeyword,
- statementCount, begin, token);
+ statementCount, begin, token);
return token;
}
diff --git a/pkg/compiler/lib/src/parser/parser_task.dart b/pkg/compiler/lib/src/parser/parser_task.dart
index a79875f..471ebf6 100644
--- a/pkg/compiler/lib/src/parser/parser_task.dart
+++ b/pkg/compiler/lib/src/parser/parser_task.dart
@@ -5,27 +5,17 @@
library dart2js.parser.task;
import '../common.dart';
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
-import '../elements/modelx.dart' show
- ElementX;
-import '../options.dart' show
- ParserOptions;
-import '../tokens/token.dart' show
- Token;
-import '../tree/tree.dart' show
- Node;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
+import '../elements/modelx.dart' show ElementX;
+import '../options.dart' show ParserOptions;
+import '../tokens/token.dart' show Token;
+import '../tree/tree.dart' show Node;
-import 'element_listener.dart' show
- ScannerOptions;
-import 'listener.dart' show
- ParserError;
-import 'node_listener.dart' show
- NodeListener;
-import 'parser.dart' show
- Parser;
+import 'element_listener.dart' show ScannerOptions;
+import 'listener.dart' show ParserError;
+import 'node_listener.dart' show NodeListener;
+import 'parser.dart' show Parser;
class ParserTask extends CompilerTask {
final ParserOptions parserOptions;
@@ -40,12 +30,12 @@
Node parseCompilationUnit(Token token) {
return measure(() {
- NodeListener listener = new NodeListener(
- const ScannerOptions(), reporter, null);
+ NodeListener listener =
+ new NodeListener(const ScannerOptions(), reporter, null);
Parser parser = new Parser(listener, parserOptions);
try {
parser.parseUnit(token);
- } on ParserError catch(_) {
+ } on ParserError catch (_) {
assert(invariant(token, compiler.compilationFailed));
return listener.makeNodeList(0, null, null, '\n');
}
diff --git a/pkg/compiler/lib/src/parser/partial_elements.dart b/pkg/compiler/lib/src/parser/partial_elements.dart
index b37fe70..a99ba64 100644
--- a/pkg/compiler/lib/src/parser/partial_elements.dart
+++ b/pkg/compiler/lib/src/parser/partial_elements.dart
@@ -5,60 +5,54 @@
library dart2js.parser.partial_elements;
import '../common.dart';
-import '../common/resolution.dart' show
- Parsing,
- Resolution;
+import '../common/resolution.dart' show Parsing, Resolution;
import '../dart_types.dart' show DynamicType;
-import '../elements/elements.dart' show
- CompilationUnitElement,
- ConstructorElement,
- Element,
- ElementKind,
- GetterElement,
- LibraryElement,
- MetadataAnnotation,
- MethodElement,
- SetterElement,
- STATE_NOT_STARTED,
- STATE_DONE;
-import '../elements/modelx.dart' show
- BaseFunctionElementX,
- ClassElementX,
- ConstructorElementX,
- DeclarationSite,
- ElementX,
- FieldElementX,
- GetterElementX,
- MetadataAnnotationX,
- MethodElementX,
- SetterElementX,
- TypedefElementX,
- VariableList;
-import '../elements/visitor.dart' show
- ElementVisitor;
-import '../tokens/token.dart' show
- BadInputToken,
- BeginGroupToken,
- ErrorToken,
- KeywordToken,
- StringToken,
- Token,
- UnmatchedToken,
- UnterminatedToken;
-import '../tokens/token_constants.dart' as Tokens show
- EOF_TOKEN;
+import '../elements/elements.dart'
+ show
+ CompilationUnitElement,
+ ConstructorElement,
+ Element,
+ ElementKind,
+ GetterElement,
+ LibraryElement,
+ MetadataAnnotation,
+ MethodElement,
+ SetterElement,
+ STATE_NOT_STARTED,
+ STATE_DONE;
+import '../elements/modelx.dart'
+ show
+ BaseFunctionElementX,
+ ClassElementX,
+ ConstructorElementX,
+ DeclarationSite,
+ ElementX,
+ FieldElementX,
+ GetterElementX,
+ MetadataAnnotationX,
+ MethodElementX,
+ SetterElementX,
+ TypedefElementX,
+ VariableList;
+import '../elements/visitor.dart' show ElementVisitor;
+import '../tokens/token.dart'
+ show
+ BadInputToken,
+ BeginGroupToken,
+ ErrorToken,
+ KeywordToken,
+ StringToken,
+ Token,
+ UnmatchedToken,
+ UnterminatedToken;
+import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN;
import '../tree/tree.dart';
-import 'class_element_parser.dart' show
- ClassElementParser;
-import 'parser.dart' show
- Parser;
-import 'listener.dart' show
- ParserError;
-import 'member_listener.dart' show
- MemberListener;
-import 'node_listener.dart' show
- NodeListener;
+import 'class_element_parser.dart' show ClassElementParser;
+import 'parser.dart' show Parser;
+import 'listener.dart' show ParserError;
+import 'member_listener.dart' show MemberListener;
+import 'node_listener.dart' show NodeListener;
abstract class PartialElement implements DeclarationSite {
Token beginToken;
@@ -91,7 +85,8 @@
_position = ElementX.findNameToken(
beginToken,
modifiers.isFactory || isGenerativeConstructor,
- name, enclosingElement.name);
+ name,
+ enclosingElement.name);
}
bool get hasNode => cachedNode != null;
@@ -126,44 +121,34 @@
abstract class PartialFunctionElement
implements PartialElement, PartialFunctionMixin {
-
- factory PartialFunctionElement(
- String name,
- Token beginToken,
- Token getOrSet,
- Token endToken,
- Modifiers modifiers,
- Element enclosingElement,
+ factory PartialFunctionElement(String name, Token beginToken, Token getOrSet,
+ Token endToken, Modifiers modifiers, Element enclosingElement,
{bool hasBody: true}) {
if (getOrSet == null) {
return new PartialMethodElement(
- name, beginToken, endToken, modifiers,
- enclosingElement, hasBody: hasBody);
+ name, beginToken, endToken, modifiers, enclosingElement,
+ hasBody: hasBody);
} else if (identical(getOrSet.stringValue, 'get')) {
return new PartialGetterElement(
- name, beginToken, getOrSet, endToken, modifiers,
- enclosingElement, hasBody: hasBody);
+ name, beginToken, getOrSet, endToken, modifiers, enclosingElement,
+ hasBody: hasBody);
} else {
assert(identical(getOrSet.stringValue, 'set'));
return new PartialSetterElement(
- name, beginToken, getOrSet, endToken, modifiers,
- enclosingElement, hasBody: hasBody);
+ name, beginToken, getOrSet, endToken, modifiers, enclosingElement,
+ hasBody: hasBody);
}
}
PartialFunctionElement copyWithEnclosing(Element enclosing);
}
-
class PartialMethodElement extends MethodElementX
with PartialElement, PartialFunctionMixin
implements PartialFunctionElement {
- PartialMethodElement(String name,
- Token beginToken,
- Token endToken,
- Modifiers modifiers,
- Element enclosing,
- {bool hasBody: true})
+ PartialMethodElement(String name, Token beginToken, Token endToken,
+ Modifiers modifiers, Element enclosing,
+ {bool hasBody: true})
: super(name, ElementKind.FUNCTION, modifiers, enclosing, hasBody) {
init(beginToken, null, endToken);
}
@@ -175,20 +160,17 @@
PartialMethodElement copyWithEnclosing(Element enclosing) {
return new PartialMethodElement(
- name, beginToken, endToken, modifiers, enclosing, hasBody: hasBody);
+ name, beginToken, endToken, modifiers, enclosing,
+ hasBody: hasBody);
}
}
class PartialGetterElement extends GetterElementX
with PartialElement, PartialFunctionMixin
- implements GetterElement, PartialFunctionElement {
- PartialGetterElement(String name,
- Token beginToken,
- Token getToken,
- Token endToken,
- Modifiers modifiers,
- Element enclosing,
- {bool hasBody: true})
+ implements GetterElement, PartialFunctionElement {
+ PartialGetterElement(String name, Token beginToken, Token getToken,
+ Token endToken, Modifiers modifiers, Element enclosing,
+ {bool hasBody: true})
: super(name, modifiers, enclosing, hasBody) {
init(beginToken, getToken, endToken);
}
@@ -211,13 +193,9 @@
class PartialSetterElement extends SetterElementX
with PartialElement, PartialFunctionMixin
implements SetterElement, PartialFunctionElement {
- PartialSetterElement(String name,
- Token beginToken,
- Token setToken,
- Token endToken,
- Modifiers modifiers,
- Element enclosing,
- {bool hasBody: true})
+ PartialSetterElement(String name, Token beginToken, Token setToken,
+ Token endToken, Modifiers modifiers, Element enclosing,
+ {bool hasBody: true})
: super(name, modifiers, enclosing, hasBody) {
init(beginToken, setToken, endToken);
}
@@ -241,12 +219,8 @@
// [PartialFactoryConstructor] subclasses and make this abstract.
class PartialConstructorElement extends ConstructorElementX
with PartialElement, PartialFunctionMixin {
- PartialConstructorElement(String name,
- Token beginToken,
- Token endToken,
- ElementKind kind,
- Modifiers modifiers,
- Element enclosing)
+ PartialConstructorElement(String name, Token beginToken, Token endToken,
+ ElementKind kind, Modifiers modifiers, Element enclosing)
: super(name, kind, modifiers, enclosing) {
init(beginToken, null, endToken);
}
@@ -258,10 +232,8 @@
}
class PartialFieldList extends VariableList with PartialElement {
- PartialFieldList(Token beginToken,
- Token endToken,
- Modifiers modifiers,
- bool hasParseError)
+ PartialFieldList(
+ Token beginToken, Token endToken, Modifiers modifiers, bool hasParseError)
: super(modifiers) {
super.beginToken = beginToken;
super.endToken = endToken;
@@ -272,8 +244,7 @@
if (definitions != null) return definitions;
DiagnosticReporter reporter = parsing.reporter;
reporter.withCurrentElement(element, () {
- definitions = parse(
- parsing, element, declarationSite,
+ definitions = parse(parsing, element, declarationSite,
(Parser parser) => parser.parseMember(beginToken));
if (!hasParseError &&
@@ -282,11 +253,10 @@
!definitions.modifiers.isConst &&
definitions.type == null &&
!definitions.isErroneous) {
- reporter.reportErrorMessage(
- definitions,
- MessageKind.GENERIC,
- { 'text': 'A field declaration must start with var, final, '
- 'const, or a type annotation.' });
+ reporter.reportErrorMessage(definitions, MessageKind.GENERIC, {
+ 'text': 'A field declaration must start with var, final, '
+ 'const, or a type annotation.'
+ });
}
});
return definitions;
@@ -309,12 +279,8 @@
}
class PartialTypedefElement extends TypedefElementX with PartialElement {
-
PartialTypedefElement(
- String name,
- Element enclosing,
- Token beginToken,
- Token endToken)
+ String name, Element enclosing, Token beginToken, Token endToken)
: super(name, enclosing) {
this.beginToken = beginToken;
this.endToken = endToken;
@@ -324,8 +290,7 @@
Node parseNode(Parsing parsing) {
if (cachedNode != null) return cachedNode;
- cachedNode = parse(
- parsing, this, declarationSite,
+ cachedNode = parse(parsing, this, declarationSite,
(p) => p.parseTopLevelDeclaration(token));
return cachedNode;
}
@@ -366,15 +331,13 @@
Node parseNode(Parsing parsing) {
if (cachedNode != null) return cachedNode;
- var metadata = parse(parsing,
- annotatedElement,
- declarationSite,
- (p) => p.parseMetadata(beginToken));
+ var metadata = parse(parsing, annotatedElement, declarationSite,
+ (p) => p.parseMetadata(beginToken));
if (metadata is Metadata) {
cachedNode = metadata.expression;
return cachedNode;
} else {
- assert (metadata is ErrorNode);
+ assert(metadata is ErrorNode);
return metadata;
}
}
@@ -390,11 +353,8 @@
class PartialClassElement extends ClassElementX with PartialElement {
ClassNode cachedNode;
- PartialClassElement(String name,
- Token beginToken,
- Token endToken,
- Element enclosing,
- int id)
+ PartialClassElement(
+ String name, Token beginToken, Token endToken, Element enclosing, int id)
: super(name, enclosing, id, STATE_NOT_STARTED) {
this.beginToken = beginToken;
this.endToken = endToken;
@@ -432,10 +392,8 @@
Token token = parser.parseTopLevelDeclaration(beginToken);
assert(identical(token, endToken.next));
cachedNode = listener.popNode();
- assert(
- invariant(
- beginToken, listener.nodes.isEmpty,
- message: "Non-empty listener stack: ${listener.nodes}"));
+ assert(invariant(beginToken, listener.nodes.isEmpty,
+ message: "Non-empty listener stack: ${listener.nodes}"));
} on ParserError {
// TODO(ahe): Often, a ParserError is thrown while parsing the class
// body. This means that the stack actually contains most of the
@@ -448,8 +406,15 @@
Token extendsKeyword = null;
NodeList body = listener.makeNodeList(0, beginToken, endToken, null);
cachedNode = new ClassNode(
- Modifiers.EMPTY, name, typeParameters, supertype, interfaces,
- beginToken, extendsKeyword, body, endToken);
+ Modifiers.EMPTY,
+ name,
+ typeParameters,
+ supertype,
+ interfaces,
+ beginToken,
+ extendsKeyword,
+ body,
+ endToken);
hasParseError = true;
}
});
@@ -475,10 +440,7 @@
}
}
-Node parse(
- Parsing parsing,
- ElementX element,
- PartialElement partial,
+Node parse(Parsing parsing, ElementX element, PartialElement partial,
doParse(Parser parser)) {
DiagnosticReporter reporter = parsing.reporter;
return parsing.measure(() {
diff --git a/pkg/compiler/lib/src/parser/partial_parser.dart b/pkg/compiler/lib/src/parser/partial_parser.dart
index 355ddd8..67f320d 100644
--- a/pkg/compiler/lib/src/parser/partial_parser.dart
+++ b/pkg/compiler/lib/src/parser/partial_parser.dart
@@ -5,21 +5,13 @@
library dart2js.parser.partial;
import '../common.dart';
-import '../options.dart' show
- ParserOptions;
-import '../util/characters.dart' as Characters show
- $CLOSE_CURLY_BRACKET;
-import '../tokens/token.dart' show
- BeginGroupToken,
- ErrorToken,
- Token;
-import '../tokens/token_constants.dart' as Tokens show
- EOF_TOKEN;
+import '../options.dart' show ParserOptions;
+import '../util/characters.dart' as Characters show $CLOSE_CURLY_BRACKET;
+import '../tokens/token.dart' show BeginGroupToken, ErrorToken, Token;
+import '../tokens/token_constants.dart' as Tokens show EOF_TOKEN;
-import 'listener.dart' show
- Listener;
-import 'parser.dart' show
- Parser;
+import 'listener.dart' show Listener;
+import 'parser.dart' show Parser;
class PartialParser extends Parser {
PartialParser(Listener listener, ParserOptions options)
diff --git a/pkg/compiler/lib/src/patch_parser.dart b/pkg/compiler/lib/src/patch_parser.dart
index 977d8a9..0e9943d 100644
--- a/pkg/compiler/lib/src/patch_parser.dart
+++ b/pkg/compiler/lib/src/patch_parser.dart
@@ -116,48 +116,33 @@
import 'dart:async';
-import 'constants/values.dart' show
- ConstantValue;
+import 'constants/values.dart' show ConstantValue;
import 'common.dart';
-import 'compiler.dart' show
- Compiler;
-import 'common/tasks.dart' show
- CompilerTask;
-import 'dart_types.dart' show
- DartType;
+import 'compiler.dart' show Compiler;
+import 'common/tasks.dart' show CompilerTask;
+import 'dart_types.dart' show DartType;
import 'elements/elements.dart';
-import 'elements/modelx.dart' show
- BaseFunctionElementX,
- ClassElementX,
- GetterElementX,
- LibraryElementX,
- MetadataAnnotationX,
- SetterElementX;
-import 'js_backend/js_backend.dart' show
- JavaScriptBackend;
-import 'library_loader.dart' show
- LibraryLoader;
-import 'options.dart' show
- ParserOptions;
-import 'parser/listener.dart' show
- Listener,
- ParserError;
-import 'parser/element_listener.dart' show
- ElementListener;
-import 'parser/member_listener.dart' show
- MemberListener;
-import 'parser/partial_elements.dart' show
- PartialClassElement;
-import 'parser/partial_parser.dart' show
- PartialParser;
-import 'parser/parser.dart' show
- Parser;
-import 'scanner/scanner.dart' show
- Scanner;
+import 'elements/modelx.dart'
+ show
+ BaseFunctionElementX,
+ ClassElementX,
+ GetterElementX,
+ LibraryElementX,
+ MetadataAnnotationX,
+ SetterElementX;
+import 'id_generator.dart';
+import 'js_backend/js_backend.dart' show JavaScriptBackend;
+import 'library_loader.dart' show LibraryLoader;
+import 'options.dart' show ParserOptions;
+import 'parser/listener.dart' show Listener, ParserError;
+import 'parser/element_listener.dart' show ElementListener;
+import 'parser/member_listener.dart' show MemberListener;
+import 'parser/partial_elements.dart' show PartialClassElement;
+import 'parser/partial_parser.dart' show PartialParser;
+import 'parser/parser.dart' show Parser;
+import 'scanner/scanner.dart' show Scanner;
import 'script.dart';
-import 'tokens/token.dart' show
- StringToken,
- Token;
+import 'tokens/token.dart' show StringToken, Token;
class PatchParserTask extends CompilerTask {
final String name = "Patching Parser";
@@ -170,10 +155,9 @@
* injections to the library, and returns a list of class
* patches.
*/
- Future patchLibrary(LibraryLoader loader,
- Uri patchUri, LibraryElement originLibrary) {
- return compiler.readScript(patchUri, originLibrary)
- .then((Script script) {
+ Future patchLibrary(
+ LibraryLoader loader, Uri patchUri, LibraryElement originLibrary) {
+ return compiler.readScript(patchUri, originLibrary).then((Script script) {
var patchLibrary = new LibraryElementX(script, null, originLibrary);
return reporter.withCurrentElement(patchLibrary, () {
loader.registerNewLibrary(patchLibrary);
@@ -193,10 +177,8 @@
// TODO(johnniwinther): Test that parts and exports are handled correctly.
Script script = compilationUnit.script;
Token tokens = new Scanner(script.file).tokenize();
- Function idGenerator = compiler.getNextFreeClassId;
- Listener patchListener = new PatchElementListener(compiler,
- compilationUnit,
- idGenerator);
+ Listener patchListener =
+ new PatchElementListener(compiler, compilationUnit, compiler);
try {
new PartialParser(patchListener, parserOptions).parseUnit(tokens);
} on ParserError catch (e) {
@@ -214,20 +196,19 @@
if (cls.cachedNode != null) return;
measure(() => reporter.withCurrentElement(cls, () {
- MemberListener listener = new PatchMemberListener(compiler, cls);
- Parser parser = new PatchClassElementParser(listener, parserOptions);
- try {
- Token token = parser.parseTopLevelDeclaration(cls.beginToken);
- assert(identical(token, cls.endToken.next));
- } on ParserError catch (e) {
- // No need to recover from a parser error in platform libraries, user
- // will never see this if the libraries are tested correctly.
- reporter.internalError(
- cls, "Parser error in patch file: $e");
- }
- cls.cachedNode = listener.popNode();
- assert(listener.nodes.isEmpty);
- }));
+ MemberListener listener = new PatchMemberListener(compiler, cls);
+ Parser parser = new PatchClassElementParser(listener, parserOptions);
+ try {
+ Token token = parser.parseTopLevelDeclaration(cls.beginToken);
+ assert(identical(token, cls.endToken.next));
+ } on ParserError catch (e) {
+ // No need to recover from a parser error in platform libraries, user
+ // will never see this if the libraries are tested correctly.
+ reporter.internalError(cls, "Parser error in patch file: $e");
+ }
+ cls.cachedNode = listener.popNode();
+ assert(listener.nodes.isEmpty);
+ }));
}
}
@@ -237,8 +218,7 @@
PatchMemberListener(Compiler compiler, ClassElement enclosingClass)
: this.compiler = compiler,
super(compiler.parsing.getScannerOptionsFor(enclosingClass),
- compiler.reporter,
- enclosingClass);
+ compiler.reporter, enclosingClass);
@override
void addMember(Element patch) {
@@ -279,11 +259,10 @@
class PatchElementListener extends ElementListener implements Listener {
final Compiler compiler;
- PatchElementListener(Compiler compiler,
- CompilationUnitElement patchElement,
- int idGenerator())
- : this.compiler = compiler,
- super(compiler.parsing.getScannerOptionsFor(patchElement),
+ PatchElementListener(Compiler compiler, CompilationUnitElement patchElement,
+ IdGenerator idGenerator)
+ : this.compiler = compiler,
+ super(compiler.parsing.getScannerOptionsFor(patchElement),
compiler.reporter, patchElement, idGenerator);
@override
@@ -310,10 +289,8 @@
}
}
-void patchElement(Compiler compiler,
- DiagnosticReporter reporter,
- Element origin,
- Element patch) {
+void patchElement(Compiler compiler, DiagnosticReporter reporter,
+ Element origin, Element patch) {
if (origin == null) {
reporter.reportErrorMessage(
patch, MessageKind.PATCH_NON_EXISTING, {'name': patch.name});
@@ -321,9 +298,9 @@
}
if (!(origin.isClass ||
- origin.isConstructor ||
- origin.isFunction ||
- origin.isAbstractField)) {
+ origin.isConstructor ||
+ origin.isFunction ||
+ origin.isAbstractField)) {
// TODO(ahe): Remove this error when the parser rejects all bad modifiers.
reporter.reportErrorMessage(origin, MessageKind.PATCH_NONPATCHABLE);
return;
@@ -336,7 +313,7 @@
tryPatchSetter(reporter, origin, patch);
} else if (patch.isConstructor) {
tryPatchConstructor(reporter, origin, patch);
- } else if(patch.isFunction) {
+ } else if (patch.isFunction) {
tryPatchFunction(reporter, origin, patch);
} else {
// TODO(ahe): Remove this error when the parser rejects all bad modifiers.
@@ -344,34 +321,25 @@
}
}
-void tryPatchClass(Compiler compiler,
- DiagnosticReporter reporter,
- Element origin,
- ClassElement patch) {
+void tryPatchClass(Compiler compiler, DiagnosticReporter reporter,
+ Element origin, ClassElement patch) {
if (!origin.isClass) {
reporter.reportError(
reporter.createMessage(
- origin,
- MessageKind.PATCH_NON_CLASS,
- {'className': patch.name}),
+ origin, MessageKind.PATCH_NON_CLASS, {'className': patch.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_CLASS,
- {'className': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_CLASS,
+ {'className': patch.name}),
]);
return;
}
patchClass(compiler, reporter, origin, patch);
}
-void patchClass(Compiler compiler,
- DiagnosticReporter reporter,
- ClassElementX origin,
- ClassElementX patch) {
+void patchClass(Compiler compiler, DiagnosticReporter reporter,
+ ClassElementX origin, ClassElementX patch) {
if (origin.isPatched) {
- reporter.internalError(origin,
- "Patching the same class more than once.");
+ reporter.internalError(origin, "Patching the same class more than once.");
}
origin.applyPatch(patch);
checkNativeAnnotation(compiler, patch);
@@ -380,16 +348,15 @@
/// Check whether [cls] has a `@Native(...)` annotation, and if so, set its
/// native name from the annotation.
checkNativeAnnotation(Compiler compiler, ClassElement cls) {
- EagerAnnotationHandler.checkAnnotation(compiler, cls,
- const NativeAnnotationHandler());
+ EagerAnnotationHandler.checkAnnotation(
+ compiler, cls, const NativeAnnotationHandler());
}
checkJsInteropAnnotation(Compiler compiler, element) {
- EagerAnnotationHandler.checkAnnotation(compiler, element,
- const JsInteropAnnotationHandler());
+ EagerAnnotationHandler.checkAnnotation(
+ compiler, element, const JsInteropAnnotationHandler());
}
-
/// Abstract interface for pre-resolution detection of metadata.
///
/// The detection is handled in two steps:
@@ -401,22 +368,16 @@
/// Checks that [annotation] looks like a matching annotation and optionally
/// applies actions on [element]. Returns a non-null annotation marker if the
/// annotation matched and should be validated.
- T apply(Compiler compiler,
- Element element,
- MetadataAnnotation annotation);
+ T apply(Compiler compiler, Element element, MetadataAnnotation annotation);
/// Checks that the annotation value is valid.
- void validate(Compiler compiler,
- Element element,
- MetadataAnnotation annotation,
- ConstantValue constant);
-
+ void validate(Compiler compiler, Element element,
+ MetadataAnnotation annotation, ConstantValue constant);
/// Checks [element] for metadata matching the [handler]. Return a non-null
/// annotation marker matching metadata was found.
- static checkAnnotation(Compiler compiler,
- Element element,
- EagerAnnotationHandler handler) {
+ static checkAnnotation(
+ Compiler compiler, Element element, EagerAnnotationHandler handler) {
for (MetadataAnnotation annotation in element.implementation.metadata) {
var result = handler.apply(compiler, element, annotation);
if (result != null) {
@@ -424,8 +385,7 @@
// [Compiler.onLibrariesLoaded].
compiler.enqueuer.resolution.addDeferredAction(element, () {
annotation.ensureResolved(compiler.resolution);
- handler.validate(
- compiler, element, annotation,
+ handler.validate(compiler, element, annotation,
compiler.constants.getConstantValue(annotation.constant));
});
return result;
@@ -452,9 +412,8 @@
return null;
}
- String apply(Compiler compiler,
- Element element,
- MetadataAnnotation annotation) {
+ String apply(
+ Compiler compiler, Element element, MetadataAnnotation annotation) {
if (element.isClass) {
String native = getNativeAnnotation(annotation);
if (native != null) {
@@ -466,10 +425,8 @@
return null;
}
- void validate(Compiler compiler,
- Element element,
- MetadataAnnotation annotation,
- ConstantValue constant) {
+ void validate(Compiler compiler, Element element,
+ MetadataAnnotation annotation, ConstantValue constant) {
DartType annotationType = constant.getType(compiler.coreTypes);
if (annotationType.element != compiler.nativeAnnotationClass) {
DiagnosticReporter reporter = compiler.reporter;
@@ -486,9 +443,8 @@
bool hasJsNameAnnotation(MetadataAnnotation annotation) =>
annotation.beginToken != null && annotation.beginToken.next.value == 'JS';
- bool apply(Compiler compiler,
- Element element,
- MetadataAnnotation annotation) {
+ bool apply(
+ Compiler compiler, Element element, MetadataAnnotation annotation) {
bool hasJsInterop = hasJsNameAnnotation(annotation);
if (hasJsInterop) {
JavaScriptBackend backend = compiler.backend;
@@ -500,14 +456,13 @@
}
@override
- void validate(Compiler compiler,
- Element element,
- MetadataAnnotation annotation,
- ConstantValue constant) {
+ void validate(Compiler compiler, Element element,
+ MetadataAnnotation annotation, ConstantValue constant) {
JavaScriptBackend backend = compiler.backend;
if (constant.getType(compiler.coreTypes).element !=
backend.helpers.jsAnnotationClass) {
- compiler.reporter.internalError(annotation, 'Invalid @JS(...) annotation.');
+ compiler.reporter
+ .internalError(annotation, 'Invalid @JS(...) annotation.');
}
}
}
@@ -532,17 +487,14 @@
}
@override
- PatchVersion apply(Compiler compiler,
- Element element,
- MetadataAnnotation annotation) {
+ PatchVersion apply(
+ Compiler compiler, Element element, MetadataAnnotation annotation) {
return getPatchVersion(annotation);
}
@override
- void validate(Compiler compiler,
- Element element,
- MetadataAnnotation annotation,
- ConstantValue constant) {
+ void validate(Compiler compiler, Element element,
+ MetadataAnnotation annotation, ConstantValue constant) {
DartType annotationType = constant.getType(compiler.coreTypes);
if (annotationType.element != compiler.patchAnnotationClass) {
DiagnosticReporter reporter = compiler.reporter;
@@ -551,21 +503,15 @@
}
}
-
-void tryPatchGetter(DiagnosticReporter reporter,
- Element origin,
- FunctionElement patch) {
+void tryPatchGetter(
+ DiagnosticReporter reporter, Element origin, FunctionElement patch) {
if (!origin.isAbstractField) {
reporter.reportError(
reporter.createMessage(
- origin,
- MessageKind.PATCH_NON_GETTER,
- {'name': origin.name}),
+ origin, MessageKind.PATCH_NON_GETTER, {'name': origin.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_GETTER,
- {'getterName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_GETTER,
+ {'getterName': patch.name}),
]);
return;
}
@@ -573,14 +519,10 @@
if (originField.getter == null) {
reporter.reportError(
reporter.createMessage(
- origin,
- MessageKind.PATCH_NO_GETTER,
- {'getterName': patch.name}),
+ origin, MessageKind.PATCH_NO_GETTER, {'getterName': patch.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_GETTER,
- {'getterName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_GETTER,
+ {'getterName': patch.name}),
]);
return;
}
@@ -588,20 +530,15 @@
patchFunction(reporter, getter, patch);
}
-void tryPatchSetter(DiagnosticReporter reporter,
- Element origin,
- FunctionElement patch) {
+void tryPatchSetter(
+ DiagnosticReporter reporter, Element origin, FunctionElement patch) {
if (!origin.isAbstractField) {
reporter.reportError(
reporter.createMessage(
- origin,
- MessageKind.PATCH_NON_SETTER,
- {'name': origin.name}),
+ origin, MessageKind.PATCH_NON_SETTER, {'name': origin.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_SETTER,
- {'setterName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_SETTER,
+ {'setterName': patch.name}),
]);
return;
}
@@ -609,14 +546,10 @@
if (originField.setter == null) {
reporter.reportError(
reporter.createMessage(
- origin,
- MessageKind.PATCH_NO_SETTER,
- {'setterName': patch.name}),
+ origin, MessageKind.PATCH_NO_SETTER, {'setterName': patch.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_SETTER,
- {'setterName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_SETTER,
+ {'setterName': patch.name}),
]);
return;
}
@@ -624,70 +557,57 @@
patchFunction(reporter, setter, patch);
}
-void tryPatchConstructor(DiagnosticReporter reporter,
- Element origin,
- FunctionElement patch) {
+void tryPatchConstructor(
+ DiagnosticReporter reporter, Element origin, FunctionElement patch) {
if (!origin.isConstructor) {
reporter.reportError(
- reporter.createMessage(
- origin,
- MessageKind.PATCH_NON_CONSTRUCTOR,
+ reporter.createMessage(origin, MessageKind.PATCH_NON_CONSTRUCTOR,
{'constructorName': patch.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
- {'constructorName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_CONSTRUCTOR,
+ {'constructorName': patch.name}),
]);
return;
}
patchFunction(reporter, origin, patch);
}
-void tryPatchFunction(DiagnosticReporter reporter,
- Element origin,
- FunctionElement patch) {
+void tryPatchFunction(
+ DiagnosticReporter reporter, Element origin, FunctionElement patch) {
if (!origin.isFunction) {
reporter.reportError(
- reporter.createMessage(
- origin,
- MessageKind.PATCH_NON_FUNCTION,
+ reporter.createMessage(origin, MessageKind.PATCH_NON_FUNCTION,
{'functionName': patch.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_FUNCTION,
- {'functionName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_FUNCTION,
+ {'functionName': patch.name}),
]);
return;
}
patchFunction(reporter, origin, patch);
}
-void patchFunction(DiagnosticReporter reporter,
- BaseFunctionElementX origin,
- BaseFunctionElementX patch) {
+void patchFunction(DiagnosticReporter reporter, BaseFunctionElementX origin,
+ BaseFunctionElementX patch) {
if (!origin.modifiers.isExternal) {
reporter.reportError(
reporter.createMessage(origin, MessageKind.PATCH_NON_EXTERNAL),
<DiagnosticMessage>[
- reporter.createMessage(
- patch,
- MessageKind.PATCH_POINT_TO_FUNCTION,
- {'functionName': patch.name}),
+ reporter.createMessage(patch, MessageKind.PATCH_POINT_TO_FUNCTION,
+ {'functionName': patch.name}),
]);
return;
}
if (origin.isPatched) {
- reporter.internalError(origin,
- "Trying to patch a function more than once.");
+ reporter.internalError(
+ origin, "Trying to patch a function more than once.");
}
origin.applyPatch(patch);
}
PatchVersion getPatchVersion(Compiler compiler, Element element) {
- return EagerAnnotationHandler.checkAnnotation(compiler, element,
- const PatchAnnotationHandler());
+ return EagerAnnotationHandler.checkAnnotation(
+ compiler, element, const PatchAnnotationHandler());
}
class PatchVersion {
diff --git a/pkg/compiler/lib/src/platform_configuration.dart b/pkg/compiler/lib/src/platform_configuration.dart
index 41da852..56a48df 100644
--- a/pkg/compiler/lib/src/platform_configuration.dart
+++ b/pkg/compiler/lib/src/platform_configuration.dart
@@ -75,8 +75,9 @@
error("Section heading lines must end with ']'", endOfHeader + 1);
}
int startOfSectionName = startOfLine + 1;
- String sectionName = new String.fromCharCodes(
- source, startOfSectionName, endOfHeader).trim();
+ String sectionName =
+ new String.fromCharCodes(source, startOfSectionName, endOfHeader)
+ .trim();
currentSection = new Map<String, String>();
if (result.containsKey(sectionName)) {
error("Duplicate section name '$sectionName'", startOfSectionName);
diff --git a/pkg/compiler/lib/src/resolution/access_semantics.dart b/pkg/compiler/lib/src/resolution/access_semantics.dart
index baead69..fdd8410 100644
--- a/pkg/compiler/lib/src/resolution/access_semantics.dart
+++ b/pkg/compiler/lib/src/resolution/access_semantics.dart
@@ -149,33 +149,41 @@
enum CompoundAccessKind {
/// Read from a static getter and write to a static setter.
STATIC_GETTER_SETTER,
+
/// Read from a static method (closurize) and write to a static setter.
STATIC_METHOD_SETTER,
/// Read from an unresolved static getter and write to a static setter.
UNRESOLVED_STATIC_GETTER,
+
/// Read from a static getter and write to an unresolved static setter.
UNRESOLVED_STATIC_SETTER,
/// Read from a top level getter and write to a top level setter.
TOPLEVEL_GETTER_SETTER,
+
/// Read from a top level method (closurize) and write to top level setter.
TOPLEVEL_METHOD_SETTER,
/// Read from an unresolved top level getter and write to a top level setter.
UNRESOLVED_TOPLEVEL_GETTER,
+
/// Read from a top level getter and write to an unresolved top level setter.
UNRESOLVED_TOPLEVEL_SETTER,
/// Read from one superclass field and write to another.
SUPER_FIELD_FIELD,
+
/// Read from a superclass field and write to a superclass setter.
SUPER_FIELD_SETTER,
+
/// Read from a superclass getter and write to a superclass setter.
SUPER_GETTER_SETTER,
+
/// Read from a superclass method (closurize) and write to a superclass
/// setter.
SUPER_METHOD_SETTER,
+
/// Read from a superclass getter and write to a superclass field.
SUPER_GETTER_FIELD,
@@ -183,6 +191,7 @@
// TODO(johnniwinther): Use [AccessKind.SUPER_GETTER] when the erroneous
// element is no longer needed.
UNRESOLVED_SUPER_GETTER,
+
/// Read from a superclass getter and write to an unresolved setter.
// TODO(johnniwinther): Use [AccessKind.SUPER_SETTER] when the erroneous
// element is no longer needed.
@@ -243,7 +252,6 @@
}
}
-
class DynamicAccess extends AccessSemantics {
final Name name;
@@ -268,8 +276,7 @@
class ConstantAccess extends AccessSemantics {
final ConstantExpression constant;
- ConstantAccess(AccessKind kind, this.constant)
- : super._(kind);
+ ConstantAccess(AccessKind kind, this.constant) : super._(kind);
ConstantAccess.classTypeLiteral(this.constant)
: super._(AccessKind.CLASS_TYPE_LITERAL);
@@ -284,8 +291,7 @@
class StaticAccess extends AccessSemantics {
final Element element;
- StaticAccess._(AccessKind kind, this.element)
- : super._(kind);
+ StaticAccess.internal(AccessKind kind, this.element) : super._(kind);
StaticAccess.superSetter(MethodElement this.element)
: super._(AccessKind.SUPER_SETTER);
@@ -350,14 +356,12 @@
StaticAccess.topLevelSetter(MethodElement this.element)
: super._(AccessKind.TOPLEVEL_SETTER);
- StaticAccess.unresolved(this.element)
- : super._(AccessKind.UNRESOLVED);
+ StaticAccess.unresolved(this.element) : super._(AccessKind.UNRESOLVED);
StaticAccess.unresolvedSuper(this.element)
: super._(AccessKind.UNRESOLVED_SUPER);
- StaticAccess.invalid(this.element)
- : super._(AccessKind.INVALID);
+ StaticAccess.invalid(this.element) : super._(AccessKind.INVALID);
}
class CompoundAccessSemantics extends AccessSemantics {
@@ -365,9 +369,7 @@
final Element getter;
final Element setter;
- CompoundAccessSemantics(this.compoundAccessKind,
- this.getter,
- this.setter)
+ CompoundAccessSemantics(this.compoundAccessKind, this.getter, this.setter)
: super._(AccessKind.COMPOUND);
Element get element => setter;
diff --git a/pkg/compiler/lib/src/resolution/class_hierarchy.dart b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
index 78e2341..25893e2 100644
--- a/pkg/compiler/lib/src/resolution/class_hierarchy.dart
+++ b/pkg/compiler/lib/src/resolution/class_hierarchy.dart
@@ -5,52 +5,37 @@
library dart2js.resolution.class_hierarchy;
import '../common.dart';
-import '../common/resolution.dart' show
- Feature;
-import '../compiler.dart' show
- Compiler;
-import '../core_types.dart' show
- CoreClasses,
- CoreTypes;
+import '../common/resolution.dart' show Feature;
+import '../compiler.dart' show Compiler;
+import '../core_types.dart' show CoreClasses, CoreTypes;
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- BaseClassElementX,
- ErroneousElementX,
- MixinApplicationElementX,
- SynthesizedConstructorElementX,
- TypeVariableElementX,
- UnnamedMixinApplicationElementX;
-import '../ordered_typeset.dart' show
- OrderedTypeSet,
- OrderedTypeSetBuilder;
+import '../elements/modelx.dart'
+ show
+ BaseClassElementX,
+ ErroneousElementX,
+ MixinApplicationElementX,
+ SynthesizedConstructorElementX,
+ TypeVariableElementX,
+ UnnamedMixinApplicationElementX;
+import '../ordered_typeset.dart' show OrderedTypeSet, OrderedTypeSetBuilder;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link,
- Setlet;
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../util/util.dart' show Link, Setlet;
+import '../universe/call_structure.dart' show CallStructure;
import 'enum_creator.dart';
-import 'members.dart' show
- lookupInScope;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'resolution_common.dart' show
- CommonResolverVisitor,
- MappingVisitor;
-import 'scope.dart' show
- Scope,
- TypeDeclarationScope;
+import 'members.dart' show lookupInScope;
+import 'registry.dart' show ResolutionRegistry;
+import 'resolution_common.dart' show CommonResolverVisitor, MappingVisitor;
+import 'scope.dart' show Scope, TypeDeclarationScope;
class TypeDefinitionVisitor extends MappingVisitor<DartType> {
Scope scope;
final TypeDeclarationElement enclosingElement;
TypeDeclarationElement get element => enclosingElement;
- TypeDefinitionVisitor(Compiler compiler,
- TypeDeclarationElement element,
- ResolutionRegistry registry)
+ TypeDefinitionVisitor(Compiler compiler, TypeDeclarationElement element,
+ ResolutionRegistry registry)
: this.enclosingElement = element,
scope = Scope.buildEnclosingScope(element),
super(compiler, registry);
@@ -59,7 +44,6 @@
DartType get objectType => coreTypes.objectType;
-
void resolveTypeVariableBounds(NodeList node) {
if (node == null) return;
@@ -83,8 +67,8 @@
TypeVariableElementX variableElement = typeVariable.element;
if (typeNode.bound != null) {
- DartType boundType = typeResolver.resolveTypeAnnotation(
- this, typeNode.bound);
+ DartType boundType =
+ typeResolver.resolveTypeAnnotation(this, typeNode.bound);
variableElement.boundCache = boundType;
void checkTypeVariableBound() {
@@ -134,18 +118,17 @@
class ClassResolverVisitor extends TypeDefinitionVisitor {
BaseClassElementX get element => enclosingElement;
- ClassResolverVisitor(Compiler compiler,
- ClassElement classElement,
- ResolutionRegistry registry)
- : super(compiler, classElement, registry);
+ ClassResolverVisitor(
+ Compiler compiler, ClassElement classElement, ResolutionRegistry registry)
+ : super(compiler, classElement, registry);
DartType visitClassNode(ClassNode node) {
if (element == null) {
throw reporter.internalError(node, 'element is null');
}
if (element.resolutionState != STATE_STARTED) {
- throw reporter.internalError(element,
- 'cyclic resolution of class $element');
+ throw reporter.internalError(
+ element, 'cyclic resolution of class $element');
}
element.computeType(resolution);
@@ -163,8 +146,8 @@
DartType supertype = resolveSupertype(element, superMixin.superclass);
Link<Node> link = superMixin.mixins.nodes;
while (!link.isEmpty) {
- supertype = applyMixin(supertype,
- checkMixinType(link.head), link.head);
+ supertype =
+ applyMixin(supertype, checkMixinType(link.head), link.head);
link = link.tail;
}
element.supertype = supertype;
@@ -181,8 +164,8 @@
// Avoid making the superclass (usually Object) extend itself.
if (element != superElement) {
if (superElement == null) {
- reporter.internalError(node,
- "Cannot resolve default superclass for $element.");
+ reporter.internalError(
+ node, "Cannot resolve default superclass for $element.");
} else {
superElement.ensureResolved(resolution);
}
@@ -205,23 +188,21 @@
// TODO(ahe): Why is this a compile-time error? Or if it is an error,
// why do we bother to registerThrowNoSuchMethod below?
reporter.reportErrorMessage(node, kind, arguments);
- superMember = new ErroneousElementX(
- kind, arguments, '', element);
+ superMember = new ErroneousElementX(kind, arguments, '', element);
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
} else if (!superMember.isGenerativeConstructor) {
- MessageKind kind = MessageKind.SUPER_CALL_TO_FACTORY;
- Map arguments = {'className': element.superclass.name};
- // TODO(ahe): Why is this a compile-time error? Or if it is an error,
- // why do we bother to registerThrowNoSuchMethod below?
- reporter.reportErrorMessage(node, kind, arguments);
- superMember = new ErroneousElementX(
- kind, arguments, '', element);
- registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
+ MessageKind kind = MessageKind.SUPER_CALL_TO_FACTORY;
+ Map arguments = {'className': element.superclass.name};
+ // TODO(ahe): Why is this a compile-time error? Or if it is an error,
+ // why do we bother to registerThrowNoSuchMethod below?
+ reporter.reportErrorMessage(node, kind, arguments);
+ superMember = new ErroneousElementX(kind, arguments, '', element);
+ registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
} else {
ConstructorElement superConstructor = superMember;
superConstructor.computeType(resolution);
- if (!CallStructure.NO_ARGS.signatureApplies(
- superConstructor.functionSignature)) {
+ if (!CallStructure.NO_ARGS
+ .signatureApplies(superConstructor.functionSignature)) {
MessageKind kind = MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT;
reporter.reportErrorMessage(node, kind);
superMember = new ErroneousElementX(kind, {}, '', element);
@@ -243,8 +224,8 @@
throw reporter.internalError(node, 'element is null');
}
if (element.resolutionState != STATE_STARTED) {
- throw reporter.internalError(element,
- 'cyclic resolution of class $element');
+ throw reporter.internalError(
+ element, 'cyclic resolution of class $element');
}
InterfaceType enumType = element.computeType(resolution);
@@ -254,9 +235,7 @@
if (node.names.nodes.isEmpty) {
reporter.reportErrorMessage(
- node,
- MessageKind.EMPTY_ENUM_DECLARATION,
- {'enumName': element.name});
+ node, MessageKind.EMPTY_ENUM_DECLARATION, {'enumName': element.name});
}
EnumCreator creator =
@@ -271,22 +250,14 @@
DartType mixinType = resolveType(mixinNode);
if (isBlackListed(mixinType)) {
reporter.reportErrorMessage(
- mixinNode,
- MessageKind.CANNOT_MIXIN,
- {'type': mixinType});
+ mixinNode, MessageKind.CANNOT_MIXIN, {'type': mixinType});
} else if (mixinType.isTypeVariable) {
- reporter.reportErrorMessage(
- mixinNode,
- MessageKind.CLASS_NAME_EXPECTED);
+ reporter.reportErrorMessage(mixinNode, MessageKind.CLASS_NAME_EXPECTED);
} else if (mixinType.isMalformed) {
- reporter.reportErrorMessage(
- mixinNode,
- MessageKind.CANNOT_MIXIN_MALFORMED,
+ reporter.reportErrorMessage(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED,
{'className': element.name, 'malformedType': mixinType});
} else if (mixinType.isEnumType) {
- reporter.reportErrorMessage(
- mixinNode,
- MessageKind.CANNOT_MIXIN_ENUM,
+ reporter.reportErrorMessage(mixinNode, MessageKind.CANNOT_MIXIN_ENUM,
{'className': element.name, 'enumType': mixinType});
}
return mixinType;
@@ -297,16 +268,15 @@
throw reporter.internalError(node, 'element is null');
}
if (element.resolutionState != STATE_STARTED) {
- throw reporter.internalError(element,
- 'cyclic resolution of class $element');
+ throw reporter.internalError(
+ element, 'cyclic resolution of class $element');
}
if (identical(node.classKeyword.stringValue, 'typedef')) {
// TODO(aprelev@gmail.com): Remove this deprecation diagnostic
// together with corresponding TODO in parser.dart.
reporter.reportWarningMessage(
- node.classKeyword,
- MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX);
+ node.classKeyword, MessageKind.DEPRECATED_TYPEDEF_MIXIN_SYNTAX);
}
element.computeType(resolution);
@@ -329,11 +299,8 @@
String superName = supertype.name;
String mixinName = mixinType.name;
MixinApplicationElementX mixinApplication =
- new UnnamedMixinApplicationElementX(
- "${superName}+${mixinName}",
- element.compilationUnit,
- compiler.getNextFreeClassId(),
- node);
+ new UnnamedMixinApplicationElementX("${superName}+${mixinName}",
+ element.compilationUnit, compiler.getNextFreeId(), node);
// Create synthetic type variables for the mixin application.
List<DartType> typeVariables = <DartType>[];
int index = 0;
@@ -364,8 +331,8 @@
// Replace the synthetic type variables by the original type variables in
// the returned type (which should be the type actually extended).
InterfaceType mixinThisType = mixinApplication.thisType;
- return mixinThisType.subst(element.typeVariables,
- mixinThisType.typeArguments);
+ return mixinThisType.subst(
+ element.typeVariables, mixinThisType.typeArguments);
}
bool isDefaultConstructor(FunctionElement constructor) {
@@ -374,8 +341,8 @@
return constructor.functionSignature.parameterCount == 0;
}
- FunctionElement createForwardingConstructor(ConstructorElement target,
- ClassElement enclosing) {
+ FunctionElement createForwardingConstructor(
+ ConstructorElement target, ClassElement enclosing) {
FunctionElement constructor =
new SynthesizedConstructorElementX.notForDefault(
target.name, target, enclosing);
@@ -383,10 +350,8 @@
return constructor;
}
- void doApplyMixinTo(
- MixinApplicationElementX mixinApplication,
- DartType supertype,
- DartType mixinType) {
+ void doApplyMixinTo(MixinApplicationElementX mixinApplication,
+ DartType supertype, DartType mixinType) {
Node node = mixinApplication.parseNode(resolution.parsing);
if (mixinApplication.supertype != null) {
@@ -402,8 +367,8 @@
NamedMixinApplication namedMixinApplication =
node.asNamedMixinApplication();
Link<DartType> interfaces = (namedMixinApplication != null)
- ? resolveInterfaces(namedMixinApplication.interfaces,
- namedMixinApplication.superclass)
+ ? resolveInterfaces(
+ namedMixinApplication.interfaces, namedMixinApplication.superclass)
: const Link<DartType>();
// The class that is the result of a mixin application implements
@@ -416,8 +381,8 @@
}
mixinApplication.interfaces = interfaces;
} else {
- assert(invariant(mixinApplication,
- mixinApplication.hasIncompleteHierarchy));
+ assert(
+ invariant(mixinApplication, mixinApplication.hasIncompleteHierarchy));
}
ClassElement superclass = supertype.element;
@@ -449,13 +414,13 @@
calculateAllSupertypes(mixinApplication);
}
- InterfaceType resolveMixinFor(MixinApplicationElement mixinApplication,
- DartType mixinType) {
+ InterfaceType resolveMixinFor(
+ MixinApplicationElement mixinApplication, DartType mixinType) {
ClassElement mixin = mixinType.element;
mixin.ensureResolved(resolution);
// Check for cycles in the mixin chain.
- ClassElement previous = mixinApplication; // For better error messages.
+ ClassElement previous = mixinApplication; // For better error messages.
ClassElement current = mixin;
while (current != null && current.isMixinApplication) {
MixinApplicationElement currentMixinApplication = current;
@@ -490,21 +455,16 @@
{'className': element.name, 'malformedType': supertype});
return objectType;
} else if (supertype.isEnumType) {
- reporter.reportErrorMessage(
- superclass,
- MessageKind.CANNOT_EXTEND_ENUM,
+ reporter.reportErrorMessage(superclass, MessageKind.CANNOT_EXTEND_ENUM,
{'className': element.name, 'enumType': supertype});
return objectType;
} else if (!supertype.isInterfaceType) {
reporter.reportErrorMessage(
- superclass.typeName,
- MessageKind.CLASS_NAME_EXPECTED);
+ superclass.typeName, MessageKind.CLASS_NAME_EXPECTED);
return objectType;
} else if (isBlackListed(supertype)) {
reporter.reportErrorMessage(
- superclass,
- MessageKind.CANNOT_EXTEND,
- {'type': supertype});
+ superclass, MessageKind.CANNOT_EXTEND, {'type': supertype});
return objectType;
}
}
@@ -544,16 +504,12 @@
{'type': interfaceType});
}
if (result.contains(interfaceType)) {
- reporter.reportErrorMessage(
- link.head,
- MessageKind.DUPLICATE_IMPLEMENTS,
- {'type': interfaceType});
+ reporter.reportErrorMessage(link.head,
+ MessageKind.DUPLICATE_IMPLEMENTS, {'type': interfaceType});
}
result = result.prepend(interfaceType);
if (isBlackListed(interfaceType)) {
- reporter.reportErrorMessage(
- link.head,
- MessageKind.CANNOT_IMPLEMENT,
+ reporter.reportErrorMessage(link.head, MessageKind.CANNOT_IMPLEMENT,
{'type': interfaceType});
}
}
@@ -582,10 +538,9 @@
if (cls.allSupertypesAndSelf != null) return;
final DartType supertype = cls.supertype;
if (supertype != null) {
- cls.allSupertypesAndSelf =
- new OrderedTypeSetBuilder(
- cls, reporter: reporter, objectType: coreTypes.objectType)
- .createOrderedTypeSet(supertype, cls.interfaces);
+ cls.allSupertypesAndSelf = new OrderedTypeSetBuilder(cls,
+ reporter: reporter, objectType: coreTypes.objectType)
+ .createOrderedTypeSet(supertype, cls.interfaces);
} else {
assert(cls == compiler.coreClasses.objectClass);
cls.allSupertypesAndSelf =
@@ -595,16 +550,15 @@
isBlackListed(DartType type) {
LibraryElement lib = element.library;
- return
- !identical(lib, compiler.coreLibrary) &&
- !compiler.backend.isBackendLibrary(lib) &&
- (type.isDynamic ||
- type == coreTypes.boolType ||
- type == coreTypes.numType ||
- type == coreTypes.intType ||
- type == coreTypes.doubleType ||
- type == coreTypes.stringType ||
- type == coreTypes.nullType);
+ return !identical(lib, compiler.coreLibrary) &&
+ !compiler.backend.isBackendLibrary(lib) &&
+ (type.isDynamic ||
+ type == coreTypes.boolType ||
+ type == coreTypes.numType ||
+ type == coreTypes.intType ||
+ type == coreTypes.doubleType ||
+ type == coreTypes.stringType ||
+ type == coreTypes.nullType);
}
}
@@ -613,9 +567,9 @@
ClassElement classElement;
ClassSupertypeResolver(Compiler compiler, ClassElement cls)
- : context = Scope.buildEnclosingScope(cls),
- this.classElement = cls,
- super(compiler);
+ : context = Scope.buildEnclosingScope(cls),
+ this.classElement = cls,
+ super(compiler);
CoreClasses get coreClasses => compiler.coreClasses;
@@ -688,10 +642,8 @@
Identifier selector = node.selector.asIdentifier();
var e = prefixElement.lookupLocalMember(selector.source);
if (e == null || !e.impliesType) {
- reporter.reportErrorMessage(
- node.selector,
- MessageKind.CANNOT_RESOLVE_TYPE,
- {'typeName': node.selector});
+ reporter.reportErrorMessage(node.selector,
+ MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': node.selector});
return;
}
loadSupertype(e, node);
diff --git a/pkg/compiler/lib/src/resolution/class_members.dart b/pkg/compiler/lib/src/resolution/class_members.dart
index 36feaa4..eb993bd 100644
--- a/pkg/compiler/lib/src/resolution/class_members.dart
+++ b/pkg/compiler/lib/src/resolution/class_members.dart
@@ -5,24 +5,21 @@
library dart2js.resolution.compute_members;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers,
- Names;
-import '../common/resolution.dart' show
- Resolution;
-import '../compiler.dart' show
- Compiler;
+import '../common/names.dart' show Identifiers, Names;
+import '../common/resolution.dart' show Resolution;
+import '../compiler.dart' show Compiler;
import '../dart_types.dart';
-import '../elements/elements.dart' show
- ClassElement,
- Element,
- LibraryElement,
- Member,
- MemberElement,
- MemberSignature,
- MixinApplicationElement,
- Name,
- PublicName;
+import '../elements/elements.dart'
+ show
+ ClassElement,
+ Element,
+ LibraryElement,
+ Member,
+ MemberElement,
+ MemberSignature,
+ MixinApplicationElement,
+ Name,
+ PublicName;
import '../util/util.dart';
part 'member_impl.dart';
@@ -34,13 +31,14 @@
final Iterable<String> computedMemberNames;
final Map<Name, Member> classMembers;
- Map<dynamic/* Member | Element */, Set<MessageKind>> reportedMessages =
+ Map<dynamic /* Member | Element */, Set<MessageKind>> reportedMessages =
new Map<dynamic, Set<MessageKind>>();
- MembersCreator(Compiler this.compiler,
- ClassElement this.cls,
- Iterable<String> this.computedMemberNames,
- Map<Name, Member> this.classMembers) {
+ MembersCreator(
+ Compiler this.compiler,
+ ClassElement this.cls,
+ Iterable<String> this.computedMemberNames,
+ Map<Name, Member> this.classMembers) {
assert(invariant(cls, cls.isDeclaration,
message: "Members may only be computed on declarations."));
}
@@ -51,8 +49,7 @@
void reportMessage(var marker, MessageKind kind, report()) {
Set<MessageKind> messages =
- reportedMessages.putIfAbsent(marker,
- () => new Set<MessageKind>());
+ reportedMessages.putIfAbsent(marker, () => new Set<MessageKind>());
if (messages.add(kind)) {
report();
}
@@ -60,13 +57,12 @@
bool shouldSkipMember(MemberSignature member) {
return member == null || shouldSkipName(member.name.text);
-
}
bool shouldSkipName(String name) {
return computedMemberNames != null &&
- // 'call' is implicitly contained in [computedMemberNames].
- (name == Identifiers.call || computedMemberNames.contains(name));
+ // 'call' is implicitly contained in [computedMemberNames].
+ (name == Identifiers.call || computedMemberNames.contains(name));
}
/// Compute all members of [cls] with the given names.
@@ -159,8 +155,8 @@
}
if (names != null) {
- _computeClassMember(compiler, mixinApplication.mixin,
- nameText, names);
+ _computeClassMember(
+ compiler, mixinApplication.mixin, nameText, names);
for (Name memberName in names) {
inheritMixinMember(
mixinApplication.mixin.lookupClassMember(memberName));
@@ -180,14 +176,13 @@
if (shouldSkipName(elementName)) return;
if (nameText != null && elementName != nameText) return;
- void addDeclaredMember(Name name,
- DartType type, FunctionType functionType) {
+ void addDeclaredMember(
+ Name name, DartType type, FunctionType functionType) {
DeclaredMember inherited = classMembers[name];
DeclaredMember declared;
if (element.isAbstract) {
declared = new DeclaredAbstractMember(
- name, element, thisType, type, functionType,
- inherited);
+ name, element, thisType, type, functionType, inherited);
} else {
declared =
new DeclaredMember(name, element, thisType, type, functionType);
@@ -202,10 +197,11 @@
DartType type = element.computeType(resolution);
addDeclaredMember(name, type, new FunctionType.synthesized(type));
if (!element.isConst && !element.isFinal) {
- addDeclaredMember(name.setter, type,
+ addDeclaredMember(
+ name.setter,
+ type,
new FunctionType.synthesized(
- const VoidType(),
- <DartType>[type]));
+ const VoidType(), <DartType>[type]));
}
} else if (element.isGetter) {
FunctionType functionType = element.computeType(resolution);
@@ -242,9 +238,8 @@
}
/// Checks that [classMember] is a valid implementation for [interfaceMember].
- void checkInterfaceMember(Name name,
- MemberSignature interfaceMember,
- Member classMember) {
+ void checkInterfaceMember(
+ Name name, MemberSignature interfaceMember, Member classMember) {
if (classMember != null) {
// TODO(johnniwinther): Check that the class member is a valid override
// of the interface member.
@@ -259,54 +254,56 @@
} else if (interfaceMember.isGetter) {
kind = MessageKind.ABSTRACT_GETTER;
}
- reportMessage(
- interfaceMember.element, MessageKind.ABSTRACT_METHOD, () {
- reporter.reportWarningMessage(
- interfaceMember.element, kind,
+ reportMessage(interfaceMember.element, MessageKind.ABSTRACT_METHOD, () {
+ reporter.reportWarningMessage(interfaceMember.element, kind,
{'class': cls.name, 'name': name.text});
});
} else {
- reportWarning(MessageKind singleKind,
- MessageKind multipleKind,
- MessageKind explicitlyDeclaredKind,
- [MessageKind implicitlyDeclaredKind]) {
+ reportWarning(MessageKind singleKind, MessageKind multipleKind,
+ MessageKind explicitlyDeclaredKind,
+ [MessageKind implicitlyDeclaredKind]) {
Member inherited = interfaceMember.declarations.first;
- reportMessage(
- interfaceMember, MessageKind.UNIMPLEMENTED_METHOD, () {
+ reportMessage(interfaceMember, MessageKind.UNIMPLEMENTED_METHOD, () {
DiagnosticMessage warning = reporter.createMessage(
cls,
interfaceMember.declarations.length == 1
- ? singleKind : multipleKind,
- {'class': cls.name,
- 'name': name.text,
- 'method': interfaceMember,
- 'declarer': inherited.declarer});
+ ? singleKind
+ : multipleKind,
+ {
+ 'class': cls.name,
+ 'name': name.text,
+ 'method': interfaceMember,
+ 'declarer': inherited.declarer
+ });
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
for (Member inherited in interfaceMember.declarations) {
infos.add(reporter.createMessage(
inherited.element,
- inherited.isDeclaredByField ?
- implicitlyDeclaredKind : explicitlyDeclaredKind,
- {'class': inherited.declarer.name,
- 'name': name.text}));
+ inherited.isDeclaredByField
+ ? implicitlyDeclaredKind
+ : explicitlyDeclaredKind,
+ {'class': inherited.declarer.name, 'name': name.text}));
}
reporter.reportWarning(warning, infos);
});
}
if (interfaceMember.isSetter) {
- reportWarning(MessageKind.UNIMPLEMENTED_SETTER_ONE,
- MessageKind.UNIMPLEMENTED_SETTER,
- MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
- MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
+ reportWarning(
+ MessageKind.UNIMPLEMENTED_SETTER_ONE,
+ MessageKind.UNIMPLEMENTED_SETTER,
+ MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
+ MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
} else if (interfaceMember.isGetter) {
- reportWarning(MessageKind.UNIMPLEMENTED_GETTER_ONE,
- MessageKind.UNIMPLEMENTED_GETTER,
- MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
- MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);
+ reportWarning(
+ MessageKind.UNIMPLEMENTED_GETTER_ONE,
+ MessageKind.UNIMPLEMENTED_GETTER,
+ MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
+ MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);
} else if (interfaceMember.isMethod) {
- reportWarning(MessageKind.UNIMPLEMENTED_METHOD_ONE,
- MessageKind.UNIMPLEMENTED_METHOD,
- MessageKind.UNIMPLEMENTED_METHOD_CONT);
+ reportWarning(
+ MessageKind.UNIMPLEMENTED_METHOD_ONE,
+ MessageKind.UNIMPLEMENTED_METHOD,
+ MessageKind.UNIMPLEMENTED_METHOD_CONT);
}
}
// TODO(johnniwinther): If [cls] is not abstract, check that for all
@@ -326,13 +323,12 @@
if (compiler.backend.isBackendLibrary(cls.library)) return;
reportMessage(functionClass, MessageKind.UNIMPLEMENTED_METHOD, () {
- reporter.reportWarningMessage(
- cls,
- MessageKind.UNIMPLEMENTED_METHOD_ONE,
- {'class': cls.name,
- 'name': Identifiers.call,
- 'method': Identifiers.call,
- 'declarer': functionClass.name});
+ reporter.reportWarningMessage(cls, MessageKind.UNIMPLEMENTED_METHOD_ONE, {
+ 'class': cls.name,
+ 'name': Identifiers.call,
+ 'method': Identifiers.call,
+ 'declarer': functionClass.name
+ });
});
}
@@ -346,23 +342,20 @@
if (!declared.isStatic) {
ClassElement superclass = cls.superclass;
while (superclass != null) {
- Member superMember =
- superclass.lookupClassMember(declared.name);
+ Member superMember = superclass.lookupClassMember(declared.name);
if (superMember != null && superMember.isStatic) {
reportMessage(superMember, MessageKind.INSTANCE_STATIC_SAME_NAME,
() {
reporter.reportWarning(
reporter.createMessage(
- declared.element,
- MessageKind.INSTANCE_STATIC_SAME_NAME,
- {'memberName': declared.name,
- 'className': superclass.name}),
+ declared.element, MessageKind.INSTANCE_STATIC_SAME_NAME, {
+ 'memberName': declared.name,
+ 'className': superclass.name
+ }),
<DiagnosticMessage>[
- reporter.createMessage(
- superMember.element,
- MessageKind.INSTANCE_STATIC_SAME_NAME_CONT),
+ reporter.createMessage(superMember.element,
+ MessageKind.INSTANCE_STATIC_SAME_NAME_CONT),
]);
-
});
break;
}
@@ -380,11 +373,12 @@
continue;
}
- reportMessage(
- inherited.element, MessageKind.NO_STATIC_OVERRIDE, () {
+ reportMessage(inherited.element, MessageKind.NO_STATIC_OVERRIDE, () {
reportErrorWithContext(
- declared.element, MessageKind.NO_STATIC_OVERRIDE,
- inherited.element, MessageKind.NO_STATIC_OVERRIDE_CONT);
+ declared.element,
+ MessageKind.NO_STATIC_OVERRIDE,
+ inherited.element,
+ MessageKind.NO_STATIC_OVERRIDE_CONT);
});
}
}
@@ -398,105 +392,102 @@
// An error should already have been reported.
assert(invariant(declared.element, compiler.compilationFailed,
message: "Member $inherited inherited from its "
- "declaring class: ${cls}."));
+ "declaring class: ${cls}."));
continue;
}
void reportError(MessageKind errorKind, MessageKind infoKind) {
- reportMessage(
- inherited.element, MessageKind.INVALID_OVERRIDE_METHOD, () {
+ reportMessage(inherited.element, MessageKind.INVALID_OVERRIDE_METHOD,
+ () {
reporter.reportError(
- reporter.createMessage(
- declared.element,
- errorKind,
- {'name': declared.name.text,
- 'class': cls.thisType,
- 'inheritedClass': inherited.declarer}),
+ reporter.createMessage(declared.element, errorKind, {
+ 'name': declared.name.text,
+ 'class': cls.thisType,
+ 'inheritedClass': inherited.declarer
+ }),
<DiagnosticMessage>[
- reporter.createMessage(
- inherited.element,
- infoKind,
- {'name': declared.name.text,
- 'class': inherited.declarer}),
+ reporter.createMessage(inherited.element, infoKind, {
+ 'name': declared.name.text,
+ 'class': inherited.declarer
+ }),
]);
});
}
if (declared.isDeclaredByField && inherited.isMethod) {
reportError(MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
- MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT);
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT);
} else if (declared.isMethod && inherited.isDeclaredByField) {
reportError(MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
- MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT);
+ MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT);
} else if (declared.isGetter && inherited.isMethod) {
reportError(MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
- MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT);
+ MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT);
} else if (declared.isMethod && inherited.isGetter) {
reportError(MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
- MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT);
+ MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT);
} else {
DartType inheritedType = inherited.functionType;
if (!compiler.types.isSubtype(declaredType, inheritedType)) {
- void reportWarning(var marker,
- MessageKind warningKind,
- MessageKind infoKind) {
+ void reportWarning(
+ var marker, MessageKind warningKind, MessageKind infoKind) {
reportMessage(marker, MessageKind.INVALID_OVERRIDE_METHOD, () {
reporter.reportWarning(
- reporter.createMessage(
- declared.element,
- warningKind,
- {'declaredType': declared.type,
- 'name': declared.name.text,
- 'class': cls.thisType,
- 'inheritedType': inherited.type,
- 'inheritedClass': inherited.declarer}),
+ reporter.createMessage(declared.element, warningKind, {
+ 'declaredType': declared.type,
+ 'name': declared.name.text,
+ 'class': cls.thisType,
+ 'inheritedType': inherited.type,
+ 'inheritedClass': inherited.declarer
+ }),
<DiagnosticMessage>[
- reporter.createMessage(
- inherited.element,
- infoKind,
- {'name': declared.name.text,
- 'class': inherited.declarer}),
+ reporter.createMessage(inherited.element, infoKind, {
+ 'name': declared.name.text,
+ 'class': inherited.declarer
+ }),
]);
});
}
if (declared.isDeclaredByField) {
if (inherited.isDeclaredByField) {
- reportWarning(inherited.element,
- MessageKind.INVALID_OVERRIDE_FIELD,
- MessageKind.INVALID_OVERRIDDEN_FIELD);
+ reportWarning(
+ inherited.element,
+ MessageKind.INVALID_OVERRIDE_FIELD,
+ MessageKind.INVALID_OVERRIDDEN_FIELD);
} else if (inherited.isGetter) {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
- MessageKind.INVALID_OVERRIDDEN_GETTER);
+ reportWarning(
+ inherited,
+ MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
+ MessageKind.INVALID_OVERRIDDEN_GETTER);
} else if (inherited.isSetter) {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
- MessageKind.INVALID_OVERRIDDEN_SETTER);
+ reportWarning(
+ inherited,
+ MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
+ MessageKind.INVALID_OVERRIDDEN_SETTER);
}
} else if (declared.isGetter) {
if (inherited.isDeclaredByField) {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
- MessageKind.INVALID_OVERRIDDEN_FIELD);
+ reportWarning(
+ inherited,
+ MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
+ MessageKind.INVALID_OVERRIDDEN_FIELD);
} else {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_GETTER,
- MessageKind.INVALID_OVERRIDDEN_GETTER);
+ reportWarning(inherited, MessageKind.INVALID_OVERRIDE_GETTER,
+ MessageKind.INVALID_OVERRIDDEN_GETTER);
}
} else if (declared.isSetter) {
if (inherited.isDeclaredByField) {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
- MessageKind.INVALID_OVERRIDDEN_FIELD);
+ reportWarning(
+ inherited,
+ MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
+ MessageKind.INVALID_OVERRIDDEN_FIELD);
} else {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_SETTER,
- MessageKind.INVALID_OVERRIDDEN_SETTER);
+ reportWarning(inherited, MessageKind.INVALID_OVERRIDE_SETTER,
+ MessageKind.INVALID_OVERRIDDEN_SETTER);
}
} else {
- reportWarning(inherited,
- MessageKind.INVALID_OVERRIDE_METHOD,
- MessageKind.INVALID_OVERRIDDEN_METHOD);
+ reportWarning(inherited, MessageKind.INVALID_OVERRIDE_METHOD,
+ MessageKind.INVALID_OVERRIDDEN_METHOD);
}
}
}
@@ -504,36 +495,37 @@
}
}
- void reportErrorWithContext(Element errorneousElement,
- MessageKind errorMessage,
- Element contextElement,
- MessageKind contextMessage) {
+ void reportErrorWithContext(
+ Element errorneousElement,
+ MessageKind errorMessage,
+ Element contextElement,
+ MessageKind contextMessage) {
reporter.reportError(
- reporter.createMessage(
- errorneousElement,
- errorMessage,
- {'memberName': contextElement.name,
- 'className': contextElement.enclosingClass.name}),
+ reporter.createMessage(errorneousElement, errorMessage, {
+ 'memberName': contextElement.name,
+ 'className': contextElement.enclosingClass.name
+ }),
<DiagnosticMessage>[
- reporter.createMessage(contextElement, contextMessage),
+ reporter.createMessage(contextElement, contextMessage),
]);
}
/// Compute all class and interface names by the [name] in [cls].
- static void computeClassMembersByName(Compiler compiler,
- ClassMemberMixin cls,
- String name) {
+ static void computeClassMembersByName(
+ Compiler compiler, ClassMemberMixin cls, String name) {
if (cls.isMemberComputed(name)) return;
LibraryElement library = cls.library;
- _computeClassMember(compiler, cls, name,
- new Setlet<Name>()..add(new Name(name, library))
- ..add(new Name(name, library, isSetter: true)));
+ _computeClassMember(
+ compiler,
+ cls,
+ name,
+ new Setlet<Name>()
+ ..add(new Name(name, library))
+ ..add(new Name(name, library, isSetter: true)));
}
- static void _computeClassMember(Compiler compiler,
- ClassMemberMixin cls,
- String name,
- Setlet<Name> names) {
+ static void _computeClassMember(Compiler compiler, ClassMemberMixin cls,
+ String name, Setlet<Name> names) {
cls.computeClassMember(compiler, name, names);
}
@@ -546,10 +538,8 @@
/// Class member creator for classes where the interface members are known to
/// be a subset of the class members.
class ClassMembersCreator extends MembersCreator {
- ClassMembersCreator(Compiler compiler,
- ClassElement cls,
- Iterable<String> computedMemberNames,
- Map<Name, Member> classMembers)
+ ClassMembersCreator(Compiler compiler, ClassElement cls,
+ Iterable<String> computedMemberNames, Map<Name, Member> classMembers)
: super(compiler, cls, computedMemberNames, classMembers);
Map<Name, Member> computeMembers(String name, Setlet<Name> names) {
@@ -565,7 +555,7 @@
LibraryElement library = cls.library;
classMembers.forEach((Name name, Member classMember) {
if (!name.isAccessibleFrom(library)) return;
- checkInterfaceMember(name, classMember, classMember.implementation);
+ checkInterfaceMember(name, classMember, classMember.implementation);
});
}
}
@@ -575,11 +565,12 @@
class InterfaceMembersCreator extends MembersCreator {
final Map<Name, MemberSignature> interfaceMembers;
- InterfaceMembersCreator(Compiler compiler,
- ClassElement cls,
- Iterable<String> computedMemberNames,
- Map<Name, Member> classMembers,
- Map<Name, MemberSignature> this.interfaceMembers)
+ InterfaceMembersCreator(
+ Compiler compiler,
+ ClassElement cls,
+ Iterable<String> computedMemberNames,
+ Map<Name, Member> classMembers,
+ Map<Name, MemberSignature> this.interfaceMembers)
: super(compiler, cls, computedMemberNames, classMembers);
Map<Name, Member> computeMembers(String name, Setlet<Name> names) {
@@ -596,16 +587,14 @@
///
/// If [name] and [names] are not null, the computation is restricted to
/// members with these names.
- Map<Name, Setlet<Member>> computeSuperMembers(String name,
- Setlet<Name> names) {
+ Map<Name, Setlet<Member>> computeSuperMembers(
+ String name, Setlet<Name> names) {
computeSuperClassMembers(name, names);
return computeSuperInterfaceMembers(name, names);
}
- Map<Name, Setlet<Member>> computeSuperInterfaceMembers(String name,
- Setlet<Name> names) {
-
-
+ Map<Name, Setlet<Member>> computeSuperInterfaceMembers(
+ String name, Setlet<Name> names) {
InterfaceType supertype = cls.supertype;
assert(invariant(cls, supertype != null,
message: "Interface members computed for $cls."));
@@ -614,12 +603,11 @@
Map<Name, Setlet<Member>> inheritedInterfaceMembers =
new Map<Name, Setlet<Member>>();
- void inheritInterfaceMember(InterfaceType supertype,
- MemberSignature member) {
+ void inheritInterfaceMember(
+ InterfaceType supertype, MemberSignature member) {
if (shouldSkipMember(member)) return;
- Setlet<Member> members =
- inheritedInterfaceMembers.putIfAbsent(
- member.name, () => new Setlet<Member>());
+ Setlet<Member> members = inheritedInterfaceMembers.putIfAbsent(
+ member.name, () => new Setlet<Member>());
for (DeclaredMember declaredMember in member.declarations) {
members.add(declaredMember.inheritFrom(supertype));
}
@@ -633,8 +621,8 @@
if (names != null) {
for (Name memberName in names) {
- inheritInterfaceMember(supertype,
- superclass.lookupInterfaceMember(memberName));
+ inheritInterfaceMember(
+ supertype, superclass.lookupInterfaceMember(memberName));
}
} else {
inheritInterfaceMembers(supertype);
@@ -642,8 +630,8 @@
// Inherit interface members from superinterfaces.
for (Link<DartType> link = cls.interfaces;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
InterfaceType superinterface = link.head;
if (names != null) {
MembersCreator._computeClassMember(
@@ -677,14 +665,14 @@
/// interface members [inheritedInterfaceMembers] and declared members
/// [declaredMembers]. The computed members are stored in [interfaceMembers].
void computeInterfaceMembers(
- Map<Name, Setlet<Member>> inheritedInterfaceMembers,
- Map<Name, Member> declaredMembers) {
+ Map<Name, Setlet<Member>> inheritedInterfaceMembers,
+ Map<Name, Member> declaredMembers) {
InterfaceType thisType = cls.thisType;
// Compute the interface members by overriding the inherited members with
// a declared member or by computing a single, possibly synthesized,
// inherited member.
- inheritedInterfaceMembers.forEach(
- (Name name, Setlet<Member> inheritedMembers) {
+ inheritedInterfaceMembers
+ .forEach((Name name, Setlet<Member> inheritedMembers) {
Member declared = declaredMembers[name];
if (declared != null) {
// Check that [declaredMember] is a valid override
@@ -710,19 +698,20 @@
if (someAreGetters) break outer;
}
for (MemberSignature other in inheritedMembers) {
- if (!compiler.types.isSubtype(inherited.functionType,
- other.functionType)) {
+ if (!compiler.types
+ .isSubtype(inherited.functionType, other.functionType)) {
continue outer;
}
}
- subtypesOfAllInherited.putIfAbsent(inherited.functionType,
- () => new Setlet<Member>()).add(inherited);
+ subtypesOfAllInherited
+ .putIfAbsent(inherited.functionType, () => new Setlet<Member>())
+ .add(inherited);
}
if (someAreGetters && !allAreGetters) {
DiagnosticMessage warning = reporter.createMessage(
cls,
MessageKind.INHERIT_GETTER_AND_METHOD,
- {'class': thisType, 'name': name.text });
+ {'class': thisType, 'name': name.text});
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
for (Member inherited in inheritedMembers) {
MessageKind kind;
@@ -731,16 +720,14 @@
} else {
assert(invariant(cls, inherited.isGetter,
message: 'Conflicting member is neither a method nor a '
- 'getter.'));
+ 'getter.'));
if (inherited.isDeclaredByField) {
kind = MessageKind.INHERITED_IMPLICIT_GETTER;
} else {
kind = MessageKind.INHERITED_EXPLICIT_GETTER;
}
}
- infos.add(reporter.createMessage(
- inherited.element,
- kind,
+ infos.add(reporter.createMessage(inherited.element, kind,
{'class': inherited.declarer, 'name': name.text}));
}
reporter.reportWarning(warning, infos);
@@ -771,8 +758,7 @@
}
/// Create and inherit a synthesized member for [inheritedMembers].
- void _inheritedSynthesizedMember(Name name,
- Setlet<Member> inheritedMembers) {
+ void _inheritedSynthesizedMember(Name name, Setlet<Member> inheritedMembers) {
// Multiple signatures with different types => create the synthesized
// version.
int minRequiredParameters;
@@ -786,8 +772,7 @@
}
if (member.type.isFunctionType) {
FunctionType type = member.type;
- type.namedParameters.forEach(
- (String name) => names.add(name));
+ type.namedParameters.forEach((String name) => names.add(name));
requiredParameters = type.parameterTypes.length;
optionalParameters = type.optionalParameterTypes.length;
}
@@ -801,8 +786,7 @@
maxPositionalParameters = positionalParameters;
}
}
- int optionalParameters =
- maxPositionalParameters - minRequiredParameters;
+ int optionalParameters = maxPositionalParameters - minRequiredParameters;
// TODO(johnniwinther): Support function types with both optional
// and named parameters?
if (optionalParameters == 0 || names.isEmpty) {
@@ -811,18 +795,18 @@
new List.filled(minRequiredParameters, dynamic);
List<DartType> optionalParameterTypes =
new List.filled(optionalParameters, dynamic);
- List<String> namedParameters =
- names.toList()..sort((a, b) => a.compareTo(b));
+ List<String> namedParameters = names.toList()
+ ..sort((a, b) => a.compareTo(b));
List<DartType> namedParameterTypes =
new List.filled(namedParameters.length, dynamic);
FunctionType memberType = new FunctionType.synthesized(
const DynamicType(),
requiredParameterTypes,
optionalParameterTypes,
- namedParameters, namedParameterTypes);
+ namedParameters,
+ namedParameterTypes);
DartType type = memberType;
- if (inheritedMembers.first.isGetter ||
- inheritedMembers.first.isSetter) {
+ if (inheritedMembers.first.isGetter || inheritedMembers.first.isSetter) {
type = const DynamicType();
}
interfaceMembers[name] =
@@ -858,9 +842,9 @@
if (interfaceMembersAreClassMembers) {
ClassMemberMixin superclass = this.superclass;
if ((superclass != null &&
- (!superclass.interfaceMembersAreClassMembers ||
- superclass.isMixinApplication)) ||
- !interfaces.isEmpty) {
+ (!superclass.interfaceMembersAreClassMembers ||
+ superclass.isMixinApplication)) ||
+ !interfaces.isEmpty) {
interfaceMembersAreClassMembers = false;
}
}
@@ -869,10 +853,10 @@
}
}
return interfaceMembersAreClassMembers
- ? new ClassMembersCreator(compiler, this,
- computedMemberNames, classMembers)
- : new InterfaceMembersCreator(compiler, this,
- computedMemberNames, classMembers, interfaceMembers);
+ ? new ClassMembersCreator(
+ compiler, this, computedMemberNames, classMembers)
+ : new InterfaceMembersCreator(compiler, this, computedMemberNames,
+ classMembers, interfaceMembers);
}
static Iterable<String> _EMPTY_MEMBERS_NAMES = const <String>[];
@@ -883,8 +867,9 @@
void computeClassMember(Compiler compiler, String name, Setlet<Name> names) {
if (isMemberComputed(name)) return;
if (Name.isPrivateName(name)) {
- names..add(new Name(name, library))
- ..add(new Name(name, library, isSetter: true));
+ names
+ ..add(new Name(name, library))
+ ..add(new Name(name, library, isSetter: true));
}
MembersCreator creator = _prepareCreator(compiler);
creator.computeMembersByName(name, names);
@@ -918,14 +903,12 @@
if (computedMemberNames == null) {
return classMembers != null;
} else {
- return name == Identifiers.call ||
- computedMemberNames.contains(name);
+ return name == Identifiers.call || computedMemberNames.contains(name);
}
}
Member lookupClassMember(Name name) {
- assert(invariant(this,
- isMemberComputed(name.text),
+ assert(invariant(this, isMemberComputed(name.text),
message: "Member ${name} has not been computed for $this."));
return classMembers[name];
}
diff --git a/pkg/compiler/lib/src/resolution/constructors.dart b/pkg/compiler/lib/src/resolution/constructors.dart
index 664ac0d..9e40cff 100644
--- a/pkg/compiler/lib/src/resolution/constructors.dart
+++ b/pkg/compiler/lib/src/resolution/constructors.dart
@@ -5,39 +5,32 @@
library dart2js.resolution.constructors;
import '../common.dart';
-import '../common/resolution.dart' show
- Feature;
-import '../compiler.dart' show
- Compiler;
-import '../constants/constructors.dart' show
- GenerativeConstantConstructor,
- RedirectingGenerativeConstantConstructor;
+import '../common/resolution.dart' show Feature;
+import '../compiler.dart' show Compiler;
+import '../constants/constructors.dart'
+ show
+ GenerativeConstantConstructor,
+ RedirectingGenerativeConstantConstructor;
import '../constants/expressions.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- ConstructorElementX,
- ErroneousConstructorElementX,
- ErroneousElementX,
- ErroneousFieldElementX,
- FieldElementX,
- InitializingFormalElementX,
- ParameterElementX;
+import '../elements/modelx.dart'
+ show
+ ConstructorElementX,
+ ErroneousConstructorElementX,
+ ErroneousElementX,
+ ErroneousFieldElementX,
+ FieldElementX,
+ InitializingFormalElementX,
+ ParameterElementX;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/use.dart' show
- StaticUse;
+import '../util/util.dart' show Link;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/use.dart' show StaticUse;
-import 'members.dart' show
- lookupInScope,
- ResolverVisitor;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'resolution_common.dart' show
- CommonResolverVisitor;
+import 'members.dart' show lookupInScope, ResolverVisitor;
+import 'registry.dart' show ResolutionRegistry;
+import 'resolution_common.dart' show CommonResolverVisitor;
import 'resolution_result.dart';
class InitializerResolver {
@@ -66,19 +59,14 @@
return node.receiver.asIdentifier().isThis();
}
- reportDuplicateInitializerError(Element field,
- Node init,
- Spannable existing) {
+ reportDuplicateInitializerError(
+ Element field, Node init, Spannable existing) {
reporter.reportError(
reporter.createMessage(
- init,
- MessageKind.DUPLICATE_INITIALIZER,
- {'fieldName': field.name}),
+ init, MessageKind.DUPLICATE_INITIALIZER, {'fieldName': field.name}),
<DiagnosticMessage>[
- reporter.createMessage(
- existing,
- MessageKind.ALREADY_INITIALIZED,
- {'fieldName': field.name}),
+ reporter.createMessage(existing, MessageKind.ALREADY_INITIALIZED,
+ {'fieldName': field.name}),
]);
isValidAsConstant = false;
}
@@ -92,9 +80,11 @@
field.parseNode(visitor.resolution.parsing);
Expression initializer = field.initializer;
if (initializer != null) {
- reportDuplicateInitializerError(field, init,
- reporter.withCurrentElement(field,
- () => reporter.spanFromSpannable(initializer)));
+ reportDuplicateInitializerError(
+ field,
+ init,
+ reporter.withCurrentElement(
+ field, () => reporter.spanFromSpannable(initializer)));
}
}
initialized[field] = init;
@@ -137,8 +127,7 @@
registry.registerStaticUse(new StaticUse.fieldInit(field));
}
// Resolve initializing value.
- ResolutionResult result = visitor.visitInStaticContext(
- init.arguments.head,
+ ResolutionResult result = visitor.visitInStaticContext(init.arguments.head,
inConstantInitializer: isConst);
if (isConst) {
if (result.isConstant && field != null) {
@@ -151,7 +140,7 @@
}
InterfaceType getSuperOrThisLookupTarget(Node diagnosticNode,
- {bool isSuperCall}) {
+ {bool isSuperCall}) {
if (isSuperCall) {
// Calculate correct lookup target and constructor name.
if (constructor.enclosingClass.isObject) {
@@ -179,17 +168,14 @@
ClassElement lookupTarget = targetType.element;
String constructorName =
visitor.getRedirectingThisOrSuperConstructorName(node).text;
- ConstructorElement foundConstructor = findConstructor(
- constructor.library, lookupTarget, constructorName);
+ ConstructorElement foundConstructor =
+ findConstructor(constructor.library, lookupTarget, constructorName);
final bool isImplicitSuperCall = false;
final String className = lookupTarget.name;
CallStructure callStructure = argumentsResult.callStructure;
ConstructorElement calledConstructor = verifyThatConstructorMatchesCall(
- node,
- foundConstructor,
- callStructure,
- className,
+ node, foundConstructor, callStructure, className,
constructorName: constructorName,
isThisCall: !isSuperCall,
isImplicitSuperCall: false);
@@ -197,9 +183,8 @@
// [InitializerStructure].
registry.useElement(node, calledConstructor);
if (!calledConstructor.isError) {
- registry.registerStaticUse(
- new StaticUse.superConstructorInvoke(
- calledConstructor, callStructure));
+ registry.registerStaticUse(new StaticUse.superConstructorInvoke(
+ calledConstructor, callStructure));
}
if (isConst) {
if (isValidAsConstant &&
@@ -209,10 +194,7 @@
return new ConstantResult(
node,
new ConstructedConstantExpression(
- targetType,
- calledConstructor,
- callStructure,
- arguments),
+ targetType, calledConstructor, callStructure, arguments),
element: calledConstructor);
} else {
isValidAsConstant = false;
@@ -238,10 +220,7 @@
final String className = lookupTarget.name;
CallStructure callStructure = CallStructure.NO_ARGS;
ConstructorElement result = verifyThatConstructorMatchesCall(
- functionNode,
- calledConstructor,
- callStructure,
- className,
+ functionNode, calledConstructor, callStructure, className,
isImplicitSuperCall: true);
if (!result.isError) {
registry.registerStaticUse(
@@ -249,24 +228,17 @@
}
if (isConst && isValidAsConstant) {
- return new ConstructedConstantExpression(
- targetType,
- result,
- CallStructure.NO_ARGS,
- const <ConstantExpression>[]);
+ return new ConstructedConstantExpression(targetType, result,
+ CallStructure.NO_ARGS, const <ConstantExpression>[]);
}
}
return null;
}
ConstructorElement reportAndCreateErroneousConstructor(
- Spannable diagnosticNode,
- String name,
- MessageKind kind,
- Map arguments) {
+ Spannable diagnosticNode, String name, MessageKind kind, Map arguments) {
isValidAsConstant = false;
- reporter.reportErrorMessage(
- diagnosticNode, kind, arguments);
+ reporter.reportErrorMessage(diagnosticNode, kind, arguments);
return new ErroneousConstructorElementX(
kind, arguments, name, visitor.currentClass);
}
@@ -282,8 +254,8 @@
CallStructure callStructure,
String className,
{String constructorName: '',
- bool isImplicitSuperCall: false,
- bool isThisCall: false}) {
+ bool isImplicitSuperCall: false,
+ bool isThisCall: false}) {
Element result = lookedupConstructor;
if (lookedupConstructor == null) {
String fullConstructorName =
@@ -291,19 +263,18 @@
MessageKind kind = isImplicitSuperCall
? MessageKind.CANNOT_RESOLVE_CONSTRUCTOR_FOR_IMPLICIT
: MessageKind.CANNOT_RESOLVE_CONSTRUCTOR;
- result = reportAndCreateErroneousConstructor(
- node, constructorName,
- kind, {'constructorName': fullConstructorName});
+ result = reportAndCreateErroneousConstructor(node, constructorName, kind,
+ {'constructorName': fullConstructorName});
} else if (!lookedupConstructor.isGenerativeConstructor) {
MessageKind kind = isThisCall
? MessageKind.THIS_CALL_TO_FACTORY
: MessageKind.SUPER_CALL_TO_FACTORY;
- result = reportAndCreateErroneousConstructor(
- node, constructorName, kind, {});
+ result =
+ reportAndCreateErroneousConstructor(node, constructorName, kind, {});
} else {
lookedupConstructor.computeType(visitor.resolution);
- if (!callStructure.signatureApplies(
- lookedupConstructor.functionSignature)) {
+ if (!callStructure
+ .signatureApplies(lookedupConstructor.functionSignature)) {
MessageKind kind = isImplicitSuperCall
? MessageKind.NO_MATCHING_CONSTRUCTOR_FOR_IMPLICIT
: MessageKind.NO_MATCHING_CONSTRUCTOR;
@@ -325,8 +296,8 @@
* constructor, the resolved constructor's function element is returned.
*/
ConstructorElement resolveInitializers() {
- Map<dynamic/*String|int*/, ConstantExpression> defaultValues =
- <dynamic/*String|int*/, ConstantExpression>{};
+ Map<dynamic /*String|int*/, ConstantExpression> defaultValues =
+ <dynamic /*String|int*/, ConstantExpression>{};
ConstructedConstantExpression constructorInvocation;
// Keep track of all "this.param" parameters specified for constructor so
// that we can ensure that fields are initialized only once.
@@ -437,8 +408,7 @@
if (isConst && isValidAsConstant) {
constructor.constantConstructor =
new RedirectingGenerativeConstantConstructor(
- defaultValues,
- constructorInvocation);
+ defaultValues, constructorInvocation);
}
}
return result.element;
@@ -448,8 +418,7 @@
return null;
}
} else {
- reporter.reportErrorMessage(
- link.head, MessageKind.INVALID_INITIALIZER);
+ reporter.reportErrorMessage(link.head, MessageKind.INVALID_INITIALIZER);
}
}
if (!resolvedSuper) {
@@ -462,7 +431,7 @@
fieldInitializers,
constructorInvocation);
}
- return null; // If there was no redirection always return null.
+ return null; // If there was no redirection always return null.
}
}
@@ -471,7 +440,7 @@
final bool inConstContext;
ConstructorResolver(Compiler compiler, this.resolver,
- {bool this.inConstContext: false})
+ {bool this.inConstContext: false})
: super(compiler);
ResolutionRegistry get registry => resolver.registry;
@@ -489,8 +458,8 @@
MessageKind kind,
Map arguments,
{bool isError: false,
- bool missingConstructor: false,
- List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) {
+ bool missingConstructor: false,
+ List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) {
if (missingConstructor) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
} else {
@@ -503,19 +472,16 @@
} else {
reporter.reportWarning(message, infos);
}
- ErroneousElement error = new ErroneousConstructorElementX(
- kind, arguments, name, enclosing);
+ ErroneousElement error =
+ new ErroneousConstructorElementX(kind, arguments, name, enclosing);
if (type == null) {
type = new MalformedType(error, null);
}
return new ConstructorResult.forError(resultKind, error, type);
}
- ConstructorResult resolveConstructor(
- PrefixElement prefix,
- InterfaceType type,
- Node diagnosticNode,
- String constructorName) {
+ ConstructorResult resolveConstructor(PrefixElement prefix, InterfaceType type,
+ Node diagnosticNode, String constructorName) {
ClassElement cls = type.element;
cls.ensureResolved(resolution);
ConstructorElement constructor = findConstructor(
@@ -526,8 +492,11 @@
: MessageKind.CANNOT_FIND_CONSTRUCTOR;
return reportAndCreateErroneousConstructorElement(
diagnosticNode,
- ConstructorResultKind.UNRESOLVED_CONSTRUCTOR, type,
- cls, constructorName, kind,
+ ConstructorResultKind.UNRESOLVED_CONSTRUCTOR,
+ type,
+ cls,
+ constructorName,
+ kind,
{'className': cls.name, 'constructorName': constructorName},
missingConstructor: true);
} else if (inConstContext && !constructor.isConst) {
@@ -539,8 +508,10 @@
if (cls.isEnumClass && resolver.currentClass != cls) {
return reportAndCreateErroneousConstructorElement(
diagnosticNode,
- ConstructorResultKind.INVALID_TYPE, type,
- cls, constructorName,
+ ConstructorResultKind.INVALID_TYPE,
+ type,
+ cls,
+ constructorName,
MessageKind.CANNOT_INSTANTIATE_ENUM,
{'enumName': cls.name},
isError: true);
@@ -576,9 +547,7 @@
/// Finishes resolution of a constructor reference and records the
/// type of the constructed instance on [expression].
ConstructorResult finishConstructorReference(
- ConstructorResult result,
- Node diagnosticNode,
- Node expression) {
+ ConstructorResult result, Node diagnosticNode, Node expression) {
assert(invariant(diagnosticNode, result != null,
message: 'No result returned for $diagnosticNode.'));
@@ -591,8 +560,8 @@
// class.
if (result.type != null) {
// The unnamed constructor may not exist, so [e] may become unresolved.
- result = resolveConstructor(
- result.prefix, result.type, diagnosticNode, '');
+ result =
+ resolveConstructor(result.prefix, result.type, diagnosticNode, '');
} else {
Element element = result.element;
if (element.isMalformed) {
@@ -600,9 +569,12 @@
} else {
result = reportAndCreateErroneousConstructorElement(
diagnosticNode,
- ConstructorResultKind.INVALID_TYPE, null,
- element, element.name,
- MessageKind.NOT_A_TYPE, {'node': diagnosticNode});
+ ConstructorResultKind.INVALID_TYPE,
+ null,
+ element,
+ element.name,
+ MessageKind.NOT_A_TYPE,
+ {'node': diagnosticNode});
}
}
resolver.registry.setType(expression, result.type);
@@ -612,10 +584,8 @@
ConstructorResult visitTypeAnnotation(TypeAnnotation node) {
// This is not really resolving a type-annotation, but the name of the
// constructor. Therefore we allow deferred types.
- DartType type = resolver.resolveTypeAnnotation(
- node,
- malformedIsError: inConstContext,
- deferredIsMalformed: false);
+ DartType type = resolver.resolveTypeAnnotation(node,
+ malformedIsError: inConstContext, deferredIsMalformed: false);
Send send = node.typeName.asSend();
PrefixElement prefix;
if (send != null) {
@@ -653,15 +623,18 @@
// TODO(johnniwinther): Update the message for the different types.
return reportAndCreateErroneousConstructorElement(
name,
- ConstructorResultKind.INVALID_TYPE, null,
- resolver.enclosingElement, name.source,
- MessageKind.NOT_A_TYPE, {'node': name});
+ ConstructorResultKind.INVALID_TYPE,
+ null,
+ resolver.enclosingElement,
+ name.source,
+ MessageKind.NOT_A_TYPE,
+ {'node': name});
}
} else if (receiver.element.isPrefix) {
PrefixElement prefix = receiver.element;
Element member = prefix.lookupLocalMember(name.source);
- return constructorResultForElement(
- node, name.source, member, prefix: prefix);
+ return constructorResultForElement(node, name.source, member,
+ prefix: prefix);
} else {
return reporter.internalError(
node.receiver, 'unexpected receiver $receiver');
@@ -678,8 +651,8 @@
/// Assumed to be called by [resolveRedirectingFactory].
ConstructorResult visitRedirectingFactoryBody(RedirectingFactoryBody node) {
Node constructorReference = node.constructorReference;
- return finishConstructorReference(visit(constructorReference),
- constructorReference, node);
+ return finishConstructorReference(
+ visit(constructorReference), constructorReference, node);
}
ConstructorResult constructorResultForElement(
@@ -689,16 +662,20 @@
if (element == null) {
return reportAndCreateErroneousConstructorElement(
node,
- ConstructorResultKind.INVALID_TYPE, null,
- resolver.enclosingElement, name,
+ ConstructorResultKind.INVALID_TYPE,
+ null,
+ resolver.enclosingElement,
+ name,
MessageKind.CANNOT_RESOLVE,
{'name': name});
} else if (element.isAmbiguous) {
AmbiguousElement ambiguous = element;
return reportAndCreateErroneousConstructorElement(
node,
- ConstructorResultKind.INVALID_TYPE, null,
- resolver.enclosingElement, name,
+ ConstructorResultKind.INVALID_TYPE,
+ null,
+ resolver.enclosingElement,
+ name,
ambiguous.messageKind,
ambiguous.messageArguments,
infos: ambiguous.computeInfos(resolver.enclosingElement, reporter));
@@ -720,30 +697,27 @@
} else {
return reportAndCreateErroneousConstructorElement(
node,
- ConstructorResultKind.INVALID_TYPE, null,
- resolver.enclosingElement, name,
- MessageKind.NOT_A_TYPE, {'node': name});
+ ConstructorResultKind.INVALID_TYPE,
+ null,
+ resolver.enclosingElement,
+ name,
+ MessageKind.NOT_A_TYPE,
+ {'node': name});
}
}
- ConstructorResult constructorResultForErroneous(
- Node node, Element error) {
+ ConstructorResult constructorResultForErroneous(Node node, Element error) {
if (error is! ErroneousElementX) {
// Parser error. The error has already been reported.
error = new ErroneousConstructorElementX(
- MessageKind.NOT_A_TYPE, {'node': node},
- error.name, error);
+ MessageKind.NOT_A_TYPE, {'node': node}, error.name, error);
registry.registerFeature(Feature.THROW_RUNTIME_ERROR);
}
- return new ConstructorResult.forError(
- ConstructorResultKind.INVALID_TYPE,
- error,
- new MalformedType(error, null));
+ return new ConstructorResult.forError(ConstructorResultKind.INVALID_TYPE,
+ error, new MalformedType(error, null));
}
- ConstructorResult constructorResultForType(
- Node node,
- DartType type,
+ ConstructorResult constructorResultForType(Node node, DartType type,
{PrefixElement prefix}) {
String name = type.name;
if (type.isMalformed) {
@@ -754,35 +728,44 @@
} else if (type.isTypedef) {
return reportAndCreateErroneousConstructorElement(
node,
- ConstructorResultKind.INVALID_TYPE, type,
- resolver.enclosingElement, name,
- MessageKind.CANNOT_INSTANTIATE_TYPEDEF, {'typedefName': name});
+ ConstructorResultKind.INVALID_TYPE,
+ type,
+ resolver.enclosingElement,
+ name,
+ MessageKind.CANNOT_INSTANTIATE_TYPEDEF,
+ {'typedefName': name});
} else if (type.isTypeVariable) {
return reportAndCreateErroneousConstructorElement(
node,
- ConstructorResultKind.INVALID_TYPE, type,
- resolver.enclosingElement, name,
+ ConstructorResultKind.INVALID_TYPE,
+ type,
+ resolver.enclosingElement,
+ name,
MessageKind.CANNOT_INSTANTIATE_TYPE_VARIABLE,
{'typeVariableName': name});
}
return reporter.internalError(node, "Unexpected constructor type $type");
}
-
}
/// The kind of constructor found by the [ConstructorResolver].
enum ConstructorResultKind {
/// A generative or redirecting generative constructor.
GENERATIVE,
+
/// A factory or redirecting factory constructor.
FACTORY,
+
/// A generative or redirecting generative constructor on an abstract class.
ABSTRACT,
+
/// No constructor was found because the type was invalid, for instance
/// unresolved, an enum class, a type variable, a typedef or a non-type.
INVALID_TYPE,
+
/// No constructor of the sought name was found on the class.
UNRESOLVED_CONSTRUCTOR,
+
/// A non-constant constructor was found for a const constructor invocation.
NON_CONSTANT,
}
@@ -808,10 +791,8 @@
/// Creates a fully resolved constructor access where [element] is resolved
/// to a constructor and [type] to an interface type.
- ConstructorResult(this.kind,
- this.prefix,
- ConstructorElement this.element,
- InterfaceType this.type);
+ ConstructorResult(this.kind, this.prefix, ConstructorElement this.element,
+ InterfaceType this.type);
/// Creates a fully resolved constructor access where [element] is an
/// [ErroneousElement].
@@ -862,9 +843,7 @@
/// Lookup the [constructorName] constructor in [cls] and normalize the result
/// with respect to privacy and patching.
ConstructorElement findConstructor(
- LibraryElement currentLibrary,
- ClassElement cls,
- String constructorName) {
+ LibraryElement currentLibrary, ClassElement cls, String constructorName) {
if (Name.isPrivateName(constructorName) &&
currentLibrary.library != cls.library) {
// TODO(johnniwinther): Report a special error on unaccessible private
diff --git a/pkg/compiler/lib/src/resolution/enum_creator.dart b/pkg/compiler/lib/src/resolution/enum_creator.dart
index 953225b..93fb9ec 100644
--- a/pkg/compiler/lib/src/resolution/enum_creator.dart
+++ b/pkg/compiler/lib/src/resolution/enum_creator.dart
@@ -5,13 +5,11 @@
library dart2js.resolution.enum_creator;
import '../common.dart';
-import '../core_types.dart' show
- CoreTypes;
+import '../core_types.dart' show CoreTypes;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../elements/modelx.dart';
-import '../tokens/keyword.dart' show
- Keyword;
+import '../tokens/keyword.dart' show Keyword;
import '../tokens/precedence.dart';
import '../tokens/precedence_constants.dart' as Precedence;
import '../tokens/token.dart';
@@ -24,9 +22,8 @@
AstBuilder(this.charOffset);
- Modifiers modifiers({bool isConst: false,
- bool isFinal: false,
- bool isStatic: false}) {
+ Modifiers modifiers(
+ {bool isConst: false, bool isFinal: false, bool isStatic: false}) {
List identifiers = [];
int flags = 0;
if (isConst) {
@@ -42,8 +39,7 @@
flags |= Modifiers.FLAG_STATIC;
}
return new Modifiers.withFlags(
- new NodeList(null, linkedList(identifiers), null, ''),
- flags);
+ new NodeList(null, linkedList(identifiers), null, ''), flags);
}
Token keywordToken(String text) {
@@ -78,23 +74,17 @@
NodeList argumentList(List<Node> nodes) {
return new NodeList(symbolToken(Precedence.OPEN_PAREN_INFO),
- linkedList(nodes),
- symbolToken(Precedence.CLOSE_PAREN_INFO),
- ',');
+ linkedList(nodes), symbolToken(Precedence.CLOSE_PAREN_INFO), ',');
}
Return returnStatement(Expression expression) {
- return new Return(
- keywordToken('return'),
- symbolToken(Precedence.SEMICOLON_INFO),
- expression);
+ return new Return(keywordToken('return'),
+ symbolToken(Precedence.SEMICOLON_INFO), expression);
}
- FunctionExpression functionExpression(Modifiers modifiers,
- String name,
- NodeList argumentList,
- Statement body,
- [TypeAnnotation returnType]) {
+ FunctionExpression functionExpression(
+ Modifiers modifiers, String name, NodeList argumentList, Statement body,
+ [TypeAnnotation returnType]) {
return new FunctionExpression(
identifier(name),
argumentList,
@@ -103,7 +93,7 @@
modifiers,
null, // Initializer.
null, // get/set.
- null // Async modifier.
+ null // Async modifier.
);
}
@@ -116,27 +106,29 @@
}
LiteralString literalString(String text,
- {String prefix: '"',
- String suffix: '"'}) {
- return new LiteralString(stringToken('$prefix$text$suffix'),
- new DartString.literal(text));
+ {String prefix: '"', String suffix: '"'}) {
+ return new LiteralString(
+ stringToken('$prefix$text$suffix'), new DartString.literal(text));
}
LiteralList listLiteral(List<Node> elements, {bool isConst: false}) {
return new LiteralList(
null,
- new NodeList(symbolToken(Precedence.OPEN_SQUARE_BRACKET_INFO),
- linkedList(elements),
- symbolToken(Precedence.CLOSE_SQUARE_BRACKET_INFO),
- ','),
+ new NodeList(
+ symbolToken(Precedence.OPEN_SQUARE_BRACKET_INFO),
+ linkedList(elements),
+ symbolToken(Precedence.CLOSE_SQUARE_BRACKET_INFO),
+ ','),
isConst ? keywordToken('const') : null);
}
Node createDefinition(Identifier name, Expression initializer) {
if (initializer == null) return name;
- return new SendSet(null, name,
+ return new SendSet(
+ null,
+ name,
new Operator(symbolToken(Precedence.EQ_INFO)),
- new NodeList.singleton(initializer));
+ new NodeList.singleton(initializer));
}
VariableDefinitions initializingFormal(String fieldName) {
@@ -148,9 +140,8 @@
new Send(identifier('this'), identifier(fieldName))));
}
- NewExpression newExpression(String typeName,
- NodeList arguments,
- {bool isConst: false}) {
+ NewExpression newExpression(String typeName, NodeList arguments,
+ {bool isConst: false}) {
return new NewExpression(keywordToken(isConst ? 'const' : 'new'),
new Send(null, identifier(typeName), arguments));
}
@@ -160,9 +151,8 @@
}
Send indexGet(Expression receiver, Expression index) {
- return new Send(receiver,
- new Operator(symbolToken(Precedence.INDEX_INFO)),
- new NodeList.singleton(index));
+ return new Send(receiver, new Operator(symbolToken(Precedence.INDEX_INFO)),
+ new NodeList.singleton(index));
}
LiteralMapEntry mapLiteralEntry(Expression key, Expression value) {
@@ -172,10 +162,11 @@
LiteralMap mapLiteral(List<LiteralMapEntry> entries, {bool isConst: false}) {
return new LiteralMap(
null, // Type arguments.
- new NodeList(symbolToken(Precedence.OPEN_CURLY_BRACKET_INFO),
- linkedList(entries),
- symbolToken(Precedence.CLOSE_CURLY_BRACKET_INFO),
- ','),
+ new NodeList(
+ symbolToken(Precedence.OPEN_CURLY_BRACKET_INFO),
+ linkedList(entries),
+ symbolToken(Precedence.CLOSE_CURLY_BRACKET_INFO),
+ ','),
isConst ? keywordToken('const') : null);
}
}
@@ -219,34 +210,27 @@
builder.emptyStatement());
EnumConstructorElementX constructor = new EnumConstructorElementX(
- enumClass,
- builder.modifiers(isConst: true),
- constructorNode);
+ enumClass, builder.modifiers(isConst: true), constructorNode);
- EnumFormalElementX indexFormal = new EnumFormalElementX(
- constructor,
- indexDefinition,
- builder.identifier('index'),
- indexVariable);
+ EnumFormalElementX indexFormal = new EnumFormalElementX(constructor,
+ indexDefinition, builder.identifier('index'), indexVariable);
FunctionSignatureX constructorSignature = new FunctionSignatureX(
requiredParameters: [indexFormal],
requiredParameterCount: 1,
- type: new FunctionType(constructor, const VoidType(),
- <DartType>[intType]));
+ type: new FunctionType(
+ constructor, const VoidType(), <DartType>[intType]));
constructor.functionSignature = constructorSignature;
enumClass.addMember(constructor, reporter);
- List<FieldElement> enumValues = <FieldElement>[];
+ List<EnumConstantElement> enumValues = <EnumConstantElement>[];
VariableList variableList =
new VariableList(builder.modifiers(isStatic: true, isConst: true));
variableList.type = enumType;
int index = 0;
List<Node> valueReferences = <Node>[];
List<LiteralMapEntry> mapEntries = <LiteralMapEntry>[];
- for (Link<Node> link = node.names.nodes;
- !link.isEmpty;
- link = link.tail) {
+ for (Link<Node> link = node.names.nodes; !link.isEmpty; link = link.tail) {
Identifier name = link.head;
AstBuilder valueBuilder = new AstBuilder(name.token.charOffset);
@@ -255,17 +239,16 @@
// Add map entry for `toString` implementation.
mapEntries.add(valueBuilder.mapLiteralEntry(
- valueBuilder.literalInt(index),
- valueBuilder.literalString('${enumClass.name}.${name.source}')));
+ valueBuilder.literalInt(index),
+ valueBuilder.literalString('${enumClass.name}.${name.source}')));
- Expression initializer = valueBuilder.newExpression(
- enumClass.name,
+ Expression initializer = valueBuilder.newExpression(enumClass.name,
valueBuilder.argumentList([valueBuilder.literalInt(index)]),
isConst: true);
SendSet definition = valueBuilder.createDefinition(name, initializer);
- EnumFieldElementX field = new EnumFieldElementX(
- name, enumClass, variableList, definition, initializer);
+ EnumConstantElementX field = new EnumConstantElementX(
+ name, enumClass, variableList, definition, initializer, index);
enumValues.add(field);
enumClass.addMember(field, reporter);
index++;
@@ -277,14 +260,13 @@
Identifier valuesIdentifier = builder.identifier('values');
// TODO(johnniwinther): Add type argument.
- Expression initializer = builder.listLiteral(
- valueReferences, isConst: true);
+ Expression initializer =
+ builder.listLiteral(valueReferences, isConst: true);
Node definition = builder.createDefinition(valuesIdentifier, initializer);
- EnumFieldElementX valuesVariable = new EnumFieldElementX(
- valuesIdentifier, enumClass, valuesVariableList,
- definition, initializer);
+ EnumFieldElementX valuesVariable = new EnumFieldElementX(valuesIdentifier,
+ enumClass, valuesVariableList, definition, initializer);
enumClass.addMember(valuesVariable, reporter);
@@ -294,20 +276,17 @@
Modifiers.EMPTY,
'toString',
builder.argumentList([]),
- builder.returnStatement(
- builder.indexGet(
- builder.mapLiteral(mapEntries, isConst: true),
- builder.reference(builder.identifier('index')))
- )
- );
+ builder.returnStatement(builder.indexGet(
+ builder.mapLiteral(mapEntries, isConst: true),
+ builder.reference(builder.identifier('index')))));
- EnumMethodElementX toString = new EnumMethodElementX('toString',
- enumClass, Modifiers.EMPTY, toStringNode);
- FunctionSignatureX toStringSignature = new FunctionSignatureX(
- type: new FunctionType(toString, stringType));
+ EnumMethodElementX toString = new EnumMethodElementX(
+ 'toString', enumClass, Modifiers.EMPTY, toStringNode);
+ FunctionSignatureX toStringSignature =
+ new FunctionSignatureX(type: new FunctionType(toString, stringType));
toString.functionSignature = toStringSignature;
enumClass.addMember(toString, reporter);
enumClass.enumValues = enumValues;
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/resolution/label_scope.dart b/pkg/compiler/lib/src/resolution/label_scope.dart
index 21aed76..5742481 100644
--- a/pkg/compiler/lib/src/resolution/label_scope.dart
+++ b/pkg/compiler/lib/src/resolution/label_scope.dart
@@ -4,11 +4,8 @@
library dart2js.resolution.label_scope;
-import '../elements/elements.dart' show
- JumpTarget,
- LabelDefinition;
-import '../util/util.dart' show
- Link;
+import '../elements/elements.dart' show JumpTarget, LabelDefinition;
+import '../util/util.dart' show Link;
abstract class LabelScope {
LabelScope get outer;
@@ -65,10 +62,10 @@
}
JumpTarget currentBreakTarget() =>
- breakTargetStack.isEmpty ? null : breakTargetStack.head;
+ breakTargetStack.isEmpty ? null : breakTargetStack.head;
JumpTarget currentContinueTarget() =>
- continueTargetStack.isEmpty ? null : continueTargetStack.head;
+ continueTargetStack.isEmpty ? null : continueTargetStack.head;
void enterLabelScope(Map<String, LabelDefinition> elements) {
labels = new LabeledStatementLabelScope(labels, elements);
@@ -92,8 +89,8 @@
continueTargetStack = continueTargetStack.tail;
}
- void enterSwitch(JumpTarget breakElement,
- Map<String, LabelDefinition> continueElements) {
+ void enterSwitch(
+ JumpTarget breakElement, Map<String, LabelDefinition> continueElements) {
breakTargetStack = breakTargetStack.prepend(breakElement);
labels = new SwitchLabelScope(labels, continueElements);
nestingLevel++;
diff --git a/pkg/compiler/lib/src/resolution/member_impl.dart b/pkg/compiler/lib/src/resolution/member_impl.dart
index 9a2d7b0..7597d36 100644
--- a/pkg/compiler/lib/src/resolution/member_impl.dart
+++ b/pkg/compiler/lib/src/resolution/member_impl.dart
@@ -11,9 +11,8 @@
final DartType type;
final FunctionType functionType;
- DeclaredMember(this.name, this.element,
- this.declarer,
- this.type, this.functionType);
+ DeclaredMember(
+ this.name, this.element, this.declarer, this.type, this.functionType);
bool get isStatic => !element.isInstanceMember;
@@ -55,8 +54,7 @@
bool operator ==(other) {
if (other is! Member) return false;
- return element == other.element &&
- isSetter == other.isSetter;
+ return element == other.element && isSetter == other.isSetter;
}
String toString() {
@@ -91,10 +89,8 @@
class DeclaredAbstractMember extends DeclaredMember {
final DeclaredMember implementation;
- DeclaredAbstractMember(Name name, Element element,
- InterfaceType declarer,
- DartType type, FunctionType functionType,
- this.implementation)
+ DeclaredAbstractMember(Name name, Element element, InterfaceType declarer,
+ DartType type, FunctionType functionType, this.implementation)
: super(name, element, declarer, type, functionType);
bool get isAbstract => true;
@@ -109,8 +105,8 @@
final DeclaredMember declaration;
final InterfaceType instance;
- InheritedMember(DeclaredMember this.declaration,
- InterfaceType this.instance) {
+ InheritedMember(
+ DeclaredMember this.declaration, InterfaceType this.instance) {
assert(instance.isGeneric);
assert(!declaration.isStatic);
}
@@ -153,8 +149,8 @@
}
InheritedMember _newInheritedMember(InterfaceType newInstance) {
- return new InheritedMember(declaration,
- instance.substByContext(newInstance));
+ return new InheritedMember(
+ declaration, instance.substByContext(newInstance));
}
Iterable<Member> get declarations => <Member>[this];
@@ -163,8 +159,7 @@
bool operator ==(other) {
if (other is! InheritedMember) return false;
- return declaration == other.declaration &&
- instance == other.instance;
+ return declaration == other.declaration && instance == other.instance;
}
void printOn(StringBuffer sb, DartType type) {
@@ -182,9 +177,8 @@
class InheritedAbstractMember extends InheritedMember {
final DeclaredMember implementation;
- InheritedAbstractMember(DeclaredMember declaration,
- InterfaceType instance,
- this.implementation)
+ InheritedAbstractMember(
+ DeclaredMember declaration, InterfaceType instance, this.implementation)
: super(declaration, instance);
bool get isAbstract => true;
@@ -194,11 +188,11 @@
declaration,
instance.substByContext(newInstance),
implementation != null
- ? implementation.inheritFrom(newInstance) : null);
+ ? implementation.inheritFrom(newInstance)
+ : null);
}
}
-
abstract class AbstractSyntheticMember implements MemberSignature {
final Setlet<Member> inheritedMembers;
@@ -211,14 +205,11 @@
Name get name => member.name;
}
-
class SyntheticMember extends AbstractSyntheticMember {
final DartType type;
final FunctionType functionType;
- SyntheticMember(Setlet<Member> inheritedMembers,
- this.type,
- this.functionType)
+ SyntheticMember(Setlet<Member> inheritedMembers, this.type, this.functionType)
: super(inheritedMembers);
bool get isSetter => member.isSetter;
@@ -230,7 +221,7 @@
bool get isMalformed => false;
String toString() => '${type.getStringAsDeclared('$name')} synthesized '
- 'from ${inheritedMembers}';
+ 'from ${inheritedMembers}';
}
class ErroneousMember extends AbstractSyntheticMember {
@@ -251,6 +242,5 @@
bool get isMalformed => true;
String toString() => "erroneous member '$name' synthesized "
- "from ${inheritedMembers}";
+ "from ${inheritedMembers}";
}
-
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index b72dba8..bcd4495 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -5,71 +5,51 @@
library dart2js.resolution.members;
import '../common.dart';
-import '../common/names.dart' show
- Selectors;
-import '../common/resolution.dart' show
- Feature;
-import '../compiler.dart' show
- Compiler;
-import '../constants/constructors.dart' show
- RedirectingFactoryConstantConstructor;
+import '../common/names.dart' show Selectors;
+import '../common/resolution.dart' show Feature;
+import '../compiler.dart' show Compiler;
+import '../constants/constructors.dart'
+ show RedirectingFactoryConstantConstructor;
import '../constants/expressions.dart';
import '../constants/values.dart';
import '../core_types.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- ConstructorElementX,
- ErroneousElementX,
- FunctionElementX,
- JumpTargetX,
- LocalFunctionElementX,
- LocalParameterElementX,
- LocalVariableElementX,
- MethodElementX,
- ParameterElementX,
- VariableElementX,
- VariableList;
-import '../tokens/token.dart' show
- isUserDefinableOperator;
+import '../elements/modelx.dart'
+ show
+ ConstructorElementX,
+ ErroneousElementX,
+ FunctionElementX,
+ JumpTargetX,
+ LocalFunctionElementX,
+ LocalParameterElementX,
+ LocalVariableElementX,
+ MethodElementX,
+ ParameterElementX,
+ VariableElementX,
+ VariableList;
+import '../tokens/token.dart' show isUserDefinableOperator;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
+import '../util/util.dart' show Link;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
import 'access_semantics.dart';
import 'class_members.dart' show MembersCreator;
import 'operators.dart';
import 'send_structure.dart';
-import 'constructors.dart' show
- ConstructorResolver,
- ConstructorResult,
- ConstructorResultKind;
-import 'label_scope.dart' show
- StatementScope;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'resolution.dart' show
- ResolverTask;
-import 'resolution_common.dart' show
- MappingVisitor;
+import 'constructors.dart'
+ show ConstructorResolver, ConstructorResult, ConstructorResultKind;
+import 'label_scope.dart' show StatementScope;
+import 'registry.dart' show ResolutionRegistry;
+import 'resolution.dart' show ResolverTask;
+import 'resolution_common.dart' show MappingVisitor;
import 'resolution_result.dart';
-import 'scope.dart' show
- BlockScope,
- MethodScope,
- Scope;
-import 'signatures.dart' show
- SignatureResolver;
-import 'variables.dart' show
- VariableDefinitionsVisitor;
+import 'scope.dart' show BlockScope, MethodScope, Scope;
+import 'signatures.dart' show SignatureResolver;
+import 'variables.dart' show VariableDefinitionsVisitor;
/// The state of constants in resolutions.
enum ConstantState {
@@ -120,8 +100,9 @@
bool sendIsMemberAccess = false;
StatementScope statementScope;
- int allowedCategory = ElementCategory.VARIABLE | ElementCategory.FUNCTION
- | ElementCategory.IMPLIES_TYPE;
+ int allowedCategory = ElementCategory.VARIABLE |
+ ElementCategory.FUNCTION |
+ ElementCategory.IMPLIES_TYPE;
/// When visiting the type declaration of the variable in a [ForIn] loop,
/// the initializer of the variable is implicit and we should not emit an
@@ -135,59 +116,60 @@
bool isPotentiallyMutableTarget(Element target) {
if (target == null) return false;
return (target.isVariable || target.isParameter) &&
- !(target.isFinal || target.isConst);
+ !(target.isFinal || target.isConst);
}
// TODO(ahe): Find a way to share this with runtime implementation.
static final RegExp symbolValidationPattern =
new RegExp(r'^(?:[a-zA-Z$][a-zA-Z$0-9_]*\.)*(?:[a-zA-Z$][a-zA-Z$0-9_]*=?|'
- r'-|'
- r'unary-|'
- r'\[\]=|'
- r'~|'
- r'==|'
- r'\[\]|'
- r'\*|'
- r'/|'
- r'%|'
- r'~/|'
- r'\+|'
- r'<<|'
- r'>>|'
- r'>=|'
- r'>|'
- r'<=|'
- r'<|'
- r'&|'
- r'\^|'
- r'\|'
- r')$');
+ r'-|'
+ r'unary-|'
+ r'\[\]=|'
+ r'~|'
+ r'==|'
+ r'\[\]|'
+ r'\*|'
+ r'/|'
+ r'%|'
+ r'~/|'
+ r'\+|'
+ r'<<|'
+ r'>>|'
+ r'>=|'
+ r'>|'
+ r'<=|'
+ r'<|'
+ r'&|'
+ r'\^|'
+ r'\|'
+ r')$');
- ResolverVisitor(Compiler compiler,
- Element element,
- ResolutionRegistry registry,
- {bool useEnclosingScope: false})
- : this.enclosingElement = element,
- // When the element is a field, we are actually resolving its
- // initial value, which should not have access to instance
- // fields.
- inInstanceContext = (element.isInstanceMember && !element.isField)
- || element.isGenerativeConstructor,
- this.currentClass = element.isClassMember ? element.enclosingClass
- : null,
- this.statementScope = new StatementScope(),
- scope = useEnclosingScope
- ? Scope.buildEnclosingScope(element) : element.buildScope(),
- // The type annotations on a typedef do not imply type checks.
- // TODO(karlklose): clean this up (dartbug.com/8870).
- inCheckContext = compiler.options.enableTypeAssertions &&
- !element.isLibrary &&
- !element.isTypedef &&
- !element.enclosingElement.isTypedef,
- inCatchBlock = false,
- constantState = element.isConst
- ? ConstantState.CONSTANT : ConstantState.NON_CONSTANT,
- super(compiler, registry);
+ ResolverVisitor(
+ Compiler compiler, Element element, ResolutionRegistry registry,
+ {bool useEnclosingScope: false})
+ : this.enclosingElement = element,
+ // When the element is a field, we are actually resolving its
+ // initial value, which should not have access to instance
+ // fields.
+ inInstanceContext = (element.isInstanceMember && !element.isField) ||
+ element.isGenerativeConstructor,
+ this.currentClass =
+ element.isClassMember ? element.enclosingClass : null,
+ this.statementScope = new StatementScope(),
+ scope = useEnclosingScope
+ ? Scope.buildEnclosingScope(element)
+ : element.buildScope(),
+ // The type annotations on a typedef do not imply type checks.
+ // TODO(karlklose): clean this up (dartbug.com/8870).
+ inCheckContext = compiler.options.enableTypeAssertions &&
+ !element.isLibrary &&
+ !element.isTypedef &&
+ !element.enclosingElement.isTypedef,
+ inCatchBlock = false,
+ constantState = element.isConst
+ ? ConstantState.CONSTANT
+ : ConstantState.NON_CONSTANT,
+ super(compiler, registry);
CoreClasses get coreClasses => compiler.coreClasses;
@@ -207,17 +189,13 @@
reporter.reportErrorMessage(
node, MessageKind.NO_INSTANCE_AVAILABLE, {'name': name});
return new ErroneousElementX(MessageKind.NO_INSTANCE_AVAILABLE,
- {'name': name},
- name, enclosingElement);
+ {'name': name}, name, enclosingElement);
} else if (result.isAmbiguous) {
AmbiguousElement ambiguous = result;
return reportAndCreateErroneousElement(
- node,
- name,
- ambiguous.messageKind,
- ambiguous.messageArguments,
- infos: ambiguous.computeInfos(enclosingElement, reporter),
- isError: true);
+ node, name, ambiguous.messageKind, ambiguous.messageArguments,
+ infos: ambiguous.computeInfos(enclosingElement, reporter),
+ isError: true);
}
}
return result;
@@ -227,9 +205,8 @@
JumpTarget getOrDefineTarget(Node statement) {
JumpTarget element = registry.getTargetDefinition(statement);
if (element == null) {
- element = new JumpTargetX(statement,
- statementScope.nestingLevel,
- enclosingElement);
+ element = new JumpTargetX(
+ statement, statementScope.nestingLevel, enclosingElement);
registry.defineTarget(statement, element);
}
return element;
@@ -242,8 +219,7 @@
return result;
}
- inStaticContext(action(),
- {bool inConstantInitializer: false}) {
+ inStaticContext(action(), {bool inConstantInitializer: false}) {
bool wasInstanceContext = inInstanceContext;
ConstantState oldConstantState = constantState;
constantState = inConstantInitializer
@@ -257,9 +233,8 @@
}
ResolutionResult visitInStaticContext(Node node,
- {bool inConstantInitializer: false}) {
- return inStaticContext(
- () => visit(node),
+ {bool inConstantInitializer: false}) {
+ return inStaticContext(() => visit(node),
inConstantInitializer: inConstantInitializer);
}
@@ -286,12 +261,9 @@
}
ErroneousElement reportAndCreateErroneousElement(
- Node node,
- String name,
- MessageKind kind,
- Map arguments,
+ Node node, String name, MessageKind kind, Map arguments,
{List<DiagnosticMessage> infos: const <DiagnosticMessage>[],
- bool isError: false}) {
+ bool isError: false}) {
if (isError) {
reporter.reportError(
reporter.createMessage(node, kind, arguments), infos);
@@ -311,7 +283,7 @@
ErroneousElement reportCannotResolve(Node node, String name) {
assert(invariant(node, !inInstanceContext,
message: "ResolverVisitor.reportCannotResolve must not be called in "
- "instance context."));
+ "instance context."));
// We report an error within initializers because `this` is implicitly
// accessed when unqualified identifiers are not resolved. For
@@ -320,8 +292,7 @@
// ...
// If `i` does not occur inside a top level or static function, `i`
// is equivalent to `this.id(a1 , ...)`.
- bool inInitializer =
- enclosingElement.isGenerativeConstructor ||
+ bool inInitializer = enclosingElement.isGenerativeConstructor ||
(enclosingElement.isInstanceMember && enclosingElement.isField);
MessageKind kind;
Map arguments = {'name': name};
@@ -339,8 +310,8 @@
kind = MessageKind.CANNOT_RESOLVE;
}
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
- return reportAndCreateErroneousElement(
- node, name, kind, arguments, isError: inInitializer);
+ return reportAndCreateErroneousElement(node, name, kind, arguments,
+ isError: inInitializer);
}
ResolutionResult visitIdentifier(Identifier node) {
@@ -352,12 +323,10 @@
return const NoneResult();
} else if (node.isSuper()) {
if (!inInstanceContext) {
- reporter.reportErrorMessage(
- node, MessageKind.NO_SUPER_IN_STATIC);
+ reporter.reportErrorMessage(node, MessageKind.NO_SUPER_IN_STATIC);
}
if ((ElementCategory.SUPER & allowedCategory) == 0) {
- reporter.reportErrorMessage(
- node, MessageKind.INVALID_USE_OF_SUPER);
+ reporter.reportErrorMessage(node, MessageKind.INVALID_USE_OF_SUPER);
}
return const NoneResult();
} else {
@@ -379,10 +348,10 @@
// Use the malformed element.
} else {
if ((element.kind.category & allowedCategory) == 0) {
- element = reportAndCreateErroneousElement(
- node, name, MessageKind.GENERIC,
- // TODO(ahe): Improve error message. Need UX input.
- {'text': "is not an expression $element"});
+ element =
+ reportAndCreateErroneousElement(node, name, MessageKind.GENERIC,
+ // TODO(ahe): Improve error message. Need UX input.
+ {'text': "is not an expression $element"});
}
}
if (!Elements.isUnresolved(element) && element.isClass) {
@@ -430,8 +399,7 @@
Link<Node> initializers = node.initializers.nodes;
if (!initializers.isEmpty &&
Initializers.isConstructorRedirect(initializers.head)) {
- Name name =
- getRedirectingThisOrSuperConstructorName(initializers.head);
+ Name name = getRedirectingThisOrSuperConstructorName(initializers.head);
final ClassElement classElement = constructor.enclosingClass;
return classElement.lookupConstructor(name.text);
}
@@ -440,16 +408,15 @@
void setupFunction(FunctionExpression node, FunctionElement function) {
Element enclosingElement = function.enclosingElement;
- if (node.modifiers.isStatic &&
- enclosingElement.kind != ElementKind.CLASS) {
+ if (node.modifiers.isStatic && enclosingElement.kind != ElementKind.CLASS) {
reporter.reportErrorMessage(node, MessageKind.ILLEGAL_STATIC);
}
scope = new MethodScope(scope, function);
// Put the parameters in scope.
FunctionSignature functionParameters = function.functionSignature;
- Link<Node> parameterNodes = (node.parameters == null)
- ? const Link<Node>() : node.parameters.nodes;
+ Link<Node> parameterNodes =
+ (node.parameters == null) ? const Link<Node>() : node.parameters.nodes;
functionParameters.forEachParameter((ParameterElementX element) {
// TODO(karlklose): should be a list of [FormalElement]s, but the actual
// implementation uses [Element].
@@ -482,8 +449,8 @@
parameterNodes = parameterNodes.tail;
});
addDeferredAction(enclosingElement, () {
- functionParameters.forEachOptionalParameter(
- (ParameterElementX parameter) {
+ functionParameters
+ .forEachOptionalParameter((ParameterElementX parameter) {
parameter.constant =
compiler.resolver.constantCompiler.compileConstant(parameter);
});
@@ -581,7 +548,6 @@
return const NoneResult();
}
-
/// Process a local function declaration or an anonymous function expression.
///
/// [inFunctionDeclaration] is `true` when the current node is the immediate
@@ -589,15 +555,12 @@
///
/// This is used to distinguish local function declarations from anonymous
/// function expressions.
- ResolutionResult visitFunctionExpression(
- FunctionExpression node,
+ ResolutionResult visitFunctionExpression(FunctionExpression node,
{bool inFunctionDeclaration: false}) {
bool doAddToScope = inFunctionDeclaration;
if (!inFunctionDeclaration && node.name != null) {
- reporter.reportErrorMessage(
- node.name,
- MessageKind.NAMED_FUNCTION_EXPRESSION,
- {'name': node.name});
+ reporter.reportErrorMessage(node.name,
+ MessageKind.NAMED_FUNCTION_EXPRESSION, {'name': node.name});
}
visit(node.returnType);
String name;
@@ -607,15 +570,10 @@
name = node.name.asIdentifier().source;
}
LocalFunctionElementX function = new LocalFunctionElementX(
- name, node, ElementKind.FUNCTION, Modifiers.EMPTY,
- enclosingElement);
+ name, node, ElementKind.FUNCTION, Modifiers.EMPTY, enclosingElement);
ResolverTask.processAsyncMarker(compiler, function, registry);
function.functionSignature = SignatureResolver.analyze(
- compiler,
- node.parameters,
- node.returnType,
- function,
- registry,
+ compiler, node.parameters, node.returnType, function, registry,
createRealParameters: true,
isFunctionExpression: !inFunctionDeclaration);
checkLocalDefinitionName(node, function);
@@ -643,15 +601,14 @@
ResolutionResult visitIf(If node) {
doInPromotionScope(node.condition.expression, () => visit(node.condition));
- doInPromotionScope(node.thenPart,
- () => visitIn(node.thenPart, new BlockScope(scope)));
+ doInPromotionScope(
+ node.thenPart, () => visitIn(node.thenPart, new BlockScope(scope)));
visitIn(node.elsePart, new BlockScope(scope));
return const NoneResult();
}
- static Selector computeSendSelector(Send node,
- LibraryElement library,
- Element element) {
+ static Selector computeSendSelector(
+ Send node, LibraryElement library, Element element) {
// First determine if this is part of an assignment.
bool isSet = node.asSendSet() != null;
@@ -663,9 +620,12 @@
String source = node.selector.asOperator().source;
String string = source;
if (identical(string, '!') ||
- identical(string, '&&') || identical(string, '||') ||
- identical(string, 'is') || identical(string, 'as') ||
- identical(string, '?') || identical(string, '??')) {
+ identical(string, '&&') ||
+ identical(string, '||') ||
+ identical(string, 'is') ||
+ identical(string, 'as') ||
+ identical(string, '?') ||
+ identical(string, '??')) {
return null;
}
String op = source;
@@ -674,8 +634,7 @@
}
if (op == null) {
// Unsupported operator. An error has been reported during parsing.
- return new Selector.call(
- new Name(source, library),
+ return new Selector.call(new Name(source, library),
new CallStructure.unnamed(node.argumentsNode.slowLength()));
}
return node.arguments.isEmpty
@@ -686,8 +645,7 @@
Identifier identifier = node.selector.asIdentifier();
if (node.isPropertyAccess) {
assert(!isSet);
- return new Selector.getter(
- new Name(identifier.source, library));
+ return new Selector.getter(new Name(identifier.source, library));
} else if (isSet) {
return new Selector.setter(
new Name(identifier.source, library, isSetter: true));
@@ -716,7 +674,7 @@
return (identifier == null)
? new Selector.callClosure(arity, named)
: new Selector.call(new Name(identifier.source, library),
- new CallStructure(arity, named));
+ new CallStructure(arity, named));
}
Selector resolveSelector(Send node, Element element) {
@@ -749,9 +707,7 @@
namedArguments.add(source);
if (seenNamedArguments.containsKey(source)) {
reportDuplicateDefinition(
- source,
- argument,
- seenNamedArguments[source]);
+ source, argument, seenNamedArguments[source]);
isValidAsConstant = false;
} else {
seenNamedArguments[source] = namedArgument;
@@ -765,8 +721,7 @@
}
sendIsMemberAccess = oldSendIsMemberAccess;
return new ArgumentsResult(
- new CallStructure(argumentCount, namedArguments),
- argumentResults,
+ new CallStructure(argumentCount, namedArguments), argumentResults,
isValidAsConstant: isValidAsConstant);
}
@@ -775,8 +730,7 @@
AccessSemantics checkSuperAccess(Send node) {
if (!inInstanceContext) {
ErroneousElement error = reportAndCreateErroneousElement(
- node, 'super',
- MessageKind.NO_SUPER_IN_STATIC, {},
+ node, 'super', MessageKind.NO_SUPER_IN_STATIC, {},
isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
return new StaticAccess.invalid(error);
@@ -784,8 +738,7 @@
if (node.isConditional) {
// `super?.foo` is not allowed.
ErroneousElement error = reportAndCreateErroneousElement(
- node, 'super',
- MessageKind.INVALID_USE_OF_SUPER, {},
+ node, 'super', MessageKind.INVALID_USE_OF_SUPER, {},
isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
return new StaticAccess.invalid(error);
@@ -793,10 +746,8 @@
if (currentClass.supertype == null) {
// This is just to guard against internal errors, so no need
// for a real error message.
- ErroneousElement error = reportAndCreateErroneousElement(
- node, 'super',
- MessageKind.GENERIC,
- {'text': "Object has no superclass"},
+ ErroneousElement error = reportAndCreateErroneousElement(node, 'super',
+ MessageKind.GENERIC, {'text': "Object has no superclass"},
isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
return new StaticAccess.invalid(error);
@@ -810,8 +761,7 @@
AccessSemantics checkThisAccess(Send node) {
if (!inInstanceContext) {
ErroneousElement error = reportAndCreateErroneousElement(
- node, 'this',
- MessageKind.NO_THIS_AVAILABLE, const {},
+ node, 'this', MessageKind.NO_THIS_AVAILABLE, const {},
isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
return new StaticAccess.invalid(error);
@@ -843,9 +793,7 @@
/// Compute the [AccessSemantics] corresponding to a compound super access
/// reading from [getter] and writing to [setter].
AccessSemantics computeCompoundSuperAccessSemantics(
- Spannable node,
- Element getter,
- Element setter,
+ Spannable node, Element getter, Element setter,
{bool isIndex: false}) {
if (getter.isMalformed) {
if (setter.isMalformed) {
@@ -854,7 +802,7 @@
assert(invariant(node, setter.name == '[]=',
message: "Unexpected super setter '$setter'."));
return new CompoundAccessSemantics(
- CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter);
+ CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter);
} else {
assert(invariant(node, setter.isSetter,
message: "Unexpected super setter '$setter'."));
@@ -911,7 +859,7 @@
assert(invariant(node, getter.name == '[]',
message: "Unexpected super getter '$getter'."));
return new CompoundAccessSemantics(
- CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter);
+ CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter);
} else {
assert(invariant(node, setter.isSetter,
message: "Unexpected super setter '$setter'."));
@@ -922,8 +870,8 @@
}
/// Compute the [AccessSemantics] corresponding to a local access of [target].
- AccessSemantics computeLocalAccessSemantics(Spannable node,
- LocalElement target) {
+ AccessSemantics computeLocalAccessSemantics(
+ Spannable node, LocalElement target) {
if (target.isParameter) {
if (target.isFinal || target.isConst) {
return new StaticAccess.finalParameter(target);
@@ -946,9 +894,7 @@
/// Compute the [AccessSemantics] corresponding to a static or toplevel access
/// of [target].
AccessSemantics computeStaticOrTopLevelAccessSemantics(
- Spannable node,
- Element target) {
-
+ Spannable node, Element target) {
target = target.declaration;
if (target.isMalformed) {
// This handles elements with parser errors.
@@ -970,25 +916,25 @@
message: "Unexpected static target '$target'."));
return new StaticAccess.staticMethod(target);
}
- } else {
- assert(invariant(node, target.isTopLevel,
- message: "Unexpected statically resolved target '$target'."));
- if (target.isGetter) {
- return new StaticAccess.topLevelGetter(target);
- } else if (target.isSetter) {
- return new StaticAccess.topLevelSetter(target);
- } else if (target.isField) {
- if (target.isFinal) {
- return new StaticAccess.finalTopLevelField(target);
- } else {
- return new StaticAccess.topLevelField(target);
- }
- } else {
- assert(invariant(node, target.isFunction,
- message: "Unexpected top level target '$target'."));
- return new StaticAccess.topLevelMethod(target);
- }
- }
+ } else {
+ assert(invariant(node, target.isTopLevel,
+ message: "Unexpected statically resolved target '$target'."));
+ if (target.isGetter) {
+ return new StaticAccess.topLevelGetter(target);
+ } else if (target.isSetter) {
+ return new StaticAccess.topLevelSetter(target);
+ } else if (target.isField) {
+ if (target.isFinal) {
+ return new StaticAccess.finalTopLevelField(target);
+ } else {
+ return new StaticAccess.topLevelField(target);
+ }
+ } else {
+ assert(invariant(node, target.isFunction,
+ message: "Unexpected top level target '$target'."));
+ return new StaticAccess.topLevelMethod(target);
+ }
+ }
}
/// Compute the [AccessSemantics] for accessing the name of [selector] on the
@@ -1008,10 +954,8 @@
/// }
///
AccessSemantics computeSuperAccessSemanticsForSelector(
- Spannable node,
- Selector selector,
+ Spannable node, Selector selector,
{Name alternateName}) {
-
Name name = selector.memberName;
// TODO(johnniwinther): Ensure correct behavior if currentClass is a
// patch.
@@ -1024,12 +968,16 @@
Element error;
if (selector.isSetter) {
error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.UNDEFINED_SUPER_SETTER,
- {'className': currentClass.name, 'memberName': name});
+ node,
+ name.text,
+ MessageKind.UNDEFINED_SUPER_SETTER,
+ {'className': currentClass.name, 'memberName': name});
} else {
error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.NO_SUCH_SUPER_MEMBER,
- {'className': currentClass.name, 'memberName': name});
+ node,
+ name.text,
+ MessageKind.NO_SUCH_SUPER_MEMBER,
+ {'className': currentClass.name, 'memberName': name});
}
if (target == null) {
// If a setter wasn't resolved, use the [ErroneousElement].
@@ -1060,9 +1008,7 @@
/// }
///
AccessSemantics computeSuperAccessSemanticsForSelectors(
- Spannable node,
- Selector getterSelector,
- Selector setterSelector,
+ Spannable node, Selector getterSelector, Selector setterSelector,
{bool isIndex: false}) {
bool getterError = false;
bool setterError = false;
@@ -1073,7 +1019,9 @@
// [target] may be null which means invoking noSuchMethod on super.
if (getter == null) {
getter = reportAndCreateErroneousElement(
- node, getterSelector.name, MessageKind.NO_SUCH_SUPER_MEMBER,
+ node,
+ getterSelector.name,
+ MessageKind.NO_SUCH_SUPER_MEMBER,
{'className': currentClass.name, 'memberName': getterSelector.name});
getterError = true;
}
@@ -1081,43 +1029,43 @@
// [target] may be null which means invoking noSuchMethod on super.
if (setter == null) {
setter = reportAndCreateErroneousElement(
- node, setterSelector.name, MessageKind.NO_SUCH_SUPER_MEMBER,
+ node,
+ setterSelector.name,
+ MessageKind.NO_SUCH_SUPER_MEMBER,
{'className': currentClass.name, 'memberName': setterSelector.name});
setterError = true;
} else if (getter == setter) {
if (setter.isFunction) {
setter = reportAndCreateErroneousElement(
- node, setterSelector.name,
- MessageKind.ASSIGNING_METHOD_IN_SUPER,
- {'superclassName': setter.enclosingClass.name,
- 'name': setterSelector.name});
+ node, setterSelector.name, MessageKind.ASSIGNING_METHOD_IN_SUPER, {
+ 'superclassName': setter.enclosingClass.name,
+ 'name': setterSelector.name
+ });
setterError = true;
} else if (setter.isField && setter.isFinal) {
- setter = reportAndCreateErroneousElement(
- node, setterSelector.name,
- MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
- {'superclassName': setter.enclosingClass.name,
- 'name': setterSelector.name});
+ setter = reportAndCreateErroneousElement(node, setterSelector.name,
+ MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, {
+ 'superclassName': setter.enclosingClass.name,
+ 'name': setterSelector.name
+ });
setterError = true;
}
}
if (getterError) {
// We still need to register the invocation, because we might
// call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
- registry.registerDynamicUse(
- new DynamicUse(getterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(getterSelector, null));
}
if (setterError) {
// We still need to register the invocation, because we might
// call [:super.noSuchMethod:] which calls [JSInvocationMirror._invokeOn].
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
}
if (getterError || setterError) {
registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
}
- return computeCompoundSuperAccessSemantics(
- node, getter, setter, isIndex: isIndex);
+ return computeCompoundSuperAccessSemantics(node, getter, setter,
+ isIndex: isIndex);
}
/// Resolve [node] as a subexpression that is _not_ the prefix of a member
@@ -1214,10 +1162,8 @@
// TODO(johnniwinther): Add information to [AccessSemantics] about
// whether it is erroneous.
if (semantics.kind == AccessKind.SUPER_METHOD) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.element.declaration,
- selector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.element.declaration, selector.callStructure));
}
// TODO(23998): Remove this when all information goes through
// the [SendStructure].
@@ -1235,17 +1181,15 @@
expressionConstant.getKnownType(coreTypes);
switch (operator.kind) {
case UnaryOperatorKind.COMPLEMENT:
- isValidConstant =
- knownExpressionType == coreTypes.intType;
+ isValidConstant = knownExpressionType == coreTypes.intType;
break;
case UnaryOperatorKind.NEGATE:
- isValidConstant =
- knownExpressionType == coreTypes.intType ||
+ isValidConstant = knownExpressionType == coreTypes.intType ||
knownExpressionType == coreTypes.doubleType;
break;
case UnaryOperatorKind.NOT:
- reporter.internalError(node,
- "Unexpected user definable unary operator: $operator");
+ reporter.internalError(
+ node, "Unexpected user definable unary operator: $operator");
}
if (isValidConstant) {
// TODO(johnniwinther): Handle potentially invalid constant
@@ -1258,8 +1202,8 @@
}
}
if (semantics != null) {
- registry.registerSendStructure(node,
- new UnaryStructure(semantics, operator));
+ registry.registerSendStructure(
+ node, new UnaryStructure(semantics, operator));
}
return result;
}
@@ -1303,9 +1247,7 @@
rightConstant.getKnownType(coreTypes) == coreTypes.boolType) {
// TODO(johnniwinther): Handle potentially invalid constant expressions.
ConstantExpression constant = new BinaryConstantExpression(
- leftConstant,
- BinaryOperator.LOGICAL_AND,
- rightConstant);
+ leftConstant, BinaryOperator.LOGICAL_AND, rightConstant);
registry.setConstant(node, constant);
return new ConstantResult(node, constant);
}
@@ -1329,9 +1271,7 @@
rightConstant.getKnownType(coreTypes) == coreTypes.boolType) {
// TODO(johnniwinther): Handle potentially invalid constant expressions.
ConstantExpression constant = new BinaryConstantExpression(
- leftConstant,
- BinaryOperator.LOGICAL_OR,
- rightConstant);
+ leftConstant, BinaryOperator.LOGICAL_OR, rightConstant);
registry.setConstant(node, constant);
return new ConstantResult(node, constant);
}
@@ -1366,8 +1306,8 @@
/// Handle the binary expression of a user definable binary [operator], like
/// `a + b`, `super + b`, `a == b` and `a != b`.
- ResolutionResult handleUserDefinableBinary(Send node,
- BinaryOperator operator) {
+ ResolutionResult handleUserDefinableBinary(
+ Send node, BinaryOperator operator) {
ResolutionResult result = const NoneResult();
Node left = node.receiver;
Node right = node.arguments.head;
@@ -1389,10 +1329,8 @@
// TODO(johnniwinther): Add information to [AccessSemantics] about
// whether it is erroneous.
if (semantics.kind == AccessKind.SUPER_METHOD) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.element.declaration,
- selector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.element.declaration, selector.callStructure));
}
// TODO(23998): Remove this when all information goes through
// the [SendStructure].
@@ -1414,26 +1352,24 @@
switch (operator.kind) {
case BinaryOperatorKind.EQ:
case BinaryOperatorKind.NOT_EQ:
- isValidConstant =
- (knownLeftType == coreTypes.intType ||
- knownLeftType == coreTypes.doubleType ||
- knownLeftType == coreTypes.stringType ||
- knownLeftType == coreTypes.boolType ||
- knownLeftType == coreTypes.nullType) &&
+ isValidConstant = (knownLeftType == coreTypes.intType ||
+ knownLeftType == coreTypes.doubleType ||
+ knownLeftType == coreTypes.stringType ||
+ knownLeftType == coreTypes.boolType ||
+ knownLeftType == coreTypes.nullType) &&
(knownRightType == coreTypes.intType ||
- knownRightType == coreTypes.doubleType ||
- knownRightType == coreTypes.stringType ||
- knownRightType == coreTypes.boolType ||
- knownRightType == coreTypes.nullType);
+ knownRightType == coreTypes.doubleType ||
+ knownRightType == coreTypes.stringType ||
+ knownRightType == coreTypes.boolType ||
+ knownRightType == coreTypes.nullType);
break;
case BinaryOperatorKind.ADD:
- isValidConstant =
- (knownLeftType == coreTypes.intType ||
- knownLeftType == coreTypes.doubleType ||
- knownLeftType == coreTypes.stringType) &&
+ isValidConstant = (knownLeftType == coreTypes.intType ||
+ knownLeftType == coreTypes.doubleType ||
+ knownLeftType == coreTypes.stringType) &&
(knownRightType == coreTypes.intType ||
- knownRightType == coreTypes.doubleType ||
- knownRightType == coreTypes.stringType);
+ knownRightType == coreTypes.doubleType ||
+ knownRightType == coreTypes.stringType);
break;
case BinaryOperatorKind.SUB:
case BinaryOperatorKind.MUL:
@@ -1444,19 +1380,17 @@
case BinaryOperatorKind.GT:
case BinaryOperatorKind.LTEQ:
case BinaryOperatorKind.LT:
- isValidConstant =
- (knownLeftType == coreTypes.intType ||
- knownLeftType == coreTypes.doubleType) &&
+ isValidConstant = (knownLeftType == coreTypes.intType ||
+ knownLeftType == coreTypes.doubleType) &&
(knownRightType == coreTypes.intType ||
- knownRightType == coreTypes.doubleType);
+ knownRightType == coreTypes.doubleType);
break;
case BinaryOperatorKind.SHL:
case BinaryOperatorKind.SHR:
case BinaryOperatorKind.AND:
case BinaryOperatorKind.OR:
case BinaryOperatorKind.XOR:
- isValidConstant =
- knownLeftType == coreTypes.intType &&
+ isValidConstant = knownLeftType == coreTypes.intType &&
knownRightType == coreTypes.intType;
break;
case BinaryOperatorKind.INDEX:
@@ -1473,9 +1407,7 @@
// TODO(johnniwinther): Handle potentially invalid constant
// expressions.
ConstantExpression constant = new BinaryConstantExpression(
- leftResult.constant,
- operator,
- rightResult.constant);
+ leftResult.constant, operator, rightResult.constant);
registry.setConstant(node, constant);
result = new ConstantResult(node, constant);
}
@@ -1527,8 +1459,8 @@
/// Handle an invocation of an expression, like `(){}()` or `(foo)()`.
ResolutionResult handleExpressionInvoke(Send node) {
- assert(invariant(node, node.isCall,
- message: "Unexpected expression: $node"));
+ assert(
+ invariant(node, node.isCall, message: "Unexpected expression: $node"));
Node expression = node.selector;
visitExpression(expression);
CallStructure callStructure =
@@ -1538,8 +1470,8 @@
// [SendStructure].
registry.setSelector(node, selector);
registry.registerDynamicUse(new DynamicUse(selector, null));
- registry.registerSendStructure(node,
- new InvokeStructure(const DynamicAccess.expression(), selector));
+ registry.registerSendStructure(
+ node, new InvokeStructure(const DynamicAccess.expression(), selector));
return const NoneResult();
}
@@ -1570,19 +1502,17 @@
AccessSemantics accessSemantics = checkThisAccess(node);
if (accessSemantics == null) {
accessSemantics = const DynamicAccess.thisAccess();
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
}
- registry.registerSendStructure(node,
- new InvokeStructure(accessSemantics, selector));
+ registry.registerSendStructure(
+ node, new InvokeStructure(accessSemantics, selector));
// TODO(23998): Remove this when all information goes through
// the [SendStructure].
registry.setSelector(node, selector);
return const NoneResult();
} else {
// TODO(johnniwinther): Handle get of `this` when it is a [Send] node.
- reporter.internalError(
- node, "Unexpected node '$node'.");
+ reporter.internalError(node, "Unexpected node '$node'.");
}
return const NoneResult();
}
@@ -1600,8 +1530,8 @@
}
AccessSemantics semantics = checkSuperAccess(node);
if (semantics == null) {
- semantics = computeSuperAccessSemanticsForSelector(
- node, selector, alternateName: name.setter);
+ semantics = computeSuperAccessSemanticsForSelector(node, selector,
+ alternateName: name.setter);
}
if (node.isCall) {
bool isIncompatibleInvoke = false;
@@ -1609,11 +1539,9 @@
case AccessKind.SUPER_METHOD:
MethodElementX superMethod = semantics.element;
superMethod.computeType(resolution);
- if (!callStructure.signatureApplies(
- superMethod.functionSignature)) {
+ if (!callStructure.signatureApplies(superMethod.functionSignature)) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
isIncompatibleInvoke = true;
} else {
@@ -1624,11 +1552,9 @@
case AccessKind.SUPER_FIELD:
case AccessKind.SUPER_FINAL_FIELD:
case AccessKind.SUPER_GETTER:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.element));
+ registry.registerStaticUse(new StaticUse.superGet(semantics.element));
selector = callStructure.callSelector;
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
break;
case AccessKind.SUPER_SETTER:
case AccessKind.UNRESOLVED_SUPER:
@@ -1642,7 +1568,8 @@
node, "Unexpected super property access $semantics.");
break;
}
- registry.registerSendStructure(node,
+ registry.registerSendStructure(
+ node,
isIncompatibleInvoke
? new IncompatibleInvokeStructure(semantics, selector)
: new InvokeStructure(semantics, selector));
@@ -1651,14 +1578,13 @@
case AccessKind.SUPER_METHOD:
// TODO(johnniwinther): Method this should be registered as a
// closurization.
- registry.registerStaticUse(
- new StaticUse.superTearOff(semantics.element));
+ registry
+ .registerStaticUse(new StaticUse.superTearOff(semantics.element));
break;
case AccessKind.SUPER_FIELD:
case AccessKind.SUPER_FINAL_FIELD:
case AccessKind.SUPER_GETTER:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.element));
+ registry.registerStaticUse(new StaticUse.superGet(semantics.element));
break;
case AccessKind.SUPER_SETTER:
case AccessKind.UNRESOLVED_SUPER:
@@ -1689,7 +1615,7 @@
String operatorText = node.selector.asOperator().source;
if (operatorText == 'is') {
return handleIs(node);
- } else if (operatorText == 'as') {
+ } else if (operatorText == 'as') {
return handleAs(node);
} else if (node.arguments.isEmpty) {
UnaryOperator operator = UnaryOperator.parse(operatorText);
@@ -1760,7 +1686,9 @@
// [resolveSend] to select better warning messages for getters and
// setters.
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.UNDEFINED_GETTER,
+ node,
+ name.text,
+ MessageKind.UNDEFINED_GETTER,
{'className': receiverClass.name, 'memberName': name.text});
// TODO(johnniwinther): Add an [AccessSemantics] for unresolved static
// member access.
@@ -1784,7 +1712,9 @@
// TODO(johnniwinther): Produce a different error for complex update.
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.UNDEFINED_GETTER,
+ node,
+ name.text,
+ MessageKind.UNDEFINED_GETTER,
{'className': receiverClass.name, 'memberName': name.text});
// TODO(johnniwinther): Add an [AccessSemantics] for unresolved static
// member access.
@@ -1795,7 +1725,6 @@
/// `a` is a class and `b` is a non-static member.
ResolutionResult handleStaticInstanceMemberAccess(
Send node, Name name, ClassElement receiverClass, Element member) {
-
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
// TODO(johnniwinther): With the simplified [TreeElements] invariant,
// try to resolve injected elements if [currentClass] is in the patch
@@ -1805,7 +1734,9 @@
// [resolveSend] to select better warning messages for getters and
// setters.
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.MEMBER_NOT_STATIC,
+ node,
+ name.text,
+ MessageKind.MEMBER_NOT_STATIC,
{'className': receiverClass.name, 'memberName': name});
// TODO(johnniwinther): Add an [AccessSemantics] for statically accessed
@@ -1818,7 +1749,6 @@
/// where `a` is a class and `b` is a non-static member.
ResolutionResult handleStaticInstanceMemberUpdate(
SendSet node, Name name, ClassElement receiverClass, Element member) {
-
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
// TODO(johnniwinther): With the simplified [TreeElements] invariant,
// try to resolve injected elements if [currentClass] is in the patch
@@ -1826,7 +1756,9 @@
// TODO(johnniwinther): Produce a different error for complex update.
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.MEMBER_NOT_STATIC,
+ node,
+ name.text,
+ MessageKind.MEMBER_NOT_STATIC,
{'className': receiverClass.name, 'memberName': name});
// TODO(johnniwinther): Add an [AccessSemantics] for statically accessed
@@ -1841,9 +1773,10 @@
Send node, Name name, ClassElement receiverClass, Element member) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.PRIVATE_ACCESS,
- {'libraryName': member.library.libraryOrScriptName,
- 'name': name});
+ node,
+ name.text,
+ MessageKind.PRIVATE_ACCESS,
+ {'libraryName': member.library.libraryOrScriptName, 'name': name});
// TODO(johnniwinther): Add an [AccessSemantics] for unresolved static
// member access.
return handleErroneousAccess(
@@ -1857,9 +1790,10 @@
SendSet node, Name name, ClassElement receiverClass, Element member) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.PRIVATE_ACCESS,
- {'libraryName': member.library.libraryOrScriptName,
- 'name': name});
+ node,
+ name.text,
+ MessageKind.PRIVATE_ACCESS,
+ {'libraryName': member.library.libraryOrScriptName, 'name': name});
// TODO(johnniwinther): Add an [AccessSemantics] for unresolved static
// member access.
return handleUpdate(node, name, new StaticAccess.unresolved(error));
@@ -1931,14 +1865,13 @@
// TODO(johnniwinther): Remove [element] when it is no longer needed for
// evaluating constants.
ResolutionResult handleTypeVariableTypeLiteralAccess(
- Send node,
- Name name,
- TypeVariableElement element) {
+ Send node, Name name, TypeVariableElement element) {
AccessSemantics semantics;
if (!Elements.hasAccessToTypeVariables(enclosingElement)) {
// TODO(johnniwinther): Add another access semantics for this.
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text,
+ node,
+ name.text,
MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
{'typeVariableName': name},
isError: true);
@@ -1961,8 +1894,8 @@
// the [SendStructure].
registry.setSelector(node, selector);
- registry.registerSendStructure(node,
- new InvokeStructure(semantics, selector));
+ registry.registerSendStructure(
+ node, new InvokeStructure(semantics, selector));
} else {
// TODO(johnniwinther): Avoid the need for a [Selector] here.
registry.registerSendStructure(node, new GetStructure(semantics));
@@ -1973,14 +1906,13 @@
/// Handle access to a type literal of type variable [element]. Like `T = b`,
/// `T++` or `T += b` where 'T' is type variable.
ResolutionResult handleTypeVariableTypeLiteralUpdate(
- SendSet node,
- Name name,
- TypeVariableElement element) {
+ SendSet node, Name name, TypeVariableElement element) {
AccessSemantics semantics;
if (!Elements.hasAccessToTypeVariables(enclosingElement)) {
// TODO(johnniwinther): Add another access semantics for this.
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text,
+ node,
+ name.text,
MessageKind.TYPE_VARIABLE_WITHIN_STATIC_MEMBER,
{'typeVariableName': name},
isError: true);
@@ -1989,16 +1921,14 @@
} else {
ErroneousElement error;
if (node.isIfNullAssignment) {
- error = reportAndCreateErroneousElement(
- node.selector, name.text,
+ error = reportAndCreateErroneousElement(node.selector, name.text,
MessageKind.IF_NULL_ASSIGNING_TYPE, const {});
// TODO(23998): Remove these when all information goes through
// the [SendStructure].
registry.useElement(node.selector, element);
} else {
error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.ASSIGNING_TYPE, const {});
+ node.selector, name.text, MessageKind.ASSIGNING_TYPE, const {});
}
// TODO(23998): Remove this when all information goes through
@@ -2017,12 +1947,8 @@
// the [GetStructure].
// TODO(johnniwinther): Remove [element] when it is no longer needed for
// evaluating constants.
- ResolutionResult handleConstantTypeLiteralAccess(
- Send node,
- Name name,
- TypeDeclarationElement element,
- DartType type,
- ConstantAccess semantics) {
+ ResolutionResult handleConstantTypeLiteralAccess(Send node, Name name,
+ TypeDeclarationElement element, DartType type, ConstantAccess semantics) {
registry.useElement(node, element);
registry.registerTypeLiteral(node, type);
@@ -2039,8 +1965,8 @@
registry.useElement(node.selector, element);
analyzeConstantDeferred(node.selector, enforceConst: false);
- registry.registerSendStructure(node,
- new InvokeStructure(semantics, selector));
+ registry.registerSendStructure(
+ node, new InvokeStructure(semantics, selector));
return const NoneResult();
} else {
analyzeConstantDeferred(node, enforceConst: false);
@@ -2056,20 +1982,14 @@
// the [GetStructure].
// TODO(johnniwinther): Remove [element] when it is no longer needed for
// evaluating constants.
- ResolutionResult handleConstantTypeLiteralUpdate(
- SendSet node,
- Name name,
- TypeDeclarationElement element,
- DartType type,
- ConstantAccess semantics) {
-
+ ResolutionResult handleConstantTypeLiteralUpdate(SendSet node, Name name,
+ TypeDeclarationElement element, DartType type, ConstantAccess semantics) {
// TODO(johnniwinther): Remove this when all constants are evaluated.
compiler.resolver.constantCompiler.evaluate(semantics.constant);
ErroneousElement error;
if (node.isIfNullAssignment) {
- error = reportAndCreateErroneousElement(
- node.selector, name.text,
+ error = reportAndCreateErroneousElement(node.selector, name.text,
MessageKind.IF_NULL_ASSIGNING_TYPE, const {});
// TODO(23998): Remove these when all information goes through
// the [SendStructure].
@@ -2077,8 +1997,7 @@
registry.useElement(node.selector, element);
} else {
error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.ASSIGNING_TYPE, const {});
+ node.selector, name.text, MessageKind.ASSIGNING_TYPE, const {});
}
// TODO(23998): Remove this when all information goes through
@@ -2093,9 +2012,7 @@
/// Handle access to a type literal of a typedef. Like `F` or
/// `F()` where 'F' is typedef.
ResolutionResult handleTypedefTypeLiteralAccess(
- Send node,
- Name name,
- TypedefElement typdef) {
+ Send node, Name name, TypedefElement typdef) {
typdef.ensureResolved(resolution);
DartType type = typdef.rawType;
ConstantExpression constant = new TypeConstantExpression(type);
@@ -2106,9 +2023,7 @@
/// Handle access to a type literal of a typedef. Like `F = b`, `F++` or
/// `F += b` where 'F' is typedef.
ResolutionResult handleTypedefTypeLiteralUpdate(
- SendSet node,
- Name name,
- TypedefElement typdef) {
+ SendSet node, Name name, TypedefElement typdef) {
typdef.ensureResolved(resolution);
DartType type = typdef.rawType;
ConstantExpression constant = new TypeConstantExpression(type);
@@ -2125,8 +2040,7 @@
// directly on the constant expressions.
node.isCall ? coreTypes.typeType : type);
AccessSemantics semantics = new ConstantAccess.dynamicTypeLiteral(constant);
- return handleConstantTypeLiteralAccess(
- node, const PublicName('dynamic'),
+ return handleConstantTypeLiteralAccess(node, const PublicName('dynamic'),
coreClasses.typeClass, type, semantics);
}
@@ -2137,17 +2051,14 @@
ConstantExpression constant =
new TypeConstantExpression(const DynamicType());
AccessSemantics semantics = new ConstantAccess.dynamicTypeLiteral(constant);
- return handleConstantTypeLiteralUpdate(
- node, const PublicName('dynamic'),
+ return handleConstantTypeLiteralUpdate(node, const PublicName('dynamic'),
coreClasses.typeClass, type, semantics);
}
/// Handle access to a type literal of a class. Like `C` or
/// `C()` where 'C' is class.
ResolutionResult handleClassTypeLiteralAccess(
- Send node,
- Name name,
- ClassElement cls) {
+ Send node, Name name, ClassElement cls) {
cls.ensureResolved(resolution);
DartType type = cls.rawType;
ConstantExpression constant = new TypeConstantExpression(type);
@@ -2158,9 +2069,7 @@
/// Handle access to a type literal of a class. Like `C = b`, `C++` or
/// `C += b` where 'C' is class.
ResolutionResult handleClassTypeLiteralUpdate(
- SendSet node,
- Name name,
- ClassElement cls) {
+ SendSet node, Name name, ClassElement cls) {
cls.ensureResolved(resolution);
DartType type = cls.rawType;
ConstantExpression constant = new TypeConstantExpression(type);
@@ -2171,10 +2080,7 @@
/// Handle a [Send] that resolves to a [prefix]. Like `prefix` in
/// `prefix.Class` or `prefix` in `prefix()`, the latter being a compile time
/// error.
- ResolutionResult handleClassSend(
- Send node,
- Name name,
- ClassElement cls) {
+ ResolutionResult handleClassSend(Send node, Name name, ClassElement cls) {
cls.ensureResolved(resolution);
if (sendIsMemberAccess) {
registry.useElement(node, cls);
@@ -2187,16 +2093,14 @@
/// Compute a [DeferredPrefixStructure] for [node].
ResolutionResult handleDeferredAccess(
- Send node,
- PrefixElement prefix,
- ResolutionResult result) {
+ Send node, PrefixElement prefix, ResolutionResult result) {
assert(invariant(node, prefix.isDeferred,
message: "Prefix $prefix is not deferred."));
SendStructure sendStructure = registry.getSendStructure(node);
- assert(invariant(node, sendStructure != null,
+ assert(invariant(node, sendStructure != null,
message: "No SendStructure for $node."));
- registry.registerSendStructure(node,
- new DeferredPrefixStructure(prefix, sendStructure));
+ registry.registerSendStructure(
+ node, new DeferredPrefixStructure(prefix, sendStructure));
if (result.isConstant) {
ConstantExpression constant =
new DeferredConstantExpression(result.constant, prefix);
@@ -2216,7 +2120,9 @@
if (member == null) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
Element error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.NO_SUCH_LIBRARY_MEMBER,
+ node,
+ name.text,
+ MessageKind.NO_SUCH_LIBRARY_MEMBER,
{'libraryName': prefix.name, 'memberName': name});
result = handleUnresolvedAccess(node, name, error);
} else {
@@ -2228,7 +2134,7 @@
// called on the parent `prefix.Class.foo` node.
result = new PrefixResult(prefix, result.element);
} else if (prefix.isDeferred &&
- (member == null || !member.isDeferredLoaderGetter)) {
+ (member == null || !member.isDeferredLoaderGetter)) {
result = handleDeferredAccess(node, prefix, result);
}
return result;
@@ -2244,7 +2150,9 @@
if (member == null) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
Element error = reportAndCreateErroneousElement(
- node, name.text, MessageKind.NO_SUCH_LIBRARY_MEMBER,
+ node,
+ name.text,
+ MessageKind.NO_SUCH_LIBRARY_MEMBER,
{'libraryName': prefix.name, 'memberName': name});
return handleUpdate(node, name, new StaticAccess.unresolved(error));
} else {
@@ -2256,7 +2164,7 @@
// called on the parent `prefix.Class.foo` node.
result = new PrefixResult(prefix, result.element);
} else if (prefix.isDeferred &&
- (member == null || !member.isDeferredLoaderGetter)) {
+ (member == null || !member.isDeferredLoaderGetter)) {
result = handleDeferredAccess(node, prefix, result);
}
return result;
@@ -2266,19 +2174,13 @@
/// `prefix.Class` or `prefix` in `prefix()`, the latter being a compile time
/// error.
ResolutionResult handleLibraryPrefix(
- Send node,
- Name name,
- PrefixElement prefix) {
+ Send node, Name name, PrefixElement prefix) {
if ((ElementCategory.PREFIX & allowedCategory) == 0) {
ErroneousElement error = reportAndCreateErroneousElement(
- node,
- name.text,
- MessageKind.PREFIX_AS_EXPRESSION,
- {'prefix': name},
+ node, name.text, MessageKind.PREFIX_AS_EXPRESSION, {'prefix': name},
isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
- return handleErroneousAccess(
- node, name, new StaticAccess.invalid(error));
+ return handleErroneousAccess(node, name, new StaticAccess.invalid(error));
}
if (prefix.isDeferred) {
// TODO(23998): Remove this when deferred access is detected
@@ -2340,14 +2242,12 @@
CallStructure callStructure =
resolveArguments(node.argumentsNode).callStructure;
selector = new Selector.call(name, callStructure);
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
sendStructure = new InvokeStructure(semantics, selector);
} else {
assert(invariant(node, node.isPropertyAccess));
selector = new Selector.getter(name);
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
sendStructure = new GetStructure(semantics);
}
registry.registerSendStructure(node, sendStructure);
@@ -2362,11 +2262,9 @@
SendSet node, Name name, Element element, AccessSemantics semantics) {
Selector getterSelector = new Selector.getter(name);
Selector setterSelector = new Selector.setter(name.setter);
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
if (node.isComplex) {
- registry.registerDynamicUse(
- new DynamicUse(getterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(getterSelector, null));
}
// TODO(23998): Remove these when elements are only accessed through the
@@ -2391,9 +2289,7 @@
/// Handle `this` as a qualified property, like `a.this`.
ResolutionResult handleQualifiedThisAccess(Send node, Name name) {
ErroneousElement error = reportAndCreateErroneousElement(
- node.selector,
- name.text,
- MessageKind.THIS_PROPERTY, {},
+ node.selector, name.text, MessageKind.THIS_PROPERTY, {},
isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
AccessSemantics accessSemantics = new StaticAccess.invalid(error);
@@ -2470,7 +2366,7 @@
/// Handle access unresolved access to [name] in a non-instance context.
ResolutionResult handleUnresolvedAccess(
- Send node, Name name, Element element) {
+ Send node, Name name, Element element) {
// TODO(johnniwinther): Support unresolved top level access as an
// [AccessSemantics].
AccessSemantics semantics = new StaticAccess.unresolved(element);
@@ -2504,15 +2400,9 @@
/// Handle access to an ambiguous element, that is, a name imported twice.
ResolutionResult handleAmbiguousSend(
- Send node,
- Name name,
- AmbiguousElement element) {
-
+ Send node, Name name, AmbiguousElement element) {
ErroneousElement error = reportAndCreateErroneousElement(
- node,
- name.text,
- element.messageKind,
- element.messageArguments,
+ node, name.text, element.messageKind, element.messageArguments,
infos: element.computeInfos(enclosingElement, reporter));
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
@@ -2523,15 +2413,9 @@
/// Handle update to an ambiguous element, that is, a name imported twice.
ResolutionResult handleAmbiguousUpdate(
- SendSet node,
- Name name,
- AmbiguousElement element) {
-
+ SendSet node, Name name, AmbiguousElement element) {
ErroneousElement error = reportAndCreateErroneousElement(
- node,
- name.text,
- element.messageKind,
- element.messageArguments,
+ node, name.text, element.messageKind, element.messageArguments,
infos: element.computeInfos(enclosingElement, reporter));
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
@@ -2543,8 +2427,7 @@
/// Report access of an instance [member] from a non-instance context.
AccessSemantics reportStaticInstanceAccess(Send node, Name name) {
ErroneousElement error = reportAndCreateErroneousElement(
- node, name.text,
- MessageKind.NO_INSTANCE_AVAILABLE, {'name': name},
+ node, name.text, MessageKind.NO_INSTANCE_AVAILABLE, {'name': name},
isError: true);
// TODO(johnniwinther): Support static instance access as an
// [AccessSemantics].
@@ -2568,8 +2451,7 @@
function.computeType(resolution);
if (!callStructure.signatureApplies(function.functionSignature)) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
isIncompatibleInvoke = true;
}
break;
@@ -2578,15 +2460,14 @@
case AccessKind.LOCAL_VARIABLE:
case AccessKind.FINAL_LOCAL_VARIABLE:
selector = callStructure.callSelector;
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
break;
default:
- reporter.internalError(node,
- "Unexpected local access $semantics.");
+ reporter.internalError(node, "Unexpected local access $semantics.");
break;
}
- registry.registerSendStructure(node,
+ registry.registerSendStructure(
+ node,
isIncompatibleInvoke
? new IncompatibleInvokeStructure(semantics, selector)
: new InvokeStructure(semantics, selector));
@@ -2602,15 +2483,14 @@
ParameterElement parameter = element;
if (parameter.isNamed) {
result = new ConstantResult(
- node,
- new NamedArgumentReference(parameter.name),
+ node, new NamedArgumentReference(parameter.name),
element: element);
} else {
result = new ConstantResult(
node,
- new PositionalArgumentReference(
- parameter.functionDeclaration.parameters.indexOf(
- parameter)),
+ new PositionalArgumentReference(parameter
+ .functionDeclaration.parameters
+ .indexOf(parameter)),
element: element);
}
} else {
@@ -2620,16 +2500,14 @@
case AccessKind.FINAL_LOCAL_VARIABLE:
if (element.isConst) {
result = new ConstantResult(
- node,
- new VariableConstantExpression(element),
+ node, new VariableConstantExpression(element),
element: element);
} else {
result = new ElementResult(element);
}
break;
default:
- reporter.internalError(node,
- "Unexpected local access $semantics.");
+ reporter.internalError(node, "Unexpected local access $semantics.");
break;
}
selector = new Selector.getter(name);
@@ -2652,20 +2530,16 @@
ErroneousElement error;
if (element.isParameter) {
if (element.isFinal) {
- error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
- {'name': name});
+ error = reportAndCreateErroneousElement(node.selector, name.text,
+ MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER, {'name': name});
semantics = new StaticAccess.finalParameter(element);
} else {
semantics = new StaticAccess.parameter(element);
}
} else if (element.isVariable) {
if (element.isFinal || element.isConst) {
- error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
- {'name': name});
+ error = reportAndCreateErroneousElement(node.selector, name.text,
+ MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER, {'name': name});
semantics = new StaticAccess.finalLocalVariable(element);
} else {
semantics = new StaticAccess.localVariable(element);
@@ -2674,8 +2548,7 @@
assert(invariant(node, element.isFunction,
message: "Unexpected local $element."));
error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.ASSIGNING_METHOD, const {});
+ node.selector, name.text, MessageKind.ASSIGNING_METHOD, const {});
semantics = new StaticAccess.localFunction(element);
}
if (isPotentiallyMutableTarget(element)) {
@@ -2700,7 +2573,7 @@
/// Handle access of a static or top level [element].
ResolutionResult handleStaticOrTopLevelAccess(
- Send node, Name name, Element element) {
+ Send node, Name name, Element element) {
ResolutionResult result = const NoneResult();
MemberElement member;
if (element.isAbstractField) {
@@ -2717,21 +2590,20 @@
// of parse errors to make [element] erroneous. Fix this!
member.computeType(resolution);
-
if (member == compiler.mirrorSystemGetNameFunction &&
!compiler.mirrorUsageAnalyzerTask.hasMirrorUsage(enclosingElement)) {
- reporter.reportHintMessage(
- node.selector, MessageKind.STATIC_FUNCTION_BLOAT,
- {'class': compiler.mirrorSystemClass.name,
- 'name': compiler.mirrorSystemGetNameFunction.name});
+ reporter
+ .reportHintMessage(node.selector, MessageKind.STATIC_FUNCTION_BLOAT, {
+ 'class': compiler.mirrorSystemClass.name,
+ 'name': compiler.mirrorSystemGetNameFunction.name
+ });
}
Selector selector;
AccessSemantics semantics =
computeStaticOrTopLevelAccessSemantics(node, member);
if (node.isCall) {
- ArgumentsResult argumentsResult =
- resolveArguments(node.argumentsNode);
+ ArgumentsResult argumentsResult = resolveArguments(node.argumentsNode);
CallStructure callStructure = argumentsResult.callStructure;
selector = new Selector.call(name, callStructure);
@@ -2743,8 +2615,7 @@
method.computeType(resolution);
if (!callStructure.signatureApplies(method.functionSignature)) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
isIncompatibleInvoke = true;
} else {
registry.registerStaticUse(
@@ -2752,7 +2623,8 @@
handleForeignCall(node, semantics.element, callStructure);
if (method == compiler.identicalFunction &&
argumentsResult.isValidAsConstant) {
- result = new ConstantResult(node,
+ result = new ConstantResult(
+ node,
new IdenticalConstantExpression(
argumentsResult.argumentResults[0].constant,
argumentsResult.argumentResults[1].constant));
@@ -2765,27 +2637,25 @@
case AccessKind.TOPLEVEL_FIELD:
case AccessKind.FINAL_TOPLEVEL_FIELD:
case AccessKind.TOPLEVEL_GETTER:
- registry.registerStaticUse(
- new StaticUse.staticGet(semantics.element));
+ registry
+ .registerStaticUse(new StaticUse.staticGet(semantics.element));
selector = callStructure.callSelector;
- registry.registerDynamicUse(
- new DynamicUse(selector, null));
+ registry.registerDynamicUse(new DynamicUse(selector, null));
break;
case AccessKind.STATIC_SETTER:
case AccessKind.TOPLEVEL_SETTER:
case AccessKind.UNRESOLVED:
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
- member = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
- {'name': name});
+ member = reportAndCreateErroneousElement(node.selector, name.text,
+ MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER, {'name': name});
break;
default:
- reporter.internalError(node,
- "Unexpected statically resolved access $semantics.");
+ reporter.internalError(
+ node, "Unexpected statically resolved access $semantics.");
break;
}
- registry.registerSendStructure(node,
+ registry.registerSendStructure(
+ node,
isIncompatibleInvoke
? new IncompatibleInvokeStructure(semantics, selector)
: new InvokeStructure(semantics, selector));
@@ -2803,28 +2673,26 @@
case AccessKind.TOPLEVEL_FIELD:
case AccessKind.FINAL_TOPLEVEL_FIELD:
case AccessKind.TOPLEVEL_GETTER:
- registry.registerStaticUse(
- new StaticUse.staticGet(semantics.element));
+ registry
+ .registerStaticUse(new StaticUse.staticGet(semantics.element));
break;
case AccessKind.STATIC_SETTER:
case AccessKind.TOPLEVEL_SETTER:
case AccessKind.UNRESOLVED:
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
- member = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
- {'name': name});
+ member = reportAndCreateErroneousElement(node.selector, name.text,
+ MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER, {'name': name});
break;
default:
- reporter.internalError(node,
- "Unexpected statically resolved access $semantics.");
+ reporter.internalError(
+ node, "Unexpected statically resolved access $semantics.");
break;
}
registry.registerSendStructure(node, new GetStructure(semantics));
if (member.isConst) {
FieldElement field = member;
- result = new ConstantResult(
- node, new VariableConstantExpression(field), element: field);
+ result = new ConstantResult(node, new VariableConstantExpression(field),
+ element: field);
} else {
result = new ElementResult(member);
}
@@ -2840,13 +2708,14 @@
/// Handle update of a static or top level [element].
ResolutionResult handleStaticOrTopLevelUpdate(
- SendSet node, Name name, Element element) {
+ SendSet node, Name name, Element element) {
AccessSemantics semantics;
if (element.isAbstractField) {
AbstractFieldElement abstractField = element;
if (abstractField.setter == null) {
ErroneousElement error = reportAndCreateErroneousElement(
- node.selector, name.text,
+ node.selector,
+ name.text,
MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
{'name': name});
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
@@ -2865,12 +2734,13 @@
? new StaticAccess.topLevelGetter(abstractField.getter)
: new StaticAccess.staticGetter(abstractField.getter);
}
- registry.registerStaticUse(
- new StaticUse.staticGet(abstractField.getter));
+ registry
+ .registerStaticUse(new StaticUse.staticGet(abstractField.getter));
} else if (node.isComplex) {
if (abstractField.getter == null) {
ErroneousElement error = reportAndCreateErroneousElement(
- node.selector, name.text,
+ node.selector,
+ name.text,
MessageKind.UNDEFINED_STATIC_GETTER_BUT_SETTER,
{'name': name});
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
@@ -2881,8 +2751,8 @@
: CompoundAccessKind.UNRESOLVED_STATIC_GETTER,
error,
abstractField.setter);
- registry.registerStaticUse(
- new StaticUse.staticSet(abstractField.setter));
+ registry
+ .registerStaticUse(new StaticUse.staticSet(abstractField.setter));
} else {
// `a++` or `a += b` where `a` has both a getter and a setter.
semantics = new CompoundAccessSemantics(
@@ -2891,18 +2761,18 @@
: CompoundAccessKind.STATIC_GETTER_SETTER,
abstractField.getter,
abstractField.setter);
- registry.registerStaticUse(
- new StaticUse.staticGet(abstractField.getter));
- registry.registerStaticUse(
- new StaticUse.staticSet(abstractField.setter));
+ registry
+ .registerStaticUse(new StaticUse.staticGet(abstractField.getter));
+ registry
+ .registerStaticUse(new StaticUse.staticSet(abstractField.setter));
}
} else {
// `a = b` where `a` has a setter.
semantics = element.isTopLevel
? new StaticAccess.topLevelSetter(abstractField.setter)
: new StaticAccess.staticSetter(abstractField.setter);
- registry.registerStaticUse(
- new StaticUse.staticSet(abstractField.setter));
+ registry
+ .registerStaticUse(new StaticUse.staticSet(abstractField.setter));
}
} else {
MemberElement member = element;
@@ -2915,13 +2785,11 @@
} else if (member.isFunction) {
// `a = b`, `a++` or `a += b` where `a` is a function.
ErroneousElement error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.ASSIGNING_METHOD, const {});
+ node.selector, name.text, MessageKind.ASSIGNING_METHOD, const {});
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
if (node.isComplex) {
// `a++` or `a += b` where `a` is a function.
- registry.registerStaticUse(
- new StaticUse.staticTearOff(element));
+ registry.registerStaticUse(new StaticUse.staticTearOff(element));
}
semantics = member.isTopLevel
? new StaticAccess.topLevelMethod(member)
@@ -2936,9 +2804,10 @@
}
if (member.isFinal || member.isConst) {
ErroneousElement error = reportAndCreateErroneousElement(
- node.selector, name.text,
- MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
- {'name': name});
+ node.selector,
+ name.text,
+ MessageKind.UNDEFINED_STATIC_SETTER_BUT_GETTER,
+ {'name': name});
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
semantics = member.isTopLevel
? new StaticAccess.finalTopLevelField(member)
@@ -2963,8 +2832,8 @@
// This handles elements with parser errors.
assert(invariant(node, element is! ErroneousElement,
message: "Unexpected erroneous element $element."));
- return handleErroneousAccess(node, name,
- new StaticAccess.unresolved(element));
+ return handleErroneousAccess(
+ node, name, new StaticAccess.unresolved(element));
}
if (element.isInstanceMember) {
if (inInstanceContext) {
@@ -3003,7 +2872,7 @@
// This handles elements with parser errors..
assert(invariant(node, element is! ErroneousElement,
message: "Unexpected erroneous element $element."));
- return handleUpdate(node, name,new StaticAccess.unresolved(element));
+ return handleUpdate(node, name, new StaticAccess.unresolved(element));
}
if (element.isInstanceMember) {
if (inInstanceContext) {
@@ -3024,14 +2893,10 @@
} else if (element.isPrefix) {
// `p = b` where `p` is a prefix.
ErroneousElement error = reportAndCreateErroneousElement(
- node,
- name.text,
- MessageKind.PREFIX_AS_EXPRESSION,
- {'prefix': name},
- isError: true);
+ node, name.text, MessageKind.PREFIX_AS_EXPRESSION, {'prefix': name},
+ isError: true);
registry.registerFeature(Feature.COMPILE_TIME_ERROR);
- return handleUpdate(
- node, name, new StaticAccess.invalid(error));
+ return handleUpdate(node, name, new StaticAccess.invalid(error));
} else if (element.isLocal) {
return handleLocalUpdate(node, name, element);
} else if (element.isStatic || element.isTopLevel) {
@@ -3124,9 +2989,8 @@
}
// TODO(johnniwinther): Move this to the backend resolution callbacks.
- void handleForeignCall(Send node,
- Element target,
- CallStructure callStructure) {
+ void handleForeignCall(
+ Send node, Element target, CallStructure callStructure) {
if (target != null && compiler.backend.isForeign(target)) {
registry.registerForeignCall(node, target, callStructure, this);
}
@@ -3164,12 +3028,9 @@
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicUse(
- new DynamicUse(getterSelector, null));
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
- registry.registerDynamicUse(
- new DynamicUse(operatorSelector, null));
+ registry.registerDynamicUse(new DynamicUse(getterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(operatorSelector, null));
SendStructure sendStructure = node.isPrefix
? new IndexPrefixStructure(semantics, operator)
@@ -3188,8 +3049,7 @@
// TODO(23998): Remove this when selectors are only accessed
// through the send structure.
registry.setSelector(node, setterSelector);
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
SendStructure sendStructure = new IndexSetStructure(semantics);
registry.registerSendStructure(node, sendStructure);
@@ -3207,12 +3067,9 @@
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicUse(
- new DynamicUse(getterSelector, null));
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
- registry.registerDynamicUse(
- new DynamicUse(operatorSelector, null));
+ registry.registerDynamicUse(new DynamicUse(getterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(operatorSelector, null));
SendStructure sendStructure;
if (operator.kind == AssignmentOperatorKind.IF_NULL) {
@@ -3251,17 +3108,16 @@
if (semantics == null) {
semantics = computeSuperAccessSemanticsForSelectors(
- node, getterSelector, setterSelector, isIndex: true);
+ node, getterSelector, setterSelector,
+ isIndex: true);
if (!semantics.getter.isError) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.getter, getterSelector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.getter, getterSelector.callStructure));
}
if (!semantics.setter.isError) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.setter, setterSelector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.setter, setterSelector.callStructure));
}
// TODO(23998): Remove these when elements are only accessed
@@ -3269,8 +3125,7 @@
registry.useElement(node, semantics.setter);
registry.useElement(node.selector, semantics.getter);
}
- registry.registerDynamicUse(
- new DynamicUse(operatorSelector, null));
+ registry.registerDynamicUse(new DynamicUse(operatorSelector, null));
SendStructure sendStructure = node.isPrefix
? new IndexPrefixStructure(semantics, operator)
@@ -3298,9 +3153,8 @@
// through the send structure.
registry.setSelector(node, setterSelector);
if (!semantics.setter.isError) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.setter, setterSelector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.setter, setterSelector.callStructure));
}
SendStructure sendStructure = new IndexSetStructure(semantics);
@@ -3314,17 +3168,16 @@
new Selector.binaryOperator(operator.selectorName);
if (semantics == null) {
semantics = computeSuperAccessSemanticsForSelectors(
- node, getterSelector, setterSelector, isIndex: true);
+ node, getterSelector, setterSelector,
+ isIndex: true);
if (!semantics.getter.isError) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.getter, getterSelector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.getter, getterSelector.callStructure));
}
if (!semantics.setter.isError) {
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- semantics.setter, setterSelector.callStructure));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ semantics.setter, setterSelector.callStructure));
}
// TODO(23998): Remove these when elements are only accessed
@@ -3339,8 +3192,7 @@
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicUse(
- new DynamicUse(operatorSelector, null));
+ registry.registerDynamicUse(new DynamicUse(operatorSelector, null));
SendStructure sendStructure;
if (operator.kind == AssignmentOperatorKind.IF_NULL) {
@@ -3368,8 +3220,8 @@
void registerStaticUses(AccessSemantics semantics) {
switch (semantics.kind) {
case AccessKind.SUPER_METHOD:
- registry.registerStaticUse(
- new StaticUse.superTearOff(semantics.element));
+ registry
+ .registerStaticUse(new StaticUse.superTearOff(semantics.element));
break;
case AccessKind.SUPER_GETTER:
registry.registerStaticUse(new StaticUse.superGet(semantics.getter));
@@ -3379,29 +3231,27 @@
new StaticUse.superSetterSet(semantics.setter));
break;
case AccessKind.SUPER_FIELD:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.element));
+ registry.registerStaticUse(new StaticUse.superGet(semantics.element));
registry.registerStaticUse(
new StaticUse.superFieldSet(semantics.element));
break;
case AccessKind.SUPER_FINAL_FIELD:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.element));
+ registry.registerStaticUse(new StaticUse.superGet(semantics.element));
break;
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
case CompoundAccessKind.SUPER_GETTER_FIELD:
case CompoundAccessKind.SUPER_FIELD_FIELD:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.getter));
+ registry
+ .registerStaticUse(new StaticUse.superGet(semantics.getter));
registry.registerStaticUse(
new StaticUse.superFieldSet(semantics.setter));
break;
case CompoundAccessKind.SUPER_FIELD_SETTER:
case CompoundAccessKind.SUPER_GETTER_SETTER:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.getter));
+ registry
+ .registerStaticUse(new StaticUse.superGet(semantics.getter));
registry.registerStaticUse(
new StaticUse.superSetterSet(semantics.setter));
break;
@@ -3414,8 +3264,8 @@
new StaticUse.superSetterSet(semantics.setter));
break;
case CompoundAccessKind.UNRESOLVED_SUPER_SETTER:
- registry.registerStaticUse(
- new StaticUse.superGet(semantics.getter));
+ registry
+ .registerStaticUse(new StaticUse.superGet(semantics.getter));
break;
default:
break;
@@ -3440,29 +3290,28 @@
if (operator.kind == AssignmentOperatorKind.ASSIGN) {
// `super.a = b`.
if (semantics == null) {
- semantics =
- computeSuperAccessSemanticsForSelector(
- node, setterSelector, alternateName: name);
+ semantics = computeSuperAccessSemanticsForSelector(
+ node, setterSelector,
+ alternateName: name);
switch (semantics.kind) {
case AccessKind.SUPER_FINAL_FIELD:
reporter.reportWarningMessage(
- node,
- MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER,
- {'name': name,
- 'superclassName': semantics.setter.enclosingClass.name});
+ node, MessageKind.ASSIGNING_FINAL_FIELD_IN_SUPER, {
+ 'name': name,
+ 'superclassName': semantics.setter.enclosingClass.name
+ });
// TODO(johnniwinther): This shouldn't be needed.
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
break;
case AccessKind.SUPER_METHOD:
reporter.reportWarningMessage(
- node, MessageKind.ASSIGNING_METHOD_IN_SUPER,
- {'name': name,
- 'superclassName': semantics.setter.enclosingClass.name});
+ node, MessageKind.ASSIGNING_METHOD_IN_SUPER, {
+ 'name': name,
+ 'superclassName': semantics.setter.enclosingClass.name
+ });
// TODO(johnniwinther): This shouldn't be needed.
- registry.registerDynamicUse(
- new DynamicUse(setterSelector, null));
+ registry.registerDynamicUse(new DynamicUse(setterSelector, null));
registry.registerFeature(Feature.SUPER_NO_SUCH_METHOD);
break;
case AccessKind.SUPER_FIELD:
@@ -3493,9 +3342,7 @@
/// Handle update of an entity defined by [semantics]. For instance `a = b`,
/// `a++` or `a += b` where [semantics] describe `a`.
ResolutionResult handleUpdate(
- SendSet node,
- Name name,
- AccessSemantics semantics) {
+ SendSet node, Name name, AccessSemantics semantics) {
SendStructure sendStructure;
String operatorText = node.assignmentOperator.source;
Selector getterSelector = new Selector.getter(name);
@@ -3517,8 +3364,7 @@
registry.useElement(node, semantics.setter);
registry.useElement(node.selector, semantics.getter);
- registry.registerDynamicUse(
- new DynamicUse(operatorSelector, null));
+ registry.registerDynamicUse(new DynamicUse(operatorSelector, null));
SendStructure sendStructure = node.isPrefix
? new PrefixStructure(semantics, operator)
@@ -3559,8 +3405,7 @@
registry.setSelector(node, setterSelector);
registry.setOperatorSelectorInComplexSendSet(node, operatorSelector);
- registry.registerDynamicUse(
- new DynamicUse(operatorSelector, null));
+ registry.registerDynamicUse(new DynamicUse(operatorSelector, null));
SendStructure sendStructure;
if (operator.kind == AssignmentOperatorKind.IF_NULL) {
@@ -3641,9 +3486,7 @@
registry.registerConstSymbol(name);
if (!validateSymbol(node, name, reportError: false)) {
reporter.reportErrorMessage(
- node,
- MessageKind.UNSUPPORTED_LITERAL_SYMBOL,
- {'value': name});
+ node, MessageKind.UNSUPPORTED_LITERAL_SYMBOL, {'value': name});
}
analyzeConstantDeferred(node);
ConstantExpression constant = new SymbolConstantExpression(name);
@@ -3673,8 +3516,7 @@
ResolutionResult visitRethrow(Rethrow node) {
if (!inCatchBlock && node.throwToken.stringValue == 'rethrow') {
- reporter.reportErrorMessage(
- node, MessageKind.RETHROW_OUTSIDE_CATCH);
+ reporter.reportErrorMessage(node, MessageKind.RETHROW_OUTSIDE_CATCH);
}
return const NoneResult();
}
@@ -3687,12 +3529,9 @@
// `return e;` appears in a generative constructor. (Dart Language
// Specification 13.12.)
reporter.reportErrorMessage(
- expression,
- MessageKind.RETURN_IN_GENERATIVE_CONSTRUCTOR);
+ expression, MessageKind.RETURN_IN_GENERATIVE_CONSTRUCTOR);
} else if (!node.isArrowBody && currentAsyncMarker.isYielding) {
- reporter.reportErrorMessage(
- node,
- MessageKind.RETURN_IN_GENERATOR,
+ reporter.reportErrorMessage(node, MessageKind.RETURN_IN_GENERATOR,
{'modifier': currentAsyncMarker});
}
}
@@ -3724,8 +3563,8 @@
ConstructorElementX constructor = enclosingElement;
bool isConstConstructor = constructor.isConst;
bool isValidAsConstant = isConstConstructor;
- ConstructorResult result = resolveRedirectingFactory(
- node, inConstContext: isConstConstructor);
+ ConstructorResult result =
+ resolveRedirectingFactory(node, inConstContext: isConstConstructor);
ConstructorElement redirectionTarget = result.element;
constructor.immediateRedirectionTarget = redirectionTarget;
@@ -3749,18 +3588,16 @@
case ConstructorResultKind.UNRESOLVED_CONSTRUCTOR:
case ConstructorResultKind.NON_CONSTANT:
isValidAsConstant = false;
- constructor.setEffectiveTarget(
- result.element, result.type, isMalformed: true);
+ constructor.setEffectiveTarget(result.element, result.type,
+ isMalformed: true);
break;
}
if (Elements.isUnresolved(redirectionTarget)) {
registry.registerFeature(Feature.THROW_NO_SUCH_METHOD);
return const NoneResult();
} else {
- if (isConstConstructor &&
- !redirectionTarget.isConst) {
- reporter.reportErrorMessage(
- node, MessageKind.CONSTRUCTOR_IS_NOT_CONST);
+ if (isConstConstructor && !redirectionTarget.isConst) {
+ reporter.reportErrorMessage(node, MessageKind.CONSTRUCTOR_IS_NOT_CONST);
isValidAsConstant = false;
}
if (redirectionTarget == constructor) {
@@ -3776,16 +3613,14 @@
// redirecting constructor.
ClassElement targetClass = redirectionTarget.enclosingClass;
InterfaceType type = registry.getType(node);
- FunctionType targetConstructorType =
- redirectionTarget.computeType(resolution)
- .subst(type.typeArguments, targetClass.typeVariables);
+ FunctionType targetConstructorType = redirectionTarget
+ .computeType(resolution)
+ .subst(type.typeArguments, targetClass.typeVariables);
FunctionType constructorType = constructor.computeType(resolution);
- bool isSubtype = compiler.types.isSubtype(
- targetConstructorType, constructorType);
+ bool isSubtype =
+ compiler.types.isSubtype(targetConstructorType, constructorType);
if (!isSubtype) {
- reporter.reportWarningMessage(
- node,
- MessageKind.NOT_ASSIGNABLE,
+ reporter.reportWarningMessage(node, MessageKind.NOT_ASSIGNABLE,
{'fromType': targetConstructorType, 'toType': constructorType});
// TODO(johnniwinther): Handle this (potentially) erroneous case.
isValidAsConstant = false;
@@ -3805,9 +3640,9 @@
new StaticUse.constructorRedirect(redirectionTarget));
// TODO(johnniwinther): Register the effective target type as part of the
// static use instead.
- registry.registerTypeUse(new TypeUse.instantiation(
- redirectionTarget.enclosingClass.thisType
- .subst(type.typeArguments, targetClass.typeVariables)));
+ registry.registerTypeUse(new TypeUse.instantiation(redirectionTarget
+ .enclosingClass.thisType
+ .subst(type.typeArguments, targetClass.typeVariables)));
if (enclosingElement == compiler.symbolConstructor) {
registry.registerFeature(Feature.SYMBOL_CONSTRUCTOR);
}
@@ -3830,10 +3665,7 @@
constructor.constantConstructor =
new RedirectingFactoryConstantConstructor(
new ConstructedConstantExpression(
- type,
- redirectionTarget,
- callStructure,
- arguments));
+ type, redirectionTarget, callStructure, arguments));
}
return const NoneResult();
}
@@ -3868,16 +3700,15 @@
void reportExtraModifier(String modifier) {
Node modifierNode;
for (Link<Node> nodes = modifiers.nodes.nodes;
- !nodes.isEmpty;
- nodes = nodes.tail) {
+ !nodes.isEmpty;
+ nodes = nodes.tail) {
if (modifier == nodes.head.asIdentifier().source) {
modifierNode = nodes.head;
break;
}
}
assert(modifierNode != null);
- reporter.reportErrorMessage(
- modifierNode, MessageKind.EXTRANEOUS_MODIFIER,
+ reporter.reportErrorMessage(modifierNode, MessageKind.EXTRANEOUS_MODIFIER,
{'modifier': modifier});
}
if (modifiers.isFinal && (modifiers.isConst || modifiers.isVar)) {
@@ -3912,8 +3743,7 @@
bool oldSendIsMemberAccess = sendIsMemberAccess;
sendIsMemberAccess = false;
var oldCategory = allowedCategory;
- allowedCategory =
- ElementCategory.VARIABLE |
+ allowedCategory = ElementCategory.VARIABLE |
ElementCategory.FUNCTION |
ElementCategory.IMPLIES_TYPE;
ResolutionResult result = visit(node.expression);
@@ -3983,7 +3813,8 @@
break;
case ConstructorResultKind.UNRESOLVED_CONSTRUCTOR:
// TODO(johnniwinther): Unify codepaths to only have one return.
- registry.registerNewStructure(node,
+ registry.registerNewStructure(
+ node,
new NewInvokeStructure(
new ConstructorAccessSemantics(
ConstructorAccessKind.UNRESOLVED_CONSTRUCTOR,
@@ -3992,7 +3823,8 @@
selector));
return new ResolutionResult.forElement(constructor);
case ConstructorResultKind.NON_CONSTANT:
- registry.registerNewStructure(node,
+ registry.registerNewStructure(
+ node,
new NewInvokeStructure(
new ConstructorAccessSemantics(
ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR,
@@ -4005,29 +3837,26 @@
if (!isInvalid) {
// [constructor] might be the implementation element
// and only declaration elements may be registered.
- registry.registerStaticUse(
- new StaticUse.constructorInvoke(
- constructor.declaration, callStructure));
+ registry.registerStaticUse(new StaticUse.constructorInvoke(
+ constructor.declaration, callStructure));
// TODO(johniwinther): Avoid registration of `type` in face of redirecting
// factory constructors.
registry.registerTypeUse(new TypeUse.instantiation(type));
}
+ ResolutionResult resolutionResult = const NoneResult();
if (node.isConst) {
bool isValidAsConstant = !isInvalid && constructor.isConst;
if (constructor == compiler.symbolConstructor) {
Node argumentNode = node.send.arguments.head;
- ConstantExpression constant =
- compiler.resolver.constantCompiler.compileNode(
- argumentNode, registry.mapping);
+ ConstantExpression constant = compiler.resolver.constantCompiler
+ .compileNode(argumentNode, registry.mapping);
ConstantValue name = compiler.constants.getConstantValue(constant);
if (!name.isString) {
DartType type = name.getType(coreTypes);
reporter.reportErrorMessage(
- argumentNode,
- MessageKind.STRING_EXPECTED,
- {'type': type});
+ argumentNode, MessageKind.STRING_EXPECTED, {'type': type});
} else {
StringConstantValue stringConstant = name;
String nameString = stringConstant.toDartString().slowToString();
@@ -4043,8 +3872,7 @@
if (type.containsTypeVariables) {
reporter.reportErrorMessage(
- node.send.selector,
- MessageKind.TYPE_VARIABLE_IN_CONSTANT);
+ node.send.selector, MessageKind.TYPE_VARIABLE_IN_CONSTANT);
isValidAsConstant = false;
isInvalid = true;
}
@@ -4053,6 +3881,11 @@
isValidAsConstant = false;
}
+ // Callback hook for when the compile-time constant evaluator has
+ // analyzed the constant.
+ // TODO(johnniwinther): Remove this when all constants are computed
+ // in resolution.
+ Function onAnalyzed;
if (isValidAsConstant &&
argumentsResult.isValidAsConstant &&
// TODO(johnniwinther): Remove this when all constants are computed
@@ -4063,46 +3896,51 @@
ConstructedConstantExpression constant =
new ConstructedConstantExpression(
- type,
- constructor,
- callStructure,
- arguments);
+ type, constructor, callStructure, arguments);
registry.registerNewStructure(node,
new ConstInvokeStructure(ConstantInvokeKind.CONSTRUCTED, constant));
- return new ConstantResult(node, constant);
+ resolutionResult = new ConstantResult(node, constant);
} else if (isInvalid) {
// Known to be non-constant.
kind == ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR;
- registry.registerNewStructure(node,
+ registry.registerNewStructure(
+ node,
new NewInvokeStructure(
new ConstructorAccessSemantics(kind, constructor, type),
selector));
} else {
// Might be valid but we don't know for sure. The compile-time constant
// evaluator will compute the actual constant as a deferred action.
- registry.registerNewStructure(node,
- new LateConstInvokeStructure(registry.mapping));
+ LateConstInvokeStructure structure =
+ new LateConstInvokeStructure(registry.mapping);
+ // TODO(johnniwinther): Avoid registering the
+ // [LateConstInvokeStructure]; it might not be necessary.
+ registry.registerNewStructure(node, structure);
+ onAnalyzed = () {
+ registry.registerNewStructure(node, structure.resolve(node));
+ };
}
+ analyzeConstantDeferred(node, onAnalyzed: onAnalyzed);
} else {
// Not constant.
if (constructor == compiler.symbolConstructor &&
!compiler.mirrorUsageAnalyzerTask.hasMirrorUsage(enclosingElement)) {
- reporter.reportHintMessage(
- node.newToken, MessageKind.NON_CONST_BLOAT,
- {'name': coreClasses.symbolClass.name});
+ reporter.reportHintMessage(node.newToken, MessageKind.NON_CONST_BLOAT,
+ {'name': coreClasses.symbolClass.name});
}
- registry.registerNewStructure(node,
+ registry.registerNewStructure(
+ node,
new NewInvokeStructure(
new ConstructorAccessSemantics(kind, constructor, type),
selector));
}
- return const NoneResult();
+ return resolutionResult;
}
- void checkConstMapKeysDontOverrideEquals(Spannable spannable,
- MapConstantValue map) {
+ void checkConstMapKeysDontOverrideEquals(
+ Spannable spannable, MapConstantValue map) {
for (ConstantValue key in map.keys) {
if (!key.isObject) continue;
ObjectConstantValue objectConstant = key;
@@ -4111,18 +3949,15 @@
if (cls == coreClasses.stringClass) continue;
Element equals = cls.lookupMember('==');
if (equals.enclosingClass != coreClasses.objectClass) {
- reporter.reportErrorMessage(
- spannable,
- MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS,
- {'type': keyType});
+ reporter.reportErrorMessage(spannable,
+ MessageKind.CONST_MAP_KEY_OVERRIDES_EQUALS, {'type': keyType});
}
}
}
void analyzeConstant(Node node, {enforceConst: true}) {
- ConstantExpression constant =
- compiler.resolver.constantCompiler.compileNode(
- node, registry.mapping, enforceConst: enforceConst);
+ ConstantExpression constant = compiler.resolver.constantCompiler
+ .compileNode(node, registry.mapping, enforceConst: enforceConst);
if (constant == null) {
assert(invariant(node, compiler.compilationFailed));
@@ -4135,9 +3970,13 @@
}
}
- void analyzeConstantDeferred(Node node, {bool enforceConst: true}) {
+ void analyzeConstantDeferred(Node node,
+ {bool enforceConst: true, void onAnalyzed()}) {
addDeferredAction(enclosingElement, () {
analyzeConstant(node, enforceConst: enforceConst);
+ if (onAnalyzed != null) {
+ onAnalyzed();
+ }
});
}
@@ -4166,21 +4005,20 @@
* [:null:], if there is no corresponding constructor, class or library.
*/
ConstructorResult resolveConstructor(NewExpression node) {
- return node.accept(new ConstructorResolver(
- compiler, this, inConstContext: node.isConst));
+ return node.accept(
+ new ConstructorResolver(compiler, this, inConstContext: node.isConst));
}
ConstructorResult resolveRedirectingFactory(RedirectingFactoryBody node,
- {bool inConstContext: false}) {
- return node.accept(new ConstructorResolver(
- compiler, this, inConstContext: inConstContext));
+ {bool inConstContext: false}) {
+ return node.accept(new ConstructorResolver(compiler, this,
+ inConstContext: inConstContext));
}
DartType resolveTypeAnnotation(TypeAnnotation node,
- {bool malformedIsError: false,
- bool deferredIsMalformed: true}) {
- DartType type = typeResolver.resolveTypeAnnotation(
- this, node, malformedIsError: malformedIsError,
+ {bool malformedIsError: false, bool deferredIsMalformed: true}) {
+ DartType type = typeResolver.resolveTypeAnnotation(this, node,
+ malformedIsError: malformedIsError,
deferredIsMalformed: deferredIsMalformed);
if (inCheckContext) {
registry.registerTypeUse(new TypeUse.checkedModeCheck(type));
@@ -4214,19 +4052,15 @@
if (typeArgument != null) {
if (node.isConst && typeArgument.containsTypeVariables) {
reporter.reportErrorMessage(
- arguments.nodes.head,
- MessageKind.TYPE_VARIABLE_IN_CONSTANT);
+ arguments.nodes.head, MessageKind.TYPE_VARIABLE_IN_CONSTANT);
isValidAsConstant = false;
}
listType = coreTypes.listType(typeArgument);
} else {
listType = coreTypes.listType();
}
- registry.registerLiteralList(
- node,
- listType,
- isConstant: node.isConst,
- isEmpty: node.elements.isEmpty);
+ registry.registerLiteralList(node, listType,
+ isConstant: node.isConst, isEmpty: node.elements.isEmpty);
if (node.isConst) {
List<ConstantExpression> constantExpressions = <ConstantExpression>[];
inConstantContext(() {
@@ -4252,22 +4086,19 @@
sendIsMemberAccess = false;
}
return const NoneResult();
-
}
ResolutionResult visitConditional(Conditional node) {
ResolutionResult conditionResult =
doInPromotionScope(node.condition, () => visit(node.condition));
- ResolutionResult thenResult =
- doInPromotionScope(node.thenExpression, () => visit(node.thenExpression));
+ ResolutionResult thenResult = doInPromotionScope(
+ node.thenExpression, () => visit(node.thenExpression));
ResolutionResult elseResult = visit(node.elseExpression);
if (conditionResult.isConstant &&
thenResult.isConstant &&
elseResult.isConstant) {
ConstantExpression constant = new ConditionalConstantExpression(
- conditionResult.constant,
- thenResult.constant,
- elseResult.constant);
+ conditionResult.constant, thenResult.constant, elseResult.constant);
registry.setConstant(node, constant);
return new ConstantResult(node, constant);
}
@@ -4312,8 +4143,7 @@
if (node.target == null) {
target = statementScope.currentBreakTarget();
if (target == null) {
- reporter.reportErrorMessage(
- node, MessageKind.NO_BREAK_TARGET);
+ reporter.reportErrorMessage(node, MessageKind.NO_BREAK_TARGET);
return const NoneResult();
}
target.isBreakTarget = true;
@@ -4327,8 +4157,7 @@
}
target = label.target;
if (!target.statement.isValidBreakTarget()) {
- reporter.reportErrorMessage(
- node.target, MessageKind.INVALID_BREAK);
+ reporter.reportErrorMessage(node.target, MessageKind.INVALID_BREAK);
return const NoneResult();
}
label.setBreakTarget();
@@ -4343,8 +4172,7 @@
if (node.target == null) {
target = statementScope.currentContinueTarget();
if (target == null) {
- reporter.reportErrorMessage(
- node, MessageKind.NO_CONTINUE_TARGET);
+ reporter.reportErrorMessage(node, MessageKind.NO_CONTINUE_TARGET);
return const NoneResult();
}
target.isContinueTarget = true;
@@ -4358,8 +4186,7 @@
}
target = label.target;
if (!target.statement.isValidContinueTarget()) {
- reporter.reportErrorMessage(
- node.target, MessageKind.INVALID_CONTINUE);
+ reporter.reportErrorMessage(node.target, MessageKind.INVALID_CONTINUE);
}
label.setContinueTarget();
registry.useLabel(node, label);
@@ -4378,10 +4205,8 @@
node.awaitToken, MessageKind.INVALID_AWAIT_FOR_IN);
}
registry.registerFeature(Feature.ASYNC_FOR_IN);
- registry.registerDynamicUse(
- new DynamicUse(Selectors.current, null));
- registry.registerDynamicUse(
- new DynamicUse(Selectors.moveNext, null));
+ registry.registerDynamicUse(new DynamicUse(Selectors.current, null));
+ registry.registerDynamicUse(new DynamicUse(Selectors.moveNext, null));
visit(node.expression);
@@ -4393,12 +4218,9 @@
ResolutionResult visitSyncForIn(SyncForIn node) {
registry.registerFeature(Feature.SYNC_FOR_IN);
- registry.registerDynamicUse(
- new DynamicUse(Selectors.iterator, null));
- registry.registerDynamicUse(
- new DynamicUse(Selectors.current, null));
- registry.registerDynamicUse(
- new DynamicUse(Selectors.moveNext, null));
+ registry.registerDynamicUse(new DynamicUse(Selectors.iterator, null));
+ registry.registerDynamicUse(new DynamicUse(Selectors.current, null));
+ registry.registerDynamicUse(new DynamicUse(Selectors.moveNext, null));
visit(node.expression);
@@ -4409,9 +4231,7 @@
}
void visitForInDeclaredIdentifierIn(
- Node declaration,
- ForIn node,
- Scope blockScope) {
+ Node declaration, ForIn node, Scope blockScope) {
LibraryElement library = enclosingElement.library;
bool oldAllowFinalWithoutInitializer = inLoopVariable;
@@ -4428,15 +4248,13 @@
loopVariable = registry.getDefinition(send);
Identifier identifier = send.selector.asIdentifier();
if (identifier == null) {
- reporter.reportErrorMessage(
- send.selector, MessageKind.INVALID_FOR_IN);
+ reporter.reportErrorMessage(send.selector, MessageKind.INVALID_FOR_IN);
} else {
- loopVariableSelector = new Selector.setter(
- new Name(identifier.source, library));
+ loopVariableSelector =
+ new Selector.setter(new Name(identifier.source, library));
}
if (send.receiver != null) {
- reporter.reportErrorMessage(
- send.receiver, MessageKind.INVALID_FOR_IN);
+ reporter.reportErrorMessage(send.receiver, MessageKind.INVALID_FOR_IN);
}
} else if (variableDefinitions != null) {
Link<Node> nodes = variableDefinitions.definitions.nodes;
@@ -4447,22 +4265,19 @@
Node first = nodes.head;
Identifier identifier = first.asIdentifier();
if (identifier == null) {
- reporter.reportErrorMessage(
- first, MessageKind.INVALID_FOR_IN);
+ reporter.reportErrorMessage(first, MessageKind.INVALID_FOR_IN);
} else {
- loopVariableSelector = new Selector.setter(
- new Name(identifier.source, library));
+ loopVariableSelector =
+ new Selector.setter(new Name(identifier.source, library));
loopVariable = registry.getDefinition(identifier);
}
} else {
- reporter.reportErrorMessage(
- declaration, MessageKind.INVALID_FOR_IN);
+ reporter.reportErrorMessage(declaration, MessageKind.INVALID_FOR_IN);
}
if (loopVariableSelector != null) {
registry.setSelector(declaration, loopVariableSelector);
if (loopVariable == null || loopVariable.isInstanceMember) {
- registry.registerDynamicUse(
- new DynamicUse(loopVariableSelector, null));
+ registry.registerDynamicUse(new DynamicUse(loopVariableSelector, null));
} else if (loopVariable.isStatic || loopVariable.isTopLevel) {
registry.registerStaticUse(
new StaticUse.staticSet(loopVariable.declaration));
@@ -4499,9 +4314,7 @@
registry.defineLabel(element.label, element);
} else {
reporter.reportWarningMessage(
- element.label,
- MessageKind.UNUSED_LABEL,
- {'labelName': labelName});
+ element.label, MessageKind.UNUSED_LABEL, {'labelName': labelName});
}
});
if (!targetElement.isTarget) {
@@ -4548,15 +4361,11 @@
}
if (node.isConst && mapType.containsTypeVariables) {
reporter.reportErrorMessage(
- arguments,
- MessageKind.TYPE_VARIABLE_IN_CONSTANT);
+ arguments, MessageKind.TYPE_VARIABLE_IN_CONSTANT);
isValidAsConstant = false;
}
- registry.registerMapLiteral(
- node,
- mapType,
- isConstant: node.isConst,
- isEmpty: node.entries.isEmpty);
+ registry.registerMapLiteral(node, mapType,
+ isConstant: node.isConst, isEmpty: node.entries.isEmpty);
if (node.isConst) {
List<ConstantExpression> keyExpressions = <ConstantExpression>[];
@@ -4624,8 +4433,8 @@
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
for (Link<Node> cases = node.cases.nodes;
- !cases.isEmpty;
- cases = cases.tail) {
+ !cases.isEmpty;
+ cases = cases.tail) {
SwitchCase switchCase = cases.head;
for (Node labelOrCase in switchCase.labelsAndCases) {
@@ -4639,7 +4448,7 @@
message: 'No constant computed for $node'));
ConstantValue value = compiler.constants.getConstantValue(constant);
- DartType caseType = value.getType(coreTypes);//typeOfConstant(value);
+ DartType caseType = value.getType(coreTypes); //typeOfConstant(value);
if (firstCaseType == null) {
firstCase = caseMatch;
@@ -4654,8 +4463,7 @@
{'type': "double"});
} else if (caseType == coreTypes.functionType) {
reporter.reportErrorMessage(
- node, MessageKind.SWITCH_CASE_FORBIDDEN,
- {'type': "Function"});
+ node, MessageKind.SWITCH_CASE_FORBIDDEN, {'type': "Function"});
} else if (value.isObject && overridesEquals(caseType)) {
reporter.reportErrorMessage(
firstCase.expression,
@@ -4709,29 +4517,21 @@
// It's an error if the same label occurs twice in the same switch.
reporter.reportError(
reporter.createMessage(
- label,
- MessageKind.DUPLICATE_LABEL,
- {'labelName': labelName}),
+ label, MessageKind.DUPLICATE_LABEL, {'labelName': labelName}),
<DiagnosticMessage>[
- reporter.createMessage(
- existingElement.label,
- MessageKind.EXISTING_LABEL,
- {'labelName': labelName}),
+ reporter.createMessage(existingElement.label,
+ MessageKind.EXISTING_LABEL, {'labelName': labelName}),
]);
} else {
// It's only a warning if it shadows another label.
existingElement = statementScope.lookupLabel(labelName);
if (existingElement != null) {
reporter.reportWarning(
- reporter.createMessage(
- label,
- MessageKind.DUPLICATE_LABEL,
+ reporter.createMessage(label, MessageKind.DUPLICATE_LABEL,
{'labelName': labelName}),
<DiagnosticMessage>[
- reporter.createMessage(
- existingElement.label,
- MessageKind.EXISTING_LABEL,
- {'labelName': labelName}),
+ reporter.createMessage(existingElement.label,
+ MessageKind.EXISTING_LABEL, {'labelName': labelName}),
]);
}
}
@@ -4807,8 +4607,7 @@
if (node.formals != null) {
Link<Node> formalsToProcess = node.formals.nodes;
if (formalsToProcess.isEmpty) {
- reporter.reportErrorMessage(
- node, MessageKind.EMPTY_CATCH_DECLARATION);
+ reporter.reportErrorMessage(node, MessageKind.EMPTY_CATCH_DECLARATION);
} else {
exceptionDefinition = formalsToProcess.head.asVariableDefinitions();
formalsToProcess = formalsToProcess.tail;
@@ -4828,8 +4627,8 @@
// Check that the formals aren't optional and that they have no
// modifiers or type.
for (Link<Node> link = node.formals.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
// If the formal parameter is a node list, it means that it is a
// sequence of optional parameters.
NodeList nodeList = link.head.asNodeList();
@@ -4881,7 +4680,7 @@
}
/// Looks up [name] in [scope] and unwraps the result.
-Element lookupInScope(DiagnosticReporter reporter, Node node,
- Scope scope, String name) {
+Element lookupInScope(
+ DiagnosticReporter reporter, Node node, Scope scope, String name) {
return Elements.unwrap(scope.lookup(name), reporter, node);
}
diff --git a/pkg/compiler/lib/src/resolution/operators.dart b/pkg/compiler/lib/src/resolution/operators.dart
index 6486262..06fd468 100644
--- a/pkg/compiler/lib/src/resolution/operators.dart
+++ b/pkg/compiler/lib/src/resolution/operators.dart
@@ -5,17 +5,10 @@
library dart2js.operators;
import '../elements/elements.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector,
- SelectorKind;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector, SelectorKind;
-enum UnaryOperatorKind {
- NOT,
- NEGATE,
- COMPLEMENT,
-}
+enum UnaryOperatorKind { NOT, NEGATE, COMPLEMENT, }
class UnaryOperator {
final UnaryOperatorKind kind;
@@ -26,10 +19,8 @@
bool get isUserDefinable => selectorName != null;
- Selector get selector => new Selector(
- SelectorKind.OPERATOR,
- new PublicName(selectorName),
- CallStructure.NO_ARGS);
+ Selector get selector => new Selector(SelectorKind.OPERATOR,
+ new PublicName(selectorName), CallStructure.NO_ARGS);
String toString() => name;
@@ -47,18 +38,25 @@
static UnaryOperator parse(String value) {
switch (value) {
- case '!': return NOT;
- case '-': return NEGATE;
- case '~': return COMPLEMENT;
- default: return null;
+ case '!':
+ return NOT;
+ case '-':
+ return NEGATE;
+ case '~':
+ return COMPLEMENT;
+ default:
+ return null;
}
}
static UnaryOperator fromKind(UnaryOperatorKind kind) {
switch (kind) {
- case UnaryOperatorKind.NOT: return NOT;
- case UnaryOperatorKind.NEGATE: return NEGATE;
- case UnaryOperatorKind.COMPLEMENT: return COMPLEMENT;
+ case UnaryOperatorKind.NOT:
+ return NOT;
+ case UnaryOperatorKind.NEGATE:
+ return NEGATE;
+ case UnaryOperatorKind.COMPLEMENT:
+ return COMPLEMENT;
}
}
}
@@ -186,54 +184,97 @@
static BinaryOperator parse(String value) {
switch (value) {
- case '==': return EQ;
- case '!=': return NOT_EQ;
- case '[]': return INDEX;
- case '*': return MUL;
- case '/': return DIV;
- case '%': return MOD;
- case '~/': return IDIV;
- case '+': return ADD;
- case '-': return SUB;
- case '<<': return SHL;
- case '>>': return SHR;
- case '>=': return GTEQ;
- case '>': return GT;
- case '<=': return LTEQ;
- case '<': return LT;
- case '&': return AND;
- case '^': return XOR;
- case '|': return OR;
- case '&&': return LOGICAL_AND;
- case '||': return LOGICAL_OR;
- case '??': return IF_NULL;
- default: return null;
+ case '==':
+ return EQ;
+ case '!=':
+ return NOT_EQ;
+ case '[]':
+ return INDEX;
+ case '*':
+ return MUL;
+ case '/':
+ return DIV;
+ case '%':
+ return MOD;
+ case '~/':
+ return IDIV;
+ case '+':
+ return ADD;
+ case '-':
+ return SUB;
+ case '<<':
+ return SHL;
+ case '>>':
+ return SHR;
+ case '>=':
+ return GTEQ;
+ case '>':
+ return GT;
+ case '<=':
+ return LTEQ;
+ case '<':
+ return LT;
+ case '&':
+ return AND;
+ case '^':
+ return XOR;
+ case '|':
+ return OR;
+ case '&&':
+ return LOGICAL_AND;
+ case '||':
+ return LOGICAL_OR;
+ case '??':
+ return IF_NULL;
+ default:
+ return null;
}
}
static BinaryOperator fromKind(BinaryOperatorKind kind) {
switch (kind) {
- case BinaryOperatorKind.EQ: return EQ;
- case BinaryOperatorKind.NOT_EQ: return NOT_EQ;
- case BinaryOperatorKind.INDEX: return INDEX;
- case BinaryOperatorKind.MUL: return MUL;
- case BinaryOperatorKind.DIV: return DIV;
- case BinaryOperatorKind.MOD: return MOD;
- case BinaryOperatorKind.IDIV: return IDIV;
- case BinaryOperatorKind.ADD: return ADD;
- case BinaryOperatorKind.SUB: return SUB;
- case BinaryOperatorKind.SHL: return SHL;
- case BinaryOperatorKind.SHR: return SHR;
- case BinaryOperatorKind.GTEQ: return GTEQ;
- case BinaryOperatorKind.GT: return GT;
- case BinaryOperatorKind.LTEQ: return LTEQ;
- case BinaryOperatorKind.LT: return LT;
- case BinaryOperatorKind.AND: return AND;
- case BinaryOperatorKind.XOR: return XOR;
- case BinaryOperatorKind.OR: return OR;
- case BinaryOperatorKind.LOGICAL_AND: return LOGICAL_AND;
- case BinaryOperatorKind.LOGICAL_OR: return LOGICAL_OR;
- case BinaryOperatorKind.IF_NULL: return IF_NULL;
+ case BinaryOperatorKind.EQ:
+ return EQ;
+ case BinaryOperatorKind.NOT_EQ:
+ return NOT_EQ;
+ case BinaryOperatorKind.INDEX:
+ return INDEX;
+ case BinaryOperatorKind.MUL:
+ return MUL;
+ case BinaryOperatorKind.DIV:
+ return DIV;
+ case BinaryOperatorKind.MOD:
+ return MOD;
+ case BinaryOperatorKind.IDIV:
+ return IDIV;
+ case BinaryOperatorKind.ADD:
+ return ADD;
+ case BinaryOperatorKind.SUB:
+ return SUB;
+ case BinaryOperatorKind.SHL:
+ return SHL;
+ case BinaryOperatorKind.SHR:
+ return SHR;
+ case BinaryOperatorKind.GTEQ:
+ return GTEQ;
+ case BinaryOperatorKind.GT:
+ return GT;
+ case BinaryOperatorKind.LTEQ:
+ return LTEQ;
+ case BinaryOperatorKind.LT:
+ return LT;
+ case BinaryOperatorKind.AND:
+ return AND;
+ case BinaryOperatorKind.XOR:
+ return XOR;
+ case BinaryOperatorKind.OR:
+ return OR;
+ case BinaryOperatorKind.LOGICAL_AND:
+ return LOGICAL_AND;
+ case BinaryOperatorKind.LOGICAL_OR:
+ return LOGICAL_OR;
+ case BinaryOperatorKind.IF_NULL:
+ return IF_NULL;
}
}
}
@@ -292,104 +333,121 @@
final bool isUserDefinable;
const AssignmentOperator._(this.kind, this.name, this.binaryOperator,
- {this.isUserDefinable: true});
+ {this.isUserDefinable: true});
String get selectorName {
- return binaryOperator != null ? binaryOperator.selectorName: null;
+ return binaryOperator != null ? binaryOperator.selectorName : null;
}
String toString() => name;
/// The = operator.
- static const AssignmentOperator ASSIGN =
- const AssignmentOperator._(AssignmentOperatorKind.ASSIGN, '=',
- null, isUserDefinable: false);
+ static const AssignmentOperator ASSIGN = const AssignmentOperator._(
+ AssignmentOperatorKind.ASSIGN, '=', null,
+ isUserDefinable: false);
/// The ??= operator.
- static const AssignmentOperator IF_NULL =
- const AssignmentOperator._(AssignmentOperatorKind.IF_NULL, '??=',
- BinaryOperator.IF_NULL,
- isUserDefinable: false);
+ static const AssignmentOperator IF_NULL = const AssignmentOperator._(
+ AssignmentOperatorKind.IF_NULL, '??=', BinaryOperator.IF_NULL,
+ isUserDefinable: false);
/// The += assignment operator.
- static const AssignmentOperator ADD =
- const AssignmentOperator._(AssignmentOperatorKind.ADD, '+=',
- BinaryOperator.ADD);
+ static const AssignmentOperator ADD = const AssignmentOperator._(
+ AssignmentOperatorKind.ADD, '+=', BinaryOperator.ADD);
/// The -= assignment operator.
- static const AssignmentOperator SUB =
- const AssignmentOperator._(AssignmentOperatorKind.SUB, '-=',
- BinaryOperator.SUB);
+ static const AssignmentOperator SUB = const AssignmentOperator._(
+ AssignmentOperatorKind.SUB, '-=', BinaryOperator.SUB);
/// The *= assignment operator.
- static const AssignmentOperator MUL =
- const AssignmentOperator._(AssignmentOperatorKind.MUL, '*=',
- BinaryOperator.MUL);
+ static const AssignmentOperator MUL = const AssignmentOperator._(
+ AssignmentOperatorKind.MUL, '*=', BinaryOperator.MUL);
/// The /= assignment operator.
- static const AssignmentOperator DIV =
- const AssignmentOperator._(AssignmentOperatorKind.DIV, '/=',
- BinaryOperator.DIV);
+ static const AssignmentOperator DIV = const AssignmentOperator._(
+ AssignmentOperatorKind.DIV, '/=', BinaryOperator.DIV);
/// The ~/= assignment operator.
- static const AssignmentOperator IDIV =
- const AssignmentOperator._(AssignmentOperatorKind.IDIV, '~/=',
- BinaryOperator.IDIV);
+ static const AssignmentOperator IDIV = const AssignmentOperator._(
+ AssignmentOperatorKind.IDIV, '~/=', BinaryOperator.IDIV);
/// The %= assignment operator.
- static const AssignmentOperator MOD =
- const AssignmentOperator._(AssignmentOperatorKind.MOD, '%=',
- BinaryOperator.MOD);
+ static const AssignmentOperator MOD = const AssignmentOperator._(
+ AssignmentOperatorKind.MOD, '%=', BinaryOperator.MOD);
/// The <<= assignment operator.
- static const AssignmentOperator SHL =
- const AssignmentOperator._(AssignmentOperatorKind.SHL, '<<=',
- BinaryOperator.SHL);
+ static const AssignmentOperator SHL = const AssignmentOperator._(
+ AssignmentOperatorKind.SHL, '<<=', BinaryOperator.SHL);
/// The >>= assignment operator.
- static const AssignmentOperator SHR =
- const AssignmentOperator._(AssignmentOperatorKind.SHR, '>>=',
- BinaryOperator.SHR);
+ static const AssignmentOperator SHR = const AssignmentOperator._(
+ AssignmentOperatorKind.SHR, '>>=', BinaryOperator.SHR);
/// The &= assignment operator.
- static const AssignmentOperator AND =
- const AssignmentOperator._(AssignmentOperatorKind.AND, '&=',
- BinaryOperator.AND);
+ static const AssignmentOperator AND = const AssignmentOperator._(
+ AssignmentOperatorKind.AND, '&=', BinaryOperator.AND);
/// The |= assignment operator.
- static const AssignmentOperator OR =
- const AssignmentOperator._(AssignmentOperatorKind.OR, '|=',
- BinaryOperator.OR);
+ static const AssignmentOperator OR = const AssignmentOperator._(
+ AssignmentOperatorKind.OR, '|=', BinaryOperator.OR);
/// The ^= assignment operator.
- static const AssignmentOperator XOR =
- const AssignmentOperator._(AssignmentOperatorKind.XOR, '^=',
- BinaryOperator.XOR);
+ static const AssignmentOperator XOR = const AssignmentOperator._(
+ AssignmentOperatorKind.XOR, '^=', BinaryOperator.XOR);
static AssignmentOperator parse(String value) {
switch (value) {
- case '=': return ASSIGN;
- case '??=': return IF_NULL;
- case '*=': return MUL;
- case '/=': return DIV;
- case '%=': return MOD;
- case '~/=': return IDIV;
- case '+=': return ADD;
- case '-=': return SUB;
- case '<<=': return SHL;
- case '>>=': return SHR;
- case '&=': return AND;
- case '^=': return XOR;
- case '|=': return OR;
- default: return null;
+ case '=':
+ return ASSIGN;
+ case '??=':
+ return IF_NULL;
+ case '*=':
+ return MUL;
+ case '/=':
+ return DIV;
+ case '%=':
+ return MOD;
+ case '~/=':
+ return IDIV;
+ case '+=':
+ return ADD;
+ case '-=':
+ return SUB;
+ case '<<=':
+ return SHL;
+ case '>>=':
+ return SHR;
+ case '&=':
+ return AND;
+ case '^=':
+ return XOR;
+ case '|=':
+ return OR;
+ default:
+ return null;
+ }
+ }
+
+ static AssignmentOperator fromKind(AssignmentOperatorKind kind) {
+ switch (kind) {
+ case AssignmentOperatorKind.ASSIGN: return ASSIGN;
+ case AssignmentOperatorKind.IF_NULL: return IF_NULL;
+ case AssignmentOperatorKind.ADD: return ADD;
+ case AssignmentOperatorKind.SUB: return SUB;
+ case AssignmentOperatorKind.MUL: return MUL;
+ case AssignmentOperatorKind.DIV: return DIV;
+ case AssignmentOperatorKind.IDIV: return IDIV;
+ case AssignmentOperatorKind.MOD: return MOD;
+ case AssignmentOperatorKind.SHL: return SHL;
+ case AssignmentOperatorKind.SHR: return SHR;
+ case AssignmentOperatorKind.AND: return AND;
+ case AssignmentOperatorKind.OR: return OR;
+ case AssignmentOperatorKind.XOR: return XOR;
}
}
}
-
-enum IncDecOperatorKind {
- INC, DEC
-}
+enum IncDecOperatorKind { INC, DEC }
class IncDecOperator {
final IncDecOperatorKind kind;
@@ -412,9 +470,19 @@
static IncDecOperator parse(String value) {
switch (value) {
- case '++': return INC;
- case '--': return DEC;
- default: return null;
+ case '++':
+ return INC;
+ case '--':
+ return DEC;
+ default:
+ return null;
+ }
+ }
+
+ static IncDecOperator fromKind(IncDecOperatorKind kind) {
+ switch (kind) {
+ case IncDecOperatorKind.INC: return INC;
+ case IncDecOperatorKind.DEC: return DEC;
}
}
}
diff --git a/pkg/compiler/lib/src/resolution/registry.dart b/pkg/compiler/lib/src/resolution/registry.dart
index b3c7686..ed6db6c 100644
--- a/pkg/compiler/lib/src/resolution/registry.dart
+++ b/pkg/compiler/lib/src/resolution/registry.dart
@@ -5,48 +5,29 @@
library dart2js.resolution.registry;
import '../common.dart';
-import '../common/backend_api.dart' show
- Backend,
- ForeignResolver;
-import '../common/resolution.dart' show
- Feature,
- ListLiteralUse,
- MapLiteralUse,
- ResolutionImpact;
-import '../common/registry.dart' show
- Registry;
-import '../compiler.dart' show
- Compiler;
+import '../common/backend_api.dart' show Backend, ForeignResolver;
+import '../common/resolution.dart'
+ show Feature, ListLiteralUse, MapLiteralUse, ResolutionImpact;
+import '../common/registry.dart' show Registry;
+import '../compiler.dart' show Compiler;
import '../constants/expressions.dart';
import '../dart_types.dart';
import '../diagnostics/source_span.dart';
-import '../enqueue.dart' show
- ResolutionEnqueuer;
+import '../enqueue.dart' show ResolutionEnqueuer;
import '../elements/elements.dart';
import '../tree/tree.dart';
-import '../util/util.dart' show
- Setlet;
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
-import '../universe/world_impact.dart' show
- WorldImpactBuilder;
-import '../util/enumset.dart' show
- EnumSet;
-import '../world.dart' show
- World;
+import '../util/util.dart' show Setlet;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
+import '../universe/world_impact.dart' show WorldImpactBuilder;
+import '../util/enumset.dart' show EnumSet;
+import '../world.dart' show World;
import 'send_structure.dart';
-import 'members.dart' show
- ResolverVisitor;
-import 'tree_elements.dart' show
- TreeElementMapping;
+import 'members.dart' show ResolverVisitor;
+import 'tree_elements.dart' show TreeElementMapping;
class _ResolutionWorldImpact extends ResolutionImpact with WorldImpactBuilder {
final String name;
@@ -68,8 +49,7 @@
@override
Iterable<MapLiteralUse> get mapLiterals {
- return _mapLiterals != null
- ? _mapLiterals : const <MapLiteralUse>[];
+ return _mapLiterals != null ? _mapLiterals : const <MapLiteralUse>[];
}
void registerListLiteral(ListLiteralUse listLiteralUse) {
@@ -82,8 +62,7 @@
@override
Iterable<ListLiteralUse> get listLiterals {
- return _listLiterals != null
- ? _listLiterals : const <ListLiteralUse>[];
+ return _listLiterals != null ? _listLiterals : const <ListLiteralUse>[];
}
void registerConstSymbolName(String name) {
@@ -95,8 +74,7 @@
@override
Iterable<String> get constSymbolNames {
- return _constSymbolNames != null
- ? _constSymbolNames : const <String>[];
+ return _constSymbolNames != null ? _constSymbolNames : const <String>[];
}
void registerFeature(Feature feature) {
@@ -109,7 +87,8 @@
@override
Iterable<Feature> get features {
return _features != null
- ? _features.iterable(Feature.values) : const <Feature>[];
+ ? _features.iterable(Feature.values)
+ : const <Feature>[];
}
void registerConstantLiteral(ConstantExpression constant) {
@@ -121,7 +100,8 @@
Iterable<ConstantExpression> get constantLiterals {
return _constantLiterals != null
- ? _constantLiterals : const <ConstantExpression>[];
+ ? _constantLiterals
+ : const <ConstantExpression>[];
}
String toString() => '_ResolutionWorldImpact($name)';
@@ -139,8 +119,8 @@
ResolutionRegistry(Compiler compiler, TreeElementMapping mapping)
: this.compiler = compiler,
this.mapping = mapping,
- this.worldImpact = new _ResolutionWorldImpact(
- mapping.analyzedElement.toString());
+ this.worldImpact =
+ new _ResolutionWorldImpact(mapping.analyzedElement.toString());
bool get isForResolution => true;
@@ -187,8 +167,8 @@
}
/// Sets the target constructor [node] to be [element].
- void setRedirectingTargetConstructor(RedirectingFactoryBody node,
- ConstructorElement element) {
+ void setRedirectingTargetConstructor(
+ RedirectingFactoryBody node, ConstructorElement element) {
useElement(node, element);
}
@@ -283,8 +263,8 @@
// Potential access registration.
//////////////////////////////////////////////////////////////////////////////
- void setAccessedByClosureIn(Node contextNode, VariableElement element,
- Node accessNode) {
+ void setAccessedByClosureIn(
+ Node contextNode, VariableElement element, Node accessNode) {
mapping.setAccessedByClosureIn(contextNode, element, accessNode);
}
@@ -292,13 +272,13 @@
mapping.registerPotentialMutation(element, mutationNode);
}
- void registerPotentialMutationInClosure(VariableElement element,
- Node mutationNode) {
+ void registerPotentialMutationInClosure(
+ VariableElement element, Node mutationNode) {
mapping.registerPotentialMutationInClosure(element, mutationNode);
}
- void registerPotentialMutationIn(Node contextNode, VariableElement element,
- Node mutationNode) {
+ void registerPotentialMutationIn(
+ Node contextNode, VariableElement element, Node mutationNode) {
mapping.registerPotentialMutationIn(contextNode, element, mutationNode);
}
@@ -328,30 +308,23 @@
worldImpact.registerTypeUse(new TypeUse.typeLiteral(type));
}
- void registerLiteralList(Node node,
- InterfaceType type,
- {bool isConstant,
- bool isEmpty}) {
+ void registerLiteralList(Node node, InterfaceType type,
+ {bool isConstant, bool isEmpty}) {
setType(node, type);
worldImpact.registerListLiteral(
new ListLiteralUse(type, isConstant: isConstant, isEmpty: isEmpty));
}
- void registerMapLiteral(Node node,
- InterfaceType type,
- {bool isConstant,
- bool isEmpty}) {
+ void registerMapLiteral(Node node, InterfaceType type,
+ {bool isConstant, bool isEmpty}) {
setType(node, type);
worldImpact.registerMapLiteral(
new MapLiteralUse(type, isConstant: isConstant, isEmpty: isEmpty));
}
- void registerForeignCall(Node node,
- Element element,
- CallStructure callStructure,
- ResolverVisitor visitor) {
- backend.registerForeignCall(
- node, element, callStructure,
+ void registerForeignCall(Node node, Element element,
+ CallStructure callStructure, ResolverVisitor visitor) {
+ backend.registerForeignCall(node, element, callStructure,
new ForeignResolutionResolver(visitor, this));
}
@@ -375,8 +348,8 @@
return backend.defaultSuperclass(element);
}
- void registerMixinUse(MixinApplicationElement mixinApplication,
- ClassElement mixin) {
+ void registerMixinUse(
+ MixinApplicationElement mixinApplication, ClassElement mixin) {
universe.registerMixinUse(mixinApplication, mixin);
}
diff --git a/pkg/compiler/lib/src/resolution/resolution.dart b/pkg/compiler/lib/src/resolution/resolution.dart
index f628e83..7caced4 100644
--- a/pkg/compiler/lib/src/resolution/resolution.dart
+++ b/pkg/compiler/lib/src/resolution/resolution.dart
@@ -7,62 +7,47 @@
import 'dart:collection' show Queue;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers;
-import '../common/resolution.dart' show
- Feature,
- Parsing,
- Resolution,
- ResolutionImpact;
-import '../common/tasks.dart' show
- CompilerTask,
- DeferredAction;
-import '../compiler.dart' show
- Compiler;
-import '../compile_time_constants.dart' show
- ConstantCompiler;
-import '../constants/expressions.dart' show
- ConstantExpression,
- ConstantExpressionKind,
- ConstructedConstantExpression,
- ErroneousConstantExpression;
-import '../constants/values.dart' show
- ConstantValue;
-import '../core_types.dart' show
- CoreClasses,
- CoreTypes;
+import '../common/names.dart' show Identifiers;
+import '../common/resolution.dart'
+ show Feature, Parsing, Resolution, ResolutionImpact;
+import '../common/tasks.dart' show CompilerTask, DeferredAction;
+import '../compiler.dart' show Compiler;
+import '../compile_time_constants.dart' show ConstantCompiler;
+import '../constants/expressions.dart'
+ show
+ ConstantExpression,
+ ConstantExpressionKind,
+ ConstructedConstantExpression,
+ ErroneousConstantExpression;
+import '../constants/values.dart' show ConstantValue;
+import '../core_types.dart' show CoreClasses, CoreTypes;
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- BaseClassElementX,
- BaseFunctionElementX,
- ConstructorElementX,
- FieldElementX,
- FunctionElementX,
- GetterElementX,
- MetadataAnnotationX,
- MixinApplicationElementX,
- ParameterMetadataAnnotation,
- SetterElementX,
- TypedefElementX;
-import '../tokens/token.dart' show
- isBinaryOperator,
- isMinusOperator,
- isTernaryOperator,
- isUnaryOperator,
- isUserDefinableOperator;
+import '../elements/modelx.dart'
+ show
+ BaseClassElementX,
+ BaseFunctionElementX,
+ ConstructorElementX,
+ FieldElementX,
+ FunctionElementX,
+ GetterElementX,
+ MetadataAnnotationX,
+ MixinApplicationElementX,
+ ParameterMetadataAnnotation,
+ SetterElementX,
+ TypedefElementX;
+import '../tokens/token.dart'
+ show
+ isBinaryOperator,
+ isMinusOperator,
+ isTernaryOperator,
+ isUnaryOperator,
+ isUserDefinableOperator;
import '../tree/tree.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/use.dart' show
- StaticUse,
- TypeUse;
-import '../universe/world_impact.dart' show
- WorldImpact;
-import '../util/util.dart' show
- Link,
- LinkBuilder,
- Setlet;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/use.dart' show StaticUse, TypeUse;
+import '../universe/world_impact.dart' show WorldImpact;
+import '../util/util.dart' show Link, LinkBuilder, Setlet;
import 'class_hierarchy.dart';
import 'class_members.dart' show MembersCreator;
@@ -128,13 +113,11 @@
});
}
- void resolveRedirectingConstructor(InitializerResolver resolver,
- Node node,
- FunctionElement constructor,
- FunctionElement redirection) {
+ void resolveRedirectingConstructor(InitializerResolver resolver, Node node,
+ FunctionElement constructor, FunctionElement redirection) {
assert(invariant(node, constructor.isImplementation,
message: 'Redirecting constructors must be resolved on implementation '
- 'elements.'));
+ 'elements.'));
Setlet<FunctionElement> seen = new Setlet<FunctionElement>();
seen.add(constructor);
while (redirection != null) {
@@ -154,18 +137,17 @@
}
static void processAsyncMarker(Compiler compiler,
- BaseFunctionElementX element,
- ResolutionRegistry registry) {
+ BaseFunctionElementX element, ResolutionRegistry registry) {
DiagnosticReporter reporter = compiler.reporter;
Resolution resolution = compiler.resolution;
CoreClasses coreClasses = compiler.coreClasses;
FunctionExpression functionExpression = element.node;
AsyncModifier asyncModifier = functionExpression.asyncModifier;
if (asyncModifier != null) {
-
if (asyncModifier.isAsynchronous) {
element.asyncMarker = asyncModifier.isYielding
- ? AsyncMarker.ASYNC_STAR : AsyncMarker.ASYNC;
+ ? AsyncMarker.ASYNC_STAR
+ : AsyncMarker.ASYNC;
} else {
element.asyncMarker = AsyncMarker.SYNC_STAR;
}
@@ -185,7 +167,6 @@
asyncModifier,
MessageKind.ASYNC_MODIFIER_ON_SETTER,
{'modifier': element.asyncMarker});
-
}
if (functionExpression.body.asReturn() != null &&
element.asyncMarker.isYielding) {
@@ -196,18 +177,18 @@
}
}
switch (element.asyncMarker) {
- case AsyncMarker.ASYNC:
- registry.registerFeature(Feature.ASYNC);
- coreClasses.futureClass.ensureResolved(resolution);
- break;
- case AsyncMarker.ASYNC_STAR:
- registry.registerFeature(Feature.ASYNC_STAR);
- coreClasses.streamClass.ensureResolved(resolution);
- break;
- case AsyncMarker.SYNC_STAR:
- registry.registerFeature(Feature.SYNC_STAR);
- coreClasses.iterableClass.ensureResolved(resolution);
- break;
+ case AsyncMarker.ASYNC:
+ registry.registerFeature(Feature.ASYNC);
+ coreClasses.futureClass.ensureResolved(resolution);
+ break;
+ case AsyncMarker.ASYNC_STAR:
+ registry.registerFeature(Feature.ASYNC_STAR);
+ coreClasses.streamClass.ensureResolved(resolution);
+ break;
+ case AsyncMarker.SYNC_STAR:
+ registry.registerFeature(Feature.SYNC_STAR);
+ coreClasses.iterableClass.ensureResolved(resolution);
+ break;
}
}
}
@@ -225,9 +206,7 @@
FunctionElement element, FunctionExpression tree) {
return reporter.withCurrentElement(element, () {
if (element.isExternal && tree.hasBody) {
- reporter.reportErrorMessage(
- element,
- MessageKind.EXTERNAL_WITH_BODY,
+ reporter.reportErrorMessage(element, MessageKind.EXTERNAL_WITH_BODY,
{'functionName': element.name});
}
if (element.isConstructor) {
@@ -240,8 +219,7 @@
reporter.reportErrorMessage(
tree, MessageKind.CONST_CONSTRUCTOR_WITH_BODY);
} else if (!tree.isRedirectingFactory) {
- reporter.reportErrorMessage(
- tree, MessageKind.CONST_FACTORY);
+ reporter.reportErrorMessage(tree, MessageKind.CONST_FACTORY);
}
}
}
@@ -295,13 +273,11 @@
element.isInstanceMember &&
element.name == Identifiers.noSuchMethod_ &&
_isNativeClassOrExtendsNativeClass(enclosingClass)) {
- reporter.reportErrorMessage(
- tree, MessageKind.NO_SUCH_METHOD_IN_NATIVE);
+ reporter.reportErrorMessage(tree, MessageKind.NO_SUCH_METHOD_IN_NATIVE);
}
return registry.worldImpact;
});
-
}
WorldImpact resolveMethodElement(FunctionElementX element) {
@@ -312,7 +288,7 @@
// should never be non-null, not even for constructors.
assert(invariant(element, element.isConstructor,
message: 'Non-constructor element $element '
- 'has already been analyzed.'));
+ 'has already been analyzed.'));
return const ResolutionImpact();
}
if (element.isSynthesized) {
@@ -326,9 +302,8 @@
// seeing this element.
element.computeType(resolution);
if (!target.isMalformed) {
- registry.registerStaticUse(
- new StaticUse.superConstructorInvoke(
- target, CallStructure.NO_ARGS));
+ registry.registerStaticUse(new StaticUse.superConstructorInvoke(
+ target, CallStructure.NO_ARGS));
}
return registry.worldImpact;
} else {
@@ -363,9 +338,8 @@
WorldImpact resolveField(FieldElementX element) {
VariableDefinitions tree = element.parseNode(parsing);
- if(element.modifiers.isStatic && element.isTopLevel) {
- reporter.reportErrorMessage(
- element.modifiers.getStatic(),
+ if (element.modifiers.isStatic && element.isTopLevel) {
+ reporter.reportErrorMessage(element.modifiers.getStatic(),
MessageKind.TOP_LEVEL_VARIABLE_DECLARED_STATIC);
}
ResolverVisitor visitor = visitorFor(element);
@@ -424,8 +398,7 @@
DartType resolveTypeAnnotation(Element element, TypeAnnotation annotation) {
DartType type = resolveReturnType(element, annotation);
if (type.isVoid) {
- reporter.reportErrorMessage(
- annotation, MessageKind.VOID_NOT_ALLOWED);
+ reporter.reportErrorMessage(annotation, MessageKind.VOID_NOT_ALLOWED);
}
return type;
}
@@ -440,8 +413,8 @@
return result;
}
- void resolveRedirectionChain(ConstructorElementX constructor,
- Spannable node) {
+ void resolveRedirectionChain(
+ ConstructorElementX constructor, Spannable node) {
ConstructorElementX target = constructor;
InterfaceType targetType;
List<Element> seen = new List<Element>();
@@ -453,7 +426,7 @@
targetType = target.effectiveTargetType;
assert(invariant(target, targetType != null,
message: 'Redirection target type has not been computed for '
- '$target'));
+ '$target'));
target = target.effectiveTargetInternal;
break;
}
@@ -521,14 +494,11 @@
if (cls.supertypeLoadState == STATE_DONE) return;
if (cls.supertypeLoadState == STATE_STARTED) {
reporter.reportErrorMessage(
- from,
- MessageKind.CYCLIC_CLASS_HIERARCHY,
- {'className': cls.name});
+ from, MessageKind.CYCLIC_CLASS_HIERARCHY, {'className': cls.name});
cls.supertypeLoadState = STATE_DONE;
cls.hasIncompleteHierarchy = true;
- cls.allSupertypesAndSelf =
- coreClasses.objectClass.allSupertypesAndSelf.extendClass(
- cls.computeType(resolution));
+ cls.allSupertypesAndSelf = coreClasses.objectClass.allSupertypesAndSelf
+ .extendClass(cls.computeType(resolution));
cls.supertype = cls.allSupertypes.head;
assert(invariant(from, cls.supertype != null,
message: 'Missing supertype on cyclic class $cls.'));
@@ -538,8 +508,9 @@
cls.supertypeLoadState = STATE_STARTED;
reporter.withCurrentElement(cls, () {
// TODO(ahe): Cache the node in cls.
- cls.parseNode(parsing).accept(
- new ClassSupertypeResolver(compiler, cls));
+ cls
+ .parseNode(parsing)
+ .accept(new ClassSupertypeResolver(compiler, cls));
if (cls.supertypeLoadState != STATE_DONE) {
cls.supertypeLoadState = STATE_DONE;
}
@@ -561,8 +532,8 @@
/// [element] has been resolved.
// TODO(johnniwinther): Encapsulate this functionality in a
// 'TypeDeclarationResolver'.
- _resolveTypeDeclaration(TypeDeclarationElement element,
- resolveTypeDeclaration()) {
+ _resolveTypeDeclaration(
+ TypeDeclarationElement element, resolveTypeDeclaration()) {
return reporter.withCurrentElement(element, () {
return measure(() {
TypeDeclarationElement previousResolvedTypeDeclaration =
@@ -572,7 +543,8 @@
if (previousResolvedTypeDeclaration == null) {
do {
while (!pendingClassesToBeResolved.isEmpty) {
- pendingClassesToBeResolved.removeFirst()
+ pendingClassesToBeResolved
+ .removeFirst()
.ensureResolved(resolution);
}
while (!pendingClassesToBePostProcessed.isEmpty) {
@@ -618,27 +590,30 @@
}
}
- void resolveClassInternal(BaseClassElementX element,
- ResolutionRegistry registry) {
+ void resolveClassInternal(
+ BaseClassElementX element, ResolutionRegistry registry) {
if (!element.isPatch) {
- reporter.withCurrentElement(element, () => measure(() {
- assert(element.resolutionState == STATE_NOT_STARTED);
- element.resolutionState = STATE_STARTED;
- Node tree = element.parseNode(parsing);
- loadSupertypes(element, tree);
+ reporter.withCurrentElement(
+ element,
+ () => measure(() {
+ assert(element.resolutionState == STATE_NOT_STARTED);
+ element.resolutionState = STATE_STARTED;
+ Node tree = element.parseNode(parsing);
+ loadSupertypes(element, tree);
- ClassResolverVisitor visitor =
- new ClassResolverVisitor(compiler, element, registry);
- visitor.visit(tree);
- element.resolutionState = STATE_DONE;
- compiler.onClassResolved(element);
- pendingClassesToBePostProcessed.add(element);
- }));
+ ClassResolverVisitor visitor =
+ new ClassResolverVisitor(compiler, element, registry);
+ visitor.visit(tree);
+ element.resolutionState = STATE_DONE;
+ compiler.onClassResolved(element);
+ pendingClassesToBePostProcessed.add(element);
+ }));
if (element.isPatched) {
// Ensure handling patch after origin.
element.patch.ensureResolved(resolution);
}
- } else { // Handle patch classes:
+ } else {
+ // Handle patch classes:
element.resolutionState = STATE_STARTED;
// Ensure handling origin before patch.
element.origin.ensureResolved(resolution);
@@ -722,8 +697,7 @@
// Check that we're not trying to use Object as a mixin.
if (mixin.superclass == null) {
reporter.reportErrorMessage(
- mixinApplication,
- MessageKind.ILLEGAL_MIXIN_OBJECT);
+ mixinApplication, MessageKind.ILLEGAL_MIXIN_OBJECT);
// Avoid reporting additional errors for the Object class.
return;
}
@@ -735,8 +709,7 @@
// Check that the mixed in class has Object as its superclass.
if (!mixin.superclass.isObject) {
- reporter.reportErrorMessage(
- mixin, MessageKind.ILLEGAL_MIXIN_SUPERCLASS);
+ reporter.reportErrorMessage(mixin, MessageKind.ILLEGAL_MIXIN_SUPERCLASS);
}
// Check that the mixed in class doesn't have any constructors and
@@ -754,31 +727,25 @@
// differently.
if (compiler.enqueuer.resolution.hasBeenProcessed(member)) {
checkMixinSuperUses(
- member.resolvedAst.elements,
- mixinApplication,
- mixin);
+ member.resolvedAst.elements, mixinApplication, mixin);
}
}
});
}
void checkMixinSuperUses(TreeElements resolutionTree,
- MixinApplicationElement mixinApplication,
- ClassElement mixin) {
+ MixinApplicationElement mixinApplication, ClassElement mixin) {
// TODO(johnniwinther): Avoid the use of [TreeElements] here.
if (resolutionTree == null) return;
Iterable<SourceSpan> superUses = resolutionTree.superUses;
if (superUses.isEmpty) return;
- DiagnosticMessage error = reporter.createMessage(
- mixinApplication,
- MessageKind.ILLEGAL_MIXIN_WITH_SUPER,
- {'className': mixin.name});
+ DiagnosticMessage error = reporter.createMessage(mixinApplication,
+ MessageKind.ILLEGAL_MIXIN_WITH_SUPER, {'className': mixin.name});
// Show the user the problematic uses of 'super' in the mixin.
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
for (SourceSpan use in superUses) {
- infos.add(reporter.createMessage(
- use,
- MessageKind.ILLEGAL_MIXIN_SUPER_USE));
+ infos.add(
+ reporter.createMessage(use, MessageKind.ILLEGAL_MIXIN_SUPER_USE));
}
reporter.reportError(error, infos);
}
@@ -801,8 +768,7 @@
member, MessageKind.ILLEGAL_FINAL_METHOD_MODIFIER);
}
if (member.isConstructor) {
- final mismatchedFlagsBits =
- member.modifiers.flags &
+ final mismatchedFlagsBits = member.modifiers.flags &
(Modifiers.FLAG_STATIC | Modifiers.FLAG_ABSTRACT);
if (mismatchedFlagsBits != 0) {
final mismatchedFlags =
@@ -830,8 +796,8 @@
});
});
if (!constConstructors.isEmpty && !nonFinalInstanceFields.isEmpty) {
- Spannable span = constConstructors.length > 1
- ? cls : constConstructors[0];
+ Spannable span =
+ constConstructors.length > 1 ? cls : constConstructors[0];
DiagnosticMessage error = reporter.createMessage(
span,
MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS,
@@ -839,15 +805,13 @@
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
if (constConstructors.length > 1) {
for (Element constructor in constConstructors) {
- infos.add(reporter.createMessage(
- constructor,
+ infos.add(reporter.createMessage(constructor,
MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_CONSTRUCTOR));
}
}
for (Element field in nonFinalInstanceFields) {
infos.add(reporter.createMessage(
- field,
- MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD));
+ field, MessageKind.CONST_CONSTRUCTOR_WITH_NONFINAL_FIELDS_FIELD));
}
reporter.reportError(error, infos);
}
@@ -863,12 +827,11 @@
ClassElement classElement = member.enclosingClass;
Element lookupElement = classElement.lookupLocalMember(member.name);
if (lookupElement == null) {
- reporter.internalError(member,
- "No abstract field for accessor");
+ reporter.internalError(member, "No abstract field for accessor");
} else if (!lookupElement.isAbstractField) {
if (lookupElement.isMalformed || lookupElement.isAmbiguous) return;
- reporter.internalError(member,
- "Inaccessible abstract field for accessor");
+ reporter.internalError(
+ member, "Inaccessible abstract field for accessor");
}
AbstractFieldElement field = lookupElement;
@@ -880,14 +843,10 @@
int setterFlags = setter.modifiers.flags | Modifiers.FLAG_ABSTRACT;
if (getterFlags != setterFlags) {
final mismatchedFlags =
- new Modifiers.withFlags(null, getterFlags ^ setterFlags);
- reporter.reportWarningMessage(
- field.getter,
- MessageKind.GETTER_MISMATCH,
+ new Modifiers.withFlags(null, getterFlags ^ setterFlags);
+ reporter.reportWarningMessage(field.getter, MessageKind.GETTER_MISMATCH,
{'modifiers': mismatchedFlags});
- reporter.reportWarningMessage(
- field.setter,
- MessageKind.SETTER_MISMATCH,
+ reporter.reportWarningMessage(field.setter, MessageKind.SETTER_MISMATCH,
{'modifiers': mismatchedFlags});
}
}
@@ -921,8 +880,8 @@
messageKind = MessageKind.TERNARY_OPERATOR_BAD_ARITY;
requiredParameterCount = 2;
} else {
- reporter.internalError(function,
- 'Unexpected user defined operator $value');
+ reporter.internalError(
+ function, 'Unexpected user defined operator $value');
}
checkArity(function, requiredParameterCount, messageKind, isMinus);
}
@@ -930,17 +889,14 @@
void checkOverrideHashCode(FunctionElement operatorEquals) {
if (operatorEquals.isAbstract) return;
ClassElement cls = operatorEquals.enclosingClass;
- Element hashCodeImplementation =
- cls.lookupLocalMember('hashCode');
+ Element hashCodeImplementation = cls.lookupLocalMember('hashCode');
if (hashCodeImplementation != null) return;
- reporter.reportHintMessage(
- operatorEquals, MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE,
- {'class': cls.name});
+ reporter.reportHintMessage(operatorEquals,
+ MessageKind.OVERRIDE_EQUALS_NOT_HASH_CODE, {'class': cls.name});
}
- void checkArity(FunctionElement function,
- int requiredParameterCount, MessageKind messageKind,
- bool isMinus) {
+ void checkArity(FunctionElement function, int requiredParameterCount,
+ MessageKind messageKind, bool isMinus) {
FunctionExpression node = function.node;
FunctionSignature signature = function.functionSignature;
if (signature.requiredParameterCount != requiredParameterCount) {
@@ -994,22 +950,18 @@
}
}
- reportErrorWithContext(Element errorneousElement,
- MessageKind errorMessage,
- Element contextElement,
- MessageKind contextMessage) {
+ reportErrorWithContext(Element errorneousElement, MessageKind errorMessage,
+ Element contextElement, MessageKind contextMessage) {
reporter.reportError(
- reporter.createMessage(
- errorneousElement,
- errorMessage,
- {'memberName': contextElement.name,
- 'className': contextElement.enclosingClass.name}),
+ reporter.createMessage(errorneousElement, errorMessage, {
+ 'memberName': contextElement.name,
+ 'className': contextElement.enclosingClass.name
+ }),
<DiagnosticMessage>[
- reporter.createMessage(contextElement, contextMessage),
+ reporter.createMessage(contextElement, contextMessage),
]);
}
-
FunctionSignature resolveSignature(FunctionElementX element) {
MessageKind defaultValuesError = null;
if (element.isFactoryConstructor) {
@@ -1021,7 +973,10 @@
return reporter.withCurrentElement(element, () {
FunctionExpression node = element.parseNode(parsing);
return measure(() => SignatureResolver.analyze(
- compiler, node.parameters, node.returnType, element,
+ compiler,
+ node.parameters,
+ node.returnType,
+ element,
new ResolutionRegistry(compiler, _ensureTreeElements(element)),
defaultValuesError: defaultValuesError,
createRealParameters: true));
@@ -1032,15 +987,15 @@
if (element.isResolved) return const ResolutionImpact();
compiler.world.allTypedefs.add(element);
return _resolveTypeDeclaration(element, () {
- ResolutionRegistry registry = new ResolutionRegistry(
- compiler, _ensureTreeElements(element));
+ ResolutionRegistry registry =
+ new ResolutionRegistry(compiler, _ensureTreeElements(element));
return reporter.withCurrentElement(element, () {
return measure(() {
assert(element.resolutionState == STATE_NOT_STARTED);
element.resolutionState = STATE_STARTED;
Typedef node = element.parseNode(parsing);
TypedefResolverVisitor visitor =
- new TypedefResolverVisitor(compiler, element, registry);
+ new TypedefResolverVisitor(compiler, element, registry);
visitor.visit(node);
element.resolutionState = STATE_DONE;
return registry.worldImpact;
@@ -1050,61 +1005,65 @@
}
void resolveMetadataAnnotation(MetadataAnnotationX annotation) {
- reporter.withCurrentElement(annotation.annotatedElement, () => measure(() {
- assert(annotation.resolutionState == STATE_NOT_STARTED);
- annotation.resolutionState = STATE_STARTED;
+ reporter.withCurrentElement(
+ annotation.annotatedElement,
+ () => measure(() {
+ assert(annotation.resolutionState == STATE_NOT_STARTED);
+ annotation.resolutionState = STATE_STARTED;
- Node node = annotation.parseNode(parsing);
- Element annotatedElement = annotation.annotatedElement;
- AnalyzableElement context = annotatedElement.analyzableElement;
- ClassElement classElement = annotatedElement.enclosingClass;
- if (classElement != null) {
- // The annotation is resolved in the scope of [classElement].
- classElement.ensureResolved(resolution);
- }
- assert(invariant(node, context != null,
- message: "No context found for metadata annotation "
- "on $annotatedElement."));
- ResolverVisitor visitor = visitorFor(context, useEnclosingScope: true);
- ResolutionRegistry registry = visitor.registry;
- node.accept(visitor);
- // TODO(johnniwinther): Avoid passing the [TreeElements] to
- // [compileMetadata].
- ConstantExpression constant = constantCompiler.compileMetadata(
- annotation, node, registry.mapping);
- switch (constant.kind) {
- case ConstantExpressionKind.CONSTRUCTED:
- ConstructedConstantExpression constructedConstant = constant;
- if (constructedConstant.type.isGeneric) {
- // Const constructor calls cannot have type arguments.
- // TODO(24312): Remove this.
- reporter.reportErrorMessage(
- node, MessageKind.INVALID_METADATA_GENERIC);
- constant = new ErroneousConstantExpression();
- }
- break;
- case ConstantExpressionKind.VARIABLE:
- case ConstantExpressionKind.ERRONEOUS:
- break;
- default:
- reporter.reportErrorMessage(node, MessageKind.INVALID_METADATA);
- constant = new ErroneousConstantExpression();
- break;
- }
- annotation.constant = constant;
+ Node node = annotation.parseNode(parsing);
+ Element annotatedElement = annotation.annotatedElement;
+ AnalyzableElement context = annotatedElement.analyzableElement;
+ ClassElement classElement = annotatedElement.enclosingClass;
+ if (classElement != null) {
+ // The annotation is resolved in the scope of [classElement].
+ classElement.ensureResolved(resolution);
+ }
+ assert(invariant(node, context != null,
+ message: "No context found for metadata annotation "
+ "on $annotatedElement."));
+ ResolverVisitor visitor =
+ visitorFor(context, useEnclosingScope: true);
+ ResolutionRegistry registry = visitor.registry;
+ node.accept(visitor);
+ // TODO(johnniwinther): Avoid passing the [TreeElements] to
+ // [compileMetadata].
+ ConstantExpression constant = constantCompiler.compileMetadata(
+ annotation, node, registry.mapping);
+ switch (constant.kind) {
+ case ConstantExpressionKind.CONSTRUCTED:
+ ConstructedConstantExpression constructedConstant = constant;
+ if (constructedConstant.type.isGeneric) {
+ // Const constructor calls cannot have type arguments.
+ // TODO(24312): Remove this.
+ reporter.reportErrorMessage(
+ node, MessageKind.INVALID_METADATA_GENERIC);
+ constant = new ErroneousConstantExpression();
+ }
+ break;
+ case ConstantExpressionKind.VARIABLE:
+ case ConstantExpressionKind.ERRONEOUS:
+ break;
+ default:
+ reporter.reportErrorMessage(
+ node, MessageKind.INVALID_METADATA);
+ constant = new ErroneousConstantExpression();
+ break;
+ }
+ annotation.constant = constant;
- constantCompiler.evaluate(annotation.constant);
- // TODO(johnniwinther): Register the relation between the annotation
- // and the annotated element instead. This will allow the backend to
- // retrieve the backend constant and only register metadata on the
- // elements for which it is needed. (Issue 17732).
- registry.registerMetadataConstant(annotation);
- annotation.resolutionState = STATE_DONE;
- }));
+ constantCompiler.evaluate(annotation.constant);
+ // TODO(johnniwinther): Register the relation between the annotation
+ // and the annotated element instead. This will allow the backend to
+ // retrieve the backend constant and only register metadata on the
+ // elements for which it is needed. (Issue 17732).
+ registry.registerMetadataConstant(annotation);
+ annotation.resolutionState = STATE_DONE;
+ }));
}
- List<MetadataAnnotation> resolveMetadata(Element element,
- VariableDefinitions node) {
+ List<MetadataAnnotation> resolveMetadata(
+ Element element, VariableDefinitions node) {
List<MetadataAnnotation> metadata = <MetadataAnnotation>[];
for (Metadata annotation in node.metadata.nodes) {
ParameterMetadataAnnotation metadataAnnotation =
@@ -1129,7 +1088,7 @@
bool get hasTreeElements => _treeElements != null;
TreeElements get treeElements {
- assert(invariant(this, _treeElements !=null,
+ assert(invariant(this, _treeElements != null,
message: "TreeElements have not been computed for $this."));
return _treeElements;
}
diff --git a/pkg/compiler/lib/src/resolution/resolution_common.dart b/pkg/compiler/lib/src/resolution/resolution_common.dart
index e1e0d28..3cf5dcb 100644
--- a/pkg/compiler/lib/src/resolution/resolution_common.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_common.dart
@@ -5,21 +5,15 @@
library dart2js.resolution.common;
import '../common.dart';
-import '../common/resolution.dart' show
- Resolution;
-import '../common/tasks.dart' show
- DeferredAction;
-import '../compiler.dart' show
- Compiler;
+import '../common/resolution.dart' show Resolution;
+import '../common/tasks.dart' show DeferredAction;
+import '../compiler.dart' show Compiler;
import '../elements/elements.dart';
import '../tree/tree.dart';
-import 'registry.dart' show
- ResolutionRegistry;
-import 'scope.dart' show
- Scope;
-import 'type_resolver.dart' show
- TypeResolver;
+import 'registry.dart' show ResolutionRegistry;
+import 'scope.dart' show Scope;
+import 'type_resolver.dart' show TypeResolver;
class CommonResolverVisitor<R> extends Visitor<R> {
final Compiler compiler;
@@ -31,8 +25,8 @@
Resolution get resolution => compiler.resolution;
R visitNode(Node node) {
- return reporter.internalError(node,
- 'internal error: Unhandled node: ${node.getObjectDescription()}');
+ return reporter.internalError(
+ node, 'internal error: Unhandled node: ${node.getObjectDescription()}');
}
R visitEmptyStatement(Node node) => null;
@@ -52,8 +46,10 @@
abstract class MappingVisitor<T> extends CommonResolverVisitor<T> {
final ResolutionRegistry registry;
final TypeResolver typeResolver;
+
/// The current enclosing element for the visited AST nodes.
Element get enclosingElement;
+
/// The current scope of the visitor.
Scope get scope;
@@ -77,9 +73,9 @@
element.name == 'async' ||
element.name == 'await') {
reporter.reportErrorMessage(
- node, MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER,
- {'keyword': element.name,
- 'modifier': currentAsyncMarker});
+ node,
+ MessageKind.ASYNC_KEYWORD_AS_IDENTIFIER,
+ {'keyword': element.name, 'modifier': currentAsyncMarker});
}
}
}
@@ -93,19 +89,14 @@
registry.defineElement(node, element);
}
- void reportDuplicateDefinition(String name,
- Spannable definition,
- Spannable existing) {
+ void reportDuplicateDefinition(
+ String name, Spannable definition, Spannable existing) {
reporter.reportError(
reporter.createMessage(
- definition,
- MessageKind.DUPLICATE_DEFINITION,
- {'name': name}),
+ definition, MessageKind.DUPLICATE_DEFINITION, {'name': name}),
<DiagnosticMessage>[
- reporter.createMessage(
- existing,
- MessageKind.EXISTING_DEFINITION,
- {'name': name}),
+ reporter.createMessage(
+ existing, MessageKind.EXISTING_DEFINITION, {'name': name}),
]);
}
}
diff --git a/pkg/compiler/lib/src/resolution/resolution_result.dart b/pkg/compiler/lib/src/resolution/resolution_result.dart
index 6168025..3e36fa7 100644
--- a/pkg/compiler/lib/src/resolution/resolution_result.dart
+++ b/pkg/compiler/lib/src/resolution/resolution_result.dart
@@ -8,17 +8,9 @@
import '../dart_types.dart';
import '../elements/elements.dart';
import '../tree/tree.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../universe/call_structure.dart' show CallStructure;
-enum ResultKind {
- NONE,
- ELEMENT,
- TYPE,
- ASSERT,
- CONSTANT,
- PREFIX,
-}
+enum ResultKind { NONE, ELEMENT, TYPE, ASSERT, CONSTANT, PREFIX, }
/// The result of resolving a node.
abstract class ResolutionResult {
@@ -121,9 +113,7 @@
/// expression.
final bool isValidAsConstant;
- ArgumentsResult(
- this.callStructure,
- this.argumentResults,
+ ArgumentsResult(this.callStructure, this.argumentResults,
{this.isValidAsConstant});
/// Returns the list of [ConstantExpression]s for each of the arguments. If
diff --git a/pkg/compiler/lib/src/resolution/scope.dart b/pkg/compiler/lib/src/resolution/scope.dart
index c3785f9..41df803 100644
--- a/pkg/compiler/lib/src/resolution/scope.dart
+++ b/pkg/compiler/lib/src/resolution/scope.dart
@@ -21,7 +21,8 @@
static Scope buildEnclosingScope(Element element) {
return element.enclosingElement != null
- ? element.enclosingElement.buildScope() : element.buildScope();
+ ? element.enclosingElement.buildScope()
+ : element.buildScope();
}
}
@@ -67,8 +68,7 @@
class TypeDeclarationScope extends NestedScope {
final TypeDeclarationElement element;
- TypeDeclarationScope(parent, this.element)
- : super(parent) {
+ TypeDeclarationScope(parent, this.element) : super(parent) {
assert(parent != null);
}
@@ -88,8 +88,7 @@
Element localLookup(String name) => lookupTypeVariable(name);
- String toString() =>
- 'TypeDeclarationScope($element)';
+ String toString() => 'TypeDeclarationScope($element)';
}
abstract class MutableScope extends NestedScope {
@@ -115,8 +114,7 @@
class MethodScope extends MutableScope {
final Element element;
- MethodScope(Scope parent, this.element)
- : super(parent);
+ MethodScope(Scope parent, this.element) : super(parent);
String toString() => 'MethodScope($element${elements.keys.toList()})';
}
@@ -136,7 +134,7 @@
ClassElement get element => super.element;
ClassScope(Scope parentScope, ClassElement element)
- : super(parentScope, element) {
+ : super(parentScope, element) {
assert(parent != null);
}
diff --git a/pkg/compiler/lib/src/resolution/secret_tree_element.dart b/pkg/compiler/lib/src/resolution/secret_tree_element.dart
index c4d2029..635ffe7 100644
--- a/pkg/compiler/lib/src/resolution/secret_tree_element.dart
+++ b/pkg/compiler/lib/src/resolution/secret_tree_element.dart
@@ -31,7 +31,6 @@
///
/// This class is the superclass of all AST nodes.
abstract class NullTreeElementMixin implements TreeElementMixin, Spannable {
-
// Deliberately using [Object] here to thwart code completion.
// You're not really supposed to access this field anyways.
Object get _element => null;
diff --git a/pkg/compiler/lib/src/resolution/semantic_visitor.dart b/pkg/compiler/lib/src/resolution/semantic_visitor.dart
index 4aaba70..6f0005e 100644
--- a/pkg/compiler/lib/src/resolution/semantic_visitor.dart
+++ b/pkg/compiler/lib/src/resolution/semantic_visitor.dart
@@ -9,10 +9,8 @@
import '../dart_types.dart';
import '../tree/tree.dart';
import '../elements/elements.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
import 'operators.dart';
import 'send_resolver.dart';
@@ -78,7 +76,6 @@
/// [SemanticDeclarationVisitor] in a [Visitor].
abstract class SemanticDeclarationResolvedMixin<R, A>
implements Visitor<R>, DeclarationResolverMixin {
-
SemanticDeclarationVisitor<R, A> get declVisitor;
@override
@@ -114,8 +111,7 @@
// TODO(johnniwinther): Support argument.
A arg = null;
- computeVariableStructures(
- definitions,
+ computeVariableStructures(definitions,
(Node node, VariableStructure structure) {
if (structure == null) {
return internalError(node, 'No structure for $node');
@@ -128,9 +124,10 @@
}
abstract class SemanticVisitor<R, A> extends Visitor<R>
- with SemanticSendResolvedMixin<R, A>,
- SemanticDeclarationResolvedMixin<R, A>,
- DeclarationResolverMixin {
+ with
+ SemanticSendResolvedMixin<R, A>,
+ SemanticDeclarationResolvedMixin<R, A>,
+ DeclarationResolverMixin {
TreeElements elements;
SemanticVisitor(this.elements);
@@ -147,10 +144,7 @@
///
/// m(parameter) => parameter;
///
- R visitParameterGet(
- Send node,
- ParameterElement parameter,
- A arg);
+ R visitParameterGet(Send node, ParameterElement parameter, A arg);
/// Assignment of [rhs] to the [parameter].
///
@@ -161,10 +155,7 @@
/// }
///
R visitParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg);
+ SendSet node, ParameterElement parameter, Node rhs, A arg);
/// Assignment of [rhs] to the final [parameter].
///
@@ -175,10 +166,7 @@
/// }
///
R visitFinalParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg);
+ SendSet node, ParameterElement parameter, Node rhs, A arg);
/// Invocation of the [parameter] with [arguments].
///
@@ -188,12 +176,8 @@
/// parameter(null, 42);
/// }
///
- R visitParameterInvoke(
- Send node,
- ParameterElement parameter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitParameterInvoke(Send node, ParameterElement parameter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Read of the local [variable].
///
@@ -204,10 +188,7 @@
/// return variable;
/// }
///
- R visitLocalVariableGet(
- Send node,
- LocalVariableElement variable,
- A arg);
+ R visitLocalVariableGet(Send node, LocalVariableElement variable, A arg);
/// Assignment of [rhs] to the local [variable].
///
@@ -219,10 +200,7 @@
/// }
///
R visitLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg);
+ SendSet node, LocalVariableElement variable, Node rhs, A arg);
/// Assignment of [rhs] to the final local [variable].
///
@@ -234,10 +212,7 @@
/// }
///
R visitFinalLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg);
+ SendSet node, LocalVariableElement variable, Node rhs, A arg);
/// Invocation of the local variable [variable] with [arguments].
///
@@ -248,12 +223,8 @@
/// variable(null, 42);
/// }
///
- R visitLocalVariableInvoke(
- Send node,
- LocalVariableElement variable,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitLocalVariableInvoke(Send node, LocalVariableElement variable,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Closurization of the local [function].
///
@@ -264,10 +235,7 @@
/// return o;
/// }
///
- R visitLocalFunctionGet(
- Send node,
- LocalFunctionElement function,
- A arg);
+ R visitLocalFunctionGet(Send node, LocalFunctionElement function, A arg);
/// Assignment of [rhs] to the local [function].
///
@@ -279,10 +247,7 @@
/// }
///
R visitLocalFunctionSet(
- SendSet node,
- LocalFunctionElement function,
- Node rhs,
- A arg);
+ SendSet node, LocalFunctionElement function, Node rhs, A arg);
/// Invocation of the local [function] with [arguments].
///
@@ -293,12 +258,8 @@
/// return o(null, 42);
/// }
///
- R visitLocalFunctionInvoke(
- Send node,
- LocalFunctionElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of the local [function] with incompatible [arguments].
///
@@ -322,11 +283,7 @@
///
/// m(receiver) => receiver.foo;
///
- R visitDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg);
+ R visitDynamicPropertyGet(Send node, Node receiver, Name name, A arg);
/// Conditional (if not null) getter call on [receiver] of the property
/// defined by [selector].
@@ -336,10 +293,7 @@
/// m(receiver) => receiver?.foo;
///
R visitIfNotNullDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg);
+ Send node, Node receiver, Name name, A arg);
/// Setter call on [receiver] with argument [rhs] of the property defined by
/// [selector].
@@ -351,11 +305,7 @@
/// }
///
R visitDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg);
+ SendSet node, Node receiver, Name name, Node rhs, A arg);
/// Conditional (if not null) setter call on [receiver] with argument [rhs] of
/// the property defined by [selector].
@@ -367,11 +317,7 @@
/// }
///
R visitIfNotNullDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg);
+ SendSet node, Node receiver, Name name, Node rhs, A arg);
/// Invocation of the property defined by [selector] on [receiver] with
/// [arguments].
@@ -383,11 +329,7 @@
/// }
///
R visitDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg);
/// Conditinal invocation of the property defined by [selector] on [receiver]
/// with [arguments], if [receiver] is not null.
@@ -399,11 +341,7 @@
/// }
///
R visitIfNotNullDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg);
/// Getter call on `this` of the property defined by [selector].
///
@@ -419,10 +357,7 @@
/// m() => foo;
/// }
///
- R visitThisPropertyGet(
- Send node,
- Name name,
- A arg);
+ R visitThisPropertyGet(Send node, Name name, A arg);
/// Setter call on `this` with argument [rhs] of the property defined by
/// [selector].
@@ -439,11 +374,7 @@
/// m() { foo = rhs; }
/// }
///
- R visitThisPropertySet(
- SendSet node,
- Name name,
- Node rhs,
- A arg);
+ R visitThisPropertySet(SendSet node, Name name, Node rhs, A arg);
/// Invocation of the property defined by [selector] on `this` with
/// [arguments].
@@ -462,10 +393,7 @@
///
///
R visitThisPropertyInvoke(
- Send node,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, NodeList arguments, Selector selector, A arg);
/// Read of `this`.
///
@@ -475,9 +403,7 @@
/// m() => this;
/// }
///
- R visitThisGet(
- Identifier node,
- A arg);
+ R visitThisGet(Identifier node, A arg);
/// Invocation of `this` with [arguments].
///
@@ -488,11 +414,7 @@
/// }
///
R visitThisInvoke(
- Send node,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
-
+ Send node, NodeList arguments, CallStructure callStructure, A arg);
/// Read of the super [field].
///
@@ -505,10 +427,7 @@
/// m() => super.foo;
/// }
///
- R visitSuperFieldGet(
- Send node,
- FieldElement field,
- A arg);
+ R visitSuperFieldGet(Send node, FieldElement field, A arg);
/// Assignment of [rhs] to the super [field].
///
@@ -521,11 +440,7 @@
/// m() { super.foo = rhs; }
/// }
///
- R visitSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg);
/// Assignment of [rhs] to the final static [field].
///
@@ -538,11 +453,7 @@
/// m() { super.foo = rhs; }
/// }
///
- R visitFinalSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitFinalSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg);
/// Invocation of the super [field] with [arguments].
///
@@ -555,12 +466,8 @@
/// m() { super.foo(null, 42); }
/// }
///
- R visitSuperFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg);
/// Closurization of the super [method].
///
@@ -573,10 +480,7 @@
/// m() => super.foo;
/// }
///
- R visitSuperMethodGet(
- Send node,
- MethodElement method,
- A arg);
+ R visitSuperMethodGet(Send node, MethodElement method, A arg);
/// Invocation of the super [method] with [arguments].
///
@@ -589,12 +493,8 @@
/// m() { super.foo(null, 42); }
/// }
///
- R visitSuperMethodInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments,
+ CallStructure callStructure, A arg);
/// Invocation of the super [method] with incompatible [arguments].
///
@@ -607,12 +507,8 @@
/// m() { super.foo(null); } // One argument missing.
/// }
///
- R visitSuperMethodIncompatibleInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the super [method].
///
@@ -625,11 +521,7 @@
/// m() { super.foo = rhs; }
/// }
///
- R visitSuperMethodSet(
- Send node,
- MethodElement method,
- Node rhs,
- A arg);
+ R visitSuperMethodSet(Send node, MethodElement method, Node rhs, A arg);
/// Getter call to the super [getter].
///
@@ -642,10 +534,7 @@
/// m() => super.foo;
/// }
///
- R visitSuperGetterGet(
- Send node,
- FunctionElement getter,
- A arg);
+ R visitSuperGetterGet(Send node, FunctionElement getter, A arg);
/// Getter call the super [setter].
///
@@ -658,10 +547,7 @@
/// m() => super.foo;
/// }
///
- R visitSuperSetterGet(
- Send node,
- FunctionElement setter,
- A arg);
+ R visitSuperSetterGet(Send node, FunctionElement setter, A arg);
/// Setter call to the super [setter].
///
@@ -674,11 +560,7 @@
/// m() { super.foo = rhs; }
/// }
///
- R visitSuperSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, A arg);
/// Assignment of [rhs] to the super [getter].
///
@@ -691,11 +573,7 @@
/// m() { super.foo = rhs; }
/// }
///
- R visitSuperGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg);
+ R visitSuperGetterSet(SendSet node, FunctionElement getter, Node rhs, A arg);
/// Invocation of the super [getter] with [arguments].
///
@@ -708,12 +586,8 @@
/// m() { super.foo(null, 42; }
/// }
///
- R visitSuperGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitSuperGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of the super [setter] with [arguments].
///
@@ -726,12 +600,8 @@
/// m() { super.foo(null, 42; }
/// }
///
- R visitSuperSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitSuperSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of a [expression] with [arguments].
///
@@ -739,12 +609,8 @@
///
/// m() => (a, b){}(null, 42);
///
- R visitExpressionInvoke(
- Send node,
- Node expression,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitExpressionInvoke(Send node, Node expression, NodeList arguments,
+ CallStructure callStructure, A arg);
/// Read of the static [field].
///
@@ -755,10 +621,7 @@
/// }
/// m() => C.foo;
///
- R visitStaticFieldGet(
- Send node,
- FieldElement field,
- A arg);
+ R visitStaticFieldGet(Send node, FieldElement field, A arg);
/// Assignment of [rhs] to the static [field].
///
@@ -769,11 +632,7 @@
/// }
/// m() { C.foo = rhs; }
///
- R visitStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, A arg);
/// Assignment of [rhs] to the final static [field].
///
@@ -784,11 +643,7 @@
/// }
/// m() { C.foo = rhs; }
///
- R visitFinalStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitFinalStaticFieldSet(SendSet node, FieldElement field, Node rhs, A arg);
/// Invocation of the static [field] with [arguments].
///
@@ -799,12 +654,8 @@
/// }
/// m() { C.foo(null, 42); }
///
- R visitStaticFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg);
/// Closurization of the static [function].
///
@@ -815,10 +666,7 @@
/// }
/// m() => C.foo;
///
- R visitStaticFunctionGet(
- Send node,
- MethodElement function,
- A arg);
+ R visitStaticFunctionGet(Send node, MethodElement function, A arg);
/// Invocation of the static [function] with [arguments].
///
@@ -829,12 +677,8 @@
/// }
/// m() { C.foo(null, 42); }
///
- R visitStaticFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitStaticFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of the static [function] with incompatible [arguments].
///
@@ -845,12 +689,8 @@
/// }
/// m() { C.foo(null); }
///
- R visitStaticFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the static [function].
///
@@ -861,11 +701,7 @@
/// }
/// m() { C.foo = rhs; }
///
- R visitStaticFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg);
+ R visitStaticFunctionSet(Send node, MethodElement function, Node rhs, A arg);
/// Getter call to the static [getter].
///
@@ -876,10 +712,7 @@
/// }
/// m() => C.foo;
///
- R visitStaticGetterGet(
- Send node,
- FunctionElement getter,
- A arg);
+ R visitStaticGetterGet(Send node, FunctionElement getter, A arg);
/// Getter call the static [setter].
///
@@ -890,10 +723,7 @@
/// }
/// m() => C.foo;
///
- R visitStaticSetterGet(
- Send node,
- FunctionElement setter,
- A arg);
+ R visitStaticSetterGet(Send node, FunctionElement setter, A arg);
/// Setter call to the static [setter].
///
@@ -904,11 +734,7 @@
/// }
/// m() { C.foo = rhs; }
///
- R visitStaticSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitStaticSetterSet(SendSet node, FunctionElement setter, Node rhs, A arg);
/// Assignment of [rhs] to the static [getter].
///
@@ -919,11 +745,7 @@
/// }
/// m() { C.foo = rhs; }
///
- R visitStaticGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg);
+ R visitStaticGetterSet(SendSet node, FunctionElement getter, Node rhs, A arg);
/// Invocation of the static [getter] with [arguments].
///
@@ -934,12 +756,8 @@
/// }
/// m() { C.foo(null, 42; }
///
- R visitStaticGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitStaticGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of the static [setter] with [arguments].
///
@@ -950,12 +768,8 @@
/// }
/// m() { C.foo(null, 42; }
///
- R visitStaticSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitStaticSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Read of the top level [field].
///
@@ -964,10 +778,7 @@
/// var foo;
/// m() => foo;
///
- R visitTopLevelFieldGet(
- Send node,
- FieldElement field,
- A arg);
+ R visitTopLevelFieldGet(Send node, FieldElement field, A arg);
/// Assignment of [rhs] to the top level [field].
///
@@ -976,11 +787,7 @@
/// var foo;
/// m() { foo = rhs; }
///
- R visitTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, A arg);
/// Assignment of [rhs] to the final top level [field].
///
@@ -990,10 +797,7 @@
/// m() { foo = rhs; }
///
R visitFinalTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ SendSet node, FieldElement field, Node rhs, A arg);
/// Invocation of the top level [field] with [arguments].
///
@@ -1002,12 +806,8 @@
/// var foo;
/// m() { foo(null, 42); }
///
- R visitTopLevelFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg);
/// Closurization of the top level [function].
///
@@ -1016,10 +816,7 @@
/// foo(a, b) {};
/// m() => foo;
///
- R visitTopLevelFunctionGet(
- Send node,
- MethodElement function,
- A arg);
+ R visitTopLevelFunctionGet(Send node, MethodElement function, A arg);
/// Invocation of the top level [function] with [arguments].
///
@@ -1028,12 +825,8 @@
/// foo(a, b) {};
/// m() { foo(null, 42); }
///
- R visitTopLevelFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTopLevelFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of the top level [function] with incompatible [arguments].
///
@@ -1044,12 +837,8 @@
/// }
/// m() { C.foo(null); }
///
- R visitTopLevelFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTopLevelFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the top level [function].
///
@@ -1059,10 +848,7 @@
/// m() { foo = rhs; }
///
R visitTopLevelFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg);
+ Send node, MethodElement function, Node rhs, A arg);
/// Getter call to the top level [getter].
///
@@ -1071,10 +857,7 @@
/// get foo => null;
/// m() => foo;
///
- R visitTopLevelGetterGet(
- Send node,
- FunctionElement getter,
- A arg);
+ R visitTopLevelGetterGet(Send node, FunctionElement getter, A arg);
/// Getter call the top level [setter].
///
@@ -1083,10 +866,7 @@
/// set foo(_) {}
/// m() => foo;
///
- R visitTopLevelSetterGet(
- Send node,
- FunctionElement setter,
- A arg);
+ R visitTopLevelSetterGet(Send node, FunctionElement setter, A arg);
/// Setter call to the top level [setter].
///
@@ -1096,10 +876,7 @@
/// m() { foo = rhs; }
///
R visitTopLevelSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg);
+ SendSet node, FunctionElement setter, Node rhs, A arg);
/// Assignment of [rhs] to the top level [getter].
///
@@ -1109,10 +886,7 @@
/// m() { foo = rhs; }
///
R visitTopLevelGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg);
+ SendSet node, FunctionElement getter, Node rhs, A arg);
/// Invocation of the top level [getter] with [arguments].
///
@@ -1121,12 +895,8 @@
/// get foo => null;
/// m() { foo(null, 42); }
///
- R visitTopLevelGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTopLevelGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of the top level [setter] with [arguments].
///
@@ -1135,12 +905,8 @@
/// set foo(_) {};
/// m() { foo(null, 42); }
///
- R visitTopLevelSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTopLevelSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Read of the type literal for class [element].
///
@@ -1149,10 +915,7 @@
/// class C {}
/// m() => C;
///
- R visitClassTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg);
+ R visitClassTypeLiteralGet(Send node, ConstantExpression constant, A arg);
/// Invocation of the type literal for class [element] with [arguments].
///
@@ -1161,12 +924,8 @@
/// class C {}
/// m() => C(null, 42);
///
- R visitClassTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the type literal for class [element].
///
@@ -1176,10 +935,7 @@
/// m() { C = rhs; }
///
R visitClassTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ SendSet node, ConstantExpression constant, Node rhs, A arg);
/// Read of the type literal for typedef [element].
///
@@ -1188,10 +944,7 @@
/// typedef F();
/// m() => F;
///
- R visitTypedefTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg);
+ R visitTypedefTypeLiteralGet(Send node, ConstantExpression constant, A arg);
/// Invocation of the type literal for typedef [element] with [arguments].
///
@@ -1200,12 +953,8 @@
/// typedef F();
/// m() => F(null, 42);
///
- R visitTypedefTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the type literal for typedef [element].
///
@@ -1215,10 +964,7 @@
/// m() { F = rhs; }
///
R visitTypedefTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ SendSet node, ConstantExpression constant, Node rhs, A arg);
/// Read of the type literal for type variable [element].
///
@@ -1229,9 +975,7 @@
/// }
///
R visitTypeVariableTypeLiteralGet(
- Send node,
- TypeVariableElement element,
- A arg);
+ Send node, TypeVariableElement element, A arg);
/// Invocation of the type literal for type variable [element] with
/// [arguments].
@@ -1242,12 +986,8 @@
/// m() { T(null, 42); }
/// }
///
- R visitTypeVariableTypeLiteralInvoke(
- Send node,
- TypeVariableElement element,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the type literal for type variable [element].
///
@@ -1258,10 +998,7 @@
/// }
///
R visitTypeVariableTypeLiteralSet(
- SendSet node,
- TypeVariableElement element,
- Node rhs,
- A arg);
+ SendSet node, TypeVariableElement element, Node rhs, A arg);
/// Read of the type literal for `dynamic`.
///
@@ -1269,10 +1006,7 @@
///
/// m() => dynamic;
///
- R visitDynamicTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg);
+ R visitDynamicTypeLiteralGet(Send node, ConstantExpression constant, A arg);
/// Invocation of the type literal for `dynamic` with [arguments].
///
@@ -1280,12 +1014,8 @@
///
/// m() { dynamic(null, 42); }
///
- R visitDynamicTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Assignment of [rhs] to the type literal for `dynamic`.
///
@@ -1294,10 +1024,7 @@
/// m() { dynamic = rhs; }
///
R visitDynamicTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ SendSet node, ConstantExpression constant, Node rhs, A arg);
/// Binary expression `left operator right` where [operator] is a user
/// definable operator. Binary expressions using operator `==` are handled
@@ -1310,11 +1037,7 @@
/// mul(a, b) => a * b;
///
R visitBinary(
- Send node,
- Node left,
- BinaryOperator operator,
- Node right,
- A arg);
+ Send node, Node left, BinaryOperator operator, Node right, A arg);
/// Binary expression `super operator argument` where [operator] is a user
/// definable operator implemented on a superclass by [function]. Binary
@@ -1329,12 +1052,8 @@
/// m(a) => super + a;
/// }
///
- R visitSuperBinary(
- Send node,
- FunctionElement function,
- BinaryOperator operator,
- Node argument,
- A arg);
+ R visitSuperBinary(Send node, FunctionElement function,
+ BinaryOperator operator, Node argument, A arg);
/// Binary operation on the unresolved super [element].
///
@@ -1346,12 +1065,8 @@
/// m() => super + 42;
/// }
///
- R visitUnresolvedSuperBinary(
- Send node,
- Element element,
- BinaryOperator operator,
- Node argument,
- A arg);
+ R visitUnresolvedSuperBinary(Send node, Element element,
+ BinaryOperator operator, Node argument, A arg);
/// Index expression `receiver[index]`.
///
@@ -1359,11 +1074,7 @@
///
/// lookup(a, b) => a[b];
///
- R visitIndex(
- Send node,
- Node receiver,
- Node index,
- A arg);
+ R visitIndex(Send node, Node receiver, Node index, A arg);
/// Prefix operation on an index expression `operator receiver[index]` where
/// the operation is defined by [operator].
@@ -1373,11 +1084,7 @@
/// lookup(a, b) => --a[b];
///
R visitIndexPrefix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg);
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg);
/// Postfix operation on an index expression `receiver[index] operator` where
/// the operation is defined by [operator].
@@ -1387,11 +1094,7 @@
/// lookup(a, b) => a[b]++;
///
R visitIndexPostfix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg);
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg);
/// Index expression `super[index]` where 'operator []' is implemented on a
/// superclass by [function].
@@ -1405,11 +1108,7 @@
/// m(a) => super[a];
/// }
///
- R visitSuperIndex(
- Send node,
- FunctionElement function,
- Node index,
- A arg);
+ R visitSuperIndex(Send node, FunctionElement function, Node index, A arg);
/// Index expression `super[index]` where 'operator []' is unresolved.
///
@@ -1420,11 +1119,7 @@
/// m(a) => super[a];
/// }
///
- R visitUnresolvedSuperIndex(
- Send node,
- Element element,
- Node index,
- A arg);
+ R visitUnresolvedSuperIndex(Send node, Element element, Node index, A arg);
/// Prefix operation on an index expression `operator super[index]` where
/// 'operator []' is implemented on a superclass by [indexFunction] and
@@ -1485,13 +1180,8 @@
/// m(a) => --super[a];
/// }
///
- R visitUnresolvedSuperGetterIndexPrefix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg);
/// Postfix operation on an index expression `super[index] operator` where
/// 'operator []' is unresolved, 'operator []=' is defined by [setter], and
@@ -1506,13 +1196,8 @@
/// m(a) => super[a]++;
/// }
///
- R visitUnresolvedSuperGetterIndexPostfix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg);
/// Prefix operation on an index expression `operator super[index]` where
/// 'operator []' is implemented on a superclass by [indexFunction] and
@@ -1570,11 +1255,7 @@
/// }
///
R visitUnresolvedSuperIndexPrefix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg);
+ Send node, Element element, Node index, IncDecOperator operator, A arg);
/// Postfix operation on an index expression `super[index] operator` where
/// both 'operator []' and 'operator []=' are unresolved and the operation is
@@ -1590,11 +1271,7 @@
/// }
///
R visitUnresolvedSuperIndexPostfix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg);
+ Send node, Element element, Node index, IncDecOperator operator, A arg);
/// Binary expression `left == right`.
///
@@ -1602,11 +1279,7 @@
///
/// neq(a, b) => a != b;
///
- R visitNotEquals(
- Send node,
- Node left,
- Node right,
- A arg);
+ R visitNotEquals(Send node, Node left, Node right, A arg);
/// Binary expression `super != argument` where `==` is implemented on a
/// superclass by [function].
@@ -1621,10 +1294,7 @@
/// }
///
R visitSuperNotEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg);
+ Send node, FunctionElement function, Node argument, A arg);
/// Binary expression `left == right`.
///
@@ -1632,11 +1302,7 @@
///
/// eq(a, b) => a == b;
///
- R visitEquals(
- Send node,
- Node left,
- Node right,
- A arg);
+ R visitEquals(Send node, Node left, Node right, A arg);
/// Binary expression `super == argument` where `==` is implemented on a
/// superclass by [function].
@@ -1650,11 +1316,7 @@
/// m(a) => super == a;
/// }
///
- R visitSuperEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg);
+ R visitSuperEquals(Send node, FunctionElement function, Node argument, A arg);
/// Unary expression `operator expression` where [operator] is a user
/// definable operator.
@@ -1664,11 +1326,7 @@
/// neg(a, b) => -a;
/// comp(a, b) => ~a;
///
- R visitUnary(
- Send node,
- UnaryOperator operator,
- Node expression,
- A arg);
+ R visitUnary(Send node, UnaryOperator operator, Node expression, A arg);
/// Unary expression `operator super` where [operator] is a user definable
/// operator implemented on a superclass by [function].
@@ -1683,10 +1341,7 @@
/// }
///
R visitSuperUnary(
- Send node,
- UnaryOperator operator,
- FunctionElement function,
- A arg);
+ Send node, UnaryOperator operator, FunctionElement function, A arg);
/// Unary operation on the unresolved super [element].
///
@@ -1699,10 +1354,7 @@
/// }
///
R visitUnresolvedSuperUnary(
- Send node,
- UnaryOperator operator,
- Element element,
- A arg);
+ Send node, UnaryOperator operator, Element element, A arg);
/// Unary expression `!expression`.
///
@@ -1710,10 +1362,7 @@
///
/// not(a) => !a;
///
- R visitNot(
- Send node,
- Node expression,
- A arg);
+ R visitNot(Send node, Node expression, A arg);
/// Index set expression `receiver[index] = rhs`.
///
@@ -1721,12 +1370,7 @@
///
/// m(receiver, index, rhs) => receiver[index] = rhs;
///
- R visitIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- Node rhs,
- A arg);
+ R visitIndexSet(SendSet node, Node receiver, Node index, Node rhs, A arg);
/// Index set expression `super[index] = rhs` where `operator []=` is defined
/// on a superclass by [function].
@@ -1741,11 +1385,7 @@
/// }
///
R visitSuperIndexSet(
- SendSet node,
- FunctionElement function,
- Node index,
- Node rhs,
- A arg);
+ SendSet node, FunctionElement function, Node index, Node rhs, A arg);
/// Index set expression `super[index] = rhs` where `operator []=` is
/// undefined.
@@ -1759,11 +1399,7 @@
/// }
///
R visitUnresolvedSuperIndexSet(
- Send node,
- Element element,
- Node index,
- Node rhs,
- A arg);
+ Send node, Element element, Node index, Node rhs, A arg);
/// If-null, ??, expression with operands [left] and [right].
///
@@ -1771,11 +1407,7 @@
///
/// m() => left ?? right;
///
- R visitIfNull(
- Send node,
- Node left,
- Node right,
- A arg);
+ R visitIfNull(Send node, Node left, Node right, A arg);
/// Logical and, &&, expression with operands [left] and [right].
///
@@ -1783,11 +1415,7 @@
///
/// m() => left && right;
///
- R visitLogicalAnd(
- Send node,
- Node left,
- Node right,
- A arg);
+ R visitLogicalAnd(Send node, Node left, Node right, A arg);
/// Logical or, ||, expression with operands [left] and [right].
///
@@ -1795,11 +1423,7 @@
///
/// m() => left || right;
///
- R visitLogicalOr(
- Send node,
- Node left,
- Node right,
- A arg);
+ R visitLogicalOr(Send node, Node left, Node right, A arg);
/// Is test of [expression] against [type].
///
@@ -1808,11 +1432,7 @@
/// class C {}
/// m() => expression is C;
///
- R visitIs(
- Send node,
- Node expression,
- DartType type,
- A arg);
+ R visitIs(Send node, Node expression, DartType type, A arg);
/// Is not test of [expression] against [type].
///
@@ -1821,11 +1441,7 @@
/// class C {}
/// m() => expression is! C;
///
- R visitIsNot(
- Send node,
- Node expression,
- DartType type,
- A arg);
+ R visitIsNot(Send node, Node expression, DartType type, A arg);
/// As cast of [expression] to [type].
///
@@ -1834,11 +1450,7 @@
/// class C {}
/// m() => expression as C;
///
- R visitAs(
- Send node,
- Node expression,
- DartType type,
- A arg);
+ R visitAs(Send node, Node expression, DartType type, A arg);
/// Compound assignment expression of [rhs] with [operator] of the property on
/// [receiver] whose getter and setter are defined by [getterSelector] and
@@ -1848,13 +1460,8 @@
///
/// m(receiver, rhs) => receiver.foo += rhs;
///
- R visitDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] of the property on
/// a possibly null [receiver] whose getter and setter are defined by
@@ -1864,13 +1471,8 @@
///
/// m(receiver, rhs) => receiver?.foo += rhs;
///
- R visitIfNotNullDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitIfNotNullDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] of the property on
/// `this` whose getter and setter are defined by [getterSelector] and
@@ -1889,11 +1491,7 @@
/// }
///
R visitThisPropertyCompound(
- Send node,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ Send node, Name name, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a [parameter].
///
@@ -1901,12 +1499,8 @@
///
/// m(parameter, rhs) => parameter += rhs;
///
- R visitParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a final
/// [parameter].
@@ -1915,12 +1509,8 @@
///
/// m(final parameter, rhs) => parameter += rhs;
///
- R visitFinalParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitFinalParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a local
/// [variable].
@@ -1932,12 +1522,8 @@
/// variable += rhs;
/// }
///
- R visitLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a final local
/// [variable].
@@ -1949,12 +1535,8 @@
/// variable += rhs;
/// }
///
- R visitFinalLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a local
/// [function].
@@ -1966,12 +1548,8 @@
/// function += rhs;
/// }
///
- R visitLocalFunctionCompound(
- Send node,
- LocalFunctionElement function,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitLocalFunctionCompound(Send node, LocalFunctionElement function,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a static
/// [field].
@@ -1983,12 +1561,8 @@
/// m(rhs) => field += rhs;
/// }
///
- R visitStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a final static
/// [field].
@@ -2000,12 +1574,8 @@
/// m(rhs) => field += rhs;
/// }
///
- R visitFinalStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitFinalStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// static [getter] and writing to a static [setter].
@@ -2018,13 +1588,8 @@
/// m(rhs) => o += rhs;
/// }
///
- R visitStaticGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitStaticGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// static [method], that is, closurizing [method], and writing to a static
@@ -2038,13 +1603,8 @@
/// m(rhs) => o += rhs;
/// }
///
- R visitStaticMethodSetterCompound(
- Send node,
- MethodElement method,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitStaticMethodSetterCompound(Send node, MethodElement method,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a top level
/// [field].
@@ -2054,12 +1614,8 @@
/// var field;
/// m(rhs) => field += rhs;
///
- R visitTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a final top
/// level [field].
@@ -2069,12 +1625,8 @@
/// final field = 0;
/// m(rhs) => field += rhs;
///
- R visitFinalTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitFinalTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// top level [getter] and writing to a top level [setter].
@@ -2085,13 +1637,8 @@
/// set o(_) {}
/// m(rhs) => o += rhs;
///
- R visitTopLevelGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// top level [method], that is, closurizing [method], and writing to a top
@@ -2103,13 +1650,8 @@
/// set o(_) {}
/// m(rhs) => o += rhs;
///
- R visitTopLevelMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// top level [method], that is, closurizing [method], and writing to an
@@ -2120,12 +1662,8 @@
/// o() {}
/// m(rhs) => o += rhs;
///
- R visitTopLevelMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitTopLevelMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a super
/// [field].
@@ -2139,12 +1677,8 @@
/// m(rhs) => super.field += rhs;
/// }
///
- R visitSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a final super
/// [field].
@@ -2158,12 +1692,8 @@
/// m(rhs) => super.field += rhs;
/// }
///
- R visitFinalSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitFinalSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the [name] property on
/// [receiver]. That is, [rhs] is only evaluated and assigned, if the value
@@ -2174,11 +1704,7 @@
/// m(receiver, rhs) => receiver.foo ??= rhs;
///
R visitDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg);
+ Send node, Node receiver, Name name, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the [name] property on
/// [receiver] if not null. That is, [rhs] is only evaluated and assigned,
@@ -2190,11 +1716,7 @@
/// m(receiver, rhs) => receiver?.foo ??= rhs;
///
R visitIfNotNullDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg);
+ Send node, Node receiver, Name name, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the [name] property on `this`.
/// That is, [rhs] is only evaluated and assigned, if the value of [name] on
@@ -2212,11 +1734,7 @@
/// m(rhs) => foo ??= rhs;
/// }
///
- R visitThisPropertySetIfNull(
- Send node,
- Name name,
- Node rhs,
- A arg);
+ R visitThisPropertySetIfNull(Send node, Name name, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [parameter]. That is, [rhs] is
/// only evaluated and assigned, if the value of the [parameter] is `null`.
@@ -2226,10 +1744,7 @@
/// m(parameter, rhs) => parameter ??= rhs;
///
R visitParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg);
+ Send node, ParameterElement parameter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the final [parameter]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [parameter] is
@@ -2240,10 +1755,7 @@
/// m(final parameter, rhs) => parameter ??= rhs;
///
R visitFinalParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg);
+ Send node, ParameterElement parameter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the local [variable]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [variable] is
@@ -2257,10 +1769,7 @@
/// }
///
R visitLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg);
+ Send node, LocalVariableElement variable, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the final local [variable]. That
/// is, [rhs] is only evaluated and assigned, if the value of the [variable]
@@ -2274,10 +1783,7 @@
/// }
///
R visitFinalLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg);
+ Send node, LocalVariableElement variable, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the local [function]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [function] is
@@ -2291,10 +1797,7 @@
/// }
///
R visitLocalFunctionSetIfNull(
- Send node,
- LocalFunctionElement function,
- Node rhs,
- A arg);
+ Send node, LocalFunctionElement function, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the static [field]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [field] is
@@ -2307,11 +1810,7 @@
/// m(rhs) => field ??= rhs;
/// }
///
- R visitStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitStaticFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the final static [field]. That
/// is, [rhs] is only evaluated and assigned, if the value of the [field] is
@@ -2325,10 +1824,7 @@
/// }
///
R visitFinalStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg);
+ Send node, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the static property defined by
/// [getter] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2342,12 +1838,8 @@
/// m(rhs) => o ??= rhs;
/// }
///
- R visitStaticGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitStaticGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the static property defined by
/// [method] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2363,11 +1855,7 @@
/// }
///
R visitStaticMethodSetterSetIfNull(
- Send node,
- MethodElement method,
- MethodElement setter,
- Node rhs,
- A arg);
+ Send node, MethodElement method, MethodElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the static [method]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [method] is
@@ -2379,10 +1867,7 @@
/// m(rhs) => o ??= rhs;
///
R visitStaticMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg);
+ Send node, FunctionElement method, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level [field]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [field] is
@@ -2393,11 +1878,7 @@
/// var field;
/// m(rhs) => field ??= rhs;
///
- R visitTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitTopLevelFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the final top level [field].
/// That is, [rhs] is only evaluated and assigned, if the value of the [field]
@@ -2409,10 +1890,7 @@
/// m(rhs) => field ??= rhs;
///
R visitFinalTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg);
+ Send node, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level property defined
/// by [getter] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2424,12 +1902,8 @@
/// set o(_) {}
/// m(rhs) => o ??= rhs;
///
- R visitTopLevelGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level property defined
/// by [method] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2442,12 +1916,8 @@
/// set o(_) {}
/// m(rhs) => o ??= rhs;
///
- R visitTopLevelMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level [method]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [method] is
@@ -2459,10 +1929,7 @@
/// m(rhs) => o ??= rhs;
///
R visitTopLevelMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg);
+ Send node, FunctionElement method, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super [field]. That is,
/// [rhs] is only evaluated and assigned, if the value of the [field] is
@@ -2477,11 +1944,7 @@
/// m(rhs) => super.field ??= rhs;
/// }
///
- R visitSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg);
+ R visitSuperFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the final super [field]. That
/// is, [rhs] is only evaluated and assigned, if the value of the [field] is
@@ -2497,10 +1960,7 @@
/// }
///
R visitFinalSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg);
+ Send node, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super property defined
/// by [readField] and [writtenField]. That is, [rhs] is only evaluated and
@@ -2518,12 +1978,8 @@
/// m() => super.field ??= rhs;
/// }
///
- R visitSuperFieldFieldSetIfNull(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- Node rhs,
- A arg);
+ R visitSuperFieldFieldSetIfNull(Send node, FieldElement readField,
+ FieldElement writtenField, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super property defined
/// by [getter] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2539,12 +1995,8 @@
/// m(rhs) => super.o ??= rhs;
/// }
///
- R visitSuperGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super property defined
/// by [method] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2561,12 +2013,8 @@
/// m(rhs) => super.o ??= rhs;
/// }
///
- R visitSuperMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg);
+ R visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super [method].
/// That is, [rhs] is only evaluated and assigned, if the value of
@@ -2583,10 +2031,7 @@
/// }
///
R visitSuperMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg);
+ Send node, FunctionElement method, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super property defined
/// by [setter] with no corresponding getter. That is, [rhs] is only evaluated
@@ -2603,11 +2048,7 @@
/// }
///
R visitUnresolvedSuperGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg);
+ Send node, Element element, MethodElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the super property defined
/// by [getter] with no corresponding setter. That is, [rhs] is only evaluated
@@ -2624,11 +2065,7 @@
/// }
///
R visitUnresolvedSuperSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg);
+ Send node, MethodElement getter, Element element, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level property defined
/// by [field] and [setter]. That is, [rhs] is only evaluated and assigned to
@@ -2647,11 +2084,7 @@
/// }
///
R visitSuperFieldSetterSetIfNull(
- Send node,
- FieldElement field,
- FunctionElement setter,
- Node rhs,
- A arg);
+ Send node, FieldElement field, FunctionElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level property defined
/// by [getter] and [field]. That is, [rhs] is only evaluated and assigned to
@@ -2670,11 +2103,7 @@
/// }
///
R visitSuperGetterFieldSetIfNull(
- Send node,
- FunctionElement getter,
- FieldElement field,
- Node rhs,
- A arg);
+ Send node, FunctionElement getter, FieldElement field, Node rhs, A arg);
/// If-null assignment expression of [rhs] to an unresolved super property.
/// That is, [rhs] is only evaluated and assigned, if the value of the
@@ -2689,11 +2118,7 @@
/// m(rhs) => super.unresolved ??= rhs;
/// }
///
- R visitUnresolvedSuperSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperSetIfNull(Send node, Element element, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the static property defined
/// by [setter] with no corresponding getter. That is, [rhs] is only evaluated
@@ -2709,11 +2134,7 @@
/// m1() => C.foo ??= 42;
///
R visitUnresolvedStaticGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg);
+ Send node, Element element, MethodElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level property defined
/// by [setter] with no corresponding getter. That is, [rhs] is only evaluated
@@ -2726,11 +2147,7 @@
/// m1() => foo ??= 42;
///
R visitUnresolvedTopLevelGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg);
+ Send node, Element element, MethodElement setter, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the static property defined
/// by [getter] with no corresponding setter. That is, [rhs] is only evaluated
@@ -2745,11 +2162,7 @@
/// m1() => C.foo ??= 42;
///
R visitUnresolvedStaticSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg);
+ Send node, MethodElement getter, Element element, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the top level property defined
/// by [getter] with no corresponding setter. That is, [rhs] is only evaluated
@@ -2762,11 +2175,7 @@
/// m1() => foo ??= 42;
///
R visitUnresolvedTopLevelSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg);
+ Send node, MethodElement getter, Element element, Node rhs, A arg);
/// If-null assignment expression of [rhs] to an unresolved property.
/// That is, [rhs] is only evaluated and assigned, if the value of the
@@ -2780,11 +2189,7 @@
/// m2() => C.unresolved ??= 42;
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
- R visitUnresolvedSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg);
+ R visitUnresolvedSetIfNull(Send node, Element element, Node rhs, A arg);
/// If-null assignment expression of [rhs] to an invalid expression.
///
@@ -2794,11 +2199,7 @@
///
/// m() => p ??= 42;
///
- R errorInvalidSetIfNull(
- Send node,
- ErroneousElement error,
- Node rhs,
- A arg);
+ R errorInvalidSetIfNull(Send node, ErroneousElement error, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the class type literal
/// [contant]. That is, [rhs] is only evaluated and assigned, if the value
@@ -2811,10 +2212,7 @@
/// m(rhs) => C ??= rhs;
///
R visitClassTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ Send node, ConstantExpression constant, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the typedef type literal
/// [constant]. That is, [rhs] is only evaluated and assigned, if the value
@@ -2827,10 +2225,7 @@
/// m(rhs) => F ??= rhs;
///
R visitTypedefTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ Send node, ConstantExpression constant, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the type literal for the type
/// variable [element]. That is, [rhs] is only evaluated and assigned, if
@@ -2844,10 +2239,7 @@
/// }
///
R visitTypeVariableTypeLiteralSetIfNull(
- Send node,
- TypeVariableElement element,
- Node rhs,
- A arg);
+ Send node, TypeVariableElement element, Node rhs, A arg);
/// If-null assignment expression of [rhs] to the dynamic type literal
/// [constant]. That is, [rhs] is only evaluated and assigned, if the value
@@ -2859,10 +2251,7 @@
/// m(rhs) => dynamic ??= rhs;
///
R visitDynamicTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ Send node, ConstantExpression constant, Node rhs, A arg);
/// Prefix expression with [operator] on a final super [field].
///
@@ -2876,10 +2265,7 @@
/// }
///
R visitFinalSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on an unresolved super property.
///
@@ -2892,10 +2278,7 @@
/// }
///
R visitUnresolvedSuperPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg);
+ Send node, Element element, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on an unresolved super property.
///
@@ -2908,10 +2291,7 @@
/// }
///
R visitUnresolvedSuperPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg);
+ Send node, Element element, IncDecOperator operator, A arg);
/// Compound assignment expression of [rhs] with [operator] on an unresolved
/// super property.
@@ -2925,11 +2305,7 @@
/// }
///
R visitUnresolvedSuperCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ Send node, Element element, AssignmentOperator operator, Node rhs, A arg);
/// Postfix expression with [operator] on a final super [field].
///
@@ -2943,10 +2319,7 @@
/// }
///
R visitFinalSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from the
/// super field [readField] and writing to the different super field
@@ -2964,13 +2337,8 @@
/// m() => super.field += rhs;
/// }
///
- R visitSuperFieldFieldCompound(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperFieldFieldCompound(Send node, FieldElement readField,
+ FieldElement writtenField, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// super [getter] and writing to a super [setter].
@@ -2985,13 +2353,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitSuperGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// super [method], that is, closurizing [method], and writing to a super
@@ -3007,13 +2370,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitSuperMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading the
/// closurized super [method] and trying to invoke the non-existing setter.
@@ -3027,12 +2385,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitSuperMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from the
/// non-existing super getter and writing to a super [setter].
@@ -3046,13 +2400,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitUnresolvedSuperGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// super [getter] and writing to the non-existing super setter.
@@ -3066,13 +2415,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitUnresolvedSuperSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// super [field] and writing to a super [setter].
@@ -3089,13 +2433,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitSuperFieldSetterCompound(
- Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperFieldSetterCompound(Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] reading from a
/// super [getter] and writing to a super [field].
@@ -3112,13 +2451,8 @@
/// m(rhs) => super.o += rhs;
/// }
///
- R visitSuperGetterFieldCompound(
- Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitSuperGetterFieldCompound(Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a type literal
/// for class [element].
@@ -3128,12 +2462,8 @@
/// class C {}
/// m(rhs) => C += rhs;
///
- R visitClassTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a type literal
/// for typedef [element].
@@ -3143,12 +2473,8 @@
/// typedef F();
/// m(rhs) => F += rhs;
///
- R visitTypedefTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on a type literal
/// for type variable [element].
@@ -3159,12 +2485,8 @@
/// m(rhs) => T += rhs;
/// }
///
- R visitTypeVariableTypeLiteralCompound(
- Send node,
- TypeVariableElement element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment expression of [rhs] with [operator] on the type
/// literal for `dynamic`.
@@ -3173,12 +2495,8 @@
///
/// m(rhs) => dynamic += rhs;
///
- R visitDynamicTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound index assignment of [rhs] with [operator] to [index] on the
/// index operators of [receiver].
@@ -3187,13 +2505,8 @@
///
/// m(receiver, index, rhs) => receiver[index] += rhs;
///
- R visitCompoundIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitCompoundIndexSet(SendSet node, Node receiver, Node index,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound index assignment of [rhs] with [operator] to [index] on the index
/// operators of a super class defined by [getter] and [setter].
@@ -3271,13 +2584,8 @@
/// m() => super[1] += 42;
/// }
///
- R visitUnresolvedSuperCompoundIndexSet(
- Send node,
- Element element,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperCompoundIndexSet(Send node, Element element, Node index,
+ AssignmentOperator operator, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [index] on the index operators
/// of [receiver].
@@ -3287,11 +2595,7 @@
/// m(receiver, index, rhs) => receiver[index] ??= rhs;
///
R visitIndexSetIfNull(
- SendSet node,
- Node receiver,
- Node index,
- Node rhs,
- A arg);
+ SendSet node, Node receiver, Node index, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [index] on the index operators
/// of a super class defined by [getter] and [setter].
@@ -3306,13 +2610,8 @@
/// m(index, rhs) => super[index] ??= rhs;
/// }
///
- R visitSuperIndexSetIfNull(
- SendSet node,
- MethodElement getter,
- MethodElement setter,
- Node index,
- Node rhs,
- A arg);
+ R visitSuperIndexSetIfNull(SendSet node, MethodElement getter,
+ MethodElement setter, Node index, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [index] on a super class where
/// the index getter is undefined and the index setter is defined by [setter].
@@ -3326,13 +2625,8 @@
/// m() => super[1] ??= 42;
/// }
///
- R visitUnresolvedSuperGetterIndexSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperGetterIndexSetIfNull(Send node, Element element,
+ MethodElement setter, Node index, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [index] on a super class where
/// the index getter is defined by [getter] but the index setter is undefined.
@@ -3346,13 +2640,8 @@
/// m() => super[1] ??= 42;
/// }
///
- R visitUnresolvedSuperSetterIndexSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperSetterIndexSetIfNull(Send node, MethodElement getter,
+ Element element, Node index, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [index] on a super class where
/// the index getter and setter are undefined.
@@ -3366,11 +2655,7 @@
/// }
///
R visitUnresolvedSuperIndexSetIfNull(
- Send node,
- Element element,
- Node index,
- Node rhs,
- A arg);
+ Send node, Element element, Node index, Node rhs, A arg);
/// Prefix expression with [operator] of the property on [receiver] whose
/// getter and setter are defined by [getterSelector] and [setterSelector],
@@ -3381,11 +2666,7 @@
/// m(receiver) => ++receiver.foo;
///
R visitDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg);
/// Prefix expression with [operator] of the property on a possibly null
/// [receiver] whose getter and setter are defined by [getterSelector] and
@@ -3396,11 +2677,7 @@
/// m(receiver) => ++receiver?.foo;
///
R visitIfNotNullDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a [parameter].
///
@@ -3409,10 +2686,7 @@
/// m(parameter) => ++parameter;
///
R visitParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg);
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a final [parameter].
///
@@ -3421,10 +2695,7 @@
/// m(final parameter) => ++parameter;
///
R visitFinalParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg);
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a local [variable].
///
@@ -3436,10 +2707,7 @@
/// }
///
R visitLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg);
+ Send node, LocalVariableElement variable, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a final local [variable].
///
@@ -3451,10 +2719,7 @@
/// }
///
R visitFinalLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg);
+ Send node, LocalVariableElement variable, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a local [function].
///
@@ -3466,11 +2731,7 @@
/// }
///
R visitLocalFunctionPrefix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg);
-
+ Send node, LocalFunctionElement function, IncDecOperator operator, A arg);
/// Prefix expression with [operator] of the property on `this` whose getter
/// and setter are defined by [getterSelector] and [setterSelector],
@@ -3489,10 +2750,7 @@
/// }
///
R visitThisPropertyPrefix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg);
+ Send node, Name name, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a static [field].
///
@@ -3504,10 +2762,7 @@
/// }
///
R visitStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a final static [field].
///
@@ -3519,10 +2774,7 @@
/// }
///
R visitFinalStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a static [getter] and
/// writing to a static [setter].
@@ -3535,13 +2787,8 @@
/// m() => ++o;
/// }
///
- R visitStaticGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
-
+ R visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a static [method], that is,
/// closurizing [method], and writing to a static [setter].
@@ -3554,12 +2801,8 @@
/// m() => ++o;
/// }
///
- R visitStaticMethodSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a top level [field].
///
@@ -3569,10 +2812,7 @@
/// m() => ++field;
///
R visitTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a final top level [field].
///
@@ -3582,10 +2822,7 @@
/// m() => ++field;
///
R visitFinalTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a top level [getter] and
/// writing to a top level [setter].
@@ -3596,12 +2833,8 @@
/// set o(_) {}
/// m() => ++o;
///
- R visitTopLevelGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a top level [method], that
/// is, closurizing [method], and writing to a top level [setter].
@@ -3612,12 +2845,8 @@
/// set o(_) {}
/// m() => ++o;
///
- R visitTopLevelMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a super [field].
///
@@ -3631,10 +2860,7 @@
/// }
///
R visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from the super field [readField]
/// and writing to the different super field [writtenField].
@@ -3651,12 +2877,8 @@
/// m() => ++super.field;
/// }
///
- R visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg);
+ R visitSuperFieldFieldPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [field] and writing
/// to a super [setter].
@@ -3673,13 +2895,8 @@
/// m() => ++super.field;
/// }
///
- R visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
-
+ R visitSuperFieldSetterPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [getter] and
/// writing to a super [setter].
@@ -3694,12 +2911,8 @@
/// m() => ++super.field;
/// }
///
- R visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [getter] and
/// writing to a super [field].
@@ -3716,12 +2929,8 @@
/// m() => ++super.field;
/// }
///
- R visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ R visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [method], that is,
/// closurizing [method], and writing to a super [setter].
@@ -3736,12 +2945,8 @@
/// m() => ++super.o;
/// }
///
- R visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitSuperMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [method], that is,
/// closurizing [method], and writing to an unresolved super setter.
@@ -3757,10 +2962,7 @@
/// }
///
R visitSuperMethodPrefix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg);
+ Send node, FunctionElement method, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from an unresolved super getter
/// and writing to a super [setter].
@@ -3775,12 +2977,8 @@
/// }
///
///
- R visitUnresolvedSuperGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedSuperGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [getter] and
/// writing to an unresolved super setter.
@@ -3795,12 +2993,8 @@
/// }
///
///
- R visitUnresolvedSuperSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a type literal for a class [element].
///
@@ -3810,10 +3004,7 @@
/// m() => ++C;
///
R visitClassTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a type literal for a typedef
/// [element].
@@ -3824,10 +3015,7 @@
/// m() => ++F;
///
R visitTypedefTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on a type literal for a type variable
/// [element].
@@ -3839,10 +3027,7 @@
/// }
///
R visitTypeVariableTypeLiteralPrefix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg);
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg);
/// Prefix expression with [operator] on the type literal for `dynamic`.
///
@@ -3851,10 +3036,7 @@
/// m() => ++dynamic;
///
R visitDynamicTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg);
/// Postfix expression with [operator] of the property on [receiver] whose
/// getter and setter are defined by [getterSelector] and [setterSelector],
@@ -3865,11 +3047,7 @@
/// m(receiver) => receiver.foo++;
///
R visitDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg);
/// Postfix expression with [operator] of the property on a possibly null
/// [receiver] whose getter and setter are defined by [getterSelector] and
@@ -3880,11 +3058,7 @@
/// m(receiver) => receiver?.foo++;
///
R visitIfNotNullDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a [parameter].
///
@@ -3893,10 +3067,7 @@
/// m(parameter) => parameter++;
///
R visitParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg);
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a final [parameter].
///
@@ -3905,10 +3076,7 @@
/// m(final parameter) => parameter++;
///
R visitFinalParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg);
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a local [variable].
///
@@ -3920,10 +3088,7 @@
/// }
///
R visitLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg);
+ Send node, LocalVariableElement variable, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a final local [variable].
///
@@ -3935,10 +3100,7 @@
/// }
///
R visitFinalLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg);
+ Send node, LocalVariableElement variable, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a local [function].
///
@@ -3950,11 +3112,7 @@
/// }
///
R visitLocalFunctionPostfix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg);
-
+ Send node, LocalFunctionElement function, IncDecOperator operator, A arg);
/// Postfix expression with [operator] of the property on `this` whose getter
/// and setter are defined by [getterSelector] and [setterSelector],
@@ -3973,10 +3131,7 @@
/// }
///
R visitThisPropertyPostfix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg);
+ Send node, Name name, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a static [field].
///
@@ -3988,10 +3143,7 @@
/// }
///
R visitStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a final static [field].
///
@@ -4003,10 +3155,7 @@
/// }
///
R visitFinalStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a static [getter] and
/// writing to a static [setter].
@@ -4019,13 +3168,8 @@
/// m() => o++;
/// }
///
- R visitStaticGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
-
+ R visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a static [method], that
/// is, closurizing [method], and writing to a static [setter].
@@ -4038,12 +3182,8 @@
/// m() => o++;
/// }
///
- R visitStaticMethodSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a top level [field].
///
@@ -4053,10 +3193,7 @@
/// m() => field++;
///
R visitTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a final top level [field].
///
@@ -4066,10 +3203,7 @@
/// m() => field++;
///
R visitFinalTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a top level [getter] and
/// writing to a top level [setter].
@@ -4080,12 +3214,8 @@
/// set o(_) {}
/// m() => o++;
///
- R visitTopLevelGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a top level [method], that
/// is, closurizing [method], and writing to a top level [setter].
@@ -4096,12 +3226,8 @@
/// set o(_) {}
/// m() => o++;
///
- R visitTopLevelMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a super [field].
///
@@ -4115,10 +3241,7 @@
/// }
///
R visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ Send node, FieldElement field, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from the super field
/// [readField] and writing to the different super field [writtenField].
@@ -4135,12 +3258,8 @@
/// m() => super.field++;
/// }
///
- R visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg);
+ R visitSuperFieldFieldPostfix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a super [field] and
/// writing to a super [setter].
@@ -4157,13 +3276,8 @@
/// m() => super.field++;
/// }
///
- R visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
-
+ R visitSuperFieldSetterPostfix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a super [getter] and
/// writing to a super [setter].
@@ -4178,12 +3292,8 @@
/// m() => super.field++;
/// }
///
- R visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a super [getter] and
/// writing to a super [field].
@@ -4200,12 +3310,8 @@
/// m() => super.field++;
/// }
///
- R visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg);
+ R visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a super [method], that is,
/// closurizing [method], and writing to a super [setter].
@@ -4220,12 +3326,8 @@
/// m() => super.o++;
/// }
///
- R visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg);
+ R visitSuperMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg);
/// Postfix expression with [operator] reading from a super [method], that is,
/// closurizing [method], and writing to an unresolved super.
@@ -4241,10 +3343,7 @@
/// }
///
R visitSuperMethodPostfix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg);
+ Send node, FunctionElement method, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from an unresolved super getter
/// and writing to a super [setter].
@@ -4259,12 +3358,8 @@
/// }
///
///
- R visitUnresolvedSuperGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedSuperGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg);
/// Prefix expression with [operator] reading from a super [getter] and
/// writing to an unresolved super setter.
@@ -4279,12 +3374,8 @@
/// }
///
///
- R visitUnresolvedSuperSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a type literal for a class
/// [element].
@@ -4295,10 +3386,7 @@
/// m() => C++;
///
R visitClassTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a type literal for a typedef
/// [element].
@@ -4309,10 +3397,7 @@
/// m() => F++;
///
R visitTypedefTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on a type literal for a type variable
/// [element].
@@ -4324,10 +3409,7 @@
/// }
///
R visitTypeVariableTypeLiteralPostfix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg);
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg);
/// Postfix expression with [operator] on the type literal for `dynamic`.
///
@@ -4336,10 +3418,7 @@
/// m() => dynamic++;
///
R visitDynamicTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg);
/// Read of the [constant].
///
@@ -4348,10 +3427,7 @@
/// const c = c;
/// m() => c;
///
- R visitConstantGet(
- Send node,
- ConstantExpression constant,
- A arg);
+ R visitConstantGet(Send node, ConstantExpression constant, A arg);
/// Invocation of the [constant] with [arguments].
///
@@ -4360,12 +3436,8 @@
/// const c = null;
/// m() => c(null, 42);
///
- R visitConstantInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitConstantInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg);
/// Read of the unresolved [element].
///
@@ -4385,10 +3457,7 @@
/// m11() => unresolved?.Foo?.bar;
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
- R visitUnresolvedGet(
- Send node,
- Element element,
- A arg);
+ R visitUnresolvedGet(Send node, Element element, A arg);
/// Read of the unresolved super [element].
///
@@ -4399,10 +3468,7 @@
/// m() => super.foo;
/// }
///
- R visitUnresolvedSuperGet(
- Send node,
- Element element,
- A arg);
+ R visitUnresolvedSuperGet(Send node, Element element, A arg);
/// Assignment of [rhs] to the unresolved [element].
///
@@ -4422,11 +3488,7 @@
/// m11() => unresolved?.Foo?.bar = 42;
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
- R visitUnresolvedSet(
- Send node,
- Element element,
- Node rhs,
- A arg);
+ R visitUnresolvedSet(Send node, Element element, Node rhs, A arg);
/// Assignment of [rhs] to the unresolved super [element].
///
@@ -4437,11 +3499,7 @@
/// m() => super.foo = 42;
/// }
///
- R visitUnresolvedSuperSet(
- Send node,
- Element element,
- Node rhs,
- A arg);
+ R visitUnresolvedSuperSet(Send node, Element element, Node rhs, A arg);
/// Invocation of the unresolved [element] with [arguments].
///
@@ -4462,11 +3520,7 @@
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
R visitUnresolvedInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Element element, NodeList arguments, Selector selector, A arg);
/// Invocation of the unresolved super [element] with [arguments].
///
@@ -4478,11 +3532,7 @@
/// }
///
R visitUnresolvedSuperInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Element element, NodeList arguments, Selector selector, A arg);
/// Compound assignment of [rhs] with [operator] reading from the
/// non-existing static getter and writing to the static [setter].
@@ -4494,13 +3544,8 @@
/// }
/// m1() => C.foo += 42;
///
- R visitUnresolvedStaticGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedStaticGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment of [rhs] with [operator] reading from the
/// non-existing top level getter and writing to the top level [setter].
@@ -4510,13 +3555,8 @@
/// set foo(_) {}
/// m1() => foo += 42;
///
- R visitUnresolvedTopLevelGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedTopLevelGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment of [rhs] with [operator] reading from the static
/// [getter] and writing to the non-existing static setter.
@@ -4528,13 +3568,8 @@
/// }
/// m1() => C.foo += 42;
///
- R visitUnresolvedStaticSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment of [rhs] with [operator] reading from the top level
/// [getter] and writing to the non-existing top level setter.
@@ -4544,13 +3579,8 @@
/// get foo => 42;
/// m1() => foo += 42;
///
- R visitUnresolvedTopLevelSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment of [rhs] with [operator] reading the closurized static
/// [method] and trying to invoke the non-existing setter.
@@ -4562,12 +3592,8 @@
/// }
/// m1() => C.foo += 42;
///
- R visitStaticMethodCompound(
- Send node,
- MethodElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R visitStaticMethodCompound(Send node, MethodElement method,
+ AssignmentOperator operator, Node rhs, A arg);
/// Compound assignment of [rhs] where both getter and setter are unresolved.
///
@@ -4588,11 +3614,7 @@
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
R visitUnresolvedCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ Send node, Element element, AssignmentOperator operator, Node rhs, A arg);
/// Prefix operation of [operator] reading from the non-existing static getter
/// and writing to the static [setter].
@@ -4604,12 +3626,8 @@
/// }
/// m1() => ++C.foo;
///
- R visitUnresolvedStaticGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedStaticGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg);
/// Prefix operation of [operator] reading from the non-existing top level
/// getter and writing to the top level [setter].
@@ -4619,12 +3637,8 @@
/// set foo(_) {}
/// m1() => ++foo;
///
- R visitUnresolvedTopLevelGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg);
/// Prefix operation of [operator] reading from the static [getter] and
/// writing to the non-existing static setter.
@@ -4636,12 +3650,8 @@
/// }
/// m1() => ++C.foo;
///
- R visitUnresolvedStaticSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading from the top level [getter] and
/// writing to the non-existing top level setter.
@@ -4651,12 +3661,8 @@
/// get foo => 42;
/// m1() => ++foo;
///
- R visitUnresolvedTopLevelSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg);
/// Prefix operation of [operator] reading the closurized static [method] and
/// trying to invoke the non-existing setter.
@@ -4669,10 +3675,7 @@
/// m1() => ++C.foo;
///
R visitStaticMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg);
+ Send node, MethodElement method, IncDecOperator operator, A arg);
/// Prefix operation of [operator] reading the closurized top level [method]
/// and trying to invoke the non-existing setter.
@@ -4685,10 +3688,7 @@
/// m1() => ++C.foo;
///
R visitTopLevelMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg);
+ Send node, MethodElement method, IncDecOperator operator, A arg);
/// Prefix operation where both getter and setter are unresolved.
///
@@ -4709,10 +3709,7 @@
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
R visitUnresolvedPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg);
+ Send node, Element element, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading from the non-existing static
/// getter and writing to the static [setter].
@@ -4724,12 +3721,8 @@
/// }
/// m1() => C.foo++;
///
- R visitUnresolvedStaticGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedStaticGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading from the non-existing top level
/// getter and writing to the top level [setter].
@@ -4739,12 +3732,8 @@
/// set foo(_) {}
/// m1() => foo++;
///
- R visitUnresolvedTopLevelGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading from the static [getter] and
/// writing to the non-existing static setter.
@@ -4756,12 +3745,8 @@
/// }
/// m1() => C.foo++;
///
- R visitUnresolvedStaticSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading from the top level [getter] and
/// writing to the non-existing top level setter.
@@ -4771,12 +3756,8 @@
/// get foo => 42;
/// m1() => foo++;
///
- R visitUnresolvedTopLevelSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg);
+ R visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading the closurized static [method] and
/// trying to invoke the non-existing setter.
@@ -4789,10 +3770,7 @@
/// m1() => C.foo++;
///
R visitStaticMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg);
+ Send node, MethodElement method, IncDecOperator operator, A arg);
/// Postfix operation of [operator] reading the closurized top level [method]
/// and trying to invoke the non-existing setter.
@@ -4805,10 +3783,7 @@
/// m1() => C.foo++;
///
R visitTopLevelMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg);
+ Send node, MethodElement method, IncDecOperator operator, A arg);
/// Postfix operation where both getter and setter are unresolved.
///
@@ -4829,26 +3804,16 @@
///
// TODO(johnniwinther): Split the cases in which a prefix is resolved.
R visitUnresolvedPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg);
+ Send node, Element element, IncDecOperator operator, A arg);
/// Invocation of an undefined unary [operator] on [expression].
R errorUndefinedUnaryExpression(
- Send node,
- Operator operator,
- Node expression,
- A arg);
+ Send node, Operator operator, Node expression, A arg);
/// Invocation of an undefined unary [operator] with operands
/// [left] and [right].
R errorUndefinedBinaryExpression(
- Send node,
- Node left,
- Operator operator,
- Node right,
- A arg);
+ Send node, Node left, Operator operator, Node right, A arg);
/// Const invocation of a [constant] constructor.
///
@@ -4860,9 +3825,7 @@
/// m() => const C<int>(true, 42);
///
R visitConstConstructorInvoke(
- NewExpression node,
- ConstructedConstantExpression constant,
- A arg);
+ NewExpression node, ConstructedConstantExpression constant, A arg);
/// Const invocation of the `bool.fromEnvironment` constructor.
///
@@ -4870,10 +3833,8 @@
///
/// m() => const bool.fromEnvironment('foo', defaultValue: false);
///
- R visitBoolFromEnvironmentConstructorInvoke(
- NewExpression node,
- BoolFromEnvironmentConstantExpression constant,
- A arg);
+ R visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
+ BoolFromEnvironmentConstantExpression constant, A arg);
/// Const invocation of the `int.fromEnvironment` constructor.
///
@@ -4882,9 +3843,7 @@
/// m() => const int.fromEnvironment('foo', defaultValue: 42);
///
R visitIntFromEnvironmentConstructorInvoke(
- NewExpression node,
- IntFromEnvironmentConstantExpression constant,
- A arg);
+ NewExpression node, IntFromEnvironmentConstantExpression constant, A arg);
/// Const invocation of the `String.fromEnvironment` constructor.
///
@@ -4892,10 +3851,8 @@
///
/// m() => const String.fromEnvironment('foo', defaultValue: 'bar');
///
- R visitStringFromEnvironmentConstructorInvoke(
- NewExpression node,
- StringFromEnvironmentConstantExpression constant,
- A arg);
+ R visitStringFromEnvironmentConstructorInvoke(NewExpression node,
+ StringFromEnvironmentConstantExpression constant, A arg);
/// Invocation of a generative [constructor] on [type] with [arguments].
///
@@ -4996,13 +3953,8 @@
///
// TODO(johnniwinther): Change [type] to [InterfaceType] when is it not
// `dynamic`.
- R visitUnresolvedConstructorInvoke(
- NewExpression node,
- Element constructor,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg);
+ R visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
+ DartType type, NodeList arguments, Selector selector, A arg);
/// Invocation of a constructor on an unresolved [type] with [arguments].
///
@@ -5014,13 +3966,8 @@
///
// TODO(johnniwinther): Change [type] to [MalformedType] when is it not
// `dynamic`.
- R visitUnresolvedClassConstructorInvoke(
- NewExpression node,
- Element element,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg);
+ R visitUnresolvedClassConstructorInvoke(NewExpression node, Element element,
+ DartType type, NodeList arguments, Selector selector, A arg);
/// Constant invocation of a non-constant constructor.
///
@@ -5031,13 +3978,8 @@
/// }
/// m() => const C(true, 42);
///
- R errorNonConstantConstructorInvoke(
- NewExpression node,
- Element element,
- DartType type,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R errorNonConstantConstructorInvoke(NewExpression node, Element element,
+ DartType type, NodeList arguments, CallStructure callStructure, A arg);
/// Invocation of a constructor on an abstract [type] with [arguments].
///
@@ -5101,11 +4043,7 @@
///
/// m() => p;
///
- R errorInvalidGet(
- Send node,
- ErroneousElement error,
- A arg);
-
+ R errorInvalidGet(Send node, ErroneousElement error, A arg);
/// Invocation of an invalid expression with [arguments].
///
@@ -5115,12 +4053,8 @@
///
/// m() => p(null, 42);
///
- R errorInvalidInvoke(
- Send node,
- ErroneousElement error,
- NodeList arguments,
- Selector selector,
- A arg);
+ R errorInvalidInvoke(Send node, ErroneousElement error, NodeList arguments,
+ Selector selector, A arg);
/// Assignment of [rhs] to an invalid expression.
///
@@ -5130,11 +4064,7 @@
///
/// m() { p = 42; }
///
- R errorInvalidSet(
- Send node,
- ErroneousElement error,
- Node rhs,
- A arg);
+ R errorInvalidSet(Send node, ErroneousElement error, Node rhs, A arg);
/// Prefix operation on an invalid expression.
///
@@ -5145,10 +4075,7 @@
/// m() => ++p;
///
R errorInvalidPrefix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- A arg);
+ Send node, ErroneousElement error, IncDecOperator operator, A arg);
/// Postfix operation on an invalid expression.
///
@@ -5159,10 +4086,7 @@
/// m() => p--;
///
R errorInvalidPostfix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- A arg);
+ Send node, ErroneousElement error, IncDecOperator operator, A arg);
/// Compound assignment of [operator] with [rhs] on an invalid expression.
///
@@ -5172,12 +4096,8 @@
///
/// m() => p += 42;
///
- R errorInvalidCompound(
- Send node,
- ErroneousElement error,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R errorInvalidCompound(Send node, ErroneousElement error,
+ AssignmentOperator operator, Node rhs, A arg);
/// If-null assignment expression of [rhs] to [index] on the index operators
/// of an invalid expression.
@@ -5189,11 +4109,7 @@
/// m(index, rhs) => p[index] ??= rhs;
///
R errorInvalidIndexSetIfNull(
- SendSet node,
- ErroneousElement error,
- Node index,
- Node rhs,
- A arg);
+ SendSet node, ErroneousElement error, Node index, Node rhs, A arg);
/// Unary operation with [operator] on an invalid expression.
///
@@ -5204,10 +4120,7 @@
/// }
///
R errorInvalidUnary(
- Send node,
- UnaryOperator operator,
- ErroneousElement error,
- A arg);
+ Send node, UnaryOperator operator, ErroneousElement error, A arg);
/// Equals operation on an invalid left expression.
///
@@ -5217,11 +4130,7 @@
/// static m() => super == null;
/// }
///
- R errorInvalidEquals(
- Send node,
- ErroneousElement error,
- Node right,
- A arg);
+ R errorInvalidEquals(Send node, ErroneousElement error, Node right, A arg);
/// Not equals operation on an invalid left expression.
///
@@ -5231,11 +4140,7 @@
/// static m() => super != null;
/// }
///
- R errorInvalidNotEquals(
- Send node,
- ErroneousElement error,
- Node right,
- A arg);
+ R errorInvalidNotEquals(Send node, ErroneousElement error, Node right, A arg);
/// Binary operation with [operator] on an invalid left expression.
///
@@ -5245,12 +4150,8 @@
/// static m() => super + 0;
/// }
///
- R errorInvalidBinary(
- Send node,
- ErroneousElement error,
- BinaryOperator operator,
- Node right,
- A arg);
+ R errorInvalidBinary(Send node, ErroneousElement error,
+ BinaryOperator operator, Node right, A arg);
/// Index operation on an invalid expression.
///
@@ -5260,11 +4161,7 @@
/// static m() => super[0];
/// }
///
- R errorInvalidIndex(
- Send node,
- ErroneousElement error,
- Node index,
- A arg);
+ R errorInvalidIndex(Send node, ErroneousElement error, Node index, A arg);
/// Index set operation on an invalid expression.
///
@@ -5275,11 +4172,7 @@
/// }
///
R errorInvalidIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- Node rhs,
- A arg);
+ Send node, ErroneousElement error, Node index, Node rhs, A arg);
/// Compound index set operation on an invalid expression.
///
@@ -5289,13 +4182,8 @@
/// static m() => super[0] += 42;
/// }
///
- R errorInvalidCompoundIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R errorInvalidCompoundIndexSet(Send node, ErroneousElement error, Node index,
+ AssignmentOperator operator, Node rhs, A arg);
/// Prefix index operation on an invalid expression.
///
@@ -5305,12 +4193,8 @@
/// static m() => --super[0];
/// }
///
- R errorInvalidIndexPrefix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- A arg);
+ R errorInvalidIndexPrefix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, A arg);
/// Postfix index operation on an invalid expression.
///
@@ -5320,12 +4204,8 @@
/// static m() => super[0]++;
/// }
///
- R errorInvalidIndexPostfix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- A arg);
+ R errorInvalidIndexPostfix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, A arg);
/// Access of library through a deferred [prefix].
///
@@ -5338,10 +4218,7 @@
/// This visit method is special in that it is called as a pre-step to calling
/// the visit method for the actual access. Therefore this method cannot
/// return a result to its caller.
- void previsitDeferredAccess(
- Send node,
- PrefixElement prefix,
- A arg);
+ void previsitDeferredAccess(Send node, PrefixElement prefix, A arg);
}
abstract class SemanticDeclarationVisitor<R, A> {
@@ -5360,10 +4237,7 @@
/// get m => 42;
///
R visitTopLevelGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg);
+ FunctionExpression node, MethodElement getter, Node body, A arg);
/// A declaration of a top level [setter].
///
@@ -5371,12 +4245,8 @@
///
/// set m(a) {}
///
- R visitTopLevelSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg);
+ R visitTopLevelSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, Node body, A arg);
/// A declaration of a top level [function].
///
@@ -5384,12 +4254,8 @@
///
/// m(a) {}
///
- R visitTopLevelFunctionDeclaration(
- FunctionExpression node,
- MethodElement function,
- NodeList parameters,
- Node body,
- A arg);
+ R visitTopLevelFunctionDeclaration(FunctionExpression node,
+ MethodElement function, NodeList parameters, Node body, A arg);
/// A declaration of a static [getter].
///
@@ -5400,10 +4266,7 @@
/// }
///
R visitStaticGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg);
+ FunctionExpression node, MethodElement getter, Node body, A arg);
/// A declaration of a static [setter].
///
@@ -5413,12 +4276,8 @@
/// static set m(a) {}
/// }
///
- R visitStaticSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg);
+ R visitStaticSetterDeclaration(FunctionExpression node, MethodElement setter,
+ NodeList parameters, Node body, A arg);
/// A declaration of a static [function].
///
@@ -5428,12 +4287,8 @@
/// static m(a) {}
/// }
///
- R visitStaticFunctionDeclaration(
- FunctionExpression node,
- MethodElement function,
- NodeList parameters,
- Node body,
- A arg);
+ R visitStaticFunctionDeclaration(FunctionExpression node,
+ MethodElement function, NodeList parameters, Node body, A arg);
/// A declaration of an abstract instance [getter].
///
@@ -5444,9 +4299,7 @@
/// }
///
R visitAbstractGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- A arg);
+ FunctionExpression node, MethodElement getter, A arg);
/// A declaration of an abstract instance [setter].
///
@@ -5456,11 +4309,8 @@
/// set m(a);
/// }
///
- R visitAbstractSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- A arg);
+ R visitAbstractSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, A arg);
/// A declaration of an abstract instance [method].
///
@@ -5470,11 +4320,8 @@
/// m(a);
/// }
///
- R visitAbstractMethodDeclaration(
- FunctionExpression node,
- MethodElement method,
- NodeList parameters,
- A arg);
+ R visitAbstractMethodDeclaration(FunctionExpression node,
+ MethodElement method, NodeList parameters, A arg);
/// A declaration of an instance [getter].
///
@@ -5485,10 +4332,7 @@
/// }
///
R visitInstanceGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg);
+ FunctionExpression node, MethodElement getter, Node body, A arg);
/// A declaration of an instance [setter].
///
@@ -5498,12 +4342,8 @@
/// set m(a) {}
/// }
///
- R visitInstanceSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg);
+ R visitInstanceSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, Node body, A arg);
/// A declaration of an instance [method].
///
@@ -5513,12 +4353,8 @@
/// m(a) {}
/// }
///
- R visitInstanceMethodDeclaration(
- FunctionExpression node,
- MethodElement method,
- NodeList parameters,
- Node body,
- A arg);
+ R visitInstanceMethodDeclaration(FunctionExpression node,
+ MethodElement method, NodeList parameters, Node body, A arg);
/// A declaration of a local [function].
///
@@ -5528,12 +4364,8 @@
/// local(a) {}
/// }
///
- R visitLocalFunctionDeclaration(
- FunctionExpression node,
- LocalFunctionElement function,
- NodeList parameters,
- Node body,
- A arg);
+ R visitLocalFunctionDeclaration(FunctionExpression node,
+ LocalFunctionElement function, NodeList parameters, Node body, A arg);
/// A declaration of a [closure].
///
@@ -5543,12 +4375,8 @@
/// var closure = (a) {};
/// }
///
- R visitClosureDeclaration(
- FunctionExpression node,
- LocalFunctionElement closure,
- NodeList parameters,
- Node body,
- A arg);
+ R visitClosureDeclaration(FunctionExpression node,
+ LocalFunctionElement closure, NodeList parameters, Node body, A arg);
/// A declaration of the [index]th [parameter] in a constructor, setter,
/// method or function.
@@ -5557,12 +4385,8 @@
///
/// m(a) {}
///
- R visitParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- int index,
- A arg);
+ R visitParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, int index, A arg);
/// A declaration of the [index]th optional [parameter] in a constructor,
/// method or function with the explicit [defaultValue]. If no default value
@@ -5588,12 +4412,8 @@
///
/// m({a: 42}) {}
///
- R visitNamedParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- ConstantExpression defaultValue,
- A arg);
+ R visitNamedParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, ConstantExpression defaultValue, A arg);
/// A declaration of the [index]th [parameter] as an initializing formal in a
/// constructor.
@@ -5605,12 +4425,8 @@
/// C(this.a);
/// }
///
- R visitInitializingFormalDeclaration(
- VariableDefinitions node,
- Node definition,
- InitializingFormalElement parameter,
- int index,
- A arg);
+ R visitInitializingFormalDeclaration(VariableDefinitions node,
+ Node definition, InitializingFormalElement parameter, int index, A arg);
/// A declaration of the [index]th optional [parameter] as an initializing
/// formal in a constructor with the explicit [defaultValue]. If no default
@@ -5658,12 +4474,8 @@
/// var a = 42;
/// }
///
- R visitLocalVariableDeclaration(
- VariableDefinitions node,
- Node definition,
- LocalVariableElement variable,
- Node initializer,
- A arg);
+ R visitLocalVariableDeclaration(VariableDefinitions node, Node definition,
+ LocalVariableElement variable, Node initializer, A arg);
/// A declaration of a local constant [variable] initialized to [constant].
///
@@ -5673,12 +4485,8 @@
/// const a = 42;
/// }
///
- R visitLocalConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- LocalVariableElement variable,
- ConstantExpression constant,
- A arg);
+ R visitLocalConstantDeclaration(VariableDefinitions node, Node definition,
+ LocalVariableElement variable, ConstantExpression constant, A arg);
/// A declaration of a top level [field] with the explicit [initializer].
/// If no initializer is declared, [initializer] is `null`.
@@ -5687,12 +4495,8 @@
///
/// var a = 42;
///
- R visitTopLevelFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg);
+ R visitTopLevelFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg);
/// A declaration of a top level constant [field] initialized to [constant].
///
@@ -5700,12 +4504,8 @@
///
/// const a = 42;
///
- R visitTopLevelConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- ConstantExpression constant,
- A arg);
+ R visitTopLevelConstantDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, ConstantExpression constant, A arg);
/// A declaration of a static [field] with the explicit [initializer].
/// If no initializer is declared, [initializer] is `null`.
@@ -5716,12 +4516,8 @@
/// static var a = 42;
/// }
///
- R visitStaticFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg);
+ R visitStaticFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg);
/// A declaration of a static constant [field] initialized to [constant].
///
@@ -5731,12 +4527,8 @@
/// static const a = 42;
/// }
///
- R visitStaticConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- ConstantExpression constant,
- A arg);
+ R visitStaticConstantDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, ConstantExpression constant, A arg);
/// A declaration of an instance [field] with the explicit [initializer].
/// If no initializer is declared, [initializer] is `null`.
@@ -5747,12 +4539,8 @@
/// var a = 42;
/// }
///
- R visitInstanceFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg);
+ R visitInstanceFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg);
/// A declaration of a generative [constructor] with the explicit constructor
/// [initializers].
@@ -5801,12 +4589,8 @@
/// factory C(a) => null;
/// }
///
- R visitFactoryConstructorDeclaration(
- FunctionExpression node,
- ConstructorElement constructor,
- NodeList parameters,
- Node body,
- A arg);
+ R visitFactoryConstructorDeclaration(FunctionExpression node,
+ ConstructorElement constructor, NodeList parameters, Node body, A arg);
/// A declaration of a redirecting factory [constructor]. The immediate
/// redirection target and its type is provided in [redirectionTarget] and
@@ -5841,10 +4625,7 @@
/// }
///
R visitFieldInitializer(
- SendSet node,
- FieldElement field,
- Node initializer,
- A arg);
+ SendSet node, FieldElement field, Node initializer, A arg);
/// An initializer of an unresolved field with [initializer] as found in
/// generative constructor initializers.
@@ -5856,10 +4637,7 @@
/// }
///
R errorUnresolvedFieldInitializer(
- SendSet node,
- Element element,
- Node initializer,
- A arg);
+ SendSet node, Element element, Node initializer, A arg);
/// An super constructor invocation of [superConstructor] with [arguments] as
/// found in generative constructor initializers.
@@ -5893,11 +4671,8 @@
/// C(); // Implicit super call of B().
/// }
///
- R visitImplicitSuperConstructorInvoke(
- FunctionExpression node,
- ConstructorElement superConstructor,
- InterfaceType type,
- A arg);
+ R visitImplicitSuperConstructorInvoke(FunctionExpression node,
+ ConstructorElement superConstructor, InterfaceType type, A arg);
/// An super constructor invocation of an unresolved with [arguments] as
/// found in generative constructor initializers.
@@ -5912,11 +4687,7 @@
/// }
///
R errorUnresolvedSuperConstructorInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Element element, NodeList arguments, Selector selector, A arg);
/// An this constructor invocation of [thisConstructor] with [arguments] as
/// found in a redirecting generative constructors initializer.
@@ -5928,12 +4699,8 @@
/// C._(a);
/// }
///
- R visitThisConstructorInvoke(
- Send node,
- ConstructorElement thisConstructor,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R visitThisConstructorInvoke(Send node, ConstructorElement thisConstructor,
+ NodeList arguments, CallStructure callStructure, A arg);
/// An this constructor invocation of an unresolved constructor with
/// [arguments] as found in a redirecting generative constructors initializer.
@@ -5945,9 +4712,5 @@
/// }
///
R errorUnresolvedThisConstructorInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Element element, NodeList arguments, Selector selector, A arg);
}
diff --git a/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart b/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart
index 36db8a8b..b9ebd0b 100644
--- a/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart
+++ b/pkg/compiler/lib/src/resolution/semantic_visitor_mixins.dart
@@ -19,7 +19,6 @@
/// Use this mixin to provide a trivial implementation for all `errorX` methods.
abstract class ErrorBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
// TODO(johnniwinther): Ensure that all error methods have an
// [ErroneousElement].
R bulkHandleError(Node node, ErroneousElement error, A arg) {
@@ -27,193 +26,117 @@
}
@override
- R errorNonConstantConstructorInvoke(
- NewExpression node,
- Element element,
- DartType type,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R errorNonConstantConstructorInvoke(NewExpression node, Element element,
+ DartType type, NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleError(node, null, arg);
}
@override
R errorUndefinedUnaryExpression(
- Send node,
- Operator operator,
- Node expression,
- A arg) {
+ Send node, Operator operator, Node expression, A arg) {
return bulkHandleError(node, null, arg);
}
@override
R errorUndefinedBinaryExpression(
- Send node,
- Node left,
- Operator operator,
- Node right,
- A arg) {
+ Send node, Node left, Operator operator, Node right, A arg) {
return bulkHandleError(node, null, arg);
}
@override
- R errorInvalidCompound(
- Send node,
- ErroneousElement error,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R errorInvalidCompound(Send node, ErroneousElement error,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidGet(
- Send node,
- ErroneousElement error,
- A arg) {
+ R errorInvalidGet(Send node, ErroneousElement error, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidInvoke(
- Send node,
- ErroneousElement error,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R errorInvalidInvoke(Send node, ErroneousElement error, NodeList arguments,
+ Selector selector, A arg) {
return bulkHandleError(node, error, arg);
}
@override
R errorInvalidPostfix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- A arg) {
+ Send node, ErroneousElement error, IncDecOperator operator, A arg) {
return bulkHandleError(node, error, arg);
}
@override
R errorInvalidPrefix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- A arg) {
+ Send node, ErroneousElement error, IncDecOperator operator, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidSet(
- Send node,
- ErroneousElement error,
- Node rhs,
- A arg) {
+ R errorInvalidSet(Send node, ErroneousElement error, Node rhs, A arg) {
return bulkHandleError(node, error, arg);
}
@override
R errorInvalidUnary(
- Send node,
- UnaryOperator operator,
- ErroneousElement error,
- A arg) {
+ Send node, UnaryOperator operator, ErroneousElement error, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidEquals(
- Send node,
- ErroneousElement error,
- Node right,
- A arg) {
+ R errorInvalidEquals(Send node, ErroneousElement error, Node right, A arg) {
return bulkHandleError(node, error, arg);
}
@override
R errorInvalidNotEquals(
- Send node,
- ErroneousElement error,
- Node right,
- A arg) {
+ Send node, ErroneousElement error, Node right, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidBinary(
- Send node,
- ErroneousElement error,
- BinaryOperator operator,
- Node right,
- A arg) {
+ R errorInvalidBinary(Send node, ErroneousElement error,
+ BinaryOperator operator, Node right, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidIndex(
- Send node,
- ErroneousElement error,
- Node index,
- A arg) {
+ R errorInvalidIndex(Send node, ErroneousElement error, Node index, A arg) {
return bulkHandleError(node, error, arg);
}
@override
R errorInvalidIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- Node rhs,
- A arg) {
+ Send node, ErroneousElement error, Node index, Node rhs, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidCompoundIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R errorInvalidCompoundIndexSet(Send node, ErroneousElement error, Node index,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleError(node, error, arg);
}
@override
R errorInvalidIndexSetIfNull(
- SendSet node,
- ErroneousElement error,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, ErroneousElement error, Node index, Node rhs, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidIndexPrefix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R errorInvalidIndexPrefix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidIndexPostfix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R errorInvalidIndexPostfix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, A arg) {
return bulkHandleError(node, error, arg);
}
@override
- R errorInvalidSetIfNull(
- Send node,
- ErroneousElement error,
- Node rhs,
- A arg) {
+ R errorInvalidSetIfNull(Send node, ErroneousElement error, Node rhs, A arg) {
return bulkHandleError(node, error, arg);
}
}
@@ -225,133 +148,84 @@
/// methods.
abstract class PrefixBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandlePrefix(Send node, A arg) {
return bulkHandleNode(node, "Prefix expression `#` unhandled.", arg);
}
@override
R visitDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
R visitIfNotNullDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitIndexPrefix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitStaticGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitStaticMethodSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@@ -367,277 +241,176 @@
}
@override
- R visitUnresolvedSuperGetterIndexPrefix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedSuperSetterIndexPrefix(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterIndexPrefix(Send node, MethodElement getter,
+ Element element, Node index, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitUnresolvedSuperIndexPrefix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitThisPropertyPrefix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Name name, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitTopLevelGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitTopLevelMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitClassTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitDynamicTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitLocalFunctionPrefix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg) {
+ R visitLocalFunctionPrefix(Send node, LocalFunctionElement function,
+ IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitTypeVariableTypeLiteralPrefix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg) {
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitTypedefTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedStaticGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedTopLevelGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedStaticSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedTopLevelSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitStaticMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitTopLevelMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitUnresolvedPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitFinalLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitFinalLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitFinalParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitFinalStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitFinalSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitSuperMethodPrefix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitFinalTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
R visitUnresolvedSuperPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedSuperGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
@override
- R visitUnresolvedSuperSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return bulkHandlePrefix(node, arg);
}
}
@@ -649,133 +422,84 @@
/// methods.
abstract class PostfixBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandlePostfix(Send node, A arg) {
return bulkHandleNode(node, "Postfix expression `#` unhandled.", arg);
}
@override
R visitDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitIfNotNullDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
R visitIndexPostfix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitStaticGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitStaticMethodSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPostfix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPostfix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@@ -791,285 +515,181 @@
}
@override
- R visitUnresolvedSuperGetterIndexPostfix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedSuperSetterIndexPostfix(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterIndexPostfix(Send node, MethodElement getter,
+ Element element, Node index, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitUnresolvedSuperIndexPostfix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitThisPropertyPostfix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Name name, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitTopLevelGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitTopLevelMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitClassTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitDynamicTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitLocalFunctionPostfix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg) {
+ R visitLocalFunctionPostfix(Send node, LocalFunctionElement function,
+ IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitTypeVariableTypeLiteralPostfix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg) {
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitTypedefTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedStaticGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedTopLevelGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedStaticSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedTopLevelSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitStaticMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
R visitToplevelMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitUnresolvedPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitFinalLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitFinalLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitFinalParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitFinalStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitFinalSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitSuperMethodPostfix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitFinalTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitTopLevelMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
R visitUnresolvedSuperPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedSuperGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
@override
- R visitUnresolvedSuperSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return bulkHandlePostfix(node, arg);
}
}
@@ -1081,403 +701,235 @@
/// methods.
abstract class CompoundBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleCompound(Send node, A arg) {
return bulkHandleNode(node, "Compound assignment `#` unhandled.", arg);
}
@override
- R visitDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitIfNotNullDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitIfNotNullDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitStaticGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitStaticMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperFieldSetterCompound(
- Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldSetterCompound(Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperGetterFieldCompound(
- Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperGetterFieldCompound(Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
R visitThisPropertyCompound(
- Send node,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ Send node, Name name, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitTopLevelGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitTopLevelMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitFinalParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitClassTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitDynamicTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitFinalLocalVariableCompound(
- Send node,
- LocalVariableElement
- variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitFinalStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitFinalSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitFinalTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitLocalFunctionCompound(
- Send node,
- LocalFunctionElement function,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalFunctionCompound(Send node, LocalFunctionElement function,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitTypeVariableTypeLiteralCompound(
- Send node,
- TypeVariableElement element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitTypedefTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedStaticGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedTopLevelGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedTopLevelGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedStaticSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedTopLevelSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitStaticMethodCompound(
- Send node,
- MethodElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticMethodCompound(Send node, MethodElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitTopLevelMethodCompound(
- Send node,
- MethodElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodCompound(Send node, MethodElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedCompound(Send node, Element element,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperFieldFieldCompound(
- Send node, FieldElement readField,
- FieldElement writtenField,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldFieldCompound(Send node, FieldElement readField,
+ FieldElement writtenField, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitSuperMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedSuperCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperCompound(Send node, Element element,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedSuperGetterCompound(
- Send node, Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
@override
- R visitUnresolvedSuperSetterCompound(
- Send node, MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleCompound(node, arg);
}
}
@@ -1489,420 +941,260 @@
/// methods.
abstract class SetIfNullBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleSetIfNull(Send node, A arg) {
return bulkHandleNode(node, "If null assignment `#` unhandled.", arg);
}
@override
R visitClassTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ Send node, Node receiver, Name name, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitDynamicTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitFinalLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ Send node, LocalVariableElement variable, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitFinalParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ Send node, ParameterElement parameter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitFinalStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitFinalSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitFinalTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitIfNotNullDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ Send node, Node receiver, Name name, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitLocalFunctionSetIfNull(
- Send node,
- LocalFunctionElement function,
- Node rhs,
- A arg) {
+ Send node, LocalFunctionElement function, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ Send node, LocalVariableElement variable, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ Send node, ParameterElement parameter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitStaticFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitStaticGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitStaticGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitStaticMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
+ Send node, FunctionElement method, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitStaticMethodSetterSetIfNull(
- Send node,
- MethodElement method,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, MethodElement method, MethodElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitSuperFieldFieldSetIfNull(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- Node rhs,
- A arg) {
+ R visitSuperFieldFieldSetIfNull(Send node, FieldElement readField,
+ FieldElement writtenField, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitSuperFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitSuperFieldSetterSetIfNull(
- Send node,
- FieldElement field,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, FunctionElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitSuperGetterFieldSetIfNull(
- Send node,
- FunctionElement getter,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FunctionElement getter, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitSuperGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitSuperMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
+ Send node, FunctionElement method, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitSuperMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitThisPropertySetIfNull(
- Send node,
- Name name,
- Node rhs,
- A arg) {
+ R visitThisPropertySetIfNull(Send node, Name name, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitTopLevelGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitTopLevelMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
+ Send node, FunctionElement method, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitTopLevelMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitTypeVariableTypeLiteralSetIfNull(
- Send node,
- TypeVariableElement element,
- Node rhs,
- A arg) {
+ Send node, TypeVariableElement element, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitTypedefTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitUnresolvedSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSetIfNull(Send node, Element element, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedStaticGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedStaticSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedSuperGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitUnresolvedSuperSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSetIfNull(Send node, Element element, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedSuperSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedTopLevelGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedTopLevelSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitIndexSetIfNull(
- SendSet node,
- Node receiver,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Node index, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitSuperIndexSetIfNull(
- SendSet node,
- MethodElement getter,
- MethodElement setter,
- Node index,
- Node rhs,
- A arg) {
+ R visitSuperIndexSetIfNull(SendSet node, MethodElement getter,
+ MethodElement setter, Node index, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitUnresolvedSuperGetterIndexSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperGetterIndexSetIfNull(Send node, Element element,
+ MethodElement setter, Node index, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
- R visitUnresolvedSuperSetterIndexSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSetterIndexSetIfNull(Send node, MethodElement getter,
+ Element element, Node index, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
@override
R visitUnresolvedSuperIndexSetIfNull(
- Send node,
- Element element,
- Node index,
- Node rhs,
- A arg) {
+ Send node, Element element, Node index, Node rhs, A arg) {
return bulkHandleSetIfNull(node, arg);
}
}
@@ -1914,68 +1206,43 @@
/// methods.
abstract class InvokeBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleInvoke(Send node, A arg) {
return bulkHandleNode(node, "Invocation `#` unhandled.", arg);
}
@override
- R visitClassTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
R visitDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
R visitIfNotNullDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitDynamicTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitExpressionInvoke(
- Send node,
- Node expression,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitExpressionInvoke(Send node, Node expression, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitLocalFunctionInvoke(
- Send node,
- LocalFunctionElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@@ -1990,240 +1257,146 @@
}
@override
- R visitLocalVariableInvoke(
- Send node,
- LocalVariableElement variable,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitLocalVariableInvoke(Send node, LocalVariableElement variable,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitParameterInvoke(
- Send node,
- ParameterElement parameter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitParameterInvoke(Send node, ParameterElement parameter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitStaticFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitStaticFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitStaticFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitStaticGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitSuperFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitSuperGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitSuperMethodInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitSuperMethodIncompatibleInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
R visitThisInvoke(
- Send node,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ Send node, NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
R visitThisPropertyInvoke(
- Send node,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, NodeList arguments, Selector selector, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTopLevelFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTopLevelFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTopLevelFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTopLevelGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTypeVariableTypeLiteralInvoke(
- Send node,
- TypeVariableElement element,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTypedefTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitConstantInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitConstantInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitUnresolvedInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedInvoke(Send node, Element element, NodeList arguments,
+ Selector selector, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitUnresolvedSuperInvoke(
- Send node,
- Element function,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedSuperInvoke(Send node, Element function, NodeList arguments,
+ Selector selector, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitStaticSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitSuperSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
@override
- R visitTopLevelSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInvoke(node, arg);
}
}
@@ -2235,114 +1408,73 @@
/// methods.
abstract class GetBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleGet(Node node, A arg) {
return bulkHandleNode(node, "Read `#` unhandled.", arg);
}
@override
- R visitClassTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitClassTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg) {
+ R visitDynamicPropertyGet(Send node, Node receiver, Name name, A arg) {
return bulkHandleGet(node, arg);
}
@override
R visitIfNotNullDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg) {
+ Send node, Node receiver, Name name, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitDynamicTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitDynamicTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitLocalFunctionGet(
- Send node,
- LocalFunctionElement function,
- A arg) {
+ R visitLocalFunctionGet(Send node, LocalFunctionElement function, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitLocalVariableGet(
- Send node,
- LocalVariableElement variable,
- A arg) {
+ R visitLocalVariableGet(Send node, LocalVariableElement variable, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitParameterGet(
- Send node,
- ParameterElement parameter,
- A arg) {
+ R visitParameterGet(Send node, ParameterElement parameter, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitStaticFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitStaticFieldGet(Send node, FieldElement field, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitStaticFunctionGet(
- Send node,
- MethodElement function,
- A arg) {
+ R visitStaticFunctionGet(Send node, MethodElement function, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitStaticGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitStaticGetterGet(Send node, FunctionElement getter, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitSuperFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitSuperFieldGet(Send node, FieldElement field, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitSuperGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitSuperGetterGet(Send node, FunctionElement getter, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitSuperMethodGet(
- Send node,
- MethodElement method,
- A arg) {
+ R visitSuperMethodGet(Send node, MethodElement method, A arg) {
return bulkHandleGet(node, arg);
}
@@ -2352,98 +1484,63 @@
}
@override
- R visitThisPropertyGet(
- Send node,
- Name name,
- A arg) {
+ R visitThisPropertyGet(Send node, Name name, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitTopLevelFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitTopLevelFieldGet(Send node, FieldElement field, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitTopLevelFunctionGet(
- Send node,
- MethodElement function,
- A arg) {
+ R visitTopLevelFunctionGet(Send node, MethodElement function, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitTopLevelGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitTopLevelGetterGet(Send node, FunctionElement getter, A arg) {
return bulkHandleGet(node, arg);
}
@override
R visitTypeVariableTypeLiteralGet(
- Send node,
- TypeVariableElement element,
- A arg) {
+ Send node, TypeVariableElement element, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitTypedefTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitTypedefTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitConstantGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitConstantGet(Send node, ConstantExpression constant, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitUnresolvedGet(
- Send node,
- Element element,
- A arg) {
+ R visitUnresolvedGet(Send node, Element element, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitUnresolvedSuperGet(
- Send node,
- Element element,
- A arg) {
+ R visitUnresolvedSuperGet(Send node, Element element, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitStaticSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitStaticSetterGet(Send node, FunctionElement setter, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitSuperSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitSuperSetterGet(Send node, FunctionElement setter, A arg) {
return bulkHandleGet(node, arg);
}
@override
- R visitTopLevelSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitTopLevelSetterGet(Send node, FunctionElement setter, A arg) {
return bulkHandleGet(node, arg);
}
}
@@ -2455,271 +1552,170 @@
/// methods.
abstract class SetBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleSet(Send node, A arg) {
return bulkHandleNode(node, "Assignment `#` unhandled.", arg);
}
@override
R visitDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Name name, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitIfNotNullDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Name name, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ SendSet node, LocalVariableElement variable, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ SendSet node, ParameterElement parameter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitStaticSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement setter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitSuperSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitThisPropertySet(
- SendSet node,
- Name name,
- Node rhs,
- A arg) {
+ R visitThisPropertySet(SendSet node, Name name, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitTopLevelSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement setter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitClassTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ SendSet node, ConstantExpression constant, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitDynamicTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ SendSet node, ConstantExpression constant, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitFinalLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ SendSet node, LocalVariableElement variable, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitFinalParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ SendSet node, ParameterElement parameter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitFinalStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitFinalSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitFinalSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitFinalTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitLocalFunctionSet(
- SendSet node,
- LocalFunctionElement function,
- Node rhs,
- A arg) {
+ SendSet node, LocalFunctionElement function, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitStaticFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg) {
+ R visitStaticFunctionSet(Send node, MethodElement function, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitStaticGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement getter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitSuperGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ R visitSuperGetterSet(SendSet node, FunctionElement getter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitSuperMethodSet(
- Send node,
- MethodElement method,
- Node rhs,
- A arg) {
+ R visitSuperMethodSet(Send node, MethodElement method, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitTopLevelFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg) {
+ Send node, MethodElement function, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitTopLevelGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement getter, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitTypeVariableTypeLiteralSet(
- SendSet node,
- TypeVariableElement element,
- Node rhs,
- A arg) {
+ SendSet node, TypeVariableElement element, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
R visitTypedefTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ SendSet node, ConstantExpression constant, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitUnresolvedSet(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSet(Send node, Element element, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
@override
- R visitUnresolvedSuperSet(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSet(Send node, Element element, Node rhs, A arg) {
return bulkHandleSet(node, arg);
}
}
@@ -2731,29 +1727,18 @@
/// methods.
abstract class IndexSetBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleIndexSet(Send node, A arg) {
return bulkHandleNode(node, "Index set expression `#` unhandled.", arg);
}
@override
- R visitCompoundIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitCompoundIndexSet(SendSet node, Node receiver, Node index,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleIndexSet(node, arg);
}
@override
- R visitIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- Node rhs,
- A arg) {
+ R visitIndexSet(SendSet node, Node receiver, Node index, Node rhs, A arg) {
return bulkHandleIndexSet(node, arg);
}
@@ -2794,33 +1779,20 @@
}
@override
- R visitUnresolvedSuperCompoundIndexSet(
- SendSet node,
- Element element,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperCompoundIndexSet(SendSet node, Element element,
+ Node index, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleIndexSet(node, arg);
}
@override
R visitSuperIndexSet(
- SendSet node,
- FunctionElement function,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement function, Node index, Node rhs, A arg) {
return bulkHandleIndexSet(node, arg);
}
@override
R visitUnresolvedSuperIndexSet(
- SendSet node,
- Element element,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, Element element, Node index, Node rhs, A arg) {
return bulkHandleIndexSet(node, arg);
}
}
@@ -2832,111 +1804,69 @@
/// methods.
abstract class BinaryBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleBinary(Send node, A arg) {
return bulkHandleNode(node, "Binary expression `#` unhandled.", arg);
}
@override
R visitBinary(
- Send node,
- Node left,
- BinaryOperator operator,
- Node right,
- A arg) {
+ Send node, Node left, BinaryOperator operator, Node right, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitEquals(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitEquals(Send node, Node left, Node right, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitNotEquals(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitNotEquals(Send node, Node left, Node right, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitIndex(
- Send node,
- Node receiver,
- Node index,
- A arg) {
+ R visitIndex(Send node, Node receiver, Node index, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitSuperBinary(
- Send node,
- FunctionElement function,
- BinaryOperator operator,
- Node argument,
- A arg) {
+ R visitSuperBinary(Send node, FunctionElement function,
+ BinaryOperator operator, Node argument, A arg) {
return bulkHandleBinary(node, arg);
}
@override
R visitSuperEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg) {
+ Send node, FunctionElement function, Node argument, A arg) {
return bulkHandleBinary(node, arg);
}
@override
R visitSuperNotEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg) {
+ Send node, FunctionElement function, Node argument, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitSuperIndex(
- Send node,
- FunctionElement function,
- Node index,
- A arg) {
+ R visitSuperIndex(Send node, FunctionElement function, Node index, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitUnresolvedSuperBinary(
- Send node,
- FunctionElement function,
- BinaryOperator operator,
- Node argument,
- A arg) {
+ R visitUnresolvedSuperBinary(Send node, FunctionElement function,
+ BinaryOperator operator, Node argument, A arg) {
return bulkHandleBinary(node, arg);
}
@override
- R visitUnresolvedSuperInvoke(
- Send node,
- Element function,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedSuperInvoke(Send node, Element function, NodeList arguments,
+ Selector selector, A arg) {
return bulkHandleBinary(node, arg);
}
@override
R visitUnresolvedSuperIndex(
- Send node,
- FunctionElement function,
- Node index,
- A arg) {
+ Send node, FunctionElement function, Node index, A arg) {
return bulkHandleBinary(node, arg);
}
}
@@ -2948,43 +1878,29 @@
/// methods.
abstract class UnaryBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleUnary(Send node, A arg) {
return bulkHandleNode(node, "Unary expression `#` unhandled.", arg);
}
@override
- R visitNot(
- Send node,
- Node expression,
- A arg) {
+ R visitNot(Send node, Node expression, A arg) {
return bulkHandleUnary(node, arg);
}
@override
R visitSuperUnary(
- Send node,
- UnaryOperator operator,
- FunctionElement function,
- A arg) {
+ Send node, UnaryOperator operator, FunctionElement function, A arg) {
return bulkHandleUnary(node, arg);
}
@override
- R visitUnary(
- Send node,
- UnaryOperator operator,
- Node expression,
- A arg) {
+ R visitUnary(Send node, UnaryOperator operator, Node expression, A arg) {
return bulkHandleUnary(node, arg);
}
@override
R visitUnresolvedSuperUnary(
- Send node,
- UnaryOperator operator,
- FunctionElement function,
- A arg) {
+ Send node, UnaryOperator operator, FunctionElement function, A arg) {
return bulkHandleUnary(node, arg);
}
}
@@ -2996,66 +1912,38 @@
/// visitor methods.
abstract class BaseBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
@override
- R visitAs(
- Send node,
- Node expression,
- DartType type,
- A arg) {
+ R visitAs(Send node, Node expression, DartType type, A arg) {
return bulkHandleNode(node, 'As cast `#` unhandled.', arg);
}
@override
- R visitIs(
- Send node,
- Node expression,
- DartType type,
- A arg) {
+ R visitIs(Send node, Node expression, DartType type, A arg) {
return bulkHandleNode(node, 'Is test `#` unhandled.', arg);
}
@override
- R visitIsNot(
- Send node,
- Node expression,
- DartType type,
- A arg) {
+ R visitIsNot(Send node, Node expression, DartType type, A arg) {
return bulkHandleNode(node, 'Is not test `#` unhandled.', arg);
}
@override
- R visitIfNull(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitIfNull(Send node, Node left, Node right, A arg) {
return bulkHandleNode(node, 'If-null (Lazy ?? `#`) unhandled.', arg);
}
@override
- R visitLogicalAnd(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitLogicalAnd(Send node, Node left, Node right, A arg) {
return bulkHandleNode(node, 'Lazy and `#` unhandled.', arg);
}
@override
- R visitLogicalOr(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitLogicalOr(Send node, Node left, Node right, A arg) {
return bulkHandleNode(node, 'Lazy or `#` unhandled.', arg);
}
@override
- void previsitDeferredAccess(
- Send node,
- PrefixElement prefix,
- A arg) {
+ void previsitDeferredAccess(Send node, PrefixElement prefix, A arg) {
bulkHandleNode(node, 'Deferred access `#` unhandled.', arg);
}
}
@@ -3067,18 +1955,13 @@
/// visitor methods.
abstract class SuperBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleSuper(Send node, A arg) {
return bulkHandleNode(node, "Super call `#` unhandled.", arg);
}
@override
- R visitSuperBinary(
- Send node,
- FunctionElement function,
- BinaryOperator operator,
- Node argument,
- A arg) {
+ R visitSuperBinary(Send node, FunctionElement function,
+ BinaryOperator operator, Node argument, A arg) {
return bulkHandleSuper(node, arg);
}
@@ -3096,357 +1979,217 @@
@override
R visitSuperEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg) {
+ Send node, FunctionElement function, Node argument, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPostfix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitSuperFieldGet(Send node, FieldElement field, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleSuper(node, arg);
}
@override
R visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
R visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldSetterCompound(
- Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldSetterCompound(Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPostfix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterFieldCompound(
- Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperGetterFieldCompound(Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitSuperGetterGet(Send node, FunctionElement getter, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
R visitSuperIndexSet(
- SendSet node,
- FunctionElement function,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement function, Node index, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperMethodGet(
- Send node,
- MethodElement method,
- A arg) {
+ R visitSuperMethodGet(Send node, MethodElement method, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperMethodInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments,
+ CallStructure callStructure, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperMethodIncompatibleInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return bulkHandleSuper(node, arg);
}
@override
R visitSuperNotEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg) {
+ Send node, FunctionElement function, Node argument, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitSuperSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
R visitSuperUnary(
- Send node,
- UnaryOperator operator,
- FunctionElement function,
- A arg) {
+ Send node, UnaryOperator operator, FunctionElement function, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitUnresolvedSuperBinary(
- Send node,
- Element element,
- BinaryOperator operator,
- Node argument,
- A arg) {
+ R visitUnresolvedSuperBinary(Send node, Element element,
+ BinaryOperator operator, Node argument, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitUnresolvedSuperGet(
- Send node,
- Element element,
- A arg) {
+ R visitUnresolvedSuperGet(Send node, Element element, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitUnresolvedSuperSet(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSet(Send node, Element element, Node rhs, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitUnresolvedSuperInvoke(
- Send node,
- Element function,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedSuperInvoke(Send node, Element function, NodeList arguments,
+ Selector selector, A arg) {
return bulkHandleSuper(node, arg);
}
@override
- R visitUnresolvedSuperIndex(
- Send node,
- Element function,
- Node index,
- A arg) {
+ R visitUnresolvedSuperIndex(Send node, Element function, Node index, A arg) {
return bulkHandleSuper(node, arg);
}
@override
R visitUnresolvedSuperUnary(
- Send node,
- UnaryOperator operator,
- Element element,
- A arg) {
+ Send node, UnaryOperator operator, Element element, A arg) {
return bulkHandleSuper(node, arg);
}
}
abstract class NewBulkMixin<R, A>
implements SemanticSendVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleNew(NewExpression node, A arg) {
- return bulkHandleNode(
- node, "Constructor invocation `#` unhandled.", arg);
+ return bulkHandleNode(node, "Constructor invocation `#` unhandled.", arg);
}
@override
@@ -3462,33 +2205,25 @@
@override
R visitConstConstructorInvoke(
- NewExpression node,
- ConstructedConstantExpression constant,
- A arg) {
+ NewExpression node, ConstructedConstantExpression constant, A arg) {
return bulkHandleNew(node, arg);
}
@override
- R visitBoolFromEnvironmentConstructorInvoke(
- NewExpression node,
- BoolFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
+ BoolFromEnvironmentConstantExpression constant, A arg) {
return bulkHandleNew(node, arg);
}
@override
- R visitIntFromEnvironmentConstructorInvoke(
- NewExpression node,
- IntFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitIntFromEnvironmentConstructorInvoke(NewExpression node,
+ IntFromEnvironmentConstantExpression constant, A arg) {
return bulkHandleNew(node, arg);
}
@override
- R visitStringFromEnvironmentConstructorInvoke(
- NewExpression node,
- StringFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitStringFromEnvironmentConstructorInvoke(NewExpression node,
+ StringFromEnvironmentConstantExpression constant, A arg) {
return bulkHandleNew(node, arg);
}
@@ -3550,35 +2285,25 @@
}
@override
- R visitUnresolvedClassConstructorInvoke(
- NewExpression node,
- Element element,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedClassConstructorInvoke(NewExpression node, Element element,
+ DartType type, NodeList arguments, Selector selector, A arg) {
return bulkHandleNew(node, arg);
}
@override
- R visitUnresolvedConstructorInvoke(
- NewExpression node,
- Element constructor,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
+ DartType type, NodeList arguments, Selector selector, A arg) {
return bulkHandleNew(node, arg);
}
@override
R visitUnresolvedRedirectingFactoryConstructorInvoke(
- NewExpression node,
- ConstructorElement constructor,
- InterfaceType type,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ NewExpression node,
+ ConstructorElement constructor,
+ InterfaceType type,
+ NodeList arguments,
+ CallStructure callStructure,
+ A arg) {
return bulkHandleNew(node, arg);
}
}
@@ -3589,19 +2314,20 @@
/// tests that the union of the `BulkX` mixins implement all `visit` and `error`
/// methods of [SemanticSendVisitor].
class BulkSendVisitor<R, A> extends SemanticSendVisitor<R, A>
- with GetBulkMixin<R, A>,
- SetBulkMixin<R, A>,
- ErrorBulkMixin<R, A>,
- InvokeBulkMixin<R, A>,
- IndexSetBulkMixin<R, A>,
- CompoundBulkMixin<R, A>,
- SetIfNullBulkMixin<R, A>,
- UnaryBulkMixin<R, A>,
- BaseBulkMixin<R, A>,
- BinaryBulkMixin<R, A>,
- PrefixBulkMixin<R, A>,
- PostfixBulkMixin<R, A>,
- NewBulkMixin<R, A> {
+ with
+ GetBulkMixin<R, A>,
+ SetBulkMixin<R, A>,
+ ErrorBulkMixin<R, A>,
+ InvokeBulkMixin<R, A>,
+ IndexSetBulkMixin<R, A>,
+ CompoundBulkMixin<R, A>,
+ SetIfNullBulkMixin<R, A>,
+ UnaryBulkMixin<R, A>,
+ BaseBulkMixin<R, A>,
+ BinaryBulkMixin<R, A>,
+ PrefixBulkMixin<R, A>,
+ PostfixBulkMixin<R, A>,
+ NewBulkMixin<R, A> {
@override
R apply(Node node, A arg) {
throw new UnimplementedError("BulkSendVisitor.apply unimplemented");
@@ -3621,19 +2347,13 @@
/// Use this mixin to provide a trivial implementation for these methods.
abstract class ParameterBulkMixin<R, A>
implements SemanticDeclarationVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleParameterDeclaration(VariableDefinitions node, A arg) {
- return bulkHandleNode(
- node, "Parameter declaration `#` unhandled.", arg);
+ return bulkHandleNode(node, "Parameter declaration `#` unhandled.", arg);
}
@override
- R visitInitializingFormalDeclaration(
- VariableDefinitions node,
- Node definition,
- InitializingFormalElement parameter,
- int index,
- A arg) {
+ R visitInitializingFormalDeclaration(VariableDefinitions node,
+ Node definition, InitializingFormalElement parameter, int index, A arg) {
return bulkHandleParameterDeclaration(node, arg);
}
@@ -3648,12 +2368,8 @@
}
@override
- R visitNamedParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- ConstantExpression defaultValue,
- A arg) {
+ R visitNamedParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, ConstantExpression defaultValue, A arg) {
return bulkHandleParameterDeclaration(node, arg);
}
@@ -3680,12 +2396,8 @@
}
@override
- R visitParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- int index,
- A arg) {
+ R visitParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, int index, A arg) {
return bulkHandleParameterDeclaration(node, arg);
}
}
@@ -3696,19 +2408,13 @@
/// Use this mixin to provide a trivial implementation for these methods.
abstract class ConstructorBulkMixin<R, A>
implements SemanticDeclarationVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleConstructorDeclaration(FunctionExpression node, A arg) {
- return bulkHandleNode(
- node, "Constructor declaration `#` unhandled.", arg);
+ return bulkHandleNode(node, "Constructor declaration `#` unhandled.", arg);
}
@override
- R visitFactoryConstructorDeclaration(
- FunctionExpression node,
- ConstructorElement constructor,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitFactoryConstructorDeclaration(FunctionExpression node,
+ ConstructorElement constructor, NodeList parameters, Node body, A arg) {
return bulkHandleConstructorDeclaration(node, arg);
}
@@ -3751,47 +2457,31 @@
/// Use this mixin to provide a trivial implementation for these methods.
abstract class InitializerBulkMixin<R, A>
implements SemanticDeclarationVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleInitializer(Node node, A arg) {
- return bulkHandleNode(
- node, "Initializer `#` unhandled.", arg);
+ return bulkHandleNode(node, "Initializer `#` unhandled.", arg);
}
@override
R errorUnresolvedFieldInitializer(
- SendSet node,
- Element element,
- Node initializer,
- A arg) {
+ SendSet node, Element element, Node initializer, A arg) {
return bulkHandleInitializer(node, arg);
}
@override
- R errorUnresolvedSuperConstructorInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R errorUnresolvedSuperConstructorInvoke(Send node, Element element,
+ NodeList arguments, Selector selector, A arg) {
return bulkHandleInitializer(node, arg);
}
@override
- R errorUnresolvedThisConstructorInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R errorUnresolvedThisConstructorInvoke(Send node, Element element,
+ NodeList arguments, Selector selector, A arg) {
return bulkHandleInitializer(node, arg);
}
@override
R visitFieldInitializer(
- SendSet node,
- FieldElement field,
- Node initializer,
- A arg) {
+ SendSet node, FieldElement field, Node initializer, A arg) {
return bulkHandleInitializer(node, arg);
}
@@ -3807,21 +2497,14 @@
}
@override
- R visitImplicitSuperConstructorInvoke(
- FunctionExpression node,
- ConstructorElement superConstructor,
- InterfaceType type,
- A arg) {
+ R visitImplicitSuperConstructorInvoke(FunctionExpression node,
+ ConstructorElement superConstructor, InterfaceType type, A arg) {
return bulkHandleInitializer(node, arg);
}
@override
- R visitThisConstructorInvoke(
- Send node,
- ConstructorElement thisConstructor,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitThisConstructorInvoke(Send node, ConstructorElement thisConstructor,
+ NodeList arguments, CallStructure callStructure, A arg) {
return bulkHandleInitializer(node, arg);
}
}
@@ -3832,142 +2515,91 @@
/// Use this mixin to provide a trivial implementation for these methods.
abstract class FunctionBulkMixin<R, A>
implements SemanticDeclarationVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleFunctionDeclaration(FunctionExpression node, A arg) {
- return bulkHandleNode(
- node, "Function declaration `#` unhandled.", arg);
+ return bulkHandleNode(node, "Function declaration `#` unhandled.", arg);
}
@override
R visitAbstractGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- A arg) {
+ FunctionExpression node, MethodElement getter, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitAbstractMethodDeclaration(
- FunctionExpression node,
- MethodElement method,
- NodeList parameters,
- A arg) {
+ R visitAbstractMethodDeclaration(FunctionExpression node,
+ MethodElement method, NodeList parameters, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitAbstractSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- A arg) {
+ R visitAbstractSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitClosureDeclaration(
- FunctionExpression node,
- LocalFunctionElement closure,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitClosureDeclaration(FunctionExpression node,
+ LocalFunctionElement closure, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
R visitInstanceGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg) {
+ FunctionExpression node, MethodElement getter, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitInstanceMethodDeclaration(
- FunctionExpression node,
- MethodElement method,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitInstanceMethodDeclaration(FunctionExpression node,
+ MethodElement method, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitInstanceSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitInstanceSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitLocalFunctionDeclaration(
- FunctionExpression node,
- LocalFunctionElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitLocalFunctionDeclaration(FunctionExpression node,
+ LocalFunctionElement function, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitStaticFunctionDeclaration(
- FunctionExpression node,
- MethodElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitStaticFunctionDeclaration(FunctionExpression node,
+ MethodElement function, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
R visitStaticGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg) {
+ FunctionExpression node, MethodElement getter, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitStaticSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitStaticSetterDeclaration(FunctionExpression node, MethodElement setter,
+ NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitTopLevelFunctionDeclaration(
- FunctionExpression node,
- MethodElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitTopLevelFunctionDeclaration(FunctionExpression node,
+ MethodElement function, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
R visitTopLevelGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg) {
+ FunctionExpression node, MethodElement getter, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
@override
- R visitTopLevelSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitTopLevelSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, Node body, A arg) {
return bulkHandleFunctionDeclaration(node, arg);
}
}
@@ -3978,79 +2610,49 @@
/// Use this mixin to provide a trivial implementation for these methods.
abstract class VariableBulkMixin<R, A>
implements SemanticDeclarationVisitor<R, A>, BulkHandle<R, A> {
-
R bulkHandleVariableDeclaration(VariableDefinitions node, A arg) {
- return bulkHandleNode(
- node, "Variable declaration `#` unhandled.", arg);
+ return bulkHandleNode(node, "Variable declaration `#` unhandled.", arg);
}
@override
- R visitInstanceFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg) {
+ R visitInstanceFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
@override
- R visitLocalConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- LocalVariableElement variable,
- ConstantExpression constant,
- A arg) {
+ R visitLocalConstantDeclaration(VariableDefinitions node, Node definition,
+ LocalVariableElement variable, ConstantExpression constant, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
@override
- R visitLocalVariableDeclaration(
- VariableDefinitions node,
- Node definition,
- LocalVariableElement variable,
- Node initializer,
- A arg) {
+ R visitLocalVariableDeclaration(VariableDefinitions node, Node definition,
+ LocalVariableElement variable, Node initializer, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
@override
- R visitStaticConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- ConstantExpression constant,
- A arg) {
+ R visitStaticConstantDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, ConstantExpression constant, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
@override
- R visitStaticFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg) {
+ R visitStaticFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
@override
- R visitTopLevelConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- ConstantExpression constant,
- A arg) {
+ R visitTopLevelConstantDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, ConstantExpression constant, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
@override
- R visitTopLevelFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg) {
+ R visitTopLevelFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg) {
return bulkHandleVariableDeclaration(node, arg);
}
}
@@ -4062,11 +2664,12 @@
/// tests that the union of the `BulkX` mixins implement all `visit` and `error`
/// methods of [SemanticDeclarationVisitor].
class BulkDeclarationVisitor<R, A> extends SemanticDeclarationVisitor<R, A>
- with ConstructorBulkMixin<R, A>,
- FunctionBulkMixin<R, A>,
- VariableBulkMixin<R, A>,
- ParameterBulkMixin<R, A>,
- InitializerBulkMixin<R, A> {
+ with
+ ConstructorBulkMixin<R, A>,
+ FunctionBulkMixin<R, A>,
+ VariableBulkMixin<R, A>,
+ ParameterBulkMixin<R, A>,
+ InitializerBulkMixin<R, A> {
@override
R apply(Node node, A arg) {
throw new UnimplementedError("BulkDeclVisitor.apply unimplemented");
@@ -4091,7 +2694,6 @@
}
}
-
/// [SemanticSendVisitor] that visits subnodes.
class TraversalSendMixin<R, A> implements SemanticSendVisitor<R, A> {
@override
@@ -4100,574 +2702,370 @@
}
@override
- void previsitDeferredAccess(
- Send node,
- PrefixElement prefix,
- A arg) {
- }
+ void previsitDeferredAccess(Send node, PrefixElement prefix, A arg) {}
@override
- R errorInvalidCompound(
- Send node,
- ErroneousElement error,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R errorInvalidCompound(Send node, ErroneousElement error,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R errorInvalidGet(
- Send node,
- ErroneousElement error,
- A arg) {
+ R errorInvalidGet(Send node, ErroneousElement error, A arg) {
return null;
}
@override
- R errorInvalidInvoke(
- Send node,
- ErroneousElement error,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R errorInvalidInvoke(Send node, ErroneousElement error, NodeList arguments,
+ Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@override
R errorInvalidPostfix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- A arg) {
+ Send node, ErroneousElement error, IncDecOperator operator, A arg) {
return null;
}
@override
R errorInvalidPrefix(
- Send node,
- ErroneousElement error,
- IncDecOperator operator,
- A arg) {
+ Send node, ErroneousElement error, IncDecOperator operator, A arg) {
return null;
}
@override
- R errorInvalidSet(
- Send node,
- ErroneousElement error,
- Node rhs,
- A arg) {
+ R errorInvalidSet(Send node, ErroneousElement error, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R errorInvalidUnary(
- Send node,
- UnaryOperator operator,
- ErroneousElement error,
- A arg) {
+ Send node, UnaryOperator operator, ErroneousElement error, A arg) {
return null;
}
@override
- R errorInvalidEquals(
- Send node,
- ErroneousElement error,
- Node right,
- A arg) {
+ R errorInvalidEquals(Send node, ErroneousElement error, Node right, A arg) {
apply(right, arg);
return null;
}
@override
R errorInvalidNotEquals(
- Send node,
- ErroneousElement error,
- Node right,
- A arg) {
+ Send node, ErroneousElement error, Node right, A arg) {
apply(right, arg);
return null;
}
@override
- R errorInvalidBinary(
- Send node,
- ErroneousElement error,
- BinaryOperator operator,
- Node right,
- A arg) {
+ R errorInvalidBinary(Send node, ErroneousElement error,
+ BinaryOperator operator, Node right, A arg) {
apply(right, arg);
return null;
}
@override
- R errorInvalidIndex(
- Send node,
- ErroneousElement error,
- Node index,
- A arg) {
+ R errorInvalidIndex(Send node, ErroneousElement error, Node index, A arg) {
apply(index, arg);
return null;
}
@override
R errorInvalidIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- Node rhs,
- A arg) {
+ Send node, ErroneousElement error, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
@override
- R errorInvalidCompoundIndexSet(
- Send node,
- ErroneousElement error,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R errorInvalidCompoundIndexSet(Send node, ErroneousElement error, Node index,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
@override
- R errorInvalidIndexPrefix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R errorInvalidIndexPrefix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
- R errorInvalidIndexPostfix(
- Send node,
- ErroneousElement error,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R errorInvalidIndexPostfix(Send node, ErroneousElement error, Node index,
+ IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
R visitClassTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ SendSet node, ConstantExpression constant, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitDynamicTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ SendSet node, ConstantExpression constant, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitFinalLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ SendSet node, LocalVariableElement variable, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitFinalParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ SendSet node, ParameterElement parameter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitFinalStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ SendSet node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitFinalSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitFinalSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitFinalTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ SendSet node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitLocalFunctionCompound(
- Send node,
- LocalFunctionElement function,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalFunctionCompound(Send node, LocalFunctionElement function,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitLocalFunctionPostfix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg) {
+ R visitLocalFunctionPostfix(Send node, LocalFunctionElement function,
+ IncDecOperator operator, A arg) {
return null;
}
@override
- R visitLocalFunctionPrefix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg) {
+ R visitLocalFunctionPrefix(Send node, LocalFunctionElement function,
+ IncDecOperator operator, A arg) {
return null;
}
@override
R visitLocalFunctionSet(
- SendSet node,
- LocalFunctionElement function,
- Node rhs,
- A arg) {
+ SendSet node, LocalFunctionElement function, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg) {
+ R visitStaticFunctionSet(Send node, MethodElement function, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitStaticGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement getter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitStaticSetterGet(Send node, FunctionElement setter, A arg) {
return null;
}
@override
- R visitStaticSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitSuperGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ R visitSuperGetterSet(SendSet node, FunctionElement getter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperMethodSet(
- Send node,
- MethodElement method,
- Node rhs,
- A arg) {
+ R visitSuperMethodSet(Send node, MethodElement method, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitSuperSetterGet(Send node, FunctionElement setter, A arg) {
return null;
}
@override
- R visitSuperSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitTopLevelFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg) {
+ Send node, MethodElement function, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTopLevelGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement getter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitTopLevelSetterGet(Send node, FunctionElement setter, A arg) {
return null;
}
@override
- R visitTopLevelSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitTypeVariableTypeLiteralSet(
- SendSet node,
- TypeVariableElement element,
- Node rhs,
- A arg) {
+ SendSet node, TypeVariableElement element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTypedefTypeLiteralSet(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ SendSet node, ConstantExpression constant, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperIndex(
- Send node,
- Element function,
- Node index,
- A arg) {
+ R visitUnresolvedSuperIndex(Send node, Element function, Node index, A arg) {
apply(index, arg);
return null;
}
@override
- R visitUnresolvedSuperGet(
- Send node,
- Element element,
- A arg) {
+ R visitUnresolvedSuperGet(Send node, Element element, A arg) {
return null;
}
@override
- R visitUnresolvedSuperSet(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSet(Send node, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperInvoke(
- Send node,
- Element function,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedSuperInvoke(Send node, Element function, NodeList arguments,
+ Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitAs(
- Send node,
- Node expression,
- DartType type,
- A arg) {
+ R visitAs(Send node, Node expression, DartType type, A arg) {
apply(expression, arg);
return null;
}
@override
R visitBinary(
- Send node,
- Node left,
- BinaryOperator operator,
- Node right,
- A arg) {
+ Send node, Node left, BinaryOperator operator, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
}
@override
- R visitClassTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitClassTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitClassTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return null;
}
@override
- R visitClassTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitClassTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return null;
}
@override
R visitClassTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitCompoundIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitCompoundIndexSet(SendSet node, Node receiver, Node index,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(receiver, arg);
apply(index, arg);
apply(rhs, arg);
@@ -4675,77 +3073,49 @@
}
@override
- R visitConstantGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitConstantGet(Send node, ConstantExpression constant, A arg) {
return null;
}
@override
- R visitConstantInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitConstantInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(receiver, arg);
apply(rhs, arg);
return null;
}
@override
- R visitIfNotNullDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitIfNotNullDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(receiver, arg);
apply(rhs, arg);
return null;
}
@override
- R visitDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg) {
+ R visitDynamicPropertyGet(Send node, Node receiver, Name name, A arg) {
apply(receiver, arg);
return null;
}
@override
R visitIfNotNullDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg) {
+ Send node, Node receiver, Name name, A arg) {
apply(receiver, arg);
return null;
}
@override
R visitDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg) {
apply(receiver, arg);
apply(arguments, arg);
return null;
@@ -4753,11 +3123,7 @@
@override
R visitIfNotNullDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg) {
apply(receiver, arg);
apply(arguments, arg);
return null;
@@ -4765,55 +3131,35 @@
@override
R visitDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
apply(receiver, arg);
return null;
}
@override
R visitIfNotNullDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
apply(receiver, arg);
return null;
}
@override
R visitDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
apply(receiver, arg);
return null;
}
@override
R visitIfNotNullDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
apply(receiver, arg);
return null;
}
@override
R visitDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Name name, Node rhs, A arg) {
apply(receiver, arg);
apply(rhs, arg);
return null;
@@ -4821,105 +3167,67 @@
@override
R visitIfNotNullDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Name name, Node rhs, A arg) {
apply(receiver, arg);
apply(rhs, arg);
return null;
}
@override
- R visitDynamicTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitDynamicTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitDynamicTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return null;
}
@override
- R visitDynamicTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitDynamicTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return null;
}
@override
R visitDynamicTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitEquals(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitEquals(Send node, Node left, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
}
@override
- R visitExpressionInvoke(
- Send node,
- Node expression,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitExpressionInvoke(Send node, Node expression, NodeList arguments,
+ CallStructure callStructure, A arg) {
apply(expression, arg);
apply(arguments, arg);
return null;
}
@override
- R visitIndex(
- Send node,
- Node receiver,
- Node index,
- A arg) {
+ R visitIndex(Send node, Node receiver, Node index, A arg) {
apply(receiver, arg);
apply(index, arg);
return null;
}
@override
- R visitIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- Node rhs,
- A arg) {
+ R visitIndexSet(SendSet node, Node receiver, Node index, Node rhs, A arg) {
apply(receiver, arg);
apply(index, arg);
apply(rhs, arg);
@@ -4927,40 +3235,25 @@
}
@override
- R visitIs(
- Send node,
- Node expression,
- DartType type,
- A arg) {
+ R visitIs(Send node, Node expression, DartType type, A arg) {
apply(expression, arg);
return null;
}
@override
- R visitIsNot(
- Send node,
- Node expression,
- DartType type,
- A arg) {
+ R visitIsNot(Send node, Node expression, DartType type, A arg) {
apply(expression, arg);
return null;
}
@override
- R visitLocalFunctionGet(
- Send node,
- LocalFunctionElement function,
- A arg) {
+ R visitLocalFunctionGet(Send node, LocalFunctionElement function, A arg) {
return null;
}
@override
- R visitLocalFunctionInvoke(
- Send node,
- LocalFunctionElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@@ -4977,362 +3270,231 @@
}
@override
- R visitLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitLocalVariableGet(
- Send node,
- LocalVariableElement variable,
- A arg) {
+ R visitLocalVariableGet(Send node, LocalVariableElement variable, A arg) {
return null;
}
@override
- R visitLocalVariableInvoke(
- Send node,
- LocalVariableElement variable,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitLocalVariableInvoke(Send node, LocalVariableElement variable,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return null;
}
@override
- R visitLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return null;
}
@override
R visitLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ SendSet node, LocalVariableElement variable, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitIfNull(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitIfNull(Send node, Node left, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
}
@override
- R visitLogicalAnd(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitLogicalAnd(Send node, Node left, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
}
@override
- R visitLogicalOr(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitLogicalOr(Send node, Node left, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
}
@override
- R visitNot(
- Send node,
- Node expression,
- A arg) {
+ R visitNot(Send node, Node expression, A arg) {
apply(expression, arg);
return null;
}
@override
- R visitNotEquals(
- Send node,
- Node left,
- Node right,
- A arg) {
+ R visitNotEquals(Send node, Node left, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
}
@override
- R visitParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitParameterGet(
- Send node,
- ParameterElement parameter,
- A arg) {
+ R visitParameterGet(Send node, ParameterElement parameter, A arg) {
return null;
}
@override
- R visitParameterInvoke(
- Send node,
- ParameterElement parameter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitParameterInvoke(Send node, ParameterElement parameter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ SendSet node, ParameterElement parameter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitStaticFieldGet(Send node, FieldElement field, A arg) {
return null;
}
@override
- R visitStaticFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
R visitStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticFunctionGet(
- Send node,
- MethodElement function,
- A arg) {
+ R visitStaticFunctionGet(Send node, MethodElement function, A arg) {
return null;
}
@override
- R visitStaticFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitStaticFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitStaticGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitStaticGetterGet(Send node, FunctionElement getter, A arg) {
return null;
}
@override
- R visitStaticGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitStaticGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitStaticGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitStaticMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticMethodSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitStaticMethodSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitStaticSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperBinary(
- Send node,
- FunctionElement function,
- BinaryOperator operator,
- Node argument,
- A arg) {
+ R visitSuperBinary(Send node, FunctionElement function,
+ BinaryOperator operator, Node argument, A arg) {
apply(argument, arg);
return null;
}
@@ -5352,317 +3514,197 @@
@override
R visitSuperEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg) {
+ Send node, FunctionElement function, Node argument, A arg) {
apply(argument, arg);
return null;
}
@override
- R visitSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPostfix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitSuperFieldGet(Send node, FieldElement field, A arg) {
return null;
}
@override
- R visitSuperFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
R visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitSuperFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperFieldSetterCompound(
- Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldSetterCompound(Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPostfix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperGetterFieldCompound(
- Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperGetterFieldCompound(Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitSuperGetterGet(Send node, FunctionElement getter, A arg) {
return null;
}
@override
- R visitSuperGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitSuperGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperIndex(
- Send node,
- FunctionElement function,
- Node index,
- A arg) {
+ R visitSuperIndex(Send node, FunctionElement function, Node index, A arg) {
apply(index, arg);
return null;
}
@override
R visitSuperIndexSet(
- SendSet node,
- FunctionElement function,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement function, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
@override
- R visitSuperMethodGet(
- Send node,
- MethodElement method,
- A arg) {
+ R visitSuperMethodGet(Send node, MethodElement method, A arg) {
return null;
}
@override
- R visitSuperMethodInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperMethodInvoke(Send node, MethodElement method, NodeList arguments,
+ CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitSuperMethodIncompatibleInvoke(
- Send node,
- MethodElement method,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitSuperMethodIncompatibleInvoke(Send node, MethodElement method,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitSuperMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitSuperNotEquals(
- Send node,
- FunctionElement function,
- Node argument,
- A arg) {
+ Send node, FunctionElement function, Node argument, A arg) {
apply(argument, arg);
return null;
}
@override
- R visitSuperSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperSetterSet(SendSet node, FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitSuperUnary(
- Send node,
- UnaryOperator operator,
- FunctionElement function,
- A arg) {
+ Send node, UnaryOperator operator, FunctionElement function, A arg) {
return null;
}
@@ -5673,423 +3715,270 @@
@override
R visitThisInvoke(
- Send node,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ Send node, NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitThisPropertyCompound(
- Send node,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ Send node, Name name, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitThisPropertyGet(
- Send node,
- Name name,
- A arg) {
+ R visitThisPropertyGet(Send node, Name name, A arg) {
return null;
}
@override
R visitThisPropertyInvoke(
- Send node,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, NodeList arguments, Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitThisPropertyPostfix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Name name, IncDecOperator operator, A arg) {
return null;
}
@override
R visitThisPropertyPrefix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
+ Send node, Name name, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitThisPropertySet(
- SendSet node,
- Name name,
- Node rhs,
- A arg) {
+ R visitThisPropertySet(SendSet node, Name name, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitTopLevelFieldGet(Send node, FieldElement field, A arg) {
return null;
}
@override
- R visitTopLevelFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
R visitTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelFunctionGet(
- Send node,
- MethodElement function,
- A arg) {
+ R visitTopLevelFunctionGet(Send node, MethodElement function, A arg) {
return null;
}
@override
- R visitTopLevelFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitTopLevelFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitTopLevelGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitTopLevelGetterGet(Send node, FunctionElement getter, A arg) {
return null;
}
@override
- R visitTopLevelGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitTopLevelGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitTopLevelGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitTopLevelMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitTopLevelMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitTopLevelSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTypeVariableTypeLiteralCompound(
- Send node,
- TypeVariableElement element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTypeVariableTypeLiteralGet(
- Send node,
- TypeVariableElement element,
- A arg) {
+ Send node, TypeVariableElement element, A arg) {
return null;
}
@override
- R visitTypeVariableTypeLiteralInvoke(
- Send node,
- TypeVariableElement element,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTypeVariableTypeLiteralInvoke(Send node, TypeVariableElement element,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitTypeVariableTypeLiteralPostfix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg) {
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg) {
return null;
}
@override
R visitTypeVariableTypeLiteralPrefix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg) {
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitTypedefTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTypedefTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitTypedefTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return null;
}
@override
- R visitTypedefTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitTypedefTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return null;
}
@override
R visitTypedefTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnary(
- Send node,
- UnaryOperator operator,
- Node expression,
- A arg) {
+ R visitUnary(Send node, UnaryOperator operator, Node expression, A arg) {
apply(expression, arg);
return null;
}
@override
- R visitUnresolvedCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedCompound(Send node, Element element,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedGet(
- Send node,
- Element element,
- A arg) {
+ R visitUnresolvedGet(Send node, Element element, A arg) {
return null;
}
@override
- R visitUnresolvedInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedInvoke(Send node, Element element, NodeList arguments,
+ Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@override
R visitUnresolvedPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return null;
}
@override
R visitUnresolvedPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedSet(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSet(Send node, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R errorUndefinedBinaryExpression(
- Send node,
- Node left,
- Operator operator,
- Node right,
- A arg) {
+ Send node, Node left, Operator operator, Node right, A arg) {
apply(left, arg);
apply(right, arg);
return null;
@@ -6097,21 +3986,14 @@
@override
R errorUndefinedUnaryExpression(
- Send node,
- Operator operator,
- Node expression,
- A arg) {
+ Send node, Operator operator, Node expression, A arg) {
apply(expression, arg);
return null;
}
@override
R visitUnresolvedSuperIndexSet(
- Send node,
- Element element,
- Node index,
- Node rhs,
- A arg) {
+ Send node, Element element, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
@@ -6146,115 +4028,71 @@
}
@override
- R visitUnresolvedSuperCompoundIndexSet(
- SendSet node,
- Element element,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperCompoundIndexSet(SendSet node, Element element,
+ Node index, AssignmentOperator operator, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperBinary(
- Send node,
- Element element,
- BinaryOperator operator,
- Node argument,
- A arg) {
+ R visitUnresolvedSuperBinary(Send node, Element element,
+ BinaryOperator operator, Node argument, A arg) {
apply(argument, arg);
return null;
}
@override
R visitUnresolvedSuperUnary(
- Send node,
- UnaryOperator operator,
- Element element,
- A arg) {
+ Send node, UnaryOperator operator, Element element, A arg) {
return null;
}
@override
- R visitUnresolvedSuperGetterIndexPostfix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
- R visitUnresolvedSuperSetterIndexPostfix(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterIndexPostfix(Send node, MethodElement getter,
+ Element element, Node index, IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
R visitUnresolvedSuperIndexPostfix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
- R visitUnresolvedSuperGetterIndexPrefix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
- R visitUnresolvedSuperSetterIndexPrefix(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterIndexPrefix(Send node, MethodElement getter,
+ Element element, Node index, IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
R visitUnresolvedSuperIndexPrefix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
apply(index, arg);
return null;
}
@override
R visitIndexPostfix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
apply(receiver, arg);
apply(index, arg);
return null;
@@ -6262,11 +4100,7 @@
@override
R visitIndexPrefix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
apply(receiver, arg);
apply(index, arg);
return null;
@@ -6297,32 +4131,21 @@
}
@override
- R errorInvalidSetIfNull(
- Send node,
- ErroneousElement error,
- Node rhs,
- A arg) {
+ R errorInvalidSetIfNull(Send node, ErroneousElement error, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitClassTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ Send node, Node receiver, Name name, Node rhs, A arg) {
apply(receiver, arg);
apply(rhs, arg);
return null;
@@ -6330,71 +4153,49 @@
@override
R visitDynamicTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ Send node, LocalVariableElement variable, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ Send node, ParameterElement parameter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitIfNotNullDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ Send node, Node receiver, Name name, Node rhs, A arg) {
apply(receiver, arg);
apply(rhs, arg);
return null;
@@ -6402,338 +4203,223 @@
@override
R visitLocalFunctionSetIfNull(
- Send node,
- LocalFunctionElement function,
- Node rhs,
- A arg) {
+ Send node, LocalFunctionElement function, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ Send node, LocalVariableElement variable, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ Send node, ParameterElement parameter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitStaticFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitStaticGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitStaticMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
+ Send node, FunctionElement method, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitStaticMethodSetterSetIfNull(
- Send node,
- MethodElement method,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, MethodElement method, MethodElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperFieldFieldSetIfNull(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- Node rhs,
- A arg) {
+ R visitSuperFieldFieldSetIfNull(Send node, FieldElement readField,
+ FieldElement writtenField, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitSuperFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitSuperFieldSetterSetIfNull(
- Send node,
- FieldElement field,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitSuperGetterFieldSetIfNull(
- Send node,
- FunctionElement getter,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FunctionElement getter, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitSuperMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
+ Send node, FunctionElement method, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitSuperMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitThisPropertySetIfNull(
- Send node,
- Name name,
- Node rhs,
- A arg) {
+ R visitThisPropertySetIfNull(Send node, Name name, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
+ Send node, FieldElement field, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTopLevelMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
+ Send node, FunctionElement method, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitTopLevelMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTypeVariableTypeLiteralSetIfNull(
- Send node,
- TypeVariableElement element,
- Node rhs,
- A arg) {
+ Send node, TypeVariableElement element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitTypedefTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSetIfNull(Send node, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedStaticGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedStaticSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedSuperGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSetIfNull(Send node, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedSuperSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedTopLevelGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedTopLevelSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitConstConstructorInvoke(
- NewExpression node,
- ConstructedConstantExpression constant,
- A arg) {
+ NewExpression node, ConstructedConstantExpression constant, A arg) {
return null;
}
@override
- R visitBoolFromEnvironmentConstructorInvoke(
- NewExpression node,
- BoolFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
+ BoolFromEnvironmentConstantExpression constant, A arg) {
return null;
}
@override
- R visitIntFromEnvironmentConstructorInvoke(
- NewExpression node,
- IntFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitIntFromEnvironmentConstructorInvoke(NewExpression node,
+ IntFromEnvironmentConstantExpression constant, A arg) {
return null;
}
@override
- R visitStringFromEnvironmentConstructorInvoke(
- NewExpression node,
- StringFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitStringFromEnvironmentConstructorInvoke(NewExpression node,
+ StringFromEnvironmentConstantExpression constant, A arg) {
return null;
}
@@ -6762,13 +4448,8 @@
}
@override
- R visitUnresolvedConstructorInvoke(
- NewExpression node,
- Element constructor,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
+ DartType type, NodeList arguments, Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@@ -6848,442 +4529,279 @@
}
@override
- R errorNonConstantConstructorInvoke(
- NewExpression node,
- Element element,
- DartType type,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R errorNonConstantConstructorInvoke(NewExpression node, Element element,
+ DartType type, NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitUnresolvedStaticGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedTopLevelGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedTopLevelGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedStaticSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedTopLevelSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitStaticMethodCompound(
- Send node,
- MethodElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticMethodCompound(Send node, MethodElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedStaticGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedTopLevelGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedStaticSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedTopLevelSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return null;
}
@override
R visitStaticMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return null;
}
@override
R visitTopLevelMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedStaticGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedTopLevelGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedStaticSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedTopLevelSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return null;
}
@override
R visitStaticMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return null;
}
@override
R visitTopLevelMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitFinalLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitFinalLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return null;
}
@override
- R visitFinalLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitFinalLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperFieldFieldCompound(
- Send node, FieldElement readField,
- FieldElement writtenField,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldFieldCompound(Send node, FieldElement readField,
+ FieldElement writtenField, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitFinalSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitFinalSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitSuperMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitSuperMethodPostfix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
return null;
}
@override
R visitSuperMethodPrefix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
R visitFinalTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitTopLevelMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperCompound(Send node, Element element,
+ AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
R visitUnresolvedSuperPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return null;
}
@override
R visitUnresolvedSuperPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedSuperGetterCompound(
- Send node, Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedSuperGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedSuperSetterCompound(
- Send node, MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return null;
}
@override
- R visitUnresolvedSuperSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return null;
}
@override
R visitIndexSetIfNull(
- SendSet node,
- Node receiver,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Node index, Node rhs, A arg) {
apply(receiver, arg);
apply(index, arg);
apply(rhs, arg);
@@ -7291,52 +4809,32 @@
}
@override
- R visitSuperIndexSetIfNull(
- SendSet node,
- MethodElement getter,
- MethodElement setter,
- Node index,
- Node rhs,
- A arg) {
+ R visitSuperIndexSetIfNull(SendSet node, MethodElement getter,
+ MethodElement setter, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperGetterIndexSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperGetterIndexSetIfNull(Send node, Element element,
+ MethodElement setter, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
@override
- R visitUnresolvedSuperSetterIndexSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node index,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperSetterIndexSetIfNull(Send node, MethodElement getter,
+ Element element, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
}
-
@override
R visitUnresolvedSuperIndexSetIfNull(
- Send node,
- Element element,
- Node index,
- Node rhs,
- A arg) {
+ Send node, Element element, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
@@ -7344,11 +4842,7 @@
@override
R errorInvalidIndexSetIfNull(
- SendSet node,
- ErroneousElement error,
- Node index,
- Node rhs,
- A arg) {
+ SendSet node, ErroneousElement error, Node index, Node rhs, A arg) {
apply(index, arg);
apply(rhs, arg);
return null;
@@ -7376,34 +4870,23 @@
}
@override
- R visitAbstractMethodDeclaration(
- FunctionExpression node,
- MethodElement method,
- NodeList parameters,
- A arg) {
+ R visitAbstractMethodDeclaration(FunctionExpression node,
+ MethodElement method, NodeList parameters, A arg) {
applyParameters(parameters, arg);
return null;
}
@override
- R visitClosureDeclaration(
- FunctionExpression node,
- LocalFunctionElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitClosureDeclaration(FunctionExpression node,
+ LocalFunctionElement function, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
}
@override
- R visitFactoryConstructorDeclaration(
- FunctionExpression node,
- ConstructorElement constructor,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitFactoryConstructorDeclaration(FunctionExpression node,
+ ConstructorElement constructor, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7411,10 +4894,7 @@
@override
R visitFieldInitializer(
- SendSet node,
- FieldElement field,
- Node initializer,
- A arg) {
+ SendSet node, FieldElement field, Node initializer, A arg) {
apply(initializer, arg);
return null;
}
@@ -7434,24 +4914,16 @@
}
@override
- R visitInstanceMethodDeclaration(
- FunctionExpression node,
- MethodElement method,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitInstanceMethodDeclaration(FunctionExpression node,
+ MethodElement method, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
}
@override
- R visitLocalFunctionDeclaration(
- FunctionExpression node,
- LocalFunctionElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitLocalFunctionDeclaration(FunctionExpression node,
+ LocalFunctionElement function, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7482,12 +4954,8 @@
}
@override
- R visitStaticFunctionDeclaration(
- FunctionExpression node,
- MethodElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitStaticFunctionDeclaration(FunctionExpression node,
+ MethodElement function, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7506,32 +4974,21 @@
}
@override
- R visitImplicitSuperConstructorInvoke(
- FunctionExpression node,
- ConstructorElement superConstructor,
- InterfaceType type,
- A arg) {
+ R visitImplicitSuperConstructorInvoke(FunctionExpression node,
+ ConstructorElement superConstructor, InterfaceType type, A arg) {
return null;
}
@override
- R visitThisConstructorInvoke(
- Send node,
- ConstructorElement thisConstructor,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitThisConstructorInvoke(Send node, ConstructorElement thisConstructor,
+ NodeList arguments, CallStructure callStructure, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitTopLevelFunctionDeclaration(
- FunctionExpression node,
- MethodElement function,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitTopLevelFunctionDeclaration(FunctionExpression node,
+ MethodElement function, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7539,43 +4996,28 @@
@override
R errorUnresolvedFieldInitializer(
- SendSet node,
- Element element,
- Node initializer,
- A arg) {
+ SendSet node, Element element, Node initializer, A arg) {
apply(initializer, arg);
return null;
}
@override
- R errorUnresolvedSuperConstructorInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R errorUnresolvedSuperConstructorInvoke(Send node, Element element,
+ NodeList arguments, Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@override
- R errorUnresolvedThisConstructorInvoke(
- Send node,
- Element element,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R errorUnresolvedThisConstructorInvoke(Send node, Element element,
+ NodeList arguments, Selector selector, A arg) {
apply(arguments, arg);
return null;
}
@override
- R visitLocalVariableDeclaration(
- VariableDefinitions node,
- Node definition,
- LocalVariableElement variable,
- Node initializer,
- A arg) {
+ R visitLocalVariableDeclaration(VariableDefinitions node, Node definition,
+ LocalVariableElement variable, Node initializer, A arg) {
if (initializer != null) {
apply(initializer, arg);
}
@@ -7594,12 +5036,8 @@
}
@override
- R visitParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- int index,
- A arg) {
+ R visitParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, int index, A arg) {
return null;
}
@@ -7614,12 +5052,8 @@
}
@override
- R visitLocalConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- LocalVariableElement variable,
- ConstantExpression constant,
- A arg) {
+ R visitLocalConstantDeclaration(VariableDefinitions node, Node definition,
+ LocalVariableElement variable, ConstantExpression constant, A arg) {
return null;
}
@@ -7634,12 +5068,8 @@
}
@override
- R visitNamedParameterDeclaration(
- VariableDefinitions node,
- Node definition,
- ParameterElement parameter,
- ConstantExpression defaultValue,
- A arg) {
+ R visitNamedParameterDeclaration(VariableDefinitions node, Node definition,
+ ParameterElement parameter, ConstantExpression defaultValue, A arg) {
return null;
}
@@ -7655,12 +5085,8 @@
}
@override
- R visitInstanceFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg) {
+ R visitInstanceFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg) {
if (initializer != null) {
apply(initializer, arg);
}
@@ -7668,22 +5094,14 @@
}
@override
- R visitStaticConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- ConstantExpression constant,
- A arg) {
+ R visitStaticConstantDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, ConstantExpression constant, A arg) {
return null;
}
@override
- R visitStaticFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg) {
+ R visitStaticFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg) {
if (initializer != null) {
apply(initializer, arg);
}
@@ -7691,22 +5109,14 @@
}
@override
- R visitTopLevelConstantDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- ConstantExpression constant,
- A arg) {
+ R visitTopLevelConstantDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, ConstantExpression constant, A arg) {
return null;
}
@override
- R visitTopLevelFieldDeclaration(
- VariableDefinitions node,
- Node definition,
- FieldElement field,
- Node initializer,
- A arg) {
+ R visitTopLevelFieldDeclaration(VariableDefinitions node, Node definition,
+ FieldElement field, Node initializer, A arg) {
if (initializer != null) {
apply(initializer, arg);
}
@@ -7715,39 +5125,27 @@
@override
R visitAbstractGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- A arg) {
+ FunctionExpression node, MethodElement getter, A arg) {
return null;
}
@override
- R visitAbstractSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- A arg) {
+ R visitAbstractSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, A arg) {
applyParameters(parameters, arg);
return null;
}
@override
R visitInstanceGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg) {
+ FunctionExpression node, MethodElement getter, Node body, A arg) {
apply(body, arg);
return null;
}
@override
- R visitInstanceSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitInstanceSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7755,21 +5153,14 @@
@override
R visitStaticGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg) {
+ FunctionExpression node, MethodElement getter, Node body, A arg) {
apply(body, arg);
return null;
}
@override
- R visitStaticSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitStaticSetterDeclaration(FunctionExpression node, MethodElement setter,
+ NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7777,21 +5168,14 @@
@override
R visitTopLevelGetterDeclaration(
- FunctionExpression node,
- MethodElement getter,
- Node body,
- A arg) {
+ FunctionExpression node, MethodElement getter, Node body, A arg) {
apply(body, arg);
return null;
}
@override
- R visitTopLevelSetterDeclaration(
- FunctionExpression node,
- MethodElement setter,
- NodeList parameters,
- Node body,
- A arg) {
+ R visitTopLevelSetterDeclaration(FunctionExpression node,
+ MethodElement setter, NodeList parameters, Node body, A arg) {
applyParameters(parameters, arg);
apply(body, arg);
return null;
@@ -7801,8 +5185,7 @@
/// AST visitor that visits all normal [Send] and [SendSet] nodes using the
/// [SemanticVisitor].
class TraversalVisitor<R, A> extends SemanticVisitor<R, A>
- with TraversalSendMixin<R, A>,
- TraversalDeclarationMixin<R, A> {
+ with TraversalSendMixin<R, A>, TraversalDeclarationMixin<R, A> {
TraversalVisitor(TreeElements elements) : super(elements);
SemanticSendVisitor<R, A> get sendVisitor => this;
@@ -7849,350 +5232,204 @@
/// class members are handled uniformly.
abstract class BaseImplementationOfStaticsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleStaticFieldGet(
- Send node,
- FieldElement field,
- A arg);
+ R handleStaticFieldGet(Send node, FieldElement field, A arg);
- R handleStaticFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg);
- R handleStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ R handleStaticFieldSet(SendSet node, FieldElement field, Node rhs, A arg);
- R handleStaticFunctionGet(
- Send node,
- MethodElement function,
- A arg);
+ R handleStaticFunctionGet(Send node, MethodElement function, A arg);
- R handleStaticFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleStaticFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
- R handleStaticFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg);
- R handleStaticGetterGet(
- Send node,
- FunctionElement getter,
- A arg);
+ R handleStaticGetterGet(Send node, FunctionElement getter, A arg);
- R handleStaticGetterSet(
- Send node,
- FunctionElement getter,
- Node rhs,
- A arg);
+ R handleStaticGetterSet(Send node, FunctionElement getter, Node rhs, A arg);
- R handleStaticGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleStaticGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg);
- R handleStaticSetterGet(
- SendSet node,
- FunctionElement setter,
- A arg);
+ R handleStaticSetterGet(SendSet node, FunctionElement setter, A arg);
R handleStaticSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg);
+ SendSet node, FunctionElement setter, Node rhs, A arg);
- R handleStaticSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleStaticSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg);
R handleFinalStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg);
+ SendSet node, FieldElement field, Node rhs, A arg);
R handleStaticFunctionSet(
- SendSet node,
- MethodElement function,
- Node rhs,
- A arg);
+ SendSet node, MethodElement function, Node rhs, A arg);
@override
- R visitStaticFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitStaticFieldGet(Send node, FieldElement field, A arg) {
return handleStaticFieldGet(node, field, arg);
}
@override
- R visitStaticFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
return handleStaticFieldInvoke(node, field, arguments, callStructure, arg);
}
@override
- R visitStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitStaticFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return handleStaticFieldSet(node, field, rhs, arg);
}
@override
- R visitStaticFunctionGet(
- Send node,
- MethodElement function,
- A arg) {
+ R visitStaticFunctionGet(Send node, MethodElement function, A arg) {
return handleStaticFunctionGet(node, function, arg);
}
@override
- R visitStaticFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticFunctionInvoke(
node, function, arguments, callStructure, arg);
}
@override
- R visitStaticFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticFunctionIncompatibleInvoke(
node, function, arguments, callStructure, arg);
}
@override
- R visitStaticGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitStaticGetterGet(Send node, FunctionElement getter, A arg) {
return handleStaticGetterGet(node, getter, arg);
}
@override
- R visitStaticGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticGetterInvoke(
node, getter, arguments, callStructure, arg);
}
@override
R visitStaticSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement setter, Node rhs, A arg) {
return handleStaticSetterSet(node, setter, rhs, arg);
}
@override
- R visitTopLevelFieldGet(
- Send node,
- FieldElement field,
- A arg) {
+ R visitTopLevelFieldGet(Send node, FieldElement field, A arg) {
return handleStaticFieldGet(node, field, arg);
}
@override
- R visitTopLevelFieldInvoke(
- Send node,
- FieldElement field,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFieldInvoke(Send node, FieldElement field, NodeList arguments,
+ CallStructure callStructure, A arg) {
return handleStaticFieldInvoke(node, field, arguments, callStructure, arg);
}
@override
- R visitTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ R visitTopLevelFieldSet(SendSet node, FieldElement field, Node rhs, A arg) {
return handleStaticFieldSet(node, field, rhs, arg);
}
@override
- R visitTopLevelFunctionGet(
- Send node,
- MethodElement function,
- A arg) {
+ R visitTopLevelFunctionGet(Send node, MethodElement function, A arg) {
return handleStaticFunctionGet(node, function, arg);
}
@override
- R visitTopLevelFunctionInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFunctionInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticFunctionInvoke(
node, function, arguments, callStructure, arg);
}
@override
- R visitTopLevelFunctionIncompatibleInvoke(
- Send node,
- MethodElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelFunctionIncompatibleInvoke(Send node, MethodElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticFunctionIncompatibleInvoke(
node, function, arguments, callStructure, arg);
}
@override
- R visitTopLevelGetterGet(
- Send node,
- FunctionElement getter,
- A arg) {
+ R visitTopLevelGetterGet(Send node, FunctionElement getter, A arg) {
return handleStaticGetterGet(node, getter, arg);
}
@override
R visitTopLevelGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement getter, Node rhs, A arg) {
return handleStaticGetterSet(node, getter, rhs, arg);
}
@override
- R visitTopLevelGetterInvoke(
- Send node,
- FunctionElement getter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelGetterInvoke(Send node, FunctionElement getter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticGetterInvoke(
node, getter, arguments, callStructure, arg);
}
@override
R visitTopLevelSetterSet(
- SendSet node,
- FunctionElement setter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement setter, Node rhs, A arg) {
return handleStaticSetterSet(node, setter, rhs, arg);
}
@override
- R visitStaticSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitStaticSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticSetterInvoke(
node, setter, arguments, callStructure, arg);
}
@override
- R visitTopLevelSetterInvoke(
- Send node,
- FunctionElement setter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTopLevelSetterInvoke(Send node, FunctionElement setter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleStaticSetterInvoke(
node, setter, arguments, callStructure, arg);
}
@override
- R visitStaticSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitStaticSetterGet(Send node, FunctionElement setter, A arg) {
return handleStaticSetterGet(node, setter, arg);
}
@override
R visitStaticGetterSet(
- SendSet node,
- FunctionElement getter,
- Node rhs,
- A arg) {
+ SendSet node, FunctionElement getter, Node rhs, A arg) {
return handleStaticGetterSet(node, getter, rhs, arg);
}
@override
- R visitTopLevelSetterGet(
- Send node,
- FunctionElement setter,
- A arg) {
+ R visitTopLevelSetterGet(Send node, FunctionElement setter, A arg) {
return handleStaticSetterGet(node, setter, arg);
}
@override
R visitFinalStaticFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ SendSet node, FieldElement field, Node rhs, A arg) {
return handleFinalStaticFieldSet(node, field, rhs, arg);
}
@override
R visitFinalTopLevelFieldSet(
- SendSet node,
- FieldElement field,
- Node rhs,
- A arg) {
+ SendSet node, FieldElement field, Node rhs, A arg) {
return handleFinalStaticFieldSet(node, field, rhs, arg);
}
@override
- R visitStaticFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg) {
+ R visitStaticFunctionSet(Send node, MethodElement function, Node rhs, A arg) {
return handleStaticFunctionSet(node, function, rhs, arg);
}
@override
R visitTopLevelFunctionSet(
- Send node,
- MethodElement function,
- Node rhs,
- A arg) {
+ Send node, MethodElement function, Node rhs, A arg) {
return handleStaticFunctionSet(node, function, rhs, arg);
}
}
@@ -8204,436 +5441,271 @@
/// class members are handled uniformly.
abstract class BaseImplementationOfStaticCompoundsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
R handleStaticFieldPostfixPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg,
+ Send node, FieldElement field, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleStaticGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleStaticGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
- R handleStaticGetterSetterPostfixPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg,
+ R handleStaticGetterSetterPostfixPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleStaticMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleStaticMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
- R handleStaticMethodSetterPostfixPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg,
+ R handleStaticMethodSetterPostfixPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleFinalStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleFinalStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg);
R handleFinalStaticFieldPostfixPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg,
+ Send node, FieldElement field, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleStaticMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleStaticMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg);
R handleStaticMethodPostfixPrefix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg,
+ Send node, FunctionElement method, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleUnresolvedStaticGetterCompound(
- Send node,
- Element element,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleUnresolvedStaticGetterCompound(Send node, Element element,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg);
- R handleUnresolvedStaticGetterPostfixPrefix(
- Send node,
- Element element,
- FunctionElement setter,
- IncDecOperator operator,
- A arg,
+ R handleUnresolvedStaticGetterPostfixPrefix(Send node, Element element,
+ FunctionElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleUnresolvedStaticSetterCompound(
- Send node,
- FunctionElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleUnresolvedStaticSetterCompound(Send node, FunctionElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg);
- R handleUnresolvedStaticSetterPostfixPrefix(
- Send node,
- FunctionElement getter,
- Element element,
- IncDecOperator operator,
- A arg,
+ R handleUnresolvedStaticSetterPostfixPrefix(Send node, FunctionElement getter,
+ Element element, IncDecOperator operator, A arg,
{bool isPrefix});
@override
- R visitStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleStaticFieldCompound(node, field, operator, rhs, arg);
}
@override
R visitStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleStaticFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: false);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleStaticFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: false);
}
@override
R visitStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleStaticFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: true);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleStaticFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: true);
}
@override
- R visitStaticGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleStaticGetterSetterCompound(
node, getter, setter, operator, rhs, arg);
}
@override
- R visitStaticGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticGetterSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: false);
+ node, getter, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitStaticGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticGetterSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: true);
+ node, getter, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitStaticMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitStaticMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleStaticMethodSetterCompound(
node, method, setter, operator, rhs, arg);
}
@override
- R visitStaticMethodSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticMethodSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: false);
+ node, getter, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitStaticMethodSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticMethodSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: true);
+ node, getter, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleStaticFieldCompound(node, field, operator, rhs, arg);
}
@override
R visitTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleStaticFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: false);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleStaticFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: false);
}
@override
R visitTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleStaticFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: true);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleStaticFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: true);
}
@override
- R visitTopLevelGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleStaticGetterSetterCompound(
node, getter, setter, operator, rhs, arg);
}
@override
- R visitTopLevelGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticGetterSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: false);
+ node, getter, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitTopLevelGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticGetterSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: true);
+ node, getter, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitTopLevelMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleStaticMethodSetterCompound(
node, method, setter, operator, rhs, arg);
}
@override
- R visitTopLevelMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticMethodSetterPostfixPrefix(
- node, method, setter, operator, arg, isPrefix: false);
+ node, method, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitTopLevelMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticMethodSetterPostfixPrefix(
- node, method, setter, operator, arg, isPrefix: true);
+ node, method, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitFinalStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleFinalStaticFieldCompound(
- node, field, operator, rhs, arg);
+ R visitFinalStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleFinalStaticFieldCompound(node, field, operator, rhs, arg);
}
@override
R visitFinalStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleFinalStaticFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: false);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleFinalStaticFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: false);
}
@override
R visitFinalStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleFinalStaticFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: true);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleFinalStaticFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: true);
}
@override
- R visitStaticMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticMethodCompound(
- node, method, operator, rhs, arg);
+ R visitStaticMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticMethodCompound(node, method, operator, rhs, arg);
}
@override
R visitStaticMethodPostfix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
- return handleStaticMethodPostfixPrefix(
- node, method, operator, arg, isPrefix: false);
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
+ return handleStaticMethodPostfixPrefix(node, method, operator, arg,
+ isPrefix: false);
}
@override
R visitStaticMethodPrefix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
- return handleStaticMethodPostfixPrefix(
- node, method, operator, arg, isPrefix: true);
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
+ return handleStaticMethodPostfixPrefix(node, method, operator, arg,
+ isPrefix: true);
}
@override
- R visitUnresolvedStaticGetterCompound(
- Send node,
- Element element,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticGetterCompound(Send node, Element element,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleUnresolvedStaticGetterCompound(
node, element, setter, operator, rhs, arg);
}
@override
- R visitUnresolvedStaticGetterPostfix(
- Send node,
- Element element,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPostfix(Send node, Element element,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleUnresolvedStaticGetterPostfixPrefix(
- node, element, setter, operator, arg, isPrefix: false);
+ node, element, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitUnresolvedStaticGetterPrefix(
- Send node,
- Element element,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPrefix(Send node, Element element,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleUnresolvedStaticGetterPostfixPrefix(
- node, element, setter, operator, arg, isPrefix: true);
+ node, element, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitUnresolvedStaticSetterCompound(
- Send node,
- FunctionElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticSetterCompound(Send node, FunctionElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
return handleUnresolvedStaticSetterCompound(
node, getter, element, operator, rhs, arg);
}
@override
- R visitUnresolvedStaticSetterPostfix(
- Send node,
- FunctionElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPostfix(Send node, FunctionElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleUnresolvedStaticSetterPostfixPrefix(
- node, getter, element, operator, arg, isPrefix: false);
+ node, getter, element, operator, arg,
+ isPrefix: false);
}
@override
- R visitUnresolvedStaticSetterPrefix(
- Send node,
- FunctionElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPrefix(Send node, FunctionElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleUnresolvedStaticSetterPostfixPrefix(
- node, getter, element, operator, arg, isPrefix: true);
+ node, getter, element, operator, arg,
+ isPrefix: true);
}
}
@@ -8644,45 +5716,24 @@
/// and local functions, captured or not, are handled uniformly.
abstract class BaseImplementationOfLocalsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleLocalGet(
- Send node,
- LocalElement element,
- A arg);
+ R handleLocalGet(Send node, LocalElement element, A arg);
- R handleLocalInvoke(
- Send node,
- LocalElement element,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleLocalInvoke(Send node, LocalElement element, NodeList arguments,
+ CallStructure callStructure, A arg);
- R handleLocalSet(
- SendSet node,
- LocalElement element,
- Node rhs,
- A arg);
+ R handleLocalSet(SendSet node, LocalElement element, Node rhs, A arg);
R handleImmutableLocalSet(
- SendSet node,
- LocalElement element,
- Node rhs,
- A arg);
+ SendSet node, LocalElement element, Node rhs, A arg);
@override
- R visitLocalFunctionGet(
- Send node,
- LocalFunctionElement function,
- A arg) {
+ R visitLocalFunctionGet(Send node, LocalFunctionElement function, A arg) {
return handleLocalGet(node, function, arg);
}
@override
- R visitLocalFunctionInvoke(
- Send node,
- LocalFunctionElement function,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitLocalFunctionInvoke(Send node, LocalFunctionElement function,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleLocalInvoke(node, function, arguments, callStructure, arg);
}
@@ -8697,83 +5748,54 @@
}
@override
- R visitLocalVariableGet(
- Send node,
- LocalVariableElement variable,
- A arg) {
+ R visitLocalVariableGet(Send node, LocalVariableElement variable, A arg) {
return handleLocalGet(node, variable, arg);
}
@override
- R visitLocalVariableInvoke(
- Send node,
- LocalVariableElement variable,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitLocalVariableInvoke(Send node, LocalVariableElement variable,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleLocalInvoke(node, variable, arguments, callStructure, arg);
}
@override
R visitLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ SendSet node, LocalVariableElement variable, Node rhs, A arg) {
return handleLocalSet(node, variable, rhs, arg);
}
@override
- R visitParameterGet(
- Send node,
- ParameterElement parameter,
- A arg) {
+ R visitParameterGet(Send node, ParameterElement parameter, A arg) {
return handleLocalGet(node, parameter, arg);
}
@override
- R visitParameterInvoke(
- Send node,
- ParameterElement parameter,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitParameterInvoke(Send node, ParameterElement parameter,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleLocalInvoke(node, parameter, arguments, callStructure, arg);
}
@override
R visitParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ SendSet node, ParameterElement parameter, Node rhs, A arg) {
return handleLocalSet(node, parameter, rhs, arg);
}
@override
R visitFinalLocalVariableSet(
- SendSet node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
+ SendSet node, LocalVariableElement variable, Node rhs, A arg) {
return handleImmutableLocalSet(node, variable, rhs, arg);
}
@override
R visitFinalParameterSet(
- SendSet node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
+ SendSet node, ParameterElement parameter, Node rhs, A arg) {
return handleImmutableLocalSet(node, parameter, rhs, arg);
}
@override
R visitLocalFunctionSet(
- SendSet node,
- LocalFunctionElement function,
- Node rhs,
- A arg) {
+ SendSet node, LocalFunctionElement function, Node rhs, A arg) {
return handleImmutableLocalSet(node, function, rhs, arg);
}
}
@@ -8785,78 +5807,51 @@
/// and local functions, captured or not, are handled uniformly.
abstract class BaseImplementationOfLocalCompoundsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleLocalCompound(
- Send node,
- LocalElement element,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleLocalCompound(Send node, LocalElement element,
+ AssignmentOperator operator, Node rhs, A arg);
R handleLocalPostfixPrefix(
- Send node,
- LocalElement element,
- IncDecOperator operator,
- A arg,
+ Send node, LocalElement element, IncDecOperator operator, A arg,
{bool isPrefix});
@override
- R visitLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompound(node, variable, operator, rhs, arg);
}
@override
- R visitLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
- return handleLocalPostfixPrefix(
- node, variable, operator, arg, isPrefix: false);
+ R visitLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
+ return handleLocalPostfixPrefix(node, variable, operator, arg,
+ isPrefix: false);
}
@override
- R visitLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
- return handleLocalPostfixPrefix(
- node, variable, operator, arg, isPrefix: true);
+ R visitLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
+ return handleLocalPostfixPrefix(node, variable, operator, arg,
+ isPrefix: true);
}
@override
- R visitParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompound(node, parameter, operator, rhs, arg);
}
@override
R visitParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
- return handleLocalPostfixPrefix(
- node, parameter, operator, arg, isPrefix: false);
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
+ return handleLocalPostfixPrefix(node, parameter, operator, arg,
+ isPrefix: false);
}
@override
R visitParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
- return handleLocalPostfixPrefix(
- node, parameter, operator, arg, isPrefix: true);
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
+ return handleLocalPostfixPrefix(node, parameter, operator, arg,
+ isPrefix: true);
}
}
@@ -8867,119 +5862,76 @@
/// handled uniformly.
abstract class BaseImplementationOfConstantsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleConstantGet(
- Node node,
- ConstantExpression constant,
- A arg);
+ R handleConstantGet(Node node, ConstantExpression constant, A arg);
- R handleConstantInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleConstantInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg);
@override
- R visitClassTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitClassTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitClassTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitClassTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleConstantInvoke(node, constant, arguments, callStructure, arg);
}
@override
R visitConstConstructorInvoke(
- NewExpression node,
- ConstructedConstantExpression constant,
- A arg) {
+ NewExpression node, ConstructedConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitBoolFromEnvironmentConstructorInvoke(
- NewExpression node,
- BoolFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitBoolFromEnvironmentConstructorInvoke(NewExpression node,
+ BoolFromEnvironmentConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitIntFromEnvironmentConstructorInvoke(
- NewExpression node,
- IntFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitIntFromEnvironmentConstructorInvoke(NewExpression node,
+ IntFromEnvironmentConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitStringFromEnvironmentConstructorInvoke(
- NewExpression node,
- StringFromEnvironmentConstantExpression constant,
- A arg) {
+ R visitStringFromEnvironmentConstructorInvoke(NewExpression node,
+ StringFromEnvironmentConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitConstantGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitConstantGet(Send node, ConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitConstantInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitConstantInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleConstantInvoke(node, constant, arguments, callStructure, arg);
}
@override
- R visitDynamicTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitDynamicTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitDynamicTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitDynamicTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleConstantInvoke(node, constant, arguments, callStructure, arg);
}
@override
- R visitTypedefTypeLiteralGet(
- Send node,
- ConstantExpression constant,
- A arg) {
+ R visitTypedefTypeLiteralGet(Send node, ConstantExpression constant, A arg) {
return handleConstantGet(node, constant, arg);
}
@override
- R visitTypedefTypeLiteralInvoke(
- Send node,
- ConstantExpression constant,
- NodeList arguments,
- CallStructure callStructure,
- A arg) {
+ R visitTypedefTypeLiteralInvoke(Send node, ConstantExpression constant,
+ NodeList arguments, CallStructure callStructure, A arg) {
return handleConstantInvoke(node, constant, arguments, callStructure, arg);
}
}
@@ -8992,108 +5944,62 @@
/// handled uniformly.
abstract class BaseImplementationOfDynamicsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleDynamicGet(
- Send node,
- Node receiver,
- Name name,
- A arg);
+ R handleDynamicGet(Send node, Node receiver, Name name, A arg);
R handleDynamicInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg);
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg);
- R handleDynamicSet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg);
+ R handleDynamicSet(SendSet node, Node receiver, Name name, Node rhs, A arg);
@override
- R visitDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg) {
+ R visitDynamicPropertyGet(Send node, Node receiver, Name name, A arg) {
return handleDynamicGet(node, receiver, name, arg);
}
@override
R visitIfNotNullDynamicPropertyGet(
- Send node,
- Node receiver,
- Name name,
- A arg) {
+ Send node, Node receiver, Name name, A arg) {
// TODO(johnniwinther): should these redirect to handleDynamicX?
return handleDynamicGet(node, receiver, name, arg);
}
@override
R visitDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg) {
return handleDynamicInvoke(node, receiver, arguments, selector, arg);
}
@override
R visitIfNotNullDynamicPropertyInvoke(
- Send node,
- Node receiver,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, Node receiver, NodeList arguments, Selector selector, A arg) {
return handleDynamicInvoke(node, receiver, arguments, selector, arg);
}
@override
R visitDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Name name, Node rhs, A arg) {
return handleDynamicSet(node, receiver, name, rhs, arg);
}
@override
R visitIfNotNullDynamicPropertySet(
- SendSet node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ SendSet node, Node receiver, Name name, Node rhs, A arg) {
return handleDynamicSet(node, receiver, name, rhs, arg);
}
@override
- R visitThisPropertyGet(
- Send node,
- Name name,
- A arg) {
+ R visitThisPropertyGet(Send node, Name name, A arg) {
return handleDynamicGet(node, null, name, arg);
}
@override
R visitThisPropertyInvoke(
- Send node,
- NodeList arguments,
- Selector selector,
- A arg) {
+ Send node, NodeList arguments, Selector selector, A arg) {
return handleDynamicInvoke(node, null, arguments, selector, arg);
}
@override
- R visitThisPropertySet(
- SendSet node,
- Name name,
- Node rhs,
- A arg) {
+ R visitThisPropertySet(SendSet node, Name name, Node rhs, A arg) {
return handleDynamicSet(node, null, name, rhs, arg);
}
}
@@ -9106,148 +6012,89 @@
/// handled uniformly.
abstract class BaseImplementationOfDynamicCompoundsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleDynamicCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg);
+ R handleDynamicCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg);
R handleDynamicPostfixPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg,
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg,
{bool isPrefix});
R handleDynamicIndexPostfixPrefix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg,
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg,
{bool isPrefix});
@override
- R visitDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleDynamicCompound(
- node, receiver, name, operator, rhs, arg);
+ R visitDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleDynamicCompound(node, receiver, name, operator, rhs, arg);
}
@override
- R visitIfNotNullDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleDynamicCompound(
- node, receiver, name, operator, rhs, arg);
+ R visitIfNotNullDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleDynamicCompound(node, receiver, name, operator, rhs, arg);
}
@override
R visitDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicPostfixPrefix(
- node, receiver, name, operator, arg, isPrefix: false);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicPostfixPrefix(node, receiver, name, operator, arg,
+ isPrefix: false);
}
@override
R visitIfNotNullDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicPostfixPrefix(
- node, receiver, name, operator, arg, isPrefix: false);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicPostfixPrefix(node, receiver, name, operator, arg,
+ isPrefix: false);
}
@override
R visitDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicPostfixPrefix(
- node, receiver, name, operator, arg, isPrefix: true);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicPostfixPrefix(node, receiver, name, operator, arg,
+ isPrefix: true);
}
@override
R visitIfNotNullDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicPostfixPrefix(
- node, receiver, name, operator, arg, isPrefix: true);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicPostfixPrefix(node, receiver, name, operator, arg,
+ isPrefix: true);
}
@override
R visitThisPropertyCompound(
- Send node,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ Send node, Name name, AssignmentOperator operator, Node rhs, A arg) {
return handleDynamicCompound(node, null, name, operator, rhs, arg);
}
@override
R visitThisPropertyPostfix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicPostfixPrefix(
- node, null, name, operator, arg, isPrefix: false);
+ Send node, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicPostfixPrefix(node, null, name, operator, arg,
+ isPrefix: false);
}
@override
R visitThisPropertyPrefix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicPostfixPrefix(
- node, null, name, operator, arg, isPrefix: true);
+ Send node, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicPostfixPrefix(node, null, name, operator, arg,
+ isPrefix: true);
}
@override
R visitIndexPostfix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
- return handleDynamicIndexPostfixPrefix(
- node, receiver, index, operator, arg, isPrefix: false);
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
+ return handleDynamicIndexPostfixPrefix(node, receiver, index, operator, arg,
+ isPrefix: false);
}
@override
R visitIndexPrefix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
- return handleDynamicIndexPostfixPrefix(
- node, receiver, index, operator, arg, isPrefix: true);
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
+ return handleDynamicIndexPostfixPrefix(node, receiver, index, operator, arg,
+ isPrefix: true);
}
}
@@ -9331,7 +6178,6 @@
/// Simplified handling of compound assignments and prefix/postfix expressions.
abstract class BaseImplementationOfCompoundsMixin<R, A>
implements SemanticSendVisitor<R, A> {
-
/// Handle a super compounds, like `super.foo += 42` or `--super.bar`.
R handleSuperCompounds(
SendSet node,
@@ -9355,1067 +6201,663 @@
/// Handle a local compounds, like `foo += 42` or `--bar`. If [isSetterValid]
/// is false [local] is unassignable.
R handleLocalCompounds(
- SendSet node,
- LocalElement local,
- CompoundRhs rhs,
- A arg,
+ SendSet node, LocalElement local, CompoundRhs rhs, A arg,
{bool isSetterValid});
/// Handle a compounds on a type literal constant, like `Object += 42` or
/// `--Object`.
R handleTypeLiteralConstantCompounds(
- SendSet node,
- ConstantExpression constant,
- CompoundRhs rhs,
- A arg);
+ SendSet node, ConstantExpression constant, CompoundRhs rhs, A arg);
/// Handle a compounds on a type variable type literal, like `T += 42` or
/// `--T`.
R handleTypeVariableTypeLiteralCompounds(
- SendSet node,
- TypeVariableElement typeVariable,
- CompoundRhs rhs,
- A arg);
+ SendSet node, TypeVariableElement typeVariable, CompoundRhs rhs, A arg);
/// Handle a dynamic compounds, like `o.foo += 42` or `--o.foo`. [receiver] is
/// `null` for properties on `this`, like `--this.foo` or `--foo`.
R handleDynamicCompounds(
- Send node,
- Node receiver,
- Name name,
- CompoundRhs rhs,
- A arg);
+ Send node, Node receiver, Name name, CompoundRhs rhs, A arg);
- R visitDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleDynamicCompounds(
- node,
- receiver,
- name,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, receiver, name, new AssignmentCompound(operator, rhs), arg);
}
- R visitIfNotNullDynamicPropertyCompound(
- Send node,
- Node receiver,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitIfNotNullDynamicPropertyCompound(Send node, Node receiver, Name name,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleDynamicCompounds(
- node,
- receiver,
- name,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, receiver, name, new AssignmentCompound(operator, rhs), arg);
}
@override
R visitThisPropertyCompound(
- Send node,
- Name name,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ Send node, Name name, AssignmentOperator operator, Node rhs, A arg) {
return handleDynamicCompounds(
- node,
- null,
- name,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, null, name, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompounds(
- node,
- parameter,
- new AssignmentCompound(operator, rhs),
- arg,
+ node, parameter, new AssignmentCompound(operator, rhs), arg,
isSetterValid: true);
}
@override
- R visitFinalParameterCompound(
- Send node,
- ParameterElement parameter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalParameterCompound(Send node, ParameterElement parameter,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompounds(
- node,
- parameter,
- new AssignmentCompound(operator, rhs),
- arg,
+ node, parameter, new AssignmentCompound(operator, rhs), arg,
isSetterValid: false);
}
@override
- R visitLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompounds(
- node,
- variable,
- new AssignmentCompound(operator, rhs),
- arg,
+ node, variable, new AssignmentCompound(operator, rhs), arg,
isSetterValid: true);
}
@override
- R visitFinalLocalVariableCompound(
- Send node,
- LocalVariableElement variable,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitFinalLocalVariableCompound(Send node, LocalVariableElement variable,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompounds(
- node,
- variable,
- new AssignmentCompound(operator, rhs),
- arg,
+ node, variable, new AssignmentCompound(operator, rhs), arg,
isSetterValid: false);
}
@override
- R visitLocalFunctionCompound(
- Send node,
- LocalFunctionElement function,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitLocalFunctionCompound(Send node, LocalFunctionElement function,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleLocalCompounds(
- node,
- function,
- new AssignmentCompound(operator, rhs),
- arg,
+ node, function, new AssignmentCompound(operator, rhs), arg,
isSetterValid: false);
}
@override
- R visitStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.FIELD, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitFinalStaticFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- field, CompoundGetter.FIELD,
- null, CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitFinalStaticFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, field, CompoundGetter.FIELD, null,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitStaticGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitStaticGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, getter, CompoundGetter.GETTER, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitStaticMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitStaticMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, method, CompoundGetter.METHOD, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.FIELD, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitFinalTopLevelFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- field, CompoundGetter.FIELD,
- null, CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitFinalTopLevelFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, field, CompoundGetter.FIELD, null,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitTopLevelGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitTopLevelGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, getter, CompoundGetter.GETTER, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitTopLevelMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitTopLevelMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, method, CompoundGetter.METHOD, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.FIELD, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitFinalSuperFieldCompound(
- Send node,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitFinalSuperFieldCompound(Send node, FieldElement field,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitSuperGetterSetterCompound(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitSuperGetterSetterCompound(Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, getter, CompoundGetter.GETTER, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitSuperMethodSetterCompound(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitSuperMethodSetterCompound(Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, method, CompoundGetter.METHOD, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitSuperFieldSetterCompound(
- Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- field, CompoundGetter.FIELD,
- setter, CompoundSetter.SETTER,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitSuperFieldSetterCompound(Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, field, CompoundGetter.FIELD, setter,
+ CompoundSetter.SETTER, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitSuperGetterFieldCompound(
- Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- getter, CompoundGetter.GETTER,
- field, CompoundSetter.FIELD,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitSuperGetterFieldCompound(Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, getter, CompoundGetter.GETTER, field,
+ CompoundSetter.FIELD, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitClassTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitClassTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, constant, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitTypedefTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTypedefTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, constant, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitTypeVariableTypeLiteralCompound(
- Send node,
- TypeVariableElement element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitTypeVariableTypeLiteralCompound(Send node, TypeVariableElement element,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleTypeVariableTypeLiteralCompounds(
- node,
- element,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, element, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitDynamicTypeLiteralCompound(
- Send node,
- ConstantExpression constant,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitDynamicTypeLiteralCompound(Send node, ConstantExpression constant,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new AssignmentCompound(operator, rhs),
- arg);
+ node, constant, new AssignmentCompound(operator, rhs), arg);
}
-
R visitDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicCompounds(
- node,
- receiver,
- name,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicCompounds(node, receiver, name,
+ new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
R visitIfNotNullDynamicPropertyPrefix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicCompounds(
- node,
- receiver,
- name,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicCompounds(node, receiver, name,
+ new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
@override
R visitParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- parameter,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg,
+ node, parameter, new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isSetterValid: true);
}
@override
- R visitLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- variable,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg,
+ node, variable, new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isSetterValid: true);
}
@override
- R visitLocalFunctionPrefix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg) {
+ R visitLocalFunctionPrefix(Send node, LocalFunctionElement function,
+ IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- function,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg,
+ node, function, new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isSetterValid: false);
}
-
R visitThisPropertyPrefix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicCompounds(
- node,
- null,
- name,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ Send node, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicCompounds(node, null, name,
+ new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
@override
R visitStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
+ field,
+ CompoundGetter.FIELD,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitStaticGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.GETTER,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
-
- R visitStaticMethodSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- getter, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.METHOD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
R visitTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
+ field,
+ CompoundGetter.FIELD,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitTopLevelGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.GETTER,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitTopLevelMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
+ method,
+ CompoundGetter.METHOD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
R visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
+ field,
+ CompoundGetter.FIELD,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- readField, CompoundGetter.FIELD,
- writtenField, CompoundSetter.FIELD,
+ readField,
+ CompoundGetter.FIELD,
+ writtenField,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- field, CompoundGetter.FIELD,
- setter, CompoundSetter.SETTER,
+ field,
+ CompoundGetter.FIELD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.GETTER,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- getter, CompoundGetter.GETTER,
- field, CompoundSetter.FIELD,
+ getter,
+ CompoundGetter.GETTER,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
- R visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
+ method,
+ CompoundGetter.METHOD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.PREFIX, operator),
arg);
}
@override
R visitClassTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ node, constant, new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
@override
R visitTypedefTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ node, constant, new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
@override
R visitTypeVariableTypeLiteralPrefix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg) {
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg) {
return handleTypeVariableTypeLiteralCompounds(
- node,
- element,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ node, element, new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
@override
R visitDynamicTypeLiteralPrefix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg);
+ node, constant, new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
@override
R visitDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicCompounds(
- node,
- receiver,
- name,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicCompounds(node, receiver, name,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitIfNotNullDynamicPropertyPostfix(
- Send node,
- Node receiver,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicCompounds(
- node,
- receiver,
- name,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ Send node, Node receiver, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicCompounds(node, receiver, name,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
- return handleLocalCompounds(
- node,
- parameter,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg,
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
+ return handleLocalCompounds(node, parameter,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isSetterValid: true);
}
@override
- R visitLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- variable,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg,
+ node, variable, new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isSetterValid: true);
}
@override
- R visitLocalFunctionPostfix(
- Send node,
- LocalFunctionElement function,
- IncDecOperator operator,
- A arg) {
+ R visitLocalFunctionPostfix(Send node, LocalFunctionElement function,
+ IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- function,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg,
+ node, function, new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isSetterValid: false);
}
-
R visitThisPropertyPostfix(
- Send node,
- Name name,
- IncDecOperator operator,
- A arg) {
- return handleDynamicCompounds(
- node,
- null,
- name,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ Send node, Name name, IncDecOperator operator, A arg) {
+ return handleDynamicCompounds(node, null, name,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
+ field,
+ CompoundGetter.FIELD,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitStaticGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.GETTER,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
-
- R visitStaticMethodSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitStaticMethodSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- getter, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.METHOD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
R visitTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
+ field,
+ CompoundGetter.FIELD,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitTopLevelGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.GETTER,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitTopLevelMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitTopLevelMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
+ method,
+ CompoundGetter.METHOD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
R visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- field, CompoundGetter.FIELD,
- field, CompoundSetter.FIELD,
+ field,
+ CompoundGetter.FIELD,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPostfix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- readField, CompoundGetter.FIELD,
- writtenField, CompoundSetter.FIELD,
+ readField,
+ CompoundGetter.FIELD,
+ writtenField,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPostfix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- field, CompoundGetter.FIELD,
- setter, CompoundSetter.SETTER,
+ field,
+ CompoundGetter.FIELD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
-
- R visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- getter, CompoundGetter.GETTER,
- setter, CompoundSetter.SETTER,
+ getter,
+ CompoundGetter.GETTER,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- getter, CompoundGetter.GETTER,
- field, CompoundSetter.FIELD,
+ getter,
+ CompoundGetter.GETTER,
+ field,
+ CompoundSetter.FIELD,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
- R visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
- method, CompoundGetter.METHOD,
- setter, CompoundSetter.SETTER,
+ method,
+ CompoundGetter.METHOD,
+ setter,
+ CompoundSetter.SETTER,
new IncDecCompound(CompoundKind.POSTFIX, operator),
arg);
}
@override
R visitClassTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
- return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
+ return handleTypeLiteralConstantCompounds(node, constant,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitTypedefTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
- return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
+ return handleTypeLiteralConstantCompounds(node, constant,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitTypeVariableTypeLiteralPostfix(
- Send node,
- TypeVariableElement element,
- IncDecOperator operator,
- A arg) {
+ Send node, TypeVariableElement element, IncDecOperator operator, A arg) {
return handleTypeVariableTypeLiteralCompounds(
- node,
- element,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ node, element, new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitDynamicTypeLiteralPostfix(
- Send node,
- ConstantExpression constant,
- IncDecOperator operator,
- A arg) {
- return handleTypeLiteralConstantCompounds(
- node,
- constant,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg);
+ Send node, ConstantExpression constant, IncDecOperator operator, A arg) {
+ return handleTypeLiteralConstantCompounds(node, constant,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
- R visitUnresolvedStaticGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10427,12 +6869,8 @@
}
@override
- R visitUnresolvedTopLevelGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10444,12 +6882,8 @@
}
@override
- R visitUnresolvedStaticSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
getter,
@@ -10461,12 +6895,8 @@
}
@override
- R visitUnresolvedTopLevelSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
getter,
@@ -10479,10 +6909,7 @@
@override
R visitStaticMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
method,
@@ -10495,10 +6922,7 @@
@override
R visitTopLevelMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
method,
@@ -10511,10 +6935,7 @@
@override
R visitUnresolvedPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10526,12 +6947,8 @@
}
@override
- R visitUnresolvedStaticGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10543,12 +6960,8 @@
}
@override
- R visitUnresolvedTopLevelGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10560,12 +6973,8 @@
}
@override
- R visitUnresolvedStaticSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedStaticSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
getter,
@@ -10577,12 +6986,8 @@
}
@override
- R visitUnresolvedTopLevelSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedTopLevelSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
getter,
@@ -10595,10 +7000,7 @@
@override
R visitStaticMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
method,
@@ -10611,10 +7013,7 @@
@override
R visitTopLevelMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
method,
@@ -10627,10 +7026,7 @@
@override
R visitUnresolvedPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10642,13 +7038,8 @@
}
@override
- R visitUnresolvedStaticGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedStaticGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10660,13 +7051,8 @@
}
@override
- R visitUnresolvedTopLevelGetterCompound(
- Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedTopLevelGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10678,82 +7064,36 @@
}
@override
- R visitUnresolvedStaticSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- getter,
- CompoundGetter.GETTER,
- element,
- CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitUnresolvedStaticSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, getter, CompoundGetter.GETTER, element,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitUnresolvedTopLevelSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- getter,
- CompoundGetter.GETTER,
- element,
- CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitUnresolvedTopLevelSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, getter, CompoundGetter.GETTER, element,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitStaticMethodCompound(
- Send node,
- MethodElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- method,
- CompoundGetter.METHOD,
- method,
- CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitStaticMethodCompound(Send node, MethodElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, method, CompoundGetter.METHOD, method,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitTopLevelMethodCompound(
- Send node,
- MethodElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleStaticCompounds(
- node,
- method,
- CompoundGetter.METHOD,
- method,
- CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitTopLevelMethodCompound(Send node, MethodElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleStaticCompounds(node, method, CompoundGetter.METHOD, method,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitUnresolvedCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedCompound(Send node, Element element,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleStaticCompounds(
node,
element,
@@ -10765,67 +7105,40 @@
}
@override
- R visitFinalLocalVariablePostfix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitFinalLocalVariablePostfix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- variable,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg,
+ node, variable, new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isSetterValid: false);
}
@override
- R visitFinalLocalVariablePrefix(
- Send node,
- LocalVariableElement variable,
- IncDecOperator operator,
- A arg) {
+ R visitFinalLocalVariablePrefix(Send node, LocalVariableElement variable,
+ IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- variable,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg,
+ node, variable, new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isSetterValid: false);
}
@override
R visitFinalParameterPostfix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
- return handleLocalCompounds(
- node,
- parameter,
- new IncDecCompound(CompoundKind.POSTFIX, operator),
- arg,
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
+ return handleLocalCompounds(node, parameter,
+ new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isSetterValid: false);
}
@override
R visitFinalParameterPrefix(
- Send node,
- ParameterElement parameter,
- IncDecOperator operator,
- A arg) {
+ Send node, ParameterElement parameter, IncDecOperator operator, A arg) {
return handleLocalCompounds(
- node,
- parameter,
- new IncDecCompound(CompoundKind.PREFIX, operator),
- arg,
+ node, parameter, new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isSetterValid: false);
}
@override
R visitFinalStaticFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
field,
@@ -10838,10 +7151,7 @@
@override
R visitFinalStaticFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
field,
@@ -10853,13 +7163,8 @@
}
@override
- R visitSuperFieldFieldCompound(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitSuperFieldFieldCompound(Send node, FieldElement readField,
+ FieldElement writtenField, AssignmentOperator operator, Node rhs, A arg) {
return handleSuperCompounds(
node,
readField,
@@ -10872,10 +7177,7 @@
@override
R visitFinalSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
field,
@@ -10888,10 +7190,7 @@
@override
R visitFinalSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
field,
@@ -10903,28 +7202,15 @@
}
@override
- R visitSuperMethodCompound(
- Send node,
- FunctionElement method,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- method,
- CompoundGetter.METHOD,
- method,
- CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitSuperMethodCompound(Send node, FunctionElement method,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, method, CompoundGetter.METHOD, method,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
R visitSuperMethodPostfix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
method,
@@ -10937,10 +7223,7 @@
@override
R visitSuperMethodPrefix(
- Send node,
- FunctionElement method,
- IncDecOperator operator,
- A arg) {
+ Send node, FunctionElement method, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
method,
@@ -10953,10 +7236,7 @@
@override
R visitFinalTopLevelFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
field,
@@ -10969,10 +7249,7 @@
@override
R visitFinalTopLevelFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
return handleStaticCompounds(
node,
field,
@@ -10984,12 +7261,8 @@
}
@override
- R visitUnresolvedSuperCompound(
- Send node,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperCompound(Send node, Element element,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleSuperCompounds(
node,
element,
@@ -11002,10 +7275,7 @@
@override
R visitUnresolvedSuperPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
element,
@@ -11018,10 +7288,7 @@
@override
R visitUnresolvedSuperPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
element,
@@ -11033,12 +7300,8 @@
}
@override
- R visitUnresolvedSuperGetterCompound(
- Send node, Element element,
- MethodElement setter,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperGetterCompound(Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, Node rhs, A arg) {
return handleSuperCompounds(
node,
element,
@@ -11050,12 +7313,8 @@
}
@override
- R visitUnresolvedSuperGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
element,
@@ -11067,12 +7326,8 @@
}
@override
- R visitUnresolvedSuperGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
element,
@@ -11084,30 +7339,15 @@
}
@override
- R visitUnresolvedSuperSetterCompound(
- Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperCompounds(
- node,
- getter,
- CompoundGetter.GETTER,
- element,
- CompoundSetter.INVALID,
- new AssignmentCompound(operator, rhs),
- arg);
+ R visitUnresolvedSuperSetterCompound(Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperCompounds(node, getter, CompoundGetter.GETTER, element,
+ CompoundSetter.INVALID, new AssignmentCompound(operator, rhs), arg);
}
@override
- R visitUnresolvedSuperSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
getter,
@@ -11119,12 +7359,8 @@
}
@override
- R visitUnresolvedSuperSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleSuperCompounds(
node,
getter,
@@ -11139,7 +7375,6 @@
/// Simplified handling of if-null assignments.
abstract class BaseImplementationOfSetIfNullsMixin<R, A>
implements SemanticSendVisitor<R, A> {
-
/// Handle a super if-null assignments, like `super.foo ??= 42`.
R handleSuperSetIfNulls(
SendSet node,
@@ -11162,565 +7397,264 @@
/// Handle a local if-null assignments, like `foo ??= 42`. If [isSetterValid]
/// is false [local] is unassignable.
- R handleLocalSetIfNulls(
- SendSet node,
- LocalElement local,
- Node rhs,
- A arg,
+ R handleLocalSetIfNulls(SendSet node, LocalElement local, Node rhs, A arg,
{bool isSetterValid});
/// Handle a if-null assignments on a type literal constant, like
/// `Object ??= 42`.
R handleTypeLiteralConstantSetIfNulls(
- SendSet node,
- ConstantExpression constant,
- Node rhs,
- A arg);
+ SendSet node, ConstantExpression constant, Node rhs, A arg);
/// Handle a dynamic if-null assignments, like `o.foo ??= 42`. [receiver] is
/// `null` for properties on `this`, like `this.foo ??= 42` or `foo ??= 42`.
R handleDynamicSetIfNulls(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg);
+ Send node, Node receiver, Name name, Node rhs, A arg);
@override
R visitClassTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
return handleTypeLiteralConstantSetIfNulls(node, constant, rhs, arg);
}
@override
R visitDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ Send node, Node receiver, Name name, Node rhs, A arg) {
return handleDynamicSetIfNulls(node, receiver, name, rhs, arg);
}
@override
R visitDynamicTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
return handleTypeLiteralConstantSetIfNulls(node, constant, rhs, arg);
}
@override
R visitFinalLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
- return handleLocalSetIfNulls(
- node, variable, rhs, arg, isSetterValid: false);
+ Send node, LocalVariableElement variable, Node rhs, A arg) {
+ return handleLocalSetIfNulls(node, variable, rhs, arg,
+ isSetterValid: false);
}
@override
R visitFinalParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
- return handleLocalSetIfNulls(
- node, parameter, rhs, arg, isSetterValid: false);
+ Send node, ParameterElement parameter, Node rhs, A arg) {
+ return handleLocalSetIfNulls(node, parameter, rhs, arg,
+ isSetterValid: false);
}
@override
R visitFinalStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- field,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, FieldElement field, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
R visitFinalSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- field,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, FieldElement field, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
R visitFinalTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- field,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, FieldElement field, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
R visitIfNotNullDynamicPropertySetIfNull(
- Send node,
- Node receiver,
- Name name,
- Node rhs,
- A arg) {
+ Send node, Node receiver, Name name, Node rhs, A arg) {
return handleDynamicSetIfNulls(node, receiver, name, rhs, arg);
}
@override
R visitLocalFunctionSetIfNull(
- Send node,
- LocalFunctionElement function,
- Node rhs,
- A arg) {
- return handleLocalSetIfNulls(
- node, function, rhs, arg, isSetterValid: false);
+ Send node, LocalFunctionElement function, Node rhs, A arg) {
+ return handleLocalSetIfNulls(node, function, rhs, arg,
+ isSetterValid: false);
}
@override
R visitLocalVariableSetIfNull(
- Send node,
- LocalVariableElement variable,
- Node rhs,
- A arg) {
- return handleLocalSetIfNulls(
- node, variable, rhs, arg, isSetterValid: true);
+ Send node, LocalVariableElement variable, Node rhs, A arg) {
+ return handleLocalSetIfNulls(node, variable, rhs, arg, isSetterValid: true);
}
@override
R visitParameterSetIfNull(
- Send node,
- ParameterElement parameter,
- Node rhs,
- A arg) {
- return handleLocalSetIfNulls(
- node, parameter, rhs, arg, isSetterValid: true);
+ Send node, ParameterElement parameter, Node rhs, A arg) {
+ return handleLocalSetIfNulls(node, parameter, rhs, arg,
+ isSetterValid: true);
}
@override
- R visitStaticFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- field,
- CompoundSetter.FIELD,
- rhs,
- arg);
+ R visitStaticFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.FIELD, rhs, arg);
}
@override
- R visitStaticGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ R visitStaticGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, getter, CompoundGetter.GETTER, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
R visitStaticMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- method,
- CompoundGetter.METHOD,
- method,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, FunctionElement method, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, method, CompoundGetter.METHOD, method,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
R visitStaticMethodSetterSetIfNull(
- Send node,
- MethodElement method,
- MethodElement setter,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- method,
- CompoundGetter.METHOD,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ Send node, MethodElement method, MethodElement setter, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, method, CompoundGetter.METHOD, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
- R visitSuperFieldFieldSetIfNull(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- readField,
- CompoundGetter.FIELD,
- writtenField,
- CompoundSetter.FIELD,
- rhs,
- arg);
+ R visitSuperFieldFieldSetIfNull(Send node, FieldElement readField,
+ FieldElement writtenField, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, readField, CompoundGetter.FIELD,
+ writtenField, CompoundSetter.FIELD, rhs, arg);
}
@override
- R visitSuperFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- field,
- CompoundSetter.FIELD,
- rhs,
- arg);
+ R visitSuperFieldSetIfNull(Send node, FieldElement field, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.FIELD, rhs, arg);
}
@override
R visitSuperFieldSetterSetIfNull(
- Send node,
- FieldElement field,
- FunctionElement setter,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ Send node, FieldElement field, FunctionElement setter, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, field, CompoundGetter.FIELD, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
R visitSuperGetterFieldSetIfNull(
- Send node,
- FunctionElement getter,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- field,
- CompoundSetter.FIELD,
- rhs,
- arg);
+ Send node, FunctionElement getter, FieldElement field, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, getter, CompoundGetter.GETTER, field,
+ CompoundSetter.FIELD, rhs, arg);
}
@override
- R visitSuperGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ R visitSuperGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, getter, CompoundGetter.GETTER, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
R visitSuperMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- method,
- CompoundGetter.METHOD,
- method,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, FunctionElement method, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, method, CompoundGetter.METHOD, method,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
- R visitSuperMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- method,
- CompoundGetter.METHOD,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ R visitSuperMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, method, CompoundGetter.METHOD, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
- R visitThisPropertySetIfNull(
- Send node,
- Name name,
- Node rhs,
- A arg) {
+ R visitThisPropertySetIfNull(Send node, Name name, Node rhs, A arg) {
return handleDynamicSetIfNulls(node, null, name, rhs, arg);
}
@override
R visitTopLevelFieldSetIfNull(
- Send node,
- FieldElement field,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- field,
- CompoundGetter.FIELD,
- field,
- CompoundSetter.FIELD,
- rhs,
- arg);
+ Send node, FieldElement field, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, field, CompoundGetter.FIELD, field,
+ CompoundSetter.FIELD, rhs, arg);
}
@override
- R visitTopLevelGetterSetterSetIfNull(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ R visitTopLevelGetterSetterSetIfNull(Send node, FunctionElement getter,
+ FunctionElement setter, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, getter, CompoundGetter.GETTER, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
R visitTopLevelMethodSetIfNull(
- Send node,
- FunctionElement method,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- method,
- CompoundGetter.METHOD,
- method,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, FunctionElement method, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, method, CompoundGetter.METHOD, method,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
- R visitTopLevelMethodSetterSetIfNull(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- method,
- CompoundGetter.METHOD,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ R visitTopLevelMethodSetterSetIfNull(Send node, FunctionElement method,
+ FunctionElement setter, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, method, CompoundGetter.METHOD, setter,
+ CompoundSetter.SETTER, rhs, arg);
}
@override
R visitTypedefTypeLiteralSetIfNull(
- Send node,
- ConstantExpression constant,
- Node rhs,
- A arg) {
+ Send node, ConstantExpression constant, Node rhs, A arg) {
return handleTypeLiteralConstantSetIfNulls(node, constant, rhs, arg);
}
@override
- R visitUnresolvedSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- element,
- CompoundGetter.UNRESOLVED,
- element,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ R visitUnresolvedSetIfNull(Send node, Element element, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, element, CompoundGetter.UNRESOLVED,
+ element, CompoundSetter.INVALID, rhs, arg);
}
@override
R visitUnresolvedStaticGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- element,
- CompoundGetter.UNRESOLVED,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, element, CompoundGetter.UNRESOLVED,
+ setter, CompoundSetter.SETTER, rhs, arg);
}
@override
R visitUnresolvedStaticSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- element,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, getter, CompoundGetter.GETTER, element,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
R visitUnresolvedSuperGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- element,
- CompoundGetter.UNRESOLVED,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, element, CompoundGetter.UNRESOLVED,
+ setter, CompoundSetter.SETTER, rhs, arg);
}
@override
- R visitUnresolvedSuperSetIfNull(
- Send node,
- Element element,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- element,
- CompoundGetter.UNRESOLVED,
- element,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ R visitUnresolvedSuperSetIfNull(Send node, Element element, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, element, CompoundGetter.UNRESOLVED,
+ element, CompoundSetter.INVALID, rhs, arg);
}
@override
R visitUnresolvedSuperSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
- return handleSuperSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- element,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
+ return handleSuperSetIfNulls(node, getter, CompoundGetter.GETTER, element,
+ CompoundSetter.INVALID, rhs, arg);
}
@override
R visitUnresolvedTopLevelGetterSetIfNull(
- Send node,
- Element element,
- MethodElement setter,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- element,
- CompoundGetter.UNRESOLVED,
- setter,
- CompoundSetter.SETTER,
- rhs,
- arg);
+ Send node, Element element, MethodElement setter, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, element, CompoundGetter.UNRESOLVED,
+ setter, CompoundSetter.SETTER, rhs, arg);
}
@override
R visitUnresolvedTopLevelSetterSetIfNull(
- Send node,
- MethodElement getter,
- Element element,
- Node rhs,
- A arg) {
- return handleStaticSetIfNulls(
- node,
- getter,
- CompoundGetter.GETTER,
- element,
- CompoundSetter.INVALID,
- rhs,
- arg);
+ Send node, MethodElement getter, Element element, Node rhs, A arg) {
+ return handleStaticSetIfNulls(node, getter, CompoundGetter.GETTER, element,
+ CompoundSetter.INVALID, rhs, arg);
}
}
@@ -11728,27 +7662,16 @@
/// expressions.
abstract class BaseImplementationOfIndexCompoundsMixin<R, A>
implements SemanticSendVisitor<R, A> {
-
/// Handle a dynamic index compounds, like `receiver[index] += rhs` or
/// `--receiver[index]`.
R handleIndexCompounds(
- SendSet node,
- Node receiver,
- Node index,
- CompoundRhs rhs,
- A arg);
+ SendSet node, Node receiver, Node index, CompoundRhs rhs, A arg);
/// Handle a super index compounds, like `super[index] += rhs` or
/// `--super[index]`.
- R handleSuperIndexCompounds(
- SendSet node,
- Element indexFunction,
- Element indexSetFunction,
- Node index,
- CompoundRhs rhs,
- A arg,
- {bool isGetterValid,
- bool isSetterValid});
+ R handleSuperIndexCompounds(SendSet node, Element indexFunction,
+ Element indexSetFunction, Node index, CompoundRhs rhs, A arg,
+ {bool isGetterValid, bool isSetterValid});
@override
R visitSuperCompoundIndexSet(
@@ -11759,9 +7682,8 @@
AssignmentOperator operator,
Node rhs,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, indexSetFunction, index,
- new AssignmentCompound(operator, rhs), arg,
+ return handleSuperIndexCompounds(node, indexFunction, indexSetFunction,
+ index, new AssignmentCompound(operator, rhs), arg,
isGetterValid: true, isSetterValid: true);
}
@@ -11773,9 +7695,8 @@
Node index,
IncDecOperator operator,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, indexSetFunction, index,
- new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
+ return handleSuperIndexCompounds(node, indexFunction, indexSetFunction,
+ index, new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isGetterValid: true, isSetterValid: true);
}
@@ -11787,9 +7708,8 @@
Node index,
IncDecOperator operator,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, indexSetFunction, index,
- new IncDecCompound(CompoundKind.PREFIX, operator), arg,
+ return handleSuperIndexCompounds(node, indexFunction, indexSetFunction,
+ index, new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isGetterValid: true, isSetterValid: true);
}
@@ -11802,9 +7722,8 @@
AssignmentOperator operator,
Node rhs,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, indexSetFunction, index,
- new AssignmentCompound(operator, rhs), arg,
+ return handleSuperIndexCompounds(node, indexFunction, indexSetFunction,
+ index, new AssignmentCompound(operator, rhs), arg,
isGetterValid: false, isSetterValid: true);
}
@@ -11817,22 +7736,15 @@
AssignmentOperator operator,
Node rhs,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, indexSetFunction, index,
- new AssignmentCompound(operator, rhs), arg,
+ return handleSuperIndexCompounds(node, indexFunction, indexSetFunction,
+ index, new AssignmentCompound(operator, rhs), arg,
isGetterValid: true, isSetterValid: false);
}
@override
- R visitUnresolvedSuperCompoundIndexSet(
- Send node,
- Element element,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
- return handleSuperIndexCompounds(
- node, element, element, index,
+ R visitUnresolvedSuperCompoundIndexSet(Send node, Element element, Node index,
+ AssignmentOperator operator, Node rhs, A arg) {
+ return handleSuperIndexCompounds(node, element, element, index,
new AssignmentCompound(operator, rhs), arg,
isGetterValid: false, isSetterValid: false);
}
@@ -11845,8 +7757,7 @@
Node index,
IncDecOperator operator,
A arg) {
- return handleSuperIndexCompounds(
- node, element, indexSetFunction, index,
+ return handleSuperIndexCompounds(node, element, indexSetFunction, index,
new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isGetterValid: false, isSetterValid: true);
}
@@ -11859,8 +7770,7 @@
Node index,
IncDecOperator operator,
A arg) {
- return handleSuperIndexCompounds(
- node, element, indexSetFunction, index,
+ return handleSuperIndexCompounds(node, element, indexSetFunction, index,
new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isGetterValid: false, isSetterValid: true);
}
@@ -11873,8 +7783,7 @@
Node index,
IncDecOperator operator,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, element, index,
+ return handleSuperIndexCompounds(node, indexFunction, element, index,
new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isGetterValid: true, isSetterValid: false);
}
@@ -11887,72 +7796,45 @@
Node index,
IncDecOperator operator,
A arg) {
- return handleSuperIndexCompounds(
- node, indexFunction, element, index,
+ return handleSuperIndexCompounds(node, indexFunction, element, index,
new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isGetterValid: true, isSetterValid: false);
}
@override
R visitUnresolvedSuperIndexPostfix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
- return handleSuperIndexCompounds(
- node, element, element, index,
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
+ return handleSuperIndexCompounds(node, element, element, index,
new IncDecCompound(CompoundKind.POSTFIX, operator), arg,
isGetterValid: false, isSetterValid: false);
}
@override
R visitUnresolvedSuperIndexPrefix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
- return handleSuperIndexCompounds(
- node, element, element, index,
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
+ return handleSuperIndexCompounds(node, element, element, index,
new IncDecCompound(CompoundKind.PREFIX, operator), arg,
isGetterValid: false, isSetterValid: false);
}
@override
- R visitCompoundIndexSet(
- SendSet node,
- Node receiver,
- Node index,
- AssignmentOperator operator,
- Node rhs,
- A arg) {
+ R visitCompoundIndexSet(SendSet node, Node receiver, Node index,
+ AssignmentOperator operator, Node rhs, A arg) {
return handleIndexCompounds(
- node, receiver, index,
- new AssignmentCompound(operator, rhs), arg);
+ node, receiver, index, new AssignmentCompound(operator, rhs), arg);
}
@override
R visitIndexPostfix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
- return handleIndexCompounds(
- node, receiver, index,
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
+ return handleIndexCompounds(node, receiver, index,
new IncDecCompound(CompoundKind.POSTFIX, operator), arg);
}
@override
R visitIndexPrefix(
- Send node,
- Node receiver,
- Node index,
- IncDecOperator operator,
- A arg) {
- return handleIndexCompounds(
- node, receiver, index,
+ Send node, Node receiver, Node index, IncDecOperator operator, A arg) {
+ return handleIndexCompounds(node, receiver, index,
new IncDecCompound(CompoundKind.PREFIX, operator), arg);
}
}
@@ -11960,39 +7842,22 @@
/// Simplified handling of super if-null assignments.
abstract class BaseImplementationOfSuperIndexSetIfNullMixin<R, A>
implements SemanticSendVisitor<R, A> {
-
/// Handle a super index if-null assignments, like `super[index] ??= rhs`.
- R handleSuperIndexSetIfNull(
- SendSet node,
- Element indexFunction,
- Element indexSetFunction,
- Node index,
- Node rhs,
- A arg,
- {bool isGetterValid,
- bool isSetterValid});
+ R handleSuperIndexSetIfNull(SendSet node, Element indexFunction,
+ Element indexSetFunction, Node index, Node rhs, A arg,
+ {bool isGetterValid, bool isSetterValid});
@override
- R visitSuperIndexSetIfNull(
- Send node,
- FunctionElement indexFunction,
- FunctionElement indexSetFunction,
- Node index,
- Node rhs,
- A arg) {
+ R visitSuperIndexSetIfNull(Send node, FunctionElement indexFunction,
+ FunctionElement indexSetFunction, Node index, Node rhs, A arg) {
return handleSuperIndexSetIfNull(
node, indexFunction, indexSetFunction, index, rhs, arg,
isGetterValid: true, isSetterValid: true);
}
@override
- R visitUnresolvedSuperGetterIndexSetIfNull(
- Send node,
- Element indexFunction,
- FunctionElement indexSetFunction,
- Node index,
- Node rhs,
- A arg) {
+ R visitUnresolvedSuperGetterIndexSetIfNull(Send node, Element indexFunction,
+ FunctionElement indexSetFunction, Node index, Node rhs, A arg) {
return handleSuperIndexSetIfNull(
node, indexFunction, indexSetFunction, index, rhs, arg,
isGetterValid: false, isSetterValid: true);
@@ -12013,13 +7878,8 @@
@override
R visitUnresolvedSuperIndexSetIfNull(
- Send node,
- Element element,
- Node index,
- Node rhs,
- A arg) {
- return handleSuperIndexSetIfNull(
- node, element, element, index, rhs, arg,
+ Send node, Element element, Node index, Node rhs, A arg) {
+ return handleSuperIndexSetIfNull(node, element, element, index, rhs, arg,
isGetterValid: false, isSetterValid: false);
}
}
@@ -12031,44 +7891,24 @@
/// handled uniformly.
abstract class BaseImplementationOfSuperIncDecsMixin<R, A>
implements SemanticSendVisitor<R, A> {
- R handleSuperFieldFieldPostfixPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg,
+ R handleSuperFieldFieldPostfixPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleSuperFieldSetterPostfixPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg,
+ R handleSuperFieldSetterPostfixPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleSuperGetterFieldPostfixPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg,
+ R handleSuperGetterFieldPostfixPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleSuperGetterSetterPostfixPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg,
+ R handleSuperGetterSetterPostfixPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleSuperMethodSetterPostfixPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg,
+ R handleSuperMethodSetterPostfixPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
R handleSuperIndexPostfixPrefix(
@@ -12080,13 +7920,8 @@
A arg,
{bool isPrefix});
- R handleUnresolvedSuperGetterIndexPostfixPrefix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg,
+ R handleUnresolvedSuperGetterIndexPostfixPrefix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg,
{bool isPrefix});
R handleUnresolvedSuperSetterIndexPostfixPrefix(
@@ -12099,178 +7934,121 @@
{bool isPrefix});
R handleUnresolvedSuperIndexPostfixPrefix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg,
+ Send node, Element element, Node index, IncDecOperator operator, A arg,
{bool isPrefix});
R handleFinalSuperFieldPostfixPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg,
+ Send node, FieldElement field, IncDecOperator operator, A arg,
{bool isPrefix});
R handleSuperMethodPostfixPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg,
+ Send node, MethodElement method, IncDecOperator operator, A arg,
{bool isPrefix});
R handleUnresolvedSuperPostfixPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg,
+ Send node, Element element, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleUnresolvedSuperGetterPostfixPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg,
+ R handleUnresolvedSuperGetterPostfixPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg,
{bool isPrefix});
- R handleUnresolvedSuperSetterPostfixPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg,
+ R handleUnresolvedSuperSetterPostfixPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg,
{bool isPrefix});
@override
- R visitSuperFieldFieldPostfix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPostfix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return handleSuperFieldFieldPostfixPrefix(
- node, readField, writtenField, operator, arg, isPrefix: false);
+ node, readField, writtenField, operator, arg,
+ isPrefix: false);
}
@override
- R visitSuperFieldFieldPrefix(
- Send node,
- FieldElement readField,
- FieldElement writtenField,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldFieldPrefix(Send node, FieldElement readField,
+ FieldElement writtenField, IncDecOperator operator, A arg) {
return handleSuperFieldFieldPostfixPrefix(
- node, readField, writtenField, operator, arg, isPrefix: true);
+ node, readField, writtenField, operator, arg,
+ isPrefix: true);
}
@override
R visitSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleSuperFieldFieldPostfixPrefix(
- node, field, field, operator, arg, isPrefix: false);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleSuperFieldFieldPostfixPrefix(node, field, field, operator, arg,
+ isPrefix: false);
}
@override
R visitSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleSuperFieldFieldPostfixPrefix(
- node, field, field, operator, arg, isPrefix: true);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleSuperFieldFieldPostfixPrefix(node, field, field, operator, arg,
+ isPrefix: true);
}
@override
- R visitSuperFieldSetterPostfix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPostfix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperFieldSetterPostfixPrefix(
- node, field, setter, operator, arg, isPrefix: false);
+ node, field, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitSuperFieldSetterPrefix(
- Send node,
- FieldElement field,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperFieldSetterPrefix(Send node, FieldElement field,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperFieldSetterPostfixPrefix(
- node, field, setter, operator, arg, isPrefix: true);
+ node, field, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitSuperGetterFieldPostfix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPostfix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return handleSuperGetterFieldPostfixPrefix(
- node, getter, field, operator, arg, isPrefix: false);
+ node, getter, field, operator, arg,
+ isPrefix: false);
}
@override
- R visitSuperGetterFieldPrefix(
- Send node,
- FunctionElement getter,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterFieldPrefix(Send node, FunctionElement getter,
+ FieldElement field, IncDecOperator operator, A arg) {
return handleSuperGetterFieldPostfixPrefix(
- node, getter, field, operator, arg, isPrefix: true);
+ node, getter, field, operator, arg,
+ isPrefix: true);
}
@override
- R visitSuperGetterSetterPostfix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPostfix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperGetterSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: false);
+ node, getter, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitSuperGetterSetterPrefix(
- Send node,
- FunctionElement getter,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperGetterSetterPrefix(Send node, FunctionElement getter,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperGetterSetterPostfixPrefix(
- node, getter, setter, operator, arg, isPrefix: true);
+ node, getter, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitSuperMethodSetterPostfix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPostfix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperMethodSetterPostfixPrefix(
- node, method, setter, operator, arg, isPrefix: false);
+ node, method, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitSuperMethodSetterPrefix(
- Send node,
- FunctionElement method,
- FunctionElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitSuperMethodSetterPrefix(Send node, FunctionElement method,
+ FunctionElement setter, IncDecOperator operator, A arg) {
return handleSuperMethodSetterPostfixPrefix(
- node, method, setter, operator, arg, isPrefix: true);
+ node, method, setter, operator, arg,
+ isPrefix: true);
}
@override
@@ -12282,8 +8060,8 @@
IncDecOperator operator,
A arg) {
return handleSuperIndexPostfixPrefix(
- node, indexFunction, indexSetFunction,
- index, operator, arg, isPrefix: false);
+ node, indexFunction, indexSetFunction, index, operator, arg,
+ isPrefix: false);
}
@override
@@ -12295,32 +8073,24 @@
IncDecOperator operator,
A arg) {
return handleSuperIndexPostfixPrefix(
- node, indexFunction, indexSetFunction,
- index, operator, arg, isPrefix: true);
+ node, indexFunction, indexSetFunction, index, operator, arg,
+ isPrefix: true);
}
@override
- R visitUnresolvedSuperGetterIndexPostfix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterIndexPostfix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg) {
return handleUnresolvedSuperGetterIndexPostfixPrefix(
- node, element, setter, index, operator, arg, isPrefix: false);
+ node, element, setter, index, operator, arg,
+ isPrefix: false);
}
@override
- R visitUnresolvedSuperGetterIndexPrefix(
- Send node,
- Element element,
- MethodElement setter,
- Node index,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterIndexPrefix(Send node, Element element,
+ MethodElement setter, Node index, IncDecOperator operator, A arg) {
return handleUnresolvedSuperGetterIndexPostfixPrefix(
- node, element, setter, index, operator, arg, isPrefix: true);
+ node, element, setter, index, operator, arg,
+ isPrefix: true);
}
@override
@@ -12332,7 +8102,8 @@
IncDecOperator operator,
A arg) {
return handleUnresolvedSuperSetterIndexPostfixPrefix(
- node, indexFunction, element, index, operator, arg, isPrefix: false);
+ node, indexFunction, element, index, operator, arg,
+ isPrefix: false);
}
@override
@@ -12344,133 +8115,98 @@
IncDecOperator operator,
A arg) {
return handleUnresolvedSuperSetterIndexPostfixPrefix(
- node, indexFunction, element, index, operator, arg, isPrefix: true);
+ node, indexFunction, element, index, operator, arg,
+ isPrefix: true);
}
@override
R visitUnresolvedSuperIndexPostfix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
return handleUnresolvedSuperIndexPostfixPrefix(
- node, element, index, operator, arg, isPrefix: false);
+ node, element, index, operator, arg,
+ isPrefix: false);
}
@override
R visitUnresolvedSuperIndexPrefix(
- Send node,
- Element element,
- Node index,
- IncDecOperator operator,
- A arg) {
+ Send node, Element element, Node index, IncDecOperator operator, A arg) {
return handleUnresolvedSuperIndexPostfixPrefix(
- node, element, index, operator, arg, isPrefix: true);
+ node, element, index, operator, arg,
+ isPrefix: true);
}
@override
R visitFinalSuperFieldPostfix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleFinalSuperFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: false);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleFinalSuperFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: false);
}
@override
R visitFinalSuperFieldPrefix(
- Send node,
- FieldElement field,
- IncDecOperator operator,
- A arg) {
- return handleFinalSuperFieldPostfixPrefix(
- node, field, operator, arg, isPrefix: true);
+ Send node, FieldElement field, IncDecOperator operator, A arg) {
+ return handleFinalSuperFieldPostfixPrefix(node, field, operator, arg,
+ isPrefix: true);
}
@override
R visitSuperMethodPostfix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
- return handleSuperMethodPostfixPrefix(
- node, method, operator, arg, isPrefix: false);
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
+ return handleSuperMethodPostfixPrefix(node, method, operator, arg,
+ isPrefix: false);
}
@override
R visitSuperMethodPrefix(
- Send node,
- MethodElement method,
- IncDecOperator operator,
- A arg) {
- return handleSuperMethodPostfixPrefix(
- node, method, operator, arg, isPrefix: true);
+ Send node, MethodElement method, IncDecOperator operator, A arg) {
+ return handleSuperMethodPostfixPrefix(node, method, operator, arg,
+ isPrefix: true);
}
@override
R visitUnresolvedSuperPostfix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
- return handleUnresolvedSuperPostfixPrefix(
- node, element, operator, arg, isPrefix: false);
+ Send node, Element element, IncDecOperator operator, A arg) {
+ return handleUnresolvedSuperPostfixPrefix(node, element, operator, arg,
+ isPrefix: false);
}
@override
R visitUnresolvedSuperPrefix(
- Send node,
- Element element,
- IncDecOperator operator,
- A arg) {
- return handleUnresolvedSuperPostfixPrefix(
- node, element, operator, arg, isPrefix: true);
+ Send node, Element element, IncDecOperator operator, A arg) {
+ return handleUnresolvedSuperPostfixPrefix(node, element, operator, arg,
+ isPrefix: true);
}
@override
- R visitUnresolvedSuperGetterPostfix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPostfix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleUnresolvedSuperGetterPostfixPrefix(
- node, element, setter, operator, arg, isPrefix: false);
+ node, element, setter, operator, arg,
+ isPrefix: false);
}
@override
- R visitUnresolvedSuperGetterPrefix(
- Send node,
- Element element,
- MethodElement setter,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperGetterPrefix(Send node, Element element,
+ MethodElement setter, IncDecOperator operator, A arg) {
return handleUnresolvedSuperGetterPostfixPrefix(
- node, element, setter, operator, arg, isPrefix: true);
+ node, element, setter, operator, arg,
+ isPrefix: true);
}
@override
- R visitUnresolvedSuperSetterPostfix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPostfix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleUnresolvedSuperSetterPostfixPrefix(
- node, getter, element, operator, arg, isPrefix: false);
+ node, getter, element, operator, arg,
+ isPrefix: false);
}
@override
- R visitUnresolvedSuperSetterPrefix(
- Send node,
- MethodElement getter,
- Element element,
- IncDecOperator operator,
- A arg) {
+ R visitUnresolvedSuperSetterPrefix(Send node, MethodElement getter,
+ Element element, IncDecOperator operator, A arg) {
return handleUnresolvedSuperSetterPostfixPrefix(
- node, getter, element, operator, arg, isPrefix: true);
+ node, getter, element, operator, arg,
+ isPrefix: true);
}
}
@@ -12481,14 +8217,8 @@
/// handled uniformly.
abstract class BaseImplementationOfNewMixin<R, A>
implements SemanticSendVisitor<R, A> {
-
- R handleConstructorInvoke(
- NewExpression node,
- ConstructorElement constructor,
- DartType type,
- NodeList arguments,
- CallStructure callStructure,
- A arg);
+ R handleConstructorInvoke(NewExpression node, ConstructorElement constructor,
+ DartType type, NodeList arguments, CallStructure callStructure, A arg);
R visitGenerativeConstructorInvoke(
NewExpression node,
@@ -12540,25 +8270,15 @@
}
@override
- R visitUnresolvedConstructorInvoke(
- NewExpression node,
- Element constructor,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedConstructorInvoke(NewExpression node, Element constructor,
+ DartType type, NodeList arguments, Selector selector, A arg) {
return handleConstructorInvoke(
node, constructor, type, arguments, selector.callStructure, arg);
}
@override
- R visitUnresolvedClassConstructorInvoke(
- NewExpression node,
- Element element,
- DartType type,
- NodeList arguments,
- Selector selector,
- A arg) {
+ R visitUnresolvedClassConstructorInvoke(NewExpression node, Element element,
+ DartType type, NodeList arguments, Selector selector, A arg) {
return handleConstructorInvoke(
node, element, type, arguments, selector.callStructure, arg);
}
diff --git a/pkg/compiler/lib/src/resolution/send_resolver.dart b/pkg/compiler/lib/src/resolution/send_resolver.dart
index d592cf4..7ef2a86 100644
--- a/pkg/compiler/lib/src/resolution/send_resolver.dart
+++ b/pkg/compiler/lib/src/resolution/send_resolver.dart
@@ -20,9 +20,8 @@
DeclStructure(this.element);
/// Calls the matching visit method on [visitor] with [node] and [arg].
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- FunctionExpression node,
- A arg);
+ R dispatch(
+ SemanticDeclarationVisitor<R, A> visitor, FunctionExpression node, A arg);
}
enum ConstructorKind {
@@ -38,9 +37,8 @@
ConstructorDeclStructure(this.kind, ConstructorElement constructor)
: super(constructor);
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- FunctionExpression node,
- A arg) {
+ R dispatch(SemanticDeclarationVisitor<R, A> visitor, FunctionExpression node,
+ A arg) {
switch (kind) {
case ConstructorKind.GENERATIVE:
return visitor.visitGenerativeConstructorDeclaration(
@@ -54,8 +52,8 @@
default:
break;
}
- throw new SpannableAssertionFailure(node,
- "Unhandled constructor declaration kind: ${kind}");
+ throw new SpannableAssertionFailure(
+ node, "Unhandled constructor declaration kind: ${kind}");
}
}
@@ -64,18 +62,14 @@
InterfaceType redirectionTargetType;
ConstructorElement redirectionTarget;
- RedirectingFactoryConstructorDeclStructure(
- ConstructorElement constructor,
- this.redirectionTargetType,
- this.redirectionTarget)
+ RedirectingFactoryConstructorDeclStructure(ConstructorElement constructor,
+ this.redirectionTargetType, this.redirectionTarget)
: super(constructor);
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- FunctionExpression node,
- A arg) {
- return visitor.visitRedirectingFactoryConstructorDeclaration(
- node, element, node.parameters,
- redirectionTargetType, redirectionTarget, arg);
+ R dispatch(SemanticDeclarationVisitor<R, A> visitor, FunctionExpression node,
+ A arg) {
+ return visitor.visitRedirectingFactoryConstructorDeclaration(node, element,
+ node.parameters, redirectionTargetType, redirectionTarget, arg);
}
}
@@ -96,16 +90,13 @@
CLOSURE,
}
-class FunctionDeclStructure<R, A>
- extends DeclStructure<R, A> {
+class FunctionDeclStructure<R, A> extends DeclStructure<R, A> {
final FunctionKind kind;
- FunctionDeclStructure(this.kind, FunctionElement function)
- : super(function);
+ FunctionDeclStructure(this.kind, FunctionElement function) : super(function);
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- FunctionExpression node,
- A arg) {
+ R dispatch(SemanticDeclarationVisitor<R, A> visitor, FunctionExpression node,
+ A arg) {
switch (kind) {
case FunctionKind.TOP_LEVEL_GETTER:
return visitor.visitTopLevelGetterDeclaration(
@@ -126,8 +117,7 @@
return visitor.visitStaticFunctionDeclaration(
node, element, node.parameters, node.body, arg);
case FunctionKind.ABSTRACT_GETTER:
- return visitor.visitAbstractGetterDeclaration(
- node, element, arg);
+ return visitor.visitAbstractGetterDeclaration(node, element, arg);
case FunctionKind.ABSTRACT_SETTER:
return visitor.visitAbstractSetterDeclaration(
node, element, node.parameters, arg);
@@ -282,8 +272,8 @@
if (optionalParameters != null) {
bool isNamed = optionalParameters.beginToken.stringValue == '{';
for (Node node in optionalParameters) {
- list.add(computeParameterStructure(
- node, index++, isRequired: false, isNamed: isNamed));
+ list.add(computeParameterStructure(node, index++,
+ isRequired: false, isNamed: isNamed));
}
} else {
list.add(computeParameterStructure(node, index++));
@@ -293,8 +283,7 @@
}
ParameterStructure computeParameterStructure(
- VariableDefinitions definitions,
- int index,
+ VariableDefinitions definitions, int index,
{bool isRequired: true, bool isNamed: false}) {
Node node = definitions.definitions.nodes.single;
ParameterElement element = elements[node];
@@ -303,8 +292,7 @@
node, "No parameter structure for $node.");
}
if (isRequired) {
- return new RequiredParameterStructure(
- definitions, node, element, index);
+ return new RequiredParameterStructure(definitions, node, element, index);
} else {
// TODO(johnniwinther): Should we differentiate between implicit (null)
// and explicit values? What about optional parameters on redirecting
@@ -319,11 +307,10 @@
}
}
- void computeVariableStructures(
- VariableDefinitions definitions,
+ void computeVariableStructures(VariableDefinitions definitions,
void callback(Node node, VariableStructure structure)) {
for (Node node in definitions.definitions) {
- callback(definitions, computeVariableStructure(node));
+ callback(definitions, computeVariableStructure(node));
}
}
diff --git a/pkg/compiler/lib/src/resolution/send_structure.dart b/pkg/compiler/lib/src/resolution/send_structure.dart
index 647e80e..53c0356 100644
--- a/pkg/compiler/lib/src/resolution/send_structure.dart
+++ b/pkg/compiler/lib/src/resolution/send_structure.dart
@@ -8,13 +8,10 @@
import '../constants/expressions.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../tree/tree.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
import 'access_semantics.dart';
import 'operators.dart';
@@ -27,6 +24,37 @@
R dispatch(SemanticSendVisitor<R, A> visitor, Node node, A arg);
}
+enum SendStructureKind {
+ IF_NULL,
+ LOGICAL_AND,
+ LOGICAL_OR,
+ IS,
+ IS_NOT,
+ AS,
+ INVOKE,
+ INCOMPATIBLE_INVOKE,
+ GET,
+ SET,
+ NOT,
+ UNARY,
+ INVALID_UNARY,
+ INDEX,
+ EQUALS,
+ NOT_EQUALS,
+ BINARY,
+ INVALID_BINARY,
+ INDEX_SET,
+ INDEX_PREFIX,
+ INDEX_POSTFIX,
+ COMPOUND,
+ SET_IF_NULL,
+ COMPOUND_INDEX_SET,
+ INDEX_SET_IF_NULL,
+ PREFIX,
+ POSTFIX,
+ DEFERRED_PREFIX,
+}
+
/// Interface for the structure of the semantics of a [Send] node.
///
/// Subclasses handle each of the [Send] variations; `assert(e)`, `a && b`,
@@ -34,6 +62,8 @@
abstract class SendStructure<R, A> extends SemanticSendStructure<R, A> {
/// Calls the matching visit method on [visitor] with [send] and [arg].
R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg);
+
+ SendStructureKind get kind;
}
/// The structure for a [Send] of the form `a ?? b`.
@@ -41,13 +71,12 @@
const IfNullStructure();
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
- return visitor.visitIfNull(
- node,
- node.receiver,
- node.arguments.single,
- arg);
+ return visitor.visitIfNull(node, node.receiver, node.arguments.single, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.IF_NULL;
+
String toString() => '??';
}
@@ -57,12 +86,12 @@
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
return visitor.visitLogicalAnd(
- node,
- node.receiver,
- node.arguments.single,
- arg);
+ node, node.receiver, node.arguments.single, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.LOGICAL_AND;
+
String toString() => '&&';
}
@@ -72,12 +101,12 @@
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
return visitor.visitLogicalOr(
- node,
- node.receiver,
- node.arguments.single,
- arg);
+ node, node.receiver, node.arguments.single, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.LOGICAL_OR;
+
String toString() => '||';
}
@@ -89,13 +118,12 @@
IsStructure(this.type);
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
- return visitor.visitIs(
- node,
- node.receiver,
- type,
- arg);
+ return visitor.visitIs(node, node.receiver, type, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.IS;
+
String toString() => 'is $type';
}
@@ -107,13 +135,12 @@
IsNotStructure(this.type);
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
- return visitor.visitIsNot(
- node,
- node.receiver,
- type,
- arg);
+ return visitor.visitIsNot(node, node.receiver, type, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.IS_NOT;
+
String toString() => 'is! $type';
}
@@ -125,13 +152,12 @@
AsStructure(this.type);
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
- return visitor.visitAs(
- node,
- node.receiver,
- type,
- arg);
+ return visitor.visitAs(node, node.receiver, type, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.AS;
+
String toString() => 'as $type';
}
@@ -150,22 +176,17 @@
InvokeStructure(this.semantics, this.selector);
+ @override
+ SendStructureKind get kind => SendStructureKind.INVOKE;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
return visitor.visitIfNotNullDynamicPropertyInvoke(
- node,
- node.receiver,
- node.argumentsNode,
- selector,
- arg);
+ node, node.receiver, node.argumentsNode, selector, arg);
case AccessKind.DYNAMIC_PROPERTY:
return visitor.visitDynamicPropertyInvoke(
- node,
- node.receiver,
- node.argumentsNode,
- selector,
- arg);
+ node, node.receiver, node.argumentsNode, selector, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionInvoke(
node,
@@ -198,165 +219,75 @@
case AccessKind.STATIC_FIELD:
case AccessKind.FINAL_STATIC_FIELD:
return visitor.visitStaticFieldInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.STATIC_METHOD:
return visitor.visitStaticFunctionInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.STATIC_GETTER:
return visitor.visitStaticGetterInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.STATIC_SETTER:
return visitor.visitStaticSetterInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.TOPLEVEL_FIELD:
case AccessKind.FINAL_TOPLEVEL_FIELD:
return visitor.visitTopLevelFieldInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelFunctionInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.TOPLEVEL_GETTER:
return visitor.visitTopLevelGetterInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.TOPLEVEL_SETTER:
return visitor.visitTopLevelSetterInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.CLASS_TYPE_LITERAL:
return visitor.visitClassTypeLiteralInvoke(
- node,
- semantics.constant,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.constant, node.argumentsNode, callStructure, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralInvoke(
- node,
- semantics.constant,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.constant, node.argumentsNode, callStructure, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralInvoke(
- node,
- semantics.constant,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.constant, node.argumentsNode, callStructure, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.EXPRESSION:
return visitor.visitExpressionInvoke(
- node,
- node.selector,
- node.argumentsNode,
- callStructure,
- arg);
+ node, node.selector, node.argumentsNode, callStructure, arg);
case AccessKind.THIS:
return visitor.visitThisInvoke(
- node,
- node.argumentsNode,
- callStructure,
- arg);
+ node, node.argumentsNode, callStructure, arg);
case AccessKind.THIS_PROPERTY:
return visitor.visitThisPropertyInvoke(
- node,
- node.argumentsNode,
- selector,
- arg);
+ node, node.argumentsNode, selector, arg);
case AccessKind.SUPER_FIELD:
case AccessKind.SUPER_FINAL_FIELD:
return visitor.visitSuperFieldInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.SUPER_GETTER:
return visitor.visitSuperGetterInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.SUPER_SETTER:
return visitor.visitSuperSetterInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.CONSTANT:
return visitor.visitConstantInvoke(
- node,
- semantics.constant,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.constant, node.argumentsNode, callStructure, arg);
case AccessKind.UNRESOLVED:
return visitor.visitUnresolvedInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- selector,
- arg);
+ node, semantics.element, node.argumentsNode, selector, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- selector,
- arg);
+ node, semantics.element, node.argumentsNode, selector, arg);
case AccessKind.INVALID:
return visitor.errorInvalidInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- selector,
- arg);
+ node, semantics.element, node.argumentsNode, selector, arg);
case AccessKind.COMPOUND:
// This is not a valid case.
break;
@@ -383,37 +314,24 @@
IncompatibleInvokeStructure(this.semantics, this.selector);
+ @override
+ SendStructureKind get kind => SendStructureKind.INCOMPATIBLE_INVOKE;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.STATIC_METHOD:
return visitor.visitStaticFunctionIncompatibleInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodIncompatibleInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelFunctionIncompatibleInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
+ node, semantics.element, node.argumentsNode, callStructure, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionIncompatibleInvoke(
- node,
- semantics.element,
- node.argumentsNode,
- callStructure,
- arg);
- default:
+ node, semantics.element, node.argumentsNode, callStructure, arg);
+ default:
// TODO(johnniwinther): Support more variants of this invoke structure.
break;
}
@@ -431,99 +349,54 @@
GetStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.GET;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
return visitor.visitIfNotNullDynamicPropertyGet(
- node,
- node.receiver,
- semantics.name,
- arg);
+ node, node.receiver, semantics.name, arg);
case AccessKind.DYNAMIC_PROPERTY:
return visitor.visitDynamicPropertyGet(
- node,
- node.receiver,
- semantics.name,
- arg);
+ node, node.receiver, semantics.name, arg);
case AccessKind.LOCAL_FUNCTION:
- return visitor.visitLocalFunctionGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitLocalFunctionGet(node, semantics.element, arg);
case AccessKind.LOCAL_VARIABLE:
case AccessKind.FINAL_LOCAL_VARIABLE:
- return visitor.visitLocalVariableGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitLocalVariableGet(node, semantics.element, arg);
case AccessKind.PARAMETER:
case AccessKind.FINAL_PARAMETER:
- return visitor.visitParameterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitParameterGet(node, semantics.element, arg);
case AccessKind.STATIC_FIELD:
case AccessKind.FINAL_STATIC_FIELD:
- return visitor.visitStaticFieldGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitStaticFieldGet(node, semantics.element, arg);
case AccessKind.STATIC_METHOD:
- return visitor.visitStaticFunctionGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitStaticFunctionGet(node, semantics.element, arg);
case AccessKind.STATIC_GETTER:
- return visitor.visitStaticGetterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitStaticGetterGet(node, semantics.element, arg);
case AccessKind.STATIC_SETTER:
- return visitor.visitStaticSetterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitStaticSetterGet(node, semantics.element, arg);
case AccessKind.TOPLEVEL_FIELD:
case AccessKind.FINAL_TOPLEVEL_FIELD:
- return visitor.visitTopLevelFieldGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitTopLevelFieldGet(node, semantics.element, arg);
case AccessKind.TOPLEVEL_METHOD:
- return visitor.visitTopLevelFunctionGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitTopLevelFunctionGet(node, semantics.element, arg);
case AccessKind.TOPLEVEL_GETTER:
- return visitor.visitTopLevelGetterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitTopLevelGetterGet(node, semantics.element, arg);
case AccessKind.TOPLEVEL_SETTER:
- return visitor.visitTopLevelSetterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitTopLevelSetterGet(node, semantics.element, arg);
case AccessKind.CLASS_TYPE_LITERAL:
- return visitor.visitClassTypeLiteralGet(
- node,
- semantics.constant,
- arg);
+ return visitor.visitClassTypeLiteralGet(node, semantics.constant, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralGet(
- node,
- semantics.constant,
- arg);
+ node, semantics.constant, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralGet(
- node,
- semantics.constant,
- arg);
+ node, semantics.constant, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralGet(
- node,
- semantics.element,
- arg);
+ node, semantics.element, arg);
case AccessKind.EXPRESSION:
// This is not a valid case.
break;
@@ -531,51 +404,24 @@
// TODO(johnniwinther): Handle this when `this` is a [Send].
break;
case AccessKind.THIS_PROPERTY:
- return visitor.visitThisPropertyGet(
- node,
- semantics.name,
- arg);
+ return visitor.visitThisPropertyGet(node, semantics.name, arg);
case AccessKind.SUPER_FIELD:
case AccessKind.SUPER_FINAL_FIELD:
- return visitor.visitSuperFieldGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitSuperFieldGet(node, semantics.element, arg);
case AccessKind.SUPER_METHOD:
- return visitor.visitSuperMethodGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitSuperMethodGet(node, semantics.element, arg);
case AccessKind.SUPER_GETTER:
- return visitor.visitSuperGetterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitSuperGetterGet(node, semantics.element, arg);
case AccessKind.SUPER_SETTER:
- return visitor.visitSuperSetterGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitSuperSetterGet(node, semantics.element, arg);
case AccessKind.CONSTANT:
- return visitor.visitConstantGet(
- node,
- semantics.constant,
- arg);
+ return visitor.visitConstantGet(node, semantics.constant, arg);
case AccessKind.UNRESOLVED:
- return visitor.visitUnresolvedGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitUnresolvedGet(node, semantics.element, arg);
case AccessKind.UNRESOLVED_SUPER:
- return visitor.visitUnresolvedSuperGet(
- node,
- semantics.element,
- arg);
+ return visitor.visitUnresolvedSuperGet(node, semantics.element, arg);
case AccessKind.INVALID:
- return visitor.errorInvalidGet(
- node,
- semantics.element,
- arg);
+ return visitor.errorInvalidGet(node, semantics.element, arg);
case AccessKind.COMPOUND:
// This is not a valid case.
break;
@@ -593,136 +439,74 @@
SetStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.SET;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
return visitor.visitIfNotNullDynamicPropertySet(
- node,
- node.receiver,
- semantics.name,
- node.arguments.single,
- arg);
+ node, node.receiver, semantics.name, node.arguments.single, arg);
case AccessKind.DYNAMIC_PROPERTY:
return visitor.visitDynamicPropertySet(
- node,
- node.receiver,
- semantics.name,
- node.arguments.single,
- arg);
+ node, node.receiver, semantics.name, node.arguments.single, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.LOCAL_VARIABLE:
return visitor.visitLocalVariableSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_LOCAL_VARIABLE:
return visitor.visitFinalLocalVariableSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.PARAMETER:
return visitor.visitParameterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_PARAMETER:
return visitor.visitFinalParameterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_FIELD:
return visitor.visitStaticFieldSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_STATIC_FIELD:
return visitor.visitFinalStaticFieldSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_METHOD:
return visitor.visitStaticFunctionSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_GETTER:
return visitor.visitStaticGetterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_SETTER:
return visitor.visitStaticSetterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.TOPLEVEL_FIELD:
return visitor.visitTopLevelFieldSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_TOPLEVEL_FIELD:
return visitor.visitFinalTopLevelFieldSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelFunctionSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.TOPLEVEL_GETTER:
return visitor.visitTopLevelGetterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.TOPLEVEL_SETTER:
return visitor.visitTopLevelSetterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.CLASS_TYPE_LITERAL:
return visitor.visitClassTypeLiteralSet(
- node,
- semantics.constant,
- node.arguments.single,
- arg);
+ node, semantics.constant, node.arguments.single, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralSet(
- node,
- semantics.constant,
- node.arguments.single,
- arg);
+ node, semantics.constant, node.arguments.single, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralSet(
- node,
- semantics.constant,
- node.arguments.single,
- arg);
+ node, semantics.constant, node.arguments.single, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.EXPRESSION:
// This is not a valid case.
break;
@@ -731,61 +515,34 @@
break;
case AccessKind.THIS_PROPERTY:
return visitor.visitThisPropertySet(
- node,
- semantics.name,
- node.arguments.single,
- arg);
+ node, semantics.name, node.arguments.single, arg);
case AccessKind.SUPER_FIELD:
return visitor.visitSuperFieldSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_FINAL_FIELD:
return visitor.visitFinalSuperFieldSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_GETTER:
return visitor.visitSuperGetterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_SETTER:
return visitor.visitSuperSetterSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.CONSTANT:
// TODO(johnniwinther): Should this be a valid case?
break;
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.UNRESOLVED:
return visitor.visitUnresolvedSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidSet(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.COMPOUND:
// This is not a valid case.
break;
@@ -801,12 +558,12 @@
const NotStructure();
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
- return visitor.visitNot(
- node,
- node.receiver,
- arg);
+ return visitor.visitNot(node, node.receiver, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.NOT;
+
String toString() => 'not()';
}
@@ -821,32 +578,21 @@
UnaryStructure(this.semantics, this.operator);
+ @override
+ SendStructureKind get kind => SendStructureKind.UNARY;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
- return visitor.visitUnary(
- node,
- operator,
- node.receiver,
- arg);
+ return visitor.visitUnary(node, operator, node.receiver, arg);
case AccessKind.SUPER_METHOD:
- return visitor.visitSuperUnary(
- node,
- operator,
- semantics.element,
- arg);
+ return visitor.visitSuperUnary(node, operator, semantics.element, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperUnary(
- node,
- operator,
- semantics.element,
- arg);
+ node, operator, semantics.element, arg);
case AccessKind.INVALID:
return visitor.errorInvalidUnary(
- node,
- operator,
- semantics.element,
- arg);
+ node, operator, semantics.element, arg);
default:
// This is not a valid case.
break;
@@ -865,12 +611,12 @@
@override
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
return visitor.errorUndefinedUnaryExpression(
- node,
- node.selector,
- node.receiver,
- arg);
+ node, node.selector, node.receiver, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.INVALID_UNARY;
+
String toString() => 'invalid unary';
}
@@ -882,32 +628,23 @@
IndexStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.INDEX;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
return visitor.visitIndex(
- node,
- node.receiver,
- node.arguments.single,
- arg);
+ node, node.receiver, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperIndex(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperIndex(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidIndex(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
default:
// This is not a valid case.
break;
@@ -924,26 +661,20 @@
EqualsStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.EQUALS;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
return visitor.visitEquals(
- node,
- node.receiver,
- node.arguments.single,
- arg);
+ node, node.receiver, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperEquals(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidEquals(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
default:
// This is not a valid case.
break;
@@ -962,26 +693,20 @@
NotEqualsStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.NOT_EQUALS;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
return visitor.visitNotEquals(
- node,
- node.receiver,
- node.arguments.single,
- arg);
+ node, node.receiver, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperNotEquals(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidNotEquals(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
default:
// This is not a valid case.
break;
@@ -1004,42 +729,28 @@
BinaryStructure(this.semantics, this.operator);
+ @override
+ SendStructureKind get kind => SendStructureKind.BINARY;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
return visitor.visitBinary(
- node,
- node.receiver,
- operator,
- node.arguments.single,
- arg);
+ node, node.receiver, operator, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperBinary(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperBinary(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidBinary(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
default:
// This is not a valid case.
break;
}
- throw new SpannableAssertionFailure(
- node, "Invalid binary: ${semantics}");
+ throw new SpannableAssertionFailure(node, "Invalid binary: ${semantics}");
}
String toString() => 'binary($operator,$semantics)';
@@ -1053,13 +764,12 @@
@override
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
return visitor.errorUndefinedBinaryExpression(
- node,
- node.receiver,
- node.selector,
- node.arguments.single,
- arg);
+ node, node.receiver, node.selector, node.arguments.single, arg);
}
+ @override
+ SendStructureKind get kind => SendStructureKind.INVALID_BINARY;
+
String toString() => 'invalid binary';
}
@@ -1070,37 +780,24 @@
IndexSetStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.INDEX_SET;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
- return visitor.visitIndexSet(
- node,
- node.receiver,
- node.arguments.first,
- node.arguments.tail.head,
- arg);
+ return visitor.visitIndexSet(node, node.receiver, node.arguments.first,
+ node.arguments.tail.head, arg);
case AccessKind.SUPER_METHOD:
- return visitor.visitSuperIndexSet(
- node,
- semantics.element,
- node.arguments.first,
- node.arguments.tail.head,
- arg);
+ return visitor.visitSuperIndexSet(node, semantics.element,
+ node.arguments.first, node.arguments.tail.head, arg);
case AccessKind.UNRESOLVED_SUPER:
case AccessKind.UNRESOLVED:
- return visitor.visitUnresolvedSuperIndexSet(
- node,
- semantics.element,
- node.arguments.first,
- node.arguments.tail.head,
- arg);
+ return visitor.visitUnresolvedSuperIndexSet(node, semantics.element,
+ node.arguments.first, node.arguments.tail.head, arg);
case AccessKind.INVALID:
- return visitor.errorInvalidIndexSet(
- node,
- semantics.element,
- node.arguments.first,
- node.arguments.tail.head,
- arg);
+ return visitor.errorInvalidIndexSet(node, semantics.element,
+ node.arguments.first, node.arguments.tail.head, arg);
default:
// This is not a valid case.
break;
@@ -1123,40 +820,26 @@
IndexPrefixStructure(this.semantics, this.operator);
+ @override
+ SendStructureKind get kind => SendStructureKind.INDEX_PREFIX;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
return visitor.visitIndexPrefix(
- node,
- node.receiver,
- node.arguments.single,
- operator,
- arg);
+ node, node.receiver, node.arguments.single, operator, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperIndexPrefix(
- node,
- semantics.element,
- node.arguments.single,
- operator,
- arg);
+ node, semantics.element, node.arguments.single, operator, arg);
case AccessKind.INVALID:
return visitor.errorInvalidIndexPrefix(
- node,
- semantics.element,
- node.arguments.single,
- operator,
- arg);
+ node, semantics.element, node.arguments.single, operator, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
case CompoundAccessKind.SUPER_GETTER_SETTER:
- return visitor.visitSuperIndexPrefix(
- node,
- compoundSemantics.getter,
- compoundSemantics.setter,
- node.arguments.single,
- operator,
- arg);
+ return visitor.visitSuperIndexPrefix(node, compoundSemantics.getter,
+ compoundSemantics.setter, node.arguments.single, operator, arg);
case CompoundAccessKind.UNRESOLVED_SUPER_GETTER:
return visitor.visitUnresolvedSuperGetterIndexPrefix(
node,
@@ -1198,29 +881,20 @@
IndexPostfixStructure(this.semantics, this.operator);
+ @override
+ SendStructureKind get kind => SendStructureKind.INDEX_POSTFIX;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
return visitor.visitIndexPostfix(
- node,
- node.receiver,
- node.arguments.single,
- operator,
- arg);
+ node, node.receiver, node.arguments.single, operator, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperIndexPostfix(
- node,
- semantics.element,
- node.arguments.single,
- operator,
- arg);
+ node, semantics.element, node.arguments.single, operator, arg);
case AccessKind.INVALID:
return visitor.errorInvalidIndexPostfix(
- node,
- semantics.element,
- node.arguments.single,
- operator,
- arg);
+ node, semantics.element, node.arguments.single, operator, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -1271,8 +945,10 @@
/// The assignment operator used in the compound assignment.
final AssignmentOperator operator;
- CompoundStructure(this.semantics,
- this.operator);
+ CompoundStructure(this.semantics, this.operator);
+
+ @override
+ SendStructureKind get kind => SendStructureKind.COMPOUND;
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
@@ -1285,69 +961,32 @@
node.arguments.single,
arg);
case AccessKind.DYNAMIC_PROPERTY:
- return visitor.visitDynamicPropertyCompound(
- node,
- node.receiver,
- semantics.name,
- operator,
- node.arguments.single,
- arg);
+ return visitor.visitDynamicPropertyCompound(node, node.receiver,
+ semantics.name, operator, node.arguments.single, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.LOCAL_VARIABLE:
return visitor.visitLocalVariableCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.FINAL_LOCAL_VARIABLE:
return visitor.visitFinalLocalVariableCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.PARAMETER:
return visitor.visitParameterCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.FINAL_PARAMETER:
return visitor.visitFinalParameterCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.STATIC_FIELD:
return visitor.visitStaticFieldCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.FINAL_STATIC_FIELD:
return visitor.visitFinalStaticFieldCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.STATIC_METHOD:
return visitor.visitStaticMethodCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.STATIC_GETTER:
// This is not a valid case.
break;
@@ -1356,25 +995,13 @@
break;
case AccessKind.TOPLEVEL_FIELD:
return visitor.visitTopLevelFieldCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.FINAL_TOPLEVEL_FIELD:
return visitor.visitFinalTopLevelFieldCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelMethodCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.TOPLEVEL_GETTER:
// This is not a valid case.
break;
@@ -1383,32 +1010,16 @@
break;
case AccessKind.CLASS_TYPE_LITERAL:
return visitor.visitClassTypeLiteralCompound(
- node,
- semantics.constant,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.constant, operator, node.arguments.single, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralCompound(
- node,
- semantics.constant,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.constant, operator, node.arguments.single, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralCompound(
- node,
- semantics.constant,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.constant, operator, node.arguments.single, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.EXPRESSION:
// This is not a valid case.
break;
@@ -1417,32 +1028,16 @@
break;
case AccessKind.THIS_PROPERTY:
return visitor.visitThisPropertyCompound(
- node,
- semantics.name,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.name, operator, node.arguments.single, arg);
case AccessKind.SUPER_FIELD:
return visitor.visitSuperFieldCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.SUPER_FINAL_FIELD:
return visitor.visitFinalSuperFieldCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.SUPER_GETTER:
// This is not a valid case.
break;
@@ -1454,25 +1049,13 @@
break;
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.UNRESOLVED:
return visitor.visitUnresolvedCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidCompound(
- node,
- semantics.element,
- operator,
- node.arguments.single,
- arg);
+ node, semantics.element, operator, node.arguments.single, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -1599,8 +1182,8 @@
}
break;
}
- throw new SpannableAssertionFailure(node,
- "Invalid compound assigment: ${semantics}");
+ throw new SpannableAssertionFailure(
+ node, "Invalid compound assigment: ${semantics}");
}
String toString() => 'compound($operator,$semantics)';
@@ -1614,70 +1197,41 @@
SetIfNullStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.SET_IF_NULL;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
return visitor.visitIfNotNullDynamicPropertySetIfNull(
- node,
- node.receiver,
- semantics.name,
- node.arguments.single,
- arg);
+ node, node.receiver, semantics.name, node.arguments.single, arg);
case AccessKind.DYNAMIC_PROPERTY:
return visitor.visitDynamicPropertySetIfNull(
- node,
- node.receiver,
- semantics.name,
- node.arguments.single,
- arg);
+ node, node.receiver, semantics.name, node.arguments.single, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.LOCAL_VARIABLE:
return visitor.visitLocalVariableSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_LOCAL_VARIABLE:
return visitor.visitFinalLocalVariableSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.PARAMETER:
return visitor.visitParameterSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_PARAMETER:
return visitor.visitFinalParameterSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_FIELD:
return visitor.visitStaticFieldSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_STATIC_FIELD:
return visitor.visitFinalStaticFieldSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_METHOD:
return visitor.visitStaticMethodSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.STATIC_GETTER:
// This is not a valid case.
break;
@@ -1686,22 +1240,13 @@
break;
case AccessKind.TOPLEVEL_FIELD:
return visitor.visitTopLevelFieldSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.FINAL_TOPLEVEL_FIELD:
return visitor.visitFinalTopLevelFieldSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelMethodSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.TOPLEVEL_GETTER:
// This is not a valid case.
break;
@@ -1710,28 +1255,16 @@
break;
case AccessKind.CLASS_TYPE_LITERAL:
return visitor.visitClassTypeLiteralSetIfNull(
- node,
- semantics.constant,
- node.arguments.single,
- arg);
+ node, semantics.constant, node.arguments.single, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralSetIfNull(
- node,
- semantics.constant,
- node.arguments.single,
- arg);
+ node, semantics.constant, node.arguments.single, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralSetIfNull(
- node,
- semantics.constant,
- node.arguments.single,
- arg);
+ node, semantics.constant, node.arguments.single, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.EXPRESSION:
// This is not a valid case.
break;
@@ -1740,28 +1273,16 @@
break;
case AccessKind.THIS_PROPERTY:
return visitor.visitThisPropertySetIfNull(
- node,
- semantics.name,
- node.arguments.single,
- arg);
+ node, semantics.name, node.arguments.single, arg);
case AccessKind.SUPER_FIELD:
return visitor.visitSuperFieldSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_FINAL_FIELD:
return visitor.visitFinalSuperFieldSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.SUPER_GETTER:
// This is not a valid case.
break;
@@ -1773,22 +1294,13 @@
break;
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.UNRESOLVED:
return visitor.visitUnresolvedSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.INVALID:
return visitor.errorInvalidSetIfNull(
- node,
- semantics.element,
- node.arguments.single,
- arg);
+ node, semantics.element, node.arguments.single, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -1900,8 +1412,8 @@
}
break;
}
- throw new SpannableAssertionFailure(node,
- "Invalid if-null assigment: ${semantics}");
+ throw new SpannableAssertionFailure(
+ node, "Invalid if-null assigment: ${semantics}");
}
String toString() => 'ifNull($semantics)';
@@ -1918,16 +1430,14 @@
CompoundIndexSetStructure(this.semantics, this.operator);
+ @override
+ SendStructureKind get kind => SendStructureKind.COMPOUND_INDEX_SET;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
- return visitor.visitCompoundIndexSet(
- node,
- node.receiver,
- node.arguments.first,
- operator,
- node.arguments.tail.head,
- arg);
+ return visitor.visitCompoundIndexSet(node, node.receiver,
+ node.arguments.first, operator, node.arguments.tail.head, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperCompoundIndexSet(
node,
@@ -1937,13 +1447,8 @@
node.arguments.tail.head,
arg);
case AccessKind.INVALID:
- return visitor.errorInvalidCompoundIndexSet(
- node,
- semantics.element,
- node.arguments.first,
- operator,
- node.arguments.tail.head,
- arg);
+ return visitor.errorInvalidCompoundIndexSet(node, semantics.element,
+ node.arguments.first, operator, node.arguments.tail.head, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -1998,15 +1503,14 @@
IndexSetIfNullStructure(this.semantics);
+ @override
+ SendStructureKind get kind => SendStructureKind.INDEX_SET;
+
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.EXPRESSION:
- return visitor.visitIndexSetIfNull(
- node,
- node.receiver,
- node.arguments.first,
- node.arguments.tail.head,
- arg);
+ return visitor.visitIndexSetIfNull(node, node.receiver,
+ node.arguments.first, node.arguments.tail.head, arg);
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperIndexSetIfNull(
node,
@@ -2015,12 +1519,8 @@
node.arguments.tail.head,
arg);
case AccessKind.INVALID:
- return visitor.errorInvalidIndexSetIfNull(
- node,
- semantics.element,
- node.arguments.first,
- node.arguments.tail.head,
- arg);
+ return visitor.errorInvalidIndexSetIfNull(node, semantics.element,
+ node.arguments.first, node.arguments.tail.head, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -2073,73 +1573,43 @@
/// The `++` or `--` operator used in the operation.
final IncDecOperator operator;
- PrefixStructure(this.semantics,
- this.operator);
+ PrefixStructure(this.semantics, this.operator);
+
+ @override
+ SendStructureKind get kind => SendStructureKind.PREFIX;
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
return visitor.visitIfNotNullDynamicPropertyPrefix(
- node,
- node.receiver,
- semantics.name,
- operator,
- arg);
+ node, node.receiver, semantics.name, operator, arg);
case AccessKind.DYNAMIC_PROPERTY:
return visitor.visitDynamicPropertyPrefix(
- node,
- node.receiver,
- semantics.name,
- operator,
- arg);
+ node, node.receiver, semantics.name, operator, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.LOCAL_VARIABLE:
return visitor.visitLocalVariablePrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_LOCAL_VARIABLE:
return visitor.visitFinalLocalVariablePrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.PARAMETER:
return visitor.visitParameterPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_PARAMETER:
return visitor.visitFinalParameterPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.STATIC_FIELD:
return visitor.visitStaticFieldPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_STATIC_FIELD:
return visitor.visitFinalStaticFieldPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.STATIC_METHOD:
return visitor.visitStaticMethodPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.STATIC_GETTER:
// This is not a valid case.
break;
@@ -2148,22 +1618,13 @@
break;
case AccessKind.TOPLEVEL_FIELD:
return visitor.visitTopLevelFieldPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_TOPLEVEL_FIELD:
return visitor.visitFinalTopLevelFieldPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelMethodPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.TOPLEVEL_GETTER:
// This is not a valid case.
break;
@@ -2172,28 +1633,16 @@
break;
case AccessKind.CLASS_TYPE_LITERAL:
return visitor.visitClassTypeLiteralPrefix(
- node,
- semantics.constant,
- operator,
- arg);
+ node, semantics.constant, operator, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralPrefix(
- node,
- semantics.constant,
- operator,
- arg);
+ node, semantics.constant, operator, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralPrefix(
- node,
- semantics.constant,
- operator,
- arg);
+ node, semantics.constant, operator, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.EXPRESSION:
// This is not a valid case.
break;
@@ -2202,28 +1651,16 @@
break;
case AccessKind.THIS_PROPERTY:
return visitor.visitThisPropertyPrefix(
- node,
- semantics.name,
- operator,
- arg);
+ node, semantics.name, operator, arg);
case AccessKind.SUPER_FIELD:
return visitor.visitSuperFieldPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.SUPER_FINAL_FIELD:
return visitor.visitFinalSuperFieldPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.SUPER_GETTER:
// This is not a valid case.
break;
@@ -2235,22 +1672,13 @@
break;
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.UNRESOLVED:
return visitor.visitUnresolvedPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.INVALID:
return visitor.errorInvalidPrefix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -2368,8 +1796,8 @@
arg);
}
}
- throw new SpannableAssertionFailure(node,
- "Invalid compound assigment: ${semantics}");
+ throw new SpannableAssertionFailure(
+ node, "Invalid compound assigment: ${semantics}");
}
String toString() => 'prefix($operator,$semantics)';
@@ -2384,73 +1812,43 @@
/// The `++` or `--` operator used in the operation.
final IncDecOperator operator;
- PostfixStructure(this.semantics,
- this.operator);
+ PostfixStructure(this.semantics, this.operator);
+
+ @override
+ SendStructureKind get kind => SendStructureKind.POSTFIX;
R dispatch(SemanticSendVisitor<R, A> visitor, Send node, A arg) {
switch (semantics.kind) {
case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
return visitor.visitIfNotNullDynamicPropertyPostfix(
- node,
- node.receiver,
- semantics.name,
- operator,
- arg);
+ node, node.receiver, semantics.name, operator, arg);
case AccessKind.DYNAMIC_PROPERTY:
return visitor.visitDynamicPropertyPostfix(
- node,
- node.receiver,
- semantics.name,
- operator,
- arg);
+ node, node.receiver, semantics.name, operator, arg);
case AccessKind.LOCAL_FUNCTION:
return visitor.visitLocalFunctionPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.LOCAL_VARIABLE:
return visitor.visitLocalVariablePostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_LOCAL_VARIABLE:
return visitor.visitFinalLocalVariablePostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.PARAMETER:
return visitor.visitParameterPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_PARAMETER:
return visitor.visitFinalParameterPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.STATIC_FIELD:
return visitor.visitStaticFieldPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_STATIC_FIELD:
return visitor.visitFinalStaticFieldPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.STATIC_METHOD:
return visitor.visitStaticMethodPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.STATIC_GETTER:
// This is not a valid case.
break;
@@ -2459,22 +1857,13 @@
break;
case AccessKind.TOPLEVEL_FIELD:
return visitor.visitTopLevelFieldPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.FINAL_TOPLEVEL_FIELD:
return visitor.visitFinalTopLevelFieldPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.TOPLEVEL_METHOD:
return visitor.visitTopLevelMethodPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.TOPLEVEL_GETTER:
// This is not a valid case.
break;
@@ -2483,28 +1872,16 @@
break;
case AccessKind.CLASS_TYPE_LITERAL:
return visitor.visitClassTypeLiteralPostfix(
- node,
- semantics.constant,
- operator,
- arg);
+ node, semantics.constant, operator, arg);
case AccessKind.TYPEDEF_TYPE_LITERAL:
return visitor.visitTypedefTypeLiteralPostfix(
- node,
- semantics.constant,
- operator,
- arg);
+ node, semantics.constant, operator, arg);
case AccessKind.DYNAMIC_TYPE_LITERAL:
return visitor.visitDynamicTypeLiteralPostfix(
- node,
- semantics.constant,
- operator,
- arg);
+ node, semantics.constant, operator, arg);
case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
return visitor.visitTypeVariableTypeLiteralPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.EXPRESSION:
// This is not a valid case.
break;
@@ -2513,28 +1890,16 @@
break;
case AccessKind.THIS_PROPERTY:
return visitor.visitThisPropertyPostfix(
- node,
- semantics.name,
- operator,
- arg);
+ node, semantics.name, operator, arg);
case AccessKind.SUPER_FIELD:
return visitor.visitSuperFieldPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.SUPER_FINAL_FIELD:
return visitor.visitFinalSuperFieldPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.SUPER_METHOD:
return visitor.visitSuperMethodPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.SUPER_GETTER:
// This is not a valid case.
break;
@@ -2546,22 +1911,13 @@
break;
case AccessKind.UNRESOLVED_SUPER:
return visitor.visitUnresolvedSuperPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.UNRESOLVED:
return visitor.visitUnresolvedPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.INVALID:
return visitor.errorInvalidPostfix(
- node,
- semantics.element,
- operator,
- arg);
+ node, semantics.element, operator, arg);
case AccessKind.COMPOUND:
CompoundAccessSemantics compoundSemantics = semantics;
switch (compoundSemantics.compoundAccessKind) {
@@ -2672,14 +2028,13 @@
arg);
}
}
- throw new SpannableAssertionFailure(node,
- "Invalid compound assigment: ${semantics}");
+ throw new SpannableAssertionFailure(
+ node, "Invalid compound assigment: ${semantics}");
}
String toString() => 'postfix($operator,$semantics)';
}
-
/// The structure for a [Send] whose prefix is a prefix for a deferred library.
/// For instance `deferred.a` where `deferred` is a deferred prefix.
class DeferredPrefixStructure<R, A> implements SendStructure<R, A> {
@@ -2696,17 +2051,23 @@
}
@override
+ SendStructureKind get kind => SendStructureKind.DEFERRED_PREFIX;
+
+ @override
R dispatch(SemanticSendVisitor<R, A> visitor, Send send, A arg) {
visitor.previsitDeferredAccess(send, prefix, arg);
return sendStructure.dispatch(visitor, send, arg);
}
}
+enum NewStructureKind { NEW_INVOKE, CONST_INVOKE, LATE_CONST, }
/// The structure for a [NewExpression] of a new invocation.
abstract class NewStructure<R, A> implements SemanticSendStructure<R, A> {
/// Calls the matching visit method on [visitor] with [node] and [arg].
R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg);
+
+ NewStructureKind get kind;
}
/// The structure for a [NewExpression] of a new invocation. For instance
@@ -2717,6 +2078,9 @@
NewInvokeStructure(this.semantics, this.selector);
+ @override
+ NewStructureKind get kind => NewStructureKind.NEW_INVOKE;
+
CallStructure get callStructure => selector.callStructure;
R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) {
@@ -2725,66 +2089,95 @@
ConstructorElement constructor = semantics.element;
if (constructor.isRedirectingGenerative) {
return visitor.visitRedirectingGenerativeConstructorInvoke(
- node, constructor, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ constructor,
+ semantics.type,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
}
- return visitor.visitGenerativeConstructorInvoke(
- node, constructor, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ return visitor.visitGenerativeConstructorInvoke(node, constructor,
+ semantics.type, node.send.argumentsNode, callStructure, arg);
case ConstructorAccessKind.FACTORY:
ConstructorElement constructor = semantics.element;
if (constructor.isRedirectingFactory) {
if (constructor.isEffectiveTargetMalformed) {
return visitor.visitUnresolvedRedirectingFactoryConstructorInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
}
ConstructorElement effectiveTarget = constructor.effectiveTarget;
InterfaceType effectiveTargetType =
constructor.computeEffectiveTargetType(semantics.type);
- if (callStructure.signatureApplies(
- effectiveTarget.functionSignature)) {
+ if (callStructure
+ .signatureApplies(effectiveTarget.functionSignature)) {
return visitor.visitRedirectingFactoryConstructorInvoke(
- node, semantics.element, semantics.type,
- effectiveTarget, effectiveTargetType,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ effectiveTarget,
+ effectiveTargetType,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
} else {
return visitor.visitUnresolvedRedirectingFactoryConstructorInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
}
}
if (callStructure.signatureApplies(constructor.functionSignature)) {
- return visitor.visitFactoryConstructorInvoke(
- node, constructor, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ return visitor.visitFactoryConstructorInvoke(node, constructor,
+ semantics.type, node.send.argumentsNode, callStructure, arg);
}
- return visitor.visitConstructorIncompatibleInvoke(
- node, constructor, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ return visitor.visitConstructorIncompatibleInvoke(node, constructor,
+ semantics.type, node.send.argumentsNode, callStructure, arg);
case ConstructorAccessKind.ABSTRACT:
return visitor.visitAbstractClassConstructorInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
case ConstructorAccessKind.UNRESOLVED_CONSTRUCTOR:
- return visitor.visitUnresolvedConstructorInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, selector, arg);
+ return visitor.visitUnresolvedConstructorInvoke(node, semantics.element,
+ semantics.type, node.send.argumentsNode, selector, arg);
case ConstructorAccessKind.UNRESOLVED_TYPE:
return visitor.visitUnresolvedClassConstructorInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, selector, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ node.send.argumentsNode,
+ selector,
+ arg);
case ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR:
return visitor.errorNonConstantConstructorInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
case ConstructorAccessKind.INCOMPATIBLE:
return visitor.visitConstructorIncompatibleInvoke(
- node, semantics.element, semantics.type,
- node.send.argumentsNode, callStructure, arg);
+ node,
+ semantics.element,
+ semantics.type,
+ node.send.argumentsNode,
+ callStructure,
+ arg);
}
- throw new SpannableAssertionFailure(node,
- "Unhandled constructor invocation kind: ${semantics.kind}");
+ throw new SpannableAssertionFailure(
+ node, "Unhandled constructor invocation kind: ${semantics.kind}");
}
String toString() => 'new($semantics,$selector)';
@@ -2800,13 +2193,16 @@
/// The structure for a [NewExpression] of a constant invocation. For instance
/// `const C()`.
class ConstInvokeStructure<R, A> extends NewStructure<R, A> {
- final ConstantInvokeKind kind;
+ final ConstantInvokeKind constantInvokeKind;
final ConstantExpression constant;
- ConstInvokeStructure(this.kind, this.constant);
+ ConstInvokeStructure(this.constantInvokeKind, this.constant);
+
+ @override
+ NewStructureKind get kind => NewStructureKind.CONST_INVOKE;
R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) {
- switch (kind) {
+ switch (constantInvokeKind) {
case ConstantInvokeKind.CONSTRUCTED:
return visitor.visitConstConstructorInvoke(node, constant, arg);
case ConstantInvokeKind.BOOL_FROM_ENVIRONMENT:
@@ -2831,6 +2227,48 @@
LateConstInvokeStructure(this.elements);
+ @override
+ NewStructureKind get kind => NewStructureKind.LATE_CONST;
+
+ /// Convert this new structure into a regular new structure using the data
+ /// available in [elements].
+ NewStructure resolve(NewExpression node) {
+ Element element = elements[node.send];
+ Selector selector = elements.getSelector(node.send);
+ DartType type = elements.getType(node);
+ ConstantExpression constant = elements.getConstant(node);
+ if (element.isMalformed ||
+ constant == null ||
+ constant.kind == ConstantExpressionKind.ERRONEOUS) {
+ // This is a non-constant constant constructor invocation, like
+ // `const Const(method())`.
+ return new NewInvokeStructure(
+ new ConstructorAccessSemantics(
+ ConstructorAccessKind.NON_CONSTANT_CONSTRUCTOR, element, type),
+ selector);
+ } else {
+ ConstantInvokeKind kind;
+ switch (constant.kind) {
+ case ConstantExpressionKind.CONSTRUCTED:
+ kind = ConstantInvokeKind.CONSTRUCTED;
+ break;
+ case ConstantExpressionKind.BOOL_FROM_ENVIRONMENT:
+ kind = ConstantInvokeKind.BOOL_FROM_ENVIRONMENT;
+ break;
+ case ConstantExpressionKind.INT_FROM_ENVIRONMENT:
+ kind = ConstantInvokeKind.INT_FROM_ENVIRONMENT;
+ break;
+ case ConstantExpressionKind.STRING_FROM_ENVIRONMENT:
+ kind = ConstantInvokeKind.STRING_FROM_ENVIRONMENT;
+ break;
+ default:
+ throw new SpannableAssertionFailure(
+ node, "Unexpected constant kind $kind: ${constant.getText()}");
+ }
+ return new ConstInvokeStructure(kind, constant);
+ }
+ }
+
R dispatch(SemanticSendVisitor<R, A> visitor, NewExpression node, A arg) {
Element element = elements[node.send];
Selector selector = elements.getSelector(node.send);
@@ -2841,8 +2279,7 @@
constant.kind == ConstantExpressionKind.ERRONEOUS) {
// This is a non-constant constant constructor invocation, like
// `const Const(method())`.
- return visitor.errorNonConstantConstructorInvoke(
- node, element, type,
+ return visitor.errorNonConstantConstructorInvoke(node, element, type,
node.send.argumentsNode, selector.callStructure, arg);
} else {
ConstantInvokeKind kind;
@@ -2882,16 +2319,12 @@
class RequiredParameterStructure<R, A> extends ParameterStructure<R, A> {
final int index;
- RequiredParameterStructure(
- VariableDefinitions definitions,
- Node node,
- ParameterElement parameter,
- this.index)
+ RequiredParameterStructure(VariableDefinitions definitions, Node node,
+ ParameterElement parameter, this.index)
: super(definitions, node, parameter);
@override
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- A arg) {
+ R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) {
if (parameter.isInitializingFormal) {
return visitor.visitInitializingFormalDeclaration(
definitions, node, parameter, index, arg);
@@ -2907,17 +2340,12 @@
final ConstantExpression defaultValue;
final int index;
- OptionalParameterStructure(
- VariableDefinitions definitions,
- Node node,
- ParameterElement parameter,
- this.defaultValue,
- this.index)
- : super(definitions, node, parameter);
+ OptionalParameterStructure(VariableDefinitions definitions, Node node,
+ ParameterElement parameter, this.defaultValue, this.index)
+ : super(definitions, node, parameter);
- @override
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- A arg) {
+ @override
+ R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) {
if (parameter.isInitializingFormal) {
return visitor.visitOptionalInitializingFormalDeclaration(
definitions, node, parameter, defaultValue, index, arg);
@@ -2932,16 +2360,12 @@
class NamedParameterStructure<R, A> extends ParameterStructure<R, A> {
final ConstantExpression defaultValue;
- NamedParameterStructure(
- VariableDefinitions definitions,
- Node node,
- ParameterElement parameter,
- this.defaultValue)
+ NamedParameterStructure(VariableDefinitions definitions, Node node,
+ ParameterElement parameter, this.defaultValue)
: super(definitions, node, parameter);
@override
- R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- A arg) {
+ R dispatch(SemanticDeclarationVisitor<R, A> visitor, A arg) {
if (parameter.isInitializingFormal) {
return visitor.visitNamedInitializingFormalDeclaration(
definitions, node, parameter, defaultValue, arg);
@@ -2952,7 +2376,6 @@
}
}
-
enum VariableKind {
TOP_LEVEL_FIELD,
STATIC_FIELD,
@@ -2968,19 +2391,16 @@
VariableStructure(this.kind, this.node, this.variable);
R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- VariableDefinitions definitions,
- A arg);
+ VariableDefinitions definitions, A arg);
}
-class NonConstantVariableStructure<R, A>
- extends VariableStructure<R, A> {
+class NonConstantVariableStructure<R, A> extends VariableStructure<R, A> {
NonConstantVariableStructure(
VariableKind kind, Node node, VariableElement variable)
: super(kind, node, variable);
R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- VariableDefinitions definitions,
- A arg) {
+ VariableDefinitions definitions, A arg) {
switch (kind) {
case VariableKind.TOP_LEVEL_FIELD:
return visitor.visitTopLevelFieldDeclaration(
@@ -2998,8 +2418,7 @@
}
}
-class ConstantVariableStructure<R, A>
- extends VariableStructure<R, A> {
+class ConstantVariableStructure<R, A> extends VariableStructure<R, A> {
final ConstantExpression constant;
ConstantVariableStructure(
@@ -3007,8 +2426,7 @@
: super(kind, node, variable);
R dispatch(SemanticDeclarationVisitor<R, A> visitor,
- VariableDefinitions definitions,
- A arg) {
+ VariableDefinitions definitions, A arg) {
switch (kind) {
case VariableKind.TOP_LEVEL_FIELD:
return visitor.visitTopLevelConstantDeclaration(
diff --git a/pkg/compiler/lib/src/resolution/signatures.dart b/pkg/compiler/lib/src/resolution/signatures.dart
index 0fc9aac..7b166d9 100644
--- a/pkg/compiler/lib/src/resolution/signatures.dart
+++ b/pkg/compiler/lib/src/resolution/signatures.dart
@@ -5,33 +5,26 @@
library dart2js.resolution.signatures;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- ErroneousFieldElementX,
- ErroneousInitializingFormalElementX,
- FormalElementX,
- FunctionElementX,
- FunctionSignatureX,
- InitializingFormalElementX,
- LocalParameterElementX;
+import '../elements/modelx.dart'
+ show
+ ErroneousFieldElementX,
+ ErroneousInitializingFormalElementX,
+ FormalElementX,
+ FunctionElementX,
+ FunctionSignatureX,
+ InitializingFormalElementX,
+ LocalParameterElementX;
import '../tree/tree.dart';
-import '../universe/use.dart' show
- TypeUse;
-import '../util/util.dart' show
- Link,
- LinkBuilder;
+import '../universe/use.dart' show TypeUse;
+import '../util/util.dart' show Link, LinkBuilder;
-import 'members.dart' show
- ResolverVisitor;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'resolution_common.dart' show
- MappingVisitor;
-import 'scope.dart' show
- Scope;
+import 'members.dart' show ResolverVisitor;
+import 'registry.dart' show ResolutionRegistry;
+import 'resolution_common.dart' show MappingVisitor;
+import 'scope.dart' show Scope;
/**
* [SignatureResolver] resolves function signatures.
@@ -48,11 +41,9 @@
bool optionalParametersAreNamed = false;
VariableDefinitions currentDefinitions;
- SignatureResolver(Compiler compiler,
- FunctionTypedElement enclosingElement,
- ResolutionRegistry registry,
- {this.defaultValuesError,
- this.createRealParameters})
+ SignatureResolver(Compiler compiler, FunctionTypedElement enclosingElement,
+ ResolutionRegistry registry,
+ {this.defaultValuesError, this.createRealParameters})
: this.enclosingElement = enclosingElement,
this.scope = enclosingElement.buildScope(),
this.resolver =
@@ -117,11 +108,14 @@
}
void computeParameterType(FormalElementX element,
- [VariableElement fieldElement]) {
+ [VariableElement fieldElement]) {
void computeFunctionType(FunctionExpression functionExpression) {
FunctionSignature functionSignature = SignatureResolver.analyze(
- compiler, functionExpression.parameters,
- functionExpression.returnType, element, registry,
+ compiler,
+ functionExpression.parameters,
+ functionExpression.returnType,
+ element,
+ registry,
defaultValuesError: MessageKind.FUNCTION_TYPE_FORMAL_WITH_DEFAULT);
element.functionSignature = functionSignature;
}
@@ -137,7 +131,7 @@
// Inline function typed parameter, like `void m(int f(String s))`.
computeFunctionType(link.head);
} else if (link.head.asSend() != null &&
- link.head.asSend().selector.asFunctionExpression() != null) {
+ link.head.asSend().selector.asFunctionExpression() != null) {
// Inline function typed initializing formal or
// parameter with default value, like `C(int this.f(String s))` or
// `void m([int f(String s) = null])`.
@@ -170,8 +164,8 @@
functionExpression.name.asIdentifier() != null) {
return functionExpression.name.asIdentifier();
} else {
- reporter.internalError(node,
- 'internal error: unimplemented receiver on parameter send');
+ reporter.internalError(
+ node, 'internal error: unimplemented receiver on parameter send');
return null;
}
}
@@ -188,18 +182,18 @@
FormalElementX parameter;
if (createRealParameters) {
parameter = new LocalParameterElementX(
- enclosingElement, currentDefinitions, name, initializer,
- isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed);
+ enclosingElement, currentDefinitions, name, initializer,
+ isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed);
} else {
parameter = new FormalElementX(
- ElementKind.PARAMETER, enclosingElement, currentDefinitions, name);
+ ElementKind.PARAMETER, enclosingElement, currentDefinitions, name);
}
computeParameterType(parameter);
return parameter;
}
- InitializingFormalElementX createFieldParameter(Send node,
- Expression initializer) {
+ InitializingFormalElementX createFieldParameter(
+ Send node, Expression initializer) {
InitializingFormalElementX element;
Identifier receiver = node.receiver.asIdentifier();
if (receiver == null || !receiver.isThis()) {
@@ -221,16 +215,16 @@
!identical(fieldElement.kind, ElementKind.FIELD)) {
reporter.reportErrorMessage(
node, MessageKind.NOT_A_FIELD, {'fieldName': name});
- fieldElement = new ErroneousFieldElementX(
- name, enclosingElement.enclosingClass);
+ fieldElement =
+ new ErroneousFieldElementX(name, enclosingElement.enclosingClass);
} else if (!fieldElement.isInstanceMember) {
reporter.reportErrorMessage(
node, MessageKind.NOT_INSTANCE_FIELD, {'fieldName': name});
- fieldElement = new ErroneousFieldElementX(
- name, enclosingElement.enclosingClass);
+ fieldElement =
+ new ErroneousFieldElementX(name, enclosingElement.enclosingClass);
}
- element = new InitializingFormalElementX(enclosingElement,
- currentDefinitions, name, initializer, fieldElement,
+ element = new InitializingFormalElementX(
+ enclosingElement, currentDefinitions, name, initializer, fieldElement,
isOptional: isOptionalParameter, isNamed: optionalParametersAreNamed);
computeParameterType(element, fieldElement);
}
@@ -243,7 +237,7 @@
if (node.receiver != null) {
element = createFieldParameter(node, node.arguments.first);
} else if (node.selector.asIdentifier() != null ||
- node.selector.asFunctionExpression() != null) {
+ node.selector.asFunctionExpression() != null) {
element = createParameter(getParameterName(node), node.arguments.first);
}
Node defaultValue = node.arguments.head;
@@ -258,8 +252,7 @@
Modifiers modifiers = currentDefinitions.modifiers;
if (modifiers.isFinal) {
reporter.reportErrorMessage(
- modifiers,
- MessageKind.FINAL_FUNCTION_TYPE_PARAMETER);
+ modifiers, MessageKind.FINAL_FUNCTION_TYPE_PARAMETER);
}
if (modifiers.isVar) {
reporter.reportErrorMessage(
@@ -278,7 +271,7 @@
} else {
// If parameter is null, the current node should be the last,
// and a list of optional named parameters.
- if (!link.tail.isEmpty || (link.head is !NodeList)) {
+ if (!link.tail.isEmpty || (link.head is! NodeList)) {
reporter.internalError(link.head, "expected optional parameters");
}
}
@@ -301,12 +294,13 @@
FunctionTypedElement element,
ResolutionRegistry registry,
{MessageKind defaultValuesError,
- bool createRealParameters: false,
- bool isFunctionExpression: false}) {
+ bool createRealParameters: false,
+ bool isFunctionExpression: false}) {
DiagnosticReporter reporter = compiler.reporter;
- SignatureResolver visitor = new SignatureResolver(compiler, element,
- registry, defaultValuesError: defaultValuesError,
+ SignatureResolver visitor = new SignatureResolver(
+ compiler, element, registry,
+ defaultValuesError: defaultValuesError,
createRealParameters: createRealParameters);
List<Element> parameters = const <Element>[];
int requiredParameterCount = 0;
@@ -324,17 +318,17 @@
}
} else {
if (element.isGetter) {
- if (!identical(formalParameters.endToken.next.stringValue,
- // TODO(ahe): Remove the check for native keyword.
- 'native')) {
+ if (!identical(
+ formalParameters.endToken.next.stringValue,
+ // TODO(ahe): Remove the check for native keyword.
+ 'native')) {
reporter.reportErrorMessage(
- formalParameters,
- MessageKind.EXTRA_FORMALS);
+ formalParameters, MessageKind.EXTRA_FORMALS);
}
}
LinkBuilder<Element> parametersBuilder =
- visitor.analyzeNodes(formalParameters.nodes);
- requiredParameterCount = parametersBuilder.length;
+ visitor.analyzeNodes(formalParameters.nodes);
+ requiredParameterCount = parametersBuilder.length;
parameters = parametersBuilder.toList();
}
DartType returnType;
@@ -354,33 +348,32 @@
asyncMarker = function.asyncMarker;
}
switch (asyncMarker) {
- case AsyncMarker.SYNC:
- returnType = visitor.resolveReturnType(returnNode);
- break;
- case AsyncMarker.SYNC_STAR:
- returnType = compiler.coreTypes.iterableType();
- break;
- case AsyncMarker.ASYNC:
- returnType = compiler.coreTypes.futureType();
- break;
- case AsyncMarker.ASYNC_STAR:
- returnType = compiler.coreTypes.streamType();
- break;
+ case AsyncMarker.SYNC:
+ returnType = visitor.resolveReturnType(returnNode);
+ break;
+ case AsyncMarker.SYNC_STAR:
+ returnType = compiler.coreTypes.iterableType();
+ break;
+ case AsyncMarker.ASYNC:
+ returnType = compiler.coreTypes.futureType();
+ break;
+ case AsyncMarker.ASYNC_STAR:
+ returnType = compiler.coreTypes.streamType();
+ break;
}
}
- if (element.isSetter && (requiredParameterCount != 1 ||
- visitor.optionalParameterCount != 0)) {
+ if (element.isSetter &&
+ (requiredParameterCount != 1 || visitor.optionalParameterCount != 0)) {
// If there are no formal parameters, we already reported an error above.
if (formalParameters != null) {
reporter.reportErrorMessage(
- formalParameters,
- MessageKind.ILLEGAL_SETTER_FORMALS);
+ formalParameters, MessageKind.ILLEGAL_SETTER_FORMALS);
}
}
LinkBuilder<DartType> parameterTypes = new LinkBuilder<DartType>();
for (FormalElement parameter in parameters) {
- parameterTypes.addLast(parameter.type);
+ parameterTypes.addLast(parameter.type);
}
List<DartType> optionalParameterTypes = const <DartType>[];
List<String> namedParameters = const <String>[];
@@ -390,7 +383,7 @@
if (visitor.optionalParametersAreNamed) {
// TODO(karlklose); replace when [visitor.optinalParameters] is a [List].
orderedOptionalParameters.sort((Element a, Element b) {
- return a.name.compareTo(b.name);
+ return a.name.compareTo(b.name);
});
LinkBuilder<String> namedParametersBuilder = new LinkBuilder<String>();
LinkBuilder<DartType> namedParameterTypesBuilder =
@@ -400,8 +393,8 @@
namedParameterTypesBuilder.addLast(parameter.type);
}
namedParameters = namedParametersBuilder.toLink().toList(growable: false);
- namedParameterTypes = namedParameterTypesBuilder.toLink()
- .toList(growable: false);
+ namedParameterTypes =
+ namedParameterTypesBuilder.toLink().toList(growable: false);
} else {
// TODO(karlklose); replace when [visitor.optinalParameters] is a [List].
LinkBuilder<DartType> optionalParameterTypesBuilder =
@@ -409,8 +402,8 @@
for (FormalElement parameter in visitor.optionalParameters) {
optionalParameterTypesBuilder.addLast(parameter.type);
}
- optionalParameterTypes = optionalParameterTypesBuilder.toLink()
- .toList(growable: false);
+ optionalParameterTypes =
+ optionalParameterTypesBuilder.toLink().toList(growable: false);
}
FunctionType type = new FunctionType(
element.declaration,
diff --git a/pkg/compiler/lib/src/resolution/tree_elements.dart b/pkg/compiler/lib/src/resolution/tree_elements.dart
index 1cd1849..1d1ddce 100644
--- a/pkg/compiler/lib/src/resolution/tree_elements.dart
+++ b/pkg/compiler/lib/src/resolution/tree_elements.dart
@@ -9,16 +9,12 @@
import '../dart_types.dart';
import '../diagnostics/source_span.dart';
import '../elements/elements.dart';
-import '../types/types.dart' show
- TypeMask;
+import '../types/types.dart' show TypeMask;
import '../tree/tree.dart';
import '../util/util.dart';
-import '../universe/selector.dart' show
- Selector;
+import '../universe/selector.dart' show Selector;
-import 'secret_tree_element.dart' show
- getTreeElement,
- setTreeElement;
+import 'secret_tree_element.dart' show getTreeElement, setTreeElement;
import 'send_structure.dart';
abstract class TreeElements {
@@ -27,7 +23,7 @@
void forEachConstantNode(f(Node n, ConstantExpression c));
- Element operator[](Node node);
+ Element operator [](Node node);
Map<Node, DartType> get typesCache;
/// Returns the [SendStructure] that describes the semantics of [node].
@@ -287,15 +283,15 @@
return mutations;
}
- void registerPotentialMutationIn(Node contextNode, VariableElement element,
- Node mutationNode) {
+ void registerPotentialMutationIn(
+ Node contextNode, VariableElement element, Node mutationNode) {
if (_potentiallyMutatedIn == null) {
_potentiallyMutatedIn =
new Maplet<Node, Map<VariableElement, List<Node>>>();
}
Map<VariableElement, List<Node>> mutationMap =
- _potentiallyMutatedIn.putIfAbsent(contextNode,
- () => new Maplet<VariableElement, List<Node>>());
+ _potentiallyMutatedIn.putIfAbsent(
+ contextNode, () => new Maplet<VariableElement, List<Node>>());
mutationMap.putIfAbsent(element, () => <Node>[]).add(mutationNode);
}
@@ -306,13 +302,14 @@
return mutations;
}
- void registerPotentialMutationInClosure(VariableElement element,
- Node mutationNode) {
+ void registerPotentialMutationInClosure(
+ VariableElement element, Node mutationNode) {
if (_potentiallyMutatedInClosure == null) {
_potentiallyMutatedInClosure = new Maplet<VariableElement, List<Node>>();
}
- _potentiallyMutatedInClosure.putIfAbsent(
- element, () => <Node>[]).add(mutationNode);
+ _potentiallyMutatedInClosure
+ .putIfAbsent(element, () => <Node>[])
+ .add(mutationNode);
}
List<Node> getAccessesByClosureIn(Node node, VariableElement element) {
@@ -324,14 +321,14 @@
return accesses;
}
- void setAccessedByClosureIn(Node contextNode, VariableElement element,
- Node accessNode) {
+ void setAccessedByClosureIn(
+ Node contextNode, VariableElement element, Node accessNode) {
if (_accessedByClosureIn == null) {
_accessedByClosureIn = new Map<Node, Map<VariableElement, List<Node>>>();
}
Map<VariableElement, List<Node>> accessMap =
- _accessedByClosureIn.putIfAbsent(contextNode,
- () => new Maplet<VariableElement, List<Node>>());
+ _accessedByClosureIn.putIfAbsent(
+ contextNode, () => new Maplet<VariableElement, List<Node>>());
accessMap.putIfAbsent(element, () => <Node>[]).add(accessNode);
}
diff --git a/pkg/compiler/lib/src/resolution/type_resolver.dart b/pkg/compiler/lib/src/resolution/type_resolver.dart
index 165790d..832279b 100644
--- a/pkg/compiler/lib/src/resolution/type_resolver.dart
+++ b/pkg/compiler/lib/src/resolution/type_resolver.dart
@@ -5,37 +5,28 @@
library dart2js.resolution.types;
import '../common.dart';
-import '../common/resolution.dart' show
- Feature,
- Resolution;
-import '../compiler.dart' show
- Compiler;
-import '../dart_backend/dart_backend.dart' show
- DartBackend;
+import '../common/resolution.dart' show Feature, Resolution;
+import '../compiler.dart' show Compiler;
+import '../dart_backend/dart_backend.dart' show DartBackend;
import '../dart_types.dart';
-import '../elements/elements.dart' show
- AmbiguousElement,
- ClassElement,
- Element,
- Elements,
- ErroneousElement,
- PrefixElement,
- TypedefElement,
- TypeVariableElement;
-import '../elements/modelx.dart' show
- ErroneousElementX;
+import '../elements/elements.dart'
+ show
+ AmbiguousElement,
+ ClassElement,
+ Element,
+ Elements,
+ ErroneousElement,
+ PrefixElement,
+ TypedefElement,
+ TypeVariableElement;
+import '../elements/modelx.dart' show ErroneousElementX;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link;
+import '../util/util.dart' show Link;
-import 'members.dart' show
- lookupInScope;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'resolution_common.dart' show
- MappingVisitor;
-import 'scope.dart' show
- Scope;
+import 'members.dart' show lookupInScope;
+import 'registry.dart' show ResolutionRegistry;
+import 'resolution_common.dart' show MappingVisitor;
+import 'scope.dart' show Scope;
class TypeResolver {
final Compiler compiler;
@@ -47,10 +38,9 @@
Resolution get resolution => compiler.resolution;
/// Tries to resolve the type name as an element.
- Element resolveTypeName(Identifier prefixName,
- Identifier typeName,
- Scope scope,
- {bool deferredIsMalformed: true}) {
+ Element resolveTypeName(
+ Identifier prefixName, Identifier typeName, Scope scope,
+ {bool deferredIsMalformed: true}) {
Element element;
if (prefixName != null) {
Element prefixElement =
@@ -66,9 +56,7 @@
deferredIsMalformed &&
compiler.backend is! DartBackend) {
element = new ErroneousElementX(MessageKind.DEFERRED_TYPE_ANNOTATION,
- {'node': typeName},
- element.name,
- element);
+ {'node': typeName}, element.name, element);
}
} else {
// The caller of this method will create the ErroneousElement for
@@ -82,8 +70,7 @@
}
DartType resolveTypeAnnotation(MappingVisitor visitor, TypeAnnotation node,
- {bool malformedIsError: false,
- bool deferredIsMalformed: true}) {
+ {bool malformedIsError: false, bool deferredIsMalformed: true}) {
ResolutionRegistry registry = visitor.registry;
Identifier typeName;
@@ -91,13 +78,14 @@
DartType checkNoTypeArguments(DartType type) {
List<DartType> arguments = new List<DartType>();
- bool hasTypeArgumentMismatch = resolveTypeArguments(
- visitor, node, const <DartType>[], arguments);
+ bool hasTypeArgumentMismatch =
+ resolveTypeArguments(visitor, node, const <DartType>[], arguments);
if (hasTypeArgumentMismatch) {
return new MalformedType(
new ErroneousElementX(MessageKind.TYPE_ARGUMENT_COUNT_MISMATCH,
{'type': node}, typeName.source, visitor.enclosingElement),
- type, arguments);
+ type,
+ arguments);
}
return type;
}
@@ -124,34 +112,30 @@
}
Element element = resolveTypeName(prefixName, typeName, visitor.scope,
- deferredIsMalformed: deferredIsMalformed);
+ deferredIsMalformed: deferredIsMalformed);
DartType reportFailureAndCreateType(
- MessageKind messageKind,
- Map messageArguments,
+ MessageKind messageKind, Map messageArguments,
{DartType userProvidedBadType,
- Element erroneousElement,
- List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) {
+ Element erroneousElement,
+ List<DiagnosticMessage> infos: const <DiagnosticMessage>[]}) {
if (malformedIsError) {
reporter.reportError(
- reporter.createMessage(node, messageKind, messageArguments),
- infos);
+ reporter.createMessage(node, messageKind, messageArguments), infos);
} else {
registry.registerFeature(Feature.THROW_RUNTIME_ERROR);
reporter.reportWarning(
- reporter.createMessage(node, messageKind, messageArguments),
- infos);
+ reporter.createMessage(node, messageKind, messageArguments), infos);
}
if (erroneousElement == null) {
registry.registerFeature(Feature.THROW_RUNTIME_ERROR);
- erroneousElement = new ErroneousElementX(
- messageKind, messageArguments, typeName.source,
- visitor.enclosingElement);
+ erroneousElement = new ErroneousElementX(messageKind, messageArguments,
+ typeName.source, visitor.enclosingElement);
}
List<DartType> arguments = <DartType>[];
resolveTypeArguments(visitor, node, const <DartType>[], arguments);
- return new MalformedType(erroneousElement,
- userProvidedBadType, arguments);
+ return new MalformedType(
+ erroneousElement, userProvidedBadType, arguments);
}
// Try to construct the type from the element.
@@ -161,8 +145,7 @@
} else if (element.isAmbiguous) {
AmbiguousElement ambiguous = element;
type = reportFailureAndCreateType(
- ambiguous.messageKind,
- ambiguous.messageArguments,
+ ambiguous.messageKind, ambiguous.messageArguments,
infos: ambiguous.computeInfos(
registry.mapping.analyzedElement, reporter));
;
@@ -186,12 +169,13 @@
compiler.resolver.ensureClassWillBeResolvedInternal(cls);
cls.computeType(resolution);
List<DartType> arguments = <DartType>[];
- bool hasTypeArgumentMismatch = resolveTypeArguments(
- visitor, node, cls.typeVariables, arguments);
+ bool hasTypeArgumentMismatch =
+ resolveTypeArguments(visitor, node, cls.typeVariables, arguments);
if (hasTypeArgumentMismatch) {
- type = new BadInterfaceType(cls.declaration,
- new InterfaceType.forUserProvidedBadType(cls.declaration,
- arguments));
+ type = new BadInterfaceType(
+ cls.declaration,
+ new InterfaceType.forUserProvidedBadType(
+ cls.declaration, arguments));
} else {
if (arguments.isEmpty) {
type = cls.rawType;
@@ -237,13 +221,12 @@
}
type = checkNoTypeArguments(type);
} else {
- reporter.internalError(node,
- "Unexpected element kind ${element.kind}.");
+ reporter.internalError(
+ node, "Unexpected element kind ${element.kind}.");
}
if (addTypeVariableBoundsCheck) {
registry.registerFeature(Feature.TYPE_VARIABLE_BOUNDS_CHECK);
- visitor.addDeferredAction(
- visitor.enclosingElement,
+ visitor.addDeferredAction(visitor.enclosingElement,
() => checkTypeVariableBounds(node, type));
}
}
@@ -254,18 +237,18 @@
/// Checks the type arguments of [type] against the type variable bounds.
void checkTypeVariableBounds(TypeAnnotation node, GenericType type) {
void checkTypeVariableBound(_, DartType typeArgument,
- TypeVariableType typeVariable,
- DartType bound) {
+ TypeVariableType typeVariable, DartType bound) {
if (!compiler.types.isSubtype(typeArgument, bound)) {
reporter.reportWarningMessage(
- node,
- MessageKind.INVALID_TYPE_VARIABLE_BOUND,
- {'typeVariable': typeVariable,
- 'bound': bound,
- 'typeArgument': typeArgument,
- 'thisType': type.element.thisType});
+ node, MessageKind.INVALID_TYPE_VARIABLE_BOUND, {
+ 'typeVariable': typeVariable,
+ 'bound': bound,
+ 'typeArgument': typeArgument,
+ 'thisType': type.element.thisType
+ });
}
- };
+ }
+ ;
compiler.types.checkTypeVariableBounds(type, checkTypeVariableBound);
}
@@ -276,10 +259,8 @@
* Returns [: true :] if the number of type arguments did not match the
* number of type variables.
*/
- bool resolveTypeArguments(MappingVisitor visitor,
- TypeAnnotation node,
- List<DartType> typeVariables,
- List<DartType> arguments) {
+ bool resolveTypeArguments(MappingVisitor visitor, TypeAnnotation node,
+ List<DartType> typeVariables, List<DartType> arguments) {
if (node.typeArguments == null) {
return false;
}
@@ -287,8 +268,8 @@
int index = 0;
bool typeArgumentCountMismatch = false;
for (Link<Node> typeArguments = node.typeArguments.nodes;
- !typeArguments.isEmpty;
- typeArguments = typeArguments.tail, index++) {
+ !typeArguments.isEmpty;
+ typeArguments = typeArguments.tail, index++) {
if (index > expectedVariables - 1) {
reporter.reportWarningMessage(
typeArguments.head, MessageKind.ADDITIONAL_TYPE_ARGUMENT);
diff --git a/pkg/compiler/lib/src/resolution/typedefs.dart b/pkg/compiler/lib/src/resolution/typedefs.dart
index 87acbd6..ed6f741 100644
--- a/pkg/compiler/lib/src/resolution/typedefs.dart
+++ b/pkg/compiler/lib/src/resolution/typedefs.dart
@@ -5,36 +5,24 @@
library dart2js.resolution.typedefs;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../dart_types.dart';
-import '../elements/elements.dart' show
- FunctionSignature,
- TypedefElement,
- TypeVariableElement;
-import '../elements/modelx.dart' show
- ErroneousElementX,
- TypedefElementX;
+import '../elements/elements.dart'
+ show FunctionSignature, TypedefElement, TypeVariableElement;
+import '../elements/modelx.dart' show ErroneousElementX, TypedefElementX;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link;
+import '../util/util.dart' show Link;
-import 'class_hierarchy.dart' show
- TypeDefinitionVisitor;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'scope.dart' show
- MethodScope,
- TypeDeclarationScope;
-import 'signatures.dart' show
- SignatureResolver;
+import 'class_hierarchy.dart' show TypeDefinitionVisitor;
+import 'registry.dart' show ResolutionRegistry;
+import 'scope.dart' show MethodScope, TypeDeclarationScope;
+import 'signatures.dart' show SignatureResolver;
class TypedefResolverVisitor extends TypeDefinitionVisitor {
TypedefElementX get element => enclosingElement;
- TypedefResolverVisitor(Compiler compiler,
- TypedefElement typedefElement,
- ResolutionRegistry registry)
+ TypedefResolverVisitor(Compiler compiler, TypedefElement typedefElement,
+ ResolutionRegistry registry)
: super(compiler, typedefElement, registry);
visitTypedef(Typedef node) {
@@ -88,33 +76,31 @@
hasCyclicReference = true;
if (seenTypedefsCount == 1) {
// Direct cyclicity.
- reporter.reportErrorMessage(
- element,
- MessageKind.CYCLIC_TYPEDEF,
+ reporter.reportErrorMessage(element, MessageKind.CYCLIC_TYPEDEF,
{'typedefName': element.name});
} else if (seenTypedefsCount == 2) {
// Cyclicity through one other typedef.
- reporter.reportErrorMessage(
- element,
- MessageKind.CYCLIC_TYPEDEF_ONE,
- {'typedefName': element.name,
- 'otherTypedefName': seenTypedefs.head.name});
+ reporter.reportErrorMessage(element, MessageKind.CYCLIC_TYPEDEF_ONE, {
+ 'typedefName': element.name,
+ 'otherTypedefName': seenTypedefs.head.name
+ });
} else {
// Cyclicity through more than one other typedef.
for (TypedefElement cycle in seenTypedefs) {
if (!identical(typedefElement, cycle)) {
reporter.reportErrorMessage(
- element,
- MessageKind.CYCLIC_TYPEDEF_ONE,
- {'typedefName': element.name,
- 'otherTypedefName': cycle.name});
+ element, MessageKind.CYCLIC_TYPEDEF_ONE, {
+ 'typedefName': element.name,
+ 'otherTypedefName': cycle.name
+ });
}
}
}
ErroneousElementX erroneousElement = new ErroneousElementX(
- MessageKind.CYCLIC_TYPEDEF,
- {'typedefName': element.name},
- element.name, element);
+ MessageKind.CYCLIC_TYPEDEF,
+ {'typedefName': element.name},
+ element.name,
+ element);
element.aliasCache =
new MalformedType(erroneousElement, typedefElement.aliasCache);
element.hasBeenCheckedForCycles = true;
diff --git a/pkg/compiler/lib/src/resolution/variables.dart b/pkg/compiler/lib/src/resolution/variables.dart
index aec67f3..c5609a8 100644
--- a/pkg/compiler/lib/src/resolution/variables.dart
+++ b/pkg/compiler/lib/src/resolution/variables.dart
@@ -5,37 +5,25 @@
library dart2js.resolution.variables;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
-import '../elements/modelx.dart' show
- LocalVariableElementX,
- VariableList;
+import '../compiler.dart' show Compiler;
+import '../elements/modelx.dart' show LocalVariableElementX, VariableList;
import '../tree/tree.dart';
-import '../universe/use.dart' show
- TypeUse;
-import '../util/util.dart' show
- Link;
+import '../universe/use.dart' show TypeUse;
+import '../util/util.dart' show Link;
-import 'members.dart' show
- ResolverVisitor;
-import 'registry.dart' show
- ResolutionRegistry;
-import 'resolution_common.dart' show
- CommonResolverVisitor;
-import 'scope.dart' show
- VariableDefinitionScope;
+import 'members.dart' show ResolverVisitor;
+import 'registry.dart' show ResolutionRegistry;
+import 'resolution_common.dart' show CommonResolverVisitor;
+import 'scope.dart' show VariableDefinitionScope;
class VariableDefinitionsVisitor extends CommonResolverVisitor<Identifier> {
VariableDefinitions definitions;
ResolverVisitor resolver;
VariableList variables;
- VariableDefinitionsVisitor(Compiler compiler,
- this.definitions,
- this.resolver,
- this.variables)
- : super(compiler) {
- }
+ VariableDefinitionsVisitor(
+ Compiler compiler, this.definitions, this.resolver, this.variables)
+ : super(compiler) {}
ResolutionRegistry get registry => resolver.registry;
@@ -47,9 +35,8 @@
new VariableDefinitionScope(resolver.scope, name);
resolver.visitIn(node.arguments.head, scope);
if (scope.variableReferencedInInitializer) {
- reporter.reportErrorMessage(
- identifier, MessageKind.REFERENCE_IN_INITIALIZATION,
- {'variableName': name});
+ reporter.reportErrorMessage(identifier,
+ MessageKind.REFERENCE_IN_INITIALIZATION, {'variableName': name});
}
return identifier;
}
@@ -61,17 +48,14 @@
new TypeUse.instantiation(compiler.coreTypes.nullType));
if (definitions.modifiers.isConst) {
if (resolver.inLoopVariable) {
- reporter.reportErrorMessage(
- node, MessageKind.CONST_LOOP_VARIABLE);
+ reporter.reportErrorMessage(node, MessageKind.CONST_LOOP_VARIABLE);
} else {
reporter.reportErrorMessage(
node, MessageKind.CONST_WITHOUT_INITIALIZER);
}
}
- if (definitions.modifiers.isFinal &&
- !resolver.inLoopVariable) {
- reporter.reportErrorMessage(
- node, MessageKind.FINAL_WITHOUT_INITIALIZER);
+ if (definitions.modifiers.isFinal && !resolver.inLoopVariable) {
+ reporter.reportErrorMessage(node, MessageKind.FINAL_WITHOUT_INITIALIZER);
}
return node;
}
@@ -80,8 +64,7 @@
for (Link<Node> link = node.nodes; !link.isEmpty; link = link.tail) {
Identifier name = visit(link.head);
LocalVariableElementX element = new LocalVariableElementX(
- name.source, resolver.enclosingElement,
- variables, name.token);
+ name.source, resolver.enclosingElement, variables, name.token);
resolver.defineLocalVariable(link.head, element);
resolver.addToScope(element);
if (definitions.modifiers.isConst) {
diff --git a/pkg/compiler/lib/src/scanner/array_based_scanner.dart b/pkg/compiler/lib/src/scanner/array_based_scanner.dart
index 49461fb..27540a4 100644
--- a/pkg/compiler/lib/src/scanner/array_based_scanner.dart
+++ b/pkg/compiler/lib/src/scanner/array_based_scanner.dart
@@ -4,33 +4,19 @@
library dart2js.scanner.array_based;
-import '../io/source_file.dart' show
- SourceFile;
-import '../tokens/keyword.dart' show
- Keyword;
-import '../tokens/precedence.dart' show
- PrecedenceInfo;
-import '../tokens/precedence_constants.dart' as Precedence show
- COMMENT_INFO,
- EOF_INFO;
-import '../tokens/token.dart' show
- BeginGroupToken,
- ErrorToken,
- KeywordToken,
- SymbolToken,
- Token;
-import '../tokens/token_constants.dart' as Tokens show
- LT_TOKEN,
- OPEN_CURLY_BRACKET_TOKEN,
- STRING_INTERPOLATION_TOKEN;
-import '../util/characters.dart' show
- $LF,
- $STX;
-import '../util/util.dart' show
- Link;
+import '../io/source_file.dart' show SourceFile;
+import '../tokens/keyword.dart' show Keyword;
+import '../tokens/precedence.dart' show PrecedenceInfo;
+import '../tokens/precedence_constants.dart' as Precedence
+ show COMMENT_INFO, EOF_INFO;
+import '../tokens/token.dart'
+ show BeginGroupToken, ErrorToken, KeywordToken, SymbolToken, Token;
+import '../tokens/token_constants.dart' as Tokens
+ show LT_TOKEN, OPEN_CURLY_BRACKET_TOKEN, STRING_INTERPOLATION_TOKEN;
+import '../util/characters.dart' show $LF, $STX;
+import '../util/util.dart' show Link;
-import 'scanner.dart' show
- AbstractScanner;
+import 'scanner.dart' show AbstractScanner;
abstract class ArrayBasedScanner extends AbstractScanner {
ArrayBasedScanner(SourceFile file, bool includeComments)
@@ -153,7 +139,7 @@
BeginGroupToken begin = groupingStack.head;
if (!identical(begin.kind, openKind)) {
assert(begin.kind == Tokens.STRING_INTERPOLATION_TOKEN &&
- openKind == Tokens.OPEN_CURLY_BRACKET_TOKEN);
+ openKind == Tokens.OPEN_CURLY_BRACKET_TOKEN);
// We're ending an interpolated expression.
begin.endGroup = close;
groupingStack = groupingStack.tail;
@@ -240,8 +226,8 @@
* list, like the '=' in the above example.
*/
void discardOpenLt() {
- while (!groupingStack.isEmpty
- && identical(groupingStack.head.kind, Tokens.LT_TOKEN)) {
+ while (!groupingStack.isEmpty &&
+ identical(groupingStack.head.kind, Tokens.LT_TOKEN)) {
groupingStack = groupingStack.tail;
}
}
diff --git a/pkg/compiler/lib/src/scanner/scanner.dart b/pkg/compiler/lib/src/scanner/scanner.dart
index 1a52a64..30d5caf 100644
--- a/pkg/compiler/lib/src/scanner/scanner.dart
+++ b/pkg/compiler/lib/src/scanner/scanner.dart
@@ -4,29 +4,21 @@
library dart2js.scanner;
-import '../io/source_file.dart' show
- SourceFile,
- Utf8BytesSourceFile;
-import '../tokens/keyword.dart' show
- Keyword,
- KeywordState;
+import '../io/source_file.dart' show SourceFile, Utf8BytesSourceFile;
+import '../tokens/keyword.dart' show Keyword, KeywordState;
import '../tokens/precedence.dart';
import '../tokens/precedence_constants.dart';
import '../tokens/token.dart';
import '../tokens/token_constants.dart';
import '../util/characters.dart';
-import 'string_scanner.dart' show
- StringScanner;
-import 'utf8_bytes_scanner.dart' show
- Utf8BytesScanner;
-
+import 'string_scanner.dart' show StringScanner;
+import 'utf8_bytes_scanner.dart' show Utf8BytesScanner;
abstract class Scanner {
Token tokenize();
- factory Scanner(SourceFile file,
- {bool includeComments: false}) {
+ factory Scanner(SourceFile file, {bool includeComments: false}) {
if (file is Utf8BytesSourceFile) {
return new Utf8BytesScanner(file, includeComments: includeComments);
} else {
@@ -72,8 +64,7 @@
final List<int> lineStarts = <int>[0];
- AbstractScanner(
- this.file, this.includeComments) {
+ AbstractScanner(this.file, this.includeComments) {
this.tail = this.tokens;
}
@@ -166,8 +157,8 @@
* Note that [extraOffset] can only be used if the covered character(s) are
* known to be ASCII.
*/
- void appendSubstringToken(PrecedenceInfo info, int start,
- bool asciiOnly, [int extraOffset]);
+ void appendSubstringToken(PrecedenceInfo info, int start, bool asciiOnly,
+ [int extraOffset]);
/** Documentation in subclass [ArrayBasedScanner]. */
void appendPrecedenceToken(PrecedenceInfo info);
@@ -236,8 +227,10 @@
int bigSwitch(int next) {
beginToken();
- if (identical(next, $SPACE) || identical(next, $TAB)
- || identical(next, $LF) || identical(next, $CR)) {
+ if (identical(next, $SPACE) ||
+ identical(next, $TAB) ||
+ identical(next, $LF) ||
+ identical(next, $CR)) {
appendWhiteSpace(next);
next = advance();
// Sequences of spaces are common, so advance through them fast.
@@ -354,8 +347,8 @@
}
if (identical(next, $CLOSE_SQUARE_BRACKET)) {
- return appendEndGroup(CLOSE_SQUARE_BRACKET_INFO,
- OPEN_SQUARE_BRACKET_TOKEN);
+ return appendEndGroup(
+ CLOSE_SQUARE_BRACKET_INFO, OPEN_SQUARE_BRACKET_TOKEN);
}
if (identical(next, $BACKPING)) {
@@ -369,8 +362,7 @@
}
if (identical(next, $CLOSE_CURLY_BRACKET)) {
- return appendEndGroup(CLOSE_CURLY_BRACKET_INFO,
- OPEN_CURLY_BRACKET_TOKEN);
+ return appendEndGroup(CLOSE_CURLY_BRACKET_INFO, OPEN_CURLY_BRACKET_TOKEN);
}
if (identical(next, $SLASH)) {
@@ -394,9 +386,15 @@
}
// TODO(ahe): Would a range check be faster?
- if (identical(next, $1) || identical(next, $2) || identical(next, $3)
- || identical(next, $4) || identical(next, $5) || identical(next, $6)
- || identical(next, $7) || identical(next, $8) || identical(next, $9)) {
+ if (identical(next, $1) ||
+ identical(next, $2) ||
+ identical(next, $3) ||
+ identical(next, $4) ||
+ identical(next, $5) ||
+ identical(next, $6) ||
+ identical(next, $7) ||
+ identical(next, $8) ||
+ identical(next, $9)) {
return tokenizeNumber(next);
}
@@ -429,8 +427,8 @@
next = advance();
if (next > 127) asciiOnly = false;
} while (!identical(next, $LF) &&
- !identical(next, $CR) &&
- !identical(next, $EOF));
+ !identical(next, $CR) &&
+ !identical(next, $EOF));
if (!asciiOnly) handleUnicode(start);
return next;
}
@@ -655,9 +653,9 @@
bool hasDigits = false;
while (true) {
next = advance();
- if (($0 <= next && next <= $9)
- || ($A <= next && next <= $F)
- || ($a <= next && next <= $f)) {
+ if (($0 <= next && next <= $9) ||
+ ($A <= next && next <= $F) ||
+ ($a <= next && next <= $f)) {
hasDigits = true;
} else {
if (!hasDigits) {
@@ -766,7 +764,6 @@
return null;
}
-
int tokenizeMultiLineComment(int next, int start) {
bool asciiOnlyComment = true; // Track if the entire comment is ASCII.
bool asciiOnlyLines = true; // Track ASCII since the last handleUnicode.
@@ -924,8 +921,8 @@
asciiOnly = true;
continue;
}
- if (next <= $CR
- && (identical(next, $LF) ||
+ if (next <= $CR &&
+ (identical(next, $LF) ||
identical(next, $CR) ||
identical(next, $EOF))) {
if (!asciiOnly) handleUnicode(start);
@@ -960,7 +957,7 @@
next = bigSwitch(next);
}
if (identical(next, $EOF)) return next;
- next = advance(); // Move past the $STX.
+ next = advance(); // Move past the $STX.
beginToken(); // The string interpolation suffix starts here.
return next;
}
diff --git a/pkg/compiler/lib/src/scanner/scanner_task.dart b/pkg/compiler/lib/src/scanner/scanner_task.dart
index 98be820..3d694a3 100644
--- a/pkg/compiler/lib/src/scanner/scanner_task.dart
+++ b/pkg/compiler/lib/src/scanner/scanner_task.dart
@@ -4,25 +4,34 @@
library dart2js.scanner.task;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
-import '../elements/elements.dart' show
- CompilationUnitElement,
- LibraryElement;
-import '../script.dart' show
- Script;
-import '../tokens/token.dart' show
- Token;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
+import '../elements/elements.dart' show CompilationUnitElement, LibraryElement;
+import '../script.dart' show Script;
+import '../parser/diet_parser_task.dart' show DietParserTask;
+import '../tokens/token.dart' show Token;
+import '../tokens/token_constants.dart' as Tokens show COMMENT_TOKEN, EOF_TOKEN;
+import '../tokens/token_map.dart' show TokenMap;
-import 'scanner.dart' show
- Scanner;
-import 'string_scanner.dart' show
- StringScanner;
+import 'scanner.dart' show Scanner;
+import 'string_scanner.dart' show StringScanner;
class ScannerTask extends CompilerTask {
- ScannerTask(Compiler compiler) : super(compiler);
+ final DietParserTask _dietParser;
+ final bool _preserveComments;
+ final TokenMap _commentMap;
+
+ ScannerTask(Compiler compiler, this._dietParser,
+ {bool preserveComments: false, TokenMap commentMap})
+ : _preserveComments = preserveComments,
+ _commentMap = commentMap,
+ super(compiler) {
+ if (_preserveComments && _commentMap == null) {
+ throw new ArgumentError(
+ "commentMap must be provided if preserveComments is true");
+ }
+ }
+
String get name => 'Scanner';
void scanLibrary(LibraryElement library) {
@@ -45,12 +54,12 @@
void scanElements(CompilationUnitElement compilationUnit) {
Script script = compilationUnit.script;
- Token tokens = new Scanner(script.file,
- includeComments: compiler.options.preserveComments).tokenize();
- if (compiler.options.preserveComments) {
- tokens = compiler.processAndStripComments(tokens);
+ Token tokens =
+ new Scanner(script.file, includeComments: _preserveComments).tokenize();
+ if (_preserveComments) {
+ tokens = processAndStripComments(tokens);
}
- compiler.dietParser.dietParse(compilationUnit, tokens);
+ _dietParser.dietParse(compilationUnit, tokens);
}
/**
@@ -66,4 +75,26 @@
.tokenize();
});
}
+
+ Token processAndStripComments(Token currentToken) {
+ Token firstToken = currentToken;
+ Token prevToken;
+ while (currentToken.kind != Tokens.EOF_TOKEN) {
+ if (identical(currentToken.kind, Tokens.COMMENT_TOKEN)) {
+ Token firstCommentToken = currentToken;
+ while (identical(currentToken.kind, Tokens.COMMENT_TOKEN)) {
+ currentToken = currentToken.next;
+ }
+ _commentMap[currentToken] = firstCommentToken;
+ if (prevToken == null) {
+ firstToken = currentToken;
+ } else {
+ prevToken.next = currentToken;
+ }
+ }
+ prevToken = currentToken;
+ currentToken = currentToken.next;
+ }
+ return firstToken;
+ }
}
diff --git a/pkg/compiler/lib/src/scanner/string_scanner.dart b/pkg/compiler/lib/src/scanner/string_scanner.dart
index 21bc2bb..5c6604e 100644
--- a/pkg/compiler/lib/src/scanner/string_scanner.dart
+++ b/pkg/compiler/lib/src/scanner/string_scanner.dart
@@ -4,17 +4,11 @@
library dart2js.scanner.string;
-import '../io/source_file.dart' show
- SourceFile;
-import '../tokens/precedence.dart' show
- PrecedenceInfo;
-import '../tokens/token.dart' show
- StringToken,
- Token;
+import '../io/source_file.dart' show SourceFile;
+import '../tokens/precedence.dart' show PrecedenceInfo;
+import '../tokens/token.dart' show StringToken, Token;
-import 'array_based_scanner.dart' show
- ArrayBasedScanner;
-
+import 'array_based_scanner.dart' show ArrayBasedScanner;
/**
* Scanner that reads from a String and creates tokens that points to
@@ -52,15 +46,16 @@
int currentAsUnicode(int next) => next;
- void handleUnicode(int startScanOffset) { }
+ void handleUnicode(int startScanOffset) {}
Token firstToken() => tokens.next;
Token previousToken() => tail;
- void appendSubstringToken(PrecedenceInfo info, int start,
- bool asciiOnly, [int extraOffset = 0]) {
- tail.next = new StringToken.fromSubstring(info, string, start,
- scanOffset + extraOffset, tokenStart, canonicalize: true);
+ void appendSubstringToken(PrecedenceInfo info, int start, bool asciiOnly,
+ [int extraOffset = 0]) {
+ tail.next = new StringToken.fromSubstring(
+ info, string, start, scanOffset + extraOffset, tokenStart,
+ canonicalize: true);
tail = tail.next;
}
diff --git a/pkg/compiler/lib/src/scanner/utf8_bytes_scanner.dart b/pkg/compiler/lib/src/scanner/utf8_bytes_scanner.dart
index 4c42bf7..c4b87ed 100644
--- a/pkg/compiler/lib/src/scanner/utf8_bytes_scanner.dart
+++ b/pkg/compiler/lib/src/scanner/utf8_bytes_scanner.dart
@@ -4,20 +4,13 @@
library dart2js.scanner.utf8;
-import 'dart:convert' show
- UNICODE_BOM_CHARACTER_RUNE,
- UTF8;
+import 'dart:convert' show UNICODE_BOM_CHARACTER_RUNE, UTF8;
-import '../io/source_file.dart' show
- SourceFile;
-import '../tokens/precedence.dart' show
- PrecedenceInfo;
-import '../tokens/token.dart' show
- StringToken,
- Token;
+import '../io/source_file.dart' show SourceFile;
+import '../tokens/precedence.dart' show PrecedenceInfo;
+import '../tokens/token.dart' show StringToken, Token;
-import 'array_based_scanner.dart' show
- ArrayBasedScanner;
+import 'array_based_scanner.dart' show ArrayBasedScanner;
/**
* Scanner that reads from a UTF-8 encoded list of bytes and creates tokens
@@ -100,7 +93,7 @@
* scanning.
*/
Utf8BytesScanner.fromBytes(List<int> zeroTerminatedBytes,
- {bool includeComments: false})
+ {bool includeComments: false})
: this.bytes = zeroTerminatedBytes,
super(null, includeComments) {
assert(bytes.last == 0);
@@ -212,7 +205,7 @@
Token previousToken() => tail;
void appendSubstringToken(PrecedenceInfo info, int start, bool asciiOnly,
- [int extraOffset = 0]) {
+ [int extraOffset = 0]) {
tail.next = new StringToken.fromUtf8Bytes(
info, bytes, start, byteOffset + extraOffset, asciiOnly, tokenStart);
tail = tail.next;
diff --git a/pkg/compiler/lib/src/script.dart b/pkg/compiler/lib/src/script.dart
index f8278ab..403776b 100644
--- a/pkg/compiler/lib/src/script.dart
+++ b/pkg/compiler/lib/src/script.dart
@@ -16,7 +16,6 @@
*/
final Uri readableUri;
-
/**
* The resource URI from which this script was loaded.
*
@@ -27,14 +26,13 @@
/// This script was synthesized.
final bool isSynthesized;
- Script(this.readableUri, this.resourceUri, this.file)
- : isSynthesized = false;
+ Script(this.readableUri, this.resourceUri, this.file) : isSynthesized = false;
Script.synthetic(Uri uri)
: readableUri = uri,
resourceUri = uri,
- file = new StringSourceFile.fromUri(uri,
- "// Synthetic source file generated for '$uri'."),
+ file = new StringSourceFile.fromUri(
+ uri, "// Synthetic source file generated for '$uri'."),
isSynthesized = true;
String get text => (file == null) ? null : file.slowText();
diff --git a/pkg/compiler/lib/src/serialization/constant_serialization.dart b/pkg/compiler/lib/src/serialization/constant_serialization.dart
index 3af1b4f..fae8818 100644
--- a/pkg/compiler/lib/src/serialization/constant_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/constant_serialization.dart
@@ -7,11 +7,9 @@
import '../constants/constructors.dart';
import '../constants/expressions.dart';
import '../dart_types.dart';
-import '../elements/elements.dart' show
- FieldElement;
+import '../elements/elements.dart' show FieldElement;
import '../resolution/operators.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
+import '../universe/call_structure.dart' show CallStructure;
import 'serialization.dart';
import 'keys.dart';
@@ -27,30 +25,29 @@
const ConstantSerializer();
@override
- void visitBinary(BinaryConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitBinary(BinaryConstantExpression exp, ObjectEncoder encoder) {
encoder.setEnum(Key.OPERATOR, exp.operator.kind);
encoder.setConstant(Key.LEFT, exp.left);
encoder.setConstant(Key.RIGHT, exp.right);
}
@override
- void visitConcatenate(ConcatenateConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitConcatenate(
+ ConcatenateConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstants(Key.ARGUMENTS, exp.expressions);
}
@override
- void visitConditional(ConditionalConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitConditional(
+ ConditionalConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstant(Key.CONDITION, exp.condition);
encoder.setConstant(Key.TRUE, exp.trueExp);
encoder.setConstant(Key.FALSE, exp.falseExp);
}
@override
- void visitConstructed(ConstructedConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitConstructed(
+ ConstructedConstantExpression exp, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, exp.target);
encoder.setType(Key.TYPE, exp.type);
encoder.setStrings(Key.NAMES, exp.callStructure.namedArguments);
@@ -58,14 +55,12 @@
}
@override
- void visitFunction(FunctionConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitFunction(FunctionConstantExpression exp, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, exp.element);
}
@override
- void visitIdentical(IdenticalConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitIdentical(IdenticalConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstant(Key.LEFT, exp.left);
encoder.setConstant(Key.RIGHT, exp.right);
}
@@ -109,34 +104,28 @@
}
@override
- void visitSymbol(SymbolConstantExpression exp,
- ObjectEncoder encoder) {
- throw new UnsupportedError(
- "ConstantSerializer.visitSymbol: ${exp.getText()}");
+ void visitSymbol(SymbolConstantExpression exp, ObjectEncoder encoder) {
+ encoder.setString(Key.NAME, exp.name);
}
@override
- void visitType(TypeConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitType(TypeConstantExpression exp, ObjectEncoder encoder) {
encoder.setType(Key.TYPE, exp.type);
}
@override
- void visitUnary(UnaryConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitUnary(UnaryConstantExpression exp, ObjectEncoder encoder) {
encoder.setEnum(Key.OPERATOR, exp.operator.kind);
encoder.setConstant(Key.EXPRESSION, exp.expression);
}
@override
- void visitVariable(VariableConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitVariable(VariableConstantExpression exp, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, exp.element);
}
@override
- void visitPositional(PositionalArgumentReference exp,
- ObjectEncoder encoder) {
+ void visitPositional(PositionalArgumentReference exp, ObjectEncoder encoder) {
encoder.setInt(Key.INDEX, exp.index);
}
@@ -146,8 +135,8 @@
}
@override
- void visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitBoolFromEnvironment(
+ BoolFromEnvironmentConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstant(Key.NAME, exp.name);
if (exp.defaultValue != null) {
encoder.setConstant(Key.DEFAULT, exp.defaultValue);
@@ -155,8 +144,8 @@
}
@override
- void visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitIntFromEnvironment(
+ IntFromEnvironmentConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstant(Key.NAME, exp.name);
if (exp.defaultValue != null) {
encoder.setConstant(Key.DEFAULT, exp.defaultValue);
@@ -164,8 +153,8 @@
}
@override
- void visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitStringFromEnvironment(
+ StringFromEnvironmentConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstant(Key.NAME, exp.name);
if (exp.defaultValue != null) {
encoder.setConstant(Key.DEFAULT, exp.defaultValue);
@@ -173,15 +162,13 @@
}
@override
- void visitStringLength(StringLengthConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitStringLength(
+ StringLengthConstantExpression exp, ObjectEncoder encoder) {
encoder.setConstant(Key.EXPRESSION, exp.expression);
}
-
@override
- void visitDeferred(DeferredConstantExpression exp,
- ObjectEncoder encoder) {
+ void visitDeferred(DeferredConstantExpression exp, ObjectEncoder encoder) {
throw new UnsupportedError(
"ConstantSerializer.visitDeferred: ${exp.getText()}");
}
@@ -191,7 +178,6 @@
///
/// This is used by the [Deserializer].
class ConstantDeserializer {
-
/// Deserializes a [ConstantExpression] from an [ObjectDecoder].
///
/// The class is called from the [Deserializer] when a [ConstantExpression]
@@ -203,15 +189,12 @@
decoder.getEnum(Key.KIND, ConstantExpressionKind.values);
switch (kind) {
case ConstantExpressionKind.BINARY:
- BinaryOperator operator = BinaryOperator.fromKind(decoder.getEnum(
- Key.OPERATOR, BinaryOperatorKind.values));
- return new BinaryConstantExpression(
- decoder.getConstant(Key.LEFT),
- operator,
- decoder.getConstant(Key.RIGHT));
+ BinaryOperator operator = BinaryOperator
+ .fromKind(decoder.getEnum(Key.OPERATOR, BinaryOperatorKind.values));
+ return new BinaryConstantExpression(decoder.getConstant(Key.LEFT),
+ operator, decoder.getConstant(Key.RIGHT));
case ConstantExpressionKind.BOOL:
- return new BoolConstantExpression(
- decoder.getBool(Key.VALUE));
+ return new BoolConstantExpression(decoder.getBool(Key.VALUE));
case ConstantExpressionKind.BOOL_FROM_ENVIRONMENT:
return new BoolFromEnvironmentConstantExpression(
decoder.getConstant(Key.NAME),
@@ -225,10 +208,9 @@
decoder.getConstant(Key.TRUE),
decoder.getConstant(Key.FALSE));
case ConstantExpressionKind.CONSTRUCTED:
- List<String> names =
- decoder.getStrings(Key.NAMES, isOptional: true);
+ List<String> names = decoder.getStrings(Key.NAMES, isOptional: true);
List<ConstantExpression> arguments =
- decoder.getConstants(Key.ARGUMENTS, isOptional: true);
+ decoder.getConstants(Key.ARGUMENTS, isOptional: true);
return new ConstructedConstantExpression(
decoder.getType(Key.TYPE),
decoder.getElement(Key.ELEMENT),
@@ -239,12 +221,10 @@
case ConstantExpressionKind.ERRONEOUS:
break;
case ConstantExpressionKind.FUNCTION:
- return new FunctionConstantExpression(
- decoder.getElement(Key.ELEMENT));
+ return new FunctionConstantExpression(decoder.getElement(Key.ELEMENT));
case ConstantExpressionKind.IDENTICAL:
return new IdenticalConstantExpression(
- decoder.getConstant(Key.LEFT),
- decoder.getConstant(Key.RIGHT));
+ decoder.getConstant(Key.LEFT), decoder.getConstant(Key.RIGHT));
case ConstantExpressionKind.INT:
return new IntConstantExpression(decoder.getInt(Key.VALUE));
case ConstantExpressionKind.INT_FROM_ENVIRONMENT:
@@ -253,18 +233,14 @@
decoder.getConstant(Key.DEFAULT, isOptional: true));
case ConstantExpressionKind.LIST:
return new ListConstantExpression(
- decoder.getType(Key.TYPE),
- decoder.getConstants(Key.VALUES));
+ decoder.getType(Key.TYPE), decoder.getConstants(Key.VALUES));
case ConstantExpressionKind.MAP:
- return new MapConstantExpression(
- decoder.getType(Key.TYPE),
- decoder.getConstants(Key.KEYS),
- decoder.getConstants(Key.VALUES));
+ return new MapConstantExpression(decoder.getType(Key.TYPE),
+ decoder.getConstants(Key.KEYS), decoder.getConstants(Key.VALUES));
case ConstantExpressionKind.NULL:
return new NullConstantExpression();
case ConstantExpressionKind.STRING:
- return new StringConstantExpression(
- decoder.getString(Key.VALUE));
+ return new StringConstantExpression(decoder.getString(Key.VALUE));
case ConstantExpressionKind.STRING_FROM_ENVIRONMENT:
return new StringFromEnvironmentConstantExpression(
decoder.getConstant(Key.NAME),
@@ -277,26 +253,21 @@
case ConstantExpressionKind.TYPE:
return new TypeConstantExpression(decoder.getType(Key.TYPE));
case ConstantExpressionKind.UNARY:
- UnaryOperator operator = UnaryOperator.fromKind(
- decoder.getEnum(Key.OPERATOR, UnaryOperatorKind.values));
+ UnaryOperator operator = UnaryOperator
+ .fromKind(decoder.getEnum(Key.OPERATOR, UnaryOperatorKind.values));
return new UnaryConstantExpression(
- operator,
- decoder.getConstant(Key.EXPRESSION));
+ operator, decoder.getConstant(Key.EXPRESSION));
case ConstantExpressionKind.VARIABLE:
- return new VariableConstantExpression(
- decoder.getElement(Key.ELEMENT));
+ return new VariableConstantExpression(decoder.getElement(Key.ELEMENT));
case ConstantExpressionKind.POSITIONAL_REFERENCE:
- return new PositionalArgumentReference(
- decoder.getInt(Key.INDEX));
+ return new PositionalArgumentReference(decoder.getInt(Key.INDEX));
case ConstantExpressionKind.NAMED_REFERENCE:
- return new NamedArgumentReference(
- decoder.getString(Key.NAME));
+ return new NamedArgumentReference(decoder.getString(Key.NAME));
case ConstantExpressionKind.DEFERRED:
case ConstantExpressionKind.SYNTHETIC:
}
- throw new UnsupportedError(
- "Unexpected constant kind: ${kind} in $decoder");
+ throw new UnsupportedError("Unexpected constant kind: ${kind} in $decoder");
}
}
@@ -312,16 +283,14 @@
const ConstantConstructorSerializer();
@override
- void visit(ConstantConstructor constantConstructor,
- ObjectEncoder encoder) {
+ void visit(ConstantConstructor constantConstructor, ObjectEncoder encoder) {
encoder.setEnum(Key.KIND, constantConstructor.kind);
constantConstructor.accept(this, encoder);
}
@override
void visitGenerative(
- GenerativeConstantConstructor constructor,
- ObjectEncoder encoder) {
+ GenerativeConstantConstructor constructor, ObjectEncoder encoder) {
encoder.setType(Key.TYPE, constructor.type);
MapEncoder defaults = encoder.createMap(Key.DEFAULTS);
constructor.defaultValues.forEach((key, e) {
@@ -334,8 +303,8 @@
fieldSerializer.setConstant(Key.CONSTANT, e);
});
if (constructor.superConstructorInvocation != null) {
- encoder.setConstant(Key.CONSTRUCTOR,
- constructor.superConstructorInvocation);
+ encoder.setConstant(
+ Key.CONSTRUCTOR, constructor.superConstructorInvocation);
}
}
@@ -343,8 +312,8 @@
void visitRedirectingFactory(
RedirectingFactoryConstantConstructor constructor,
ObjectEncoder encoder) {
- encoder.setConstant(Key.CONSTRUCTOR,
- constructor.targetConstructorInvocation);
+ encoder.setConstant(
+ Key.CONSTRUCTOR, constructor.targetConstructorInvocation);
}
@override
@@ -355,10 +324,10 @@
constructor.defaultValues.forEach((key, ConstantExpression e) {
defaults.setConstant('$key', e);
});
- encoder.setConstant(Key.CONSTRUCTOR,
- constructor.thisConstructorInvocation);
+ encoder.setConstant(Key.CONSTRUCTOR, constructor.thisConstructorInvocation);
}
}
+
/// Utility class for deserializing [ConstantConstructor]s.
///
/// This is used by the [ConstructorElementZ].
@@ -370,7 +339,6 @@
/// [DartType], and [ConstantExpression] that the deserialized
/// [ConstantConstructor] depends upon are available.
static ConstantConstructor deserialize(ObjectDecoder decoder) {
-
ConstantConstructorKind kind =
decoder.getEnum(Key.KIND, ConstantConstructorKind.values);
@@ -378,7 +346,7 @@
return decoder.getType(Key.TYPE);
}
- Map<dynamic/*int|String*/, ConstantExpression> readDefaults() {
+ Map<dynamic /*int|String*/, ConstantExpression> readDefaults() {
Map<dynamic, ConstantExpression> defaultValues =
<dynamic, ConstantExpression>{};
if (decoder.containsKey(Key.DEFAULTS)) {
@@ -416,15 +384,11 @@
switch (kind) {
case ConstantConstructorKind.GENERATIVE:
- return new GenerativeConstantConstructor(
- readType(),
- readDefaults(),
- readFields(),
- readConstructorInvocation());
+ return new GenerativeConstantConstructor(readType(), readDefaults(),
+ readFields(), readConstructorInvocation());
case ConstantConstructorKind.REDIRECTING_GENERATIVE:
return new RedirectingGenerativeConstantConstructor(
- readDefaults(),
- readConstructorInvocation());
+ readDefaults(), readConstructorInvocation());
case ConstantConstructorKind.REDIRECTING_FACTORY:
return new RedirectingFactoryConstantConstructor(
readConstructorInvocation());
diff --git a/pkg/compiler/lib/src/serialization/element_serialization.dart b/pkg/compiler/lib/src/serialization/element_serialization.dart
index 86c3337..78228ca 100644
--- a/pkg/compiler/lib/src/serialization/element_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/element_serialization.dart
@@ -26,6 +26,7 @@
TOPLEVEL_FIELD,
STATIC_FIELD,
INSTANCE_FIELD,
+ ENUM_CONSTANT,
TOPLEVEL_FUNCTION,
TOPLEVEL_GETTER,
TOPLEVEL_SETTER,
@@ -43,6 +44,7 @@
IMPORT,
EXPORT,
PREFIX,
+ LOCAL_VARIABLE,
EXTERNAL_LIBRARY,
EXTERNAL_LIBRARY_MEMBER,
EXTERNAL_STATIC_MEMBER,
@@ -57,18 +59,19 @@
/// and [ConstantExpression] that the serialized [Element] depends upon are also
/// serialized.
const List<ElementSerializer> ELEMENT_SERIALIZERS = const [
- const LibrarySerializer(),
- const CompilationUnitSerializer(),
- const ClassSerializer(),
- const ConstructorSerializer(),
- const FieldSerializer(),
- const FunctionSerializer(),
- const TypedefSerializer(),
- const TypeVariableSerializer(),
- const ParameterSerializer(),
- const ImportSerializer(),
- const ExportSerializer(),
- const PrefixSerializer(),
+ const LibrarySerializer(),
+ const CompilationUnitSerializer(),
+ const ClassSerializer(),
+ const ConstructorSerializer(),
+ const FieldSerializer(),
+ const FunctionSerializer(),
+ const TypedefSerializer(),
+ const TypeVariableSerializer(),
+ const ParameterSerializer(),
+ const ImportSerializer(),
+ const ExportSerializer(),
+ const PrefixSerializer(),
+ const LocalVariableSerializer(),
];
/// Interface for a function that can serialize a set of element kinds.
@@ -79,15 +82,14 @@
/// Serializes [element] into the [encoder] using the [kind] computed
/// by [getSerializedKind].
- void serialize(Element element,
- ObjectEncoder encoder,
- SerializedElementKind kind);
+ void serialize(
+ Element element, ObjectEncoder encoder, SerializedElementKind kind);
}
class SerializerUtil {
/// Serialize the declared members of [element] into [encoder].
- static void serializeMembers(Iterable<Element> members,
- ObjectEncoder encoder) {
+ static void serializeMembers(
+ Iterable<Element> members, ObjectEncoder encoder) {
MapEncoder mapEncoder = encoder.createMap(Key.MEMBERS);
for (Element member in members) {
String name = member.name;
@@ -115,8 +117,8 @@
}
/// Serialize the parameters of [element] into [encoder].
- static void serializeParameters(FunctionElement element,
- ObjectEncoder encoder) {
+ static void serializeParameters(
+ FunctionElement element, ObjectEncoder encoder) {
FunctionType type = element.type;
encoder.setType(Key.RETURN_TYPE, type.returnType);
encoder.setElements(Key.PARAMETERS, element.parameters);
@@ -186,27 +188,24 @@
return imports;
}
- static List<Element> getImportedElements(
- LibraryElement element) {
+ static List<Element> getImportedElements(LibraryElement element) {
Set<Element> importedElements = new Set<Element>();
element.forEachImport(SerializerUtil.flattenElements(importedElements));
if (element.isPatched) {
- element.implementation.forEachImport(
- SerializerUtil.flattenElements(importedElements));
+ element.implementation
+ .forEachImport(SerializerUtil.flattenElements(importedElements));
}
return importedElements.toList();
}
- static List<Element> getExportedElements(
- LibraryElement element) {
+ static List<Element> getExportedElements(LibraryElement element) {
Set<Element> exportedElements = new Set<Element>();
element.forEachExport(SerializerUtil.flattenElements(exportedElements));
return exportedElements.toList();
}
- void serialize(LibraryElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(LibraryElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setUri(
Key.CANONICAL_URI, element.canonicalUri, element.canonicalUri);
encoder.setString(Key.LIBRARY_NAME, element.libraryName);
@@ -219,7 +218,6 @@
encoder.setElements(Key.IMPORT_SCOPE, getImportedElements(element));
encoder.setElements(Key.EXPORT_SCOPE, getExportedElements(element));
-
}
}
@@ -233,9 +231,8 @@
return null;
}
- void serialize(CompilationUnitElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(CompilationUnitElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setElement(Key.LIBRARY, element.library);
encoder.setUri(
Key.URI, element.library.canonicalUri, element.script.resourceUri);
@@ -281,9 +278,8 @@
return members;
}
- void serialize(ClassElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(
+ ClassElement element, ObjectEncoder encoder, SerializedElementKind kind) {
encoder.setElement(Key.LIBRARY, element.library);
encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
encoder.setString(Key.NAME, element.name);
@@ -335,9 +331,8 @@
return null;
}
- void serialize(ConstructorElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(ConstructorElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setElement(Key.CLASS, element.enclosingClass);
encoder.setType(Key.TYPE, element.type);
encoder.setString(Key.NAME, element.name);
@@ -348,10 +343,9 @@
if (element.isExternal) return;
if (element.isConst && !element.isFromEnvironmentConstructor) {
ConstantConstructor constantConstructor = element.constantConstructor;
- ObjectEncoder constantEncoder =
- encoder.createObject(Key.CONSTRUCTOR);
- const ConstantConstructorSerializer().visit(
- constantConstructor, constantEncoder);
+ ObjectEncoder constantEncoder = encoder.createObject(Key.CONSTRUCTOR);
+ const ConstantConstructorSerializer()
+ .visit(constantConstructor, constantEncoder);
}
}
}
@@ -362,15 +356,19 @@
SerializedElementKind getSerializedKind(Element element) {
if (element.isField) {
if (element.isTopLevel) return SerializedElementKind.TOPLEVEL_FIELD;
- if (element.isStatic) return SerializedElementKind.STATIC_FIELD;
+ if (element.isStatic) {
+ if (element is EnumConstantElement) {
+ return SerializedElementKind.ENUM_CONSTANT;
+ }
+ return SerializedElementKind.STATIC_FIELD;
+ }
if (element.isInstanceMember) return SerializedElementKind.INSTANCE_FIELD;
}
return null;
}
- void serialize(FieldElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(
+ FieldElement element, ObjectEncoder encoder, SerializedElementKind kind) {
encoder.setString(Key.NAME, element.name);
SerializerUtil.serializePosition(element, encoder);
encoder.setType(Key.TYPE, element.type);
@@ -386,6 +384,10 @@
encoder.setElement(Key.LIBRARY, element.library);
encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
}
+ if (element is EnumConstantElement) {
+ EnumConstantElement enumConstant = element;
+ encoder.setInt(Key.INDEX, enumConstant.index);
+ }
}
}
@@ -420,9 +422,8 @@
return null;
}
- void serialize(FunctionElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(FunctionElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setString(Key.NAME, element.name);
SerializerUtil.serializePosition(element, encoder);
SerializerUtil.serializeParameters(element, encoder);
@@ -455,9 +456,8 @@
return null;
}
- void serialize(TypedefElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(TypedefElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setString(Key.NAME, element.name);
SerializerUtil.serializePosition(element, encoder);
encoder.setType(Key.ALIAS, element.alias);
@@ -477,9 +477,8 @@
return null;
}
- void serialize(TypeVariableElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(TypeVariableElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setElement(Key.TYPE_DECLARATION, element.typeDeclaration);
encoder.setString(Key.NAME, element.name);
SerializerUtil.serializePosition(element, encoder);
@@ -501,9 +500,8 @@
return null;
}
- void serialize(ParameterElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(ParameterElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setElement(Key.FUNCTION, element.functionDeclaration);
encoder.setString(Key.NAME, element.name);
SerializerUtil.serializePosition(element, encoder);
@@ -520,6 +518,31 @@
}
}
+class LocalVariableSerializer implements ElementSerializer {
+ const LocalVariableSerializer();
+
+ SerializedElementKind getSerializedKind(Element element) {
+ if (element.isVariable) {
+ return SerializedElementKind.LOCAL_VARIABLE;
+ }
+ return null;
+ }
+
+ void serialize(LocalVariableElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
+ encoder.setString(Key.NAME, element.name);
+ SerializerUtil.serializePosition(element, encoder);
+ encoder.setType(Key.TYPE, element.type);
+ encoder.setBool(Key.IS_FINAL, element.isFinal);
+ encoder.setBool(Key.IS_CONST, element.isConst);
+ if (element.isConst) {
+ ConstantExpression constant = element.constant;
+ encoder.setConstant(Key.CONSTANT, constant);
+ }
+ encoder.setElement(Key.EXECUTABLE_CONTEXT, element.executableContext);
+ }
+}
+
class ImportSerializer implements ElementSerializer {
const ImportSerializer();
@@ -530,9 +553,8 @@
return null;
}
- void serialize(ImportElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(ImportElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setElement(Key.LIBRARY, element.library);
encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
encoder.setElement(Key.LIBRARY_DEPENDENCY, element.importedLibrary);
@@ -555,9 +577,8 @@
return null;
}
- void serialize(ExportElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(ExportElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setElement(Key.LIBRARY, element.library);
encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
encoder.setElement(Key.LIBRARY_DEPENDENCY, element.exportedLibrary);
@@ -576,9 +597,8 @@
return null;
}
- void serialize(PrefixElement element,
- ObjectEncoder encoder,
- SerializedElementKind kind) {
+ void serialize(PrefixElement element, ObjectEncoder encoder,
+ SerializedElementKind kind) {
encoder.setString(Key.NAME, element.name);
encoder.setElement(Key.LIBRARY, element.library);
encoder.setElement(Key.COMPILATION_UNIT, element.compilationUnit);
@@ -593,7 +613,6 @@
///
/// This is used by the [Deserializer].
class ElementDeserializer {
-
/// Deserializes an [Element] from an [ObjectDecoder].
///
/// The class is called from the [Deserializer] when an [Element]
@@ -601,8 +620,7 @@
/// [DartType], and [ConstantExpression] that the deserialized [Element]
/// depends upon are available.
static Element deserialize(
- ObjectDecoder decoder,
- SerializedElementKind elementKind) {
+ ObjectDecoder decoder, SerializedElementKind elementKind) {
switch (elementKind) {
case SerializedElementKind.LIBRARY:
return new LibraryElementZ(decoder);
@@ -618,6 +636,8 @@
return new TopLevelFieldElementZ(decoder);
case SerializedElementKind.STATIC_FIELD:
return new StaticFieldElementZ(decoder);
+ case SerializedElementKind.ENUM_CONSTANT:
+ return new EnumConstantElementZ(decoder);
case SerializedElementKind.INSTANCE_FIELD:
return new InstanceFieldElementZ(decoder);
case SerializedElementKind.GENERATIVE_CONSTRUCTOR:
@@ -658,6 +678,8 @@
return new ExportElementZ(decoder);
case SerializedElementKind.PREFIX:
return new PrefixElementZ(decoder);
+ case SerializedElementKind.LOCAL_VARIABLE:
+ return new LocalVariableElementZ(decoder);
case SerializedElementKind.EXTERNAL_LIBRARY:
case SerializedElementKind.EXTERNAL_LIBRARY_MEMBER:
case SerializedElementKind.EXTERNAL_STATIC_MEMBER:
@@ -666,4 +688,4 @@
}
throw new UnsupportedError("Unexpected element kind '${elementKind}.");
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/serialization/equivalence.dart b/pkg/compiler/lib/src/serialization/equivalence.dart
index 5bc9d23..d68ce3e 100644
--- a/pkg/compiler/lib/src/serialization/equivalence.dart
+++ b/pkg/compiler/lib/src/serialization/equivalence.dart
@@ -11,19 +11,23 @@
import '../dart_types.dart';
import '../elements/elements.dart';
import '../elements/visitor.dart';
+import '../resolution/access_semantics.dart';
+import '../resolution/send_structure.dart';
+import '../resolution/tree_elements.dart';
+import '../tokens/token.dart';
+import '../tree/nodes.dart';
import '../universe/selector.dart';
import '../universe/use.dart';
+import '../util/util.dart';
+import 'resolved_ast_serialization.dart';
/// Equality based equivalence function.
bool equality(a, b) => a == b;
/// Returns `true` if the elements in [a] and [b] are pair-wise equivalent
/// according to [elementEquivalence].
-bool areListsEquivalent(
- List a,
- List b,
+bool areListsEquivalent(List a, List b,
[bool elementEquivalence(a, b) = equality]) {
-
if (a.length != b.length) return false;
for (int i = 0; i < a.length && i < b.length; i++) {
if (!elementEquivalence(a[i], b[i])) {
@@ -35,9 +39,7 @@
/// Returns `true` if the elements in [a] and [b] are equivalent as sets using
/// [elementEquivalence] to determine element equivalence.
-bool areSetsEquivalent(
- Iterable set1,
- Iterable set2,
+bool areSetsEquivalent(Iterable set1, Iterable set2,
[bool elementEquivalence(a, b) = equality]) {
Set remaining = set2.toSet();
for (var element1 in set1) {
@@ -88,23 +90,25 @@
}
/// Returns `true` if the lists of constants, [a] and [b], are equivalent.
-bool areConstantListsEquivalent(List<ConstantExpression> a,
- List<ConstantExpression> b) {
+bool areConstantListsEquivalent(
+ List<ConstantExpression> a, List<ConstantExpression> b) {
return areListsEquivalent(a, b, areConstantsEquivalent);
}
/// Returns `true` if the selectors [a] and [b] are equivalent.
bool areSelectorsEquivalent(Selector a, Selector b) {
+ if (identical(a, b)) return true;
+ if (a == null || b == null) return false;
return a.kind == b.kind &&
- a.callStructure == b.callStructure &&
- areNamesEquivalent(a.memberName, b.memberName);
+ a.callStructure == b.callStructure &&
+ areNamesEquivalent(a.memberName, b.memberName);
}
/// Returns `true` if the names [a] and [b] are equivalent.
bool areNamesEquivalent(Name a, Name b) {
return a.text == b.text &&
- a.isSetter == b.isSetter &&
- areElementsEquivalent(a.library, b.library);
+ a.isSetter == b.isSetter &&
+ areElementsEquivalent(a.library, b.library);
}
/// Returns `true` if the dynamic uses [a] and [b] are equivalent.
@@ -114,28 +118,158 @@
/// Returns `true` if the static uses [a] and [b] are equivalent.
bool areStaticUsesEquivalent(StaticUse a, StaticUse b) {
- return a.kind == b.kind &&
- areElementsEquivalent(a.element, b.element);
+ return a.kind == b.kind && areElementsEquivalent(a.element, b.element);
}
/// Returns `true` if the type uses [a] and [b] are equivalent.
bool areTypeUsesEquivalent(TypeUse a, TypeUse b) {
- return a.kind == b.kind &&
- areTypesEquivalent(a.type, b.type);
+ return a.kind == b.kind && areTypesEquivalent(a.type, b.type);
}
/// Returns `true` if the list literal uses [a] and [b] are equivalent.
bool areListLiteralUsesEquivalent(ListLiteralUse a, ListLiteralUse b) {
return areTypesEquivalent(a.type, b.type) &&
- a.isConstant == b.isConstant &&
- a.isEmpty == b.isEmpty;
+ a.isConstant == b.isConstant &&
+ a.isEmpty == b.isEmpty;
}
/// Returns `true` if the map literal uses [a] and [b] are equivalent.
bool areMapLiteralUsesEquivalent(MapLiteralUse a, MapLiteralUse b) {
return areTypesEquivalent(a.type, b.type) &&
- a.isConstant == b.isConstant &&
- a.isEmpty == b.isEmpty;
+ a.isConstant == b.isConstant &&
+ a.isEmpty == b.isEmpty;
+}
+
+/// Returns `true` if the access semantics [a] and [b] are equivalent.
+bool areAccessSemanticsEquivalent(AccessSemantics a, AccessSemantics b) {
+ if (a.kind != b.kind) return false;
+ switch (a.kind) {
+ case AccessKind.EXPRESSION:
+ case AccessKind.THIS:
+ // No additional properties.
+ return true;
+ case AccessKind.THIS_PROPERTY:
+ case AccessKind.DYNAMIC_PROPERTY:
+ case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
+ return areNamesEquivalent(a.name, b.name);
+ case AccessKind.CLASS_TYPE_LITERAL:
+ case AccessKind.TYPEDEF_TYPE_LITERAL:
+ case AccessKind.DYNAMIC_TYPE_LITERAL:
+ return areConstantsEquivalent(a.constant, b.constant);
+ case AccessKind.LOCAL_FUNCTION:
+ case AccessKind.LOCAL_VARIABLE:
+ case AccessKind.FINAL_LOCAL_VARIABLE:
+ case AccessKind.PARAMETER:
+ case AccessKind.FINAL_PARAMETER:
+ case AccessKind.STATIC_FIELD:
+ case AccessKind.FINAL_STATIC_FIELD:
+ case AccessKind.STATIC_METHOD:
+ case AccessKind.STATIC_GETTER:
+ case AccessKind.STATIC_SETTER:
+ case AccessKind.TOPLEVEL_FIELD:
+ case AccessKind.FINAL_TOPLEVEL_FIELD:
+ case AccessKind.TOPLEVEL_METHOD:
+ case AccessKind.TOPLEVEL_GETTER:
+ case AccessKind.TOPLEVEL_SETTER:
+ case AccessKind.SUPER_FIELD:
+ case AccessKind.SUPER_FINAL_FIELD:
+ case AccessKind.SUPER_METHOD:
+ case AccessKind.SUPER_GETTER:
+ case AccessKind.SUPER_SETTER:
+ case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
+ case AccessKind.UNRESOLVED:
+ case AccessKind.UNRESOLVED_SUPER:
+ case AccessKind.INVALID:
+ return areElementsEquivalent(a.element, b.element);
+ case AccessKind.COMPOUND:
+ CompoundAccessSemantics compoundAccess1 = a;
+ CompoundAccessSemantics compoundAccess2 = b;
+ return compoundAccess1.compoundAccessKind ==
+ compoundAccess2.compoundAccessKind &&
+ areElementsEquivalent(
+ compoundAccess1.getter, compoundAccess2.getter) &&
+ areElementsEquivalent(compoundAccess1.setter, compoundAccess2.setter);
+ case AccessKind.CONSTANT:
+ throw new UnsupportedError('Unsupported access kind: ${a.kind}');
+ }
+}
+
+/// Returns `true` if the send structures [a] and [b] are equivalent.
+bool areSendStructuresEquivalent(SendStructure a, SendStructure b) {
+ if (identical(a, b)) return true;
+ if (a == null || b == null) return false;
+ if (a.kind != b.kind) return false;
+
+ var ad = a;
+ var bd = b;
+ switch (a.kind) {
+ case SendStructureKind.IF_NULL:
+ case SendStructureKind.LOGICAL_AND:
+ case SendStructureKind.LOGICAL_OR:
+ case SendStructureKind.NOT:
+ case SendStructureKind.INVALID_UNARY:
+ case SendStructureKind.INVALID_BINARY:
+ // No additional properties.
+ return true;
+
+ case SendStructureKind.IS:
+ case SendStructureKind.IS_NOT:
+ case SendStructureKind.AS:
+ return areTypesEquivalent(ad.type, bd.type);
+
+ case SendStructureKind.INVOKE:
+ case SendStructureKind.INCOMPATIBLE_INVOKE:
+ if (!areSelectorsEquivalent(ad.selector, bd.selector)) return false;
+ continue semantics;
+
+ case SendStructureKind.UNARY:
+ case SendStructureKind.BINARY:
+ case SendStructureKind.PREFIX:
+ case SendStructureKind.POSTFIX:
+ case SendStructureKind.INDEX_PREFIX:
+ case SendStructureKind.INDEX_POSTFIX:
+ case SendStructureKind.COMPOUND:
+ case SendStructureKind.COMPOUND_INDEX_SET:
+ if (ad.operator != bd.operator) return false;
+ continue semantics;
+
+ case SendStructureKind.DEFERRED_PREFIX:
+ return areElementsEquivalent(ad.prefix, bd.prefix) &&
+ areSendStructuresEquivalent(ad.sendStructure, bd.sendStructure);
+
+ semantics: case SendStructureKind.GET:
+ case SendStructureKind.SET:
+ case SendStructureKind.INDEX:
+ case SendStructureKind.INDEX_SET:
+ case SendStructureKind.EQUALS:
+ case SendStructureKind.NOT_EQUALS:
+ case SendStructureKind.SET_IF_NULL:
+ case SendStructureKind.INDEX_SET_IF_NULL:
+ return areAccessSemanticsEquivalent(ad.semantics, bd.semantics);
+ }
+ throw new UnsupportedError('Unexpected send structures $a vs $b');
+}
+
+/// Returns `true` if the new structures [a] and [b] are equivalent.
+bool areNewStructuresEquivalent(NewStructure a, NewStructure b) {
+ if (identical(a, b)) return true;
+ if (a == null || b == null) return false;
+ if (a.kind != b.kind) return false;
+
+ var ad = a;
+ var bd = b;
+ switch (a.kind) {
+ case NewStructureKind.NEW_INVOKE:
+ return ad.semantics.kind == bd.semantics.kind &&
+ areElementsEquivalent(ad.semantics.element, bd.semantics.element) &&
+ areTypesEquivalent(ad.semantics.type, bd.semantics.type) &&
+ areSelectorsEquivalent(ad.selector, bd.selector);
+ case NewStructureKind.CONST_INVOKE:
+ return ad.constantInvokeKind == bd.constantInvokeKind &&
+ areConstantsEquivalent(ad.constant, bd.constant);
+ case NewStructureKind.LATE_CONST:
+ throw new UnsupportedError('Unsupported NewStructure kind ${a.kind}.');
+ }
}
/// Strategy for testing equivalence.
@@ -144,55 +278,47 @@
class TestStrategy {
const TestStrategy();
- bool test(var object1, var object2, String property, var value1, var value2) {
- return value1 == value2;
+ bool test(var object1, var object2, String property, var value1, var value2,
+ [bool equivalence(a, b) = equality]) {
+ return equivalence(value1, value2);
}
bool testLists(
- Object object1, Object object2, String property,
- List list1, List list2,
+ Object object1, Object object2, String property, List list1, List list2,
[bool elementEquivalence(a, b) = equality]) {
return areListsEquivalent(list1, list2, elementEquivalence);
}
bool testSets(
- var object1, var object2, String property,
- Iterable set1, Iterable set2,
+ var object1, var object2, String property, Iterable set1, Iterable set2,
[bool elementEquivalence(a, b) = equality]) {
return areSetsEquivalent(set1, set2, elementEquivalence);
}
- bool testElements(
- Object object1, Object object2, String property,
+ bool testElements(Object object1, Object object2, String property,
Element element1, Element element2) {
return areElementsEquivalent(element1, element2);
}
- bool testTypes(
- Object object1, Object object2, String property,
+ bool testTypes(Object object1, Object object2, String property,
DartType type1, DartType type2) {
return areTypesEquivalent(type1, type2);
}
- bool testConstants(
- Object object1, Object object2, String property,
+ bool testConstants(Object object1, Object object2, String property,
ConstantExpression exp1, ConstantExpression exp2) {
return areConstantsEquivalent(exp1, exp2);
}
- bool testTypeLists(
- Object object1, Object object2, String property,
+ bool testTypeLists(Object object1, Object object2, String property,
List<DartType> list1, List<DartType> list2) {
return areTypeListsEquivalent(list1, list2);
}
- bool testConstantLists(
- Object object1, Object object2, String property,
- List<ConstantExpression> list1,
- List<ConstantExpression> list2) {
+ bool testConstantLists(Object object1, Object object2, String property,
+ List<ConstantExpression> list1, List<ConstantExpression> list2) {
return areConstantListsEquivalent(list1, list2);
}
-
}
/// Visitor that checks for equivalence of [Element]s.
@@ -212,10 +338,8 @@
if (element1 == element2) {
return true;
}
- return
- strategy.test(
- element1, element2, 'kind',
- element1.kind, element2.kind) &&
+ return strategy.test(
+ element1, element2, 'kind', element1.kind, element2.kind) &&
element1.accept(this, element2);
}
@@ -226,34 +350,28 @@
@override
bool visitLibraryElement(LibraryElement element1, LibraryElement element2) {
- return
- strategy.test(element1, element2,
- 'canonicalUri',
- element1.canonicalUri, element2.canonicalUri);
+ return strategy.test(element1, element2, 'canonicalUri',
+ element1.canonicalUri, element2.canonicalUri);
}
@override
- bool visitCompilationUnitElement(CompilationUnitElement element1,
- CompilationUnitElement element2) {
- return
- strategy.test(element1, element2,
- 'name',
- element1.name, element2.name) &&
+ bool visitCompilationUnitElement(
+ CompilationUnitElement element1, CompilationUnitElement element2) {
+ return strategy.test(
+ element1, element2, 'name', element1.name, element2.name) &&
visit(element1.library, element2.library);
}
@override
bool visitClassElement(ClassElement element1, ClassElement element2) {
- return
- strategy.test(element1, element2,
- 'name',
- element1.name, element2.name) &&
+ return strategy.test(
+ element1, element2, 'name', element1.name, element2.name) &&
visit(element1.library, element2.library);
}
bool checkMembers(Element element1, Element element2) {
- if (!strategy.test(element1, element2, 'name',
- element1.name, element2.name)) {
+ if (!strategy.test(
+ element1, element2, 'name', element1.name, element2.name)) {
return false;
}
if (element1.enclosingClass != null || element2.enclosingClass != null) {
@@ -269,95 +387,88 @@
}
@override
- bool visitConstructorElement(ConstructorElement element1,
- ConstructorElement element2) {
+ bool visitConstructorElement(
+ ConstructorElement element1, ConstructorElement element2) {
return checkMembers(element1, element2);
}
@override
- bool visitMethodElement(MethodElement element1,
- MethodElement element2) {
+ bool visitMethodElement(MethodElement element1, MethodElement element2) {
return checkMembers(element1, element2);
}
@override
- bool visitGetterElement(GetterElement element1,
- GetterElement element2) {
+ bool visitGetterElement(GetterElement element1, GetterElement element2) {
return checkMembers(element1, element2);
}
@override
- bool visitSetterElement(SetterElement element1,
- SetterElement element2) {
+ bool visitSetterElement(SetterElement element1, SetterElement element2) {
return checkMembers(element1, element2);
}
@override
- bool visitLocalFunctionElement(LocalFunctionElement element1,
- LocalFunctionElement element2) {
+ bool visitLocalFunctionElement(
+ LocalFunctionElement element1, LocalFunctionElement element2) {
// TODO(johnniwinther): Define an equivalence on locals.
return checkMembers(element1.memberContext, element2.memberContext);
}
- bool visitAbstractFieldElement(AbstractFieldElement element1,
- AbstractFieldElement element2) {
+ @override
+ bool visitLocalVariableElement(
+ LocalVariableElement element1, LocalVariableElement element2) {
+ // TODO(johnniwinther): Define an equivalence on locals.
+ return checkMembers(element1.memberContext, element2.memberContext);
+ }
+
+ bool visitAbstractFieldElement(
+ AbstractFieldElement element1, AbstractFieldElement element2) {
return checkMembers(element1, element2);
}
@override
- bool visitTypeVariableElement(TypeVariableElement element1,
- TypeVariableElement element2) {
- return
- strategy.test(
- element1, element2, 'name',
- element1.name, element2.name) &&
+ bool visitTypeVariableElement(
+ TypeVariableElement element1, TypeVariableElement element2) {
+ return strategy.test(
+ element1, element2, 'name', element1.name, element2.name) &&
visit(element1.typeDeclaration, element2.typeDeclaration);
}
@override
bool visitTypedefElement(TypedefElement element1, TypedefElement element2) {
- return
- strategy.test(
- element1, element2, 'name',
- element1.name, element2.name) &&
+ return strategy.test(
+ element1, element2, 'name', element1.name, element2.name) &&
visit(element1.library, element2.library);
}
@override
- bool visitParameterElement(ParameterElement element1,
- ParameterElement element2) {
- return
- strategy.test(
- element1, element2, 'name',
- element1.name, element2.name) &&
+ bool visitParameterElement(
+ ParameterElement element1, ParameterElement element2) {
+ return strategy.test(
+ element1, element2, 'name', element1.name, element2.name) &&
visit(element1.functionDeclaration, element2.functionDeclaration);
}
@override
bool visitImportElement(ImportElement element1, ImportElement element2) {
- return
- visit(element1.importedLibrary, element2.importedLibrary) &&
+ return visit(element1.importedLibrary, element2.importedLibrary) &&
visit(element1.library, element2.library);
}
@override
bool visitExportElement(ExportElement element1, ExportElement element2) {
- return
- visit(element1.exportedLibrary, element2.exportedLibrary) &&
+ return visit(element1.exportedLibrary, element2.exportedLibrary) &&
visit(element1.library, element2.library);
}
@override
bool visitPrefixElement(PrefixElement element1, PrefixElement element2) {
- return
- strategy.test(
- element1, element2, 'name',
- element1.name, element2.name) &&
+ return strategy.test(
+ element1, element2, 'name', element1.name, element2.name) &&
visit(element1.library, element2.library);
}
}
-
/// Visitor that checks for equivalence of [DartType]s.
class TypeEquivalence implements DartTypeVisitor<bool, DartType> {
final TestStrategy strategy;
@@ -365,8 +476,7 @@
const TypeEquivalence([this.strategy = const TestStrategy()]);
bool visit(DartType type1, DartType type2) {
- return
- strategy.test(type1, type2, 'kind', type1.kind, type2.kind) &&
+ return strategy.test(type1, type2, 'kind', type1.kind, type2.kind) &&
type1.accept(this, type2);
}
@@ -375,29 +485,21 @@
@override
bool visitFunctionType(FunctionType type, FunctionType other) {
- return
- strategy.testTypeLists(
- type, other, 'parameterTypes',
+ return strategy.testTypeLists(type, other, 'parameterTypes',
type.parameterTypes, other.parameterTypes) &&
- strategy.testTypeLists(
- type, other, 'optionalParameterTypes',
+ strategy.testTypeLists(type, other, 'optionalParameterTypes',
type.optionalParameterTypes, other.optionalParameterTypes) &&
- strategy.testTypeLists(
- type, other, 'namedParameterTypes',
+ strategy.testTypeLists(type, other, 'namedParameterTypes',
type.namedParameterTypes, other.namedParameterTypes) &&
- strategy.testLists(
- type, other, 'namedParameters',
- type.namedParameters, other.namedParameters);
+ strategy.testLists(type, other, 'namedParameters', type.namedParameters,
+ other.namedParameters);
}
bool visitGenericType(GenericType type, GenericType other) {
- return
- strategy.testElements(
- type, other, 'element',
- type.element, other.element) &&
- strategy.testTypeLists(
- type, other, 'typeArguments',
- type.typeArguments, other.typeArguments);
+ return strategy.testElements(
+ type, other, 'element', type.element, other.element) &&
+ strategy.testTypeLists(type, other, 'typeArguments', type.typeArguments,
+ other.typeArguments);
}
@override
@@ -410,10 +512,8 @@
@override
bool visitTypeVariableType(TypeVariableType type, TypeVariableType other) {
- return
- strategy.testElements(
- type, other, 'element',
- type.element, other.element);
+ return strategy.testElements(
+ type, other, 'element', type.element, other.element);
}
@override
@@ -440,34 +540,30 @@
@override
bool visit(ConstantExpression exp1, ConstantExpression exp2) {
if (identical(exp1, exp2)) return true;
- return
- strategy.test(exp1, exp2, 'kind', exp1.kind, exp2.kind) &&
+ return strategy.test(exp1, exp2, 'kind', exp1.kind, exp2.kind) &&
exp1.accept(this, exp2);
}
@override
- bool visitBinary(BinaryConstantExpression exp1,
- BinaryConstantExpression exp2) {
- return
- strategy.test(exp1, exp2, 'operator', exp1.operator, exp2.operator) &&
+ bool visitBinary(
+ BinaryConstantExpression exp1, BinaryConstantExpression exp2) {
+ return strategy.test(
+ exp1, exp2, 'operator', exp1.operator, exp2.operator) &&
strategy.testConstants(exp1, exp2, 'left', exp1.left, exp2.left) &&
strategy.testConstants(exp1, exp2, 'right', exp1.right, exp2.right);
}
@override
- bool visitConcatenate(ConcatenateConstantExpression exp1,
- ConcatenateConstantExpression exp2) {
- return
- strategy.testConstantLists(
- exp1, exp2, 'expressions',
- exp1.expressions, exp2.expressions);
+ bool visitConcatenate(
+ ConcatenateConstantExpression exp1, ConcatenateConstantExpression exp2) {
+ return strategy.testConstantLists(
+ exp1, exp2, 'expressions', exp1.expressions, exp2.expressions);
}
@override
- bool visitConditional(ConditionalConstantExpression exp1,
- ConditionalConstantExpression exp2) {
- return
- strategy.testConstants(
+ bool visitConditional(
+ ConditionalConstantExpression exp1, ConditionalConstantExpression exp2) {
+ return strategy.testConstants(
exp1, exp2, 'condition', exp1.condition, exp2.condition) &&
strategy.testConstants(
exp1, exp2, 'trueExp', exp1.trueExp, exp2.trueExp) &&
@@ -476,62 +572,43 @@
}
@override
- bool visitConstructed(ConstructedConstantExpression exp1,
- ConstructedConstantExpression exp2) {
- return
- strategy.testTypes(
- exp1, exp2, 'type',
- exp1.type, exp2.type) &&
- strategy.testElements(
- exp1, exp2, 'target',
- exp1.target, exp2.target) &&
+ bool visitConstructed(
+ ConstructedConstantExpression exp1, ConstructedConstantExpression exp2) {
+ return strategy.testTypes(exp1, exp2, 'type', exp1.type, exp2.type) &&
+ strategy.testElements(exp1, exp2, 'target', exp1.target, exp2.target) &&
strategy.testConstantLists(
- exp1, exp2, 'arguments',
- exp1.arguments, exp2.arguments) &&
- strategy.test(exp1, exp2, 'callStructure',
- exp1.callStructure, exp2.callStructure);
+ exp1, exp2, 'arguments', exp1.arguments, exp2.arguments) &&
+ strategy.test(exp1, exp2, 'callStructure', exp1.callStructure,
+ exp2.callStructure);
}
@override
- bool visitFunction(FunctionConstantExpression exp1,
- FunctionConstantExpression exp2) {
- return
- strategy.testElements(
- exp1, exp2, 'element',
- exp1.element, exp2.element);
+ bool visitFunction(
+ FunctionConstantExpression exp1, FunctionConstantExpression exp2) {
+ return strategy.testElements(
+ exp1, exp2, 'element', exp1.element, exp2.element);
}
@override
- bool visitIdentical(IdenticalConstantExpression exp1,
- IdenticalConstantExpression exp2) {
- return
- strategy.testConstants(exp1, exp2, 'left', exp1.left, exp2.left) &&
+ bool visitIdentical(
+ IdenticalConstantExpression exp1, IdenticalConstantExpression exp2) {
+ return strategy.testConstants(exp1, exp2, 'left', exp1.left, exp2.left) &&
strategy.testConstants(exp1, exp2, 'right', exp1.right, exp2.right);
}
@override
bool visitList(ListConstantExpression exp1, ListConstantExpression exp2) {
- return
- strategy.testTypes(
- exp1, exp2, 'type',
- exp1.type, exp2.type) &&
+ return strategy.testTypes(exp1, exp2, 'type', exp1.type, exp2.type) &&
strategy.testConstantLists(
- exp1, exp2, 'values',
- exp1.values, exp2.values);
+ exp1, exp2, 'values', exp1.values, exp2.values);
}
@override
bool visitMap(MapConstantExpression exp1, MapConstantExpression exp2) {
- return
- strategy.testTypes(
- exp1, exp2, 'type',
- exp1.type, exp2.type) &&
+ return strategy.testTypes(exp1, exp2, 'type', exp1.type, exp2.type) &&
+ strategy.testConstantLists(exp1, exp2, 'keys', exp1.keys, exp2.keys) &&
strategy.testConstantLists(
- exp1, exp2, 'keys',
- exp1.keys, exp2.keys) &&
- strategy.testConstantLists(
- exp1, exp2, 'values',
- exp1.values, exp2.values);
+ exp1, exp2, 'values', exp1.values, exp2.values);
}
@override
@@ -540,16 +617,17 @@
}
@override
- bool visitPositional(PositionalArgumentReference exp1,
- PositionalArgumentReference exp2) {
+ bool visitPositional(
+ PositionalArgumentReference exp1, PositionalArgumentReference exp2) {
return strategy.test(exp1, exp2, 'index', exp1.index, exp2.index);
}
@override
- bool visitSymbol(SymbolConstantExpression exp1,
- SymbolConstantExpression exp2) {
- // TODO: implement visitSymbol
- return true;
+ bool visitSymbol(
+ SymbolConstantExpression exp1, SymbolConstantExpression exp2) {
+ // TODO(johnniwinther): Handle private names. Currently not even supported
+ // in resolution.
+ return strategy.test(exp1, exp2, 'name', exp1.name, exp2.name);
}
@override
@@ -559,44 +637,36 @@
@override
bool visitUnary(UnaryConstantExpression exp1, UnaryConstantExpression exp2) {
- return
- strategy.test(exp1, exp2, 'operator', exp1.operator, exp2.operator) &&
+ return strategy.test(
+ exp1, exp2, 'operator', exp1.operator, exp2.operator) &&
strategy.testConstants(
exp1, exp2, 'expression', exp1.expression, exp2.expression);
}
@override
- bool visitVariable(VariableConstantExpression exp1,
- VariableConstantExpression exp2) {
- return
- strategy.testElements(
- exp1, exp2, 'element',
- exp1.element, exp2.element);
+ bool visitVariable(
+ VariableConstantExpression exp1, VariableConstantExpression exp2) {
+ return strategy.testElements(
+ exp1, exp2, 'element', exp1.element, exp2.element);
}
@override
bool visitBool(BoolConstantExpression exp1, BoolConstantExpression exp2) {
- return
- strategy.test(
- exp1, exp2, 'primitiveValue',
- exp1.primitiveValue, exp2.primitiveValue);
+ return strategy.test(
+ exp1, exp2, 'primitiveValue', exp1.primitiveValue, exp2.primitiveValue);
}
@override
- bool visitDouble(DoubleConstantExpression exp1,
- DoubleConstantExpression exp2) {
- return
- strategy.test(
- exp1, exp2, 'primitiveValue',
- exp1.primitiveValue, exp2.primitiveValue);
+ bool visitDouble(
+ DoubleConstantExpression exp1, DoubleConstantExpression exp2) {
+ return strategy.test(
+ exp1, exp2, 'primitiveValue', exp1.primitiveValue, exp2.primitiveValue);
}
@override
bool visitInt(IntConstantExpression exp1, IntConstantExpression exp2) {
- return
- strategy.test(
- exp1, exp2, 'primitiveValue',
- exp1.primitiveValue, exp2.primitiveValue);
+ return strategy.test(
+ exp1, exp2, 'primitiveValue', exp1.primitiveValue, exp2.primitiveValue);
}
@override
@@ -605,96 +675,950 @@
}
@override
- bool visitString(StringConstantExpression exp1,
- StringConstantExpression exp2) {
- return
- strategy.test(
- exp1, exp2, 'primitiveValue',
- exp1.primitiveValue, exp2.primitiveValue);
+ bool visitString(
+ StringConstantExpression exp1, StringConstantExpression exp2) {
+ return strategy.test(
+ exp1, exp2, 'primitiveValue', exp1.primitiveValue, exp2.primitiveValue);
}
@override
bool visitBoolFromEnvironment(BoolFromEnvironmentConstantExpression exp1,
- BoolFromEnvironmentConstantExpression exp2) {
- return
- strategy.testConstants(exp1, exp2, 'name', exp1.name, exp2.name) &&
+ BoolFromEnvironmentConstantExpression exp2) {
+ return strategy.testConstants(exp1, exp2, 'name', exp1.name, exp2.name) &&
strategy.testConstants(
- exp1, exp2, 'defaultValue',
- exp1.defaultValue, exp2.defaultValue);
+ exp1, exp2, 'defaultValue', exp1.defaultValue, exp2.defaultValue);
}
@override
bool visitIntFromEnvironment(IntFromEnvironmentConstantExpression exp1,
- IntFromEnvironmentConstantExpression exp2) {
- return
- strategy.testConstants(exp1, exp2, 'name', exp1.name, exp2.name) &&
+ IntFromEnvironmentConstantExpression exp2) {
+ return strategy.testConstants(exp1, exp2, 'name', exp1.name, exp2.name) &&
strategy.testConstants(
- exp1, exp2, 'defaultValue',
- exp1.defaultValue, exp2.defaultValue);
+ exp1, exp2, 'defaultValue', exp1.defaultValue, exp2.defaultValue);
}
@override
- bool visitStringFromEnvironment(
- StringFromEnvironmentConstantExpression exp1,
+ bool visitStringFromEnvironment(StringFromEnvironmentConstantExpression exp1,
StringFromEnvironmentConstantExpression exp2) {
- return
- strategy.testConstants(exp1, exp2, 'name', exp1.name, exp2.name) &&
+ return strategy.testConstants(exp1, exp2, 'name', exp1.name, exp2.name) &&
strategy.testConstants(
- exp1, exp2, 'defaultValue',
- exp1.defaultValue, exp2.defaultValue);
+ exp1, exp2, 'defaultValue', exp1.defaultValue, exp2.defaultValue);
}
@override
bool visitStringLength(StringLengthConstantExpression exp1,
- StringLengthConstantExpression exp2) {
- return
- strategy.testConstants(
- exp1, exp2, 'expression',
- exp1.expression, exp2.expression);
+ StringLengthConstantExpression exp2) {
+ return strategy.testConstants(
+ exp1, exp2, 'expression', exp1.expression, exp2.expression);
}
@override
- bool visitDeferred(DeferredConstantExpression exp1,
- DeferredConstantExpression exp2) {
- // TODO: implement visitDeferred
+ bool visitDeferred(
+ DeferredConstantExpression exp1, DeferredConstantExpression exp2) {
+ // TODO(johnniwinther): Implement this.
return true;
}
}
/// Tests the equivalence of [impact1] and [impact2] using [strategy].
bool testResolutionImpactEquivalence(
- ResolutionImpact impact1,
- ResolutionImpact impact2,
+ ResolutionImpact impact1, ResolutionImpact impact2,
[TestStrategy strategy = const TestStrategy()]) {
- return
- strategy.testSets(
- impact1, impact2, 'constSymbolNames',
+ return strategy.testSets(impact1, impact2, 'constSymbolNames',
impact1.constSymbolNames, impact2.constSymbolNames) &&
strategy.testSets(
- impact1, impact2, 'constantLiterals',
- impact1.constantLiterals, impact2.constantLiterals,
+ impact1,
+ impact2,
+ 'constantLiterals',
+ impact1.constantLiterals,
+ impact2.constantLiterals,
areConstantsEquivalent) &&
+ strategy.testSets(impact1, impact2, 'dynamicUses', impact1.dynamicUses,
+ impact2.dynamicUses, areDynamicUsesEquivalent) &&
strategy.testSets(
- impact1, impact2, 'dynamicUses',
- impact1.dynamicUses, impact2.dynamicUses,
- areDynamicUsesEquivalent) &&
- strategy.testSets(
- impact1, impact2, 'features',
- impact1.features, impact2.features) &&
- strategy.testSets(
- impact1, impact2, 'listLiterals',
- impact1.listLiterals, impact2.listLiterals,
- areListLiteralUsesEquivalent) &&
- strategy.testSets(
- impact1, impact2, 'mapLiterals',
- impact1.mapLiterals, impact2.mapLiterals,
- areMapLiteralUsesEquivalent) &&
- strategy.testSets(
- impact1, impact2, 'staticUses',
- impact1.staticUses, impact2.staticUses,
- areStaticUsesEquivalent) &&
- strategy.testSets(
- impact1, impact2, 'typeUses',
- impact1.typeUses, impact2.typeUses,
- areTypeUsesEquivalent);
+ impact1, impact2, 'features', impact1.features, impact2.features) &&
+ strategy.testSets(impact1, impact2, 'listLiterals', impact1.listLiterals,
+ impact2.listLiterals, areListLiteralUsesEquivalent) &&
+ strategy.testSets(impact1, impact2, 'mapLiterals', impact1.mapLiterals,
+ impact2.mapLiterals, areMapLiteralUsesEquivalent) &&
+ strategy.testSets(impact1, impact2, 'staticUses', impact1.staticUses,
+ impact2.staticUses, areStaticUsesEquivalent) &&
+ strategy.testSets(impact1, impact2, 'typeUses', impact1.typeUses,
+ impact2.typeUses, areTypeUsesEquivalent);
+}
+
+/// Tests the equivalence of [resolvedAst1] and [resolvedAst2] using [strategy].
+bool testResolvedAstEquivalence(
+ ResolvedAst resolvedAst1, ResolvedAst resolvedAst2,
+ [TestStrategy strategy = const TestStrategy()]) {
+ return strategy.testElements(resolvedAst1, resolvedAst2, 'element',
+ resolvedAst1.element, resolvedAst2.element) &&
+ new NodeEquivalenceVisitor(strategy).testNodes(resolvedAst1, resolvedAst2,
+ 'node', resolvedAst1.node, resolvedAst2.node) &&
+ testTreeElementsEquivalence(resolvedAst1, resolvedAst2, strategy);
+}
+
+/// Tests the equivalence of the data stored in the [TreeElements] of
+/// [resolvedAst1] and [resolvedAst2] using [strategy].
+bool testTreeElementsEquivalence(
+ ResolvedAst resolvedAst1, ResolvedAst resolvedAst2,
+ [TestStrategy strategy = const TestStrategy()]) {
+ AstIndexComputer indices1 = new AstIndexComputer();
+ resolvedAst1.node.accept(indices1);
+ AstIndexComputer indices2 = new AstIndexComputer();
+ resolvedAst2.node.accept(indices2);
+
+ TreeElements elements1 = resolvedAst1.elements;
+ TreeElements elements2 = resolvedAst2.elements;
+
+ TreeElementsEquivalenceVisitor visitor = new TreeElementsEquivalenceVisitor(
+ indices1, indices2, elements1, elements2, strategy);
+ resolvedAst1.node.accept(visitor);
+ return visitor.success;
+}
+
+/// Visitor that checks the equivalence of [TreeElements] data.
+class TreeElementsEquivalenceVisitor extends Visitor {
+ final TestStrategy strategy;
+ final AstIndexComputer indices1;
+ final AstIndexComputer indices2;
+ final TreeElements elements1;
+ final TreeElements elements2;
+ bool success = true;
+
+ TreeElementsEquivalenceVisitor(
+ this.indices1, this.indices2, this.elements1, this.elements2,
+ [this.strategy = const TestStrategy()]);
+
+ visitNode(Node node1) {
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ Node node2 = indices2.nodeList[index];
+ success = strategy.testElements(
+ node1, node2, '[$index]', elements1[node1], elements2[node2]) &&
+ strategy.testTypes(node1, node2, 'getType($index)',
+ elements1.getType(node1), elements2.getType(node2)) &&
+ strategy.test(
+ node1,
+ node2,
+ 'getSelector($index)',
+ elements1.getSelector(node1),
+ elements2.getSelector(node2),
+ areSelectorsEquivalent) &&
+ strategy.testConstants(node1, node2, 'getConstant($index)',
+ elements1.getConstant(node1), elements2.getConstant(node2)) &&
+ strategy.testTypes(node1, node2, 'typesCache[$index]',
+ elements1.typesCache[node1], elements2.typesCache[node2]);
+
+ node1.visitChildren(this);
+ }
+
+ @override
+ visitSend(Send node1) {
+ visitExpression(node1);
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ Send node2 = indices2.nodeList[index];
+ success = strategy.test(node1, node2, 'isTypeLiteral($index)',
+ elements1.isTypeLiteral(node1), elements2.isTypeLiteral(node2)) &&
+ strategy.testTypes(
+ node1,
+ node2,
+ 'getTypeLiteralType($index)',
+ elements1.getTypeLiteralType(node1),
+ elements2.getTypeLiteralType(node2)) &&
+ strategy.test(
+ node1,
+ node2,
+ 'getSendStructure($index)',
+ elements1.getSendStructure(node1),
+ elements2.getSendStructure(node2),
+ areSendStructuresEquivalent);
+ }
+
+ @override
+ visitNewExpression(NewExpression node1) {
+ visitExpression(node1);
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ NewExpression node2 = indices2.nodeList[index];
+ success = strategy.test(
+ node1,
+ node2,
+ 'getNewStructure($index)',
+ elements1.getNewStructure(node1),
+ elements2.getNewStructure(node2),
+ areNewStructuresEquivalent);
+ }
+
+ @override
+ visitSendSet(SendSet node1) {
+ visitSend(node1);
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ SendSet node2 = indices2.nodeList[index];
+ success = strategy.test(
+ node1,
+ node2,
+ 'getGetterSelectorInComplexSendSet($index)',
+ elements1.getGetterSelectorInComplexSendSet(node1),
+ elements2.getGetterSelectorInComplexSendSet(node2),
+ areSelectorsEquivalent) &&
+ strategy.test(
+ node1,
+ node2,
+ 'getOperatorSelectorInComplexSendSet($index)',
+ elements1.getOperatorSelectorInComplexSendSet(node1),
+ elements2.getOperatorSelectorInComplexSendSet(node2),
+ areSelectorsEquivalent);
+ }
+
+ @override
+ visitFunctionExpression(FunctionExpression node1) {
+ visitNode(node1);
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ FunctionExpression node2 = indices2.nodeList[index];
+ if (elements1[node1] is! FunctionElement) {
+ // [getFunctionDefinition] is currently stored in [] which doesn't always
+ // contain a [FunctionElement].
+ return;
+ }
+ success = strategy.testElements(
+ node1,
+ node2,
+ 'getFunctionDefinition($index)',
+ elements1.getFunctionDefinition(node1),
+ elements2.getFunctionDefinition(node2));
+ }
+
+ @override
+ visitForIn(ForIn node1) {
+ visitLoop(node1);
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ ForIn node2 = indices2.nodeList[index];
+ success = strategy.testElements(node1, node2, 'getForInVariable($index)',
+ elements1.getForInVariable(node1), elements2.getForInVariable(node2));
+ }
+
+ @override
+ visitRedirectingFactoryBody(RedirectingFactoryBody node1) {
+ visitStatement(node1);
+ if (!success) return;
+ int index = indices1.nodeIndices[node1];
+ RedirectingFactoryBody node2 = indices2.nodeList[index];
+ success = strategy.testElements(
+ node1,
+ node2,
+ 'getRedirectingTargetConstructor($index)',
+ elements1.getRedirectingTargetConstructor(node1),
+ elements2.getRedirectingTargetConstructor(node2));
+ }
+}
+
+class NodeEquivalenceVisitor implements Visitor1<bool, Node> {
+ final TestStrategy strategy;
+
+ const NodeEquivalenceVisitor([this.strategy = const TestStrategy()]);
+
+ bool testNodes(
+ var object1, var object2, String property, Node node1, Node node2) {
+ if (node1 == node2) return true;
+ if (node1 == null || node2 == null) return false;
+ return node1.accept1(this, node2);
+ }
+
+ bool testNodeLists(var object1, var object2, String property,
+ Link<Node> list1, Link<Node> list2) {
+ if (list1 == list2) return true;
+ if (list1 == null || list2 == null) return false;
+ while (list1.isNotEmpty && list2.isNotEmpty) {
+ if (!list1.head.accept1(this, list2.head)) {
+ return false;
+ }
+ list1 = list1.tail;
+ list2 = list2.tail;
+ }
+ return list1.isEmpty && list2.isEmpty;
+ }
+
+ bool testTokens(
+ var object1, var object2, String property, Token token1, Token token2) {
+ if (token1 == token2) return true;
+ if (token1 == null || token2 == null) return false;
+ return token1.hashCode == token2.hashCode;
+ }
+
+ @override
+ bool visitAssert(Assert node1, Assert node2) {
+ return testTokens(node1, node2, 'assertToken', node1.assertToken,
+ node2.assertToken) &&
+ testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(node1, node2, 'message', node1.message, node2.message);
+ }
+
+ @override
+ bool visitAsyncForIn(AsyncForIn node1, AsyncForIn node2) {
+ return visitForIn(node1, node2) &&
+ testTokens(
+ node1, node2, 'awaitToken', node1.awaitToken, node2.awaitToken);
+ }
+
+ @override
+ bool visitAsyncModifier(AsyncModifier node1, AsyncModifier node2) {
+ return testTokens(
+ node1, node2, 'asyncToken', node1.asyncToken, node2.asyncToken) &&
+ testTokens(node1, node2, 'starToken', node1.starToken, node2.starToken);
+ }
+
+ @override
+ bool visitAwait(Await node1, Await node2) {
+ return testTokens(
+ node1, node2, 'awaitToken', node1.awaitToken, node2.awaitToken) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitBlock(Block node1, Block node2) {
+ return testNodes(
+ node1, node2, 'statements', node1.statements, node2.statements);
+ }
+
+ @override
+ bool visitBreakStatement(BreakStatement node1, BreakStatement node2) {
+ return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
+ node2.keywordToken) &&
+ testNodes(node1, node2, 'target', node1.target, node2.target);
+ }
+
+ @override
+ bool visitCascade(Cascade node1, Cascade node2) {
+ return testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitCascadeReceiver(CascadeReceiver node1, CascadeReceiver node2) {
+ return testTokens(node1, node2, 'cascadeOperator', node1.cascadeOperator,
+ node2.cascadeOperator) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitCaseMatch(CaseMatch node1, CaseMatch node2) {
+ return testTokens(node1, node2, 'caseKeyword', node1.caseKeyword,
+ node2.caseKeyword) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitCatchBlock(CatchBlock node1, CatchBlock node2) {
+ return testTokens(node1, node2, 'catchKeyword', node1.catchKeyword,
+ node2.catchKeyword) &&
+ testTokens(
+ node1, node2, 'onKeyword', node1.onKeyword, node2.onKeyword) &&
+ testNodes(node1, node2, 'type', node1.type, node2.type) &&
+ testNodes(node1, node2, 'formals', node1.formals, node2.formals) &&
+ testNodes(node1, node2, 'block', node1.block, node2.block);
+ }
+
+ @override
+ bool visitClassNode(ClassNode node1, ClassNode node2) {
+ return testTokens(
+ node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
+ testTokens(node1, node2, 'extendsKeyword', node1.extendsKeyword,
+ node2.extendsKeyword) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(
+ node1, node2, 'superclass', node1.superclass, node2.superclass) &&
+ testNodes(
+ node1, node2, 'interfaces', node1.interfaces, node2.interfaces) &&
+ testNodes(node1, node2, 'typeParameters', node1.typeParameters,
+ node2.typeParameters) &&
+ testNodes(node1, node2, 'body', node1.body, node2.body);
+ }
+
+ @override
+ bool visitCombinator(Combinator node1, Combinator node2) {
+ return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
+ node2.keywordToken) &&
+ testNodes(
+ node1, node2, 'identifiers', node1.identifiers, node2.identifiers);
+ }
+
+ @override
+ bool visitConditional(Conditional node1, Conditional node2) {
+ return testTokens(node1, node2, 'questionToken', node1.questionToken,
+ node2.questionToken) &&
+ testTokens(
+ node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
+ testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(node1, node2, 'thenExpression', node1.thenExpression,
+ node2.thenExpression) &&
+ testNodes(node1, node2, 'elseExpression', node1.elseExpression,
+ node2.elseExpression);
+ }
+
+ @override
+ bool visitConditionalUri(ConditionalUri node1, ConditionalUri node2) {
+ return testTokens(node1, node2, 'ifToken', node1.ifToken, node2.ifToken) &&
+ testNodes(node1, node2, 'key', node1.key, node2.key) &&
+ testNodes(node1, node2, 'value', node1.value, node2.value) &&
+ testNodes(node1, node2, 'uri', node1.uri, node2.uri);
+ }
+
+ @override
+ bool visitContinueStatement(
+ ContinueStatement node1, ContinueStatement node2) {
+ return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
+ node2.keywordToken) &&
+ testNodes(node1, node2, 'target', node1.target, node2.target);
+ }
+
+ @override
+ bool visitDoWhile(DoWhile node1, DoWhile node2) {
+ return testTokens(
+ node1, node2, 'doKeyword', node1.doKeyword, node2.doKeyword) &&
+ testTokens(node1, node2, 'whileKeyword', node1.whileKeyword,
+ node2.whileKeyword) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(node1, node2, 'body', node1.body, node2.body);
+ }
+
+ @override
+ bool visitDottedName(DottedName node1, DottedName node2) {
+ return testTokens(node1, node2, 'token', node1.token, node2.token) &&
+ testNodes(
+ node1, node2, 'identifiers', node1.identifiers, node2.identifiers);
+ }
+
+ @override
+ bool visitEmptyStatement(EmptyStatement node1, EmptyStatement node2) {
+ return testTokens(node1, node2, 'semicolonToken', node1.semicolonToken,
+ node2.semicolonToken);
+ }
+
+ @override
+ bool visitEnum(Enum node1, Enum node2) {
+ return testTokens(
+ node1, node2, 'enumToken', node1.enumToken, node2.enumToken) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(node1, node2, 'names', node1.names, node2.names);
+ }
+
+ @override
+ bool visitExport(Export node1, Export node2) {
+ return visitLibraryDependency(node1, node2) &&
+ testTokens(node1, node2, 'exportKeyword', node1.exportKeyword,
+ node2.exportKeyword);
+ }
+
+ @override
+ bool visitExpressionStatement(
+ ExpressionStatement node1, ExpressionStatement node2) {
+ return testTokens(
+ node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitFor(For node1, For node2) {
+ return testTokens(
+ node1, node2, 'forToken', node1.forToken, node2.forToken) &&
+ testNodes(node1, node2, 'initializer', node1.initializer,
+ node2.initializer) &&
+ testNodes(node1, node2, 'conditionStatement', node1.conditionStatement,
+ node2.conditionStatement) &&
+ testNodes(node1, node2, 'update', node1.update, node2.update) &&
+ testNodes(node1, node2, 'body', node1.body, node2.body);
+ }
+
+ @override
+ bool visitForIn(ForIn node1, ForIn node2) {
+ return testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression) &&
+ testNodes(node1, node2, 'body', node1.expression, node2.body) &&
+ testNodes(node1, node2, 'declaredIdentifier', node1.declaredIdentifier,
+ node2.declaredIdentifier);
+ }
+
+ @override
+ bool visitFunctionDeclaration(
+ FunctionDeclaration node1, FunctionDeclaration node2) {
+ return testNodes(node1, node2, 'function', node1.function, node2.function);
+ }
+
+ @override
+ bool visitFunctionExpression(
+ FunctionExpression node1, FunctionExpression node2) {
+ return testTokens(
+ node1, node2, 'getOrSet', node1.getOrSet, node2.getOrSet) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(
+ node1, node2, 'parameters', node1.parameters, node2.parameters) &&
+ testNodes(node1, node2, 'body', node1.body, node2.body) &&
+ testNodes(
+ node1, node2, 'returnType', node1.returnType, node2.returnType) &&
+ testNodes(
+ node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
+ testNodes(node1, node2, 'initializers', node1.initializers,
+ node2.initializers) &&
+ testNodes(node1, node2, 'asyncModifier', node1.asyncModifier,
+ node2.asyncModifier);
+ }
+
+ @override
+ bool visitGotoStatement(GotoStatement node1, GotoStatement node2) {
+ return testTokens(node1, node2, 'keywordToken', node1.keywordToken,
+ node2.keywordToken) &&
+ testTokens(node1, node2, 'semicolonToken', node1.semicolonToken,
+ node2.semicolonToken) &&
+ testNodes(node1, node2, 'target', node1.target, node2.target);
+ }
+
+ @override
+ bool visitIdentifier(Identifier node1, Identifier node2) {
+ return testTokens(node1, node2, 'token', node1.token, node2.token);
+ }
+
+ @override
+ bool visitIf(If node1, If node2) {
+ return testTokens(node1, node2, 'ifToken', node1.ifToken, node2.ifToken) &&
+ testTokens(
+ node1, node2, 'elseToken', node1.elseToken, node2.elseToken) &&
+ testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(node1, node2, 'thenPart', node1.thenPart, node2.thenPart) &&
+ testNodes(node1, node2, 'elsePart', node1.elsePart, node2.elsePart);
+ }
+
+ @override
+ bool visitImport(Import node1, Import node2) {
+ return visitLibraryDependency(node1, node2) &&
+ testTokens(node1, node2, 'importKeyword', node1.importKeyword,
+ node2.importKeyword) &&
+ testNodes(node1, node2, 'prefix', node1.prefix, node2.prefix) &&
+ strategy.test(
+ node1, node2, 'isDeferred', node1.isDeferred, node2.isDeferred);
+ }
+
+ @override
+ bool visitLabel(Label node1, Label node2) {
+ return testTokens(
+ node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
+ testNodes(
+ node1, node2, 'identifier', node1.identifier, node2.identifier);
+ }
+
+ @override
+ bool visitLabeledStatement(LabeledStatement node1, LabeledStatement node2) {
+ return testNodes(node1, node2, 'labels', node1.labels, node2.labels) &&
+ testNodes(node1, node2, 'statement', node1.statement, node2.statement);
+ }
+
+ @override
+ bool visitLibraryDependency(
+ LibraryDependency node1, LibraryDependency node2) {
+ return visitLibraryTag(node1, node2) &&
+ testNodes(node1, node2, 'uri', node1.uri, node2.uri) &&
+ testNodes(node1, node2, 'conditionalUris', node1.conditionalUris,
+ node2.conditionalUris) &&
+ testNodes(
+ node1, node2, 'combinators', node1.combinators, node2.combinators);
+ }
+
+ @override
+ bool visitLibraryName(LibraryName node1, LibraryName node2) {
+ return visitLibraryTag(node1, node2) &&
+ testTokens(node1, node2, 'libraryKeyword', node1.libraryKeyword,
+ node2.libraryKeyword) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name);
+ }
+
+ @override
+ bool visitLibraryTag(LibraryTag node1, LibraryTag node2) {
+ // TODO(johnniwinther): Check metadata?
+ return true;
+ }
+
+ @override
+ bool visitLiteral(Literal node1, Literal node2) {
+ return testTokens(node1, node2, 'token', node1.token, node2.token);
+ }
+
+ @override
+ bool visitLiteralBool(LiteralBool node1, LiteralBool node2) {
+ return visitLiteral(node1, node2);
+ }
+
+ @override
+ bool visitLiteralDouble(LiteralDouble node1, LiteralDouble node2) {
+ return visitLiteral(node1, node2);
+ }
+
+ @override
+ bool visitLiteralInt(LiteralInt node1, LiteralInt node2) {
+ return visitLiteral(node1, node2);
+ }
+
+ @override
+ bool visitLiteralList(LiteralList node1, LiteralList node2) {
+ return testTokens(node1, node2, 'constKeyword', node1.constKeyword,
+ node2.constKeyword) &&
+ testNodes(node1, node2, 'typeArguments', node1.typeArguments,
+ node2.typeArguments) &&
+ testNodes(node1, node2, 'elements', node1.elements, node2.elements);
+ }
+
+ @override
+ bool visitLiteralMap(LiteralMap node1, LiteralMap node2) {
+ return testTokens(node1, node2, 'constKeyword', node1.constKeyword,
+ node2.constKeyword) &&
+ testNodes(node1, node2, 'typeArguments', node1.typeArguments,
+ node2.typeArguments) &&
+ testNodes(node1, node2, 'entries', node1.entries, node2.entries);
+ }
+
+ @override
+ bool visitLiteralMapEntry(LiteralMapEntry node1, LiteralMapEntry node2) {
+ return testTokens(
+ node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
+ testNodes(node1, node2, 'key', node1.key, node2.key) &&
+ testNodes(node1, node2, 'value', node1.value, node2.value);
+ }
+
+ @override
+ bool visitLiteralNull(LiteralNull node1, LiteralNull node2) {
+ return visitLiteral(node1, node2);
+ }
+
+ @override
+ bool visitLiteralString(LiteralString node1, LiteralString node2) {
+ return testTokens(node1, node2, 'token', node1.token, node2.token) &&
+ strategy.test(
+ node1, node2, 'dartString', node1.dartString, node2.dartString);
+ }
+
+ @override
+ bool visitLiteralSymbol(LiteralSymbol node1, LiteralSymbol node2) {
+ return testTokens(
+ node1, node2, 'hashToken', node1.hashToken, node2.hashToken) &&
+ testNodes(
+ node1, node2, 'identifiers', node1.identifiers, node2.identifiers);
+ }
+
+ @override
+ bool visitLoop(Loop node1, Loop node2) {
+ return testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(node1, node2, 'body', node1.body, node2.body);
+ }
+
+ @override
+ bool visitMetadata(Metadata node1, Metadata node2) {
+ return testTokens(node1, node2, 'token', node1.token, node2.token) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitMixinApplication(MixinApplication node1, MixinApplication node2) {
+ return testNodes(
+ node1, node2, 'superclass', node1.superclass, node2.superclass) &&
+ testNodes(node1, node2, 'mixins', node1.mixins, node2.mixins);
+ }
+
+ @override
+ bool visitModifiers(Modifiers node1, Modifiers node2) {
+ return strategy.test(node1, node2, 'flags', node1.flags, node2.flags) &&
+ testNodes(node1, node2, 'nodes', node1.nodes, node2.nodes);
+ }
+
+ @override
+ bool visitNamedArgument(NamedArgument node1, NamedArgument node2) {
+ return testTokens(
+ node1, node2, 'colonToken', node1.colonToken, node2.colonToken) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitNamedMixinApplication(
+ NamedMixinApplication node1, NamedMixinApplication node2) {
+ return testTokens(node1, node2, 'classKeyword', node1.classKeyword,
+ node2.classKeyword) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(node1, node2, 'typeParameters', node1.typeParameters,
+ node2.typeParameters) &&
+ testNodes(
+ node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
+ testNodes(node1, node2, 'mixinApplication', node1.mixinApplication,
+ node2.mixinApplication) &&
+ testNodes(
+ node1, node2, 'interfaces', node1.interfaces, node2.interfaces);
+ }
+
+ @override
+ bool visitNewExpression(NewExpression node1, NewExpression node2) {
+ return testTokens(
+ node1, node2, 'newToken', node1.newToken, node2.newToken) &&
+ testNodes(node1, node2, 'send', node1.send, node2.send);
+ }
+
+ @override
+ bool visitNodeList(NodeList node1, NodeList node2) {
+ return testTokens(
+ node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ strategy.test(
+ node1, node2, 'delimiter', node1.delimiter, node2.delimiter) &&
+ testNodeLists(node1, node2, 'nodes', node1.nodes, node2.nodes);
+ }
+
+ @override
+ bool visitOperator(Operator node1, Operator node2) {
+ return visitIdentifier(node1, node2);
+ }
+
+ @override
+ bool visitParenthesizedExpression(
+ ParenthesizedExpression node1, ParenthesizedExpression node2) {
+ return testTokens(
+ node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitPart(Part node1, Part node2) {
+ return visitLibraryTag(node1, node2) &&
+ testTokens(node1, node2, 'partKeyword', node1.partKeyword,
+ node2.partKeyword) &&
+ testNodes(node1, node2, 'uri', node1.uri, node2.uri);
+ }
+
+ @override
+ bool visitPartOf(PartOf node1, PartOf node2) {
+ // TODO(johnniwinther): Check metadata?
+ return testTokens(node1, node2, 'partKeyword', node1.partKeyword,
+ node2.partKeyword) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name);
+ }
+
+ @override
+ bool visitPostfix(Postfix node1, Postfix node2) {
+ return visitNodeList(node1, node2);
+ }
+
+ @override
+ bool visitPrefix(Prefix node1, Prefix node2) {
+ return visitNodeList(node1, node2);
+ }
+
+ @override
+ bool visitRedirectingFactoryBody(
+ RedirectingFactoryBody node1, RedirectingFactoryBody node2) {
+ return testTokens(
+ node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(node1, node2, 'constructorReference',
+ node1.constructorReference, node2.constructorReference);
+ }
+
+ @override
+ bool visitRethrow(Rethrow node1, Rethrow node2) {
+ return testTokens(
+ node1, node2, 'throwToken', node1.throwToken, node2.throwToken) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken);
+ }
+
+ @override
+ bool visitReturn(Return node1, Return node2) {
+ return testTokens(
+ node1, node2, 'beginToken', node1.beginToken, node2.beginToken) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitSend(Send node1, Send node2) {
+ return strategy.test(node1, node2, 'isConditional', node1.isConditional,
+ node2.isConditional) &&
+ testNodes(node1, node2, 'receiver', node1.receiver, node2.receiver) &&
+ testNodes(node1, node2, 'selector', node1.selector, node2.selector) &&
+ testNodes(node1, node2, 'argumentsNode', node1.argumentsNode,
+ node2.argumentsNode);
+ }
+
+ @override
+ bool visitSendSet(SendSet node1, SendSet node2) {
+ return visitSend(node1, node2) &&
+ testNodes(node1, node2, 'assignmentOperator', node1.assignmentOperator,
+ node2.assignmentOperator);
+ }
+
+ @override
+ bool visitStringInterpolation(
+ StringInterpolation node1, StringInterpolation node2) {
+ return testNodes(node1, node2, 'string', node1.string, node2.string) &&
+ testNodes(node1, node2, 'parts', node1.parts, node2.parts);
+ }
+
+ @override
+ bool visitStringInterpolationPart(
+ StringInterpolationPart node1, StringInterpolationPart node2) {
+ return testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitStringJuxtaposition(
+ StringJuxtaposition node1, StringJuxtaposition node2) {
+ return testNodes(node1, node2, 'first', node1.first, node2.first) &&
+ testNodes(node1, node2, 'second', node1.second, node2.second);
+ }
+
+ @override
+ bool visitSwitchCase(SwitchCase node1, SwitchCase node2) {
+ return testTokens(node1, node2, 'defaultKeyword', node1.defaultKeyword,
+ node2.defaultKeyword) &&
+ testTokens(
+ node1, node2, 'startToken', node1.startToken, node2.startToken) &&
+ testNodes(node1, node2, 'labelsAndCases', node1.labelsAndCases,
+ node2.labelsAndCases) &&
+ testNodes(
+ node1, node2, 'statements', node1.statements, node2.statements);
+ }
+
+ @override
+ bool visitSwitchStatement(SwitchStatement node1, SwitchStatement node2) {
+ return testTokens(node1, node2, 'switchKeyword', node1.switchKeyword,
+ node2.switchKeyword) &&
+ testNodes(node1, node2, 'parenthesizedExpression',
+ node1.parenthesizedExpression, node2.parenthesizedExpression) &&
+ testNodes(node1, node2, 'cases', node1.cases, node2.cases);
+ }
+
+ @override
+ bool visitSyncForIn(SyncForIn node1, SyncForIn node2) {
+ return visitForIn(node1, node2);
+ }
+
+ @override
+ bool visitThrow(Throw node1, Throw node2) {
+ return testTokens(
+ node1, node2, 'throwToken', node1.throwToken, node2.throwToken) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitTryStatement(TryStatement node1, TryStatement node2) {
+ return testTokens(
+ node1, node2, 'tryKeyword', node1.tryKeyword, node2.tryKeyword) &&
+ testTokens(node1, node2, 'finallyKeyword', node1.finallyKeyword,
+ node2.finallyKeyword) &&
+ testNodes(node1, node2, 'tryBlock', node1.tryBlock, node2.tryBlock) &&
+ testNodes(node1, node2, 'catchBlocks', node1.catchBlocks,
+ node2.catchBlocks) &&
+ testNodes(node1, node2, 'finallyBlock', node1.finallyBlock,
+ node2.finallyBlock);
+ }
+
+ @override
+ bool visitTypeAnnotation(TypeAnnotation node1, TypeAnnotation node2) {
+ return testNodes(
+ node1, node2, 'typeName', node1.typeName, node2.typeName) &&
+ testNodes(node1, node2, 'typeArguments', node1.typeArguments,
+ node2.typeArguments);
+ }
+
+ @override
+ bool visitTypeVariable(TypeVariable node1, TypeVariable node2) {
+ return testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(node1, node2, 'bound', node1.bound, node2.bound);
+ }
+
+ @override
+ bool visitTypedef(Typedef node1, Typedef node2) {
+ return testTokens(node1, node2, 'typedefKeyword', node1.typedefKeyword,
+ node2.typedefKeyword) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'returnType', node1.returnType, node2.returnType) &&
+ testNodes(node1, node2, 'name', node1.name, node2.name) &&
+ testNodes(node1, node2, 'typeParameters', node1.typeParameters,
+ node2.typeParameters) &&
+ testNodes(node1, node2, 'formals', node1.formals, node2.formals);
+ }
+
+ @override
+ bool visitVariableDefinitions(
+ VariableDefinitions node1, VariableDefinitions node2) {
+ return testNodes(
+ node1, node2, 'metadata', node1.metadata, node2.metadata) &&
+ testNodes(node1, node2, 'type', node1.type, node2.type) &&
+ testNodes(
+ node1, node2, 'modifiers', node1.modifiers, node2.modifiers) &&
+ testNodes(
+ node1, node2, 'definitions', node1.definitions, node2.definitions);
+ }
+
+ @override
+ bool visitWhile(While node1, While node2) {
+ return testTokens(node1, node2, 'whileKeyword', node1.whileKeyword,
+ node2.whileKeyword) &&
+ testNodes(
+ node1, node2, 'condition', node1.condition, node2.condition) &&
+ testNodes(node1, node2, 'body', node1.body, node2.body);
+ }
+
+ @override
+ bool visitYield(Yield node1, Yield node2) {
+ return testTokens(
+ node1, node2, 'yieldToken', node1.yieldToken, node2.yieldToken) &&
+ testTokens(
+ node1, node2, 'starToken', node1.starToken, node2.starToken) &&
+ testTokens(node1, node2, 'endToken', node1.endToken, node2.endToken) &&
+ testNodes(
+ node1, node2, 'expression', node1.expression, node2.expression);
+ }
+
+ @override
+ bool visitNode(Node node1, Node node2) {
+ throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
+ }
+
+ @override
+ bool visitExpression(Expression node1, Expression node2) {
+ throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
+ }
+
+ @override
+ bool visitStatement(Statement node1, Statement node2) {
+ throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
+ }
+
+ @override
+ bool visitStringNode(StringNode node1, StringNode node2) {
+ throw new UnsupportedError('Unexpected nodes: $node1 <> $node2');
+ }
}
diff --git a/pkg/compiler/lib/src/serialization/impact_serialization.dart b/pkg/compiler/lib/src/serialization/impact_serialization.dart
index 979ec15..af3cf5d 100644
--- a/pkg/compiler/lib/src/serialization/impact_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/impact_serialization.dart
@@ -1,4 +1,4 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
@@ -16,6 +16,7 @@
import 'keys.dart';
import 'serialization.dart';
+import 'serialization_util.dart';
/// Visitor that serializes a [ResolutionImpact] object using an
/// [ObjectEncoder].
@@ -60,21 +61,7 @@
@override
void visitDynamicUse(DynamicUse dynamicUse) {
ObjectEncoder object = dynamicUses.createObject();
- object.setEnum(Key.KIND, dynamicUse.selector.kind);
-
- object.setInt(Key.ARGUMENTS,
- dynamicUse.selector.callStructure.argumentCount);
- object.setStrings(Key.NAMED_ARGUMENTS,
- dynamicUse.selector.callStructure.namedArguments);
-
- object.setString(Key.NAME,
- dynamicUse.selector.memberName.text);
- object.setBool(Key.IS_SETTER,
- dynamicUse.selector.memberName.isSetter);
- if (dynamicUse.selector.memberName.library != null) {
- object.setElement(Key.LIBRARY,
- dynamicUse.selector.memberName.library);
- }
+ serializeSelector(dynamicUse.selector, object);
}
@override
@@ -109,15 +96,15 @@
final Iterable<StaticUse> staticUses;
final Iterable<TypeUse> typeUses;
- DeserializedResolutionImpact({
- this.constSymbolNames,
- this.constantLiterals,
- this.dynamicUses,
- EnumSet<Feature> features,
- this.listLiterals,
- this.mapLiterals,
- this.staticUses,
- this.typeUses})
+ DeserializedResolutionImpact(
+ {this.constSymbolNames,
+ this.constantLiterals,
+ this.dynamicUses,
+ EnumSet<Feature> features,
+ this.listLiterals,
+ this.mapLiterals,
+ this.staticUses,
+ this.typeUses})
: this._features = features;
Iterable<Feature> get features => _features.iterable(Feature.values);
@@ -139,20 +126,8 @@
List<DynamicUse> dynamicUses = <DynamicUse>[];
for (int index = 0; index < dynamicUseDecoder.length; index++) {
ObjectDecoder object = dynamicUseDecoder.getObject(index);
- SelectorKind kind = object.getEnum(Key.KIND, SelectorKind.values);
- int argumentCount = object.getInt(Key.ARGUMENTS);
- List<String> namedArguments =
- object.getStrings(Key.NAMED_ARGUMENTS, isOptional: true);
- String name = object.getString(Key.NAME);
- bool isSetter = object.getBool(Key.IS_SETTER);
- LibraryElement library = object.getElement(Key.LIBRARY, isOptional: true);
- dynamicUses.add(
- new DynamicUse(
- new Selector(
- kind,
- new Name(name, library, isSetter: isSetter),
- new CallStructure(argumentCount, namedArguments)),
- null));
+ Selector selector = deserializeSelector(object);
+ dynamicUses.add(new DynamicUse(selector, null));
}
ListDecoder typeUseDecoder = objectDecoder.getList(Key.TYPE_USES);
@@ -183,8 +158,8 @@
DartType type = useDecoder.getType(Key.TYPE);
bool isConstant = useDecoder.getBool(Key.IS_CONST);
bool isEmpty = useDecoder.getBool(Key.IS_EMPTY);
- listLiterals.add(new ListLiteralUse(
- type, isConstant: isConstant, isEmpty: isEmpty));
+ listLiterals.add(
+ new ListLiteralUse(type, isConstant: isConstant, isEmpty: isEmpty));
}
}
@@ -198,8 +173,8 @@
DartType type = useDecoder.getType(Key.TYPE);
bool isConstant = useDecoder.getBool(Key.IS_CONST);
bool isEmpty = useDecoder.getBool(Key.IS_EMPTY);
- mapLiterals.add(new MapLiteralUse(
- type, isConstant: isConstant, isEmpty: isEmpty));
+ mapLiterals.add(
+ new MapLiteralUse(type, isConstant: isConstant, isEmpty: isEmpty));
}
}
diff --git a/pkg/compiler/lib/src/serialization/json_serializer.dart b/pkg/compiler/lib/src/serialization/json_serializer.dart
index 399bdbf..55ec647 100644
--- a/pkg/compiler/lib/src/serialization/json_serializer.dart
+++ b/pkg/compiler/lib/src/serialization/json_serializer.dart
@@ -14,8 +14,8 @@
const JsonSerializationEncoder();
String encode(ObjectValue objectValue) {
- return new JsonEncoder.withIndent(' ').convert(
- const JsonValueEncoder().convert(objectValue));
+ return new JsonEncoder.withIndent(' ')
+ .convert(const JsonValueEncoder().convert(objectValue));
}
}
@@ -120,6 +120,7 @@
void visitDouble(DoubleValue value, String indentation) {
buffer.write(value.value);
}
+
@override
void visitElement(ElementValue value, String indentation) {
buffer.write('Element(${value.id}):${value.element}');
@@ -209,4 +210,4 @@
void visitUri(UriValue value, String indentation) {
buffer.write('Uri(${value.value})');
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/serialization/keys.dart b/pkg/compiler/lib/src/serialization/keys.dart
index 7758be6..d74c820 100644
--- a/pkg/compiler/lib/src/serialization/keys.dart
+++ b/pkg/compiler/lib/src/serialization/keys.dart
@@ -9,6 +9,7 @@
static const Key ALIAS = const Key('alias');
static const Key ARGUMENTS = const Key('arguments');
static const Key BOUND = const Key('bound');
+ static const Key CACHED_TYPE = const Key('cachedType');
static const Key CALL_STRUCTURE = const Key('callStructure');
static const Key CALL_TYPE = const Key('callType');
static const Key CANONICAL_URI = const Key('canonicalUri');
@@ -34,6 +35,8 @@
static const Key FIELD = const Key('field');
static const Key FIELDS = const Key('fields');
static const Key FUNCTION = const Key('function');
+ static const Key GET_OR_SET = const Key('getOrSet');
+ static const Key GETTER = const Key('getter');
static const Key ID = const Key('id');
static const Key IMPACTS = const Key('impacts');
static const Key IMPORT = const Key('import');
@@ -71,6 +74,7 @@
static const Key NAMED_ARGUMENTS = const Key('named-arguments');
static const Key NAMED_PARAMETERS = const Key('named-parameters');
static const Key NAMED_PARAMETER_TYPES = const Key('named-parameter-types');
+ static const Key NEW_STRUCTURE = const Key('newStructure');
static const Key OFFSET = const Key('offset');
static const Key OPERATOR = const Key('operator');
static const Key OPTIONAL_PARAMETER_TYPES =
@@ -80,7 +84,12 @@
static const Key PREFIX = const Key('prefix');
static const Key RETURN_TYPE = const Key('return-type');
static const Key RIGHT = const Key('right');
+ static const Key SELECTOR = const Key('selector');
+ static const Key SEMANTICS = const Key('semantics');
+ static const Key SEND_STRUCTURE = const Key('sendStructure');
+ static const Key SETTER = const Key('setter');
static const Key STATIC_USES = const Key('static-uses');
+ static const Key SUB_KIND = const Key('subKind');
static const Key SUPERTYPE = const Key('supertype');
static const Key SUPERTYPES = const Key('supertypes');
static const Key SYMBOLS = const Key('symbols');
diff --git a/pkg/compiler/lib/src/serialization/modelz.dart b/pkg/compiler/lib/src/serialization/modelz.dart
index 7c02c7a..e06cb03 100644
--- a/pkg/compiler/lib/src/serialization/modelz.dart
+++ b/pkg/compiler/lib/src/serialization/modelz.dart
@@ -10,32 +10,25 @@
library dart2js.serialization.modelz;
import '../common.dart';
-import '../common/resolution.dart' show
- Resolution;
+import '../common/resolution.dart' show Resolution;
import '../constants/constructors.dart';
import '../constants/expressions.dart';
import '../core_types.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- FunctionSignatureX;
+import '../elements/modelx.dart' show FunctionSignatureX;
import '../elements/common.dart';
import '../elements/visitor.dart';
import '../io/source_file.dart';
import '../ordered_typeset.dart';
import '../resolution/class_members.dart' as class_members;
-import '../resolution/tree_elements.dart' show
- TreeElements;
-import '../resolution/scope.dart' show
- Scope;
+import '../resolution/tree_elements.dart' show TreeElements;
+import '../resolution/scope.dart' show Scope;
import '../script.dart';
import '../serialization/constant_serialization.dart';
-import '../tokens/token.dart' show
- Token;
+import '../tokens/token.dart' show Token;
import '../tree/tree.dart';
-import '../util/util.dart' show
- Link,
- LinkBuilder;
+import '../util/util.dart' show Link, LinkBuilder;
import 'keys.dart';
import 'serialization.dart';
@@ -259,7 +252,6 @@
Iterable<Element> get values => _lookupMap.values;
}
-
abstract class AnalyzableElementMixin implements AnalyzableElement, ElementZ {
@override
bool get hasTreeElements => _unsupported('hasTreeElements');
@@ -268,7 +260,6 @@
TreeElements get treeElements => _unsupported('treeElements');
}
-
abstract class AstElementMixin implements AstElement, ElementZ {
@override
bool get hasNode => _unsupported('hasNode');
@@ -295,8 +286,7 @@
@override
void forEachLocalMember(f(Element element)) {
- MapDecoder members =
- _decoder.getMap(Key.MEMBERS, isOptional: true);
+ MapDecoder members = _decoder.getMap(Key.MEMBERS, isOptional: true);
if (members == null) return;
members.forEachKey((String key) {
Element member = members.getElement(key);
@@ -352,9 +342,7 @@
}
class LibraryElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- ContainerMixin,
- LibraryElementCommon
+ with AnalyzableElementMixin, ContainerMixin, LibraryElementCommon
implements LibraryElement {
Uri _canonicalUri;
CompilationUnitElement _entryCompilationUnit;
@@ -364,8 +352,7 @@
ListedContainer _exportsMap;
ListedContainer _importsMap;
- LibraryElementZ(ObjectDecoder decoder)
- : super(decoder);
+ LibraryElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.LIBRARY;
@@ -406,8 +393,7 @@
@override
Link<CompilationUnitElement> get compilationUnits {
if (_compilationUnits == null) {
- _compilationUnits =
- toLink(_decoder.getElements(Key.COMPILATION_UNITS));
+ _compilationUnits = toLink(_decoder.getElements(Key.COMPILATION_UNITS));
}
return _compilationUnits;
}
@@ -453,7 +439,10 @@
}
@override
- Element findExported(String elementName) => _unsupported('findExported');
+ Element findExported(String elementName) {
+ _ensureExports();
+ return _exportsMap.lookup(elementName);
+ }
void _ensureImports() {
if (_importsMap == null) {
@@ -522,14 +511,12 @@
}
class CompilationUnitElementZ extends DeserializedElementZ
- with LibraryMemberMixin,
- CompilationUnitElementCommon
+ with LibraryMemberMixin, CompilationUnitElementCommon
implements CompilationUnitElement {
List<Element> _members;
Script _script;
- CompilationUnitElementZ(ObjectDecoder decoder)
- : super(decoder);
+ CompilationUnitElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.COMPILATION_UNIT;
@@ -548,8 +535,7 @@
@override
void forEachLocalMember(f(Element element)) {
if (_members == null) {
- _members =
- _decoder.getElements(Key.ELEMENTS, isOptional: true);
+ _members = _decoder.getElements(Key.ELEMENTS, isOptional: true);
}
_members.forEach(f);
}
@@ -567,7 +553,6 @@
String get name => script.name;
}
-
abstract class LibraryMemberMixin implements DeserializedElementZ {
LibraryElement _library;
CompilationUnitElement _compilationUnit;
@@ -644,8 +629,7 @@
bool get isStatic => true;
}
-abstract class TypedElementMixin
- implements DeserializedElementZ, TypedElement {
+abstract class TypedElementMixin implements DeserializedElementZ, TypedElement {
DartType _type;
@override
@@ -700,7 +684,7 @@
}
if (optionalParametersAreNamed) {
orderedOptionalParameters.sort((Element a, Element b) {
- return a.name.compareTo(b.name);
+ return a.name.compareTo(b.name);
});
}
@@ -741,8 +725,8 @@
@override
bool get isExternal {
- return _decoder.getBool(
- Key.IS_EXTERNAL, isOptional: true, defaultValue: false);
+ return _decoder.getBool(Key.IS_EXTERNAL,
+ isOptional: true, defaultValue: false);
}
}
@@ -804,18 +788,18 @@
void ensureResolved(Resolution resolution) {
resolution.registerClass(this);
}
-
}
class ClassElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- ClassElementCommon,
- class_members.ClassMemberMixin,
- ContainerMixin,
- LibraryMemberMixin,
- TypeDeclarationMixin<InterfaceType>,
- ClassElementMixin
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ ClassElementCommon,
+ class_members.ClassMemberMixin,
+ ContainerMixin,
+ LibraryMemberMixin,
+ TypeDeclarationMixin<InterfaceType>,
+ ClassElementMixin
implements ClassElement {
bool _isObject;
DartType _supertype;
@@ -823,8 +807,7 @@
Link<DartType> _interfaces;
FunctionType _callType;
- ClassElementZ(ObjectDecoder decoder)
- : super(decoder);
+ ClassElementZ(ObjectDecoder decoder) : super(decoder);
@override
List<DartType> _getTypeVariables() {
@@ -841,20 +824,19 @@
_interfaces = const Link<DartType>();
} else {
_isObject = false;
- _interfaces = toLink(
- _decoder.getTypes(Key.INTERFACES, isOptional: true));
+ _interfaces =
+ toLink(_decoder.getTypes(Key.INTERFACES, isOptional: true));
List<InterfaceType> mixins =
_decoder.getTypes(Key.MIXINS, isOptional: true);
for (InterfaceType mixin in mixins) {
MixinApplicationElement mixinElement =
new UnnamedMixinApplicationElementZ(this, supertype, mixin);
- supertype = mixinElement.thisType.subst(
- typeVariables, mixinElement.typeVariables);
+ supertype = mixinElement.thisType
+ .subst(typeVariables, mixinElement.typeVariables);
}
_supertype = supertype;
- _allSupertypesAndSelf =
- new OrderedTypeSetBuilder(this)
- .createOrderedTypeSet(_supertype, _interfaces);
+ _allSupertypesAndSelf = new OrderedTypeSetBuilder(this)
+ .createOrderedTypeSet(_supertype, _interfaces);
_callType = _decoder.getType(Key.CALL_TYPE, isOptional: true);
}
}
@@ -932,29 +914,26 @@
}
}
-
class NamedMixinApplicationElementZ extends ClassElementZ
- with MixinApplicationElementCommon,
- MixinApplicationElementMixin {
+ with MixinApplicationElementCommon, MixinApplicationElementMixin {
InterfaceType _mixinType;
- NamedMixinApplicationElementZ(ObjectDecoder decoder)
- : super(decoder);
+ NamedMixinApplicationElementZ(ObjectDecoder decoder) : super(decoder);
@override
- InterfaceType get mixinType =>_mixinType ??= _decoder.getType(Key.MIXIN);
+ InterfaceType get mixinType => _mixinType ??= _decoder.getType(Key.MIXIN);
}
-
class UnnamedMixinApplicationElementZ extends ElementZ
- with ClassElementCommon,
- ClassElementMixin,
- class_members.ClassMemberMixin,
- TypeDeclarationMixin<InterfaceType>,
- AnalyzableElementMixin,
- AstElementMixin,
- MixinApplicationElementCommon,
- MixinApplicationElementMixin {
+ with
+ ClassElementCommon,
+ ClassElementMixin,
+ class_members.ClassMemberMixin,
+ TypeDeclarationMixin<InterfaceType>,
+ AnalyzableElementMixin,
+ AstElementMixin,
+ MixinApplicationElementCommon,
+ MixinApplicationElementMixin {
final String name;
final ClassElement _subclass;
final InterfaceType supertype;
@@ -962,8 +941,7 @@
OrderedTypeSet _allSupertypesAndSelf;
UnnamedMixinApplicationElementZ(
- ClassElement subclass,
- InterfaceType supertype, InterfaceType mixin)
+ ClassElement subclass, InterfaceType supertype, InterfaceType mixin)
: this._subclass = subclass,
this.supertype = supertype,
this.interfaces = const Link<DartType>().prepend(mixin),
@@ -1006,9 +984,8 @@
@override
OrderedTypeSet get allSupertypesAndSelf {
if (_allSupertypesAndSelf == null) {
- _allSupertypesAndSelf =
- new OrderedTypeSetBuilder(this)
- .createOrderedTypeSet(supertype, interfaces);
+ _allSupertypesAndSelf = new OrderedTypeSetBuilder(this)
+ .createOrderedTypeSet(supertype, interfaces);
}
return _allSupertypesAndSelf;
}
@@ -1032,12 +1009,10 @@
SourceSpan get sourcePosition => _subclass.sourcePosition;
}
-
class EnumClassElementZ extends ClassElementZ implements EnumClassElement {
List<FieldElement> _enumValues;
- EnumClassElementZ(ObjectDecoder decoder)
- : super(decoder);
+ EnumClassElementZ(ObjectDecoder decoder) : super(decoder);
@override
bool get isEnumClass => true;
@@ -1052,18 +1027,18 @@
}
abstract class ConstructorElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- ClassMemberMixin,
- FunctionTypedElementMixin,
- ParametersMixin,
- TypedElementMixin,
- MemberElementMixin
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ ClassMemberMixin,
+ FunctionTypedElementMixin,
+ ParametersMixin,
+ TypedElementMixin,
+ MemberElementMixin
implements ConstructorElement {
ConstantConstructor _constantConstructor;
- ConstructorElementZ(ObjectDecoder decoder)
- : super(decoder);
+ ConstructorElementZ(ObjectDecoder decoder) : super(decoder);
accept(ElementVisitor visitor, arg) {
return visitor.visitConstructorElement(this, arg);
@@ -1077,8 +1052,8 @@
bool get isFromEnvironmentConstructor {
return name == 'fromEnvironment' &&
- library.isDartCore &&
- (enclosingClass.name == 'bool' ||
+ library.isDartCore &&
+ (enclosingClass.name == 'bool' ||
enclosingClass.name == 'int' ||
enclosingClass.name == 'String');
}
@@ -1105,17 +1080,17 @@
}
@override
- ConstructorElement get definingConstructor {
+ ConstructorElement get definingConstructor {
return _unsupported('definingConstructor');
}
@override
- ConstructorElement get effectiveTarget {
+ ConstructorElement get effectiveTarget {
return _unsupported('effectiveTarget');
}
@override
- ConstructorElement get immediateRedirectionTarget {
+ ConstructorElement get immediateRedirectionTarget {
return _unsupported('immediateRedirectionTarget');
}
@@ -1134,14 +1109,13 @@
bool get isCyclicRedirection => _unsupported('isCyclicRedirection');
@override
- PrefixElement get redirectionDeferredPrefix {
+ PrefixElement get redirectionDeferredPrefix {
return _unsupported('redirectionDeferredPrefix');
}
}
class GenerativeConstructorElementZ extends ConstructorElementZ {
- GenerativeConstructorElementZ(ObjectDecoder decoder)
- : super(decoder);
+ GenerativeConstructorElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.GENERATIVE_CONSTRUCTOR;
@@ -1152,9 +1126,7 @@
}
class FactoryConstructorElementZ extends ConstructorElementZ {
-
- FactoryConstructorElementZ(ObjectDecoder decoder)
- : super(decoder);
+ FactoryConstructorElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.FACTORY_CONSTRUCTOR;
@@ -1165,8 +1137,7 @@
}
class ForwardingConstructorElementZ extends ElementZ
- with AnalyzableElementMixin,
- AstElementMixin
+ with AnalyzableElementMixin, AstElementMixin
implements ConstructorElement {
final MixinApplicationElement enclosingClass;
final ConstructorElement definingConstructor;
@@ -1210,7 +1181,7 @@
}
@override
- bool get hasFunctionSignature {
+ bool get hasFunctionSignature {
return _unsupported('hasFunctionSignature');
}
@@ -1277,7 +1248,6 @@
abstract class MemberElementMixin
implements DeserializedElementZ, MemberElement {
-
@override
MemberElement get memberContext => this;
@@ -1286,19 +1256,18 @@
@override
List<FunctionElement> get nestedClosures => const <FunctionElement>[];
-
}
abstract class FieldElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- TypedElementMixin,
- MemberElementMixin
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ TypedElementMixin,
+ MemberElementMixin
implements FieldElement {
ConstantExpression _constant;
- FieldElementZ(ObjectDecoder decoder)
- : super(decoder);
+ FieldElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.FIELD;
@@ -1326,34 +1295,37 @@
Expression get initializer => _unsupported('initializer');
}
-
class TopLevelFieldElementZ extends FieldElementZ with LibraryMemberMixin {
- TopLevelFieldElementZ(ObjectDecoder decoder)
- : super(decoder);
+ TopLevelFieldElementZ(ObjectDecoder decoder) : super(decoder);
}
class StaticFieldElementZ extends FieldElementZ
with ClassMemberMixin, StaticMemberMixin {
- StaticFieldElementZ(ObjectDecoder decoder)
- : super(decoder);
+ StaticFieldElementZ(ObjectDecoder decoder) : super(decoder);
+}
+
+class EnumConstantElementZ extends StaticFieldElementZ
+ implements EnumConstantElement {
+ EnumConstantElementZ(ObjectDecoder decoder) : super(decoder);
+
+ int get index => _decoder.getInt(Key.INDEX);
}
class InstanceFieldElementZ extends FieldElementZ
with ClassMemberMixin, InstanceMemberMixin {
- InstanceFieldElementZ(ObjectDecoder decoder)
- : super(decoder);
+ InstanceFieldElementZ(ObjectDecoder decoder) : super(decoder);
}
abstract class FunctionElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- ParametersMixin,
- FunctionTypedElementMixin,
- TypedElementMixin,
- MemberElementMixin
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ ParametersMixin,
+ FunctionTypedElementMixin,
+ TypedElementMixin,
+ MemberElementMixin
implements MethodElement {
- FunctionElementZ(ObjectDecoder decoder)
- : super(decoder);
+ FunctionElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.FUNCTION;
@@ -1369,20 +1341,17 @@
class TopLevelFunctionElementZ extends FunctionElementZ
with LibraryMemberMixin {
- TopLevelFunctionElementZ(ObjectDecoder decoder)
- : super(decoder);
+ TopLevelFunctionElementZ(ObjectDecoder decoder) : super(decoder);
}
class StaticFunctionElementZ extends FunctionElementZ
with ClassMemberMixin, StaticMemberMixin {
- StaticFunctionElementZ(ObjectDecoder decoder)
- : super(decoder);
+ StaticFunctionElementZ(ObjectDecoder decoder) : super(decoder);
}
class InstanceFunctionElementZ extends FunctionElementZ
with ClassMemberMixin, InstanceMemberMixin {
- InstanceFunctionElementZ(ObjectDecoder decoder)
- : super(decoder);
+ InstanceFunctionElementZ(ObjectDecoder decoder) : super(decoder);
}
abstract class LocalExecutableMixin
@@ -1422,14 +1391,14 @@
}
class LocalFunctionElementZ extends DeserializedElementZ
- with LocalExecutableMixin,
- AstElementMixin,
- ParametersMixin,
- FunctionTypedElementMixin,
- TypedElementMixin
+ with
+ LocalExecutableMixin,
+ AstElementMixin,
+ ParametersMixin,
+ FunctionTypedElementMixin,
+ TypedElementMixin
implements LocalFunctionElement {
- LocalFunctionElementZ(ObjectDecoder decoder)
- : super(decoder);
+ LocalFunctionElementZ(ObjectDecoder decoder) : super(decoder);
@override
accept(ElementVisitor visitor, arg) {
@@ -1441,19 +1410,18 @@
}
abstract class GetterElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- FunctionTypedElementMixin,
- ParametersMixin,
- TypedElementMixin,
- MemberElementMixin
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ FunctionTypedElementMixin,
+ ParametersMixin,
+ TypedElementMixin,
+ MemberElementMixin
implements GetterElement {
-
AbstractFieldElement abstractField;
SetterElement setter;
- GetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ GetterElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.GETTER;
@@ -1465,36 +1433,32 @@
}
class TopLevelGetterElementZ extends GetterElementZ with LibraryMemberMixin {
- TopLevelGetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ TopLevelGetterElementZ(ObjectDecoder decoder) : super(decoder);
}
class StaticGetterElementZ extends GetterElementZ
with ClassMemberMixin, StaticMemberMixin {
- StaticGetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ StaticGetterElementZ(ObjectDecoder decoder) : super(decoder);
}
class InstanceGetterElementZ extends GetterElementZ
with ClassMemberMixin, InstanceMemberMixin {
- InstanceGetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ InstanceGetterElementZ(ObjectDecoder decoder) : super(decoder);
}
abstract class SetterElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- FunctionTypedElementMixin,
- ParametersMixin,
- TypedElementMixin,
- MemberElementMixin
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ FunctionTypedElementMixin,
+ ParametersMixin,
+ TypedElementMixin,
+ MemberElementMixin
implements SetterElement {
-
AbstractFieldElement abstractField;
GetterElement getter;
- SetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ SetterElementZ(ObjectDecoder decoder) : super(decoder);
@override
ElementKind get kind => ElementKind.SETTER;
@@ -1506,20 +1470,17 @@
}
class TopLevelSetterElementZ extends SetterElementZ with LibraryMemberMixin {
- TopLevelSetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ TopLevelSetterElementZ(ObjectDecoder decoder) : super(decoder);
}
class StaticSetterElementZ extends SetterElementZ
with ClassMemberMixin, StaticMemberMixin {
- StaticSetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ StaticSetterElementZ(ObjectDecoder decoder) : super(decoder);
}
class InstanceSetterElementZ extends SetterElementZ
with ClassMemberMixin, InstanceMemberMixin {
- InstanceSetterElementZ(ObjectDecoder decoder)
- : super(decoder);
+ InstanceSetterElementZ(ObjectDecoder decoder) : super(decoder);
}
abstract class TypeDeclarationMixin<T extends GenericType>
@@ -1575,16 +1536,16 @@
}
class TypedefElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- LibraryMemberMixin,
- ParametersMixin,
- TypeDeclarationMixin<TypedefType>
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ LibraryMemberMixin,
+ ParametersMixin,
+ TypeDeclarationMixin<TypedefType>
implements TypedefElement {
DartType _alias;
- TypedefElementZ(ObjectDecoder decoder)
- : super(decoder);
+ TypedefElementZ(ObjectDecoder decoder) : super(decoder);
TypedefType _createType(List<DartType> typeArguments) {
return new TypedefType(this, typeArguments);
@@ -1619,17 +1580,14 @@
}
class TypeVariableElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- TypedElementMixin
+ with AnalyzableElementMixin, AstElementMixin, TypedElementMixin
implements TypeVariableElement {
TypeDeclarationElement _typeDeclaration;
TypeVariableType _type;
DartType _bound;
Name _memberName;
- TypeVariableElementZ(ObjectDecoder decoder)
- : super(decoder);
+ TypeVariableElementZ(ObjectDecoder decoder) : super(decoder);
Name get memberName {
if (_memberName == null) {
@@ -1663,8 +1621,7 @@
@override
TypeDeclarationElement get typeDeclaration {
if (_typeDeclaration == null) {
- _typeDeclaration =
- _decoder.getElement(Key.TYPE_DECLARATION);
+ _typeDeclaration = _decoder.getElement(Key.TYPE_DECLARATION);
}
return _typeDeclaration;
}
@@ -1681,8 +1638,7 @@
}
class SyntheticTypeVariableElementZ extends ElementZ
- with AnalyzableElementMixin,
- AstElementMixin
+ with AnalyzableElementMixin, AstElementMixin
implements TypeVariableElement {
final TypeDeclarationElement typeDeclaration;
final int index;
@@ -1716,7 +1672,7 @@
@override
TypeVariableType get type {
assert(invariant(this, _type != null,
- message: "Type variable type has not been set on $this."));
+ message: "Type variable type has not been set on $this."));
return _type;
}
@@ -1743,9 +1699,7 @@
}
class ParameterElementZ extends DeserializedElementZ
- with AnalyzableElementMixin,
- AstElementMixin,
- TypedElementMixin
+ with AnalyzableElementMixin, AstElementMixin, TypedElementMixin
implements ParameterElement {
FunctionElement _functionDeclaration;
ConstantExpression _constant;
@@ -1814,8 +1768,7 @@
implements InitializingFormalElement {
FieldElement _fieldElement;
- InitializingFormalElementZ(ObjectDecoder decoder)
- : super(decoder);
+ InitializingFormalElementZ(ObjectDecoder decoder) : super(decoder);
@override
FieldElement get fieldElement {
@@ -1834,15 +1787,56 @@
ElementKind get kind => ElementKind.INITIALIZING_FORMAL;
}
+class LocalVariableElementZ extends DeserializedElementZ
+ with
+ AnalyzableElementMixin,
+ AstElementMixin,
+ LocalExecutableMixin,
+ TypedElementMixin
+ implements LocalVariableElement {
+ bool _isConst;
+ ConstantExpression _constant;
+
+ LocalVariableElementZ(ObjectDecoder decoder) : super(decoder);
+
+ @override
+ accept(ElementVisitor visitor, arg) {
+ return visitor.visitLocalVariableElement(this, arg);
+ }
+
+ @override
+ ElementKind get kind => ElementKind.VARIABLE;
+
+ @override
+ bool get isConst {
+ if (_isConst == null) {
+ _constant = _decoder.getConstant(Key.CONSTANT);
+ _isConst = _constant != null;
+ }
+ return _isConst;
+ }
+
+ @override
+ ConstantExpression get constant {
+ if (isConst) {
+ return _constant;
+ }
+ return null;
+ }
+
+ @override
+ Expression get initializer => _unsupported('initializer');
+}
+
class ImportElementZ extends DeserializedElementZ
- with LibraryMemberMixin implements ImportElement {
+ with LibraryMemberMixin
+ implements ImportElement {
bool _isDeferred;
PrefixElement _prefix;
LibraryElement _importedLibrary;
Uri _uri;
- ImportElementZ(ObjectDecoder decoder)
- : super(decoder);
+ ImportElementZ(ObjectDecoder decoder) : super(decoder);
@override
String get name => '';
@@ -1895,12 +1889,12 @@
}
class ExportElementZ extends DeserializedElementZ
- with LibraryMemberMixin implements ExportElement {
+ with LibraryMemberMixin
+ implements ExportElement {
LibraryElement _exportedLibrary;
Uri _uri;
- ExportElementZ(ObjectDecoder decoder)
- : super(decoder);
+ ExportElementZ(ObjectDecoder decoder) : super(decoder);
@override
String get name => '';
@@ -1934,12 +1928,12 @@
}
class PrefixElementZ extends DeserializedElementZ
- with LibraryMemberMixin implements PrefixElement {
+ with LibraryMemberMixin
+ implements PrefixElement {
bool _isDeferred;
ImportElement _deferredImport;
- PrefixElementZ(ObjectDecoder decoder)
- : super(decoder);
+ PrefixElementZ(ObjectDecoder decoder) : super(decoder);
@override
accept(ElementVisitor visitor, arg) => visitor.visitPrefixElement(this, arg);
diff --git a/pkg/compiler/lib/src/serialization/resolved_ast_serialization.dart b/pkg/compiler/lib/src/serialization/resolved_ast_serialization.dart
new file mode 100644
index 0000000..d25426e
--- /dev/null
+++ b/pkg/compiler/lib/src/serialization/resolved_ast_serialization.dart
@@ -0,0 +1,422 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization.resolved_ast;
+
+import '../common.dart';
+import '../common/resolution.dart';
+import '../constants/expressions.dart';
+import '../dart_types.dart';
+import '../diagnostics/diagnostic_listener.dart';
+import '../elements/elements.dart';
+import '../parser/parser.dart' show Parser;
+import '../parser/listener.dart' show ParserError;
+import '../parser/node_listener.dart' show NodeListener;
+import '../resolution/enum_creator.dart';
+import '../resolution/send_structure.dart';
+import '../resolution/tree_elements.dart';
+import '../tree/tree.dart';
+import '../tokens/token.dart';
+import '../universe/selector.dart';
+import 'keys.dart';
+import 'serialization.dart';
+import 'serialization_util.dart';
+
+/// Visitor that computes a node-index mapping.
+class AstIndexComputer extends Visitor {
+ final Map<Node, int> nodeIndices = <Node, int>{};
+ final List<Node> nodeList = <Node>[];
+
+ @override
+ visitNode(Node node) {
+ nodeIndices.putIfAbsent(node, () {
+ // Some nodes (like Modifier and empty NodeList) can be reused.
+ nodeList.add(node);
+ return nodeIndices.length;
+ });
+ node.visitChildren(this);
+ }
+}
+
+/// The kind of AST node. Used for determining how to deserialize
+/// [ResolvedAst]s.
+enum AstKind {
+ ENUM_CONSTRUCTOR,
+ ENUM_CONSTANT,
+ ENUM_INDEX_FIELD,
+ ENUM_VALUES_FIELD,
+ ENUM_TO_STRING,
+ FACTORY,
+ FIELD,
+ FUNCTION,
+}
+
+/// Serializer for [ResolvedAst]s.
+class ResolvedAstSerializer extends Visitor {
+ final ObjectEncoder objectEncoder;
+ final ResolvedAst resolvedAst;
+ final AstIndexComputer indexComputer = new AstIndexComputer();
+ final Map<int, ObjectEncoder> nodeData = <int, ObjectEncoder>{};
+ ListEncoder _nodeDataEncoder;
+
+ ResolvedAstSerializer(this.objectEncoder, this.resolvedAst);
+
+ AstElement get element => resolvedAst.element;
+
+ TreeElements get elements => resolvedAst.elements;
+
+ Node get root => resolvedAst.node;
+
+ Map<Node, int> get nodeIndices => indexComputer.nodeIndices;
+ List<Node> get nodeList => indexComputer.nodeList;
+
+ /// Serializes [resolvedAst] into [objectEncoder].
+ void serialize() {
+ objectEncoder.setUri(
+ Key.URI,
+ elements.analyzedElement.compilationUnit.script.resourceUri,
+ elements.analyzedElement.compilationUnit.script.resourceUri);
+ AstKind kind;
+ if (element.enclosingClass is EnumClassElement) {
+ if (element.name == 'index') {
+ kind = AstKind.ENUM_INDEX_FIELD;
+ } else if (element.name == 'values') {
+ kind = AstKind.ENUM_VALUES_FIELD;
+ } else if (element.name == 'toString') {
+ kind = AstKind.ENUM_TO_STRING;
+ } else if (element.isConstructor) {
+ kind = AstKind.ENUM_CONSTRUCTOR;
+ } else {
+ assert(invariant(element, element.isConst,
+ message: "Unexpected enum member: $element"));
+ kind = AstKind.ENUM_CONSTANT;
+ }
+ } else {
+ // [element] has a body that we'll need to re-parse. We store where to
+ // start parsing from.
+ objectEncoder.setInt(Key.OFFSET, root.getBeginToken().charOffset);
+ if (element.isFactoryConstructor) {
+ kind = AstKind.FACTORY;
+ } else if (element.isField) {
+ kind = AstKind.FIELD;
+ } else {
+ kind = AstKind.FUNCTION;
+ FunctionExpression functionExpression = root.asFunctionExpression();
+ if (functionExpression.getOrSet != null) {
+ // Getters/setters need the get/set token to be parsed.
+ objectEncoder.setInt(
+ Key.GET_OR_SET, functionExpression.getOrSet.charOffset);
+ }
+ }
+ }
+ objectEncoder.setEnum(Key.KIND, kind);
+ root.accept(indexComputer);
+ root.accept(this);
+ }
+
+ /// Computes the [ListEncoder] for serializing data for nodes.
+ ListEncoder get nodeDataEncoder {
+ if (_nodeDataEncoder == null) {
+ _nodeDataEncoder = objectEncoder.createList(Key.DATA);
+ }
+ return _nodeDataEncoder;
+ }
+
+ /// Computes the [ObjectEncoder] for serializing data for [node].
+ ObjectEncoder getNodeDataEncoder(Node node) {
+ int id = nodeIndices[node];
+ return nodeData.putIfAbsent(id, () {
+ ObjectEncoder objectEncoder = nodeDataEncoder.createObject();
+ objectEncoder.setInt(Key.ID, id);
+ return objectEncoder;
+ });
+ }
+
+ @override
+ visitNode(Node node) {
+ Element nodeElement = elements[node];
+ if (nodeElement != null) {
+ if (nodeElement.enclosingClass != null &&
+ nodeElement.enclosingClass.isUnnamedMixinApplication) {
+ // TODO(johnniwinther): Handle references to members of unnamed mixin
+ // applications.
+ } else {
+ getNodeDataEncoder(node).setElement(Key.ELEMENT, nodeElement);
+ }
+ }
+ DartType type = elements.getType(node);
+ if (type != null) {
+ getNodeDataEncoder(node).setType(Key.TYPE, type);
+ }
+ Selector selector = elements.getSelector(node);
+ if (selector != null) {
+ serializeSelector(
+ selector, getNodeDataEncoder(node).createObject(Key.SELECTOR));
+ }
+ ConstantExpression constant = elements.getConstant(node);
+ if (constant != null) {
+ getNodeDataEncoder(node).setConstant(Key.CONSTANT, constant);
+ }
+ DartType cachedType = elements.typesCache[node];
+ if (cachedType != null) {
+ getNodeDataEncoder(node).setType(Key.CACHED_TYPE, cachedType);
+ }
+ // TODO(johnniwinther): Serialize [JumpTarget]s.
+ node.visitChildren(this);
+ }
+
+ @override
+ visitSend(Send node) {
+ visitExpression(node);
+ SendStructure structure = elements.getSendStructure(node);
+ if (structure != null) {
+ serializeSendStructure(
+ structure, getNodeDataEncoder(node).createObject(Key.SEND_STRUCTURE));
+ }
+ }
+
+ @override
+ visitNewExpression(NewExpression node) {
+ visitExpression(node);
+ NewStructure structure = elements.getNewStructure(node);
+ if (structure != null) {
+ serializeNewStructure(
+ structure, getNodeDataEncoder(node).createObject(Key.NEW_STRUCTURE));
+ }
+ }
+
+ @override
+ visitGotoStatement(GotoStatement node) {
+ visitStatement(node);
+ // TODO(johnniwinther): Serialize [JumpTarget]s and [LabelDefinition]s.
+ }
+
+ @override
+ visitLabel(Label node) {
+ visitNode(node);
+ // TODO(johnniwinther): Serialize[LabelDefinition]s.
+ }
+}
+
+class ResolvedAstDeserializer {
+ /// Find the [Token] at [offset] searching through successors of [token].
+ static Token findTokenInStream(Token token, int offset) {
+ while (token.charOffset <= offset && token.next != token) {
+ if (token.charOffset == offset) {
+ return token;
+ }
+ token = token.next;
+ }
+ return null;
+ }
+
+ /// Deserializes the [ResolvedAst] for [element] from [objectDecoder].
+ /// [parsing] and [getBeginToken] are used for parsing the [Node] for
+ /// [element] from its source code.
+ static ResolvedAst deserialize(Element element, ObjectDecoder objectDecoder,
+ Parsing parsing, Token getBeginToken(Uri uri, int charOffset)) {
+ CompilationUnitElement compilationUnit = element.compilationUnit;
+ DiagnosticReporter reporter = parsing.reporter;
+
+ /// Returns the first [Token] for parsing the [Node] for [element].
+ Token readBeginToken() {
+ Uri uri = objectDecoder.getUri(Key.URI);
+ int charOffset = objectDecoder.getInt(Key.OFFSET);
+ Token beginToken = getBeginToken(uri, charOffset);
+ if (beginToken == null) {
+ reporter.internalError(
+ element, "No token found for $element in $uri @ $charOffset");
+ }
+ return beginToken;
+ }
+
+ /// Create the [Node] for the element by parsing the source code.
+ Node doParse(parse(Parser parser)) {
+ return parsing.measure(() {
+ return reporter.withCurrentElement(element, () {
+ CompilationUnitElement unit = element.compilationUnit;
+ NodeListener listener = new NodeListener(
+ parsing.getScannerOptionsFor(element), reporter, null);
+ listener.memberErrors = listener.memberErrors.prepend(false);
+ try {
+ Parser parser = new Parser(listener, parsing.parserOptions);
+ parse(parser);
+ } on ParserError catch (e) {
+ reporter.internalError(element, '$e');
+ }
+ return listener.popNode();
+ });
+ });
+ }
+
+ /// Computes the [Node] for the element based on the [AstKind].
+ Node computeNode(AstKind kind) {
+ switch (kind) {
+ case AstKind.ENUM_INDEX_FIELD:
+ AstBuilder builder = new AstBuilder(element.sourcePosition.begin);
+ Identifier identifier = builder.identifier('index');
+ VariableDefinitions node = new VariableDefinitions(
+ null,
+ builder.modifiers(isFinal: true),
+ new NodeList.singleton(identifier));
+ return node;
+ case AstKind.ENUM_VALUES_FIELD:
+ EnumClassElement enumClass = element.enclosingClass;
+ AstBuilder builder = new AstBuilder(element.sourcePosition.begin);
+ List<FieldElement> enumValues = <FieldElement>[];
+ List<Node> valueReferences = <Node>[];
+ for (EnumConstantElement enumConstant in enumClass.enumValues) {
+ AstBuilder valueBuilder =
+ new AstBuilder(enumConstant.sourcePosition.begin);
+ Identifier name = valueBuilder.identifier(enumConstant.name);
+
+ // Add reference for the `values` field.
+ valueReferences.add(valueBuilder.reference(name));
+ }
+
+ Identifier valuesIdentifier = builder.identifier('values');
+ // TODO(johnniwinther): Add type argument.
+ Expression initializer =
+ builder.listLiteral(valueReferences, isConst: true);
+
+ Node definition =
+ builder.createDefinition(valuesIdentifier, initializer);
+ VariableDefinitions node = new VariableDefinitions(
+ null,
+ builder.modifiers(isStatic: true, isConst: true),
+ new NodeList.singleton(definition));
+ return node;
+ case AstKind.ENUM_TO_STRING:
+ EnumClassElement enumClass = element.enclosingClass;
+ AstBuilder builder = new AstBuilder(element.sourcePosition.begin);
+ List<LiteralMapEntry> mapEntries = <LiteralMapEntry>[];
+ for (EnumConstantElement enumConstant in enumClass.enumValues) {
+ AstBuilder valueBuilder =
+ new AstBuilder(enumConstant.sourcePosition.begin);
+ Identifier name = valueBuilder.identifier(enumConstant.name);
+
+ // Add map entry for `toString` implementation.
+ mapEntries.add(valueBuilder.mapLiteralEntry(
+ valueBuilder.literalInt(enumConstant.index),
+ valueBuilder
+ .literalString('${enumClass.name}.${name.source}')));
+ }
+
+ // TODO(johnniwinther): Support return type. Note `String` might be
+ // prefixed or not imported within the current library.
+ FunctionExpression toStringNode = builder.functionExpression(
+ Modifiers.EMPTY,
+ 'toString',
+ builder.argumentList([]),
+ builder.returnStatement(builder.indexGet(
+ builder.mapLiteral(mapEntries, isConst: true),
+ builder.reference(builder.identifier('index')))));
+ return toStringNode;
+ case AstKind.ENUM_CONSTRUCTOR:
+ AstBuilder builder = new AstBuilder(element.sourcePosition.begin);
+ VariableDefinitions indexDefinition =
+ builder.initializingFormal('index');
+ FunctionExpression constructorNode = builder.functionExpression(
+ builder.modifiers(isConst: true),
+ element.enclosingClass.name,
+ builder.argumentList([indexDefinition]),
+ builder.emptyStatement());
+ return constructorNode;
+ case AstKind.ENUM_CONSTANT:
+ EnumConstantElement enumConstant = element;
+ EnumClassElement enumClass = element.enclosingClass;
+ int index = enumConstant.index;
+ AstBuilder builder = new AstBuilder(element.sourcePosition.begin);
+ Identifier name = builder.identifier(element.name);
+
+ Expression initializer = builder.newExpression(
+ enumClass.name, builder.argumentList([builder.literalInt(index)]),
+ isConst: true);
+ SendSet definition = builder.createDefinition(name, initializer);
+
+ VariableDefinitions node = new VariableDefinitions(
+ null,
+ builder.modifiers(isStatic: true, isConst: true),
+ new NodeList.singleton(definition));
+ return node;
+ case AstKind.FACTORY:
+ Token beginToken = readBeginToken();
+ return doParse((parser) => parser.parseFactoryMethod(beginToken));
+ case AstKind.FIELD:
+ Token beginToken = readBeginToken();
+ return doParse((parser) => parser.parseMember(beginToken));
+ case AstKind.FUNCTION:
+ Token beginToken = readBeginToken();
+ int getOrSetOffset =
+ objectDecoder.getInt(Key.GET_OR_SET, isOptional: true);
+ Token getOrSet;
+ if (getOrSetOffset != null) {
+ getOrSet = findTokenInStream(beginToken, getOrSetOffset);
+ if (getOrSet == null) {
+ reporter.internalError(
+ element,
+ "No token found for $element in "
+ "${objectDecoder.getUri(Key.URI)} @ $getOrSetOffset");
+ }
+ }
+ return doParse((parser) {
+ parser.parseFunction(beginToken, getOrSet);
+ });
+ }
+ }
+
+ AstKind kind = objectDecoder.getEnum(Key.KIND, AstKind.values);
+ Node root = computeNode(kind);
+ TreeElementMapping elements = new TreeElementMapping(element);
+ AstIndexComputer indexComputer = new AstIndexComputer();
+ Map<Node, int> nodeIndices = indexComputer.nodeIndices;
+ List<Node> nodeList = indexComputer.nodeList;
+ root.accept(indexComputer);
+ ListDecoder dataDecoder = objectDecoder.getList(Key.DATA);
+ if (dataDecoder != null) {
+ for (int i = 0; i < dataDecoder.length; i++) {
+ ObjectDecoder objectDecoder = dataDecoder.getObject(i);
+ int id = objectDecoder.getInt(Key.ID);
+ Node node = nodeList[id];
+ Element nodeElement =
+ objectDecoder.getElement(Key.ELEMENT, isOptional: true);
+ if (nodeElement != null) {
+ elements[node] = nodeElement;
+ }
+ DartType type = objectDecoder.getType(Key.TYPE, isOptional: true);
+ if (type != null) {
+ elements.setType(node, type);
+ }
+ ObjectDecoder selectorDecoder =
+ objectDecoder.getObject(Key.SELECTOR, isOptional: true);
+ if (selectorDecoder != null) {
+ elements.setSelector(node, deserializeSelector(selectorDecoder));
+ }
+ ConstantExpression constant =
+ objectDecoder.getConstant(Key.CONSTANT, isOptional: true);
+ if (constant != null) {
+ elements.setConstant(node, constant);
+ }
+ DartType cachedType =
+ objectDecoder.getType(Key.CACHED_TYPE, isOptional: true);
+ if (cachedType != null) {
+ elements.typesCache[node] = cachedType;
+ }
+ ObjectDecoder sendStructureDecoder =
+ objectDecoder.getObject(Key.SEND_STRUCTURE, isOptional: true);
+ if (sendStructureDecoder != null) {
+ elements.setSendStructure(
+ node, deserializeSendStructure(sendStructureDecoder));
+ }
+ ObjectDecoder newStructureDecoder =
+ objectDecoder.getObject(Key.NEW_STRUCTURE, isOptional: true);
+ if (newStructureDecoder != null) {
+ elements.setNewStructure(
+ node, deserializeNewStructure(newStructureDecoder));
+ }
+ }
+ }
+ return new ResolvedAst(element, root, elements);
+ }
+}
diff --git a/pkg/compiler/lib/src/serialization/serialization.dart b/pkg/compiler/lib/src/serialization/serialization.dart
index 6f046d4..1521f39 100644
--- a/pkg/compiler/lib/src/serialization/serialization.dart
+++ b/pkg/compiler/lib/src/serialization/serialization.dart
@@ -27,7 +27,7 @@
/// Creates an [ObjectEncoder] in the scope of [serializer] that uses [map]
/// as its internal storage.
ObjectEncoder(Serializer serializer, Map<dynamic, Value> map)
- : super(serializer, map);
+ : super(serializer, map);
String get _name => 'Object';
}
@@ -97,7 +97,6 @@
_map[key] = value;
}
-
/// Maps the [key] entry to the enum [value] in the encoded object.
void setEnum(K key, var value) {
_checkKey(key);
@@ -127,8 +126,8 @@
void setElements(K key, Iterable<Element> elements) {
_checkKey(key);
if (elements.isNotEmpty) {
- _map[key] = new ListValue(
- elements.map(_serializer.createElementValue).toList());
+ _map[key] =
+ new ListValue(elements.map(_serializer.createElementValue).toList());
}
}
@@ -252,8 +251,7 @@
class ObjectDecoder extends AbstractDecoder<Key> {
/// Creates an [ObjectDecoder] that decodes [map] into deserialized values
/// using [deserializer] to create canonicalized values.
- ObjectDecoder(Deserializer deserializer, Map map)
- : super(deserializer, map);
+ ObjectDecoder(Deserializer deserializer, Map map) : super(deserializer, map);
@override
_getKeyValue(Key key) => _deserializer.decoder.getObjectPropertyValue(key);
@@ -695,7 +693,7 @@
ObjectEncoder encoder = new ObjectEncoder(this, dataObject.map);
encoder.setUri(Key.URI, library.canonicalUri, library.canonicalUri);
} else if (element.isStatic) {
- Value classId =_getElementId(element.enclosingClass);
+ Value classId = _getElementId(element.enclosingClass);
_elementMap[element] = dataObject = new DataObject(
new IntValue(_elementMap.length),
new EnumValue(SerializedElementKind.EXTERNAL_STATIC_MEMBER));
@@ -703,7 +701,7 @@
encoder.setValue(Key.CLASS, classId);
encoder.setString(Key.NAME, element.name);
} else if (element.isConstructor) {
- Value classId =_getElementId(element.enclosingClass);
+ Value classId = _getElementId(element.enclosingClass);
_elementMap[element] = dataObject = new DataObject(
new IntValue(_elementMap.length),
new EnumValue(SerializedElementKind.EXTERNAL_CONSTRUCTOR));
@@ -711,7 +709,7 @@
encoder.setValue(Key.CLASS, classId);
encoder.setString(Key.NAME, element.name);
} else {
- Value libraryId =_getElementId(element.library);
+ Value libraryId = _getElementId(element.library);
_elementMap[element] = dataObject = new DataObject(
new IntValue(_elementMap.length),
new EnumValue(SerializedElementKind.EXTERNAL_LIBRARY_MEMBER));
@@ -780,8 +778,8 @@
/// Encodes [constant] into the [ObjectValue] of [dataObject].
void _encodeConstant(ConstantExpression constant, DataObject dataObject) {
- const ConstantSerializer().visit(constant,
- new ObjectEncoder(this, dataObject.map));
+ const ConstantSerializer()
+ .visit(constant, new ObjectEncoder(this, dataObject.map));
}
/// Creates the [ConstantValue] for [constant].
@@ -997,7 +995,7 @@
// this case.
for (DeserializerPlugin plugin in plugins) {
plugin.onElement(element,
- (String tag) => pluginData?.getObject(tag, isOptional: true));
+ (String tag) => pluginData?.getObject(tag, isOptional: true));
}
}
return element;
diff --git a/pkg/compiler/lib/src/serialization/serialization_util.dart b/pkg/compiler/lib/src/serialization/serialization_util.dart
new file mode 100644
index 0000000..cd5e77a
--- /dev/null
+++ b/pkg/compiler/lib/src/serialization/serialization_util.dart
@@ -0,0 +1,481 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization.util;
+
+import '../dart_types.dart';
+import '../common/resolution.dart';
+import '../constants/expressions.dart';
+import '../elements/elements.dart';
+import '../resolution/access_semantics.dart';
+import '../resolution/operators.dart';
+import '../resolution/send_structure.dart';
+import '../universe/call_structure.dart';
+import '../universe/selector.dart';
+import '../universe/world_impact.dart';
+import '../universe/use.dart';
+import '../util/enumset.dart';
+
+import 'keys.dart';
+import 'serialization.dart';
+
+/// Serialize [name] into [encoder].
+void serializeName(Name name, ObjectEncoder encoder) {
+ encoder.setString(Key.NAME, name.text);
+ encoder.setBool(Key.IS_SETTER, name.isSetter);
+ if (name.library != null) {
+ encoder.setElement(Key.LIBRARY, name.library);
+ }
+}
+
+/// Deserialize a [Name] from [decoder].
+Name deserializeName(ObjectDecoder decoder) {
+ String name = decoder.getString(Key.NAME);
+ bool isSetter = decoder.getBool(Key.IS_SETTER);
+ LibraryElement library = decoder.getElement(Key.LIBRARY, isOptional: true);
+ return new Name(name, library, isSetter: isSetter);
+}
+
+/// Serialize [selector] into [encoder].
+void serializeSelector(Selector selector, ObjectEncoder encoder) {
+ encoder.setEnum(Key.KIND, selector.kind);
+
+ encoder.setInt(Key.ARGUMENTS, selector.callStructure.argumentCount);
+ encoder.setStrings(
+ Key.NAMED_ARGUMENTS, selector.callStructure.namedArguments);
+ serializeName(selector.memberName, encoder);
+}
+
+/// Deserialize a [Selector] from [decoder].
+Selector deserializeSelector(ObjectDecoder decoder) {
+ SelectorKind kind = decoder.getEnum(Key.KIND, SelectorKind.values);
+ int argumentCount = decoder.getInt(Key.ARGUMENTS);
+ List<String> namedArguments =
+ decoder.getStrings(Key.NAMED_ARGUMENTS, isOptional: true);
+ String name = decoder.getString(Key.NAME);
+ bool isSetter = decoder.getBool(Key.IS_SETTER);
+ LibraryElement library = decoder.getElement(Key.LIBRARY, isOptional: true);
+ return new Selector(kind, deserializeName(decoder),
+ new CallStructure(argumentCount, namedArguments));
+}
+
+/// Serialize [sendStructure] into [encoder].
+void serializeSendStructure(
+ SendStructure sendStructure, ObjectEncoder encoder) {
+ encoder.setEnum(Key.KIND, sendStructure.kind);
+ switch (sendStructure.kind) {
+ case SendStructureKind.IF_NULL:
+ case SendStructureKind.LOGICAL_AND:
+ case SendStructureKind.LOGICAL_OR:
+ case SendStructureKind.NOT:
+ case SendStructureKind.INVALID_UNARY:
+ case SendStructureKind.INVALID_BINARY:
+ // No additional properties.
+ break;
+ case SendStructureKind.IS:
+ IsStructure structure = sendStructure;
+ encoder.setType(Key.TYPE, structure.type);
+ break;
+ case SendStructureKind.IS_NOT:
+ IsNotStructure structure = sendStructure;
+ encoder.setType(Key.TYPE, structure.type);
+ break;
+ case SendStructureKind.AS:
+ AsStructure structure = sendStructure;
+ encoder.setType(Key.TYPE, structure.type);
+ break;
+ case SendStructureKind.INVOKE:
+ InvokeStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ serializeSelector(structure.selector, encoder.createObject(Key.SELECTOR));
+ break;
+ case SendStructureKind.INCOMPATIBLE_INVOKE:
+ IncompatibleInvokeStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ serializeSelector(structure.selector, encoder.createObject(Key.SELECTOR));
+ break;
+ case SendStructureKind.GET:
+ GetStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.SET:
+ SetStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.UNARY:
+ UnaryStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.INDEX:
+ IndexStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.EQUALS:
+ EqualsStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.NOT_EQUALS:
+ NotEqualsStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.BINARY:
+ BinaryStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.INDEX_SET:
+ IndexSetStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.INDEX_PREFIX:
+ IndexPrefixStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.INDEX_POSTFIX:
+ IndexPostfixStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.COMPOUND:
+ CompoundStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.SET_IF_NULL:
+ SetIfNullStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.COMPOUND_INDEX_SET:
+ CompoundIndexSetStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.INDEX_SET_IF_NULL:
+ IndexSetIfNullStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ break;
+ case SendStructureKind.PREFIX:
+ PrefixStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.POSTFIX:
+ PostfixStructure structure = sendStructure;
+ serializeAccessSemantics(
+ structure.semantics, encoder.createObject(Key.SEMANTICS));
+ encoder.setEnum(Key.OPERATOR, structure.operator.kind);
+ break;
+ case SendStructureKind.DEFERRED_PREFIX:
+ DeferredPrefixStructure structure = sendStructure;
+ encoder.setElement(Key.PREFIX, structure.prefix);
+ serializeSendStructure(
+ structure.sendStructure, encoder.createObject(Key.SEND_STRUCTURE));
+ break;
+ }
+}
+
+/// Deserialize a [SendStructure] from [decoder].
+SendStructure deserializeSendStructure(ObjectDecoder decoder) {
+ SendStructureKind kind = decoder.getEnum(Key.KIND, SendStructureKind.values);
+ switch (kind) {
+ case SendStructureKind.IF_NULL:
+ return const IfNullStructure();
+ case SendStructureKind.LOGICAL_AND:
+ return const LogicalAndStructure();
+ case SendStructureKind.LOGICAL_OR:
+ return const LogicalOrStructure();
+ case SendStructureKind.IS:
+ return new IsStructure(decoder.getType(Key.TYPE));
+ case SendStructureKind.IS_NOT:
+ return new IsNotStructure(decoder.getType(Key.TYPE));
+ case SendStructureKind.AS:
+ return new AsStructure(decoder.getType(Key.TYPE));
+ case SendStructureKind.INVOKE:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ Selector selector = deserializeSelector(decoder.getObject(Key.SELECTOR));
+ return new InvokeStructure(semantics, selector);
+ case SendStructureKind.INCOMPATIBLE_INVOKE:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ Selector selector = deserializeSelector(decoder.getObject(Key.SELECTOR));
+ return new IncompatibleInvokeStructure(semantics, selector);
+ case SendStructureKind.GET:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new GetStructure(semantics);
+ case SendStructureKind.SET:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new SetStructure(semantics);
+ case SendStructureKind.NOT:
+ return const NotStructure();
+ case SendStructureKind.UNARY:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new UnaryStructure(
+ semantics,
+ UnaryOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, UnaryOperatorKind.values)));
+ case SendStructureKind.INVALID_UNARY:
+ return new InvalidUnaryStructure();
+ case SendStructureKind.INDEX:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new IndexStructure(semantics);
+ case SendStructureKind.EQUALS:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new EqualsStructure(semantics);
+ case SendStructureKind.NOT_EQUALS:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new NotEqualsStructure(semantics);
+ case SendStructureKind.BINARY:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new BinaryStructure(
+ semantics,
+ BinaryOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, BinaryOperatorKind.values)));
+ case SendStructureKind.INVALID_BINARY:
+ return const InvalidBinaryStructure();
+ case SendStructureKind.INDEX_SET:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new IndexSetStructure(semantics);
+ case SendStructureKind.INDEX_PREFIX:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new IndexPrefixStructure(
+ semantics,
+ IncDecOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values)));
+ case SendStructureKind.INDEX_POSTFIX:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new IndexPostfixStructure(
+ semantics,
+ IncDecOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values)));
+ case SendStructureKind.COMPOUND:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new CompoundStructure(
+ semantics,
+ AssignmentOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, AssignmentOperatorKind.values)));
+ case SendStructureKind.SET_IF_NULL:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new SetIfNullStructure(semantics);
+ case SendStructureKind.COMPOUND_INDEX_SET:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new CompoundIndexSetStructure(
+ semantics,
+ AssignmentOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, AssignmentOperatorKind.values)));
+ case SendStructureKind.INDEX_SET_IF_NULL:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new IndexSetIfNullStructure(semantics);
+ case SendStructureKind.PREFIX:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new PrefixStructure(
+ semantics,
+ IncDecOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values)));
+ case SendStructureKind.POSTFIX:
+ AccessSemantics semantics =
+ deserializeAccessSemantics(decoder.getObject(Key.SEMANTICS));
+ return new PostfixStructure(
+ semantics,
+ IncDecOperator.fromKind(
+ decoder.getEnum(Key.OPERATOR, IncDecOperatorKind.values)));
+ case SendStructureKind.DEFERRED_PREFIX:
+ PrefixElement prefix = decoder.getElement(Key.PREFIX);
+ SendStructure sendStructure =
+ deserializeSendStructure(decoder.getObject(Key.SEND_STRUCTURE));
+ return new DeferredPrefixStructure(prefix, sendStructure);
+ }
+}
+
+/// Serialize [newStructure] into [encoder].
+void serializeNewStructure(NewStructure newStructure, ObjectEncoder encoder) {
+ encoder.setEnum(Key.KIND, newStructure.kind);
+ switch (newStructure.kind) {
+ case NewStructureKind.NEW_INVOKE:
+ NewInvokeStructure structure = newStructure;
+ encoder.setEnum(Key.SUB_KIND, structure.semantics.kind);
+ encoder.setElement(Key.ELEMENT, structure.semantics.element);
+ encoder.setType(Key.TYPE, structure.semantics.type);
+ serializeSelector(structure.selector, encoder.createObject(Key.SELECTOR));
+ break;
+ case NewStructureKind.CONST_INVOKE:
+ ConstInvokeStructure structure = newStructure;
+ encoder.setEnum(Key.SUB_KIND, structure.constantInvokeKind);
+ encoder.setConstant(Key.CONSTANT, structure.constant);
+ break;
+ case NewStructureKind.LATE_CONST:
+ throw new UnsupportedError(
+ 'Unsupported NewStructure kind ${newStructure.kind}.');
+ }
+}
+
+/// Deserialize a [NewStructure] from [decoder].
+NewStructure deserializeNewStructure(ObjectDecoder decoder) {
+ NewStructureKind kind = decoder.getEnum(Key.KIND, NewStructureKind.values);
+ switch (kind) {
+ case NewStructureKind.NEW_INVOKE:
+ ConstructorAccessKind constructorAccessKind =
+ decoder.getEnum(Key.SUB_KIND, ConstructorAccessKind.values);
+ Element element = decoder.getElement(Key.ELEMENT);
+ DartType type = decoder.getType(Key.TYPE);
+ ConstructorAccessSemantics semantics =
+ new ConstructorAccessSemantics(constructorAccessKind, element, type);
+ Selector selector = deserializeSelector(decoder.getObject(Key.SELECTOR));
+ return new NewInvokeStructure(semantics, selector);
+
+ case NewStructureKind.CONST_INVOKE:
+ ConstantInvokeKind constantInvokeKind =
+ decoder.getEnum(Key.SUB_KIND, ConstantInvokeKind.values);
+ ConstantExpression constant = decoder.getConstant(Key.CONSTANT);
+ return new ConstInvokeStructure(constantInvokeKind, constant);
+ case NewStructureKind.LATE_CONST:
+ throw new UnsupportedError('Unsupported NewStructure kind $kind.');
+ }
+}
+
+/// Serialize [semantics] into [encoder].
+void serializeAccessSemantics(
+ AccessSemantics semantics, ObjectEncoder encoder) {
+ encoder.setEnum(Key.KIND, semantics.kind);
+ switch (semantics.kind) {
+ case AccessKind.EXPRESSION:
+ case AccessKind.THIS:
+ // No additional properties.
+ break;
+ case AccessKind.THIS_PROPERTY:
+ case AccessKind.DYNAMIC_PROPERTY:
+ case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
+ serializeName(semantics.name, encoder);
+ break;
+ case AccessKind.CLASS_TYPE_LITERAL:
+ case AccessKind.TYPEDEF_TYPE_LITERAL:
+ case AccessKind.DYNAMIC_TYPE_LITERAL:
+ encoder.setConstant(Key.CONSTANT, semantics.constant);
+ break;
+ case AccessKind.LOCAL_FUNCTION:
+ case AccessKind.LOCAL_VARIABLE:
+ case AccessKind.FINAL_LOCAL_VARIABLE:
+ case AccessKind.PARAMETER:
+ case AccessKind.FINAL_PARAMETER:
+ case AccessKind.STATIC_FIELD:
+ case AccessKind.FINAL_STATIC_FIELD:
+ case AccessKind.STATIC_METHOD:
+ case AccessKind.STATIC_GETTER:
+ case AccessKind.STATIC_SETTER:
+ case AccessKind.TOPLEVEL_FIELD:
+ case AccessKind.FINAL_TOPLEVEL_FIELD:
+ case AccessKind.TOPLEVEL_METHOD:
+ case AccessKind.TOPLEVEL_GETTER:
+ case AccessKind.TOPLEVEL_SETTER:
+ case AccessKind.SUPER_FIELD:
+ case AccessKind.SUPER_FINAL_FIELD:
+ case AccessKind.SUPER_METHOD:
+ case AccessKind.SUPER_GETTER:
+ case AccessKind.SUPER_SETTER:
+ case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
+ case AccessKind.UNRESOLVED:
+ case AccessKind.UNRESOLVED_SUPER:
+ case AccessKind.INVALID:
+ encoder.setElement(Key.ELEMENT, semantics.element);
+ break;
+ case AccessKind.COMPOUND:
+ CompoundAccessSemantics compoundAccess = semantics;
+ encoder.setEnum(Key.SUB_KIND, compoundAccess.compoundAccessKind);
+ encoder.setElement(Key.GETTER, semantics.getter);
+ encoder.setElement(Key.SETTER, semantics.setter);
+ break;
+ case AccessKind.CONSTANT:
+ throw new UnsupportedError('Unsupported access kind: ${semantics.kind}');
+ }
+}
+
+/// Deserialize a [AccessSemantics] from [decoder].
+AccessSemantics deserializeAccessSemantics(ObjectDecoder decoder) {
+ AccessKind kind = decoder.getEnum(Key.KIND, AccessKind.values);
+ switch (kind) {
+ case AccessKind.EXPRESSION:
+ return const DynamicAccess.expression();
+ case AccessKind.THIS:
+ return const DynamicAccess.thisAccess();
+ case AccessKind.THIS_PROPERTY:
+ return new DynamicAccess.thisProperty(deserializeName(decoder));
+ case AccessKind.DYNAMIC_PROPERTY:
+ return new DynamicAccess.dynamicProperty(deserializeName(decoder));
+ case AccessKind.CONDITIONAL_DYNAMIC_PROPERTY:
+ return new DynamicAccess.ifNotNullProperty(deserializeName(decoder));
+ case AccessKind.CLASS_TYPE_LITERAL:
+ case AccessKind.TYPEDEF_TYPE_LITERAL:
+ case AccessKind.DYNAMIC_TYPE_LITERAL:
+ return new ConstantAccess(kind, decoder.getConstant(Key.CONSTANT));
+
+ case AccessKind.LOCAL_FUNCTION:
+ case AccessKind.LOCAL_VARIABLE:
+ case AccessKind.FINAL_LOCAL_VARIABLE:
+ case AccessKind.PARAMETER:
+ case AccessKind.FINAL_PARAMETER:
+ case AccessKind.STATIC_FIELD:
+ case AccessKind.FINAL_STATIC_FIELD:
+ case AccessKind.STATIC_METHOD:
+ case AccessKind.STATIC_GETTER:
+ case AccessKind.STATIC_SETTER:
+ case AccessKind.TOPLEVEL_FIELD:
+ case AccessKind.FINAL_TOPLEVEL_FIELD:
+ case AccessKind.TOPLEVEL_METHOD:
+ case AccessKind.TOPLEVEL_GETTER:
+ case AccessKind.TOPLEVEL_SETTER:
+ case AccessKind.SUPER_FIELD:
+ case AccessKind.SUPER_FINAL_FIELD:
+ case AccessKind.SUPER_METHOD:
+ case AccessKind.SUPER_GETTER:
+ case AccessKind.SUPER_SETTER:
+ case AccessKind.TYPE_PARAMETER_TYPE_LITERAL:
+ case AccessKind.UNRESOLVED:
+ case AccessKind.UNRESOLVED_SUPER:
+ case AccessKind.INVALID:
+ return new StaticAccess.internal(kind, decoder.getElement(Key.ELEMENT));
+
+ case AccessKind.COMPOUND:
+ CompoundAccessKind compoundAccessKind =
+ decoder.getEnum(Key.SUB_KIND, CompoundAccessKind.values);
+ Element getter = decoder.getElement(Key.GETTER);
+ Element setter = decoder.getElement(Key.SETTER);
+ return new CompoundAccessSemantics(compoundAccessKind, getter, setter);
+ case AccessKind.CONSTANT:
+ throw new UnsupportedError('Unsupported access kind: $kind');
+ }
+}
diff --git a/pkg/compiler/lib/src/serialization/task.dart b/pkg/compiler/lib/src/serialization/task.dart
index b7119eca..1289b77 100644
--- a/pkg/compiler/lib/src/serialization/task.dart
+++ b/pkg/compiler/lib/src/serialization/task.dart
@@ -4,27 +4,21 @@
library dart2js.serialization.task;
-import '../common/resolution.dart' show
- ResolutionImpact,
- ResolutionWorkItem;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../common/work.dart' show
- ItemCompilationContext;
-import '../compiler.dart' show
- Compiler;
+import 'dart:async' show Future;
+import '../common/resolution.dart' show ResolutionImpact, ResolutionWorkItem;
+import '../common/tasks.dart' show CompilerTask;
+import '../common/work.dart' show ItemCompilationContext;
+import '../compiler.dart' show Compiler;
import '../elements/elements.dart';
-import '../enqueue.dart' show
- ResolutionEnqueuer;
-import '../universe/world_impact.dart' show
- WorldImpact;
+import '../enqueue.dart' show ResolutionEnqueuer;
+import '../universe/world_impact.dart' show WorldImpact;
/// A deserializer that can load a library element by reading it's information
/// from a serialized form.
abstract class LibraryDeserializer {
/// Loads the [LibraryElement] associated with a library under [uri], or null
/// if no serialized information is available for the given library.
- LibraryElement readLibrary(Uri uri);
+ Future<LibraryElement> readLibrary(Uri uri);
}
/// Task that supports deserialization of elements.
@@ -42,8 +36,8 @@
/// Returns the [LibraryElement] for [resolvedUri] if available from
/// serialization.
- LibraryElement readLibrary(Uri resolvedUri) {
- if (deserializer == null) return null;
+ Future<LibraryElement> readLibrary(Uri resolvedUri) {
+ if (deserializer == null) return new Future<LibraryElement>.value();
return deserializer.readLibrary(resolvedUri);
}
@@ -88,8 +82,9 @@
/// The interface for a system that supports deserialization of libraries and
/// elements.
abstract class DeserializerSystem {
- LibraryElement readLibrary(Uri resolvedUri);
+ Future<LibraryElement> readLibrary(Uri resolvedUri);
bool isDeserialized(Element element);
+ ResolvedAst getResolvedAst(Element element);
ResolutionImpact getResolutionImpact(Element element);
WorldImpact computeWorldImpact(Element element);
}
diff --git a/pkg/compiler/lib/src/serialization/type_serialization.dart b/pkg/compiler/lib/src/serialization/type_serialization.dart
index 7ea60ff..3d4cb9f 100644
--- a/pkg/compiler/lib/src/serialization/type_serialization.dart
+++ b/pkg/compiler/lib/src/serialization/type_serialization.dart
@@ -22,25 +22,20 @@
void visitVoidType(VoidType type, ObjectEncoder encoder) {}
- void visitTypeVariableType(TypeVariableType type,
- ObjectEncoder encoder) {
+ void visitTypeVariableType(TypeVariableType type, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, type.element);
}
- void visitFunctionType(FunctionType type,
- ObjectEncoder encoder) {
+ void visitFunctionType(FunctionType type, ObjectEncoder encoder) {
// TODO(johnniwinther): Support encoding of `type.element`.
encoder.setType(Key.RETURN_TYPE, type.returnType);
encoder.setTypes(Key.PARAMETER_TYPES, type.parameterTypes);
- encoder.setTypes(
- Key.OPTIONAL_PARAMETER_TYPES, type.optionalParameterTypes);
+ encoder.setTypes(Key.OPTIONAL_PARAMETER_TYPES, type.optionalParameterTypes);
encoder.setStrings(Key.NAMED_PARAMETERS, type.namedParameters);
encoder.setTypes(Key.NAMED_PARAMETER_TYPES, type.namedParameterTypes);
}
- void visitMalformedType(MalformedType type, ObjectEncoder encoder) {
-
- }
+ void visitMalformedType(MalformedType type, ObjectEncoder encoder) {}
void visitInterfaceType(InterfaceType type, ObjectEncoder encoder) {
encoder.setElement(Key.ELEMENT, type.element);
@@ -55,12 +50,10 @@
void visitDynamicType(DynamicType type, ObjectEncoder encoder) {}
}
-
/// Utility class for deserializing [DartType]s.
///
/// This is used by the [Deserializer].
class TypeDeserializer {
-
/// Deserializes a [DartType] from an [ObjectDecoder].
///
/// The class is called from the [Deserializer] when a [DartType] needs
@@ -70,26 +63,20 @@
TypeKind typeKind = decoder.getEnum(Key.KIND, TypeKind.values);
switch (typeKind) {
case TypeKind.INTERFACE:
- return new InterfaceType(
- decoder.getElement(Key.ELEMENT),
+ return new InterfaceType(decoder.getElement(Key.ELEMENT),
decoder.getTypes(Key.TYPE_ARGUMENTS, isOptional: true));
case TypeKind.FUNCTION:
// TODO(johnniwinther): Support decoding of `type.element`.
return new FunctionType.synthesized(
decoder.getType(Key.RETURN_TYPE),
decoder.getTypes(Key.PARAMETER_TYPES, isOptional: true),
- decoder.getTypes(
- Key.OPTIONAL_PARAMETER_TYPES, isOptional: true),
- decoder.getStrings(
- Key.NAMED_PARAMETERS, isOptional: true),
- decoder.getTypes(
- Key.NAMED_PARAMETER_TYPES, isOptional: true));
+ decoder.getTypes(Key.OPTIONAL_PARAMETER_TYPES, isOptional: true),
+ decoder.getStrings(Key.NAMED_PARAMETERS, isOptional: true),
+ decoder.getTypes(Key.NAMED_PARAMETER_TYPES, isOptional: true));
case TypeKind.TYPE_VARIABLE:
- return new TypeVariableType(
- decoder.getElement(Key.ELEMENT));
+ return new TypeVariableType(decoder.getElement(Key.ELEMENT));
case TypeKind.TYPEDEF:
- return new TypedefType(
- decoder.getElement(Key.ELEMENT),
+ return new TypedefType(decoder.getElement(Key.ELEMENT),
decoder.getTypes(Key.TYPE_ARGUMENTS, isOptional: true));
case TypeKind.STATEMENT:
case TypeKind.MALFORMED_TYPE:
@@ -101,4 +88,3 @@
}
}
}
-
diff --git a/pkg/compiler/lib/src/serialization/values.dart b/pkg/compiler/lib/src/serialization/values.dart
index 4e49de4..637123c 100644
--- a/pkg/compiler/lib/src/serialization/values.dart
+++ b/pkg/compiler/lib/src/serialization/values.dart
@@ -48,7 +48,7 @@
String toString() => element.toString();
}
-class TypeValue implements Value {
+class TypeValue implements Value {
final DartType type;
final Value id;
@@ -59,7 +59,7 @@
String toString() => type.toString();
}
-class ConstantValue implements Value {
+class ConstantValue implements Value {
final ConstantExpression constant;
final Value id;
diff --git a/pkg/compiler/lib/src/source_file_provider.dart b/pkg/compiler/lib/src/source_file_provider.dart
index 2269a9e..e5b3a03 100644
--- a/pkg/compiler/lib/src/source_file_provider.dart
+++ b/pkg/compiler/lib/src/source_file_provider.dart
@@ -56,50 +56,46 @@
source = readAll(resourceUri.toFilePath());
} on FileSystemException catch (ex) {
OSError ose = ex.osError;
- String detail = (ose != null && ose.message != null)
- ? ' (${ose.message})'
- : '';
+ String detail =
+ (ose != null && ose.message != null) ? ' (${ose.message})' : '';
return new Future.error(
"Error reading '${relativize(cwd, resourceUri, isWindows)}'"
"$detail");
}
dartCharactersRead += source.length;
- sourceFiles[resourceUri] =
- new CachingUtf8BytesSourceFile(
- resourceUri, relativizeUri(resourceUri), source);
+ sourceFiles[resourceUri] = new CachingUtf8BytesSourceFile(
+ resourceUri, relativizeUri(resourceUri), source);
return new Future.value(source);
}
Future<List<int>> _readFromHttp(Uri resourceUri) {
assert(resourceUri.scheme == 'http');
HttpClient client = new HttpClient();
- return client.getUrl(resourceUri)
+ return client
+ .getUrl(resourceUri)
.then((HttpClientRequest request) => request.close())
.then((HttpClientResponse response) {
- if (response.statusCode != HttpStatus.OK) {
- String msg = 'Failure getting $resourceUri: '
- '${response.statusCode} ${response.reasonPhrase}';
- throw msg;
- }
- return response.toList();
- })
- .then((List<List<int>> splitContent) {
- int totalLength = splitContent.fold(0, (int old, List list) {
- return old + list.length;
- });
- Uint8List result = new Uint8List(totalLength);
- int offset = 0;
- for (List<int> contentPart in splitContent) {
- result.setRange(
- offset, offset + contentPart.length, contentPart);
- offset += contentPart.length;
- }
- dartCharactersRead += totalLength;
- sourceFiles[resourceUri] =
- new CachingUtf8BytesSourceFile(
- resourceUri, resourceUri.toString(), result);
- return result;
- });
+ if (response.statusCode != HttpStatus.OK) {
+ String msg = 'Failure getting $resourceUri: '
+ '${response.statusCode} ${response.reasonPhrase}';
+ throw msg;
+ }
+ return response.toList();
+ }).then((List<List<int>> splitContent) {
+ int totalLength = splitContent.fold(0, (int old, List list) {
+ return old + list.length;
+ });
+ Uint8List result = new Uint8List(totalLength);
+ int offset = 0;
+ for (List<int> contentPart in splitContent) {
+ result.setRange(offset, offset + contentPart.length, contentPart);
+ offset += contentPart.length;
+ }
+ dartCharactersRead += totalLength;
+ sourceFiles[resourceUri] = new CachingUtf8BytesSourceFile(
+ resourceUri, resourceUri.toString(), result);
+ return result;
+ });
}
// TODO(johnniwinther): Remove this when no longer needed for the old compiler
@@ -140,7 +136,7 @@
FormattingDiagnosticHandler([SourceFileProvider provider])
: this.provider =
- (provider == null) ? new CompilerSourceFileProvider() : provider;
+ (provider == null) ? new CompilerSourceFileProvider() : provider;
void info(var message, [api.Diagnostic kind = api.Diagnostic.VERBOSE_INFO]) {
if (!verbose && kind == api.Diagnostic.VERBOSE_INFO) return;
@@ -171,7 +167,7 @@
@override
void report(var code, Uri uri, int begin, int end, String message,
- api.Diagnostic kind) {
+ api.Diagnostic kind) {
// TODO(ahe): Remove this when source map is handled differently.
if (identical(kind.name, 'source map')) return;
@@ -219,12 +215,12 @@
} else {
SourceFile file = provider.sourceFiles[uri];
if (file != null) {
- print(file.getLocationMessage(
- color(message), begin, end, colorize: color));
+ print(file.getLocationMessage(color(message), begin, end,
+ colorize: color));
} else {
String position = end - begin > 0 ? '@$begin+${end - begin}' : '';
print('${provider.relativizeUri(uri)}$position:\n'
- '${color(message)}');
+ '${color(message)}');
}
}
if (fatal && ++fatalCount >= throwOnErrorCount && throwOnError) {
@@ -251,10 +247,8 @@
int totalCharactersWritten = 0;
List<String> allOutputFiles = new List<String>();
- RandomAccessFileOutputProvider(this.out,
- this.sourceMapOut,
- {this.onInfo,
- this.onFailure});
+ RandomAccessFileOutputProvider(this.out, this.sourceMapOut,
+ {this.onInfo, this.onFailure});
static Uri computePrecompiledUri(Uri out) {
String extension = 'precompiled.js';
@@ -281,7 +275,7 @@
} else if (extension == 'precompiled.js') {
uri = computePrecompiledUri(out);
onInfo("File ($uri) is compatible with header"
- " \"Content-Security-Policy: script-src 'self'\"");
+ " \"Content-Security-Policy: script-src 'self'\"");
} else if (extension == 'js.map' || extension == 'dart.map') {
uri = sourceMapOut;
} else if (extension == "info.json") {
@@ -301,7 +295,7 @@
RandomAccessFile output;
try {
output = new File(uri.toFilePath()).openSync(mode: FileMode.WRITE);
- } on FileSystemException catch(e) {
+ } on FileSystemException catch (e) {
onFailure('$e');
}
@@ -311,7 +305,7 @@
writeStringSync(String data) {
// Write the data in chunks of 8kb, otherwise we risk running OOM.
- int chunkSize = 8*1024;
+ int chunkSize = 8 * 1024;
int offset = 0;
while (offset < data.length) {
diff --git a/pkg/compiler/lib/src/ssa/builder.dart b/pkg/compiler/lib/src/ssa/builder.dart
index ad5905d..a05158d 100644
--- a/pkg/compiler/lib/src/ssa/builder.dart
+++ b/pkg/compiler/lib/src/ssa/builder.dart
@@ -8,59 +8,36 @@
import '../closure.dart';
import '../common.dart';
-import '../common/codegen.dart' show
- CodegenRegistry,
- CodegenWorkItem;
-import '../common/names.dart' show
- Identifiers,
- Selectors;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
+import '../common/names.dart' show Identifiers, Selectors;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constants/expressions.dart';
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreClasses;
+import '../core_types.dart' show CoreClasses;
import '../dart_types.dart';
-import '../diagnostics/messages.dart' show
- Message,
- MessageTemplate;
+import '../diagnostics/messages.dart' show Message, MessageTemplate;
import '../elements/elements.dart';
-import '../elements/modelx.dart' show
- ConstructorBodyElementX,
- ElementX,
- VariableElementX;
+import '../elements/modelx.dart'
+ show ConstructorBodyElementX, ElementX, VariableElementX;
import '../io/source_information.dart';
import '../js/js.dart' as js;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show
- CodeEmitterTask,
- NativeEmitter;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
import '../native/native.dart' as native;
import '../resolution/operators.dart';
import '../resolution/semantic_visitor.dart';
-import '../resolution/tree_elements.dart' show
- TreeElements;
+import '../resolution/tree_elements.dart' show TreeElements;
import '../tree/tree.dart' as ast;
import '../types/types.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/side_effects.dart' show
- SideEffects;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/side_effects.dart' show SideEffects;
+import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld,
- World;
+import '../world.dart' show ClassWorld, World;
import '../dump_info.dart' show InfoReporter;
import 'nodes.dart';
@@ -75,7 +52,7 @@
final JavaScriptBackend backend;
SsaFunctionCompiler(JavaScriptBackend backend,
- SourceInformationStrategy sourceInformationFactory)
+ SourceInformationStrategy sourceInformationFactory)
: generator = new SsaCodeGeneratorTask(backend, sourceInformationFactory),
builder = new SsaBuilderTask(backend, sourceInformationFactory),
optimizer = new SsaOptimizerTask(backend),
@@ -120,9 +97,9 @@
String get name => 'SSA builder';
SsaBuilderTask(JavaScriptBackend backend, this.sourceInformationFactory)
- : emitter = backend.emitter,
- backend = backend,
- super(backend.compiler);
+ : emitter = backend.emitter,
+ backend = backend,
+ super(backend.compiler);
DiagnosticReporter get reporter => compiler.reporter;
@@ -130,11 +107,14 @@
return measure(() {
Element element = work.element.implementation;
return reporter.withCurrentElement(element, () {
- SsaBuilder builder =
- new SsaBuilder(work.element.implementation,
- work.resolutionTree, work.compilationContext, work.registry,
- backend, emitter.nativeEmitter,
- sourceInformationFactory);
+ SsaBuilder builder = new SsaBuilder(
+ work.element.implementation,
+ work.resolutionTree,
+ work.compilationContext,
+ work.registry,
+ backend,
+ emitter.nativeEmitter,
+ sourceInformationFactory);
HGraph graph = builder.build();
// Default arguments are handled elsewhere, but we must ensure
@@ -161,15 +141,13 @@
} else {
name = "${element.name}";
}
- compiler.tracer.traceCompilation(
- name, work.compilationContext);
+ compiler.tracer.traceCompilation(name, work.compilationContext);
compiler.tracer.traceGraph('builder', graph);
}
return graph;
});
});
}
-
}
/**
@@ -187,8 +165,7 @@
* e.g. Element hash codes. I'd prefer to use a SortedMap but some elements
* don't have source locations for [Elements.compareByPosition].
*/
- Map<Local, HInstruction> directLocals =
- new Map<Local, HInstruction>();
+ Map<Local, HInstruction> directLocals = new Map<Local, HInstruction>();
Map<Local, CapturedVariable> redirectionMapping =
new Map<Local, CapturedVariable>();
SsaBuilder builder;
@@ -223,11 +200,10 @@
return builder.sourceInformationBuilder;
}
- LocalsHandler(this.builder, this.executableContext,
- InterfaceType instanceType)
- : this.instanceType =
- instanceType == null || instanceType.containsTypeVariables
- ? null : instanceType;
+ LocalsHandler(
+ this.builder, this.executableContext, InterfaceType instanceType)
+ : this.instanceType = instanceType == null ||
+ instanceType.containsTypeVariables ? null : instanceType;
/// Substituted type variables occurring in [type] into the context of
/// [contextClass].
@@ -235,8 +211,7 @@
if (contextClass != null) {
ClassElement typeContext = Types.getClassContext(type);
if (typeContext != null) {
- type = type.substByContext(
- contextClass.asInstanceOf(typeContext));
+ type = type.substByContext(contextClass.asInstanceOf(typeContext));
}
}
if (instanceType != null) {
@@ -275,9 +250,7 @@
// just creating an empty object literal?
JavaScriptBackend backend = builder.backend;
HInstruction box = new HForeignCode(
- js.js.parseForeignJS('{}'),
- backend.nonNullType,
- <HInstruction>[],
+ js.js.parseForeignJS('{}'), backend.nonNullType, <HInstruction>[],
nativeBehavior: native.NativeBehavior.PURE_ALLOCATION);
builder.add(box);
return box;
@@ -331,8 +304,8 @@
* Replaces the current box with a new box and copies over the given list
* of elements from the old box into the new box.
*/
- void updateCaptureBox(BoxLocal boxElement,
- List<LocalVariableElement> toBeCopiedElements) {
+ void updateCaptureBox(
+ BoxLocal boxElement, List<LocalVariableElement> toBeCopiedElements) {
// Create a new box and copy over the values from the old box into the
// new one.
HInstruction oldBox = readLocal(boxElement);
@@ -356,8 +329,8 @@
void startFunction(Element element, ast.Node node) {
assert(invariant(element, element.isImplementation));
Compiler compiler = builder.compiler;
- closureData = compiler.closureToClassMapper.computeClosureToClassMapping(
- element, node, builder.elements);
+ closureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(element, node, builder.elements);
if (element is FunctionElement) {
FunctionElement functionElement = element;
@@ -372,8 +345,7 @@
return;
}
}
- HInstruction parameter = builder.addParameter(
- parameterElement,
+ HInstruction parameter = builder.addParameter(parameterElement,
TypeMaskFactory.inferredTypeForElement(parameterElement, compiler));
builder.parameters[parameterElement] = parameter;
directLocals[parameterElement] = parameter;
@@ -391,8 +363,8 @@
JavaScriptBackend backend = compiler.backend;
if (closureData.isClosure) {
// Inside closure redirect references to itself to [:this:].
- HThis thisInstruction = new HThis(closureData.thisLocal,
- backend.nonNullType);
+ HThis thisInstruction =
+ new HThis(closureData.thisLocal, backend.nonNullType);
builder.graph.thisInstruction = thisInstruction;
builder.graph.entry.addAtEntry(thisInstruction);
updateLocal(closureData.closureElement, thisInstruction);
@@ -400,8 +372,8 @@
// Once closures have been mapped to classes their instance members might
// not have any thisElement if the closure was created inside a static
// context.
- HThis thisInstruction = new HThis(
- closureData.thisLocal, builder.getTypeOfThis());
+ HThis thisInstruction =
+ new HThis(closureData.thisLocal, builder.getTypeOfThis());
builder.graph.thisInstruction = thisInstruction;
builder.graph.entry.addAtEntry(thisInstruction);
directLocals[closureData.thisLocal] = thisInstruction;
@@ -416,8 +388,8 @@
// and passed to the generative constructor factory function as a parameter.
// Instead of allocating and initializing the object, the constructor
// 'upgrades' the native subclass object by initializing the Dart fields.
- bool isNativeUpgradeFactory = element.isGenerativeConstructor
- && backend.isNativeOrExtendsNative(cls);
+ bool isNativeUpgradeFactory =
+ element.isGenerativeConstructor && backend.isNativeOrExtendsNative(cls);
if (backend.isInterceptedMethod(element)) {
bool isInterceptorClass = backend.isInterceptorClass(cls.declaration);
String name = isInterceptorClass ? 'receiver' : '_';
@@ -453,8 +425,8 @@
*/
bool isAccessedDirectly(Local local) {
assert(local != null);
- return !redirectionMapping.containsKey(local)
- && !closureData.variablesUsedInTryOrGenerator.contains(local);
+ return !redirectionMapping.containsKey(local) &&
+ !closureData.variablesUsedInTryOrGenerator.contains(local);
}
bool isStoredInClosureField(Local local) {
@@ -480,16 +452,14 @@
* boxed or stored in a closure then the method generates code to retrieve
* the value.
*/
- HInstruction readLocal(Local local,
- {SourceInformation sourceInformation}) {
+ HInstruction readLocal(Local local, {SourceInformation sourceInformation}) {
if (isAccessedDirectly(local)) {
if (directLocals[local] == null) {
if (local is TypeVariableElement) {
builder.reporter.internalError(builder.compiler.currentElement,
"Runtime type information not available for $local.");
} else {
- builder.reporter.internalError(local,
- "Cannot find value $local.");
+ builder.reporter.internalError(local, "Cannot find value $local.");
}
}
HInstruction value = directLocals[local];
@@ -537,8 +507,7 @@
return res;
}
- HLocalValue getLocal(Local local,
- {SourceInformation sourceInformation}) {
+ HLocalValue getLocal(Local local, {SourceInformation sourceInformation}) {
// If the element is a parameter, we already have a
// HParameterValue for it. We cannot create another one because
// it could then have another name than the real parameter. And
@@ -549,7 +518,7 @@
return builder.activationVariables.putIfAbsent(local, () {
JavaScriptBackend backend = builder.backend;
HLocalValue localValue = new HLocalValue(local, backend.nonNullType)
- ..sourceInformation = sourceInformation;
+ ..sourceInformation = sourceInformation;
builder.graph.entry.addAtExit(localValue);
return localValue;
});
@@ -566,7 +535,7 @@
* closure then the method generates code to set the value.
*/
void updateLocal(Local local, HInstruction value,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
if (value is HRef) {
HRef ref = value;
value = ref.value;
@@ -582,12 +551,12 @@
// be accessed directly.
HInstruction box = readLocal(redirect.box);
builder.add(new HFieldSet(redirect, box, value)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
} else {
assert(isUsedInTryOrGenerator(local));
HLocalValue localValue = getLocal(local);
builder.add(new HLocalSet(local, localValue, value)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
}
@@ -660,13 +629,12 @@
JavaScriptBackend backend = builder.backend;
// Create phis for all elements in the definitions environment.
- savedDirectLocals.forEach((Local local,
- HInstruction instruction) {
+ savedDirectLocals.forEach((Local local, HInstruction instruction) {
if (isAccessedDirectly(local)) {
// We know 'this' cannot be modified.
if (local != closureData.thisLocal) {
- HPhi phi = new HPhi.singleInput(
- local, instruction, backend.dynamicType);
+ HPhi phi =
+ new HPhi.singleInput(local, instruction, backend.dynamicType);
loopEntry.addPhi(phi);
directLocals[local] = phi;
} else {
@@ -726,11 +694,9 @@
// block. Since variable declarations are scoped the declared
// variable cannot be alive outside the block. Note: this is only
// true for nodes where we do joins.
- Map<Local, HInstruction> joinedLocals =
- new Map<Local, HInstruction>();
+ Map<Local, HInstruction> joinedLocals = new Map<Local, HInstruction>();
JavaScriptBackend backend = builder.backend;
- otherLocals.directLocals.forEach((Local local,
- HInstruction instruction) {
+ otherLocals.directLocals.forEach((Local local, HInstruction instruction) {
// We know 'this' cannot be modified.
if (local == closureData.thisLocal) {
assert(directLocals[local] == instruction);
@@ -758,12 +724,11 @@
* used for its values, only for its declared variables. This is a way to
* exclude local values from the result when they are no longer in scope.
*/
- LocalsHandler mergeMultiple(List<LocalsHandler> localsHandlers,
- HBasicBlock joinBlock) {
+ LocalsHandler mergeMultiple(
+ List<LocalsHandler> localsHandlers, HBasicBlock joinBlock) {
assert(localsHandlers.length > 0);
if (localsHandlers.length == 1) return localsHandlers[0];
- Map<Local, HInstruction> joinedLocals =
- new Map<Local, HInstruction>();
+ Map<Local, HInstruction> joinedLocals = new Map<Local, HInstruction>();
HInstruction thisValue = null;
JavaScriptBackend backend = builder.backend;
directLocals.forEach((Local local, HInstruction instruction) {
@@ -779,8 +744,7 @@
}
});
for (LocalsHandler handler in localsHandlers) {
- handler.directLocals.forEach((Local local,
- HInstruction instruction) {
+ handler.directLocals.forEach((Local local, HInstruction instruction) {
HPhi phi = joinedLocals[local];
if (phi != null) {
phi.addInput(instruction);
@@ -794,10 +758,9 @@
// Remove locals that are not in all handlers.
directLocals = new Map<Local, HInstruction>();
- joinedLocals.forEach((Local local,
- HInstruction instruction) {
- if (local != closureData.thisLocal
- && instruction.inputs.length != localsHandlers.length) {
+ joinedLocals.forEach((Local local, HInstruction instruction) {
+ if (local != closureData.thisLocal &&
+ instruction.inputs.length != localsHandlers.length) {
joinBlock.removePhi(instruction);
} else {
directLocals[local] = instruction;
@@ -807,7 +770,6 @@
}
}
-
// Represents a single break/continue instruction.
class JumpHandlerEntry {
final HJump jumpInstruction;
@@ -817,7 +779,6 @@
JumpHandlerEntry(this.jumpInstruction, this.locals);
}
-
abstract class JumpHandler {
factory JumpHandler(SsaBuilder builder, JumpTarget target) {
return new TargetJumpHandler(builder, target);
@@ -825,8 +786,8 @@
void generateBreak([LabelDefinition label]);
void generateContinue([LabelDefinition label]);
void forEachBreak(void action(HBreak instruction, LocalsHandler locals));
- void forEachContinue(void action(HContinue instruction,
- LocalsHandler locals));
+ void forEachContinue(
+ void action(HContinue instruction, LocalsHandler locals));
bool hasAnyContinue();
bool hasAnyBreak();
void close();
@@ -852,9 +813,9 @@
'NullJumpHandler.generateContinue should not be called.');
}
- void forEachBreak(Function ignored) { }
- void forEachContinue(Function ignored) { }
- void close() { }
+ void forEachBreak(Function ignored) {}
+ void forEachContinue(Function ignored) {}
+ void close() {}
bool hasAnyContinue() => false;
bool hasAnyBreak() => false;
@@ -953,9 +914,8 @@
/// switch case loop.
final Map<JumpTarget, int> targetIndexMap = new Map<JumpTarget, int>();
- SwitchCaseJumpHandler(SsaBuilder builder,
- JumpTarget target,
- ast.SwitchStatement node)
+ SwitchCaseJumpHandler(
+ SsaBuilder builder, JumpTarget target, ast.SwitchStatement node)
: super(builder, target) {
// The switch case indices must match those computed in
// [SsaFromAstMixin.buildSwitchCaseConstants].
@@ -1007,9 +967,8 @@
// [SsaFromAstMixin.buildComplexSwitchStatement] for detail.
assert(label != null);
- HInstruction value = builder.graph.addConstantInt(
- targetIndexMap[label.target],
- builder.compiler);
+ HInstruction value = builder.graph
+ .addConstantInt(targetIndexMap[label.target], builder.compiler);
builder.localsHandler.updateLocal(target, value);
assert(label.target.labels.contains(label));
@@ -1035,14 +994,14 @@
* This class builds SSA nodes for functions represented in AST.
*/
class SsaBuilder extends ast.Visitor
- with BaseImplementationOfCompoundsMixin,
- BaseImplementationOfSetIfNullsMixin,
- BaseImplementationOfSuperIndexSetIfNullMixin,
- SemanticSendResolvedMixin,
- NewBulkMixin,
- ErrorBulkMixin
+ with
+ BaseImplementationOfCompoundsMixin,
+ BaseImplementationOfSetIfNullsMixin,
+ BaseImplementationOfSuperIndexSetIfNullMixin,
+ SemanticSendResolvedMixin,
+ NewBulkMixin,
+ ErrorBulkMixin
implements SemanticSendVisitor {
-
/// The element for which this SSA builder is being used.
final Element target;
@@ -1146,8 +1105,7 @@
* being updated in try/catch blocks, and should be
* accessed indirectly through [HLocalGet] and [HLocalSet].
*/
- Map<Local, HLocalValue> activationVariables =
- <Local, HLocalValue>{};
+ Map<Local, HLocalValue> activationVariables = <Local, HLocalValue>{};
// We build the Ssa graph by simulating a stack machine.
List<HInstruction> stack = <HInstruction>[];
@@ -1156,24 +1114,29 @@
bool get isBuildingAsyncFunction {
Element element = sourceElement;
return (element is FunctionElement &&
- element.asyncMarker == AsyncMarker.ASYNC);
+ element.asyncMarker == AsyncMarker.ASYNC);
}
// TODO(sigmund): make most args optional
- SsaBuilder(this.target, this.elements, this.context, this.registry,
- JavaScriptBackend backend, this.nativeEmitter,
+ SsaBuilder(
+ this.target,
+ this.elements,
+ this.context,
+ this.registry,
+ JavaScriptBackend backend,
+ this.nativeEmitter,
SourceInformationStrategy sourceInformationFactory)
- : this.compiler = backend.compiler,
- this.infoReporter = backend.compiler.dumpInfoTask,
- this.backend = backend,
- this.constantSystem = backend.constantSystem,
- this.rti = backend.rti {
+ : this.compiler = backend.compiler,
+ this.infoReporter = backend.compiler.dumpInfoTask,
+ this.backend = backend,
+ this.constantSystem = backend.constantSystem,
+ this.rti = backend.rti {
assert(target.isImplementation);
graph.element = target;
localsHandler = new LocalsHandler(this, target, null);
sourceElementStack.add(target);
- sourceInformationBuilder = sourceInformationFactory.createBuilderForContext(
- target);
+ sourceInformationBuilder =
+ sourceInformationFactory.createBuilderForContext(target);
graph.sourceInformation =
sourceInformationBuilder.buildVariableDeclaration();
}
@@ -1206,7 +1169,8 @@
// implementation/declaration distinction.
Element get sourceElement => sourceElementStack.last;
- bool get _checkOrTrustTypes => compiler.options.enableTypeAssertions ||
+ bool get _checkOrTrustTypes =>
+ compiler.options.enableTypeAssertions ||
compiler.options.trustTypeAnnotations;
/// Build the graph for [target].
@@ -1219,10 +1183,10 @@
if (target.isGenerativeConstructor) {
result = buildFactory(target);
} else if (target.isGenerativeConstructorBody ||
- target.isFactoryConstructor ||
- target.isFunction ||
- target.isGetter ||
- target.isSetter) {
+ target.isFactoryConstructor ||
+ target.isFunction ||
+ target.isGetter ||
+ target.isSetter) {
result = buildMethod(target);
} else if (target.isField) {
if (target.isInstanceMember) {
@@ -1238,7 +1202,6 @@
return result;
}
-
HBasicBlock addNewBlock() {
HBasicBlock block = graph.addNewBlock();
// If adding a new block during building of an expression, it is due to
@@ -1309,11 +1272,12 @@
bool isInstanceMember = function.isInstanceMember;
// For static calls, [providedArguments] is complete, default arguments
// have been included if necessary, see [makeStaticArgumentList].
- if (!isInstanceMember
- || currentNode == null // In erroneous code, currentNode can be null.
- || providedArgumentsKnownToBeComplete(currentNode)
- || function.isGenerativeConstructorBody
- || selector.isGetter) {
+ if (!isInstanceMember ||
+ currentNode == null // In erroneous code, currentNode can be null.
+ ||
+ providedArgumentsKnownToBeComplete(currentNode) ||
+ function.isGenerativeConstructorBody ||
+ selector.isGetter) {
// For these cases, the provided argument list is known to be complete.
return providedArguments;
} else {
@@ -1336,10 +1300,8 @@
* the provided named arguments (the named arguments that are defined in the
* [selector]) in a specific order (see [addDynamicSendArgumentsToList]).
*/
- List<HInstruction> completeDynamicSendArgumentsList(
- Selector selector,
- FunctionElement function,
- List<HInstruction> providedArguments) {
+ List<HInstruction> completeDynamicSendArgumentsList(Selector selector,
+ FunctionElement function, List<HInstruction> providedArguments) {
assert(selector.applies(function, compiler.world));
FunctionSignature signature = function.functionSignature;
List<HInstruction> compiledArguments = new List<HInstruction>(
@@ -1396,12 +1358,9 @@
* Try to inline [element] within the currect context of the builder. The
* insertion point is the state of the builder.
*/
- bool tryInlineMethod(Element element,
- Selector selector,
- TypeMask mask,
- List<HInstruction> providedArguments,
- ast.Node currentNode,
- {InterfaceType instanceType}) {
+ bool tryInlineMethod(Element element, Selector selector, TypeMask mask,
+ List<HInstruction> providedArguments, ast.Node currentNode,
+ {InterfaceType instanceType}) {
// TODO(johnniwinther): Register this on the [registry]. Currently the
// [CodegenRegistry] calls the enqueuer, but [element] should _not_ be
// enqueued.
@@ -1432,8 +1391,8 @@
assert(invariant(
currentNode != null ? currentNode : element,
selector != null ||
- Elements.isStaticOrTopLevel(element) ||
- element.isGenerativeConstructorBody,
+ Elements.isStaticOrTopLevel(element) ||
+ element.isGenerativeConstructorBody,
message: "Missing selector for inlining of $element."));
if (selector != null) {
if (!selector.applies(function, compiler.world)) return false;
@@ -1446,16 +1405,16 @@
// Don't inline operator== methods if the parameter can be null.
if (element.name == '==') {
- if (element.enclosingClass != coreClasses.objectClass
- && providedArguments[1].canBeNull()) {
+ if (element.enclosingClass != coreClasses.objectClass &&
+ providedArguments[1].canBeNull()) {
return false;
}
}
// Generative constructors of native classes should not be called directly
// and have an extra argument that causes problems with inlining.
- if (element.isGenerativeConstructor
- && backend.isNativeOrExtendsNative(element.enclosingClass)) {
+ if (element.isGenerativeConstructor &&
+ backend.isNativeOrExtendsNative(element.enclosingClass)) {
return false;
}
@@ -1524,8 +1483,8 @@
// We may have forced the inlining of some methods. Therefore check
// if we can inline this method regardless of size.
assert(InlineWeeder.canBeInlined(function, -1, false,
- allowLoops: true,
- enableUserAssertions: compiler.options.enableUserAssertions));
+ allowLoops: true,
+ enableUserAssertions: compiler.options.enableUserAssertions));
return true;
}
@@ -1567,13 +1526,13 @@
(mask == null || mask.isNullable)) {
addWithPosition(
new HFieldGet(null, providedArguments[0], backend.dynamicType,
- isAssignable: false),
+ isAssignable: false),
currentNode);
}
List<HInstruction> compiledArguments = completeSendArgumentsList(
function, selector, providedArguments, currentNode);
- enterInlinedMethod(
- function, currentNode, compiledArguments, instanceType: instanceType);
+ enterInlinedMethod(function, currentNode, compiledArguments,
+ instanceType: instanceType);
inlinedFrom(function, () {
if (!isReachable) {
emitReturn(graph.addConstantNull(compiler), null);
@@ -1728,8 +1687,8 @@
push(invokeJsInteropFunction(functionElement, parameters.values.toList(),
sourceInformationBuilder.buildGeneric(function)));
var value = pop();
- closeAndGotoExit(new HReturn(value,
- sourceInformationBuilder.buildReturn(functionElement.node)));
+ closeAndGotoExit(new HReturn(
+ value, sourceInformationBuilder.buildReturn(functionElement.node)));
return closeFunction();
}
assert(invariant(functionElement, !function.modifiers.isExternal));
@@ -1739,27 +1698,21 @@
// null check.
if (name == '==') {
if (!backend.operatorEqHandlesNullArgument(functionElement)) {
- handleIf(
- function,
- visitCondition: () {
- HParameterValue parameter = parameters.values.first;
- push(new HIdentity(
- parameter, graph.addConstantNull(compiler), null,
- backend.boolType));
- },
- visitThen: () {
- closeAndGotoExit(new HReturn(
- graph.addConstantBool(false, compiler),
- sourceInformationBuilder
- .buildImplicitReturn(functionElement)));
- },
+ handleIf(function, visitCondition: () {
+ HParameterValue parameter = parameters.values.first;
+ push(new HIdentity(parameter, graph.addConstantNull(compiler), null,
+ backend.boolType));
+ }, visitThen: () {
+ closeAndGotoExit(new HReturn(graph.addConstantBool(false, compiler),
+ sourceInformationBuilder.buildImplicitReturn(functionElement)));
+ },
visitElse: null,
sourceInformation: sourceInformationBuilder.buildIf(function.body));
}
}
if (const bool.fromEnvironment('unreachable-throw') == true) {
- var emptyParameters = parameters.values
- .where((p) => p.instructionType.isEmpty);
+ var emptyParameters =
+ parameters.values.where((p) => p.instructionType.isEmpty);
if (emptyParameters.length > 0) {
addComment('${emptyParameters} inferred as [empty]');
pushInvokeStatic(function.body, helpers.assertUnreachableMethod, []);
@@ -1777,10 +1730,8 @@
/// having side effects which will inhibit code motion.
// TODO(sra): Figure out how to keep comment anchored without effects.
void addComment(String text) {
- add(new HForeignCode(
- js.js.statementTemplateYielding(new js.Comment(text)),
- backend.dynamicType,
- <HInstruction>[],
+ add(new HForeignCode(js.js.statementTemplateYielding(new js.Comment(text)),
+ backend.dynamicType, <HInstruction>[],
isStatement: true));
}
@@ -1878,16 +1829,14 @@
* updated in the [localsHandler]. This function creates such an element and
* stores it in the [returnLocal] field.
*/
- void setupStateForInlining(FunctionElement function,
- List<HInstruction> compiledArguments,
- {InterfaceType instanceType}) {
+ void setupStateForInlining(
+ FunctionElement function, List<HInstruction> compiledArguments,
+ {InterfaceType instanceType}) {
localsHandler = new LocalsHandler(this, function, instanceType);
- localsHandler.closureData =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- function, function.node, elements);
+ localsHandler.closureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(function, function.node, elements);
returnLocal = new SyntheticLocal("result", function);
- localsHandler.updateLocal(returnLocal,
- graph.addConstantNull(compiler));
+ localsHandler.updateLocal(returnLocal, graph.addConstantNull(compiler));
inTryStatement = false; // TODO(lry): why? Document.
@@ -1904,8 +1853,8 @@
});
ClassElement enclosing = function.enclosingClass;
- if ((function.isConstructor || function.isGenerativeConstructorBody)
- && backend.classNeedsRti(enclosing)) {
+ if ((function.isConstructor || function.isGenerativeConstructorBody) &&
+ backend.classNeedsRti(enclosing)) {
enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
HInstruction argument = compiledArguments[argumentIndex++];
localsHandler.updateLocal(
@@ -1947,7 +1896,6 @@
}
}
-
addInlinedInstantiation(DartType type) {
if (type != null) {
currentInlinedInstantiations.add(type);
@@ -1989,11 +1937,12 @@
*
* Invariant: [constructors] must contain only implementation elements.
*/
- void inlineSuperOrRedirect(ConstructorElement callee,
- List<HInstruction> compiledArguments,
- List<FunctionElement> constructors,
- Map<Element, HInstruction> fieldValues,
- FunctionElement caller) {
+ void inlineSuperOrRedirect(
+ ConstructorElement callee,
+ List<HInstruction> compiledArguments,
+ List<FunctionElement> constructors,
+ Map<Element, HInstruction> fieldValues,
+ FunctionElement caller) {
callee = callee.implementation;
reporter.withCurrentElement(callee, () {
constructors.add(callee);
@@ -2035,8 +1984,8 @@
// by the effective target.
if (!callee.isRedirectingGenerative) {
inlinedFrom(callee, () {
- buildFieldInitializers(callee.enclosingClass.implementation,
- fieldValues);
+ buildFieldInitializers(
+ callee.enclosingClass.implementation, fieldValues);
});
}
@@ -2063,9 +2012,8 @@
elements = resolvedAst.elements;
ClosureClassMap oldClosureData = localsHandler.closureData;
ast.Node node = resolvedAst.node;
- ClosureClassMap newClosureData =
- compiler.closureToClassMapper.computeClosureToClassMapping(
- callee, node, elements);
+ ClosureClassMap newClosureData = compiler.closureToClassMapper
+ .computeClosureToClassMapping(callee, node, elements);
localsHandler.closureData = newClosureData;
localsHandler.enterScope(node, callee);
buildInitializers(callee, constructors, fieldValues);
@@ -2084,9 +2032,10 @@
* Invariant: The [constructor] and elements in [constructors] must all be
* implementation elements.
*/
- void buildInitializers(ConstructorElement constructor,
- List<FunctionElement> constructors,
- Map<Element, HInstruction> fieldValues) {
+ void buildInitializers(
+ ConstructorElement constructor,
+ List<FunctionElement> constructors,
+ Map<Element, HInstruction> fieldValues) {
assert(invariant(constructor, constructor.isImplementation));
if (constructor.isSynthesized) {
List<HInstruction> arguments = <HInstruction>[];
@@ -2110,15 +2059,11 @@
// forwarding constructor in a mixin application did not match the
// constructor (which, for example, may happen when the libraries are
// not compatible for private names, see issue 20394).
- reporter.internalError(constructor,
- 'forwarding constructor call does not match');
+ reporter.internalError(
+ constructor, 'forwarding constructor call does not match');
}
inlineSuperOrRedirect(
- target,
- arguments,
- constructors,
- fieldValues,
- constructor);
+ target, arguments, constructors, fieldValues, constructor);
return;
}
ast.FunctionExpression functionNode = constructor.node;
@@ -2126,14 +2071,16 @@
bool foundSuperOrRedirect = false;
if (functionNode.initializers != null) {
Link<ast.Node> initializers = functionNode.initializers.nodes;
- for (Link<ast.Node> link = initializers; !link.isEmpty; link = link.tail) {
+ for (Link<ast.Node> link = initializers;
+ !link.isEmpty;
+ link = link.tail) {
assert(link.head is ast.Send);
- if (link.head is !ast.SendSet) {
+ if (link.head is! ast.SendSet) {
// A super initializer or constructor redirection.
foundSuperOrRedirect = true;
ast.Send call = link.head;
assert(ast.Initializers.isSuperConstructorCall(call) ||
- ast.Initializers.isConstructorRedirect(call));
+ ast.Initializers.isConstructorRedirect(call));
FunctionElement target = elements[call].implementation;
CallStructure callStructure =
elements.getSelector(call).callStructure;
@@ -2143,11 +2090,8 @@
compiledArguments =
makeStaticArgumentList(callStructure, arguments, target);
});
- inlineSuperOrRedirect(target,
- compiledArguments,
- constructors,
- fieldValues,
- constructor);
+ inlineSuperOrRedirect(target, compiledArguments, constructors,
+ fieldValues, constructor);
} else {
// A field initializer.
ast.SendSet init = link.head;
@@ -2172,20 +2116,16 @@
// TODO(johnniwinther): Should we find injected constructors as well?
FunctionElement target = superClass.lookupDefaultConstructor();
if (target == null) {
- reporter.internalError(superClass,
- "No default constructor available.");
+ reporter.internalError(
+ superClass, "No default constructor available.");
}
- List<HInstruction> arguments =
- CallStructure.NO_ARGS.makeArgumentsList(
- const Link<ast.Node>(),
- target.implementation,
- null,
- handleConstantForOptionalParameter);
- inlineSuperOrRedirect(target,
- arguments,
- constructors,
- fieldValues,
- constructor);
+ List<HInstruction> arguments = CallStructure.NO_ARGS.makeArgumentsList(
+ const Link<ast.Node>(),
+ target.implementation,
+ null,
+ handleConstantForOptionalParameter);
+ inlineSuperOrRedirect(
+ target, arguments, constructors, fieldValues, constructor);
}
}
}
@@ -2196,36 +2136,36 @@
*
* Invariant: [classElement] must be an implementation element.
*/
- void buildFieldInitializers(ClassElement classElement,
- Map<Element, HInstruction> fieldValues) {
+ void buildFieldInitializers(
+ ClassElement classElement, Map<Element, HInstruction> fieldValues) {
assert(invariant(classElement, classElement.isImplementation));
classElement.forEachInstanceField(
(ClassElement enclosingClass, VariableElement member) {
- if (compiler.elementHasCompileTimeError(member)) return;
- reporter.withCurrentElement(member, () {
- TreeElements definitions = member.treeElements;
- ast.Node node = member.node;
- ast.Expression initializer = member.initializer;
- if (initializer == null) {
- // Unassigned fields of native classes are not initialized to
- // prevent overwriting pre-initialized native properties.
- if (!backend.isNativeOrExtendsNative(classElement)) {
- fieldValues[member] = graph.addConstantNull(compiler);
- }
- } else {
- ast.Node right = initializer;
- TreeElements savedElements = elements;
- elements = definitions;
- // In case the field initializer uses closures, run the
- // closure to class mapper.
- compiler.closureToClassMapper.computeClosureToClassMapping(
- member, node, elements);
- inlinedFrom(member, () => right.accept(this));
- elements = savedElements;
- fieldValues[member] = pop();
- }
- });
- });
+ if (compiler.elementHasCompileTimeError(member)) return;
+ reporter.withCurrentElement(member, () {
+ TreeElements definitions = member.treeElements;
+ ast.Node node = member.node;
+ ast.Expression initializer = member.initializer;
+ if (initializer == null) {
+ // Unassigned fields of native classes are not initialized to
+ // prevent overwriting pre-initialized native properties.
+ if (!backend.isNativeOrExtendsNative(classElement)) {
+ fieldValues[member] = graph.addConstantNull(compiler);
+ }
+ } else {
+ ast.Node right = initializer;
+ TreeElements savedElements = elements;
+ elements = definitions;
+ // In case the field initializer uses closures, run the
+ // closure to class mapper.
+ compiler.closureToClassMapper
+ .computeClosureToClassMapping(member, node, elements);
+ inlinedFrom(member, () => right.accept(this));
+ elements = savedElements;
+ fieldValues[member] = pop();
+ }
+ });
+ });
}
/**
@@ -2239,11 +2179,10 @@
*/
HGraph buildFactory(ConstructorElement functionElement) {
functionElement = functionElement.implementation;
- ClassElement classElement =
- functionElement.enclosingClass.implementation;
+ ClassElement classElement = functionElement.enclosingClass.implementation;
bool isNativeUpgradeFactory =
- backend.isNativeOrExtendsNative(classElement)
- && !backend.isJsInterop(classElement);
+ backend.isNativeOrExtendsNative(classElement) &&
+ !backend.isJsInterop(classElement);
ast.FunctionExpression function = functionElement.node;
// Note that constructors (like any other static function) do not need
// to deal with optional arguments. It is the callers job to provide all
@@ -2270,8 +2209,7 @@
// If the [element] is a field-parameter then
// initialize the field element with its value.
InitializingFormalElement fieldParameter = parameter;
- HInstruction parameterValue =
- localsHandler.readLocal(fieldParameter);
+ HInstruction parameterValue = localsHandler.readLocal(fieldParameter);
fieldValues[fieldParameter.fieldElement] = parameterValue;
}
});
@@ -2287,19 +2225,18 @@
classElement.forEachInstanceField(
(ClassElement enclosingClass, VariableElement member) {
- HInstruction value = fieldValues[member];
- if (value == null) {
- // Uninitialized native fields are pre-initialized by the native
- // implementation.
- assert(invariant(
- member, isNativeUpgradeFactory || compiler.compilationFailed));
- } else {
- fields.add(member);
- DartType type = localsHandler.substInContext(member.type);
- constructorArguments.add(potentiallyCheckOrTrustType(value, type));
- }
- },
- includeSuperAndInjectedMembers: true);
+ HInstruction value = fieldValues[member];
+ if (value == null) {
+ // Uninitialized native fields are pre-initialized by the native
+ // implementation.
+ assert(invariant(
+ member, isNativeUpgradeFactory || compiler.compilationFailed));
+ } else {
+ fields.add(member);
+ DartType type = localsHandler.substInContext(member.type);
+ constructorArguments.add(potentiallyCheckOrTrustType(value, type));
+ }
+ }, includeSuperAndInjectedMembers: true);
InterfaceType type = classElement.thisType;
TypeMask ssaType =
@@ -2312,10 +2249,8 @@
HInstruction newObject;
if (!isNativeUpgradeFactory) {
- newObject = new HForeignNew(classElement,
- ssaType,
- constructorArguments,
- instantiatedTypes);
+ newObject = new HForeignNew(
+ classElement, ssaType, constructorArguments, instantiatedTypes);
if (function != null) {
// TODO(johnniwinther): Provide source information for creation
// through synthetic constructors.
@@ -2329,8 +2264,8 @@
// Null guard ensures an error if we are being called from an explicit
// 'new' of the constructor instead of via an upgrade. It is optimized out
// if there are field initializers.
- add(new HFieldGet(
- null, newObject, backend.dynamicType, isAssignable: false));
+ add(new HFieldGet(null, newObject, backend.dynamicType,
+ isAssignable: false));
for (int i = 0; i < fields.length; i++) {
add(new HFieldSet(fields[i], newObject, constructorArguments[i]));
}
@@ -2346,12 +2281,12 @@
// we can simply copy the list from this.
// These locals are modified by [isIndexedTypeArgumentGet].
- HThis source; // The source of the type arguments.
+ HThis source; // The source of the type arguments.
bool allIndexed = true;
int expectedIndex = 0;
- ClassElement contextClass; // The class of `this`.
- int remainingTypeVariables; // The number of 'remaining type variables'
- // of `this`.
+ ClassElement contextClass; // The class of `this`.
+ int remainingTypeVariables; // The number of 'remaining type variables'
+ // of `this`.
/// Helper to identify instructions that read a type variable without
/// substitution (that is, directly use the index). These instructions
@@ -2393,8 +2328,8 @@
List<HInstruction> typeArguments = <HInstruction>[];
classElement.typeVariables.forEach((TypeVariableType typeVariable) {
- HInstruction argument = localsHandler.readLocal(
- localsHandler.getTypeVariableAsLocal(typeVariable));
+ HInstruction argument = localsHandler
+ .readLocal(localsHandler.getTypeVariableAsLocal(typeVariable));
if (allIndexed && !isIndexedTypeArgumentGet(argument)) {
allIndexed = false;
}
@@ -2458,8 +2393,8 @@
currentClass.typeVariables.forEach((TypeVariableType argument) {
// TODO(johnniwinther): Substitute [argument] with
// `localsHandler.substInContext(argument)`.
- bodyCallInputs.add(localsHandler.readLocal(
- localsHandler.getTypeVariableAsLocal(argument)));
+ bodyCallInputs.add(localsHandler
+ .readLocal(localsHandler.getTypeVariableAsLocal(argument)));
});
}
@@ -2503,11 +2438,11 @@
// must be done before adding the normal parameters, because their types
// may contain references to type variables.
var enclosing = element.enclosingElement;
- if ((element.isConstructor || element.isGenerativeConstructorBody)
- && backend.classNeedsRti(enclosing)) {
+ if ((element.isConstructor || element.isGenerativeConstructorBody) &&
+ backend.classNeedsRti(enclosing)) {
enclosing.typeVariables.forEach((TypeVariableType typeVariable) {
- HParameterValue param = addParameter(
- typeVariable.element, backend.nonNullType);
+ HParameterValue param =
+ addParameter(typeVariable.element, backend.nonNullType);
localsHandler.directLocals[
localsHandler.getTypeVariableAsLocal(typeVariable)] = param;
});
@@ -2521,8 +2456,7 @@
// because that is where the type guards will also be inserted.
// This way we ensure that a type guard will dominate the type
// check.
- ClosureScope scopeData =
- localsHandler.closureData.capturingScopes[node];
+ ClosureScope scopeData = localsHandler.closureData.capturingScopes[node];
signature.orderedForEachParameter((ParameterElement parameterElement) {
if (element.isGenerativeConstructorBody) {
if (scopeData != null &&
@@ -2569,11 +2503,10 @@
if (element == backend.traceHelper) return;
n(e) => e == null ? '' : e.name;
String name = "${n(element.library)}:${n(element.enclosingClass)}."
- "${n(element)}";
+ "${n(element)}";
HConstant nameConstant = addConstantString(name);
- add(new HInvokeStatic(backend.traceHelper,
- <HInstruction>[nameConstant],
- backend.dynamicType));
+ add(new HInvokeStatic(backend.traceHelper, <HInstruction>[nameConstant],
+ backend.dynamicType));
}
}
@@ -2584,8 +2517,7 @@
HConstant idConstant = graph.addConstantInt(element.hashCode, compiler);
HConstant nameConstant = addConstantString(element.name);
add(new HInvokeStatic(backend.traceHelper,
- <HInstruction>[idConstant, nameConstant],
- backend.dynamicType));
+ <HInstruction>[idConstant, nameConstant], backend.dynamicType));
}
}
@@ -2594,21 +2526,19 @@
bool assertTypeInContext(DartType type, [Spannable spannable]) {
return invariant(spannable == null ? CURRENT_ELEMENT_SPANNABLE : spannable,
() {
- ClassElement contextClass = Types.getClassContext(type);
- return contextClass == null ||
- contextClass == localsHandler.contextClass;
- },
+ ClassElement contextClass = Types.getClassContext(type);
+ return contextClass == null || contextClass == localsHandler.contextClass;
+ },
message: "Type '$type' is not valid context of "
- "${localsHandler.contextClass}.");
+ "${localsHandler.contextClass}.");
}
/// Build a [HTypeConversion] for convertion [original] to type [type].
///
/// Invariant: [type] must be valid in the context.
/// See [LocalsHandler.substInContext].
- HInstruction buildTypeConversion(HInstruction original,
- DartType type,
- int kind) {
+ HInstruction buildTypeConversion(
+ HInstruction original, DartType type, int kind) {
if (type == null) return original;
type = type.unaliased;
assert(assertTypeInContext(type, original));
@@ -2616,19 +2546,21 @@
TypeMask subtype = new TypeMask.subtype(type.element, compiler.world);
HInstruction representations = buildTypeArgumentRepresentations(type);
add(representations);
- return new HTypeConversion.withTypeRepresentation(type, kind, subtype,
- original, representations);
+ return new HTypeConversion.withTypeRepresentation(
+ type, kind, subtype, original, representations);
} else if (type.isTypeVariable) {
TypeMask subtype = original.instructionType;
HInstruction typeVariable = addTypeVariableReference(type);
- return new HTypeConversion.withTypeRepresentation(type, kind, subtype,
- original, typeVariable);
+ return new HTypeConversion.withTypeRepresentation(
+ type, kind, subtype, original, typeVariable);
} else if (type.isFunctionType) {
- String name = kind == HTypeConversion.CAST_TYPE_CHECK
- ? '_asCheck' : '_assertCheck';
+ String name =
+ kind == HTypeConversion.CAST_TYPE_CHECK ? '_asCheck' : '_assertCheck';
- List<HInstruction> arguments =
- <HInstruction>[buildFunctionType(type), original];
+ List<HInstruction> arguments = <HInstruction>[
+ buildFunctionType(type),
+ original
+ ];
pushInvokeDynamic(
null,
new Selector.call(
@@ -2666,7 +2598,7 @@
}
HInstruction potentiallyCheckOrTrustType(HInstruction original, DartType type,
- { int kind: HTypeConversion.CHECKED_MODE_CHECK }) {
+ {int kind: HTypeConversion.CHECKED_MODE_CHECK}) {
if (type == null) return original;
HInstruction checkedOrTrusted = original;
if (compiler.options.trustTypeAnnotations) {
@@ -2679,8 +2611,8 @@
return checkedOrTrusted;
}
- void assertIsSubtype(ast.Node node, DartType subtype, DartType supertype,
- String message) {
+ void assertIsSubtype(
+ ast.Node node, DartType subtype, DartType supertype, String message) {
HInstruction subtypeInstruction =
analyzeTypeArgument(localsHandler.substInContext(subtype));
HInstruction supertypeInstruction =
@@ -2688,10 +2620,13 @@
HInstruction messageInstruction =
graph.addConstantString(new ast.DartString.literal(message), compiler);
Element element = helpers.assertIsSubtype;
- var inputs = <HInstruction>[subtypeInstruction, supertypeInstruction,
- messageInstruction];
- HInstruction assertIsSubtype = new HInvokeStatic(
- element, inputs, subtypeInstruction.instructionType);
+ var inputs = <HInstruction>[
+ subtypeInstruction,
+ supertypeInstruction,
+ messageInstruction
+ ];
+ HInstruction assertIsSubtype =
+ new HInvokeStatic(element, inputs, subtypeInstruction.instructionType);
registry?.registerTypeVariableBoundsSubtypeCheck(subtype, supertype);
add(assertIsSubtype);
}
@@ -2723,9 +2658,7 @@
HInstruction popBoolified() {
HInstruction value = pop();
if (_checkOrTrustTypes) {
- return potentiallyCheckOrTrustType(
- value,
- compiler.coreTypes.boolType,
+ return potentiallyCheckOrTrustType(value, compiler.coreTypes.boolType,
kind: HTypeConversion.BOOLEAN_CONVERSION_CHECK);
}
HInstruction result = new HBoolify(value, backend.boolType);
@@ -2776,17 +2709,15 @@
pushInvokeStatic(node, helpers.assertThrow, [pop()]);
pop();
}
- handleIf(node,
- visitCondition: buildCondition,
- visitThen: fail);
+ handleIf(node, visitCondition: buildCondition, visitThen: fail);
}
visitBlock(ast.Block node) {
assert(!isAborted());
- if (!isReachable) return; // This can only happen when inlining.
+ if (!isReachable) return; // This can only happen when inlining.
for (Link<ast.Node> link = node.statements.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
visit(link.head);
if (!isReachable) {
// The block has been aborted by a return or a throw.
@@ -2803,8 +2734,8 @@
}
visitClassNode(ast.ClassNode node) {
- reporter.internalError(node,
- 'SsaBuilder.visitClassNode should not be called.');
+ reporter.internalError(
+ node, 'SsaBuilder.visitClassNode should not be called.');
}
visitThrowExpression(ast.Expression expression) {
@@ -2841,9 +2772,8 @@
HBasicBlock previousBlock = close(new HGoto());
JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: true);
- HBasicBlock loopEntry = graph.addNewLoopHeaderBlock(
- jumpHandler.target,
- jumpHandler.labels());
+ HBasicBlock loopEntry =
+ graph.addNewLoopHeaderBlock(jumpHandler.target, jumpHandler.labels());
previousBlock.addSuccessor(loopEntry);
open(loopEntry);
@@ -2864,10 +2794,8 @@
* no back edge because they abort (throw/return/break in the body and have
* no continues).
*/
- void endLoop(HBasicBlock loopEntry,
- HBasicBlock branchExitBlock,
- JumpHandler jumpHandler,
- LocalsHandler savedLocals) {
+ void endLoop(HBasicBlock loopEntry, HBasicBlock branchExitBlock,
+ JumpHandler jumpHandler, LocalsHandler savedLocals) {
HBasicBlock loopExitBlock = addNewBlock();
List<LocalsHandler> breakHandlers = <LocalsHandler>[];
@@ -2917,11 +2845,8 @@
// For while loops, initializer and update are null.
// The condition function must return a boolean result.
// None of the functions must leave anything on the stack.
- void handleLoop(ast.Node loop,
- void initialize(),
- HInstruction condition(),
- void update(),
- void body()) {
+ void handleLoop(ast.Node loop, void initialize(), HInstruction condition(),
+ void update(), void body()) {
// Generate:
// <initializer>
// loop-entry:
@@ -2941,8 +2866,7 @@
startBlock = initializerBlock;
initialize();
assert(!isAborted());
- initializerGraph =
- new SubExpression(initializerBlock, current);
+ initializerGraph = new SubExpression(initializerBlock, current);
}
loopNesting++;
@@ -2985,13 +2909,12 @@
HBasicBlock updateBlock = addNewBlock();
List<LocalsHandler> continueHandlers = <LocalsHandler>[];
- jumpHandler.forEachContinue((HContinue instruction,
- LocalsHandler locals) {
+ jumpHandler
+ .forEachContinue((HContinue instruction, LocalsHandler locals) {
instruction.block.addSuccessor(updateBlock);
continueHandlers.add(locals);
});
-
if (bodyBlock != null) {
continueHandlers.add(localsHandler);
bodyBlock.addSuccessor(updateBlock);
@@ -3006,15 +2929,13 @@
if (!labels.isEmpty) {
beginBodyBlock.setBlockFlow(
new HLabeledBlockInformation(
- new HSubGraphBlockInformation(bodyGraph),
- jumpHandler.labels(),
+ new HSubGraphBlockInformation(bodyGraph), jumpHandler.labels(),
isContinue: true),
updateBlock);
} else if (target != null && target.isContinueTarget) {
beginBodyBlock.setBlockFlow(
new HLabeledBlockInformation.implicit(
- new HSubGraphBlockInformation(bodyGraph),
- target,
+ new HSubGraphBlockInformation(bodyGraph), target,
isContinue: true),
updateBlock);
}
@@ -3037,16 +2958,15 @@
endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
conditionBlock.postProcessLoopHeader();
- HLoopBlockInformation info =
- new HLoopBlockInformation(
- _loopKind(loop),
- wrapExpressionGraph(initializerGraph),
- wrapExpressionGraph(conditionExpression),
- wrapStatementGraph(bodyGraph),
- wrapExpressionGraph(updateGraph),
- conditionBlock.loopInformation.target,
- conditionBlock.loopInformation.labels,
- sourceInformationBuilder.buildLoop(loop));
+ HLoopBlockInformation info = new HLoopBlockInformation(
+ _loopKind(loop),
+ wrapExpressionGraph(initializerGraph),
+ wrapExpressionGraph(conditionExpression),
+ wrapStatementGraph(bodyGraph),
+ wrapExpressionGraph(updateGraph),
+ conditionBlock.loopInformation.target,
+ conditionBlock.loopInformation.labels,
+ sourceInformationBuilder.buildLoop(loop));
startBlock.setBlockFlow(info, current);
loopInfo.loopBlockInformation = info;
@@ -3078,11 +2998,10 @@
conditionEndBlock.addAtExit(new HIf(condition));
conditionEndBlock.addSuccessor(elseBlock);
conditionEndBlock.remove(conditionEndBlock.last);
- HIfBlockInformation info =
- new HIfBlockInformation(
- wrapExpressionGraph(conditionExpression),
- wrapStatementGraph(bodyGraph),
- wrapStatementGraph(elseGraph));
+ HIfBlockInformation info = new HIfBlockInformation(
+ wrapExpressionGraph(conditionExpression),
+ wrapStatementGraph(bodyGraph),
+ wrapStatementGraph(elseGraph));
conditionEndBlock.setBlockFlow(info, current);
HIf ifBlock = conditionEndBlock.last;
@@ -3096,8 +3015,8 @@
label.setBreakTarget();
SubGraph labelGraph = new SubGraph(conditionBlock, current);
HLabeledBlockInformation labelInfo = new HLabeledBlockInformation(
- new HSubGraphBlockInformation(labelGraph),
- <LabelDefinition>[label]);
+ new HSubGraphBlockInformation(labelGraph),
+ <LabelDefinition>[label]);
conditionBlock.setBlockFlow(labelInfo, current);
@@ -3151,11 +3070,9 @@
visit(node.condition);
return popBoolified();
}
- handleLoop(node,
- () {},
- buildCondition,
- () {},
- () { visit(node.body); });
+ handleLoop(node, () {}, buildCondition, () {}, () {
+ visit(node.body);
+ });
}
visitDoWhile(ast.DoWhile node) {
@@ -3199,8 +3116,8 @@
HBasicBlock conditionBlock = addNewBlock();
List<LocalsHandler> continueHandlers = <LocalsHandler>[];
- jumpHandler.forEachContinue((HContinue instruction,
- LocalsHandler locals) {
+ jumpHandler
+ .forEachContinue((HContinue instruction, LocalsHandler locals) {
instruction.block.addSuccessor(conditionBlock);
continueHandlers.add(locals);
});
@@ -3219,11 +3136,11 @@
new HSubGraphBlockInformation(bodyGraph);
HLabeledBlockInformation info;
if (!labels.isEmpty) {
- info = new HLabeledBlockInformation(bodyInfo, labels,
- isContinue: true);
+ info =
+ new HLabeledBlockInformation(bodyInfo, labels, isContinue: true);
} else {
info = new HLabeledBlockInformation.implicit(bodyInfo, target,
- isContinue: true);
+ isContinue: true);
}
bodyEntryBlock.setBlockFlow(info, conditionBlock);
}
@@ -3254,16 +3171,15 @@
loopEntryBlock.postProcessLoopHeader();
SubGraph bodyGraph = new SubGraph(loopEntryBlock, bodyExitBlock);
- HLoopBlockInformation loopBlockInfo =
- new HLoopBlockInformation(
- HLoopBlockInformation.DO_WHILE_LOOP,
- null,
- wrapExpressionGraph(conditionExpression),
- wrapStatementGraph(bodyGraph),
- null,
- loopEntryBlock.loopInformation.target,
- loopEntryBlock.loopInformation.labels,
- sourceInformationBuilder.buildLoop(node));
+ HLoopBlockInformation loopBlockInfo = new HLoopBlockInformation(
+ HLoopBlockInformation.DO_WHILE_LOOP,
+ null,
+ wrapExpressionGraph(conditionExpression),
+ wrapStatementGraph(bodyGraph),
+ null,
+ loopEntryBlock.loopInformation.target,
+ loopEntryBlock.loopInformation.labels,
+ sourceInformationBuilder.buildLoop(node));
loopEntryBlock.setBlockFlow(loopBlockInfo, current);
loopInfo.loopBlockInformation = loopBlockInfo;
} else {
@@ -3320,7 +3236,7 @@
TypeMask type =
new TypeMask.nonNullExact(closureClassElement, compiler.world);
push(new HForeignNew(closureClassElement, type, capturedVariables)
- ..sourceInformation = sourceInformationBuilder.buildCreate(node));
+ ..sourceInformation = sourceInformationBuilder.buildCreate(node));
Element methodElement = nestedClosureData.closureElement;
registry?.registerInstantiatedClosure(methodElement);
@@ -3343,15 +3259,14 @@
if (node.isThis()) {
visitThisGet(node);
} else {
- reporter.internalError(node,
- "SsaFromAstMixin.visitIdentifier on non-this.");
+ reporter.internalError(
+ node, "SsaFromAstMixin.visitIdentifier on non-this.");
}
}
visitIf(ast.If node) {
assert(isReachable);
- handleIf(
- node,
+ handleIf(node,
visitCondition: () => visit(node.condition),
visitThen: () => visit(node.thenPart),
visitElse: node.elsePart != null ? () => visit(node.elsePart) : null,
@@ -3359,13 +3274,12 @@
}
void handleIf(ast.Node diagnosticNode,
- {void visitCondition(),
- void visitThen(),
- void visitElse(),
- SourceInformation sourceInformation}) {
+ {void visitCondition(),
+ void visitThen(),
+ void visitElse(),
+ SourceInformation sourceInformation}) {
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, diagnosticNode);
- branchBuilder.handleIf(
- visitCondition, visitThen, visitElse,
+ branchBuilder.handleIf(visitCondition, visitThen, visitElse,
sourceInformation: sourceInformation);
}
@@ -3378,19 +3292,17 @@
@override
void visitLogicalAnd(ast.Send node, ast.Node left, ast.Node right, _) {
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, node);
- branchBuilder.handleLogicalAndOrWithLeftNode(
- left,
- () { visit(right); },
- isAnd: true);
+ branchBuilder.handleLogicalAndOrWithLeftNode(left, () {
+ visit(right);
+ }, isAnd: true);
}
@override
void visitLogicalOr(ast.Send node, ast.Node left, ast.Node right, _) {
SsaBranchBuilder branchBuilder = new SsaBranchBuilder(this, node);
- branchBuilder.handleLogicalAndOrWithLeftNode(
- left,
- () { visit(right); },
- isAnd: false);
+ branchBuilder.handleLogicalAndOrWithLeftNode(left, () {
+ visit(right);
+ }, isAnd: false);
}
@override
@@ -3400,13 +3312,12 @@
SourceInformation sourceInformation =
sourceInformationBuilder.buildGeneric(node);
push(new HNot(popBoolified(), backend.boolType)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
@override
- void visitUnary(ast.Send node,
- UnaryOperator operator,
- ast.Node expression,_) {
+ void visitUnary(
+ ast.Send node, UnaryOperator operator, ast.Node expression, _) {
assert(node.argumentsNode is ast.Prefix);
HInstruction operand = visitAndPop(expression);
@@ -3422,18 +3333,13 @@
}
pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [operand],
+ node, elements.getSelector(node), elements.getTypeMask(node), [operand],
sourceInformation: sourceInformationBuilder.buildGeneric(node));
}
@override
- void visitBinary(ast.Send node,
- ast.Node left,
- BinaryOperator operator,
- ast.Node right, _) {
+ void visitBinary(ast.Send node, ast.Node left, BinaryOperator operator,
+ ast.Node right, _) {
handleBinary(node, left, right);
}
@@ -3454,24 +3360,17 @@
}
void handleBinary(ast.Send node, ast.Node left, ast.Node right) {
- visitBinarySend(
- visitAndPop(left),
- visitAndPop(right),
- elements.getSelector(node),
- elements.getTypeMask(node),
- node,
+ visitBinarySend(visitAndPop(left), visitAndPop(right),
+ elements.getSelector(node), elements.getTypeMask(node), node,
sourceInformation:
sourceInformationBuilder.buildGeneric(node.selector));
}
/// TODO(johnniwinther): Merge [visitBinarySend] with [handleBinary] and
/// remove use of [location] for source information.
- void visitBinarySend(HInstruction left,
- HInstruction right,
- Selector selector,
- TypeMask mask,
- ast.Send send,
- {SourceInformation sourceInformation}) {
+ void visitBinarySend(HInstruction left, HInstruction right, Selector selector,
+ TypeMask mask, ast.Send send,
+ {SourceInformation sourceInformation}) {
pushInvokeDynamic(send, selector, mask, [left, right],
sourceInformation: sourceInformation);
}
@@ -3496,10 +3395,7 @@
* [selector].
*/
void generateInstanceGetterWithCompiledReceiver(
- ast.Send send,
- Selector selector,
- TypeMask mask,
- HInstruction receiver) {
+ ast.Send send, Selector selector, TypeMask mask, HInstruction receiver) {
assert(Elements.isInstanceSend(send, elements));
assert(selector.isGetter);
pushInvokeDynamic(send, selector, mask, [receiver],
@@ -3508,8 +3404,8 @@
/// Inserts a call to checkDeferredIsLoaded for [prefixElement].
/// If [prefixElement] is [null] ndo nothing.
- void generateIsDeferredLoadedCheckIfNeeded(PrefixElement prefixElement,
- ast.Node location) {
+ void generateIsDeferredLoadedCheckIfNeeded(
+ PrefixElement prefixElement, ast.Node location) {
if (prefixElement == null) return;
String loadId =
compiler.deferredLoadTask.getImportDeferName(location, prefixElement);
@@ -3525,16 +3421,14 @@
/// resolves to a deferred library.
void generateIsDeferredLoadedCheckOfSend(ast.Send node) {
generateIsDeferredLoadedCheckIfNeeded(
- compiler.deferredLoadTask.deferredPrefixElement(node, elements),
- node);
+ compiler.deferredLoadTask.deferredPrefixElement(node, elements), node);
}
void handleInvalidStaticGet(ast.Send node, Element element) {
SourceInformation sourceInformation =
sourceInformationBuilder.buildGet(node);
generateThrowNoSuchMethod(
- node,
- noSuchMethodTargetSymbolString(element, 'get'),
+ node, noSuchMethodTargetSymbolString(element, 'get'),
argumentNodes: const Link<ast.Node>(),
sourceInformation: sourceInformation);
}
@@ -3556,32 +3450,27 @@
}
/// Read a static or top level [field] of constant value.
- void generateStaticConstGet(
- ast.Send node,
- FieldElement field,
- ConstantExpression constant,
- SourceInformation sourceInformation) {
+ void generateStaticConstGet(ast.Send node, FieldElement field,
+ ConstantExpression constant, SourceInformation sourceInformation) {
ConstantValue value = backend.constants.getConstantValue(constant);
HConstant instruction;
// Constants that are referred via a deferred prefix should be referred
// by reference.
- PrefixElement prefix = compiler.deferredLoadTask
- .deferredPrefixElement(node, elements);
+ PrefixElement prefix =
+ compiler.deferredLoadTask.deferredPrefixElement(node, elements);
if (prefix != null) {
instruction =
graph.addDeferredConstant(value, prefix, sourceInformation, compiler);
} else {
- instruction = graph.addConstant(
- value, compiler, sourceInformation: sourceInformation);
+ instruction = graph.addConstant(value, compiler,
+ sourceInformation: sourceInformation);
}
stack.add(instruction);
// The inferrer may have found a better type than the constant
// handler in the case of lists, because the constant handler
// does not look at elements in the list.
- TypeMask type =
- TypeMaskFactory.inferredTypeForElement(field, compiler);
- if (!type.containsAll(compiler.world) &&
- !instruction.isConstantNull()) {
+ TypeMask type = TypeMaskFactory.inferredTypeForElement(field, compiler);
+ if (!type.containsAll(compiler.world) && !instruction.isConstantNull()) {
// TODO(13429): The inferrer should know that an element
// cannot be null.
instruction.instructionType = type.nonNullable();
@@ -3607,17 +3496,15 @@
} else {
// TODO(5346): Try to avoid the need for calling [declaration] before
// creating an [HStatic].
- HInstruction instruction = new HStatic(
- field.declaration,
+ HInstruction instruction = new HStatic(field.declaration,
TypeMaskFactory.inferredTypeForElement(field, compiler))
- ..sourceInformation = sourceInformation;
+ ..sourceInformation = sourceInformation;
push(instruction);
}
} else {
HInstruction instruction = new HLazyStatic(
- field,
- TypeMaskFactory.inferredTypeForElement(field, compiler))
- ..sourceInformation = sourceInformation;
+ field, TypeMaskFactory.inferredTypeForElement(field, compiler))
+ ..sourceInformation = sourceInformation;
push(instruction);
}
}
@@ -3630,7 +3517,7 @@
generateDeferredLoaderGet(node, getter, sourceInformation);
} else {
pushInvokeStatic(node, getter, <HInstruction>[],
- sourceInformation: sourceInformation);
+ sourceInformation: sourceInformation);
}
}
@@ -3648,13 +3535,13 @@
SourceInformation sourceInformation =
sourceInformationBuilder.buildGet(node);
push(new HStatic(function.declaration, backend.nonNullType)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
/// Read a local variable, function or parameter.
void buildLocalGet(LocalElement local, SourceInformation sourceInformation) {
- stack.add(localsHandler.readLocal(
- local, sourceInformation: sourceInformation));
+ stack.add(
+ localsHandler.readLocal(local, sourceInformation: sourceInformation));
}
void handleLocalGet(ast.Send node, LocalElement local) {
@@ -3662,20 +3549,13 @@
}
@override
- void visitDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ void visitDynamicPropertyGet(ast.Send node, ast.Node receiver, Name name, _) {
generateDynamicGet(node);
}
@override
void visitIfNotNullDynamicPropertyGet(
- ast.Send node,
- ast.Node receiver,
- Name name,
- _) {
+ ast.Send node, ast.Node receiver, Name name, _) {
// exp?.x compiled as:
// t1 = exp;
// result = t1 == null ? t1 : t1.x;
@@ -3701,8 +3581,8 @@
/// Pushes a boolean checking [expression] against null.
pushCheckNull(HInstruction expression) {
- push(new HIdentity(expression, graph.addConstantNull(compiler),
- null, backend.boolType));
+ push(new HIdentity(
+ expression, graph.addConstantNull(compiler), null, backend.boolType));
}
@override
@@ -3721,72 +3601,47 @@
}
@override
- void visitStaticFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ void visitStaticFieldGet(ast.Send node, FieldElement field, _) {
generateStaticFieldGet(node, field);
}
@override
- void visitStaticFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ void visitStaticFunctionGet(ast.Send node, MethodElement function, _) {
generateStaticFunctionGet(node, function);
}
@override
- void visitStaticGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ void visitStaticGetterGet(ast.Send node, FunctionElement getter, _) {
generateStaticGetterGet(node, getter);
}
@override
- void visitThisPropertyGet(
- ast.Send node,
- Name name,
- _) {
+ void visitThisPropertyGet(ast.Send node, Name name, _) {
generateDynamicGet(node);
}
@override
- void visitTopLevelFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ void visitTopLevelFieldGet(ast.Send node, FieldElement field, _) {
generateStaticFieldGet(node, field);
}
@override
- void visitTopLevelFunctionGet(
- ast.Send node,
- MethodElement function,
- _) {
+ void visitTopLevelFunctionGet(ast.Send node, MethodElement function, _) {
generateStaticFunctionGet(node, function);
}
@override
- void visitTopLevelGetterGet(
- ast.Send node,
- FunctionElement getter,
- _) {
+ void visitTopLevelGetterGet(ast.Send node, FunctionElement getter, _) {
generateStaticGetterGet(node, getter);
}
- void generateInstanceSetterWithCompiledReceiver(ast.Send send,
- HInstruction receiver,
- HInstruction value,
- {Selector selector,
- TypeMask mask,
- ast.Node location}) {
- assert(invariant(
- send == null ? location : send,
+ void generateInstanceSetterWithCompiledReceiver(
+ ast.Send send, HInstruction receiver, HInstruction value,
+ {Selector selector, TypeMask mask, ast.Node location}) {
+ assert(invariant(send == null ? location : send,
send == null || Elements.isInstanceSend(send, elements),
message: "Unexpected instance setter"
- "${send != null ? " element: ${elements[send]}" : ""}"));
+ "${send != null ? " element: ${elements[send]}" : ""}"));
if (selector == null) {
assert(send != null);
selector = elements.getSelector(send);
@@ -3805,9 +3660,8 @@
stack.add(value);
}
- void generateNoSuchSetter(ast.Node location,
- Element element,
- HInstruction value) {
+ void generateNoSuchSetter(
+ ast.Node location, Element element, HInstruction value) {
List<HInstruction> arguments =
value == null ? const <HInstruction>[] : <HInstruction>[value];
// An erroneous element indicates an unresolved static setter.
@@ -3816,16 +3670,15 @@
argumentValues: arguments);
}
- void generateNonInstanceSetter(ast.SendSet send,
- Element element,
- HInstruction value,
- {ast.Node location}) {
+ void generateNonInstanceSetter(
+ ast.SendSet send, Element element, HInstruction value,
+ {ast.Node location}) {
if (location == null) {
assert(send != null);
location = send;
}
- assert(invariant(location,
- send == null || !Elements.isInstanceSend(send, elements),
+ assert(invariant(
+ location, send == null || !Elements.isInstanceSend(send, elements),
message: "Unexpected non instance setter: $element."));
if (Elements.isStaticOrTopLevelField(element)) {
if (element.isSetter) {
@@ -3838,7 +3691,7 @@
}
stack.add(value);
} else if (Elements.isError(element)) {
- generateNoSuchSetter(location, element, send == null ? null : value);
+ generateNoSuchSetter(location, element, send == null ? null : value);
} else if (Elements.isMalformed(element)) {
// TODO(ahe): Do something like [generateWrongArgumentCountError].
stack.add(graph.addConstantNull(compiler));
@@ -3889,20 +3742,19 @@
// each part the generated sub-template's holes match the index of the
// inputs that are later used to instantiate it. We do this by starting
// the indexing with the number of inputs from previous sub-templates.
- templates.add(
- rtiEncoder.getTypeRepresentationWithPlaceholders(
- argument, (variable) {
- HInstruction runtimeType = addTypeVariableReference(variable);
- inputs.add(runtimeType);
- }, firstPlaceholderIndex: inputs.length));
+ templates.add(rtiEncoder.getTypeRepresentationWithPlaceholders(argument,
+ (variable) {
+ HInstruction runtimeType = addTypeVariableReference(variable);
+ inputs.add(runtimeType);
+ }, firstPlaceholderIndex: inputs.length));
}
// TODO(sra): This is a fresh template each time. We can't let the
// template manager build them.
- js.Template code = new js.Template(null,
- new js.ArrayInitializer(templates));
- HInstruction representation =
- new HForeignCode(code, backend.readableArrayType, inputs,
- nativeBehavior: native.NativeBehavior.PURE_ALLOCATION);
+ js.Template code =
+ new js.Template(null, new js.ArrayInitializer(templates));
+ HInstruction representation = new HForeignCode(
+ code, backend.readableArrayType, inputs,
+ nativeBehavior: native.NativeBehavior.PURE_ALLOCATION);
return representation;
}
}
@@ -3914,10 +3766,8 @@
ErroneousElement element = type.element;
generateTypeError(node, element.message);
} else {
- HInstruction converted = buildTypeConversion(
- expressionInstruction,
- localsHandler.substInContext(type),
- HTypeConversion.CAST_TYPE_CHECK);
+ HInstruction converted = buildTypeConversion(expressionInstruction,
+ localsHandler.substInContext(type), HTypeConversion.CAST_TYPE_CHECK);
if (converted != expressionInstruction) add(converted);
stack.add(converted);
}
@@ -3937,16 +3787,14 @@
push(new HNot(instruction, backend.boolType));
}
- HInstruction buildIsNode(ast.Node node,
- DartType type,
- HInstruction expression) {
+ HInstruction buildIsNode(
+ ast.Node node, DartType type, HInstruction expression) {
type = localsHandler.substInContext(type).unaliased;
if (type.isFunctionType) {
List arguments = [buildFunctionType(type), expression];
pushInvokeDynamic(
node,
- new Selector.call(
- new PrivateName('_isTest', helpers.jsHelperLibrary),
+ new Selector.call(new PrivateName('_isTest', helpers.jsHelperLibrary),
CallStructure.ONE_ARG),
null,
arguments);
@@ -3961,18 +3809,19 @@
} else if (RuntimeTypes.hasTypeArguments(type)) {
ClassElement element = type.element;
Element helper = helpers.checkSubtype;
- HInstruction representations =
- buildTypeArgumentRepresentations(type);
+ HInstruction representations = buildTypeArgumentRepresentations(type);
add(representations);
js.Name operator = backend.namer.operatorIs(element);
HInstruction isFieldName = addConstantStringFromName(operator);
HInstruction asFieldName = compiler.world.hasAnyStrictSubtype(element)
? addConstantStringFromName(backend.namer.substitutionName(element))
: graph.addConstantNull(compiler);
- List<HInstruction> inputs = <HInstruction>[expression,
- isFieldName,
- representations,
- asFieldName];
+ List<HInstruction> inputs = <HInstruction>[
+ expression,
+ isFieldName,
+ representations,
+ asFieldName
+ ];
pushInvokeStatic(node, helper, inputs, typeMask: backend.boolType);
HInstruction call = pop();
return new HIs.compound(type, expression, call, backend.boolType);
@@ -4006,15 +3855,14 @@
Link<ast.Node> arguments = node.arguments;
int positionalArgumentCount = callStructure.positionalArgumentCount;
for (int i = 0;
- i < positionalArgumentCount;
- arguments = arguments.tail, i++) {
+ i < positionalArgumentCount;
+ arguments = arguments.tail, i++) {
visit(arguments.head);
list.add(pop());
}
// Visit named arguments and add them into a temporary map.
- Map<String, HInstruction> instructions =
- new Map<String, HInstruction>();
+ Map<String, HInstruction> instructions = new Map<String, HInstruction>();
List<String> namedArguments = callStructure.namedArguments;
int nameIndex = 0;
for (; !arguments.isEmpty; arguments = arguments.tail) {
@@ -4039,8 +3887,7 @@
* Invariant: [element] must be an implementation element.
*/
List<HInstruction> makeStaticArgumentList(CallStructure callStructure,
- Link<ast.Node> arguments,
- FunctionElement element) {
+ Link<ast.Node> arguments, FunctionElement element) {
assert(invariant(element, element.isImplementation));
HInstruction compileArgument(ast.Node argument) {
@@ -4052,12 +3899,13 @@
arguments,
element,
compileArgument,
- backend.isJsInterop(element) ?
- handleConstantForOptionalParameterJsInterop :
- handleConstantForOptionalParameter);
+ backend.isJsInterop(element)
+ ? handleConstantForOptionalParameterJsInterop
+ : handleConstantForOptionalParameter);
}
- void addGenericSendArgumentsToList(Link<ast.Node> link, List<HInstruction> list) {
+ void addGenericSendArgumentsToList(
+ Link<ast.Node> link, List<HInstruction> list) {
for (; !link.isEmpty; link = link.tail) {
visit(link.head);
list.add(pop());
@@ -4081,7 +3929,7 @@
addDynamicSendArgumentsToList(node, inputs);
pushInvokeDynamic(node, selector, mask, inputs,
- sourceInformation: sourceInformation);
+ sourceInformation: sourceInformation);
if (selector.isSetter || selector.isIndexSet) {
pop();
stack.add(inputs.last);
@@ -4089,104 +3937,61 @@
}
@override
- visitDynamicPropertyInvoke(
- ast.Send node,
- ast.Node receiver,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ visitDynamicPropertyInvoke(ast.Send node, ast.Node receiver,
+ ast.NodeList arguments, Selector selector, _) {
generateDynamicSend(node);
}
@override
- visitIfNotNullDynamicPropertyInvoke(
- ast.Send node,
- ast.Node receiver,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ visitIfNotNullDynamicPropertyInvoke(ast.Send node, ast.Node receiver,
+ ast.NodeList arguments, Selector selector, _) {
/// Desugar `exp?.m()` to `(t1 = exp) == null ? t1 : t1.m()`
HInstruction receiver;
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleConditional(
- () {
- receiver = generateInstanceSendReceiver(node);
- pushCheckNull(receiver);
- },
- () => stack.add(receiver),
- () => _generateDynamicSend(node, receiver));
+ brancher.handleConditional(() {
+ receiver = generateInstanceSendReceiver(node);
+ pushCheckNull(receiver);
+ }, () => stack.add(receiver), () => _generateDynamicSend(node, receiver));
}
@override
visitThisPropertyInvoke(
- ast.Send node,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ ast.Send node, ast.NodeList arguments, Selector selector, _) {
generateDynamicSend(node);
}
@override
- visitExpressionInvoke(
- ast.Send node,
- ast.Node expression,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- visitAndPop(expression),
+ visitExpressionInvoke(ast.Send node, ast.Node expression,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, visitAndPop(expression),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
visitThisInvoke(
- ast.Send node,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readThis(),
+ ast.Send node, ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readThis(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- visitParameterInvoke(
- ast.Send node,
- ParameterElement parameter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readLocal(parameter),
+ visitParameterInvoke(ast.Send node, ParameterElement parameter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readLocal(parameter),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- visitLocalVariableInvoke(
- ast.Send node,
- LocalVariableElement variable,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readLocal(variable),
+ visitLocalVariableInvoke(ast.Send node, LocalVariableElement variable,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readLocal(variable),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- visitLocalFunctionInvoke(
- ast.Send node,
- LocalFunctionElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
- generateCallInvoke(
- node,
- localsHandler.readLocal(function),
+ visitLocalFunctionInvoke(ast.Send node, LocalFunctionElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
+ generateCallInvoke(node, localsHandler.readLocal(function),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@@ -4207,8 +4012,8 @@
// argument, which is the foreign code.
if (link.isEmpty || link.tail.isEmpty) {
// We should not get here because the call should be compiled to NSM.
- reporter.internalError(node.argumentsNode,
- 'At least two arguments expected.');
+ reporter.internalError(
+ node.argumentsNode, 'At least two arguments expected.');
}
native.NativeBehavior nativeBehavior =
compiler.enqueuer.resolution.nativeEnqueuer.getNativeBehaviorOf(node);
@@ -4217,12 +4022,11 @@
addGenericSendArgumentsToList(link.tail.tail, inputs);
if (nativeBehavior.codeTemplate.positionalArgumentCount != inputs.length) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text':
- 'Mismatch between number of placeholders'
- ' and number of arguments.'});
- stack.add(graph.addConstantNull(compiler)); // Result expected on stack.
+ reporter.reportErrorMessage(node, MessageKind.GENERIC, {
+ 'text': 'Mismatch between number of placeholders'
+ ' and number of arguments.'
+ });
+ stack.add(graph.addConstantNull(compiler)); // Result expected on stack.
return;
}
@@ -4236,18 +4040,15 @@
SourceInformation sourceInformation =
sourceInformationBuilder.buildCall(node, node.argumentsNode);
if (nativeBehavior.codeTemplate.isExpression) {
- push(new HForeignCode(
- nativeBehavior.codeTemplate, ssaType, inputs,
- effects: nativeBehavior.sideEffects,
- nativeBehavior: nativeBehavior)
- ..sourceInformation = sourceInformation);
+ push(new HForeignCode(nativeBehavior.codeTemplate, ssaType, inputs,
+ effects: nativeBehavior.sideEffects, nativeBehavior: nativeBehavior)
+ ..sourceInformation = sourceInformation);
} else {
- push(new HForeignCode(
- nativeBehavior.codeTemplate, ssaType, inputs,
+ push(new HForeignCode(nativeBehavior.codeTemplate, ssaType, inputs,
isStatement: true,
effects: nativeBehavior.sideEffects,
nativeBehavior: nativeBehavior)
- ..sourceInformation = sourceInformation);
+ ..sourceInformation = sourceInformation);
}
}
@@ -4262,8 +4063,8 @@
void handleForeignJsCurrentIsolateContext(ast.Send node) {
if (!node.arguments.isEmpty) {
- reporter.internalError(node,
- 'Too many arguments to JS_CURRENT_ISOLATE_CONTEXT.');
+ reporter.internalError(
+ node, 'Too many arguments to JS_CURRENT_ISOLATE_CONTEXT.');
}
if (!compiler.hasIsolateSupport) {
@@ -4271,9 +4072,7 @@
// to fetch the static state.
String name = backend.namer.staticStateHolder;
push(new HForeignCode(
- js.js.parseForeignJS(name),
- backend.dynamicType,
- <HInstruction>[],
+ js.js.parseForeignJS(name), backend.dynamicType, <HInstruction>[],
nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
} else {
// Call a helper method from the isolate library. The isolate
@@ -4281,8 +4080,7 @@
// Leg's isolate.
Element element = helpers.currentIsolate;
if (element == null) {
- reporter.internalError(node,
- 'Isolate library and compiler mismatch.');
+ reporter.internalError(node, 'Isolate library and compiler mismatch.');
}
pushInvokeStatic(null, element, [], typeMask: backend.dynamicType);
}
@@ -4290,102 +4088,91 @@
void handleForeignJsGetFlag(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
- ast.Node argument;
- switch (arguments.length) {
- case 0:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Expected one argument to JS_GET_FLAG.'});
- return;
- case 1:
- argument = arguments[0];
- break;
- default:
- for (int i = 1; i < arguments.length; i++) {
- reporter.reportErrorMessage(
- arguments[i], MessageKind.GENERIC,
- {'text': 'Error: Extra argument to JS_GET_FLAG.'});
- }
- return;
- }
- ast.LiteralString string = argument.asLiteralString();
- if (string == null) {
- reporter.reportErrorMessage(
- argument, MessageKind.GENERIC,
- {'text': 'Error: Expected a literal string.'});
- }
- String name = string.dartString.slowToString();
- bool value = false;
- switch (name) {
- case 'MUST_RETAIN_METADATA':
- value = backend.mustRetainMetadata;
- break;
- case 'USE_CONTENT_SECURITY_POLICY':
- value = compiler.options.useContentSecurityPolicy;
- break;
- default:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Unknown internal flag "$name".'});
- }
- stack.add(graph.addConstantBool(value, compiler));
+ ast.Node argument;
+ switch (arguments.length) {
+ case 0:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Expected one argument to JS_GET_FLAG.'});
+ return;
+ case 1:
+ argument = arguments[0];
+ break;
+ default:
+ for (int i = 1; i < arguments.length; i++) {
+ reporter.reportErrorMessage(arguments[i], MessageKind.GENERIC,
+ {'text': 'Error: Extra argument to JS_GET_FLAG.'});
+ }
+ return;
+ }
+ ast.LiteralString string = argument.asLiteralString();
+ if (string == null) {
+ reporter.reportErrorMessage(argument, MessageKind.GENERIC,
+ {'text': 'Error: Expected a literal string.'});
+ }
+ String name = string.dartString.slowToString();
+ bool value = false;
+ switch (name) {
+ case 'MUST_RETAIN_METADATA':
+ value = backend.mustRetainMetadata;
+ break;
+ case 'USE_CONTENT_SECURITY_POLICY':
+ value = compiler.options.useContentSecurityPolicy;
+ break;
+ default:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Unknown internal flag "$name".'});
+ }
+ stack.add(graph.addConstantBool(value, compiler));
}
void handleForeignJsGetName(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
ast.Node argument;
switch (arguments.length) {
- case 0:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Expected one argument to JS_GET_NAME.'});
- return;
- case 1:
- argument = arguments[0];
- break;
- default:
- for (int i = 1; i < arguments.length; i++) {
- reporter.reportErrorMessage(
- arguments[i], MessageKind.GENERIC,
- {'text': 'Error: Extra argument to JS_GET_NAME.'});
- }
- return;
+ case 0:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Expected one argument to JS_GET_NAME.'});
+ return;
+ case 1:
+ argument = arguments[0];
+ break;
+ default:
+ for (int i = 1; i < arguments.length; i++) {
+ reporter.reportErrorMessage(arguments[i], MessageKind.GENERIC,
+ {'text': 'Error: Extra argument to JS_GET_NAME.'});
+ }
+ return;
}
Element element = elements[argument];
if (element == null ||
- element is! FieldElement ||
+ element is! EnumConstantElement ||
element.enclosingClass != helpers.jsGetNameEnum) {
- reporter.reportErrorMessage(
- argument, MessageKind.GENERIC,
+ reporter.reportErrorMessage(argument, MessageKind.GENERIC,
{'text': 'Error: Expected a JsGetName enum value.'});
}
- EnumClassElement enumClass = element.enclosingClass;
- int index = enumClass.enumValues.indexOf(element);
- stack.add(
- addConstantStringFromName(
- backend.namer.getNameForJsGetName(
- argument, JsGetName.values[index])));
+ EnumConstantElement enumConstant = element;
+ int index = enumConstant.index;
+ stack.add(addConstantStringFromName(
+ backend.namer.getNameForJsGetName(argument, JsGetName.values[index])));
}
void handleForeignJsBuiltin(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
ast.Node argument;
if (arguments.length < 2) {
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
{'text': 'Error: Expected at least two arguments to JS_BUILTIN.'});
}
Element builtinElement = elements[arguments[1]];
if (builtinElement == null ||
- (builtinElement is! FieldElement) ||
+ (builtinElement is! EnumConstantElement) ||
builtinElement.enclosingClass != helpers.jsBuiltinEnum) {
- reporter.reportErrorMessage(
- argument, MessageKind.GENERIC,
+ reporter.reportErrorMessage(argument, MessageKind.GENERIC,
{'text': 'Error: Expected a JsBuiltin enum value.'});
}
- EnumClassElement enumClass = builtinElement.enclosingClass;
- int index = enumClass.enumValues.indexOf(builtinElement);
+ EnumConstantElement enumConstant = builtinElement;
+ int index = enumConstant.index;
js.Template template =
backend.emitter.builtinTemplateFor(JsBuiltin.values[index]);
@@ -4402,42 +4189,38 @@
TypeMask ssaType =
TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler);
- push(new HForeignCode(template,
- ssaType,
- compiledArguments,
- nativeBehavior: nativeBehavior));
+ push(new HForeignCode(template, ssaType, compiledArguments,
+ nativeBehavior: nativeBehavior));
}
void handleForeignJsEmbeddedGlobal(ast.Send node) {
List<ast.Node> arguments = node.arguments.toList();
ast.Node globalNameNode;
switch (arguments.length) {
- case 0:
- case 1:
- reporter.reportErrorMessage(
- node, MessageKind.GENERIC,
- {'text': 'Error: Expected two arguments to JS_EMBEDDED_GLOBAL.'});
- return;
- case 2:
- // The type has been extracted earlier. We are only interested in the
- // name in this function.
- globalNameNode = arguments[1];
- break;
- default:
- for (int i = 2; i < arguments.length; i++) {
- reporter.reportErrorMessage(
- arguments[i], MessageKind.GENERIC,
- {'text': 'Error: Extra argument to JS_EMBEDDED_GLOBAL.'});
- }
- return;
+ case 0:
+ case 1:
+ reporter.reportErrorMessage(node, MessageKind.GENERIC,
+ {'text': 'Error: Expected two arguments to JS_EMBEDDED_GLOBAL.'});
+ return;
+ case 2:
+ // The type has been extracted earlier. We are only interested in the
+ // name in this function.
+ globalNameNode = arguments[1];
+ break;
+ default:
+ for (int i = 2; i < arguments.length; i++) {
+ reporter.reportErrorMessage(arguments[i], MessageKind.GENERIC,
+ {'text': 'Error: Extra argument to JS_EMBEDDED_GLOBAL.'});
+ }
+ return;
}
visit(globalNameNode);
HInstruction globalNameHNode = pop();
if (!globalNameHNode.isConstantString()) {
- reporter.reportErrorMessage(
- arguments[1], MessageKind.GENERIC,
- {'text': 'Error: Expected String as second argument '
- 'to JS_EMBEDDED_GLOBAL.'});
+ reporter.reportErrorMessage(arguments[1], MessageKind.GENERIC, {
+ 'text': 'Error: Expected String as second argument '
+ 'to JS_EMBEDDED_GLOBAL.'
+ });
return;
}
HConstant hConstant = globalNameHNode;
@@ -4450,7 +4233,7 @@
TypeMask ssaType =
TypeMaskFactory.fromNativeBehavior(nativeBehavior, compiler);
push(new HForeignCode(expr, ssaType, const [],
- nativeBehavior: nativeBehavior));
+ nativeBehavior: nativeBehavior));
}
void handleJsInterceptorConstant(ast.Send node) {
@@ -4472,8 +4255,7 @@
}
}
reporter.reportErrorMessage(
- node,
- MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
+ node, MessageKind.WRONG_ARGUMENT_FOR_JS_INTERCEPTOR_CONSTANT);
stack.add(graph.addConstantNull(compiler));
}
@@ -4484,14 +4266,12 @@
// closure.
visit(link.tail.head);
push(new HInvokeClosure(new Selector.callClosure(0),
- <HInstruction>[pop()],
- backend.dynamicType));
+ <HInstruction>[pop()], backend.dynamicType));
} else {
// Call a helper method from the isolate library.
Element element = helpers.callInIsolate;
if (element == null) {
- reporter.internalError(node,
- 'Isolate library and compiler mismatch.');
+ reporter.internalError(node, 'Isolate library and compiler mismatch.');
}
List<HInstruction> inputs = <HInstruction>[];
addGenericSendArgumentsToList(link, inputs);
@@ -4501,14 +4281,14 @@
FunctionSignature handleForeignRawFunctionRef(ast.Send node, String name) {
if (node.arguments.isEmpty || !node.arguments.tail.isEmpty) {
- reporter.internalError(node.argumentsNode,
- '"$name" requires exactly one argument.');
+ reporter.internalError(
+ node.argumentsNode, '"$name" requires exactly one argument.');
}
ast.Node closure = node.arguments.head;
Element element = elements[closure];
if (!Elements.isStaticOrTopLevelFunction(element)) {
- reporter.internalError(closure,
- '"$name" requires a static or top-level method.');
+ reporter.internalError(
+ closure, '"$name" requires a static or top-level method.');
}
FunctionElement function = element;
// TODO(johnniwinther): Try to eliminate the need to distinguish declaration
@@ -4517,12 +4297,11 @@
FunctionElement implementation = function.implementation;
FunctionSignature params = implementation.functionSignature;
if (params.optionalParameterCount != 0) {
- reporter.internalError(closure,
- '"$name" does not handle closure with optional parameters.');
+ reporter.internalError(
+ closure, '"$name" does not handle closure with optional parameters.');
}
- registry?.registerStaticUse(
- new StaticUse.foreignUse(function));
+ registry?.registerStaticUse(new StaticUse.foreignUse(function));
push(new HForeignCode(
js.js.expressionTemplateYielding(
backend.emitter.staticFunctionAccess(function)),
@@ -4541,17 +4320,15 @@
void handleForeignJsSetStaticState(ast.Send node) {
if (node.arguments.isEmpty || !node.arguments.tail.isEmpty) {
- reporter.internalError(node.argumentsNode,
- 'Exactly one argument required.');
+ reporter.internalError(
+ node.argumentsNode, 'Exactly one argument required.');
}
visit(node.arguments.head);
String isolateName = backend.namer.staticStateHolder;
SideEffects sideEffects = new SideEffects.empty();
sideEffects.setAllSideEffects();
- push(new HForeignCode(
- js.js.parseForeignJS("$isolateName = #"),
- backend.dynamicType,
- <HInstruction>[pop()],
+ push(new HForeignCode(js.js.parseForeignJS("$isolateName = #"),
+ backend.dynamicType, <HInstruction>[pop()],
nativeBehavior: native.NativeBehavior.CHANGES_OTHER,
effects: sideEffects));
}
@@ -4561,9 +4338,8 @@
reporter.internalError(node.argumentsNode, 'Too many arguments.');
}
push(new HForeignCode(js.js.parseForeignJS(backend.namer.staticStateHolder),
- backend.dynamicType,
- <HInstruction>[],
- nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
+ backend.dynamicType, <HInstruction>[],
+ nativeBehavior: native.NativeBehavior.DEPENDS_OTHER));
}
void handleForeignSend(ast.Send node, FunctionElement element) {
@@ -4601,25 +4377,23 @@
}
}
- generateDeferredLoaderGet(ast.Send node,
- FunctionElement deferredLoader,
- SourceInformation sourceInformation) {
+ generateDeferredLoaderGet(ast.Send node, FunctionElement deferredLoader,
+ SourceInformation sourceInformation) {
// Until now we only handle these as getters.
invariant(node, deferredLoader.isDeferredLoaderGetter);
Element loadFunction = compiler.loadLibraryFunction;
PrefixElement prefixElement = deferredLoader.enclosingElement;
String loadId =
compiler.deferredLoadTask.getImportDeferName(node, prefixElement);
- var inputs = [graph.addConstantString(
- new ast.DartString.literal(loadId), compiler)];
+ var inputs = [
+ graph.addConstantString(new ast.DartString.literal(loadId), compiler)
+ ];
push(new HInvokeStatic(loadFunction, inputs, backend.nonNullType,
- targetCanThrow: false)
- ..sourceInformation = sourceInformation);
+ targetCanThrow: false)..sourceInformation = sourceInformation);
}
- generateSuperNoSuchMethodSend(ast.Send node,
- Selector selector,
- List<HInstruction> arguments) {
+ generateSuperNoSuchMethodSend(
+ ast.Send node, Selector selector, List<HInstruction> arguments) {
String name = selector.name;
ClassElement cls = currentNonClosureClass;
@@ -4638,8 +4412,8 @@
String publicName = name;
if (selector.isSetter) publicName += '=';
- ConstantValue nameConstant = constantSystem.createString(
- new ast.DartString.literal(publicName));
+ ConstantValue nameConstant =
+ constantSystem.createString(new ast.DartString.literal(publicName));
js.Name internalName = backend.namer.invocationName(selector);
@@ -4659,33 +4433,33 @@
ConstantValue kindConstant =
constantSystem.createInt(selector.invocationMirrorKind);
- pushInvokeStatic(null,
- createInvocationMirror,
- [graph.addConstant(nameConstant, compiler),
- graph.addConstantStringFromName(internalName, compiler),
- graph.addConstant(kindConstant, compiler),
- argumentsInstruction,
- argumentNamesInstruction],
- typeMask: backend.dynamicType);
+ pushInvokeStatic(
+ null,
+ createInvocationMirror,
+ [
+ graph.addConstant(nameConstant, compiler),
+ graph.addConstantStringFromName(internalName, compiler),
+ graph.addConstant(kindConstant, compiler),
+ argumentsInstruction,
+ argumentNamesInstruction
+ ],
+ typeMask: backend.dynamicType);
var inputs = <HInstruction>[pop()];
push(buildInvokeSuper(Selectors.noSuchMethod_, element, inputs));
}
/// Generate a call to a super method or constructor.
- void generateSuperInvoke(ast.Send node,
- FunctionElement function,
- SourceInformation sourceInformation) {
+ void generateSuperInvoke(ast.Send node, FunctionElement function,
+ SourceInformation sourceInformation) {
// TODO(5347): Try to avoid the need for calling [implementation] before
// calling [makeStaticArgumentList].
Selector selector = elements.getSelector(node);
- assert(invariant(node,
- selector.applies(function.implementation, compiler.world),
+ assert(invariant(
+ node, selector.applies(function.implementation, compiler.world),
message: "$selector does not apply to ${function.implementation}"));
- List<HInstruction> inputs =
- makeStaticArgumentList(selector.callStructure,
- node.arguments,
- function.implementation);
+ List<HInstruction> inputs = makeStaticArgumentList(
+ selector.callStructure, node.arguments, function.implementation);
push(buildInvokeSuper(selector, function, inputs, sourceInformation));
}
@@ -4701,22 +4475,17 @@
/// Invoke .call on the value retrieved from the super [element].
void handleSuperCallInvoke(ast.Send node, Element element) {
Selector selector = elements.getSelector(node);
- HInstruction target = buildInvokeSuper(
- selector, element, const <HInstruction>[],
- sourceInformationBuilder.buildGet(node));
+ HInstruction target = buildInvokeSuper(selector, element,
+ const <HInstruction>[], sourceInformationBuilder.buildGet(node));
add(target);
- generateCallInvoke(
- node,
- target,
+ generateCallInvoke(node, target,
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
/// Invoke super [method].
- void handleSuperMethodInvoke(
- ast.Send node,
- MethodElement method) {
- generateSuperInvoke(node, method,
- sourceInformationBuilder.buildCall(node, node.selector));
+ void handleSuperMethodInvoke(ast.Send node, MethodElement method) {
+ generateSuperInvoke(
+ node, method, sourceInformationBuilder.buildCall(node, node.selector));
}
/// Access an unresolved super property.
@@ -4731,185 +4500,116 @@
@override
void visitUnresolvedSuperIndex(
- ast.Send node,
- Element element,
- ast.Node index,
- _) {
+ ast.Send node, Element element, ast.Node index, _) {
handleUnresolvedSuperInvoke(node);
}
@override
void visitUnresolvedSuperUnary(
- ast.Send node,
- UnaryOperator operator,
- Element element,
- _) {
+ ast.Send node, UnaryOperator operator, Element element, _) {
handleUnresolvedSuperInvoke(node);
}
@override
- void visitUnresolvedSuperBinary(
- ast.Send node,
- Element element,
- BinaryOperator operator,
- ast.Node argument,
- _) {
+ void visitUnresolvedSuperBinary(ast.Send node, Element element,
+ BinaryOperator operator, ast.Node argument, _) {
handleUnresolvedSuperInvoke(node);
}
@override
- void visitUnresolvedSuperGet(
- ast.Send node,
- Element element,
- _) {
+ void visitUnresolvedSuperGet(ast.Send node, Element element, _) {
handleUnresolvedSuperInvoke(node);
}
@override
void visitUnresolvedSuperSet(
- ast.Send node,
- Element element,
- ast.Node rhs,
- _) {
+ ast.Send node, Element element, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ void visitSuperSetterGet(ast.Send node, MethodElement setter, _) {
handleUnresolvedSuperInvoke(node);
}
@override
void visitUnresolvedSuperInvoke(
- ast.Send node,
- Element element,
- ast.Node argument,
- Selector selector,
- _) {
+ ast.Send node, Element element, ast.Node argument, Selector selector, _) {
handleUnresolvedSuperInvoke(node);
}
@override
- void visitSuperFieldGet(
- ast.Send node,
- FieldElement field,
- _) {
+ void visitSuperFieldGet(ast.Send node, FieldElement field, _) {
handleSuperGet(node, field);
}
@override
- void visitSuperGetterGet(
- ast.Send node,
- MethodElement method,
- _) {
+ void visitSuperGetterGet(ast.Send node, MethodElement method, _) {
handleSuperGet(node, method);
}
@override
- void visitSuperMethodGet(
- ast.Send node,
- MethodElement method,
- _) {
+ void visitSuperMethodGet(ast.Send node, MethodElement method, _) {
handleSuperGet(node, method);
}
@override
- void visitSuperFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleSuperCallInvoke(node, field);
}
@override
- void visitSuperGetterInvoke(
- ast.Send node,
- MethodElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperGetterInvoke(ast.Send node, MethodElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleSuperCallInvoke(node, getter);
}
@override
- void visitSuperMethodInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperMethodInvoke(ast.Send node, MethodElement method,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleSuperMethodInvoke(node, method);
}
@override
- void visitSuperIndex(
- ast.Send node,
- MethodElement method,
- ast.Node index,
- _) {
+ void visitSuperIndex(ast.Send node, MethodElement method, ast.Node index, _) {
handleSuperMethodInvoke(node, method);
}
@override
void visitSuperEquals(
- ast.Send node,
- MethodElement method,
- ast.Node argument,
- _) {
+ ast.Send node, MethodElement method, ast.Node argument, _) {
handleSuperMethodInvoke(node, method);
}
@override
- void visitSuperBinary(
- ast.Send node,
- MethodElement method,
- BinaryOperator operator,
- ast.Node argument,
- _) {
+ void visitSuperBinary(ast.Send node, MethodElement method,
+ BinaryOperator operator, ast.Node argument, _) {
handleSuperMethodInvoke(node, method);
}
@override
void visitSuperNotEquals(
- ast.Send node,
- MethodElement method,
- ast.Node argument,
- _) {
+ ast.Send node, MethodElement method, ast.Node argument, _) {
handleSuperMethodInvoke(node, method);
pushWithPosition(new HNot(popBoolified(), backend.boolType), node.selector);
}
@override
void visitSuperUnary(
- ast.Send node,
- UnaryOperator operator,
- MethodElement method,
- _) {
+ ast.Send node, UnaryOperator operator, MethodElement method, _) {
handleSuperMethodInvoke(node, method);
}
@override
- void visitSuperMethodIncompatibleInvoke(
- ast.Send node,
- MethodElement method,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperMethodIncompatibleInvoke(ast.Send node, MethodElement method,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidSuperInvoke(node, arguments);
}
@override
- void visitSuperSetterInvoke(
- ast.Send node,
- SetterElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitSuperSetterInvoke(ast.Send node, SetterElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidSuperInvoke(node, arguments);
}
@@ -4935,9 +4635,7 @@
* extract the type argument by the index of the variable in the list of type
* variables for that class.
*/
- HInstruction readTypeVariable(
- ClassElement cls,
- TypeVariableElement variable,
+ HInstruction readTypeVariable(ClassElement cls, TypeVariableElement variable,
{SourceInformation sourceInformation}) {
assert(sourceElement.isInstanceMember);
@@ -4949,20 +4647,14 @@
// string concatenation in the implementation), and may prevent
// segmentation of '$'.
js.Name substitutionName = backend.namer.runtimeTypeName(cls);
- HInstruction substitutionNameInstr = graph.addConstantStringFromName(
- substitutionName, compiler);
- pushInvokeStatic(null,
- helpers.getRuntimeTypeArgument,
- [target, substitutionNameInstr, index],
- typeMask: backend.dynamicType,
- sourceInformation: sourceInformation);
+ HInstruction substitutionNameInstr =
+ graph.addConstantStringFromName(substitutionName, compiler);
+ pushInvokeStatic(null, helpers.getRuntimeTypeArgument,
+ [target, substitutionNameInstr, index],
+ typeMask: backend.dynamicType, sourceInformation: sourceInformation);
} else {
- pushInvokeStatic(
- null,
- helpers.getTypeArgumentByIndex,
- [target, index],
- typeMask: backend.dynamicType,
- sourceInformation: sourceInformation);
+ pushInvokeStatic(null, helpers.getTypeArgumentByIndex, [target, index],
+ typeMask: backend.dynamicType, sourceInformation: sourceInformation);
}
return pop();
}
@@ -4972,16 +4664,14 @@
// fixed.
bool hasDirectLocal(Local local) {
return !localsHandler.isAccessedDirectly(local) ||
- localsHandler.directLocals[local] != null;
+ localsHandler.directLocals[local] != null;
}
/**
* Helper to create an instruction that gets the value of a type variable.
*/
- HInstruction addTypeVariableReference(
- TypeVariableType type,
+ HInstruction addTypeVariableReference(TypeVariableType type,
{SourceInformation sourceInformation}) {
-
assert(assertTypeInContext(type));
Element member = sourceElement;
bool isClosure = member.enclosingElement.isClosure;
@@ -4990,8 +4680,8 @@
member = closureClass.methodElement;
member = member.outermostEnclosingMemberOrTopLevel;
}
- bool isInConstructorContext = member.isConstructor ||
- member.isGenerativeConstructorBody;
+ bool isInConstructorContext =
+ member.isConstructor || member.isGenerativeConstructorBody;
Local typeVariableLocal = localsHandler.getTypeVariableAsLocal(type);
if (isClosure) {
if (member.isFactoryConstructor ||
@@ -4999,17 +4689,15 @@
// The type variable is used from a closure in a factory constructor.
// The value of the type argument is stored as a local on the closure
// itself.
- return localsHandler.readLocal(
- typeVariableLocal, sourceInformation: sourceInformation);
+ return localsHandler.readLocal(typeVariableLocal,
+ sourceInformation: sourceInformation);
} else if (member.isFunction ||
- member.isGetter ||
- member.isSetter ||
- isInConstructorContext) {
+ member.isGetter ||
+ member.isSetter ||
+ isInConstructorContext) {
// The type variable is stored on the "enclosing object" and needs to be
// accessed using the this-reference in the closure.
- return readTypeVariable(
- member.enclosingClass,
- type.element,
+ return readTypeVariable(member.enclosingClass, type.element,
sourceInformation: sourceInformation);
} else {
assert(member.isField);
@@ -5017,32 +4705,28 @@
return localsHandler.readLocal(typeVariableLocal);
}
} else if (isInConstructorContext ||
- // When [member] is a field, we can be either
- // generating a checked setter or inlining its
- // initializer in a constructor. An initializer is
- // never built standalone, so in that case [target] is not
- // the [member] itself.
- (member.isField && member != target)) {
+ // When [member] is a field, we can be either
+ // generating a checked setter or inlining its
+ // initializer in a constructor. An initializer is
+ // never built standalone, so in that case [target] is not
+ // the [member] itself.
+ (member.isField && member != target)) {
// The type variable is stored in a parameter of the method.
- return localsHandler.readLocal(
- typeVariableLocal, sourceInformation: sourceInformation);
+ return localsHandler.readLocal(typeVariableLocal,
+ sourceInformation: sourceInformation);
} else if (member.isInstanceMember) {
// The type variable is stored on the object.
- return readTypeVariable(
- member.enclosingClass,
- type.element,
+ return readTypeVariable(member.enclosingClass, type.element,
sourceInformation: sourceInformation);
} else {
- reporter.internalError(type.element,
- 'Unexpected type variable in static context.');
+ reporter.internalError(
+ type.element, 'Unexpected type variable in static context.');
return null;
}
}
- HInstruction analyzeTypeArgument(
- DartType argument,
+ HInstruction analyzeTypeArgument(DartType argument,
{SourceInformation sourceInformation}) {
-
assert(assertTypeInContext(argument));
if (argument.treatAsDynamic) {
// Represent [dynamic] as [null].
@@ -5050,16 +4734,16 @@
}
if (argument.isTypeVariable) {
- return addTypeVariableReference(
- argument, sourceInformation: sourceInformation);
+ return addTypeVariableReference(argument,
+ sourceInformation: sourceInformation);
}
List<HInstruction> inputs = <HInstruction>[];
js.Expression template =
rtiEncoder.getTypeRepresentationWithPlaceholders(argument, (variable) {
- inputs.add(addTypeVariableReference(variable));
- });
+ inputs.add(addTypeVariableReference(variable));
+ });
js.Template code = new js.Template(null, template);
HInstruction result = new HForeignCode(code, backend.stringType, inputs,
@@ -5068,9 +4752,8 @@
return result;
}
- HInstruction handleListConstructor(InterfaceType type,
- ast.Node currentNode,
- HInstruction newObject) {
+ HInstruction handleListConstructor(
+ InterfaceType type, ast.Node currentNode, HInstruction newObject) {
if (!backend.classNeedsRti(type.element) || type.treatAsRaw) {
return newObject;
}
@@ -5092,8 +4775,7 @@
}
HInstruction callSetRuntimeTypeInfo(ClassElement element,
- List<HInstruction> rtiInputs,
- HInstruction newObject) {
+ List<HInstruction> rtiInputs, HInstruction newObject) {
if (!backend.classNeedsRti(element) || element.typeVariables.isEmpty) {
return newObject;
}
@@ -5104,22 +4786,18 @@
// Set the runtime type information on the object.
Element typeInfoSetterElement = helpers.setRuntimeTypeInfo;
pushInvokeStatic(
- null,
- typeInfoSetterElement,
- <HInstruction>[newObject, typeInfo],
+ null, typeInfoSetterElement, <HInstruction>[newObject, typeInfo],
typeMask: backend.dynamicType,
sourceInformation: newObject.sourceInformation);
// The new object will now be referenced through the
// `setRuntimeTypeInfo` call. We therefore set the type of that
// instruction to be of the object's type.
- assert(invariant(
- CURRENT_ELEMENT_SPANNABLE,
+ assert(invariant(CURRENT_ELEMENT_SPANNABLE,
stack.last is HInvokeStatic || stack.last == newObject,
- message:
- "Unexpected `stack.last`: Found ${stack.last}, "
- "expected ${newObject} or an HInvokeStatic. "
- "State: element=$element, rtiInputs=$rtiInputs, stack=$stack."));
+ message: "Unexpected `stack.last`: Found ${stack.last}, "
+ "expected ${newObject} or an HInvokeStatic. "
+ "State: element=$element, rtiInputs=$rtiInputs, stack=$stack."));
stack.last.instructionType = newObject.instructionType;
return pop();
}
@@ -5136,9 +4814,9 @@
TypeMask computeType(element) {
Element originalElement = elements[send];
- if (isFixedListConstructorCall
- || Elements.isFilledListConstructorCall(
- originalElement, send, compiler)) {
+ if (isFixedListConstructorCall ||
+ Elements.isFilledListConstructorCall(
+ originalElement, send, compiler)) {
isFixedList = true;
TypeMask inferred =
TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
@@ -5152,7 +4830,7 @@
? backend.extendableArrayType
: inferred;
} else if (Elements.isConstructorOfTypedArraySubclass(
- originalElement, compiler)) {
+ originalElement, compiler)) {
isFixedList = true;
TypeMask inferred =
TypeMaskFactory.inferredForNode(sourceElement, send, compiler);
@@ -5190,10 +4868,10 @@
if (isSymbolConstructor) {
constructor = compiler.symbolValidatedConstructor;
assert(invariant(send, constructor != null,
- message: 'Constructor Symbol.validated is missing'));
+ message: 'Constructor Symbol.validated is missing'));
callStructure = compiler.symbolValidatedConstructorSelector.callStructure;
assert(invariant(send, callStructure != null,
- message: 'Constructor Symbol.validated is missing'));
+ message: 'Constructor Symbol.validated is missing'));
}
bool isRedirected = constructorDeclaration.isRedirectingFactory;
@@ -5204,8 +4882,7 @@
while (target.isRedirectingFactory) {
if (constructorDeclaration.redirectionDeferredPrefix != null) {
generateIsDeferredLoadedCheckIfNeeded(
- target.redirectionDeferredPrefix,
- node);
+ target.redirectionDeferredPrefix, node);
}
target = target.immediateRedirectionTarget;
}
@@ -5241,8 +4918,8 @@
// calling [makeStaticArgumentList].
constructorImplementation = constructor.implementation;
if (constructorImplementation.isMalformed ||
- !callStructure.signatureApplies(
- constructorImplementation.functionSignature)) {
+ !callStructure
+ .signatureApplies(constructorImplementation.functionSignature)) {
generateWrongArgumentCountError(send, constructor, send.arguments);
return;
}
@@ -5254,16 +4931,18 @@
// Native class generative constructors take a pre-constructed object.
inputs.add(graph.addConstantNull(compiler));
}
- inputs.addAll(makeStaticArgumentList(callStructure,
- send.arguments,
- constructorImplementation));
+ inputs.addAll(makeStaticArgumentList(
+ callStructure, send.arguments, constructorImplementation));
TypeMask elementType = computeType(constructor);
if (isFixedListConstructorCall) {
if (!inputs[0].isNumber(compiler)) {
HTypeConversion conversion = new HTypeConversion(
- null, HTypeConversion.ARGUMENT_TYPE_CHECK, backend.numType,
- inputs[0], null);
+ null,
+ HTypeConversion.ARGUMENT_TYPE_CHECK,
+ backend.numType,
+ inputs[0],
+ null);
add(conversion);
inputs[0] = conversion;
}
@@ -5292,7 +4971,7 @@
// We set the instruction as [canThrow] to avoid it being dead code.
// We need a finer grained side effect.
add(new HForeignCode(code, backend.nullType, [stack.last],
- throwBehavior: native.NativeThrowBehavior.MAY));
+ throwBehavior: native.NativeThrowBehavior.MAY));
}
} else if (isGrowableListConstructorCall) {
push(buildLiteralList(<HInstruction>[]));
@@ -5323,8 +5002,9 @@
// this constructor to have the setRuntimeTypeInfo called where
// the 'new' is done.
if (backend.classNeedsRti(coreClasses.listClass) &&
- (isFixedListConstructorCall || isGrowableListConstructorCall ||
- isJSArrayTypedConstructor)) {
+ (isFixedListConstructorCall ||
+ isGrowableListConstructorCall ||
+ isJSArrayTypedConstructor)) {
newInstance = handleListConstructor(type, send, pop());
stack.add(newInstance);
}
@@ -5339,15 +5019,15 @@
}
}
- void potentiallyAddTypeArguments(List<HInstruction> inputs, ClassElement cls,
- InterfaceType expectedType,
- {SourceInformation sourceInformation}) {
+ void potentiallyAddTypeArguments(
+ List<HInstruction> inputs, ClassElement cls, InterfaceType expectedType,
+ {SourceInformation sourceInformation}) {
if (!backend.classNeedsRti(cls)) return;
assert(expectedType.typeArguments.isEmpty ||
cls.typeVariables.length == expectedType.typeArguments.length);
expectedType.typeArguments.forEach((DartType argument) {
- inputs.add(analyzeTypeArgument(
- argument, sourceInformation: sourceInformation));
+ inputs.add(
+ analyzeTypeArgument(argument, sourceInformation: sourceInformation));
});
}
@@ -5360,17 +5040,15 @@
new Map<DartType, Set<DartType>>();
bool definitelyFails = false;
- addTypeVariableBoundCheck(GenericType instance,
- DartType typeArgument,
- TypeVariableType typeVariable,
- DartType bound) {
+ addTypeVariableBoundCheck(GenericType instance, DartType typeArgument,
+ TypeVariableType typeVariable, DartType bound) {
if (definitelyFails) return;
- int subtypeRelation = compiler.types.computeSubtypeRelation(typeArgument, bound);
+ int subtypeRelation =
+ compiler.types.computeSubtypeRelation(typeArgument, bound);
if (subtypeRelation == Types.IS_SUBTYPE) return;
- String message =
- "Can't create an instance of malbounded type '$type': "
+ String message = "Can't create an instance of malbounded type '$type': "
"'${typeArgument}' is not a subtype of bound '${bound}' for "
"type variable '${typeVariable}' of type "
"${type == instance
@@ -5398,8 +5076,8 @@
}
for (InterfaceType supertype in type.element.allSupertypes) {
DartType instance = type.asInstanceOf(supertype.element);
- compiler.types.checkTypeVariableBounds(instance,
- addTypeVariableBoundCheck);
+ compiler.types
+ .checkTypeVariableBounds(instance, addTypeVariableBoundCheck);
if (definitelyFails) {
return true;
}
@@ -5413,13 +5091,9 @@
/// Generate an invocation to the static or top level [function].
void generateStaticFunctionInvoke(
- ast.Send node,
- FunctionElement function,
- CallStructure callStructure) {
+ ast.Send node, FunctionElement function, CallStructure callStructure) {
List<HInstruction> inputs = makeStaticArgumentList(
- callStructure,
- node.arguments,
- function.implementation);
+ callStructure, node.arguments, function.implementation);
if (function == compiler.identicalFunction) {
pushWithPosition(
@@ -5427,39 +5101,29 @@
return;
} else {
pushInvokeStatic(node, function, inputs,
- sourceInformation: sourceInformationBuilder.buildCall(
- node, node.selector));
+ sourceInformation:
+ sourceInformationBuilder.buildCall(node, node.selector));
}
}
/// Generate an invocation to a static or top level function with the wrong
/// number of arguments.
- void generateStaticFunctionIncompatibleInvoke(ast.Send node,
- Element element) {
+ void generateStaticFunctionIncompatibleInvoke(
+ ast.Send node, Element element) {
generateWrongArgumentCountError(node, element, node.arguments);
}
@override
- void visitStaticFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticFieldGet(node, field);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitStaticFunctionInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticFunctionInvoke(node, function, callStructure);
}
@@ -5474,40 +5138,24 @@
}
@override
- void visitStaticGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticGetterGet(node, getter);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitTopLevelFieldInvoke(
- ast.Send node,
- FieldElement field,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelFieldInvoke(ast.Send node, FieldElement field,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticFieldGet(node, field);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitTopLevelFunctionInvoke(
- ast.Send node,
- MethodElement function,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelFunctionInvoke(ast.Send node, MethodElement function,
+ ast.NodeList arguments, CallStructure callStructure, _) {
if (backend.isForeign(function)) {
handleForeignSend(node, function);
} else {
@@ -5526,76 +5174,48 @@
}
@override
- void visitTopLevelGetterInvoke(
- ast.Send node,
- FunctionElement getter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelGetterInvoke(ast.Send node, FunctionElement getter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateStaticGetterGet(node, getter);
- generateCallInvoke(
- node,
- pop(),
+ generateCallInvoke(node, pop(),
sourceInformationBuilder.buildCall(node, node.argumentsNode));
}
@override
- void visitTopLevelSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ void visitTopLevelSetterGet(ast.Send node, MethodElement setter, _) {
handleInvalidStaticGet(node, setter);
}
@override
- void visitStaticSetterGet(
- ast.Send node,
- MethodElement setter,
- _) {
+ void visitStaticSetterGet(ast.Send node, MethodElement setter, _) {
handleInvalidStaticGet(node, setter);
}
@override
- void visitUnresolvedGet(
- ast.Send node,
- Element element,
- _) {
+ void visitUnresolvedGet(ast.Send node, Element element, _) {
generateStaticUnresolvedGet(node, element);
}
void handleInvalidStaticInvoke(ast.Send node, Element element) {
- generateThrowNoSuchMethod(node,
- noSuchMethodTargetSymbolString(element),
- argumentNodes: node.arguments);
+ generateThrowNoSuchMethod(node, noSuchMethodTargetSymbolString(element),
+ argumentNodes: node.arguments);
}
@override
- void visitStaticSetterInvoke(
- ast.Send node,
- MethodElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitStaticSetterInvoke(ast.Send node, MethodElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidStaticInvoke(node, setter);
}
@override
- void visitTopLevelSetterInvoke(
- ast.Send node,
- MethodElement setter,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ void visitTopLevelSetterInvoke(ast.Send node, MethodElement setter,
+ ast.NodeList arguments, CallStructure callStructure, _) {
handleInvalidStaticInvoke(node, setter);
}
@override
- void visitUnresolvedInvoke(
- ast.Send node,
- Element element,
- ast.NodeList arguments,
- Selector selector,
- _) {
+ void visitUnresolvedInvoke(ast.Send node, Element element,
+ ast.NodeList arguments, Selector selector, _) {
if (element is ErroneousElement) {
// An erroneous element indicates that the function could not be
// resolved (a warning has been issued).
@@ -5616,70 +5236,43 @@
return graph.addConstantStringFromName(name, compiler);
}
- visitClassTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ visitClassTypeLiteralGet(ast.Send node, ConstantExpression constant, _) {
generateConstantTypeLiteral(node);
}
- visitClassTypeLiteralInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitClassTypeLiteralInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateConstantTypeLiteral(node);
generateTypeLiteralCall(node);
}
- visitTypedefTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ visitTypedefTypeLiteralGet(ast.Send node, ConstantExpression constant, _) {
generateConstantTypeLiteral(node);
}
- visitTypedefTypeLiteralInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitTypedefTypeLiteralInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateConstantTypeLiteral(node);
generateTypeLiteralCall(node);
}
visitTypeVariableTypeLiteralGet(
- ast.Send node,
- TypeVariableElement element,
- _) {
+ ast.Send node, TypeVariableElement element, _) {
generateTypeVariableLiteral(node, element.type);
}
- visitTypeVariableTypeLiteralInvoke(
- ast.Send node,
- TypeVariableElement element,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitTypeVariableTypeLiteralInvoke(ast.Send node, TypeVariableElement element,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateTypeVariableLiteral(node, element.type);
generateTypeLiteralCall(node);
}
- visitDynamicTypeLiteralGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ visitDynamicTypeLiteralGet(ast.Send node, ConstantExpression constant, _) {
generateConstantTypeLiteral(node);
}
- visitDynamicTypeLiteralInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStructure,
- _) {
+ visitDynamicTypeLiteralInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStructure, _) {
generateConstantTypeLiteral(node);
generateTypeLiteralCall(node);
}
@@ -5697,18 +5290,14 @@
}
/// Generate the literal for [typeVariable] in the current context.
- void generateTypeVariableLiteral(ast.Send node,
- TypeVariableType typeVariable) {
+ void generateTypeVariableLiteral(
+ ast.Send node, TypeVariableType typeVariable) {
DartType type = localsHandler.substInContext(typeVariable);
HInstruction value = analyzeTypeArgument(type,
sourceInformation: sourceInformationBuilder.buildGet(node));
- pushInvokeStatic(node,
- helpers.runtimeTypeToString,
- [value],
- typeMask: backend.stringType);
- pushInvokeStatic(node,
- helpers.createRuntimeType,
- [pop()]);
+ pushInvokeStatic(node, helpers.runtimeTypeToString, [value],
+ typeMask: backend.stringType);
+ pushInvokeStatic(node, helpers.createRuntimeType, [pop()]);
}
/// Generate a call to a type literal.
@@ -5723,16 +5312,14 @@
}
/// Generate a '.call' invocation on [target].
- void generateCallInvoke(ast.Send node,
- HInstruction target,
- SourceInformation sourceInformation) {
+ void generateCallInvoke(
+ ast.Send node, HInstruction target, SourceInformation sourceInformation) {
Selector selector = elements.getSelector(node);
List<HInstruction> inputs = <HInstruction>[target];
addDynamicSendArgumentsToList(node, inputs);
push(new HInvokeClosure(
- new Selector.callClosureFrom(selector),
- inputs, backend.dynamicType)
- ..sourceInformation = sourceInformation);
+ new Selector.callClosureFrom(selector), inputs, backend.dynamicType)
+ ..sourceInformation = sourceInformation);
}
visitGetterSend(ast.Send node) {
@@ -5758,17 +5345,14 @@
}
void generateAbstractClassInstantiationError(ast.Node node, String message) {
- generateError(node,
- message,
- helpers.throwAbstractClassInstantiationError);
+ generateError(node, message, helpers.throwAbstractClassInstantiationError);
}
- void generateThrowNoSuchMethod(ast.Node diagnosticNode,
- String methodName,
- {Link<ast.Node> argumentNodes,
- List<HInstruction> argumentValues,
- List<String> existingArguments,
- SourceInformation sourceInformation}) {
+ void generateThrowNoSuchMethod(ast.Node diagnosticNode, String methodName,
+ {Link<ast.Node> argumentNodes,
+ List<HInstruction> argumentValues,
+ List<String> existingArguments,
+ SourceInformation sourceInformation}) {
Element helper = helpers.throwNoSuchMethod;
ConstantValue receiverConstant =
constantSystem.createString(new ast.DartString.empty());
@@ -5799,10 +5383,9 @@
} else {
existingNamesList = graph.addConstantNull(compiler);
}
- pushInvokeStatic(diagnosticNode,
- helper,
- [receiver, name, arguments, existingNamesList],
- sourceInformation: sourceInformation);
+ pushInvokeStatic(
+ diagnosticNode, helper, [receiver, name, arguments, existingNamesList],
+ sourceInformation: sourceInformation);
}
/**
@@ -5811,17 +5394,14 @@
* arguments.
*/
void generateWrongArgumentCountError(ast.Node diagnosticNode,
- FunctionElement function,
- Link<ast.Node> argumentNodes) {
+ FunctionElement function, Link<ast.Node> argumentNodes) {
List<String> existingArguments = <String>[];
FunctionSignature signature = function.functionSignature;
signature.forEachParameter((Element parameter) {
existingArguments.add(parameter.name);
});
- generateThrowNoSuchMethod(diagnosticNode,
- function.name,
- argumentNodes: argumentNodes,
- existingArguments: existingArguments);
+ generateThrowNoSuchMethod(diagnosticNode, function.name,
+ argumentNodes: argumentNodes, existingArguments: existingArguments);
}
@override
@@ -5842,8 +5422,7 @@
if (error.messageKind == MessageKind.CANNOT_FIND_CONSTRUCTOR ||
error.messageKind == MessageKind.CANNOT_FIND_UNNAMED_CONSTRUCTOR) {
generateThrowNoSuchMethod(
- node.send,
- noSuchMethodTargetSymbolString(error, 'constructor'),
+ node.send, noSuchMethodTargetSymbolString(error, 'constructor'),
argumentNodes: node.send.arguments);
} else {
MessageTemplate template = MessageTemplate.TEMPLATES[error.messageKind];
@@ -5877,26 +5456,20 @@
bulkHandleNew(node);
}
- void pushInvokeDynamic(ast.Node node,
- Selector selector,
- TypeMask mask,
- List<HInstruction> arguments,
- {SourceInformation sourceInformation}) {
-
+ void pushInvokeDynamic(ast.Node node, Selector selector, TypeMask mask,
+ List<HInstruction> arguments,
+ {SourceInformation sourceInformation}) {
// We prefer to not inline certain operations on indexables,
// because the constant folder will handle them better and turn
// them into simpler instructions that allow further
// optimizations.
bool isOptimizableOperationOnIndexable(Selector selector, Element element) {
- bool isLength = selector.isGetter
- && selector.name == "length";
+ bool isLength = selector.isGetter && selector.name == "length";
if (isLength || selector.isIndex) {
return compiler.world.isSubtypeOf(
- element.enclosingClass.declaration,
- helpers.jsIndexableClass);
+ element.enclosingClass.declaration, helpers.jsIndexableClass);
} else if (selector.isIndexSet) {
- return compiler.world.isSubtypeOf(
- element.enclosingClass.declaration,
+ return compiler.world.isSubtypeOf(element.enclosingClass.declaration,
helpers.jsMutableIndexableClass);
} else {
return false;
@@ -5940,35 +5513,32 @@
TypeMask type =
TypeMaskFactory.inferredTypeForSelector(selector, mask, compiler);
if (selector.isGetter) {
- push(
- new HInvokeDynamicGetter(selector, mask, null, inputs, type)
- ..sourceInformation = sourceInformation);
+ push(new HInvokeDynamicGetter(selector, mask, null, inputs, type)
+ ..sourceInformation = sourceInformation);
} else if (selector.isSetter) {
- push(
- new HInvokeDynamicSetter(selector, mask, null, inputs, type)
- ..sourceInformation = sourceInformation);
+ push(new HInvokeDynamicSetter(selector, mask, null, inputs, type)
+ ..sourceInformation = sourceInformation);
} else {
- push(
- new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted)
- ..sourceInformation = sourceInformation);
+ push(new HInvokeDynamicMethod(selector, mask, inputs, type, isIntercepted)
+ ..sourceInformation = sourceInformation);
}
}
bool _hasNamedParameters(FunctionElement function) {
FunctionSignature params = function.functionSignature;
- return params.optionalParameterCount > 0
- && params.optionalParametersAreNamed;
+ return params.optionalParameterCount > 0 &&
+ params.optionalParametersAreNamed;
}
HForeignCode invokeJsInteropFunction(FunctionElement element,
- List<HInstruction> arguments,
- SourceInformation sourceInformation) {
+ List<HInstruction> arguments, SourceInformation sourceInformation) {
assert(backend.isJsInterop(element));
nativeEmitter.nativeMethods.add(element);
String templateString;
if (element.isFactoryConstructor &&
- backend.jsInteropAnalysis.hasAnonymousAnnotation(element.contextClass)) {
+ backend.jsInteropAnalysis
+ .hasAnonymousAnnotation(element.contextClass)) {
// Factory constructor that is syntactic sugar for creating a JavaScript
// object literal.
ConstructorElement constructor = element;
@@ -5980,7 +5550,7 @@
params.orderedForEachParameter((ParameterElement parameter) {
// TODO(jacobr): throw if parameter names do not match names of property
// names in the class.
- assert (parameter.isNamed);
+ assert(parameter.isNamed);
HInstruction argument = arguments[i];
if (argument != null) {
filteredArguments.add(argument);
@@ -5989,8 +5559,8 @@
}
i++;
});
- var codeTemplate = new js.Template(null,
- js.objectLiteral(parameterNameMap));
+ var codeTemplate =
+ new js.Template(null, js.objectLiteral(parameterNameMap));
var nativeBehavior = new native.NativeBehavior()
..codeTemplate = codeTemplate;
@@ -5998,13 +5568,12 @@
nativeBehavior.typesReturned.add(constructor.enclosingClass.thisType);
}
return new HForeignCode(
- codeTemplate,
- backend.dynamicType, filteredArguments,
+ codeTemplate, backend.dynamicType, filteredArguments,
nativeBehavior: nativeBehavior)
..sourceInformation = sourceInformation;
}
- var target = new HForeignCode(js.js.parseForeignJS(
- "${backend.namer.fixedBackendPath(element)}."
+ var target = new HForeignCode(
+ js.js.parseForeignJS("${backend.namer.fixedBackendPath(element)}."
"${backend.nativeData.getFixedBackendName(element)}"),
backend.dynamicType,
<HInstruction>[]);
@@ -6019,14 +5588,14 @@
var nativeBehavior = new native.NativeBehavior()
..sideEffects.setAllSideEffects();
- DartType type = element.isConstructor ?
- element.enclosingClass.thisType : element.type.returnType;
+ DartType type = element.isConstructor
+ ? element.enclosingClass.thisType
+ : element.type.returnType;
// Native behavior effects here are similar to native/behavior.dart.
// The return type is dynamic if we don't trust js-interop type
// declarations.
- nativeBehavior.typesReturned.add(
- compiler.options.trustJSInteropTypeAnnotations
- ? type : const DynamicType());
+ nativeBehavior.typesReturned.add(compiler
+ .options.trustJSInteropTypeAnnotations ? type : const DynamicType());
// The allocation effects include the declared type if it is native (which
// includes js interop types).
@@ -6036,10 +5605,11 @@
// It also includes any other JS interop type if we don't trust the
// annotation or if is declared too broad.
- if (!compiler.options.trustJSInteropTypeAnnotations || type.isObject ||
+ if (!compiler.options.trustJSInteropTypeAnnotations ||
+ type.isObject ||
type.isDynamic) {
- nativeBehavior.typesInstantiated.add(
- backend.helpers.jsJavaScriptObjectClass.thisType);
+ nativeBehavior.typesInstantiated
+ .add(backend.helpers.jsJavaScriptObjectClass.thisType);
}
String code;
@@ -6054,22 +5624,18 @@
js.Template codeTemplate = js.js.parseForeignJS(code);
nativeBehavior.codeTemplate = codeTemplate;
- return new HForeignCode(
- codeTemplate,
- backend.dynamicType, inputs,
- nativeBehavior: nativeBehavior)
- ..sourceInformation = sourceInformation;
+ return new HForeignCode(codeTemplate, backend.dynamicType, inputs,
+ nativeBehavior: nativeBehavior)..sourceInformation = sourceInformation;
}
- void pushInvokeStatic(ast.Node location,
- Element element,
- List<HInstruction> arguments,
- {TypeMask typeMask,
- InterfaceType instanceType,
- SourceInformation sourceInformation}) {
+ void pushInvokeStatic(
+ ast.Node location, Element element, List<HInstruction> arguments,
+ {TypeMask typeMask,
+ InterfaceType instanceType,
+ SourceInformation sourceInformation}) {
// TODO(johnniwinther): Use [sourceInformation] instead of [location].
if (tryInlineMethod(element, null, null, arguments, location,
- instanceType: instanceType)) {
+ instanceType: instanceType)) {
return;
}
@@ -6081,17 +5647,16 @@
// TODO(5346): Try to avoid the need for calling [declaration] before
var instruction;
if (backend.isJsInterop(element)) {
- instruction = invokeJsInteropFunction(element, arguments,
- sourceInformation);
+ instruction =
+ invokeJsInteropFunction(element, arguments, sourceInformation);
} else {
// creating an [HInvokeStatic].
- instruction = new HInvokeStatic(
- element.declaration, arguments, typeMask,
+ instruction = new HInvokeStatic(element.declaration, arguments, typeMask,
targetCanThrow: targetCanThrow)
..sourceInformation = sourceInformation;
if (!currentInlinedInstantiations.isEmpty) {
- instruction.instantiatedTypes = new List<DartType>.from(
- currentInlinedInstantiations);
+ instruction.instantiatedTypes =
+ new List<DartType>.from(currentInlinedInstantiations);
}
instruction.sideEffects = compiler.world.getSideEffectsOfElement(element);
}
@@ -6102,10 +5667,9 @@
}
}
- HInstruction buildInvokeSuper(Selector selector,
- Element element,
- List<HInstruction> arguments,
- [SourceInformation sourceInformation]) {
+ HInstruction buildInvokeSuper(
+ Selector selector, Element element, List<HInstruction> arguments,
+ [SourceInformation sourceInformation]) {
HInstruction receiver = localsHandler.readThis();
// TODO(5346): Try to avoid the need for calling [declaration] before
// creating an [HStatic].
@@ -6124,22 +5688,16 @@
} else {
type = TypeMaskFactory.inferredReturnTypeForElement(element, compiler);
}
- HInstruction instruction = new HInvokeSuper(
- element,
- currentNonClosureClass,
- selector,
- inputs,
- type,
- sourceInformation,
+ HInstruction instruction = new HInvokeSuper(element, currentNonClosureClass,
+ selector, inputs, type, sourceInformation,
isSetter: selector.isSetter || selector.isIndexSet);
instruction.sideEffects =
compiler.world.getSideEffectsOfSelector(selector, null);
return instruction;
}
- void handleComplexOperatorSend(ast.SendSet node,
- HInstruction receiver,
- Link<ast.Node> arguments) {
+ void handleComplexOperatorSend(
+ ast.SendSet node, HInstruction receiver, Link<ast.Node> arguments) {
HInstruction rhs;
if (node.isPrefix || node.isPostfix) {
rhs = graph.addConstantInt(1, compiler);
@@ -6155,7 +5713,7 @@
elements.getOperatorTypeMaskInComplexSendSet(node),
node,
sourceInformation:
- sourceInformationBuilder.buildGeneric(node.assignmentOperator));
+ sourceInformationBuilder.buildGeneric(node.assignmentOperator));
}
void handleSuperSendSet(ast.SendSet node) {
@@ -6163,10 +5721,9 @@
List<HInstruction> setterInputs = <HInstruction>[];
void generateSuperSendSet() {
Selector setterSelector = elements.getSelector(node);
- if (Elements.isUnresolved(element)
- || !setterSelector.applies(element, compiler.world)) {
- generateSuperNoSuchMethodSend(
- node, setterSelector, setterInputs);
+ if (Elements.isUnresolved(element) ||
+ !setterSelector.applies(element, compiler.world)) {
+ generateSuperNoSuchMethodSend(node, setterSelector, setterInputs);
pop();
} else {
add(buildInvokeSuper(setterSelector, element, setterInputs));
@@ -6195,25 +5752,21 @@
Selector getterSelector =
elements.getGetterSelectorInComplexSendSet(node);
if (Elements.isUnresolved(getter)) {
- generateSuperNoSuchMethodSend(
- node,
- getterSelector,
- getterInputs);
+ generateSuperNoSuchMethodSend(node, getterSelector, getterInputs);
getterInstruction = pop();
} else {
- getterInstruction = buildInvokeSuper(
- getterSelector, getter, getterInputs);
+ getterInstruction =
+ buildInvokeSuper(getterSelector, getter, getterInputs);
add(getterInstruction);
}
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- addDynamicSendArgumentsToList(node, setterInputs);
- generateSuperSendSet();
- stack.add(setterInputs.last);
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ addDynamicSendArgumentsToList(node, setterInputs);
+ generateSuperSendSet();
+ stack.add(setterInputs.last);
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, arguments);
setterInputs.add(pop());
@@ -6237,66 +5790,43 @@
@override
void visitFinalSuperFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperGetterSet(
- ast.SendSet node,
- FunctionElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FunctionElement getter, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperIndexSet(
- ast.SendSet node,
- FunctionElement function,
- ast.Node index,
- ast.Node rhs,
- _) {
+ void visitSuperIndexSet(ast.SendSet node, FunctionElement function,
+ ast.Node index, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperMethodSet(
- ast.Send node,
- MethodElement method,
- ast.Node rhs,
- _) {
+ ast.Send node, MethodElement method, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitSuperSetterSet(
- ast.SendSet node,
- FunctionElement setter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FunctionElement setter, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitUnresolvedSuperIndexSet(
- ast.Send node,
- Element element,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.Send node, Element element, ast.Node index, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@@ -6323,24 +5853,14 @@
}
@override
- void visitUnresolvedSuperGetterIndexPrefix(
- ast.Send node,
- Element element,
- MethodElement setter,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperGetterIndexPrefix(ast.Send node, Element element,
+ MethodElement setter, ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperGetterIndexPostfix(
- ast.Send node,
- Element element,
- MethodElement setter,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperGetterIndexPostfix(ast.Send node, Element element,
+ MethodElement setter, ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@@ -6367,22 +5887,14 @@
}
@override
- void visitUnresolvedSuperIndexPrefix(
- ast.Send node,
- Element element,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperIndexPrefix(ast.Send node, Element element,
+ ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperIndexPostfix(
- ast.Send node,
- Element element,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitUnresolvedSuperIndexPostfix(ast.Send node, Element element,
+ ast.Node index, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@@ -6423,209 +5935,124 @@
}
@override
- void visitUnresolvedSuperCompoundIndexSet(
- ast.Send node,
- Element element,
- ast.Node index,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperCompoundIndexSet(ast.Send node, Element element,
+ ast.Node index, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperFieldCompound(
- ast.Send node,
- FieldElement field,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperFieldCompound(ast.Send node, FieldElement field,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitFinalSuperFieldCompound(
- ast.Send node,
- FieldElement field,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitFinalSuperFieldCompound(ast.Send node, FieldElement field,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitFinalSuperFieldPrefix(
- ast.Send node,
- FieldElement field,
- IncDecOperator operator,
- _) {
+ ast.Send node, FieldElement field, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
void visitUnresolvedSuperPrefix(
- ast.Send node,
- Element element,
- IncDecOperator operator,
- _) {
+ ast.Send node, Element element, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
void visitUnresolvedSuperPostfix(
- ast.Send node,
- Element element,
- IncDecOperator operator,
- _) {
+ ast.Send node, Element element, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperCompound(
- ast.Send node,
- Element element,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperCompound(ast.Send node, Element element,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitFinalSuperFieldPostfix(
- ast.Send node,
- FieldElement field,
- IncDecOperator operator,
- _) {
+ ast.Send node, FieldElement field, IncDecOperator operator, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperFieldFieldCompound(
- ast.Send node,
- FieldElement readField,
- FieldElement writtenField,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperFieldFieldCompound(ast.Send node, FieldElement readField,
+ FieldElement writtenField, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperGetterSetterCompound(
- ast.Send node,
- FunctionElement getter,
- FunctionElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperGetterSetterCompound(ast.Send node, FunctionElement getter,
+ FunctionElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperMethodSetterCompound(
- ast.Send node,
- FunctionElement method,
- FunctionElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperMethodSetterCompound(ast.Send node, FunctionElement method,
+ FunctionElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperMethodCompound(
- ast.Send node,
- FunctionElement method,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperMethodCompound(ast.Send node, FunctionElement method,
+ AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperGetterCompound(
- ast.Send node,
- Element element,
- MethodElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperGetterCompound(ast.Send node, Element element,
+ MethodElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitUnresolvedSuperSetterCompound(
- ast.Send node,
- MethodElement getter,
- Element element,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSuperSetterCompound(ast.Send node, MethodElement getter,
+ Element element, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperFieldSetterCompound(
- ast.Send node,
- FieldElement field,
- FunctionElement setter,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperFieldSetterCompound(ast.Send node, FieldElement field,
+ FunctionElement setter, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
- void visitSuperGetterFieldCompound(
- ast.Send node,
- FunctionElement getter,
- FieldElement field,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitSuperGetterFieldCompound(ast.Send node, FunctionElement getter,
+ FieldElement field, AssignmentOperator operator, ast.Node rhs, _) {
handleSuperSendSet(node);
}
@override
void visitIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, _) {
generateDynamicSend(node);
}
@override
- void visitCompoundIndexSet(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- AssignmentOperator operator,
- ast.Node rhs,
- _) {
+ void visitCompoundIndexSet(ast.SendSet node, ast.Node receiver,
+ ast.Node index, AssignmentOperator operator, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@override
- void visitIndexPrefix(
- ast.Send node,
- ast.Node receiver,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitIndexPrefix(ast.Send node, ast.Node receiver, ast.Node index,
+ IncDecOperator operator, _) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@override
- void visitIndexPostfix(
- ast.Send node,
- ast.Node receiver,
- ast.Node index,
- IncDecOperator operator,
- _) {
+ void visitIndexPostfix(ast.Send node, ast.Node receiver, ast.Node index,
+ IncDecOperator operator, _) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@@ -6645,11 +6072,8 @@
index = pop();
}
- pushInvokeDynamic(
- node,
- elements.getGetterSelectorInComplexSendSet(node),
- elements.getGetterTypeMaskInComplexSendSet(node),
- [receiver, index]);
+ pushInvokeDynamic(node, elements.getGetterSelectorInComplexSendSet(node),
+ elements.getGetterTypeMaskInComplexSendSet(node), [receiver, index]);
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
// Compile x[i] ??= e as:
@@ -6658,26 +6082,19 @@
// t1 = x[i] = e;
// result = t1
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- visit(arguments.head);
- HInstruction value = pop();
- pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [receiver, index, value]);
- pop();
- stack.add(value);
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ visit(arguments.head);
+ HInstruction value = pop();
+ pushInvokeDynamic(node, elements.getSelector(node),
+ elements.getTypeMask(node), [receiver, index, value]);
+ pop();
+ stack.add(value);
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, arguments);
HInstruction value = pop();
- pushInvokeDynamic(
- node,
- elements.getSelector(node),
- elements.getTypeMask(node),
- [receiver, index, value]);
+ pushInvokeDynamic(node, elements.getSelector(node),
+ elements.getTypeMask(node), [receiver, index, value]);
pop();
if (node.isPostfix) {
stack.add(getterInstruction);
@@ -6689,37 +6106,21 @@
}
@override
- void visitThisPropertySet(
- ast.SendSet node,
- Name name,
- ast.Node rhs,
- _) {
+ void visitThisPropertySet(ast.SendSet node, Name name, ast.Node rhs, _) {
generateInstanceSetterWithCompiledReceiver(
- node,
- localsHandler.readThis(),
- visitAndPop(rhs));
+ node, localsHandler.readThis(), visitAndPop(rhs));
}
@override
void visitDynamicPropertySet(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, Name name, ast.Node rhs, _) {
generateInstanceSetterWithCompiledReceiver(
- node,
- generateInstanceSendReceiver(node),
- visitAndPop(rhs));
+ node, generateInstanceSendReceiver(node), visitAndPop(rhs));
}
@override
void visitIfNotNullDynamicPropertySet(
- ast.SendSet node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ast.Node receiver, Name name, ast.Node rhs, _) {
// compile e?.x = e2 to:
//
// t1 = e
@@ -6737,205 +6138,142 @@
() => stack.add(receiverInstruction),
() {
generateInstanceSetterWithCompiledReceiver(
- node,
- receiverInstruction,
- visitAndPop(rhs));
+ node, receiverInstruction, visitAndPop(rhs));
});
}
@override
void visitParameterSet(
- ast.SendSet node,
- ParameterElement parameter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ParameterElement parameter, ast.Node rhs, _) {
generateNonInstanceSetter(node, parameter, visitAndPop(rhs));
}
@override
void visitFinalParameterSet(
- ast.SendSet node,
- ParameterElement parameter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, ParameterElement parameter, ast.Node rhs, _) {
generateNoSuchSetter(node, parameter, visitAndPop(rhs));
}
@override
void visitLocalVariableSet(
- ast.SendSet node,
- LocalVariableElement variable,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalVariableElement variable, ast.Node rhs, _) {
generateNonInstanceSetter(node, variable, visitAndPop(rhs));
}
@override
void visitFinalLocalVariableSet(
- ast.SendSet node,
- LocalVariableElement variable,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalVariableElement variable, ast.Node rhs, _) {
generateNoSuchSetter(node, variable, visitAndPop(rhs));
}
@override
void visitLocalFunctionSet(
- ast.SendSet node,
- LocalFunctionElement function,
- ast.Node rhs,
- _) {
+ ast.SendSet node, LocalFunctionElement function, ast.Node rhs, _) {
generateNoSuchSetter(node, function, visitAndPop(rhs));
}
@override
void visitTopLevelFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, field, visitAndPop(rhs));
}
@override
void visitFinalTopLevelFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, field, visitAndPop(rhs));
}
@override
void visitTopLevelGetterSet(
- ast.SendSet node,
- GetterElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, GetterElement getter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, getter, visitAndPop(rhs));
}
@override
void visitTopLevelSetterSet(
- ast.SendSet node,
- SetterElement setter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, SetterElement setter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, setter, visitAndPop(rhs));
}
@override
void visitTopLevelFunctionSet(
- ast.SendSet node,
- MethodElement function,
- ast.Node rhs,
- _) {
+ ast.SendSet node, MethodElement function, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, function, visitAndPop(rhs));
}
@override
void visitStaticFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, field, visitAndPop(rhs));
}
@override
void visitFinalStaticFieldSet(
- ast.SendSet node,
- FieldElement field,
- ast.Node rhs,
- _) {
+ ast.SendSet node, FieldElement field, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, field, visitAndPop(rhs));
}
@override
void visitStaticGetterSet(
- ast.SendSet node,
- GetterElement getter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, GetterElement getter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, getter, visitAndPop(rhs));
}
@override
void visitStaticSetterSet(
- ast.SendSet node,
- SetterElement setter,
- ast.Node rhs,
- _) {
+ ast.SendSet node, SetterElement setter, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, setter, visitAndPop(rhs));
}
@override
void visitStaticFunctionSet(
- ast.SendSet node,
- MethodElement function,
- ast.Node rhs,
- _) {
+ ast.SendSet node, MethodElement function, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNoSuchSetter(node, function, visitAndPop(rhs));
}
@override
- void visitUnresolvedSet(
- ast.SendSet node,
- Element element,
- ast.Node rhs,
- _) {
+ void visitUnresolvedSet(ast.SendSet node, Element element, ast.Node rhs, _) {
generateIsDeferredLoadedCheckOfSend(node);
generateNonInstanceSetter(node, element, visitAndPop(rhs));
}
@override
void visitClassTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, constant.type.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
void visitTypedefTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, constant.type.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
void visitDynamicTypeLiteralSet(
- ast.SendSet node,
- TypeConstantExpression constant,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeConstantExpression constant, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, constant.type.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
void visitTypeVariableTypeLiteralSet(
- ast.SendSet node,
- TypeVariableElement element,
- ast.Node rhs,
- _) {
+ ast.SendSet node, TypeVariableElement element, ast.Node rhs, _) {
generateThrowNoSuchMethod(node, element.name,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
void handleCompoundSendSet(ast.SendSet node) {
@@ -6949,7 +6287,7 @@
} else {
ast.Identifier selector = node.selector;
generateThrowNoSuchMethod(node, selector.source,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
return;
}
@@ -6965,12 +6303,10 @@
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- visit(node.arguments.head);
- generateInstanceSetterWithCompiledReceiver(
- node, receiver, pop());
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ visit(node.arguments.head);
+ generateInstanceSetterWithCompiledReceiver(node, receiver, pop());
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, node.arguments);
HInstruction value = pop();
@@ -6987,13 +6323,10 @@
// t1 == null ? t1 : (t1.x = t1.x op e2);
HInstruction receiver;
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleConditional(
- () {
- receiver = generateInstanceSendReceiver(node);
- pushCheckNull(receiver);
- },
- () => stack.add(receiver),
- () => generateAssignment(receiver));
+ brancher.handleConditional(() {
+ receiver = generateInstanceSendReceiver(node);
+ pushCheckNull(receiver);
+ }, () => stack.add(receiver), () => generateAssignment(receiver));
} else {
generateAssignment(generateInstanceSendReceiver(node));
}
@@ -7016,11 +6349,10 @@
HInstruction getterInstruction = pop();
if (node.isIfNullAssignment) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
- brancher.handleIfNull(() => stack.add(getterInstruction),
- () {
- visit(node.arguments.head);
- generateNonInstanceSetter(node, element, pop());
- });
+ brancher.handleIfNull(() => stack.add(getterInstruction), () {
+ visit(node.arguments.head);
+ generateNonInstanceSetter(node, element, pop());
+ });
} else {
handleComplexOperatorSend(node, getterInstruction, node.arguments);
HInstruction value = pop();
@@ -7034,20 +6366,13 @@
@override
void handleDynamicCompounds(
- ast.Send node,
- ast.Node receiver,
- Name name,
- CompoundRhs rhs,
- _) {
+ ast.Send node, ast.Node receiver, Name name, CompoundRhs rhs, _) {
handleCompoundSendSet(node);
}
@override
void handleLocalCompounds(
- ast.SendSet node,
- LocalElement local,
- CompoundRhs rhs,
- _,
+ ast.SendSet node, LocalElement local, CompoundRhs rhs, _,
{bool isSetterValid}) {
handleCompoundSendSet(node);
}
@@ -7066,20 +6391,12 @@
@override
handleDynamicSetIfNulls(
- ast.Send node,
- ast.Node receiver,
- Name name,
- ast.Node rhs,
- arg) {
+ ast.Send node, ast.Node receiver, Name name, ast.Node rhs, arg) {
handleCompoundSendSet(node);
}
@override
- handleLocalSetIfNulls(
- ast.SendSet node,
- LocalElement local,
- ast.Node rhs,
- arg,
+ handleLocalSetIfNulls(ast.SendSet node, LocalElement local, ast.Node rhs, arg,
{bool isSetterValid}) {
handleCompoundSendSet(node);
}
@@ -7109,47 +6426,30 @@
}
@override
- handleSuperIndexSetIfNull(
- ast.SendSet node,
- Element indexFunction,
- Element indexSetFunction,
- ast.Node index,
- ast.Node rhs,
- arg,
- {bool isGetterValid,
- bool isSetterValid}) {
+ handleSuperIndexSetIfNull(ast.SendSet node, Element indexFunction,
+ Element indexSetFunction, ast.Node index, ast.Node rhs, arg,
+ {bool isGetterValid, bool isSetterValid}) {
handleCompoundSendSet(node);
}
@override
visitIndexSetIfNull(
- ast.SendSet node,
- ast.Node receiver,
- ast.Node index,
- ast.Node rhs,
- arg,
- {bool isGetterValid,
- bool isSetterValid}) {
+ ast.SendSet node, ast.Node receiver, ast.Node index, ast.Node rhs, arg,
+ {bool isGetterValid, bool isSetterValid}) {
generateIsDeferredLoadedCheckOfSend(node);
handleIndexSendSet(node);
}
@override
handleTypeLiteralConstantSetIfNulls(
- ast.SendSet node,
- ConstantExpression constant,
- ast.Node rhs,
- arg) {
+ ast.SendSet node, ConstantExpression constant, ast.Node rhs, arg) {
// The type variable is never `null`.
generateConstantTypeLiteral(node);
}
@override
visitTypeVariableTypeLiteralSetIfNull(
- ast.Send node,
- TypeVariableElement element,
- ast.Node rhs,
- arg) {
+ ast.Send node, TypeVariableElement element, ast.Node rhs, arg) {
// The type variable is never `null`.
generateTypeVariableLiteral(node, element.type);
}
@@ -7194,9 +6494,7 @@
for (Link<ast.Node> link = node.nodes; !link.isEmpty; link = link.tail) {
if (isAborted()) {
reporter.reportHintMessage(
- link.head,
- MessageKind.GENERIC,
- {'text': 'dead code'});
+ link.head, MessageKind.GENERIC, {'text': 'dead code'});
} else {
visit(link.head);
}
@@ -7209,8 +6507,8 @@
visitOperator(ast.Operator node) {
// Operators are intercepted in their surrounding Send nodes.
- reporter.internalError(node,
- 'SsaBuilder.visitOperator should not be called.');
+ reporter.internalError(
+ node, 'SsaBuilder.visitOperator should not be called.');
}
visitCascade(ast.Cascade node) {
@@ -7236,14 +6534,12 @@
HInstruction exception = rethrowableException;
if (exception == null) {
exception = graph.addConstantNull(compiler);
- reporter.internalError(node,
- 'rethrowableException should not be null.');
+ reporter.internalError(node, 'rethrowableException should not be null.');
}
handleInTryStatement();
- closeAndGotoExit(
- new HThrow(exception,
- sourceInformationBuilder.buildThrow(node),
- isRethrow: true));
+ closeAndGotoExit(new HThrow(
+ exception, sourceInformationBuilder.buildThrow(node),
+ isRethrow: true));
}
visitRedirectingFactoryBody(ast.RedirectingFactoryBody node) {
@@ -7256,11 +6552,10 @@
redirectingConstructor.functionSignature;
List<Element> targetRequireds = targetSignature.requiredParameters;
- List<Element> redirectingRequireds
- = redirectingSignature.requiredParameters;
+ List<Element> redirectingRequireds =
+ redirectingSignature.requiredParameters;
- List<Element> targetOptionals =
- targetSignature.orderedOptionalParameters;
+ List<Element> targetOptionals = targetSignature.orderedOptionalParameters;
List<Element> redirectingOptionals =
redirectingSignature.orderedOptionalParameters;
@@ -7276,7 +6571,7 @@
if (position < redirectingRequireds.length) {
loadLocal(redirectingRequireds[position]);
} else if (position < redirectingSignature.parameterCount &&
- !redirectingSignature.optionalParametersAreNamed) {
+ !redirectingSignature.optionalParametersAreNamed) {
loadLocal(redirectingOptionals[position - redirectingRequireds.length]);
} else if (optionalParameter != null) {
inputs.add(handleConstantForOptionalParameter(optionalParameter));
@@ -7295,10 +6590,8 @@
if (targetOptionals.isNotEmpty) {
if (targetSignature.optionalParametersAreNamed) {
for (ParameterElement parameter in targetOptionals) {
- ParameterElement redirectingParameter =
- redirectingOptionals.firstWhere(
- (p) => p.name == parameter.name,
- orElse: () => null);
+ ParameterElement redirectingParameter = redirectingOptionals
+ .firstWhere((p) => p.name == parameter.name, orElse: () => null);
if (redirectingParameter == null) {
inputs.add(handleConstantForOptionalParameter(parameter));
} else {
@@ -7335,7 +6628,7 @@
///
/// We do not accept the internal Future implementation class.
bool isValidAsyncReturnType(DartType type) {
- assert (isBuildingAsyncFunction);
+ assert(isBuildingAsyncFunction);
// TODO(sigurdm): In an internal library a function could be declared:
//
// _FutureImpl foo async => 1;
@@ -7344,9 +6637,8 @@
// function is a `_FutureImpl`), but currently false is returned in this
// case.
return type.isDynamic ||
- type.isObject ||
- (type is InterfaceType &&
- type.element == coreClasses.futureClass);
+ type.isObject ||
+ (type is InterfaceType && type.element == coreClasses.futureClass);
}
visitReturn(ast.Return node) {
@@ -7363,9 +6655,8 @@
if (isBuildingAsyncFunction) {
if (compiler.options.enableTypeAssertions &&
!isValidAsyncReturnType(returnType)) {
- String message =
- "Async function returned a Future, "
- "was declared to return a $returnType.";
+ String message = "Async function returned a Future, "
+ "was declared to return a $returnType.";
generateTypeError(node, message);
pop();
return;
@@ -7399,20 +6690,19 @@
visit(node.expression);
HInstruction awaited = pop();
// TODO(herhut): Improve this type.
- push(new HAwait(awaited, new TypeMask.subclass(
- coreClasses.objectClass, compiler.world)));
+ push(new HAwait(awaited,
+ new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
}
visitTypeAnnotation(ast.TypeAnnotation node) {
- reporter.internalError(node,
- 'Visiting type annotation in SSA builder.');
+ reporter.internalError(node, 'Visiting type annotation in SSA builder.');
}
visitVariableDefinitions(ast.VariableDefinitions node) {
assert(isReachable);
for (Link<ast.Node> link = node.definitions.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
ast.Node definition = link.head;
LocalElement local = elements[definition];
if (definition is ast.Identifier) {
@@ -7422,7 +6712,7 @@
ast.SendSet node = definition;
generateNonInstanceSetter(
node, local, visitAndPop(node.arguments.first));
- pop(); // Discard value.
+ pop(); // Discard value.
}
}
}
@@ -7449,8 +6739,8 @@
} else {
List<HInstruction> inputs = <HInstruction>[];
for (Link<ast.Node> link = node.elements.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
visit(link.head);
inputs.add(pop());
}
@@ -7468,8 +6758,7 @@
visitConditional(ast.Conditional node) {
SsaBranchBuilder brancher = new SsaBranchBuilder(this, node);
brancher.handleConditional(() => visit(node.condition),
- () => visit(node.thenExpression),
- () => visit(node.elseExpression));
+ () => visit(node.thenExpression), () => visit(node.elseExpression));
}
visitStringInterpolation(ast.StringInterpolation node) {
@@ -7480,8 +6769,8 @@
visitStringInterpolationPart(ast.StringInterpolationPart node) {
// The parts are iterated in visitStringInterpolation.
- reporter.internalError(node,
- 'SsaBuilder.visitStringInterpolation should not be called.');
+ reporter.internalError(
+ node, 'SsaBuilder.visitStringInterpolation should not be called.');
}
visitEmptyStatement(ast.EmptyStatement node) {
@@ -7551,9 +6840,8 @@
visit(node.expression);
HInstruction expression = pop();
- pushInvokeStatic(node,
- helpers.streamIteratorConstructor,
- [expression, graph.addConstantNull(compiler)]);
+ pushInvokeStatic(node, helpers.streamIteratorConstructor,
+ [expression, graph.addConstantNull(compiler)]);
streamIterator = pop();
void buildInitializer() {}
@@ -7578,41 +6866,30 @@
TypeMask mask = elements.getTypeMask(identifier);
HInstruction value = pop();
- if (identifier.asSend() != null
- && Elements.isInstanceSend(identifier, elements)) {
+ if (identifier.asSend() != null &&
+ Elements.isInstanceSend(identifier, elements)) {
HInstruction receiver = generateInstanceSendReceiver(identifier);
assert(receiver != null);
- generateInstanceSetterWithCompiledReceiver(
- null,
- receiver,
- value,
- selector: selector,
- mask: mask,
- location: identifier);
+ generateInstanceSetterWithCompiledReceiver(null, receiver, value,
+ selector: selector, mask: mask, location: identifier);
} else {
- generateNonInstanceSetter(
- null, variable, value, location: identifier);
+ generateNonInstanceSetter(null, variable, value, location: identifier);
}
pop(); // Pop the value pushed by the setter call.
visit(node.body);
}
- void buildUpdate() {};
+ void buildUpdate() {}
+ ;
buildProtectedByFinally(() {
- handleLoop(node,
- buildInitializer,
- buildCondition,
- buildUpdate,
- buildBody);
+ handleLoop(
+ node, buildInitializer, buildCondition, buildUpdate, buildBody);
}, () {
- pushInvokeDynamic(node,
- Selectors.cancel,
- null,
- [streamIterator]);
- push(new HAwait(pop(), new TypeMask.subclass(
- coreClasses.objectClass, compiler.world)));
+ pushInvokeDynamic(node, Selectors.cancel, null, [streamIterator]);
+ push(new HAwait(pop(),
+ new TypeMask.subclass(coreClasses.objectClass, compiler.world)));
pop();
});
}
@@ -7689,17 +6966,12 @@
Elements.isInstanceSend(identifier, elements)) {
HInstruction receiver = generateInstanceSendReceiver(identifier);
assert(receiver != null);
- generateInstanceSetterWithCompiledReceiver(
- null,
- receiver,
- value,
- selector: selector,
- mask: mask,
- location: identifier);
+ generateInstanceSetterWithCompiledReceiver(null, receiver, value,
+ selector: selector, mask: mask, location: identifier);
} else {
generateNonInstanceSetter(null, variable, value, location: identifier);
}
- pop(); // Discard the value pushed by the setter call.
+ pop(); // Discard the value pushed by the setter call.
}
buildSyncForInIndexable(ast.ForIn node, TypeMask arrayType) {
@@ -7717,9 +6989,9 @@
TypeMask boolType = backend.boolType;
// These variables are shared by initializer, condition, body and update.
- HInstruction array; // Set in buildInitializer.
- bool isFixed; // Set in buildInitializer.
- HInstruction originalLength = null; // Set for growable lists.
+ HInstruction array; // Set in buildInitializer.
+ bool isFixed; // Set in buildInitializer.
+ HInstruction originalLength = null; // Set for growable lists.
HInstruction buildGetLength() {
Element lengthElement = helpers.jsIndexableLength;
@@ -7739,9 +7011,8 @@
//
HInstruction length = buildGetLength();
push(new HIdentity(length, originalLength, null, boolType));
- pushInvokeStatic(node,
- helpers.checkConcurrentModificationError,
- [pop(), array]);
+ pushInvokeStatic(
+ node, helpers.checkConcurrentModificationError, [pop(), array]);
pop();
}
@@ -7749,8 +7020,8 @@
visit(node.expression);
array = pop();
isFixed = isFixedLength(array.instructionType, compiler);
- localsHandler.updateLocal(indexVariable,
- graph.addConstantInt(0, compiler));
+ localsHandler.updateLocal(
+ indexVariable, graph.addConstantInt(0, compiler));
originalLength = buildGetLength();
}
@@ -7810,9 +7081,9 @@
visitLabeledStatement(ast.LabeledStatement node) {
ast.Statement body = node.statement;
- if (body is ast.Loop
- || body is ast.SwitchStatement
- || Elements.isUnusedLabel(node, elements)) {
+ if (body is ast.Loop ||
+ body is ast.SwitchStatement ||
+ Elements.isUnusedLabel(node, elements)) {
// Loops and switches handle their own labels.
visit(body);
return;
@@ -7843,8 +7114,8 @@
if (hasBreak) {
// There was at least one reachable break, so the label is needed.
entryBlock.setBlockFlow(
- new HLabeledBlockInformation(new HSubGraphBlockInformation(bodyGraph),
- handler.labels()),
+ new HLabeledBlockInformation(
+ new HSubGraphBlockInformation(bodyGraph), handler.labels()),
joinBlock);
}
handler.close();
@@ -7857,8 +7128,8 @@
}
List<HInstruction> listInputs = <HInstruction>[];
for (Link<ast.Node> link = node.entries.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
visit(link.head);
listInputs.add(pop());
listInputs.add(pop());
@@ -7917,8 +7188,8 @@
// dart2js unit tests).
TypeMask mapType =
new TypeMask.nonNullSubtype(helpers.mapLiteralClass, compiler.world);
- TypeMask returnTypeMask = TypeMaskFactory.inferredReturnTypeForElement(
- constructor, compiler);
+ TypeMask returnTypeMask =
+ TypeMaskFactory.inferredReturnTypeForElement(constructor, compiler);
TypeMask instructionType =
mapType.intersection(returnTypeMask, compiler.world);
@@ -7939,7 +7210,6 @@
Map<ast.CaseMatch, ConstantValue> buildSwitchCaseConstants(
ast.SwitchStatement node) {
-
Map<ast.CaseMatch, ConstantValue> constants =
new Map<ast.CaseMatch, ConstantValue>();
for (ast.SwitchCase switchCase in node.cases) {
@@ -7993,8 +7263,8 @@
* Builds a simple switch statement which does not handle uses of continue
* statements to labeled switch cases.
*/
- void buildSimpleSwitchStatement(ast.SwitchStatement node,
- Map<ast.CaseMatch, ConstantValue> constants) {
+ void buildSimpleSwitchStatement(
+ ast.SwitchStatement node, Map<ast.CaseMatch, ConstantValue> constants) {
JumpHandler jumpHandler = createJumpHandler(node, isLoopJump: false);
HInstruction buildExpression() {
visit(node.expression);
@@ -8015,13 +7285,8 @@
void buildSwitchCase(ast.SwitchCase node) {
visit(node.statements);
}
- handleSwitch(node,
- jumpHandler,
- buildExpression,
- node.cases,
- getConstants,
- isDefaultCase,
- buildSwitchCase);
+ handleSwitch(node, jumpHandler, buildExpression, node.cases, getConstants,
+ isDefaultCase, buildSwitchCase);
jumpHandler.close();
}
@@ -8029,10 +7294,11 @@
* Builds a switch statement that can handle arbitrary uses of continue
* statements to labeled switch cases.
*/
- void buildComplexSwitchStatement(ast.SwitchStatement node,
- Map<ast.CaseMatch, ConstantValue> constants,
- Map<ast.SwitchCase, int> caseIndex,
- bool hasDefault) {
+ void buildComplexSwitchStatement(
+ ast.SwitchStatement node,
+ Map<ast.CaseMatch, ConstantValue> constants,
+ Map<ast.SwitchCase, int> caseIndex,
+ bool hasDefault) {
// If the switch statement has switch cases targeted by continue
// statements we create the following encoding:
//
@@ -8104,17 +7370,11 @@
}
jumpTargets[switchTarget].generateBreak();
}
- handleSwitch(node,
- jumpHandler,
- buildExpression,
- switchCases,
- getConstants,
- isDefaultCase,
- buildSwitchCase);
+ handleSwitch(node, jumpHandler, buildExpression, switchCases, getConstants,
+ isDefaultCase, buildSwitchCase);
jumpHandler.close();
- HInstruction buildCondition() =>
- graph.addConstantBool(true, compiler);
+ HInstruction buildCondition() => graph.addConstantBool(true, compiler);
void buildSwitch() {
HInstruction buildExpression() {
@@ -8134,19 +7394,18 @@
// Pass a [NullJumpHandler] because the target for the contained break
// is not the generated switch statement but instead the loop generated
// in the call to [handleLoop] below.
- handleSwitch(node,
- new NullJumpHandler(reporter),
- buildExpression, node.cases, getConstants,
- (_) => false, // No case is default.
- buildSwitchCase);
+ handleSwitch(
+ node,
+ new NullJumpHandler(reporter),
+ buildExpression,
+ node.cases,
+ getConstants,
+ (_) => false, // No case is default.
+ buildSwitchCase);
}
void buildLoop() {
- handleLoop(node,
- () {},
- buildCondition,
- () {},
- buildSwitch);
+ handleLoop(node, () {}, buildCondition, () {}, buildSwitch);
}
if (hasDefault) {
@@ -8157,9 +7416,7 @@
void buildCondition() {
js.Template code = js.js.parseForeignJS('#');
push(new HForeignCode(
- code,
- backend.boolType,
- [localsHandler.readLocal(switchTarget)],
+ code, backend.boolType, [localsHandler.readLocal(switchTarget)],
nativeBehavior: native.NativeBehavior.PURE));
}
handleIf(node,
@@ -8189,7 +7446,6 @@
Iterable<ConstantValue> getConstants(ast.SwitchCase switchCase),
bool isDefaultCase(ast.SwitchCase switchCase),
void buildSwitchCase(ast.SwitchCase switchCase)) {
-
HBasicBlock expressionStart = openNewBlock();
HInstruction expression = buildExpression();
if (switchCases.isEmpty) {
@@ -8255,7 +7511,7 @@
});
jumpHandler.forEachContinue((HContinue instruction, LocalsHandler locals) {
assert(invariant(errorNode, false,
- message: 'Continue cannot target a switch.'));
+ message: 'Continue cannot target a switch.'));
});
if (!isAborted()) {
current.close(new HGoto());
@@ -8271,8 +7527,8 @@
close(new HGoto());
defaultCase.addSuccessor(joinBlock);
caseHandlers.add(savedLocals);
- statements.add(new HSubGraphBlockInformation(new SubGraph(
- defaultCase, defaultCase)));
+ statements.add(new HSubGraphBlockInformation(
+ new SubGraph(defaultCase, defaultCase)));
}
assert(caseHandlers.length == joinBlock.predecessors.length);
if (caseHandlers.length != 0) {
@@ -8289,13 +7545,11 @@
}
HSubExpressionBlockInformation expressionInfo =
- new HSubExpressionBlockInformation(new SubExpression(expressionStart,
- expressionEnd));
+ new HSubExpressionBlockInformation(
+ new SubExpression(expressionStart, expressionEnd));
expressionStart.setBlockFlow(
- new HSwitchBlockInformation(expressionInfo,
- statements,
- jumpHandler.target,
- jumpHandler.labels()),
+ new HSwitchBlockInformation(expressionInfo, statements,
+ jumpHandler.target, jumpHandler.labels()),
joinBlock);
jumpHandler.close();
@@ -8396,10 +7650,10 @@
open(exitBlock);
enterBlock.setBlockFlow(
new HTryBlockInformation(
- wrapStatementGraph(bodyGraph),
- null, // No catch-variable.
- null, // No catchGraph.
- wrapStatementGraph(finallyGraph)),
+ wrapStatementGraph(bodyGraph),
+ null, // No catch-variable.
+ null, // No catchGraph.
+ wrapStatementGraph(finallyGraph)),
exitBlock);
inTryStatement = oldInTryStatement;
}
@@ -8489,8 +7743,7 @@
if (catchBlock.exception != null) {
LocalVariableElement exceptionVariable =
elements[catchBlock.exception];
- localsHandler.updateLocal(exceptionVariable,
- unwrappedException);
+ localsHandler.updateLocal(exceptionVariable, unwrappedException);
}
ast.Node trace = catchBlock.trace;
if (trace != null) {
@@ -8504,24 +7757,20 @@
void visitElse() {
if (link.isEmpty) {
- closeAndGotoExit(
- new HThrow(exception,
- exception.sourceInformation,
- isRethrow: true));
+ closeAndGotoExit(new HThrow(exception, exception.sourceInformation,
+ isRethrow: true));
} else {
ast.CatchBlock newBlock = link.head;
- handleIf(node,
- visitCondition: () { pushCondition(newBlock); },
- visitThen: visitThen,
- visitElse: visitElse);
+ handleIf(node, visitCondition: () {
+ pushCondition(newBlock);
+ }, visitThen: visitThen, visitElse: visitElse);
}
}
ast.CatchBlock firstBlock = link.head;
- handleIf(node,
- visitCondition: () { pushCondition(firstBlock); },
- visitThen: visitThen,
- visitElse: visitElse);
+ handleIf(node, visitCondition: () {
+ pushCondition(firstBlock);
+ }, visitThen: visitThen, visitElse: visitElse);
if (!isAborted()) endCatchBlock = close(new HGoto());
rethrowableException = oldRethrowableException;
@@ -8542,7 +7791,9 @@
HBasicBlock exitBlock = graph.addNewBlock();
- addOptionalSuccessor(b1, b2) { if (b2 != null) b1.addSuccessor(b2); }
+ addOptionalSuccessor(b1, b2) {
+ if (b2 != null) b1.addSuccessor(b2);
+ }
addExitTrySuccessor(successor) {
if (successor == null) return;
// Iterate over all blocks created inside this try/catch, and
@@ -8596,11 +7847,8 @@
localsHandler = savedLocals;
open(exitBlock);
enterBlock.setBlockFlow(
- new HTryBlockInformation(
- wrapStatementGraph(bodyGraph),
- exception,
- wrapStatementGraph(catchGraph),
- wrapStatementGraph(finallyGraph)),
+ new HTryBlockInformation(wrapStatementGraph(bodyGraph), exception,
+ wrapStatementGraph(catchGraph), wrapStatementGraph(finallyGraph)),
exitBlock);
inTryStatement = oldInTryStatement;
}
@@ -8621,12 +7869,16 @@
* This method is invoked before inlining the body of [function] into this
* [SsaBuilder].
*/
- void enterInlinedMethod(FunctionElement function,
- ast.Node _,
- List<HInstruction> compiledArguments,
- {InterfaceType instanceType}) {
+ void enterInlinedMethod(FunctionElement function, ast.Node _,
+ List<HInstruction> compiledArguments,
+ {InterfaceType instanceType}) {
AstInliningState state = new AstInliningState(
- function, returnLocal, returnType, elements, stack, localsHandler,
+ function,
+ returnLocal,
+ returnType,
+ elements,
+ stack,
+ localsHandler,
inTryStatement,
allInlinedFunctionsCalledOnce && isFunctionCalledOnce(function));
inliningStack.add(state);
@@ -8634,8 +7886,8 @@
// Setting up the state of the (AST) builder is performed even when the
// inlined function is in IR, because the irInliner uses the [returnElement]
// of the AST builder.
- setupStateForInlining(
- function, compiledArguments, instanceType: instanceType);
+ setupStateForInlining(function, compiledArguments,
+ instanceType: instanceType);
}
void leaveInlinedMethod() {
@@ -8651,8 +7903,8 @@
void emitReturn(HInstruction value, ast.Node node) {
if (inliningStack.isEmpty) {
- closeAndGotoExit(new HReturn(value,
- sourceInformationBuilder.buildReturn(node)));
+ closeAndGotoExit(
+ new HReturn(value, sourceInformationBuilder.buildReturn(node)));
} else {
localsHandler.updateLocal(returnLocal, value);
}
@@ -8660,19 +7912,13 @@
@override
void handleTypeLiteralConstantCompounds(
- ast.SendSet node,
- ConstantExpression constant,
- CompoundRhs rhs,
- _) {
+ ast.SendSet node, ConstantExpression constant, CompoundRhs rhs, _) {
handleTypeLiteralCompound(node);
}
@override
void handleTypeVariableTypeLiteralCompounds(
- ast.SendSet node,
- TypeVariableElement typeVariable,
- CompoundRhs rhs,
- _) {
+ ast.SendSet node, TypeVariableElement typeVariable, CompoundRhs rhs, _) {
handleTypeLiteralCompound(node);
}
@@ -8680,43 +7926,29 @@
generateIsDeferredLoadedCheckOfSend(node);
ast.Identifier selector = node.selector;
generateThrowNoSuchMethod(node, selector.source,
- argumentNodes: node.arguments);
+ argumentNodes: node.arguments);
}
@override
- void visitConstantGet(
- ast.Send node,
- ConstantExpression constant,
- _) {
+ void visitConstantGet(ast.Send node, ConstantExpression constant, _) {
visitNode(node);
}
@override
- void visitConstantInvoke(
- ast.Send node,
- ConstantExpression constant,
- ast.NodeList arguments,
- CallStructure callStreucture,
- _) {
+ void visitConstantInvoke(ast.Send node, ConstantExpression constant,
+ ast.NodeList arguments, CallStructure callStreucture, _) {
visitNode(node);
}
@override
void errorUndefinedBinaryExpression(
- ast.Send node,
- ast.Node left,
- ast.Operator operator,
- ast.Node right,
- _) {
+ ast.Send node, ast.Node left, ast.Operator operator, ast.Node right, _) {
visitNode(node);
}
@override
void errorUndefinedUnaryExpression(
- ast.Send node,
- ast.Operator operator,
- ast.Node expression,
- _) {
+ ast.Send node, ast.Operator operator, ast.Node expression, _) {
visitNode(node);
}
@@ -8774,9 +8006,8 @@
TypeMask type = TypeMaskFactory.inferredTypeForSelector(
selector, expression.instructionType, compiler);
if (type.containsOnlyString(compiler.world)) {
- builder.pushInvokeDynamic(
- node, selector,
- expression.instructionType, <HInstruction>[expression]);
+ builder.pushInvokeDynamic(node, selector, expression.instructionType,
+ <HInstruction>[expression]);
append(builder.pop());
return;
}
@@ -8798,7 +8029,7 @@
}
void visitNodeList(ast.NodeList node) {
- node.visitChildren(this);
+ node.visitChildren(this);
}
void append(HInstruction expression) {
@@ -8806,8 +8037,8 @@
}
HInstruction concat(HInstruction left, HInstruction right) {
- HInstruction instruction = new HStringConcat(
- left, right, builder.backend.stringType);
+ HInstruction instruction =
+ new HStringConcat(left, right, builder.backend.stringType);
builder.add(instruction);
return instruction;
}
@@ -8842,22 +8073,17 @@
final bool allowLoops;
final bool enableUserAssertions;
- InlineWeeder(this.maxInliningNodes,
- this.useMaxInliningNodes,
- this.allowLoops,
- this.enableUserAssertions);
+ InlineWeeder(this.maxInliningNodes, this.useMaxInliningNodes, this.allowLoops,
+ this.enableUserAssertions);
- static bool canBeInlined(FunctionElement function,
- int maxInliningNodes,
- bool useMaxInliningNodes,
- {bool allowLoops: false,
- bool enableUserAssertions: null}) {
+ static bool canBeInlined(
+ FunctionElement function, int maxInliningNodes, bool useMaxInliningNodes,
+ {bool allowLoops: false, bool enableUserAssertions: null}) {
assert(enableUserAssertions is bool); // Ensure we passed it.
if (function.resolvedAst.elements.containsTryStatement) return false;
- InlineWeeder weeder =
- new InlineWeeder(maxInliningNodes, useMaxInliningNodes, allowLoops,
- enableUserAssertions);
+ InlineWeeder weeder = new InlineWeeder(maxInliningNodes,
+ useMaxInliningNodes, allowLoops, enableUserAssertions);
ast.FunctionExpression functionExpression = function.node;
weeder.visit(functionExpression.initializers);
weeder.visit(functionExpression.body);
@@ -8936,8 +8162,7 @@
void visitReturn(ast.Return node) {
if (!registerNode()) return;
- if (seenReturn
- || identical(node.beginToken.stringValue, 'native')) {
+ if (seenReturn || identical(node.beginToken.stringValue, 'native')) {
tooDifficult = true;
return;
}
@@ -8977,14 +8202,15 @@
final bool inTryStatement;
final bool allFunctionsCalledOnce;
- AstInliningState(FunctionElement function,
- this.oldReturnLocal,
- this.oldReturnType,
- this.oldElements,
- this.oldStack,
- this.oldLocalsHandler,
- this.inTryStatement,
- this.allFunctionsCalledOnce)
+ AstInliningState(
+ FunctionElement function,
+ this.oldReturnLocal,
+ this.oldReturnType,
+ this.oldElements,
+ this.oldStack,
+ this.oldLocalsHandler,
+ this.inTryStatement,
+ this.allFunctionsCalledOnce)
: super(function);
}
@@ -9012,11 +8238,12 @@
}
}
- void buildCondition(void visitCondition(),
- SsaBranch conditionBranch,
- SsaBranch thenBranch,
- SsaBranch elseBranch,
- SourceInformation sourceInformation) {
+ void buildCondition(
+ void visitCondition(),
+ SsaBranch conditionBranch,
+ SsaBranch thenBranch,
+ SsaBranch elseBranch,
+ SourceInformation sourceInformation) {
startBranch(conditionBranch);
visitCondition();
checkNotAborted();
@@ -9031,7 +8258,7 @@
bool conditionBranchLocalsCanBeReused =
mergeLocals(conditionBranch, thenBranch, mayReuseFromLocals: true);
mergeLocals(conditionBranch, elseBranch,
- mayReuseFromLocals: conditionBranchLocalsCanBeReused);
+ mayReuseFromLocals: conditionBranchLocalsCanBeReused);
conditionBranch.graph =
new SubExpression(conditionBranch.block, conditionExitBlock);
@@ -9042,7 +8269,7 @@
* return value implies that [mayReuseFromLocals] was set to [:true:].
*/
bool mergeLocals(SsaBranch fromBranch, SsaBranch toBranch,
- {bool mayReuseFromLocals}) {
+ {bool mayReuseFromLocals}) {
LocalsHandler fromLocals = fromBranch.exitLocals;
if (toBranch.startLocals == null) {
if (mayReuseFromLocals) {
@@ -9064,10 +8291,8 @@
builder.open(branch.block);
}
- HInstruction buildBranch(SsaBranch branch,
- void visitBranch(),
- SsaBranch joinBranch,
- bool isExpression) {
+ HInstruction buildBranch(SsaBranch branch, void visitBranch(),
+ SsaBranch joinBranch, bool isExpression) {
startBranch(branch);
visitBranch();
branch.graph = new SubGraph(branch.block, builder.lastOpenedBlock);
@@ -9083,10 +8308,8 @@
return null;
}
- handleIf(void visitCondition(),
- void visitThen(),
- void visitElse(),
- {SourceInformation sourceInformation}) {
+ handleIf(void visitCondition(), void visitThen(), void visitElse(),
+ {SourceInformation sourceInformation}) {
if (visitElse == null) {
// Make sure to have an else part to avoid a critical edge. A
// critical edge is an edge that connects a block with multiple
@@ -9096,30 +8319,24 @@
visitElse = () {};
}
- _handleDiamondBranch(
- visitCondition, visitThen, visitElse, isExpression: false,
- sourceInformation: sourceInformation);
+ _handleDiamondBranch(visitCondition, visitThen, visitElse,
+ isExpression: false, sourceInformation: sourceInformation);
}
- handleConditional(void visitCondition(),
- void visitThen(),
- void visitElse()) {
+ handleConditional(void visitCondition(), void visitThen(), void visitElse()) {
assert(visitElse != null);
- _handleDiamondBranch(
- visitCondition, visitThen, visitElse, isExpression: true);
+ _handleDiamondBranch(visitCondition, visitThen, visitElse,
+ isExpression: true);
}
handleIfNull(void left(), void right()) {
// x ?? y is transformed into: x == null ? y : x
HInstruction leftExpression;
- handleConditional(
- () {
- left();
- leftExpression = builder.pop();
- builder.pushCheckNull(leftExpression);
- },
- right,
- () => builder.stack.add(leftExpression));
+ handleConditional(() {
+ left();
+ leftExpression = builder.pop();
+ builder.pushCheckNull(leftExpression);
+ }, right, () => builder.stack.add(leftExpression));
}
void handleLogicalAndOr(void left(), void right(), {bool isAnd}) {
@@ -9157,16 +8374,14 @@
HConstant notIsAnd =
builder.graph.addConstantBool(!isAnd, builder.compiler);
JavaScriptBackend backend = builder.backend;
- HPhi result = new HPhi.manyInputs(null,
- <HInstruction>[boolifiedRight, notIsAnd],
- backend.dynamicType);
+ HPhi result = new HPhi.manyInputs(
+ null, <HInstruction>[boolifiedRight, notIsAnd], backend.dynamicType);
builder.current.addPhi(result);
builder.stack.add(result);
}
- void handleLogicalAndOrWithLeftNode(ast.Node left,
- void visitRight(),
- {bool isAnd}) {
+ void handleLogicalAndOrWithLeftNode(ast.Node left, void visitRight(),
+ {bool isAnd}) {
// This method is similar to [handleLogicalAndOr] but optimizes the case
// where left is a logical "and" or logical "or".
//
@@ -9182,27 +8397,24 @@
// result = phi(t3, false);
ast.Send send = left.asSend();
- if (send != null &&
- (isAnd ? send.isLogicalAnd : send.isLogicalOr)) {
+ if (send != null && (isAnd ? send.isLogicalAnd : send.isLogicalOr)) {
ast.Node newLeft = send.receiver;
Link<ast.Node> link = send.argumentsNode.nodes;
assert(link.tail.isEmpty);
ast.Node middle = link.head;
handleLogicalAndOrWithLeftNode(
newLeft,
- () => handleLogicalAndOrWithLeftNode(middle, visitRight,
- isAnd: isAnd),
+ () =>
+ handleLogicalAndOrWithLeftNode(middle, visitRight, isAnd: isAnd),
isAnd: isAnd);
} else {
handleLogicalAndOr(() => builder.visit(left), visitRight, isAnd: isAnd);
}
}
- void _handleDiamondBranch(void visitCondition(),
- void visitThen(),
- void visitElse(),
- {bool isExpression,
- SourceInformation sourceInformation}) {
+ void _handleDiamondBranch(
+ void visitCondition(), void visitThen(), void visitElse(),
+ {bool isExpression, SourceInformation sourceInformation}) {
SsaBranch conditionBranch = new SsaBranch(this);
SsaBranch thenBranch = new SsaBranch(this);
SsaBranch elseBranch = new SsaBranch(this);
@@ -9212,7 +8424,7 @@
builder.goto(builder.current, conditionBranch.block);
buildCondition(visitCondition, conditionBranch, thenBranch, elseBranch,
- sourceInformation);
+ sourceInformation);
HInstruction thenValue =
buildBranch(thenBranch, visitThen, joinBranch, isExpression);
HInstruction elseValue =
@@ -9234,11 +8446,10 @@
joinBlock = joinBranch.block;
}
- HIfBlockInformation info =
- new HIfBlockInformation(
- new HSubExpressionBlockInformation(conditionBranch.graph),
- new HSubGraphBlockInformation(thenBranch.graph),
- new HSubGraphBlockInformation(elseBranch.graph));
+ HIfBlockInformation info = new HIfBlockInformation(
+ new HSubExpressionBlockInformation(conditionBranch.graph),
+ new HSubGraphBlockInformation(thenBranch.graph),
+ new HSubGraphBlockInformation(elseBranch.graph));
HBasicBlock conditionStartBlock = conditionBranch.block;
conditionStartBlock.setBlockFlow(info, joinBlock);
@@ -9261,8 +8472,7 @@
builder.push(new HVoidType(type, new TypeMask.exact(cls, classWorld)));
}
- void visitTypeVariableType(TypeVariableType type,
- SsaBuilder builder) {
+ void visitTypeVariableType(TypeVariableType type, SsaBuilder builder) {
ClassElement cls = builder.backend.helpers.RuntimeType;
TypeMask instructionType = new TypeMask.subclass(cls, classWorld);
if (!builder.sourceElement.enclosingElement.isClosure &&
@@ -9270,9 +8480,8 @@
HInstruction receiver = builder.localsHandler.readThis();
builder.push(new HReadTypeVariable(type, receiver, instructionType));
} else {
- builder.push(
- new HReadTypeVariable.noReceiver(
- type, builder.addTypeVariableReference(type), instructionType));
+ builder.push(new HReadTypeVariable.noReceiver(
+ type, builder.addTypeVariableReference(type), instructionType));
}
}
@@ -9295,15 +8504,14 @@
List<String> names = type.namedParameters;
for (int index = 0; index < names.length; index++) {
ast.DartString dartString = new ast.DartString.literal(names[index]);
- inputs.add(
- builder.graph.addConstantString(dartString, builder.compiler));
+ inputs.add(builder.graph.addConstantString(dartString, builder.compiler));
namedParameterTypes[index].accept(this, builder);
inputs.add(builder.pop());
}
ClassElement cls = builder.backend.helpers.RuntimeFunctionType;
- builder.push(new HFunctionType(inputs, type,
- new TypeMask.exact(cls, classWorld)));
+ builder.push(
+ new HFunctionType(inputs, type, new TypeMask.exact(cls, classWorld)));
}
void visitMalformedType(MalformedType type, SsaBuilder builder) {
@@ -9326,8 +8534,8 @@
} else {
cls = builder.backend.helpers.RuntimeTypeGeneric;
}
- builder.push(new HInterfaceType(inputs, type,
- new TypeMask.exact(cls, classWorld)));
+ builder.push(
+ new HInterfaceType(inputs, type, new TypeMask.exact(cls, classWorld)));
}
void visitTypedefType(TypedefType type, SsaBuilder builder) {
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 410532c..3a5d85a 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -3,62 +3,44 @@
// BSD-style license that can be found in the LICENSE file.
import '../common.dart';
-import '../common/codegen.dart' show
- CodegenRegistry,
- CodegenWorkItem;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreClasses;
+import '../core_types.dart' show CoreClasses;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../io/source_information.dart';
import '../js/js.dart' as js;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
import '../js_backend/js_backend.dart';
-import '../js_emitter/js_emitter.dart' show
- CodeEmitterTask,
- NativeEmitter;
+import '../js_emitter/js_emitter.dart' show CodeEmitterTask, NativeEmitter;
import '../native/native.dart' as native;
import '../types/types.dart';
-import '../universe/call_structure.dart' show
- CallStructure;
-import '../universe/selector.dart' show
- Selector;
-import '../universe/use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
+import '../universe/call_structure.dart' show CallStructure;
+import '../universe/selector.dart' show Selector;
+import '../universe/use.dart' show DynamicUse, StaticUse, TypeUse;
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld,
- World;
+import '../world.dart' show ClassWorld, World;
import 'nodes.dart';
import 'codegen_helpers.dart';
import 'variable_allocator.dart';
class SsaCodeGeneratorTask extends CompilerTask {
-
final JavaScriptBackend backend;
final SourceInformationStrategy sourceInformationFactory;
- SsaCodeGeneratorTask(JavaScriptBackend backend,
- this.sourceInformationFactory)
+ SsaCodeGeneratorTask(JavaScriptBackend backend, this.sourceInformationFactory)
: this.backend = backend,
super(backend.compiler);
String get name => 'SSA code generator';
NativeEmitter get nativeEmitter => backend.emitter.nativeEmitter;
- js.Fun buildJavaScriptFunction(FunctionElement element,
- List<js.Parameter> parameters,
- js.Block body) {
+ js.Fun buildJavaScriptFunction(
+ FunctionElement element, List<js.Parameter> parameters, js.Block body) {
js.AsyncModifier asyncModifier = element.asyncMarker.isAsync
? (element.asyncMarker.isYielding
? const js.AsyncModifier.asyncStar()
@@ -68,9 +50,9 @@
: const js.AsyncModifier.sync());
return new js.Fun(parameters, body, asyncModifier: asyncModifier)
- .withSourceInformation(
- sourceInformationFactory.createBuilderForContext(element)
- .buildDeclaration(element));
+ .withSourceInformation(sourceInformationFactory
+ .createBuilderForContext(element)
+ .buildDeclaration(element));
}
js.Expression generateCode(CodegenWorkItem work, HGraph graph) {
@@ -84,9 +66,9 @@
js.Expression generateLazyInitializer(work, graph) {
return measure(() {
compiler.tracer.traceGraph("codegen", graph);
- SourceInformation sourceInformation =
- sourceInformationFactory.createBuilderForContext(work.element)
- .buildDeclaration(work.element);
+ SourceInformation sourceInformation = sourceInformationFactory
+ .createBuilderForContext(work.element)
+ .buildDeclaration(work.element);
SsaCodeGenerator codegen = new SsaCodeGenerator(backend, work);
codegen.visitGraph(graph);
return new js.Fun(codegen.parameters, codegen.body)
@@ -177,18 +159,18 @@
SubGraph subGraph;
SsaCodeGenerator(this.backend, CodegenWorkItem work,
- {SourceInformation sourceInformation})
- : this.work = work,
- declaredLocals = new Set<String>(),
- collectedVariableDeclarations = new Set<String>(),
- currentContainer = new js.Block.empty(),
- parameters = <js.Parameter>[],
- expressionStack = <js.Expression>[],
- oldContainerStack = <js.Block>[],
- generateAtUseSite = new Set<HInstruction>(),
- controlFlowOperators = new Set<HInstruction>(),
- breakAction = new Map<Entity, EntityAction>(),
- continueAction = new Map<Entity, EntityAction>();
+ {SourceInformation sourceInformation})
+ : this.work = work,
+ declaredLocals = new Set<String>(),
+ collectedVariableDeclarations = new Set<String>(),
+ currentContainer = new js.Block.empty(),
+ parameters = <js.Parameter>[],
+ expressionStack = <js.Expression>[],
+ oldContainerStack = <js.Block>[],
+ generateAtUseSite = new Set<HInstruction>(),
+ controlFlowOperators = new Set<HInstruction>(),
+ breakAction = new Map<Entity, EntityAction>(),
+ continueAction = new Map<Entity, EntityAction>();
Compiler get compiler => backend.compiler;
@@ -248,8 +230,8 @@
* If the [instruction] is not `null` it will be used to attach the position
* to the [expression].
*/
- pushExpressionAsStatement(js.Expression expression,
- SourceInformation sourceInformation) {
+ pushExpressionAsStatement(
+ js.Expression expression, SourceInformation sourceInformation) {
pushStatement(new js.ExpressionStatement(expression)
.withSourceInformation(sourceInformation));
}
@@ -271,8 +253,8 @@
new SsaTypeKnownRemover().visitGraph(graph);
new SsaTrustedCheckRemover(compiler).visitGraph(graph);
new SsaInstructionMerger(generateAtUseSite, compiler).visitGraph(graph);
- new SsaConditionMerger(
- generateAtUseSite, controlFlowOperators).visitGraph(graph);
+ new SsaConditionMerger(generateAtUseSite, controlFlowOperators)
+ .visitGraph(graph);
SsaLiveIntervalBuilder intervalBuilder = new SsaLiveIntervalBuilder(
compiler, generateAtUseSite, controlFlowOperators);
intervalBuilder.visitGraph(graph);
@@ -308,8 +290,8 @@
js.VariableInitialization initialization =
new js.VariableInitialization(decl, assignment.value);
currentContainer.statements[0] = new js.ExpressionStatement(
- new js.VariableDeclarationList([initialization]))
- .withSourceInformation(sourceInformation);
+ new js.VariableDeclarationList([initialization]))
+ .withSourceInformation(sourceInformation);
return;
}
}
@@ -324,7 +306,8 @@
new js.VariableDeclaration(name), null));
});
var declarationList = new js.VariableDeclarationList(declarations)
- .withSourceInformation(sourceInformation);;
+ .withSourceInformation(sourceInformation);
+ ;
insertStatementAtStart(new js.ExpressionStatement(declarationList));
}
}
@@ -414,7 +397,7 @@
HSubExpressionBlockInformation graph = info;
SubExpression limits = graph.subExpression;
return !identical(expressionType(info), TYPE_STATEMENT) &&
- (limits.end.last is HConditionalBranch);
+ (limits.end.last is HConditionalBranch);
}
/**
@@ -492,7 +475,7 @@
* Only visits the arguments starting at inputs[HInvoke.ARGUMENTS_OFFSET].
*/
List<js.Expression> visitArguments(List<HInstruction> inputs,
- {int start: HInvoke.ARGUMENTS_OFFSET}) {
+ {int start: HInvoke.ARGUMENTS_OFFSET}) {
assert(inputs.length >= start);
List<js.Expression> result = new List<js.Expression>(inputs.length - start);
for (int i = start; i < inputs.length; i++) {
@@ -507,13 +490,19 @@
collectedVariableDeclarations.contains(variableName);
}
- js.Expression generateExpressionAssignment(String variableName,
- js.Expression value) {
+ js.Expression generateExpressionAssignment(
+ String variableName, js.Expression value) {
if (value is js.Binary) {
js.Binary binary = value;
String op = binary.op;
- if (op == '+' || op == '-' || op == '/' || op == '*' || op == '%' ||
- op == '^' || op == '&' || op == '|') {
+ if (op == '+' ||
+ op == '-' ||
+ op == '/' ||
+ op == '*' ||
+ op == '%' ||
+ op == '^' ||
+ op == '&' ||
+ op == '|') {
if (binary.left is js.VariableUse &&
(binary.left as js.VariableUse).name == variableName) {
// We know now, that we can shorten x = x + y into x += y.
@@ -531,9 +520,8 @@
.withSourceInformation(value.sourceInformation);
}
- void assignVariable(String variableName,
- js.Expression value,
- SourceInformation sourceInformation) {
+ void assignVariable(String variableName, js.Expression value,
+ SourceInformation sourceInformation) {
if (isGeneratingExpression) {
// If we are in an expression then we can't declare the variable here.
// We have no choice, but to use it and then declare it separately.
@@ -544,7 +532,7 @@
// Otherwise if we are trying to declare inline and we are in a statement
// then we declare (unless it was already declared).
} else if (!shouldGroupVarDeclarations &&
- !declaredLocals.contains(variableName)) {
+ !declaredLocals.contains(variableName)) {
// It may be necessary to remove it from the ones to be declared later.
collectedVariableDeclarations.remove(variableName);
declaredLocals.add(variableName);
@@ -552,8 +540,9 @@
js.VariableInitialization initialization =
new js.VariableInitialization(decl, value);
- pushExpressionAsStatement(new js.VariableDeclarationList(
- <js.VariableInitialization>[initialization]),
+ pushExpressionAsStatement(
+ new js.VariableDeclarationList(
+ <js.VariableInitialization>[initialization]),
sourceInformation);
} else {
// Otherwise we are just going to use it. If we have not already declared
@@ -562,8 +551,7 @@
collectedVariableDeclarations.add(variableName);
}
pushExpressionAsStatement(
- generateExpressionAssignment(variableName, value),
- sourceInformation);
+ generateExpressionAssignment(variableName, value), sourceInformation);
}
}
@@ -584,10 +572,11 @@
}
if (needsAssignment &&
- !instruction.isControlFlow() && variableNames.hasName(instruction)) {
+ !instruction.isControlFlow() &&
+ variableNames.hasName(instruction)) {
visitExpression(instruction);
assignVariable(variableNames.getName(instruction), pop(),
- instruction.sourceInformation);
+ instruction.sourceInformation);
return;
}
@@ -638,16 +627,16 @@
}
void implicitContinueAsBreak(JumpTarget target) {
- pushStatement(new js.Break(
- backend.namer.implicitContinueLabelName(target)));
+ pushStatement(
+ new js.Break(backend.namer.implicitContinueLabelName(target)));
}
void implicitBreakWithLabel(JumpTarget target) {
pushStatement(new js.Break(backend.namer.implicitBreakLabelName(target)));
}
- js.Statement wrapIntoLabels(js.Statement result,
- List<LabelDefinition> labels) {
+ js.Statement wrapIntoLabels(
+ js.Statement result, List<LabelDefinition> labels) {
for (LabelDefinition label in labels) {
if (label.isTarget) {
String breakLabelString = backend.namer.breakLabelName(label);
@@ -657,7 +646,6 @@
return result;
}
-
// The regular [visitIf] method implements the needed logic.
bool visitIfInfo(HIfBlockInformation info) => false;
@@ -680,8 +668,8 @@
js.Block oldContainer = currentContainer;
for (int inputIndex = 1, statementIndex = 0;
- inputIndex < inputs.length;
- statementIndex++) {
+ inputIndex < inputs.length;
+ statementIndex++) {
HBasicBlock successor = successors[inputIndex - 1];
// If liveness analysis has figured out that this case is dead,
// omit the code for it.
@@ -691,15 +679,15 @@
currentContainer = new js.Block.empty();
cases.add(new js.Case(pop(), currentContainer));
inputIndex++;
- } while ((successors[inputIndex - 1] == successor)
- && (inputIndex < inputs.length));
+ } while ((successors[inputIndex - 1] == successor) &&
+ (inputIndex < inputs.length));
generateStatements(info.statements[statementIndex]);
} else {
// Skip all the case statements that belong to this
// block.
- while ((successors[inputIndex - 1] == successor)
- && (inputIndex < inputs.length)) {
+ while ((successors[inputIndex - 1] == successor) &&
+ (inputIndex < inputs.length)) {
++inputIndex;
}
}
@@ -809,7 +797,8 @@
if (isConditionExpression &&
!hasPhiUpdates &&
- info.updates != null && isJSExpression(info.updates)) {
+ info.updates != null &&
+ isJSExpression(info.updates)) {
// If we have an updates graph, and it's expressible as an
// expression, generate a for-loop.
js.Expression jsInitialization = null;
@@ -837,8 +826,8 @@
}
} else if (expression.isCommaOperator) {
js.Binary binary = expression;
- return allSimpleAssignments(binary.left)
- && allSimpleAssignments(binary.right);
+ return allSimpleAssignments(binary.left) &&
+ allSimpleAssignments(binary.right);
}
return false;
}
@@ -849,8 +838,8 @@
for (js.Assignment assignment in assignments) {
String id = (assignment.leftHandSide as js.VariableUse).name;
js.Node declaration = new js.VariableDeclaration(id);
- inits.add(new js.VariableInitialization(declaration,
- assignment.value));
+ inits.add(new js.VariableInitialization(
+ declaration, assignment.value));
collectedVariableDeclarations.remove(id);
declaredLocals.add(id);
}
@@ -925,7 +914,6 @@
bool hasExitPhiUpdates = !exitAvoidContainer.statements.isEmpty;
currentContainer = oldContainer;
-
oldContainer = currentContainer;
js.Block body = new js.Block.empty();
// If there are phi copies in the block that jumps to the
@@ -960,10 +948,9 @@
// If the condition is dead code, we turn the do-while into
// a simpler while because we will never reach the condition
// at the end of the loop anyway.
- loop = new js.While(
- newLiteralBool(true, info.sourceInformation),
- unwrapStatement(body))
- .withSourceInformation(info.sourceInformation);
+ loop = new js.While(newLiteralBool(true, info.sourceInformation),
+ unwrapStatement(body))
+ .withSourceInformation(info.sourceInformation);
} else {
if (hasPhiUpdates || hasExitPhiUpdates) {
updateBody.statements.add(new js.Continue(null));
@@ -975,8 +962,7 @@
exitAvoidContainer.statements.add(jsBreak);
exitLoop = exitAvoidContainer;
}
- body.statements.add(
- new js.If(jsCondition, updateBody, exitLoop));
+ body.statements.add(new js.If(jsCondition, updateBody, exitLoop));
jsCondition = newLiteralBool(true, info.sourceInformation);
}
loop = new js.Do(unwrapStatement(body), jsCondition)
@@ -1142,9 +1128,8 @@
* Sequentialize a list of conceptually parallel copies. Parallel
* copies may contain cycles, that this method breaks.
*/
- void sequentializeCopies(Iterable<Copy> copies,
- String tempName,
- void doAssignment(String target, String source)) {
+ void sequentializeCopies(Iterable<Copy> copies, String tempName,
+ void doAssignment(String target, String source)) {
// Map to keep track of the current location (ie the variable that
// holds the initial value) of a variable.
Map<String, String> currentLocation = new Map<String, String>();
@@ -1168,7 +1153,6 @@
}
copies = prunedCopies;
-
// For each copy, set the current location of the source to
// itself, and the initial value of the destination to the source.
// Add the destination to the list of copies to make.
@@ -1209,8 +1193,8 @@
// If [current] is used as a source, and the assignment has been
// done, we are done with this variable. Otherwise there is a
// cycle that we break by using a temporary name.
- if (currentLocation[current] != null
- && current != currentLocation[initialValue[current]]) {
+ if (currentLocation[current] != null &&
+ current != currentLocation[initialValue[current]]) {
doAssignment(tempName, current);
currentLocation[current] = tempName;
// [current] can now be safely updated. Copies of [current]
@@ -1227,7 +1211,7 @@
// Map the instructions to strings.
Iterable<Copy> copies = handler.copies.map((Copy copy) {
return new Copy(variableNames.getName(copy.source),
- variableNames.getName(copy.destination));
+ variableNames.getName(copy.destination));
});
sequentializeCopies(copies, variableNames.getSwapTemp(), emitAssignment);
@@ -1251,9 +1235,8 @@
visit(instruction);
}
- void handleInvokeBinary(HInvokeBinary node,
- String op,
- SourceInformation sourceInformation) {
+ void handleInvokeBinary(
+ HInvokeBinary node, String op, SourceInformation sourceInformation) {
use(node.left);
js.Expression jsLeft = pop();
use(node.right);
@@ -1275,14 +1258,14 @@
visitInvokeBinary(node, op);
if (op != '>>>' && requiresUintConversion(node)) {
push(new js.Binary(">>>", pop(), new js.LiteralNumber("0"))
- .withSourceInformation(node.sourceInformation));
+ .withSourceInformation(node.sourceInformation));
}
}
visitInvokeUnary(HInvokeUnary node, String op) {
use(node.operand);
- push(new js.Prefix(op, pop())
- .withSourceInformation(node.sourceInformation));
+ push(
+ new js.Prefix(op, pop()).withSourceInformation(node.sourceInformation));
}
// We want the outcome of bit-operations to be positive. We use the unsigned
@@ -1295,9 +1278,9 @@
}
}
- void emitIdentityComparison(HIdentity instruction,
- SourceInformation sourceInformation,
- {bool inverse: false}) {
+ void emitIdentityComparison(
+ HIdentity instruction, SourceInformation sourceInformation,
+ {bool inverse: false}) {
String op = instruction.singleComparisonOp;
HInstruction left = instruction.left;
HInstruction right = instruction.right;
@@ -1306,20 +1289,19 @@
js.Expression jsLeft = pop();
use(right);
push(new js.Binary(mapRelationalOperator(op, inverse), jsLeft, pop())
- .withSourceInformation(sourceInformation));
+ .withSourceInformation(sourceInformation));
} else {
assert(NullConstantValue.JsNull == 'null');
use(left);
js.Binary leftEqualsNull =
new js.Binary("==", pop(), new js.LiteralNull());
use(right);
- js.Binary rightEqualsNull =
- new js.Binary(mapRelationalOperator("==", inverse),
- pop(), new js.LiteralNull());
+ js.Binary rightEqualsNull = new js.Binary(
+ mapRelationalOperator("==", inverse), pop(), new js.LiteralNull());
use(right);
use(left);
- js.Binary tripleEq = new js.Binary(mapRelationalOperator("===", inverse),
- pop(), pop());
+ js.Binary tripleEq =
+ new js.Binary(mapRelationalOperator("===", inverse), pop(), pop());
push(new js.Conditional(leftEqualsNull, rightEqualsNull, tripleEq)
.withSourceInformation(sourceInformation));
@@ -1330,15 +1312,15 @@
emitIdentityComparison(node, node.sourceInformation, inverse: false);
}
- visitAdd(HAdd node) => visitInvokeBinary(node, '+');
- visitDivide(HDivide node) => visitInvokeBinary(node, '/');
- visitMultiply(HMultiply node) => visitInvokeBinary(node, '*');
- visitSubtract(HSubtract node) => visitInvokeBinary(node, '-');
- visitBitAnd(HBitAnd node) => visitBitInvokeBinary(node, '&');
- visitBitNot(HBitNot node) => visitBitInvokeUnary(node, '~');
- visitBitOr(HBitOr node) => visitBitInvokeBinary(node, '|');
- visitBitXor(HBitXor node) => visitBitInvokeBinary(node, '^');
- visitShiftLeft(HShiftLeft node) => visitBitInvokeBinary(node, '<<');
+ visitAdd(HAdd node) => visitInvokeBinary(node, '+');
+ visitDivide(HDivide node) => visitInvokeBinary(node, '/');
+ visitMultiply(HMultiply node) => visitInvokeBinary(node, '*');
+ visitSubtract(HSubtract node) => visitInvokeBinary(node, '-');
+ visitBitAnd(HBitAnd node) => visitBitInvokeBinary(node, '&');
+ visitBitNot(HBitNot node) => visitBitInvokeUnary(node, '~');
+ visitBitOr(HBitOr node) => visitBitInvokeBinary(node, '|');
+ visitBitXor(HBitXor node) => visitBitInvokeBinary(node, '^');
+ visitShiftLeft(HShiftLeft node) => visitBitInvokeBinary(node, '<<');
visitShiftRight(HShiftRight node) => visitBitInvokeBinary(node, '>>>');
visitTruncatingDivide(HTruncatingDivide node) {
@@ -1356,18 +1338,18 @@
.withSourceInformation(node.sourceInformation));
}
- visitNegate(HNegate node) => visitInvokeUnary(node, '-');
+ visitNegate(HNegate node) => visitInvokeUnary(node, '-');
- visitLess(HLess node) => visitRelational(node, '<');
- visitLessEqual(HLessEqual node) => visitRelational(node, '<=');
- visitGreater(HGreater node) => visitRelational(node, '>');
+ visitLess(HLess node) => visitRelational(node, '<');
+ visitLessEqual(HLessEqual node) => visitRelational(node, '<=');
+ visitGreater(HGreater node) => visitRelational(node, '>');
visitGreaterEqual(HGreaterEqual node) => visitRelational(node, '>=');
visitBoolify(HBoolify node) {
assert(node.inputs.length == 1);
use(node.inputs[0]);
- push(new js.Binary('===', pop(),
- newLiteralBool(true, node.sourceInformation))
+ push(new js.Binary(
+ '===', pop(), newLiteralBool(true, node.sourceInformation))
.withSourceInformation(node.sourceInformation));
}
@@ -1424,9 +1406,8 @@
if (node.label != null) {
LabelDefinition label = node.label;
if (!tryCallAction(breakAction, label)) {
- pushStatement(
- new js.Break(backend.namer.breakLabelName(label))
- .withSourceInformation(node.sourceInformation));
+ pushStatement(new js.Break(backend.namer.breakLabelName(label))
+ .withSourceInformation(node.sourceInformation));
}
} else {
JumpTarget target = node.target;
@@ -1436,8 +1417,8 @@
new js.Break(backend.namer.implicitContinueLabelName(target))
.withSourceInformation(node.sourceInformation));
} else {
- pushStatement(new js.Break(null)
- .withSourceInformation(node.sourceInformation));
+ pushStatement(
+ new js.Break(null).withSourceInformation(node.sourceInformation));
}
}
}
@@ -1449,9 +1430,8 @@
LabelDefinition label = node.label;
if (!tryCallAction(continueAction, label)) {
// TODO(floitsch): should this really be the breakLabelName?
- pushStatement(
- new js.Continue(backend.namer.breakLabelName(label))
- .withSourceInformation(node.sourceInformation));
+ pushStatement(new js.Continue(backend.namer.breakLabelName(label))
+ .withSourceInformation(node.sourceInformation));
}
} else {
JumpTarget target = node.target;
@@ -1493,8 +1473,8 @@
// if (condition) i = bar();
// Usually, the variable name is longer than 'if' and it takes up
// more space to duplicate the name.
- if (!atUseSite
- && variableNames.getName(phi) == variableNames.getName(phi.inputs[1])) {
+ if (!atUseSite &&
+ variableNames.getName(phi) == variableNames.getName(phi.inputs[1])) {
return false;
}
if (!atUseSite) define(phi);
@@ -1569,8 +1549,9 @@
backend.namer.globalObjectFor(helpers.interceptorsLibrary));
use(node.receiver);
List<js.Expression> arguments = <js.Expression>[pop()];
- push(js.propertyCall(isolate, name, arguments)
- .withSourceInformation(node.sourceInformation));
+ push(js
+ .propertyCall(isolate, name, arguments)
+ .withSourceInformation(node.sourceInformation));
registry.registerUseInterceptor();
}
}
@@ -1593,8 +1574,9 @@
// Split returns a List, so we make sure the backend knows the
// list class is instantiated.
registry.registerInstantiatedClass(coreClasses.listClass);
- } else if (backend.isNative(target) && target.isFunction
- && !node.isInterceptedCall) {
+ } else if (backend.isNative(target) &&
+ target.isFunction &&
+ !node.isInterceptedCall) {
// A direct (i.e. non-interceptor) native call is the result of
// optimization. The optimization ensures any type checks or
// conversions have been satisified.
@@ -1609,8 +1591,9 @@
} else {
methodLiteral = backend.namer.asName(methodName);
}
- push(js.propertyCall(object, methodLiteral, arguments)
- .withSourceInformation(node.sourceInformation));
+ push(js
+ .propertyCall(object, methodLiteral, arguments)
+ .withSourceInformation(node.sourceInformation));
}
void visitInvokeConstructorBody(HInvokeConstructorBody node) {
@@ -1618,11 +1601,11 @@
js.Expression object = pop();
js.Name methodName = backend.namer.instanceMethodName(node.element);
List<js.Expression> arguments = visitArguments(node.inputs);
- push(js.propertyCall(object, methodName, arguments)
- .withSourceInformation(node.sourceInformation));
- registry.registerStaticUse(
- new StaticUse.constructorBodyInvoke(
- node.element, new CallStructure.unnamed(arguments.length)));
+ push(js
+ .propertyCall(object, methodName, arguments)
+ .withSourceInformation(node.sourceInformation));
+ registry.registerStaticUse(new StaticUse.constructorBodyInvoke(
+ node.element, new CallStructure.unnamed(arguments.length)));
}
void visitOneShotInterceptor(HOneShotInterceptor node) {
@@ -1632,7 +1615,8 @@
Selector selector = node.selector;
TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
js.Name methodName = backend.registerOneShotInterceptor(selector);
- push(js.propertyCall(isolate, methodName, arguments)
+ push(js
+ .propertyCall(isolate, methodName, arguments)
.withSourceInformation(node.sourceInformation));
if (selector.isGetter) {
registerGetter(node);
@@ -1644,9 +1628,8 @@
registry.registerUseInterceptor();
}
- TypeMask getOptimizedSelectorFor(HInvokeDynamic node,
- Selector selector,
- TypeMask mask) {
+ TypeMask getOptimizedSelectorFor(
+ HInvokeDynamic node, Selector selector, TypeMask mask) {
if (node.element != null) {
// Create an artificial type mask to make sure only
// [node.element] will be enqueued. We're not using the receiver
@@ -1654,14 +1637,13 @@
// invoke dynamic knows more than the receiver.
ClassElement enclosing = node.element.enclosingClass;
if (compiler.world.isInstantiated(enclosing)) {
- return new TypeMask.nonNullExact(
- enclosing.declaration, compiler.world);
+ return new TypeMask.nonNullExact(enclosing.declaration, compiler.world);
} else {
// The element is mixed in so a non-null subtype mask is the most
// precise we have.
assert(invariant(node, compiler.world.isUsedAsMixin(enclosing),
message: "Element ${node.element} from $enclosing expected "
- "to be mixed in."));
+ "to be mixed in."));
return new TypeMask.nonNullSubtype(
enclosing.declaration, compiler.world);
}
@@ -1684,52 +1666,49 @@
// may know something about the types of closures that need
// the specific closure call method.
Selector call = new Selector.callClosureFrom(selector);
- registry.registerDynamicUse(
- new DynamicUse(call, null));
+ registry.registerDynamicUse(new DynamicUse(call, null));
}
- registry.registerDynamicUse(
- new DynamicUse(selector, mask));
+ registry.registerDynamicUse(new DynamicUse(selector, mask));
}
void registerSetter(HInvokeDynamic node) {
Selector selector = node.selector;
TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
- registry.registerDynamicUse(
- new DynamicUse(selector, mask));
+ registry.registerDynamicUse(new DynamicUse(selector, mask));
}
void registerGetter(HInvokeDynamic node) {
Selector selector = node.selector;
TypeMask mask = getOptimizedSelectorFor(node, selector, node.mask);
- registry.registerDynamicUse(
- new DynamicUse(selector, mask));
+ registry.registerDynamicUse(new DynamicUse(selector, mask));
}
visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
use(node.receiver);
js.Name name = backend.namer.invocationName(node.selector);
- push(js.propertyCall(pop(), name, visitArguments(node.inputs))
- .withSourceInformation(node.sourceInformation));
+ push(js
+ .propertyCall(pop(), name, visitArguments(node.inputs))
+ .withSourceInformation(node.sourceInformation));
registerSetter(node);
}
visitInvokeDynamicGetter(HInvokeDynamicGetter node) {
use(node.receiver);
js.Name name = backend.namer.invocationName(node.selector);
- push(js.propertyCall(pop(), name, visitArguments(node.inputs))
- .withSourceInformation(node.sourceInformation));
+ push(js
+ .propertyCall(pop(), name, visitArguments(node.inputs))
+ .withSourceInformation(node.sourceInformation));
registerGetter(node);
}
visitInvokeClosure(HInvokeClosure node) {
Selector call = new Selector.callClosureFrom(node.selector);
use(node.receiver);
- push(js.propertyCall(pop(),
- backend.namer.invocationName(call),
- visitArguments(node.inputs))
- .withSourceInformation(node.sourceInformation));
- registry.registerDynamicUse(
- new DynamicUse(call, null));
+ push(js
+ .propertyCall(pop(), backend.namer.invocationName(call),
+ visitArguments(node.inputs))
+ .withSourceInformation(node.sourceInformation));
+ registry.registerDynamicUse(new DynamicUse(call, null));
}
visitInvokeStatic(HInvokeStatic node) {
@@ -1763,38 +1742,34 @@
// more optimizations available to the loop. This form is 50% faster on
// some small loop, almost as fast as loops with no concurrent
// modification check.
- push(js.js('# || (0, #)(#)',[
- arguments[0],
- backend.emitter.staticFunctionAccess(throwFunction),
- arguments[1]]));
+ push(js.js('# || (0, #)(#)', [
+ arguments[0],
+ backend.emitter.staticFunctionAccess(throwFunction),
+ arguments[1]
+ ]));
} else {
CallStructure callStructure = new CallStructure.unnamed(arguments.length);
- registry.registerStaticUse(
- element.isConstructor
- ? new StaticUse.constructorInvoke(element, callStructure)
- : new StaticUse.staticInvoke(element, callStructure));
+ registry.registerStaticUse(element.isConstructor
+ ? new StaticUse.constructorInvoke(element, callStructure)
+ : new StaticUse.staticInvoke(element, callStructure));
push(backend.emitter.staticFunctionAccess(element));
push(new js.Call(pop(), arguments,
sourceInformation: node.sourceInformation));
}
-
}
visitInvokeSuper(HInvokeSuper node) {
Element superElement = node.element;
ClassElement superClass = superElement.enclosingClass;
if (superElement.isField) {
- js.Name fieldName =
- backend.namer.instanceFieldPropertyName(superElement);
+ js.Name fieldName = backend.namer.instanceFieldPropertyName(superElement);
use(node.inputs[0]);
- js.PropertyAccess access =
- new js.PropertyAccess(pop(), fieldName)
- .withSourceInformation(node.sourceInformation);
+ js.PropertyAccess access = new js.PropertyAccess(pop(), fieldName)
+ .withSourceInformation(node.sourceInformation);
if (node.isSetter) {
- registry.registerStaticUse(
- superElement.isSetter
- ? new StaticUse.superSetterSet(superElement)
- : new StaticUse.superFieldSet(superElement));
+ registry.registerStaticUse(superElement.isSetter
+ ? new StaticUse.superSetterSet(superElement)
+ : new StaticUse.superFieldSet(superElement));
use(node.value);
push(new js.Assignment(access, pop())
.withSourceInformation(node.sourceInformation));
@@ -1811,33 +1786,31 @@
// will be created, and that this tear-off must bypass ordinary
// dispatch to ensure the super method is invoked.
FunctionElement helper = backend.helpers.closureFromTearOff;
- registry.registerStaticUse(new StaticUse.staticInvoke(helper,
- new CallStructure.unnamed(helper.parameters.length)));
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ helper, new CallStructure.unnamed(helper.parameters.length)));
registry.registerStaticUse(new StaticUse.superTearOff(node.element));
methodName = backend.namer.invocationName(selector);
} else {
methodName = backend.namer.instanceMethodName(superElement);
}
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- superElement,
- new CallStructure.unnamed(node.inputs.length)));
- push(js.js('#.#.call(#)',
- [backend.emitter.prototypeAccess(superClass,
- hasBeenInstantiated: true),
- methodName, visitArguments(node.inputs, start: 0)])
- .withSourceInformation(node.sourceInformation));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ superElement, new CallStructure.unnamed(node.inputs.length)));
+ push(js.js('#.#.call(#)', [
+ backend.emitter
+ .prototypeAccess(superClass, hasBeenInstantiated: true),
+ methodName,
+ visitArguments(node.inputs, start: 0)
+ ]).withSourceInformation(node.sourceInformation));
} else {
use(node.receiver);
- registry.registerStaticUse(
- new StaticUse.superInvoke(
- superElement,
- new CallStructure.unnamed(node.inputs.length - 1)));
- push(
- js.js('#.#(#)', [
- pop(), backend.namer.aliasedSuperMemberPropertyName(superElement),
- visitArguments(node.inputs, start: 1)]) // Skip receiver argument.
- .withSourceInformation(node.sourceInformation));
+ registry.registerStaticUse(new StaticUse.superInvoke(
+ superElement, new CallStructure.unnamed(node.inputs.length - 1)));
+ push(js.js('#.#(#)', [
+ pop(),
+ backend.namer.aliasedSuperMemberPropertyName(superElement),
+ visitArguments(node.inputs, start: 1)
+ ]) // Skip receiver argument.
+ .withSourceInformation(node.sourceInformation));
}
}
}
@@ -1902,9 +1875,8 @@
visitLocalSet(HLocalSet node) {
use(node.value);
- assignVariable(variableNames.getName(node.receiver),
- pop(),
- node.sourceInformation);
+ assignVariable(
+ variableNames.getName(node.receiver), pop(), node.sourceInformation);
}
void registerForeignTypes(HForeign node) {
@@ -1921,7 +1893,8 @@
use(inputs[i]);
interpolatedExpressions.add(pop());
}
- pushStatement(node.codeTemplate.instantiate(interpolatedExpressions)
+ pushStatement(node.codeTemplate
+ .instantiate(interpolatedExpressions)
.withSourceInformation(node.sourceInformation));
} else {
List<js.Expression> interpolatedExpressions = <js.Expression>[];
@@ -1929,7 +1902,8 @@
use(inputs[i]);
interpolatedExpressions.add(pop());
}
- push(node.codeTemplate.instantiate(interpolatedExpressions)
+ push(node.codeTemplate
+ .instantiate(interpolatedExpressions)
.withSourceInformation(node.sourceInformation));
}
@@ -1958,24 +1932,22 @@
});
}
- js.Expression newLiteralBool(bool value,
- SourceInformation sourceInformation) {
+ js.Expression newLiteralBool(
+ bool value, SourceInformation sourceInformation) {
if (compiler.options.enableMinification) {
// Use !0 for true, !1 for false.
return new js.Prefix("!", new js.LiteralNumber(value ? "0" : "1"))
.withSourceInformation(sourceInformation);
} else {
- return new js.LiteralBool(value)
- .withSourceInformation(sourceInformation);
+ return new js.LiteralBool(value).withSourceInformation(sourceInformation);
}
}
- void generateConstant(ConstantValue constant,
- SourceInformation sourceInformation) {
+ void generateConstant(
+ ConstantValue constant, SourceInformation sourceInformation) {
if (constant.isFunction) {
FunctionConstantValue function = constant;
- registry.registerStaticUse(
- new StaticUse.staticTearOff(function.element));
+ registry.registerStaticUse(new StaticUse.staticTearOff(function.element));
}
if (constant.isType) {
// If the type is a web component, we need to ensure the constructors are
@@ -2008,21 +1980,21 @@
static String mapRelationalOperator(String op, bool inverse) {
Map<String, String> inverseOperator = const <String, String>{
- "==" : "!=",
- "!=" : "==",
+ "==": "!=",
+ "!=": "==",
"===": "!==",
"!==": "===",
- "<" : ">=",
- "<=" : ">",
- ">" : "<=",
- ">=" : "<"
+ "<": ">=",
+ "<=": ">",
+ ">": "<=",
+ ">=": "<"
};
return inverse ? inverseOperator[op] : op;
}
void generateNot(HInstruction input, SourceInformation sourceInformation) {
bool canGenerateOptimizedComparison(HInstruction instruction) {
- if (instruction is !HRelational) return false;
+ if (instruction is! HRelational) return false;
HRelational relational = instruction;
@@ -2050,8 +2022,8 @@
emitIdentityComparison(input, sourceInformation, inverse: true);
} else if (input is HBoolify) {
use(input.inputs[0]);
- push(new js.Binary("!==", pop(),
- newLiteralBool(true, input.sourceInformation))
+ push(new js.Binary(
+ "!==", pop(), newLiteralBool(true, input.sourceInformation))
.withSourceInformation(sourceInformation));
} else if (canGenerateOptimizedComparison(input)) {
HRelational relational = input;
@@ -2117,12 +2089,12 @@
assert(node.inputs.length == 1);
HInstruction input = node.inputs[0];
if (input.isConstantNull()) {
- pushStatement(new js.Return()
- .withSourceInformation(node.sourceInformation));
+ pushStatement(
+ new js.Return().withSourceInformation(node.sourceInformation));
} else {
use(node.inputs[0]);
- pushStatement(new js.Return(pop())
- .withSourceInformation(node.sourceInformation));
+ pushStatement(
+ new js.Return(pop()).withSourceInformation(node.sourceInformation));
}
}
@@ -2133,8 +2105,8 @@
visitThrow(HThrow node) {
if (node.isRethrow) {
use(node.inputs[0]);
- pushStatement(new js.Throw(pop())
- .withSourceInformation(node.sourceInformation));
+ pushStatement(
+ new js.Throw(pop()).withSourceInformation(node.sourceInformation));
} else {
generateThrowWithHelper(helpers.wrapExceptionHelper, node.inputs[0],
sourceInformation: node.sourceInformation);
@@ -2143,8 +2115,7 @@
visitAwait(HAwait node) {
use(node.inputs[0]);
- push(new js.Await(pop())
- .withSourceInformation(node.sourceInformation));
+ push(new js.Await(pop()).withSourceInformation(node.sourceInformation));
}
visitYield(HYield node) {
@@ -2191,9 +2162,7 @@
assert(over != null || under != null);
js.Expression underOver = under == null
? over
- : over == null
- ? under
- : new js.Binary("||", under, over);
+ : over == null ? under : new js.Binary("||", under, over);
js.Statement thenBody = new js.Block.empty();
js.Block oldContainer = currentContainer;
currentContainer = thenBody;
@@ -2204,13 +2173,13 @@
pushStatement(new js.If.noElse(underOver, thenBody)
.withSourceInformation(node.sourceInformation));
} else {
- generateThrowWithHelper(helpers.throwIndexOutOfRangeException,
- [node.array, node.index]);
+ generateThrowWithHelper(
+ helpers.throwIndexOutOfRangeException, [node.array, node.index]);
}
}
void generateThrowWithHelper(Element helper, argument,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
js.Expression jsHelper = backend.emitter.staticFunctionAccess(helper);
List arguments = [];
var location;
@@ -2225,17 +2194,16 @@
use(argument);
arguments.add(pop());
}
- registry.registerStaticUse(
- new StaticUse.staticInvoke(
- helper, new CallStructure.unnamed(arguments.length)));
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ helper, new CallStructure.unnamed(arguments.length)));
js.Call value = new js.Call(jsHelper, arguments.toList(growable: false),
sourceInformation: sourceInformation);
// BUG(4906): Using throw/return here adds to the size of the generated code
// but it has the advantage of explicitly telling the JS engine that
// this code path will terminate abruptly. Needs more work.
if (helper == helpers.wrapExceptionHelper) {
- pushStatement(new js.Throw(value)
- .withSourceInformation(sourceInformation));
+ pushStatement(
+ new js.Throw(value).withSourceInformation(sourceInformation));
} else {
Element element = work.element;
if (element is FunctionElement && element.asyncMarker.isYielding) {
@@ -2245,8 +2213,8 @@
pushStatement(new js.ExpressionStatement(value)
.withSourceInformation(sourceInformation));
} else {
- pushStatement(new js.Return(value)
- .withSourceInformation(sourceInformation));
+ pushStatement(
+ new js.Return(value).withSourceInformation(sourceInformation));
}
}
}
@@ -2273,22 +2241,21 @@
Element element = node.element;
assert(element.isFunction || element.isField);
if (element.isFunction) {
- push(backend.emitter.isolateStaticClosureAccess(element)
- .withSourceInformation(node.sourceInformation));
- registry.registerStaticUse(
- new StaticUse.staticTearOff(element));
+ push(backend.emitter
+ .isolateStaticClosureAccess(element)
+ .withSourceInformation(node.sourceInformation));
+ registry.registerStaticUse(new StaticUse.staticTearOff(element));
} else {
- push(backend.emitter.staticFieldAccess(element)
- .withSourceInformation(node.sourceInformation));
- registry.registerStaticUse(
- new StaticUse.staticGet(element));
+ push(backend.emitter
+ .staticFieldAccess(element)
+ .withSourceInformation(node.sourceInformation));
+ registry.registerStaticUse(new StaticUse.staticGet(element));
}
}
void visitLazyStatic(HLazyStatic node) {
Element element = node.element;
- registry.registerStaticUse(
- new StaticUse.staticInit(element));
+ registry.registerStaticUse(new StaticUse.staticInit(element));
js.Expression lazyGetter =
backend.emitter.isolateLazyInitializerAccess(element);
js.Call call = new js.Call(lazyGetter, <js.Expression>[],
@@ -2297,8 +2264,7 @@
}
void visitStaticStore(HStaticStore node) {
- registry.registerStaticUse(
- new StaticUse.staticSet(node.element));
+ registry.registerStaticUse(new StaticUse.staticSet(node.element));
js.Node variable = backend.emitter.staticFieldAccess(node.element);
use(node.inputs[0]);
push(new js.Assignment(variable, pop())
@@ -2321,9 +2287,9 @@
// JavaScript's + operator with a string for the left operand will convert
// the right operand to a string, and the conversion result is correct.
use(input);
- if (node.usedBy.length == 1
- && node.usedBy[0] is HStringConcat
- && node.usedBy[0].inputs[1] == node) {
+ if (node.usedBy.length == 1 &&
+ node.usedBy[0] is HStringConcat &&
+ node.usedBy[0].inputs[1] == node) {
// The context is already <string> + value.
} else {
// Force an empty string for the first operand.
@@ -2338,7 +2304,7 @@
backend.emitter.staticFunctionAccess(convertToString);
use(input);
push(new js.Call(jsHelper, <js.Expression>[pop()],
- sourceInformation: node.sourceInformation));
+ sourceInformation: node.sourceInformation));
}
}
@@ -2382,46 +2348,46 @@
push(new js.Binary(cmp, left, or0));
}
- void checkBigInt(HInstruction input, String cmp,
- SourceInformation sourceInformation) {
+ void checkBigInt(
+ HInstruction input, String cmp, SourceInformation sourceInformation) {
use(input);
js.Expression left = pop();
use(input);
js.Expression right = pop();
// TODO(4984): Deal with infinity and -0.0.
- push(js.js('Math.floor(#) $cmp #', <js.Expression>[left, right])
- .withSourceInformation(sourceInformation));
+ push(js.js('Math.floor(#) $cmp #',
+ <js.Expression>[left, right]).withSourceInformation(sourceInformation));
}
void checkTypeOf(HInstruction input, String cmp, String typeName,
- SourceInformation sourceInformation) {
+ SourceInformation sourceInformation) {
use(input);
js.Expression typeOf = new js.Prefix("typeof", pop());
push(new js.Binary(cmp, typeOf, js.string(typeName)));
}
- void checkNum(HInstruction input, String cmp,
- SourceInformation sourceInformation) {
+ void checkNum(
+ HInstruction input, String cmp, SourceInformation sourceInformation) {
return checkTypeOf(input, cmp, 'number', sourceInformation);
}
- void checkDouble(HInstruction input, String cmp,
- SourceInformation sourceInformation) {
+ void checkDouble(
+ HInstruction input, String cmp, SourceInformation sourceInformation) {
return checkNum(input, cmp, sourceInformation);
}
- void checkString(HInstruction input, String cmp,
- SourceInformation sourceInformation) {
+ void checkString(
+ HInstruction input, String cmp, SourceInformation sourceInformation) {
return checkTypeOf(input, cmp, 'string', sourceInformation);
}
- void checkBool(HInstruction input, String cmp,
- SourceInformation sourceInformation) {
+ void checkBool(
+ HInstruction input, String cmp, SourceInformation sourceInformation) {
return checkTypeOf(input, cmp, 'boolean', sourceInformation);
}
- void checkObject(HInstruction input, String cmp,
- SourceInformation sourceInformation) {
+ void checkObject(
+ HInstruction input, String cmp, SourceInformation sourceInformation) {
assert(NullConstantValue.JsNull == 'null');
if (cmp == "===") {
checkTypeOf(input, '===', 'object', sourceInformation);
@@ -2487,13 +2453,12 @@
push(new js.Binary('!=', pop(), new js.LiteralNull()));
}
- void checkType(HInstruction input, HInstruction interceptor,
- DartType type,
- SourceInformation sourceInformation,
- {bool negative: false}) {
+ void checkType(HInstruction input, HInstruction interceptor, DartType type,
+ SourceInformation sourceInformation,
+ {bool negative: false}) {
Element element = type.element;
if (element == helpers.jsArrayClass) {
- checkArray(input, negative ? '!==': '===');
+ checkArray(input, negative ? '!==' : '===');
return;
} else if (element == helpers.jsMutableArrayClass) {
if (negative) {
@@ -2526,15 +2491,15 @@
}
if (interceptor != null) {
checkTypeViaProperty(interceptor, type, sourceInformation,
- negative: negative);
+ negative: negative);
} else {
checkTypeViaProperty(input, type, sourceInformation, negative: negative);
}
}
- void checkTypeViaProperty(HInstruction input, DartType type,
- SourceInformation sourceInformation,
- {bool negative: false}) {
+ void checkTypeViaProperty(
+ HInstruction input, DartType type, SourceInformation sourceInformation,
+ {bool negative: false}) {
registry.registerTypeUse(new TypeUse.isCheck(type));
use(input);
@@ -2543,18 +2508,15 @@
new js.PropertyAccess(pop(), backend.namer.operatorIsType(type))
.withSourceInformation(sourceInformation);
// We always negate at least once so that the result is boolified.
- push(new js.Prefix('!', field)
- .withSourceInformation(sourceInformation));
+ push(new js.Prefix('!', field).withSourceInformation(sourceInformation));
// If the result is not negated, put another '!' in front.
if (!negative) {
- push(new js.Prefix('!', pop())
- .withSourceInformation(sourceInformation));
+ push(new js.Prefix('!', pop()).withSourceInformation(sourceInformation));
}
}
void checkTypeViaInstanceof(
- HInstruction input, DartType type,
- SourceInformation sourceInformation,
+ HInstruction input, DartType type, SourceInformation sourceInformation,
{bool negative: false}) {
registry.registerTypeUse(new TypeUse.isCheck(type));
@@ -2562,23 +2524,23 @@
js.Expression jsClassReference =
backend.emitter.constructorAccess(type.element);
- push(js.js('# instanceof #', [pop(), jsClassReference])
- .withSourceInformation(sourceInformation));
+ push(js.js('# instanceof #',
+ [pop(), jsClassReference]).withSourceInformation(sourceInformation));
if (negative) {
- push(new js.Prefix('!', pop())
- .withSourceInformation(sourceInformation));
+ push(new js.Prefix('!', pop()).withSourceInformation(sourceInformation));
}
registry.registerInstantiation(type);
}
- void handleNumberOrStringSupertypeCheck(HInstruction input,
- HInstruction interceptor,
- DartType type,
- SourceInformation sourceInformation,
- {bool negative: false}) {
+ void handleNumberOrStringSupertypeCheck(
+ HInstruction input,
+ HInstruction interceptor,
+ DartType type,
+ SourceInformation sourceInformation,
+ {bool negative: false}) {
assert(!identical(type.element, coreClasses.listClass) &&
- !Elements.isListSupertype(type.element, compiler) &&
- !Elements.isStringOnlySupertype(type.element, compiler));
+ !Elements.isListSupertype(type.element, compiler) &&
+ !Elements.isStringOnlySupertype(type.element, compiler));
String relation = negative ? '!==' : '===';
checkNum(input, relation, sourceInformation);
js.Expression numberTest = pop();
@@ -2589,22 +2551,21 @@
checkType(input, interceptor, type, sourceInformation, negative: negative);
String combiner = negative ? '&&' : '||';
String combiner2 = negative ? '||' : '&&';
- push(new js.Binary(combiner,
- new js.Binary(combiner, numberTest, stringTest)
- .withSourceInformation(sourceInformation),
- new js.Binary(combiner2, objectTest, pop())
- .withSourceInformation(sourceInformation))
+ push(new js.Binary(
+ combiner,
+ new js.Binary(combiner, numberTest, stringTest)
+ .withSourceInformation(sourceInformation),
+ new js.Binary(combiner2, objectTest, pop())
+ .withSourceInformation(sourceInformation))
.withSourceInformation(sourceInformation));
}
- void handleStringSupertypeCheck(HInstruction input,
- HInstruction interceptor,
- DartType type,
- SourceInformation sourceInformation,
- {bool negative: false}) {
- assert(!identical(type.element, coreClasses.listClass)
- && !Elements.isListSupertype(type.element, compiler)
- && !Elements.isNumberOrStringSupertype(type.element, compiler));
+ void handleStringSupertypeCheck(HInstruction input, HInstruction interceptor,
+ DartType type, SourceInformation sourceInformation,
+ {bool negative: false}) {
+ assert(!identical(type.element, coreClasses.listClass) &&
+ !Elements.isListSupertype(type.element, compiler) &&
+ !Elements.isNumberOrStringSupertype(type.element, compiler));
String relation = negative ? '!==' : '===';
checkString(input, relation, sourceInformation);
js.Expression stringTest = pop();
@@ -2612,19 +2573,16 @@
js.Expression objectTest = pop();
checkType(input, interceptor, type, sourceInformation, negative: negative);
String combiner = negative ? '||' : '&&';
- push(new js.Binary(negative ? '&&' : '||',
- stringTest,
- new js.Binary(combiner, objectTest, pop())));
+ push(new js.Binary(negative ? '&&' : '||', stringTest,
+ new js.Binary(combiner, objectTest, pop())));
}
- void handleListOrSupertypeCheck(HInstruction input,
- HInstruction interceptor,
- DartType type,
- SourceInformation sourceInformation,
- { bool negative: false }) {
- assert(!identical(type.element, coreClasses.stringClass)
- && !Elements.isStringOnlySupertype(type.element, compiler)
- && !Elements.isNumberOrStringSupertype(type.element, compiler));
+ void handleListOrSupertypeCheck(HInstruction input, HInstruction interceptor,
+ DartType type, SourceInformation sourceInformation,
+ {bool negative: false}) {
+ assert(!identical(type.element, coreClasses.stringClass) &&
+ !Elements.isStringOnlySupertype(type.element, compiler) &&
+ !Elements.isNumberOrStringSupertype(type.element, compiler));
String relation = negative ? '!==' : '===';
checkObject(input, relation, sourceInformation);
js.Expression objectTest = pop();
@@ -2632,9 +2590,8 @@
js.Expression arrayTest = pop();
checkType(input, interceptor, type, sourceInformation, negative: negative);
String combiner = negative ? '&&' : '||';
- push(new js.Binary(negative ? '||' : '&&',
- objectTest,
- new js.Binary(combiner, arrayTest, pop()))
+ push(new js.Binary(negative ? '||' : '&&', objectTest,
+ new js.Binary(combiner, arrayTest, pop()))
.withSourceInformation(sourceInformation));
}
@@ -2646,7 +2603,7 @@
emitIsViaInterceptor(node, node.sourceInformation, negative: false);
}
- void emitIs(HIs node, String relation, SourceInformation sourceInformation) {
+ void emitIs(HIs node, String relation, SourceInformation sourceInformation) {
DartType type = node.typeExpression;
registry.registerTypeUse(new TypeUse.isCheck(type));
HInstruction input = node.expression;
@@ -2693,53 +2650,44 @@
.withSourceInformation(sourceInformation));
} else if (node.useInstanceOf) {
assert(interceptor == null);
- checkTypeViaInstanceof(input, type,
- sourceInformation,
- negative: negative);
+ checkTypeViaInstanceof(input, type, sourceInformation,
+ negative: negative);
} else if (Elements.isNumberOrStringSupertype(element, compiler)) {
handleNumberOrStringSupertypeCheck(
- input, interceptor, type,
- sourceInformation,
+ input, interceptor, type, sourceInformation,
negative: negative);
} else if (Elements.isStringOnlySupertype(element, compiler)) {
- handleStringSupertypeCheck(
- input, interceptor, type,
- sourceInformation,
+ handleStringSupertypeCheck(input, interceptor, type, sourceInformation,
negative: negative);
} else if (identical(element, coreClasses.listClass) ||
- Elements.isListSupertype(element, compiler)) {
- handleListOrSupertypeCheck(
- input, interceptor, type,
- sourceInformation,
+ Elements.isListSupertype(element, compiler)) {
+ handleListOrSupertypeCheck(input, interceptor, type, sourceInformation,
negative: negative);
} else if (type.isFunctionType) {
- checkType(input, interceptor, type,
- sourceInformation,
- negative: negative);
- } else if ((input.canBePrimitive(compiler)
- && !input.canBePrimitiveArray(compiler))
- || input.canBeNull()) {
+ checkType(input, interceptor, type, sourceInformation,
+ negative: negative);
+ } else if ((input.canBePrimitive(compiler) &&
+ !input.canBePrimitiveArray(compiler)) ||
+ input.canBeNull()) {
checkObject(input, relation, node.sourceInformation);
js.Expression objectTest = pop();
- checkType(input, interceptor, type,
- sourceInformation,
- negative: negative);
+ checkType(input, interceptor, type, sourceInformation,
+ negative: negative);
push(new js.Binary(negative ? '||' : '&&', objectTest, pop())
.withSourceInformation(sourceInformation));
} else {
- checkType(input, interceptor, type,
- sourceInformation,
- negative: negative);
+ checkType(input, interceptor, type, sourceInformation,
+ negative: negative);
}
}
}
- void emitIsViaInterceptor(HIsViaInterceptor node,
- SourceInformation sourceInformation,
- {bool negative: false}) {
- checkTypeViaProperty(node.interceptor, node.typeExpression,
- sourceInformation,
- negative: negative);
+ void emitIsViaInterceptor(
+ HIsViaInterceptor node, SourceInformation sourceInformation,
+ {bool negative: false}) {
+ checkTypeViaProperty(
+ node.interceptor, node.typeExpression, sourceInformation,
+ negative: negative);
}
js.Expression generateReceiverOrArgumentTypeTest(
@@ -2752,10 +2700,10 @@
// typeof check so the null check is cheaper.
bool isIntCheck = checkedType.containsOnlyInt(classWorld);
bool turnIntoNumCheck = isIntCheck && input.isIntegerOrNull(compiler);
- bool turnIntoNullCheck = !turnIntoNumCheck
- && (checkedType.nullable() == inputType)
- && (isIntCheck
- || checkedType.satisfies(helpers.jsIndexableClass, classWorld));
+ bool turnIntoNullCheck = !turnIntoNumCheck &&
+ (checkedType.nullable() == inputType) &&
+ (isIntCheck ||
+ checkedType.satisfies(helpers.jsIndexableClass, classWorld));
if (turnIntoNullCheck) {
use(input);
@@ -2788,8 +2736,8 @@
// An int check if the input is not int or null, is not
// sufficient for doing an argument or receiver check.
assert(compiler.options.trustTypeAnnotations ||
- !node.checkedType.containsOnlyInt(classWorld) ||
- node.checkedInput.isIntegerOrNull(compiler));
+ !node.checkedType.containsOnlyInt(classWorld) ||
+ node.checkedInput.isIntegerOrNull(compiler));
js.Expression test = generateReceiverOrArgumentTypeTest(
node.checkedInput, node.checkedType);
js.Block oldContainer = currentContainer;
@@ -2797,8 +2745,7 @@
currentContainer = body;
if (node.isArgumentTypeCheck) {
generateThrowWithHelper(
- helpers.throwIllegalArgumentException,
- node.checkedInput,
+ helpers.throwIllegalArgumentException, node.checkedInput,
sourceInformation: node.sourceInformation);
} else if (node.isReceiverTypeCheck) {
use(node.checkedInput);
@@ -2827,8 +2774,7 @@
CheckedModeHelper helper;
if (node.isBooleanConversionCheck) {
- helper =
- const CheckedModeHelper('boolConversionCheck');
+ helper = const CheckedModeHelper('boolConversionCheck');
} else {
helper =
backend.getCheckedModeHelper(type, typeCast: node.isCastTypeCheck);
@@ -2884,9 +2830,10 @@
push(js.js('#(#)', [accessHelper('buildFunctionType'), arguments]));
} else {
var arguments = [
- returnType,
- new js.ArrayInitializer(parameterTypes),
- new js.ObjectInitializer(namedParameters)];
+ returnType,
+ new js.ArrayInitializer(parameterTypes),
+ new js.ObjectInitializer(namedParameters)
+ ];
push(js.js('#(#)', [accessHelper('buildNamedFunctionType'), arguments]));
}
}
@@ -2902,19 +2849,18 @@
if (backend.isInterceptorClass(element.enclosingClass)) {
int index = element.index;
js.Expression receiver = pop();
- js.Expression helper = backend.emitter
- .staticFunctionAccess(helperElement);
+ js.Expression helper =
+ backend.emitter.staticFunctionAccess(helperElement);
push(js.js(r'#(#.$builtinTypeInfo && #.$builtinTypeInfo[#])',
- [helper, receiver, receiver, js.js.number(index)]));
+ [helper, receiver, receiver, js.js.number(index)]));
} else {
backend.emitter.registerReadTypeVariable(element);
- push(js.js('#.#()',
- [pop(), backend.namer.nameForReadTypeVariable(element)]));
+ push(js.js(
+ '#.#()', [pop(), backend.namer.nameForReadTypeVariable(element)]));
}
} else {
- push(js.js('#(#)', [
- backend.emitter.staticFunctionAccess(helperElement),
- pop()]));
+ push(js.js('#(#)',
+ [backend.emitter.staticFunctionAccess(helperElement), pop()]));
}
}
@@ -2948,9 +2894,8 @@
// For mocked-up tests.
return js.js('(void 0).$name');
}
- registry.registerStaticUse(
- new StaticUse.staticInvoke(helper,
- new CallStructure.unnamed(argumentCount)));
+ registry.registerStaticUse(new StaticUse.staticInvoke(
+ helper, new CallStructure.unnamed(argumentCount)));
return backend.emitter.staticFunctionAccess(helper);
}
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index beb4f42..254e577 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -67,8 +67,8 @@
if (node.kind == HIs.RAW_CHECK) {
HInstruction interceptor = node.interceptor;
if (interceptor != null) {
- return new HIsViaInterceptor(node.typeExpression, interceptor,
- backend.boolType);
+ return new HIsViaInterceptor(
+ node.typeExpression, interceptor, backend.boolType);
}
}
return node;
@@ -87,8 +87,7 @@
if (leftType.isNullable && rightType.isNullable) {
if (left.isConstantNull() ||
right.isConstantNull() ||
- (left.isPrimitive(compiler) &&
- leftType == rightType)) {
+ (left.isPrimitive(compiler) && leftType == rightType)) {
return '==';
}
return null;
@@ -193,14 +192,12 @@
return replaceOp(rmw, left);
} else {
HInstruction rmw = new HReadModifyWrite.assignOp(
- setter.element,
- assignOp,
- receiver, right, op.instructionType);
+ setter.element, assignOp, receiver, right, op.instructionType);
return replaceOp(rmw, left);
}
} else if (op.usedBy.length == 1 &&
- right is HConstant &&
- right.constant.isOne) {
+ right is HConstant &&
+ right.constant.isOne) {
HInstruction rmw = new HReadModifyWrite.postOp(
setter.element, incrementOp, receiver, op.instructionType);
block.addAfter(left, rmw);
@@ -214,14 +211,12 @@
return noMatchingRead();
}
- HInstruction simple(String assignOp,
- HInstruction left, HInstruction right) {
+ HInstruction simple(
+ String assignOp, HInstruction left, HInstruction right) {
if (isMatchingRead(left)) {
if (left.usedBy.length == 1) {
HInstruction rmw = new HReadModifyWrite.assignOp(
- setter.element,
- assignOp,
- receiver, right, op.instructionType);
+ setter.element, assignOp, receiver, right, op.instructionType);
return replaceOp(rmw, left);
}
}
@@ -261,7 +256,6 @@
* analysis easier.
*/
class SsaTypeKnownRemover extends HBaseVisitor {
-
void visitGraph(HGraph graph) {
visitDominatorTree(graph);
}
@@ -286,7 +280,6 @@
* mode.
*/
class SsaTrustedCheckRemover extends HBaseVisitor {
-
Compiler compiler;
SsaTrustedCheckRemover(this.compiler);
@@ -354,12 +347,12 @@
List<HInstruction> inputs = user.inputs;
for (int i = start; i < inputs.length; i++) {
HInstruction input = inputs[i];
- if (!generateAtUseSite.contains(input)
- && !input.isCodeMotionInvariant()
- && input.usedBy.length == 1
- && input is !HPhi
- && input is !HLocalValue
- && !input.isJsStatement()) {
+ if (!generateAtUseSite.contains(input) &&
+ !input.isCodeMotionInvariant() &&
+ input.usedBy.length == 1 &&
+ input is! HPhi &&
+ input is! HLocalValue &&
+ !input.isJsStatement()) {
if (input.isPure()) {
// Only consider a pure input if it is in the same loop.
// Otherwise, we might move GVN'ed instruction back into the
@@ -441,8 +434,7 @@
}
void visitTypeConversion(HTypeConversion instruction) {
- if (!instruction.isArgumentTypeCheck
- && !instruction.isReceiverTypeCheck) {
+ if (!instruction.isArgumentTypeCheck && !instruction.isReceiverTypeCheck) {
assert(instruction.isCheckedModeCheck || instruction.isCastTypeCheck);
// Checked mode checks and cast checks compile to code that
// only use their input once, so we can safely visit them
@@ -462,8 +454,8 @@
}
bool isBlockSinglePredecessor(HBasicBlock block) {
- return block.successors.length == 1
- && block.successors[0].predecessors.length == 1;
+ return block.successors.length == 1 &&
+ block.successors[0].predecessors.length == 1;
}
void visitBasicBlock(HBasicBlock block) {
@@ -503,8 +495,8 @@
block.last.accept(this);
for (HInstruction instruction = block.last.previous;
- instruction != null;
- instruction = instruction.previous) {
+ instruction != null;
+ instruction = instruction.previous) {
if (generateAtUseSite.contains(instruction)) {
continue;
}
@@ -585,8 +577,8 @@
}
}
- if (block.predecessors.length == 1
- && isBlockSinglePredecessor(block.predecessors[0])) {
+ if (block.predecessors.length == 1 &&
+ isBlockSinglePredecessor(block.predecessors[0])) {
assert(block.phis.isEmpty);
tryMergingExpressions(block.predecessors[0]);
} else {
@@ -630,8 +622,8 @@
// If [instruction] is not the last instruction of the block
// before the control flow instruction, or the last instruction,
// then we will have to emit a statement for that last instruction.
- if (instruction != block.last
- && !identical(instruction, block.last.previous)) return true;
+ if (instruction != block.last &&
+ !identical(instruction, block.last.previous)) return true;
// If one of the instructions in the block until [instruction] is
// not generated at use site, then we will have to emit a
@@ -639,8 +631,8 @@
// TODO(ngeoffray): we could generate a comma separated
// list of expressions.
for (HInstruction temp = block.first;
- !identical(temp, instruction);
- temp = temp.next) {
+ !identical(temp, instruction);
+ temp = temp.next) {
if (!generateAtUseSite.contains(temp)) return true;
}
@@ -664,7 +656,7 @@
}
void visitBasicBlock(HBasicBlock block) {
- if (block.last is !HIf) return;
+ if (block.last is! HIf) return;
HIf startIf = block.last;
HBasicBlock end = startIf.joinBlock;
@@ -754,9 +746,9 @@
// If the operation is only used by the first instruction
// of its block and is safe to be generated at use site, mark it
// so.
- if (phi.usedBy.length == 1
- && phi.usedBy[0] == nextInstruction
- && isSafeToGenerateAtUseSite(phi.usedBy[0], phi)) {
+ if (phi.usedBy.length == 1 &&
+ phi.usedBy[0] == nextInstruction &&
+ isSafeToGenerateAtUseSite(phi.usedBy[0], phi)) {
markAsGenerateAtUseSite(phi);
}
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index 3281111..1777d96 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -96,9 +96,8 @@
return false;
}
- bool canUseSelfForInterceptor(HInstruction receiver,
- Set<ClassElement> interceptedClasses) {
-
+ bool canUseSelfForInterceptor(
+ HInstruction receiver, Set<ClassElement> interceptedClasses) {
if (receiver.canBePrimitive(compiler)) {
// Primitives always need interceptors.
return false;
@@ -116,8 +115,7 @@
}
HInstruction tryComputeConstantInterceptor(
- HInstruction input,
- Set<ClassElement> interceptedClasses) {
+ HInstruction input, Set<ClassElement> interceptedClasses) {
if (input == graph.explicitReceiverParameter) {
// If `explicitReceiverParameter` is set it means the current method is an
// interceptor method, and `this` is the interceptor. The caller just did
@@ -143,9 +141,7 @@
}
ClassElement tryComputeConstantInterceptorFromType(
- TypeMask type,
- Set<ClassElement> interceptedClasses) {
-
+ TypeMask type, Set<ClassElement> interceptedClasses) {
if (type.isNullable) {
if (type.isNull) {
return helpers.jsNullClass;
@@ -230,13 +226,13 @@
node == dominator.receiver &&
useCount(dominator, node) == 1) {
interceptedClasses =
- backend.getInterceptedClassesOn(dominator.selector.name);
+ backend.getInterceptedClassesOn(dominator.selector.name);
// If we found that we need number, we must still go through all
// uses to check if they require int, or double.
if (interceptedClasses.contains(helpers.jsNumberClass) &&
!(interceptedClasses.contains(helpers.jsDoubleClass) ||
- interceptedClasses.contains(helpers.jsIntClass))) {
+ interceptedClasses.contains(helpers.jsIntClass))) {
for (HInstruction user in node.usedBy) {
if (user is! HInvoke) continue;
Set<ClassElement> intercepted =
@@ -256,14 +252,14 @@
user.isCallOnInterceptor(compiler) &&
node == user.receiver &&
useCount(user, node) == 1) {
- interceptedClasses.addAll(
- backend.getInterceptedClassesOn(user.selector.name));
+ interceptedClasses
+ .addAll(backend.getInterceptedClassesOn(user.selector.name));
} else if (user is HInvokeSuper &&
- user.isCallOnInterceptor(compiler) &&
- node == user.receiver &&
- useCount(user, node) == 1) {
- interceptedClasses.addAll(
- backend.getInterceptedClassesOn(user.selector.name));
+ user.isCallOnInterceptor(compiler) &&
+ node == user.receiver &&
+ useCount(user, node) == 1) {
+ interceptedClasses
+ .addAll(backend.getInterceptedClassesOn(user.selector.name));
} else {
// Use a most general interceptor for other instructions, example,
// is-checks and escaping interceptors.
@@ -311,10 +307,9 @@
ClassElement interceptorClass = tryComputeConstantInterceptorFromType(
receiver.instructionType.nonNullable(), interceptedClasses);
if (interceptorClass != null) {
- HInstruction constantInstruction =
- graph.addConstant(
- new InterceptorConstantValue(interceptorClass.thisType),
- compiler);
+ HInstruction constantInstruction = graph.addConstant(
+ new InterceptorConstantValue(interceptorClass.thisType),
+ compiler);
node.conditionalConstantInterceptor = constantInstruction;
constantInstruction.usedBy.add(node);
return false;
@@ -358,8 +353,11 @@
List<HInstruction> inputs = new List<HInstruction>.from(user.inputs);
inputs[0] = nullConstant;
HOneShotInterceptor oneShotInterceptor = new HOneShotInterceptor(
- user.selector, user.mask,
- inputs, user.instructionType, interceptedClasses);
+ user.selector,
+ user.mask,
+ inputs,
+ user.instructionType,
+ interceptedClasses);
oneShotInterceptor.sourceInformation = user.sourceInformation;
oneShotInterceptor.sourceElement = user.sourceElement;
return replaceUserWith(oneShotInterceptor);
@@ -386,8 +384,8 @@
}
bool visitOneShotInterceptor(HOneShotInterceptor node) {
- HInstruction constant = tryComputeConstantInterceptor(
- node.inputs[1], node.interceptedClasses);
+ HInstruction constant =
+ tryComputeConstantInterceptor(node.inputs[1], node.interceptedClasses);
if (constant == null) return false;
@@ -395,12 +393,8 @@
TypeMask mask = node.mask;
HInstruction instruction;
if (selector.isGetter) {
- instruction = new HInvokeDynamicGetter(
- selector,
- mask,
- node.element,
- <HInstruction>[constant, node.inputs[1]],
- node.instructionType);
+ instruction = new HInvokeDynamicGetter(selector, mask, node.element,
+ <HInstruction>[constant, node.inputs[1]], node.instructionType);
} else if (selector.isSetter) {
instruction = new HInvokeDynamicSetter(
selector,
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 9e03bb9..ff565f9 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -24,14 +24,14 @@
class InvokeDynamicSpecializer {
const InvokeDynamicSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
return TypeMaskFactory.inferredTypeForSelector(
instruction.selector, instruction.mask, compiler);
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
return null;
}
@@ -94,18 +94,16 @@
class IndexAssignSpecializer extends InvokeDynamicSpecializer {
const IndexAssignSpecializer();
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
if (instruction.inputs[1].isMutableIndexable(compiler)) {
- if (!instruction.inputs[2].isInteger(compiler)
- && compiler.options.enableTypeAssertions) {
+ if (!instruction.inputs[2].isInteger(compiler) &&
+ compiler.options.enableTypeAssertions) {
// We want the right checked mode error.
return null;
}
- return new HIndexAssign(instruction.inputs[1],
- instruction.inputs[2],
- instruction.inputs[3],
- instruction.selector);
+ return new HIndexAssign(instruction.inputs[1], instruction.inputs[2],
+ instruction.inputs[3], instruction.selector);
}
return null;
}
@@ -114,11 +112,11 @@
class IndexSpecializer extends InvokeDynamicSpecializer {
const IndexSpecializer();
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
if (!instruction.inputs[1].isIndexablePrimitive(compiler)) return null;
- if (!instruction.inputs[2].isInteger(compiler)
- && compiler.options.enableTypeAssertions) {
+ if (!instruction.inputs[2].isInteger(compiler) &&
+ compiler.options.enableTypeAssertions) {
// We want the right checked mode error.
return null;
}
@@ -126,8 +124,7 @@
instruction.getDartReceiver(compiler).instructionType;
TypeMask type = TypeMaskFactory.inferredTypeForSelector(
instruction.selector, receiverType, compiler);
- return new HIndex(
- instruction.inputs[1], instruction.inputs[2],
+ return new HIndex(instruction.inputs[1], instruction.inputs[2],
instruction.selector, type);
}
}
@@ -139,8 +136,8 @@
return constantSystem.bitNot;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
// All bitwise operations on primitive types either produce an
// integer or throw an error.
JavaScriptBackend backend = compiler.backend;
@@ -150,12 +147,12 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction input = instruction.inputs[1];
if (input.isNumber(compiler)) {
return new HBitNot(input, instruction.selector,
- computeTypeFromInputTypes(instruction, compiler));
+ computeTypeFromInputTypes(instruction, compiler));
}
return null;
}
@@ -168,15 +165,15 @@
return constantSystem.negate;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
TypeMask operandType = instruction.inputs[1].instructionType;
if (instruction.inputs[1].isNumberOrNull(compiler)) return operandType;
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction input = instruction.inputs[1];
if (input.isNumber(compiler)) {
return new HNegate(input, instruction.selector, input.instructionType);
@@ -188,8 +185,8 @@
abstract class BinaryArithmeticSpecializer extends InvokeDynamicSpecializer {
const BinaryArithmeticSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
JavaScriptBackend backend = compiler.backend;
@@ -206,12 +203,12 @@
}
bool isBuiltin(HInvokeDynamic instruction, Compiler compiler) {
- return instruction.inputs[1].isNumber(compiler)
- && instruction.inputs[2].isNumber(compiler);
+ return instruction.inputs[1].isNumber(compiler) &&
+ instruction.inputs[2].isNumber(compiler);
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
if (isBuiltin(instruction, compiler)) {
HInstruction builtin = newBuiltinVariant(instruction, compiler);
if (builtin != null) return builtin;
@@ -232,8 +229,8 @@
bool inputsArePositiveIntegers(HInstruction instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
- return left.isPositiveIntegerOrNull(compiler)
- && right.isPositiveIntegerOrNull(compiler);
+ return left.isPositiveIntegerOrNull(compiler) &&
+ right.isPositiveIntegerOrNull(compiler);
}
bool inputsAreUInt31(HInstruction instruction, Compiler compiler) {
@@ -244,9 +241,8 @@
HInstruction newBuiltinVariant(HInvokeDynamic instruction, Compiler compiler);
- Selector renameToOptimizedSelector(String name,
- Selector selector,
- Compiler compiler) {
+ Selector renameToOptimizedSelector(
+ String name, Selector selector, Compiler compiler) {
if (selector.name == name) return selector;
JavaScriptBackend backend = compiler.backend;
return new Selector.call(
@@ -258,8 +254,8 @@
class AddSpecializer extends BinaryArithmeticSpecializer {
const AddSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
if (inputsAreUInt31(instruction, compiler)) {
JavaScriptBackend backend = compiler.backend;
return backend.uint32Type;
@@ -275,10 +271,9 @@
return constantSystem.add;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HAdd(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HAdd(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -290,8 +285,8 @@
return constantSystem.divide;
}
- TypeMask computeTypeFromInputTypes(HInstruction instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInstruction instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
JavaScriptBackend backend = compiler.backend;
if (left.isNumberOrNull(compiler)) {
@@ -300,11 +295,10 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
- return new HDivide(
- instruction.inputs[1], instruction.inputs[2],
+ return new HDivide(instruction.inputs[1], instruction.inputs[2],
instruction.selector, backend.doubleType);
}
}
@@ -312,8 +306,8 @@
class ModuloSpecializer extends BinaryArithmeticSpecializer {
const ModuloSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
if (inputsArePositiveIntegers(instruction, compiler)) {
JavaScriptBackend backend = compiler.backend;
return backend.positiveIntType;
@@ -325,8 +319,8 @@
return constantSystem.modulo;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
// Modulo cannot be mapped to the native operator (different semantics).
// TODO(sra): For non-negative values we can use JavaScript's %.
return null;
@@ -340,8 +334,8 @@
return constantSystem.multiply;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
if (inputsArePositiveIntegers(instruction, compiler)) {
JavaScriptBackend backend = compiler.backend;
return backend.positiveIntType;
@@ -349,10 +343,9 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HMultiply(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HMultiply(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -364,10 +357,9 @@
return constantSystem.subtract;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HSubtract(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HSubtract(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -379,8 +371,8 @@
return constantSystem.truncatingDivide;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
if (hasUint31Result(instruction, compiler)) {
return backend.uint31Type;
@@ -421,8 +413,8 @@
return false;
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction right = instruction.inputs[2];
if (isBuiltin(instruction, compiler)) {
if (right.isPositiveInteger(compiler) && isNotZero(right, compiler)) {
@@ -439,10 +431,9 @@
return null;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HTruncatingDivide(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HTruncatingDivide(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -450,8 +441,8 @@
abstract class BinaryBitOpSpecializer extends BinaryArithmeticSpecializer {
const BinaryBitOpSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
// All bitwise operations on primitive types either produce an
// integer or throw an error.
HInstruction left = instruction.inputs[1];
@@ -484,8 +475,8 @@
return constantSystem.shiftLeft;
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
if (left.isNumber(compiler)) {
@@ -504,10 +495,9 @@
return null;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HShiftLeft(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HShiftLeft(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -515,15 +505,15 @@
class ShiftRightSpecializer extends BinaryBitOpSpecializer {
const ShiftRightSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
if (left.isUInt32(compiler)) return left.instructionType;
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
if (left.isNumber(compiler)) {
@@ -548,10 +538,9 @@
return null;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HShiftRight(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HShiftRight(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
@@ -567,8 +556,8 @@
return constantSystem.bitOr;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
JavaScriptBackend backend = compiler.backend;
@@ -578,10 +567,9 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HBitOr(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HBitOr(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -593,8 +581,8 @@
return constantSystem.bitAnd;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
JavaScriptBackend backend = compiler.backend;
@@ -605,10 +593,9 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HBitAnd(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HBitAnd(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -620,8 +607,8 @@
return constantSystem.bitXor;
}
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
JavaScriptBackend backend = compiler.backend;
@@ -631,10 +618,9 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
- return new HBitXor(
- instruction.inputs[1], instruction.inputs[2],
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
+ return new HBitXor(instruction.inputs[1], instruction.inputs[2],
instruction.selector, computeTypeFromInputTypes(instruction, compiler));
}
}
@@ -642,8 +628,8 @@
abstract class RelationalSpecializer extends InvokeDynamicSpecializer {
const RelationalSpecializer();
- TypeMask computeTypeFromInputTypes(HInvokeDynamic instruction,
- Compiler compiler) {
+ TypeMask computeTypeFromInputTypes(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
if (instruction.inputs[1].isPrimitiveOrNull(compiler)) {
return backend.boolType;
@@ -651,8 +637,8 @@
return super.computeTypeFromInputTypes(instruction, compiler);
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
if (left.isNumber(compiler) && right.isNumber(compiler)) {
@@ -667,8 +653,8 @@
class EqualsSpecializer extends RelationalSpecializer {
const EqualsSpecializer();
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
HInstruction left = instruction.inputs[1];
HInstruction right = instruction.inputs[2];
TypeMask instructionType = left.instructionType;
@@ -677,8 +663,8 @@
}
World world = compiler.world;
JavaScriptBackend backend = compiler.backend;
- Iterable<Element> matches = world.allFunctions.filter(
- instruction.selector, instructionType);
+ Iterable<Element> matches =
+ world.allFunctions.filter(instruction.selector, instructionType);
// This test relies the on `Object.==` and `Interceptor.==` always being
// implemented because if the selector matches by subtype, it still will be
// a regular object or an interceptor.
@@ -692,11 +678,10 @@
return constantSystem.equal;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
- return new HIdentity(
- instruction.inputs[1], instruction.inputs[2],
+ return new HIdentity(instruction.inputs[1], instruction.inputs[2],
instruction.selector, backend.boolType);
}
}
@@ -708,11 +693,10 @@
return constantSystem.less;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
- return new HLess(
- instruction.inputs[1], instruction.inputs[2],
+ return new HLess(instruction.inputs[1], instruction.inputs[2],
instruction.selector, backend.boolType);
}
}
@@ -724,11 +708,10 @@
return constantSystem.greater;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
- return new HGreater(
- instruction.inputs[1], instruction.inputs[2],
+ return new HGreater(instruction.inputs[1], instruction.inputs[2],
instruction.selector, backend.boolType);
}
}
@@ -740,11 +723,10 @@
return constantSystem.greaterEqual;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
- return new HGreaterEqual(
- instruction.inputs[1], instruction.inputs[2],
+ return new HGreaterEqual(instruction.inputs[1], instruction.inputs[2],
instruction.selector, backend.boolType);
}
}
@@ -756,11 +738,10 @@
return constantSystem.lessEqual;
}
- HInstruction newBuiltinVariant(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction newBuiltinVariant(
+ HInvokeDynamic instruction, Compiler compiler) {
JavaScriptBackend backend = compiler.backend;
- return new HLessEqual(
- instruction.inputs[1], instruction.inputs[2],
+ return new HLessEqual(instruction.inputs[1], instruction.inputs[2],
instruction.selector, backend.boolType);
}
}
@@ -772,8 +753,8 @@
return constantSystem.codeUnitAt;
}
- HInstruction tryConvertToBuiltin(HInvokeDynamic instruction,
- Compiler compiler) {
+ HInstruction tryConvertToBuiltin(
+ HInvokeDynamic instruction, Compiler compiler) {
// TODO(sra): Implement a builtin HCodeUnitAt instruction and the same index
// bounds checking optimizations as for HIndex.
return null;
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 76a9644..a779457 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -2,7 +2,6 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-
import '../closure.dart';
import '../common.dart';
import '../compiler.dart' show Compiler;
@@ -152,10 +151,11 @@
}
class HGraph {
- Element element; // Used for debug printing.
+ Element element; // Used for debug printing.
HBasicBlock entry;
HBasicBlock exit;
HThis thisInstruction;
+
/// Receiver parameter, set for methods using interceptor calling convention.
HParameterValue explicitReceiverParameter;
bool isRecursiveMethod = false;
@@ -187,22 +187,21 @@
return result;
}
- HBasicBlock addNewLoopHeaderBlock(JumpTarget target,
- List<LabelDefinition> labels) {
+ HBasicBlock addNewLoopHeaderBlock(
+ JumpTarget target, List<LabelDefinition> labels) {
HBasicBlock result = addNewBlock();
- result.loopInformation =
- new HLoopInformation(result, target, labels);
+ result.loopInformation = new HLoopInformation(result, target, labels);
return result;
}
HConstant addConstant(ConstantValue constant, Compiler compiler,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
HConstant result = constants[constant];
// TODO(johnniwinther): Support source information per constant reference.
if (result == null) {
TypeMask type = computeTypeMask(compiler, constant);
result = new HConstant.internal(constant, type)
- ..sourceInformation = sourceInformation;
+ ..sourceInformation = sourceInformation;
entry.addAtExit(result);
constants[constant] = result;
} else if (result.block == null) {
@@ -213,8 +212,7 @@
}
HConstant addDeferredConstant(ConstantValue constant, PrefixElement prefix,
- SourceInformation sourceInformation,
- Compiler compiler) {
+ SourceInformation sourceInformation, Compiler compiler) {
// TODO(sigurdm,johnniwinter): These deferred constants should be created
// by the constant evaluator.
ConstantValue wrapper = new DeferredConstantValue(constant, prefix);
@@ -231,18 +229,15 @@
compiler.backend.constantSystem.createDouble(d), compiler);
}
- HConstant addConstantString(ast.DartString str,
- Compiler compiler) {
+ HConstant addConstantString(ast.DartString str, Compiler compiler) {
return addConstant(
- compiler.backend.constantSystem.createString(str),
- compiler);
+ compiler.backend.constantSystem.createString(str), compiler);
}
- HConstant addConstantStringFromName(js.Name name,
- Compiler compiler) {
+ HConstant addConstantStringFromName(js.Name name, Compiler compiler) {
return addConstant(
- new SyntheticConstantValue(SyntheticConstantKind.NAME,
- js.quoteName(name)),
+ new SyntheticConstantValue(
+ SyntheticConstantKind.NAME, js.quoteName(name)),
compiler);
}
@@ -341,16 +336,15 @@
visitIndex(HIndex node) => visitInstruction(node);
visitIndexAssign(HIndexAssign node) => visitInstruction(node);
visitInterceptor(HInterceptor node) => visitInstruction(node);
- visitInvokeClosure(HInvokeClosure node)
- => visitInvokeDynamic(node);
- visitInvokeConstructorBody(HInvokeConstructorBody node)
- => visitInvokeStatic(node);
- visitInvokeDynamicMethod(HInvokeDynamicMethod node)
- => visitInvokeDynamic(node);
- visitInvokeDynamicGetter(HInvokeDynamicGetter node)
- => visitInvokeDynamicField(node);
- visitInvokeDynamicSetter(HInvokeDynamicSetter node)
- => visitInvokeDynamicField(node);
+ visitInvokeClosure(HInvokeClosure node) => visitInvokeDynamic(node);
+ visitInvokeConstructorBody(HInvokeConstructorBody node) =>
+ visitInvokeStatic(node);
+ visitInvokeDynamicMethod(HInvokeDynamicMethod node) =>
+ visitInvokeDynamic(node);
+ visitInvokeDynamicGetter(HInvokeDynamicGetter node) =>
+ visitInvokeDynamicField(node);
+ visitInvokeDynamicSetter(HInvokeDynamicSetter node) =>
+ visitInvokeDynamicField(node);
visitInvokeStatic(HInvokeStatic node) => visitInvoke(node);
visitInvokeSuper(HInvokeSuper node) => visitInvokeStatic(node);
visitJump(HJump node) => visitControlFlow(node);
@@ -365,8 +359,7 @@
visitLoopBranch(HLoopBranch node) => visitConditionalBranch(node);
visitNegate(HNegate node) => visitInvokeUnary(node);
visitNot(HNot node) => visitInstruction(node);
- visitOneShotInterceptor(HOneShotInterceptor node)
- => visitInvokeDynamic(node);
+ visitOneShotInterceptor(HOneShotInterceptor node) => visitInvokeDynamic(node);
visitPhi(HPhi node) => visitInstruction(node);
visitMultiply(HMultiply node) => visitBinaryArithmetic(node);
visitParameterValue(HParameterValue node) => visitLocalValue(node);
@@ -416,8 +409,7 @@
}
class SubExpression extends SubGraph {
- const SubExpression(HBasicBlock start, HBasicBlock end)
- : super(start, end);
+ const SubExpression(HBasicBlock start, HBasicBlock end) : super(start, end);
/** Find the condition expression if this sub-expression is a condition. */
HInstruction get conditionExpression {
@@ -545,8 +537,7 @@
}
bool isLabeledBlock() =>
- blockFlow != null &&
- blockFlow.body is HLabeledBlockInformation;
+ blockFlow != null && blockFlow.body is HLabeledBlockInformation;
HBasicBlock get enclosingLoopHeader {
if (isLoopHeader()) return this;
@@ -565,7 +556,7 @@
}
void addAtEntry(HInstruction instruction) {
- assert(instruction is !HPhi);
+ assert(instruction is! HPhi);
internalAddBefore(first, instruction);
instruction.notifyAddedToBlock(this);
}
@@ -573,13 +564,13 @@
void addAtExit(HInstruction instruction) {
assert(isClosed());
assert(last is HControlFlow);
- assert(instruction is !HPhi);
+ assert(instruction is! HPhi);
internalAddBefore(last, instruction);
instruction.notifyAddedToBlock(this);
}
void moveAtExit(HInstruction instruction) {
- assert(instruction is !HPhi);
+ assert(instruction is! HPhi);
assert(instruction.isInBasicBlock());
assert(isClosed());
assert(last is HControlFlow);
@@ -589,8 +580,8 @@
}
void add(HInstruction instruction) {
- assert(instruction is !HControlFlow);
- assert(instruction is !HPhi);
+ assert(instruction is! HControlFlow);
+ assert(instruction is! HPhi);
internalAddAfter(last, instruction);
instruction.notifyAddedToBlock(this);
}
@@ -609,16 +600,16 @@
}
void addAfter(HInstruction cursor, HInstruction instruction) {
- assert(cursor is !HPhi);
- assert(instruction is !HPhi);
+ assert(cursor is! HPhi);
+ assert(instruction is! HPhi);
assert(isOpen() || isClosed());
internalAddAfter(cursor, instruction);
instruction.notifyAddedToBlock(this);
}
void addBefore(HInstruction cursor, HInstruction instruction) {
- assert(cursor is !HPhi);
- assert(instruction is !HPhi);
+ assert(cursor is! HPhi);
+ assert(instruction is! HPhi);
assert(isOpen() || isClosed());
internalAddBefore(cursor, instruction);
instruction.notifyAddedToBlock(this);
@@ -626,7 +617,7 @@
void remove(HInstruction instruction) {
assert(isOpen() || isClosed());
- assert(instruction is !HPhi);
+ assert(instruction is! HPhi);
super.remove(instruction);
assert(instruction.block == this);
instruction.notifyRemovedFromBlock();
@@ -860,14 +851,17 @@
static const int IS_VIA_INTERCEPTOR_TYPECODE = 37;
HInstruction(this.inputs, this.instructionType)
- : id = idCounter++, usedBy = <HInstruction>[] {
+ : id = idCounter++,
+ usedBy = <HInstruction>[] {
assert(inputs.every((e) => e != null));
}
int get hashCode => id;
bool useGvn() => _useGvn;
- void setUseGvn() { _useGvn = true; }
+ void setUseGvn() {
+ _useGvn = true;
+ }
bool get isMovable => useGvn();
@@ -877,9 +871,9 @@
* graph.
*/
bool isPure() {
- return !sideEffects.hasSideEffects()
- && !sideEffects.dependsOnSomething()
- && !canThrow();
+ return !sideEffects.hasSideEffects() &&
+ !sideEffects.dependsOnSomething() &&
+ !canThrow();
}
/// An instruction is an 'allocation' is it is the sole alias for an object.
@@ -909,36 +903,28 @@
/// Returns `true` if [typeMask] contains [cls].
static bool containsType(
- TypeMask typeMask,
- ClassElement cls,
- ClassWorld classWorld) {
+ TypeMask typeMask, ClassElement cls, ClassWorld classWorld) {
return classWorld.isInstantiated(cls) && typeMask.contains(cls, classWorld);
}
/// Returns `true` if [typeMask] contains only [cls].
static bool containsOnlyType(
- TypeMask typeMask,
- ClassElement cls,
- ClassWorld classWorld) {
- return classWorld.isInstantiated(cls) &&
- typeMask.containsOnly(cls);
+ TypeMask typeMask, ClassElement cls, ClassWorld classWorld) {
+ return classWorld.isInstantiated(cls) && typeMask.containsOnly(cls);
}
/// Returns `true` if [typeMask] is an instance of [cls].
static bool isInstanceOf(
- TypeMask typeMask,
- ClassElement cls,
- ClassWorld classWorld) {
- return classWorld.isImplemented(cls) &&
- typeMask.satisfies(cls, classWorld);
+ TypeMask typeMask, ClassElement cls, ClassWorld classWorld) {
+ return classWorld.isImplemented(cls) && typeMask.satisfies(cls, classWorld);
}
bool canBePrimitive(Compiler compiler) {
- return canBePrimitiveNumber(compiler)
- || canBePrimitiveArray(compiler)
- || canBePrimitiveBoolean(compiler)
- || canBePrimitiveString(compiler)
- || isNull();
+ return canBePrimitiveNumber(compiler) ||
+ canBePrimitiveArray(compiler) ||
+ canBePrimitiveBoolean(compiler) ||
+ canBePrimitiveString(compiler) ||
+ isNull();
}
bool canBePrimitiveNumber(Compiler compiler) {
@@ -947,12 +933,12 @@
BackendHelpers helpers = backend.helpers;
// TODO(sra): It should be possible to test only jsDoubleClass and
// jsUInt31Class, since all others are superclasses of these two.
- return containsType(instructionType, helpers.jsNumberClass, classWorld)
- || containsType(instructionType, helpers.jsIntClass, classWorld)
- || containsType(instructionType, helpers.jsPositiveIntClass, classWorld)
- || containsType(instructionType, helpers.jsUInt32Class, classWorld)
- || containsType(instructionType, helpers.jsUInt31Class, classWorld)
- || containsType(instructionType, helpers.jsDoubleClass, classWorld);
+ return containsType(instructionType, helpers.jsNumberClass, classWorld) ||
+ containsType(instructionType, helpers.jsIntClass, classWorld) ||
+ containsType(instructionType, helpers.jsPositiveIntClass, classWorld) ||
+ containsType(instructionType, helpers.jsUInt32Class, classWorld) ||
+ containsType(instructionType, helpers.jsUInt31Class, classWorld) ||
+ containsType(instructionType, helpers.jsDoubleClass, classWorld);
}
bool canBePrimitiveBoolean(Compiler compiler) {
@@ -966,20 +952,20 @@
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
BackendHelpers helpers = backend.helpers;
- return containsType(instructionType, helpers.jsArrayClass, classWorld)
- || containsType(instructionType, helpers.jsFixedArrayClass, classWorld)
- || containsType(
- instructionType, helpers.jsExtendableArrayClass, classWorld)
- || containsType(instructionType,
- helpers.jsUnmodifiableArrayClass, classWorld);
+ return containsType(instructionType, helpers.jsArrayClass, classWorld) ||
+ containsType(instructionType, helpers.jsFixedArrayClass, classWorld) ||
+ containsType(
+ instructionType, helpers.jsExtendableArrayClass, classWorld) ||
+ containsType(
+ instructionType, helpers.jsUnmodifiableArrayClass, classWorld);
}
bool isIndexablePrimitive(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
BackendHelpers helpers = backend.helpers;
- return instructionType.containsOnlyString(classWorld)
- || isInstanceOf(instructionType, helpers.jsIndexableClass, classWorld);
+ return instructionType.containsOnlyString(classWorld) ||
+ isInstanceOf(instructionType, helpers.jsIndexableClass, classWorld);
}
bool isFixedArray(Compiler compiler) {
@@ -988,8 +974,8 @@
BackendHelpers helpers = backend.helpers;
// TODO(sra): Recognize the union of these types as well.
return containsOnlyType(
- instructionType, helpers.jsFixedArrayClass, classWorld)
- || containsOnlyType(
+ instructionType, helpers.jsFixedArrayClass, classWorld) ||
+ containsOnlyType(
instructionType, helpers.jsUnmodifiableArrayClass, classWorld);
}
@@ -1020,8 +1006,8 @@
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
BackendHelpers helpers = backend.helpers;
- return isInstanceOf(instructionType,
- helpers.jsMutableIndexableClass, classWorld);
+ return isInstanceOf(
+ instructionType, helpers.jsMutableIndexableClass, classWorld);
}
bool isArray(Compiler compiler) => isReadableArray(compiler);
@@ -1035,24 +1021,24 @@
bool isInteger(Compiler compiler) {
ClassWorld classWorld = compiler.world;
- return instructionType.containsOnlyInt(classWorld)
- && !instructionType.isNullable;
+ return instructionType.containsOnlyInt(classWorld) &&
+ !instructionType.isNullable;
}
bool isUInt32(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
BackendHelpers helpers = backend.helpers;
- return !instructionType.isNullable
- && isInstanceOf(instructionType, helpers.jsUInt32Class, classWorld);
+ return !instructionType.isNullable &&
+ isInstanceOf(instructionType, helpers.jsUInt32Class, classWorld);
}
bool isUInt31(Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
BackendHelpers helpers = backend.helpers;
- return !instructionType.isNullable
- && isInstanceOf(instructionType, helpers.jsUInt31Class, classWorld);
+ return !instructionType.isNullable &&
+ isInstanceOf(instructionType, helpers.jsUInt31Class, classWorld);
}
bool isPositiveInteger(Compiler compiler) {
@@ -1078,8 +1064,8 @@
bool isNumber(Compiler compiler) {
ClassWorld classWorld = compiler.world;
- return instructionType.containsOnlyNum(classWorld)
- && !instructionType.isNullable;
+ return instructionType.containsOnlyNum(classWorld) &&
+ !instructionType.isNullable;
}
bool isNumberOrNull(Compiler compiler) {
@@ -1089,8 +1075,8 @@
bool isDouble(Compiler compiler) {
ClassWorld classWorld = compiler.world;
- return instructionType.containsOnlyDouble(classWorld)
- && !instructionType.isNullable;
+ return instructionType.containsOnlyDouble(classWorld) &&
+ !instructionType.isNullable;
}
bool isDoubleOrNull(Compiler compiler) {
@@ -1100,8 +1086,8 @@
bool isBoolean(Compiler compiler) {
ClassWorld classWorld = compiler.world;
- return instructionType.containsOnlyBool(classWorld)
- && !instructionType.isNullable;
+ return instructionType.containsOnlyBool(classWorld) &&
+ !instructionType.isNullable;
}
bool isBooleanOrNull(Compiler compiler) {
@@ -1111,8 +1097,8 @@
bool isString(Compiler compiler) {
ClassWorld classWorld = compiler.world;
- return instructionType.containsOnlyString(classWorld)
- && !instructionType.isNullable;
+ return instructionType.containsOnlyString(classWorld) &&
+ !instructionType.isNullable;
}
bool isStringOrNull(Compiler compiler) {
@@ -1121,15 +1107,15 @@
}
bool isPrimitive(Compiler compiler) {
- return (isPrimitiveOrNull(compiler) && !instructionType.isNullable)
- || isNull();
+ return (isPrimitiveOrNull(compiler) && !instructionType.isNullable) ||
+ isNull();
}
bool isPrimitiveOrNull(Compiler compiler) {
- return isIndexablePrimitive(compiler)
- || isNumberOrNull(compiler)
- || isBooleanOrNull(compiler)
- || isNull();
+ return isIndexablePrimitive(compiler) ||
+ isNumberOrNull(compiler) ||
+ isBooleanOrNull(compiler) ||
+ isNull();
}
/**
@@ -1292,8 +1278,8 @@
return users;
}
- void replaceAllUsersDominatedBy(HInstruction cursor,
- HInstruction newInstruction) {
+ void replaceAllUsersDominatedBy(
+ HInstruction cursor, HInstruction newInstruction) {
Setlet<HInstruction> users = dominatedUsers(cursor);
for (HInstruction user in users) {
user.changeUse(this, newInstruction);
@@ -1301,9 +1287,9 @@
}
void moveBefore(HInstruction other) {
- assert(this is !HControlFlow);
- assert(this is !HPhi);
- assert(other is !HPhi);
+ assert(this is! HControlFlow);
+ assert(this is! HPhi);
+ assert(other is! HPhi);
block.detach(this);
other.block.internalAddBefore(other, this);
block = other.block;
@@ -1367,8 +1353,8 @@
} else if (kind == HTypeConversion.CHECKED_MODE_CHECK && !type.treatAsRaw) {
throw 'creating compound check to $type (this = ${this})';
} else {
- TypeMask subtype = new TypeMask.subtype(element.declaration,
- compiler.world);
+ TypeMask subtype =
+ new TypeMask.subtype(element.declaration, compiler.world);
return new HTypeConversion(type, kind, subtype, this);
}
}
@@ -1510,8 +1496,7 @@
// We know it's a selector call if it follows the interceptor
// calling convention, which adds the actual receiver as a
// parameter to the call.
- return (selector != null) &&
- (inputs.length - 2 == selector.argumentCount);
+ return (selector != null) && (inputs.length - 2 == selector.argumentCount);
}
}
@@ -1521,17 +1506,14 @@
TypeMask mask;
Element element;
- HInvokeDynamic(Selector selector,
- this.mask,
- this.element,
- List<HInstruction> inputs,
- TypeMask type,
- [bool isIntercepted = false])
- : super(inputs, type),
- this.selector = selector,
- specializer = isIntercepted
- ? InvokeDynamicSpecializer.lookupSpecializer(selector)
- : const InvokeDynamicSpecializer();
+ HInvokeDynamic(Selector selector, this.mask, this.element,
+ List<HInstruction> inputs, TypeMask type,
+ [bool isIntercepted = false])
+ : super(inputs, type),
+ this.selector = selector,
+ specializer = isIntercepted
+ ? InvokeDynamicSpecializer.lookupSpecializer(selector)
+ : const InvokeDynamicSpecializer();
toString() => 'invoke dynamic: selector=$selector, mask=$mask';
HInstruction get receiver => inputs[0];
HInstruction getDartReceiver(Compiler compiler) {
@@ -1551,15 +1533,13 @@
// Use the name and the kind instead of [Selector.operator==]
// because we don't need to check the arity (already checked in
// [gvnEquals]), and the receiver types may not be in sync.
- return selector.name == other.selector.name
- && selector.kind == other.selector.kind;
+ return selector.name == other.selector.name &&
+ selector.kind == other.selector.kind;
}
}
class HInvokeClosure extends HInvokeDynamic {
- HInvokeClosure(Selector selector,
- List<HInstruction> inputs,
- TypeMask type)
+ HInvokeClosure(Selector selector, List<HInstruction> inputs, TypeMask type)
: super(selector, null, null, inputs, type) {
assert(selector.isClosureCall);
}
@@ -1567,38 +1547,34 @@
}
class HInvokeDynamicMethod extends HInvokeDynamic {
- HInvokeDynamicMethod(Selector selector,
- TypeMask mask,
- List<HInstruction> inputs,
- TypeMask type,
- [bool isIntercepted = false])
- : super(selector, mask, null, inputs, type, isIntercepted);
+ HInvokeDynamicMethod(Selector selector, TypeMask mask,
+ List<HInstruction> inputs, TypeMask type,
+ [bool isIntercepted = false])
+ : super(selector, mask, null, inputs, type, isIntercepted);
String toString() => 'invoke dynamic method: selector=$selector, mask=$mask';
accept(HVisitor visitor) => visitor.visitInvokeDynamicMethod(this);
}
abstract class HInvokeDynamicField extends HInvokeDynamic {
- HInvokeDynamicField(
- Selector selector, TypeMask mask,
- Element element, List<HInstruction> inputs,
- TypeMask type)
+ HInvokeDynamicField(Selector selector, TypeMask mask, Element element,
+ List<HInstruction> inputs, TypeMask type)
: super(selector, mask, element, inputs, type);
toString() => 'invoke dynamic field: selector=$selector, mask=$mask';
}
class HInvokeDynamicGetter extends HInvokeDynamicField {
- HInvokeDynamicGetter(Selector selector, TypeMask mask,
- Element element, List<HInstruction> inputs, TypeMask type)
- : super(selector, mask, element, inputs, type);
+ HInvokeDynamicGetter(Selector selector, TypeMask mask, Element element,
+ List<HInstruction> inputs, TypeMask type)
+ : super(selector, mask, element, inputs, type);
toString() => 'invoke dynamic getter: selector=$selector, mask=$mask';
accept(HVisitor visitor) => visitor.visitInvokeDynamicGetter(this);
}
class HInvokeDynamicSetter extends HInvokeDynamicField {
- HInvokeDynamicSetter(Selector selector, TypeMask mask,
- Element element, List<HInstruction> inputs, TypeMask type)
- : super(selector, mask, element, inputs, type);
+ HInvokeDynamicSetter(Selector selector, TypeMask mask, Element element,
+ List<HInstruction> inputs, TypeMask type)
+ : super(selector, mask, element, inputs, type);
toString() => 'invoke dynamic setter: selector=$selector, mask=$mask';
accept(HVisitor visitor) => visitor.visitInvokeDynamicSetter(this);
}
@@ -1618,8 +1594,8 @@
/** The first input must be the target. */
HInvokeStatic(this.element, inputs, TypeMask type,
- {this.targetCanThrow: true})
- : super(inputs, type);
+ {this.targetCanThrow: true})
+ : super(inputs, type);
toString() => 'invoke static: $element';
accept(HVisitor visitor) => visitor.visitInvokeStatic(this);
@@ -1632,13 +1608,9 @@
final bool isSetter;
final Selector selector;
- HInvokeSuper(Element element,
- this.caller,
- this.selector,
- inputs,
- type,
- SourceInformation sourceInformation,
- {this.isSetter})
+ HInvokeSuper(Element element, this.caller, this.selector, inputs, type,
+ SourceInformation sourceInformation,
+ {this.isSetter})
: super(element, inputs, type) {
this.sourceInformation = sourceInformation;
}
@@ -1669,8 +1641,7 @@
// The 'inputs' are
// [receiver, arg1, ..., argN] or
// [interceptor, receiver, arg1, ... argN].
- HInvokeConstructorBody(element, inputs, type)
- : super(element, inputs, type);
+ HInvokeConstructorBody(element, inputs, type) : super(element, inputs, type);
String toString() => 'invoke constructor body: ${element.name}';
accept(HVisitor visitor) => visitor.visitInvokeConstructorBody(this);
@@ -1680,7 +1651,8 @@
final Element element;
HFieldAccess(Element element, List<HInstruction> inputs, TypeMask type)
- : this.element = element, super(inputs, type);
+ : this.element = element,
+ super(inputs, type);
HInstruction get receiver => inputs[0];
}
@@ -1688,13 +1660,10 @@
class HFieldGet extends HFieldAccess {
final bool isAssignable;
- HFieldGet(Element element,
- HInstruction receiver,
- TypeMask type,
- {bool isAssignable})
- : this.isAssignable = (isAssignable != null)
- ? isAssignable
- : element.isAssignable,
+ HFieldGet(Element element, HInstruction receiver, TypeMask type,
+ {bool isAssignable})
+ : this.isAssignable =
+ (isAssignable != null) ? isAssignable : element.isAssignable,
super(element, <HInstruction>[receiver], type) {
sideEffects.clearAllSideEffects();
sideEffects.clearAllDependencies();
@@ -1732,11 +1701,9 @@
}
class HFieldSet extends HFieldAccess {
- HFieldSet(Element element,
- HInstruction receiver,
- HInstruction value)
+ HFieldSet(Element element, HInstruction receiver, HInstruction value)
: super(element, <HInstruction>[receiver, value],
- const TypeMask.nonNullEmpty()) {
+ const TypeMask.nonNullEmpty()) {
sideEffects.clearAllSideEffects();
sideEffects.clearAllDependencies();
sideEffects.setChangesInstanceProperty();
@@ -1766,7 +1733,7 @@
final String jsOp;
final int opKind;
- HReadModifyWrite._(Element this.element, this.jsOp, this.opKind,
+ HReadModifyWrite._(Element this.element, this.jsOp, this.opKind,
List<HInstruction> inputs, TypeMask type)
: super(inputs, type) {
sideEffects.clearAllSideEffects();
@@ -1775,17 +1742,17 @@
sideEffects.setDependsOnInstancePropertyStore();
}
- HReadModifyWrite.assignOp(Element element, String jsOp,
- HInstruction receiver, HInstruction operand, TypeMask type)
- : this._(element, jsOp, ASSIGN_OP,
- <HInstruction>[receiver, operand], type);
+ HReadModifyWrite.assignOp(Element element, String jsOp, HInstruction receiver,
+ HInstruction operand, TypeMask type)
+ : this._(
+ element, jsOp, ASSIGN_OP, <HInstruction>[receiver, operand], type);
- HReadModifyWrite.preOp(Element element, String jsOp,
- HInstruction receiver, TypeMask type)
+ HReadModifyWrite.preOp(
+ Element element, String jsOp, HInstruction receiver, TypeMask type)
: this._(element, jsOp, PRE_OP, <HInstruction>[receiver], type);
- HReadModifyWrite.postOp(Element element, String jsOp,
- HInstruction receiver, TypeMask type)
+ HReadModifyWrite.postOp(
+ Element element, String jsOp, HInstruction receiver, TypeMask type)
: this._(element, jsOp, POST_OP, <HInstruction>[receiver], type);
HInstruction get receiver => inputs[0];
@@ -1819,7 +1786,7 @@
// No need to use GVN for a [HLocalGet], it is just a local
// access.
HLocalGet(Local variable, HLocalValue local, TypeMask type,
- SourceInformation sourceInformation)
+ SourceInformation sourceInformation)
: super(variable, <HInstruction>[local], type) {
this.sourceInformation = sourceInformation;
}
@@ -1832,7 +1799,7 @@
class HLocalSet extends HLocalAccess {
HLocalSet(Local variable, HLocalValue local, HInstruction value)
: super(variable, <HInstruction>[local, value],
- const TypeMask.nonNullEmpty());
+ const TypeMask.nonNullEmpty());
accept(HVisitor visitor) => visitor.visitLocalSet(this);
@@ -1848,8 +1815,7 @@
native.NativeBehavior get nativeBehavior => null;
bool canThrow() {
- return sideEffects.hasSideEffects()
- || sideEffects.dependsOnSomething();
+ return sideEffects.hasSideEffects() || sideEffects.dependsOnSomething();
}
}
@@ -1859,13 +1825,11 @@
final native.NativeBehavior nativeBehavior;
native.NativeThrowBehavior throwBehavior;
- HForeignCode(this.codeTemplate,
- TypeMask type,
- List<HInstruction> inputs,
+ HForeignCode(this.codeTemplate, TypeMask type, List<HInstruction> inputs,
{this.isStatement: false,
- SideEffects effects,
- native.NativeBehavior nativeBehavior,
- native.NativeThrowBehavior throwBehavior})
+ SideEffects effects,
+ native.NativeBehavior nativeBehavior,
+ native.NativeThrowBehavior throwBehavior})
: this.nativeBehavior = nativeBehavior,
this.throwBehavior = throwBehavior,
super(type, inputs) {
@@ -1884,24 +1848,22 @@
}
HForeignCode.statement(js.Template codeTemplate, List<HInstruction> inputs,
- SideEffects effects,
- native.NativeBehavior nativeBehavior,
- TypeMask type)
- : this(codeTemplate, type, inputs, isStatement: true,
- effects: effects, nativeBehavior: nativeBehavior);
+ SideEffects effects, native.NativeBehavior nativeBehavior, TypeMask type)
+ : this(codeTemplate, type, inputs,
+ isStatement: true,
+ effects: effects,
+ nativeBehavior: nativeBehavior);
accept(HVisitor visitor) => visitor.visitForeignCode(this);
bool isJsStatement() => isStatement;
- bool canThrow() => canBeNull()
- ? throwBehavior.canThrow
- : throwBehavior.onNonNull.canThrow;
+ bool canThrow() =>
+ canBeNull() ? throwBehavior.canThrow : throwBehavior.onNonNull.canThrow;
bool onlyThrowsNSM() => throwBehavior.isOnlyNullNSMGuard;
- bool get isAllocation => nativeBehavior != null &&
- nativeBehavior.isAllocation &&
- !canBeNull();
+ bool get isAllocation =>
+ nativeBehavior != null && nativeBehavior.isAllocation && !canBeNull();
String toString() => 'HForeignCode("${codeTemplate.source}",$inputs)';
}
@@ -1916,7 +1878,7 @@
List<DartType> instantiatedTypes;
HForeignNew(this.element, TypeMask type, List<HInstruction> inputs,
- [this.instantiatedTypes])
+ [this.instantiatedTypes])
: super(type, inputs);
accept(HVisitor visitor) => visitor.visitForeignNew(this);
@@ -1954,8 +1916,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitAdd(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.add;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.add;
int typeCode() => HInstruction.ADD_TYPECODE;
bool typeEquals(other) => other is HAdd;
bool dataEquals(HInstruction other) => true;
@@ -1967,8 +1929,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitDivide(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.divide;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.divide;
int typeCode() => HInstruction.DIVIDE_TYPECODE;
bool typeEquals(other) => other is HDivide;
bool dataEquals(HInstruction other) => true;
@@ -1980,8 +1942,7 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitMultiply(this);
- BinaryOperation operation(ConstantSystem operations)
- => operations.multiply;
+ BinaryOperation operation(ConstantSystem operations) => operations.multiply;
int typeCode() => HInstruction.MULTIPLY_TYPECODE;
bool typeEquals(other) => other is HMultiply;
bool dataEquals(HInstruction other) => true;
@@ -1993,8 +1954,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitSubtract(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.subtract;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.subtract;
int typeCode() => HInstruction.SUBTRACT_TYPECODE;
bool typeEquals(other) => other is HSubtract;
bool dataEquals(HInstruction other) => true;
@@ -2006,8 +1967,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitTruncatingDivide(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.truncatingDivide;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.truncatingDivide;
int typeCode() => HInstruction.TRUNCATING_DIVIDE_TYPECODE;
bool typeEquals(other) => other is HTruncatingDivide;
bool dataEquals(HInstruction other) => true;
@@ -2048,8 +2009,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitShiftLeft(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.shiftLeft;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.shiftLeft;
int typeCode() => HInstruction.SHIFT_LEFT_TYPECODE;
bool typeEquals(other) => other is HShiftLeft;
bool dataEquals(HInstruction other) => true;
@@ -2061,8 +2022,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitShiftRight(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.shiftRight;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.shiftRight;
int typeCode() => HInstruction.SHIFT_RIGHT_TYPECODE;
bool typeEquals(other) => other is HShiftRight;
bool dataEquals(HInstruction other) => true;
@@ -2074,8 +2035,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitBitOr(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.bitOr;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.bitOr;
int typeCode() => HInstruction.BIT_OR_TYPECODE;
bool typeEquals(other) => other is HBitOr;
bool dataEquals(HInstruction other) => true;
@@ -2087,8 +2048,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitBitAnd(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.bitAnd;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.bitAnd;
int typeCode() => HInstruction.BIT_AND_TYPECODE;
bool typeEquals(other) => other is HBitAnd;
bool dataEquals(HInstruction other) => true;
@@ -2100,8 +2061,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitBitXor(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.bitXor;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.bitXor;
int typeCode() => HInstruction.BIT_XOR_TYPECODE;
bool typeEquals(other) => other is HBitXor;
bool dataEquals(HInstruction other) => true;
@@ -2126,8 +2087,8 @@
: super(input, selector, type);
accept(HVisitor visitor) => visitor.visitNegate(this);
- UnaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.negate;
+ UnaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.negate;
int typeCode() => HInstruction.NEGATE_TYPECODE;
bool typeEquals(other) => other is HNegate;
bool dataEquals(HInstruction other) => true;
@@ -2138,8 +2099,8 @@
: super(input, selector, type);
accept(HVisitor visitor) => visitor.visitBitNot(this);
- UnaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.bitNot;
+ UnaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.bitNot;
int typeCode() => HInstruction.BIT_NOT_TYPECODE;
bool typeEquals(other) => other is HBitNot;
bool dataEquals(HInstruction other) => true;
@@ -2160,9 +2121,13 @@
abstract class HJump extends HControlFlow {
final JumpTarget target;
final LabelDefinition label;
- HJump(this.target) : label = null, super(const <HInstruction>[]);
+ HJump(this.target)
+ : label = null,
+ super(const <HInstruction>[]);
HJump.toLabel(LabelDefinition label)
- : label = label, target = label.target, super(const <HInstruction>[]);
+ : label = label,
+ target = label.target,
+ super(const <HInstruction>[]);
}
class HBreak extends HJump {
@@ -2175,7 +2140,8 @@
HBreak(JumpTarget target, {bool this.breakSwitchContinueLoop: false})
: super(target);
HBreak.toLabel(LabelDefinition label)
- : breakSwitchContinueLoop = false, super.toLabel(label);
+ : breakSwitchContinueLoop = false,
+ super.toLabel(label);
toString() => (label != null) ? 'break ${label.labelName}' : 'break';
accept(HVisitor visitor) => visitor.visitBreak(this);
}
@@ -2289,8 +2255,7 @@
* value from the start, whereas [HLocalValue]s need to be initialized first.
*/
class HLocalValue extends HInstruction {
- HLocalValue(Entity variable, TypeMask type)
- : super(<HInstruction>[], type) {
+ HLocalValue(Entity variable, TypeMask type) : super(<HInstruction>[], type) {
sourceElement = variable;
}
@@ -2340,9 +2305,7 @@
: this(variable, <HInstruction>[], type);
HPhi.singleInput(Local variable, HInstruction input, TypeMask type)
: this(variable, <HInstruction>[input], type);
- HPhi.manyInputs(Local variable,
- List<HInstruction> inputs,
- TypeMask type)
+ HPhi.manyInputs(Local variable, List<HInstruction> inputs, TypeMask type)
: this(variable, inputs, type);
void addInput(HInstruction input) {
@@ -2363,13 +2326,13 @@
class HIdentity extends HRelational {
// Cached codegen decision.
- String singleComparisonOp; // null, '===', '=='
+ String singleComparisonOp; // null, '===', '=='
HIdentity(left, right, selector, type) : super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitIdentity(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.identity;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.identity;
int typeCode() => HInstruction.IDENTITY_TYPECODE;
bool typeEquals(other) => other is HIdentity;
bool dataEquals(HInstruction other) => true;
@@ -2379,8 +2342,8 @@
HGreater(left, right, selector, type) : super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitGreater(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.greater;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.greater;
int typeCode() => HInstruction.GREATER_TYPECODE;
bool typeEquals(other) => other is HGreater;
bool dataEquals(HInstruction other) => true;
@@ -2391,8 +2354,8 @@
: super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitGreaterEqual(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.greaterEqual;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.greaterEqual;
int typeCode() => HInstruction.GREATER_EQUAL_TYPECODE;
bool typeEquals(other) => other is HGreaterEqual;
bool dataEquals(HInstruction other) => true;
@@ -2402,8 +2365,8 @@
HLess(left, right, selector, type) : super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitLess(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.less;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.less;
int typeCode() => HInstruction.LESS_TYPECODE;
bool typeEquals(other) => other is HLess;
bool dataEquals(HInstruction other) => true;
@@ -2413,8 +2376,8 @@
HLessEqual(left, right, selector, type) : super(left, right, selector, type);
accept(HVisitor visitor) => visitor.visitLessEqual(this);
- BinaryOperation operation(ConstantSystem constantSystem)
- => constantSystem.lessEqual;
+ BinaryOperation operation(ConstantSystem constantSystem) =>
+ constantSystem.lessEqual;
int typeCode() => HInstruction.LESS_EQUAL_TYPECODE;
bool typeEquals(other) => other is HLessEqual;
bool dataEquals(HInstruction other) => true;
@@ -2461,9 +2424,8 @@
class HThrow extends HControlFlow {
final bool isRethrow;
- HThrow(HInstruction value,
- SourceInformation sourceInformation,
- {this.isRethrow: false})
+ HThrow(HInstruction value, SourceInformation sourceInformation,
+ {this.isRethrow: false})
: super(<HInstruction>[value]) {
this.sourceInformation = sourceInformation;
}
@@ -2507,8 +2469,7 @@
// (a && C.JSArray_methods).get$first(a)
//
- HInterceptor(HInstruction receiver,
- TypeMask type)
+ HInterceptor(HInstruction receiver, TypeMask type)
: super(<HInstruction>[receiver], type) {
this.sourceInformation = receiver.sourceInformation;
sideEffects.clearAllSideEffects();
@@ -2532,9 +2493,9 @@
int typeCode() => HInstruction.INTERCEPTOR_TYPECODE;
bool typeEquals(other) => other is HInterceptor;
bool dataEquals(HInterceptor other) {
- return interceptedClasses == other.interceptedClasses
- || (interceptedClasses.length == other.interceptedClasses.length
- && interceptedClasses.containsAll(other.interceptedClasses));
+ return interceptedClasses == other.interceptedClasses ||
+ (interceptedClasses.length == other.interceptedClasses.length &&
+ interceptedClasses.containsAll(other.interceptedClasses));
}
}
@@ -2549,11 +2510,8 @@
*/
class HOneShotInterceptor extends HInvokeDynamic {
Set<ClassElement> interceptedClasses;
- HOneShotInterceptor(Selector selector,
- TypeMask mask,
- List<HInstruction> inputs,
- TypeMask type,
- this.interceptedClasses)
+ HOneShotInterceptor(Selector selector, TypeMask mask,
+ List<HInstruction> inputs, TypeMask type, this.interceptedClasses)
: super(selector, mask, null, inputs, type, true) {
assert(inputs[0] is HConstant);
assert(inputs[0].isNull());
@@ -2614,10 +2572,8 @@
*/
class HIndex extends HInstruction {
final Selector selector;
- HIndex(HInstruction receiver,
- HInstruction index,
- this.selector,
- TypeMask type)
+ HIndex(
+ HInstruction receiver, HInstruction index, this.selector, TypeMask type)
: super(<HInstruction>[receiver, index], type) {
sideEffects.clearAllSideEffects();
sideEffects.clearAllDependencies();
@@ -2646,12 +2602,10 @@
*/
class HIndexAssign extends HInstruction {
final Selector selector;
- HIndexAssign(HInstruction receiver,
- HInstruction index,
- HInstruction value,
- this.selector)
+ HIndexAssign(HInstruction receiver, HInstruction index, HInstruction value,
+ this.selector)
: super(<HInstruction>[receiver, index, value],
- const TypeMask.nonNullEmpty()) {
+ const TypeMask.nonNullEmpty()) {
sideEffects.clearAllSideEffects();
sideEffects.clearAllDependencies();
sideEffects.setChangesIndex();
@@ -2671,8 +2625,10 @@
class HIs extends HInstruction {
/// A check against a raw type: 'o is int', 'o is A'.
static const int RAW_CHECK = 0;
+
/// A check against a type with type arguments: 'o is List<int>', 'o is C<T>'.
static const int COMPOUND_CHECK = 1;
+
/// A check against a single type variable: 'o is T'.
static const int VARIABLE_CHECK = 2;
@@ -2680,39 +2636,31 @@
final int kind;
final bool useInstanceOf;
- HIs.direct(DartType typeExpression,
- HInstruction expression,
- TypeMask type)
+ HIs.direct(DartType typeExpression, HInstruction expression, TypeMask type)
: this.internal(typeExpression, [expression], RAW_CHECK, type);
// Pre-verified that the check can be done using 'instanceof'.
- HIs.instanceOf(DartType typeExpression,
- HInstruction expression,
- TypeMask type)
+ HIs.instanceOf(
+ DartType typeExpression, HInstruction expression, TypeMask type)
: this.internal(typeExpression, [expression], RAW_CHECK, type,
- useInstanceOf: true);
+ useInstanceOf: true);
- HIs.raw(DartType typeExpression,
- HInstruction expression,
- HInterceptor interceptor,
- TypeMask type)
+ HIs.raw(DartType typeExpression, HInstruction expression,
+ HInterceptor interceptor, TypeMask type)
: this.internal(
typeExpression, [expression, interceptor], RAW_CHECK, type);
- HIs.compound(DartType typeExpression,
- HInstruction expression,
- HInstruction call,
- TypeMask type)
+ HIs.compound(DartType typeExpression, HInstruction expression,
+ HInstruction call, TypeMask type)
: this.internal(typeExpression, [expression, call], COMPOUND_CHECK, type);
- HIs.variable(DartType typeExpression,
- HInstruction expression,
- HInstruction call,
- TypeMask type)
+ HIs.variable(DartType typeExpression, HInstruction expression,
+ HInstruction call, TypeMask type)
: this.internal(typeExpression, [expression, call], VARIABLE_CHECK, type);
- HIs.internal(this.typeExpression, List<HInstruction> inputs, this.kind,
- TypeMask type, {bool this.useInstanceOf: false})
+ HIs.internal(
+ this.typeExpression, List<HInstruction> inputs, this.kind, TypeMask type,
+ {bool this.useInstanceOf: false})
: super(inputs, type) {
assert(kind >= RAW_CHECK && kind <= VARIABLE_CHECK);
setUseGvn();
@@ -2743,8 +2691,7 @@
bool typeEquals(HInstruction other) => other is HIs;
bool dataEquals(HIs other) {
- return typeExpression == other.typeExpression
- && kind == other.kind;
+ return typeExpression == other.typeExpression && kind == other.kind;
}
}
@@ -2755,9 +2702,9 @@
*/
class HIsViaInterceptor extends HLateInstruction {
final DartType typeExpression;
- HIsViaInterceptor(this.typeExpression, HInstruction interceptor,
- TypeMask type)
- : super(<HInstruction>[interceptor], type) {
+ HIsViaInterceptor(
+ this.typeExpression, HInstruction interceptor, TypeMask type)
+ : super(<HInstruction>[interceptor], type) {
setUseGvn();
}
@@ -2777,7 +2724,7 @@
final int kind;
final Selector receiverTypeCheckSelector;
final bool contextIsTypeArguments;
- TypeMask checkedType; // Not final because we refine it.
+ TypeMask checkedType; // Not final because we refine it.
static const int CHECKED_MODE_CHECK = 0;
static const int ARGUMENT_TYPE_CHECK = 1;
@@ -2785,33 +2732,30 @@
static const int BOOLEAN_CONVERSION_CHECK = 3;
static const int RECEIVER_TYPE_CHECK = 4;
- HTypeConversion(this.typeExpression, this.kind,
- TypeMask type, HInstruction input,
- [this.receiverTypeCheckSelector])
+ HTypeConversion(
+ this.typeExpression, this.kind, TypeMask type, HInstruction input,
+ [this.receiverTypeCheckSelector])
: contextIsTypeArguments = false,
checkedType = type,
super(<HInstruction>[input], type) {
assert(!isReceiverTypeCheck || receiverTypeCheckSelector != null);
- assert(typeExpression == null ||
- typeExpression.kind != TypeKind.TYPEDEF);
+ assert(typeExpression == null || typeExpression.kind != TypeKind.TYPEDEF);
sourceElement = input.sourceElement;
}
HTypeConversion.withTypeRepresentation(this.typeExpression, this.kind,
- TypeMask type, HInstruction input,
- HInstruction typeRepresentation)
+ TypeMask type, HInstruction input, HInstruction typeRepresentation)
: contextIsTypeArguments = false,
checkedType = type,
- super(<HInstruction>[input, typeRepresentation],type),
+ super(<HInstruction>[input, typeRepresentation], type),
receiverTypeCheckSelector = null {
assert(typeExpression.kind != TypeKind.TYPEDEF);
sourceElement = input.sourceElement;
}
- HTypeConversion.withContext(this.typeExpression, this.kind,
- TypeMask type, HInstruction input,
- HInstruction context,
- {bool this.contextIsTypeArguments})
+ HTypeConversion.withContext(this.typeExpression, this.kind, TypeMask type,
+ HInstruction input, HInstruction context,
+ {bool this.contextIsTypeArguments})
: super(<HInstruction>[input, context], type),
checkedType = type,
receiverTypeCheckSelector = null {
@@ -2822,19 +2766,20 @@
bool get hasTypeRepresentation {
return typeExpression.isInterfaceType && inputs.length > 1;
}
+
HInstruction get typeRepresentation => inputs[1];
bool get hasContext {
return typeExpression.isFunctionType && inputs.length > 1;
}
+
HInstruction get context => inputs[1];
HInstruction convertType(Compiler compiler, DartType type, int kind) {
if (typeExpression == type) {
// Don't omit a boolean conversion (which doesn't allow `null`) unless
// this type conversion is already a boolean conversion.
- if (kind != BOOLEAN_CONVERSION_CHECK ||
- isBooleanConversionCheck) {
+ if (kind != BOOLEAN_CONVERSION_CHECK || isBooleanConversionCheck) {
return this;
}
}
@@ -2842,9 +2787,9 @@
}
bool get isCheckedModeCheck {
- return kind == CHECKED_MODE_CHECK
- || kind == BOOLEAN_CONVERSION_CHECK;
+ return kind == CHECKED_MODE_CHECK || kind == BOOLEAN_CONVERSION_CHECK;
}
+
bool get isArgumentTypeCheck => kind == ARGUMENT_TYPE_CHECK;
bool get isReceiverTypeCheck => kind == RECEIVER_TYPE_CHECK;
bool get isCastTypeCheck => kind == CAST_TYPE_CHECK;
@@ -2860,10 +2805,10 @@
bool isCodeMotionInvariant() => false;
bool dataEquals(HTypeConversion other) {
- return kind == other.kind
- && typeExpression == other.typeExpression
- && checkedType == other.checkedType
- && receiverTypeCheckSelector == other.receiverTypeCheckSelector;
+ return kind == other.kind &&
+ typeExpression == other.typeExpression &&
+ checkedType == other.checkedType &&
+ receiverTypeCheckSelector == other.receiverTypeCheckSelector;
}
}
@@ -2877,8 +2822,8 @@
this._isMovable = false,
super(<HInstruction>[input], knownType);
- HTypeKnown.witnessed(TypeMask knownType, HInstruction input,
- HInstruction witness)
+ HTypeKnown.witnessed(
+ TypeMask knownType, HInstruction input, HInstruction witness)
: this.knownType = knownType,
this._isMovable = true,
super(<HInstruction>[input, witness], knownType);
@@ -2898,8 +2843,8 @@
bool get isMovable => _isMovable && useGvn();
bool dataEquals(HTypeKnown other) {
- return knownType == other.knownType
- && instructionType == other.instructionType;
+ return knownType == other.knownType &&
+ instructionType == other.instructionType;
}
}
@@ -2986,7 +2931,6 @@
}
}
-
/**
* Embedding of a [HBlockInformation] for block-structure based traversal
* in a dominator based flow traversal by attaching it to a basic block.
@@ -2999,7 +2943,6 @@
HBlockFlow(this.body, this.continuation);
}
-
/**
* Information about a syntactic-like structure.
*/
@@ -3009,7 +2952,6 @@
bool accept(HBlockInformationVisitor visitor);
}
-
/**
* Information about a statement-like structure.
*/
@@ -3017,7 +2959,6 @@
bool accept(HStatementInformationVisitor visitor);
}
-
/**
* Information about an expression-like structure.
*/
@@ -3026,7 +2967,6 @@
HInstruction get conditionExpression;
}
-
abstract class HStatementInformationVisitor {
bool visitLabeledBlockInfo(HLabeledBlockInformation info);
bool visitLoopInfo(HLoopBlockInformation info);
@@ -3039,17 +2979,13 @@
bool visitSubGraphInfo(HSubGraphBlockInformation info);
}
-
abstract class HExpressionInformationVisitor {
bool visitAndOrInfo(HAndOrBlockInformation info);
bool visitSubExpressionInfo(HSubExpressionBlockInformation info);
}
-
abstract class HBlockInformationVisitor
- implements HStatementInformationVisitor, HExpressionInformationVisitor {
-}
-
+ implements HStatementInformationVisitor, HExpressionInformationVisitor {}
/**
* Generic class wrapping a [SubGraph] as a block-information until
@@ -3063,7 +2999,7 @@
HBasicBlock get end => subGraph.end;
bool accept(HStatementInformationVisitor visitor) =>
- visitor.visitSubGraphInfo(this);
+ visitor.visitSubGraphInfo(this);
}
/**
@@ -3080,7 +3016,7 @@
HInstruction get conditionExpression => subExpression.conditionExpression;
bool accept(HExpressionInformationVisitor visitor) =>
- visitor.visitSubExpressionInfo(this);
+ visitor.visitSubExpressionInfo(this);
}
/** A sequence of separate statements. */
@@ -3092,7 +3028,7 @@
HBasicBlock get end => statements.last.end;
bool accept(HStatementInformationVisitor visitor) =>
- visitor.visitSequenceInfo(this);
+ visitor.visitSequenceInfo(this);
}
class HLabeledBlockInformation implements HStatementInformation {
@@ -3101,21 +3037,20 @@
final JumpTarget target;
final bool isContinue;
- HLabeledBlockInformation(this.body,
- List<LabelDefinition> labels,
- {this.isContinue: false}) :
- this.labels = labels, this.target = labels[0].target;
+ HLabeledBlockInformation(this.body, List<LabelDefinition> labels,
+ {this.isContinue: false})
+ : this.labels = labels,
+ this.target = labels[0].target;
- HLabeledBlockInformation.implicit(this.body,
- this.target,
- {this.isContinue: false})
- : this.labels = const<LabelDefinition>[];
+ HLabeledBlockInformation.implicit(this.body, this.target,
+ {this.isContinue: false})
+ : this.labels = const <LabelDefinition>[];
HBasicBlock get start => body.start;
HBasicBlock get end => body.end;
bool accept(HStatementInformationVisitor visitor) =>
- visitor.visitLabeledBlockInfo(this);
+ visitor.visitLabeledBlockInfo(this);
}
class HLoopBlockInformation implements HStatementInformation {
@@ -3135,14 +3070,8 @@
final List<LabelDefinition> labels;
final SourceInformation sourceInformation;
- HLoopBlockInformation(this.kind,
- this.initializer,
- this.condition,
- this.body,
- this.updates,
- this.target,
- this.labels,
- this.sourceInformation) {
+ HLoopBlockInformation(this.kind, this.initializer, this.condition, this.body,
+ this.updates, this.target, this.labels, this.sourceInformation) {
assert(
(kind == DO_WHILE_LOOP ? body.start : condition.start).isLoopHeader());
}
@@ -3168,31 +3097,27 @@
}
bool accept(HStatementInformationVisitor visitor) =>
- visitor.visitLoopInfo(this);
+ visitor.visitLoopInfo(this);
}
class HIfBlockInformation implements HStatementInformation {
final HExpressionInformation condition;
final HStatementInformation thenGraph;
final HStatementInformation elseGraph;
- HIfBlockInformation(this.condition,
- this.thenGraph,
- this.elseGraph);
+ HIfBlockInformation(this.condition, this.thenGraph, this.elseGraph);
HBasicBlock get start => condition.start;
HBasicBlock get end => elseGraph == null ? thenGraph.end : elseGraph.end;
bool accept(HStatementInformationVisitor visitor) =>
- visitor.visitIfInfo(this);
+ visitor.visitIfInfo(this);
}
class HAndOrBlockInformation implements HExpressionInformation {
final bool isAnd;
final HExpressionInformation left;
final HExpressionInformation right;
- HAndOrBlockInformation(this.isAnd,
- this.left,
- this.right);
+ HAndOrBlockInformation(this.isAnd, this.left, this.right);
HBasicBlock get start => left.start;
HBasicBlock get end => right.end;
@@ -3201,8 +3126,9 @@
HInstruction get conditionExpression {
return null;
}
+
bool accept(HExpressionInformationVisitor visitor) =>
- visitor.visitAndOrInfo(this);
+ visitor.visitAndOrInfo(this);
}
class HTryBlockInformation implements HStatementInformation {
@@ -3210,17 +3136,15 @@
final HLocalValue catchVariable;
final HStatementInformation catchBlock;
final HStatementInformation finallyBlock;
- HTryBlockInformation(this.body,
- this.catchVariable,
- this.catchBlock,
- this.finallyBlock);
+ HTryBlockInformation(
+ this.body, this.catchVariable, this.catchBlock, this.finallyBlock);
HBasicBlock get start => body.start;
HBasicBlock get end =>
finallyBlock == null ? catchBlock.end : finallyBlock.end;
bool accept(HStatementInformationVisitor visitor) =>
- visitor.visitTryInfo(this);
+ visitor.visitTryInfo(this);
}
class HSwitchBlockInformation implements HStatementInformation {
@@ -3229,10 +3153,8 @@
final JumpTarget target;
final List<LabelDefinition> labels;
- HSwitchBlockInformation(this.expression,
- this.statements,
- this.target,
- this.labels);
+ HSwitchBlockInformation(
+ this.expression, this.statements, this.target, this.labels);
HBasicBlock get start => expression.start;
HBasicBlock get end {
@@ -3251,17 +3173,15 @@
final bool hasReceiver;
- HReadTypeVariable(this.dartType,
- HInstruction receiver,
- TypeMask instructionType)
+ HReadTypeVariable(
+ this.dartType, HInstruction receiver, TypeMask instructionType)
: hasReceiver = true,
super(<HInstruction>[receiver], instructionType) {
setUseGvn();
}
- HReadTypeVariable.noReceiver(this.dartType,
- HInstruction typeArgument,
- TypeMask instructionType)
+ HReadTypeVariable.noReceiver(
+ this.dartType, HInstruction typeArgument, TypeMask instructionType)
: hasReceiver = false,
super(<HInstruction>[typeArgument], instructionType) {
setUseGvn();
@@ -3275,17 +3195,16 @@
bool typeEquals(HInstruction other) => other is HReadTypeVariable;
bool dataEquals(HReadTypeVariable other) {
- return dartType.element == other.dartType.element
- && hasReceiver == other.hasReceiver;
+ return dartType.element == other.dartType.element &&
+ hasReceiver == other.hasReceiver;
}
}
abstract class HRuntimeType extends HInstruction {
final DartType dartType;
- HRuntimeType(List<HInstruction> inputs,
- this.dartType,
- TypeMask instructionType)
+ HRuntimeType(
+ List<HInstruction> inputs, this.dartType, TypeMask instructionType)
: super(inputs, instructionType) {
setUseGvn();
}
@@ -3306,9 +3225,8 @@
}
class HFunctionType extends HRuntimeType {
- HFunctionType(List<HInstruction> inputs,
- FunctionType dartType,
- TypeMask instructionType)
+ HFunctionType(List<HInstruction> inputs, FunctionType dartType,
+ TypeMask instructionType)
: super(inputs, dartType, instructionType);
accept(HVisitor visitor) => visitor.visitFunctionType(this);
@@ -3330,9 +3248,8 @@
}
class HInterfaceType extends HRuntimeType {
- HInterfaceType(List<HInstruction> inputs,
- InterfaceType dartType,
- TypeMask instructionType)
+ HInterfaceType(List<HInstruction> inputs, InterfaceType dartType,
+ TypeMask instructionType)
: super(inputs, dartType, instructionType);
accept(HVisitor visitor) => visitor.visitInterfaceType(this);
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 78d5391..4f67597 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -2,34 +2,24 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-import '../common/codegen.dart' show
- CodegenRegistry,
- CodegenWorkItem;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
+import '../common/codegen.dart' show CodegenRegistry, CodegenWorkItem;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
import '../constants/constant_system.dart';
import '../constants/values.dart';
-import '../core_types.dart' show
- CoreClasses;
+import '../core_types.dart' show CoreClasses;
import '../dart_types.dart';
import '../elements/elements.dart';
import '../js/js.dart' as js;
-import '../js_backend/backend_helpers.dart' show
- BackendHelpers;
+import '../js_backend/backend_helpers.dart' show BackendHelpers;
import '../js_backend/js_backend.dart';
import '../native/native.dart' as native;
import '../tree/tree.dart' as ast;
import '../types/types.dart';
-import '../universe/selector.dart' show
- Selector;
-import '../universe/side_effects.dart' show
- SideEffects;
+import '../universe/selector.dart' show Selector;
+import '../universe/side_effects.dart' show SideEffects;
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld,
- World;
+import '../world.dart' show ClassWorld, World;
import 'nodes.dart';
import 'types_propagation.dart';
@@ -64,40 +54,40 @@
bool trustPrimitives = compiler.options.trustPrimitives;
measure(() {
List<OptimizationPhase> phases = <OptimizationPhase>[
- // Run trivial instruction simplification first to optimize
- // some patterns useful for type conversion.
- new SsaInstructionSimplifier(constantSystem, backend, this, work),
- new SsaTypeConversionInserter(compiler),
- new SsaRedundantPhiEliminator(),
- new SsaDeadPhiEliminator(),
- new SsaTypePropagator(compiler),
- // After type propagation, more instructions can be
- // simplified.
- new SsaInstructionSimplifier(constantSystem, backend, this, work),
- new SsaCheckInserter(
- trustPrimitives, backend, work, context.boundsChecked),
- new SsaInstructionSimplifier(constantSystem, backend, this, work),
- new SsaCheckInserter(
- trustPrimitives, backend, work, context.boundsChecked),
- new SsaTypePropagator(compiler),
- // Run a dead code eliminator before LICM because dead
- // interceptors are often in the way of LICM'able instructions.
- new SsaDeadCodeEliminator(compiler, this),
- new SsaGlobalValueNumberer(compiler),
- // After GVN, some instructions might need their type to be
- // updated because they now have different inputs.
- new SsaTypePropagator(compiler),
- new SsaCodeMotion(),
- new SsaLoadElimination(compiler),
- new SsaRedundantPhiEliminator(),
- new SsaDeadPhiEliminator(),
- new SsaTypePropagator(compiler),
- new SsaValueRangeAnalyzer(compiler, constantSystem, this, work),
- // Previous optimizations may have generated new
- // opportunities for instruction simplification.
- new SsaInstructionSimplifier(constantSystem, backend, this, work),
- new SsaCheckInserter(
- trustPrimitives, backend, work, context.boundsChecked),
+ // Run trivial instruction simplification first to optimize
+ // some patterns useful for type conversion.
+ new SsaInstructionSimplifier(constantSystem, backend, this, work),
+ new SsaTypeConversionInserter(compiler),
+ new SsaRedundantPhiEliminator(),
+ new SsaDeadPhiEliminator(),
+ new SsaTypePropagator(compiler),
+ // After type propagation, more instructions can be
+ // simplified.
+ new SsaInstructionSimplifier(constantSystem, backend, this, work),
+ new SsaCheckInserter(
+ trustPrimitives, backend, work, context.boundsChecked),
+ new SsaInstructionSimplifier(constantSystem, backend, this, work),
+ new SsaCheckInserter(
+ trustPrimitives, backend, work, context.boundsChecked),
+ new SsaTypePropagator(compiler),
+ // Run a dead code eliminator before LICM because dead
+ // interceptors are often in the way of LICM'able instructions.
+ new SsaDeadCodeEliminator(compiler, this),
+ new SsaGlobalValueNumberer(compiler),
+ // After GVN, some instructions might need their type to be
+ // updated because they now have different inputs.
+ new SsaTypePropagator(compiler),
+ new SsaCodeMotion(),
+ new SsaLoadElimination(compiler),
+ new SsaRedundantPhiEliminator(),
+ new SsaDeadPhiEliminator(),
+ new SsaTypePropagator(compiler),
+ new SsaValueRangeAnalyzer(compiler, constantSystem, this, work),
+ // Previous optimizations may have generated new
+ // opportunities for instruction simplification.
+ new SsaInstructionSimplifier(constantSystem, backend, this, work),
+ new SsaCheckInserter(
+ trustPrimitives, backend, work, context.boundsChecked),
];
phases.forEach(runPhase);
@@ -110,22 +100,22 @@
runPhase(dce);
if (dce.eliminatedSideEffects) {
phases = <OptimizationPhase>[
- new SsaTypePropagator(compiler),
- new SsaGlobalValueNumberer(compiler),
- new SsaCodeMotion(),
- new SsaValueRangeAnalyzer(compiler, constantSystem, this, work),
- new SsaInstructionSimplifier(constantSystem, backend, this, work),
- new SsaCheckInserter(
- trustPrimitives, backend, work, context.boundsChecked),
- new SsaSimplifyInterceptors(compiler, constantSystem, work),
- new SsaDeadCodeEliminator(compiler, this),
+ new SsaTypePropagator(compiler),
+ new SsaGlobalValueNumberer(compiler),
+ new SsaCodeMotion(),
+ new SsaValueRangeAnalyzer(compiler, constantSystem, this, work),
+ new SsaInstructionSimplifier(constantSystem, backend, this, work),
+ new SsaCheckInserter(
+ trustPrimitives, backend, work, context.boundsChecked),
+ new SsaSimplifyInterceptors(compiler, constantSystem, work),
+ new SsaDeadCodeEliminator(compiler, this),
];
} else {
phases = <OptimizationPhase>[
- new SsaTypePropagator(compiler),
- // Run the simplifier to remove unneeded type checks inserted by
- // type propagation.
- new SsaInstructionSimplifier(constantSystem, backend, this, work),
+ new SsaTypePropagator(compiler),
+ // Run the simplifier to remove unneeded type checks inserted by
+ // type propagation.
+ new SsaInstructionSimplifier(constantSystem, backend, this, work),
];
}
phases.forEach(runPhase);
@@ -160,7 +150,6 @@
*/
class SsaInstructionSimplifier extends HBaseVisitor
implements OptimizationPhase {
-
// We don't produce constant-folded strings longer than this unless they have
// a single use. This protects against exponentially large constant folded
// strings.
@@ -174,10 +163,8 @@
Compiler get compiler => backend.compiler;
final SsaOptimizerTask optimizer;
- SsaInstructionSimplifier(this.constantSystem,
- this.backend,
- this.optimizer,
- this.work);
+ SsaInstructionSimplifier(
+ this.constantSystem, this.backend, this.optimizer, this.work);
CoreClasses get coreClasses => compiler.coreClasses;
@@ -201,12 +188,12 @@
// might be that an operation thought to return double, can be
// simplified to an int. For example:
// `2.5 * 10`.
- if (!(replacement.isNumberOrNull(compiler)
- && instruction.isNumberOrNull(compiler))) {
+ if (!(replacement.isNumberOrNull(compiler) &&
+ instruction.isNumberOrNull(compiler))) {
// If we can replace [instruction] with [replacement], then
// [replacement]'s type can be narrowed.
- TypeMask newType = replacement.instructionType.intersection(
- instruction.instructionType, compiler.world);
+ TypeMask newType = replacement.instructionType
+ .intersection(instruction.instructionType, compiler.world);
replacement.instructionType = newType;
}
@@ -265,8 +252,8 @@
// body. If that happens then we should not forward the constant value to
// its uses since since the uses reachable from the assignment may have
// values in addition to the constant passed to the function.
- if (node.usedBy.any((user) =>
- user is HLocalSet && identical(user.local, node))) {
+ if (node.usedBy
+ .any((user) => user is HLocalSet && identical(user.local, node))) {
return node;
}
propagateConstantValueToUses(node);
@@ -341,14 +328,13 @@
TypeMask resultType = backend.positiveIntType;
// If we already have computed a more specific type, keep that type.
if (HInstruction.isInstanceOf(
- actualType, helpers.jsUInt31Class, classWorld)) {
+ actualType, helpers.jsUInt31Class, classWorld)) {
resultType = backend.uint31Type;
} else if (HInstruction.isInstanceOf(
- actualType, helpers.jsUInt32Class, classWorld)) {
+ actualType, helpers.jsUInt32Class, classWorld)) {
resultType = backend.uint32Type;
}
- HFieldGet result = new HFieldGet(
- element, actualReceiver, resultType,
+ HFieldGet result = new HFieldGet(element, actualReceiver, resultType,
isAssignable: !isFixed);
return result;
} else if (actualReceiver.isConstantMap()) {
@@ -382,7 +368,7 @@
bool applies(Element element) {
return selector.applies(element, world) &&
- (mask == null || mask.canHit(element, selector, world));
+ (mask == null || mask.canHit(element, selector, world));
}
if (selector.isCall || selector.isOperator) {
@@ -408,12 +394,10 @@
// make sure the receiver and the argument are not null.
// TODO(sra): Do this via [node.specializer].
HInstruction argument = node.inputs[2];
- if (argument.isString(compiler)
- && !input.canBeNull()) {
+ if (argument.isString(compiler) && !input.canBeNull()) {
return new HStringConcat(input, argument, node.instructionType);
}
- } else if (applies(helpers.jsStringToString)
- && !input.canBeNull()) {
+ } else if (applies(helpers.jsStringToString) && !input.canBeNull()) {
return input;
}
}
@@ -426,9 +410,8 @@
// bounds check on removeLast). Once we start inlining, the
// bounds check will become explicit, so we won't need this
// optimization.
- HInvokeDynamicMethod result = new HInvokeDynamicMethod(
- node.selector, node.mask,
- node.inputs.sublist(1), node.instructionType);
+ HInvokeDynamicMethod result = new HInvokeDynamicMethod(node.selector,
+ node.mask, node.inputs.sublist(1), node.instructionType);
result.element = target;
return result;
}
@@ -453,11 +436,12 @@
Element element =
compiler.world.locateSingleElement(node.selector, receiverType);
// TODO(ngeoffray): Also fold if it's a getter or variable.
- if (element != null
- && element.isFunction
+ if (element != null &&
+ element.isFunction
// If we found out that the only target is a [:noSuchMethod:],
// we just ignore it.
- && element.name == node.selector.name) {
+ &&
+ element.name == node.selector.name) {
FunctionElement method = element;
if (backend.isNative(method)) {
@@ -468,8 +452,7 @@
// we should pass the default values.
FunctionSignature parameters = method.functionSignature;
if (parameters.optionalParameterCount == 0 ||
- parameters.parameterCount ==
- node.selector.argumentCount) {
+ parameters.parameterCount == node.selector.argumentCount) {
node.element = element;
}
}
@@ -477,8 +460,8 @@
return node;
}
- HInstruction tryInlineNativeMethod(HInvokeDynamicMethod node,
- FunctionElement method) {
+ HInstruction tryInlineNativeMethod(
+ HInvokeDynamicMethod node, FunctionElement method) {
// Enable direct calls to a native method only if we don't run in checked
// mode, where the Dart version may have type annotations on parameters and
// return type that it should check.
@@ -505,7 +488,7 @@
// preserve the number of arguments, so check only the actual arguments.
List<HInstruction> inputs = node.inputs.sublist(1);
- int inputPosition = 1; // Skip receiver.
+ int inputPosition = 1; // Skip receiver.
bool canInline = true;
signature.forEachParameter((ParameterElement element) {
if (inputPosition++ < inputs.length && canInline) {
@@ -551,9 +534,8 @@
return node;
}
- HInstruction foldBinary(BinaryOperation operation,
- HInstruction left,
- HInstruction right) {
+ HInstruction foldBinary(
+ BinaryOperation operation, HInstruction left, HInstruction right) {
if (left is HConstant && right is HConstant) {
HConstant op1 = left;
HConstant op2 = right;
@@ -650,7 +632,6 @@
return compareConstant(right, left);
}
-
if (identical(left.nonCheck(), right.nonCheck())) {
// Avoid constant-folding `identical(x, x)` when `x` might be double. The
// dart2js runtime has not always been consistent with the Dart
@@ -668,9 +649,8 @@
return newInstruction == null ? super.visitIdentity(node) : newInstruction;
}
- void simplifyCondition(HBasicBlock block,
- HInstruction condition,
- bool value) {
+ void simplifyCondition(
+ HBasicBlock block, HInstruction condition, bool value) {
condition.dominatedUsers(block.first).forEach((user) {
HInstruction newCondition = graph.addConstantBool(value, compiler);
user.changeUse(condition, newCondition);
@@ -690,8 +670,8 @@
// simplify the nested use of the condition in that case, so
// we look for all dominating negated conditions and replace
// nested uses of them with true or false.
- Iterable<HInstruction> dominating = condition.usedBy.where((user) =>
- user is HNot && user.dominates(node));
+ Iterable<HInstruction> dominating = condition.usedBy
+ .where((user) => user is HNot && user.dominates(node));
dominating.forEach((hoisted) {
simplifyCondition(node.thenBlock, hoisted, false);
simplifyCondition(node.elseBlock, hoisted, true);
@@ -753,13 +733,13 @@
// type int or double.
}
} else if (expression.canBePrimitiveNumber(compiler) &&
- element == coreClasses.intClass) {
+ element == coreClasses.intClass) {
// We let the JS semantics decide for that check.
return node;
- // We need the [:hasTypeArguments:] check because we don't have
- // the notion of generics in the backend. For example, [:this:] in
- // a class [:A<T>:], is currently always considered to have the
- // raw type.
+ // We need the [:hasTypeArguments:] check because we don't have
+ // the notion of generics in the backend. For example, [:this:] in
+ // a class [:A<T>:], is currently always considered to have the
+ // raw type.
} else if (!RuntimeTypes.hasTypeArguments(type)) {
TypeMask expressionMask = expression.instructionType;
assert(TypeMask.assertIsNormalized(expressionMask, classWorld));
@@ -806,8 +786,8 @@
return inputType.isInMask(checkedType, classWorld) ? input : node;
}
- VariableElement findConcreteFieldForDynamicAccess(HInstruction receiver,
- Selector selector) {
+ VariableElement findConcreteFieldForDynamicAccess(
+ HInstruction receiver, Selector selector) {
TypeMask receiverType = receiver.instructionType;
return compiler.world.locateSingleField(selector, receiverType);
}
@@ -882,8 +862,7 @@
if (folded != node) return folded;
}
HInstruction receiver = node.getDartReceiver(compiler);
- Element field = findConcreteFieldForDynamicAccess(
- receiver, node.selector);
+ Element field = findConcreteFieldForDynamicAccess(receiver, node.selector);
if (field == null) return node;
return directFieldGet(receiver, field);
}
@@ -894,14 +873,12 @@
TypeMask type;
if (backend.isNative(field.enclosingClass)) {
type = TypeMaskFactory.fromNativeBehavior(
- native.NativeBehavior.ofFieldLoad(field, compiler),
- compiler);
+ native.NativeBehavior.ofFieldLoad(field, compiler), compiler);
} else {
type = TypeMaskFactory.inferredTypeForElement(field, compiler);
}
- return new HFieldGet(
- field, receiver, type, isAssignable: isAssignable);
+ return new HFieldGet(field, receiver, type, isAssignable: isAssignable);
}
HInstruction visitInvokeDynamicSetter(HInvokeDynamicSetter node) {
@@ -925,10 +902,8 @@
// inline this access.
return node;
}
- HInstruction other = value.convertType(
- compiler,
- type,
- HTypeConversion.CHECKED_MODE_CHECK);
+ HInstruction other =
+ value.convertType(compiler, type, HTypeConversion.CHECKED_MODE_CHECK);
if (other != value) {
node.block.addBefore(node, other);
value = other;
@@ -1013,8 +988,8 @@
if (!intConstant.isUInt32()) return node;
}
PrimitiveConstantValue primitive = constant.constant;
- return graph.addConstant(constantSystem.createString(
- primitive.toDartString()), compiler);
+ return graph.addConstant(
+ constantSystem.createString(primitive.toDartString()), compiler);
}
return node;
}
@@ -1032,10 +1007,8 @@
final String name = "SsaCheckInserter";
HGraph graph;
- SsaCheckInserter(this.trustPrimitives,
- this.backend,
- this.work,
- this.boundsChecked);
+ SsaCheckInserter(
+ this.trustPrimitives, this.backend, this.work, this.boundsChecked);
BackendHelpers get helpers => backend.helpers;
@@ -1059,9 +1032,8 @@
}
}
- HBoundsCheck insertBoundsCheck(HInstruction indexNode,
- HInstruction array,
- HInstruction indexArgument) {
+ HBoundsCheck insertBoundsCheck(
+ HInstruction indexNode, HInstruction array, HInstruction indexArgument) {
Compiler compiler = backend.compiler;
HFieldGet length = new HFieldGet(
helpers.jsIndexableLength, array, backend.positiveIntType,
@@ -1071,8 +1043,7 @@
TypeMask type = indexArgument.isPositiveInteger(compiler)
? indexArgument.instructionType
: backend.positiveIntType;
- HBoundsCheck check = new HBoundsCheck(
- indexArgument, length, array, type);
+ HBoundsCheck check = new HBoundsCheck(indexArgument, length, array, type);
indexNode.block.addBefore(indexNode, check);
// If the index input to the bounds check was not known to be an integer
// then we replace its uses with the bounds check, which is known to be an
@@ -1131,10 +1102,8 @@
HInstruction get zapInstruction {
if (zapInstructionCache == null) {
// A constant with no type does not pollute types at phi nodes.
- ConstantValue constant =
- new SyntheticConstantValue(
- SyntheticConstantKind.EMPTY_VALUE,
- const TypeMask.nonNullEmpty());
+ ConstantValue constant = new SyntheticConstantValue(
+ SyntheticConstantKind.EMPTY_VALUE, const TypeMask.nonNullEmpty());
zapInstructionCache = analyzer.graph.addConstant(constant, compiler);
}
return zapInstructionCache;
@@ -1181,8 +1150,8 @@
HInstruction receiver = instruction.getDartReceiver(compiler);
HInstruction current = instruction.next;
do {
- if ((current.getDartReceiver(compiler) == receiver)
- && current.canThrow()) {
+ if ((current.getDartReceiver(compiler) == receiver) &&
+ current.canThrow()) {
return true;
}
if (current is HForeignCode &&
@@ -1232,15 +1201,15 @@
}
return false;
}
- return instruction.isAllocation
- && instruction.isPure()
- && trivialDeadStoreReceivers.putIfAbsent(instruction,
- () => instruction.usedBy.every(isDeadUse));
+ return instruction.isAllocation &&
+ instruction.isPure() &&
+ trivialDeadStoreReceivers.putIfAbsent(
+ instruction, () => instruction.usedBy.every(isDeadUse));
}
bool isTrivialDeadStore(HInstruction instruction) {
- return instruction is HFieldSet
- && isTrivialDeadStoreReceiver(instruction.getDartReceiver(compiler));
+ return instruction is HFieldSet &&
+ isTrivialDeadStoreReceiver(instruction.getDartReceiver(compiler));
}
bool isDeadCode(HInstruction instruction) {
@@ -1252,9 +1221,9 @@
hasFollowingThrowingNSM(instruction)) {
return true;
}
- return !instruction.canThrow()
- && instruction is !HParameterValue
- && instruction is !HLocalSet;
+ return !instruction.canThrow() &&
+ instruction is! HParameterValue &&
+ instruction is! HLocalSet;
}
void visitGraph(HGraph graph) {
@@ -1272,8 +1241,8 @@
while (instruction != null) {
var previous = instruction.previous;
if (isDeadBlock) {
- eliminatedSideEffects = eliminatedSideEffects ||
- instruction.sideEffects.hasSideEffects();
+ eliminatedSideEffects =
+ eliminatedSideEffects || instruction.sideEffects.hasSideEffects();
removeUsers(instruction);
block.remove(instruction);
} else if (isDeadCode(instruction)) {
@@ -1306,8 +1275,8 @@
// Run through the phis of the block and replace them with their input
// that comes from the only live predecessor if that dominates the phi.
block.forEachPhi((HPhi phi) {
- HInstruction replacement = (indexOfLive >= 0)
- ? phi.inputs[indexOfLive] : zapInstruction;
+ HInstruction replacement =
+ (indexOfLive >= 0) ? phi.inputs[indexOfLive] : zapInstruction;
if (replacement.dominates(phi)) {
block.rewrite(phi, replacement);
block.removePhi(phi);
@@ -1401,9 +1370,7 @@
if (!input.isConstantInteger()) continue;
IntConstantValue constant = input.constant;
int label = constant.primitiveValue;
- if (!liveLabels.contains(label) &&
- label <= upper &&
- label >= lower) {
+ if (!liveLabels.contains(label) && label <= upper && label >= lower) {
markBlockLive(node.block.successors[pos - 1]);
liveLabels.add(label);
}
@@ -1431,7 +1398,7 @@
for (final block in graph.blocks) {
block.forEachPhi((HPhi phi) {
for (final user in phi.usedBy) {
- if (user is !HPhi) {
+ if (user is! HPhi) {
worklist.add(phi);
livePhis.add(phi);
break;
@@ -1465,7 +1432,8 @@
next = current.next;
if (!livePhis.contains(current)
// TODO(ahe): Not sure the following is correct.
- && current.usedBy.isEmpty) {
+ &&
+ current.usedBy.isEmpty) {
block.removePhi(current);
}
current = next;
@@ -1540,8 +1508,9 @@
void visitGraph(HGraph graph) {
computeChangesFlags(graph);
moveLoopInvariantCode(graph);
- List<GvnWorkItem> workQueue =
- <GvnWorkItem>[new GvnWorkItem(graph.entry, new ValueSet())];
+ List<GvnWorkItem> workQueue = <GvnWorkItem>[
+ new GvnWorkItem(graph.entry, new ValueSet())
+ ];
do {
GvnWorkItem item = workQueue.removeLast();
visitBasicBlock(item.block, item.valueSet, workQueue);
@@ -1567,9 +1536,8 @@
}
}
- void moveLoopInvariantCodeFromBlock(HBasicBlock block,
- HBasicBlock loopHeader,
- int changesFlags) {
+ void moveLoopInvariantCodeFromBlock(
+ HBasicBlock block, HBasicBlock loopHeader, int changesFlags) {
assert(block.parentLoopHeader == loopHeader || block == loopHeader);
HBasicBlock preheader = loopHeader.predecessors[0];
int dependsFlags = SideEffects.computeDependsOnFlags(changesFlags);
@@ -1577,19 +1545,20 @@
bool isLoopAlwaysTaken() {
HInstruction instruction = loopHeader.last;
assert(instruction is HGoto || instruction is HLoopBranch);
- return instruction is HGoto
- || instruction.inputs[0].isConstantTrue();
+ return instruction is HGoto || instruction.inputs[0].isConstantTrue();
}
bool firstInstructionInLoop = block == loopHeader
// Compensate for lack of code motion.
- || (blockChangesFlags[loopHeader.id] == 0
- && isLoopAlwaysTaken()
- && loopHeader.successors[0] == block);
+ ||
+ (blockChangesFlags[loopHeader.id] == 0 &&
+ isLoopAlwaysTaken() &&
+ loopHeader.successors[0] == block);
while (instruction != null) {
HInstruction next = instruction.next;
- if (instruction.useGvn() && instruction.isMovable
- && (!instruction.canThrow() || firstInstructionInLoop)
- && !instruction.sideEffects.dependsOn(dependsFlags)) {
+ if (instruction.useGvn() &&
+ instruction.isMovable &&
+ (!instruction.canThrow() || firstInstructionInLoop) &&
+ !instruction.sideEffects.dependsOn(dependsFlags)) {
bool loopInvariantInputs = true;
List<HInstruction> inputs = instruction.inputs;
for (int i = 0, length = inputs.length; i < length; i++) {
@@ -1617,8 +1586,7 @@
}
}
- bool isInputDefinedAfterDominator(HInstruction input,
- HBasicBlock dominator) {
+ bool isInputDefinedAfterDominator(HInstruction input, HBasicBlock dominator) {
return input.block.id > dominator.id;
}
@@ -1707,16 +1675,14 @@
// Propagate loop changes flags upwards.
HBasicBlock parentLoopHeader = block.parentLoopHeader;
if (parentLoopHeader != null) {
- loopChangesFlags[parentLoopHeader.id] |= (block.isLoopHeader())
- ? loopChangesFlags[id]
- : changesFlags;
+ loopChangesFlags[parentLoopHeader.id] |=
+ (block.isLoopHeader()) ? loopChangesFlags[id] : changesFlags;
}
}
}
int getChangesFlagsForDominatedBlock(HBasicBlock dominator,
- HBasicBlock dominated,
- List<HBasicBlock> workQueue) {
+ HBasicBlock dominated, List<HBasicBlock> workQueue) {
int changesFlags = 0;
List<HBasicBlock> predecessors = dominated.predecessors;
for (int i = 0, length = predecessors.length; i < length; i++) {
@@ -1851,9 +1817,8 @@
// to use [TypeKnown] of [input] instead. As the type information depends
// on the control flow, we mark the inserted [HTypeKnown] nodes as
// non-movable.
- void insertTypePropagationForDominatedUsers(HBasicBlock dominator,
- HInstruction input,
- TypeMask convertedType) {
+ void insertTypePropagationForDominatedUsers(
+ HBasicBlock dominator, HInstruction input, TypeMask convertedType) {
Setlet<HInstruction> dominatedUsers = input.dominatedUsers(dominator.first);
if (dominatedUsers.isEmpty) return;
@@ -1885,14 +1850,14 @@
HInstruction input = instruction.expression;
for (HIf ifUser in ifUsers) {
- insertTypePropagationForDominatedUsers(ifUser.thenBlock, input,
- convertedType);
+ insertTypePropagationForDominatedUsers(
+ ifUser.thenBlock, input, convertedType);
// TODO(ngeoffray): Also change uses for the else block on a type
// that knows it is not of a specific type.
}
for (HIf ifUser in notIfUsers) {
- insertTypePropagationForDominatedUsers(ifUser.elseBlock, input,
- convertedType);
+ insertTypePropagationForDominatedUsers(
+ ifUser.elseBlock, input, convertedType);
// TODO(ngeoffray): Also change uses for the then block on a type
// that knows it is not of a specific type.
}
@@ -1924,20 +1889,19 @@
TypeMask nonNullType = input.instructionType.nonNullable();
for (HIf ifUser in ifUsers) {
- insertTypePropagationForDominatedUsers(ifUser.elseBlock, input,
- nonNullType);
+ insertTypePropagationForDominatedUsers(
+ ifUser.elseBlock, input, nonNullType);
// Uses in thenBlock are `null`, but probably not common.
}
for (HIf ifUser in notIfUsers) {
- insertTypePropagationForDominatedUsers(ifUser.thenBlock, input,
- nonNullType);
+ insertTypePropagationForDominatedUsers(
+ ifUser.thenBlock, input, nonNullType);
// Uses in elseBlock are `null`, but probably not common.
}
}
- collectIfUsers(HInstruction instruction,
- List<HInstruction> ifUsers,
- List<HInstruction> notIfUsers) {
+ collectIfUsers(HInstruction instruction, List<HInstruction> ifUsers,
+ List<HInstruction> notIfUsers) {
for (HInstruction user in instruction.usedBy) {
if (user is HIf) {
ifUsers.add(user);
@@ -1982,8 +1946,8 @@
if (block.predecessors.length == 0) {
// Entry block.
memorySet = new MemorySet(compiler);
- } else if (block.predecessors.length == 1
- && block.predecessors[0].successors.length == 1) {
+ } else if (block.predecessors.length == 1 &&
+ block.predecessors[0].successors.length == 1) {
// No need to clone, there is no other successor for
// `block.predecessors[0]`, and this block has only one
// predecessor. Since we are not going to visit
@@ -1999,7 +1963,7 @@
memorySet = memories[block.predecessors[0].id];
for (int i = 1; i < block.predecessors.length; i++) {
memorySet = memorySet.intersectionFor(
- memories[block.predecessors[i].id], block, i);
+ memories[block.predecessors[i].id], block, i);
}
}
@@ -2015,8 +1979,7 @@
void visitFieldGet(HFieldGet instruction) {
if (instruction.isNullCheck) return;
Element element = instruction.element;
- HInstruction receiver =
- instruction.getDartReceiver(compiler).nonCheck();
+ HInstruction receiver = instruction.getDartReceiver(compiler).nonCheck();
HInstruction existing = memorySet.lookupFieldValue(element, receiver);
if (existing != null) {
instruction.block.rewriteWithBetterUser(instruction, existing);
@@ -2027,8 +1990,7 @@
}
void visitFieldSet(HFieldSet instruction) {
- HInstruction receiver =
- instruction.getDartReceiver(compiler).nonCheck();
+ HInstruction receiver = instruction.getDartReceiver(compiler).nonCheck();
memorySet.registerFieldValueUpdate(
instruction.element, receiver, instruction.inputs.last);
}
@@ -2150,13 +2112,13 @@
* Maps a field to a map of receiver to value.
*/
final Map<Element, Map<HInstruction, HInstruction>> fieldValues =
- <Element, Map<HInstruction, HInstruction>> {};
+ <Element, Map<HInstruction, HInstruction>>{};
/**
* Maps a receiver to a map of keys to value.
*/
final Map<HInstruction, Map<HInstruction, HInstruction>> keyedValues =
- <HInstruction, Map<HInstruction, HInstruction>> {};
+ <HInstruction, Map<HInstruction, HInstruction>>{};
/**
* Set of objects that we know don't escape the current function.
@@ -2184,8 +2146,8 @@
if (nonEscapingReceivers.contains(second)) return false;
// Typed arrays of different types might have a shared buffer.
if (couldBeTypedArray(first) && couldBeTypedArray(second)) return true;
- return !first.instructionType.isDisjoint(
- second.instructionType, compiler.world);
+ return !first.instructionType
+ .isDisjoint(second.instructionType, compiler.world);
}
bool isFinal(Element element) {
@@ -2193,9 +2155,9 @@
}
bool isConcrete(HInstruction instruction) {
- return instruction is HForeignNew
- || instruction is HConstant
- || instruction is HLiteralList;
+ return instruction is HForeignNew ||
+ instruction is HConstant ||
+ instruction is HLiteralList;
}
bool couldBeTypedArray(HInstruction receiver) {
@@ -2218,17 +2180,16 @@
* Sets `receiver.element` to contain [value]. Kills all potential
* places that may be affected by this update.
*/
- void registerFieldValueUpdate(Element element,
- HInstruction receiver,
- HInstruction value) {
+ void registerFieldValueUpdate(
+ Element element, HInstruction receiver, HInstruction value) {
if (backend.isNative(element)) {
return; // TODO(14955): Remove this restriction?
}
// [value] is being set in some place in memory, we remove it from
// the non-escaping set.
nonEscapingReceivers.remove(value);
- Map<HInstruction, HInstruction> map = fieldValues.putIfAbsent(
- element, () => <HInstruction, HInstruction> {});
+ Map<HInstruction, HInstruction> map =
+ fieldValues.putIfAbsent(element, () => <HInstruction, HInstruction>{});
map.forEach((key, value) {
if (mayAlias(receiver, key)) map[key] = null;
});
@@ -2238,14 +2199,13 @@
/**
* Registers that `receiver.element` is now [value].
*/
- void registerFieldValue(Element element,
- HInstruction receiver,
- HInstruction value) {
+ void registerFieldValue(
+ Element element, HInstruction receiver, HInstruction value) {
if (backend.isNative(element)) {
return; // TODO(14955): Remove this restriction?
}
- Map<HInstruction, HInstruction> map = fieldValues.putIfAbsent(
- element, () => <HInstruction, HInstruction> {});
+ Map<HInstruction, HInstruction> map =
+ fieldValues.putIfAbsent(element, () => <HInstruction, HInstruction>{});
map[receiver] = value;
}
@@ -2273,8 +2233,8 @@
nonEscapingReceivers.remove(input);
});
- if (instruction.sideEffects.changesInstanceProperty()
- || instruction.sideEffects.changesStaticProperty()) {
+ if (instruction.sideEffects.changesInstanceProperty() ||
+ instruction.sideEffects.changesStaticProperty()) {
fieldValues.forEach((element, map) {
if (isFinal(element)) return;
map.forEach((receiver, value) {
@@ -2308,11 +2268,10 @@
/**
* Registers that `receiver[index]` is now [value].
*/
- void registerKeyedValue(HInstruction receiver,
- HInstruction index,
- HInstruction value) {
- Map<HInstruction, HInstruction> map = keyedValues.putIfAbsent(
- receiver, () => <HInstruction, HInstruction> {});
+ void registerKeyedValue(
+ HInstruction receiver, HInstruction index, HInstruction value) {
+ Map<HInstruction, HInstruction> map =
+ keyedValues.putIfAbsent(receiver, () => <HInstruction, HInstruction>{});
map[index] = value;
}
@@ -2320,9 +2279,8 @@
* Sets `receiver[index]` to contain [value]. Kills all potential
* places that may be affected by this update.
*/
- void registerKeyedValueUpdate(HInstruction receiver,
- HInstruction index,
- HInstruction value) {
+ void registerKeyedValueUpdate(
+ HInstruction receiver, HInstruction index, HInstruction value) {
nonEscapingReceivers.remove(value);
keyedValues.forEach((key, values) {
if (mayAlias(receiver, key)) {
@@ -2340,8 +2298,8 @@
// Typed arrays may narrow incoming values.
if (couldBeTypedArray(receiver)) return;
- Map<HInstruction, HInstruction> map = keyedValues.putIfAbsent(
- receiver, () => <HInstruction, HInstruction> {});
+ Map<HInstruction, HInstruction> map =
+ keyedValues.putIfAbsent(receiver, () => <HInstruction, HInstruction>{});
map[index] = value;
}
@@ -2350,14 +2308,12 @@
* returns [first] if [first] and [second] are equal. Otherwise
* creates or re-uses a phi in [block] that holds [first] and [second].
*/
- HInstruction findCommonInstruction(HInstruction first,
- HInstruction second,
- HBasicBlock block,
- int predecessorIndex) {
+ HInstruction findCommonInstruction(HInstruction first, HInstruction second,
+ HBasicBlock block, int predecessorIndex) {
if (first == null || second == null) return null;
if (first == second) return first;
- TypeMask phiType = second.instructionType.union(
- first.instructionType, compiler.world);
+ TypeMask phiType =
+ second.instructionType.union(first.instructionType, compiler.world);
if (first is HPhi && first.block == block) {
HPhi phi = first;
phi.addInput(second);
@@ -2379,9 +2335,8 @@
/**
* Returns the intersection between [this] and [other].
*/
- MemorySet intersectionFor(MemorySet other,
- HBasicBlock block,
- int predecessorIndex) {
+ MemorySet intersectionFor(
+ MemorySet other, HBasicBlock block, int predecessorIndex) {
MemorySet result = new MemorySet(compiler);
if (other == null) return result;
diff --git a/pkg/compiler/lib/src/ssa/ssa_tracer.dart b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
index 0b35432..9a6f6c6 100644
--- a/pkg/compiler/lib/src/ssa/ssa_tracer.dart
+++ b/pkg/compiler/lib/src/ssa/ssa_tracer.dart
@@ -59,11 +59,11 @@
}
}
- void addInstructions(HInstructionStringifier stringifier,
- HInstructionList list) {
+ void addInstructions(
+ HInstructionStringifier stringifier, HInstructionList list) {
for (HInstruction instruction = list.first;
- instruction != null;
- instruction = instruction.next) {
+ instruction != null;
+ instruction = instruction.next) {
int bci = 0;
int uses = instruction.usedBy.length;
String changes = instruction.sideEffects.hasSideEffects() ? '!' : ' ';
@@ -162,7 +162,7 @@
String handleInvokeBinary(HInvokeBinary node, String opcode) {
String left = temporaryId(node.left);
- String right= temporaryId(node.right);
+ String right = temporaryId(node.right);
return '$opcode: $left $right';
}
@@ -255,6 +255,7 @@
String visitGreaterEqual(HGreaterEqual node) {
return handleInvokeBinary(node, 'GreaterEqual');
}
+
String visitIdentity(HIdentity node) => handleInvokeBinary(node, 'Identity');
String visitIf(HIf node) {
@@ -264,8 +265,8 @@
return "If ($conditionId): (B${thenBlock.id}) else (B${elseBlock.id})";
}
- String handleGenericInvoke(String invokeType, String functionName,
- List<HInstruction> arguments) {
+ String handleGenericInvoke(
+ String invokeType, String functionName, List<HInstruction> arguments) {
StringBuffer argumentsString = new StringBuffer();
for (int i = 0; i < arguments.length; i++) {
if (i != 0) argumentsString.write(", ");
@@ -298,8 +299,8 @@
return "Interceptor: $value";
}
- String visitInvokeClosure(HInvokeClosure node)
- => handleInvokeDynamic(node, "InvokeClosure");
+ String visitInvokeClosure(HInvokeClosure node) =>
+ handleInvokeDynamic(node, "InvokeClosure");
String handleInvokeDynamic(HInvokeDynamic invoke, String kind) {
String receiver = temporaryId(invoke.receiver);
@@ -307,16 +308,15 @@
String target = "$receiver.$name";
int offset = HInvoke.ARGUMENTS_OFFSET;
List arguments = invoke.inputs.sublist(offset);
- return handleGenericInvoke(kind, target, arguments) +
- "(${invoke.mask})";
+ return handleGenericInvoke(kind, target, arguments) + "(${invoke.mask})";
}
- String visitInvokeDynamicMethod(HInvokeDynamicMethod node)
- => handleInvokeDynamic(node, "InvokeDynamicMethod");
- String visitInvokeDynamicGetter(HInvokeDynamicGetter node)
- => handleInvokeDynamic(node, "InvokeDynamicGetter");
- String visitInvokeDynamicSetter(HInvokeDynamicSetter node)
- => handleInvokeDynamic(node, "InvokeDynamicSetter");
+ String visitInvokeDynamicMethod(HInvokeDynamicMethod node) =>
+ handleInvokeDynamic(node, "InvokeDynamicMethod");
+ String visitInvokeDynamicGetter(HInvokeDynamicGetter node) =>
+ handleInvokeDynamic(node, "InvokeDynamicGetter");
+ String visitInvokeDynamicSetter(HInvokeDynamicSetter node) =>
+ handleInvokeDynamic(node, "InvokeDynamicSetter");
String visitInvokeStatic(HInvokeStatic invoke) {
String target = invoke.element.name;
@@ -334,14 +334,13 @@
}
String visitForeignCode(HForeignCode foreign) {
- return handleGenericInvoke("ForeignCode", "${foreign.codeTemplate.ast}",
- foreign.inputs);
+ return handleGenericInvoke(
+ "ForeignCode", "${foreign.codeTemplate.ast}", foreign.inputs);
}
String visitForeignNew(HForeignNew node) {
- return handleGenericInvoke("ForeignNew",
- "${node.element.name}",
- node.inputs);
+ return handleGenericInvoke(
+ "ForeignNew", "${node.element.name}", node.inputs);
}
String visitLess(HLess node) => handleInvokeBinary(node, 'Less');
@@ -361,8 +360,7 @@
HBasicBlock bodyBlock = currentBlock.successors[0];
HBasicBlock exitBlock = currentBlock.successors[1];
String conditionId = temporaryId(branch.inputs[0]);
- return
- "LoopBranch ($conditionId): (B${bodyBlock.id}) then (B${exitBlock.id})";
+ return "LoopBranch ($conditionId): (B${bodyBlock.id}) then (B${exitBlock.id})";
}
String visitMultiply(HMultiply node) => handleInvokeBinary(node, 'Multiply');
@@ -403,14 +401,13 @@
String visitShiftRight(HShiftRight node) =>
handleInvokeBinary(node, 'ShiftRight');
- String visitStatic(HStatic node)
- => "Static: ${node.element.name}";
+ String visitStatic(HStatic node) => "Static: ${node.element.name}";
- String visitLazyStatic(HLazyStatic node)
- => "LazyStatic: ${node.element.name}";
+ String visitLazyStatic(HLazyStatic node) =>
+ "LazyStatic: ${node.element.name}";
- String visitOneShotInterceptor(HOneShotInterceptor node)
- => handleInvokeDynamic(node, "OneShotInterceptor");
+ String visitOneShotInterceptor(HOneShotInterceptor node) =>
+ handleInvokeDynamic(node, "OneShotInterceptor");
String visitStaticStore(HStaticStore node) {
String lhs = node.element.name;
@@ -490,11 +487,10 @@
String visitTypeConversion(HTypeConversion node) {
assert(node.inputs.length <= 2);
- String otherInput = (node.inputs.length == 2)
- ? temporaryId(node.inputs[1])
- : '';
+ String otherInput =
+ (node.inputs.length == 2) ? temporaryId(node.inputs[1]) : '';
return "TypeConversion: ${temporaryId(node.checkedInput)} to "
- "${node.instructionType} $otherInput";
+ "${node.instructionType} $otherInput";
}
String visitTypeKnown(HTypeKnown node) {
diff --git a/pkg/compiler/lib/src/ssa/types.dart b/pkg/compiler/lib/src/ssa/types.dart
index 8119cf2..2a7ecff 100644
--- a/pkg/compiler/lib/src/ssa/types.dart
+++ b/pkg/compiler/lib/src/ssa/types.dart
@@ -22,33 +22,29 @@
static TypeMask inferredReturnTypeForElement(
Element element, Compiler compiler) {
return fromInferredType(
- compiler.typesTask.getGuaranteedReturnTypeOfElement(element),
- compiler);
+ compiler.typesTask.getGuaranteedReturnTypeOfElement(element), compiler);
}
static TypeMask inferredTypeForElement(Element element, Compiler compiler) {
return fromInferredType(
- compiler.typesTask.getGuaranteedTypeOfElement(element),
- compiler);
+ compiler.typesTask.getGuaranteedTypeOfElement(element), compiler);
}
- static TypeMask inferredTypeForSelector(Selector selector,
- TypeMask mask,
- Compiler compiler) {
+ static TypeMask inferredTypeForSelector(
+ Selector selector, TypeMask mask, Compiler compiler) {
return fromInferredType(
compiler.typesTask.getGuaranteedTypeOfSelector(selector, mask),
compiler);
}
- static TypeMask inferredForNode(Element owner, ast.Node node,
- Compiler compiler) {
+ static TypeMask inferredForNode(
+ Element owner, ast.Node node, Compiler compiler) {
return fromInferredType(
- compiler.typesTask.getGuaranteedTypeOfNode(owner, node),
- compiler);
+ compiler.typesTask.getGuaranteedTypeOfNode(owner, node), compiler);
}
- static TypeMask fromNativeBehavior(native.NativeBehavior nativeBehavior,
- Compiler compiler) {
+ static TypeMask fromNativeBehavior(
+ native.NativeBehavior nativeBehavior, Compiler compiler) {
ClassWorld classWorld = compiler.world;
JavaScriptBackend backend = compiler.backend;
if (nativeBehavior.typesReturned.isEmpty) return backend.dynamicType;
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index 49373dc..e5ad513 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -98,7 +98,6 @@
} while (!worklist.isEmpty);
}
-
void addToWorkList(HInstruction instruction) {
final int id = instruction.id;
@@ -175,12 +174,12 @@
// We must make sure a type conversion for receiver or argument check
// does not try to do an int check, because an int check is not enough.
// We only do an int check if the input is integer or null.
- if (checkedType.containsOnlyNum(classWorld)
- && !checkedType.containsOnlyDouble(classWorld)
- && input.isIntegerOrNull(compiler)) {
+ if (checkedType.containsOnlyNum(classWorld) &&
+ !checkedType.containsOnlyDouble(classWorld) &&
+ input.isIntegerOrNull(compiler)) {
instruction.checkedType = backend.intType;
- } else if (checkedType.containsOnlyInt(classWorld)
- && !input.isIntegerOrNull(compiler)) {
+ } else if (checkedType.containsOnlyInt(classWorld) &&
+ !input.isIntegerOrNull(compiler)) {
instruction.checkedType = backend.numType;
}
}
@@ -192,8 +191,8 @@
// can be a literal double '8.0' that is marked as an integer (because 'is
// int' will return 'true'). What we really need to do is make the
// overlap between int and double values explicit in the TypeMask system.
- if (inputType.containsOnlyInt(classWorld)
- && checkedType.containsOnlyDouble(classWorld)) {
+ if (inputType.containsOnlyInt(classWorld) &&
+ checkedType.containsOnlyDouble(classWorld)) {
if (inputType.isNullable && checkedType.isNullable) {
outputType = backend.doubleType.nullable();
} else {
@@ -218,22 +217,19 @@
return outputType;
}
- void convertInput(HInvokeDynamic instruction,
- HInstruction input,
- TypeMask type,
- int kind) {
+ void convertInput(
+ HInvokeDynamic instruction, HInstruction input, TypeMask type, int kind) {
Selector selector = (kind == HTypeConversion.RECEIVER_TYPE_CHECK)
? instruction.selector
: null;
- HTypeConversion converted = new HTypeConversion(
- null, kind, type, input, selector)
- ..sourceInformation = instruction.sourceInformation;
+ HTypeConversion converted =
+ new HTypeConversion(null, kind, type, input, selector)
+ ..sourceInformation = instruction.sourceInformation;
instruction.block.addBefore(instruction, converted);
input.replaceAllUsersDominatedBy(instruction, converted);
}
- bool isCheckEnoughForNsmOrAe(HInstruction instruction,
- TypeMask type) {
+ bool isCheckEnoughForNsmOrAe(HInstruction instruction, TypeMask type) {
// In some cases, we want the receiver to be an integer,
// but that does not mean we will get a NoSuchMethodError
// if it's not: the receiver could be a double.
@@ -254,20 +250,20 @@
HInstruction receiver = instruction.inputs[1];
if (receiver.isNumber(compiler)) return false;
if (receiver.isNumberOrNull(compiler)) {
- convertInput(instruction,
- receiver,
- receiver.instructionType.nonNullable(),
- HTypeConversion.RECEIVER_TYPE_CHECK);
+ convertInput(
+ instruction,
+ receiver,
+ receiver.instructionType.nonNullable(),
+ HTypeConversion.RECEIVER_TYPE_CHECK);
return true;
} else if (instruction.element == null) {
- Iterable<Element> targets =
- compiler.world.allFunctions.filter(
- instruction.selector, instruction.mask);
+ Iterable<Element> targets = compiler.world.allFunctions
+ .filter(instruction.selector, instruction.mask);
if (targets.length == 1) {
Element target = targets.first;
ClassElement cls = target.enclosingClass;
- TypeMask type = new TypeMask.nonNullSubclass(
- cls.declaration, classWorld);
+ TypeMask type =
+ new TypeMask.nonNullSubclass(cls.declaration, classWorld);
// TODO(ngeoffray): We currently only optimize on primitive
// types.
if (!type.satisfies(backend.helpers.jsIndexableClass, classWorld) &&
@@ -277,10 +273,8 @@
}
if (!isCheckEnoughForNsmOrAe(receiver, type)) return false;
instruction.element = target;
- convertInput(instruction,
- receiver,
- type,
- HTypeConversion.RECEIVER_TYPE_CHECK);
+ convertInput(
+ instruction, receiver, type, HTypeConversion.RECEIVER_TYPE_CHECK);
return true;
}
}
@@ -306,10 +300,8 @@
// variant and will do the check in their method anyway. We
// still add a check because it allows to GVN these operations,
// but we should find a better way.
- convertInput(instruction,
- right,
- type,
- HTypeConversion.ARGUMENT_TYPE_CHECK);
+ convertInput(
+ instruction, right, type, HTypeConversion.ARGUMENT_TYPE_CHECK);
return true;
}
return false;
@@ -339,18 +331,19 @@
// We cannot do the following optimization now, because we have
// to wait for the type propagation to be stable. The receiver
// of [instruction] might move from number to dynamic.
- pendingOptimizations.putIfAbsent(instruction, () => () {
- Selector selector = instruction.selector;
- if (selector.isOperator && selector.name != '==') {
- if (checkReceiver(instruction)) {
- addAllUsersBut(instruction, instruction.inputs[1]);
- }
- if (!selector.isUnaryOperator &&
- checkArgument(instruction)) {
- addAllUsersBut(instruction, instruction.inputs[2]);
- }
- }
- });
+ pendingOptimizations.putIfAbsent(
+ instruction,
+ () => () {
+ Selector selector = instruction.selector;
+ if (selector.isOperator && selector.name != '==') {
+ if (checkReceiver(instruction)) {
+ addAllUsersBut(instruction, instruction.inputs[1]);
+ }
+ if (!selector.isUnaryOperator && checkArgument(instruction)) {
+ addAllUsersBut(instruction, instruction.inputs[2]);
+ }
+ }
+ });
}
HInstruction receiver = instruction.getDartReceiver(compiler);
@@ -358,10 +351,10 @@
instruction.mask = receiverType;
// Try to specialize the receiver after this call.
- if (receiver.dominatedUsers(instruction).length != 1
- && !instruction.selector.isClosureCall) {
- TypeMask newType = compiler.world.allFunctions.receiverType(
- instruction.selector, instruction.mask);
+ if (receiver.dominatedUsers(instruction).length != 1 &&
+ !instruction.selector.isClosureCall) {
+ TypeMask newType = compiler.world.allFunctions
+ .receiverType(instruction.selector, instruction.mask);
newType = newType.intersection(receiverType, classWorld);
var next = instruction.next;
if (next is HTypeKnown && next.checkedInput == receiver) {
@@ -385,7 +378,7 @@
}
}
- return instruction.specializer.computeTypeFromInputTypes(
- instruction, compiler);
+ return instruction.specializer
+ .computeTypeFromInputTypes(instruction, compiler);
}
}
diff --git a/pkg/compiler/lib/src/ssa/validate.dart b/pkg/compiler/lib/src/ssa/validate.dart
index 1c1e222..31e9125 100644
--- a/pkg/compiler/lib/src/ssa/validate.dart
+++ b/pkg/compiler/lib/src/ssa/validate.dart
@@ -22,22 +22,22 @@
// not required to be valid yet.
void visitBasicBlock(HBasicBlock block) {
currentBlock = block;
- if (!isValid) return; // Don't need to continue if we are already invalid.
+ if (!isValid) return; // Don't need to continue if we are already invalid.
// Test that the last instruction is a branching instruction and that the
// basic block contains the branch-target.
if (block.first == null || block.last == null) {
markInvalid("empty block");
}
- if (block.last is !HControlFlow) {
+ if (block.last is! HControlFlow) {
markInvalid("block ends with non-tail node.");
}
if (block.last is HIf && block.successors.length != 2) {
markInvalid("If node without two successors");
}
if (block.last is HConditionalBranch && block.successors.length != 2) {
- markInvalid("Conditional node without two successors");
- }
+ markInvalid("Conditional node without two successors");
+ }
if (block.last is HLoopBranch) {
// Assert that the block we inserted to avoid critical edges satisfies
// our assumptions. That is, it must not contain any instructions
@@ -56,7 +56,7 @@
if ((block.last is HReturn || block.last is HThrow) &&
(block.successors.length != 1 || !block.successors[0].isExitBlock())) {
markInvalid("Return or throw node with > 1 successor "
- "or not going to exit-block");
+ "or not going to exit-block");
}
if (block.last is HExit && !block.successors.isEmpty) {
markInvalid("Exit block with successor");
@@ -77,8 +77,10 @@
}
}
// Make sure we don't have a critical edge.
- if (isValid && block.successors.length > 1 &&
- block.last is! HTry && block.last is! HExitTry &&
+ if (isValid &&
+ block.successors.length > 1 &&
+ block.last is! HTry &&
+ block.last is! HExitTry &&
block.last is! HSwitch) {
for (HBasicBlock successor in block.successors) {
if (!isValid) break;
@@ -131,8 +133,8 @@
}
/** Returns how often [instruction] is contained in [instructions]. */
- static int countInstruction(List<HInstruction> instructions,
- HInstruction instruction) {
+ static int countInstruction(
+ List<HInstruction> instructions, HInstruction instruction) {
int result = 0;
for (int i = 0; i < instructions.length; i++) {
if (identical(instructions[i], instruction)) result++;
@@ -170,8 +172,8 @@
bool inBasicBlock = instruction.isInBasicBlock();
return everyInstruction(instruction.inputs, (input, count) {
if (inBasicBlock) {
- return input.isInBasicBlock()
- && countInstruction(input.usedBy, instruction) == count;
+ return input.isInBasicBlock() &&
+ countInstruction(input.usedBy, instruction) == count;
} else {
return countInstruction(input.usedBy, instruction) == 0;
}
@@ -182,8 +184,8 @@
bool hasCorrectUses() {
if (!instruction.isInBasicBlock()) return true;
return everyInstruction(instruction.usedBy, (use, count) {
- return use.isInBasicBlock()
- && countInstruction(use.inputs, instruction) == count;
+ return use.isInBasicBlock() &&
+ countInstruction(use.inputs, instruction) == count;
});
}
diff --git a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
index 22c127a..8893e90 100644
--- a/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
+++ b/pkg/compiler/lib/src/ssa/value_range_analyzer.dart
@@ -56,9 +56,8 @@
}
Range newMarkerRange() {
- return new Range(new MarkerValue(false, this),
- new MarkerValue(true, this),
- this);
+ return new Range(
+ new MarkerValue(false, this), new MarkerValue(true, this), this);
}
}
@@ -73,7 +72,7 @@
Value operator +(Value other) => const UnknownValue();
Value operator -(Value other) => const UnknownValue();
- Value operator -() => const UnknownValue();
+ Value operator -() => const UnknownValue();
Value operator &(Value other) => const UnknownValue();
Value min(Value other) {
@@ -138,7 +137,7 @@
Value operator +(other) {
if (other.isZero) return this;
- if (other is !IntValue) return other + this;
+ if (other is! IntValue) return other + this;
ConstantSystem constantSystem = info.constantSystem;
var constant = constantSystem.add.fold(
constantSystem.createInt(value), constantSystem.createInt(other.value));
@@ -148,7 +147,7 @@
Value operator -(other) {
if (other.isZero) return this;
- if (other is !IntValue) return -other + this;
+ if (other is! IntValue) return -other + this;
ConstantSystem constantSystem = info.constantSystem;
var constant = constantSystem.subtract.fold(
constantSystem.createInt(value), constantSystem.createInt(other.value));
@@ -159,14 +158,13 @@
Value operator -() {
if (isZero) return this;
ConstantSystem constantSystem = info.constantSystem;
- var constant = constantSystem.negate.fold(
- constantSystem.createInt(value));
+ var constant = constantSystem.negate.fold(constantSystem.createInt(value));
if (!constant.isInt) return const UnknownValue();
return info.newIntValue(constant.primitiveValue);
}
Value operator &(other) {
- if (other is !IntValue) return const UnknownValue();
+ if (other is! IntValue) return const UnknownValue();
ConstantSystem constantSystem = info.constantSystem;
var constant = constantSystem.bitAnd.fold(
constantSystem.createInt(value), constantSystem.createInt(other.value));
@@ -174,17 +172,17 @@
}
Value min(other) {
- if (other is !IntValue) return other.min(this);
+ if (other is! IntValue) return other.min(this);
return this.value < other.value ? this : other;
}
Value max(other) {
- if (other is !IntValue) return other.max(this);
+ if (other is! IntValue) return other.max(this);
return this.value < other.value ? other : this;
}
bool operator ==(other) {
- if (other is !IntValue) return false;
+ if (other is! IntValue) return false;
return this.value == other.value;
}
@@ -252,7 +250,7 @@
InstructionValue(this.instruction, info) : super(info);
bool operator ==(other) {
- if (other is !InstructionValue) return false;
+ if (other is! InstructionValue) return false;
return this.instruction == other.instruction;
}
@@ -319,9 +317,9 @@
AddValue(left, right, info) : super(left, right, info);
bool operator ==(other) {
- if (other is !AddValue) return false;
- return (left == other.left && right == other.right)
- || (left == other.right && right == other.left);
+ if (other is! AddValue) return false;
+ return (left == other.left && right == other.right) ||
+ (left == other.right && right == other.left);
}
int get hashCode => throw new UnsupportedError('AddValue.hashCode');
@@ -367,7 +365,7 @@
SubtractValue(left, right, info) : super(left, right, info);
bool operator ==(other) {
- if (other is !SubtractValue) return false;
+ if (other is! SubtractValue) return false;
return left == other.left && right == other.right;
}
@@ -415,7 +413,7 @@
NegateValue(this.value, info) : super(info);
bool operator ==(other) {
- if (other is !NegateValue) return false;
+ if (other is! NegateValue) return false;
return value == other.value;
}
@@ -481,10 +479,9 @@
* Checks if the given values are unknown, and creates a
* range that does not have any unknown values.
*/
- Range.normalize(Value low, Value up, info) : this(
- low == const UnknownValue() ? const MinIntValue() : low,
- up == const UnknownValue() ? const MaxIntValue() : up,
- info);
+ Range.normalize(Value low, Value up, info)
+ : this(low == const UnknownValue() ? const MinIntValue() : low,
+ up == const UnknownValue() ? const MaxIntValue() : up, info);
Range union(Range other) {
return info.newNormalizedRange(
@@ -497,14 +494,20 @@
// If we could not compute max or min, pick a value in the two
// ranges, with priority to [IntValue]s because they are simpler.
if (low == const UnknownValue()) {
- if (lower is IntValue) low = lower;
- else if (other.lower is IntValue) low = other.lower;
- else low = lower;
+ if (lower is IntValue)
+ low = lower;
+ else if (other.lower is IntValue)
+ low = other.lower;
+ else
+ low = lower;
}
if (up == const UnknownValue()) {
- if (upper is IntValue) up = upper;
- else if (other.upper is IntValue) up = other.upper;
- else up = upper;
+ if (upper is IntValue)
+ up = upper;
+ else if (other.upper is IntValue)
+ up = other.upper;
+ else
+ up = upper;
}
return info.newNormalizedRange(low, up);
}
@@ -522,10 +525,10 @@
}
Range operator &(Range other) {
- if (isSingleValue
- && other.isSingleValue
- && lower is IntValue
- && other.lower is IntValue) {
+ if (isSingleValue &&
+ other.isSingleValue &&
+ lower is IntValue &&
+ other.lower is IntValue) {
return info.newNormalizedRange(lower & other.lower, upper & other.upper);
}
if (isPositive && other.isPositive) {
@@ -607,10 +610,8 @@
CodegenWorkItem work;
HGraph graph;
- SsaValueRangeAnalyzer(this.compiler,
- constantSystem,
- this.optimizer,
- this.work)
+ SsaValueRangeAnalyzer(
+ this.compiler, constantSystem, this.optimizer, this.work)
: info = new ValueRangeInfo(constantSystem),
this.constantSystem = constantSystem;
@@ -633,7 +634,6 @@
}
void visitBasicBlock(HBasicBlock block) {
-
void visit(HInstruction instruction) {
Range range = instruction.accept(this);
if (instruction.isInteger(compiler)) {
@@ -732,14 +732,14 @@
// Check if the index is strictly below the upper bound of the length
// range.
Value maxIndex = lengthRange.upper - info.intOne;
- bool belowLength = maxIndex != const MaxIntValue()
- && indexRange.upper.min(maxIndex) == indexRange.upper;
+ bool belowLength = maxIndex != const MaxIntValue() &&
+ indexRange.upper.min(maxIndex) == indexRange.upper;
// Check if the index is strictly below the lower bound of the length
// range.
- belowLength = belowLength
- || (indexRange.upper != lengthRange.lower
- && indexRange.upper.min(lengthRange.lower) == indexRange.upper);
+ belowLength = belowLength ||
+ (indexRange.upper != lengthRange.lower &&
+ indexRange.upper.min(lengthRange.lower) == indexRange.upper);
if (indexRange.isPositive && belowLength) {
check.block.rewrite(check, check.index);
check.block.remove(check);
@@ -759,16 +759,15 @@
// greater or equal than the lower bound of the index.
Value low = lengthRange.lower.max(indexRange.lower);
if (low != const UnknownValue()) {
- HInstruction instruction =
- createRangeConversion(next, check.length);
+ HInstruction instruction = createRangeConversion(next, check.length);
ranges[instruction] = info.newNormalizedRange(low, lengthRange.upper);
}
}
// Update the range of the index if using the maximum index
// narrows it. Use that new range for this instruction as well.
- Range newIndexRange = indexRange.intersection(
- info.newNormalizedRange(info.intZero, maxIndex));
+ Range newIndexRange = indexRange
+ .intersection(info.newNormalizedRange(info.intZero, maxIndex));
if (indexRange == newIndexRange) return indexRange;
// Explicitly attach the range information to the index instruction,
// which may be used by other instructions. Returning the new range will
@@ -790,12 +789,12 @@
if (relational is HIdentity) {
handleEqualityCheck(relational);
} else if (operation.apply(leftRange, rightRange)) {
- relational.block.rewrite(
- relational, graph.addConstantBool(true, compiler));
+ relational.block
+ .rewrite(relational, graph.addConstantBool(true, compiler));
relational.block.remove(relational);
} else if (negateOperation(operation).apply(leftRange, rightRange)) {
- relational.block.rewrite(
- relational, graph.addConstantBool(false, compiler));
+ relational.block
+ .rewrite(relational, graph.addConstantBool(false, compiler));
relational.block.remove(relational);
}
return info.newUnboundRange();
@@ -805,8 +804,7 @@
Range right = ranges[node.right];
Range left = ranges[node.left];
if (left.isSingleValue && right.isSingleValue && left == right) {
- node.block.rewrite(
- node, graph.addConstantBool(true, compiler));
+ node.block.rewrite(node, graph.addConstantBool(true, compiler));
node.block.remove(node);
}
}
@@ -820,18 +818,18 @@
// so special case those.
if (left.isInteger(compiler) && right.isInteger(compiler)) {
if (divisor.isPositive) {
- return info.newNormalizedRange(info.intZero, divisor.upper -
- info.intOne);
+ return info.newNormalizedRange(
+ info.intZero, divisor.upper - info.intOne);
} else if (divisor.isNegative) {
- return info.newNormalizedRange(info.intZero, info.newNegateValue(
- divisor.lower) - info.intOne);
+ return info.newNormalizedRange(
+ info.intZero, info.newNegateValue(divisor.lower) - info.intOne);
}
} else if (left.isNumber(compiler) && right.isNumber(compiler)) {
if (divisor.isPositive) {
return info.newNormalizedRange(info.intZero, divisor.upper);
} else if (divisor.isNegative) {
- return info.newNormalizedRange(info.intZero, info.newNegateValue(
- divisor.lower));
+ return info.newNormalizedRange(
+ info.intZero, info.newNegateValue(divisor.lower));
}
}
}
@@ -846,8 +844,9 @@
Range handleBinaryOperation(HBinaryArithmetic instruction) {
if (!instruction.isInteger(compiler)) return info.newUnboundRange();
- return instruction.operation(constantSystem).apply(
- ranges[instruction.left], ranges[instruction.right]);
+ return instruction
+ .operation(constantSystem)
+ .apply(ranges[instruction.left], ranges[instruction.right]);
}
Range visitAdd(HAdd add) {
@@ -891,8 +890,8 @@
return ranges[instruction.checkedInput];
}
- HInstruction createRangeConversion(HInstruction cursor,
- HInstruction instruction) {
+ HInstruction createRangeConversion(
+ HInstruction cursor, HInstruction instruction) {
JavaScriptBackend backend = compiler.backend;
HRangeConversion newInstruction =
new HRangeConversion(instruction, backend.intType);
@@ -932,9 +931,8 @@
}
}
- Range computeConstrainedRange(BinaryOperation operation,
- Range leftRange,
- Range rightRange) {
+ Range computeConstrainedRange(
+ BinaryOperation operation, Range leftRange, Range rightRange) {
Range range;
if (operation == const LessOperation()) {
range = info.newNormalizedRange(
@@ -955,7 +953,7 @@
Range visitConditionalBranch(HConditionalBranch branch) {
var condition = branch.condition;
// TODO(ngeoffray): Handle complex conditions.
- if (condition is !HRelational) return info.newUnboundRange();
+ if (condition is! HRelational) return info.newUnboundRange();
if (condition is HIdentity) return info.newUnboundRange();
HInstruction right = condition.right;
HInstruction left = condition.left;
diff --git a/pkg/compiler/lib/src/ssa/value_set.dart b/pkg/compiler/lib/src/ssa/value_set.dart
index 6d7acc2..c990014 100644
--- a/pkg/compiler/lib/src/ssa/value_set.dart
+++ b/pkg/compiler/lib/src/ssa/value_set.dart
@@ -6,7 +6,6 @@
import 'nodes.dart';
-
class ValueSet {
int size = 0;
List<HInstruction> table;
diff --git a/pkg/compiler/lib/src/ssa/variable_allocator.dart b/pkg/compiler/lib/src/ssa/variable_allocator.dart
index 280a047..2145d6d 100644
--- a/pkg/compiler/lib/src/ssa/variable_allocator.dart
+++ b/pkg/compiler/lib/src/ssa/variable_allocator.dart
@@ -115,8 +115,8 @@
final Map<HInstruction, LiveInterval> liveIntervals;
LiveEnvironment(this.liveIntervals, this.endId)
- : liveInstructions = new Map<HInstruction, int>(),
- loopMarkers = new Map<HBasicBlock, int>();
+ : liveInstructions = new Map<HInstruction, int>(),
+ loopMarkers = new Map<HBasicBlock, int>();
/**
* Remove an instruction from the liveIn set. This method also
@@ -124,8 +124,8 @@
* range: [id, / id contained in [liveInstructions] /].
*/
void remove(HInstruction instruction, int id) {
- LiveInterval interval = liveIntervals.putIfAbsent(
- instruction, () => new LiveInterval());
+ LiveInterval interval =
+ liveIntervals.putIfAbsent(instruction, () => new LiveInterval());
int lastId = liveInstructions[instruction];
// If [lastId] is null, then this instruction is not being used.
interval.add(new LiveRange(id, lastId == null ? id : lastId));
@@ -156,12 +156,14 @@
// else block have the same end id for an instruction that is
// being used in the join block and defined before the if/else.
if (existingId == endId) return;
- LiveInterval range = liveIntervals.putIfAbsent(
- instruction, () => new LiveInterval());
+ LiveInterval range =
+ liveIntervals.putIfAbsent(instruction, () => new LiveInterval());
range.add(new LiveRange(other.startId, existingId));
liveInstructions[instruction] = endId;
});
- other.loopMarkers.forEach((k, v) { loopMarkers[k] = v; });
+ other.loopMarkers.forEach((k, v) {
+ loopMarkers[k] = v;
+ });
}
void addLoopMarker(HBasicBlock header, int id) {
@@ -210,8 +212,8 @@
SsaLiveIntervalBuilder(
this.compiler, this.generateAtUseSite, this.controlFlowOperators)
- : liveInstructions = new Map<HBasicBlock, LiveEnvironment>(),
- liveIntervals = new Map<HInstruction, LiveInterval>();
+ : liveInstructions = new Map<HBasicBlock, LiveEnvironment>(),
+ liveIntervals = new Map<HInstruction, LiveInterval>();
DiagnosticReporter get reporter => compiler.reporter;
@@ -222,8 +224,8 @@
}
}
- void markInputsAsLiveInEnvironment(HInstruction instruction,
- LiveEnvironment environment) {
+ void markInputsAsLiveInEnvironment(
+ HInstruction instruction, LiveEnvironment environment) {
for (int i = 0, len = instruction.inputs.length; i < len; i++) {
markAsLiveInEnvironment(instruction.inputs[i], environment);
}
@@ -255,8 +257,8 @@
return checked;
}
- void markAsLiveInEnvironment(HInstruction instruction,
- LiveEnvironment environment) {
+ void markAsLiveInEnvironment(
+ HInstruction instruction, LiveEnvironment environment) {
if (generateAtUseSite.contains(instruction)) {
markInputsAsLiveInEnvironment(instruction, environment);
} else {
@@ -274,8 +276,8 @@
}
}
- void removeFromEnvironment(HInstruction instruction,
- LiveEnvironment environment) {
+ void removeFromEnvironment(
+ HInstruction instruction, LiveEnvironment environment) {
environment.remove(instruction, instructionId);
// Special case the HCheck instruction to have the same live
// interval as the instruction it is checking.
@@ -365,8 +367,8 @@
// Update all instructions that are liveIns in [header] to have a
// range that covers the loop.
env.liveInstructions.forEach((HInstruction instruction, int id) {
- LiveInterval range = env.liveIntervals.putIfAbsent(
- instruction, () => new LiveInterval());
+ LiveInterval range =
+ env.liveIntervals.putIfAbsent(instruction, () => new LiveInterval());
range.loopUpdate(env.startId, lastId);
env.liveInstructions[instruction] = lastId;
});
@@ -380,7 +382,9 @@
other.liveInstructions[instruction] = id;
});
other.removeLoopMarker(header);
- env.loopMarkers.forEach((k, v) { other.loopMarkers[k] = v; });
+ env.loopMarkers.forEach((k, v) {
+ other.loopMarkers[k] = v;
+ });
}
});
}
@@ -415,8 +419,8 @@
final List<Copy> assignments;
CopyHandler()
- : copies = new List<Copy>(),
- assignments = new List<Copy>();
+ : copies = new List<Copy>(),
+ assignments = new List<Copy>();
void addCopy(HInstruction source, HInstruction destination) {
copies.add(new Copy(source, destination));
@@ -453,10 +457,10 @@
}
VariableNames()
- : ownName = new Map<HInstruction, String>(),
- copyHandlers = new Map<HBasicBlock, CopyHandler>(),
- allUsedNames = new Set<String>(),
- swapTemp = 't0';
+ : ownName = new Map<HInstruction, String>(),
+ copyHandlers = new Map<HBasicBlock, CopyHandler>(),
+ allUsedNames = new Set<String>(),
+ swapTemp = 't0';
int get numberOfVariables => allUsedNames.length;
@@ -498,11 +502,9 @@
int temporaryIndex = 0;
static final RegExp regexp = new RegExp('t[0-9]+');
- VariableNamer(LiveEnvironment environment,
- this.names,
- this.compiler)
- : usedNames = new Set<String>(),
- freeTemporaryNames = new List<String>() {
+ VariableNamer(LiveEnvironment environment, this.names, this.compiler)
+ : usedNames = new Set<String>(),
+ freeTemporaryNames = new List<String>() {
// [VariableNames.swapTemp] is used when there is a cycle in a copy handler.
// Therefore we make sure no one uses it.
usedNames.add(names.swapTemp);
@@ -614,7 +616,6 @@
* it adds a copy to the CopyHandler of the corresponding predecessor.
*/
class SsaVariableAllocator extends HBaseVisitor {
-
final Compiler compiler;
final Map<HBasicBlock, LiveEnvironment> liveInstructions;
final Map<HInstruction, LiveInterval> liveIntervals;
@@ -622,19 +623,17 @@
final VariableNames names;
- SsaVariableAllocator(this.compiler,
- this.liveInstructions,
- this.liveIntervals,
- this.generateAtUseSite)
- : this.names = new VariableNames();
+ SsaVariableAllocator(this.compiler, this.liveInstructions, this.liveIntervals,
+ this.generateAtUseSite)
+ : this.names = new VariableNames();
void visitGraph(HGraph graph) {
visitDominatorTree(graph);
}
void visitBasicBlock(HBasicBlock block) {
- VariableNamer namer = new VariableNamer(
- liveInstructions[block], names, compiler);
+ VariableNamer namer =
+ new VariableNamer(liveInstructions[block], names, compiler);
block.forEachPhi((HPhi phi) {
handlePhi(phi, namer);
@@ -667,9 +666,8 @@
return instructionInterval.diesAt(start);
}
- void freeUsedNamesAt(HInstruction instruction,
- HInstruction at,
- VariableNamer namer) {
+ void freeUsedNamesAt(
+ HInstruction instruction, HInstruction at, VariableNamer namer) {
if (needsName(instruction)) {
if (diesAt(instruction, at)) {
namer.freeName(instruction);
diff --git a/pkg/compiler/lib/src/string_validator.dart b/pkg/compiler/lib/src/string_validator.dart
index 60f31dc..70a90b9 100644
--- a/pkg/compiler/lib/src/string_validator.dart
+++ b/pkg/compiler/lib/src/string_validator.dart
@@ -19,18 +19,15 @@
StringValidator(this.reporter);
DartString validateInterpolationPart(Token token, StringQuoting quoting,
- {bool isFirst: false,
- bool isLast: false}) {
+ {bool isFirst: false, bool isLast: false}) {
String source = token.value;
int leftQuote = 0;
int rightQuote = 0;
if (isFirst) leftQuote = quoting.leftQuoteLength;
if (isLast) rightQuote = quoting.rightQuoteLength;
String content = copyWithoutQuotes(source, leftQuote, rightQuote);
- return validateString(token,
- token.charOffset + leftQuote,
- content,
- quoting);
+ return validateString(
+ token, token.charOffset + leftQuote, content, quoting);
}
static StringQuoting quotingFromString(String sourceString) {
@@ -50,7 +47,7 @@
// and end after the second quote.
if (source.moveNext() && source.current == quoteChar && source.moveNext()) {
int code = source.current;
- assert(code == quoteChar); // If not, there is a bug in the parser.
+ assert(code == quoteChar); // If not, there is a bug in the parser.
leftQuoteLength = 3;
// Check if a multiline string starts with optional whitespace followed by
@@ -109,10 +106,8 @@
* Validates the escape sequences and special characters of a string literal.
* Returns a DartString if valid, and null if not.
*/
- DartString validateString(Token token,
- int startOffset,
- String string,
- StringQuoting quoting) {
+ DartString validateString(
+ Token token, int startOffset, String string, StringQuoting quoting) {
// We need to check for invalid x and u escapes, for line
// terminators in non-multiline strings, and for invalid Unicode
// scalar values (either directly or as u-escape values). We also check
@@ -123,7 +118,7 @@
bool previousWasLeadSurrogate = false;
bool invalidUtf16 = false;
var stringIter = string.codeUnits.iterator;
- for(HasNextIterator<int> iter = new HasNextIterator(stringIter);
+ for (HasNextIterator<int> iter = new HasNextIterator(stringIter);
iter.hasNext;
length++) {
index++;
@@ -132,7 +127,7 @@
if (quoting.raw) continue;
containsEscape = true;
if (!iter.hasNext) {
- stringParseError("Incomplete escape sequence",token, index);
+ stringParseError("Incomplete escape sequence", token, index);
return null;
}
index++;
@@ -146,8 +141,8 @@
index++;
code = iter.next();
if (!isHexDigit(code)) {
- stringParseError("Invalid character in escape sequence",
- token, index);
+ stringParseError(
+ "Invalid character in escape sequence", token, index);
return null;
}
}
@@ -167,8 +162,8 @@
break;
}
if (!isHexDigit(code)) {
- stringParseError("Invalid character in escape sequence",
- token, index);
+ stringParseError(
+ "Invalid character in escape sequence", token, index);
return null;
}
count++;
@@ -177,8 +172,8 @@
if (code != $CLOSE_CURLY_BRACKET || count == 0 || count > 6) {
int errorPosition = index - count;
if (count > 6) errorPosition += 6;
- stringParseError("Invalid character in escape sequence",
- token, errorPosition);
+ stringParseError(
+ "Invalid character in escape sequence", token, errorPosition);
return null;
}
} else {
@@ -193,8 +188,8 @@
}
}
if (!isHexDigit(code)) {
- stringParseError("Invalid character in escape sequence",
- token, index);
+ stringParseError(
+ "Invalid character in escape sequence", token, index);
return null;
}
value = value * 16 + hexDigitValue(code);
diff --git a/pkg/compiler/lib/src/tokens/keyword.dart b/pkg/compiler/lib/src/tokens/keyword.dart
index ce1bc87..ad22ee6 100644
--- a/pkg/compiler/lib/src/tokens/keyword.dart
+++ b/pkg/compiler/lib/src/tokens/keyword.dart
@@ -4,85 +4,82 @@
library dart2js.tokens.keywords;
-import '../util/characters.dart' as Characters show
- $a;
+import '../util/characters.dart' as Characters show $a;
-import 'precedence.dart' show
- PrecedenceInfo;
-import 'precedence_constants.dart' as Precedence show
- AS_INFO,
- IS_INFO,
- KEYWORD_INFO;
+import 'precedence.dart' show PrecedenceInfo;
+import 'precedence_constants.dart' as Precedence
+ show AS_INFO, IS_INFO, KEYWORD_INFO;
/**
* A keyword in the Dart programming language.
*/
class Keyword {
- static const List<Keyword> values = const <Keyword> [
- const Keyword("assert"),
- const Keyword("break"),
- const Keyword("case"),
- const Keyword("catch"),
- const Keyword("class"),
- const Keyword("const"),
- const Keyword("continue"),
- const Keyword("default"),
- const Keyword("do"),
- const Keyword("else"),
- const Keyword("enum"),
- const Keyword("extends"),
- const Keyword("false"),
- const Keyword("final"),
- const Keyword("finally"),
- const Keyword("for"),
- const Keyword("if"),
- const Keyword("in"),
- const Keyword("new"),
- const Keyword("null"),
- const Keyword("rethrow"),
- const Keyword("return"),
- const Keyword("super"),
- const Keyword("switch"),
- const Keyword("this"),
- const Keyword("throw"),
- const Keyword("true"),
- const Keyword("try"),
- const Keyword("var"),
- const Keyword("void"),
- const Keyword("while"),
- const Keyword("with"),
+ static const List<Keyword> values = const <Keyword>[
+ const Keyword("assert"),
+ const Keyword("break"),
+ const Keyword("case"),
+ const Keyword("catch"),
+ const Keyword("class"),
+ const Keyword("const"),
+ const Keyword("continue"),
+ const Keyword("default"),
+ const Keyword("do"),
+ const Keyword("else"),
+ const Keyword("enum"),
+ const Keyword("extends"),
+ const Keyword("false"),
+ const Keyword("final"),
+ const Keyword("finally"),
+ const Keyword("for"),
+ const Keyword("if"),
+ const Keyword("in"),
+ const Keyword("new"),
+ const Keyword("null"),
+ const Keyword("rethrow"),
+ const Keyword("return"),
+ const Keyword("super"),
+ const Keyword("switch"),
+ const Keyword("this"),
+ const Keyword("throw"),
+ const Keyword("true"),
+ const Keyword("try"),
+ const Keyword("var"),
+ const Keyword("void"),
+ const Keyword("while"),
+ const Keyword("with"),
- // TODO(ahe): Don't think this is a reserved word.
- // See: http://dartbug.com/5579
- const Keyword("is", info: Precedence.IS_INFO),
+ // TODO(ahe): Don't think this is a reserved word.
+ // See: http://dartbug.com/5579
+ const Keyword("is", info: Precedence.IS_INFO),
- const Keyword("abstract", isBuiltIn: true),
- const Keyword("as", info: Precedence.AS_INFO, isBuiltIn: true),
- const Keyword("dynamic", isBuiltIn: true),
- const Keyword("export", isBuiltIn: true),
- const Keyword("external", isBuiltIn: true),
- const Keyword("factory", isBuiltIn: true),
- const Keyword("get", isBuiltIn: true),
- const Keyword("implements", isBuiltIn: true),
- const Keyword("import", isBuiltIn: true),
- const Keyword("library", isBuiltIn: true),
- const Keyword("operator", isBuiltIn: true),
- const Keyword("part", isBuiltIn: true),
- const Keyword("set", isBuiltIn: true),
- const Keyword("static", isBuiltIn: true),
- const Keyword("typedef", isBuiltIn: true),
+ const Keyword("abstract", isBuiltIn: true),
+ const Keyword("as", info: Precedence.AS_INFO, isBuiltIn: true),
+ const Keyword("dynamic", isBuiltIn: true),
+ const Keyword("export", isBuiltIn: true),
+ const Keyword("external", isBuiltIn: true),
+ const Keyword("factory", isBuiltIn: true),
+ const Keyword("get", isBuiltIn: true),
+ const Keyword("implements", isBuiltIn: true),
+ const Keyword("import", isBuiltIn: true),
+ const Keyword("library", isBuiltIn: true),
+ const Keyword("operator", isBuiltIn: true),
+ const Keyword("part", isBuiltIn: true),
+ const Keyword("set", isBuiltIn: true),
+ const Keyword("static", isBuiltIn: true),
+ const Keyword("typedef", isBuiltIn: true),
- const Keyword("hide", isPseudo: true),
- const Keyword("native", isPseudo: true),
- const Keyword("of", isPseudo: true),
- const Keyword("on", isPseudo: true),
- const Keyword("show", isPseudo: true),
- const Keyword("source", isPseudo: true),
- const Keyword("deferred", isPseudo: true),
- const Keyword("async", isPseudo: true),
- const Keyword("sync", isPseudo: true),
- const Keyword("await", isPseudo: true),
- const Keyword("yield", isPseudo: true)];
+ const Keyword("hide", isPseudo: true),
+ const Keyword("native", isPseudo: true),
+ const Keyword("of", isPseudo: true),
+ const Keyword("on", isPseudo: true),
+ const Keyword("show", isPseudo: true),
+ const Keyword("source", isPseudo: true),
+ const Keyword("deferred", isPseudo: true),
+ const Keyword("async", isPseudo: true),
+ const Keyword("sync", isPseudo: true),
+ const Keyword("await", isPseudo: true),
+ const Keyword("yield", isPseudo: true)
+ ];
final String syntax;
final bool isPseudo;
@@ -98,9 +95,9 @@
}
const Keyword(this.syntax,
- {this.isPseudo: false,
- this.isBuiltIn: false,
- this.info: Precedence.KEYWORD_INFO});
+ {this.isPseudo: false,
+ this.isBuiltIn: false,
+ this.info: Precedence.KEYWORD_INFO});
static Map<String, Keyword> computeKeywordMap() {
Map<String, Keyword> result = new Map<String, Keyword>();
@@ -125,19 +122,18 @@
static KeywordState _KEYWORD_STATE;
static KeywordState get KEYWORD_STATE {
if (_KEYWORD_STATE == null) {
- List<String> strings =
- new List<String>(Keyword.values.length);
+ List<String> strings = new List<String>(Keyword.values.length);
for (int i = 0; i < Keyword.values.length; i++) {
strings[i] = Keyword.values[i].syntax;
}
- strings.sort((a,b) => a.compareTo(b));
+ strings.sort((a, b) => a.compareTo(b));
_KEYWORD_STATE = computeKeywordStateTable(0, strings, 0, strings.length);
}
return _KEYWORD_STATE;
}
- static KeywordState computeKeywordStateTable(int start, List<String> strings,
- int offset, int length) {
+ static KeywordState computeKeywordStateTable(
+ int start, List<String> strings, int offset, int length) {
List<KeywordState> result = new List<KeywordState>(26);
assert(length != 0);
int chunk = 0;
@@ -152,9 +148,8 @@
if (chunk != c) {
if (chunkStart != -1) {
assert(result[chunk - Characters.$a] == null);
- result[chunk - Characters.$a] =
- computeKeywordStateTable(
- start + 1, strings, chunkStart, i - chunkStart);
+ result[chunk - Characters.$a] = computeKeywordStateTable(
+ start + 1, strings, chunkStart, i - chunkStart);
}
chunkStart = i;
chunk = c;
@@ -163,9 +158,8 @@
}
if (chunkStart != -1) {
assert(result[chunk - Characters.$a] == null);
- result[chunk - Characters.$a] =
- computeKeywordStateTable(start + 1, strings, chunkStart,
- offset + length - chunkStart);
+ result[chunk - Characters.$a] = computeKeywordStateTable(
+ start + 1, strings, chunkStart, offset + length - chunkStart);
} else {
assert(length == 1);
return new LeafKeywordState(strings[offset]);
@@ -185,7 +179,7 @@
final List<KeywordState> table;
ArrayKeywordState(List<KeywordState> this.table, String syntax)
- : super((syntax == null) ? null : Keyword.keywords[syntax]);
+ : super((syntax == null) ? null : Keyword.keywords[syntax]);
KeywordState next(int c) => table[c - Characters.$a];
@@ -201,7 +195,7 @@
for (int i = 0; i < foo.length; i++) {
if (foo[i] != null) {
sb.write("${new String.fromCharCodes([i + Characters.$a])}: "
- "${foo[i]}; ");
+ "${foo[i]}; ");
}
}
sb.write("]");
diff --git a/pkg/compiler/lib/src/tokens/precedence.dart b/pkg/compiler/lib/src/tokens/precedence.dart
index 1183a0b..c3f4906 100644
--- a/pkg/compiler/lib/src/tokens/precedence.dart
+++ b/pkg/compiler/lib/src/tokens/precedence.dart
@@ -4,8 +4,7 @@
library dart2js.tokens.precedence;
-import '../util/util.dart' show
- computeHashCode;
+import '../util/util.dart' show computeHashCode;
class PrecedenceInfo {
final String value;
diff --git a/pkg/compiler/lib/src/tokens/precedence_constants.dart b/pkg/compiler/lib/src/tokens/precedence_constants.dart
index f2e44f2..08475ec 100644
--- a/pkg/compiler/lib/src/tokens/precedence_constants.dart
+++ b/pkg/compiler/lib/src/tokens/precedence_constants.dart
@@ -4,18 +4,16 @@
library dart2js.tokens.precedence.constants;
-import 'precedence.dart' show
- PrecedenceInfo;
+import 'precedence.dart' show PrecedenceInfo;
import 'token_constants.dart';
// TODO(ahe): The following are not tokens in Dart.
const PrecedenceInfo BACKPING_INFO =
- const PrecedenceInfo('`', 0, BACKPING_TOKEN);
+ const PrecedenceInfo('`', 0, BACKPING_TOKEN);
const PrecedenceInfo BACKSLASH_INFO =
- const PrecedenceInfo('\\', 0, BACKSLASH_TOKEN);
+ const PrecedenceInfo('\\', 0, BACKSLASH_TOKEN);
const PrecedenceInfo PERIOD_PERIOD_PERIOD_INFO =
- const PrecedenceInfo('...', 0,
- PERIOD_PERIOD_PERIOD_TOKEN);
+ const PrecedenceInfo('...', 0, PERIOD_PERIOD_PERIOD_TOKEN);
/**
* The cascade operator has the lowest precedence of any operator
@@ -23,219 +21,169 @@
*/
const int CASCADE_PRECEDENCE = 2;
const PrecedenceInfo PERIOD_PERIOD_INFO =
- const PrecedenceInfo('..', CASCADE_PRECEDENCE,
- PERIOD_PERIOD_TOKEN);
+ const PrecedenceInfo('..', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN);
-const PrecedenceInfo BANG_INFO =
- const PrecedenceInfo('!', 0, BANG_TOKEN);
-const PrecedenceInfo COLON_INFO =
- const PrecedenceInfo(':', 0, COLON_TOKEN);
-const PrecedenceInfo INDEX_INFO =
- const PrecedenceInfo('[]', 0, INDEX_TOKEN);
+const PrecedenceInfo BANG_INFO = const PrecedenceInfo('!', 0, BANG_TOKEN);
+const PrecedenceInfo COLON_INFO = const PrecedenceInfo(':', 0, COLON_TOKEN);
+const PrecedenceInfo INDEX_INFO = const PrecedenceInfo('[]', 0, INDEX_TOKEN);
const PrecedenceInfo MINUS_MINUS_INFO =
- const PrecedenceInfo('--', POSTFIX_PRECEDENCE,
- MINUS_MINUS_TOKEN);
+ const PrecedenceInfo('--', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN);
const PrecedenceInfo PLUS_PLUS_INFO =
- const PrecedenceInfo('++', POSTFIX_PRECEDENCE,
- PLUS_PLUS_TOKEN);
-const PrecedenceInfo TILDE_INFO =
- const PrecedenceInfo('~', 0, TILDE_TOKEN);
+ const PrecedenceInfo('++', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN);
+const PrecedenceInfo TILDE_INFO = const PrecedenceInfo('~', 0, TILDE_TOKEN);
const PrecedenceInfo FUNCTION_INFO =
- const PrecedenceInfo('=>', 0, FUNCTION_TOKEN);
-const PrecedenceInfo HASH_INFO =
- const PrecedenceInfo('#', 0, HASH_TOKEN);
+ const PrecedenceInfo('=>', 0, FUNCTION_TOKEN);
+const PrecedenceInfo HASH_INFO = const PrecedenceInfo('#', 0, HASH_TOKEN);
const PrecedenceInfo INDEX_EQ_INFO =
- const PrecedenceInfo('[]=', 0, INDEX_EQ_TOKEN);
+ const PrecedenceInfo('[]=', 0, INDEX_EQ_TOKEN);
const PrecedenceInfo SEMICOLON_INFO =
- const PrecedenceInfo(';', 0, SEMICOLON_TOKEN);
-const PrecedenceInfo COMMA_INFO =
- const PrecedenceInfo(',', 0, COMMA_TOKEN);
+ const PrecedenceInfo(';', 0, SEMICOLON_TOKEN);
+const PrecedenceInfo COMMA_INFO = const PrecedenceInfo(',', 0, COMMA_TOKEN);
-const PrecedenceInfo AT_INFO =
- const PrecedenceInfo('@', 0, AT_TOKEN);
+const PrecedenceInfo AT_INFO = const PrecedenceInfo('@', 0, AT_TOKEN);
// Assignment operators.
const int ASSIGNMENT_PRECEDENCE = 1;
const PrecedenceInfo AMPERSAND_EQ_INFO =
- const PrecedenceInfo('&=',
- ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN);
+ const PrecedenceInfo('&=', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN);
const PrecedenceInfo BAR_EQ_INFO =
- const PrecedenceInfo('|=',
- ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN);
+ const PrecedenceInfo('|=', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN);
const PrecedenceInfo CARET_EQ_INFO =
- const PrecedenceInfo('^=',
- ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN);
+ const PrecedenceInfo('^=', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN);
const PrecedenceInfo EQ_INFO =
- const PrecedenceInfo('=',
- ASSIGNMENT_PRECEDENCE, EQ_TOKEN);
+ const PrecedenceInfo('=', ASSIGNMENT_PRECEDENCE, EQ_TOKEN);
const PrecedenceInfo GT_GT_EQ_INFO =
- const PrecedenceInfo('>>=',
- ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN);
+ const PrecedenceInfo('>>=', ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN);
const PrecedenceInfo LT_LT_EQ_INFO =
- const PrecedenceInfo('<<=',
- ASSIGNMENT_PRECEDENCE, LT_LT_EQ_TOKEN);
+ const PrecedenceInfo('<<=', ASSIGNMENT_PRECEDENCE, LT_LT_EQ_TOKEN);
const PrecedenceInfo MINUS_EQ_INFO =
- const PrecedenceInfo('-=',
- ASSIGNMENT_PRECEDENCE, MINUS_EQ_TOKEN);
+ const PrecedenceInfo('-=', ASSIGNMENT_PRECEDENCE, MINUS_EQ_TOKEN);
const PrecedenceInfo PERCENT_EQ_INFO =
- const PrecedenceInfo('%=',
- ASSIGNMENT_PRECEDENCE, PERCENT_EQ_TOKEN);
+ const PrecedenceInfo('%=', ASSIGNMENT_PRECEDENCE, PERCENT_EQ_TOKEN);
const PrecedenceInfo PLUS_EQ_INFO =
- const PrecedenceInfo('+=',
- ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN);
+ const PrecedenceInfo('+=', ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN);
const PrecedenceInfo SLASH_EQ_INFO =
- const PrecedenceInfo('/=',
- ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN);
+ const PrecedenceInfo('/=', ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN);
const PrecedenceInfo STAR_EQ_INFO =
- const PrecedenceInfo('*=',
- ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN);
+ const PrecedenceInfo('*=', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN);
const PrecedenceInfo TILDE_SLASH_EQ_INFO =
- const PrecedenceInfo('~/=',
- ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN);
-const PrecedenceInfo QUESTION_QUESTION_EQ_INFO =
- const PrecedenceInfo('??=',
- ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN);
+ const PrecedenceInfo('~/=', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN);
+const PrecedenceInfo QUESTION_QUESTION_EQ_INFO = const PrecedenceInfo(
+ '??=', ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN);
const PrecedenceInfo QUESTION_INFO =
- const PrecedenceInfo('?', 3, QUESTION_TOKEN);
+ const PrecedenceInfo('?', 3, QUESTION_TOKEN);
const PrecedenceInfo QUESTION_QUESTION_INFO =
- const PrecedenceInfo('??', 4, QUESTION_QUESTION_TOKEN);
+ const PrecedenceInfo('??', 4, QUESTION_QUESTION_TOKEN);
const PrecedenceInfo BAR_BAR_INFO =
- const PrecedenceInfo('||', 5, BAR_BAR_TOKEN);
+ const PrecedenceInfo('||', 5, BAR_BAR_TOKEN);
const PrecedenceInfo AMPERSAND_AMPERSAND_INFO =
- const PrecedenceInfo('&&', 6, AMPERSAND_AMPERSAND_TOKEN);
+ const PrecedenceInfo('&&', 6, AMPERSAND_AMPERSAND_TOKEN);
-const PrecedenceInfo BAR_INFO =
- const PrecedenceInfo('|', 9, BAR_TOKEN);
+const PrecedenceInfo BAR_INFO = const PrecedenceInfo('|', 9, BAR_TOKEN);
-const PrecedenceInfo CARET_INFO =
- const PrecedenceInfo('^', 10, CARET_TOKEN);
+const PrecedenceInfo CARET_INFO = const PrecedenceInfo('^', 10, CARET_TOKEN);
const PrecedenceInfo AMPERSAND_INFO =
- const PrecedenceInfo('&', 11, AMPERSAND_TOKEN);
+ const PrecedenceInfo('&', 11, AMPERSAND_TOKEN);
// Equality operators.
const int EQUALITY_PRECEDENCE = 7;
const PrecedenceInfo BANG_EQ_EQ_INFO =
- const PrecedenceInfo('!==',
- EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN);
+ const PrecedenceInfo('!==', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN);
const PrecedenceInfo BANG_EQ_INFO =
- const PrecedenceInfo('!=',
- EQUALITY_PRECEDENCE, BANG_EQ_TOKEN);
+ const PrecedenceInfo('!=', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN);
const PrecedenceInfo EQ_EQ_EQ_INFO =
- const PrecedenceInfo('===',
- EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN);
+ const PrecedenceInfo('===', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN);
const PrecedenceInfo EQ_EQ_INFO =
- const PrecedenceInfo('==',
- EQUALITY_PRECEDENCE, EQ_EQ_TOKEN);
+ const PrecedenceInfo('==', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN);
// Relational operators.
const int RELATIONAL_PRECEDENCE = 8;
const PrecedenceInfo GT_EQ_INFO =
- const PrecedenceInfo('>=',
- RELATIONAL_PRECEDENCE, GT_EQ_TOKEN);
+ const PrecedenceInfo('>=', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN);
const PrecedenceInfo GT_INFO =
- const PrecedenceInfo('>',
- RELATIONAL_PRECEDENCE, GT_TOKEN);
+ const PrecedenceInfo('>', RELATIONAL_PRECEDENCE, GT_TOKEN);
const PrecedenceInfo IS_INFO =
- const PrecedenceInfo('is',
- RELATIONAL_PRECEDENCE, KEYWORD_TOKEN);
+ const PrecedenceInfo('is', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN);
const PrecedenceInfo AS_INFO =
- const PrecedenceInfo('as',
- RELATIONAL_PRECEDENCE, KEYWORD_TOKEN);
+ const PrecedenceInfo('as', RELATIONAL_PRECEDENCE, KEYWORD_TOKEN);
const PrecedenceInfo LT_EQ_INFO =
- const PrecedenceInfo('<=',
- RELATIONAL_PRECEDENCE, LT_EQ_TOKEN);
+ const PrecedenceInfo('<=', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN);
const PrecedenceInfo LT_INFO =
- const PrecedenceInfo('<',
- RELATIONAL_PRECEDENCE, LT_TOKEN);
+ const PrecedenceInfo('<', RELATIONAL_PRECEDENCE, LT_TOKEN);
// Shift operators.
-const PrecedenceInfo GT_GT_INFO =
- const PrecedenceInfo('>>', 12, GT_GT_TOKEN);
-const PrecedenceInfo LT_LT_INFO =
- const PrecedenceInfo('<<', 12, LT_LT_TOKEN);
+const PrecedenceInfo GT_GT_INFO = const PrecedenceInfo('>>', 12, GT_GT_TOKEN);
+const PrecedenceInfo LT_LT_INFO = const PrecedenceInfo('<<', 12, LT_LT_TOKEN);
// Additive operators.
-const PrecedenceInfo MINUS_INFO =
- const PrecedenceInfo('-', 13, MINUS_TOKEN);
-const PrecedenceInfo PLUS_INFO =
- const PrecedenceInfo('+', 13, PLUS_TOKEN);
+const PrecedenceInfo MINUS_INFO = const PrecedenceInfo('-', 13, MINUS_TOKEN);
+const PrecedenceInfo PLUS_INFO = const PrecedenceInfo('+', 13, PLUS_TOKEN);
// Multiplicative operators.
const PrecedenceInfo PERCENT_INFO =
- const PrecedenceInfo('%', 14, PERCENT_TOKEN);
-const PrecedenceInfo SLASH_INFO =
- const PrecedenceInfo('/', 14, SLASH_TOKEN);
-const PrecedenceInfo STAR_INFO =
- const PrecedenceInfo('*', 14, STAR_TOKEN);
+ const PrecedenceInfo('%', 14, PERCENT_TOKEN);
+const PrecedenceInfo SLASH_INFO = const PrecedenceInfo('/', 14, SLASH_TOKEN);
+const PrecedenceInfo STAR_INFO = const PrecedenceInfo('*', 14, STAR_TOKEN);
const PrecedenceInfo TILDE_SLASH_INFO =
- const PrecedenceInfo('~/', 14, TILDE_SLASH_TOKEN);
+ const PrecedenceInfo('~/', 14, TILDE_SLASH_TOKEN);
const int POSTFIX_PRECEDENCE = 15;
const PrecedenceInfo PERIOD_INFO =
- const PrecedenceInfo('.', POSTFIX_PRECEDENCE,
- PERIOD_TOKEN);
+ const PrecedenceInfo('.', POSTFIX_PRECEDENCE, PERIOD_TOKEN);
const PrecedenceInfo QUESTION_PERIOD_INFO =
- const PrecedenceInfo('?.', POSTFIX_PRECEDENCE,
- QUESTION_PERIOD_TOKEN);
+ const PrecedenceInfo('?.', POSTFIX_PRECEDENCE, QUESTION_PERIOD_TOKEN);
const PrecedenceInfo KEYWORD_INFO =
- const PrecedenceInfo('keyword', 0, KEYWORD_TOKEN);
+ const PrecedenceInfo('keyword', 0, KEYWORD_TOKEN);
-const PrecedenceInfo EOF_INFO =
- const PrecedenceInfo('EOF', 0, EOF_TOKEN);
+const PrecedenceInfo EOF_INFO = const PrecedenceInfo('EOF', 0, EOF_TOKEN);
const PrecedenceInfo IDENTIFIER_INFO =
- const PrecedenceInfo('identifier', 0, IDENTIFIER_TOKEN);
+ const PrecedenceInfo('identifier', 0, IDENTIFIER_TOKEN);
const PrecedenceInfo BAD_INPUT_INFO =
- const PrecedenceInfo('malformed input', 0,
- BAD_INPUT_TOKEN);
+ const PrecedenceInfo('malformed input', 0, BAD_INPUT_TOKEN);
const PrecedenceInfo OPEN_PAREN_INFO =
- const PrecedenceInfo('(', POSTFIX_PRECEDENCE,
- OPEN_PAREN_TOKEN);
+ const PrecedenceInfo('(', POSTFIX_PRECEDENCE, OPEN_PAREN_TOKEN);
const PrecedenceInfo CLOSE_PAREN_INFO =
- const PrecedenceInfo(')', 0, CLOSE_PAREN_TOKEN);
+ const PrecedenceInfo(')', 0, CLOSE_PAREN_TOKEN);
const PrecedenceInfo OPEN_CURLY_BRACKET_INFO =
- const PrecedenceInfo('{', 0, OPEN_CURLY_BRACKET_TOKEN);
+ const PrecedenceInfo('{', 0, OPEN_CURLY_BRACKET_TOKEN);
const PrecedenceInfo CLOSE_CURLY_BRACKET_INFO =
- const PrecedenceInfo('}', 0, CLOSE_CURLY_BRACKET_TOKEN);
+ const PrecedenceInfo('}', 0, CLOSE_CURLY_BRACKET_TOKEN);
-const PrecedenceInfo INT_INFO =
- const PrecedenceInfo('int', 0, INT_TOKEN);
+const PrecedenceInfo INT_INFO = const PrecedenceInfo('int', 0, INT_TOKEN);
const PrecedenceInfo STRING_INFO =
- const PrecedenceInfo('string', 0, STRING_TOKEN);
+ const PrecedenceInfo('string', 0, STRING_TOKEN);
const PrecedenceInfo OPEN_SQUARE_BRACKET_INFO =
- const PrecedenceInfo('[', POSTFIX_PRECEDENCE,
- OPEN_SQUARE_BRACKET_TOKEN);
+ const PrecedenceInfo('[', POSTFIX_PRECEDENCE, OPEN_SQUARE_BRACKET_TOKEN);
const PrecedenceInfo CLOSE_SQUARE_BRACKET_INFO =
- const PrecedenceInfo(']', 0, CLOSE_SQUARE_BRACKET_TOKEN);
+ const PrecedenceInfo(']', 0, CLOSE_SQUARE_BRACKET_TOKEN);
const PrecedenceInfo DOUBLE_INFO =
- const PrecedenceInfo('double', 0, DOUBLE_TOKEN);
+ const PrecedenceInfo('double', 0, DOUBLE_TOKEN);
const PrecedenceInfo STRING_INTERPOLATION_INFO =
- const PrecedenceInfo('\${', 0,
- STRING_INTERPOLATION_TOKEN);
+ const PrecedenceInfo('\${', 0, STRING_INTERPOLATION_TOKEN);
const PrecedenceInfo STRING_INTERPOLATION_IDENTIFIER_INFO =
- const PrecedenceInfo('\$', 0,
- STRING_INTERPOLATION_IDENTIFIER_TOKEN);
+ const PrecedenceInfo('\$', 0, STRING_INTERPOLATION_IDENTIFIER_TOKEN);
const PrecedenceInfo HEXADECIMAL_INFO =
- const PrecedenceInfo('hexadecimal', 0, HEXADECIMAL_TOKEN);
+ const PrecedenceInfo('hexadecimal', 0, HEXADECIMAL_TOKEN);
const PrecedenceInfo COMMENT_INFO =
- const PrecedenceInfo('comment', 0, COMMENT_TOKEN);
+ const PrecedenceInfo('comment', 0, COMMENT_TOKEN);
diff --git a/pkg/compiler/lib/src/tokens/token.dart b/pkg/compiler/lib/src/tokens/token.dart
index d390eb7..df66bd9 100644
--- a/pkg/compiler/lib/src/tokens/token.dart
+++ b/pkg/compiler/lib/src/tokens/token.dart
@@ -4,23 +4,16 @@
library dart2js.tokens;
-import 'dart:convert' show
- UTF8;
-import 'dart:collection' show
- HashSet;
+import 'dart:convert' show UTF8;
+import 'dart:collection' show HashSet;
import '../common.dart';
-import '../util/util.dart' show
- computeHashCode;
+import '../util/util.dart' show computeHashCode;
-import 'keyword.dart' show
- Keyword;
-import 'precedence.dart' show
- PrecedenceInfo;
-import 'precedence_constants.dart' as Precedence show
- BAD_INPUT_INFO;
-import 'token_constants.dart' as Tokens show
- IDENTIFIER_TOKEN;
+import 'keyword.dart' show Keyword;
+import 'precedence.dart' show PrecedenceInfo;
+import 'precedence_constants.dart' as Precedence show BAD_INPUT_INFO;
+import 'token_constants.dart' as Tokens show IDENTIFIER_TOKEN;
/**
* A token that doubles as a linked list.
@@ -132,7 +125,6 @@
* Also used for end of file with EOF_INFO.
*/
class SymbolToken extends Token {
-
final PrecedenceInfo info;
SymbolToken(this.info, int charOffset) : super(charOffset);
@@ -179,8 +171,7 @@
}
abstract class ErrorToken extends Token {
- ErrorToken(int charOffset)
- : super(charOffset);
+ ErrorToken(int charOffset) : super(charOffset);
PrecedenceInfo get info => Precedence.BAD_INPUT_INFO;
@@ -198,8 +189,7 @@
class BadInputToken extends ErrorToken {
final int character;
- BadInputToken(this.character, int charOffset)
- : super(charOffset);
+ BadInputToken(this.character, int charOffset) : super(charOffset);
String toString() => "BadInputToken($character)";
@@ -259,7 +249,7 @@
* is canonicalized before the token is created.
*/
StringToken.fromString(this.info, String value, int charOffset,
- {bool canonicalize : false})
+ {bool canonicalize: false})
: valueOrLazySubstring = canonicalizedString(value, canonicalize),
super(charOffset);
@@ -267,13 +257,14 @@
* Creates a lazy string token. If [canonicalize] is true, the string
* is canonicalized before the token is created.
*/
- StringToken.fromSubstring(this.info, String data, int start, int end,
- int charOffset, {bool canonicalize : false})
+ StringToken.fromSubstring(
+ this.info, String data, int start, int end, int charOffset,
+ {bool canonicalize: false})
: super(charOffset) {
int length = end - start;
if (length <= LAZY_THRESHOLD) {
- valueOrLazySubstring = canonicalizedString(data.substring(start, end),
- canonicalize);
+ valueOrLazySubstring =
+ canonicalizedString(data.substring(start, end), canonicalize);
} else {
valueOrLazySubstring =
new LazySubstring(data, start, length, canonicalize);
@@ -285,7 +276,7 @@
* is passed through a UTF-8 decoder.
*/
StringToken.fromUtf8Bytes(this.info, List<int> data, int start, int end,
- bool asciiOnly, int charOffset)
+ bool asciiOnly, int charOffset)
: super(charOffset) {
int length = end - start;
if (length <= LAZY_THRESHOLD) {
@@ -307,8 +298,8 @@
valueOrLazySubstring = canonicalizedString(
data.substring(start, end), valueOrLazySubstring.boolValue);
} else {
- valueOrLazySubstring = decodeUtf8(
- data, start, end, valueOrLazySubstring.boolValue);
+ valueOrLazySubstring =
+ decodeUtf8(data, start, end, valueOrLazySubstring.boolValue);
}
return valueOrLazySubstring;
}
@@ -321,8 +312,7 @@
String toString() => "StringToken($value)";
- static final HashSet<String> canonicalizedSubstrings =
- new HashSet<String>();
+ static final HashSet<String> canonicalizedSubstrings = new HashSet<String>();
static String canonicalizedString(String s, bool canonicalize) {
if (!canonicalize) return s;
@@ -409,8 +399,7 @@
}
bool isUserDefinableOperator(String value) {
- return
- isBinaryOperator(value) ||
+ return isBinaryOperator(value) ||
isMinusOperator(value) ||
isTernaryOperator(value) ||
isUnaryOperator(value);
@@ -419,8 +408,7 @@
bool isUnaryOperator(String value) => value == '~';
bool isBinaryOperator(String value) {
- return
- value == '==' ||
+ return value == '==' ||
value == '[]' ||
value == '*' ||
value == '/' ||
diff --git a/pkg/compiler/lib/src/tokens/token_map.dart b/pkg/compiler/lib/src/tokens/token_map.dart
index 55b4d30..e7fc3b5 100644
--- a/pkg/compiler/lib/src/tokens/token_map.dart
+++ b/pkg/compiler/lib/src/tokens/token_map.dart
@@ -4,8 +4,7 @@
library dart2js.tokens.token_map;
-import 'token.dart' show
- Token;
+import 'token.dart' show Token;
/**
* Key class used in [TokenMap] in which the hash code for a token is based
@@ -15,7 +14,7 @@
final Token token;
TokenKey(this.token);
int get hashCode => token.charOffset;
- operator==(other) => other is TokenKey && token == other.token;
+ operator ==(other) => other is TokenKey && token == other.token;
}
/// Map of tokens and the first associated comment.
@@ -33,14 +32,14 @@
* 6) Storing token/comments pairs in a linked list: ~5400 msec
*/
class TokenMap {
- Map<TokenKey,Token> comments = new Map<TokenKey,Token>();
+ Map<TokenKey, Token> comments = new Map<TokenKey, Token>();
- Token operator[] (Token key) {
+ Token operator [](Token key) {
if (key == null) return null;
return comments[new TokenKey(key)];
}
- void operator[]= (Token key, Token value) {
+ void operator []=(Token key, Token value) {
if (key == null) return;
comments[new TokenKey(key)] = value;
}
diff --git a/pkg/compiler/lib/src/tracer.dart b/pkg/compiler/lib/src/tracer.dart
index 723c7ed..359ea77 100644
--- a/pkg/compiler/lib/src/tracer.dart
+++ b/pkg/compiler/lib/src/tracer.dart
@@ -6,22 +6,15 @@
import 'dart:async' show EventSink;
import '../compiler.dart' as api;
-import 'common/work.dart' show
- ItemCompilationContext;
-import 'compiler.dart' show
- Compiler;
-import 'ssa/nodes.dart' as ssa show
- HGraph;
-import 'ssa/ssa_tracer.dart' show
- HTracer;
+import 'common/work.dart' show ItemCompilationContext;
+import 'compiler.dart' show Compiler;
+import 'ssa/nodes.dart' as ssa show HGraph;
+import 'ssa/ssa_tracer.dart' show HTracer;
import 'cps_ir/cps_ir_nodes.dart' as cps_ir;
-import 'cps_ir/cps_ir_tracer.dart' show
- IRTracer;
+import 'cps_ir/cps_ir_tracer.dart' show IRTracer;
import 'tree_ir/tree_ir_nodes.dart' as tree_ir;
-import 'tree_ir/tree_ir_tracer.dart' show
- TreeTracer;
-import 'util/util.dart' show
- Indentation;
+import 'tree_ir/tree_ir_tracer.dart' show TreeTracer;
+import 'util/util.dart' show Indentation;
/**
* If non-null, we only trace methods whose name match the regexp defined by the
@@ -47,8 +40,8 @@
: this.compiler = compiler,
output = TRACE_FILTER != null ? outputProvider('dart', 'cfg') : null;
- void traceCompilation(String methodName,
- ItemCompilationContext compilationContext) {
+ void traceCompilation(
+ String methodName, ItemCompilationContext compilationContext) {
if (!isEnabled) return;
traceActive = TRACE_FILTER.hasMatch(methodName);
if (!traceActive) return;
@@ -64,11 +57,9 @@
if (!traceActive) return;
if (irObject is ssa.HGraph) {
new HTracer(output, compiler, context).traceGraph(name, irObject);
- }
- else if (irObject is cps_ir.FunctionDefinition) {
+ } else if (irObject is cps_ir.FunctionDefinition) {
new IRTracer(output).traceGraph(name, irObject);
- }
- else if (irObject is tree_ir.FunctionDefinition) {
+ } else if (irObject is tree_ir.FunctionDefinition) {
new TreeTracer(output).traceGraph(name, irObject);
}
}
@@ -80,7 +71,6 @@
}
}
-
abstract class TracerUtil {
EventSink<String> get output;
final Indentation _ind = new Indentation();
diff --git a/pkg/compiler/lib/src/tree/dartstring.dart b/pkg/compiler/lib/src/tree/dartstring.dart
index 7ada1fa..684f55b 100644
--- a/pkg/compiler/lib/src/tree/dartstring.dart
+++ b/pkg/compiler/lib/src/tree/dartstring.dart
@@ -43,7 +43,7 @@
String slowToString();
bool operator ==(var other) {
- if (other is !DartString) return false;
+ if (other is! DartString) return false;
DartString otherString = other;
if (length != otherString.length) return false;
Iterator it1 = iterator;
@@ -64,7 +64,6 @@
String toString() => "DartString#${length}:${slowToString()}";
}
-
/**
* A [DartString] where the content is represented by an actual [String].
*/
@@ -112,6 +111,7 @@
if (toStringCache != null) return toStringCache.codeUnits.iterator;
return new StringEscapeIterator(source);
}
+
String slowToString() {
if (toStringCache != null) return toStringCache;
StringBuffer buffer = new StringBuffer();
@@ -144,6 +144,7 @@
toStringCache = left.slowToString() + right.slowToString();
return toStringCache;
}
+
String get source => slowToString();
}
@@ -176,6 +177,7 @@
}
return true;
}
+
void nextPart() {
if (right != null) {
currentIterator = new HasNextIterator<int>(right.iterator);
@@ -188,7 +190,7 @@
/**
*Iterator that returns the actual string contents of a string with escapes.
*/
-class StringEscapeIterator implements Iterator<int>{
+class StringEscapeIterator implements Iterator<int> {
final Iterator<int> source;
int _current = null;
@@ -209,12 +211,24 @@
source.moveNext();
code = source.current;
switch (code) {
- case $n: _current = $LF; break;
- case $r: _current = $CR; break;
- case $t: _current = $TAB; break;
- case $b: _current = $BS; break;
- case $f: _current = $FF; break;
- case $v: _current = $VTAB; break;
+ case $n:
+ _current = $LF;
+ break;
+ case $r:
+ _current = $CR;
+ break;
+ case $t:
+ _current = $TAB;
+ break;
+ case $b:
+ _current = $BS;
+ break;
+ case $f:
+ _current = $FF;
+ break;
+ case $v:
+ _current = $VTAB;
+ break;
case $x:
source.moveNext();
int value = hexDigitValue(source.current);
diff --git a/pkg/compiler/lib/src/tree/nodes.dart b/pkg/compiler/lib/src/tree/nodes.dart
index 46c5424..9335fef 100644
--- a/pkg/compiler/lib/src/tree/nodes.dart
+++ b/pkg/compiler/lib/src/tree/nodes.dart
@@ -7,10 +7,12 @@
import '../common.dart';
import '../tokens/precedence_constants.dart' as Precedence show FUNCTION_INFO;
import '../tokens/token.dart' show BeginGroupToken, Token;
-import '../tokens/token_constants.dart' as Tokens show IDENTIFIER_TOKEN, KEYWORD_TOKEN, PLUS_TOKEN;
+import '../tokens/token_constants.dart' as Tokens
+ show IDENTIFIER_TOKEN, KEYWORD_TOKEN, PLUS_TOKEN;
import '../util/util.dart';
import '../util/characters.dart';
-import '../resolution/secret_tree_element.dart' show NullTreeElementMixin, StoredTreeElementMixin;
+import '../resolution/secret_tree_element.dart'
+ show NullTreeElementMixin, StoredTreeElementMixin;
import '../elements/elements.dart' show MetadataAnnotation;
import 'dartstring.dart';
import 'prettyprint.dart';
@@ -22,7 +24,7 @@
R visitNode(Node node);
R visitAssert(Assert node) => visitStatement(node);
- R visitAsyncForIn(AsyncForIn node) => visitLoop(node);
+ R visitAsyncForIn(AsyncForIn node) => visitForIn(node);
R visitAsyncModifier(AsyncModifier node) => visitNode(node);
R visitAwait(Await node) => visitExpression(node);
R visitBlock(Block node) => visitStatement(node);
@@ -44,6 +46,7 @@
R visitExpression(Expression node) => visitNode(node);
R visitExpressionStatement(ExpressionStatement node) => visitStatement(node);
R visitFor(For node) => visitLoop(node);
+ R visitForIn(ForIn node) => visitLoop(node);
R visitFunctionDeclaration(FunctionDeclaration node) => visitStatement(node);
R visitFunctionExpression(FunctionExpression node) => visitExpression(node);
R visitGotoStatement(GotoStatement node) => visitStatement(node);
@@ -65,7 +68,7 @@
R visitLiteralNull(LiteralNull node) => visitLiteral(node);
R visitLiteralString(LiteralString node) => visitStringNode(node);
R visitStringJuxtaposition(StringJuxtaposition node) => visitStringNode(node);
- R visitSyncForIn(SyncForIn node) => visitLoop(node);
+ R visitSyncForIn(SyncForIn node) => visitForIn(node);
R visitLoop(Loop node) => visitStatement(node);
R visitMetadata(Metadata node) => visitNode(node);
R visitMixinApplication(MixinApplication node) => visitNode(node);
@@ -74,12 +77,14 @@
R visitNamedMixinApplication(NamedMixinApplication node) {
return visitMixinApplication(node);
}
+
R visitNewExpression(NewExpression node) => visitExpression(node);
R visitNodeList(NodeList node) => visitNode(node);
R visitOperator(Operator node) => visitIdentifier(node);
R visitParenthesizedExpression(ParenthesizedExpression node) {
return visitExpression(node);
}
+
R visitPart(Part node) => visitLibraryTag(node);
R visitPartOf(PartOf node) => visitNode(node);
R visitPostfix(Postfix node) => visitNodeList(node);
@@ -87,6 +92,7 @@
R visitRedirectingFactoryBody(RedirectingFactoryBody node) {
return visitStatement(node);
}
+
R visitRethrow(Rethrow node) => visitStatement(node);
R visitReturn(Return node) => visitStatement(node);
R visitSend(Send node) => visitExpression(node);
@@ -97,6 +103,7 @@
R visitStringInterpolationPart(StringInterpolationPart node) {
return visitNode(node);
}
+
R visitSwitchCase(SwitchCase node) => visitNode(node);
R visitSwitchStatement(SwitchStatement node) => visitStatement(node);
R visitLiteralSymbol(LiteralSymbol node) => visitExpression(node);
@@ -110,6 +117,161 @@
R visitYield(Yield node) => visitStatement(node);
}
+/// Visitor for [Node]s that take an additional argument of type [A] and returns
+/// a value of type [R].
+abstract class Visitor1<R, A> {
+ const Visitor1();
+
+ R visitNode(Node node, A arg);
+
+ R visitAssert(Assert node, A arg) => visitStatement(node, arg);
+ R visitAsyncForIn(AsyncForIn node, A arg) => visitForIn(node, arg);
+ R visitAsyncModifier(AsyncModifier node, A arg) => visitNode(node, arg);
+ R visitAwait(Await node, A arg) => visitExpression(node, arg);
+ R visitBlock(Block node, A arg) => visitStatement(node, arg);
+ R visitBreakStatement(BreakStatement node, A arg) {
+ return visitGotoStatement(node, arg);
+ }
+
+ R visitCascade(Cascade node, A arg) => visitExpression(node, arg);
+ R visitCascadeReceiver(CascadeReceiver node, A arg) {
+ return visitExpression(node, arg);
+ }
+
+ R visitCaseMatch(CaseMatch node, A arg) => visitNode(node, arg);
+ R visitCatchBlock(CatchBlock node, A arg) => visitNode(node, arg);
+ R visitClassNode(ClassNode node, A arg) => visitNode(node, arg);
+ R visitCombinator(Combinator node, A arg) => visitNode(node, arg);
+ R visitConditional(Conditional node, A arg) => visitExpression(node, arg);
+ R visitConditionalUri(ConditionalUri node, A arg) {
+ return visitNode(node, arg);
+ }
+
+ R visitContinueStatement(ContinueStatement node, A arg) {
+ return visitGotoStatement(node, arg);
+ }
+
+ R visitDottedName(DottedName node, A arg) {
+ return visitExpression(node, arg);
+ }
+
+ R visitDoWhile(DoWhile node, A arg) => visitLoop(node, arg);
+ R visitEmptyStatement(EmptyStatement node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitEnum(Enum node, A arg) => visitNode(node, arg);
+ R visitExport(Export node, A arg) => visitLibraryDependency(node, arg);
+ R visitExpression(Expression node, A arg) => visitNode(node, arg);
+ R visitExpressionStatement(ExpressionStatement node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitFor(For node, A arg) => visitLoop(node, arg);
+ R visitForIn(ForIn node, A arg) => visitLoop(node, arg);
+ R visitFunctionDeclaration(FunctionDeclaration node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitFunctionExpression(FunctionExpression node, A arg) {
+ return visitExpression(node, arg);
+ }
+
+ R visitGotoStatement(GotoStatement node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitIdentifier(Identifier node, A arg) {
+ return visitExpression(node, arg);
+ }
+
+ R visitImport(Import node, A arg) {
+ return visitLibraryDependency(node, arg);
+ }
+
+ R visitIf(If node, A arg) => visitStatement(node, arg);
+ R visitLabel(Label node, A arg) => visitNode(node, arg);
+ R visitLabeledStatement(LabeledStatement node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitLibraryDependency(LibraryDependency node, A arg) {
+ return visitLibraryTag(node, arg);
+ }
+
+ R visitLibraryName(LibraryName node, A arg) => visitLibraryTag(node, arg);
+ R visitLibraryTag(LibraryTag node, A arg) => visitNode(node, arg);
+ R visitLiteral(Literal node, A arg) => visitExpression(node, arg);
+ R visitLiteralBool(LiteralBool node, A arg) => visitLiteral(node, arg);
+ R visitLiteralDouble(LiteralDouble node, A arg) => visitLiteral(node, arg);
+ R visitLiteralInt(LiteralInt node, A arg) => visitLiteral(node, arg);
+ R visitLiteralList(LiteralList node, A arg) => visitExpression(node, arg);
+ R visitLiteralMap(LiteralMap node, A arg) => visitExpression(node, arg);
+ R visitLiteralMapEntry(LiteralMapEntry node, A arg) => visitNode(node, arg);
+ R visitLiteralNull(LiteralNull node, A arg) => visitLiteral(node, arg);
+ R visitLiteralString(LiteralString node, A arg) => visitStringNode(node, arg);
+ R visitStringJuxtaposition(StringJuxtaposition node, A arg) {
+ return visitStringNode(node, arg);
+ }
+
+ R visitSyncForIn(SyncForIn node, A arg) => visitForIn(node, arg);
+ R visitLoop(Loop node, A arg) => visitStatement(node, arg);
+ R visitMetadata(Metadata node, A arg) => visitNode(node, arg);
+ R visitMixinApplication(MixinApplication node, A arg) => visitNode(node, arg);
+ R visitModifiers(Modifiers node, A arg) => visitNode(node, arg);
+ R visitNamedArgument(NamedArgument node, A arg) => visitExpression(node, arg);
+ R visitNamedMixinApplication(NamedMixinApplication node, A arg) {
+ return visitMixinApplication(node, arg);
+ }
+
+ R visitNewExpression(NewExpression node, A arg) => visitExpression(node, arg);
+ R visitNodeList(NodeList node, A arg) => visitNode(node, arg);
+ R visitOperator(Operator node, A arg) => visitIdentifier(node, arg);
+ R visitParenthesizedExpression(ParenthesizedExpression node, A arg) {
+ return visitExpression(node, arg);
+ }
+
+ R visitPart(Part node, A arg) => visitLibraryTag(node, arg);
+ R visitPartOf(PartOf node, A arg) => visitNode(node, arg);
+ R visitPostfix(Postfix node, A arg) => visitNodeList(node, arg);
+ R visitPrefix(Prefix node, A arg) => visitNodeList(node, arg);
+ R visitRedirectingFactoryBody(RedirectingFactoryBody node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitRethrow(Rethrow node, A arg) => visitStatement(node, arg);
+ R visitReturn(Return node, A arg) => visitStatement(node, arg);
+ R visitSend(Send node, A arg) => visitExpression(node, arg);
+ R visitSendSet(SendSet node, A arg) => visitSend(node, arg);
+ R visitStatement(Statement node, A arg) => visitNode(node, arg);
+ R visitStringNode(StringNode node, A arg) => visitExpression(node, arg);
+ R visitStringInterpolation(StringInterpolation node, A arg) {
+ return visitStringNode(node, arg);
+ }
+
+ R visitStringInterpolationPart(StringInterpolationPart node, A arg) {
+ return visitNode(node, arg);
+ }
+
+ R visitSwitchCase(SwitchCase node, A arg) => visitNode(node, arg);
+ R visitSwitchStatement(SwitchStatement node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitLiteralSymbol(LiteralSymbol node, A arg) => visitExpression(node, arg);
+ R visitThrow(Throw node, A arg) => visitExpression(node, arg);
+ R visitTryStatement(TryStatement node, A arg) => visitStatement(node, arg);
+ R visitTypeAnnotation(TypeAnnotation node, A arg) => visitNode(node, arg);
+ R visitTypedef(Typedef node, A arg) => visitNode(node, arg);
+ R visitTypeVariable(TypeVariable node, A arg) => visitNode(node, arg);
+ R visitVariableDefinitions(VariableDefinitions node, A arg) {
+ return visitStatement(node, arg);
+ }
+
+ R visitWhile(While node, A arg) => visitLoop(node, arg);
+ R visitYield(Yield node, A arg) => visitStatement(node, arg);
+}
+
Token firstBeginToken(Node first, Node second) {
Token token = null;
if (first != null) {
@@ -141,8 +303,12 @@
accept(Visitor visitor);
+ accept1(Visitor1 visitor, arg);
+
visitChildren(Visitor visitor);
+ visitChildren1(Visitor1 visitor, arg);
+
/**
* Returns this node unparsed to Dart source string.
*/
@@ -263,14 +429,23 @@
final Token extendsKeyword;
final Token endToken;
- ClassNode(this.modifiers, this.name, this.typeParameters, this.superclass,
- this.interfaces, this.beginToken,
- this.extendsKeyword, this.body, this.endToken);
+ ClassNode(
+ this.modifiers,
+ this.name,
+ this.typeParameters,
+ this.superclass,
+ this.interfaces,
+ this.beginToken,
+ this.extendsKeyword,
+ this.body,
+ this.endToken);
ClassNode asClassNode() => this;
accept(Visitor visitor) => visitor.visitClassNode(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitClassNode(this, arg);
+
visitChildren(Visitor visitor) {
if (name != null) name.accept(visitor);
if (typeParameters != null) typeParameters.accept(visitor);
@@ -279,6 +454,14 @@
if (body != null) body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (name != null) name.accept1(visitor, arg);
+ if (typeParameters != null) typeParameters.accept1(visitor, arg);
+ if (superclass != null) superclass.accept1(visitor, arg);
+ if (interfaces != null) interfaces.accept1(visitor, arg);
+ if (body != null) body.accept1(visitor, arg);
+ }
+
Token getBeginToken() => beginToken;
@override
@@ -313,11 +496,18 @@
accept(Visitor visitor) => visitor.visitMixinApplication(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitMixinApplication(this, arg);
+
visitChildren(Visitor visitor) {
if (superclass != null) superclass.accept(visitor);
if (mixins != null) mixins.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (superclass != null) superclass.accept1(visitor, arg);
+ if (mixins != null) mixins.accept1(visitor, arg);
+ }
+
Token getBeginToken() => superclass.getBeginToken();
Token getEndToken() => mixins.getEndToken();
}
@@ -335,9 +525,8 @@
final Token classKeyword;
final Token endToken;
- NamedMixinApplication(this.name, this.typeParameters,
- this.modifiers, this.mixinApplication, this.interfaces,
- this.classKeyword, this.endToken);
+ NamedMixinApplication(this.name, this.typeParameters, this.modifiers,
+ this.mixinApplication, this.interfaces, this.classKeyword, this.endToken);
TypeAnnotation get superclass => mixinApplication.superclass;
NodeList get mixins => mixinApplication.mixins;
@@ -347,6 +536,10 @@
accept(Visitor visitor) => visitor.visitNamedMixinApplication(this);
+ accept1(Visitor1 visitor, arg) {
+ return visitor.visitNamedMixinApplication(this, arg);
+ }
+
visitChildren(Visitor visitor) {
name.accept(visitor);
if (typeParameters != null) typeParameters.accept(visitor);
@@ -355,6 +548,14 @@
mixinApplication.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ name.accept1(visitor, arg);
+ if (typeParameters != null) typeParameters.accept1(visitor, arg);
+ if (modifiers != null) modifiers.accept1(visitor, arg);
+ if (interfaces != null) interfaces.accept1(visitor, arg);
+ mixinApplication.accept1(visitor, arg);
+ }
+
Token getBeginToken() => classKeyword;
Token getEndToken() => endToken;
}
@@ -363,9 +564,6 @@
Expression();
Expression asExpression() => this;
-
- // TODO(ahe): make class abstract instead of adding an abstract method.
- accept(Visitor visitor);
}
abstract class Statement extends Node {
@@ -373,16 +571,12 @@
Statement asStatement() => this;
- // TODO(ahe): make class abstract instead of adding an abstract method.
- accept(Visitor visitor);
-
bool isValidBreakTarget() => true;
}
/// Erroneous expression that behaves as a literal null.
class ErrorExpression extends LiteralNull {
- ErrorExpression(token)
- : super(token);
+ ErrorExpression(token) : super(token);
ErrorExpression asErrorExpression() => this;
@@ -406,29 +600,39 @@
Link<Node> get arguments => argumentsNode.nodes;
- Send([this.receiver, this.selector, this.argumentsNode,
+ Send(
+ [this.receiver,
+ this.selector,
+ this.argumentsNode,
this.isConditional = false]);
Send.postfix(this.receiver, this.selector,
[Node argument = null, this.isConditional = false])
: argumentsNode = (argument == null)
- ? new Postfix()
- : new Postfix.singleton(argument);
+ ? new Postfix()
+ : new Postfix.singleton(argument);
Send.prefix(this.receiver, this.selector,
[Node argument = null, this.isConditional = false])
- : argumentsNode = (argument == null)
- ? new Prefix()
- : new Prefix.singleton(argument);
+ : argumentsNode =
+ (argument == null) ? new Prefix() : new Prefix.singleton(argument);
Send asSend() => this;
accept(Visitor visitor) => visitor.visitSend(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitSend(this, arg);
+
visitChildren(Visitor visitor) {
if (receiver != null) receiver.accept(visitor);
if (selector != null) selector.accept(visitor);
if (argumentsNode != null) argumentsNode.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (receiver != null) receiver.accept1(visitor, arg);
+ if (selector != null) selector.accept1(visitor, arg);
+ if (argumentsNode != null) argumentsNode.accept1(visitor, arg);
+ }
+
int argumentCount() {
return (argumentsNode == null) ? -1 : argumentsNode.slowLength();
}
@@ -436,6 +640,7 @@
bool get isSuperCall {
return receiver != null && receiver.isSuper();
}
+
bool get isOperator => selector is Operator;
bool get isPropertyAccess => argumentsNode == null;
bool get isFunctionObjectInvocation => selector == null;
@@ -452,13 +657,11 @@
isOperator && identical(selector.asOperator().source, '??');
bool get isTypeCast {
- return isOperator
- && identical(selector.asOperator().source, 'as');
+ return isOperator && identical(selector.asOperator().source, 'as');
}
bool get isTypeTest {
- return isOperator
- && identical(selector.asOperator().source, 'is');
+ return isOperator && identical(selector.asOperator().source, 'is');
}
bool get isIsNotCheck {
@@ -469,9 +672,7 @@
assert(isOperator);
assert(identical(selector.asOperator().source, 'is') ||
identical(selector.asOperator().source, 'as'));
- return isIsNotCheck
- ? arguments.head.asSend().receiver
- : arguments.head;
+ return isIsNotCheck ? arguments.head.asSend().receiver : arguments.head;
}
Token getBeginToken() {
@@ -513,38 +714,40 @@
final Operator assignmentOperator;
SendSet(receiver, selector, this.assignmentOperator, argumentsNode,
[bool isConditional = false])
- : super(receiver, selector, argumentsNode, isConditional);
- SendSet.postfix(receiver,
- selector,
- this.assignmentOperator,
- [Node argument = null, bool isConditional = false])
+ : super(receiver, selector, argumentsNode, isConditional);
+ SendSet.postfix(receiver, selector, this.assignmentOperator,
+ [Node argument = null, bool isConditional = false])
: super.postfix(receiver, selector, argument, isConditional);
- SendSet.prefix(receiver,
- selector,
- this.assignmentOperator,
- [Node argument = null, bool isConditional = false])
+ SendSet.prefix(receiver, selector, this.assignmentOperator,
+ [Node argument = null, bool isConditional = false])
: super.prefix(receiver, selector, argument, isConditional);
SendSet asSendSet() => this;
accept(Visitor visitor) => visitor.visitSendSet(this);
- /// `true` if this send is not a simple assignment.
- bool get isComplex => !identical(assignmentOperator.source, '=');
-
- /// Whether this is an if-null assignment of the form `a ??= b`.
- bool get isIfNullAssignment =>
- identical(assignmentOperator.source, '??=');
+ accept1(Visitor1 visitor, arg) => visitor.visitSendSet(this, arg);
visitChildren(Visitor visitor) {
super.visitChildren(visitor);
if (assignmentOperator != null) assignmentOperator.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ super.visitChildren1(visitor, arg);
+ if (assignmentOperator != null) assignmentOperator.accept1(visitor, arg);
+ }
+
+ /// `true` if this send is not a simple assignment.
+ bool get isComplex => !identical(assignmentOperator.source, '=');
+
+ /// Whether this is an if-null assignment of the form `a ??= b`.
+ bool get isIfNullAssignment => identical(assignmentOperator.source, '??=');
+
Send copyWithReceiver(Node newReceiver, bool isConditional) {
assert(receiver == null);
- return new SendSet(newReceiver, selector, assignmentOperator,
- argumentsNode, isConditional);
+ return new SendSet(newReceiver, selector, assignmentOperator, argumentsNode,
+ isConditional);
}
Token getBeginToken() {
@@ -571,10 +774,16 @@
accept(Visitor visitor) => visitor.visitNewExpression(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitNewExpression(this, arg);
+
visitChildren(Visitor visitor) {
if (send != null) send.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (send != null) send.accept1(visitor, arg);
+ }
+
bool get isConst {
return newToken == null || identical(newToken.stringValue, 'const');
}
@@ -617,6 +826,8 @@
accept(Visitor visitor) => visitor.visitNodeList(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitNodeList(this, arg);
+
visitChildren(Visitor visitor) {
if (nodes == null) return;
for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) {
@@ -624,18 +835,25 @@
}
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (nodes == null) return;
+ for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) {
+ if (link.head != null) link.head.accept1(visitor, arg);
+ }
+ }
+
Token getBeginToken() {
if (beginToken != null) return beginToken;
- if (nodes != null) {
- for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) {
- if (link.head.getBeginToken() != null) {
- return link.head.getBeginToken();
- }
- if (link.head.getEndToken() != null) {
- return link.head.getEndToken();
- }
- }
- }
+ if (nodes != null) {
+ for (Link<Node> link = nodes; !link.isEmpty; link = link.tail) {
+ if (link.head.getBeginToken() != null) {
+ return link.head.getBeginToken();
+ }
+ if (link.head.getEndToken() != null) {
+ return link.head.getEndToken();
+ }
+ }
+ }
return endToken;
}
@@ -664,10 +882,16 @@
accept(Visitor visitor) => visitor.visitBlock(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitBlock(this, arg);
+
visitChildren(Visitor visitor) {
if (statements != null) statements.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (statements != null) statements.accept1(visitor, arg);
+ }
+
Token getBeginToken() => statements.getBeginToken();
Token getEndToken() => statements.getEndToken();
@@ -681,8 +905,8 @@
final Token ifToken;
final Token elseToken;
- If(this.condition, this.thenPart, this.elsePart,
- this.ifToken, this.elseToken);
+ If(this.condition, this.thenPart, this.elsePart, this.ifToken,
+ this.elseToken);
If asIf() => this;
@@ -690,12 +914,20 @@
accept(Visitor visitor) => visitor.visitIf(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitIf(this, arg);
+
visitChildren(Visitor visitor) {
if (condition != null) condition.accept(visitor);
if (thenPart != null) thenPart.accept(visitor);
if (elsePart != null) elsePart.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (condition != null) condition.accept1(visitor, arg);
+ if (thenPart != null) thenPart.accept1(visitor, arg);
+ if (elsePart != null) elsePart.accept1(visitor, arg);
+ }
+
Token getBeginToken() => ifToken;
Token getEndToken() {
@@ -712,19 +944,27 @@
final Token questionToken;
final Token colonToken;
- Conditional(this.condition, this.thenExpression,
- this.elseExpression, this.questionToken, this.colonToken);
+ Conditional(this.condition, this.thenExpression, this.elseExpression,
+ this.questionToken, this.colonToken);
Conditional asConditional() => this;
accept(Visitor visitor) => visitor.visitConditional(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitConditional(this, arg);
+
visitChildren(Visitor visitor) {
condition.accept(visitor);
thenExpression.accept(visitor);
elseExpression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ condition.accept1(visitor, arg);
+ thenExpression.accept1(visitor, arg);
+ elseExpression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => condition.getBeginToken();
Token getEndToken() => elseExpression.getEndToken();
@@ -740,7 +980,8 @@
final Token forToken;
For(this.initializer, this.conditionStatement, this.update, body,
- this.forToken) : super(body);
+ this.forToken)
+ : super(body);
For asFor() => this;
@@ -756,6 +997,8 @@
accept(Visitor visitor) => visitor.visitFor(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitFor(this, arg);
+
visitChildren(Visitor visitor) {
if (initializer != null) initializer.accept(visitor);
if (conditionStatement != null) conditionStatement.accept(visitor);
@@ -763,6 +1006,13 @@
if (body != null) body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (initializer != null) initializer.accept1(visitor, arg);
+ if (conditionStatement != null) conditionStatement.accept1(visitor, arg);
+ if (update != null) update.accept1(visitor, arg);
+ if (body != null) body.accept1(visitor, arg);
+ }
+
Token getBeginToken() => forToken;
Token getEndToken() {
@@ -779,8 +1029,12 @@
accept(Visitor visitor) => visitor.visitFunctionDeclaration(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitFunctionDeclaration(this, arg);
+
visitChildren(Visitor visitor) => function.accept(visitor);
+ visitChildren1(Visitor1 visitor, arg) => function.accept1(visitor, arg);
+
Token getBeginToken() => function.getBeginToken();
@override
@@ -804,8 +1058,12 @@
accept(Visitor visitor) => visitor.visitAsyncModifier(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitAsyncModifier(this, arg);
+
visitChildren(Visitor visitor) {}
+ visitChildren1(Visitor1 visitor, arg) {}
+
Token getBeginToken() => asyncToken;
Token getEndToken() => starToken != null ? starToken : asyncToken;
@@ -836,8 +1094,7 @@
final AsyncModifier asyncModifier;
FunctionExpression(this.name, this.parameters, this.body, this.returnType,
- this.modifiers, this.initializers, this.getOrSet,
- this.asyncModifier) {
+ this.modifiers, this.initializers, this.getOrSet, this.asyncModifier) {
assert(modifiers != null);
}
@@ -845,6 +1102,8 @@
accept(Visitor visitor) => visitor.visitFunctionExpression(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitFunctionExpression(this, arg);
+
bool get isRedirectingFactory {
return body != null && body.asRedirectingFactoryBody() != null;
}
@@ -859,6 +1118,16 @@
if (body != null) body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (modifiers != null) modifiers.accept1(visitor, arg);
+ if (returnType != null) returnType.accept1(visitor, arg);
+ if (name != null) name.accept1(visitor, arg);
+ if (parameters != null) parameters.accept1(visitor, arg);
+ if (initializers != null) initializers.accept1(visitor, arg);
+ if (asyncModifier != null) asyncModifier.accept1(visitor, arg);
+ if (body != null) body.accept1(visitor, arg);
+ }
+
bool get hasBody => body.asEmptyStatement() == null;
bool get hasEmptyBody {
@@ -898,6 +1167,8 @@
visitChildren(Visitor visitor) {}
+ visitChildren1(Visitor1 visitor, arg) {}
+
Token getBeginToken() => token;
Token getEndToken() => token;
@@ -921,11 +1192,13 @@
}
accept(Visitor visitor) => visitor.visitLiteralInt(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralInt(this, arg);
}
class LiteralDouble extends Literal<double> {
LiteralDouble(Token token, DecodeErrorHandler handler)
- : super(token, handler);
+ : super(token, handler);
LiteralDouble asLiteralDouble() => this;
@@ -942,6 +1215,8 @@
}
accept(Visitor visitor) => visitor.visitLiteralDouble(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralDouble(this, arg);
}
class LiteralBool extends Literal<bool> {
@@ -957,11 +1232,11 @@
}
accept(Visitor visitor) => visitor.visitLiteralBool(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralBool(this, arg);
}
-
class StringQuoting {
-
/// Cache of common quotings.
static const List<StringQuoting> _mapping = const <StringQuoting>[
const StringQuoting($SQ, raw: false, leftQuoteLength: 1),
@@ -997,7 +1272,7 @@
final bool raw;
final int leftQuoteCharCount;
final int quote;
- const StringQuoting(this.quote, { this.raw, int leftQuoteLength })
+ const StringQuoting(this.quote, {this.raw, int leftQuoteLength})
: this.leftQuoteCharCount = leftQuoteLength;
String get quoteChar => identical(quote, $DQ) ? '"' : "'";
@@ -1031,14 +1306,18 @@
LiteralString asLiteralString() => this;
- void visitChildren(Visitor visitor) {}
-
bool get isInterpolation => false;
Token getBeginToken() => token;
Token getEndToken() => token;
accept(Visitor visitor) => visitor.visitLiteralString(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralString(this, arg);
+
+ void visitChildren(Visitor visitor) {}
+
+ void visitChildren1(Visitor1 visitor, arg) {}
}
class LiteralNull extends Literal<String> {
@@ -1049,6 +1328,8 @@
String get value => null;
accept(Visitor visitor) => visitor.visitLiteralNull(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralNull(this, arg);
}
class LiteralList extends Expression {
@@ -1064,11 +1345,18 @@
LiteralList asLiteralList() => this;
accept(Visitor visitor) => visitor.visitLiteralList(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralList(this, arg);
+
visitChildren(Visitor visitor) {
if (typeArguments != null) typeArguments.accept(visitor);
elements.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (typeArguments != null) typeArguments.accept1(visitor, arg);
+ elements.accept1(visitor, arg);
+ }
+
Token getBeginToken() {
if (constKeyword != null) return constKeyword;
return firstBeginToken(typeArguments, elements);
@@ -1086,11 +1374,17 @@
LiteralSymbol asLiteralSymbol() => this;
+ accept(Visitor visitor) => visitor.visitLiteralSymbol(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralSymbol(this, arg);
+
void visitChildren(Visitor visitor) {
if (identifiers != null) identifiers.accept(visitor);
}
- accept(Visitor visitor) => visitor.visitLiteralSymbol(this);
+ void visitChildren1(Visitor1 visitor, arg) {
+ if (identifiers != null) identifiers.accept1(visitor, arg);
+ }
Token getBeginToken() => hashToken;
@@ -1118,8 +1412,12 @@
accept(Visitor visitor) => visitor.visitIdentifier(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitIdentifier(this, arg);
+
visitChildren(Visitor visitor) {}
+ visitChildren1(Visitor1 visitor, arg) {}
+
Token getBeginToken() => token;
Token getEndToken() => token;
@@ -1135,11 +1433,17 @@
DottedName asDottedName() => this;
+ accept(Visitor visitor) => visitor.visitDottedName(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitDottedName(this, arg);
+
void visitChildren(Visitor visitor) {
identifiers.accept(visitor);
}
- accept(Visitor visitor) => visitor.visitDottedName(this);
+ void visitChildren1(Visitor1 visitor, arg) {
+ identifiers.accept1(visitor, arg);
+ }
Token getBeginToken() => token;
Token getEndToken() => identifiers.getEndToken();
@@ -1152,9 +1456,22 @@
}
class Operator extends Identifier {
- static const COMPLEX_OPERATORS =
- const ["--", "++", '+=', "-=", "*=", "/=", "%=", "&=", "|=", "~/=", "^=",
- ">>=", "<<=", "??="];
+ static const COMPLEX_OPERATORS = const [
+ "--",
+ "++",
+ '+=',
+ "-=",
+ "*=",
+ "/=",
+ "%=",
+ "&=",
+ "|=",
+ "~/=",
+ "^=",
+ ">>=",
+ "<<=",
+ "??="
+ ];
static const INCREMENT_OPERATORS = const <String>["++", "--"];
@@ -1163,6 +1480,8 @@
Operator asOperator() => this;
accept(Visitor visitor) => visitor.visitOperator(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitOperator(this, arg);
}
class Return extends Statement {
@@ -1181,10 +1500,16 @@
accept(Visitor visitor) => visitor.visitReturn(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitReturn(this, arg);
+
visitChildren(Visitor visitor) {
if (expression != null) expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (expression != null) expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => beginToken;
Token getEndToken() {
@@ -1207,10 +1532,16 @@
accept(Visitor visitor) => visitor.visitYield(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitYield(this, arg);
+
visitChildren(Visitor visitor) {
expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => yieldToken;
Token getEndToken() => endToken;
@@ -1221,17 +1552,25 @@
final Token beginToken;
final Token endToken;
- RedirectingFactoryBody(this.beginToken, this.endToken,
- this.constructorReference);
+ RedirectingFactoryBody(
+ this.beginToken, this.endToken, this.constructorReference);
RedirectingFactoryBody asRedirectingFactoryBody() => this;
accept(Visitor visitor) => visitor.visitRedirectingFactoryBody(this);
+ accept1(Visitor1 visitor, arg) {
+ return visitor.visitRedirectingFactoryBody(this, arg);
+ }
+
visitChildren(Visitor visitor) {
constructorReference.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ constructorReference.accept1(visitor, arg);
+ }
+
Token getBeginToken() => beginToken;
Token getEndToken() => endToken;
@@ -1247,10 +1586,16 @@
accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitExpressionStatement(this, arg);
+
visitChildren(Visitor visitor) {
if (expression != null) expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (expression != null) expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => expression.getBeginToken();
Token getEndToken() => endToken;
@@ -1268,10 +1613,16 @@
accept(Visitor visitor) => visitor.visitThrow(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitThrow(this, arg);
+
visitChildren(Visitor visitor) {
expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => throwToken;
Token getEndToken() => endToken;
@@ -1288,10 +1639,16 @@
accept(Visitor visitor) => visitor.visitAwait(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitAwait(this, arg);
+
visitChildren(Visitor visitor) {
expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => awaitToken;
Token getEndToken() => expression.getEndToken();
@@ -1312,11 +1669,18 @@
accept(Visitor visitor) => visitor.visitAssert(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitAssert(this, arg);
+
visitChildren(Visitor visitor) {
condition.accept(visitor);
if (message != null) message.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ condition.accept1(visitor, arg);
+ if (message != null) message.accept1(visitor, arg);
+ }
+
Token getBeginToken() => assertToken;
Token getEndToken() => semicolonToken;
}
@@ -1330,7 +1694,12 @@
Rethrow asRethrow() => this;
accept(Visitor visitor) => visitor.visitRethrow(this);
- visitChildren(Visitor visitor) { }
+
+ accept1(Visitor1 visitor, arg) => visitor.visitRethrow(this, arg);
+
+ visitChildren(Visitor visitor) {}
+
+ visitChildren1(Visitor1 visitor, arg) {}
Token getBeginToken() => throwToken;
Token getEndToken() => endToken;
@@ -1346,11 +1715,18 @@
accept(Visitor visitor) => visitor.visitTypeAnnotation(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitTypeAnnotation(this, arg);
+
visitChildren(Visitor visitor) {
typeName.accept(visitor);
if (typeArguments != null) typeArguments.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ typeName.accept1(visitor, arg);
+ if (typeArguments != null) typeArguments.accept1(visitor, arg);
+ }
+
Token getBeginToken() => typeName.getBeginToken();
Token getEndToken() {
@@ -1366,6 +1742,8 @@
accept(Visitor visitor) => visitor.visitTypeVariable(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitTypeVariable(this, arg);
+
visitChildren(Visitor visitor) {
name.accept(visitor);
if (bound != null) {
@@ -1373,6 +1751,13 @@
}
}
+ visitChildren1(Visitor1 visitor, arg) {
+ name.accept1(visitor, arg);
+ if (bound != null) {
+ bound.accept1(visitor, arg);
+ }
+ }
+
TypeVariable asTypeVariable() => this;
Token getBeginToken() => name.getBeginToken();
@@ -1388,18 +1773,14 @@
final Modifiers modifiers;
final NodeList definitions;
- VariableDefinitions(this.type,
- this.modifiers,
- this.definitions)
+ VariableDefinitions(this.type, this.modifiers, this.definitions)
: this.metadata = null {
assert(modifiers != null);
}
// TODO(johnniwinther): Make this its own node type.
- VariableDefinitions.forParameter(this.metadata,
- this.type,
- this.modifiers,
- this.definitions) {
+ VariableDefinitions.forParameter(
+ this.metadata, this.type, this.modifiers, this.definitions) {
assert(modifiers != null);
}
@@ -1407,12 +1788,20 @@
accept(Visitor visitor) => visitor.visitVariableDefinitions(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitVariableDefinitions(this, arg);
+
visitChildren(Visitor visitor) {
if (metadata != null) metadata.accept(visitor);
if (type != null) type.accept(visitor);
if (definitions != null) definitions.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (metadata != null) metadata.accept1(visitor, arg);
+ if (type != null) type.accept1(visitor, arg);
+ if (definitions != null) definitions.accept1(visitor, arg);
+ }
+
Token getBeginToken() {
var token = firstBeginToken(modifiers, type);
if (token == null) {
@@ -1440,19 +1829,26 @@
final Expression condition;
- DoWhile(Statement body, Expression this.condition,
- Token this.doKeyword, Token this.whileKeyword, Token this.endToken)
- : super(body);
+ DoWhile(Statement body, Expression this.condition, Token this.doKeyword,
+ Token this.whileKeyword, Token this.endToken)
+ : super(body);
DoWhile asDoWhile() => this;
accept(Visitor visitor) => visitor.visitDoWhile(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitDoWhile(this, arg);
+
visitChildren(Visitor visitor) {
if (condition != null) condition.accept(visitor);
if (body != null) body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (condition != null) condition.accept1(visitor, arg);
+ if (body != null) body.accept1(visitor, arg);
+ }
+
Token getBeginToken() => doKeyword;
Token getEndToken() => endToken;
@@ -1462,18 +1858,25 @@
final Token whileKeyword;
final Expression condition;
- While(Expression this.condition, Statement body,
- Token this.whileKeyword) : super(body);
+ While(Expression this.condition, Statement body, Token this.whileKeyword)
+ : super(body);
While asWhile() => this;
accept(Visitor visitor) => visitor.visitWhile(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitWhile(this, arg);
+
visitChildren(Visitor visitor) {
if (condition != null) condition.accept(visitor);
if (body != null) body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (condition != null) condition.accept1(visitor, arg);
+ if (body != null) body.accept1(visitor, arg);
+ }
+
Token getBeginToken() => whileKeyword;
Token getEndToken() => body.getEndToken();
@@ -1483,17 +1886,25 @@
final Expression expression;
final BeginGroupToken beginToken;
- ParenthesizedExpression(Expression this.expression,
- BeginGroupToken this.beginToken);
+ ParenthesizedExpression(
+ Expression this.expression, BeginGroupToken this.beginToken);
ParenthesizedExpression asParenthesizedExpression() => this;
accept(Visitor visitor) => visitor.visitParenthesizedExpression(this);
+ accept1(Visitor1 visitor, arg) {
+ return visitor.visitParenthesizedExpression(this, arg);
+ }
+
visitChildren(Visitor visitor) {
if (expression != null) expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (expression != null) expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => beginToken;
Token getEndToken() => beginToken.endGroup;
@@ -1533,14 +1944,22 @@
int flags = 0;
for (; !nodes.isEmpty; nodes = nodes.tail) {
String value = nodes.head.asIdentifier().source;
- if (identical(value, 'static')) flags |= FLAG_STATIC;
- else if (identical(value, 'abstract')) flags |= FLAG_ABSTRACT;
- else if (identical(value, 'final')) flags |= FLAG_FINAL;
- else if (identical(value, 'var')) flags |= FLAG_VAR;
- else if (identical(value, 'const')) flags |= FLAG_CONST;
- else if (identical(value, 'factory')) flags |= FLAG_FACTORY;
- else if (identical(value, 'external')) flags |= FLAG_EXTERNAL;
- else throw 'internal error: ${nodes.head}';
+ if (identical(value, 'static'))
+ flags |= FLAG_STATIC;
+ else if (identical(value, 'abstract'))
+ flags |= FLAG_ABSTRACT;
+ else if (identical(value, 'final'))
+ flags |= FLAG_FINAL;
+ else if (identical(value, 'var'))
+ flags |= FLAG_VAR;
+ else if (identical(value, 'const'))
+ flags |= FLAG_CONST;
+ else if (identical(value, 'factory'))
+ flags |= FLAG_FACTORY;
+ else if (identical(value, 'external'))
+ flags |= FLAG_EXTERNAL;
+ else
+ throw 'internal error: ${nodes.head}';
}
return flags;
}
@@ -1549,7 +1968,7 @@
Link<Node> nodeList = nodes.nodes;
for (; !nodeList.isEmpty; nodeList = nodeList.tail) {
String value = nodeList.head.asIdentifier().source;
- if(identical(value, modifier)) {
+ if (identical(value, modifier)) {
return nodeList.head;
}
}
@@ -1559,9 +1978,15 @@
Modifiers asModifiers() => this;
Token getBeginToken() => nodes.getBeginToken();
Token getEndToken() => nodes.getEndToken();
+
accept(Visitor visitor) => visitor.visitModifiers(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitModifiers(this, arg);
+
visitChildren(Visitor visitor) => nodes.accept(visitor);
+ visitChildren1(Visitor1 visitor, arg) => nodes.accept1(visitor, arg);
+
bool get isStatic => (flags & FLAG_STATIC) != 0;
bool get isAbstract => (flags & FLAG_ABSTRACT) != 0;
bool get isFinal => (flags & FLAG_FINAL) != 0;
@@ -1579,13 +2004,14 @@
bool get isFinalOrConst => isFinal || isConst;
String toString() {
- return modifiersToString(isStatic: isStatic,
- isAbstract: isAbstract,
- isFinal: isFinal,
- isVar: isVar,
- isConst: isConst,
- isFactory: isFactory,
- isExternal: isExternal);
+ return modifiersToString(
+ isStatic: isStatic,
+ isAbstract: isAbstract,
+ isFinal: isFinal,
+ isVar: isVar,
+ isConst: isConst,
+ isFactory: isFactory,
+ isExternal: isExternal);
}
}
@@ -1602,11 +2028,18 @@
accept(Visitor visitor) => visitor.visitStringInterpolation(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitStringInterpolation(this, arg);
+
visitChildren(Visitor visitor) {
string.accept(visitor);
parts.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ string.accept1(visitor, arg);
+ parts.accept1(visitor, arg);
+ }
+
Token getBeginToken() => string.getBeginToken();
Token getEndToken() => parts.getEndToken();
}
@@ -1621,11 +2054,20 @@
accept(Visitor visitor) => visitor.visitStringInterpolationPart(this);
+ accept1(Visitor1 visitor, arg) {
+ return visitor.visitStringInterpolationPart(this, arg);
+ }
+
visitChildren(Visitor visitor) {
expression.accept(visitor);
string.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ string.accept1(visitor, arg);
+ }
+
Token getBeginToken() => expression.getBeginToken();
Token getEndToken() => string.getEndToken();
@@ -1659,7 +2101,7 @@
bool get isInterpolation {
if (isInterpolationCache == null) {
isInterpolationCache = (first.accept(const IsInterpolationVisitor()) ||
- second.accept(const IsInterpolationVisitor()));
+ second.accept(const IsInterpolationVisitor()));
}
return isInterpolationCache;
}
@@ -1687,11 +2129,18 @@
accept(Visitor visitor) => visitor.visitStringJuxtaposition(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitStringJuxtaposition(this, arg);
+
void visitChildren(Visitor visitor) {
first.accept(visitor);
second.accept(visitor);
}
+ void visitChildren1(Visitor1 visitor, arg) {
+ first.accept1(visitor, arg);
+ second.accept1(visitor, arg);
+ }
+
Token getBeginToken() => first.getBeginToken();
Token getEndToken() => second.getEndToken();
@@ -1706,8 +2155,12 @@
accept(Visitor visitor) => visitor.visitEmptyStatement(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitEmptyStatement(this, arg);
+
visitChildren(Visitor visitor) {}
+ visitChildren1(Visitor1 visitor, arg) {}
+
Token getBeginToken() => semicolonToken;
Token getEndToken() => semicolonToken;
@@ -1727,11 +2180,18 @@
accept(Visitor visitor) => visitor.visitLiteralMap(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralMap(this, arg);
+
visitChildren(Visitor visitor) {
if (typeArguments != null) typeArguments.accept(visitor);
entries.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (typeArguments != null) typeArguments.accept1(visitor, arg);
+ entries.accept1(visitor, arg);
+ }
+
Token getBeginToken() {
if (constKeyword != null) return constKeyword;
return firstBeginToken(typeArguments, entries);
@@ -1752,11 +2212,18 @@
accept(Visitor visitor) => visitor.visitLiteralMapEntry(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitLiteralMapEntry(this, arg);
+
visitChildren(Visitor visitor) {
key.accept(visitor);
value.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ key.accept1(visitor, arg);
+ value.accept1(visitor, arg);
+ }
+
Token getBeginToken() => key.getBeginToken();
Token getEndToken() => value.getEndToken();
@@ -1774,11 +2241,18 @@
accept(Visitor visitor) => visitor.visitNamedArgument(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitNamedArgument(this, arg);
+
visitChildren(Visitor visitor) {
name.accept(visitor);
expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ name.accept1(visitor, arg);
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => name.getBeginToken();
Token getEndToken() => expression.getEndToken();
@@ -1790,8 +2264,7 @@
final Token switchKeyword;
- SwitchStatement(this.parenthesizedExpression, this.cases,
- this.switchKeyword);
+ SwitchStatement(this.parenthesizedExpression, this.cases, this.switchKeyword);
SwitchStatement asSwitchStatement() => this;
@@ -1799,11 +2272,18 @@
accept(Visitor visitor) => visitor.visitSwitchStatement(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitSwitchStatement(this, arg);
+
visitChildren(Visitor visitor) {
parenthesizedExpression.accept(visitor);
cases.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ parenthesizedExpression.accept1(visitor, arg);
+ cases.accept1(visitor, arg);
+ }
+
Token getBeginToken() => switchKeyword;
Token getEndToken() => cases.getEndToken();
@@ -1818,8 +2298,14 @@
CaseMatch asCaseMatch() => this;
Token getBeginToken() => caseKeyword;
Token getEndToken() => colonToken;
+
accept(Visitor visitor) => visitor.visitCaseMatch(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitCaseMatch(this, arg);
+
visitChildren(Visitor visitor) => expression.accept(visitor);
+
+ visitChildren1(Visitor1 visitor, arg) => expression.accept1(visitor, arg);
}
class SwitchCase extends Node {
@@ -1840,8 +2326,8 @@
final Token startToken;
- SwitchCase(this.labelsAndCases, this.defaultKeyword,
- this.statements, this.startToken);
+ SwitchCase(this.labelsAndCases, this.defaultKeyword, this.statements,
+ this.startToken);
SwitchCase asSwitchCase() => this;
@@ -1851,11 +2337,18 @@
accept(Visitor visitor) => visitor.visitSwitchCase(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitSwitchCase(this, arg);
+
visitChildren(Visitor visitor) {
labelsAndCases.accept(visitor);
statements.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ labelsAndCases.accept1(visitor, arg);
+ statements.accept1(visitor, arg);
+ }
+
Token getBeginToken() {
return startToken;
}
@@ -1886,6 +2379,10 @@
if (target != null) target.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (target != null) target.accept1(visitor, arg);
+ }
+
Token getBeginToken() => keywordToken;
Token getEndToken() => semicolonToken;
@@ -1896,20 +2393,24 @@
class BreakStatement extends GotoStatement {
BreakStatement(Identifier target, Token keywordToken, Token semicolonToken)
- : super(target, keywordToken, semicolonToken);
+ : super(target, keywordToken, semicolonToken);
BreakStatement asBreakStatement() => this;
accept(Visitor visitor) => visitor.visitBreakStatement(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitBreakStatement(this, arg);
}
class ContinueStatement extends GotoStatement {
ContinueStatement(Identifier target, Token keywordToken, Token semicolonToken)
- : super(target, keywordToken, semicolonToken);
+ : super(target, keywordToken, semicolonToken);
ContinueStatement asContinueStatement() => this;
accept(Visitor visitor) => visitor.visitContinueStatement(this);
+
+ accept1(Visitor1 visitor, arg) => visitor.visitContinueStatement(this, arg);
}
abstract class ForIn extends Loop {
@@ -1919,8 +2420,8 @@
final Token forToken;
final Token inToken;
- ForIn(this.declaredIdentifier, this.expression,
- Statement body, this.forToken, this.inToken)
+ ForIn(this.declaredIdentifier, this.expression, Statement body, this.forToken,
+ this.inToken)
: super(body);
Expression get condition => null;
@@ -1938,32 +2439,48 @@
accept(Visitor visitor) => visitor.visitSyncForIn(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitSyncForIn(this, arg);
+
visitChildren(Visitor visitor) {
declaredIdentifier.accept(visitor);
expression.accept(visitor);
body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ declaredIdentifier.accept1(visitor, arg);
+ expression.accept1(visitor, arg);
+ body.accept1(visitor, arg);
+ }
+
Token getBeginToken() => forToken;
}
class AsyncForIn extends ForIn with StoredTreeElementMixin {
final Token awaitToken;
- AsyncForIn(declaredIdentifier, expression,
- Statement body, this.awaitToken, forToken, inToken)
+ AsyncForIn(declaredIdentifier, expression, Statement body, this.awaitToken,
+ forToken, inToken)
: super(declaredIdentifier, expression, body, forToken, inToken);
AsyncForIn asAsyncForIn() => this;
accept(Visitor visitor) => visitor.visitAsyncForIn(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitAsyncForIn(this, arg);
+
visitChildren(Visitor visitor) {
declaredIdentifier.accept(visitor);
expression.accept(visitor);
body.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ declaredIdentifier.accept1(visitor, arg);
+ expression.accept1(visitor, arg);
+ body.accept1(visitor, arg);
+ }
+
Token getBeginToken() => awaitToken;
}
@@ -1979,10 +2496,16 @@
accept(Visitor visitor) => visitor.visitLabel(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitLabel(this, arg);
+
void visitChildren(Visitor visitor) {
identifier.accept(visitor);
}
+ void visitChildren1(Visitor1 visitor, arg) {
+ identifier.accept1(visitor, arg);
+ }
+
Token getBeginToken() => identifier.token;
Token getEndToken() => colonToken;
}
@@ -1997,11 +2520,18 @@
accept(Visitor visitor) => visitor.visitLabeledStatement(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitLabeledStatement(this, arg);
+
visitChildren(Visitor visitor) {
labels.accept(visitor);
statement.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ labels.accept1(visitor, arg);
+ statement.accept1(visitor, arg);
+ }
+
Token getBeginToken() => labels.getBeginToken();
Token getEndToken() => statement.getEndToken();
@@ -2026,10 +2556,8 @@
final Token libraryKeyword;
- LibraryName(this.libraryKeyword,
- this.name,
- List<MetadataAnnotation> metadata)
- : super(metadata);
+ LibraryName(this.libraryKeyword, this.name, List<MetadataAnnotation> metadata)
+ : super(metadata);
bool get isLibraryName => true;
@@ -2037,8 +2565,12 @@
accept(Visitor visitor) => visitor.visitLibraryName(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitLibraryName(this, arg);
+
visitChildren(Visitor visitor) => name.accept(visitor);
+ visitChildren1(Visitor1 visitor, arg) => name.accept1(visitor, arg);
+
Token getBeginToken() => libraryKeyword;
Token getEndToken() => name.getEndToken().next;
@@ -2054,11 +2586,9 @@
final NodeList conditionalUris;
final NodeList combinators;
- LibraryDependency(this.uri,
- this.conditionalUris,
- this.combinators,
- List<MetadataAnnotation> metadata)
- : super(metadata);
+ LibraryDependency(this.uri, this.conditionalUris, this.combinators,
+ List<MetadataAnnotation> metadata)
+ : super(metadata);
LibraryDependency asLibraryDependency() => this;
@@ -2078,9 +2608,8 @@
final bool isDeferred;
Import(this.importKeyword, StringNode uri, NodeList conditionalUris,
- this.prefix, NodeList combinators,
- List<MetadataAnnotation> metadata,
- {this.isDeferred})
+ this.prefix, NodeList combinators, List<MetadataAnnotation> metadata,
+ {this.isDeferred})
: super(uri, conditionalUris, combinators, metadata);
bool get isImport => true;
@@ -2089,12 +2618,20 @@
accept(Visitor visitor) => visitor.visitImport(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitImport(this, arg);
+
visitChildren(Visitor visitor) {
uri.accept(visitor);
if (prefix != null) prefix.accept(visitor);
if (combinators != null) combinators.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ uri.accept1(visitor, arg);
+ if (prefix != null) prefix.accept1(visitor, arg);
+ if (combinators != null) combinators.accept1(visitor, arg);
+ }
+
Token getBeginToken() => importKeyword;
Token getEndToken() {
@@ -2127,12 +2664,20 @@
accept(Visitor visitor) => visitor.visitConditionalUri(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitConditionalUri(this, arg);
+
visitChildren(Visitor visitor) {
key.accept(visitor);
if (value != null) value.accept(visitor);
uri.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ key.accept1(visitor, arg);
+ if (value != null) value.accept1(visitor, arg);
+ uri.accept1(visitor, arg);
+ }
+
Token getBeginToken() => ifToken;
Token getEndToken() => uri.getEndToken();
@@ -2156,11 +2701,18 @@
accept(Visitor visitor) => visitor.visitEnum(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitEnum(this, arg);
+
visitChildren(Visitor visitor) {
name.accept(visitor);
if (names != null) names.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ name.accept1(visitor, arg);
+ if (names != null) names.accept1(visitor, arg);
+ }
+
Token getBeginToken() => enumToken;
Token getEndToken() => names.getEndToken();
}
@@ -2175,11 +2727,8 @@
class Export extends LibraryDependency {
final Token exportKeyword;
- Export(this.exportKeyword,
- StringNode uri,
- NodeList conditionalUris,
- NodeList combinators,
- List<MetadataAnnotation> metadata)
+ Export(this.exportKeyword, StringNode uri, NodeList conditionalUris,
+ NodeList combinators, List<MetadataAnnotation> metadata)
: super(uri, conditionalUris, combinators, metadata);
bool get isExport => true;
@@ -2188,11 +2737,18 @@
accept(Visitor visitor) => visitor.visitExport(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitExport(this, arg);
+
visitChildren(Visitor visitor) {
uri.accept(visitor);
if (combinators != null) combinators.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ uri.accept1(visitor, arg);
+ if (combinators != null) combinators.accept1(visitor, arg);
+ }
+
Token getBeginToken() => exportKeyword;
Token getEndToken() {
@@ -2208,7 +2764,7 @@
final Token partKeyword;
Part(this.partKeyword, this.uri, List<MetadataAnnotation> metadata)
- : super(metadata);
+ : super(metadata);
bool get isPart => true;
@@ -2216,8 +2772,12 @@
accept(Visitor visitor) => visitor.visitPart(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitPart(this, arg);
+
visitChildren(Visitor visitor) => uri.accept(visitor);
+ visitChildren1(Visitor1 visitor, arg) => uri.accept1(visitor, arg);
+
Token getBeginToken() => partKeyword;
Token getEndToken() => uri.getEndToken().next;
@@ -2240,8 +2800,12 @@
accept(Visitor visitor) => visitor.visitPartOf(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitPartOf(this, arg);
+
visitChildren(Visitor visitor) => name.accept(visitor);
+ visitChildren1(Visitor1 visitor, arg) => name.accept1(visitor, arg);
+
Token getBeginToken() => partKeyword;
Token getEndToken() => name.getEndToken().next;
@@ -2262,8 +2826,12 @@
accept(Visitor visitor) => visitor.visitCombinator(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitCombinator(this, arg);
+
visitChildren(Visitor visitor) => identifiers.accept(visitor);
+ visitChildren1(Visitor1 visitor, arg) => identifiers.accept1(visitor, arg);
+
Token getBeginToken() => keywordToken;
Token getEndToken() => identifiers.getEndToken();
@@ -2279,12 +2847,14 @@
final Token endToken;
Typedef(this.returnType, this.name, this.typeParameters, this.formals,
- this.typedefKeyword, this.endToken);
+ this.typedefKeyword, this.endToken);
Typedef asTypedef() => this;
accept(Visitor visitor) => visitor.visitTypedef(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitTypedef(this, arg);
+
visitChildren(Visitor visitor) {
if (returnType != null) returnType.accept(visitor);
name.accept(visitor);
@@ -2292,6 +2862,13 @@
formals.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (returnType != null) returnType.accept1(visitor, arg);
+ name.accept1(visitor, arg);
+ if (typeParameters != null) typeParameters.accept1(visitor, arg);
+ formals.accept1(visitor, arg);
+ }
+
Token getBeginToken() => typedefKeyword;
Token getEndToken() => endToken;
@@ -2306,18 +2883,26 @@
final Token finallyKeyword;
TryStatement(this.tryBlock, this.catchBlocks, this.finallyBlock,
- this.tryKeyword, this.finallyKeyword);
+ this.tryKeyword, this.finallyKeyword);
TryStatement asTryStatement() => this;
accept(Visitor visitor) => visitor.visitTryStatement(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitTryStatement(this, arg);
+
visitChildren(Visitor visitor) {
tryBlock.accept(visitor);
catchBlocks.accept(visitor);
if (finallyBlock != null) finallyBlock.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ tryBlock.accept1(visitor, arg);
+ catchBlocks.accept1(visitor, arg);
+ if (finallyBlock != null) finallyBlock.accept1(visitor, arg);
+ }
+
Token getBeginToken() => tryKeyword;
Token getEndToken() {
@@ -2334,10 +2919,16 @@
Cascade asCascade() => this;
accept(Visitor visitor) => visitor.visitCascade(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitCascade(this, arg);
+
void visitChildren(Visitor visitor) {
expression.accept(visitor);
}
+ void visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => expression.getBeginToken();
Token getEndToken() => expression.getEndToken();
@@ -2351,10 +2942,16 @@
CascadeReceiver asCascadeReceiver() => this;
accept(Visitor visitor) => visitor.visitCascadeReceiver(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitCascadeReceiver(this, arg);
+
void visitChildren(Visitor visitor) {
expression.accept(visitor);
}
+ void visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => expression.getBeginToken();
Token getEndToken() => expression.getEndToken();
@@ -2368,13 +2965,15 @@
final Token onKeyword;
final Token catchKeyword;
- CatchBlock(this.type, this.formals, this.block,
- this.onKeyword, this.catchKeyword);
+ CatchBlock(
+ this.type, this.formals, this.block, this.onKeyword, this.catchKeyword);
CatchBlock asCatchBlock() => this;
accept(Visitor visitor) => visitor.visitCatchBlock(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitCatchBlock(this, arg);
+
Node get exception {
if (formals == null || formals.nodes.isEmpty) return null;
VariableDefinitions declarations = formals.nodes.head;
@@ -2395,6 +2994,12 @@
block.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ if (type != null) type.accept1(visitor, arg);
+ if (formals != null) formals.accept1(visitor, arg);
+ block.accept1(visitor, arg);
+ }
+
Token getBeginToken() => onKeyword != null ? onKeyword : catchKeyword;
Token getEndToken() => block.getEndToken();
@@ -2410,10 +3015,16 @@
accept(Visitor visitor) => visitor.visitMetadata(this);
+ accept1(Visitor1 visitor, arg) => visitor.visitMetadata(this, arg);
+
visitChildren(Visitor visitor) {
expression.accept(visitor);
}
+ visitChildren1(Visitor1 visitor, arg) {
+ expression.accept1(visitor, arg);
+ }
+
Token getBeginToken() => token;
Token getEndToken() => expression.getEndToken();
@@ -2422,7 +3033,7 @@
class Initializers {
static bool isSuperConstructorCall(Send node) {
return (node.receiver == null && node.selector.isSuper()) ||
- (node.receiver != null &&
+ (node.receiver != null &&
node.receiver.isSuper() &&
!node.isConditional &&
node.selector.asIdentifier() != null);
@@ -2430,7 +3041,7 @@
static bool isConstructorRedirect(Send node) {
return (node.receiver == null && node.selector.isThis()) ||
- (node.receiver != null &&
+ (node.receiver != null &&
node.receiver.isThis() &&
!node.isConditional &&
node.selector.asIdentifier() != null);
@@ -2440,8 +3051,8 @@
class GetDartStringVisitor extends Visitor<DartString> {
const GetDartStringVisitor();
DartString visitNode(Node node) => null;
- DartString visitStringJuxtaposition(StringJuxtaposition node)
- => node.dartString;
+ DartString visitStringJuxtaposition(StringJuxtaposition node) =>
+ node.dartString;
DartString visitLiteralString(LiteralString node) => node.dartString;
}
@@ -2449,15 +3060,14 @@
const IsInterpolationVisitor();
bool visitNode(Node node) => false;
bool visitStringInterpolation(StringInterpolation node) => true;
- bool visitStringJuxtaposition(StringJuxtaposition node)
- => node.isInterpolation;
+ bool visitStringJuxtaposition(StringJuxtaposition node) =>
+ node.isInterpolation;
}
/// Erroneous node used to recover from parser errors. Implements various
/// interfaces and provides bare minimum of implementation to avoid unnecessary
/// messages.
-class ErrorNode
- extends Node
+class ErrorNode extends Node
implements FunctionExpression, VariableDefinitions, Typedef {
final Token token;
final String reason;
@@ -2468,8 +3078,8 @@
factory ErrorNode(Token token, String reason) {
Identifier name = new Identifier(token);
- NodeList definitions = new NodeList(
- null, const Link<Node>().prepend(name), null, null);
+ NodeList definitions =
+ new NodeList(null, const Link<Node>().prepend(name), null, null);
return new ErrorNode.internal(token, reason, name, definitions);
}
@@ -2482,8 +3092,12 @@
accept(Visitor visitor) {}
+ accept1(Visitor1 visitor, arg) {}
+
visitChildren(Visitor visitor) {}
+ visitChildren1(Visitor1 visitor, arg) {}
+
bool get isErroneous => true;
// FunctionExpression.
diff --git a/pkg/compiler/lib/src/tree/prettyprint.dart b/pkg/compiler/lib/src/tree/prettyprint.dart
index 1b17b7ab..dceffaf 100644
--- a/pkg/compiler/lib/src/tree/prettyprint.dart
+++ b/pkg/compiler/lib/src/tree/prettyprint.dart
@@ -47,8 +47,7 @@
visitAsyncModifier(AsyncModifier node) {
openAndCloseNode(node, "AsyncModifier",
- {'asyncToken': node.asyncToken,
- 'starToken': node.starToken});
+ {'asyncToken': node.asyncToken, 'starToken': node.starToken});
}
visitBlock(Block node) {
@@ -76,9 +75,8 @@
}
visitClassNode(ClassNode node) {
- openNode(node, "ClassNode", {
- "extendsKeyword" : tokenToStringOrNull(node.extendsKeyword)
- });
+ openNode(node, "ClassNode",
+ {"extendsKeyword": tokenToStringOrNull(node.extendsKeyword)});
visitChildNode(node.name, "name");
visitChildNode(node.superclass, "superclass");
visitChildNode(node.interfaces, "interfaces");
@@ -124,14 +122,19 @@
visitNodeWithChildren(node, "For");
}
+ visitForIn(ForIn node) {
+ node.visitChildren(this);
+ closeNode();
+ }
+
visitAsyncForIn(AsyncForIn node) {
openNode(node, "AsyncForIn");
+ visitForIn(node);
}
visitSyncForIn(SyncForIn node) {
- openNode(node, "ForIn");
- node.visitChildren(this);
- closeNode();
+ openNode(node, "SyncForIn");
+ visitForIn(node);
}
visitFunctionDeclaration(FunctionDeclaration node) {
@@ -139,9 +142,8 @@
}
visitFunctionExpression(FunctionExpression node) {
- openNode(node, "FunctionExpression", {
- "getOrSet" : tokenToStringOrNull(node.getOrSet)
- });
+ openNode(node, "FunctionExpression",
+ {"getOrSet": tokenToStringOrNull(node.getOrSet)});
visitChildNode(node.modifiers, "modifiers");
visitChildNode(node.returnType, "returnType");
visitChildNode(node.name, "name");
@@ -152,7 +154,7 @@
}
visitIdentifier(Identifier node) {
- openAndCloseNode(node, "Identifier", {"token" : node.token});
+ openAndCloseNode(node, "Identifier", {"token": node.token});
}
visitIf(If node) {
@@ -169,7 +171,7 @@
// Custom.
printLiteral(Literal node, String type) {
- openAndCloseNode(node, type, {"value" : node.value.toString()});
+ openAndCloseNode(node, type, {"value": node.value.toString()});
}
visitLiteralBool(LiteralBool node) {
@@ -188,9 +190,8 @@
tokenToStringOrNull(Token token) => token == null ? null : token.stringValue;
visitLiteralList(LiteralList node) {
- openNode(node, "LiteralList", {
- "constKeyword" : tokenToStringOrNull(node.constKeyword)
- });
+ openNode(node, "LiteralList",
+ {"constKeyword": tokenToStringOrNull(node.constKeyword)});
visitChildNode(node.typeArguments, "typeArguments");
visitChildNode(node.elements, "elements");
closeNode();
@@ -209,8 +210,7 @@
}
visitLiteralString(LiteralString node) {
- openAndCloseNode(node, "LiteralString",
- {"value" : node.token});
+ openAndCloseNode(node, "LiteralString", {"value": node.token});
}
visitMixinApplication(MixinApplication node) {
@@ -234,7 +234,7 @@
}
visitNodeList(NodeList node) {
- var params = { "delimiter" : node.delimiter };
+ var params = {"delimiter": node.delimiter};
if (node.isEmpty) {
openAndCloseNode(node, "NodeList", params);
} else {
@@ -245,7 +245,7 @@
}
visitOperator(Operator node) {
- openAndCloseNode(node, "Operator", {"value" : node.token});
+ openAndCloseNode(node, "Operator", {"value": node.token});
}
visitParenthesizedExpression(ParenthesizedExpression node) {
@@ -287,9 +287,9 @@
openSendNodeWithFields(Send node, String type) {
openNode(node, type, {
- "isPrefix" : "${node.isPrefix}",
- "isPostfix" : "${node.isPostfix}",
- "isIndex" : "${node.isIndex}"
+ "isPrefix": "${node.isPrefix}",
+ "isPostfix": "${node.isPostfix}",
+ "isIndex": "${node.isIndex}"
});
visitChildNode(node.receiver, "receiver");
visitChildNode(node.selector, "selector");
@@ -376,16 +376,14 @@
}
visitMetadata(Metadata node) {
- openNode(node, "Metadata", {
- "token": node.token
- });
+ openNode(node, "Metadata", {"token": node.token});
visitChildNode(node.expression, "expression");
closeNode();
}
visitCombinator(Combinator node) {
- openNode(node, "Combinator", {"isShow" : "${node.isShow}",
- "isHide" : "${node.isHide}"});
+ openNode(node, "Combinator",
+ {"isShow": "${node.isShow}", "isHide": "${node.isHide}"});
closeNode();
}
@@ -400,8 +398,7 @@
}
visitImport(Import node) {
- openNode(node, "Import", {
- "isDeferred" : "${node.isDeferred}"});
+ openNode(node, "Import", {"isDeferred": "${node.isDeferred}"});
visitChildNode(node.uri, "uri");
if (node.conditionalUris != null) {
visitChildNode(node.conditionalUris, "conditionalUris");
diff --git a/pkg/compiler/lib/src/tree/unparser.dart b/pkg/compiler/lib/src/tree/unparser.dart
index b9e6784..bb1d38e 100644
--- a/pkg/compiler/lib/src/tree/unparser.dart
+++ b/pkg/compiler/lib/src/tree/unparser.dart
@@ -3,7 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
import '../tokens/token.dart' show BeginGroupToken, Token;
-import '../tokens/token_constants.dart' as Tokens show IDENTIFIER_TOKEN, KEYWORD_TOKEN, PLUS_TOKEN;
+import '../tokens/token_constants.dart' as Tokens
+ show IDENTIFIER_TOKEN, KEYWORD_TOKEN, PLUS_TOKEN;
import '../util/util.dart';
import 'nodes.dart';
@@ -37,8 +38,8 @@
void addToken(Token token) {
if (token == null) return;
write(token.value);
- if (identical(token.kind, Tokens.KEYWORD_TOKEN)
- || identical(token.kind, Tokens.IDENTIFIER_TOKEN)) {
+ if (identical(token.kind, Tokens.KEYWORD_TOKEN) ||
+ identical(token.kind, Tokens.IDENTIFIER_TOKEN)) {
write(' ');
}
}
@@ -55,7 +56,9 @@
onEmptyLine = false;
}
- unparse(Node node) { visit(node); }
+ unparse(Node node) {
+ visit(node);
+ }
visit(Node node) {
if (node != null) node.accept(this);
@@ -95,7 +98,6 @@
}
}
-
visitCascade(Cascade node) {
visit(node.expression);
}
@@ -216,7 +218,7 @@
// arguments.
if (name is Send) {
Send send = name;
- assert(send is !SendSet);
+ assert(send is! SendSet);
if (!send.isOperator) {
// Looks like a factory method.
visit(send.receiver);
@@ -295,7 +297,7 @@
space();
write(node.elseToken.value);
space();
- if (node.elsePart is !Block && minify) write(' ');
+ if (node.elsePart is! Block && minify) write(' ');
visit(node.elsePart);
}
}
@@ -426,7 +428,6 @@
write(node.endToken.value);
}
-
unparseSendReceiver(Send node, {bool spacesNeeded: false}) {
if (node.receiver == null) return;
visit(node.receiver);
@@ -448,7 +449,7 @@
unparseSendArgument(Send node, {bool spacesNeeded: false}) {
if (node.argumentsNode == null) return;
- if(node.isIsNotCheck) {
+ if (node.isIsNotCheck) {
Send argNode = node.arguments.head;
visit(argNode.selector);
space();
@@ -469,7 +470,9 @@
void minusMinusSpace(Node other) {
if (other != null && opString == '-') {
Token beginToken = other.getBeginToken();
- if (beginToken != null && beginToken.stringValue != null && beginToken.stringValue.startsWith('-')) {
+ if (beginToken != null &&
+ beginToken.stringValue != null &&
+ beginToken.stringValue.startsWith('-')) {
sb.write(' ');
spacesNeeded = false;
}
@@ -576,7 +579,7 @@
visitDoWhile(DoWhile node) {
write(node.doKeyword.value);
- if (node.body is !Block) {
+ if (node.body is! Block) {
write(' ');
} else {
space();
@@ -636,9 +639,7 @@
visitGotoStatement(node);
}
- visitAsyncForIn(AsyncForIn node) {
- write(node.awaitToken.value);
- write(' ');
+ visitForIn(ForIn node) {
write(node.forToken.value);
space();
write('(');
@@ -651,24 +652,20 @@
visit(node.body);
}
+ visitAsyncForIn(AsyncForIn node) {
+ write(node.awaitToken.value);
+ write(' ');
+ visitForIn(node);
+ }
visitSyncForIn(SyncForIn node) {
- write(node.forToken.value);
- space();
- write('(');
- visit(node.declaredIdentifier);
- write(' ');
- addToken(node.inToken);
- visit(node.expression);
- write(')');
- space();
- visit(node.body);
+ visitForIn(node);
}
visitLabel(Label node) {
visit(node.identifier);
write(node.colonToken.value);
- }
+ }
visitLabeledStatement(LabeledStatement node) {
visit(node.labels);
@@ -718,9 +715,10 @@
newline();
}
- unparseImportTag(String uri, {String prefix,
- List<String> shows: const <String>[],
- bool isDeferred: false}) {
+ unparseImportTag(String uri,
+ {String prefix,
+ List<String> shows: const <String>[],
+ bool isDeferred: false}) {
String deferredString = isDeferred ? ' deferred' : '';
String prefixString = prefix == null ? '' : ' as $prefix';
String showString = shows.isEmpty ? '' : ' show ${shows.join(", ")}';
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
index dd44f1d..bfed37d 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/logical_rewriter.dart
@@ -52,8 +52,7 @@
///
/// !x ? y : false ==> !x && y
///
-class LogicalRewriter extends RecursiveTransformer
- implements Pass {
+class LogicalRewriter extends RecursiveTransformer implements Pass {
String get passName => 'Logical rewriter';
@override
@@ -68,20 +67,20 @@
/// This means it will ultimately translate to an empty statement.
bool isFallthrough(Statement node) {
return node is Break && isFallthroughBreak(node) ||
- node is Continue && isFallthroughContinue(node) ||
- node is Return && isFallthroughReturn(node);
+ node is Continue && isFallthroughContinue(node) ||
+ node is Return && isFallthroughReturn(node);
}
bool isFallthroughBreak(Break node) {
Statement target = fallthrough.target;
return node.target.binding.next == target ||
- target is Break && target.target == node.target;
+ target is Break && target.target == node.target;
}
bool isFallthroughContinue(Continue node) {
Statement target = fallthrough.target;
return node.target.binding == target ||
- target is Continue && target.target == node.target;
+ target is Continue && target.target == node.target;
}
bool isFallthroughReturn(Return node) {
@@ -90,8 +89,8 @@
bool isTerminator(Statement node) {
return (node is Jump || node is Return) && !isFallthrough(node) ||
- (node is ExpressionStatement && node.next is Unreachable) ||
- node is Throw;
+ (node is ExpressionStatement && node.next is Unreachable) ||
+ node is Throw;
}
Statement visitIf(If node) {
@@ -123,7 +122,7 @@
// if (E) {} else {S} ==> if (!E) {S}
bestThenBranch = ELSE;
} else if (isFallthrough(node.elseStatement) &&
- !isFallthrough(node.thenStatement)) {
+ !isFallthrough(node.thenStatement)) {
// Keep the empty statement in the 'else' branch.
// if (E) {S} else {}
bestThenBranch = THEN;
@@ -136,12 +135,12 @@
// if (E) {S1; return v}; S2
bestThenBranch = THEN;
} else if (isTerminator(node.elseStatement) &&
- !isTerminator(node.thenStatement)) {
+ !isTerminator(node.thenStatement)) {
// Put early termination in the 'then' branch to reduce nesting depth.
// if (E) {S}; return v ==> if (!E) return v; S
bestThenBranch = ELSE;
} else if (isTerminator(node.thenStatement) &&
- !isTerminator(node.elseStatement)) {
+ !isTerminator(node.elseStatement)) {
// Keep early termination in the 'then' branch to reduce nesting depth.
// if (E) {return v;} S
bestThenBranch = THEN;
@@ -160,7 +159,7 @@
// ==>
// if (E) S2 else S1
node.condition = makeCondition(node.condition, true,
- liftNots: bestThenBranch == NEITHER);
+ liftNots: bestThenBranch == NEITHER);
if (bestThenBranch == NEITHER && node.condition is Not) {
node.condition = (node.condition as Not).operand;
Statement tmp = node.thenStatement;
@@ -269,15 +268,13 @@
// x ? y : 0 ==> x && y (if x is truthy or zero) (and so on...)
if (matchesFalsyValue(node.condition, getConstant(node.elseExpression))) {
return new LogicalOperator.and(
- visitExpression(node.condition),
- node.thenExpression);
+ visitExpression(node.condition), node.thenExpression);
}
// x ? true : y ==> x || y (if x is falsy or true)
// x ? 1 : y ==> x || y (if x is falsy or one) (and so on...)
if (matchesTruthyValue(node.condition, getConstant(node.thenExpression))) {
return new LogicalOperator.or(
- visitExpression(node.condition),
- node.elseExpression);
+ visitExpression(node.condition), node.elseExpression);
}
// x ? y : true ==> !x || y
if (isTrue(node.elseExpression)) {
@@ -328,11 +325,11 @@
/// rewritten anyway.
bool isBooleanValued(Expression e) {
return isTrue(e) ||
- isFalse(e) ||
- e is Not ||
- e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
- e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
- e is TypeOperator && isBooleanValuedTypeOperator(e);
+ isFalse(e) ||
+ e is Not ||
+ e is LogicalOperator && isBooleanValuedLogicalOperator(e) ||
+ e is ApplyBuiltinOperator && operatorReturnsBool(e.operator) ||
+ e is TypeOperator && isBooleanValuedTypeOperator(e);
}
bool isBooleanValuedLogicalOperator(LogicalOperator e) {
@@ -368,14 +365,22 @@
BuiltinOperator negateBuiltin(BuiltinOperator operator) {
switch (operator) {
- case BuiltinOperator.StrictEq: return BuiltinOperator.StrictNeq;
- case BuiltinOperator.StrictNeq: return BuiltinOperator.StrictEq;
- case BuiltinOperator.LooseEq: return BuiltinOperator.LooseNeq;
- case BuiltinOperator.LooseNeq: return BuiltinOperator.LooseEq;
- case BuiltinOperator.IsNumber: return BuiltinOperator.IsNotNumber;
- case BuiltinOperator.IsNotNumber: return BuiltinOperator.IsNumber;
- case BuiltinOperator.IsInteger: return BuiltinOperator.IsNotInteger;
- case BuiltinOperator.IsNotInteger: return BuiltinOperator.IsInteger;
+ case BuiltinOperator.StrictEq:
+ return BuiltinOperator.StrictNeq;
+ case BuiltinOperator.StrictNeq:
+ return BuiltinOperator.StrictEq;
+ case BuiltinOperator.LooseEq:
+ return BuiltinOperator.LooseNeq;
+ case BuiltinOperator.LooseNeq:
+ return BuiltinOperator.LooseEq;
+ case BuiltinOperator.IsNumber:
+ return BuiltinOperator.IsNotNumber;
+ case BuiltinOperator.IsNotNumber:
+ return BuiltinOperator.IsNumber;
+ case BuiltinOperator.IsInteger:
+ return BuiltinOperator.IsNotInteger;
+ case BuiltinOperator.IsNotInteger:
+ return BuiltinOperator.IsInteger;
case BuiltinOperator.IsUnsigned32BitInteger:
return BuiltinOperator.IsNotUnsigned32BitInteger;
case BuiltinOperator.IsNotUnsigned32BitInteger:
@@ -406,7 +411,7 @@
/// If [polarity] if false, the negated condition will be created instead.
/// If [liftNots] is true (default) then Not expressions will be lifted toward
/// the root of the condition so they can be eliminated by the caller.
- Expression makeCondition(Expression e, bool polarity, {bool liftNots:true}) {
+ Expression makeCondition(Expression e, bool polarity, {bool liftNots: true}) {
if (e is Not) {
// !!E ==> E
return makeCondition(e.operand, !polarity, liftNots: liftNots);
@@ -453,27 +458,23 @@
}
// x ? true : y ==> x || y
if (isTrue(e.thenExpression)) {
- return makeOr(makeCondition(e.condition, true),
- e.elseExpression,
- liftNots: liftNots);
+ return makeOr(makeCondition(e.condition, true), e.elseExpression,
+ liftNots: liftNots);
}
// x ? false : y ==> !x && y
if (isFalse(e.thenExpression)) {
- return makeAnd(makeCondition(e.condition, false),
- e.elseExpression,
- liftNots: liftNots);
+ return makeAnd(makeCondition(e.condition, false), e.elseExpression,
+ liftNots: liftNots);
}
// x ? y : true ==> !x || y
if (isTrue(e.elseExpression)) {
- return makeOr(makeCondition(e.condition, false),
- e.thenExpression,
- liftNots: liftNots);
+ return makeOr(makeCondition(e.condition, false), e.thenExpression,
+ liftNots: liftNots);
}
// x ? y : false ==> x && y
if (isFalse(e.elseExpression)) {
- return makeAnd(makeCondition(e.condition, true),
- e.thenExpression,
- liftNots: liftNots);
+ return makeAnd(makeCondition(e.condition, true), e.thenExpression,
+ liftNots: liftNots);
}
e.condition = makeCondition(e.condition, true);
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart
index 2f5a9fd..e57c938 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/loop_rewriter.dart
@@ -73,8 +73,7 @@
/// readability and stack trace usability versus the modest code size
/// reduction one might get by aggressively moving expressions into the
/// updates.
-class LoopRewriter extends RecursiveTransformer
- implements Pass {
+class LoopRewriter extends RecursiveTransformer implements Pass {
String get passName => 'Loop rewriter';
Set<Label> usedContinueLabels = new Set<Label>();
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart b/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
index 8840c8e..931368d 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/pull_into_initializers.dart
@@ -57,8 +57,7 @@
/// [PullIntoInitializers] cannot pull `y` into an initializer because
/// the impure expressions `foo()` and `bar()` would then be swapped.
///
-class PullIntoInitializers extends RecursiveTransformer
- implements Pass {
+class PullIntoInitializers extends RecursiveTransformer implements Pass {
String get passName => 'Pull into initializers';
/// Denotes where each variable is currently assigned.
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
index 7996101..5db310a 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/statement_rewriter.dart
@@ -368,22 +368,22 @@
// expressions recursively. Determine if that is a valuable optimization
// and/or if it is better handled at the CPS level.
return exp is Constant ||
- exp is This ||
- exp is CreateInvocationMirror ||
- exp is CreateInstance ||
- exp is CreateBox ||
- exp is TypeExpression ||
- exp is GetStatic && exp.element.isFunction ||
- exp is Interceptor ||
- exp is ApplyBuiltinOperator ||
- exp is VariableUse && constantEnvironment.containsKey(exp.variable);
+ exp is This ||
+ exp is CreateInvocationMirror ||
+ exp is CreateInstance ||
+ exp is CreateBox ||
+ exp is TypeExpression ||
+ exp is GetStatic && exp.element.isFunction ||
+ exp is Interceptor ||
+ exp is ApplyBuiltinOperator ||
+ exp is VariableUse && constantEnvironment.containsKey(exp.variable);
}
/// True if [node] is an assignment that can be propagated as a constant.
bool isEffectivelyConstantAssignment(Expression node) {
return node is Assign &&
- node.variable.writeCount == 1 &&
- isEffectivelyConstant(node.value);
+ node.variable.writeCount == 1 &&
+ isEffectivelyConstant(node.value);
}
Statement visitExpressionStatement(ExpressionStatement inputNode) {
@@ -680,9 +680,7 @@
});
Statement reduced = combineStatementsInBranches(
- node.thenStatement,
- node.elseStatement,
- node.condition);
+ node.thenStatement, node.elseStatement, node.condition);
if (reduced != null) {
return reduced;
}
@@ -746,8 +744,8 @@
bool isCompoundableBuiltin(Expression e) {
return e is ApplyBuiltinOperator &&
- e.arguments.length >= 2 &&
- isCompoundableOperator(e.operator);
+ e.arguments.length >= 2 &&
+ isCompoundableOperator(e.operator);
}
/// Converts a compoundable operator application into the right-hand side for
@@ -759,9 +757,7 @@
if (e.arguments.length > 2) {
assert(e.operator == BuiltinOperator.StringConcatenate);
return new ApplyBuiltinOperator(
- e.operator,
- e.arguments.skip(1).toList(),
- e.sourceInformation);
+ e.operator, e.arguments.skip(1).toList(), e.sourceInformation);
} else {
return e.arguments[1];
}
@@ -914,12 +910,17 @@
// Symmetric operators are their own commutes.
return operator;
}
- switch(operator) {
- case BuiltinOperator.NumLt: return BuiltinOperator.NumGt;
- case BuiltinOperator.NumLe: return BuiltinOperator.NumGe;
- case BuiltinOperator.NumGt: return BuiltinOperator.NumLt;
- case BuiltinOperator.NumGe: return BuiltinOperator.NumLe;
- default: return null;
+ switch (operator) {
+ case BuiltinOperator.NumLt:
+ return BuiltinOperator.NumGt;
+ case BuiltinOperator.NumLe:
+ return BuiltinOperator.NumGe;
+ case BuiltinOperator.NumGt:
+ return BuiltinOperator.NumLt;
+ case BuiltinOperator.NumGe:
+ return BuiltinOperator.NumLe;
+ default:
+ return null;
}
}
@@ -948,8 +949,8 @@
Expression right = node.arguments[1];
if (right is This ||
(right is VariableUse &&
- propagatableVariable != right.variable &&
- !constantEnvironment.containsKey(right.variable))) {
+ propagatableVariable != right.variable &&
+ !constantEnvironment.containsKey(right.variable))) {
// An assignment can be propagated if we commute the operator.
node.operator = commuted;
node.arguments[0] = right;
@@ -982,9 +983,7 @@
/// If non-null is returned, the caller MUST discard [s] and [t] and use
/// the returned statement instead.
Statement combineStatementsInBranches(
- Statement s,
- Statement t,
- Expression condition) {
+ Statement s, Statement t, Expression condition) {
if (s is Return && t is Return) {
return new Return(new Conditional(condition, s.value, t.value));
}
@@ -1049,9 +1048,7 @@
///
/// The latter form is more compact and can also be inlined.
CombinedExpressions combineAsConditional(
- Expression s,
- Expression t,
- Expression condition) {
+ Expression s, Expression t, Expression condition) {
if (s is Assign && t is Assign && s.variable == t.variable) {
Expression values = new Conditional(condition, s.value, t.value);
return new CombinedAssigns(s, t, new CombinedExpressions(values));
@@ -1083,7 +1080,8 @@
if (values != null) {
// TODO(johnniwinther): Handle multiple source informations.
SourceInformation sourceInformation = s.sourceInformation != null
- ? s.sourceInformation : t.sourceInformation;
+ ? s.sourceInformation
+ : t.sourceInformation;
return new Return(values.combined,
sourceInformation: sourceInformation);
}
@@ -1227,7 +1225,7 @@
bool isNullable(int position) => node.nullableArguments[position];
int safeArguments =
- PlaceholderSafetyAnalysis.analyze(node.codeTemplate.ast, isNullable);
+ PlaceholderSafetyAnalysis.analyze(node.codeTemplate.ast, isNullable);
inEmptyEnvironment(() {
for (int i = node.arguments.length - 1; i >= safeArguments; --i) {
node.arguments[i] = visitExpression(node.arguments[i]);
diff --git a/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart b/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart
index bcc16ca..273d7a4 100644
--- a/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart
+++ b/pkg/compiler/lib/src/tree_ir/optimization/variable_merger.dart
@@ -24,7 +24,8 @@
_computeLiveness(builder.blocks);
PriorityPairs priority = new PriorityPairs()..build(node);
Map<Variable, Variable> subst = _computeRegisterAllocation(
- builder.blocks, node.parameters, priority, minifying: minifying);
+ builder.blocks, node.parameters, priority,
+ minifying: minifying);
new SubstituteVariables(subst).apply(node);
}
}
@@ -276,8 +277,8 @@
if (value is VariableUse) {
_prioritize(node.variable, value.variable);
} else if (value is ApplyBuiltinOperator &&
- isCompoundableOperator(value.operator) &&
- value.arguments[0] is VariableUse) {
+ isCompoundableOperator(value.operator) &&
+ value.arguments[0] is VariableUse) {
VariableUse use = value.arguments[0];
_prioritize(node.variable, use.variable);
}
@@ -385,10 +386,9 @@
///
/// We then compute a graph coloring, where the color of a node denotes which
/// variable it will be substituted by.
-Map<Variable, Variable> _computeRegisterAllocation(List<Block> blocks,
- List<Variable> parameters,
- PriorityPairs priority,
- {bool minifying}) {
+Map<Variable, Variable> _computeRegisterAllocation(
+ List<Block> blocks, List<Variable> parameters, PriorityPairs priority,
+ {bool minifying}) {
Map<Variable, Set<Variable>> interference = <Variable, Set<Variable>>{};
bool allowUnmotivatedMerge(Variable x, Variable y) {
@@ -407,8 +407,8 @@
// The presence of the phi implies that the two variables can contain the
// same value, so it is not that confusing that they get the same name.
return x.element == null ||
- y.element == null ||
- x.element.name == y.element.name;
+ y.element == null ||
+ x.element.name == y.element.name;
}
Set<Variable> empty = new Set<Variable>();
@@ -423,9 +423,8 @@
interference.putIfAbsent(variable, () => new Set<Variable>());
}
// Get variables that are live at the catch block.
- Set<Variable> liveCatch = block.catchBlock != null
- ? block.catchBlock.liveIn
- : empty;
+ Set<Variable> liveCatch =
+ block.catchBlock != null ? block.catchBlock.liveIn : empty;
// Add edges for each variable being assigned here.
for (VariableAccess access in block.accesses.reversed) {
Variable variable = access.variable;
@@ -509,8 +508,7 @@
searchPriorityPairs(parameter, parameter);
}
- v1loop:
- for (Variable v1 in variables) {
+ v1loop: for (Variable v1 in variables) {
// Ignore if the variable has already been assigned a register.
if (subst.containsKey(v1)) continue;
@@ -532,7 +530,7 @@
// Find an unused color.
Set<Variable> potential = new Set<Variable>.from(
- registers.where((v2) => allowUnmotivatedMerge(v1, v2)));
+ registers.where((v2) => allowUnmotivatedMerge(v1, v2)));
for (Variable v2 in interferenceSet) {
Variable v2subst = subst[v2];
if (v2subst != null) {
@@ -554,7 +552,6 @@
/// Performs variable substitution and removes redundant assignments.
class SubstituteVariables extends RecursiveTransformer {
-
Map<Variable, Variable> mapping;
SubstituteVariables(this.mapping);
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
index 99fb099..000f610 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_builder.dart
@@ -62,6 +62,7 @@
final Map<cps_ir.Continuation, Label> labels = <cps_ir.Continuation, Label>{};
ExecutableElement currentElement;
+
/// The parameter to be translated to 'this'. This can either be the receiver
/// parameter, the interceptor parameter, or null if the method has neither.
cps_ir.Parameter thisParameter;
@@ -85,8 +86,8 @@
}
VariableUse getMutableVariableUse(
- cps_ir.Reference<cps_ir.MutableVariable> reference,
- SourceInformation sourceInformation) {
+ cps_ir.Reference<cps_ir.MutableVariable> reference,
+ SourceInformation sourceInformation) {
Variable variable = getMutableVariable(reference.definition);
return new VariableUse(variable, sourceInformation: sourceInformation);
}
@@ -95,8 +96,8 @@
/// primitives that have no reference and do not need a variable.
Variable getVariable(cps_ir.Primitive primitive) {
primitive = primitive.effectiveDefinition;
- return primitive2variable.putIfAbsent(primitive,
- () => new Variable(currentElement, primitive.hint));
+ return primitive2variable.putIfAbsent(
+ primitive, () => new Variable(currentElement, primitive.hint));
}
/// Obtains a reference to the tree Variable corresponding to the IR primitive
@@ -104,7 +105,7 @@
/// This increments the reference count for the given variable, so the
/// returned expression must be used in the tree.
Expression getVariableUse(cps_ir.Reference<cps_ir.Primitive> reference,
- {SourceInformation sourceInformation}) {
+ {SourceInformation sourceInformation}) {
cps_ir.Primitive prim = reference.definition.effectiveDefinition;
if (prim is cps_ir.Constant && inlinedConstants.contains(prim)) {
return new Constant(prim.value);
@@ -112,12 +113,12 @@
if (thisParameter != null && prim == thisParameter) {
return new This();
}
- return new VariableUse(
- getVariable(prim), sourceInformation: sourceInformation);
+ return new VariableUse(getVariable(prim),
+ sourceInformation: sourceInformation);
}
Expression getVariableUseOrNull(
- cps_ir.Reference<cps_ir.Primitive> reference) {
+ cps_ir.Reference<cps_ir.Primitive> reference) {
return reference == null ? null : getVariableUse(reference);
}
@@ -151,17 +152,15 @@
/// The list will be typed as a list of [Expression] to allow inplace updates
/// on the list during the rewrite phases.
List<Expression> translateArguments(List<cps_ir.Reference> args) {
- return new List<Expression>.generate(args.length,
- (int index) => getVariableUse(args[index]),
- growable: false);
+ return new List<Expression>.generate(
+ args.length, (int index) => getVariableUse(args[index]),
+ growable: false);
}
/// Simultaneously assigns each argument to the corresponding parameter,
/// then continues at the statement created by [buildRest].
- Statement buildPhiAssignments(
- List<cps_ir.Parameter> parameters,
- List<Expression> arguments,
- Statement buildRest()) {
+ Statement buildPhiAssignments(List<cps_ir.Parameter> parameters,
+ List<Expression> arguments, Statement buildRest()) {
assert(parameters.length == arguments.length);
// We want a parallel assignment to all parameters simultaneously.
// Since we do not have parallel assignments in dart_tree, we must linearize
@@ -217,7 +216,8 @@
// The temporary will then be used as right-hand side when the
// assignment gets added.
VariableUse source = assignmentSrc[i];
- if (source.variable != phiTempVar) { // Only move to temporary once.
+ if (source.variable != phiTempVar) {
+ // Only move to temporary once.
assignmentSrc[i] = new VariableUse(phiTempVar);
addAssignment(phiTempVar, arg);
}
@@ -364,30 +364,28 @@
// of the non-recursive continuation invocation.
// See [visitInvokeContinuation] for the implementation.
NodeCallback visitLetCont(cps_ir.LetCont node) => (Statement next) {
- for (cps_ir.Continuation continuation in node.continuations) {
- // This happens after the body of the LetCont has been translated.
- // Labels are created on-demand if the continuation could not be inlined,
- // so the existence of the label indicates if a labeled statement should
- // be emitted.
- Label label = labels[continuation];
- if (label != null && !continuation.isRecursive) {
- // Recursively build the body. We only do this for join continuations,
- // so we should not risk overly deep recursion.
- next = new LabeledStatement(
- label,
- next,
- translateExpression(continuation.body));
- }
- }
- return next;
- };
+ for (cps_ir.Continuation continuation in node.continuations) {
+ // This happens after the body of the LetCont has been translated.
+ // Labels are created on-demand if the continuation could not be inlined,
+ // so the existence of the label indicates if a labeled statement should
+ // be emitted.
+ Label label = labels[continuation];
+ if (label != null && !continuation.isRecursive) {
+ // Recursively build the body. We only do this for join continuations,
+ // so we should not risk overly deep recursion.
+ next = new LabeledStatement(
+ label, next, translateExpression(continuation.body));
+ }
+ }
+ return next;
+ };
NodeCallback visitLetHandler(cps_ir.LetHandler node) => (Statement next) {
- List<Variable> catchParameters =
- node.handler.parameters.map(getVariable).toList();
- Statement catchBody = translateExpression(node.handler.body);
- return new Try(next, catchParameters, catchBody);
- };
+ List<Variable> catchParameters =
+ node.handler.parameters.map(getVariable).toList();
+ Statement catchBody = translateExpression(node.handler.body);
+ return new Try(next, catchParameters, catchBody);
+ };
NodeCallback visitLetMutable(cps_ir.LetMutable node) {
Variable variable = addMutableVariable(node.variable);
@@ -419,40 +417,38 @@
if (cont == returnContinuation) {
assert(node.argumentRefs.length == 1);
return new Return(getVariableUse(node.argumentRefs.single),
- sourceInformation: node.sourceInformation);
+ sourceInformation: node.sourceInformation);
} else {
List<Expression> arguments = translateArguments(node.argumentRefs);
- return buildPhiAssignments(cont.parameters, arguments,
- () {
- // Translate invocations of recursive and non-recursive
- // continuations differently.
- // * Non-recursive continuations
- // - If there is one use, translate the continuation body
- // inline at the invocation site.
- // - If there are multiple uses, translate to Break.
- // * Recursive continuations
- // - There is a single non-recursive invocation. Translate
- // the continuation body inline as a labeled loop at the
- // invocation site.
- // - Translate the recursive invocations to Continue.
- if (cont.isRecursive) {
- return node.isRecursive
- ? new Continue(getLabel(cont))
- : new WhileTrue(getLabel(cont),
- translateExpression(cont.body));
- } else {
- return cont.hasExactlyOneUse && !node.isEscapingTry
- ? translateExpression(cont.body)
- : new Break(getLabel(cont));
- }
- });
+ return buildPhiAssignments(cont.parameters, arguments, () {
+ // Translate invocations of recursive and non-recursive
+ // continuations differently.
+ // * Non-recursive continuations
+ // - If there is one use, translate the continuation body
+ // inline at the invocation site.
+ // - If there are multiple uses, translate to Break.
+ // * Recursive continuations
+ // - There is a single non-recursive invocation. Translate
+ // the continuation body inline as a labeled loop at the
+ // invocation site.
+ // - Translate the recursive invocations to Continue.
+ if (cont.isRecursive) {
+ return node.isRecursive
+ ? new Continue(getLabel(cont))
+ : new WhileTrue(getLabel(cont), translateExpression(cont.body));
+ } else {
+ return cont.hasExactlyOneUse && !node.isEscapingTry
+ ? translateExpression(cont.body)
+ : new Break(getLabel(cont));
+ }
+ });
}
}
/// Translates a branch condition to a tree expression.
Expression translateCondition(cps_ir.Branch branch) {
- Expression value = getVariableUse(
- branch.conditionRef, sourceInformation: branch.sourceInformation);
+ Expression value = getVariableUse(branch.conditionRef,
+ sourceInformation: branch.sourceInformation);
if (branch.isStrictCheck) {
return new ApplyBuiltinOperator(
BuiltinOperator.StrictEq,
@@ -480,23 +476,19 @@
condition, thenStatement, elseStatement, node.sourceInformation);
}
-
/************************** PRIMITIVES **************************/
//
// Visit methods for primitives must return an expression.
//
Expression visitSetField(cps_ir.SetField node) {
- return new SetField(getVariableUse(node.objectRef),
- node.field,
- getVariableUse(node.valueRef),
- node.sourceInformation);
+ return new SetField(getVariableUse(node.objectRef), node.field,
+ getVariableUse(node.valueRef), node.sourceInformation);
}
Expression visitInterceptor(cps_ir.Interceptor node) {
return new Interceptor(getVariableUse(node.inputRef),
- node.interceptedClasses,
- node.sourceInformation);
+ node.interceptedClasses, node.sourceInformation);
}
Expression visitCreateInstance(cps_ir.CreateInstance node) {
@@ -508,8 +500,9 @@
}
Expression visitGetField(cps_ir.GetField node) {
- return new GetField(getVariableUse(node.objectRef), node.field,
- node.sourceInformation, objectIsNotNull: !node.object.type.isNullable);
+ return new GetField(
+ getVariableUse(node.objectRef), node.field, node.sourceInformation,
+ objectIsNotNull: !node.object.type.isNullable);
}
Expression visitCreateBox(cps_ir.CreateBox node) {
@@ -518,8 +511,7 @@
Expression visitCreateInvocationMirror(cps_ir.CreateInvocationMirror node) {
return new CreateInvocationMirror(
- node.selector,
- translateArguments(node.argumentRefs));
+ node.selector, translateArguments(node.argumentRefs));
}
Expression visitGetMutable(cps_ir.GetMutable node) {
@@ -529,8 +521,8 @@
Expression visitSetMutable(cps_ir.SetMutable node) {
Variable variable = getMutableVariable(node.variable);
Expression value = getVariableUse(node.valueRef);
- return new Assign(
- variable, value, sourceInformation: node.sourceInformation);
+ return new Assign(variable, value,
+ sourceInformation: node.sourceInformation);
}
Expression visitConstant(cps_ir.Constant node) {
@@ -538,9 +530,7 @@
}
Expression visitLiteralList(cps_ir.LiteralList node) {
- return new LiteralList(
- node.dartType,
- translateArguments(node.valueRefs));
+ return new LiteralList(node.dartType, translateArguments(node.valueRefs));
}
Expression visitReifyRuntimeType(cps_ir.ReifyRuntimeType node) {
@@ -550,15 +540,11 @@
Expression visitReadTypeVariable(cps_ir.ReadTypeVariable node) {
return new ReadTypeVariable(
- node.variable,
- getVariableUse(node.targetRef),
- node.sourceInformation);
+ node.variable, getVariableUse(node.targetRef), node.sourceInformation);
}
Expression visitTypeExpression(cps_ir.TypeExpression node) {
- return new TypeExpression(
- node.kind,
- node.dartType,
+ return new TypeExpression(node.kind, node.dartType,
node.argumentRefs.map(getVariableUse).toList());
}
@@ -580,24 +566,19 @@
Expression visitSetStatic(cps_ir.SetStatic node) {
return new SetStatic(
- node.element,
- getVariableUse(node.valueRef),
- node.sourceInformation);
+ node.element, getVariableUse(node.valueRef), node.sourceInformation);
}
Expression visitApplyBuiltinOperator(cps_ir.ApplyBuiltinOperator node) {
if (node.operator == BuiltinOperator.IsFalsy) {
return new Not(getVariableUse(node.argumentRefs.single));
}
- return new ApplyBuiltinOperator(
- node.operator,
- translateArguments(node.argumentRefs),
- node.sourceInformation);
+ return new ApplyBuiltinOperator(node.operator,
+ translateArguments(node.argumentRefs), node.sourceInformation);
}
Expression visitApplyBuiltinMethod(cps_ir.ApplyBuiltinMethod node) {
- return new ApplyBuiltinMethod(node.method,
- getVariableUse(node.receiverRef),
+ return new ApplyBuiltinMethod(node.method, getVariableUse(node.receiverRef),
translateArguments(node.argumentRefs),
receiverIsNotNull: !node.receiver.type.isNullable);
}
@@ -607,26 +588,25 @@
}
Expression visitGetIndex(cps_ir.GetIndex node) {
- return new GetIndex(getVariableUse(node.objectRef),
- getVariableUse(node.indexRef));
+ return new GetIndex(
+ getVariableUse(node.objectRef), getVariableUse(node.indexRef));
}
Expression visitSetIndex(cps_ir.SetIndex node) {
return new SetIndex(getVariableUse(node.objectRef),
- getVariableUse(node.indexRef),
- getVariableUse(node.valueRef));
+ getVariableUse(node.indexRef), getVariableUse(node.valueRef));
}
Expression visitInvokeStatic(cps_ir.InvokeStatic node) {
List<Expression> arguments = translateArguments(node.argumentRefs);
- return new InvokeStatic(node.target, node.selector, arguments,
- node.sourceInformation);
+ return new InvokeStatic(
+ node.target, node.selector, arguments, node.sourceInformation);
}
- List<Expression> insertReceiverArgument(Expression receiver,
- List<Expression> arguments) {
- return new List<Expression>.generate(arguments.length + 1,
- (n) => n == 0 ? receiver : arguments[n - 1],
+ List<Expression> insertReceiverArgument(
+ Expression receiver, List<Expression> arguments) {
+ return new List<Expression>.generate(
+ arguments.length + 1, (n) => n == 0 ? receiver : arguments[n - 1],
growable: false);
}
@@ -659,20 +639,15 @@
// Also check the JS receiver's type, however, because sometimes we know
// an interceptor is non-null because it intercepts JSNull.
invoke.receiverIsNotNull =
- !node.receiver.type.isNullable ||
- !node.interceptor.type.isNullable;
+ !node.receiver.type.isNullable || !node.interceptor.type.isNullable;
return invoke;
case cps_ir.CallingConvention.DummyIntercepted:
List<Expression> arguments = insertReceiverArgument(
new Constant(new IntConstantValue(0)),
translateArguments(node.argumentRefs));
- InvokeMethod invoke = new InvokeMethod(
- getVariableUse(node.receiverRef),
- node.selector,
- node.mask,
- arguments,
- node.sourceInformation);
+ InvokeMethod invoke = new InvokeMethod(getVariableUse(node.receiverRef),
+ node.selector, node.mask, arguments, node.sourceInformation);
invoke.receiverIsNotNull = !node.receiver.type.isNullable;
return invoke;
@@ -681,23 +656,22 @@
getVariableUse(node.receiverRef),
translateArguments(node.argumentRefs));
return new OneShotInterceptor(
- node.selector,
- node.mask,
- arguments,
- node.sourceInformation);
+ node.selector, node.mask, arguments, node.sourceInformation);
}
}
Expression visitInvokeMethodDirectly(cps_ir.InvokeMethodDirectly node) {
if (node.interceptorRef != null) {
- return new InvokeMethodDirectly(getVariableUse(node.interceptorRef),
+ return new InvokeMethodDirectly(
+ getVariableUse(node.interceptorRef),
node.target,
node.selector,
insertReceiverArgument(getVariableUse(node.receiverRef),
translateArguments(node.argumentRefs)),
node.sourceInformation);
} else {
- return new InvokeMethodDirectly(getVariableUse(node.receiverRef),
+ return new InvokeMethodDirectly(
+ getVariableUse(node.receiverRef),
node.target,
node.selector,
translateArguments(node.argumentRefs),
@@ -713,12 +687,8 @@
Expression visitInvokeConstructor(cps_ir.InvokeConstructor node) {
List<Expression> arguments = translateArguments(node.argumentRefs);
- return new InvokeConstructor(
- node.dartType,
- node.target,
- node.selector,
- arguments,
- node.sourceInformation);
+ return new InvokeConstructor(node.dartType, node.target, node.selector,
+ arguments, node.sourceInformation);
}
visitForeignCode(cps_ir.ForeignCode node) {
@@ -752,18 +722,18 @@
}
visitReceiverCheck(cps_ir.ReceiverCheck node) => (Statement next) {
- // The CPS IR uses 'isNullCheck' because the semantics are important.
- // In the Tree IR, syntax is more important, so the receiver check uses
- // "useInvoke" to denote if an invocation should be emitted.
- return new ReceiverCheck(
- condition: getVariableUseOrNull(node.conditionRef),
- value: getVariableUse(node.valueRef),
- selector: node.selector,
- useSelector: node.useSelector,
- useInvoke: !node.isNullCheck,
- next: next,
- sourceInformation: node.sourceInformation);
- };
+ // The CPS IR uses 'isNullCheck' because the semantics are important.
+ // In the Tree IR, syntax is more important, so the receiver check uses
+ // "useInvoke" to denote if an invocation should be emitted.
+ return new ReceiverCheck(
+ condition: getVariableUseOrNull(node.conditionRef),
+ value: getVariableUse(node.valueRef),
+ selector: node.selector,
+ useSelector: node.useSelector,
+ useInvoke: !node.isNullCheck,
+ next: next,
+ sourceInformation: node.sourceInformation);
+ };
Expression visitGetLazyStatic(cps_ir.GetLazyStatic node) {
return new GetStatic.lazy(node.element, node.sourceInformation);
@@ -795,6 +765,7 @@
visitFunctionDefinition(cps_ir.FunctionDefinition node) {
unexpectedNode(node);
}
+
visitParameter(cps_ir.Parameter node) => unexpectedNode(node);
visitContinuation(cps_ir.Continuation node) => unexpectedNode(node);
visitMutableVariable(cps_ir.MutableVariable node) => unexpectedNode(node);
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
index 691a330..ea40782 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_integrity.dart
@@ -89,7 +89,7 @@
if (labelUses[label] != label.useCount) {
error('Label $label has ${labelUses[label]} uses '
- 'but its reference count is ${label.useCount}');
+ 'but its reference count is ${label.useCount}');
}
}
@@ -152,11 +152,10 @@
int writes = varWrites.putIfAbsent(variable, () => 0);
if (reads != variable.readCount || writes != variable.writeCount) {
error('Invalid reference count for $variable:\n'
- '- Variable has $reads reads and $writes writes\n'
- '- Reference count is ${variable.readCount} reads and '
- '${variable.writeCount} writes');
+ '- Variable has $reads reads and $writes writes\n'
+ '- Reference count is ${variable.readCount} reads and '
+ '${variable.writeCount} writes');
}
}
}
-
}
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
index adeed90..7a11f83 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_nodes.dart
@@ -150,9 +150,8 @@
accept(ExpressionVisitor v) => v.visitAssign(this);
accept1(ExpressionVisitor1 v, arg) => v.visitAssign(this, arg);
- static ExpressionStatement makeStatement(Variable variable,
- Expression value,
- [Statement next]) {
+ static ExpressionStatement makeStatement(Variable variable, Expression value,
+ [Statement next]) {
return new ExpressionStatement(new Assign(variable, value), next);
}
}
@@ -176,7 +175,7 @@
final SourceInformation sourceInformation;
InvokeStatic(this.target, this.selector, this.arguments,
- [this.sourceInformation]);
+ [this.sourceInformation]);
accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this);
accept1(ExpressionVisitor1 visitor, arg) {
@@ -200,11 +199,8 @@
/// If true, it is known that the receiver cannot be `null`.
bool receiverIsNotNull = false;
- InvokeMethod(this.receiver,
- this.selector,
- this.mask,
- this.arguments,
- this.sourceInformation) {
+ InvokeMethod(this.receiver, this.selector, this.mask, this.arguments,
+ this.sourceInformation) {
assert(receiver != null);
}
@@ -245,12 +241,14 @@
final List<Expression> arguments;
final Selector selector;
final SourceInformation sourceInformation;
+
/// TODO(karlklose): get rid of this field. Instead use the constant's
/// expression to find the constructor to be called in dart2dart.
final values.ConstantValue constant;
InvokeConstructor(this.type, this.target, this.selector, this.arguments,
- this.sourceInformation, [this.constant]);
+ this.sourceInformation,
+ [this.constant]);
ClassElement get targetClass => target.enclosingElement;
@@ -272,10 +270,8 @@
final List<Expression> arguments;
final SourceInformation sourceInformation;
- OneShotInterceptor(this.selector,
- this.mask,
- this.arguments,
- this.sourceInformation);
+ OneShotInterceptor(
+ this.selector, this.mask, this.arguments, this.sourceInformation);
accept(ExpressionVisitor visitor) => visitor.visitOneShotInterceptor(this);
accept1(ExpressionVisitor1 visitor, arg) {
@@ -330,7 +326,7 @@
final bool isTypeTest;
TypeOperator(this.value, this.type, this.typeArguments,
- {bool this.isTypeTest});
+ {bool this.isTypeTest});
accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
accept1(ExpressionVisitor1 visitor, arg) {
@@ -356,6 +352,7 @@
accept(ExpressionVisitor visitor) {
return visitor.visitApplyBuiltinOperator(this);
}
+
accept1(ExpressionVisitor1 visitor, arg) {
return visitor.visitApplyBuiltinOperator(this, arg);
}
@@ -368,14 +365,13 @@
bool receiverIsNotNull;
- ApplyBuiltinMethod(this.method,
- this.receiver,
- this.arguments,
- {this.receiverIsNotNull: false});
+ ApplyBuiltinMethod(this.method, this.receiver, this.arguments,
+ {this.receiverIsNotNull: false});
accept(ExpressionVisitor visitor) {
return visitor.visitApplyBuiltinMethod(this);
}
+
accept1(ExpressionVisitor1 visitor, arg) {
return visitor.visitApplyBuiltinMethod(this, arg);
}
@@ -395,7 +391,7 @@
}
String toString() => 'Conditional(condition=$condition,thenExpression='
- '$thenExpression,elseExpression=$elseExpression)';
+ '$thenExpression,elseExpression=$elseExpression)';
}
/// An && or || expression. The operator is internally represented as a boolean
@@ -460,8 +456,7 @@
}
/// A [WhileTrue] or [For] loop.
-abstract class Loop extends JumpTarget {
-}
+abstract class Loop extends JumpTarget {}
/**
* A labeled while(true) loop.
@@ -501,11 +496,7 @@
Statement body;
Statement next;
- For(this.label,
- this.condition,
- this.updates,
- this.body,
- this.next) {
+ For(this.label, this.condition, this.updates, this.body, this.next) {
assert(label.binding == null);
label.binding = this;
}
@@ -608,10 +599,8 @@
Statement get next => null;
void set next(Statement s) => throw 'UNREACHABLE';
- If(this.condition,
- this.thenStatement,
- this.elseStatement,
- this.sourceInformation);
+ If(this.condition, this.thenStatement, this.elseStatement,
+ this.sourceInformation);
accept(StatementVisitor visitor) => visitor.visitIf(this);
accept1(StatementVisitor1 visitor, arg) => visitor.visitIf(this, arg);
@@ -667,10 +656,7 @@
Statement body;
/// Creates a function definition and updates `writeCount` for [parameters].
- FunctionDefinition(
- this.element,
- this.parameters,
- this.body,
+ FunctionDefinition(this.element, this.parameters, this.body,
{this.sourceInformation}) {
for (Variable param in parameters) {
param.writeCount++; // Being a parameter counts as a write.
@@ -689,8 +675,8 @@
Expression typeInformation;
SourceInformation sourceInformation;
- CreateInstance(this.classElement, this.arguments,
- this.typeInformation, this.sourceInformation);
+ CreateInstance(this.classElement, this.arguments, this.typeInformation,
+ this.sourceInformation);
accept(ExpressionVisitor visitor) => visitor.visitCreateInstance(this);
accept1(ExpressionVisitor1 visitor, arg) {
@@ -704,10 +690,7 @@
bool objectIsNotNull;
SourceInformation sourceInformation;
- GetField(
- this.object,
- this.field,
- this.sourceInformation,
+ GetField(this.object, this.field, this.sourceInformation,
{this.objectIsNotNull: false});
accept(ExpressionVisitor visitor) => visitor.visitGetField(this);
@@ -724,18 +707,13 @@
/// operator. The operator must be a compoundable operator.
BuiltinOperator compound;
- SetField(
- this.object,
- this.field,
- this.value,
- this.sourceInformation,
+ SetField(this.object, this.field, this.value, this.sourceInformation,
{this.compound});
accept(ExpressionVisitor visitor) => visitor.visitSetField(this);
accept1(ExpressionVisitor1 visitor, arg) => visitor.visitSetField(this, arg);
}
-
/// Read the type test property from [object]. The value is truthy/fasly rather
/// than bool. [object] must not be `null`.
class GetTypeTestProperty extends Expression {
@@ -744,8 +722,7 @@
GetTypeTestProperty(this.object, this.dartType);
- accept(ExpressionVisitor visitor) =>
- visitor.visitGetTypeTestProperty(this);
+ accept(ExpressionVisitor visitor) => visitor.visitGetTypeTestProperty(this);
accept1(ExpressionVisitor1 visitor, arg) =>
visitor.visitGetTypeTestProperty(this, arg);
}
@@ -875,31 +852,27 @@
final types.TypeMask type;
final List<Expression> arguments;
final native.NativeBehavior nativeBehavior;
- final List<bool> nullableArguments; // One 'bit' per argument.
+ final List<bool> nullableArguments; // One 'bit' per argument.
final Element dependency;
final SourceInformation sourceInformation;
- ForeignCode(
- this.codeTemplate,
- this.type,
- this.arguments,
- this.nativeBehavior,
- this.nullableArguments,
- this.dependency,
- this.sourceInformation) {
+ ForeignCode(this.codeTemplate, this.type, this.arguments, this.nativeBehavior,
+ this.nullableArguments, this.dependency, this.sourceInformation) {
assert(arguments.length == nullableArguments.length);
}
}
class ForeignExpression extends ForeignCode implements Expression {
ForeignExpression(
- js.Template codeTemplate, types.TypeMask type,
- List<Expression> arguments, native.NativeBehavior nativeBehavior,
+ js.Template codeTemplate,
+ types.TypeMask type,
+ List<Expression> arguments,
+ native.NativeBehavior nativeBehavior,
List<bool> nullableArguments,
Element dependency,
SourceInformation sourceInformation)
: super(codeTemplate, type, arguments, nativeBehavior, nullableArguments,
- dependency, sourceInformation);
+ dependency, sourceInformation);
accept(ExpressionVisitor visitor) {
return visitor.visitForeignExpression(this);
@@ -912,13 +885,15 @@
class ForeignStatement extends ForeignCode implements Statement {
ForeignStatement(
- js.Template codeTemplate, types.TypeMask type,
- List<Expression> arguments, native.NativeBehavior nativeBehavior,
+ js.Template codeTemplate,
+ types.TypeMask type,
+ List<Expression> arguments,
+ native.NativeBehavior nativeBehavior,
List<bool> nullableArguments,
Element dependency,
SourceInformation sourceInformation)
: super(codeTemplate, type, arguments, nativeBehavior, nullableArguments,
- dependency, sourceInformation);
+ dependency, sourceInformation);
accept(StatementVisitor visitor) {
return visitor.visitForeignStatement(this);
@@ -993,8 +968,14 @@
Statement next;
SourceInformation sourceInformation;
- ReceiverCheck({this.condition, this.value, this.selector, this.useSelector,
- this.useInvoke, this.next, this.sourceInformation});
+ ReceiverCheck(
+ {this.condition,
+ this.value,
+ this.selector,
+ this.useSelector,
+ this.useInvoke,
+ this.next,
+ this.sourceInformation});
accept(StatementVisitor visitor) {
return visitor.visitReceiverCheck(this);
@@ -1239,8 +1220,7 @@
visitExpression(node.value);
}
- visitGetStatic(GetStatic node) {
- }
+ visitGetStatic(GetStatic node) {}
visitSetStatic(SetStatic node) {
visitExpression(node.value);
@@ -1250,8 +1230,7 @@
visitExpression(node.object);
}
- visitCreateBox(CreateBox node) {
- }
+ visitCreateBox(CreateBox node) {}
visitCreateInstance(CreateInstance node) {
node.arguments.forEach(visitExpression);
@@ -1274,8 +1253,7 @@
node.arguments.forEach(visitExpression);
}
- visitUnreachable(Unreachable node) {
- }
+ visitUnreachable(Unreachable node) {}
visitApplyBuiltinOperator(ApplyBuiltinOperator node) {
node.arguments.forEach(visitExpression);
@@ -1328,10 +1306,10 @@
}
}
-abstract class Transformer implements ExpressionVisitor<Expression>,
- StatementVisitor<Statement> {
- Expression visitExpression(Expression e) => e.accept(this);
- Statement visitStatement(Statement s) => s.accept(this);
+abstract class Transformer
+ implements ExpressionVisitor<Expression>, StatementVisitor<Statement> {
+ Expression visitExpression(Expression e) => e.accept(this);
+ Statement visitStatement(Statement s) => s.accept(this);
}
class RecursiveTransformer extends Transformer {
@@ -1600,8 +1578,9 @@
/// A stack machine for tracking fallthrough while traversing the Tree IR.
class FallthroughStack {
- final List<FallthroughTarget> _stack =
- <FallthroughTarget>[new FallthroughTarget(null)];
+ final List<FallthroughTarget> _stack = <FallthroughTarget>[
+ new FallthroughTarget(null)
+ ];
/// Set a new fallthrough target.
void push(Statement newFallthrough) {
diff --git a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
index 01aed83..39b4bb1 100644
--- a/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
+++ b/pkg/compiler/lib/src/tree_ir/tree_ir_tracer.dart
@@ -11,6 +11,7 @@
class Block {
Label label;
int index;
+
/// Mixed list of [Statement] and [Block].
/// A [Block] represents a synthetic goto statement.
final List statements = [];
@@ -51,6 +52,7 @@
void _addStatement(Statement statement) {
blocks.last.statements.add(statement);
}
+
void _addGotoStatement(Block target) {
blocks.last.statements.add(target);
}
@@ -230,8 +232,8 @@
printStatement(null, 'Entry ($params)');
}
if (block.label != null) {
- printStatement(null,
- "Label ${block.name}, useCount=${block.label.useCount}");
+ printStatement(
+ null, "Label ${block.name}, useCount=${block.label.useCount}");
}
if (block.catcher != null) {
printStatement(null, 'Catch exceptions at ${block.catcher.name}');
@@ -283,8 +285,8 @@
}
visitContinue(Continue node) {
- printStatement(null,
- "continue ${collector.continueTargets[node.target].name}");
+ printStatement(
+ null, "continue ${collector.continueTargets[node.target].name}");
}
visitIf(If node) {
@@ -305,7 +307,7 @@
printStatement(null, "while ${expr(node.condition)}");
printStatement(null, "do $bodyTarget");
printStatement(null, "updates ($updates)");
- printStatement(null, "then $nextTarget" );
+ printStatement(null, "then $nextTarget");
}
visitTry(Try node) {
@@ -424,9 +426,9 @@
static bool usesInfixNotation(Expression node) {
return node is Conditional ||
- node is LogicalOperator ||
- node is Assign ||
- node is SetField;
+ node is LogicalOperator ||
+ node is Assign ||
+ node is SetField;
}
String visitConditional(Conditional node) {
diff --git a/pkg/compiler/lib/src/typechecker.dart b/pkg/compiler/lib/src/typechecker.dart
index bd23056..9593b10 100644
--- a/pkg/compiler/lib/src/typechecker.dart
+++ b/pkg/compiler/lib/src/typechecker.dart
@@ -5,53 +5,47 @@
library dart2js.typechecker;
import 'common.dart';
-import 'common/names.dart' show
- Identifiers;
-import 'common/resolution.dart' show
- Resolution;
-import 'common/tasks.dart' show
- CompilerTask;
-import 'compiler.dart' show
- Compiler;
+import 'common/names.dart' show Identifiers;
+import 'common/resolution.dart' show Resolution;
+import 'common/tasks.dart' show CompilerTask;
+import 'compiler.dart' show Compiler;
import 'constants/expressions.dart';
import 'constants/values.dart';
import 'core_types.dart';
import 'dart_types.dart';
-import 'elements/elements.dart' show
- AbstractFieldElement,
- AstElement,
- AsyncMarker,
- ClassElement,
- ConstructorElement,
- Element,
- Elements,
- EnumClassElement,
- ExecutableElement,
- FieldElement,
- FunctionElement,
- GetterElement,
- InitializingFormalElement,
- LibraryElement,
- Member,
- MemberSignature,
- Name,
- ParameterElement,
- PrivateName,
- PublicName,
- ResolvedAst,
- SetterElement,
- TypeDeclarationElement,
- TypedElement,
- TypedefElement,
- VariableElement;
-import 'resolution/tree_elements.dart' show
- TreeElements;
-import 'resolution/class_members.dart' show
- MembersCreator;
+import 'elements/elements.dart'
+ show
+ AbstractFieldElement,
+ AstElement,
+ AsyncMarker,
+ ClassElement,
+ ConstructorElement,
+ Element,
+ Elements,
+ EnumClassElement,
+ EnumConstantElement,
+ ExecutableElement,
+ FieldElement,
+ FunctionElement,
+ GetterElement,
+ InitializingFormalElement,
+ LibraryElement,
+ Member,
+ MemberSignature,
+ Name,
+ ParameterElement,
+ PrivateName,
+ PublicName,
+ ResolvedAst,
+ SetterElement,
+ TypeDeclarationElement,
+ TypedElement,
+ TypedefElement,
+ VariableElement;
+import 'resolution/tree_elements.dart' show TreeElements;
+import 'resolution/class_members.dart' show MembersCreator;
import 'tree/tree.dart';
-import 'util/util.dart' show
- Link,
- LinkBuilder;
+import 'util/util.dart' show Link, LinkBuilder;
class TypeCheckerTask extends CompilerTask {
TypeCheckerTask(Compiler compiler) : super(compiler);
@@ -233,7 +227,6 @@
String toString() => 'TypeLiteralAccess($type)';
}
-
/// An access to the 'call' method of a function type.
class FunctionCallAccess implements ElementAccess {
final Element element;
@@ -250,7 +243,6 @@
String toString() => 'FunctionAccess($element, $type)';
}
-
/// An is-expression that potentially promotes a variable.
class TypePromotion {
final Send node;
@@ -267,7 +259,7 @@
}
void addHint(DiagnosticMessage hint,
- [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
+ [List<DiagnosticMessage> infos = const <DiagnosticMessage>[]]) {
messages.add(new TypePromotionMessage(hint, infos));
}
@@ -332,9 +324,8 @@
void registerKnownTypePromotion(TypePromotion typePromotion) {
VariableElement variable = typePromotion.variable;
- Link<TypePromotion> knownTypes =
- typePromotionsMap.putIfAbsent(variable,
- () => const Link<TypePromotion>());
+ Link<TypePromotion> knownTypes = typePromotionsMap.putIfAbsent(
+ variable, () => const Link<TypePromotion>());
typePromotionsMap[variable] = knownTypes.prepend(typePromotion);
}
@@ -377,8 +368,8 @@
: this.elements = elements,
this.executableContext = elements.analyzedElement,
this.currentClass = elements.analyzedElement != null
- ? elements.analyzedElement.enclosingClass : null {
-
+ ? elements.analyzedElement.enclosingClass
+ : null {
if (currentClass != null) {
thisType = currentClass.thisType;
superType = currentClass.supertype;
@@ -392,13 +383,12 @@
LibraryElement get currentLibrary => elements.analyzedElement.library;
reportTypeWarning(Spannable spannable, MessageKind kind,
- [Map arguments = const {}]) {
+ [Map arguments = const {}]) {
reporter.reportWarningMessage(spannable, kind, arguments);
}
- reportMessage(Spannable spannable, MessageKind kind,
- Map arguments,
- {bool isHint: false}) {
+ reportMessage(Spannable spannable, MessageKind kind, Map arguments,
+ {bool isHint: false}) {
if (isHint) {
reporter.reportHintMessage(spannable, kind, arguments);
} else {
@@ -454,7 +444,7 @@
}
void checkTypePromotion(Node node, TypePromotion typePromotion,
- {bool checkAccesses: false}) {
+ {bool checkAccesses: false}) {
VariableElement variable = typePromotion.variable;
String variableName = variable.name;
List<Node> potentialMutationsIn =
@@ -466,7 +456,8 @@
{'variableName': variableName, 'shownType': typePromotion.type});
List<DiagnosticMessage> infos = <DiagnosticMessage>[];
for (Node mutation in potentialMutationsIn) {
- infos.add(reporter.createMessage(mutation,
+ infos.add(reporter.createMessage(
+ mutation,
MessageKind.POTENTIAL_MUTATION_HERE,
{'variableName': variableName}));
}
@@ -517,7 +508,7 @@
/// Show type promotions from [left] and [right] in [node] given that the
/// promoted variables are not potentially mutated in [right].
void reshowTypePromotions(Node node, Node left, Node right) {
- for (TypePromotion typePromotion in getShownTypePromotionsFor(left)) {
+ for (TypePromotion typePromotion in getShownTypePromotionsFor(left)) {
typePromotion = typePromotion.copy();
checkTypePromotion(right, typePromotion);
showTypePromotion(node, typePromotion);
@@ -533,7 +524,7 @@
/// Analyze [node] in the context of the known types shown in [context].
DartType analyzeInPromotedContext(Node context, Node node) {
Link<TypePromotion> knownForNode = const Link<TypePromotion>();
- for (TypePromotion typePromotion in getShownTypePromotionsFor(context)) {
+ for (TypePromotion typePromotion in getShownTypePromotionsFor(context)) {
typePromotion = typePromotion.copy();
checkTypePromotion(node, typePromotion, checkAccesses: true);
knownForNode = knownForNode.prepend(typePromotion);
@@ -556,17 +547,13 @@
* checked mode, otherwise a warning is issued.
*/
bool checkAssignable(Spannable spannable, DartType from, DartType to,
- {bool isConst: false}) {
+ {bool isConst: false}) {
if (!types.isAssignable(from, to)) {
if (compiler.options.enableTypeAssertions && isConst) {
- reporter.reportErrorMessage(
- spannable,
- MessageKind.NOT_ASSIGNABLE,
+ reporter.reportErrorMessage(spannable, MessageKind.NOT_ASSIGNABLE,
{'fromType': from, 'toType': to});
} else {
- reporter.reportWarningMessage(
- spannable,
- MessageKind.NOT_ASSIGNABLE,
+ reporter.reportWarningMessage(spannable, MessageKind.NOT_ASSIGNABLE,
{'fromType': from, 'toType': to});
}
return false;
@@ -645,7 +632,7 @@
DartType returnType;
final FunctionElement element = elements.getFunctionDefinition(node);
assert(invariant(node, element != null,
- message: 'FunctionExpression with no element'));
+ message: 'FunctionExpression with no element'));
if (Elements.isUnresolved(element)) return const DynamicType();
if (element.isGenerativeConstructor) {
type = const DynamicType();
@@ -690,9 +677,8 @@
TypedElement element = elements[node];
assert(invariant(node, element != null,
message: 'Missing element for identifier'));
- assert(invariant(node, element.isVariable ||
- element.isParameter ||
- element.isField,
+ assert(invariant(
+ node, element.isVariable || element.isParameter || element.isField,
message: 'Unexpected context element ${element}'));
return element.computeType(resolution);
}
@@ -714,19 +700,14 @@
if (name != null &&
Name.isPrivateName(name) &&
element.library != currentLibrary) {
- reportTypeWarning(
- node,
- MessageKind.PRIVATE_ACCESS,
- {'name': name,
- 'libraryName': element.library.libraryOrScriptName});
+ reportTypeWarning(node, MessageKind.PRIVATE_ACCESS,
+ {'name': name, 'libraryName': element.library.libraryOrScriptName});
}
-
}
ElementAccess lookupMember(Node node, DartType receiverType, String name,
- MemberKind memberKind, Element receiverElement,
- {bool lookupClassMember: false,
- bool isHint: false}) {
+ MemberKind memberKind, Element receiverElement,
+ {bool lookupClassMember: false, bool isHint: false}) {
if (receiverType.treatAsDynamic) {
return const DynamicAccess();
}
@@ -745,8 +726,8 @@
// Compute the access of [name] on [type]. This function takes the special
// 'call' method into account.
- ElementAccess getAccess(Name name,
- DartType unaliasedBound, InterfaceType interface) {
+ ElementAccess getAccess(
+ Name name, DartType unaliasedBound, InterfaceType interface) {
MemberSignature member = lookupMemberSignature(memberName, interface);
if (member != null) {
return new MemberAccess(member);
@@ -809,11 +790,13 @@
if (memberName.isSimilarTo(member.name)) {
PrivateName privateName = member.name;
reportMessage(
- node,
- MessageKind.PRIVATE_ACCESS,
- {'name': name,
- 'libraryName': privateName.library.libraryOrScriptName},
- isHint: isHint);
+ node,
+ MessageKind.PRIVATE_ACCESS,
+ {
+ 'name': name,
+ 'libraryName': privateName.library.libraryOrScriptName
+ },
+ isHint: isHint);
foundPrivateMember = true;
}
}
@@ -824,7 +807,6 @@
} else {
interface.element.forEachInterfaceMember(findPrivateMember);
}
-
}
if (!foundPrivateMember) {
switch (memberKind) {
@@ -842,7 +824,8 @@
if (lookupMemberSignature(memberName.setter, interface) != null) {
// A setter is present so warn explicitly about the missing
// getter.
- reportMessage(node,
+ reportMessage(
+ node,
MessageKind.UNDEFINED_INSTANCE_GETTER_BUT_SETTER,
{'className': receiverType.name, 'memberName': name},
isHint: isHint);
@@ -874,20 +857,19 @@
return const DynamicAccess();
}
- DartType lookupMemberType(Node node, DartType type, String name,
- MemberKind memberKind,
- {bool isHint: false}) {
+ DartType lookupMemberType(
+ Node node, DartType type, String name, MemberKind memberKind,
+ {bool isHint: false}) {
return lookupMember(node, type, name, memberKind, null, isHint: isHint)
.computeType(resolution);
}
void analyzeArguments(Send send, Element element, DartType type,
- [LinkBuilder<DartType> argumentTypes]) {
+ [LinkBuilder<DartType> argumentTypes]) {
Link<Node> arguments = send.arguments;
type.computeUnaliased(resolution);
DartType unaliasedType = type.unaliased;
if (identical(unaliasedType.kind, TypeKind.FUNCTION)) {
-
/// Report [warning] including info(s) about the declaration of [element]
/// or [type].
void reportWarning(DiagnosticMessage warning) {
@@ -898,10 +880,8 @@
if (declaration == null) {
declaration = type.element;
} else if (type.isTypedef) {
- infos.add(reporter.createMessage(
- declaration,
- MessageKind.THIS_IS_THE_DECLARATION,
- {'name': element.name}));
+ infos.add(reporter.createMessage(declaration,
+ MessageKind.THIS_IS_THE_DECLARATION, {'name': element.name}));
declaration = type.element;
}
if (declaration != null) {
@@ -913,13 +893,10 @@
/// Report a warning on [node] if [argumentType] is not assignable to
/// [parameterType].
- void checkAssignable(Spannable node,
- DartType argumentType,
- DartType parameterType) {
+ void checkAssignable(
+ Spannable node, DartType argumentType, DartType parameterType) {
if (!types.isAssignable(argumentType, parameterType)) {
- reportWarning(reporter.createMessage(
- node,
- MessageKind.NOT_ASSIGNABLE,
+ reportWarning(reporter.createMessage(node, MessageKind.NOT_ASSIGNABLE,
{'fromType': argumentType, 'toType': parameterType}));
}
}
@@ -954,7 +931,6 @@
} else {
if (!parameterTypes.moveNext()) {
if (!optionalParameterTypes.moveNext()) {
-
// TODO(johnniwinther): Provide better information on the
// called function.
reportWarning(reporter.createMessage(
@@ -979,12 +955,11 @@
if (parameterTypes.moveNext()) {
// TODO(johnniwinther): Provide better information on the called
// function.
- reportWarning(reporter.createMessage(
- send, MessageKind.MISSING_ARGUMENT,
+ reportWarning(reporter.createMessage(send, MessageKind.MISSING_ARGUMENT,
{'argumentType': parameterTypes.current}));
}
} else {
- while(!arguments.isEmpty) {
+ while (!arguments.isEmpty) {
DartType argumentType = analyze(arguments.head);
if (argumentTypes != null) argumentTypes.addLast(argumentType);
arguments = arguments.tail;
@@ -997,15 +972,15 @@
// If provided [argumentTypes] is filled with the argument types during
// analysis.
DartType analyzeInvocation(Send node, ElementAccess elementAccess,
- [LinkBuilder<DartType> argumentTypes]) {
+ [LinkBuilder<DartType> argumentTypes]) {
DartType type = elementAccess.computeType(resolution);
if (elementAccess.isCallable(compiler)) {
analyzeArguments(node, elementAccess.element, type, argumentTypes);
} else {
- reportTypeWarning(node, MessageKind.NOT_CALLABLE,
- {'elementName': elementAccess.name});
- analyzeArguments(node, elementAccess.element, const DynamicType(),
- argumentTypes);
+ reportTypeWarning(
+ node, MessageKind.NOT_CALLABLE, {'elementName': elementAccess.name});
+ analyzeArguments(
+ node, elementAccess.element, const DynamicType(), argumentTypes);
}
type.computeUnaliased(resolution);
type = type.unaliased;
@@ -1021,9 +996,9 @@
* Computes the [ElementAccess] for [name] on the [node] possibly using the
* [element] provided for [node] by the resolver.
*/
- ElementAccess computeAccess(Send node, String name, Element element,
- MemberKind memberKind,
- {bool lookupClassMember: false}) {
+ ElementAccess computeAccess(
+ Send node, String name, Element element, MemberKind memberKind,
+ {bool lookupClassMember: false}) {
if (Elements.isMalformed(element)) {
return const DynamicAccess();
}
@@ -1045,10 +1020,10 @@
if (receiverType.treatAsDynamic || receiverType.isVoid) {
return const DynamicAccess();
}
- return lookupMember(node, receiverType, name, memberKind,
- elements[node.receiver],
- lookupClassMember: lookupClassMember ||
- element != null && element.isStatic);
+ return lookupMember(
+ node, receiverType, name, memberKind, elements[node.receiver],
+ lookupClassMember:
+ lookupClassMember || element != null && element.isStatic);
} else {
return computeResolvedAccess(node, name, element, memberKind);
}
@@ -1058,8 +1033,8 @@
* Computes the [ElementAccess] for [name] on the [node] using the [element]
* provided for [node] by the resolver.
*/
- ElementAccess computeResolvedAccess(Send node, String name,
- Element element, MemberKind memberKind) {
+ ElementAccess computeResolvedAccess(
+ Send node, String name, Element element, MemberKind memberKind) {
if (element == null) {
// foo() where foo is unresolved.
return lookupMember(node, thisType, name, memberKind, null);
@@ -1079,22 +1054,19 @@
} else if (element.isFunction) {
// foo() where foo is a method in the same class.
return createResolvedAccess(node, name, element);
- } else if (element.isVariable ||
- element.isParameter ||
- element.isField) {
+ } else if (element.isVariable || element.isParameter || element.isField) {
// foo() where foo is a field in the same class.
return createResolvedAccess(node, name, element);
} else if (element.isGetter || element.isSetter) {
return createResolvedAccess(node, name, element);
} else {
- reporter.internalError(element,
- 'Unexpected element kind ${element.kind}.');
+ reporter.internalError(
+ element, 'Unexpected element kind ${element.kind}.');
return null;
}
}
- ElementAccess createResolvedAccess(Send node, String name,
- Element element) {
+ ElementAccess createResolvedAccess(Send node, String name, Element element) {
checkPrivateAccess(node, element, name);
return createPromotedAccess(element);
}
@@ -1113,12 +1085,12 @@
* Computes the type of the access of [name] on the [node] possibly using the
* [element] provided for [node] by the resolver.
*/
- DartType computeAccessType(Send node, String name, Element element,
- MemberKind memberKind,
- {bool lookupClassMember: false}) {
- DartType type =
- computeAccess(node, name, element, memberKind,
- lookupClassMember: lookupClassMember).computeType(resolution);
+ DartType computeAccessType(
+ Send node, String name, Element element, MemberKind memberKind,
+ {bool lookupClassMember: false}) {
+ DartType type = computeAccess(node, name, element, memberKind,
+ lookupClassMember: lookupClassMember)
+ .computeType(resolution);
if (type == null) {
reporter.internalError(node, 'Type is null on access of $name on $node.');
}
@@ -1129,8 +1101,7 @@
/// This is used to provided better hints when trying to promote a supertype
/// to a raw subtype. For instance trying to promote `Iterable<int>` to `List`
/// we suggest the use of `List<int>`, which would make promotion valid.
- DartType computeMoreSpecificType(DartType shownType,
- DartType knownType) {
+ DartType computeMoreSpecificType(DartType shownType, DartType knownType) {
if (knownType.isInterfaceType &&
shownType.isInterfaceType &&
types.isSubtype(shownType.asRaw(), knownType)) {
@@ -1146,8 +1117,8 @@
// the relation between `A<S, int>` and `A<double, int>`.
MoreSpecificSubtypeVisitor visitor =
new MoreSpecificSubtypeVisitor(types);
- InterfaceType shownTypeGeneric = visitor.computeMoreSpecific(
- shownClass, knownInterfaceType);
+ InterfaceType shownTypeGeneric =
+ visitor.computeMoreSpecific(shownClass, knownInterfaceType);
if (shownTypeGeneric != null &&
types.isMoreSpecific(shownTypeGeneric, knownType)) {
@@ -1157,7 +1128,6 @@
}
}
return null;
-
}
static bool _fyiShown = false;
@@ -1166,7 +1136,8 @@
if (const bool.fromEnvironment('send_stats') &&
executableContext != null &&
// TODO(sigmund): enable also in core libs.
- !executableContext.library.isPlatformLibrary && !type.isDynamic) {
+ !executableContext.library.isPlatformLibrary &&
+ !type.isDynamic) {
if (!_fyiShown) {
print('FYI experiment to collect send stats is on: '
'caching types of expressions');
@@ -1236,8 +1207,7 @@
}
}
- if (variable != null &&
- (variable.isVariable || variable.isParameter)) {
+ if (variable != null && (variable.isVariable || variable.isParameter)) {
DartType knownType = getKnownType(variable);
if (!knownType.isDynamic) {
DartType shownType = elements.getType(node.arguments.head);
@@ -1247,29 +1217,29 @@
String variableName = variable.name;
if (!types.isSubtype(shownType, knownType)) {
typePromotion.addHint(reporter.createMessage(
- node,
- MessageKind.NOT_MORE_SPECIFIC_SUBTYPE,
- {'variableName': variableName,
- 'shownType': shownType,
- 'knownType': knownType}));
+ node, MessageKind.NOT_MORE_SPECIFIC_SUBTYPE, {
+ 'variableName': variableName,
+ 'shownType': shownType,
+ 'knownType': knownType
+ }));
} else {
DartType shownTypeSuggestion =
computeMoreSpecificType(shownType, knownType);
if (shownTypeSuggestion != null) {
typePromotion.addHint(reporter.createMessage(
- node,
- MessageKind.NOT_MORE_SPECIFIC_SUGGESTION,
- {'variableName': variableName,
- 'shownType': shownType,
- 'shownTypeSuggestion': shownTypeSuggestion,
- 'knownType': knownType}));
+ node, MessageKind.NOT_MORE_SPECIFIC_SUGGESTION, {
+ 'variableName': variableName,
+ 'shownType': shownType,
+ 'shownTypeSuggestion': shownTypeSuggestion,
+ 'knownType': knownType
+ }));
} else {
typePromotion.addHint(reporter.createMessage(
- node,
- MessageKind.NOT_MORE_SPECIFIC,
- {'variableName': variableName,
- 'shownType': shownType,
- 'knownType': knownType}));
+ node, MessageKind.NOT_MORE_SPECIFIC, {
+ 'variableName': variableName,
+ 'shownType': shownType,
+ 'knownType': knownType
+ }));
}
}
}
@@ -1278,15 +1248,19 @@
}
}
return boolType;
- } if (node.isOperator && identical(name, 'as')) {
+ }
+ if (node.isOperator && identical(name, 'as')) {
analyze(node.receiver);
return elements.getType(node.arguments.head);
} else if (node.isOperator) {
final Node receiver = node.receiver;
final DartType receiverType = analyze(receiver);
- if (identical(name, '==') || identical(name, '!=')
+ if (identical(name, '==') ||
+ identical(name, '!=')
// TODO(johnniwinther): Remove these.
- || identical(name, '===') || identical(name, '!==')) {
+ ||
+ identical(name, '===') ||
+ identical(name, '!==')) {
// Analyze argument.
analyze(node.arguments.head);
return boolType;
@@ -1321,24 +1295,34 @@
if (identical(name, '-') && node.arguments.isEmpty) {
operatorName = 'unary-';
}
- assert(invariant(node,
- identical(name, '+') || identical(name, '=') ||
- identical(name, '-') || identical(name, '*') ||
- identical(name, '/') || identical(name, '%') ||
- identical(name, '~/') || identical(name, '|') ||
- identical(name, '&') || identical(name, '^') ||
- identical(name, '~')|| identical(name, '<<') ||
- identical(name, '>>') ||
- identical(name, '<') || identical(name, '>') ||
- identical(name, '<=') || identical(name, '>=') ||
- identical(name, '[]'),
- message: 'Unexpected operator $name'));
+ assert(invariant(
+ node,
+ identical(name, '+') ||
+ identical(name, '=') ||
+ identical(name, '-') ||
+ identical(name, '*') ||
+ identical(name, '/') ||
+ identical(name, '%') ||
+ identical(name, '~/') ||
+ identical(name, '|') ||
+ identical(name, '&') ||
+ identical(name, '^') ||
+ identical(name, '~') ||
+ identical(name, '<<') ||
+ identical(name, '>>') ||
+ identical(name, '<') ||
+ identical(name, '>') ||
+ identical(name, '<=') ||
+ identical(name, '>=') ||
+ identical(name, '[]'),
+ message: 'Unexpected operator $name'));
// TODO(karlklose): handle `void` in expression context by calling
// [analyzeNonVoid] instead of [analyze].
- ElementAccess access = receiverType.isVoid ? const DynamicAccess()
- : lookupMember(node, receiverType, operatorName,
- MemberKind.OPERATOR, null);
+ ElementAccess access = receiverType.isVoid
+ ? const DynamicAccess()
+ : lookupMember(
+ node, receiverType, operatorName, MemberKind.OPERATOR, null);
LinkBuilder<DartType> argumentTypesBuilder = new LinkBuilder<DartType>();
DartType resultType =
analyzeInvocation(node, access, argumentTypesBuilder);
@@ -1387,10 +1371,8 @@
* of the result. This method also handles increment/decrement expressions
* like [: target++ :].
*/
- DartType checkAssignmentOperator(SendSet node,
- String operatorName,
- Node valueNode,
- DartType value) {
+ DartType checkAssignmentOperator(
+ SendSet node, String operatorName, Node valueNode, DartType value) {
assert(invariant(node, !node.isIndex));
Element setterElement = elements[node];
Element getterElement = elements[node.selector];
@@ -1423,18 +1405,15 @@
* of the result. This method also handles increment/decrement expressions
* like [: base[key]++ :].
*/
- DartType checkIndexAssignmentOperator(SendSet node,
- String operatorName,
- Node valueNode,
- DartType value) {
+ DartType checkIndexAssignmentOperator(
+ SendSet node, String operatorName, Node valueNode, DartType value) {
assert(invariant(node, node.isIndex));
final DartType base = analyze(node.receiver);
final Node keyNode = node.arguments.head;
final DartType key = analyze(keyNode);
// [indexGet] is the type of operator[] on [base].
- DartType indexGet = lookupMemberType(
- node, base, '[]', MemberKind.OPERATOR);
+ DartType indexGet = lookupMemberType(node, base, '[]', MemberKind.OPERATOR);
if (indexGet is FunctionType) {
FunctionType indexGetType = indexGet;
DartType indexGetKey = firstType(indexGetType.parameterTypes);
@@ -1444,8 +1423,8 @@
// [element] is the type of base[key].
DartType element = indexGetType.returnType;
// [operator] is the type of operator o on [element].
- DartType operator = lookupMemberType(
- node, element, operatorName, MemberKind.OPERATOR);
+ DartType operator =
+ lookupMemberType(node, element, operatorName, MemberKind.OPERATOR);
if (operator is FunctionType) {
FunctionType operatorType = operator;
@@ -1457,8 +1436,8 @@
DartType result = operatorType.returnType;
// [indexSet] is the type of operator[]= on [base].
- DartType indexSet = lookupMemberType(
- node, base, '[]=', MemberKind.OPERATOR);
+ DartType indexSet =
+ lookupMemberType(node, base, '[]=', MemberKind.OPERATOR);
if (indexSet is FunctionType) {
FunctionType indexSetType = indexSet;
DartType indexSetKey = firstType(indexSetType.parameterTypes);
@@ -1487,14 +1466,14 @@
if (identical(name, '=') || identical(name, '??=')) {
// e1 = value
if (node.isIndex) {
- // base[key] = value
+ // base[key] = value
final DartType base = analyze(node.receiver);
final Node keyNode = node.arguments.head;
final DartType key = analyze(keyNode);
final Node valueNode = node.arguments.tail.head;
final DartType value = analyze(valueNode);
- DartType indexSet = lookupMemberType(
- node, base, '[]=', MemberKind.OPERATOR);
+ DartType indexSet =
+ lookupMemberType(node, base, '[]=', MemberKind.OPERATOR);
DartType indexSetValue = const DynamicType();
if (indexSet is FunctionType) {
FunctionType indexSetType = indexSet;
@@ -1503,7 +1482,8 @@
indexSetValue = secondType(indexSetType.parameterTypes);
checkAssignable(node.assignmentOperator, value, indexSetValue);
}
- return identical(name, '=') ? value
+ return identical(name, '=')
+ ? value
: types.computeLeastUpperBound(value, indexSetValue);
} else {
// target = value
@@ -1512,8 +1492,9 @@
// Field declaration `Foo target = value;` or initializer
// `this.target = value`. Lookup the getter `target` in the class
// members.
- target = computeAccessType(node, selector.source, element,
- MemberKind.GETTER, lookupClassMember: true);
+ target = computeAccessType(
+ node, selector.source, element, MemberKind.GETTER,
+ lookupClassMember: true);
} else {
// Normal assignment `target = value`.
target = computeAccessType(
@@ -1522,7 +1503,8 @@
final Node valueNode = node.arguments.head;
final DartType value = analyze(valueNode);
checkAssignable(node.assignmentOperator, value, target);
- return identical(name, '=') ? value
+ return identical(name, '=')
+ ? value
: types.computeLeastUpperBound(value, target);
}
} else if (identical(name, '++') || identical(name, '--')) {
@@ -1541,17 +1523,39 @@
// e1 o= e2 for some operator o.
String operatorName;
switch (name) {
- case '+=': operatorName = '+'; break;
- case '-=': operatorName = '-'; break;
- case '*=': operatorName = '*'; break;
- case '/=': operatorName = '/'; break;
- case '%=': operatorName = '%'; break;
- case '~/=': operatorName = '~/'; break;
- case '&=': operatorName = '&'; break;
- case '|=': operatorName = '|'; break;
- case '^=': operatorName = '^'; break;
- case '<<=': operatorName = '<<'; break;
- case '>>=': operatorName = '>>'; break;
+ case '+=':
+ operatorName = '+';
+ break;
+ case '-=':
+ operatorName = '-';
+ break;
+ case '*=':
+ operatorName = '*';
+ break;
+ case '/=':
+ operatorName = '/';
+ break;
+ case '%=':
+ operatorName = '%';
+ break;
+ case '~/=':
+ operatorName = '~/';
+ break;
+ case '&=':
+ operatorName = '&';
+ break;
+ case '|=':
+ operatorName = '|';
+ break;
+ case '^=':
+ operatorName = '^';
+ break;
+ case '<<=':
+ operatorName = '<<';
+ break;
+ case '>>=':
+ operatorName = '>>';
+ break;
default:
reporter.internalError(node, 'Unexpected assignment operator $name.');
}
@@ -1600,8 +1604,8 @@
return coreTypes.symbolType;
}
- DartType computeConstructorType(ConstructorElement constructor,
- DartType type) {
+ DartType computeConstructorType(
+ ConstructorElement constructor, DartType type) {
if (Elements.isUnresolved(constructor)) return const DynamicType();
DartType constructorType = constructor.computeType(resolution);
if (identical(type.kind, TypeKind.INTERFACE)) {
@@ -1613,8 +1617,8 @@
while (receiverElement.isMixinApplication) {
receiverElement = receiverElement.supertype.element;
}
- constructorType = constructorType.substByContext(
- interfaceType.asInstanceOf(receiverElement));
+ constructorType = constructorType
+ .substByContext(interfaceType.asInstanceOf(receiverElement));
} else {
constructorType = constructorType.substByContext(type);
}
@@ -1638,8 +1642,8 @@
InterfaceType listType = elements.getType(node);
DartType listElementType = firstType(listType.typeArguments);
for (Link<Node> link = node.elements.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
Node element = link.head;
DartType elementType = analyze(element);
checkAssignable(element, elementType, listElementType,
@@ -1699,8 +1703,8 @@
// conditions hold:
// - f is not a generative constructor.
// - The return type of f may not be assigned to void.
- reportTypeWarning(node, MessageKind.RETURN_NOTHING,
- {'returnType': expectedReturnType});
+ reportTypeWarning(
+ node, MessageKind.RETURN_NOTHING, {'returnType': expectedReturnType});
}
return const StatementType();
}
@@ -1748,8 +1752,9 @@
reportTypeWarning(node.type, MessageKind.VOID_VARIABLE);
type = const DynamicType();
}
- for (Link<Node> link = node.definitions.nodes; !link.isEmpty;
- link = link.tail) {
+ for (Link<Node> link = node.definitions.nodes;
+ !link.isEmpty;
+ link = link.tail) {
Node definition = link.head;
invariant(definition, definition is Identifier || definition is SendSet,
message: 'expected identifier or initialization');
@@ -1826,8 +1831,7 @@
VariableDefinitions declaredIdentifier =
node.declaredIdentifier.asVariableDefinitions();
if (declaredIdentifier != null) {
- return
- analyzeWithDefault(declaredIdentifier.type, const DynamicType());
+ return analyzeWithDefault(declaredIdentifier.type, const DynamicType());
} else {
return analyze(node.declaredIdentifier);
}
@@ -1838,8 +1842,7 @@
DartType expressionType = analyze(node.expression);
DartType streamOfDynamic = coreTypes.streamType();
if (!types.isAssignable(expressionType, streamOfDynamic)) {
- reportMessage(node.expression,
- MessageKind.NOT_ASSIGNABLE,
+ reportMessage(node.expression, MessageKind.NOT_ASSIGNABLE,
{'fromType': expressionType, 'toType': streamOfDynamic},
isHint: true);
} else {
@@ -1851,11 +1854,14 @@
if (streamType != null) {
DartType streamElementType = streamType.typeArguments.first;
if (!types.isAssignable(streamElementType, elementType)) {
- reportMessage(node.expression,
+ reportMessage(
+ node.expression,
MessageKind.FORIN_NOT_ASSIGNABLE,
- {'currentType': streamElementType,
- 'expressionType': expressionType,
- 'elementType': elementType},
+ {
+ 'currentType': streamElementType,
+ 'expressionType': expressionType,
+ 'elementType': elementType
+ },
isHint: true);
}
}
@@ -1868,17 +1874,20 @@
visitSyncForIn(SyncForIn node) {
DartType elementType = computeForInElementType(node);
DartType expressionType = analyze(node.expression);
- DartType iteratorType = lookupMemberType(node.expression,
- expressionType, Identifiers.iterator, MemberKind.GETTER);
- DartType currentType = lookupMemberType(node.expression,
- iteratorType, Identifiers.current, MemberKind.GETTER,
- isHint: true);
+ DartType iteratorType = lookupMemberType(node.expression, expressionType,
+ Identifiers.iterator, MemberKind.GETTER);
+ DartType currentType = lookupMemberType(
+ node.expression, iteratorType, Identifiers.current, MemberKind.GETTER,
+ isHint: true);
if (!types.isAssignable(currentType, elementType)) {
- reportMessage(node.expression,
+ reportMessage(
+ node.expression,
MessageKind.FORIN_NOT_ASSIGNABLE,
- {'currentType': currentType,
- 'expressionType': expressionType,
- 'elementType': elementType},
+ {
+ 'currentType': currentType,
+ 'expressionType': expressionType,
+ 'elementType': elementType
+ },
isHint: true);
}
analyze(node.body);
@@ -1895,8 +1904,8 @@
DartType mapValueType = secondType(mapType.typeArguments);
bool isConst = node.isConst;
for (Link<Node> link = node.entries.nodes;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
LiteralMapEntry entry = link.head;
DartType keyType = analyze(entry.key);
checkAssignable(entry.key, keyType, mapKeyType, isConst: isConst);
@@ -1945,7 +1954,7 @@
<ConstantValue, FieldElement>{};
List<FieldElement> unreferencedFields = <FieldElement>[];
EnumClassElement enumClass = expressionType.element;
- enumClass.enumValues.forEach((FieldElement field) {
+ enumClass.enumValues.forEach((EnumConstantElement field) {
ConstantValue constantValue =
compiler.constants.getConstantValueForVariable(field);
if (constantValue == null) {
@@ -1960,21 +1969,20 @@
for (Node labelOrCase in switchCase.labelsAndCases) {
CaseMatch caseMatch = labelOrCase.asCaseMatch();
if (caseMatch != null) {
- ConstantExpression caseConstant =
- compiler.resolver.constantCompiler.compileNode(
- caseMatch.expression, elements);
- enumValues.remove(
- compiler.constants.getConstantValue(caseConstant));
+ ConstantExpression caseConstant = compiler
+ .resolver.constantCompiler
+ .compileNode(caseMatch.expression, elements);
+ enumValues
+ .remove(compiler.constants.getConstantValue(caseConstant));
}
}
}
unreferencedFields.addAll(enumValues.values);
if (!unreferencedFields.isEmpty) {
- reporter.reportWarningMessage(
- node, MessageKind.MISSING_ENUM_CASES,
- {'enumType': expressionType,
- 'enumValues': unreferencedFields.map(
- (e) => e.name).join(', ')});
+ reporter.reportWarningMessage(node, MessageKind.MISSING_ENUM_CASES, {
+ 'enumType': expressionType,
+ 'enumValues': unreferencedFields.map((e) => e.name).join(', ')
+ });
}
});
}
diff --git a/pkg/compiler/lib/src/types/abstract_value_domain.dart b/pkg/compiler/lib/src/types/abstract_value_domain.dart
index 9adc868..e19da52 100644
--- a/pkg/compiler/lib/src/types/abstract_value_domain.dart
+++ b/pkg/compiler/lib/src/types/abstract_value_domain.dart
@@ -9,9 +9,7 @@
import '../elements/elements.dart';
import '../universe/selector.dart' show Selector;
-enum AbstractBool {
- True, False, Maybe, Nothing
-}
+enum AbstractBool { True, False, Maybe, Nothing }
/// A value in an abstraction of runtime values.
abstract class AbstractValue {}
@@ -127,7 +125,7 @@
bool isDefinitelyMutableIndexable(AbstractValue t, {bool allowNull: false});
bool isDefinitelyFixedLengthIndexable(AbstractValue t,
- {bool allowNull: false});
+ {bool allowNull: false});
bool isDefinitelyIntercepted(AbstractValue t, {bool allowNull});
@@ -141,9 +139,8 @@
bool isMorePreciseOrEqual(AbstractValue t1, AbstractValue t2);
- AbstractBool isSubtypeOf(AbstractValue value,
- DartType type,
- {bool allowNull});
+ AbstractBool isSubtypeOf(AbstractValue value, DartType type,
+ {bool allowNull});
/// Returns whether [value] is one of the falsy values: false, 0, -0, NaN,
/// the empty string, or null.
@@ -167,6 +164,6 @@
/// Returns the type of the entry of [container] at a given index.
/// Returns `null` if unknown.
- AbstractValue indexWithConstant(AbstractValue container,
- ConstantValue indexValue);
+ AbstractValue indexWithConstant(
+ AbstractValue container, ConstantValue indexValue);
}
diff --git a/pkg/compiler/lib/src/types/constants.dart b/pkg/compiler/lib/src/types/constants.dart
index e7ecab1..a3b2faa 100644
--- a/pkg/compiler/lib/src/types/constants.dart
+++ b/pkg/compiler/lib/src/types/constants.dart
@@ -5,11 +5,9 @@
library types.constants;
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../constants/values.dart';
-import '../js_backend/js_backend.dart' show
- SyntheticConstantKind;
+import '../js_backend/js_backend.dart' show SyntheticConstantKind;
import 'types.dart';
/// Computes the [TypeMask] for the constant [value].
@@ -21,8 +19,8 @@
const ConstantValueTypeMasks();
@override
- TypeMask visitConstructed(ConstructedConstantValue constant,
- Compiler compiler) {
+ TypeMask visitConstructed(
+ ConstructedConstantValue constant, Compiler compiler) {
if (compiler.backend.isInterceptorClass(constant.type.element)) {
return compiler.typesTask.nonNullType;
}
@@ -61,8 +59,8 @@
return compiler.typesTask.stringType;
default:
DiagnosticReporter reporter = compiler.reporter;
- reporter.internalError(CURRENT_ELEMENT_SPANNABLE,
- "Unexpected DummyConstantKind.");
+ reporter.internalError(
+ CURRENT_ELEMENT_SPANNABLE, "Unexpected DummyConstantKind.");
return null;
}
}
@@ -86,8 +84,8 @@
}
@override
- TypeMask visitInterceptor(InterceptorConstantValue constant,
- Compiler compiler) {
+ TypeMask visitInterceptor(
+ InterceptorConstantValue constant, Compiler compiler) {
return compiler.typesTask.nonNullType;
}
diff --git a/pkg/compiler/lib/src/types/container_type_mask.dart b/pkg/compiler/lib/src/types/container_type_mask.dart
index c38a03a..6a6ad80 100644
--- a/pkg/compiler/lib/src/types/container_type_mask.dart
+++ b/pkg/compiler/lib/src/types/container_type_mask.dart
@@ -22,29 +22,20 @@
// The length of the container.
final int length;
- ContainerTypeMask(this.forwardTo,
- this.allocationNode,
- this.allocationElement,
- this.elementType,
- this.length);
+ ContainerTypeMask(this.forwardTo, this.allocationNode, this.allocationElement,
+ this.elementType, this.length);
TypeMask nullable() {
return isNullable
? this
- : new ContainerTypeMask(forwardTo.nullable(),
- allocationNode,
- allocationElement,
- elementType,
- length);
+ : new ContainerTypeMask(forwardTo.nullable(), allocationNode,
+ allocationElement, elementType, length);
}
TypeMask nonNullable() {
return isNullable
- ? new ContainerTypeMask(forwardTo.nonNullable(),
- allocationNode,
- allocationElement,
- elementType,
- length)
+ ? new ContainerTypeMask(forwardTo.nonNullable(), allocationNode,
+ allocationElement, elementType, length)
: this;
}
@@ -62,9 +53,7 @@
TypeMask intersection(TypeMask other, ClassWorld classWorld) {
TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
- return forwardIntersection.isNullable
- ? nullable()
- : nonNullable();
+ return forwardIntersection.isNullable ? nullable() : nonNullable();
}
TypeMask union(other, ClassWorld classWorld) {
@@ -74,9 +63,9 @@
return other.isNullable ? other : this;
} else if (other.isEmptyOrNull) {
return other.isNullable ? this.nullable() : this;
- } else if (other.isContainer
- && elementType != null
- && other.elementType != null) {
+ } else if (other.isContainer &&
+ elementType != null &&
+ other.elementType != null) {
TypeMask newElementType =
elementType.union(other.elementType, classWorld);
int newLength = (length == other.length) ? length : null;
@@ -84,15 +73,17 @@
return new ContainerTypeMask(
newForwardTo,
allocationNode == other.allocationNode ? allocationNode : null,
- allocationElement == other.allocationElement ? allocationElement
- : null,
- newElementType, newLength);
+ allocationElement == other.allocationElement
+ ? allocationElement
+ : null,
+ newElementType,
+ newLength);
} else {
return forwardTo.union(other, classWorld);
}
}
- bool operator==(other) => super == other;
+ bool operator ==(other) => super == other;
int get hashCode {
return computeHashCode(
diff --git a/pkg/compiler/lib/src/types/dictionary_type_mask.dart b/pkg/compiler/lib/src/types/dictionary_type_mask.dart
index cba828f..74f9fdd 100644
--- a/pkg/compiler/lib/src/types/dictionary_type_mask.dart
+++ b/pkg/compiler/lib/src/types/dictionary_type_mask.dart
@@ -16,30 +16,21 @@
// The underlying key/value map of this dictionary.
final Map<String, TypeMask> typeMap;
- DictionaryTypeMask(forwardTo,
- allocationNode,
- allocationElement,
- keyType, valueType,
- this.typeMap) :
- super(forwardTo, allocationNode, allocationElement, keyType, valueType);
+ DictionaryTypeMask(forwardTo, allocationNode, allocationElement, keyType,
+ valueType, this.typeMap)
+ : super(forwardTo, allocationNode, allocationElement, keyType, valueType);
TypeMask nullable() {
return isNullable
? this
- : new DictionaryTypeMask(forwardTo.nullable(),
- allocationNode,
- allocationElement,
- keyType, valueType,
- typeMap);
+ : new DictionaryTypeMask(forwardTo.nullable(), allocationNode,
+ allocationElement, keyType, valueType, typeMap);
}
TypeMask nonNullable() {
return isNullable
- ? new DictionaryTypeMask(forwardTo.nonNullable(),
- allocationNode,
- allocationElement,
- keyType, valueType,
- typeMap)
+ ? new DictionaryTypeMask(forwardTo.nonNullable(), allocationNode,
+ allocationElement, keyType, valueType, typeMap)
: this;
}
@@ -49,20 +40,17 @@
bool equalsDisregardNull(other) {
if (other is! DictionaryTypeMask) return false;
return allocationNode == other.allocationNode &&
- keyType == other.keyType &&
- valueType == other.valueType &&
- typeMap.keys.every((k) => other.typeMap.containsKey(k)) &&
- other.typeMap.keys.every((k) => typeMap.containsKey(k) &&
- typeMap[k] == other.typeMap[k]);
-
+ keyType == other.keyType &&
+ valueType == other.valueType &&
+ typeMap.keys.every((k) => other.typeMap.containsKey(k)) &&
+ other.typeMap.keys.every(
+ (k) => typeMap.containsKey(k) && typeMap[k] == other.typeMap[k]);
}
TypeMask intersection(TypeMask other, ClassWorld classWorld) {
TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
- return forwardIntersection.isNullable
- ? nullable()
- : nonNullable();
+ return forwardIntersection.isNullable ? nullable() : nonNullable();
}
TypeMask union(other, ClassWorld classWorld) {
@@ -77,42 +65,40 @@
TypeMask newKeyType = keyType.union(other.keyType, classWorld);
TypeMask newValueType = valueType.union(other.valueType, classWorld);
Map<String, TypeMask> mappings = <String, TypeMask>{};
- typeMap.forEach((k,v) {
- if (!other.typeMap.containsKey(k)) {
- mappings[k] = v.nullable();
- }
- });
- other.typeMap.forEach((k,v) {
+ typeMap.forEach((k, v) {
+ if (!other.typeMap.containsKey(k)) {
+ mappings[k] = v.nullable();
+ }
+ });
+ other.typeMap.forEach((k, v) {
if (typeMap.containsKey(k)) {
mappings[k] = v.union(typeMap[k], classWorld);
} else {
mappings[k] = v.nullable();
}
});
- return new DictionaryTypeMask(newForwardTo, null, null,
- newKeyType, newValueType, mappings);
+ return new DictionaryTypeMask(
+ newForwardTo, null, null, newKeyType, newValueType, mappings);
} else if (other.isMap &&
- (other.keyType != null) &&
- (other.valueType != null)) {
+ (other.keyType != null) &&
+ (other.valueType != null)) {
TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
TypeMask newKeyType = keyType.union(other.keyType, classWorld);
TypeMask newValueType = valueType.union(other.valueType, classWorld);
- return new MapTypeMask(newForwardTo, null, null,
- newKeyType, newValueType);
+ return new MapTypeMask(
+ newForwardTo, null, null, newKeyType, newValueType);
} else {
return forwardTo.union(other, classWorld);
}
}
- bool operator==(other) => super == other;
+ bool operator ==(other) => super == other;
int get hashCode {
- return computeHashCode(
- allocationNode, isNullable, typeMap, forwardTo);
+ return computeHashCode(allocationNode, isNullable, typeMap, forwardTo);
}
String toString() {
- return
- 'Dictionary mask: [$keyType/$valueType with $typeMap] type: $forwardTo';
+ return 'Dictionary mask: [$keyType/$valueType with $typeMap] type: $forwardTo';
}
}
diff --git a/pkg/compiler/lib/src/types/flat_type_mask.dart b/pkg/compiler/lib/src/types/flat_type_mask.dart
index 5939147..0ad5cd7 100644
--- a/pkg/compiler/lib/src/types/flat_type_mask.dart
+++ b/pkg/compiler/lib/src/types/flat_type_mask.dart
@@ -9,10 +9,10 @@
* base type.
*/
class FlatTypeMask implements TypeMask {
- static const int EMPTY = 0;
- static const int EXACT = 1;
+ static const int EMPTY = 0;
+ static const int EXACT = 1;
static const int SUBCLASS = 2;
- static const int SUBTYPE = 3;
+ static const int SUBTYPE = 3;
final ClassElement base;
final int flags;
@@ -20,15 +20,18 @@
FlatTypeMask(ClassElement base, int kind, bool isNullable)
: this.internal(base, (kind << 1) | (isNullable ? 1 : 0));
- FlatTypeMask.exact(ClassElement base)
- : this.internal(base, (EXACT << 1) | 1);
+ FlatTypeMask.exact(ClassElement base) : this.internal(base, (EXACT << 1) | 1);
FlatTypeMask.subclass(ClassElement base)
: this.internal(base, (SUBCLASS << 1) | 1);
FlatTypeMask.subtype(ClassElement base)
: this.internal(base, (SUBTYPE << 1) | 1);
- const FlatTypeMask.nonNullEmpty(): base = null, flags = 0;
- const FlatTypeMask.empty() : base = null, flags = 1;
+ const FlatTypeMask.nonNullEmpty()
+ : base = null,
+ flags = 0;
+ const FlatTypeMask.empty()
+ : base = null,
+ flags = 1;
FlatTypeMask.nonNullExact(ClassElement base)
: this.internal(base, EXACT << 1);
@@ -60,11 +63,11 @@
Map<ClassElement, TypeMask> cachedMasks =
world.canonicalizedTypeMasks[flags];
if (cachedMasks == null) {
- world.canonicalizedTypeMasks[flags] = cachedMasks =
- <ClassElement, TypeMask>{};
+ world.canonicalizedTypeMasks[flags] =
+ cachedMasks = <ClassElement, TypeMask>{};
}
- return cachedMasks.putIfAbsent(base,
- () => new FlatTypeMask.internal(base, flags));
+ return cachedMasks.putIfAbsent(
+ base, () => new FlatTypeMask.internal(base, flags));
}
bool get isEmpty => isEmptyOrNull && !isNullable;
@@ -119,21 +122,21 @@
Backend backend = classWorld.backend;
if (containsOnlyString(classWorld)) {
return cls == classWorld.stringClass ||
- cls == backend.stringImplementation;
+ cls == backend.stringImplementation;
}
if (containsOnlyBool(classWorld)) {
return cls == classWorld.boolClass || cls == backend.boolImplementation;
}
if (containsOnlyInt(classWorld)) {
- return cls == classWorld.intClass
- || cls == backend.intImplementation
- || cls == backend.positiveIntImplementation
- || cls == backend.uint32Implementation
- || cls == backend.uint31Implementation;
+ return cls == classWorld.intClass ||
+ cls == backend.intImplementation ||
+ cls == backend.positiveIntImplementation ||
+ cls == backend.uint32Implementation ||
+ cls == backend.uint31Implementation;
}
if (containsOnlyDouble(classWorld)) {
- return cls == classWorld.doubleClass
- || cls == backend.doubleImplementation;
+ return cls == classWorld.doubleClass ||
+ cls == backend.doubleImplementation;
}
return false;
}
@@ -153,8 +156,8 @@
// If other is exact, it only contains its base.
// TODO(herhut): Get rid of isSingleImplementationOf.
if (flatOther.isExact) {
- return (isExact && base == otherBase)
- || isSingleImplementationOf(otherBase, classWorld);
+ return (isExact && base == otherBase) ||
+ isSingleImplementationOf(otherBase, classWorld);
}
// If other is subclass, this has to be subclass, as well. Unless
// flatOther.base covers all subtypes of this. Currently, we only
@@ -176,37 +179,36 @@
bool containsOnlyInt(ClassWorld classWorld) {
Backend backend = classWorld.backend;
- return base == classWorld.intClass
- || base == backend.intImplementation
- || base == backend.positiveIntImplementation
- || base == backend.uint31Implementation
- || base == backend.uint32Implementation;
+ return base == classWorld.intClass ||
+ base == backend.intImplementation ||
+ base == backend.positiveIntImplementation ||
+ base == backend.uint31Implementation ||
+ base == backend.uint32Implementation;
}
bool containsOnlyDouble(ClassWorld classWorld) {
Backend backend = classWorld.backend;
- return base == classWorld.doubleClass
- || base == backend.doubleImplementation;
+ return base == classWorld.doubleClass ||
+ base == backend.doubleImplementation;
}
bool containsOnlyNum(ClassWorld classWorld) {
Backend backend = classWorld.backend;
- return containsOnlyInt(classWorld)
- || containsOnlyDouble(classWorld)
- || base == classWorld.numClass
- || base == backend.numImplementation;
+ return containsOnlyInt(classWorld) ||
+ containsOnlyDouble(classWorld) ||
+ base == classWorld.numClass ||
+ base == backend.numImplementation;
}
bool containsOnlyBool(ClassWorld classWorld) {
Backend backend = classWorld.backend;
- return base == classWorld.boolClass
- || base == backend.boolImplementation;
+ return base == classWorld.boolClass || base == backend.boolImplementation;
}
bool containsOnlyString(ClassWorld classWorld) {
Backend backend = classWorld.backend;
- return base == classWorld.stringClass
- || base == backend.stringImplementation;
+ return base == classWorld.stringClass ||
+ base == backend.stringImplementation;
}
bool containsOnly(ClassElement cls) {
@@ -227,7 +229,7 @@
*/
ClassElement singleClass(ClassWorld classWorld) {
if (isEmptyOrNull) return null;
- if (isNullable) return null; // It is Null and some other class.
+ if (isNullable) return null; // It is Null and some other class.
if (isExact) {
return base;
} else if (isSubclass) {
@@ -392,8 +394,8 @@
assert(a.isSubclass || a.isSubtype);
assert(b.isSubtype);
var elements = a.isSubclass
- ? classWorld.strictSubclassesOf(a.base)
- : classWorld.strictSubtypesOf(a.base);
+ ? classWorld.strictSubclassesOf(a.base)
+ : classWorld.strictSubtypesOf(a.base);
for (var element in elements) {
if (classWorld.isSubtypeOf(element, b.base)) return false;
}
@@ -418,8 +420,8 @@
}
}
- TypeMask intersectionStrictSubclass(FlatTypeMask other,
- ClassWorld classWorld) {
+ TypeMask intersectionStrictSubclass(
+ FlatTypeMask other, ClassWorld classWorld) {
assert(base != other.base);
assert(classWorld.isSubclassOf(other.base, base));
// If this mask isn't at least a subclass mask, then the
@@ -438,8 +440,8 @@
}
}
- TypeMask intersectionStrictSubtype(FlatTypeMask other,
- ClassWorld classWorld) {
+ TypeMask intersectionStrictSubtype(
+ FlatTypeMask other, ClassWorld classWorld) {
assert(base != other.base);
assert(classWorld.isSubtypeOf(other.base, base));
if (!isSubtype) return intersectionHelper(other, classWorld);
@@ -505,7 +507,8 @@
}
TypeMask intersectionEmpty(FlatTypeMask other) {
- return isNullable && other.isNullable ? new TypeMask.empty()
+ return isNullable && other.isNullable
+ ? new TypeMask.empty()
: new TypeMask.nonNullEmpty();
}
@@ -514,9 +517,8 @@
* invoked on an instance of [cls]. [selector] is used to ensure library
* privacy is taken into account.
*/
- static bool hasElementIn(ClassElement cls,
- Selector selector,
- Element element) {
+ static bool hasElementIn(
+ ClassElement cls, Selector selector, Element element) {
// Use [:implementation:] of [element]
// because our function set only stores declarations.
Element result = findMatchIn(cls, selector);
@@ -525,8 +527,7 @@
: result.implementation == element.implementation;
}
- static Element findMatchIn(ClassElement cls,
- Selector selector) {
+ static Element findMatchIn(ClassElement cls, Selector selector) {
// Use the [:implementation] of [cls] in case the found [element]
// is in the patch class.
return cls.implementation.lookupByName(selector.memberName);
@@ -561,24 +562,24 @@
return hasElementIn(self, selector, element);
} else if (isSubclass) {
assert(classWorld.isClosed);
- return hasElementIn(self, selector, element)
- || other.isSubclassOf(self)
- || classWorld.hasAnySubclassThatMixes(self, other);
+ return hasElementIn(self, selector, element) ||
+ other.isSubclassOf(self) ||
+ classWorld.hasAnySubclassThatMixes(self, other);
} else {
assert(isSubtype);
assert(classWorld.isClosed);
- bool result = hasElementIn(self, selector, element)
- || other.implementsInterface(self)
- || classWorld.hasAnySubclassThatImplements(other, base)
- || classWorld.hasAnySubclassOfMixinUseThatImplements(other, base);
+ bool result = hasElementIn(self, selector, element) ||
+ other.implementsInterface(self) ||
+ classWorld.hasAnySubclassThatImplements(other, base) ||
+ classWorld.hasAnySubclassOfMixinUseThatImplements(other, base);
if (result) return true;
// If the class is used as a mixin, we have to check if the element
// can be hit from any of the mixin applications.
Iterable<ClassElement> mixinUses = classWorld.mixinUsesOf(self);
return mixinUses.any((mixinApplication) =>
- hasElementIn(mixinApplication, selector, element)
- || other.isSubclassOf(mixinApplication)
- || classWorld.hasAnySubclassThatMixes(mixinApplication, other));
+ hasElementIn(mixinApplication, selector, element) ||
+ other.isSubclassOf(mixinApplication) ||
+ classWorld.hasAnySubclassThatMixes(mixinApplication, other));
}
}
@@ -586,9 +587,8 @@
* Returns whether a [selector] call on an instance of [cls]
* will hit a method at runtime, and not go through [noSuchMethod].
*/
- static bool hasConcreteMatch(ClassElement cls,
- Selector selector,
- ClassWorld world) {
+ static bool hasConcreteMatch(
+ ClassElement cls, Selector selector, ClassWorld world) {
assert(invariant(cls, world.isInstantiated(cls),
message: '$cls has not been instantiated.'));
Element element = findMatchIn(cls, selector);
@@ -661,8 +661,7 @@
// instance of them will be created at runtime, and
// therefore there is no instance that will require
// [noSuchMethod] handling.
- return !cls.isAbstract
- && !hasConcreteMatch(cls, selector, classWorld);
+ return !cls.isAbstract && !hasConcreteMatch(cls, selector, classWorld);
}
bool baseNeedsNoSuchMethod = needsNoSuchMethod(base);
@@ -679,12 +678,11 @@
}
return subclassesToCheck != null &&
- subclassesToCheck.any(needsNoSuchMethod);
+ subclassesToCheck.any(needsNoSuchMethod);
}
- Element locateSingleElement(Selector selector,
- TypeMask mask,
- Compiler compiler) {
+ Element locateSingleElement(
+ Selector selector, TypeMask mask, Compiler compiler) {
if (isEmptyOrNull) return null;
Iterable<Element> targets =
compiler.world.allFunctions.filter(selector, mask);
@@ -700,7 +698,7 @@
bool operator ==(var other) {
if (identical(this, other)) return true;
- if (other is !FlatTypeMask) return false;
+ if (other is! FlatTypeMask) return false;
FlatTypeMask otherMask = other;
return (flags == otherMask.flags) && (base == otherMask.base);
}
@@ -720,9 +718,8 @@
return "[$buffer]";
}
- static Set<ClassElement> commonContainedClasses(FlatTypeMask x,
- FlatTypeMask y,
- ClassWorld classWorld) {
+ static Set<ClassElement> commonContainedClasses(
+ FlatTypeMask x, FlatTypeMask y, ClassWorld classWorld) {
Iterable<ClassElement> xSubset = containedSubset(x, classWorld);
if (xSubset == null) return null;
Iterable<ClassElement> ySubset = containedSubset(y, classWorld);
@@ -730,8 +727,8 @@
return xSubset.toSet().intersection(ySubset.toSet());
}
- static Iterable<ClassElement> containedSubset(FlatTypeMask x,
- ClassWorld classWorld) {
+ static Iterable<ClassElement> containedSubset(
+ FlatTypeMask x, ClassWorld classWorld) {
ClassElement element = x.base;
if (x.isExact) {
return null;
diff --git a/pkg/compiler/lib/src/types/forwarding_type_mask.dart b/pkg/compiler/lib/src/types/forwarding_type_mask.dart
index 6212bb8..0e30bac 100644
--- a/pkg/compiler/lib/src/types/forwarding_type_mask.dart
+++ b/pkg/compiler/lib/src/types/forwarding_type_mask.dart
@@ -9,7 +9,6 @@
* implementation methods to it.
*/
abstract class ForwardingTypeMask implements TypeMask {
-
TypeMask get forwardTo;
ForwardingTypeMask();
@@ -102,9 +101,8 @@
return forwardTo.canHit(element, selector, classWorld);
}
- Element locateSingleElement(Selector selector,
- TypeMask mask,
- Compiler compiler) {
+ Element locateSingleElement(
+ Selector selector, TypeMask mask, Compiler compiler) {
return forwardTo.locateSingleElement(selector, mask, compiler);
}
@@ -117,7 +115,7 @@
}
}
- bool operator==(other) {
+ bool operator ==(other) {
return equalsDisregardNull(other) && isNullable == other.isNullable;
}
diff --git a/pkg/compiler/lib/src/types/map_type_mask.dart b/pkg/compiler/lib/src/types/map_type_mask.dart
index 52fe4a2..b3fbc96 100644
--- a/pkg/compiler/lib/src/types/map_type_mask.dart
+++ b/pkg/compiler/lib/src/types/map_type_mask.dart
@@ -24,29 +24,20 @@
// The key type of this map.
final TypeMask keyType;
- MapTypeMask(this.forwardTo,
- this.allocationNode,
- this.allocationElement,
- this.keyType,
- this.valueType);
+ MapTypeMask(this.forwardTo, this.allocationNode, this.allocationElement,
+ this.keyType, this.valueType);
TypeMask nullable() {
return isNullable
? this
- : new MapTypeMask(forwardTo.nullable(),
- allocationNode,
- allocationElement,
- keyType,
- valueType);
+ : new MapTypeMask(forwardTo.nullable(), allocationNode,
+ allocationElement, keyType, valueType);
}
TypeMask nonNullable() {
return isNullable
- ? new MapTypeMask(forwardTo.nonNullable(),
- allocationNode,
- allocationElement,
- keyType,
- valueType)
+ ? new MapTypeMask(forwardTo.nonNullable(), allocationNode,
+ allocationElement, keyType, valueType)
: this;
}
@@ -65,9 +56,7 @@
TypeMask intersection(TypeMask other, ClassWorld classWorld) {
TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
- return forwardIntersection.isNullable
- ? nullable()
- : nonNullable();
+ return forwardIntersection.isNullable ? nullable() : nonNullable();
}
TypeMask union(other, ClassWorld classWorld) {
@@ -78,14 +67,12 @@
} else if (other.isEmptyOrNull) {
return other.isNullable ? this.nullable() : this;
} else if (other.isMap &&
- keyType != null &&
- other.keyType != null &&
- valueType != null &&
- other.valueType != null) {
- TypeMask newKeyType =
- keyType.union(other.keyType, classWorld);
- TypeMask newValueType =
- valueType.union(other.valueType, classWorld);
+ keyType != null &&
+ other.keyType != null &&
+ valueType != null &&
+ other.valueType != null) {
+ TypeMask newKeyType = keyType.union(other.keyType, classWorld);
+ TypeMask newValueType = valueType.union(other.valueType, classWorld);
TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
return new MapTypeMask(
newForwardTo, null, null, newKeyType, newValueType);
@@ -93,21 +80,23 @@
assert(other.keyType == classWorld.compiler.typesTask.stringType);
TypeMask newKeyType = keyType.union(other.keyType, classWorld);
TypeMask newValueType =
- other.typeMap.values.fold(keyType, (p,n) => p.union(n, classWorld));
+ other.typeMap.values.fold(keyType, (p, n) => p.union(n, classWorld));
TypeMask newForwardTo = forwardTo.union(other.forwardTo, classWorld);
MapTypeMask newMapTypeMask = new MapTypeMask(
newForwardTo,
allocationNode == other.allocationNode ? allocationNode : null,
- allocationElement == other.allocationElement ? allocationElement
- : null,
- newKeyType, newValueType);
+ allocationElement == other.allocationElement
+ ? allocationElement
+ : null,
+ newKeyType,
+ newValueType);
return newMapTypeMask;
} else {
return forwardTo.union(other, classWorld);
}
}
- bool operator==(other) => super == other;
+ bool operator ==(other) => super == other;
int get hashCode {
return computeHashCode(
diff --git a/pkg/compiler/lib/src/types/type_mask.dart b/pkg/compiler/lib/src/types/type_mask.dart
index 2129fa9..d444afe 100644
--- a/pkg/compiler/lib/src/types/type_mask.dart
+++ b/pkg/compiler/lib/src/types/type_mask.dart
@@ -24,8 +24,7 @@
@override
bool needsNoSuchMethodHandling(Selector selector, ClassWorld world) {
if (isAll) {
- TypeMask mask =
- new TypeMask.subclass(world.objectClass, world);
+ TypeMask mask = new TypeMask.subclass(world.objectClass, world);
return mask.needsNoSuchMethodHandling(selector, world);
}
for (TypeMask mask in _masks) {
@@ -76,10 +75,8 @@
* yield conservative answers that contain too many classes.
*/
abstract class TypeMask implements ReceiverConstraint, AbstractValue {
- factory TypeMask(ClassElement base,
- int kind,
- bool isNullable,
- ClassWorld classWorld) {
+ factory TypeMask(
+ ClassElement base, int kind, bool isNullable, ClassWorld classWorld) {
return new FlatTypeMask.normalized(
base, (kind << 1) | (isNullable ? 1 : 0), classWorld);
}
@@ -89,7 +86,7 @@
factory TypeMask.exact(ClassElement base, ClassWorld classWorld) {
assert(invariant(base, classWorld.isInstantiated(base),
message: () => "Cannot create exact type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
+ "class $base.\n${classWorld.dump(base)}"));
return new FlatTypeMask.exact(base);
}
@@ -101,7 +98,7 @@
factory TypeMask.subclass(ClassElement base, ClassWorld classWorld) {
assert(invariant(base, classWorld.isInstantiated(base),
message: () => "Cannot create subclass type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
+ "class $base.\n${classWorld.dump(base)}"));
ClassElement topmost = classWorld.getLubOfInstantiatedSubclasses(base);
if (topmost == null) {
return new TypeMask.empty();
@@ -132,12 +129,12 @@
factory TypeMask.nonNullExact(ClassElement base, ClassWorld classWorld) {
assert(invariant(base, classWorld.isInstantiated(base),
message: () => "Cannot create exact type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
+ "class $base.\n${classWorld.dump(base)}"));
return new FlatTypeMask.nonNullExact(base);
}
- factory TypeMask.nonNullExactOrEmpty(ClassElement base,
- ClassWorld classWorld) {
+ factory TypeMask.nonNullExactOrEmpty(
+ ClassElement base, ClassWorld classWorld) {
if (classWorld.isInstantiated(base)) {
return new FlatTypeMask.nonNullExact(base);
}
@@ -147,7 +144,7 @@
factory TypeMask.nonNullSubclass(ClassElement base, ClassWorld classWorld) {
assert(invariant(base, classWorld.isInstantiated(base),
message: () => "Cannot create subclass type mask for uninstantiated "
- "class $base.\n${classWorld.dump(base)}"));
+ "class $base.\n${classWorld.dump(base)}"));
ClassElement topmost = classWorld.getLubOfInstantiatedSubclasses(base);
if (topmost == null) {
return new TypeMask.nonNullEmpty();
@@ -297,7 +294,7 @@
* Note: This may differ from semantic equality in the set containment sense.
* Use [containsMask] and [isInMask] for that, instead.
*/
- bool operator==(other);
+ bool operator ==(other);
/**
* If this returns `true`, [other] is guaranteed to be a supertype of this
@@ -341,7 +338,6 @@
*/
TypeMask union(TypeMask other, ClassWorld classWorld);
-
/// Returns whether the intersection of this and [other] is empty.
bool isDisjoint(TypeMask other, ClassWorld classWorld);
@@ -363,7 +359,5 @@
*/
// TODO(johnniwinther): Move this method to [World].
Element locateSingleElement(
- Selector selector,
- TypeMask mask,
- Compiler compiler);
+ Selector selector, TypeMask mask, Compiler compiler);
}
diff --git a/pkg/compiler/lib/src/types/types.dart b/pkg/compiler/lib/src/types/types.dart
index 665d144..fcaf762 100644
--- a/pkg/compiler/lib/src/types/types.dart
+++ b/pkg/compiler/lib/src/types/types.dart
@@ -5,31 +5,23 @@
library types;
import '../common.dart';
-import '../common/backend_api.dart' show
- Backend;
-import '../common/tasks.dart' show
- CompilerTask;
-import '../compiler.dart' show
- Compiler;
-import '../constants/values.dart' show
- PrimitiveConstantValue;
+import '../common/backend_api.dart' show Backend;
+import '../common/tasks.dart' show CompilerTask;
+import '../compiler.dart' show Compiler;
+import '../constants/values.dart' show PrimitiveConstantValue;
import '../elements/elements.dart';
-import '../inferrer/type_graph_inferrer.dart' show
- TypeGraphInferrer;
+import '../inferrer/type_graph_inferrer.dart' show TypeGraphInferrer;
import '../tree/tree.dart';
import '../util/util.dart';
-import '../universe/selector.dart' show
- Selector;
-import '../universe/universe.dart' show
- ReceiverConstraint,
- UniverseSelectorConstraints,
- SelectorConstraintsStrategy;
-import '../world.dart' show
- ClassWorld,
- World;
+import '../universe/selector.dart' show Selector;
+import '../universe/universe.dart'
+ show
+ ReceiverConstraint,
+ UniverseSelectorConstraints,
+ SelectorConstraintsStrategy;
+import '../world.dart' show ClassWorld, World;
-import 'abstract_value_domain.dart' show
- AbstractValue;
+import 'abstract_value_domain.dart' show AbstractValue;
part 'container_type_mask.dart';
part 'dictionary_type_mask.dart';
@@ -284,12 +276,11 @@
bool better(TypeMask type1, TypeMask type2) {
if (type1 == null) return false;
if (type2 == null) {
- return (type1 != null) &&
- (type1 != dynamicType);
+ return (type1 != null) && (type1 != dynamicType);
}
return (type1 != type2) &&
- type2.containsMask(type1, classWorld) &&
- !type1.containsMask(type2, classWorld);
+ type2.containsMask(type1, classWorld) &&
+ !type1.containsMask(type2, classWorld);
}
/**
@@ -320,8 +311,7 @@
return dynamicType;
}
- TypeMask guaranteedType =
- typesInferrer.getReturnTypeOfElement(element);
+ TypeMask guaranteedType = typesInferrer.getReturnTypeOfElement(element);
return guaranteedType;
}
@@ -338,8 +328,7 @@
* Return the (inferred) guaranteed type of [selector] or null.
*/
TypeMask getGuaranteedTypeOfSelector(Selector selector, TypeMask mask) {
- TypeMask guaranteedType =
- typesInferrer.getTypeOfSelector(selector, mask);
+ TypeMask guaranteedType = typesInferrer.getTypeOfSelector(selector, mask);
return guaranteedType;
}
}
diff --git a/pkg/compiler/lib/src/types/union_type_mask.dart b/pkg/compiler/lib/src/types/union_type_mask.dart
index 9cd5bcb..f05880a 100644
--- a/pkg/compiler/lib/src/types/union_type_mask.dart
+++ b/pkg/compiler/lib/src/types/union_type_mask.dart
@@ -20,7 +20,8 @@
}
static TypeMask unionOf(Iterable<TypeMask> masks, ClassWorld classWorld) {
- assert(masks.every((mask) => TypeMask.assertIsNormalized(mask, classWorld)));
+ assert(
+ masks.every((mask) => TypeMask.assertIsNormalized(mask, classWorld)));
List<FlatTypeMask> disjoint = <FlatTypeMask>[];
unionOfHelper(masks, disjoint, classWorld);
if (disjoint.isEmpty) return new TypeMask.nonNullEmpty();
@@ -34,8 +35,7 @@
}
static void unionOfHelper(Iterable<TypeMask> masks,
- List<FlatTypeMask> disjoint,
- ClassWorld classWorld) {
+ List<FlatTypeMask> disjoint, ClassWorld classWorld) {
// TODO(johnniwinther): Impose an order on the mask to ensure subclass masks
// are preferred to subtype masks.
for (TypeMask mask in masks) {
@@ -103,7 +103,8 @@
int bestKind;
int bestSize;
for (ClassElement candidate in candidates) {
- bool isInstantiatedStrictSubclass(cls) => cls != candidate &&
+ bool isInstantiatedStrictSubclass(cls) =>
+ cls != candidate &&
classWorld.isDirectlyInstantiated(cls) &&
classWorld.isSubclassOf(cls, candidate);
@@ -138,8 +139,7 @@
other = TypeMask.nonForwardingMask(other);
if (!other.isUnion && disjointMasks.contains(other)) return this;
- List<FlatTypeMask> newList =
- new List<FlatTypeMask>.from(disjointMasks);
+ List<FlatTypeMask> newList = new List<FlatTypeMask>.from(disjointMasks);
if (!other.isUnion) {
newList.add(other);
} else {
@@ -322,17 +322,16 @@
ClassElement singleClass(ClassWorld classWorld) => null;
bool needsNoSuchMethodHandling(Selector selector, ClassWorld classWorld) {
- return disjointMasks.any(
- (e) => e.needsNoSuchMethodHandling(selector, classWorld));
+ return disjointMasks
+ .any((e) => e.needsNoSuchMethodHandling(selector, classWorld));
}
bool canHit(Element element, Selector selector, ClassWorld classWorld) {
return disjointMasks.any((e) => e.canHit(element, selector, classWorld));
}
- Element locateSingleElement(Selector selector,
- TypeMask mask,
- Compiler compiler) {
+ Element locateSingleElement(
+ Selector selector, TypeMask mask, Compiler compiler) {
Element candidate;
for (FlatTypeMask mask in disjointMasks) {
Element current = mask.locateSingleElement(selector, mask, compiler);
@@ -348,12 +347,13 @@
}
String toString() {
- String masksString = (disjointMasks.map((TypeMask mask) => mask.toString())
- .toList()..sort()).join(", ");
+ String masksString =
+ (disjointMasks.map((TypeMask mask) => mask.toString()).toList()..sort())
+ .join(", ");
return 'Union of [$masksString]';
}
- bool operator==(other) {
+ bool operator ==(other) {
if (identical(this, other)) return true;
bool containsAll() {
@@ -363,10 +363,10 @@
});
}
- return other is UnionTypeMask
- && other.isNullable == isNullable
- && other.disjointMasks.length == disjointMasks.length
- && containsAll();
+ return other is UnionTypeMask &&
+ other.isNullable == isNullable &&
+ other.disjointMasks.length == disjointMasks.length &&
+ containsAll();
}
int get hashCode {
diff --git a/pkg/compiler/lib/src/types/value_type_mask.dart b/pkg/compiler/lib/src/types/value_type_mask.dart
index ffe1e3b..ba40f24 100644
--- a/pkg/compiler/lib/src/types/value_type_mask.dart
+++ b/pkg/compiler/lib/src/types/value_type_mask.dart
@@ -11,9 +11,7 @@
ValueTypeMask(this.forwardTo, this.value);
TypeMask nullable() {
- return isNullable
- ? this
- : new ValueTypeMask(forwardTo.nullable(), value);
+ return isNullable ? this : new ValueTypeMask(forwardTo.nullable(), value);
}
TypeMask nonNullable() {
@@ -32,12 +30,10 @@
TypeMask intersection(TypeMask other, ClassWorld classWorld) {
TypeMask forwardIntersection = forwardTo.intersection(other, classWorld);
if (forwardIntersection.isEmptyOrNull) return forwardIntersection;
- return forwardIntersection.isNullable
- ? nullable()
- : nonNullable();
+ return forwardIntersection.isNullable ? nullable() : nonNullable();
}
- bool operator==(other) => super == other;
+ bool operator ==(other) => super == other;
int get hashCode {
return computeHashCode(value, isNullable, forwardTo);
diff --git a/pkg/compiler/lib/src/universe/call_structure.dart b/pkg/compiler/lib/src/universe/call_structure.dart
index 727390a..fb9c908 100644
--- a/pkg/compiler/lib/src/universe/call_structure.dart
+++ b/pkg/compiler/lib/src/universe/call_structure.dart
@@ -5,16 +5,12 @@
library dart2js.call_structure;
import '../common.dart';
-import '../common/names.dart' show
- Identifiers,
- Names,
- Selectors;
+import '../common/names.dart' show Identifiers, Names, Selectors;
import '../elements/elements.dart';
import '../tree/tree.dart';
import '../util/util.dart';
-import 'selector.dart' show
- Selector;
+import 'selector.dart' show Selector;
/// The structure of the arguments at a call-site.
// TODO(johnniwinther): Should these be cached?
@@ -64,9 +60,9 @@
bool match(CallStructure other) {
if (identical(this, other)) return true;
- return this.argumentCount == other.argumentCount
- && this.namedArgumentCount == other.namedArgumentCount
- && sameNames(this.namedArguments, other.namedArguments);
+ return this.argumentCount == other.argumentCount &&
+ this.namedArgumentCount == other.namedArgumentCount &&
+ sameNames(this.namedArguments, other.namedArguments);
}
// TODO(johnniwinther): Cache hash code?
@@ -180,7 +176,7 @@
* Returns [:true:] if the signature of the [caller] matches the
* signature of the [callee], [:false:] otherwise.
*/
- static /*<T>*/ bool addForwardingElementArgumentsToList(
+ static/*<T>*/ bool addForwardingElementArgumentsToList(
ConstructorElement caller,
List/*<T>*/ list,
ConstructorElement callee,
@@ -188,7 +184,7 @@
/*T*/ compileConstant(ParameterElement element)) {
assert(invariant(caller, !callee.isMalformed,
message: "Cannot compute arguments to malformed constructor: "
- "$caller calling $callee."));
+ "$caller calling $callee."));
FunctionSignature signature = caller.functionSignature;
Map<Node, ParameterElement> mapping = <Node, ParameterElement>{};
@@ -236,10 +232,7 @@
return false;
}
list.addAll(callStructure.makeArgumentsList(
- nodes,
- callee,
- internalCompileArgument,
- compileConstant));
+ nodes, callee, internalCompileArgument, compileConstant));
return true;
}
diff --git a/pkg/compiler/lib/src/universe/class_set.dart b/pkg/compiler/lib/src/universe/class_set.dart
index bed1d60..038d757 100644
--- a/pkg/compiler/lib/src/universe/class_set.dart
+++ b/pkg/compiler/lib/src/universe/class_set.dart
@@ -4,14 +4,10 @@
library dart2js.world.class_set;
-import 'dart:collection' show
- IterableBase;
-import '../elements/elements.dart' show
- ClassElement;
-import '../util/enumset.dart' show
- EnumSet;
-import '../util/util.dart' show
- Link;
+import 'dart:collection' show IterableBase;
+import '../elements/elements.dart' show ClassElement;
+import '../util/enumset.dart' show EnumSet;
+import '../util/util.dart' show Link;
/// Enum for the different kinds of instantiation of a class.
enum Instantiation {
@@ -50,11 +46,10 @@
/// [ClassHierarchyNode.subclassesByMask],
/// [ClassHierarchyNode.subclassesByMask] and [ClassSet.subtypesByMask].
static final EnumSet<Instantiation> INSTANTIATED =
- new EnumSet<Instantiation>.fromValues(
- const <Instantiation>[
- Instantiation.DIRECTLY_INSTANTIATED,
- Instantiation.INDIRECTLY_INSTANTIATED],
- fixed: true);
+ new EnumSet<Instantiation>.fromValues(const <Instantiation>[
+ Instantiation.DIRECTLY_INSTANTIATED,
+ Instantiation.INDIRECTLY_INSTANTIATED
+ ], fixed: true);
/// Enum set for selecting directly instantiated classes in
/// [ClassHierarchyNode.subclassesByMask],
@@ -68,17 +63,15 @@
/// [ClassHierarchyNode.subclassesByMask],
/// [ClassHierarchyNode.subclassesByMask] and [ClassSet.subtypesByMask].
static final EnumSet<Instantiation> ALL =
- new EnumSet<Instantiation>.fromValues(
- Instantiation.values,
- fixed: true);
+ new EnumSet<Instantiation>.fromValues(Instantiation.values, fixed: true);
/// Creates an enum set for selecting the returned classes in
/// [ClassHierarchyNode.subclassesByMask],
/// [ClassHierarchyNode.subclassesByMask] and [ClassSet.subtypesByMask].
static EnumSet<Instantiation> createMask(
{bool includeDirectlyInstantiated: true,
- bool includeIndirectlyInstantiated: true,
- bool includeUninstantiated: true}) {
+ bool includeIndirectlyInstantiated: true,
+ bool includeUninstantiated: true}) {
EnumSet<Instantiation> mask = new EnumSet<Instantiation>();
if (includeDirectlyInstantiated) {
mask.add(Instantiation.DIRECTLY_INSTANTIATED);
@@ -94,9 +87,8 @@
final ClassHierarchyNode parentNode;
final ClassElement cls;
- final EnumSet<Instantiation> _mask =
- new EnumSet<Instantiation>.fromValues(
- const <Instantiation>[Instantiation.UNINSTANTIATED]);
+ final EnumSet<Instantiation> _mask = new EnumSet<Instantiation>.fromValues(
+ const <Instantiation>[Instantiation.UNINSTANTIATED]);
ClassElement _leastUpperInstantiatedSubclass;
int _instantiatedSubclassCount = 0;
@@ -203,11 +195,9 @@
/// Subclasses are included if their instantiation properties intersect with
/// their corresponding [Instantiation] values in [mask]. If [strict] is
/// `true`, [cls] itself is _not_ returned.
- Iterable<ClassElement> subclassesByMask(
- EnumSet<Instantiation> mask,
+ Iterable<ClassElement> subclassesByMask(EnumSet<Instantiation> mask,
{bool strict: false}) {
- return new ClassHierarchyNodeIterable(
- this, mask, includeRoot: !strict);
+ return new ClassHierarchyNodeIterable(this, mask, includeRoot: !strict);
}
/// Applies [predicate] to each subclass of [cls] matching the criteria
@@ -218,10 +208,8 @@
/// intersect with their corresponding [Instantiation] values in [mask]. If
/// [strict] is `true`, [predicate] is _not_ called on [cls] itself.
bool anySubclass(
- bool predicate(ClassElement cls),
- EnumSet<Instantiation> mask,
+ bool predicate(ClassElement cls), EnumSet<Instantiation> mask,
{bool strict: false}) {
-
IterationStep wrapper(ClassElement cls) {
return predicate(cls) ? IterationStep.STOP : IterationStep.CONTINUE;
}
@@ -242,9 +230,7 @@
/// continues. The return value of the function is either [ForEach.STOP], if
/// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
/// the end.
- IterationStep forEachSubclass(
- ForEachFunction f,
- EnumSet<Instantiation> mask,
+ IterationStep forEachSubclass(ForEachFunction f, EnumSet<Instantiation> mask,
{bool strict: false}) {
IterationStep nextStep;
if (!strict && mask.intersects(_mask)) {
@@ -287,8 +273,8 @@
}
ClassHierarchyNode subclass;
for (Link<ClassHierarchyNode> link = _directSubclasses;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
if (link.head.isInstantiated) {
if (subclass == null) {
subclass = link.head;
@@ -304,10 +290,9 @@
}
void printOn(StringBuffer sb, String indentation,
- {bool instantiatedOnly: false,
- bool sorted: true,
- ClassElement withRespectTo}) {
-
+ {bool instantiatedOnly: false,
+ bool sorted: true,
+ ClassElement withRespectTo}) {
bool isRelatedTo(ClassElement subclass) {
return subclass == withRespectTo ||
subclass.implementsInterface(withRespectTo);
@@ -330,9 +315,10 @@
} else {
var subclasses = _directSubclasses;
if (sorted) {
- subclasses = _directSubclasses.toList()..sort((a, b) {
- return a.cls.name.compareTo(b.cls.name);
- });
+ subclasses = _directSubclasses.toList()
+ ..sort((a, b) {
+ return a.cls.name.compareTo(b.cls.name);
+ });
}
bool needsComma = false;
for (ClassHierarchyNode child in subclasses) {
@@ -348,9 +334,7 @@
} else {
sb.write('\n');
}
- child.printOn(
- sb,
- '$indentation ',
+ child.printOn(sb, '$indentation ',
instantiatedOnly: instantiatedOnly,
sorted: sorted,
withRespectTo: withRespectTo);
@@ -365,13 +349,13 @@
}
}
- String dump({String indentation: '',
- bool instantiatedOnly: false,
- ClassElement withRespectTo}) {
+ String dump(
+ {String indentation: '',
+ bool instantiatedOnly: false,
+ ClassElement withRespectTo}) {
StringBuffer sb = new StringBuffer();
printOn(sb, indentation,
- instantiatedOnly: instantiatedOnly,
- withRespectTo: withRespectTo);
+ instantiatedOnly: instantiatedOnly, withRespectTo: withRespectTo);
return sb.toString();
}
@@ -480,8 +464,7 @@
/// Subclasses are included if their instantiation properties intersect with
/// their corresponding [Instantiation] values in [mask]. If [strict] is
/// `true`, [cls] itself is _not_ returned.
- Iterable<ClassElement> subclassesByMask(
- EnumSet<Instantiation> mask,
+ Iterable<ClassElement> subclassesByMask(EnumSet<Instantiation> mask,
{bool strict: false}) {
return node.subclassesByMask(mask, strict: strict);
}
@@ -494,12 +477,12 @@
/// respectively. If [strict] is `true`, [cls] itself is _not_ returned.
Iterable<ClassElement> subtypes(
{bool includeDirectlyInstantiated: true,
- bool includeIndirectlyInstantiated: true,
- bool includeUninstantiated: true,
- bool strict: false}) {
+ bool includeIndirectlyInstantiated: true,
+ bool includeUninstantiated: true,
+ bool strict: false}) {
EnumSet<Instantiation> mask = ClassHierarchyNode.createMask(
includeDirectlyInstantiated: includeDirectlyInstantiated,
- includeIndirectlyInstantiated:includeIndirectlyInstantiated,
+ includeIndirectlyInstantiated: includeIndirectlyInstantiated,
includeUninstantiated: includeUninstantiated);
return subtypesByMask(mask, strict: strict);
}
@@ -509,17 +492,13 @@
/// Subtypes are included if their instantiation properties intersect with
/// their corresponding [Instantiation] values in [mask]. If [strict] is
/// `true`, [cls] itself is _not_ returned.
- Iterable<ClassElement> subtypesByMask(
- EnumSet<Instantiation> mask,
+ Iterable<ClassElement> subtypesByMask(EnumSet<Instantiation> mask,
{bool strict: false}) {
if (_subtypes == null) {
- return node.subclassesByMask(
- mask,
- strict: strict);
+ return node.subclassesByMask(mask, strict: strict);
}
- return new SubtypesIterable.SubtypesIterator(this,
- mask,
+ return new SubtypesIterable.SubtypesIterator(this, mask,
includeRoot: !strict);
}
@@ -531,8 +510,7 @@
/// intersect with their corresponding [Instantiation] values in [mask]. If
/// [strict] is `true`, [predicate] is _not_ called on [cls] itself.
bool anySubclass(
- bool predicate(ClassElement cls),
- EnumSet<Instantiation> mask,
+ bool predicate(ClassElement cls), EnumSet<Instantiation> mask,
{bool strict: false}) {
return node.anySubclass(predicate, mask, strict: strict);
}
@@ -551,9 +529,7 @@
/// continues. The return value of the function is either [ForEach.STOP], if
/// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
/// the end.
- IterationStep forEachSubclass(
- ForEachFunction f,
- EnumSet<Instantiation> mask,
+ IterationStep forEachSubclass(ForEachFunction f, EnumSet<Instantiation> mask,
{bool strict: false}) {
return node.forEachSubclass(f, mask, strict: strict);
}
@@ -565,11 +541,8 @@
/// [predicate] is applied to subtypes if their instantiation properties
/// intersect with their corresponding [Instantiation] values in [mask]. If
/// [strict] is `true`, [predicate] is _not_ called on [cls] itself.
- bool anySubtype(
- bool predicate(ClassElement cls),
- EnumSet<Instantiation> mask,
+ bool anySubtype(bool predicate(ClassElement cls), EnumSet<Instantiation> mask,
{bool strict: false}) {
-
IterationStep wrapper(ClassElement cls) {
return predicate(cls) ? IterationStep.STOP : IterationStep.CONTINUE;
}
@@ -590,9 +563,7 @@
/// continues. The return value of the function is either [ForEach.STOP], if
/// visitation was stopped, or [ForEach.CONTINUE] if visitation continued to
/// the end.
- IterationStep forEachSubtype(
- ForEachFunction f,
- EnumSet<Instantiation> mask,
+ IterationStep forEachSubtype(ForEachFunction f, EnumSet<Instantiation> mask,
{bool strict: false}) {
IterationStep nextStep =
node.forEachSubclass(f, mask, strict: strict) ?? IterationStep.CONTINUE;
@@ -716,10 +687,7 @@
final EnumSet<Instantiation> mask;
final bool includeRoot;
- ClassHierarchyNodeIterable(
- this.root,
- this.mask,
- {this.includeRoot: true}) {
+ ClassHierarchyNodeIterable(this.root, this.mask, {this.includeRoot: true}) {
if (root == null) throw new StateError("No root for iterable.");
}
@@ -793,8 +761,8 @@
continue;
}
for (Link<ClassHierarchyNode> link = currentNode._directSubclasses;
- !link.isEmpty;
- link = link.tail) {
+ !link.isEmpty;
+ link = link.tail) {
stack = stack.prepend(link.head);
}
if (_isValid(currentNode)) {
@@ -816,9 +784,7 @@
final EnumSet<Instantiation> mask;
final bool includeRoot;
- SubtypesIterable.SubtypesIterator(
- this.subtypeSet,
- this.mask,
+ SubtypesIterable.SubtypesIterator(this.subtypeSet, this.mask,
{this.includeRoot: true});
@override
@@ -849,9 +815,9 @@
bool moveNext() {
if (elements == null && hierarchyNodes == null) {
// Initial state. Iterate through subclasses.
- elements = iterable.subtypeSet.node.subclassesByMask(
- mask,
- strict: !includeRoot).iterator;
+ elements = iterable.subtypeSet.node
+ .subclassesByMask(mask, strict: !includeRoot)
+ .iterator;
}
if (elements != null && elements.moveNext()) {
return true;
@@ -876,8 +842,10 @@
enum IterationStep {
/// Iteration continues.
CONTINUE,
+
/// Iteration stops immediately.
STOP,
+
/// Iteration skips the subclasses of the current class.
SKIP_SUBCLASSES,
}
diff --git a/pkg/compiler/lib/src/universe/function_set.dart b/pkg/compiler/lib/src/universe/function_set.dart
index 27273341..c225b15 100644
--- a/pkg/compiler/lib/src/universe/function_set.dart
+++ b/pkg/compiler/lib/src/universe/function_set.dart
@@ -4,37 +4,27 @@
library universe.function_set;
-import '../common/names.dart' show
- Identifiers,
- Selectors;
-import '../compiler.dart' show
- Compiler;
+import '../common/names.dart' show Identifiers, Selectors;
+import '../compiler.dart' show Compiler;
import '../elements/elements.dart';
import '../types/types.dart';
-import '../util/util.dart' show
- Hashing,
- Setlet;
-import '../world.dart' show
- ClassWorld;
+import '../util/util.dart' show Hashing, Setlet;
+import '../world.dart' show ClassWorld;
-import 'selector.dart' show
- Selector;
-import 'universe.dart' show
- ReceiverConstraint;
+import 'selector.dart' show Selector;
+import 'universe.dart' show ReceiverConstraint;
// TODO(kasperl): This actually holds getters and setters just fine
// too and stricly they aren't functions. Maybe this needs a better
// name -- something like ElementSet seems a bit too generic.
class FunctionSet {
final Compiler compiler;
- final Map<String, FunctionSetNode> nodes =
- new Map<String, FunctionSetNode>();
+ final Map<String, FunctionSetNode> nodes = new Map<String, FunctionSetNode>();
FunctionSet(this.compiler);
ClassWorld get classWorld => compiler.world;
- FunctionSetNode newNode(String name)
- => new FunctionSetNode(name);
+ FunctionSetNode newNode(String name) => new FunctionSetNode(name);
void add(Element element) {
assert(element.isInstanceMember);
@@ -59,9 +49,7 @@
assert(!element.isAbstract);
String name = element.name;
FunctionSetNode node = nodes[name];
- return (node != null)
- ? node.contains(element)
- : false;
+ return (node != null) ? node.contains(element) : false;
}
/// Returns an object that allows iterating over all the functions
@@ -216,10 +204,8 @@
/// Returns the set of functions that can be the target of [selectorMask]
/// including no such method handling where applicable.
- FunctionSetQuery query(SelectorMask selectorMask,
- ClassWorld classWorld,
- [FunctionSetNode noSuchMethods,
- SelectorMask noSuchMethodMask]) {
+ FunctionSetQuery query(SelectorMask selectorMask, ClassWorld classWorld,
+ [FunctionSetNode noSuchMethods, SelectorMask noSuchMethodMask]) {
assert(selectorMask.name == name);
FunctionSetQuery result = cache[selectorMask];
if (result != null) return result;
@@ -293,12 +279,11 @@
TypeMask computeMask(ClassWorld classWorld) {
assert(classWorld.hasAnyStrictSubclass(classWorld.objectClass));
if (_mask != null) return _mask;
- return _mask = new TypeMask.unionOf(functions
- .expand((element) {
+ return _mask = new TypeMask.unionOf(
+ functions.expand((element) {
ClassElement cls = element.enclosingClass;
return [cls]..addAll(classWorld.mixinUsesOf(cls));
- })
- .map((cls) {
+ }).map((cls) {
if (classWorld.backend.isNullImplementation(cls)) {
return const TypeMask.empty();
} else if (classWorld.isInstantiated(cls.declaration)) {
diff --git a/pkg/compiler/lib/src/universe/selector.dart b/pkg/compiler/lib/src/universe/selector.dart
index 8bef9fa..a76db34 100644
--- a/pkg/compiler/lib/src/universe/selector.dart
+++ b/pkg/compiler/lib/src/universe/selector.dart
@@ -5,23 +5,20 @@
library dart2js.selector;
import '../common.dart';
-import '../common/names.dart' show
- Names;
-import '../elements/elements.dart' show
- Element,
- Elements,
- FunctionElement,
- FunctionSignature,
- Name,
- LibraryElement,
- PublicName;
-import '../util/util.dart' show
- Hashing;
-import '../world.dart' show
- World;
+import '../common/names.dart' show Names;
+import '../elements/elements.dart'
+ show
+ Element,
+ Elements,
+ FunctionElement,
+ FunctionSignature,
+ Name,
+ LibraryElement,
+ PublicName;
+import '../util/util.dart' show Hashing;
+import '../world.dart' show World;
-import 'call_structure.dart' show
- CallStructure;
+import 'call_structure.dart' show CallStructure;
class SelectorKind {
final String name;
@@ -38,8 +35,13 @@
String toString() => name;
- static List<SelectorKind> values =
- const <SelectorKind>[GETTER, SETTER, CALL, OPERATOR, INDEX];
+ static List<SelectorKind> values = const <SelectorKind>[
+ GETTER,
+ SETTER,
+ CALL,
+ OPERATOR,
+ INDEX
+ ];
}
class Selector {
@@ -58,44 +60,43 @@
LibraryElement get library => memberName.library;
- Selector.internal(this.kind,
- this.memberName,
- this.callStructure,
- this.hashCode) {
- assert(invariant(NO_LOCATION_SPANNABLE,
+ Selector.internal(
+ this.kind, this.memberName, this.callStructure, this.hashCode) {
+ assert(invariant(
+ NO_LOCATION_SPANNABLE,
kind == SelectorKind.INDEX ||
- (memberName != Names.INDEX_NAME &&
- memberName != Names.INDEX_SET_NAME),
+ (memberName != Names.INDEX_NAME &&
+ memberName != Names.INDEX_SET_NAME),
message: "kind=$kind,memberName=$memberName,"
- "callStructure:$callStructure"));
- assert(invariant(NO_LOCATION_SPANNABLE,
+ "callStructure:$callStructure"));
+ assert(invariant(
+ NO_LOCATION_SPANNABLE,
kind == SelectorKind.OPERATOR ||
- kind == SelectorKind.INDEX ||
- !Elements.isOperatorName(memberName.text) ||
- memberName.text == '??',
+ kind == SelectorKind.INDEX ||
+ !Elements.isOperatorName(memberName.text) ||
+ memberName.text == '??',
message: "kind=$kind,memberName=$memberName,"
- "callStructure:$callStructure"));
- assert(invariant(NO_LOCATION_SPANNABLE,
+ "callStructure:$callStructure"));
+ assert(invariant(
+ NO_LOCATION_SPANNABLE,
kind == SelectorKind.CALL ||
- kind == SelectorKind.GETTER ||
- kind == SelectorKind.SETTER ||
- Elements.isOperatorName(memberName.text) ||
- memberName.text == '??',
+ kind == SelectorKind.GETTER ||
+ kind == SelectorKind.SETTER ||
+ Elements.isOperatorName(memberName.text) ||
+ memberName.text == '??',
message: "kind=$kind,memberName=$memberName,"
- "callStructure:$callStructure"));
+ "callStructure:$callStructure"));
}
// TODO(johnniwinther): Extract caching.
static Map<int, List<Selector>> canonicalizedValues =
new Map<int, List<Selector>>();
- factory Selector(SelectorKind kind,
- Name name,
- CallStructure callStructure) {
+ factory Selector(SelectorKind kind, Name name, CallStructure callStructure) {
// TODO(johnniwinther): Maybe use equality instead of implicit hashing.
int hashCode = computeHashCode(kind, name, callStructure);
- List<Selector> list = canonicalizedValues.putIfAbsent(hashCode,
- () => <Selector>[]);
+ List<Selector> list =
+ canonicalizedValues.putIfAbsent(hashCode, () => <Selector>[]);
for (int i = 0; i < list.length; i++) {
Selector existing = list[i];
if (existing.match(kind, name, callStructure)) {
@@ -103,8 +104,8 @@
return existing;
}
}
- Selector result = new Selector.internal(
- kind, name, callStructure, hashCode);
+ Selector result =
+ new Selector.internal(kind, name, callStructure, hashCode);
list.add(result);
return result;
}
@@ -128,9 +129,7 @@
if (element.isOperator) {
// Operators cannot have named arguments, however, that doesn't prevent
// a user from declaring such an operator.
- return new Selector(
- SelectorKind.OPERATOR,
- name,
+ return new Selector(SelectorKind.OPERATOR, name,
new CallStructure(arity, namedArguments));
} else {
return new Selector.call(
@@ -150,15 +149,11 @@
}
}
- factory Selector.getter(Name name)
- => new Selector(SelectorKind.GETTER,
- name.getter,
- CallStructure.NO_ARGS);
+ factory Selector.getter(Name name) =>
+ new Selector(SelectorKind.GETTER, name.getter, CallStructure.NO_ARGS);
- factory Selector.setter(Name name)
- => new Selector(SelectorKind.SETTER,
- name.setter,
- CallStructure.ONE_ARG);
+ factory Selector.setter(Name name) =>
+ new Selector(SelectorKind.SETTER, name.setter, CallStructure.ONE_ARG);
factory Selector.unaryOperator(String name) => new Selector(
SelectorKind.OPERATOR,
@@ -170,35 +165,29 @@
new PublicName(Elements.constructOperatorName(name, false)),
CallStructure.ONE_ARG);
- factory Selector.index()
- => new Selector(SelectorKind.INDEX, Names.INDEX_NAME,
- CallStructure.ONE_ARG);
+ factory Selector.index() =>
+ new Selector(SelectorKind.INDEX, Names.INDEX_NAME, CallStructure.ONE_ARG);
- factory Selector.indexSet()
- => new Selector(SelectorKind.INDEX, Names.INDEX_SET_NAME,
- CallStructure.TWO_ARGS);
+ factory Selector.indexSet() => new Selector(
+ SelectorKind.INDEX, Names.INDEX_SET_NAME, CallStructure.TWO_ARGS);
- factory Selector.call(Name name, CallStructure callStructure)
- => new Selector(SelectorKind.CALL, name, callStructure);
+ factory Selector.call(Name name, CallStructure callStructure) =>
+ new Selector(SelectorKind.CALL, name, callStructure);
- factory Selector.callClosure(int arity, [List<String> namedArguments])
- => new Selector(SelectorKind.CALL, Names.call,
- new CallStructure(arity, namedArguments));
+ factory Selector.callClosure(int arity, [List<String> namedArguments]) =>
+ new Selector(SelectorKind.CALL, Names.call,
+ new CallStructure(arity, namedArguments));
- factory Selector.callClosureFrom(Selector selector)
- => new Selector(SelectorKind.CALL, Names.call, selector.callStructure);
+ factory Selector.callClosureFrom(Selector selector) =>
+ new Selector(SelectorKind.CALL, Names.call, selector.callStructure);
factory Selector.callConstructor(Name name,
- [int arity = 0,
- List<String> namedArguments])
- => new Selector(SelectorKind.CALL, name,
- new CallStructure(arity, namedArguments));
+ [int arity = 0, List<String> namedArguments]) =>
+ new Selector(
+ SelectorKind.CALL, name, new CallStructure(arity, namedArguments));
- factory Selector.callDefaultConstructor()
- => new Selector(
- SelectorKind.CALL,
- const PublicName(''),
- CallStructure.NO_ARGS);
+ factory Selector.callDefaultConstructor() => new Selector(
+ SelectorKind.CALL, const PublicName(''), CallStructure.NO_ARGS);
bool get isGetter => kind == SelectorKind.GETTER;
bool get isSetter => kind == SelectorKind.SETTER;
@@ -214,8 +203,7 @@
/**
* The member name for invocation mirrors created from this selector.
*/
- String get invocationMirrorMemberName =>
- isSetter ? '$name=' : name;
+ String get invocationMirrorMemberName => isSetter ? '$name=' : name;
int get invocationMirrorKind {
const int METHOD = 0;
@@ -271,17 +259,14 @@
return appliesUnnamed(element, world);
}
- bool match(SelectorKind kind,
- Name memberName,
- CallStructure callStructure) {
- return this.kind == kind
- && this.memberName == memberName
- && this.callStructure.match(callStructure);
+ bool match(SelectorKind kind, Name memberName, CallStructure callStructure) {
+ return this.kind == kind &&
+ this.memberName == memberName &&
+ this.callStructure.match(callStructure);
}
- static int computeHashCode(SelectorKind kind,
- Name name,
- CallStructure callStructure) {
+ static int computeHashCode(
+ SelectorKind kind, Name name, CallStructure callStructure) {
// Add bits from name and kind.
int hash = Hashing.mixHashCodeBits(name.hashCode, kind.hashCode);
// Add bits from the call structure.
diff --git a/pkg/compiler/lib/src/universe/side_effects.dart b/pkg/compiler/lib/src/universe/side_effects.dart
index a599e09..2c39999 100644
--- a/pkg/compiler/lib/src/universe/side_effects.dart
+++ b/pkg/compiler/lib/src/universe/side_effects.dart
@@ -8,8 +8,8 @@
// Changes flags.
static const int FLAG_CHANGES_INDEX = 0;
static const int FLAG_CHANGES_INSTANCE_PROPERTY = FLAG_CHANGES_INDEX + 1;
- static const int FLAG_CHANGES_STATIC_PROPERTY
- = FLAG_CHANGES_INSTANCE_PROPERTY + 1;
+ static const int FLAG_CHANGES_STATIC_PROPERTY =
+ FLAG_CHANGES_INSTANCE_PROPERTY + 1;
static const int FLAG_CHANGES_COUNT = FLAG_CHANGES_STATIC_PROPERTY + 1;
// Depends flags (one for each changes flag).
@@ -33,13 +33,18 @@
clearAllSideEffects();
}
- bool operator==(other) => _flags == other._flags;
+ bool operator ==(other) => _flags == other._flags;
int get hashCode => throw new UnsupportedError('SideEffects.hashCode');
bool _getFlag(int position) => (_flags & (1 << position)) != 0;
- void _setFlag(int position) { _flags |= (1 << position); }
- void _clearFlag(int position) { _flags &= ~(1 << position); }
+ void _setFlag(int position) {
+ _flags |= (1 << position);
+ }
+
+ void _clearFlag(int position) {
+ _flags &= ~(1 << position);
+ }
int getChangesFlags() => _flags & ((1 << FLAG_CHANGES_COUNT) - 1);
int getDependsOnFlags() {
@@ -49,14 +54,19 @@
bool hasSideEffects() => getChangesFlags() != 0;
bool dependsOnSomething() => getDependsOnFlags() != 0;
- void setAllSideEffects() { _flags |= ((1 << FLAG_CHANGES_COUNT) - 1); }
+ void setAllSideEffects() {
+ _flags |= ((1 << FLAG_CHANGES_COUNT) - 1);
+ }
- void clearAllSideEffects() { _flags &= ~((1 << FLAG_CHANGES_COUNT) - 1); }
+ void clearAllSideEffects() {
+ _flags &= ~((1 << FLAG_CHANGES_COUNT) - 1);
+ }
void setDependsOnSomething() {
int count = FLAG_DEPENDS_ON_COUNT - FLAG_CHANGES_COUNT;
_flags |= (((1 << count) - 1) << FLAG_CHANGES_COUNT);
}
+
void clearAllDependencies() {
int count = FLAG_DEPENDS_ON_COUNT - FLAG_CHANGES_COUNT;
_flags &= ~(((1 << count) - 1) << FLAG_CHANGES_COUNT);
@@ -65,40 +75,64 @@
bool dependsOnStaticPropertyStore() {
return _getFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE);
}
+
void setDependsOnStaticPropertyStore() {
_setFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE);
}
+
void clearDependsOnStaticPropertyStore() {
_clearFlag(FLAG_DEPENDS_ON_STATIC_PROPERTY_STORE);
}
- void setChangesStaticProperty() { _setFlag(FLAG_CHANGES_STATIC_PROPERTY); }
+
+ void setChangesStaticProperty() {
+ _setFlag(FLAG_CHANGES_STATIC_PROPERTY);
+ }
+
void clearChangesStaticProperty() {
_clearFlag(FLAG_CHANGES_STATIC_PROPERTY);
}
+
bool changesStaticProperty() => _getFlag(FLAG_CHANGES_STATIC_PROPERTY);
bool dependsOnIndexStore() => _getFlag(FLAG_DEPENDS_ON_INDEX_STORE);
- void setDependsOnIndexStore() { _setFlag(FLAG_DEPENDS_ON_INDEX_STORE); }
- void clearDependsOnIndexStore() { _clearFlag(FLAG_DEPENDS_ON_INDEX_STORE); }
- void setChangesIndex() { _setFlag(FLAG_CHANGES_INDEX); }
- void clearChangesIndex() { _clearFlag(FLAG_CHANGES_INDEX); }
+ void setDependsOnIndexStore() {
+ _setFlag(FLAG_DEPENDS_ON_INDEX_STORE);
+ }
+
+ void clearDependsOnIndexStore() {
+ _clearFlag(FLAG_DEPENDS_ON_INDEX_STORE);
+ }
+
+ void setChangesIndex() {
+ _setFlag(FLAG_CHANGES_INDEX);
+ }
+
+ void clearChangesIndex() {
+ _clearFlag(FLAG_CHANGES_INDEX);
+ }
+
bool changesIndex() => _getFlag(FLAG_CHANGES_INDEX);
bool dependsOnInstancePropertyStore() {
return _getFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE);
}
+
void setDependsOnInstancePropertyStore() {
_setFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE);
}
+
void clearDependsOnInstancePropertyStore() {
_setFlag(FLAG_DEPENDS_ON_INSTANCE_PROPERTY_STORE);
}
+
void setChangesInstanceProperty() {
_setFlag(FLAG_CHANGES_INSTANCE_PROPERTY);
}
+
void clearChangesInstanceProperty() {
_clearFlag(FLAG_CHANGES_INSTANCE_PROPERTY);
}
+
bool changesInstanceProperty() => _getFlag(FLAG_CHANGES_INSTANCE_PROPERTY);
static int computeDependsOnFlags(int flags) => flags << FLAG_CHANGES_COUNT;
diff --git a/pkg/compiler/lib/src/universe/universe.dart b/pkg/compiler/lib/src/universe/universe.dart
index 8b2f53e..8f08f6f 100644
--- a/pkg/compiler/lib/src/universe/universe.dart
+++ b/pkg/compiler/lib/src/universe/universe.dart
@@ -7,22 +7,14 @@
import 'dart:collection';
import '../common.dart';
-import '../compiler.dart' show
- Compiler;
+import '../compiler.dart' show Compiler;
import '../elements/elements.dart';
import '../dart_types.dart';
import '../util/util.dart';
-import '../world.dart' show
- ClassWorld,
- World;
+import '../world.dart' show ClassWorld, World;
-import 'selector.dart' show
- Selector;
-import 'use.dart' show
- DynamicUse,
- DynamicUseKind,
- StaticUse,
- StaticUseKind;
+import 'selector.dart' show Selector;
+import 'use.dart' show DynamicUse, DynamicUseKind, StaticUse, StaticUseKind;
/// The known constraint on receiver for a dynamic call site.
///
@@ -227,9 +219,9 @@
// subclass and through subtype instantiated types/classes.
// TODO(johnniwinther): Support unknown type arguments for generic types.
void registerTypeInstantiation(InterfaceType type,
- {bool byMirrors: false,
- bool isNative: false,
- void onImplemented(ClassElement cls)}) {
+ {bool byMirrors: false,
+ bool isNative: false,
+ void onImplemented(ClassElement cls)}) {
_instantiatedTypes.add(type);
ClassElement cls = type.element;
if (!cls.isAbstract
@@ -237,11 +229,13 @@
// classes; a native abstract class may have non-abstract subclasses
// not declared to the program. Instances of these classes are
// indistinguishable from the abstract class.
- || isNative
+ ||
+ isNative
// Likewise, if this registration comes from the mirror system,
// all bets are off.
// TODO(herhut): Track classes required by mirrors seperately.
- || byMirrors) {
+ ||
+ byMirrors) {
_directlyInstantiatedClasses.add(cls);
}
@@ -258,8 +252,7 @@
}
bool _hasMatchingSelector(Map<Selector, SelectorConstraints> selectors,
- Element member,
- World world) {
+ Element member, World world) {
if (selectors == null) return false;
for (Selector selector in selectors.keys) {
if (selector.appliesUnnamed(member, world)) {
@@ -296,16 +289,15 @@
}
}
- bool _registerNewSelector(
- DynamicUse dynamicUse,
+ bool _registerNewSelector(DynamicUse dynamicUse,
Map<String, Map<Selector, SelectorConstraints>> selectorMap) {
Selector selector = dynamicUse.selector;
String name = selector.name;
ReceiverConstraint mask = dynamicUse.mask;
Map<Selector, SelectorConstraints> selectors = selectorMap.putIfAbsent(
name, () => new Maplet<Selector, SelectorConstraints>());
- UniverseSelectorConstraints constraints = selectors.putIfAbsent(
- selector, () {
+ UniverseSelectorConstraints constraints =
+ selectors.putIfAbsent(selector, () {
return selectorConstraintsStrategy.createSelectorConstraints(selector);
});
return constraints.addReceiverConstraint(mask);
@@ -389,12 +381,9 @@
fieldGetters.remove(element);
_directlyInstantiatedClasses.remove(element);
if (element is ClassElement) {
- assert(invariant(
- element, element.thisType.isRaw,
+ assert(invariant(element, element.thisType.isRaw,
message: 'Generic classes not supported (${element.thisType}).'));
- _instantiatedTypes
- ..remove(element.rawType)
- ..remove(element.thisType);
+ _instantiatedTypes..remove(element.rawType)..remove(element.thisType);
}
}
@@ -404,7 +393,7 @@
// Return new list to guard against concurrent modifications.
return new List<LocalFunctionElement>.from(
allClosures.where((LocalFunctionElement closure) {
- return closure.executableContext == element;
- }));
+ return closure.executableContext == element;
+ }));
}
}
diff --git a/pkg/compiler/lib/src/universe/use.dart b/pkg/compiler/lib/src/universe/use.dart
index 73fb979..bb6b153 100644
--- a/pkg/compiler/lib/src/universe/use.dart
+++ b/pkg/compiler/lib/src/universe/use.dart
@@ -7,29 +7,18 @@
/// method on an unknown class.
library dart2js.universe.use;
-import '../closure.dart' show
- BoxFieldElement;
+import '../closure.dart' show BoxFieldElement;
import '../common.dart';
import '../dart_types.dart';
import '../elements/elements.dart';
-import '../world.dart' show
- ClassWorld;
-import '../util/util.dart' show
- Hashing;
+import '../world.dart' show ClassWorld;
+import '../util/util.dart' show Hashing;
-import 'call_structure.dart' show
- CallStructure;
-import 'selector.dart' show
- Selector;
-import 'universe.dart' show
- ReceiverConstraint;
+import 'call_structure.dart' show CallStructure;
+import 'selector.dart' show Selector;
+import 'universe.dart' show ReceiverConstraint;
-
-enum DynamicUseKind {
- INVOKE,
- GET,
- SET,
-}
+enum DynamicUseKind { INVOKE, GET, SET, }
/// The use of a dynamic property. [selector] defined the name and kind of the
/// property and [mask] defines the known constraint for the object on which
@@ -90,17 +79,17 @@
this.hashCode = Hashing.objectHash(element, Hashing.objectHash(kind)) {
assert(invariant(element, element.isDeclaration,
message: "Static use element $element must be "
- "the declaration element."));
+ "the declaration element."));
}
/// Invocation of a static or top-level [element] with the given
/// [callStructure].
- factory StaticUse.staticInvoke(MethodElement element,
- CallStructure callStructure) {
+ factory StaticUse.staticInvoke(
+ MethodElement element, CallStructure callStructure) {
// TODO(johnniwinther): Use the [callStructure].
assert(invariant(element, element.isStatic || element.isTopLevel,
message: "Static invoke element $element must be a top-level "
- "or static method."));
+ "or static method."));
return new StaticUse.internal(element, StaticUseKind.GENERAL);
}
@@ -108,7 +97,7 @@
factory StaticUse.staticTearOff(MethodElement element) {
assert(invariant(element, element.isStatic || element.isTopLevel,
message: "Static tear-off element $element must be a top-level "
- "or static method."));
+ "or static method."));
return new StaticUse.internal(element, StaticUseKind.STATIC_TEAR_OFF);
}
@@ -116,7 +105,7 @@
factory StaticUse.staticGet(MemberElement element) {
assert(invariant(element, element.isStatic || element.isTopLevel,
message: "Static get element $element must be a top-level "
- "or static method."));
+ "or static method."));
assert(invariant(element, element.isField || element.isGetter,
message: "Static get element $element must be a field or a getter."));
return new StaticUse.internal(element, StaticUseKind.GENERAL);
@@ -126,7 +115,7 @@
factory StaticUse.staticSet(MemberElement element) {
assert(invariant(element, element.isStatic || element.isTopLevel,
message: "Static set element $element must be a top-level "
- "or static method."));
+ "or static method."));
assert(invariant(element, element.isField || element.isSetter,
message: "Static set element $element must be a field or a setter."));
return new StaticUse.internal(element, StaticUseKind.GENERAL);
@@ -137,15 +126,15 @@
factory StaticUse.staticInit(FieldElement element) {
assert(invariant(element, element.isStatic || element.isTopLevel,
message: "Static init element $element must be a top-level "
- "or static method."));
+ "or static method."));
assert(invariant(element, element.isField,
message: "Static init element $element must be a field."));
return new StaticUse.internal(element, StaticUseKind.GENERAL);
}
/// Invocation of a super method [element] with the given [callStructure].
- factory StaticUse.superInvoke(MethodElement element,
- CallStructure callStructure) {
+ factory StaticUse.superInvoke(
+ MethodElement element, CallStructure callStructure) {
// TODO(johnniwinther): Use the [callStructure].
assert(invariant(element, element.isInstanceMember,
message: "Super invoke element $element must be an instance method."));
@@ -188,27 +177,26 @@
/// Invocation of a constructor [element] through a this or super
/// constructor call with the given [callStructure].
- factory StaticUse.superConstructorInvoke(Element element,
- CallStructure callStructure) {
+ factory StaticUse.superConstructorInvoke(
+ Element element, CallStructure callStructure) {
// TODO(johnniwinther): Use the [callStructure].
- assert(invariant(element,
- element.isGenerativeConstructor,
+ assert(invariant(element, element.isGenerativeConstructor,
message: "Constructor invoke element $element must be a "
- "generative constructor."));
+ "generative constructor."));
return new StaticUse.internal(element, StaticUseKind.GENERAL);
}
/// Invocation of a constructor (body) [element] through a this or super
/// constructor call with the given [callStructure].
- factory StaticUse.constructorBodyInvoke(ConstructorBodyElement element,
- CallStructure callStructure) {
+ factory StaticUse.constructorBodyInvoke(
+ ConstructorBodyElement element, CallStructure callStructure) {
// TODO(johnniwinther): Use the [callStructure].
return new StaticUse.internal(element, StaticUseKind.GENERAL);
}
/// Constructor invocation of [element] with the given [callStructure].
- factory StaticUse.constructorInvoke(ConstructorElement element,
- CallStructure callStructure) {
+ factory StaticUse.constructorInvoke(
+ ConstructorElement element, CallStructure callStructure) {
// TODO(johnniwinther): Use the [callStructure].
return new StaticUse.internal(element, StaticUseKind.GENERAL);
}
@@ -227,19 +215,19 @@
/// Read access of an instance field or boxed field [element].
factory StaticUse.fieldGet(Element element) {
- assert(invariant(element,
- element.isInstanceMember || element is BoxFieldElement,
+ assert(invariant(
+ element, element.isInstanceMember || element is BoxFieldElement,
message: "Field init element $element must be an instance "
- "or boxed field."));
+ "or boxed field."));
return new StaticUse.internal(element, StaticUseKind.FIELD_GET);
}
/// Write access of an instance field or boxed field [element].
factory StaticUse.fieldSet(Element element) {
- assert(invariant(element,
- element.isInstanceMember || element is BoxFieldElement,
+ assert(invariant(
+ element, element.isInstanceMember || element is BoxFieldElement,
message: "Field init element $element must be an instance "
- "or boxed field."));
+ "or boxed field."));
return new StaticUse.internal(element, StaticUseKind.FIELD_SET);
}
@@ -257,8 +245,7 @@
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! StaticUse) return false;
- return element == other.element &&
- kind == other.kind;
+ return element == other.element && kind == other.kind;
}
String toString() => 'StaticUse($element,$kind)';
@@ -317,9 +304,8 @@
bool operator ==(other) {
if (identical(this, other)) return true;
if (other is! TypeUse) return false;
- return type == other.type &&
- kind == other.kind;
+ return type == other.type && kind == other.kind;
}
String toString() => 'TypeUse($type,$kind)';
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/universe/world_impact.dart b/pkg/compiler/lib/src/universe/world_impact.dart
index f6bc666..45dcba5 100644
--- a/pkg/compiler/lib/src/universe/world_impact.dart
+++ b/pkg/compiler/lib/src/universe/world_impact.dart
@@ -4,23 +4,16 @@
library dart2js.universe.world_impact;
-import '../elements/elements.dart' show
- Element,
- LocalFunctionElement,
- MethodElement;
-import '../util/util.dart' show
- Setlet;
+import '../elements/elements.dart'
+ show Element, LocalFunctionElement, MethodElement;
+import '../util/util.dart' show Setlet;
-import 'use.dart' show
- DynamicUse,
- StaticUse,
- TypeUse;
+import 'use.dart' show DynamicUse, StaticUse, TypeUse;
class WorldImpact {
const WorldImpact();
- Iterable<DynamicUse> get dynamicUses =>
- const <DynamicUse>[];
+ Iterable<DynamicUse> get dynamicUses => const <DynamicUse>[];
Iterable<StaticUse> get staticUses => const <StaticUse>[];
@@ -75,8 +68,7 @@
}
Iterable<DynamicUse> get dynamicUses {
- return _dynamicUses != null
- ? _dynamicUses : const <DynamicUse>[];
+ return _dynamicUses != null ? _dynamicUses : const <DynamicUse>[];
}
void registerTypeUse(TypeUse typeUse) {
@@ -88,8 +80,7 @@
}
Iterable<TypeUse> get typeUses {
- return _typeUses != null
- ? _typeUses : const <TypeUse>[];
+ return _typeUses != null ? _typeUses : const <TypeUse>[];
}
void registerStaticUse(StaticUse staticUse) {
@@ -118,8 +109,7 @@
@override
Iterable<DynamicUse> get dynamicUses {
- return _dynamicUses != null
- ? _dynamicUses : worldImpact.dynamicUses;
+ return _dynamicUses != null ? _dynamicUses : worldImpact.dynamicUses;
}
void registerDynamicUse(DynamicUse dynamicUse) {
@@ -140,8 +130,7 @@
@override
Iterable<TypeUse> get typeUses {
- return _typeUses != null
- ? _typeUses : worldImpact.typeUses;
+ return _typeUses != null ? _typeUses : worldImpact.typeUses;
}
void registerStaticUse(StaticUse staticUse) {
@@ -185,10 +174,8 @@
const ImpactStrategy();
/// Applies [impact] to [visitor] for the [impactUseCase] of [element].
- void visitImpact(Element element,
- WorldImpact impact,
- WorldImpactVisitor visitor,
- ImpactUseCase impactUseCase) {
+ void visitImpact(Element element, WorldImpact impact,
+ WorldImpactVisitor visitor, ImpactUseCase impactUseCase) {
// Apply unconditionally.
impact.apply(visitor);
}
@@ -217,8 +204,8 @@
WorldImpactVisitorImpl(
{VisitUse<StaticUse> visitStaticUse,
- VisitUse<DynamicUse> visitDynamicUse,
- VisitUse<TypeUse> visitTypeUse})
+ VisitUse<DynamicUse> visitDynamicUse,
+ VisitUse<TypeUse> visitTypeUse})
: _visitStaticUse = visitStaticUse,
_visitDynamicUse = visitDynamicUse,
_visitTypeUse = visitTypeUse;
@@ -244,4 +231,3 @@
}
}
}
-
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index ed69c6f..d3578f7 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -45,9 +45,8 @@
import 'util/util.dart' as util;
import 'world.dart';
-import 'parser/partial_elements.dart' show
- PartialClassElement,
- PartialFunctionElement;
+import 'parser/partial_elements.dart'
+ show PartialClassElement, PartialFunctionElement;
class ElementVisitor extends elements_visitor.BaseElementVisitor {
visitElement(e, a) {}
@@ -93,36 +92,33 @@
class NullConstantConstructorVisitor
extends constants.ConstantConstructorVisitor {
@override
- visitGenerative(constants.GenerativeConstantConstructor constructor, arg) {
- }
+ visitGenerative(constants.GenerativeConstantConstructor constructor, arg) {}
@override
visitRedirectingFactory(
- constants.RedirectingFactoryConstantConstructor constructor, arg) {
- }
+ constants.RedirectingFactoryConstantConstructor constructor, arg) {}
@override
visitRedirectingGenerative(
- constants.RedirectingGenerativeConstantConstructor constructor, arg) {
- }
+ constants.RedirectingGenerativeConstantConstructor constructor, arg) {}
}
-void useConstant([constants.ConstantValue constant,
- constants.ConstantExpression expression,
- constants.ConstructedConstantExpression constructedConstant,
- constants.ConstantSystem cs,
- constants.Environment env]) {
+void useConstant(
+ [constants.ConstantValue constant,
+ constants.ConstantExpression expression,
+ constants.ConstructedConstantExpression constructedConstant,
+ constants.ConstantSystem cs,
+ constants.Environment env]) {
constant.isObject;
cs.isBool(constant);
constructedConstant.computeInstanceType();
constructedConstant.computeInstanceFields();
expression.evaluate(null, null);
new NullConstantConstructorVisitor()
- ..visit(null, null)
- ..visitGenerative(null, null)
- ..visitRedirectingFactory(null, null)
- ..visitRedirectingGenerative(null, null);
-
+ ..visit(null, null)
+ ..visitGenerative(null, null)
+ ..visitRedirectingFactory(null, null)
+ ..visitRedirectingGenerative(null, null);
}
void useNode(tree.Node node) {
@@ -246,12 +242,12 @@
new ssa.HStatementSequenceInformation(null);
}
-useIo([io.LineColumnMap map,
- io.LineColumnProvider provider]) {
- map..addFirst(null, null, null)
- ..forEachLine(null)
- ..getFirstElementsInLine(null)
- ..forEachColumn(null, null);
+useIo([io.LineColumnMap map, io.LineColumnProvider provider]) {
+ map
+ ..addFirst(null, null, null)
+ ..forEachLine(null)
+ ..getFirstElementsInLine(null)
+ ..forEachColumn(null, null);
provider.getOffset(null, null);
}
@@ -275,11 +271,11 @@
useElements(
[elements.ClassElement e,
- elements.Name n,
- modelx.FieldElementX f,
- PartialClassElement pce,
- PartialFunctionElement pfe,
- elements.LibraryElement l]) {
+ elements.Name n,
+ modelx.FieldElementX f,
+ PartialClassElement pce,
+ PartialFunctionElement pfe,
+ elements.LibraryElement l]) {
e.lookupClassMember(null);
e.lookupInterfaceMember(null);
n.isAccessibleFrom(null);
@@ -290,23 +286,20 @@
}
useIr(ir_builder.IrBuilder builder) {
- builder
- ..buildStringConstant(null);
+ builder..buildStringConstant(null);
}
useCompiler(compiler.Compiler c) {
c.libraryLoader
- ..reset()
- ..resetAsync(null)
- ..lookupLibrary(null);
+ ..reset()
+ ..resetAsync(null)
+ ..lookupLibrary(null);
c.forgetElement(null);
c.backend.constantCompilerTask.copyConstantValues(null);
c.currentlyInUserCode();
-
}
-useTypes() {
-}
+useTypes() {}
useCodeEmitterTask(js_emitter.CodeEmitterTask codeEmitterTask) {
full.Emitter fullEmitter = codeEmitterTask.emitter;
@@ -332,7 +325,7 @@
}
class TreeVisitor1 extends tree_ir.ExpressionVisitor1
- with tree_ir.StatementVisitor1 {
+ with tree_ir.StatementVisitor1 {
noSuchMethod(inv) {}
}
diff --git a/pkg/compiler/lib/src/util/characters.dart b/pkg/compiler/lib/src/util/characters.dart
index 5961d07..60fe4e1 100644
--- a/pkg/compiler/lib/src/util/characters.dart
+++ b/pkg/compiler/lib/src/util/characters.dart
@@ -6,7 +6,7 @@
const int $EOF = 0;
const int $STX = 2;
-const int $BS = 8;
+const int $BS = 8;
const int $TAB = 9;
const int $LF = 10;
const int $VTAB = 11;
diff --git a/pkg/compiler/lib/src/util/command_line.dart b/pkg/compiler/lib/src/util/command_line.dart
index 8a32e67..87c38e9 100644
--- a/pkg/compiler/lib/src/util/command_line.dart
+++ b/pkg/compiler/lib/src/util/command_line.dart
@@ -7,16 +7,15 @@
/// The accepted escapes in the input of the --batch processor.
///
/// Contrary to Dart strings it does not contain hex escapes (\u or \x).
-Map<String, String> ESCAPE_MAPPING =
- const {
- "n": "\n",
- "r": "\r",
- "t": "\t",
- "b": "\b",
- "f": "\f",
- "v": "\v",
- "\\": "\\",
- };
+Map<String, String> ESCAPE_MAPPING = const {
+ "n": "\n",
+ "r": "\r",
+ "t": "\t",
+ "b": "\b",
+ "f": "\f",
+ "v": "\v",
+ "\\": "\\",
+};
/// Splits the line similar to how a shell would split arguments. If [windows]
/// is `true` escapes will be handled like on the Windows command-line.
@@ -48,7 +47,7 @@
throw new FormatException("Unfinished escape: $line");
}
if (windows) {
- String next = line[i+1];
+ String next = line[i + 1];
if (next == '"' || next == r'\') {
buffer.write(next);
i++;
@@ -75,4 +74,3 @@
if (buffer.isNotEmpty) result.add(buffer.toString());
return result;
}
-
diff --git a/pkg/compiler/lib/src/util/emptyset.dart b/pkg/compiler/lib/src/util/emptyset.dart
index d70376f..da9942c 100644
--- a/pkg/compiler/lib/src/util/emptyset.dart
+++ b/pkg/compiler/lib/src/util/emptyset.dart
@@ -15,7 +15,7 @@
get _immutableError => throw new UnsupportedError("EmptySet is immutable");
- bool add (E element) => _immutableError;
+ bool add(E element) => _immutableError;
void addAll(Iterable<E> elements) => _immutableError;
E lookup(E element) => null;
diff --git a/pkg/compiler/lib/src/util/enumset.dart b/pkg/compiler/lib/src/util/enumset.dart
index 953a873..7d2f600 100644
--- a/pkg/compiler/lib/src/util/enumset.dart
+++ b/pkg/compiler/lib/src/util/enumset.dart
@@ -196,4 +196,4 @@
return _current != null;
}
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/util/indentation.dart b/pkg/compiler/lib/src/util/indentation.dart
index ddbeafa..9709f78 100644
--- a/pkg/compiler/lib/src/util/indentation.dart
+++ b/pkg/compiler/lib/src/util/indentation.dart
@@ -25,12 +25,12 @@
/// The indentation unit, defaulting to two spaces. May be overwritten.
String _indentationUnit = " ";
String get indentationUnit => _indentationUnit;
- set indentationUnit(String value) {
- if (value != _indentationUnit) {
- _indentationUnit = value;
- _indentList = <String>[""];
- }
- }
+ set indentationUnit(String value) {
+ if (value != _indentationUnit) {
+ _indentationUnit = value;
+ _indentList = <String>[""];
+ }
+ }
/// Increases the current level of indentation.
void indentMore() {
@@ -53,7 +53,6 @@
}
abstract class Tagging<N> implements Indentation {
-
StringBuffer sb = new StringBuffer();
Link<String> tagStack = const Link<String>();
diff --git a/pkg/compiler/lib/src/util/link.dart b/pkg/compiler/lib/src/util/link.dart
index f84c2c8..58d2cb9 100644
--- a/pkg/compiler/lib/src/util/link.dart
+++ b/pkg/compiler/lib/src/util/link.dart
@@ -16,10 +16,9 @@
Iterator<T> get iterator => new LinkIterator<T>(this);
- void printOn(StringBuffer buffer, [separatedBy]) {
- }
+ void printOn(StringBuffer buffer, [separatedBy]) {}
- List<T> toList({ bool growable: true }) {
+ List<T> toList({bool growable: true}) {
List<T> result;
if (!growable) {
result = new List<T>(slowLength());
@@ -36,12 +35,12 @@
/// Lazily maps over this linked list, returning an [Iterable].
Iterable map(dynamic fn(T item)) {
- return new MappedLinkIterable<T,dynamic>(this, fn);
+ return new MappedLinkIterable<T, dynamic>(this, fn);
}
/// Invokes `fn` for every item in the linked list and returns the results
/// in a [List].
- List mapToList(dynamic fn(T item), { bool growable: true }) {
+ List mapToList(dynamic fn(T item), {bool growable: true}) {
List result;
if (!growable) {
result = new List(slowLength());
@@ -74,7 +73,7 @@
void forEach(void f(T element)) {}
bool operator ==(other) {
- if (other is !Link<T>) return false;
+ if (other is! Link<T>) return false;
return other.isEmpty;
}
@@ -113,7 +112,7 @@
///
/// Returns true for the empty list.
bool every(bool f(T)) {
- for (Link<T> link = this; !link.isEmpty; link = link.tail){
+ for (Link<T> link = this; !link.isEmpty; link = link.tail) {
if (!f(link.head)) return false;
}
return true;
@@ -125,7 +124,7 @@
// Unsupported Iterable<T> methods.
//
bool any(bool f(T e)) => _unsupported('any');
- T elementAt(int i) => _unsupported('elementAt');
+ T elementAt(int i) => _unsupported('elementAt');
Iterable expand(Iterable f(T e)) => _unsupported('expand');
T firstWhere(bool f(T e), {T orElse()}) => _unsupported('firstWhere');
fold(initialValue, combine(value, T element)) => _unsupported('fold');
diff --git a/pkg/compiler/lib/src/util/link_implementation.dart b/pkg/compiler/lib/src/util/link_implementation.dart
index 973ef50..ac06c17 100644
--- a/pkg/compiler/lib/src/util/link_implementation.dart
+++ b/pkg/compiler/lib/src/util/link_implementation.dart
@@ -52,7 +52,7 @@
MappedLinkIterable(this._link, this._transformation);
Iterator<T> get iterator {
- return new MappedLinkIterator<S,T>(_link, _transformation);
+ return new MappedLinkIterator<S, T>(_link, _transformation);
}
}
@@ -61,7 +61,7 @@
Link<T> tail;
LinkEntry(T this.head, [Link<T> tail])
- : this.tail = ((tail == null) ? new Link<T>() : tail);
+ : this.tail = ((tail == null) ? new Link<T>() : tail);
Link<T> prepend(T element) {
// TODO(ahe): Use new Link<T>, but this cost 8% performance on VM.
@@ -103,7 +103,7 @@
Link<T> skip(int n) {
Link<T> link = this;
- for (int i = 0 ; i < n ; i++) {
+ for (int i = 0; i < n; i++) {
if (link.isEmpty) {
throw new RangeError('Index $n out of range');
}
@@ -122,7 +122,7 @@
}
bool operator ==(other) {
- if (other is !Link<T>) return false;
+ if (other is! Link<T>) return false;
Link<T> myElements = this;
while (myElements.isNotEmpty && other.isNotEmpty) {
if (myElements.head != other.head) {
diff --git a/pkg/compiler/lib/src/util/maplet.dart b/pkg/compiler/lib/src/util/maplet.dart
index 455435b..086273c 100644
--- a/pkg/compiler/lib/src/util/maplet.dart
+++ b/pkg/compiler/lib/src/util/maplet.dart
@@ -101,7 +101,7 @@
list[CAPACITY + 1] = value;
_key = list;
_value = null;
- _extra = 2; // Two elements.
+ _extra = 2; // Two elements.
}
} else if (_MARKER == _extra) {
_key[key] = value;
@@ -277,4 +277,4 @@
_current = null;
return false;
}
-}
\ No newline at end of file
+}
diff --git a/pkg/compiler/lib/src/util/setlet.dart b/pkg/compiler/lib/src/util/setlet.dart
index f497561e..cd654c1 100644
--- a/pkg/compiler/lib/src/util/setlet.dart
+++ b/pkg/compiler/lib/src/util/setlet.dart
@@ -86,7 +86,7 @@
list[0] = _contents;
list[1] = element;
_contents = list;
- _extra = 2; // Two elements.
+ _extra = 2; // Two elements.
return true;
}
} else if (_MARKER == _extra) {
@@ -130,7 +130,9 @@
// make sure we don't keep extra stuff alive.
while (copyTo < CAPACITY) _contents[copyTo++] = null;
} else {
- _contents = new Set<E>()..addAll(_contents)..add(element);
+ _contents = new Set<E>()
+ ..addAll(_contents)
+ ..add(element);
_extra = _MARKER;
}
return true;
@@ -233,7 +235,8 @@
bool containsAll(Iterable<E> other) {
for (E e in other) {
if (!this.contains(e)) return false;
- };
+ }
+ ;
return true;
}
diff --git a/pkg/compiler/lib/src/util/uri_extras.dart b/pkg/compiler/lib/src/util/uri_extras.dart
index aa8cdcf..5164378 100644
--- a/pkg/compiler/lib/src/util/uri_extras.dart
+++ b/pkg/compiler/lib/src/util/uri_extras.dart
@@ -32,13 +32,13 @@
if (base.userInfo == uri.userInfo &&
equalsNCS(base.host, uri.host) &&
base.port == uri.port &&
- uri.query == "" && uri.fragment == "") {
+ uri.query == "" &&
+ uri.fragment == "") {
if (normalize(uri.path).startsWith(normalize(base.path))) {
return uri.path.substring(base.path.lastIndexOf('/') + 1);
}
- if (!base.path.startsWith('/') ||
- !uri.path.startsWith('/')) {
+ if (!base.path.startsWith('/') || !uri.path.startsWith('/')) {
return uri.toString();
}
@@ -47,7 +47,7 @@
int common = 0;
int length = min(uriParts.length, baseParts.length);
while (common < length &&
- normalize(uriParts[common]) == normalize(baseParts[common])) {
+ normalize(uriParts[common]) == normalize(baseParts[common])) {
common++;
}
if (common == 1 || (isWindows && common == 2)) {
diff --git a/pkg/compiler/lib/src/util/util.dart b/pkg/compiler/lib/src/util/util.dart
index a91f6cd..102ca9e 100644
--- a/pkg/compiler/lib/src/util/util.dart
+++ b/pkg/compiler/lib/src/util/util.dart
@@ -116,9 +116,9 @@
} else if (code == $LS) {
// This Unicode line terminator and $PS are invalid in JS string
// literals.
- addCodeUnitEscaped(buffer, $LS); // 0x2028.
+ addCodeUnitEscaped(buffer, $LS); // 0x2028.
} else if (code == $PS) {
- addCodeUnitEscaped(buffer, $PS); // 0x2029.
+ addCodeUnitEscaped(buffer, $PS); // 0x2029.
} else if (code == $BACKSLASH) {
buffer.write(r'\\');
} else {
@@ -143,8 +143,13 @@
for (int i = 0; i < string.length; i++) {
int code = string.codeUnitAt(i);
- if (code < 0x20 || code == $DEL || code == $DQ || code == $LS ||
- code == $PS || code == $BACKSLASH || code >= 0x80) {
+ if (code < 0x20 ||
+ code == $DEL ||
+ code == $DQ ||
+ code == $LS ||
+ code == $PS ||
+ code == $BACKSLASH ||
+ code >= 0x80) {
writeEscapedOn(string, buffer);
return;
}
@@ -153,20 +158,22 @@
}
int computeHashCode(part1, [part2, part3, part4, part5]) {
- return (part1.hashCode
- ^ part2.hashCode
- ^ part3.hashCode
- ^ part4.hashCode
- ^ part5.hashCode) & 0x3fffffff;
+ return (part1.hashCode ^
+ part2.hashCode ^
+ part3.hashCode ^
+ part4.hashCode ^
+ part5.hashCode) &
+ 0x3fffffff;
}
-String modifiersToString({bool isStatic: false,
- bool isAbstract: false,
- bool isFinal: false,
- bool isVar: false,
- bool isConst: false,
- bool isFactory: false,
- bool isExternal: false}) {
+String modifiersToString(
+ {bool isStatic: false,
+ bool isAbstract: false,
+ bool isFinal: false,
+ bool isVar: false,
+ bool isConst: false,
+ bool isFactory: false,
+ bool isExternal: false}) {
LinkBuilder<String> builder = new LinkBuilder<String>();
if (isStatic) builder.addLast('static');
if (isAbstract) builder.addLast('abstract');
@@ -197,10 +204,9 @@
String toString() => '($a,$b)';
}
-
int longestCommonPrefixLength(List a, List b) {
int index = 0;
- for ( ; index < a.length && index < b.length; index++) {
+ for (; index < a.length && index < b.length; index++) {
if (a[index] != b[index]) {
break;
}
diff --git a/pkg/compiler/lib/src/world.dart b/pkg/compiler/lib/src/world.dart
index a7dbad0..f217263 100644
--- a/pkg/compiler/lib/src/world.dart
+++ b/pkg/compiler/lib/src/world.dart
@@ -4,34 +4,27 @@
library dart2js.world;
-import 'closure.dart' show
- SynthesizedCallMethodElementX;
+import 'closure.dart' show SynthesizedCallMethodElementX;
import 'common.dart';
-import 'common/backend_api.dart' show
- Backend;
-import 'compiler.dart' show
- Compiler;
-import 'core_types.dart' show
- CoreClasses;
+import 'common/backend_api.dart' show Backend;
+import 'compiler.dart' show Compiler;
+import 'core_types.dart' show CoreClasses;
import 'dart_types.dart';
-import 'elements/elements.dart' show
- ClassElement,
- Element,
- FunctionElement,
- MixinApplicationElement,
- TypedefElement,
- VariableElement;
+import 'elements/elements.dart'
+ show
+ ClassElement,
+ Element,
+ FunctionElement,
+ MixinApplicationElement,
+ TypedefElement,
+ VariableElement;
import 'ordered_typeset.dart';
import 'types/types.dart' as ti;
import 'universe/class_set.dart';
-import 'universe/function_set.dart' show
- FunctionSet;
-import 'universe/selector.dart' show
- Selector;
-import 'universe/side_effects.dart' show
- SideEffects;
-import 'util/util.dart' show
- Link;
+import 'universe/function_set.dart' show FunctionSet;
+import 'universe/selector.dart' show Selector;
+import 'universe/side_effects.dart' show SideEffects;
+import 'util/util.dart' show Link;
abstract class ClassWorld {
// TODO(johnniwinther): Refine this into a `BackendClasses` interface.
@@ -99,8 +92,8 @@
/// Applies [f] to each live class that extend [cls] _not_ including [cls]
/// itself.
- void forEachStrictSubclassOf(ClassElement cls,
- IterationStep f(ClassElement cls));
+ void forEachStrictSubclassOf(
+ ClassElement cls, IterationStep f(ClassElement cls));
/// Returns `true` if [predicate] applies to any live class that extend [cls]
/// _not_ including [cls] itself.
@@ -120,8 +113,8 @@
/// Applies [f] to each live class that implements [cls] _not_ including [cls]
/// itself.
- void forEachStrictSubtypeOf(ClassElement cls,
- IterationStep f(ClassElement cls));
+ void forEachStrictSubtypeOf(
+ ClassElement cls, IterationStep f(ClassElement cls));
/// Returns `true` if [predicate] applies to any live class that implements
/// [cls] _not_ including [cls] itself.
@@ -159,8 +152,8 @@
bool isUsedAsMixin(ClassElement cls);
/// Returns `true` if any live class that mixes in [cls] implements [type].
- bool hasAnySubclassOfMixinUseThatImplements(ClassElement cls,
- ClassElement type);
+ bool hasAnySubclassOfMixinUseThatImplements(
+ ClassElement cls, ClassElement type);
/// Returns `true` if any live class that mixes in [mixin] is also a subclass
/// of [superclass].
@@ -195,16 +188,17 @@
new List<Map<ClassElement, ti.TypeMask>>.filled(8, null);
bool checkInvariants(ClassElement cls, {bool mustBeInstantiated: true}) {
- return
- invariant(cls, cls.isDeclaration,
+ return invariant(cls, cls.isDeclaration,
message: '$cls must be the declaration.') &&
- invariant(cls, cls.isResolved,
- message: '$cls must be resolved.')/* &&
+ invariant(cls, cls.isResolved,
+ message:
+ '$cls must be resolved.') /* &&
// TODO(johnniwinther): Reinsert this or similar invariant.
(!mustBeInstantiated ||
invariant(cls, isInstantiated(cls),
- message: '$cls is not instantiated.'))*/;
- }
+ message: '$cls is not instantiated.'))*/
+ ;
+ }
/// Returns `true` if [x] is a subtype of [y], that is, if [x] implements an
/// instance of [y].
@@ -261,8 +255,7 @@
Iterable<ClassElement> subclassesOf(ClassElement cls) {
ClassHierarchyNode hierarchy = _classHierarchyNodes[cls.declaration];
if (hierarchy == null) return const <ClassElement>[];
- return hierarchy.subclassesByMask(
- ClassHierarchyNode.DIRECTLY_INSTANTIATED);
+ return hierarchy.subclassesByMask(ClassHierarchyNode.DIRECTLY_INSTANTIATED);
}
/// Returns an iterable over the directly instantiated classes that extend
@@ -270,8 +263,8 @@
Iterable<ClassElement> strictSubclassesOf(ClassElement cls) {
ClassHierarchyNode subclasses = _classHierarchyNodes[cls.declaration];
if (subclasses == null) return const <ClassElement>[];
- return subclasses.subclassesByMask(
- ClassHierarchyNode.DIRECTLY_INSTANTIATED, strict: true);
+ return subclasses.subclassesByMask(ClassHierarchyNode.DIRECTLY_INSTANTIATED,
+ strict: true);
}
/// Returns the number of live classes that extend [cls] _not_
@@ -284,13 +277,11 @@
/// Applies [f] to each live class that extend [cls] _not_ including [cls]
/// itself.
- void forEachStrictSubclassOf(ClassElement cls,
- IterationStep f(ClassElement cls)) {
+ void forEachStrictSubclassOf(
+ ClassElement cls, IterationStep f(ClassElement cls)) {
ClassHierarchyNode subclasses = _classHierarchyNodes[cls.declaration];
if (subclasses == null) return;
- subclasses.forEachSubclass(
- f,
- ClassHierarchyNode.DIRECTLY_INSTANTIATED,
+ subclasses.forEachSubclass(f, ClassHierarchyNode.DIRECTLY_INSTANTIATED,
strict: true);
}
@@ -300,8 +291,7 @@
ClassHierarchyNode subclasses = _classHierarchyNodes[cls.declaration];
if (subclasses == null) return false;
return subclasses.anySubclass(
- predicate,
- ClassHierarchyNode.DIRECTLY_INSTANTIATED,
+ predicate, ClassHierarchyNode.DIRECTLY_INSTANTIATED,
strict: true);
}
@@ -323,8 +313,7 @@
if (classSet == null) {
return const <ClassElement>[];
} else {
- return classSet.subtypesByMask(
- ClassHierarchyNode.DIRECTLY_INSTANTIATED,
+ return classSet.subtypesByMask(ClassHierarchyNode.DIRECTLY_INSTANTIATED,
strict: true);
}
}
@@ -339,13 +328,11 @@
/// Applies [f] to each live class that implements [cls] _not_ including [cls]
/// itself.
- void forEachStrictSubtypeOf(ClassElement cls,
- IterationStep f(ClassElement cls)) {
+ void forEachStrictSubtypeOf(
+ ClassElement cls, IterationStep f(ClassElement cls)) {
ClassSet classSet = _classSets[cls.declaration];
if (classSet == null) return;
- classSet.forEachSubtype(
- f,
- ClassHierarchyNode.DIRECTLY_INSTANTIATED,
+ classSet.forEachSubtype(f, ClassHierarchyNode.DIRECTLY_INSTANTIATED,
strict: true);
}
@@ -355,8 +342,7 @@
ClassSet classSet = _classSets[cls.declaration];
if (classSet == null) return false;
return classSet.anySubtype(
- predicate,
- ClassHierarchyNode.DIRECTLY_INSTANTIATED,
+ predicate, ClassHierarchyNode.DIRECTLY_INSTANTIATED,
strict: true);
}
@@ -406,14 +392,14 @@
ClassElement getLubOfInstantiatedSubclasses(ClassElement cls) {
ClassHierarchyNode hierarchy = _classHierarchyNodes[cls.declaration];
return hierarchy != null
- ? hierarchy.getLubOfInstantiatedSubclasses() : null;
+ ? hierarchy.getLubOfInstantiatedSubclasses()
+ : null;
}
@override
ClassElement getLubOfInstantiatedSubtypes(ClassElement cls) {
ClassSet classSet = _classSets[cls.declaration];
- return classSet != null
- ? classSet.getLubOfInstantiatedSubtypes() : null;
+ return classSet != null ? classSet.getLubOfInstantiatedSubtypes() : null;
}
/// Returns an iterable over the common supertypes of the [classes].
@@ -440,8 +426,8 @@
List<ClassElement> commonSupertypes = <ClassElement>[];
OUTER: for (Link<DartType> link = typeSet[depth];
- link.head.element != objectClass;
- link = link.tail) {
+ link.head.element != objectClass;
+ link = link.tail) {
ClassElement cls = link.head.element;
for (Link<OrderedTypeSet> link = otherTypeSets;
!link.isEmpty;
@@ -497,10 +483,10 @@
}
/// Returns `true` if any live class that mixes in [cls] implements [type].
- bool hasAnySubclassOfMixinUseThatImplements(ClassElement cls,
- ClassElement type) {
- return mixinUsesOf(cls).any(
- (use) => hasAnySubclassThatImplements(use, type));
+ bool hasAnySubclassOfMixinUseThatImplements(
+ ClassElement cls, ClassElement type) {
+ return mixinUsesOf(cls)
+ .any((use) => hasAnySubclassThatImplements(use, type));
}
/// Returns `true` if any live class that mixes in [mixin] is also a subclass
@@ -510,8 +496,8 @@
}
/// Returns `true` if any subclass of [superclass] implements [type].
- bool hasAnySubclassThatImplements(ClassElement superclass,
- ClassElement type) {
+ bool hasAnySubclassThatImplements(
+ ClassElement superclass, ClassElement type) {
Set<ClassElement> subclasses = typesImplementedBySubclassesOf(superclass);
if (subclasses == null) return false;
return subclasses.contains(type);
@@ -536,8 +522,7 @@
// distinct sets to make class hierarchy analysis faster.
final Map<ClassElement, ClassHierarchyNode> _classHierarchyNodes =
<ClassElement, ClassHierarchyNode>{};
- final Map<ClassElement, ClassSet> _classSets =
- <ClassElement, ClassSet>{};
+ final Map<ClassElement, ClassSet> _classSets = <ClassElement, ClassSet>{};
final Set<Element> sideEffectsFreeElements = new Set<Element>();
@@ -638,8 +623,7 @@
}
}
- void _updateClassHierarchyNodeForClass(
- ClassElement cls,
+ void _updateClassHierarchyNodeForClass(ClassElement cls,
{bool directlyInstantiated: false}) {
ClassHierarchyNode node = getClassHierarchyNode(cls);
_updateSuperClassHierarchyNodeForClass(node);
@@ -698,14 +682,13 @@
return sb.toString();
}
- void registerMixinUse(MixinApplicationElement mixinApplication,
- ClassElement mixin) {
+ void registerMixinUse(
+ MixinApplicationElement mixinApplication, ClassElement mixin) {
// TODO(johnniwinther): Add map restricted to live classes.
// We don't support patch classes as mixin.
assert(mixin.isDeclaration);
- List<MixinApplicationElement> users =
- _mixinUses.putIfAbsent(mixin, () =>
- new List<MixinApplicationElement>());
+ List<MixinApplicationElement> users = _mixinUses.putIfAbsent(
+ mixin, () => new List<MixinApplicationElement>());
users.add(mixinApplication);
}
@@ -725,17 +708,14 @@
}
Element locateSingleElement(Selector selector, ti.TypeMask mask) {
- mask = mask == null
- ? compiler.typesTask.dynamicType
- : mask;
+ mask = mask == null ? compiler.typesTask.dynamicType : mask;
return mask.locateSingleElement(selector, mask, compiler);
}
ti.TypeMask extendMaskIfReachesAll(Selector selector, ti.TypeMask mask) {
bool canReachAll = true;
if (mask != null) {
- canReachAll =
- compiler.enabledInvokeOn &&
+ canReachAll = compiler.enabledInvokeOn &&
mask.needsNoSuchMethodHandling(selector, this);
}
return canReachAll ? compiler.typesTask.dynamicType : mask;
@@ -764,7 +744,7 @@
}
if (element.isInstanceMember) {
return !compiler.resolverWorld.hasInvokedSetter(element, this) &&
- !compiler.resolverWorld.fieldSetters.contains(element);
+ !compiler.resolverWorld.fieldSetters.contains(element);
}
return false;
}
diff --git a/pkg/compiler/samples/compile_loop/compile_loop.dart b/pkg/compiler/samples/compile_loop/compile_loop.dart
index 9a2e44e..097d046 100644
--- a/pkg/compiler/samples/compile_loop/compile_loop.dart
+++ b/pkg/compiler/samples/compile_loop/compile_loop.dart
@@ -28,27 +28,24 @@
// TODO(ahe): Use new Future.error.
throw new Exception('Error: Cannot read: $uri');
}
- void handler(Uri uri, int begin, int end,
- String message, compiler.Diagnostic kind) {
+ void handler(
+ Uri uri, int begin, int end, String message, compiler.Diagnostic kind) {
// TODO(ahe): Remove dart:io import from
// ../../lib/src/source_file_provider.dart and use
// FormattingDiagnosticHandler instead.
- print({ 'uri': '$uri',
- 'begin': begin,
- 'end': end,
- 'message': message,
- 'kind': kind.name });
+ print({
+ 'uri': '$uri',
+ 'begin': begin,
+ 'end': end,
+ 'message': message,
+ 'kind': kind.name
+ });
if (kind == compiler.Diagnostic.ERROR) {
throw new Exception('Unexpected error occurred.');
}
}
- return compiler.compile(
- Uri.parse('memory:/main.dart'),
- Uri.parse('sdk:/sdk/'),
- null,
- inputProvider,
- handler,
- []);
+ return compiler.compile(Uri.parse('memory:/main.dart'),
+ Uri.parse('sdk:/sdk/'), null, inputProvider, handler, []);
}
int iterations = 10;
diff --git a/pkg/compiler/samples/darttags/darttags.dart b/pkg/compiler/samples/darttags/darttags.dart
index 84b7562..0333c69 100644
--- a/pkg/compiler/samples/darttags/darttags.dart
+++ b/pkg/compiler/samples/darttags/darttags.dart
@@ -35,10 +35,8 @@
import 'package:sdk_library_metadata/libraries.dart'
show libraries, LibraryInfo;
-import 'package:compiler/src/mirrors/analyze.dart'
- show analyze;
-import 'package:compiler/src/mirrors/dart2js_mirrors.dart'
- show BackDoor;
+import 'package:compiler/src/mirrors/analyze.dart' show analyze;
+import 'package:compiler/src/mirrors/dart2js_mirrors.dart' show BackDoor;
import 'package:compiler/src/mirrors/mirrors_util.dart' show nameOf;
import 'package:compiler/src/filenames.dart';
@@ -59,15 +57,12 @@
Uri outputUri;
main(List<String> arguments) {
- handler = new FormattingDiagnosticHandler()
- ..throwOnError = true;
+ handler = new FormattingDiagnosticHandler()..throwOnError = true;
- outputUri =
- handler.provider.cwd.resolve(nativeToUriPath(arguments.first));
+ outputUri = handler.provider.cwd.resolve(nativeToUriPath(arguments.first));
output = new File(arguments.first).openSync(mode: FileMode.WRITE);
- Uri myLocation =
- handler.provider.cwd.resolveUri(Platform.script);
+ Uri myLocation = handler.provider.cwd.resolveUri(Platform.script);
List<Uri> uris = <Uri>[];
@@ -87,8 +82,8 @@
// Prepend "dart:" to the names.
uris.addAll(names.map((String name) => Uri.parse('dart:$name')));
- Uri platformConfigUri = myLocation.resolve(SDK_ROOT)
- .resolve("lib/dart2js_shared_sdk");
+ Uri platformConfigUri =
+ myLocation.resolve(SDK_ROOT).resolve("lib/dart2js_shared_sdk");
Uri packageRoot = Uri.base.resolve(Platform.packageRoot);
analyze(uris, platformConfigUri, packageRoot, handler.provider, handler)
@@ -189,8 +184,7 @@
}
void writeOn(StringBuffer buffer, String tagname) {
- buffer.write(
- '${tag_definition_text}\x7f${tagname}'
+ buffer.write('${tag_definition_text}\x7f${tagname}'
'\x01${line_number},${byte_offset}\n');
}
}
diff --git a/pkg/compiler/samples/jsonify/jsonify.dart b/pkg/compiler/samples/jsonify/jsonify.dart
index 6e1e728..db8020d 100644
--- a/pkg/compiler/samples/jsonify/jsonify.dart
+++ b/pkg/compiler/samples/jsonify/jsonify.dart
@@ -11,10 +11,8 @@
import 'package:sdk_library_metadata/libraries.dart'
show libraries, LibraryInfo;
-import '../../lib/src/mirrors/analyze.dart'
- show analyze;
-import '../../lib/src/mirrors/dart2js_mirrors.dart'
- show BackDoor;
+import '../../lib/src/mirrors/analyze.dart' show analyze;
+import '../../lib/src/mirrors/dart2js_mirrors.dart' show BackDoor;
import '../../lib/src/filenames.dart';
import '../../lib/src/source_file_provider.dart';
@@ -36,18 +34,14 @@
const bool.fromEnvironment('outputJson', defaultValue: false);
main(List<String> arguments) {
- handler = new FormattingDiagnosticHandler()
- ..throwOnError = true;
+ handler = new FormattingDiagnosticHandler()..throwOnError = true;
- outputUri =
- handler.provider.cwd.resolve(nativeToUriPath(arguments.first));
+ outputUri = handler.provider.cwd.resolve(nativeToUriPath(arguments.first));
output = new File(arguments.first).openSync(mode: FileMode.WRITE);
- Uri myLocation =
- handler.provider.cwd.resolveUri(Platform.script);
+ Uri myLocation = handler.provider.cwd.resolveUri(Platform.script);
- Uri packageRoot =
- handler.provider.cwd.resolve(Platform.packageRoot);
+ Uri packageRoot = handler.provider.cwd.resolve(Platform.packageRoot);
Uri libraryRoot = myLocation.resolve(SDK_ROOT);
@@ -87,9 +81,11 @@
}
});
- for (String filename in ["dart_client.platform",
- "dart_server.platform",
- "dart_shared.platform"]) {
+ for (String filename in [
+ "dart_client.platform",
+ "dart_server.platform",
+ "dart_shared.platform"
+ ]) {
futures.add(mapUri(sdkRoot.resolve('sdk/lib/$filename')));
}
diff --git a/pkg/compiler/tool/track_memory.dart b/pkg/compiler/tool/track_memory.dart
index effd92f..c5f5d04 100644
--- a/pkg/compiler/tool/track_memory.dart
+++ b/pkg/compiler/tool/track_memory.dart
@@ -63,15 +63,11 @@
}
/// Send a message to the vm service.
-Future _sendMessage(String method, [Map args= const {}]) {
+Future _sendMessage(String method, [Map args = const {}]) {
var id = _requestId++;
_pendingResponses[id] = new Completer();
- socket.add(JSON.encode({
- 'jsonrpc': '2.0',
- 'id': '$id',
- 'method': '$method',
- 'params': args,
- }));
+ socket.add(JSON.encode(
+ {'jsonrpc': '2.0', 'id': '$id', 'method': '$method', 'params': args,}));
return _pendingResponses[id].future;
}
@@ -101,7 +97,8 @@
var isolateId = json['params']['event']['isolate']['id'];
if (json['params']['event']['kind'] == 'PauseStart') {
_resumeIsolate(isolateId);
- } if (json['params']['event']['kind'] == 'PauseExit') {
+ }
+ if (json['params']['event']['kind'] == 'PauseExit') {
_resumeIsolate(isolateId);
}
}
diff --git a/pkg/meta/CHANGELOG.md b/pkg/meta/CHANGELOG.md
index 2420295..b7c6b01 100644
--- a/pkg/meta/CHANGELOG.md
+++ b/pkg/meta/CHANGELOG.md
@@ -1,3 +1,9 @@
+## 0.12.0
+* Introduce `@optionalTypeArgs` annotation for classes whose type arguments are to be treated as optional.
+
+## 0.11.0
+* Added new `Required` constructor with a means to specify a reason to explain why a parameter is required.
+
## 0.10.0
* Introduce `@factory` annotation for methods that must either be abstract or
must return a newly allocated object.
diff --git a/pkg/meta/lib/meta.dart b/pkg/meta/lib/meta.dart
index 16411b5..b8142fd 100644
--- a/pkg/meta/lib/meta.dart
+++ b/pkg/meta/lib/meta.dart
@@ -56,6 +56,12 @@
/// without invoking the overridden method.
const _MustCallSuper mustCallSuper = const _MustCallSuper();
+/// Used to annotate a class declaration `C`. Indicates that any type arguments
+/// declared on `C` are to be treated as optional. Tools such as the analyzer
+/// and linter can use this information to suppress warnings that would
+/// otherwise require type arguments to be provided for instances of `C`.
+const _OptionalTypeArgs optionalTypeArgs = const _OptionalTypeArgs();
+
/// Used to annotate an instance member (method, getter, setter, operator, or
/// field) `m` in a class `C`. If the annotation is on a field it applies to the
/// getter, and setter if appropriate, that are induced by the field. Indicates
@@ -117,6 +123,10 @@
const _MustCallSuper();
}
+class _OptionalTypeArgs {
+ const _OptionalTypeArgs();
+}
+
class _Protected {
const _Protected();
}
diff --git a/pkg/meta/pubspec.yaml b/pkg/meta/pubspec.yaml
index abcbc8d..d2f5506 100644
--- a/pkg/meta/pubspec.yaml
+++ b/pkg/meta/pubspec.yaml
@@ -1,5 +1,5 @@
name: meta
-version: 0.10.0
+version: 0.12.0
author: Dart Team <misc@dartlang.org>
homepage: http://www.dartlang.org
description: >
diff --git a/pkg/pkg.status b/pkg/pkg.status
index 8062b73..c991ab2 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -85,9 +85,11 @@
analyzer/test/src/context/context_test: Pass, Timeout # dartbug.com/23658
analyzer/test/src/dart/ast/utilities_test: Pass, Slow # Issue 24914
analyzer/test/src/dart/constant/evaluation_test: Pass, Slow # Issue 24914
+analyzer/test/src/dart/constant/value_test: Pass, Slow # Issue 24914
analyzer/test/src/dart/element/element_test: Pass, Slow # Issue 24914
analyzer/test/src/summary/incremental_cache_test: Pass, Slow # Issue 24914
analyzer/test/src/summary/index_unit_test: Pass, Slow # Issue 24914
+analyzer/test/src/summary/linker_test: Pass, Slow # Issue 24914
analyzer/test/src/summary/prelinker_test: Pass, Slow # Issue 24914
analyzer/test/src/summary/resynthesize_ast_test: Pass, Slow
analyzer/test/src/summary/resynthesize_strong_test: Pass, Slow
diff --git a/runtime/bin/zlib.gyp b/runtime/bin/zlib.gyp
index 98555f9f..584f0ef 100644
--- a/runtime/bin/zlib.gyp
+++ b/runtime/bin/zlib.gyp
@@ -64,11 +64,6 @@
'<(zlib_path)/.',
],
},
- 'conditions': [
- ['OS!="win"', {
- 'product_name': 'chrome_zlib',
- }],
- ],
},
],
}
diff --git a/runtime/lib/convert_patch.dart b/runtime/lib/convert_patch.dart
index 6d83969..3c50f2a 100644
--- a/runtime/lib/convert_patch.dart
+++ b/runtime/lib/convert_patch.dart
@@ -39,13 +39,14 @@
}
}
-class _JsonUtf8Decoder extends Converter<List<int>, Object> {
+class _JsonUtf8Decoder extends
+ ChunkedConverter<List<int>, Object, List<int>, Object> {
final _Reviver _reviver;
final bool _allowMalformed;
_JsonUtf8Decoder(this._reviver, this._allowMalformed);
- dynamic convert(List<int> input) {
+ Object convert(List<int> input) {
var parser = _JsonUtf8DecoderSink._createParser(_reviver, _allowMalformed);
parser.chunk = input;
parser.chunkEnd = input.length;
diff --git a/runtime/lib/core_sources.gypi b/runtime/lib/core_sources.gypi
index bef056e..dd00af4 100644
--- a/runtime/lib/core_sources.gypi
+++ b/runtime/lib/core_sources.gypi
@@ -38,8 +38,6 @@
'lib_prefix.dart',
'map_patch.dart',
'null_patch.dart',
- 'num.cc',
- 'num.dart',
'object.cc',
'object_patch.dart',
'regexp.cc',
diff --git a/runtime/lib/double.cc b/runtime/lib/double.cc
index dbeb447..2706269 100644
--- a/runtime/lib/double.cc
+++ b/runtime/lib/double.cc
@@ -230,6 +230,14 @@
}
+DEFINE_NATIVE_ENTRY(Double_toString, 1) {
+ const Number& number = Number::CheckedHandle(arguments->NativeArgAt(0));
+ Heap::Space space = isolate->heap()->ShouldPretenure(kOneByteStringCid) ?
+ Heap::kPretenured : Heap::kNew;
+ return number.ToString(space);
+}
+
+
DEFINE_NATIVE_ENTRY(Double_toStringAsFixed, 2) {
// The boundaries are exclusive.
static const double kLowerBoundary = -1e21;
diff --git a/runtime/lib/double.dart b/runtime/lib/double.dart
index 87d8046..06cd324 100644
--- a/runtime/lib/double.dart
+++ b/runtime/lib/double.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-class _Double extends _Num implements double {
+class _Double implements double {
factory _Double.fromInteger(int value)
native "Double_doubleFromInteger";
@@ -140,6 +140,8 @@
static final List _cache = new List(CACHE_LENGTH);
static int _cacheEvictIndex = 0;
+ String _toString() native "Double_toString";
+
String toString() {
// TODO(koda): Consider starting at most recently inserted.
for (int i = 0; i < CACHE_LENGTH; i += 2) {
@@ -152,7 +154,7 @@
if (identical(0.0, this)) {
return "0.0";
}
- String result = super.toString();
+ String result = _toString();
// Replace the least recently inserted entry.
_cache[_cacheEvictIndex] = this;
_cache[_cacheEvictIndex + 1] = result;
diff --git a/runtime/lib/integers.dart b/runtime/lib/integers.dart
index 45500d6..a28491c 100644
--- a/runtime/lib/integers.dart
+++ b/runtime/lib/integers.dart
@@ -2,7 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
-class _IntegerImplementation extends _Num {
+abstract class _IntegerImplementation {
// The Dart class _Bigint extending _IntegerImplementation requires a
// default constructor.
diff --git a/runtime/lib/math.cc b/runtime/lib/math.cc
index 8e5e750..0199782 100644
--- a/runtime/lib/math.cc
+++ b/runtime/lib/math.cc
@@ -79,7 +79,7 @@
static RawTypedData* GetRandomStateArray(const Instance& receiver) {
const Class& random_class = Class::Handle(receiver.clazz());
const Field& state_field =
- Field::Handle(random_class.LookupField(Symbols::_state()));
+ Field::Handle(random_class.LookupFieldAllowPrivate(Symbols::_state()));
ASSERT(!state_field.IsNull());
const Instance& state_field_value =
Instance::Cast(Object::Handle(receiver.GetField(state_field)));
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 5127dce..40efc28 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -717,7 +717,8 @@
const String& getter_name,
const bool throw_nsm_if_absent) {
// Note static fields do not have implicit getters.
- const Field& field = Field::Handle(klass.LookupStaticField(getter_name));
+ const Field& field =
+ Field::Handle(klass.LookupStaticField(getter_name));
if (field.IsNull() || field.IsUninitialized()) {
const String& internal_getter_name = String::Handle(
Field::GetterName(getter_name));
@@ -1299,26 +1300,26 @@
GET_NON_NULL_NATIVE_ARGUMENT(Array, arg_names, arguments->NativeArgAt(4));
Class& klass = Class::Handle(reflectee.clazz());
- Function& function = Function::Handle(
- Resolver::ResolveDynamicAnyArgs(klass, function_name));
+ Function& function = Function::Handle(zone,
+ Resolver::ResolveDynamicAnyArgs(zone, klass, function_name));
const Array& args_descriptor =
- Array::Handle(ArgumentsDescriptor::New(args.Length(), arg_names));
+ Array::Handle(zone, ArgumentsDescriptor::New(args.Length(), arg_names));
if (function.IsNull()) {
// Didn't find a method: try to find a getter and invoke call on its result.
const String& getter_name =
- String::Handle(Field::GetterName(function_name));
- function = Resolver::ResolveDynamicAnyArgs(klass, getter_name);
+ String::Handle(zone, Field::GetterName(function_name));
+ function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name);
if (!function.IsNull()) {
ASSERT(function.kind() != RawFunction::kMethodExtractor);
// Invoke the getter.
const int kNumArgs = 1;
- const Array& getter_args = Array::Handle(Array::New(kNumArgs));
+ const Array& getter_args = Array::Handle(zone, Array::New(kNumArgs));
getter_args.SetAt(0, reflectee);
const Array& getter_args_descriptor =
- Array::Handle(ArgumentsDescriptor::New(getter_args.Length()));
- const Instance& getter_result = Instance::Handle(
+ Array::Handle(zone, ArgumentsDescriptor::New(getter_args.Length()));
+ const Instance& getter_result = Instance::Handle(zone,
InvokeDynamicFunction(reflectee,
function,
getter_name,
@@ -1328,7 +1329,7 @@
args.SetAt(0, getter_result);
// Call the closure.
const Object& call_result =
- Object::Handle(DartEntry::InvokeClosure(args, args_descriptor));
+ Object::Handle(zone, DartEntry::InvokeClosure(args, args_descriptor));
if (call_result.IsError()) {
Exceptions::PropagateError(Error::Cast(call_result));
UNREACHABLE();
@@ -1356,24 +1357,24 @@
const String& internal_getter_name = String::Handle(
Field::GetterName(getter_name));
- Function& function = Function::Handle(
- Resolver::ResolveDynamicAnyArgs(klass, internal_getter_name));
+ Function& function = Function::Handle(zone,
+ Resolver::ResolveDynamicAnyArgs(zone, klass, internal_getter_name));
// Check for method extraction when method extractors are not created.
if (function.IsNull() && !FLAG_lazy_dispatchers) {
- function = Resolver::ResolveDynamicAnyArgs(klass, getter_name);
+ function = Resolver::ResolveDynamicAnyArgs(zone, klass, getter_name);
if (!function.IsNull()) {
const Function& closure_function =
- Function::Handle(function.ImplicitClosureFunction());
+ Function::Handle(zone, function.ImplicitClosureFunction());
return closure_function.ImplicitInstanceClosure(reflectee);
}
}
const int kNumArgs = 1;
- const Array& args = Array::Handle(Array::New(kNumArgs));
+ const Array& args = Array::Handle(zone, Array::New(kNumArgs));
args.SetAt(0, reflectee);
const Array& args_descriptor =
- Array::Handle(ArgumentsDescriptor::New(args.Length()));
+ Array::Handle(zone, ArgumentsDescriptor::New(args.Length()));
// InvokeDynamic invokes NoSuchMethod if the provided function is null.
return InvokeDynamicFunction(reflectee,
@@ -1392,18 +1393,18 @@
GET_NON_NULL_NATIVE_ARGUMENT(String, setter_name, arguments->NativeArgAt(2));
GET_NATIVE_ARGUMENT(Instance, value, arguments->NativeArgAt(3));
- const Class& klass = Class::Handle(reflectee.clazz());
+ const Class& klass = Class::Handle(zone, reflectee.clazz());
const String& internal_setter_name =
- String::Handle(Field::SetterName(setter_name));
- const Function& setter = Function::Handle(
- Resolver::ResolveDynamicAnyArgs(klass, internal_setter_name));
+ String::Handle(zone, Field::SetterName(setter_name));
+ const Function& setter = Function::Handle(zone,
+ Resolver::ResolveDynamicAnyArgs(zone, klass, internal_setter_name));
const int kNumArgs = 2;
- const Array& args = Array::Handle(Array::New(kNumArgs));
+ const Array& args = Array::Handle(zone, Array::New(kNumArgs));
args.SetAt(0, reflectee);
args.SetAt(1, value);
const Array& args_descriptor =
- Array::Handle(ArgumentsDescriptor::New(args.Length()));
+ Array::Handle(zone, ArgumentsDescriptor::New(args.Length()));
return InvokeDynamicFunction(reflectee,
setter,
@@ -1569,7 +1570,8 @@
}
// Check for real fields and user-defined setters.
- const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
+ const Field& field =
+ Field::Handle(klass.LookupStaticField(setter_name));
Function& setter = Function::Handle();
const String& internal_setter_name = String::Handle(
Field::SetterName(setter_name));
diff --git a/runtime/lib/num.cc b/runtime/lib/num.cc
deleted file mode 100644
index 8004c8c..0000000
--- a/runtime/lib/num.cc
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/bootstrap_natives.h"
-
-#include "vm/native_entry.h"
-#include "vm/object.h"
-
-namespace dart {
-
-DEFINE_NATIVE_ENTRY(Num_toString, 1) {
- const Number& number = Number::CheckedHandle(arguments->NativeArgAt(0));
- Heap::Space space = isolate->heap()->ShouldPretenure(kOneByteStringCid) ?
- Heap::kPretenured : Heap::kNew;
- return number.ToString(space);
-}
-
-} // namespace dart
diff --git a/runtime/lib/num.dart b/runtime/lib/num.dart
deleted file mode 100644
index 7d67213..0000000
--- a/runtime/lib/num.dart
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-abstract class _Num implements num {
-
- /* patch */ String toString() native "Num_toString";
-
-}
diff --git a/runtime/lib/regexp.cc b/runtime/lib/regexp.cc
index 9e9bcea..921a101 100644
--- a/runtime/lib/regexp.cc
+++ b/runtime/lib/regexp.cc
@@ -36,7 +36,7 @@
}
// Create a RegExp object containing only the initial parameters.
- return RegExpEngine::CreateRegExp(zone,
+ return RegExpEngine::CreateRegExp(thread,
pattern,
multi_line,
ignore_case);
diff --git a/runtime/lib/string.cc b/runtime/lib/string.cc
index 2821146..9313ce1 100644
--- a/runtime/lib/string.cc
+++ b/runtime/lib/string.cc
@@ -22,7 +22,7 @@
const String& env_value =
String::Handle(Api::GetEnvironmentValue(thread, name));
if (!env_value.IsNull()) {
- return Symbols::New(env_value);
+ return Symbols::New(thread, env_value);
}
return default_value.raw();
}
@@ -524,7 +524,7 @@
const String& receiver = String::CheckedHandle(arguments->NativeArgAt(0));
GET_NON_NULL_NATIVE_ARGUMENT(Integer, index, arguments->NativeArgAt(1));
uint16_t value = StringValueAt(receiver, index);
- return Symbols::FromCharCode(static_cast<int32_t>(value));
+ return Symbols::FromCharCode(thread, static_cast<int32_t>(value));
}
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index cdb94be..f7aa83c 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -47,7 +47,7 @@
* [_StringBase] contains common methods used by concrete String
* implementations, e.g., _OneByteString.
*/
-class _StringBase {
+abstract class _StringBase {
// Constants used by replaceAll encoding of string slices between matches.
// A string slice (start+length) is encoded in a single Smi to save memory
// overhead in the common case.
diff --git a/runtime/observatory/tests/service/call_site_data_test.dart b/runtime/observatory/tests/service/call_site_data_test.dart
deleted file mode 100644
index 486ce06..0000000
--- a/runtime/observatory/tests/service/call_site_data_test.dart
+++ /dev/null
@@ -1,189 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization_filter=doesNotExist
-// ^Force code to be unoptimized so the invocation counts are accurate.
-
-library call_site_data_test;
-
-import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
-import 'test_helper.dart';
-
-class A { foo() => 'A'; }
-class B { foo() => 'B'; }
-class C { foo() => 'C'; }
-class D { foo() => 'D'; }
-class E { foo() => 'E'; }
-class F { foo() => 'F'; }
-class G { foo() => 'G'; }
-class H { foo() => 'H'; }
-
-monomorphic(fooable) {
- fooable.foo();
- return null;
-}
-polymorphic(fooable) {
- fooable.foo();
- return null;
-}
-megamorphic(fooable) {
- fooable.foo();
- return null;
-}
-
-class Static {
- static staticMethod() => 2;
-}
-staticCall() {
- Static.staticMethod();
- return null;
-}
-constructorCall() {
- new Static();
- return null;
-}
-topLevelMethod() => "TOP";
-topLevelCall() {
- topLevelMethod();
- return null;
-}
-
-class Super { bar() => "Super"; }
-class Sub extends Super { bar() => super.bar(); }
-
-script() {
- for (int i = 0; i < 10; i++) monomorphic(new A());
-
- for (int i = 0; i < 10; i++) polymorphic(new A());
- for (int i = 0; i < 20; i++) polymorphic(new B());
- for (int i = 0; i < 30; i++) polymorphic(new C());
-
- for (int i = 0; i < 10; i++) megamorphic(new A());
- for (int i = 0; i < 20; i++) megamorphic(new B());
- for (int i = 0; i < 30; i++) megamorphic(new C());
- for (int i = 0; i < 40; i++) megamorphic(new D());
- for (int i = 0; i < 50; i++) megamorphic(new E());
- for (int i = 0; i < 60; i++) megamorphic(new F());
- for (int i = 0; i < 70; i++) megamorphic(new G());
- for (int i = 0; i < 80; i++) megamorphic(new H());
-
- for (int i = 0; i < 10; i++) staticCall();
-
- for (int i = 0; i < 10; i++) constructorCall();
-
- for (int i = 0; i < 10; i++) topLevelCall();
-
- for (int i = 0; i < 15; i++) new Sub().bar();
-}
-
-
-Set<String> stringifyCacheEntries(Map callSite) {
- return callSite['cacheEntries'].map((entry) {
- return "${entry['receiverContainer']['name']}:${entry['count']}";
- }).toSet();
-}
-
-
-testMonomorphic(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- ServiceFunction func =
- lib.functions.singleWhere((f) => f.name == 'monomorphic');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('foo'));
- expect(stringifyCacheEntries(callSite),
- equals(['A:10'].toSet()));
-}
-
-testPolymorphic(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- ServiceFunction func =
- lib.functions.singleWhere((f) => f.name == 'polymorphic');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('foo'));
- expect(stringifyCacheEntries(callSite),
- equals(['A:10', 'B:20', 'C:30'].toSet()));
-}
-
-testMegamorphic(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- ServiceFunction func =
- lib.functions.singleWhere((f) => f.name == 'megamorphic');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('foo'));
- expect(stringifyCacheEntries(callSite),
- equals(['A:10', 'B:20', 'C:30', 'D:40',
- 'E:50', 'F:60', 'G:70', 'H:80'].toSet()));
-}
-
-testStaticCall(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- ServiceFunction func =
- lib.functions.singleWhere((f) => f.name == 'staticCall');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('staticMethod'));
- expect(stringifyCacheEntries(callSite),
- equals(['Static:10'].toSet()));
-}
-
-testConstructorCall(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- ServiceFunction func =
- lib.functions.singleWhere((f) => f.name == 'constructorCall');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('Static.'));
- expect(stringifyCacheEntries(callSite),
- equals(['Static:10'].toSet()));
-}
-
-testTopLevelCall(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- ServiceFunction func =
- lib.functions.singleWhere((f) => f.name == 'topLevelCall');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('topLevelMethod'));
- expect(stringifyCacheEntries(callSite),
- equals(['call_site_data_test:10'].toSet()));
-}
-
-testSuperCall(Isolate isolate) async {
- Library lib = await isolate.rootLibrary.load();
- Class cls = await lib.classes.singleWhere((f) => f.name == 'Sub').load();
- ServiceFunction func = cls.functions.singleWhere((f) => f.name == 'bar');
- Map response = await isolate.invokeRpcNoUpgrade('_getCallSiteData',
- { 'targetId': func.id });
- expect(response['type'], equals('CodeCoverage'));
- Map callSite = response['coverage'].single['callSites'].single;
- expect(callSite['name'], equals('bar'));
- expect(stringifyCacheEntries(callSite),
- equals(['Super:15'].toSet()));
-}
-
-var tests = [
- testMonomorphic,
- testPolymorphic,
- testMegamorphic,
- testStaticCall,
- testConstructorCall,
- testTopLevelCall,
- testSuperCall ];
-
-main(args) => runIsolateTests(args, tests, testeeBefore: script);
diff --git a/runtime/observatory/tests/service/coverage_test.dart b/runtime/observatory/tests/service/coverage_test.dart
deleted file mode 100644
index 1266500..0000000
--- a/runtime/observatory/tests/service/coverage_test.dart
+++ /dev/null
@@ -1,138 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-// VMOptions=--error_on_bad_type --error_on_bad_override
-
-import 'package:observatory/service_io.dart';
-import 'package:unittest/unittest.dart';
-import 'test_helper.dart';
-import 'service_test_common.dart';
-import 'dart:developer';
-
-const int LINE_A = 20;
-const int LINE_B = 38;
-const int LINE_C = 136;
-
-int globalVar = 100;
-
-class MyClass {
- static void myFunction(int value) {
- if (value < 0) { // Line A.
- print("negative");
- } else {
- print("positive");
- }
- debugger();
- }
-
- static void otherFunction(int value) {
- if (value < 0) {
- print("otherFunction <");
- } else {
- print("otherFunction >=");
- }
- }
-}
-
-void testFunction() {
- MyClass.otherFunction(-100); // Line B.
- MyClass.myFunction(10000);
-}
-
-var tests = [
-
-hasStoppedAtBreakpoint,
-
-// Get coverage for function, class, library, script, and isolate.
-(Isolate isolate) async {
- var stack = await isolate.getStack();
-
- // Make sure we are in the right place.
- expect(stack.type, equals('Stack'));
- expect(stack['frames'].length, greaterThanOrEqualTo(2));
- expect(stack['frames'][0].function.name, equals('myFunction'));
- expect(stack['frames'][0].function.dartOwner.name, equals('MyClass'));
-
- var lib = isolate.rootLibrary;
- var func = stack['frames'][0].function;
- expect(func.name, equals('myFunction'));
- var cls = func.dartOwner;
- expect(cls.name, equals('MyClass'));
-
- // Function
- var coverage = await isolate.invokeRpcNoUpgrade('_getCoverage',
- { 'targetId': func.id });
- expect(coverage['type'], equals('CodeCoverage'));
- expect(coverage['coverage'].length, equals(1));
- expect(coverage['coverage'][0]['hits'],
- equals([LINE_A, 1,
- LINE_A + 1, 0,
- LINE_A + 3, 1,
- LINE_A + 5, 1]));
-
- // Class
- coverage = await isolate.invokeRpcNoUpgrade('_getCoverage',
- { 'targetId': cls.id });
- expect(coverage['type'], equals('CodeCoverage'));
- expect(coverage['coverage'].length, equals(1));
- expect(coverage['coverage'][0]['hits'],
- equals([LINE_A, 1,
- LINE_A + 1, 0,
- LINE_A + 3, 1,
- LINE_A + 5, 1,
- LINE_A + 9, 1,
- LINE_A + 10, 1,
- LINE_A + 12, 0,
- LINE_A - 2, 0]));
-
- // Library
- coverage = await isolate.invokeRpcNoUpgrade('_getCoverage',
- { 'targetId': lib.id });
- expect(coverage['type'], equals('CodeCoverage'));
- expect(coverage['coverage'].length, equals(4));
- expect(coverage['coverage'][0]['hits'],
- equals([LINE_A, 1,
- LINE_A + 1, 0,
- LINE_A + 3, 1,
- LINE_A + 5, 1,
- LINE_A + 9, 1,
- LINE_A + 10, 1,
- LINE_A + 12, 0,
- LINE_A - 2, 0]));
- expect(coverage['coverage'][1]['hits'],
- equals([LINE_B, 1,
- LINE_B + 1, 1,
- LINE_C, 2]));
-
- // Script
- await cls.load();
- coverage = await isolate.invokeRpcNoUpgrade('_getCoverage',
- { 'targetId': cls.location.script.id });
- expect(coverage['type'], equals('CodeCoverage'));
- expect(coverage['coverage'].length, equals(4));
- expect(coverage['coverage'][0]['hits'],
- equals([LINE_A, 1,
- LINE_A + 1, 0,
- LINE_A + 3, 1,
- LINE_A + 5, 1,
- LINE_A + 9, 1,
- LINE_A + 10, 1,
- LINE_A + 12, 0,
- LINE_A - 2, 0]));
- expect(coverage['coverage'][1]['hits'],
- equals([LINE_B, 1,
- LINE_B + 1, 1,
- LINE_C, 2]));
-
- // Isolate
- coverage = await isolate.invokeRpcNoUpgrade('_getCoverage', {});
- print('Done processing _getCoverage for full isolate');
- expect(coverage['type'], equals('CodeCoverage'));
- expect(coverage['coverage'].length, greaterThan(100));
-},
-
-];
-
-main(args) => runIsolateTests(args, tests, // Line C.
- testeeConcurrent: testFunction,
- trace_service: true);
diff --git a/runtime/observatory/tests/service/get_version_rpc_test.dart b/runtime/observatory/tests/service/get_version_rpc_test.dart
index d4c4913..5bae881 100644
--- a/runtime/observatory/tests/service/get_version_rpc_test.dart
+++ b/runtime/observatory/tests/service/get_version_rpc_test.dart
@@ -13,7 +13,7 @@
var result = await vm.invokeRpcNoUpgrade('getVersion', {});
expect(result['type'], equals('Version'));
expect(result['major'], equals(3));
- expect(result['minor'], equals(3));
+ expect(result['minor'], equals(4));
expect(result['_privateMajor'], equals(0));
expect(result['_privateMinor'], equals(0));
},
diff --git a/runtime/platform/globals.h b/runtime/platform/globals.h
index 82f5719..7e11bb3 100644
--- a/runtime/platform/globals.h
+++ b/runtime/platform/globals.h
@@ -650,6 +650,14 @@
#define STDERR_FILENO 2
#endif
+// For checking deterministic graph generation, we can store instruction
+// tag in the ICData and check it when recreating the flow graph in
+// optimizing compiler. Enable it for other modes (product, release) if needed
+// for debugging.
+#if defined(DEBUG)
+#define TAG_IC_DATA
+#endif
+
} // namespace dart
#endif // PLATFORM_GLOBALS_H_
diff --git a/runtime/vm/aot_optimizer.cc b/runtime/vm/aot_optimizer.cc
index c39f74c..7d005b1 100644
--- a/runtime/vm/aot_optimizer.cc
+++ b/runtime/vm/aot_optimizer.cc
@@ -29,6 +29,10 @@
namespace dart {
+DEFINE_FLAG(int, max_exhaustive_polymorphic_checks, 5,
+ "If a call receiver is known to be of at most this many classes, "
+ "generate exhaustive class tests instead of a megamorphic call");
+
// Quick access to the current isolate and zone.
#define I (isolate())
#define Z (zone())
@@ -281,11 +285,11 @@
return;
}
- const bool with_checks = false;
PolymorphicInstanceCallInstr* specialized =
new(Z) PolymorphicInstanceCallInstr(call->instance_call(),
ic_data,
- with_checks);
+ /* with_checks = */ false,
+ /* complete = */ false);
call->ReplaceWith(specialized, current_iterator());
}
@@ -2441,7 +2445,8 @@
instr, function_kind)) {
PolymorphicInstanceCallInstr* call =
new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
- /* with_checks = */ false);
+ /* with_checks = */ false,
+ /* complete = */ true);
instr->ReplaceWith(call, current_iterator());
return;
}
@@ -2514,13 +2519,71 @@
ic_data.AddReceiverCheck(receiver_class.id(), function);
PolymorphicInstanceCallInstr* call =
new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
- /* with_checks = */ false);
+ /* with_checks = */ false,
+ /* complete = */ true);
instr->ReplaceWith(call, current_iterator());
return;
}
}
}
+ Definition* callee_receiver = instr->ArgumentAt(0);
+ const Function& function = flow_graph_->function();
+ if (function.IsDynamicFunction() &&
+ flow_graph_->IsReceiver(callee_receiver)) {
+ // Call receiver is method receiver.
+ Class& receiver_class = Class::Handle(Z, function.Owner());
+ GrowableArray<intptr_t> class_ids(6);
+ if (thread()->cha()->ConcreteSubclasses(receiver_class, &class_ids)) {
+ if (class_ids.length() <= FLAG_max_exhaustive_polymorphic_checks) {
+ if (FLAG_trace_cha) {
+ THR_Print(" **(CHA) Only %" Pd " concrete subclasses of %s for %s\n",
+ class_ids.length(),
+ receiver_class.ToCString(),
+ instr->function_name().ToCString());
+ }
+
+ const Array& args_desc_array = Array::Handle(Z,
+ ArgumentsDescriptor::New(instr->ArgumentCount(),
+ instr->argument_names()));
+ ArgumentsDescriptor args_desc(args_desc_array);
+
+ const ICData& ic_data = ICData::Handle(
+ ICData::New(function,
+ instr->function_name(),
+ args_desc_array,
+ Thread::kNoDeoptId,
+ /* args_tested = */ 1));
+
+ Function& target = Function::Handle(Z);
+ Class& cls = Class::Handle(Z);
+ bool includes_dispatcher_case = false;
+ for (intptr_t i = 0; i < class_ids.length(); i++) {
+ intptr_t cid = class_ids[i];
+ cls = isolate()->class_table()->At(cid);
+ target = Resolver::ResolveDynamicForReceiverClass(
+ cls,
+ instr->function_name(),
+ args_desc);
+ if (target.IsNull()) {
+ // noSuchMethod, call through getter or closurization
+ includes_dispatcher_case = true;
+ } else {
+ ic_data.AddReceiverCheck(cid, target);
+ }
+ }
+ if (!includes_dispatcher_case && (ic_data.NumberOfChecks() > 0)) {
+ PolymorphicInstanceCallInstr* call =
+ new(Z) PolymorphicInstanceCallInstr(instr, ic_data,
+ /* with_checks = */ true,
+ /* complete = */ true);
+ instr->ReplaceWith(call, current_iterator());
+ return;
+ }
+ }
+ }
+ }
+
// More than one targets. Generate generic polymorphic call without
// deoptimization.
if (instr->ic_data()->NumberOfUsedChecks() > 0) {
@@ -2529,7 +2592,8 @@
// deoptimization is allowed.
PolymorphicInstanceCallInstr* call =
new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
- /* with_checks = */ true);
+ /* with_checks = */ true,
+ /* complete = */ false);
instr->ReplaceWith(call, current_iterator());
return;
}
diff --git a/runtime/vm/ast.cc b/runtime/vm/ast.cc
index 7d7f3f4..8ac98c2 100644
--- a/runtime/vm/ast.cc
+++ b/runtime/vm/ast.cc
@@ -104,13 +104,15 @@
LocalVariable* LetNode::AddInitializer(AstNode* node) {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
initializers_.Add(node);
char name[64];
OS::SNPrint(name, sizeof(name), ":lt%s_%" Pd "",
token_pos().ToCString(), vars_.length());
LocalVariable* temp_var =
new LocalVariable(token_pos(),
- String::ZoneHandle(Symbols::New(name)),
+ String::ZoneHandle(zone, Symbols::New(thread, name)),
Object::dynamic_type());
vars_.Add(temp_var);
return temp_var;
@@ -635,7 +637,7 @@
String::ZoneHandle(zone, Field::LookupSetterSymbol(field_name_));
Function& setter = Function::ZoneHandle(zone);
if (!setter_name.IsNull()) {
- setter = Resolver::ResolveDynamicAnyArgs(cls(), setter_name);
+ setter = Resolver::ResolveDynamicAnyArgs(zone, cls(), setter_name);
}
if (setter.IsNull() || setter.is_abstract()) {
// No instance setter found in super class chain,
diff --git a/runtime/vm/ast_printer_test.cc b/runtime/vm/ast_printer_test.cc
index 588d702..5b774e8 100644
--- a/runtime/vm/ast_printer_test.cc
+++ b/runtime/vm/ast_printer_test.cc
@@ -18,7 +18,7 @@
const TokenPosition kPos = TokenPosition::kNoSource;
LocalVariable* v =
new LocalVariable(kPos,
- String::ZoneHandle(Symbols::New("wurscht")),
+ String::ZoneHandle(Symbols::New(thread, "wurscht")),
Type::ZoneHandle(Type::DynamicType()));
v->set_index(5);
LoadLocalNode* ll = new LoadLocalNode(kPos, v);
diff --git a/runtime/vm/ast_test.cc b/runtime/vm/ast_test.cc
index 88096e9..90513c2 100644
--- a/runtime/vm/ast_test.cc
+++ b/runtime/vm/ast_test.cc
@@ -13,9 +13,10 @@
namespace dart {
TEST_CASE(Ast) {
- LocalVariable* v = new LocalVariable(TokenPosition::kNoSource,
- String::ZoneHandle(Symbols::New("v")),
- Type::ZoneHandle(Type::DynamicType()));
+ LocalVariable* v = new LocalVariable(
+ TokenPosition::kNoSource,
+ String::ZoneHandle(Symbols::New(thread, "v")),
+ Type::ZoneHandle(Type::DynamicType()));
AstNode* ll = new LoadLocalNode(TokenPosition::kNoSource, v);
EXPECT(ll->IsLoadLocalNode());
EXPECT(!ll->IsLiteralNode());
@@ -24,9 +25,10 @@
v->set_index(1);
EXPECT_EQ(1, v->index());
- LocalVariable* p = new LocalVariable(TokenPosition::kNoSource,
- String::ZoneHandle(Symbols::New("p")),
- Type::ZoneHandle(Type::DynamicType()));
+ LocalVariable* p = new LocalVariable(
+ TokenPosition::kNoSource,
+ String::ZoneHandle(Symbols::New(thread, "p")),
+ Type::ZoneHandle(Type::DynamicType()));
EXPECT(!p->HasIndex());
p->set_index(-1);
EXPECT(p->HasIndex());
diff --git a/runtime/vm/ast_transformer.cc b/runtime/vm/ast_transformer.cc
index 4b05867..a81babb 100644
--- a/runtime/vm/ast_transformer.cc
+++ b/runtime/vm/ast_transformer.cc
@@ -10,6 +10,9 @@
namespace dart {
+// Quick access to the current thread.
+#define T (thread())
+
// Quick access to the current zone.
#define Z (thread()->zone())
@@ -66,14 +69,14 @@
LocalVariable* AwaitTransformer::EnsureCurrentTempVar() {
String& symbol =
- String::ZoneHandle(Z, Symbols::NewFormatted("%d", temp_cnt_));
- symbol = Symbols::FromConcat(Symbols::AwaitTempVarPrefix(), symbol);
+ String::ZoneHandle(Z, Symbols::NewFormatted(T, "%d", temp_cnt_));
+ symbol = Symbols::FromConcat(T, Symbols::AwaitTempVarPrefix(), symbol);
ASSERT(!symbol.IsNull());
// Look up the variable in the scope used for async temp variables.
LocalVariable* await_tmp = async_temp_scope_->LocalLookupVariable(symbol);
if (await_tmp == NULL) {
// We need a new temp variable; add it to the function's top scope.
- await_tmp = new (Z) LocalVariable(
+ await_tmp = new(Z) LocalVariable(
TokenPosition::kNoSource, symbol, Object::dynamic_type());
async_temp_scope_->AddVariable(await_tmp);
// After adding it to the top scope, we can look it up from the preamble.
@@ -92,7 +95,7 @@
}
-LocalVariable* AwaitTransformer::AddToPreambleNewTempVar(
+LocalVariable* AwaitTransformer::AddNewTempVarToPreamble(
AstNode* node,
TokenPosition token_pos) {
LocalVariable* tmp_var = EnsureCurrentTempVar();
@@ -103,6 +106,12 @@
}
+LoadLocalNode* AwaitTransformer::MakeName(AstNode* node) {
+ LocalVariable* temp = AddNewTempVarToPreamble(node, ST(node->token_pos()));
+ return new(Z) LoadLocalNode(ST(node->token_pos()), temp);
+}
+
+
void AwaitTransformer::VisitLiteralNode(LiteralNode* node) {
result_ = node;
}
@@ -140,11 +149,11 @@
preamble_->scope(), Symbols::AsyncOperationStackTraceParam());
AstNode* transformed_expr = Transform(node->expr());
- LocalVariable* await_temp = AddToPreambleNewTempVar(transformed_expr,
+ LocalVariable* await_temp = AddNewTempVarToPreamble(transformed_expr,
ST(node->token_pos()));
AwaitMarkerNode* await_marker =
- new (Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos);
+ new(Z) AwaitMarkerNode(async_temp_scope_, node->scope(), token_pos);
preamble_->Add(await_marker);
// :result_param = _awaitHelper(
@@ -154,14 +163,14 @@
Z, async_lib.LookupFunctionAllowPrivate(Symbols::AsyncAwaitHelper()));
ASSERT(!async_await_helper.IsNull());
ArgumentListNode* async_await_helper_args =
- new (Z) ArgumentListNode(token_pos);
+ new(Z) ArgumentListNode(token_pos);
async_await_helper_args->Add(
new(Z) LoadLocalNode(token_pos, await_temp));
async_await_helper_args->Add(
new(Z) LoadLocalNode(token_pos, async_then_callback));
async_await_helper_args->Add(
new(Z) LoadLocalNode(token_pos, async_catch_error_callback));
- StaticCallNode* await_helper_call = new (Z) StaticCallNode(
+ StaticCallNode* await_helper_call = new(Z) StaticCallNode(
node->token_pos(),
async_await_helper,
async_await_helper_args);
@@ -177,17 +186,17 @@
// restoring the saved try context that lives on the stack and possibly the
// saved try context of the outer try block.
if (node->saved_try_ctx() != NULL) {
- preamble_->Add(new (Z) StoreLocalNode(
+ preamble_->Add(new(Z) StoreLocalNode(
token_pos,
node->saved_try_ctx(),
- new (Z) LoadLocalNode(token_pos,
- node->async_saved_try_ctx())));
+ new(Z) LoadLocalNode(token_pos,
+ node->async_saved_try_ctx())));
if (node->outer_saved_try_ctx() != NULL) {
- preamble_->Add(new (Z) StoreLocalNode(
+ preamble_->Add(new(Z) StoreLocalNode(
token_pos,
node->outer_saved_try_ctx(),
- new (Z) LoadLocalNode(token_pos,
- node->outer_async_saved_try_ctx())));
+ new(Z) LoadLocalNode(token_pos,
+ node->outer_async_saved_try_ctx())));
}
} else {
ASSERT(node->outer_saved_try_ctx() == NULL);
@@ -195,31 +204,31 @@
// Load the async_op variable. It is unused, but the observatory uses it
// to determine if a breakpoint is inside an asynchronous function.
- LoadLocalNode* load_async_op = new (Z) LoadLocalNode(token_pos, async_op);
+ LoadLocalNode* load_async_op = new(Z) LoadLocalNode(token_pos, async_op);
preamble_->Add(load_async_op);
- LoadLocalNode* load_error_param = new (Z) LoadLocalNode(
+ LoadLocalNode* load_error_param = new(Z) LoadLocalNode(
token_pos, error_param);
- LoadLocalNode* load_stack_trace_param = new (Z) LoadLocalNode(
+ LoadLocalNode* load_stack_trace_param = new(Z) LoadLocalNode(
token_pos, stack_trace_param);
- SequenceNode* error_ne_null_branch = new (Z) SequenceNode(
+ SequenceNode* error_ne_null_branch = new(Z) SequenceNode(
token_pos, ChainNewScope(preamble_->scope()));
- error_ne_null_branch->Add(new (Z) ThrowNode(
+ error_ne_null_branch->Add(new(Z) ThrowNode(
token_pos,
load_error_param,
load_stack_trace_param));
- preamble_->Add(new (Z) IfNode(
+ preamble_->Add(new(Z) IfNode(
token_pos,
- new (Z) ComparisonNode(
+ new(Z) ComparisonNode(
token_pos,
Token::kNE,
load_error_param,
- new (Z) LiteralNode(token_pos,
+ new(Z) LiteralNode(token_pos,
Object::null_instance())),
error_ne_null_branch,
NULL));
- LocalVariable* result = AddToPreambleNewTempVar(new(Z) LoadLocalNode(
+ LocalVariable* result = AddNewTempVarToPreamble(new(Z) LoadLocalNode(
token_pos, result_param), ST(node->token_pos()));
result_ = new(Z) LoadLocalNode(token_pos, result);
}
@@ -247,7 +256,7 @@
AstNode* result = NULL;
const Token::Kind compare_logical_op = (logical_op == Token::kAND) ?
Token::kEQ : Token::kNE;
- SequenceNode* eval = new (Z) SequenceNode(
+ SequenceNode* eval = new(Z) SequenceNode(
ST(new_left->token_pos()), ChainNewScope(preamble_->scope()));
SequenceNode* saved_preamble = preamble_;
preamble_ = eval;
@@ -268,7 +277,7 @@
LocalScope* AwaitTransformer::ChainNewScope(LocalScope* parent) {
- return new (Z) LocalScope(
+ return new(Z) LocalScope(
parent, parent->function_level(), parent->loop_level());
}
@@ -282,12 +291,10 @@
} else {
new_right = Transform(node->right());
}
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) BinaryOpNode(node->token_pos(),
- node->kind(),
- new_left,
- new_right), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) BinaryOpNode(node->token_pos(),
+ node->kind(),
+ new_left,
+ new_right));
}
@@ -296,34 +303,29 @@
ASSERT((node->kind() != Token::kAND) && (node->kind() != Token::kOR));
AstNode* new_left = Transform(node->left());
AstNode* new_right = Transform(node->right());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) BinaryOpWithMask32Node(node->token_pos(),
- node->kind(),
- new_left,
- new_right,
- node->mask32()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) BinaryOpWithMask32Node(node->token_pos(),
+ node->kind(),
+ new_left,
+ new_right,
+ node->mask32()));
}
void AwaitTransformer::VisitComparisonNode(ComparisonNode* node) {
AstNode* new_left = Transform(node->left());
AstNode* new_right = Transform(node->right());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) ComparisonNode(node->token_pos(),
- node->kind(),
- new_left,
- new_right), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) ComparisonNode(node->token_pos(),
+ node->kind(),
+ new_left,
+ new_right));
}
void AwaitTransformer::VisitUnaryOpNode(UnaryOpNode* node) {
AstNode* new_operand = Transform(node->operand());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) UnaryOpNode(node->token_pos(), node->kind(), new_operand),
- ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) UnaryOpNode(node->token_pos(),
+ node->kind(),
+ new_operand));
}
@@ -331,12 +333,12 @@
//
void AwaitTransformer::VisitConditionalExprNode(ConditionalExprNode* node) {
AstNode* new_condition = Transform(node->condition());
- SequenceNode* new_true = new (Z) SequenceNode(
+ SequenceNode* new_true = new(Z) SequenceNode(
ST(node->true_expr()->token_pos()), ChainNewScope(preamble_->scope()));
SequenceNode* saved_preamble = preamble_;
preamble_ = new_true;
AstNode* new_true_result = Transform(node->true_expr());
- SequenceNode* new_false = new (Z) SequenceNode(
+ SequenceNode* new_false = new(Z) SequenceNode(
ST(node->false_expr()->token_pos()), ChainNewScope(preamble_->scope()));
preamble_ = new_false;
AstNode* new_false_result = Transform(node->false_expr());
@@ -346,12 +348,10 @@
new_true,
new_false);
preamble_->Add(new_if);
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) ConditionalExprNode(ST(node->token_pos()),
- new_condition,
- new_true_result,
- new_false_result), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) ConditionalExprNode(ST(node->token_pos()),
+ new_condition,
+ new_true_result,
+ new_false_result));
}
@@ -376,10 +376,8 @@
void AwaitTransformer::VisitStringInterpolateNode(StringInterpolateNode* node) {
ArrayNode* new_value = Transform(node->value())->AsArrayNode();
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) StringInterpolateNode(node->token_pos(),
- new_value), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) StringInterpolateNode(node->token_pos(),
+ new_value));
}
@@ -388,12 +386,10 @@
if (new_receiver != NULL) {
new_receiver = Transform(new_receiver);
}
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) ClosureNode(node->token_pos(),
- node->function(),
- new_receiver,
- node->scope()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) ClosureNode(node->token_pos(),
+ node->function(),
+ new_receiver,
+ node->scope()));
}
@@ -401,47 +397,39 @@
AstNode* new_receiver = Transform(node->receiver());
ArgumentListNode* new_args =
Transform(node->arguments())->AsArgumentListNode();
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) InstanceCallNode(node->token_pos(),
- new_receiver,
- node->function_name(),
- new_args,
- node->is_conditional()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) InstanceCallNode(node->token_pos(),
+ new_receiver,
+ node->function_name(),
+ new_args,
+ node->is_conditional()));
}
void AwaitTransformer::VisitStaticCallNode(StaticCallNode* node) {
ArgumentListNode* new_args =
Transform(node->arguments())->AsArgumentListNode();
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) StaticCallNode(node->token_pos(),
- node->function(),
- new_args), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) StaticCallNode(node->token_pos(),
+ node->function(),
+ new_args));
}
void AwaitTransformer::VisitConstructorCallNode(ConstructorCallNode* node) {
ArgumentListNode* new_args =
Transform(node->arguments())->AsArgumentListNode();
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) ConstructorCallNode(node->token_pos(),
- node->type_arguments(),
- node->constructor(),
- new_args), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) ConstructorCallNode(node->token_pos(),
+ node->type_arguments(),
+ node->constructor(),
+ new_args));
}
void AwaitTransformer::VisitInstanceGetterNode(InstanceGetterNode* node) {
AstNode* new_receiver = Transform(node->receiver());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) InstanceGetterNode(node->token_pos(),
- new_receiver,
- node->field_name(),
- node->is_conditional()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) InstanceGetterNode(node->token_pos(),
+ new_receiver,
+ node->field_name(),
+ node->is_conditional()));
}
@@ -451,13 +439,11 @@
new_receiver = Transform(new_receiver);
}
AstNode* new_value = Transform(node->value());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) InstanceSetterNode(node->token_pos(),
- new_receiver,
- node->field_name(),
- new_value,
- node->is_conditional()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) InstanceSetterNode(node->token_pos(),
+ new_receiver,
+ node->field_name(),
+ new_value,
+ node->is_conditional()));
}
@@ -472,9 +458,7 @@
node->cls(),
node->field_name());
new_getter->set_owner(node->owner());
- LocalVariable* result =
- AddToPreambleNewTempVar(new_getter, ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new_getter);
}
@@ -497,46 +481,43 @@
node->function(),
new_value);
- LocalVariable* result =
- AddToPreambleNewTempVar(new_setter, ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new_setter);
}
void AwaitTransformer::VisitLoadLocalNode(LoadLocalNode* node) {
- result_ = node;
+ result_ = MakeName(node);
}
void AwaitTransformer::VisitStoreLocalNode(StoreLocalNode* node) {
AstNode* new_value = Transform(node->value());
- result_ = new(Z) StoreLocalNode(node->token_pos(), &node->local(), new_value);
+ result_ = MakeName(new(Z) StoreLocalNode(node->token_pos(),
+ &node->local(),
+ new_value));
}
void AwaitTransformer::VisitLoadStaticFieldNode(LoadStaticFieldNode* node) {
- result_ = node;
+ result_ = MakeName(node);
}
void AwaitTransformer::VisitStoreStaticFieldNode(StoreStaticFieldNode* node) {
AstNode* new_value = Transform(node->value());
- result_ = new(Z) StoreStaticFieldNode(
- node->token_pos(),
+ result_ = MakeName(new(Z) StoreStaticFieldNode(node->token_pos(),
Field::ZoneHandle(Z, node->field().Original()),
- new_value);
+ new_value));
}
void AwaitTransformer::VisitLoadIndexedNode(LoadIndexedNode* node) {
AstNode* new_array = Transform(node->array());
AstNode* new_index = Transform(node->index_expr());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) LoadIndexedNode(node->token_pos(),
- new_array,
- new_index,
- node->super_class()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) LoadIndexedNode(node->token_pos(),
+ new_array,
+ new_index,
+ node->super_class()));
}
@@ -544,24 +525,20 @@
AstNode* new_array = Transform(node->array());
AstNode* new_index = Transform(node->index_expr());
AstNode* new_value = Transform(node->value());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) StoreIndexedNode(node->token_pos(),
- new_array,
- new_index,
- new_value,
- node->super_class()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) StoreIndexedNode(node->token_pos(),
+ new_array,
+ new_index,
+ new_value,
+ node->super_class()));
}
void AwaitTransformer::VisitAssignableNode(AssignableNode* node) {
AstNode* new_expr = Transform(node->expr());
- LocalVariable* result = AddToPreambleNewTempVar(
- new(Z) AssignableNode(node->token_pos(),
- new_expr,
- node->type(),
- node->dst_name()), ST(node->token_pos()));
- result_ = new(Z) LoadLocalNode(ST(node->token_pos()), result);
+ result_ = MakeName(new(Z) AssignableNode(node->token_pos(),
+ new_expr,
+ node->type(),
+ node->dst_name()));
}
@@ -598,9 +575,9 @@
void AwaitTransformer::VisitThrowNode(ThrowNode* node) {
AstNode* new_exception = Transform(node->exception());
- result_ = new(Z) ThrowNode(node->token_pos(),
- new_exception,
- node->stacktrace());
+ result_ = MakeName(new(Z) ThrowNode(node->token_pos(),
+ new_exception,
+ node->stacktrace()));
}
} // namespace dart
diff --git a/runtime/vm/ast_transformer.h b/runtime/vm/ast_transformer.h
index 5930f41..e189afd 100644
--- a/runtime/vm/ast_transformer.h
+++ b/runtime/vm/ast_transformer.h
@@ -51,8 +51,9 @@
private:
LocalVariable* EnsureCurrentTempVar();
- LocalVariable* AddToPreambleNewTempVar(AstNode* node,
+ LocalVariable* AddNewTempVarToPreamble(AstNode* node,
TokenPosition token_pos);
+ LoadLocalNode* MakeName(AstNode* node);
ArgumentListNode* TransformArguments(ArgumentListNode* node);
AstNode* LazyTransform(const Token::Kind kind,
AstNode* new_left,
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index bc9885d..9c00cfb 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -61,7 +61,8 @@
flow_graph()->parsed_function().function().ic_data_array());
if (Compiler::IsBackgroundCompilation() && ic_data_array.IsNull()) {
// Deferred loading cleared ic_data_array.
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+ "BlockScheduler: ICData array cleared");
}
ASSERT(!ic_data_array.IsNull());
Array& edge_counters = Array::Handle();
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index f9f418b..9bde826 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -300,7 +300,7 @@
continue;
}
#endif // !PRODUCT
- uri = Symbols::New(bootstrap_libraries[i].uri_);
+ uri = Symbols::New(thread, bootstrap_libraries[i].uri_);
lib = Library::LookupLibrary(uri);
if (lib.IsNull()) {
lib = Library::NewLibraryHelper(uri, false);
@@ -320,7 +320,7 @@
continue;
}
#endif // PRODUCT
- uri = Symbols::New(bootstrap_libraries[i].uri_);
+ uri = Symbols::New(thread, bootstrap_libraries[i].uri_);
lib = Library::LookupLibrary(uri);
ASSERT(!lib.IsNull());
source = GetLibrarySource(lib, uri, false);
@@ -338,7 +338,7 @@
}
// If a patch exists, load and patch the script.
if (bootstrap_libraries[i].patch_paths_ != NULL) {
- patch_uri = Symbols::New(bootstrap_libraries[i].patch_uri_);
+ patch_uri = Symbols::New(thread, bootstrap_libraries[i].patch_uri_);
error = LoadPatchFiles(zone,
lib,
patch_uri,
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 1e79c57..777f1f9 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -95,6 +95,7 @@
V(Double_truncate, 1) \
V(Double_toInt, 1) \
V(Double_parse, 3) \
+ V(Double_toString, 1) \
V(Double_toStringAsFixed, 2) \
V(Double_toStringAsExponential, 2) \
V(Double_toStringAsPrecision, 2) \
@@ -352,7 +353,6 @@
V(UserTag_makeCurrent, 1) \
V(Profiler_getCurrentTag, 0) \
V(ClassID_getID, 1) \
- V(Num_toString, 1) \
V(VMService_SendIsolateServiceMessage, 2) \
V(VMService_SendRootServiceMessage, 1) \
V(VMService_OnStart, 0) \
diff --git a/runtime/vm/cha.cc b/runtime/vm/cha.cc
index ed5255e..57214bb 100644
--- a/runtime/vm/cha.cc
+++ b/runtime/vm/cha.cc
@@ -48,6 +48,31 @@
}
+bool CHA::ConcreteSubclasses(const Class& cls,
+ GrowableArray<intptr_t> *class_ids) {
+ if (cls.InVMHeap()) return false;
+ if (cls.IsObjectClass()) return false;
+
+ if (!cls.is_abstract()) {
+ class_ids->Add(cls.id());
+ }
+
+ const GrowableObjectArray& direct_subclasses =
+ GrowableObjectArray::Handle(cls.direct_subclasses());
+ if (direct_subclasses.IsNull()) {
+ return true;
+ }
+ Class& subclass = Class::Handle();
+ for (intptr_t i = 0; i < direct_subclasses.Length(); i++) {
+ subclass ^= direct_subclasses.At(i);
+ if (!ConcreteSubclasses(subclass, class_ids)) {
+ return false;
+ }
+ }
+ return true;
+}
+
+
bool CHA::IsImplemented(const Class& cls) {
// Function type aliases have different type checking rules.
ASSERT(!cls.IsTypedefClass());
diff --git a/runtime/vm/cha.h b/runtime/vm/cha.h
index fac6577..a1ea229 100644
--- a/runtime/vm/cha.h
+++ b/runtime/vm/cha.h
@@ -35,6 +35,11 @@
static bool HasSubclasses(const Class& cls);
bool HasSubclasses(intptr_t cid) const;
+ // Collect the concrete subclasses of 'cls' into 'class_ids'. Return true if
+ // the result is valid (may be invalid because we don't track the subclasses
+ // of classes allocated in the VM isolate or class Object).
+ bool ConcreteSubclasses(const Class& cls, GrowableArray<intptr_t> *class_ids);
+
// Return true if the class is implemented by some other class.
static bool IsImplemented(const Class& cls);
diff --git a/runtime/vm/cha_test.cc b/runtime/vm/cha_test.cc
index 7712324..0d0a1a4 100644
--- a/runtime/vm/cha_test.cc
+++ b/runtime/vm/cha_test.cc
@@ -42,19 +42,19 @@
EXPECT(!lib.IsNull());
const Class& class_a = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!class_a.IsNull());
const Class& class_b = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("B"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "B"))));
EXPECT(!class_b.IsNull());
const Class& class_c = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("C"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "C"))));
EXPECT(!class_c.IsNull());
const Class& class_d = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("D"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "D"))));
EXPECT(!class_d.IsNull());
const String& function_foo_name = String::Handle(String::New("foo"));
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 9497eab..1db0305 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -1709,7 +1709,8 @@
for (intptr_t i = 0; i < num_super_type_params; i++) {
param ^= super_type_params.TypeAt(i);
param_name = param.name();
- param_name = Symbols::FromConcat(param_name, Symbols::Backtick());
+ param_name = Symbols::FromConcat(thread,
+ param_name, Symbols::Backtick());
cloned_param = TypeParameter::New(mixin_app_class,
cloned_index,
param_name,
@@ -1890,7 +1891,8 @@
// If this mixin alias is aliasing another mixin alias, another class
// will be inserted via recursion. No need to check here.
// The mixin type may or may not be finalized yet.
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
AbstractType& super_type = AbstractType::Handle(zone,
mixin_app_class.super_type());
const Type& mixin_type = Type::Handle(zone, mixin_app_class.mixin());
@@ -1915,7 +1917,7 @@
Class& inserted_class = Class::Handle(zone,
library.LookupLocalClass(inserted_class_name));
if (inserted_class.IsNull()) {
- inserted_class_name = Symbols::New(inserted_class_name);
+ inserted_class_name = Symbols::New(thread, inserted_class_name);
const Script& script = Script::Handle(zone, mixin_app_class.script());
inserted_class = Class::New(
inserted_class_name, script, mixin_app_class.token_pos());
@@ -2144,21 +2146,23 @@
const Class& mixin_app,
const Class& mixin_cls,
const GrowableObjectArray& cloned_funcs) {
- const String& mixin_name = String::Handle(mixin_app.Name());
- const Class& super_class = Class::Handle(mixin_app.SuperClass());
- const String& super_name = String::Handle(super_class.Name());
- const Array& functions = Array::Handle(super_class.functions());
+ Thread* T = Thread::Current();
+ Zone* Z = T->zone();
+ const String& mixin_name = String::Handle(Z, mixin_app.Name());
+ const Class& super_class = Class::Handle(Z, mixin_app.SuperClass());
+ const String& super_name = String::Handle(Z, super_class.Name());
+ const Array& functions = Array::Handle(Z, super_class.functions());
const intptr_t num_functions = functions.Length();
- Function& func = Function::Handle();
+ Function& func = Function::Handle(Z);
for (intptr_t i = 0; i < num_functions; i++) {
func ^= functions.At(i);
if (func.IsGenerativeConstructor()) {
// Build constructor name from mixin application class name
// and name of cloned super class constructor.
- const String& ctor_name = String::Handle(func.name());
- String& clone_name = String::Handle(
+ const String& ctor_name = String::Handle(Z, func.name());
+ String& clone_name = String::Handle(Z,
String::SubString(ctor_name, super_name.Length()));
- clone_name = Symbols::FromConcat(mixin_name, clone_name);
+ clone_name = Symbols::FromConcat(T, mixin_name, clone_name);
if (FLAG_trace_class_finalization) {
THR_Print("Cloning constructor '%s' as '%s'\n",
@@ -2170,9 +2174,9 @@
// class. The source is the mixin class. The source may be needed
// to parse field initializer expressions in the mixin class.
const PatchClass& owner =
- PatchClass::Handle(PatchClass::New(mixin_app, mixin_cls));
+ PatchClass::Handle(Z, PatchClass::New(mixin_app, mixin_cls));
- const Function& clone = Function::Handle(
+ const Function& clone = Function::Handle(Z,
Function::New(clone_name,
func.kind(),
func.is_static(),
@@ -2191,11 +2195,11 @@
const intptr_t num_parameters = func.NumParameters();
// The cloned ctor shares the parameter names array with the
// original.
- const Array& parameter_names = Array::Handle(func.parameter_names());
+ const Array& parameter_names = Array::Handle(Z, func.parameter_names());
ASSERT(parameter_names.Length() == num_parameters);
clone.set_parameter_names(parameter_names);
// The parameter types of the cloned constructor are 'dynamic'.
- clone.set_parameter_types(Array::Handle(Array::New(num_parameters)));
+ clone.set_parameter_types(Array::Handle(Z, Array::New(num_parameters)));
for (intptr_t n = 0; n < num_parameters; n++) {
clone.SetParameterTypeAt(n, Object::dynamic_type());
}
@@ -2726,7 +2730,8 @@
const MixinAppType& mixin_app_type) {
// Lookup or create mixin application classes in the library of cls
// and resolve super type and mixin types.
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
const Library& library = Library::Handle(zone, cls.library());
ASSERT(!library.IsNull());
const Script& script = Script::Handle(zone, cls.script());
@@ -2803,7 +2808,7 @@
mixin_type_class_name);
mixin_app_class = library.LookupLocalClass(mixin_app_class_name);
if (mixin_app_class.IsNull()) {
- mixin_app_class_name = Symbols::New(mixin_app_class_name);
+ mixin_app_class_name = Symbols::New(thread, mixin_app_class_name);
mixin_app_class = Class::New(mixin_app_class_name,
script,
mixin_type.token_pos());
diff --git a/runtime/vm/class_finalizer_test.cc b/runtime/vm/class_finalizer_test.cc
index f1c492e..eb4447c 100644
--- a/runtime/vm/class_finalizer_test.cc
+++ b/runtime/vm/class_finalizer_test.cc
@@ -11,7 +11,8 @@
static RawClass* CreateTestClass(const char* name) {
- const String& class_name = String::Handle(Symbols::New(name));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ name));
const Script& script = Script::Handle();
const Class& cls = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
@@ -74,7 +75,7 @@
static RawLibrary* NewLib(const char* url_chars) {
- String& url = String::ZoneHandle(Symbols::New(url_chars));
+ String& url = String::ZoneHandle(Symbols::New(Thread::Current(), url_chars));
return Library::New(url);
}
diff --git a/runtime/vm/code_descriptors_test.cc b/runtime/vm/code_descriptors_test.cc
index 5f8bb1d..3cc1ef9 100644
--- a/runtime/vm/code_descriptors_test.cc
+++ b/runtime/vm/code_descriptors_test.cc
@@ -221,7 +221,7 @@
const Library& lib = Library::Handle(Library::LookupLibrary(name));
EXPECT(!lib.IsNull());
Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull());
// Now compile the two functions 'A.foo' and 'A.moo'
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 11b7f8c..1aa9dda 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -1078,7 +1078,7 @@
if (is_extractor) {
field_name = String::SubString(field_name, 1);
ASSERT(!Field::IsGetterName(field_name));
- field_name = Symbols::New(field_name);
+ field_name = Symbols::New(thread, field_name);
if (!Field::IsSetterName(field_name)) {
const String& getter_name =
diff --git a/runtime/vm/code_generator_test.cc b/runtime/vm/code_generator_test.cc
index e3c33a5..b532cf1 100644
--- a/runtime/vm/code_generator_test.cc
+++ b/runtime/vm/code_generator_test.cc
@@ -47,7 +47,8 @@
// Helper to allocate and return a LocalVariable.
static LocalVariable* NewTestLocalVariable(const char* name) {
- const String& variable_name = String::ZoneHandle(Symbols::New(name));
+ const String& variable_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
const Type& variable_type = Type::ZoneHandle(Type::DynamicType());
return new LocalVariable(kPos, variable_name, variable_type);
}
@@ -212,7 +213,8 @@
static Library& MakeTestLibrary(const char* url) {
- const String& lib_url = String::ZoneHandle(Symbols::New(url));
+ const String& lib_url = String::ZoneHandle(Symbols::New(Thread::Current(),
+ url));
Library& lib = Library::ZoneHandle(Library::New(lib_url));
lib.Register();
Library& core_lib = Library::Handle(Library::CoreLibrary());
@@ -225,7 +227,8 @@
static RawClass* LookupClass(const Library& lib, const char* name) {
- const String& cls_name = String::ZoneHandle(Symbols::New(name));
+ const String& cls_name = String::ZoneHandle(Symbols::New(Thread::Current(),
+ name));
return lib.LookupClass(cls_name);
}
@@ -301,7 +304,8 @@
EXPECT(!constructor.IsNull());
// The unit test creates an instance of class A and calls function 'bar'.
- String& function_bar_name = String::ZoneHandle(Symbols::New("bar"));
+ String& function_bar_name = String::ZoneHandle(Symbols::New(Thread::Current(),
+ "bar"));
ArgumentListNode* no_arguments = new ArgumentListNode(kPos);
const TypeArguments& no_type_arguments = TypeArguments::ZoneHandle();
InstanceCallNode* call_bar = new InstanceCallNode(
@@ -360,7 +364,8 @@
app_lib ^= libs.At(num_libs - 1);
ASSERT(!app_lib.IsNull());
const Class& cls = Class::Handle(
- app_lib.LookupClass(String::Handle(Symbols::New("A"))));
+ app_lib.LookupClass(String::Handle(Symbols::New(Thread::Current(),
+ "A"))));
EXPECT_EQ(cls.raw(), result.clazz());
}
diff --git a/runtime/vm/code_patcher_arm64_test.cc b/runtime/vm/code_patcher_arm64_test.cc
index 32d8ada..f11b00a 100644
--- a/runtime/vm/code_patcher_arm64_test.cc
+++ b/runtime/vm/code_patcher_arm64_test.cc
@@ -21,11 +21,13 @@
#define __ assembler->
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
- const String& function_name = String::Handle(Symbols::New("callerFunction"));
+ const String& function_name = String::Handle(Symbols::New(thread,
+ "callerFunction"));
const Function& function = Function::Handle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/code_patcher_arm_test.cc b/runtime/vm/code_patcher_arm_test.cc
index 06b9f8c..a4cdfe5 100644
--- a/runtime/vm/code_patcher_arm_test.cc
+++ b/runtime/vm/code_patcher_arm_test.cc
@@ -21,11 +21,13 @@
#define __ assembler->
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
- const String& function_name = String::Handle(Symbols::New("callerFunction"));
+ const String& function_name = String::Handle(Symbols::New(thread,
+ "callerFunction"));
const Function& function = Function::Handle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/code_patcher_ia32_test.cc b/runtime/vm/code_patcher_ia32_test.cc
index 26fe49f..55fe98f 100644
--- a/runtime/vm/code_patcher_ia32_test.cc
+++ b/runtime/vm/code_patcher_ia32_test.cc
@@ -21,11 +21,13 @@
#define __ assembler->
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
- const String& function_name = String::Handle(Symbols::New("callerFunction"));
+ const String& function_name = String::Handle(Symbols::New(thread,
+ "callerFunction"));
const Function& function = Function::Handle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/code_patcher_mips_test.cc b/runtime/vm/code_patcher_mips_test.cc
index e99a987..0776083 100644
--- a/runtime/vm/code_patcher_mips_test.cc
+++ b/runtime/vm/code_patcher_mips_test.cc
@@ -21,11 +21,13 @@
#define __ assembler->
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
- const String& function_name = String::Handle(Symbols::New("callerFunction"));
+ const String& function_name = String::Handle(Symbols::New(thread,
+ "callerFunction"));
const Function& function = Function::Handle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/code_patcher_x64_test.cc b/runtime/vm/code_patcher_x64_test.cc
index 13d2978..5102226 100644
--- a/runtime/vm/code_patcher_x64_test.cc
+++ b/runtime/vm/code_patcher_x64_test.cc
@@ -21,11 +21,13 @@
#define __ assembler->
ASSEMBLER_TEST_GENERATE(IcDataAccess, assembler) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
- const String& function_name = String::Handle(Symbols::New("callerFunction"));
+ const String& function_name = String::Handle(Symbols::New(thread,
+ "callerFunction"));
const Function& function = Function::Handle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index 26e51fe..fd0e748 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -381,6 +381,9 @@
field_invalidation_gen_at_start_(isolate()->field_invalidation_gen()),
loading_invalidation_gen_at_start_(
isolate()->loading_invalidation_gen()) {
+ if (Compiler::IsBackgroundCompilation()) {
+ isolate()->ClearDisablingFieldList();
+ }
}
bool Compile(CompilationPipeline* pipeline);
@@ -412,6 +415,28 @@
};
+// Returns true if any of disabling fields is inside the guarded_fields.
+// The number of guarded_fields and disabling-fields is expected to be small
+// (less than 5).
+static bool CheckDisablingFields(
+ Thread* thread,
+ const ZoneGrowableArray<const Field*>& guarded_fields) {
+ Isolate* isolate = thread->isolate();
+ Zone* zone = thread->zone();
+ Field& field = Field::Handle(zone, isolate->GetDisablingField());
+ while (!field.IsNull()) {
+ for (intptr_t i = 0; i < guarded_fields.length(); i++) {
+ if (guarded_fields.At(i)->raw() == field.raw()) {
+ return true;
+ }
+ }
+ // Get next field.
+ field = isolate->GetDisablingField();
+ }
+ return false;
+}
+
+
void CompileParsedFunctionHelper::FinalizeCompilation(
Assembler* assembler,
FlowGraphCompiler* graph_compiler,
@@ -499,10 +524,15 @@
if (!flow_graph->parsed_function().guarded_fields()->is_empty()) {
if (field_invalidation_gen_at_start() !=
isolate()->field_invalidation_gen()) {
- code_is_valid = false;
- if (trace_compiler) {
- THR_Print("--> FAIL: Field invalidation.");
- }
+ const ZoneGrowableArray<const Field*>& guarded_fields =
+ *flow_graph->parsed_function().guarded_fields();
+ bool field_conflict = CheckDisablingFields(thread(), guarded_fields);
+ if (field_conflict) {
+ code_is_valid = false;
+ if (trace_compiler) {
+ THR_Print("--> FAIL: Field invalidation.");
+ }
+ }
}
}
if (loading_invalidation_gen_at_start() !=
@@ -627,7 +657,8 @@
if (Compiler::IsBackgroundCompilation() &&
(function.ic_data_array() == Array::null())) {
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+ "RestoreICDataMap: ICData array cleared.");
}
if (FLAG_print_ic_data_map) {
for (intptr_t i = 0; i < ic_data_array->length(); i++) {
@@ -1035,6 +1066,11 @@
// Do not Garbage collect during this stage and instead allow the
// heap to grow.
NoHeapGrowthControlScope no_growth_control;
+ if (!isolate()->background_compiler()->is_running()) {
+ // The background compiler is being stopped.
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+ "Background compilation is being stopped");
+ }
FinalizeCompilation(&assembler, &graph_compiler, flow_graph);
}
if (isolate()->heap()->NeedsGarbageCollection()) {
@@ -1161,7 +1197,8 @@
isolate->loading_invalidation_gen())) {
// Loading occured while parsing. We need to abort here because state
// changed while compiling.
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+ "Invalidated state during parsing because of script loading");
}
}
@@ -1497,7 +1534,7 @@
// Function fits the bill.
const char* kEvalConst = "eval_const";
const Function& func = Function::ZoneHandle(Function::New(
- String::Handle(Symbols::New(kEvalConst)),
+ String::Handle(Symbols::New(thread, kEvalConst)),
RawFunction::kRegularFunction,
true, // static function
false, // not const function
@@ -1545,9 +1582,18 @@
}
-void Compiler::AbortBackgroundCompilation(intptr_t deopt_id) {
+void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) {
if (FLAG_trace_compiler) {
- THR_Print("ABORT background compilation\n");
+ THR_Print("ABORT background compilation: %s\n", msg);
+ }
+ TimelineStream* stream = Timeline::GetCompilerStream();
+ ASSERT(stream != NULL);
+ TimelineEvent* event = stream->StartEvent();
+ if (event != NULL) {
+ event->Instant("AbortBackgroundCompilation");
+ event->SetNumArguments(1);
+ event->CopyArgument(0, "reason", msg);
+ event->Complete();
}
ASSERT(Compiler::IsBackgroundCompilation());
Thread::Current()->long_jump_base()->Jump(
@@ -1564,7 +1610,8 @@
ASSERT(Thread::Current()->IsMutatorThread());
}
- ~QueueElement() {
+ virtual ~QueueElement() {
+ next_ = NULL;
function_ = Function::null();
}
@@ -1592,12 +1639,8 @@
class BackgroundCompilationQueue {
public:
BackgroundCompilationQueue() : first_(NULL), last_(NULL) {}
- ~BackgroundCompilationQueue() {
- while (!IsEmpty()) {
- QueueElement* e = Remove();
- delete e;
- }
- ASSERT((first_ == NULL) && (last_ == NULL));
+ virtual ~BackgroundCompilationQueue() {
+ Clear();
}
void VisitObjectPointers(ObjectPointerVisitor* visitor) {
@@ -1613,13 +1656,16 @@
void Add(QueueElement* value) {
ASSERT(value != NULL);
+ ASSERT(value->next() == NULL);
if (first_ == NULL) {
first_ = value;
+ ASSERT(last_ == NULL);
} else {
+ ASSERT(last_ != NULL);
last_->set_next(value);
}
- value->set_next(NULL);
last_ = value;
+ ASSERT(first_ != NULL && last_ != NULL);
}
QueueElement* Peek() const {
@@ -1656,6 +1702,14 @@
return false;
}
+ void Clear() {
+ while (!IsEmpty()) {
+ QueueElement* e = Remove();
+ delete e;
+ }
+ ASSERT((first_ == NULL) && (last_ == NULL));
+ }
+
private:
QueueElement* first_;
QueueElement* last_;
@@ -1672,6 +1726,17 @@
}
+// Fields all deleted in ::Stop; here clear them.
+BackgroundCompiler::~BackgroundCompiler() {
+ isolate_ = NULL;
+ running_ = false;
+ done_ = NULL;
+ queue_monitor_ = NULL;
+ done_monitor_ = NULL;
+ function_queue_ = NULL;
+}
+
+
void BackgroundCompiler::Run() {
while (running_) {
// Maybe something is already in the queue, check first before waiting
@@ -1684,7 +1749,9 @@
Zone* zone = stack_zone.GetZone();
HANDLESCOPE(thread);
Function& function = Function::Handle(zone);
- function = function_queue()->PeekFunction();
+ { MonitorLocker ml(queue_monitor_);
+ function = function_queue()->PeekFunction();
+ }
while (running_ && !function.IsNull()) {
// Check that we have aggregated and cleared the stats.
ASSERT(thread->compiler_stats()->IsCleared());
@@ -1705,9 +1772,20 @@
}
thread->compiler_stats()->Clear();
#endif // PRODUCT
- QueueElement* qelem = function_queue()->Remove();
- delete qelem;
- function = function_queue()->PeekFunction();
+
+ QueueElement* qelem = NULL;
+ { MonitorLocker ml(queue_monitor_);
+ if (function_queue()->IsEmpty()) {
+ // We are shutting down, queue was cleared.
+ function = Function::null();
+ } else {
+ qelem = function_queue()->Remove();
+ function = function_queue()->PeekFunction();
+ }
+ }
+ if (qelem != NULL) {
+ delete qelem;
+ }
}
}
Thread::ExitIsolateAsHelper();
@@ -1732,6 +1810,7 @@
void BackgroundCompiler::CompileOptimized(const Function& function) {
ASSERT(Thread::Current()->IsMutatorThread());
MonitorLocker ml(queue_monitor_);
+ ASSERT(running_);
if (function_queue()->ContainsObj(function)) {
return;
}
@@ -1746,8 +1825,8 @@
}
-void BackgroundCompiler::Stop(BackgroundCompiler* task) {
- ASSERT(Isolate::Current()->background_compiler() == task);
+void BackgroundCompiler::Stop(Isolate* isolate) {
+ BackgroundCompiler* task = isolate->background_compiler();
ASSERT(task != NULL);
BackgroundCompilationQueue* function_queue = task->function_queue();
@@ -1756,8 +1835,9 @@
bool* task_done = task->done_;
// Wake up compiler task and stop it.
{
- MonitorLocker ml(task->queue_monitor_);
+ MonitorLocker ml(queue_monitor);
task->running_ = false;
+ function_queue->Clear();
// 'task' will be deleted by thread pool.
task = NULL;
ml.Notify(); // Stop waiting for the queue.
@@ -1773,7 +1853,7 @@
delete done_monitor;
delete queue_monitor;
delete function_queue;
- Isolate::Current()->set_background_compiler(NULL);
+ isolate->set_background_compiler(NULL);
}
@@ -1899,7 +1979,7 @@
}
-void Compiler::AbortBackgroundCompilation(intptr_t deopt_id) {
+void Compiler::AbortBackgroundCompilation(intptr_t deopt_id, const char* msg) {
UNREACHABLE();
}
@@ -1914,7 +1994,7 @@
}
-void BackgroundCompiler::Stop(BackgroundCompiler* task) {
+void BackgroundCompiler::Stop(Isolate* isolate) {
UNREACHABLE();
}
diff --git a/runtime/vm/compiler.h b/runtime/vm/compiler.h
index 01822ac..2f2eb1c 100644
--- a/runtime/vm/compiler.h
+++ b/runtime/vm/compiler.h
@@ -146,7 +146,8 @@
// because the mutator thread changed the state (e.g., deoptimization,
// deferred loading). The background compilation may retry to compile
// the same function later.
- static void AbortBackgroundCompilation(intptr_t deopt_id);
+ static void AbortBackgroundCompilation(intptr_t deopt_id,
+ const char* msg = "");
};
@@ -156,9 +157,12 @@
// No OSR compilation in the background compiler.
class BackgroundCompiler : public ThreadPool::Task {
public:
+ virtual ~BackgroundCompiler();
+
static void EnsureInit(Thread* thread);
- static void Stop(BackgroundCompiler* task);
+ // Stops background compiler of the given isolate.
+ static void Stop(Isolate* isolate);
// Call to optimize a function in the background, enters the function in the
// compilation queue.
@@ -167,6 +171,7 @@
void VisitPointers(ObjectPointerVisitor* visitor);
BackgroundCompilationQueue* function_queue() const { return function_queue_; }
+ bool is_running() const { return running_; }
private:
explicit BackgroundCompiler(Isolate* isolate);
diff --git a/runtime/vm/compiler_test.cc b/runtime/vm/compiler_test.cc
index 3eda03d..f2e138c 100644
--- a/runtime/vm/compiler_test.cc
+++ b/runtime/vm/compiler_test.cc
@@ -47,7 +47,7 @@
EXPECT(CompilerTest::TestCompileScript(lib, script));
EXPECT(ClassFinalizer::ProcessPendingClasses());
Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull());
String& function_foo_name = String::Handle(String::New("foo"));
Function& function_foo =
@@ -87,7 +87,7 @@
EXPECT(CompilerTest::TestCompileScript(lib, script));
EXPECT(ClassFinalizer::ProcessPendingClasses());
Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull());
String& function_foo_name = String::Handle(String::New("foo"));
Function& func =
@@ -109,7 +109,7 @@
while (!func.HasOptimizedCode()) {
ml.WaitWithSafepointCheck(thread, 1);
}
- BackgroundCompiler::Stop(isolate->background_compiler());
+ BackgroundCompiler::Stop(isolate);
}
@@ -129,7 +129,7 @@
RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(lib));
Library& lib_handle = Library::ZoneHandle(raw_library);
Class& cls = Class::Handle(
- lib_handle.LookupClass(String::Handle(Symbols::New("A"))));
+ lib_handle.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull());
Zone* zone = thread->zone();
diff --git a/runtime/vm/constant_propagator.cc b/runtime/vm/constant_propagator.cc
index 03ab8ae..b8e7c2a 100644
--- a/runtime/vm/constant_propagator.cc
+++ b/runtime/vm/constant_propagator.cc
@@ -323,7 +323,7 @@
// class ids. Otherwise LICM might potentially hoist incorrect code.
const Object& value = instr->value()->definition()->constant_value();
if (IsConstant(value) &&
- CheckClassInstr::IsImmutableClassId(value.GetClassId())) {
+ !Field::IsExternalizableCid(value.GetClassId())) {
SetValue(instr, value);
} else {
SetValue(instr, non_constant_);
@@ -805,7 +805,7 @@
const Object& object = instr->object()->definition()->constant_value();
if (IsConstant(object)) {
cid = object.GetClassId();
- if (CheckClassInstr::IsImmutableClassId(cid)) {
+ if (!Field::IsExternalizableCid(cid)) {
SetValue(instr, Smi::ZoneHandle(Z, Smi::New(cid)));
return;
}
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
deleted file mode 100644
index 7a678a0..0000000
--- a/runtime/vm/coverage.cc
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/coverage.h"
-
-#include "include/dart_api.h"
-
-#include "vm/compiler.h"
-#include "vm/isolate.h"
-#include "vm/json_stream.h"
-#include "vm/longjump.h"
-#include "vm/object.h"
-#include "vm/object_store.h"
-
-namespace dart {
-
-DEFINE_FLAG(charp, coverage_dir, NULL,
- "Enable writing coverage data into specified directory.");
-
-
-class CoverageFilterAll : public CoverageFilter {
- public:
- bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const {
- return true;
- }
-};
-
-
-// map[token_pos] -> line-number.
-static void ComputeTokenPosToLineNumberMap(const Script& script,
- GrowableArray<intptr_t>* map) {
- const TokenStream& tkns = TokenStream::Handle(script.tokens());
- const intptr_t len = ExternalTypedData::Handle(tkns.GetStream()).Length();
- map->SetLength(len);
-#if defined(DEBUG)
- for (intptr_t i = 0; i < len; i++) {
- (*map)[i] = -1;
- }
-#endif
- TokenStream::Iterator tkit(tkns,
- TokenPosition::kMinSource,
- TokenStream::Iterator::kAllTokens);
- intptr_t cur_line = script.line_offset() + 1;
- while (tkit.CurrentTokenKind() != Token::kEOS) {
- const intptr_t position = tkit.CurrentPosition().Pos();
- (*map)[position] = cur_line;
- if (tkit.CurrentTokenKind() == Token::kNEWLINE) {
- cur_line++;
- }
- tkit.Advance();
- }
-}
-
-
-void CodeCoverage::CompileAndAdd(const Function& function,
- const JSONArray& hits_or_sites,
- const GrowableArray<intptr_t>& pos_to_line,
- bool as_call_sites) {
- if (!FLAG_support_coverage) {
- return;
- }
- // If the function should not be compiled for coverage analysis, then just
- // skip this method.
- // TODO(iposva): Maybe we should skip synthesized methods in general too.
- if (function.is_abstract() || function.IsRedirectingFactory()) {
- return;
- }
- if (function.IsNonImplicitClosureFunction() &&
- (function.context_scope() == ContextScope::null())) {
- // TODO(iposva): This can arise if we attempt to compile an inner function
- // before we have compiled its enclosing function or if the enclosing
- // function failed to compile.
- return;
- }
- Thread* thread = Thread::Current();
- Zone* zone = thread->zone();
- // Make sure we have the unoptimized code for this function available.
- if (Compiler::EnsureUnoptimizedCode(thread, function) != Error::null()) {
- // Ignore the error and this function entirely.
- return;
- }
- const Code& code = Code::Handle(zone, function.unoptimized_code());
- ASSERT(!code.IsNull());
-
- // Print the hit counts for all IC datas.
- ZoneGrowableArray<const ICData*>* ic_data_array =
- new(zone) ZoneGrowableArray<const ICData*>();
- function.RestoreICDataMap(ic_data_array, false /* clone ic-data */);
- const PcDescriptors& descriptors = PcDescriptors::Handle(
- zone, code.pc_descriptors());
-
- const TokenPosition begin_pos = function.token_pos();
- const TokenPosition end_pos = function.end_token_pos();
- intptr_t last_line = -1;
- intptr_t last_count = 0;
- // Only IC based calls have counting.
- PcDescriptors::Iterator iter(descriptors,
- RawPcDescriptors::kIcCall | RawPcDescriptors::kUnoptStaticCall);
- while (iter.MoveNext()) {
- HANDLESCOPE(thread);
- const ICData* ic_data = (*ic_data_array)[iter.DeoptId()];
- if (!ic_data->IsNull()) {
- const TokenPosition token_pos = iter.TokenPos();
- // Filter out descriptors that do not map to tokens in the source code.
- if ((token_pos < begin_pos) || (token_pos > end_pos)) {
- continue;
- }
- if (as_call_sites) {
- bool is_static_call = iter.Kind() == RawPcDescriptors::kUnoptStaticCall;
- ic_data->PrintToJSONArray(hits_or_sites,
- token_pos,
- is_static_call);
- } else {
- intptr_t line = pos_to_line[token_pos.Pos()];
-#if defined(DEBUG)
- const Script& script = Script::Handle(zone, function.script());
- intptr_t test_line = -1;
- script.GetTokenLocation(token_pos, &test_line, NULL);
- ASSERT(test_line == line);
-#endif
- // Merge hit data where possible.
- if (last_line == line) {
- last_count += ic_data->AggregateCount();
- } else {
- if ((last_line != -1)) {
- hits_or_sites.AddValue(last_line);
- hits_or_sites.AddValue(last_count);
- }
- last_count = ic_data->AggregateCount();
- last_line = line;
- }
- }
- }
- }
- // Write last hit value if needed.
- if (!as_call_sites && (last_line != -1)) {
- hits_or_sites.AddValue(last_line);
- hits_or_sites.AddValue(last_count);
- }
-}
-
-
-void CodeCoverage::PrintClass(const Library& lib,
- const Class& cls,
- const JSONArray& jsarr,
- CoverageFilter* filter,
- bool as_call_sites) {
- if (!FLAG_support_coverage) {
- return;
- }
- Thread* thread = Thread::Current();
- if (cls.EnsureIsFinalized(thread) != Error::null()) {
- // Only classes that have been finalized do have a meaningful list of
- // functions.
- return;
- }
- Array& functions = Array::Handle(cls.functions());
- ASSERT(!functions.IsNull());
- Function& function = Function::Handle();
- Script& script = Script::Handle();
- String& saved_url = String::Handle();
- String& url = String::Handle();
- GrowableArray<intptr_t> pos_to_line;
- int i = 0;
- while (i < functions.Length()) {
- HANDLESCOPE(thread);
- function ^= functions.At(i);
- script = function.script();
- saved_url = script.url();
- if (!filter->ShouldOutputCoverageFor(lib, script, cls, function)) {
- i++;
- continue;
- }
- if (!as_call_sites) {
- ComputeTokenPosToLineNumberMap(script, &pos_to_line);
- }
- JSONObject jsobj(&jsarr);
- jsobj.AddProperty("source", saved_url.ToCString());
- jsobj.AddProperty("script", script);
- JSONArray hits_or_sites(&jsobj, as_call_sites ? "callSites" : "hits");
-
- // We stay within this loop while we are seeing functions from the same
- // source URI.
- while (i < functions.Length()) {
- function ^= functions.At(i);
- script = function.script();
- url = script.url();
- if (!url.Equals(saved_url)) {
- pos_to_line.Clear();
- break;
- }
- if (!filter->ShouldOutputCoverageFor(lib, script, cls, function)) {
- i++;
- continue;
- }
- CompileAndAdd(function, hits_or_sites, pos_to_line, as_call_sites);
- i++;
- }
- }
-
- // TODO(turnidge): This looks like it prints closures many, many times.
- const GrowableObjectArray& closures = GrowableObjectArray::Handle(
- thread->isolate()->object_store()->closure_functions());
- pos_to_line.Clear();
- // We need to keep rechecking the length of the closures array, as handling
- // a closure potentially adds new entries to the end.
- i = 0;
- while (i < closures.Length()) {
- HANDLESCOPE(thread);
- function ^= closures.At(i);
- if (function.Owner() != cls.raw()) {
- i++;
- continue;
- }
- script = function.script();
- saved_url = script.url();
- if (!filter->ShouldOutputCoverageFor(lib, script, cls, function)) {
- i++;
- continue;
- }
- ComputeTokenPosToLineNumberMap(script, &pos_to_line);
- JSONObject jsobj(&jsarr);
- jsobj.AddProperty("source", saved_url.ToCString());
- jsobj.AddProperty("script", script);
- JSONArray hits_or_sites(&jsobj, as_call_sites ? "callSites" : "hits");
-
- // We stay within this loop while we are seeing functions from the same
- // source URI.
- while (i < closures.Length()) {
- function ^= closures.At(i);
- script = function.script();
- url = script.url();
- if (!url.Equals(saved_url)) {
- pos_to_line.Clear();
- break;
- }
- CompileAndAdd(function, hits_or_sites, pos_to_line, as_call_sites);
- i++;
- }
- }
-}
-
-
-void CodeCoverage::Write(Thread* thread) {
- if (!FLAG_support_coverage) {
- return;
- }
- if (FLAG_coverage_dir == NULL) {
- return;
- }
-
- Dart_FileOpenCallback file_open = Dart::file_open_callback();
- Dart_FileWriteCallback file_write = Dart::file_write_callback();
- Dart_FileCloseCallback file_close = Dart::file_close_callback();
- if ((file_open == NULL) || (file_write == NULL) || (file_close == NULL)) {
- return;
- }
-
- JSONStream stream;
- PrintJSON(thread, &stream, NULL, false);
-
- intptr_t pid = OS::ProcessId();
- char* filename = OS::SCreate(thread->zone(),
- "%s/dart-cov-%" Pd "-%" Pd64 ".json",
- FLAG_coverage_dir, pid, thread->isolate()->main_port());
- void* file = (*file_open)(filename, true);
- if (file == NULL) {
- OS::Print("Failed to write coverage file: %s\n", filename);
- return;
- }
- (*file_write)(stream.buffer()->buf(), stream.buffer()->length(), file);
- (*file_close)(file);
-}
-
-
-void CodeCoverage::PrintJSON(Thread* thread,
- JSONStream* stream,
- CoverageFilter* filter,
- bool as_call_sites) {
- if (!FLAG_support_coverage) {
- return;
- }
- CoverageFilterAll default_filter;
- if (filter == NULL) {
- filter = &default_filter;
- }
- const GrowableObjectArray& libs = GrowableObjectArray::Handle(
- thread->zone(),
- thread->isolate()->object_store()->libraries());
- Library& lib = Library::Handle();
- Class& cls = Class::Handle();
- JSONObject coverage(stream);
- coverage.AddProperty("type", "CodeCoverage");
- {
- JSONArray jsarr(&coverage, "coverage");
- for (int i = 0; i < libs.Length(); i++) {
- lib ^= libs.At(i);
- ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
- while (it.HasNext()) {
- cls = it.GetNextClass();
- ASSERT(!cls.IsNull());
- PrintClass(lib, cls, jsarr, filter, as_call_sites);
- }
- }
- }
-}
-
-
-} // namespace dart
diff --git a/runtime/vm/coverage.h b/runtime/vm/coverage.h
deleted file mode 100644
index 8c2ce23..0000000
--- a/runtime/vm/coverage.h
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#ifndef VM_COVERAGE_H_
-#define VM_COVERAGE_H_
-
-#include "vm/allocation.h"
-#include "vm/flags.h"
-
-namespace dart {
-
-DECLARE_FLAG(charp, coverage_dir);
-
-// Forward declarations.
-class Class;
-class Function;
-template <typename T> class GrowableArray;
-class Isolate;
-class JSONArray;
-class JSONStream;
-class Library;
-class Script;
-class String;
-
-class CoverageFilter : public ValueObject {
- public:
- virtual bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const = 0;
- virtual ~CoverageFilter() {}
-};
-
-class CodeCoverage : public AllStatic {
- public:
- static void Write(Thread* thread);
- static void PrintJSON(Thread* thread,
- JSONStream* stream,
- CoverageFilter* filter,
- bool as_call_sites);
-
- private:
- static void PrintClass(const Library& lib,
- const Class& cls,
- const JSONArray& arr,
- CoverageFilter* filter,
- bool as_call_sites);
- static void CompileAndAdd(const Function& function,
- const JSONArray& hits_or_sites,
- const GrowableArray<intptr_t>& pos_to_line,
- bool as_call_sites);
-};
-
-} // namespace dart
-
-#endif // VM_COVERAGE_H_
diff --git a/runtime/vm/coverage_test.cc b/runtime/vm/coverage_test.cc
deleted file mode 100644
index 025c6ed..0000000
--- a/runtime/vm/coverage_test.cc
+++ /dev/null
@@ -1,144 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-#include "vm/coverage.h"
-#include "vm/dart_api_impl.h"
-#include "vm/unit_test.h"
-
-namespace dart {
-
-#ifndef PRODUCT
-
-static RawObject* ExecuteScript(const char* script) {
- TransitionVMToNative transition(Thread::Current());
- Dart_Handle h_lib = TestCase::LoadTestScript(script, NULL);
- EXPECT_VALID(h_lib);
- Library& lib = Library::Handle();
- lib ^= Api::UnwrapHandle(h_lib);
- EXPECT(!lib.IsNull());
- Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
- EXPECT_VALID(result);
- return Api::UnwrapHandle(h_lib);
-}
-
-
-class FunctionCoverageFilter : public CoverageFilter {
- public:
- explicit FunctionCoverageFilter(const Function& func) : func_(func) {}
- bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const {
- return func.raw() == func_.raw();
- }
- private:
- const Function& func_;
-};
-
-
-VM_TEST_CASE(Coverage_Empty) {
- const char* kScript =
- "main() {\n"
- "}";
-
- Library& lib = Library::Handle();
- lib ^= ExecuteScript(kScript);
- ASSERT(!lib.IsNull());
-
- JSONStream js;
- CodeCoverage::PrintJSON(thread, &js, NULL, false);
-
- char buf[1024];
- OS::SNPrint(buf, sizeof(buf),
- "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
- "\"fixedId\":true,\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
- "\"uri\":\"test-lib\","
- "\"_kind\":\"script\"},\"hits\":[]}", lib.index());
- EXPECT_SUBSTRING(buf, js.ToCString());
-}
-
-
-VM_TEST_CASE(Coverage_MainWithClass) {
- const char* kScript =
- "class Foo {\n"
- " var x;\n"
- " Foo(this.x);\n"
- " bar() {\n"
- " x = x * x;\n"
- " x = x / 13;\n"
- " }\n"
- "}\n"
- "main() {\n"
- " var foo = new Foo(7);\n"
- " foo.bar();\n"
- "}\n";
-
- Library& lib = Library::Handle();
- lib ^= ExecuteScript(kScript);
- ASSERT(!lib.IsNull());
-
- JSONStream js;
- CodeCoverage::PrintJSON(thread, &js, NULL, false);
-
- char buf[1024];
- // Coverage data is printed per class, i.e., there should be two sections
- // for test-lib in the JSON data.
-
- // Data for the actual class Foo.
- OS::SNPrint(buf, sizeof(buf),
- "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
- "\"fixedId\":true,\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
- "\"uri\":\"test-lib\","
- "\"_kind\":\"script\"},\"hits\":[3,1,5,4,6,3]}", lib.index());
- EXPECT_SUBSTRING(buf, js.ToCString());
-
- // Data for the fake class containing main().
- OS::SNPrint(buf, sizeof(buf),
- "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
- "\"fixedId\":true,\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
- "\"uri\":\"test-lib\","
- "\"_kind\":\"script\"},\"hits\":[10,1,11,1]}", lib.index());
- EXPECT_SUBSTRING(buf, js.ToCString());
-}
-
-
-VM_TEST_CASE(Coverage_FilterFunction) {
- const char* kScript =
- "class Foo {\n"
- " var x;\n"
- " var y;\n"
- " Foo(this.x);\n"
- " Foo.other(this.x, this.y);\n"
- " Foo.yetAnother();\n"
- "}\n"
- "main() {\n"
- " var foo = new Foo(7);\n"
- "}\n";
-
- Library& lib = Library::Handle();
- lib ^= ExecuteScript(kScript);
- ASSERT(!lib.IsNull());
- const Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(String::New("Foo"))));
- ASSERT(!cls.IsNull());
- const Function& func = Function::Handle(
- cls.LookupFunction(String::Handle(String::New("Foo.yetAnother"))));
- ASSERT(!func.IsNull());
-
- JSONStream js;
- FunctionCoverageFilter filter(func);
- CodeCoverage::PrintJSON(thread, &js, &filter, false);
- // Only expect coverage data for Foo.yetAnother() on line 6.
- char buf[1024];
- OS::SNPrint(buf, sizeof(buf),
- "{\"source\":\"test-lib\",\"script\":{\"type\":\"@Script\","
- "\"fixedId\":true,\"id\":\"libraries\\/%" Pd "\\/scripts\\/test-lib\","
- "\"uri\":\"test-lib\","
- "\"_kind\":\"script\"},\"hits\":[6,0]}", lib.index());
- EXPECT_SUBSTRING(buf, js.ToCString());
-}
-
-#endif // !PRODUCT
-
-} // namespace dart
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index fd0050d..e8c31a9 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -59,6 +59,9 @@
#endif // defined(DART_NO_SNAPSHOT).
DEFINE_FLAG(bool, verify_acquired_data, false,
"Verify correct API acquire/release of typed data.");
+DEFINE_FLAG(bool, support_externalizable_strings, false,
+ "Support Dart_MakeExternalString.");
+
ThreadLocalKey Api::api_native_key_ = kUnsetThreadLocalKey;
Dart_Handle Api::true_handle_ = NULL;
@@ -2519,6 +2522,10 @@
void* peer,
Dart_PeerFinalizer cback) {
DARTSCOPE(Thread::Current());
+ if (!FLAG_support_externalizable_strings) {
+ return Api::NewError("Dart_MakeExternalString with "
+ "--support_externalizable_strings=false");
+ }
const String& str_obj = Api::UnwrapStringHandle(Z, str);
if (str_obj.IsExternal()) {
return str; // String is already an external string.
@@ -4262,7 +4269,7 @@
// getter Function.
Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
- field = cls.LookupStaticField(field_name);
+ field = cls.LookupStaticFieldAllowPrivate(field_name);
if (field.IsNull() || field.IsUninitialized()) {
const String& getter_name =
String::Handle(Z, Field::GetterName(field_name));
@@ -4392,7 +4399,7 @@
// setter Function.
Class& cls = Class::Handle(Z, Type::Cast(obj).type_class());
- field = cls.LookupStaticField(field_name);
+ field = cls.LookupStaticFieldAllowPrivate(field_name);
if (field.IsNull()) {
String& setter_name = String::Handle(Z, Field::SetterName(field_name));
setter = cls.LookupStaticFunctionAllowPrivate(setter_name);
@@ -4431,7 +4438,7 @@
Class& cls = Class::Handle(Z, instance.clazz());
String& setter_name = String::Handle(Z, Field::SetterName(field_name));
while (!cls.IsNull()) {
- field = cls.LookupInstanceField(field_name);
+ field = cls.LookupInstanceFieldAllowPrivate(field_name);
if (!field.IsNull() && field.is_final()) {
return Api::NewError("%s: cannot set final field '%s'.",
CURRENT_FUNC, field_name.ToCString());
@@ -4611,7 +4618,7 @@
}
CHECK_CALLBACK_STATE(T);
- String& cls_symbol = String::Handle(Z, Symbols::New(cls_name));
+ String& cls_symbol = String::Handle(Z, Symbols::New(T, cls_name));
const Class& cls = Class::Handle(Z,
Class::NewNativeWrapper(lib, cls_symbol, field_count));
if (cls.IsNull()) {
@@ -5465,7 +5472,7 @@
CHECK_CALLBACK_STATE(T);
CHECK_COMPILATION_ALLOWED(I);
- const String& prefix_symbol = String::Handle(Z, Symbols::New(prefix_vm));
+ const String& prefix_symbol = String::Handle(Z, Symbols::New(T, prefix_vm));
const Namespace& import_ns = Namespace::Handle(Z,
Namespace::New(import_vm, Object::null_array(), Object::null_array()));
if (prefix_vm.Length() == 0) {
diff --git a/runtime/vm/dart_api_impl.h b/runtime/vm/dart_api_impl.h
index 67c0257..f536e0b 100644
--- a/runtime/vm/dart_api_impl.h
+++ b/runtime/vm/dart_api_impl.h
@@ -57,7 +57,7 @@
#define DARTSCOPE(thread) \
Thread* T = (thread); \
CHECK_API_SCOPE(T); \
- TransitionNativeToVM trainsition(T); \
+ TransitionNativeToVM transition(T); \
HANDLESCOPE(T);
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 7ccf6a0..02c28db 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -23,6 +23,7 @@
DECLARE_FLAG(bool, verify_acquired_data);
DECLARE_FLAG(bool, ignore_patch_signature_mismatch);
+DECLARE_FLAG(bool, support_externalizable_strings);
#ifndef PRODUCT
@@ -5575,6 +5576,9 @@
TEST_CASE(GetNativeArguments) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"import 'dart:nativewrappers';"
"class MyObject extends NativeFieldWrapperClass2 {"
@@ -5621,6 +5625,8 @@
Dart_Handle result = Dart_Invoke(lib, NewString("testMain"), 1, args);
EXPECT_VALID(result);
EXPECT(Dart_IsInteger(result));
+
+ FLAG_support_externalizable_strings = saved_flag;
}
@@ -8497,6 +8503,9 @@
TEST_CASE(MakeExternalString) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
static int peer8 = 40;
static int peer16 = 41;
static int canonical_str_peer = 42;
@@ -8563,7 +8572,8 @@
// Test with single character canonical string, it should not become
// external string but the peer should be setup for it.
- Dart_Handle canonical_str = Api::NewHandle(thread, Symbols::New("*"));
+ Dart_Handle canonical_str = Api::NewHandle(thread, Symbols::New(thread,
+ "*"));
EXPECT(Dart_IsString(canonical_str));
EXPECT(!Dart_IsExternalString(canonical_str));
uint8_t ext_canonical_str[kLength];
@@ -8653,8 +8663,8 @@
// Test with a symbol (hash value should be preserved on externalization).
const char* symbol_ascii = "?unseen";
expected_length = strlen(symbol_ascii);
- Dart_Handle symbol_str =
- Api::NewHandle(thread, Symbols::New(symbol_ascii, expected_length));
+ Dart_Handle symbol_str = Api::NewHandle(thread,
+ Symbols::New(thread, symbol_ascii, expected_length));
EXPECT_VALID(symbol_str);
EXPECT(Dart_IsString(symbol_str));
EXPECT(Dart_IsStringLatin1(symbol_str));
@@ -8700,10 +8710,15 @@
EXPECT_EQ(80, peer8);
EXPECT_EQ(82, peer16);
EXPECT_EQ(42, canonical_str_peer); // "*" Symbol is not removed on GC.
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalizeConstantStrings) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"String testMain() {\n"
" return 'constant string';\n"
@@ -8727,6 +8742,8 @@
for (intptr_t i = 0; i < kExpectedLen; i++) {
EXPECT_EQ(expected_str[i], ext_str[i]);
}
+
+ FLAG_support_externalizable_strings = saved_flag;
}
@@ -8816,6 +8833,9 @@
// Do not use guarding mechanism on externalizable classes, since their class
// can change on the fly,
TEST_CASE(GuardExternalizedString) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"main() {\n"
" var a = new A('hello');\n"
@@ -8851,10 +8871,15 @@
result = Dart_IntegerToInt64(result, &value);
EXPECT_VALID(result);
EXPECT_EQ(10640000, value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringDeoptimize) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"String str = 'A';\n"
"class A {\n"
@@ -8886,10 +8911,15 @@
result = Dart_IntegerToInt64(result, &value);
EXPECT_VALID(result);
EXPECT_EQ(260, value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringPolymorphicDeoptimize) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"const strA = 'AAAA';\n"
"class A {\n"
@@ -8922,10 +8952,15 @@
result = Dart_BooleanValue(result, &value);
EXPECT_VALID(result);
EXPECT(value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringGuardFieldDeoptimize) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"const strA = 'AAAA';\n"
"class A {\n"
@@ -8963,10 +8998,15 @@
result = Dart_BooleanValue(result, &value);
EXPECT_VALID(result);
EXPECT(value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringStaticFieldDeoptimize) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"const strA = 'AAAA';\n"
"class A {\n"
@@ -8999,10 +9039,15 @@
result = Dart_BooleanValue(result, &value);
EXPECT_VALID(result);
EXPECT(value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringTrimDoubleParse) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"String str = 'A';\n"
"class A {\n"
@@ -9028,10 +9073,15 @@
result = Dart_IntegerToInt64(result, &value);
EXPECT_VALID(result);
EXPECT_EQ(8, value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringDoubleParse) {
+ const bool saved_flag = FLAG_support_externalizable_strings;
+ FLAG_support_externalizable_strings = true;
+
const char* kScriptChars =
"String str = 'A';\n"
"class A {\n"
@@ -9057,11 +9107,13 @@
result = Dart_IntegerToInt64(result, &value);
EXPECT_VALID(result);
EXPECT_EQ(8, value);
+
+ FLAG_support_externalizable_strings = saved_flag;
}
TEST_CASE(ExternalStringIndexOf) {
- const char* kScriptChars =
+ const char* kScriptChars =
"main(String pattern) {\n"
" var str = 'Hello World';\n"
" return str.indexOf(pattern);\n"
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index e8bc0ce..ea55b49 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -136,12 +136,14 @@
RawObject* DartEntry::InvokeClosure(const Array& arguments,
const Array& arguments_descriptor) {
- Instance& instance = Instance::Handle();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ Instance& instance = Instance::Handle(zone);
instance ^= arguments.At(0);
// Get the entrypoint corresponding to the closure function or to the call
// method of the instance. This will result in a compilation of the function
// if it is not already compiled.
- Function& function = Function::Handle();
+ Function& function = Function::Handle(zone);
if (instance.IsCallable(&function)) {
// Only invoke the function if its arguments are compatible.
const ArgumentsDescriptor args_desc(arguments_descriptor);
@@ -160,12 +162,11 @@
// call method. If the arguments didn't match, go to noSuchMethod instead
// of infinitely recursing on the getter.
} else {
- const String& getter_name = String::Handle(Symbols::New("get:call"));
- Class& cls = Class::Handle(instance.clazz());
+ const String& getter_name = Symbols::GetCall();
+ Class& cls = Class::Handle(zone, instance.clazz());
while (!cls.IsNull()) {
function ^= cls.LookupDynamicFunction(getter_name);
if (!function.IsNull()) {
- Thread* thread = Thread::Current();
Isolate* isolate = thread->isolate();
volatile uword c_stack_pos = Thread::GetCurrentStackPointer();
volatile uword c_stack_limit = OSThread::Current()->stack_base() -
@@ -176,14 +177,14 @@
if (c_stack_pos < c_stack_limit) {
const Instance& exception =
- Instance::Handle(isolate->object_store()->stack_overflow());
- return UnhandledException::New(exception, Stacktrace::Handle());
+ Instance::Handle(zone, isolate->object_store()->stack_overflow());
+ return UnhandledException::New(exception, Stacktrace::Handle(zone));
}
- const Array& getter_arguments = Array::Handle(Array::New(1));
+ const Array& getter_arguments = Array::Handle(zone, Array::New(1));
getter_arguments.SetAt(0, instance);
const Object& getter_result =
- Object::Handle(DartEntry::InvokeFunction(function,
+ Object::Handle(zone, DartEntry::InvokeFunction(function,
getter_arguments));
if (getter_result.IsError()) {
return getter_result.raw();
@@ -194,8 +195,8 @@
// This otherwise unnecessary handle is used to prevent clang from
// doing tail call elimination, which would make the stack overflow
// check above ineffective.
- Object& result = Object::Handle(InvokeClosure(arguments,
- arguments_descriptor));
+ Object& result = Object::Handle(zone,
+ InvokeClosure(arguments, arguments_descriptor));
return result.raw();
}
cls = cls.SuperClass();
diff --git a/runtime/vm/dart_entry_test.cc b/runtime/vm/dart_entry_test.cc
index a661d5b..d075819 100644
--- a/runtime/vm/dart_entry_test.cc
+++ b/runtime/vm/dart_entry_test.cc
@@ -30,7 +30,7 @@
EXPECT_EQ(true, CompilerTest::TestCompileScript(lib, script));
EXPECT(ClassFinalizer::ProcessPendingClasses());
Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
String& name = String::Handle(String::New("foo"));
Function& function = Function::Handle(cls.LookupStaticFunction(name));
@@ -58,7 +58,7 @@
EXPECT_EQ(true, CompilerTest::TestCompileScript(lib, script));
EXPECT(ClassFinalizer::ProcessPendingClasses());
Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
String& name = String::Handle(String::New("foo"));
Function& function = Function::Handle(cls.LookupStaticFunction(name));
@@ -84,14 +84,14 @@
EXPECT_EQ(true, CompilerTest::TestCompileScript(lib, script));
EXPECT(ClassFinalizer::ProcessPendingClasses());
Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
// Invoke the constructor.
const Instance& instance = Instance::Handle(Instance::New(cls));
const Array& constructor_arguments = Array::Handle(Array::New(1));
constructor_arguments.SetAt(0, instance);
- String& constructor_name = String::Handle(Symbols::New("A."));
+ String& constructor_name = String::Handle(Symbols::New(thread, "A."));
Function& constructor =
Function::Handle(cls.LookupConstructor(constructor_name));
ASSERT(!constructor.IsNull());
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 13a9175..aa66533 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -2364,7 +2364,8 @@
RawObject* Debugger::GetStaticField(const Class& cls,
const String& field_name) {
- const Field& fld = Field::Handle(cls.LookupStaticField(field_name));
+ const Field& fld =
+ Field::Handle(cls.LookupStaticFieldAllowPrivate(field_name));
if (!fld.IsNull()) {
// Return the value in the field if it has been initialized already.
const Instance& value = Instance::Handle(fld.StaticValue());
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index e2fa84e..a215851 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -270,7 +270,8 @@
AbstractType& type = AbstractType::Handle(zone, AbstractType::null());
while (true) {
if (test_class.raw() == error_class.raw()) {
- return error_class.LookupInstanceField(Symbols::_stackTrace());
+ return error_class.LookupInstanceFieldAllowPrivate(
+ Symbols::_stackTrace());
}
type = test_class.super_type();
if (type.IsNull()) return Field::null();
@@ -419,7 +420,10 @@
// TODO(hausner): Rename this NewCoreInstance to call out the fact that
// the class name is resolved in the core library implicitly?
RawInstance* Exceptions::NewInstance(const char* class_name) {
- const String& cls_name = String::Handle(Symbols::New(class_name));
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const String& cls_name = String::Handle(zone,
+ Symbols::New(thread, class_name));
const Library& core_lib = Library::Handle(Library::CoreLibrary());
// No ambiguity error expected: passing NULL.
Class& cls = Class::Handle(core_lib.LookupClass(cls_name));
@@ -459,7 +463,8 @@
args.SetAt(2, Smi::Handle(zone, Smi::New(column)));
// Construct '_errorMsg'.
- GrowableHandlePtrArray<const String> pieces(zone, 20);
+ const GrowableObjectArray& pieces = GrowableObjectArray::Handle(zone,
+ GrowableObjectArray::New(20));
// Print bound error first, if any.
if (!bound_error_msg.IsNull() && (bound_error_msg.Length() > 0)) {
@@ -472,7 +477,7 @@
const LanguageError& error = LanguageError::Handle(zone, dst_type.error());
if (!error.IsNull()) {
// Print the embedded error only.
- pieces.Add(String::Handle(zone, Symbols::New(error.ToErrorCString())));
+ pieces.Add(String::Handle(zone, String::New(error.ToErrorCString())));
pieces.Add(Symbols::NewLine());
} else {
// Describe the type error.
@@ -514,8 +519,8 @@
}
}
}
- const String& error_msg =
- String::Handle(zone, Symbols::FromConcatAll(pieces));
+ const Array& arr = Array::Handle(zone, Array::MakeArray(pieces));
+ const String& error_msg = String::Handle(zone, String::ConcatAll(arr));
args.SetAt(3, error_msg);
// Type errors in the core library may be difficult to diagnose.
diff --git a/runtime/vm/find_code_object_test.cc b/runtime/vm/find_code_object_test.cc
index caece81..bac5c1e 100644
--- a/runtime/vm/find_code_object_test.cc
+++ b/runtime/vm/find_code_object_test.cc
@@ -55,7 +55,7 @@
source = String::New(scriptChars);
script = Script::New(url, source, RawScript::kScriptTag);
EXPECT(CompilerTest::TestCompileScript(lib, script));
- clsA = lib.LookupClass(String::Handle(Symbols::New("A")));
+ clsA = lib.LookupClass(String::Handle(Symbols::New(thread, "A")));
EXPECT(!clsA.IsNull());
ClassFinalizer::ProcessPendingClasses();
for (int i = 0; i < kNumFunctions; i++) {
@@ -105,7 +105,7 @@
source = String::New(scriptChars);
script = Script::New(url, source, RawScript::kScriptTag);
EXPECT(CompilerTest::TestCompileScript(lib, script));
- clsB = lib.LookupClass(String::Handle(Symbols::New("B")));
+ clsB = lib.LookupClass(String::Handle(Symbols::New(thread, "B")));
EXPECT(!clsB.IsNull());
ClassFinalizer::ProcessPendingClasses();
for (int i = 0; i < kNumFunctions; i++) {
diff --git a/runtime/vm/flag_list.h b/runtime/vm/flag_list.h
index 5a55b8a..dc7f4b2 100644
--- a/runtime/vm/flag_list.h
+++ b/runtime/vm/flag_list.h
@@ -25,7 +25,7 @@
"Allow embedding absolute addresses in generated code.") \
P(always_megamorphic_calls, bool, false, \
"Instance call always as megamorphic.") \
-C(background_compilation, false, false, bool, false, \
+C(background_compilation, false, true, bool, true, \
"Run optimizing compilation in background") \
R(break_at_isolate_spawn, false, bool, false, \
"Insert a one-time breakpoint at the entrypoint for all spawned isolates") \
@@ -135,8 +135,6 @@
"Support the IL printer.") \
R(support_service, false, bool, true, \
"Support the service protocol.") \
-R(support_coverage, false, bool, true, \
- "Support code coverage.") \
R(support_timeline, false, bool, true, \
"Support timeline.") \
D(trace_cha, bool, false, \
@@ -165,6 +163,8 @@
"Use field guards and track field types") \
C(use_osr, false, true, bool, true, \
"Use OSR") \
+R(verbose_dev, false, bool, false, \
+ "Enables verbose messages during development.") \
P(verbose_gc, bool, false, \
"Enables verbose GC.") \
P(verbose_gc_hdr, int, 40, \
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index c19dc0c..0c7aa52 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -303,6 +303,8 @@
// Remove environments from the instructions which do not deoptimize.
void EliminateEnvironments();
+ bool IsReceiver(Definition* def) const;
+
private:
friend class IfConverter;
friend class BranchSimplifier;
@@ -355,7 +357,6 @@
Value* use,
bool is_environment_use);
- bool IsReceiver(Definition* def) const;
void ComputeIsReceiver(PhiInstr* phi) const;
void ComputeIsReceiverRecursive(PhiInstr* phi,
GrowableArray<PhiInstr*>* unmark) const;
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index c9e02e7..1f428174 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -40,10 +40,14 @@
"Trace type check elimination at compile time.");
DECLARE_FLAG(bool, profile_vm);
+DECLARE_FLAG(bool, support_externalizable_strings);
// Quick access to the locally defined zone() method.
#define Z (zone())
+// Quick access to the locally defined thread() method.
+#define T (thread())
+
// Quick synthetic token position.
#define ST(token_pos) ((token_pos).ToSynthetic())
@@ -1391,7 +1395,7 @@
new(Z) ZoneGrowableArray<PushArgumentInstr*>(2);
arguments->Add(push_left);
arguments->Add(push_right);
- const String& name = String::ZoneHandle(Z, Symbols::New(node->TokenName()));
+ const String& name = Symbols::Token(node->kind());
const intptr_t kNumArgsChecked = 2;
InstanceCallInstr* call = new(Z) InstanceCallInstr(node->token_pos(),
name,
@@ -1827,7 +1831,7 @@
ASSERT(Token::IsRelationalOperator(node->kind()));
InstanceCallInstr* comp = new(Z) InstanceCallInstr(
node->token_pos(),
- String::ZoneHandle(Z, Symbols::New(node->TokenName())),
+ Symbols::Token(node->kind()),
node->kind(),
arguments,
Object::null_array(),
@@ -1863,7 +1867,7 @@
arguments->Add(push_value);
InstanceCallInstr* call = new(Z) InstanceCallInstr(
node->token_pos(),
- String::ZoneHandle(Z, Symbols::New(node->TokenName())),
+ Symbols::Token(node->kind()),
node->kind(),
arguments,
Object::null_array(),
@@ -2300,7 +2304,7 @@
OS::SNPrint(name, 64, ":tmp_local%" Pd, index);
LocalVariable* var =
new(Z) LocalVariable(TokenPosition::kNoSource,
- String::ZoneHandle(Z, Symbols::New(name)),
+ String::ZoneHandle(Z, Symbols::New(T, name)),
*value->Type()->ToAbstractType());
var->set_index(index);
return var;
@@ -3225,7 +3229,8 @@
if (node->is_super_getter()) {
// Statically resolved instance getter, i.e. "super getter".
ASSERT(node->receiver() != NULL);
- getter_function = Resolver::ResolveDynamicAnyArgs(node->cls(), getter_name);
+ getter_function = Resolver::ResolveDynamicAnyArgs(Z,
+ node->cls(), getter_name);
if (getter_function.IsNull()) {
// Resolve and call noSuchMethod.
ArgumentListNode* arguments = new(Z) ArgumentListNode(node->token_pos());
@@ -3468,6 +3473,7 @@
LoadFieldInstr* load = BuildNativeGetter(
node, MethodRecognizer::kStringBaseLength, String::length_offset(),
Type::ZoneHandle(Z, Type::SmiType()), kSmiCid);
+ load->set_is_immutable(!FLAG_support_externalizable_strings);
if (kind == MethodRecognizer::kStringBaseLength) {
return ReturnDefinition(load);
}
@@ -3792,9 +3798,8 @@
Function* super_function = NULL;
if (node->IsSuperLoad()) {
// Resolve the load indexed operator in the super class.
- super_function = &Function::ZoneHandle(
- Z, Resolver::ResolveDynamicAnyArgs(node->super_class(),
- Symbols::IndexToken()));
+ super_function = &Function::ZoneHandle(Z, Resolver::ResolveDynamicAnyArgs(Z,
+ node->super_class(), Symbols::IndexToken()));
if (super_function->IsNull()) {
// Could not resolve super operator. Generate call noSuchMethod() of the
// super class instead.
@@ -3855,9 +3860,8 @@
const TokenPosition token_pos = node->token_pos();
if (node->IsSuperStore()) {
// Resolve the store indexed operator in the super class.
- super_function = &Function::ZoneHandle(
- Z, Resolver::ResolveDynamicAnyArgs(node->super_class(),
- Symbols::AssignIndexToken()));
+ super_function = &Function::ZoneHandle(Z, Resolver::ResolveDynamicAnyArgs(Z,
+ node->super_class(), Symbols::AssignIndexToken()));
if (super_function->IsNull()) {
// Could not resolve super operator. Generate call noSuchMethod() of the
// super class instead.
@@ -3923,11 +3927,9 @@
} else {
// Generate dynamic call to operator []=.
const intptr_t checked_argument_count = 2; // Do not check for value type.
- const String& name =
- String::ZoneHandle(Z, Symbols::New(Token::Str(Token::kASSIGN_INDEX)));
InstanceCallInstr* store =
new(Z) InstanceCallInstr(token_pos,
- name,
+ Symbols::AssignIndexToken(),
Token::kASSIGN_INDEX,
arguments,
Object::null_array(),
@@ -4472,7 +4474,7 @@
arguments->Add(PushArgument(receiver_value));
// String memberName.
const String& member_name =
- String::ZoneHandle(Z, Symbols::New(function_name));
+ String::ZoneHandle(Z, Symbols::New(T, function_name));
Value* member_name_value = Bind(new(Z) ConstantInstr(member_name));
arguments->Add(PushArgument(member_name_value));
// Smi invocation_type.
@@ -4613,7 +4615,7 @@
FlowGraph* FlowGraphBuilder::BuildGraph() {
- VMTagScope tagScope(Thread::Current(),
+ VMTagScope tagScope(thread(),
VMTag::kCompileFlowGraphBuilderTagId,
FLAG_profile_vm);
if (FLAG_support_ast_printer && FLAG_print_ast) {
diff --git a/runtime/vm/flow_graph_builder_test.cc b/runtime/vm/flow_graph_builder_test.cc
index 36eebc1..10f93cb 100644
--- a/runtime/vm/flow_graph_builder_test.cc
+++ b/runtime/vm/flow_graph_builder_test.cc
@@ -284,7 +284,7 @@
RawClass* GetClass(const Library& lib, const char* name) {
const Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New(name))));
+ lib.LookupClass(String::Handle(Symbols::New(thread_, name))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
return cls.raw();
}
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index d904c86..cfdf133 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -1695,6 +1695,9 @@
const ICData& ic_data = ICData::ZoneHandle(zone(), ICData::New(
parsed_function().function(), target_name,
arguments_descriptor, deopt_id, num_args_tested));
+#if defined(TAG_IC_DATA)
+ ic_data.set_tag(Instruction::kInstanceCall);
+#endif
if (deopt_id_to_ic_data_ != NULL) {
(*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
}
@@ -1719,6 +1722,9 @@
parsed_function().function(), String::Handle(zone(), target.name()),
arguments_descriptor, deopt_id, num_args_tested));
ic_data.AddTarget(target);
+#if defined(TAG_IC_DATA)
+ ic_data.set_tag(Instruction::kStaticCall);
+#endif
if (deopt_id_to_ic_data_ != NULL) {
(*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
}
@@ -1837,7 +1843,8 @@
const Array& argument_names,
intptr_t deopt_id,
TokenPosition token_pos,
- LocationSummary* locs) {
+ LocationSummary* locs,
+ bool complete) {
if (FLAG_polymorphic_with_deopt) {
Label* deopt = AddDeoptStub(deopt_id,
ICData::kDeoptPolymorphicInstanceCallTestFail);
@@ -1845,23 +1852,32 @@
EmitTestAndCall(ic_data, argument_count, argument_names,
deopt, // No cid match.
&ok, // Found cid.
- deopt_id, token_pos, locs);
+ deopt_id, token_pos, locs, complete);
assembler()->Bind(&ok);
} else {
- // Instead of deoptimizing, do a megamorphic call when no matching
- // cid found.
- Label ok;
- MegamorphicSlowPath* slow_path =
+ if (complete) {
+ Label ok;
+ EmitTestAndCall(ic_data, argument_count, argument_names,
+ NULL, // No cid match.
+ &ok, // Found cid.
+ deopt_id, token_pos, locs, true);
+ assembler()->Bind(&ok);
+ } else {
+ // Instead of deoptimizing, do a megamorphic call when no matching
+ // cid found.
+ Label ok;
+ MegamorphicSlowPath* slow_path =
new MegamorphicSlowPath(ic_data, argument_count, deopt_id,
token_pos, locs, CurrentTryIndex());
- AddSlowPathCode(slow_path);
- EmitTestAndCall(ic_data, argument_count, argument_names,
- slow_path->entry_label(), // No cid match.
- &ok, // Found cid.
- deopt_id, token_pos, locs);
+ AddSlowPathCode(slow_path);
+ EmitTestAndCall(ic_data, argument_count, argument_names,
+ slow_path->entry_label(), // No cid match.
+ &ok, // Found cid.
+ deopt_id, token_pos, locs, false);
- assembler()->Bind(slow_path->exit_label());
- assembler()->Bind(&ok);
+ assembler()->Bind(slow_path->exit_label());
+ assembler()->Bind(&ok);
+ }
}
}
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 3dc31a0..7c1fa0e 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -451,7 +451,8 @@
const Array& argument_names,
intptr_t deopt_id,
TokenPosition token_pos,
- LocationSummary* locs);
+ LocationSummary* locs,
+ bool complete);
// Pass a value for try-index where block is not available (e.g. slow path).
void EmitMegamorphicInstanceCall(
@@ -476,7 +477,8 @@
Label* match_found,
intptr_t deopt_id,
TokenPosition token_index,
- LocationSummary* locs);
+ LocationSummary* locs,
+ bool complete);
Condition EmitEqualityRegConstCompare(Register reg,
const Object& obj,
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index 3d15b4e..ace14d0 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -1596,7 +1596,8 @@
Label* match_found,
intptr_t deopt_id,
TokenPosition token_index,
- LocationSummary* locs) {
+ LocationSummary* locs,
+ bool complete) {
ASSERT(is_optimizing());
__ Comment("EmitTestAndCall");
const Array& arguments_descriptor =
@@ -1613,8 +1614,8 @@
ASSERT(!ic_data.IsNull() && (kNumChecks > 0));
Label after_smi_test;
- __ tst(R0, Operand(kSmiTagMask));
if (kFirstCheckIsSmi) {
+ __ tst(R0, Operand(kSmiTagMask));
// Jump if receiver is not Smi.
if (kNumChecks == 1) {
__ b(failed, NE);
@@ -1638,7 +1639,10 @@
} else {
// Receiver is Smi, but Smi is not a valid class therefore fail.
// (Smi class must be first in the list).
- __ b(failed, EQ);
+ if (!complete) {
+ __ tst(R0, Operand(kSmiTagMask));
+ __ b(failed, EQ);
+ }
}
__ Bind(&after_smi_test);
@@ -1657,11 +1661,18 @@
const bool kIsLastCheck = (i == (kSortedLen - 1));
ASSERT(sorted[i].cid != kSmiCid);
Label next_test;
- __ CompareImmediate(R2, sorted[i].cid);
- if (kIsLastCheck) {
- __ b(failed, NE);
+ if (!complete) {
+ __ CompareImmediate(R2, sorted[i].cid);
+ if (kIsLastCheck) {
+ __ b(failed, NE);
+ } else {
+ __ b(&next_test, NE);
+ }
} else {
- __ b(&next_test, NE);
+ if (!kIsLastCheck) {
+ __ CompareImmediate(R2, sorted[i].cid);
+ __ b(&next_test, NE);
+ }
}
// Do not use the code from the function, but let the code be patched so
// that we can record the outgoing edges to other code.
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 034eec6..f872532 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -1551,7 +1551,8 @@
Label* match_found,
intptr_t deopt_id,
TokenPosition token_index,
- LocationSummary* locs) {
+ LocationSummary* locs,
+ bool complete) {
ASSERT(is_optimizing());
__ Comment("EmitTestAndCall");
@@ -1569,8 +1570,8 @@
ASSERT(!ic_data.IsNull() && (kNumChecks > 0));
Label after_smi_test;
- __ tsti(R0, Immediate(kSmiTagMask));
if (kFirstCheckIsSmi) {
+ __ tsti(R0, Immediate(kSmiTagMask));
// Jump if receiver is not Smi.
if (kNumChecks == 1) {
__ b(failed, NE);
@@ -1594,7 +1595,10 @@
} else {
// Receiver is Smi, but Smi is not a valid class therefore fail.
// (Smi class must be first in the list).
- __ b(failed, EQ);
+ if (!complete) {
+ __ tsti(R0, Immediate(kSmiTagMask));
+ __ b(failed, EQ);
+ }
}
__ Bind(&after_smi_test);
@@ -1613,11 +1617,18 @@
const bool kIsLastCheck = (i == (kSortedLen - 1));
ASSERT(sorted[i].cid != kSmiCid);
Label next_test;
- __ CompareImmediate(R2, sorted[i].cid);
- if (kIsLastCheck) {
- __ b(failed, NE);
+ if (!complete) {
+ __ CompareImmediate(R2, sorted[i].cid);
+ if (kIsLastCheck) {
+ __ b(failed, NE);
+ } else {
+ __ b(&next_test, NE);
+ }
} else {
- __ b(&next_test, NE);
+ if (!kIsLastCheck) {
+ __ CompareImmediate(R2, sorted[i].cid);
+ __ b(&next_test, NE);
+ }
}
// Do not use the code from the function, but let the code be patched so
// that we can record the outgoing edges to other code.
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 576aef3..eac4f3c 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -1505,8 +1505,10 @@
Label* match_found,
intptr_t deopt_id,
TokenPosition token_index,
- LocationSummary* locs) {
+ LocationSummary* locs,
+ bool complete) {
ASSERT(is_optimizing());
+ ASSERT(!complete);
__ Comment("EmitTestAndCall");
const Array& arguments_descriptor =
Array::ZoneHandle(zone(), ArgumentsDescriptor::New(argument_count,
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index ff0ec98..3ec2756 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -1620,7 +1620,8 @@
Label* match_found,
intptr_t deopt_id,
TokenPosition token_index,
- LocationSummary* locs) {
+ LocationSummary* locs,
+ bool complete) {
ASSERT(is_optimizing());
__ Comment("EmitTestAndCall");
const Array& arguments_descriptor =
@@ -1637,8 +1638,8 @@
ASSERT(!ic_data.IsNull() && (kNumChecks > 0));
Label after_smi_test;
- __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
if (kFirstCheckIsSmi) {
+ __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
// Jump if receiver is not Smi.
if (kNumChecks == 1) {
__ bne(CMPRES1, ZR, failed);
@@ -1662,7 +1663,10 @@
} else {
// Receiver is Smi, but Smi is not a valid class therefore fail.
// (Smi class must be first in the list).
- __ beq(CMPRES1, ZR, failed);
+ if (!complete) {
+ __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
+ __ beq(CMPRES1, ZR, failed);
+ }
}
__ Bind(&after_smi_test);
@@ -1681,10 +1685,16 @@
const bool kIsLastCheck = (i == (kSortedLen - 1));
ASSERT(sorted[i].cid != kSmiCid);
Label next_test;
- if (kIsLastCheck) {
- __ BranchNotEqual(T2, Immediate(sorted[i].cid), failed);
+ if (!complete) {
+ if (kIsLastCheck) {
+ __ BranchNotEqual(T2, Immediate(sorted[i].cid), failed);
+ } else {
+ __ BranchNotEqual(T2, Immediate(sorted[i].cid), &next_test);
+ }
} else {
- __ BranchNotEqual(T2, Immediate(sorted[i].cid), &next_test);
+ if (!kIsLastCheck) {
+ __ BranchNotEqual(T2, Immediate(sorted[i].cid), &next_test);
+ }
}
// Do not use the code from the function, but let the code be patched so
// that we can record the outgoing edges to other code.
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index d9a11c4..e044923 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1534,7 +1534,8 @@
Label* match_found,
intptr_t deopt_id,
TokenPosition token_index,
- LocationSummary* locs) {
+ LocationSummary* locs,
+ bool complete) {
ASSERT(is_optimizing());
__ Comment("EmitTestAndCall");
@@ -1552,8 +1553,8 @@
ASSERT(!ic_data.IsNull() && (kNumChecks > 0));
Label after_smi_test;
- __ testq(RAX, Immediate(kSmiTagMask));
if (kFirstCheckIsSmi) {
+ __ testq(RAX, Immediate(kSmiTagMask));
// Jump if receiver is not Smi.
if (kNumChecks == 1) {
__ j(NOT_ZERO, failed);
@@ -1577,7 +1578,10 @@
} else {
// Receiver is Smi, but Smi is not a valid class therefore fail.
// (Smi class must be first in the list).
- __ j(ZERO, failed);
+ if (!complete) {
+ __ testq(RAX, Immediate(kSmiTagMask));
+ __ j(ZERO, failed);
+ }
}
__ Bind(&after_smi_test);
@@ -1596,11 +1600,18 @@
const bool kIsLastCheck = (i == (kSortedLen - 1));
ASSERT(sorted[i].cid != kSmiCid);
Label next_test;
- __ cmpl(RDI, Immediate(sorted[i].cid));
- if (kIsLastCheck) {
- __ j(NOT_EQUAL, failed);
+ if (!complete) {
+ __ cmpl(RDI, Immediate(sorted[i].cid));
+ if (kIsLastCheck) {
+ __ j(NOT_EQUAL, failed);
+ } else {
+ __ j(NOT_EQUAL, &next_test);
+ }
} else {
- __ j(NOT_EQUAL, &next_test);
+ if (!kIsLastCheck) {
+ __ cmpl(RDI, Immediate(sorted[i].cid));
+ __ j(NOT_EQUAL, &next_test);
+ }
}
// Do not use the code from the function, but let the code be patched so
// that we can record the outgoing edges to other code.
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index c8a5f28..471c511 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -63,6 +63,7 @@
DECLARE_FLAG(int, max_deoptimization_counter_threshold);
DECLARE_FLAG(bool, print_flow_graph);
DECLARE_FLAG(bool, print_flow_graph_optimized);
+DECLARE_FLAG(bool, support_externalizable_strings);
DECLARE_FLAG(bool, verify_compiler);
// Quick access to the current zone.
@@ -590,6 +591,7 @@
inlined_recursive_call_ = false;
}
}
+
collected_call_sites_ = NULL;
inlining_call_sites_ = NULL;
}
@@ -648,6 +650,15 @@
return false;
}
+ // Type feedback may have been cleared for this function (ClearICDataArray),
+ // but we need it for inlining.
+ if (!FLAG_precompiled_mode && (function.ic_data_array() == Array::null())) {
+ TRACE_INLINING(THR_Print(" Bailout: type feedback cleared\n"));
+ PRINT_INLINING_TREE("Not compiled",
+ &call_data->caller, &function, call_data->call);
+ return false;
+ }
+
// Abort if this function has deoptimized too much.
if (function.deoptimization_counter() >=
FLAG_max_deoptimization_counter_threshold) {
@@ -721,7 +732,8 @@
isolate->loading_invalidation_gen())) {
// Loading occured while parsing. We need to abort here because
// state changed while compiling.
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+ "Loading occured while parsing in inliner");
}
}
@@ -732,7 +744,8 @@
function.RestoreICDataMap(ic_data_array, clone_ic_data);
if (Compiler::IsBackgroundCompilation() &&
(function.ic_data_array() == Array::null())) {
- Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId);
+ Compiler::AbortBackgroundCompilation(Thread::kNoDeoptId,
+ "ICData cleared while inlining");
}
// Build the callee graph.
@@ -1205,7 +1218,7 @@
PolymorphicInstanceCallInstr* call = call_info[call_idx].call;
if (call->with_checks()) {
// PolymorphicInliner introduces deoptimization paths.
- if (!FLAG_polymorphic_with_deopt) {
+ if (!call->complete() && !FLAG_polymorphic_with_deopt) {
TRACE_INLINING(THR_Print(
" => %s\n Bailout: call with checks\n",
call->instance_call()->function_name().ToCString()));
@@ -1622,18 +1635,21 @@
if ((i == (inlined_variants_.length() - 1)) &&
non_inlined_variants_.is_empty()) {
// If it is the last variant use a check class id instruction which can
- // deoptimize, followed unconditionally by the body.
- RedefinitionInstr* cid_redefinition =
- new RedefinitionInstr(new(Z) Value(load_cid));
- cid_redefinition->set_ssa_temp_index(
- owner_->caller_graph()->alloc_ssa_temp_index());
- cursor = AppendInstruction(cursor, cid_redefinition);
- CheckClassIdInstr* check_class_id = new(Z) CheckClassIdInstr(
- new(Z) Value(cid_redefinition),
- inlined_variants_[i].cid,
- call_->deopt_id());
- check_class_id->InheritDeoptTarget(zone(), call_);
- cursor = AppendInstruction(cursor, check_class_id);
+ // deoptimize, followed unconditionally by the body. Omit the check if
+ // we know that we have covered all possible classes.
+ if (!call_->complete()) {
+ RedefinitionInstr* cid_redefinition =
+ new RedefinitionInstr(new(Z) Value(load_cid));
+ cid_redefinition->set_ssa_temp_index(
+ owner_->caller_graph()->alloc_ssa_temp_index());
+ cursor = AppendInstruction(cursor, cid_redefinition);
+ CheckClassIdInstr* check_class_id = new(Z) CheckClassIdInstr(
+ new(Z) Value(cid_redefinition),
+ inlined_variants_[i].cid,
+ call_->deopt_id());
+ check_class_id->InheritDeoptTarget(zone(), call_);
+ cursor = AppendInstruction(cursor, check_class_id);
+ }
// The next instruction is the first instruction of the inlined body.
// Handle the two possible cases (unshared and shared subsequent
@@ -1766,7 +1782,8 @@
PolymorphicInstanceCallInstr* fallback_call =
new PolymorphicInstanceCallInstr(call_->instance_call(),
new_checks,
- true); // With checks.
+ /* with_checks = */ true,
+ call_->complete());
fallback_call->set_ssa_temp_index(
owner_->caller_graph()->alloc_ssa_temp_index());
fallback_call->InheritDeoptTarget(zone(), call_);
@@ -2773,6 +2790,7 @@
Type::ZoneHandle(Z, Type::SmiType()),
str->token_pos());
length->set_result_cid(kSmiCid);
+ length->set_is_immutable(!FLAG_support_externalizable_strings);
length->set_recognized_kind(MethodRecognizer::kStringBaseLength);
cursor = flow_graph->AppendTo(cursor, length, NULL, FlowGraph::kValue);
@@ -2861,6 +2879,11 @@
const ICData& ic_data,
TargetEntryInstr** entry,
Definition** last) {
+ if (FLAG_precompiled_mode) {
+ // The graphs generated below include deopts.
+ return false;
+ }
+
ICData& value_check = ICData::ZoneHandle(Z);
MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(target);
switch (kind) {
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 20ccd3a..b1d188a 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -270,7 +270,7 @@
const intptr_t cid = guard->field().guarded_cid();
if ((cid == kIllegalCid) ||
(cid == kDynamicCid) ||
- !CheckClassInstr::IsImmutableClassId(cid)) {
+ Field::IsExternalizableCid(cid)) {
return;
}
@@ -782,7 +782,7 @@
}
intptr_t cid = value().GetClassId();
- if (!CheckClassInstr::IsImmutableClassId(cid)) {
+ if (Field::IsExternalizableCid(cid)) {
cid = kDynamicCid;
}
@@ -965,7 +965,7 @@
cid = obj.GetClassId();
}
}
- if (!CheckClassInstr::IsImmutableClassId(cid)) {
+ if (Field::IsExternalizableCid(cid)) {
cid = kDynamicCid;
}
return CompileType(is_nullable, cid, abstract_type);
diff --git a/runtime/vm/guard_field_test.cc b/runtime/vm/guard_field_test.cc
index d0ecb6e..0e0972b 100644
--- a/runtime/vm/guard_field_test.cc
+++ b/runtime/vm/guard_field_test.cc
@@ -13,12 +13,14 @@
const char* field_name) {
RawLibrary* raw_library = Library::RawCast(Api::UnwrapHandle(library));
Library& lib = Library::ZoneHandle(raw_library);
- const String& classname = String::Handle(Symbols::New(class_name));
+ const String& classname = String::Handle(Symbols::New(Thread::Current(),
+ class_name));
Class& cls = Class::Handle(lib.LookupClass(classname));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
String& fieldname = String::Handle(String::New(field_name));
- Field& field = Field::ZoneHandle(cls.LookupInstanceField(fieldname));
+ Field& field =
+ Field::ZoneHandle(cls.LookupInstanceFieldAllowPrivate(fieldname));
EXPECT(!field.IsNull());
return field.raw();
}
diff --git a/runtime/vm/hash_table.h b/runtime/vm/hash_table.h
index c162232..f4eb375 100644
--- a/runtime/vm/hash_table.h
+++ b/runtime/vm/hash_table.h
@@ -151,21 +151,24 @@
// Returns the entry that matches 'key', or -1 if none exists.
template<typename Key>
intptr_t FindKey(const Key& key) const {
- ASSERT(NumOccupied() < NumEntries());
+ const intptr_t num_entries = NumEntries();
+ ASSERT(NumOccupied() < num_entries);
// TODO(koda): Add salt.
- intptr_t probe = static_cast<uword>(KeyTraits::Hash(key)) % NumEntries();
+ uword hash = KeyTraits::Hash(key);
+ intptr_t probe = hash % num_entries;
// TODO(koda): Consider quadratic probing.
- for (; ; probe = (probe + 1) % NumEntries()) {
+ while (true) {
if (IsUnused(probe)) {
return -1;
- } else if (IsDeleted(probe)) {
- continue;
- } else {
+ } else if (!IsDeleted(probe)) {
key_handle_ = GetKey(probe);
if (KeyTraits::IsMatch(key, key_handle_)) {
return probe;
}
}
+ // Advance probe.
+ probe++;
+ probe = (probe == num_entries) ? 0 : probe;
}
UNREACHABLE();
return -1;
@@ -177,12 +180,14 @@
// and returns false.
template<typename Key>
bool FindKeyOrDeletedOrUnused(const Key& key, intptr_t* entry) const {
+ const intptr_t num_entries = NumEntries();
ASSERT(entry != NULL);
- ASSERT(NumOccupied() < NumEntries());
- intptr_t probe = static_cast<uword>(KeyTraits::Hash(key)) % NumEntries();
+ ASSERT(NumOccupied() < num_entries);
+ uword hash = KeyTraits::Hash(key);
+ intptr_t probe = hash % num_entries;
intptr_t deleted = -1;
// TODO(koda): Consider quadratic probing.
- for (; ; probe = (probe + 1) % NumEntries()) {
+ while (true) {
if (IsUnused(probe)) {
*entry = (deleted != -1) ? deleted : probe;
return false;
@@ -197,6 +202,9 @@
return true;
}
}
+ // Advance probe.
+ probe++;
+ probe = (probe == num_entries) ? 0 : probe;
}
UNREACHABLE();
return false;
@@ -636,7 +644,7 @@
BaseIterTable::InsertKey(entry, key);
return key.raw();
} else {
- return BaseIterTable::GetPayload(entry, 0);
+ return BaseIterTable::GetKey(entry);
}
}
diff --git a/runtime/vm/hash_table_test.cc b/runtime/vm/hash_table_test.cc
index b646b32..f413932 100644
--- a/runtime/vm/hash_table_test.cc
+++ b/runtime/vm/hash_table_test.cc
@@ -20,6 +20,8 @@
// easy to engineer collisions.
class TestTraits {
public:
+ static const char* Name() { return "TestTraits"; }
+
static bool IsMatch(const char* key, const Object& obj) {
return String::Cast(obj).Equals(key);
}
diff --git a/runtime/vm/heap_test.cc b/runtime/vm/heap_test.cc
index 80319e3..ad01502 100644
--- a/runtime/vm/heap_test.cc
+++ b/runtime/vm/heap_test.cc
@@ -93,7 +93,7 @@
static RawClass* GetClass(const Library& lib, const char* name) {
const Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New(name))));
+ lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
return cls.raw();
}
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 2287d0d..cc62146 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -448,7 +448,10 @@
}
PrintICDataHelper(f, ic_data());
if (with_checks()) {
- f->Print(" WITH CHECKS");
+ f->Print(" WITH-CHECKS");
+ }
+ if (complete()) {
+ f->Print(" COMPLETE");
}
}
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 5b5ac04..c68f277 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -36,6 +36,7 @@
DEFINE_FLAG(bool, unbox_numeric_fields, true,
"Support unboxed double and float32x4 fields.");
DECLARE_FLAG(bool, eliminate_type_checks);
+DECLARE_FLAG(bool, support_externalizable_strings);
#if defined(DEBUG)
@@ -89,7 +90,17 @@
// computations added in the optimizing compiler.
ASSERT(deopt_id_ != Thread::kNoDeoptId);
if (deopt_id_ < ic_data_array.length()) {
- return ic_data_array[deopt_id_];
+ const ICData* result = ic_data_array[deopt_id_];
+#if defined(TAG_IC_DATA)
+ if (result != NULL) {
+ if (result->tag() == -1) {
+ result->set_tag(tag());
+ } else if (result->tag() != tag()) {
+ FATAL("ICData tag mismatch");
+ }
+ }
+#endif
+ return result;
}
return NULL;
}
@@ -169,22 +180,11 @@
}
-bool CheckClassInstr::IsImmutableClassId(intptr_t cid) {
- switch (cid) {
- case kOneByteStringCid:
- case kTwoByteStringCid:
- return false;
- default:
- return true;
- }
-}
-
-
static bool AreAllChecksImmutable(const ICData& checks) {
const intptr_t len = checks.NumberOfChecks();
for (intptr_t i = 0; i < len; i++) {
if (checks.IsUsedAt(i)) {
- if (!CheckClassInstr::IsImmutableClassId(
+ if (Field::IsExternalizableCid(
checks.GetReceiverClassIdAt(i))) {
return false;
}
@@ -203,7 +203,7 @@
EffectSet CheckClassIdInstr::Dependencies() const {
// Externalization of strings via the API can change the class-id.
- return !CheckClassInstr::IsImmutableClassId(cid_) ?
+ return Field::IsExternalizableCid(cid_) ?
EffectSet::Externalization() : EffectSet::None();
}
@@ -3052,8 +3052,8 @@
ASSERT(call_ic_data->NumArgsTested() == 2);
const String& name = String::Handle(zone, call_ic_data->target_name());
const Class& smi_class = Class::Handle(zone, Smi::Class());
- const Function& smi_op_target =
- Function::Handle(Resolver::ResolveDynamicAnyArgs(smi_class, name));
+ const Function& smi_op_target = Function::Handle(zone,
+ Resolver::ResolveDynamicAnyArgs(zone, smi_class, name));
if (call_ic_data->NumberOfChecks() == 0) {
GrowableArray<intptr_t> class_ids(2);
class_ids.Add(kSmiCid);
@@ -3138,7 +3138,8 @@
instance_call()->argument_names(),
deopt_id(),
instance_call()->token_pos(),
- locs());
+ locs(),
+ complete());
}
@@ -3480,7 +3481,8 @@
return this;
}
const intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
GrowableHandlePtrArray<const String> pieces(zone, length);
for (intptr_t i = 0; i < length; i++) {
pieces.Add(Object::null_string());
@@ -3508,7 +3510,8 @@
pieces.SetAt(store_index, String::Cast(obj));
} else if (obj.IsSmi()) {
const char* cstr = obj.ToCString();
- pieces.SetAt(store_index, String::Handle(zone, Symbols::New(cstr)));
+ pieces.SetAt(store_index,
+ String::Handle(zone, String::New(cstr, Heap::kOld)));
} else if (obj.IsBool()) {
pieces.SetAt(store_index,
Bool::Cast(obj).value() ? Symbols::True() : Symbols::False());
@@ -3522,9 +3525,8 @@
}
}
- ASSERT(pieces.length() == length);
const String& concatenated = String::ZoneHandle(zone,
- Symbols::FromConcatAll(pieces));
+ Symbols::FromConcatAll(thread, pieces));
return flow_graph->GetConstant(concatenated);
}
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 0b64cbc..6e16c31 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -2892,17 +2892,20 @@
public:
PolymorphicInstanceCallInstr(InstanceCallInstr* instance_call,
const ICData& ic_data,
- bool with_checks)
+ bool with_checks,
+ bool complete)
: TemplateDefinition(instance_call->deopt_id()),
instance_call_(instance_call),
ic_data_(ic_data),
- with_checks_(with_checks) {
+ with_checks_(with_checks),
+ complete_(complete) {
ASSERT(instance_call_ != NULL);
ASSERT(ic_data.NumberOfChecks() > 0);
}
InstanceCallInstr* instance_call() const { return instance_call_; }
bool with_checks() const { return with_checks_; }
+ bool complete() const { return complete_; }
virtual TokenPosition token_pos() const {
return instance_call_->token_pos();
}
@@ -2934,6 +2937,7 @@
InstanceCallInstr* instance_call_;
const ICData& ic_data_;
const bool with_checks_;
+ const bool complete_;
DISALLOW_COPY_AND_ASSIGN(PolymorphicInstanceCallInstr);
};
@@ -7815,8 +7819,6 @@
void set_licm_hoisted(bool value) { licm_hoisted_ = value; }
- static bool IsImmutableClassId(intptr_t cid);
-
PRINT_OPERANDS_TO_SUPPORT
private:
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index dfe3fc5..c7591b5 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -1581,7 +1581,8 @@
if (field_cid == kDynamicCid) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldClassInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
@@ -1739,7 +1740,8 @@
if (field().guarded_list_length() == Field::kNoFixedLength) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldLengthInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index 239ad0b..452b6ba 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -1438,7 +1438,8 @@
if (field_cid == kDynamicCid) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldClassInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
@@ -1593,7 +1594,8 @@
if (field().guarded_list_length() == Field::kNoFixedLength) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldLengthInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index a6471e1..8cae087 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -1412,7 +1412,8 @@
if (field_cid == kDynamicCid) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldClassInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
@@ -1571,7 +1572,8 @@
if (field().guarded_list_length() == Field::kNoFixedLength) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldLengthInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 022d6b5..a8595a8 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -1612,7 +1612,8 @@
if (field_cid == kDynamicCid) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldClassInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
@@ -1770,7 +1771,8 @@
if (field().guarded_list_length() == Field::kNoFixedLength) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldLengthInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index d94b5f6..8253b0c 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -1453,7 +1453,8 @@
if (field_cid == kDynamicCid) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldClassInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
@@ -1598,7 +1599,8 @@
if (field().guarded_list_length() == Field::kNoFixedLength) {
if (Compiler::IsBackgroundCompilation()) {
// Field state changed while compiling.
- Compiler::AbortBackgroundCompilation(deopt_id());
+ Compiler::AbortBackgroundCompilation(deopt_id(),
+ "GuardFieldLengthInstr: field state changed while compiling");
}
ASSERT(!compiler->is_optimizing());
return; // Nothing to emit.
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index 7afb021..2fec757 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -1500,10 +1500,10 @@
math_lib.LookupClassAllowPrivate(Symbols::_Random()));
ASSERT(!random_class.IsNull());
const Field& state_field = Field::ZoneHandle(
- random_class.LookupInstanceField(Symbols::_state()));
+ random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
ASSERT(!state_field.IsNull());
const Field& random_A_field = Field::ZoneHandle(
- random_class.LookupStaticField(Symbols::_A()));
+ random_class.LookupStaticFieldAllowPrivate(Symbols::_A()));
ASSERT(!random_A_field.IsNull());
ASSERT(random_A_field.is_const());
const Instance& a_value = Instance::Handle(random_A_field.StaticValue());
diff --git a/runtime/vm/intrinsifier_arm64.cc b/runtime/vm/intrinsifier_arm64.cc
index e4e5b11..fd0c053 100644
--- a/runtime/vm/intrinsifier_arm64.cc
+++ b/runtime/vm/intrinsifier_arm64.cc
@@ -1582,10 +1582,10 @@
math_lib.LookupClassAllowPrivate(Symbols::_Random()));
ASSERT(!random_class.IsNull());
const Field& state_field = Field::ZoneHandle(
- random_class.LookupInstanceField(Symbols::_state()));
+ random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
ASSERT(!state_field.IsNull());
const Field& random_A_field = Field::ZoneHandle(
- random_class.LookupStaticField(Symbols::_A()));
+ random_class.LookupStaticFieldAllowPrivate(Symbols::_A()));
ASSERT(!random_A_field.IsNull());
ASSERT(random_A_field.is_const());
const Instance& a_value = Instance::Handle(random_A_field.StaticValue());
diff --git a/runtime/vm/intrinsifier_ia32.cc b/runtime/vm/intrinsifier_ia32.cc
index 3c4a470..fc1f3be 100644
--- a/runtime/vm/intrinsifier_ia32.cc
+++ b/runtime/vm/intrinsifier_ia32.cc
@@ -1641,10 +1641,10 @@
math_lib.LookupClassAllowPrivate(Symbols::_Random()));
ASSERT(!random_class.IsNull());
const Field& state_field = Field::ZoneHandle(
- random_class.LookupInstanceField(Symbols::_state()));
+ random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
ASSERT(!state_field.IsNull());
const Field& random_A_field = Field::ZoneHandle(
- random_class.LookupStaticField(Symbols::_A()));
+ random_class.LookupStaticFieldAllowPrivate(Symbols::_A()));
ASSERT(!random_A_field.IsNull());
ASSERT(random_A_field.is_const());
const Instance& a_value = Instance::Handle(random_A_field.StaticValue());
diff --git a/runtime/vm/intrinsifier_mips.cc b/runtime/vm/intrinsifier_mips.cc
index 63b7755..2c13390 100644
--- a/runtime/vm/intrinsifier_mips.cc
+++ b/runtime/vm/intrinsifier_mips.cc
@@ -1602,10 +1602,10 @@
math_lib.LookupClassAllowPrivate(Symbols::_Random()));
ASSERT(!random_class.IsNull());
const Field& state_field = Field::ZoneHandle(
- random_class.LookupInstanceField(Symbols::_state()));
+ random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
ASSERT(!state_field.IsNull());
const Field& random_A_field = Field::ZoneHandle(
- random_class.LookupStaticField(Symbols::_A()));
+ random_class.LookupStaticFieldAllowPrivate(Symbols::_A()));
ASSERT(!random_A_field.IsNull());
ASSERT(random_A_field.is_const());
const Instance& a_value = Instance::Handle(random_A_field.StaticValue());
diff --git a/runtime/vm/intrinsifier_x64.cc b/runtime/vm/intrinsifier_x64.cc
index c3954fd..66bc4c2 100644
--- a/runtime/vm/intrinsifier_x64.cc
+++ b/runtime/vm/intrinsifier_x64.cc
@@ -1493,10 +1493,10 @@
math_lib.LookupClassAllowPrivate(Symbols::_Random()));
ASSERT(!random_class.IsNull());
const Field& state_field = Field::ZoneHandle(
- random_class.LookupInstanceField(Symbols::_state()));
+ random_class.LookupInstanceFieldAllowPrivate(Symbols::_state()));
ASSERT(!state_field.IsNull());
const Field& random_A_field = Field::ZoneHandle(
- random_class.LookupStaticField(Symbols::_A()));
+ random_class.LookupStaticFieldAllowPrivate(Symbols::_A()));
ASSERT(!random_A_field.IsNull());
ASSERT(random_A_field.is_const());
const Instance& a_value = Instance::Handle(random_A_field.StaticValue());
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 03b275e..51e0c7e 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -12,7 +12,6 @@
#include "vm/code_observers.h"
#include "vm/compiler.h"
#include "vm/compiler_stats.h"
-#include "vm/coverage.h"
#include "vm/dart_api_message.h"
#include "vm/dart_api_state.h"
#include "vm/dart_entry.h"
@@ -796,8 +795,9 @@
field_invalidation_gen_(kInvalidGen),
loading_invalidation_gen_(kInvalidGen),
top_level_parsing_count_(0),
- boxed_field_list_mutex_(new Mutex()),
+ field_list_mutex_(new Mutex()),
boxed_field_list_(GrowableObjectArray::null()),
+ disabling_field_list_(GrowableObjectArray::null()),
spawn_count_monitor_(new Monitor()),
spawn_count_(0) {
NOT_IN_PRODUCT(FlagsCopyFrom(api_flags));
@@ -841,8 +841,8 @@
object_id_ring_ = NULL;
delete pause_loop_monitor_;
pause_loop_monitor_ = NULL;
- delete boxed_field_list_mutex_;
- boxed_field_list_mutex_ = NULL;
+ delete field_list_mutex_;
+ field_list_mutex_ = NULL;
ASSERT(spawn_count_ == 0);
delete spawn_count_monitor_;
delete safepoint_handler_;
@@ -1527,7 +1527,7 @@
void Isolate::StopBackgroundCompiler() {
// Wait until all background compilation has finished.
if (background_compiler_ != NULL) {
- BackgroundCompiler::Stop(background_compiler_);
+ BackgroundCompiler::Stop(this);
}
}
@@ -1554,12 +1554,6 @@
StackZone stack_zone(thread);
HandleScope handle_scope(thread);
- // Write out the coverage data if collection has been enabled.
- if ((this != Dart::vm_isolate()) &&
- !ServiceIsolate::IsServiceIsolateDescendant(this)) {
- CodeCoverage::Write(thread);
- }
-
// Write compiler stats data if enabled.
if (FLAG_support_compiler_stats && FLAG_compiler_stats
&& !ServiceIsolate::IsServiceIsolateDescendant(this)
@@ -1660,12 +1654,18 @@
visitor->VisitPointer(
reinterpret_cast<RawObject**>(®istered_service_extension_handlers_));
- // Visit the boxed_field_list.
+ // Visit the boxed_field_list_.
// 'boxed_field_list_' access via mutator and background compilation threads
// is guarded with a monitor. This means that we can visit it only
- // when at safepoint or the boxed_field_list_mutex_ lock has been taken.
+ // when at safepoint or the field_list_mutex_ lock has been taken.
visitor->VisitPointer(reinterpret_cast<RawObject**>(&boxed_field_list_));
+ // Visit the disabling_field_list.
+ // 'disabling_field_list_' access via mutator and background compilation
+ // threads is guarded with a monitor. This means that we can visit it only
+ // when at safepoint or the field_list_mutex_ lock has been taken.
+ visitor->VisitPointer(reinterpret_cast<RawObject**>(&disabling_field_list_));
+
// Visit objects in the debugger.
if (FLAG_support_debugger) {
debugger()->VisitObjectPointers(visitor);
@@ -1784,6 +1784,10 @@
Error& error = Error::Handle(Thread::Current()->sticky_error());
ASSERT(!error.IsNull());
jsobj.AddProperty("error", error, false);
+ } else if (sticky_error() != Object::null()) {
+ Error& error = Error::Handle(sticky_error());
+ ASSERT(!error.IsNull());
+ jsobj.AddProperty("error", error, false);
}
{
@@ -1886,11 +1890,56 @@
}
+// Used by mutator thread to notify background compiler which fields
+// triggered code invalidation.
+void Isolate::AddDisablingField(const Field& field) {
+ ASSERT(Thread::Current()->IsMutatorThread());
+ SafepointMutexLocker ml(field_list_mutex_);
+ if (disabling_field_list_ == GrowableObjectArray::null()) {
+ disabling_field_list_ = GrowableObjectArray::New(Heap::kOld);
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(disabling_field_list_);
+ array.Add(field, Heap::kOld);
+}
+
+
+RawField* Isolate::GetDisablingField() {
+ ASSERT(Compiler::IsBackgroundCompilation() &&
+ (!Isolate::Current()->HasMutatorThread() ||
+ Isolate::Current()->mutator_thread()->IsAtSafepoint()));
+ ASSERT(Thread::Current()->IsAtSafepoint());
+ if (disabling_field_list_ == GrowableObjectArray::null()) {
+ return Field::null();
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(disabling_field_list_);
+ if (array.Length() == 0) {
+ return Field::null();
+ }
+ return Field::RawCast(array.RemoveLast());
+}
+
+
+void Isolate::ClearDisablingFieldList() {
+ MutexLocker ml(field_list_mutex_);
+ if (disabling_field_list_ == GrowableObjectArray::null()) {
+ return;
+ }
+ const GrowableObjectArray& array =
+ GrowableObjectArray::Handle(disabling_field_list_);
+ if (array.Length() > 0) {
+ array.SetLength(0);
+ }
+}
+
+
void Isolate::AddDeoptimizingBoxedField(const Field& field) {
+ ASSERT(Compiler::IsBackgroundCompilation());
ASSERT(field.IsOriginal());
// The enclosed code allocates objects and can potentially trigger a GC,
// ensure that we account for safepoints when grabbing the lock.
- SafepointMutexLocker ml(boxed_field_list_mutex_);
+ SafepointMutexLocker ml(field_list_mutex_);
if (boxed_field_list_ == GrowableObjectArray::null()) {
boxed_field_list_ = GrowableObjectArray::New(Heap::kOld);
}
@@ -1901,7 +1950,8 @@
RawField* Isolate::GetDeoptimizingBoxedField() {
- MutexLocker ml(boxed_field_list_mutex_);
+ ASSERT(Thread::Current()->IsMutatorThread());
+ MutexLocker ml(field_list_mutex_);
if (boxed_field_list_ == GrowableObjectArray::null()) {
return Field::null();
}
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index e1564da..3250082 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -522,6 +522,14 @@
return AtomicOperations::LoadRelaxedIntPtr(&loading_invalidation_gen_);
}
+ // Used by mutator thread to notify background compiler which fields
+ // triggered code invalidation.
+ void AddDisablingField(const Field& field);
+ // Returns Field::null() if none available in the list. Can be called
+ // only from background compiler and while mutator thread is at safepoint.
+ RawField* GetDisablingField();
+ void ClearDisablingFieldList();
+
// Used by background compiler which field became boxed and must trigger
// deoptimization in the mutator thread.
void AddDeoptimizingBoxedField(const Field& field);
@@ -744,10 +752,13 @@
intptr_t loading_invalidation_gen_;
intptr_t top_level_parsing_count_;
- // Protect access to boxed_field_list_.
- Mutex* boxed_field_list_mutex_;
+ // Protect access to boxed_field_list_ and disabling_field_list_.
+ Mutex* field_list_mutex_;
// List of fields that became boxed and that trigger deoptimization.
RawGrowableObjectArray* boxed_field_list_;
+ // List of fields that were disabling code while background compiler
+ // was running.
+ RawGrowableObjectArray* disabling_field_list_;
// This guards spawn_count_. An isolate cannot complete shutdown and be
// destroyed while there are child isolates in the midst of a spawn.
diff --git a/runtime/vm/jit_optimizer.cc b/runtime/vm/jit_optimizer.cc
index 8a632f1..8a22c85 100644
--- a/runtime/vm/jit_optimizer.cc
+++ b/runtime/vm/jit_optimizer.cc
@@ -96,6 +96,7 @@
// to megamorphic call.
return false;
}
+
GrowableArray<intptr_t> class_ids(call->ic_data()->NumArgsTested());
ASSERT(call->ic_data()->NumArgsTested() <= call->ArgumentCount());
for (intptr_t i = 0; i < call->ic_data()->NumArgsTested(); i++) {
@@ -249,10 +250,12 @@
}
const bool with_checks = false;
+ const bool complete = false;
PolymorphicInstanceCallInstr* specialized =
new(Z) PolymorphicInstanceCallInstr(call->instance_call(),
ic_data,
- with_checks);
+ with_checks,
+ complete);
call->ReplaceWith(specialized, current_iterator());
}
@@ -2755,7 +2758,8 @@
if (!flow_graph()->InstanceCallNeedsClassCheck(instr, function_kind)) {
PolymorphicInstanceCallInstr* call =
new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
- /* call_with_checks = */ false);
+ /* call_with_checks = */ false,
+ /* complete = */ false);
instr->ReplaceWith(call, current_iterator());
return;
}
@@ -2774,7 +2778,8 @@
}
PolymorphicInstanceCallInstr* call =
new(Z) PolymorphicInstanceCallInstr(instr, unary_checks,
- call_with_checks);
+ call_with_checks,
+ /* complete = */ false);
instr->ReplaceWith(call, current_iterator());
}
}
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 4f9f8d0..2ce486b 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -60,11 +60,11 @@
DEFINE_FLAG(bool, ignore_patch_signature_mismatch, false,
"Ignore patch file member signature mismatch.");
-DECLARE_FLAG(charp, coverage_dir);
DECLARE_FLAG(bool, show_invisible_frames);
DECLARE_FLAG(bool, trace_deoptimization);
DECLARE_FLAG(bool, trace_deoptimization_verbose);
DECLARE_FLAG(bool, write_protect_code);
+DECLARE_FLAG(bool, support_externalizable_strings);
static const char* const kGetterPrefix = "get:";
@@ -215,7 +215,8 @@
// _MyClass@6328321.named -> _MyClass.named
//
RawString* String::ScrubName(const String& name) {
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
NOT_IN_PRODUCT(
if (name.Equals(Symbols::TopLevel())) {
@@ -299,7 +300,7 @@
if ((start == 0) && (dot_pos == -1)) {
// This unmangled_name is fine as it is.
- return Symbols::New(unmangled_name, sum_segment_len);
+ return Symbols::New(thread, unmangled_name, sum_segment_len);
}
// Drop the trailing dot if needed.
@@ -318,7 +319,7 @@
unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len);
)
- return Symbols::New(unmangled_name);
+ return Symbols::New(thread, unmangled_name);
}
@@ -1521,7 +1522,7 @@
type = Type::NewNonParameterizedType(cls);
object_store->set_double_type(type);
- name = Symbols::New("String");
+ name = Symbols::_String().raw();
cls = Class::New<Instance>(kIllegalCid);
RegisterClass(cls, name, core_lib);
cls.set_num_type_arguments(0);
@@ -1586,9 +1587,9 @@
CLASS_LIST_NO_OBJECT(V)
#define ADD_SET_FIELD(clazz) \
- field_name = Symbols::New("cid"#clazz); \
+ field_name = Symbols::New(thread, "cid"#clazz); \
field = Field::New(field_name, true, false, true, false, cls, \
- Type::Handle(Type::IntType()), TokenPosition::kMinSource); \
+ Type::Handle(Type::IntType()), TokenPosition::kMinSource); \
value = Smi::New(k##clazz##Cid); \
field.SetStaticValue(value, true); \
cls.AddField(field); \
@@ -2087,6 +2088,8 @@
// Traits for looking up Functions by name.
class ClassFunctionsTraits {
public:
+ static const char* Name() { return "ClassFunctionsTraits"; }
+
// Called when growing the table.
static bool IsMatch(const Object& a, const Object& b) {
ASSERT(a.IsFunction() && b.IsFunction());
@@ -2570,8 +2573,10 @@
RawFunction* Class::CreateInvocationDispatcher(const String& target_name,
const Array& args_desc,
RawFunction::Kind kind) const {
- Function& invocation = Function::Handle(
- Function::New(String::Handle(Symbols::New(target_name)),
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ Function& invocation = Function::Handle(zone,
+ Function::New(String::Handle(zone, Symbols::New(thread, target_name)),
kind,
false, // Not static.
false, // Not const.
@@ -2584,10 +2589,10 @@
invocation.set_num_fixed_parameters(desc.PositionalCount());
invocation.SetNumOptionalParameters(desc.NamedCount(),
false); // Not positional.
- invocation.set_parameter_types(Array::Handle(Array::New(desc.Count(),
- Heap::kOld)));
- invocation.set_parameter_names(Array::Handle(Array::New(desc.Count(),
- Heap::kOld)));
+ invocation.set_parameter_types(Array::Handle(zone, Array::New(desc.Count(),
+ Heap::kOld)));
+ invocation.set_parameter_names(Array::Handle(zone, Array::New(desc.Count(),
+ Heap::kOld)));
// Receiver.
invocation.SetParameterTypeAt(0, Object::dynamic_type());
invocation.SetParameterNameAt(0, Symbols::This());
@@ -2597,14 +2602,15 @@
invocation.SetParameterTypeAt(i, Object::dynamic_type());
char name[64];
OS::SNPrint(name, 64, ":p%" Pd, i);
- invocation.SetParameterNameAt(i, String::Handle(Symbols::New(name)));
+ invocation.SetParameterNameAt(i, String::Handle(zone,
+ Symbols::New(thread, name)));
}
// Named parameters.
for (; i < desc.Count(); i++) {
invocation.SetParameterTypeAt(i, Object::dynamic_type());
intptr_t index = i - desc.PositionalCount();
- invocation.SetParameterNameAt(i, String::Handle(desc.NameAt(index)));
+ invocation.SetParameterNameAt(i, String::Handle(zone, desc.NameAt(index)));
}
invocation.set_result_type(Object::dynamic_type());
invocation.set_is_debuggable(false);
@@ -2622,13 +2628,15 @@
// is created and injected as a getter (under the name get:M) into the class
// owning method M.
RawFunction* Function::CreateMethodExtractor(const String& getter_name) const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
ASSERT(Field::IsGetterName(getter_name));
const Function& closure_function =
- Function::Handle(ImplicitClosureFunction());
+ Function::Handle(zone, ImplicitClosureFunction());
- const Class& owner = Class::Handle(closure_function.Owner());
- Function& extractor = Function::Handle(
- Function::New(String::Handle(Symbols::New(getter_name)),
+ const Class& owner = Class::Handle(zone, closure_function.Owner());
+ Function& extractor = Function::Handle(zone,
+ Function::New(String::Handle(zone, Symbols::New(thread, getter_name)),
RawFunction::kMethodExtractor,
false, // Not static.
false, // Not const.
@@ -4161,26 +4169,80 @@
ASSERT(!flds.IsNull());
intptr_t len = flds.Length();
Field& field = thread->FieldHandle();
+ if (name.IsSymbol()) {
+ // Use fast raw pointer string compare for symbols.
+ for (intptr_t i = 0; i < len; i++) {
+ field ^= flds.At(i);
+ if (name.raw() == field.name()) {
+ if (kind == kInstance) {
+ return field.is_static() ? Field::null() : field.raw();
+ } else if (kind == kStatic) {
+ return field.is_static() ? field.raw() : Field::null();
+ }
+ ASSERT(kind == kAny);
+ return field.raw();
+ }
+ }
+ } else {
+ String& field_name = thread->StringHandle();
+ for (intptr_t i = 0; i < len; i++) {
+ field ^= flds.At(i);
+ field_name ^= field.name();
+ if (name.Equals(field_name)) {
+ if (kind == kInstance) {
+ return field.is_static() ? Field::null() : field.raw();
+ } else if (kind == kStatic) {
+ return field.is_static() ? field.raw() : Field::null();
+ }
+ ASSERT(kind == kAny);
+ return field.raw();
+ }
+ }
+ }
+ return Field::null();
+}
+
+
+RawField* Class::LookupFieldAllowPrivate(const String& name) const {
+ // Use slow string compare, ignoring privacy name mangling.
+ Thread* thread = Thread::Current();
+ if (EnsureIsFinalized(thread) != Error::null()) {
+ return Field::null();
+ }
+ REUSABLE_ARRAY_HANDLESCOPE(thread);
+ REUSABLE_FIELD_HANDLESCOPE(thread);
+ REUSABLE_STRING_HANDLESCOPE(thread);
+ Array& flds = thread->ArrayHandle();
+ flds ^= fields();
+ ASSERT(!flds.IsNull());
+ intptr_t len = flds.Length();
+ Field& field = thread->FieldHandle();
String& field_name = thread->StringHandle();
for (intptr_t i = 0; i < len; i++) {
field ^= flds.At(i);
field_name ^= field.name();
if (String::EqualsIgnoringPrivateKey(field_name, name)) {
- if (kind == kInstance) {
- if (!field.is_static()) {
- return field.raw();
- }
- } else if (kind == kStatic) {
- if (field.is_static()) {
- return field.raw();
- }
- } else if (kind == kAny) {
- return field.raw();
- }
- return Field::null();
+ return field.raw();
}
}
- // No field found.
+ return Field::null();
+}
+
+
+RawField* Class::LookupInstanceFieldAllowPrivate(const String& name) const {
+ Field& field = Field::Handle(LookupFieldAllowPrivate(name));
+ if (!field.IsNull() && !field.is_static()) {
+ return field.raw();
+ }
+ return Field::null();
+}
+
+
+RawField* Class::LookupStaticFieldAllowPrivate(const String& name) const {
+ Field& field = Field::Handle(LookupFieldAllowPrivate(name));
+ if (!field.IsNull() && field.is_static()) {
+ return field.raw();
+ }
return Field::null();
}
@@ -4399,6 +4461,21 @@
}
+void Class::InsertCanonicalNumber(Zone* zone,
+ intptr_t index,
+ const Number& constant) const {
+ // The constant needs to be added to the list. Grow the list if it is full.
+ Array& canonical_list = Array::Handle(zone, constants());
+ const intptr_t list_len = canonical_list.Length();
+ if (index >= list_len) {
+ const intptr_t new_length = (list_len == 0) ? 4 : list_len + 4;
+ canonical_list ^= Array::Grow(canonical_list, new_length, Heap::kOld);
+ set_constants(canonical_list);
+ }
+ canonical_list.SetAt(index, constant);
+}
+
+
RawUnresolvedClass* UnresolvedClass::New(const LibraryPrefix& library_prefix,
const String& ident,
TokenPosition token_pos) {
@@ -4438,15 +4515,16 @@
RawString* UnresolvedClass::Name() const {
if (library_prefix() != LibraryPrefix::null()) {
- const LibraryPrefix& lib_prefix = LibraryPrefix::Handle(library_prefix());
- String& name = String::Handle();
- name = lib_prefix.name(); // Qualifier.
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const LibraryPrefix& lib_prefix = LibraryPrefix::Handle(zone,
+ library_prefix());
+ const String& name = String::Handle(zone, lib_prefix.name()); // Qualifier.
GrowableHandlePtrArray<const String> strs(zone, 3);
strs.Add(name);
strs.Add(Symbols::Dot());
strs.Add(String::Handle(zone, ident()));
- return Symbols::FromConcatAll(strs);
+ return Symbols::FromConcatAll(thread, strs);
} else {
return ident();
}
@@ -4495,13 +4573,14 @@
RawString* TypeArguments::SubvectorName(intptr_t from_index,
intptr_t len,
NameVisibility name_visibility) const {
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
ASSERT(from_index + len <= Length());
String& name = String::Handle(zone);
const intptr_t num_strings = (len == 0) ? 2 : 2*len + 1; // "<""T"", ""T"">".
GrowableHandlePtrArray<const String> pieces(zone, num_strings);
pieces.Add(Symbols::LAngleBracket());
- AbstractType& type = AbstractType::Handle();
+ AbstractType& type = AbstractType::Handle(zone);
for (intptr_t i = 0; i < len; i++) {
type = TypeAt(from_index + i);
name = type.BuildName(name_visibility);
@@ -4512,7 +4591,7 @@
}
pieces.Add(Symbols::RAngleBracket());
ASSERT(pieces.length() == num_strings);
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -5170,15 +5249,16 @@
if (IsNull()) {
return Symbols::Empty().raw();
}
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
AbstractType& type = AbstractType::Handle(zone);
const intptr_t num_types = Length();
- GrowableHandlePtrArray<const String> pieces(zone, num_types);
+ const Array& pieces = Array::Handle(zone, Array::New(num_types));
for (intptr_t i = 0; i < num_types; i++) {
type = TypeAt(i);
- pieces.Add(String::Handle(zone, type.EnumerateURIs()));
+ pieces.SetAt(i, String::Handle(zone, type.EnumerateURIs()));
}
- return Symbols::FromConcatAll(pieces);
+ return String::ConcatAll(pieces);
}
@@ -5871,10 +5951,6 @@
bool Function::IsOptimizable() const {
- if (FLAG_coverage_dir != NULL) {
- // Do not optimize if collecting coverage data.
- return false;
- }
if (is_native()) {
// Native methods don't need to be optimized.
return false;
@@ -6593,8 +6669,10 @@
RawFunction* Function::NewEvalFunction(const Class& owner,
const Script& script,
bool is_static) {
- const Function& result = Function::Handle(
- Function::New(String::Handle(Symbols::New(":Eval")),
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const Function& result = Function::Handle(zone,
+ Function::New(String::Handle(Symbols::New(thread, ":Eval")),
RawFunction::kRegularFunction,
is_static,
/* is_const = */ false,
@@ -6690,23 +6768,25 @@
RawString* Function::UserVisibleFormalParameters() const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
// Typically 3, 5,.. elements in 'pieces', e.g.:
// '_LoadRequest', CommaSpace, '_LoadError'.
- GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 5);
- const TypeArguments& instantiator = TypeArguments::Handle();
- BuildSignatureParameters(false, kUserVisibleName, instantiator, &pieces);
- return Symbols::FromConcatAll(pieces);
+ GrowableHandlePtrArray<const String> pieces(zone, 5);
+ const TypeArguments& instantiator = TypeArguments::Handle(zone);
+ BuildSignatureParameters(thread, zone,
+ false, kUserVisibleName, instantiator, &pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
void Function::BuildSignatureParameters(
+ Thread* thread,
+ Zone* zone,
bool instantiate,
NameVisibility name_visibility,
const TypeArguments& instantiator,
GrowableHandlePtrArray<const String>* pieces) const {
- Thread* thread = Thread::Current();
- Zone* zone = thread->zone();
-
AbstractType& param_type = AbstractType::Handle(zone);
const intptr_t num_params = NumParameters();
const intptr_t num_fixed_params = num_fixed_parameters();
@@ -6846,7 +6926,8 @@
}
}
pieces.Add(Symbols::LParen());
- BuildSignatureParameters(instantiate,
+ BuildSignatureParameters(thread, zone,
+ instantiate,
name_visibility,
instantiator,
&pieces);
@@ -6858,7 +6939,7 @@
}
name = res_type.BuildName(name_visibility);
pieces.Add(name);
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -7282,12 +7363,12 @@
RawString* Field::GetterSymbol(const String& field_name) {
- return Symbols::FromConcat(Symbols::GetterPrefix(), field_name);
+ return Symbols::FromGet(Thread::Current(), field_name);
}
RawString* Field::LookupGetterSymbol(const String& field_name) {
- return Symbols::LookupFromConcat(Symbols::GetterPrefix(), field_name);
+ return Symbols::LookupFromGet(Thread::Current(), field_name);
}
@@ -7297,23 +7378,23 @@
RawString* Field::SetterSymbol(const String& field_name) {
- return Symbols::FromConcat(Symbols::SetterPrefix(), field_name);
+ return Symbols::FromSet(Thread::Current(), field_name);
}
RawString* Field::LookupSetterSymbol(const String& field_name) {
- return Symbols::LookupFromConcat(Symbols::SetterPrefix(), field_name);
+ return Symbols::LookupFromSet(Thread::Current(), field_name);
}
RawString* Field::NameFromGetter(const String& getter_name) {
- return Symbols::New(getter_name, kGetterPrefixLength,
+ return Symbols::New(Thread::Current(), getter_name, kGetterPrefixLength,
getter_name.Length() - kGetterPrefixLength);
}
RawString* Field::NameFromSetter(const String& setter_name) {
- return Symbols::New(setter_name, kSetterPrefixLength,
+ return Symbols::New(Thread::Current(), setter_name, kSetterPrefixLength,
setter_name.Length() - kSetterPrefixLength);
}
@@ -7556,21 +7637,24 @@
// field f and cache the closure in a newly created static field
// named #f (or #f= in case of a setter).
RawInstance* Field::AccessorClosure(bool make_setter) const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
ASSERT(is_static());
- const Class& field_owner = Class::Handle(Owner());
+ const Class& field_owner = Class::Handle(zone, Owner());
- String& closure_name = String::Handle(this->name());
- closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name);
+ String& closure_name = String::Handle(zone, this->name());
+ closure_name = Symbols::FromConcat(thread, Symbols::HashMark(), closure_name);
if (make_setter) {
- closure_name = Symbols::FromConcat(Symbols::HashMark(), closure_name);
+ closure_name = Symbols::FromConcat(thread,
+ Symbols::HashMark(), closure_name);
}
- Field& closure_field = Field::Handle();
+ Field& closure_field = Field::Handle(zone);
closure_field = field_owner.LookupStaticField(closure_name);
if (!closure_field.IsNull()) {
ASSERT(closure_field.is_static());
- const Instance& closure =
- Instance::Handle(closure_field.StaticValue());
+ const Instance& closure = Instance::Handle(zone,
+ closure_field.StaticValue());
ASSERT(!closure.IsNull());
ASSERT(closure.IsClosure());
return closure.raw();
@@ -7578,8 +7662,8 @@
// This is the first time a closure for this field is requested.
// Create the closure and a new static field in which it is stored.
- const char* field_name = String::Handle(name()).ToCString();
- String& expr_src = String::Handle();
+ const char* field_name = String::Handle(zone, name()).ToCString();
+ String& expr_src = String::Handle(zone);
if (make_setter) {
expr_src =
String::NewFormatted("(%s_) { return %s = %s_; }",
@@ -7587,10 +7671,10 @@
} else {
expr_src = String::NewFormatted("() { return %s; }", field_name);
}
- Object& result =
- Object::Handle(field_owner.Evaluate(expr_src,
- Object::empty_array(),
- Object::empty_array()));
+ Object& result = Object::Handle(zone,
+ field_owner.Evaluate(expr_src,
+ Object::empty_array(),
+ Object::empty_array()));
ASSERT(result.IsInstance());
// The caller may expect the closure to be allocated in old space. Copy
// the result here, since Object::Clone() is a private method.
@@ -7680,8 +7764,11 @@
void Field::DeoptimizeDependentCode() const {
- ASSERT(IsOriginal());
ASSERT(Thread::Current()->IsMutatorThread());
+ ASSERT(IsOriginal());
+ if (FLAG_background_compilation) {
+ Isolate::Current()->AddDisablingField(*this);
+ }
FieldDependentArray a(*this);
a.DisableCode();
}
@@ -7815,6 +7902,15 @@
}
+bool Field::IsExternalizableCid(intptr_t cid) {
+ if (FLAG_support_externalizable_strings) {
+ return (cid == kOneByteStringCid) || (cid == kTwoByteStringCid);
+ } else {
+ return false;
+ }
+}
+
+
void Field::InitializeGuardedListLengthInObjectOffset() const {
ASSERT(IsOriginal());
if (needs_length_check() &&
@@ -8236,6 +8332,8 @@
// It also supports lookup by TokenDescriptor.
class CompressedTokenTraits {
public:
+ static const char* Name() { return "CompressedTokenTraits"; }
+
static bool IsMatch(const Scanner::TokenDescriptor& descriptor,
const Object& key) {
if (!key.IsLiteralToken()) {
@@ -8580,10 +8678,7 @@
Token::Kind kind = static_cast<Token::Kind>(
Smi::Value(reinterpret_cast<RawSmi*>(obj.raw())));
ASSERT(kind < Token::kNumTokens);
- if (Token::IsPseudoKeyword(kind) || Token::IsKeyword(kind)) {
- return Symbols::Keyword(kind).raw();
- }
- return Symbols::New(Token::Str(kind));
+ return Symbols::Token(kind).raw();
} else {
ASSERT(obj.IsLiteralToken()); // Must be a literal token.
const LiteralToken& literal_token = LiteralToken::Cast(obj);
@@ -8980,8 +9075,10 @@
RawScript* Script::New(const String& url,
const String& source,
RawScript::Kind kind) {
- const Script& result = Script::Handle(Script::New());
- result.set_url(String::Handle(Symbols::New(url)));
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const Script& result = Script::Handle(zone, Script::New());
+ result.set_url(String::Handle(zone, Symbols::New(thread, url)));
result.set_source(source);
result.set_kind(kind);
result.SetLocationOffset(0, 0);
@@ -8998,10 +9095,10 @@
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
Isolate* isolate = thread->isolate();
- const GrowableObjectArray& libs = GrowableObjectArray::Handle(
- zone, isolate->object_store()->libraries());
- Library& lib = Library::Handle();
- Array& scripts = Array::Handle();
+ const GrowableObjectArray& libs = GrowableObjectArray::Handle(zone,
+ isolate->object_store()->libraries());
+ Library& lib = Library::Handle(zone);
+ Array& scripts = Array::Handle(zone);
for (intptr_t i = 0; i < libs.Length(); i++) {
lib ^= libs.At(i);
scripts = lib.LoadedScripts();
@@ -9165,6 +9262,8 @@
// Traits for looking up Libraries by url in a hash set.
class LibraryUrlTraits {
public:
+ static const char* Name() { return "LibraryUrlTraits"; }
+
// Called when growing the table.
static bool IsMatch(const Object& a, const Object& b) {
ASSERT(a.IsLibrary() && b.IsLibrary());
@@ -9256,49 +9355,57 @@
}
-static RawString* MakeClassMetaName(const Class& cls) {
- return Symbols::FromConcat(Symbols::At(), String::Handle(cls.Name()));
+static RawString* MakeClassMetaName(Thread* thread, Zone* zone,
+ const Class& cls) {
+ return Symbols::FromConcat(thread,
+ Symbols::At(), String::Handle(zone, cls.Name()));
}
-static RawString* MakeFieldMetaName(const Field& field) {
- const String& cname =
- String::Handle(MakeClassMetaName(Class::Handle(field.Origin())));
- GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3);
+static RawString* MakeFieldMetaName(Thread* thread, Zone* zone,
+ const Field& field) {
+ const String& cname = String::Handle(zone,
+ MakeClassMetaName(thread, zone, Class::Handle(zone, field.Origin())));
+ GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(cname);
pieces.Add(Symbols::At());
pieces.Add(String::Handle(field.name()));
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
-static RawString* MakeFunctionMetaName(const Function& func) {
- const String& cname =
- String::Handle(MakeClassMetaName(Class::Handle(func.origin())));
- GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3);
+static RawString* MakeFunctionMetaName(Thread* thread, Zone* zone,
+ const Function& func) {
+ const String& cname = String::Handle(zone,
+ MakeClassMetaName(thread, zone, Class::Handle(zone, func.origin())));
+ GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(cname);
pieces.Add(Symbols::At());
pieces.Add(String::Handle(func.QualifiedScrubbedName()));
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
-static RawString* MakeTypeParameterMetaName(const TypeParameter& param) {
- const String& cname = String::Handle(
- MakeClassMetaName(Class::Handle(param.parameterized_class())));
- GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3);
+static RawString* MakeTypeParameterMetaName(Thread* thread, Zone* zone,
+ const TypeParameter& param) {
+ const String& cname = String::Handle(zone,
+ MakeClassMetaName(thread, zone,
+ Class::Handle(zone, param.parameterized_class())));
+ GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(cname);
pieces.Add(Symbols::At());
pieces.Add(String::Handle(param.name()));
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
void Library::AddMetadata(const Object& owner,
const String& name,
TokenPosition token_pos) const {
- const String& metaname = String::Handle(Symbols::New(name));
- const Field& field = Field::Handle(
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const String& metaname = String::Handle(zone, Symbols::New(thread, name));
+ const Field& field = Field::Handle(zone,
Field::NewTopLevel(metaname,
false, // is_final
false, // is_const
@@ -9308,7 +9415,7 @@
field.set_is_reflectable(false);
field.SetStaticValue(Array::empty_array(), true);
GrowableObjectArray& metadata =
- GrowableObjectArray::Handle(this->metadata());
+ GrowableObjectArray::Handle(zone, this->metadata());
metadata.Add(field, Heap::kOld);
}
@@ -9316,34 +9423,43 @@
void Library::AddClassMetadata(const Class& cls,
const Object& tl_owner,
TokenPosition token_pos) const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
// We use the toplevel class as the owner of a class's metadata field because
// a class's metadata is in scope of the library, not the class.
AddMetadata(tl_owner,
- String::Handle(MakeClassMetaName(cls)),
+ String::Handle(zone, MakeClassMetaName(thread, zone, cls)),
token_pos);
}
void Library::AddFieldMetadata(const Field& field,
TokenPosition token_pos) const {
- AddMetadata(Object::Handle(field.RawOwner()),
- String::Handle(MakeFieldMetaName(field)),
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ AddMetadata(Object::Handle(zone, field.RawOwner()),
+ String::Handle(zone, MakeFieldMetaName(thread, zone, field)),
token_pos);
}
void Library::AddFunctionMetadata(const Function& func,
TokenPosition token_pos) const {
- AddMetadata(Object::Handle(func.RawOwner()),
- String::Handle(MakeFunctionMetaName(func)),
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ AddMetadata(Object::Handle(zone, func.RawOwner()),
+ String::Handle(zone, MakeFunctionMetaName(thread, zone, func)),
token_pos);
}
void Library::AddTypeParameterMetadata(const TypeParameter& param,
TokenPosition token_pos) const {
- AddMetadata(Class::Handle(param.parameterized_class()),
- String::Handle(MakeTypeParameterMetaName(param)),
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ AddMetadata(Class::Handle(zone, param.parameterized_class()),
+ String::Handle(zone,
+ MakeTypeParameterMetaName(thread, zone, param)),
token_pos);
}
@@ -9355,16 +9471,18 @@
RawString* Library::MakeMetadataName(const Object& obj) const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
if (obj.IsClass()) {
- return MakeClassMetaName(Class::Cast(obj));
+ return MakeClassMetaName(thread, zone, Class::Cast(obj));
} else if (obj.IsField()) {
- return MakeFieldMetaName(Field::Cast(obj));
+ return MakeFieldMetaName(thread, zone, Field::Cast(obj));
} else if (obj.IsFunction()) {
- return MakeFunctionMetaName(Function::Cast(obj));
+ return MakeFunctionMetaName(thread, zone, Function::Cast(obj));
} else if (obj.IsLibrary()) {
return Symbols::TopLevel().raw();
} else if (obj.IsTypeParameter()) {
- return MakeTypeParameterMetaName(TypeParameter::Cast(obj));
+ return MakeTypeParameterMetaName(thread, zone, TypeParameter::Cast(obj));
}
UNIMPLEMENTED();
return String::null();
@@ -9414,14 +9532,13 @@
static bool ShouldBePrivate(const String& name) {
return
- (name.Length() >= 1 &&
- name.CharAt(0) == '_') ||
+ (name.Length() >= 1 && name.CharAt(0) == '_') ||
(name.Length() >= 5 &&
- (name.CharAt(4) == '_' &&
- (name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
- name.CharAt(1) == 'e' &&
- name.CharAt(2) == 't' &&
- name.CharAt(3) == ':'));
+ (name.CharAt(4) == '_' &&
+ (name.CharAt(0) == 'g' || name.CharAt(0) == 's') &&
+ name.CharAt(1) == 'e' &&
+ name.CharAt(2) == 't' &&
+ name.CharAt(3) == ':'));
}
@@ -9456,6 +9573,8 @@
class StringEqualsTraits {
public:
+ static const char* Name() { return "StringEqualsTraits"; }
+
static bool IsMatch(const Object& a, const Object& b) {
return String::Cast(a).Equals(String::Cast(b));
}
@@ -9487,6 +9606,7 @@
// the name does not resolve to anything in this library scope.
void Library::AddToResolvedNamesCache(const String& name,
const Object& obj) const {
+ ASSERT(!Compiler::IsBackgroundCompilation());
if (!FLAG_use_lib_cache) {
return;
}
@@ -9545,6 +9665,7 @@
void Library::AddObject(const Object& obj, const String& name) const {
+ ASSERT(!Compiler::IsBackgroundCompilation());
ASSERT(obj.IsClass() ||
obj.IsFunction() ||
obj.IsField() ||
@@ -9651,6 +9772,7 @@
void Library::ReplaceObject(const Object& obj, const String& name) const {
+ ASSERT(!Compiler::IsBackgroundCompilation());
ASSERT(obj.IsClass() || obj.IsFunction() || obj.IsField());
ASSERT(LookupLocalObject(name) != Object::null());
@@ -9663,6 +9785,7 @@
bool Library::RemoveObject(const Object& obj, const String& name) const {
+ ASSERT(!Compiler::IsBackgroundCompilation());
Object& entry = Object::Handle();
intptr_t index;
@@ -9708,6 +9831,7 @@
void Library::AddClass(const Class& cls) const {
+ ASSERT(!Compiler::IsBackgroundCompilation());
const String& class_name = String::Handle(cls.Name());
AddObject(cls, class_name);
// Link class to this library.
@@ -9715,6 +9839,7 @@
InvalidateResolvedName(class_name);
}
+
static void AddScriptIfUnique(const GrowableObjectArray& scripts,
const Script& candidate) {
if (candidate.IsNull()) {
@@ -9733,6 +9858,7 @@
scripts.Add(candidate);
}
+
RawArray* Library::LoadedScripts() const {
// We compute the list of loaded scripts lazily. The result is
// cached in loaded_scripts_.
@@ -10228,9 +10354,12 @@
void Library::InitNativeWrappersLibrary(Isolate* isolate) {
static const int kNumNativeWrappersClasses = 4;
- ASSERT(kNumNativeWrappersClasses > 0 && kNumNativeWrappersClasses < 10);
+ COMPILE_ASSERT((kNumNativeWrappersClasses > 0) &&
+ (kNumNativeWrappersClasses < 10));
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
const String& native_flds_lib_url = Symbols::DartNativeWrappers();
- const Library& native_flds_lib = Library::Handle(
+ const Library& native_flds_lib = Library::Handle(zone,
Library::NewLibraryHelper(native_flds_lib_url, false));
const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName();
native_flds_lib.SetName(native_flds_lib_name);
@@ -10242,14 +10371,14 @@
static const int kNameLength = 25;
ASSERT(kNameLength == (strlen(kNativeWrappersClass) + 1 + 1));
char name_buffer[kNameLength];
- String& cls_name = String::Handle();
+ String& cls_name = String::Handle(zone);
for (int fld_cnt = 1; fld_cnt <= kNumNativeWrappersClasses; fld_cnt++) {
OS::SNPrint(name_buffer,
kNameLength,
"%s%d",
kNativeWrappersClass,
fld_cnt);
- cls_name = Symbols::New(name_buffer);
+ cls_name = Symbols::New(thread, name_buffer);
Class::NewNativeWrapper(native_flds_lib, cls_name, fld_cnt);
}
native_flds_lib.SetLoaded();
@@ -10344,11 +10473,14 @@
RawClass* Library::LookupCoreClass(const String& class_name) {
- const Library& core_lib = Library::Handle(Library::CoreLibrary());
- String& name = String::Handle(class_name.raw());
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const Library& core_lib = Library::Handle(zone, Library::CoreLibrary());
+ String& name = String::Handle(zone, class_name.raw());
if (class_name.CharAt(0) == kPrivateIdentifierStart) {
// Private identifiers are mangled on a per library basis.
- name = Symbols::FromConcat(name, String::Handle(core_lib.private_key()));
+ name = Symbols::FromConcat(thread,
+ name, String::Handle(zone, core_lib.private_key()));
}
return core_lib.LookupClass(name);
}
@@ -10357,11 +10489,14 @@
// Cannot handle qualified names properly as it only appends private key to
// the end (e.g. _Alfa.foo -> _Alfa.foo@...).
RawString* Library::PrivateName(const String& name) const {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
ASSERT(IsPrivate(name));
// ASSERT(strchr(name, '@') == NULL);
- String& str = String::Handle();
+ String& str = String::Handle(zone);
str = name.raw();
- str = Symbols::FromConcat(str, String::Handle(this->private_key()));
+ str = Symbols::FromConcat(thread,
+ str, String::Handle(zone, this->private_key()));
return str.raw();
}
@@ -10889,15 +11024,15 @@
if (!Field::IsGetterName(name) &&
!Field::IsSetterName(name) &&
(obj.IsNull() || obj.IsLibraryPrefix())) {
- const String& getter_name = String::Handle(Field::LookupGetterSymbol(name));
- if (!getter_name.IsNull()) {
- obj = lib.LookupEntry(getter_name, &ignore);
+ String& accessor_name = String::Handle(zone);
+ accessor_name ^= Field::LookupGetterSymbol(name);
+ if (!accessor_name.IsNull()) {
+ obj = lib.LookupEntry(accessor_name, &ignore);
}
if (obj.IsNull()) {
- const String& setter_name =
- String::Handle(Field::LookupSetterSymbol(name));
- if (!setter_name.IsNull()) {
- obj = lib.LookupEntry(setter_name, &ignore);
+ accessor_name ^= Field::LookupSetterSymbol(name);
+ if (!accessor_name.IsNull()) {
+ obj = lib.LookupEntry(accessor_name, &ignore);
}
}
}
@@ -10910,7 +11045,7 @@
// LookupReExport() only returns objects that match the given name.
// If there is no field/func/getter, try finding a setter.
const String& setter_name =
- String::Handle(Field::LookupSetterSymbol(name));
+ String::Handle(zone, Field::LookupSetterSymbol(name));
if (!setter_name.IsNull()) {
obj = lib.LookupReExport(setter_name);
}
@@ -10994,14 +11129,16 @@
RawFunction* Library::GetFunction(const GrowableArray<Library*>& libs,
const char* class_name,
const char* function_name) {
- Function& func = Function::Handle();
- String& class_str = String::Handle();
- String& func_str = String::Handle();
- Class& cls = Class::Handle();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ Function& func = Function::Handle(zone);
+ String& class_str = String::Handle(zone);
+ String& func_str = String::Handle(zone);
+ Class& cls = Class::Handle(zone);
for (intptr_t l = 0; l < libs.length(); l++) {
const Library& lib = *libs[l];
if (strcmp(class_name, "::") == 0) {
- func_str = Symbols::New(function_name);
+ func_str = Symbols::New(thread, function_name);
func = lib.LookupFunctionAllowPrivate(func_str);
} else {
class_str = String::New(class_name);
@@ -12210,6 +12347,12 @@
}
+#if defined(TAG_IC_DATA)
+void ICData::set_tag(intptr_t value) const {
+ StoreNonPointer(&raw_ptr()->tag_, value);
+}
+#endif
+
intptr_t ICData::NumArgsTested() const {
return NumArgsTestedBits::decode(raw_ptr()->state_bits_);
}
@@ -12790,6 +12933,9 @@
result.set_arguments_descriptor(arguments_descriptor);
result.set_deopt_id(deopt_id);
result.set_state_bits(0);
+#if defined(TAG_IC_DATA)
+ result.set_tag(-1);
+#endif
result.SetNumArgsTested(num_args_tested);
return result.raw();
}
@@ -12807,6 +12953,9 @@
}
result.set_deopt_id(Thread::kNoDeoptId);
result.set_state_bits(0);
+#if defined(TAG_IC_DATA)
+ result.set_tag(-1);
+#endif
return result.raw();
}
@@ -13590,16 +13739,20 @@
const Object& obj = Object::Handle(owner());
if (obj.IsNull()) {
// Regular stub.
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
const char* name = StubCode::NameOfStub(EntryPoint());
ASSERT(name != NULL);
- const String& stub_name = String::Handle(Symbols::New(name));
- return Symbols::FromConcat(Symbols::StubPrefix(), stub_name);
+ const String& stub_name = String::Handle(zone, String::New(name));
+ return Symbols::FromConcat(thread, Symbols::StubPrefix(), stub_name);
} else if (obj.IsClass()) {
// Allocation stub.
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
const Class& cls = Class::Cast(obj);
- String& cls_name = String::Handle(cls.ScrubbedName());
+ String& cls_name = String::Handle(zone, cls.ScrubbedName());
ASSERT(!cls_name.IsNull());
- return Symbols::FromConcat(Symbols::AllocationStubFor(), cls_name);
+ return Symbols::FromConcat(thread, Symbols::AllocationStubFor(), cls_name);
} else {
ASSERT(obj.IsFunction());
// Dart function.
@@ -14635,12 +14788,13 @@
#endif // DEBUG
-bool Instance::CheckAndCanonicalizeFields(const char** error_str) const {
- const Class& cls = Class::Handle(this->clazz());
+bool Instance::CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const {
+ const Class& cls = Class::Handle(zone, this->clazz());
if (cls.id() >= kNumPredefinedCids) {
// Iterate over all fields, canonicalize numbers and strings, expect all
// other instances to be canonical otherwise report error (return false).
- Object& obj = Object::Handle();
+ Object& obj = Object::Handle(zone);
intptr_t end_field_offset = cls.instance_size() - kWordSize;
for (intptr_t field_offset = 0;
field_offset <= end_field_offset;
@@ -14653,8 +14807,7 @@
this->SetFieldAtOffset(field_offset, obj);
} else {
ASSERT(error_str != NULL);
- char* chars = OS::SCreate(Thread::Current()->zone(),
- "field: %s\n", obj.ToCString());
+ char* chars = OS::SCreate(zone, "field: %s\n", obj.ToCString());
*error_str = chars;
return false;
}
@@ -14677,11 +14830,11 @@
if (this->IsCanonical()) {
return this->raw();
}
- if (!CheckAndCanonicalizeFields(error_str)) {
- return Instance::null();
- }
Thread* thread = Thread::Current();
Zone* zone = thread->zone();
+ if (!CheckAndCanonicalizeFields(zone, error_str)) {
+ return Instance::null();
+ }
Isolate* isolate = thread->isolate();
Instance& result = Instance::Handle(zone);
const Class& cls = Class::Handle(zone, this->clazz());
@@ -14694,38 +14847,21 @@
SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
// Retry lookup.
{
- Instance& temp_result = Instance::Handle(zone,
- cls.LookupCanonicalInstance(zone, *this, &index));
- if (!temp_result.IsNull()) {
- return temp_result.raw();
+ result ^= cls.LookupCanonicalInstance(zone, *this, &index);
+ if (!result.IsNull()) {
+ return result.raw();
}
}
// The value needs to be added to the list. Grow the list if
// it is full.
result ^= this->raw();
- if (result.IsNew() ||
- (result.InVMHeap() && (isolate != Dart::vm_isolate()))) {
- /**
- * When a snapshot is generated on a 64 bit architecture and then read
- * into a 32 bit architecture, values which are Smi on the 64 bit
- * architecture could potentially be converted to Mint objects, however
- * since Smi values do not have any notion of canonical bits we lose
- * that information when the object becomes a Mint.
- * Some of these values could be literal values and end up in the
- * VM isolate heap. Later when these values are referenced in a
- * constant list we try to ensure that all the objects in the list
- * are canonical and try to canonicalize them. When these Mint objects
- * are encountered they do not have the canonical bit set and
- * canonicalizing them won't work as the VM heap is read only now.
- * In these cases we clone the object into the isolate and then
- * canonicalize it.
- */
+ ASSERT((isolate == Dart::vm_isolate()) || !result.InVMHeap());
+ if (result.IsNew()) {
// Create a canonical object in old space.
result ^= Object::Clone(result, Heap::kOld);
}
ASSERT(result.IsOld());
-
result.SetCanonical();
cls.InsertCanonicalConstant(index, result);
return result.raw();
@@ -14937,7 +15073,8 @@
return Integer::Cast(*this).Equals(other);
}
if (IsDouble() && other.IsDouble()) {
- return Double::Cast(*this).CanonicalizeEquals(other);
+ double other_value = Double::Cast(other).value();
+ return Double::Cast(*this).BitwiseEqualsToDouble(other_value);
}
return false;
}
@@ -15358,9 +15495,10 @@
RawString* AbstractType::BuildName(NameVisibility name_visibility) const {
ASSERT(name_visibility != kScrubbedName);
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
if (IsBoundedType()) {
- const AbstractType& type = AbstractType::Handle(
+ const AbstractType& type = AbstractType::Handle(zone,
BoundedType::Cast(*this).type());
if (name_visibility == kUserVisibleName) {
return type.BuildName(kUserVisibleName);
@@ -15370,8 +15508,8 @@
pieces.Add(type_name);
pieces.Add(Symbols::SpaceExtendsSpace());
// Build the bound name without causing divergence.
- const AbstractType& bound = AbstractType::Handle(
- zone, BoundedType::Cast(*this).bound());
+ const AbstractType& bound = AbstractType::Handle(zone,
+ BoundedType::Cast(*this).bound());
String& bound_name = String::Handle(zone);
if (bound.IsTypeParameter()) {
bound_name = TypeParameter::Cast(bound).name();
@@ -15386,7 +15524,7 @@
} else {
pieces.Add(Symbols::OptimizedOut());
}
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
if (IsTypeParameter()) {
return TypeParameter::Cast(*this).name();
@@ -15401,8 +15539,8 @@
Class& cls = Class::Handle(zone);
if (IsFunctionType()) {
cls = type_class();
- const Function& signature_function = Function::Handle(
- zone, Type::Cast(*this).signature());
+ const Function& signature_function = Function::Handle(zone,
+ Type::Cast(*this).signature());
if (!cls.IsTypedefClass() ||
(cls.signature_function() != signature_function.raw())) {
if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) {
@@ -15477,7 +15615,7 @@
// The name is only used for type checking and debugging purposes.
// Unless profiling data shows otherwise, it is not worth caching the name in
// the type.
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -15495,14 +15633,15 @@
// MyClass is from my_uri
// int is from dart:core
RawString* AbstractType::UserVisibleNameWithURI() const {
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
GrowableHandlePtrArray<const String> pieces(zone, 3);
pieces.Add(String::Handle(zone, BuildName(kUserVisibleName)));
if (!IsDynamicType() && !IsVoidType()) {
pieces.Add(Symbols::SpaceWhereNewLine());
pieces.Add(String::Handle(zone, EnumerateURIs()));
}
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -16475,7 +16614,8 @@
if (IsDynamicType() || IsVoidType()) {
return Symbols::Empty().raw();
}
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
GrowableHandlePtrArray<const String> pieces(zone, 6);
if (IsFunctionType()) {
// The scope class and type arguments do not appear explicitly in the user
@@ -16503,7 +16643,7 @@
const TypeArguments& type_args = TypeArguments::Handle(zone, arguments());
pieces.Add(String::Handle(zone, type_args.EnumerateURIs()));
}
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -16719,9 +16859,10 @@
RawString* TypeRef::EnumerateURIs() const {
- const AbstractType& ref_type = AbstractType::Handle(type());
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ const AbstractType& ref_type = AbstractType::Handle(zone, type());
ASSERT(!ref_type.IsDynamicType() && !ref_type.IsVoidType());
- Zone* zone = Thread::Current()->zone();
GrowableHandlePtrArray<const String> pieces(zone, 6);
const Class& cls = Class::Handle(zone, ref_type.type_class());
pieces.Add(Symbols::TwoSpaces());
@@ -16732,7 +16873,7 @@
const Library& library = Library::Handle(zone, cls.library());
pieces.Add(String::Handle(zone, library.url()));
pieces.Add(Symbols::NewLine());
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -16954,7 +17095,8 @@
RawString* TypeParameter::EnumerateURIs() const {
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
GrowableHandlePtrArray<const String> pieces(zone, 4);
pieces.Add(Symbols::TwoSpaces());
pieces.Add(String::Handle(zone, name()));
@@ -16965,7 +17107,7 @@
const Library& library = Library::Handle(zone, cls.library());
pieces.Add(String::Handle(zone, library.url()));
pieces.Add(Symbols::NewLine());
- return Symbols::FromConcatAll(pieces);
+ return Symbols::FromConcatAll(thread, pieces);
}
@@ -17341,6 +17483,61 @@
}
+RawInstance* Number::CheckAndCanonicalize(const char** error_str) const {
+ intptr_t cid = GetClassId();
+ switch (cid) {
+ case kSmiCid:
+ return reinterpret_cast<RawSmi*>(raw_value());
+ case kMintCid:
+ return Mint::NewCanonical(Mint::Cast(*this).value());
+ case kDoubleCid:
+ return Double::NewCanonical(Double::Cast(*this).value());
+ case kBigintCid: {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
+ Isolate* isolate = thread->isolate();
+ if (!CheckAndCanonicalizeFields(zone, error_str)) {
+ return Instance::null();
+ }
+ Bigint& result = Bigint::Handle(zone);
+ const Class& cls = Class::Handle(zone, this->clazz());
+ intptr_t index = 0;
+ result ^= cls.LookupCanonicalBigint(zone, Bigint::Cast(*this), &index);
+ if (!result.IsNull()) {
+ return result.raw();
+ }
+ {
+ SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
+ // Retry lookup.
+ {
+ result ^= cls.LookupCanonicalBigint(
+ zone, Bigint::Cast(*this), &index);
+ if (!result.IsNull()) {
+ return result.raw();
+ }
+ }
+
+ // The value needs to be added to the list. Grow the list if
+ // it is full.
+ result ^= this->raw();
+ ASSERT((isolate == Dart::vm_isolate()) || !result.InVMHeap());
+ if (result.IsNew()) {
+ // Create a canonical object in old space.
+ result ^= Object::Clone(result, Heap::kOld);
+ }
+ ASSERT(result.IsOld());
+ result.SetCanonical();
+ cls.InsertCanonicalNumber(zone, index, result);
+ return result.raw();
+ }
+ }
+ default:
+ UNREACHABLE();
+ }
+ return Instance::null();
+}
+
+
const char* Number::ToCString() const {
// Number is an interface. No instances of Number should exist.
UNREACHABLE();
@@ -17764,17 +17961,16 @@
SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
// Retry lookup.
{
- const Mint& result =
- Mint::Handle(zone, cls.LookupCanonicalMint(zone, value, &index));
- if (!result.IsNull()) {
- return result.raw();
+ canonical_value ^= cls.LookupCanonicalMint(zone, value, &index);
+ if (!canonical_value.IsNull()) {
+ return canonical_value.raw();
}
}
canonical_value = Mint::New(value, Heap::kOld);
canonical_value.SetCanonical();
// The value needs to be added to the constants list. Grow the list if
// it is full.
- cls.InsertCanonicalConstant(index, canonical_value);
+ cls.InsertCanonicalNumber(zone, index, canonical_value);
return canonical_value.raw();
}
}
@@ -17917,17 +18113,16 @@
SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
// Retry lookup.
{
- const Double& result =
- Double::Handle(zone, cls.LookupCanonicalDouble(zone, value, &index));
- if (!result.IsNull()) {
- return result.raw();
+ canonical_value ^= cls.LookupCanonicalDouble(zone, value, &index);
+ if (!canonical_value.IsNull()) {
+ return canonical_value.raw();
}
}
canonical_value = Double::New(value, Heap::kOld);
canonical_value.SetCanonical();
// The value needs to be added to the constants list. Grow the list if
// it is full.
- cls.InsertCanonicalConstant(index, canonical_value);
+ cls.InsertCanonicalNumber(zone, index, canonical_value);
return canonical_value.raw();
}
}
@@ -18054,13 +18249,14 @@
}
-bool Bigint::CheckAndCanonicalizeFields(const char** error_str) const {
+bool Bigint::CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const {
// Bool field neg should always be canonical.
- ASSERT(Bool::Handle(neg()).IsCanonical());
+ ASSERT(Bool::Handle(zone, neg()).IsCanonical());
// Smi field used is canonical by definition.
if (Used() > 0) {
// Canonicalize TypedData field digits.
- TypedData& digits_ = TypedData::Handle(digits());
+ TypedData& digits_ = TypedData::Handle(zone, digits());
digits_ ^= digits_.CheckAndCanonicalize(NULL);
ASSERT(!digits_.IsNull());
set_digits(digits_);
@@ -18218,8 +18414,8 @@
const Class& cls =
Class::Handle(zone, isolate->object_store()->bigint_class());
intptr_t index = 0;
- const Bigint& canonical_value =
- Bigint::Handle(zone, cls.LookupCanonicalBigint(zone, value, &index));
+ Bigint& canonical_value = Bigint::Handle(zone);
+ canonical_value ^= cls.LookupCanonicalBigint(zone, value, &index);
if (!canonical_value.IsNull()) {
return canonical_value.raw();
}
@@ -18227,16 +18423,15 @@
SafepointMutexLocker ml(isolate->constant_canonicalization_mutex());
// Retry lookup.
{
- const Bigint& result =
- Bigint::Handle(zone, cls.LookupCanonicalBigint(zone, value, &index));
- if (!result.IsNull()) {
- return result.raw();
+ canonical_value ^= cls.LookupCanonicalBigint(zone, value, &index);
+ if (!canonical_value.IsNull()) {
+ return canonical_value.raw();
}
}
value.SetCanonical();
// The value needs to be added to the constants list. Grow the list if
// it is full.
- cls.InsertCanonicalConstant(index, value);
+ cls.InsertCanonicalNumber(zone, index, value);
return value.raw();
}
}
@@ -19038,7 +19233,7 @@
if (IsCanonical()) {
return this->raw();
}
- return Symbols::New(*this);
+ return Symbols::New(Thread::Current(), *this);
}
@@ -19601,6 +19796,7 @@
intptr_t length,
void* peer,
Dart_PeerFinalizer cback) const {
+ ASSERT(FLAG_support_externalizable_strings);
String& result = String::Handle();
void* external_data;
Dart_WeakPersistentHandleFinalizer finalizer;
@@ -20475,14 +20671,7 @@
return false;
}
- // Both arrays must have the same type arguments.
- const TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
- const TypeArguments& other_type_args = TypeArguments::Handle(
- other.GetTypeArguments());
- if (!type_args.Equals(other_type_args)) {
- return false;
- }
-
+ // First check if both arrays have the same length and elements.
const Array& other_arr = Array::Cast(other);
intptr_t len = this->Length();
@@ -20495,6 +20684,14 @@
return false;
}
}
+
+ // Now check if both arrays have the same type arguments.
+ const TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
+ const TypeArguments& other_type_args = TypeArguments::Handle(
+ other.GetTypeArguments());
+ if (!type_args.Equals(other_type_args)) {
+ return false;
+ }
return true;
}
@@ -20640,8 +20837,9 @@
}
-bool Array::CheckAndCanonicalizeFields(const char** error_str) const {
- Object& obj = Object::Handle();
+bool Array::CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const {
+ Object& obj = Object::Handle(zone);
// Iterate over all elements, canonicalize numbers and strings, expect all
// other instances to be canonical otherwise report error (return false).
for (intptr_t i = 0; i < Length(); i++) {
@@ -20711,44 +20909,6 @@
}
-bool GrowableObjectArray::CanonicalizeEquals(const Instance& other) const {
- // If both handles point to the same raw instance they are equal.
- if (this->raw() == other.raw()) {
- return true;
- }
-
- // Other instance must be non null and a GrowableObjectArray.
- if (!other.IsGrowableObjectArray() || other.IsNull()) {
- return false;
- }
-
- const GrowableObjectArray& other_arr = GrowableObjectArray::Cast(other);
-
- // The capacity and length of both objects must be equal.
- if (Capacity() != other_arr.Capacity() || Length() != other_arr.Length()) {
- return false;
- }
-
- // Both arrays must have the same type arguments.
- const TypeArguments& type_args = TypeArguments::Handle(GetTypeArguments());
- const TypeArguments& other_type_args = TypeArguments::Handle(
- other.GetTypeArguments());
- if (!type_args.Equals(other_type_args)) {
- return false;
- }
-
- // The data part in both arrays must be identical.
- const Array& contents = Array::Handle(data());
- const Array& other_contents = Array::Handle(other_arr.data());
- for (intptr_t i = 0; i < Length(); i++) {
- if (contents.At(i) != other_contents.At(i)) {
- return false;
- }
- }
- return true;
-}
-
-
RawGrowableObjectArray* GrowableObjectArray::New(intptr_t capacity,
Heap::Space space) {
const Array& data = Array::Handle(Array::New(capacity, space));
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 9a946b0..6a2008f 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -1195,6 +1195,9 @@
RawField* LookupInstanceField(const String& name) const;
RawField* LookupStaticField(const String& name) const;
RawField* LookupField(const String& name) const;
+ RawField* LookupFieldAllowPrivate(const String& name) const;
+ RawField* LookupInstanceFieldAllowPrivate(const String& name) const;
+ RawField* LookupStaticFieldAllowPrivate(const String& name) const;
RawLibraryPrefix* LookupLibraryPrefix(const String& name) const;
@@ -1214,6 +1217,9 @@
intptr_t* index) const;
void InsertCanonicalConstant(intptr_t index, const Instance& constant) const;
+ void InsertCanonicalNumber(Zone* zone,
+ intptr_t index,
+ const Number& constant) const;
intptr_t FindCanonicalTypeIndex(const AbstractType& needle) const;
RawAbstractType* CanonicalTypeFromIndex(intptr_t idx) const;
@@ -2075,6 +2081,11 @@
kCachedICDataArrayCount = 4
};
+#if defined(TAG_IC_DATA)
+ void set_tag(intptr_t value) const;
+ intptr_t tag() const { return raw_ptr()->tag_; }
+#endif
+
private:
static RawICData* New();
@@ -2727,7 +2738,6 @@
}
bool was_compiled() const { return raw_ptr()->was_compiled_ == 1; }
-
// static: Considered during class-side or top-level resolution rather than
// instance-side resolution.
// const: Valid target of a const constructor call.
@@ -2842,6 +2852,8 @@
RawString* QualifiedName(NameVisibility name_visibility) const;
void BuildSignatureParameters(
+ Thread* thread,
+ Zone* zone,
bool instantiate,
NameVisibility name_visibility,
const TypeArguments& instantiator,
@@ -3087,9 +3099,7 @@
set_kind_bits(UnboxingCandidateBit::update(b, raw_ptr()->kind_bits_));
}
- static bool IsExternalizableCid(intptr_t cid) {
- return (cid == kOneByteStringCid) || (cid == kTwoByteStringCid);
- }
+ static bool IsExternalizableCid(intptr_t cid);
enum {
kUnknownLengthOffset = -1,
@@ -5152,7 +5162,8 @@
virtual RawInstance* CheckAndCanonicalize(const char** error_str) const;
// Returns true if all fields are OK for canonicalization.
- virtual bool CheckAndCanonicalizeFields(const char** error_str) const;
+ virtual bool CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const;
RawObject* GetField(const Field& field) const {
return *FieldAddr(field);
@@ -5939,6 +5950,9 @@
// TODO(iposva): Add more useful Number methods.
RawString* ToString(Heap::Space space) const;
+ // Numbers are canonicalized differently from other instances/strings.
+ virtual RawInstance* CheckAndCanonicalize(const char** error_str) const;
+
private:
OBJECT_IMPLEMENTATION(Number, Instance);
@@ -6012,10 +6026,6 @@
virtual bool Equals(const Instance& other) const;
virtual bool IsZero() const { return Value() == 0; }
virtual bool IsNegative() const { return Value() < 0; }
- // Smi values are implicitly canonicalized.
- virtual RawInstance* CheckAndCanonicalize(const char** error_str) const {
- return reinterpret_cast<RawSmi*>(raw_value());
- }
virtual double AsDoubleValue() const;
virtual int64_t AsInt64Value() const;
@@ -6135,6 +6145,7 @@
MINT_OBJECT_IMPLEMENTATION(Mint, Integer, Integer);
friend class Class;
+ friend class Number;
};
@@ -6151,7 +6162,8 @@
virtual int CompareWith(const Integer& other) const;
- virtual bool CheckAndCanonicalizeFields(const char** error_str) const;
+ virtual bool CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const;
virtual bool FitsIntoSmi() const;
bool FitsIntoInt64() const;
@@ -6266,6 +6278,7 @@
FINAL_HEAP_OBJECT_IMPLEMENTATION(Double, Number);
friend class Class;
+ friend class Number;
};
@@ -6397,6 +6410,7 @@
bool StartsWith(const String& other) const;
+ // Strings are canonicalized using the symbol table.
virtual RawInstance* CheckAndCanonicalize(const char** error_str) const;
bool IsSymbol() const { return raw()->IsCanonical(); }
@@ -7100,7 +7114,8 @@
}
// Returns true if all elements are OK for canonicalization.
- virtual bool CheckAndCanonicalizeFields(const char** error_str) const;
+ virtual bool CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const;
// Make the array immutable to Dart code by switching the class pointer
// to ImmutableArray.
@@ -7246,8 +7261,13 @@
StorePointer(&raw_ptr()->type_arguments_, value.raw());
}
- virtual bool CanonicalizeEquals(const Instance& other) const;
+ // We don't expect a growable object array to be canonicalized.
+ virtual bool CanonicalizeEquals(const Instance& other) const {
+ UNREACHABLE();
+ return false;
+ }
+ // We don't expect a growable object array to be canonicalized.
virtual RawInstance* CheckAndCanonicalize(const char** error_str) const {
UNREACHABLE();
return Instance::null();
@@ -7937,7 +7957,8 @@
}
// Returns true if all elements are OK for canonicalization.
- virtual bool CheckAndCanonicalizeFields(const char** error_str) const {
+ virtual bool CheckAndCanonicalizeFields(Zone* zone,
+ const char** error_str) const {
// None of the fields of a closure are instances.
return true;
}
diff --git a/runtime/vm/object_id_ring_test.cc b/runtime/vm/object_id_ring_test.cc
index c85d44c..dd64aa5 100644
--- a/runtime/vm/object_id_ring_test.cc
+++ b/runtime/vm/object_id_ring_test.cc
@@ -37,7 +37,7 @@
}
static RawObject* MakeString(const char* s) {
- return Symbols::New(s);
+ return Symbols::New(Thread::Current(), s);
}
static void ExpectString(RawObject* obj, const char* s) {
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index b1243e9..62718be 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -37,7 +37,7 @@
VM_TEST_CASE(Class) {
// Allocate the class first.
- const String& class_name = String::Handle(Symbols::New("MyClass"));
+ const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
const Script& script = Script::Handle();
const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
@@ -49,10 +49,10 @@
const Array& interfaces = Array::Handle(Array::New(2));
Class& interface = Class::Handle();
String& interface_name = String::Handle();
- interface_name = Symbols::New("Harley");
+ interface_name = Symbols::New(thread, "Harley");
interface = CreateDummyClass(interface_name, script);
interfaces.SetAt(0, Type::Handle(Type::NewNonParameterizedType(interface)));
- interface_name = Symbols::New("Norton");
+ interface_name = Symbols::New(thread, "Norton");
interface = CreateDummyClass(interface_name, script);
interfaces.SetAt(1, Type::Handle(Type::NewNonParameterizedType(interface)));
cls.set_interfaces(interfaces);
@@ -65,12 +65,12 @@
const Array& functions = Array::Handle(Array::New(6));
Function& function = Function::Handle();
String& function_name = String::Handle();
- function_name = Symbols::New("foo");
+ function_name = Symbols::New(thread, "foo");
function = Function::New(
function_name, RawFunction::kRegularFunction,
false, false, false, false, false, cls, TokenPosition::kMinSource);
functions.SetAt(0, function);
- function_name = Symbols::New("bar");
+ function_name = Symbols::New(thread, "bar");
function = Function::New(
function_name, RawFunction::kRegularFunction,
false, false, false, false, false, cls, TokenPosition::kMinSource);
@@ -83,24 +83,24 @@
kAreOptionalPositional);
functions.SetAt(1, function);
- function_name = Symbols::New("baz");
+ function_name = Symbols::New(thread, "baz");
function = Function::New(
function_name, RawFunction::kRegularFunction,
false, false, false, false, false, cls, TokenPosition::kMinSource);
functions.SetAt(2, function);
- function_name = Symbols::New("Foo");
+ function_name = Symbols::New(thread, "Foo");
function = Function::New(
function_name, RawFunction::kRegularFunction,
true, false, false, false, false, cls, TokenPosition::kMinSource);
functions.SetAt(3, function);
- function_name = Symbols::New("Bar");
+ function_name = Symbols::New(thread, "Bar");
function = Function::New(
function_name, RawFunction::kRegularFunction,
true, false, false, false, false, cls, TokenPosition::kMinSource);
functions.SetAt(4, function);
- function_name = Symbols::New("BaZ");
+ function_name = Symbols::New(thread, "BaZ");
function = Function::New(
function_name, RawFunction::kRegularFunction,
true, false, false, false, false, cls, TokenPosition::kMinSource);
@@ -258,7 +258,7 @@
VM_TEST_CASE(InstanceClass) {
// Allocate the class first.
- String& class_name = String::Handle(Symbols::New("EmptyClass"));
+ String& class_name = String::Handle(Symbols::New(thread, "EmptyClass"));
Script& script = Script::Handle();
const Class& empty_class =
Class::Handle(CreateDummyClass(class_name, script));
@@ -274,7 +274,7 @@
Instance& instance = Instance::Handle(Instance::New(empty_class));
EXPECT_EQ(empty_class.raw(), instance.clazz());
- class_name = Symbols::New("OneFieldClass");
+ class_name = Symbols::New(thread, "OneFieldClass");
const Class& one_field_class =
Class::Handle(CreateDummyClass(class_name, script));
@@ -285,7 +285,7 @@
ClassFinalizer::FinalizeTypesInClass(one_field_class);
const Array& one_fields = Array::Handle(Array::New(1));
- const String& field_name = String::Handle(Symbols::New("the_field"));
+ const String& field_name = String::Handle(Symbols::New(thread, "the_field"));
const Field& field = Field::Handle(
Field::New(field_name, false, false, false, true, one_field_class,
Object::dynamic_type(), TokenPosition::kMinSource));
@@ -1826,84 +1826,85 @@
VM_TEST_CASE(Symbol) {
- const String& one = String::Handle(Symbols::New("Eins"));
+ const String& one = String::Handle(Symbols::New(thread, "Eins"));
EXPECT(one.IsSymbol());
- const String& two = String::Handle(Symbols::New("Zwei"));
- const String& three = String::Handle(Symbols::New("Drei"));
- const String& four = String::Handle(Symbols::New("Vier"));
- const String& five = String::Handle(Symbols::New("Fuenf"));
- const String& six = String::Handle(Symbols::New("Sechs"));
- const String& seven = String::Handle(Symbols::New("Sieben"));
- const String& eight = String::Handle(Symbols::New("Acht"));
- const String& nine = String::Handle(Symbols::New("Neun"));
- const String& ten = String::Handle(Symbols::New("Zehn"));
- String& eins = String::Handle(Symbols::New("Eins"));
+ const String& two = String::Handle(Symbols::New(thread, "Zwei"));
+ const String& three = String::Handle(Symbols::New(thread, "Drei"));
+ const String& four = String::Handle(Symbols::New(thread, "Vier"));
+ const String& five = String::Handle(Symbols::New(thread, "Fuenf"));
+ const String& six = String::Handle(Symbols::New(thread, "Sechs"));
+ const String& seven = String::Handle(Symbols::New(thread, "Sieben"));
+ const String& eight = String::Handle(Symbols::New(thread, "Acht"));
+ const String& nine = String::Handle(Symbols::New(thread, "Neun"));
+ const String& ten = String::Handle(Symbols::New(thread, "Zehn"));
+ String& eins = String::Handle(Symbols::New(thread, "Eins"));
EXPECT_EQ(one.raw(), eins.raw());
EXPECT(one.raw() != two.raw());
EXPECT(two.Equals(String::Handle(String::New("Zwei"))));
- EXPECT_EQ(two.raw(), Symbols::New("Zwei"));
- EXPECT_EQ(three.raw(), Symbols::New("Drei"));
- EXPECT_EQ(four.raw(), Symbols::New("Vier"));
- EXPECT_EQ(five.raw(), Symbols::New("Fuenf"));
- EXPECT_EQ(six.raw(), Symbols::New("Sechs"));
- EXPECT_EQ(seven.raw(), Symbols::New("Sieben"));
- EXPECT_EQ(eight.raw(), Symbols::New("Acht"));
- EXPECT_EQ(nine.raw(), Symbols::New("Neun"));
- EXPECT_EQ(ten.raw(), Symbols::New("Zehn"));
+ EXPECT_EQ(two.raw(), Symbols::New(thread, "Zwei"));
+ EXPECT_EQ(three.raw(), Symbols::New(thread, "Drei"));
+ EXPECT_EQ(four.raw(), Symbols::New(thread, "Vier"));
+ EXPECT_EQ(five.raw(), Symbols::New(thread, "Fuenf"));
+ EXPECT_EQ(six.raw(), Symbols::New(thread, "Sechs"));
+ EXPECT_EQ(seven.raw(), Symbols::New(thread, "Sieben"));
+ EXPECT_EQ(eight.raw(), Symbols::New(thread, "Acht"));
+ EXPECT_EQ(nine.raw(), Symbols::New(thread, "Neun"));
+ EXPECT_EQ(ten.raw(), Symbols::New(thread, "Zehn"));
// Make sure to cause symbol table overflow.
for (int i = 0; i < 1024; i++) {
char buf[256];
OS::SNPrint(buf, sizeof(buf), "%d", i);
- Symbols::New(buf);
+ Symbols::New(thread, buf);
}
- eins = Symbols::New("Eins");
+ eins = Symbols::New(thread, "Eins");
EXPECT_EQ(one.raw(), eins.raw());
- EXPECT_EQ(two.raw(), Symbols::New("Zwei"));
- EXPECT_EQ(three.raw(), Symbols::New("Drei"));
- EXPECT_EQ(four.raw(), Symbols::New("Vier"));
- EXPECT_EQ(five.raw(), Symbols::New("Fuenf"));
- EXPECT_EQ(six.raw(), Symbols::New("Sechs"));
- EXPECT_EQ(seven.raw(), Symbols::New("Sieben"));
- EXPECT_EQ(eight.raw(), Symbols::New("Acht"));
- EXPECT_EQ(nine.raw(), Symbols::New("Neun"));
- EXPECT_EQ(ten.raw(), Symbols::New("Zehn"));
+ EXPECT_EQ(two.raw(), Symbols::New(thread, "Zwei"));
+ EXPECT_EQ(three.raw(), Symbols::New(thread, "Drei"));
+ EXPECT_EQ(four.raw(), Symbols::New(thread, "Vier"));
+ EXPECT_EQ(five.raw(), Symbols::New(thread, "Fuenf"));
+ EXPECT_EQ(six.raw(), Symbols::New(thread, "Sechs"));
+ EXPECT_EQ(seven.raw(), Symbols::New(thread, "Sieben"));
+ EXPECT_EQ(eight.raw(), Symbols::New(thread, "Acht"));
+ EXPECT_EQ(nine.raw(), Symbols::New(thread, "Neun"));
+ EXPECT_EQ(ten.raw(), Symbols::New(thread, "Zehn"));
// Symbols from Strings.
eins = String::New("Eins");
EXPECT(!eins.IsSymbol());
- String& ein_symbol = String::Handle(Symbols::New(eins));
+ String& ein_symbol = String::Handle(Symbols::New(thread, eins));
EXPECT_EQ(one.raw(), ein_symbol.raw());
EXPECT(one.raw() != eins.raw());
uint16_t char16[] = { 'E', 'l', 'f' };
- String& elf1 = String::Handle(Symbols::FromUTF16(char16, 3));
+ String& elf1 = String::Handle(Symbols::FromUTF16(thread, char16, 3));
int32_t char32[] = { 'E', 'l', 'f' };
- String& elf2 = String::Handle(Symbols::FromUTF32(char32, 3));
+ String& elf2 = String::Handle(Symbols::FromUTF32(thread, char32, 3));
EXPECT(elf1.IsSymbol());
EXPECT(elf2.IsSymbol());
- EXPECT_EQ(elf1.raw(), Symbols::New("Elf"));
- EXPECT_EQ(elf2.raw(), Symbols::New("Elf"));
+ EXPECT_EQ(elf1.raw(), Symbols::New(thread, "Elf"));
+ EXPECT_EQ(elf2.raw(), Symbols::New(thread, "Elf"));
}
VM_TEST_CASE(SymbolUnicode) {
uint16_t monkey_utf16[] = { 0xd83d, 0xdc35 }; // Unicode Monkey Face.
- String& monkey = String::Handle(Symbols::FromUTF16(monkey_utf16, 2));
+ String& monkey = String::Handle(Symbols::FromUTF16(thread, monkey_utf16, 2));
EXPECT(monkey.IsSymbol());
const char monkey_utf8[] = {'\xf0', '\x9f', '\x90', '\xb5', 0};
- EXPECT_EQ(monkey.raw(), Symbols::New(monkey_utf8));
+ EXPECT_EQ(monkey.raw(), Symbols::New(thread, monkey_utf8));
int32_t kMonkeyFace = 0x1f435;
- String& monkey2 = String::Handle(Symbols::FromCharCode(kMonkeyFace));
+ String& monkey2 = String::Handle(Symbols::FromCharCode(thread, kMonkeyFace));
EXPECT_EQ(monkey.raw(), monkey2.raw());
// Unicode cat face with tears of joy.
int32_t kCatFaceWithTearsOfJoy = 0x1f639;
- String& cat = String::Handle(Symbols::FromCharCode(kCatFaceWithTearsOfJoy));
+ String& cat = String::Handle(Symbols::FromCharCode(thread,
+ kCatFaceWithTearsOfJoy));
uint16_t cat_utf16[] = { 0xd83d, 0xde39 };
- String& cat2 = String::Handle(Symbols::FromUTF16(cat_utf16, 2));
+ String& cat2 = String::Handle(Symbols::FromUTF16(thread, cat_utf16, 2));
EXPECT(cat2.IsSymbol());
EXPECT_EQ(cat2.raw(), cat.raw());
}
@@ -2541,17 +2542,17 @@
new LocalScope(parent_scope, local_scope_function_level, 0);
const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
- const String& a = String::ZoneHandle(Symbols::New("a"));
+ const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
LocalVariable* var_a =
new LocalVariable(TokenPosition::kNoSource, a, dynamic_type);
parent_scope->AddVariable(var_a);
- const String& b = String::ZoneHandle(Symbols::New("b"));
+ const String& b = String::ZoneHandle(Symbols::New(thread, "b"));
LocalVariable* var_b =
new LocalVariable(TokenPosition::kNoSource, b, dynamic_type);
local_scope->AddVariable(var_b);
- const String& c = String::ZoneHandle(Symbols::New("c"));
+ const String& c = String::ZoneHandle(Symbols::New(thread, "c"));
LocalVariable* var_c =
new LocalVariable(TokenPosition::kNoSource, c, dynamic_type);
parent_scope->AddVariable(var_c);
@@ -2620,14 +2621,14 @@
VM_TEST_CASE(Closure) {
// Allocate the class first.
- const String& class_name = String::Handle(Symbols::New("MyClass"));
+ const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
const Script& script = Script::Handle();
const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
const Array& functions = Array::Handle(Array::New(1));
const Context& context = Context::Handle(Context::New(0));
Function& parent = Function::Handle();
- const String& parent_name = String::Handle(Symbols::New("foo_papa"));
+ const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
parent = Function::New(parent_name, RawFunction::kRegularFunction,
false, false, false, false, false, cls,
TokenPosition::kMinSource);
@@ -2635,7 +2636,7 @@
cls.SetFunctions(functions);
Function& function = Function::Handle();
- const String& function_name = String::Handle(Symbols::New("foo"));
+ const String& function_name = String::Handle(Symbols::New(thread, "foo"));
function = Function::NewClosureFunction(
function_name, parent, TokenPosition::kMinSource);
const Closure& closure = Closure::Handle(Closure::New(function, context));
@@ -2690,15 +2691,16 @@
static RawFunction* CreateFunction(const char* name) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
- const String& lib_name = String::Handle(Symbols::New("ownerLibrary"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
+ const String& lib_name = String::Handle(Symbols::New(thread, "ownerLibrary"));
const Script& script = Script::Handle();
const Class& owner_class =
Class::Handle(CreateDummyClass(class_name, script));
const Library& owner_library =
Library::Handle(CreateDummyLibrary(lib_name));
owner_class.set_library(owner_library);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
return Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
TokenPosition::kMinSource);
@@ -2967,7 +2969,8 @@
static RawClass* CreateTestClass(const char* name) {
- const String& class_name = String::Handle(Symbols::New(name));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ name));
const Class& cls = Class::Handle(
CreateDummyClass(class_name, Script::Handle()));
return cls.raw();
@@ -2976,7 +2979,8 @@
static RawField* CreateTestField(const char* name) {
const Class& cls = Class::Handle(CreateTestClass("global:"));
- const String& field_name = String::Handle(Symbols::New(name));
+ const String& field_name = String::Handle(Symbols::New(Thread::Current(),
+ name));
const Field& field =
Field::Handle(Field::New(field_name, true, false, false, true, cls,
Object::dynamic_type(), TokenPosition::kMinSource));
@@ -3008,7 +3012,8 @@
static RawFunction* GetDummyTarget(const char* name) {
- const String& function_name = String::Handle(Symbols::New(name));
+ const String& function_name = String::Handle(Symbols::New(Thread::Current(),
+ name));
const Class& cls = Class::Handle(
CreateDummyClass(function_name, Script::Handle()));
const bool is_static = false;
@@ -3032,7 +3037,7 @@
Function& function = Function::Handle(GetDummyTarget("Bern"));
const intptr_t id = 12;
const intptr_t num_args_tested = 1;
- const String& target_name = String::Handle(Symbols::New("Thun"));
+ const String& target_name = String::Handle(Symbols::New(thread, "Thun"));
const Array& args_descriptor =
Array::Handle(ArgumentsDescriptor::New(1, Object::null_array()));
ICData& o1 = ICData::Handle();
@@ -3101,7 +3106,7 @@
VM_TEST_CASE(SubtypeTestCache) {
- String& class_name = String::Handle(Symbols::New("EmptyClass"));
+ String& class_name = String::Handle(Symbols::New(thread, "EmptyClass"));
Script& script = Script::Handle();
const Class& empty_class =
Class::Handle(CreateDummyClass(class_name, script));
@@ -3781,7 +3786,7 @@
static RawClass* GetClass(const Library& lib, const char* name) {
const Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New(name))));
+ lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
return cls.raw();
}
@@ -3789,14 +3794,14 @@
VM_TEST_CASE(FindClosureIndex) {
// Allocate the class first.
- const String& class_name = String::Handle(Symbols::New("MyClass"));
+ const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
const Script& script = Script::Handle();
const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
const Array& functions = Array::Handle(Array::New(1));
const Isolate* iso = Isolate::Current();
Function& parent = Function::Handle();
- const String& parent_name = String::Handle(Symbols::New("foo_papa"));
+ const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
parent = Function::New(parent_name, RawFunction::kRegularFunction,
false, false, false, false, false, cls,
TokenPosition::kMinSource);
@@ -3804,7 +3809,7 @@
cls.SetFunctions(functions);
Function& function = Function::Handle();
- const String& function_name = String::Handle(Symbols::New("foo"));
+ const String& function_name = String::Handle(Symbols::New(thread, "foo"));
function = Function::NewClosureFunction(function_name, parent,
TokenPosition::kMinSource);
// Add closure function to class.
@@ -3826,14 +3831,14 @@
VM_TEST_CASE(FindInvocationDispatcherFunctionIndex) {
- const String& class_name = String::Handle(Symbols::New("MyClass"));
+ const String& class_name = String::Handle(Symbols::New(thread, "MyClass"));
const Script& script = Script::Handle();
const Class& cls = Class::Handle(CreateDummyClass(class_name, script));
ClassFinalizer::FinalizeTypesInClass(cls);
const Array& functions = Array::Handle(Array::New(1));
Function& parent = Function::Handle();
- const String& parent_name = String::Handle(Symbols::New("foo_papa"));
+ const String& parent_name = String::Handle(Symbols::New(thread, "foo_papa"));
parent = Function::New(parent_name, RawFunction::kRegularFunction,
false, false, false, false, false, cls,
TokenPosition::kMinSource);
@@ -3843,7 +3848,7 @@
// Add invocation dispatcher.
const String& invocation_dispatcher_name =
- String::Handle(Symbols::New("myMethod"));
+ String::Handle(Symbols::New(thread, "myMethod"));
const Array& args_desc = Array::Handle(ArgumentsDescriptor::New(1));
Function& invocation_dispatcher = Function::Handle();
invocation_dispatcher ^=
@@ -3944,17 +3949,18 @@
res = lib.GetMetadata(func);
PrintMetadata("A.aFunc", res);
- func = lib.LookupLocalFunction(String::Handle(Symbols::New("main")));
+ func = lib.LookupLocalFunction(String::Handle(Symbols::New(thread, "main")));
EXPECT(!func.IsNull());
res = lib.GetMetadata(func);
PrintMetadata("main", res);
- func = lib.LookupLocalFunction(String::Handle(Symbols::New("get:tlGetter")));
+ func = lib.LookupLocalFunction(String::Handle(Symbols::New(thread,
+ "get:tlGetter")));
EXPECT(!func.IsNull());
res = lib.GetMetadata(func);
PrintMetadata("tlGetter", res);
- field = lib.LookupLocalField(String::Handle(Symbols::New("gVar")));
+ field = lib.LookupLocalField(String::Handle(Symbols::New(thread, "gVar")));
EXPECT(!field.IsNull());
res = lib.GetMetadata(field);
PrintMetadata("gVar", res);
@@ -4006,9 +4012,9 @@
EXPECT(!lib.IsNull());
const Class& class_a = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("A"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
const Class& class_b = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New("B"))));
+ lib.LookupClass(String::Handle(Symbols::New(thread, "B"))));
const Function& a_test1 =
Function::Handle(GetStaticFunction(class_a, "test1"));
const Function& b_test1 =
@@ -4070,7 +4076,7 @@
const Library& vmlib = Library::Handle(Library::LookupLibrary(name));
EXPECT(!vmlib.IsNull());
const Class& class_a = Class::Handle(
- vmlib.LookupClass(String::Handle(Symbols::New("A"))));
+ vmlib.LookupClass(String::Handle(Symbols::New(thread, "A"))));
const Function& func_b =
Function::Handle(GetFunction(class_a, "b"));
EXPECT(func_b.CanBeInlined());
@@ -4611,14 +4617,16 @@
static void CheckConcatAll(const String* data[], intptr_t n) {
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
GrowableHandlePtrArray<const String> pieces(zone, n);
const Array& array = Array::Handle(zone, Array::New(n));
for (int i = 0; i < n; i++) {
pieces.Add(*data[i]);
array.SetAt(i, *data[i]);
}
- const String& res1 = String::Handle(zone, Symbols::FromConcatAll(pieces));
+ const String& res1 = String::Handle(zone, Symbols::FromConcatAll(thread,
+ pieces));
const String& res2 = String::Handle(zone, String::ConcatAll(array));
EXPECT(res1.Equals(res2));
}
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index 5691522..76cde6b 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -186,7 +186,7 @@
if (!has_finally_return_temp_var()) {
LocalVariable* temp = new(Z) LocalVariable(
function_.token_pos(),
- String::ZoneHandle(Z, Symbols::New(":finally_ret_val")),
+ Symbols::FinallyRetVal(),
Object::dynamic_type());
ASSERT(temp != NULL);
temp->set_is_final();
@@ -1233,7 +1233,7 @@
const String& field_name = String::Handle(zone, field.name());
String& init_name = String::Handle(zone,
- Symbols::FromConcat(Symbols::InitPrefix(), field_name));
+ Symbols::FromConcat(thread, Symbols::InitPrefix(), field_name));
const Script& script = Script::Handle(zone, field.Script());
Object& initializer_owner = Object::Handle(field.Owner());
@@ -1574,7 +1574,7 @@
ParamDesc p;
char name[64];
OS::SNPrint(name, 64, ":p%" Pd, i);
- p.name = &String::ZoneHandle(Z, Symbols::New(name));
+ p.name = &String::ZoneHandle(Z, Symbols::New(T, name));
p.type = &Object::dynamic_type();
params.parameters->Add(p);
params.num_fixed_parameters++;
@@ -1688,7 +1688,7 @@
function_object = receiver;
} else {
const String& getter_name = String::ZoneHandle(Z,
- Symbols::New(String::Handle(Z, Field::GetterSymbol(name))));
+ Field::GetterSymbol(name));
function_object = new(Z) InstanceCallNode(
token_pos, receiver, getter_name, no_args);
}
@@ -2091,7 +2091,7 @@
String::Handle(Z, current_class().Name()).ToCString());
}
Function& super_func = Function::Handle(Z,
- Resolver::ResolveDynamicAnyArgs(super_class, name));
+ Resolver::ResolveDynamicAnyArgs(Z, super_class, name));
if (!super_func.IsNull() &&
!super_func.AreValidArguments(arguments->length(),
arguments->names(),
@@ -2099,13 +2099,13 @@
super_func = Function::null();
} else if (super_func.IsNull() && resolve_getter) {
const String& getter_name = String::ZoneHandle(Z, Field::GetterName(name));
- super_func = Resolver::ResolveDynamicAnyArgs(super_class, getter_name);
+ super_func = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name);
ASSERT(super_func.IsNull() ||
(super_func.kind() != RawFunction::kImplicitStaticFinalGetter));
}
if (super_func.IsNull()) {
- super_func =
- Resolver::ResolveDynamicAnyArgs(super_class, Symbols::NoSuchMethod());
+ super_func = Resolver::ResolveDynamicAnyArgs(Z,
+ super_class, Symbols::NoSuchMethod());
ASSERT(!super_func.IsNull());
*is_no_such_method = true;
} else {
@@ -2239,8 +2239,7 @@
if ((op == Token::kNEGATE) ||
(op == Token::kBIT_NOT)) {
// Resolve the operator function in the superclass.
- const String& operator_function_name =
- String::ZoneHandle(Z, Symbols::New(Token::Str(op)));
+ const String& operator_function_name = Symbols::Token(op);
ArgumentListNode* op_arguments = new ArgumentListNode(super_pos);
AstNode* receiver = LoadReceiver(super_pos);
op_arguments->Add(receiver);
@@ -2300,8 +2299,7 @@
op_arguments->Add(other_operand);
// Resolve the operator function in the superclass.
- const String& operator_function_name =
- String::ZoneHandle(Z, Symbols::New(Token::Str(op)));
+ const String& operator_function_name = Symbols::Token(op);
const bool kResolveGetter = false;
bool is_no_such_method = false;
const Function& super_operator = Function::ZoneHandle(Z,
@@ -2359,14 +2357,15 @@
String::ZoneHandle(Z, Field::LookupGetterSymbol(field_name));
Function& super_getter = Function::ZoneHandle(Z);
if (!getter_name.IsNull()) {
- super_getter = Resolver::ResolveDynamicAnyArgs(super_class, getter_name);
+ super_getter = Resolver::ResolveDynamicAnyArgs(Z, super_class, getter_name);
}
if (super_getter.IsNull()) {
const String& setter_name =
String::ZoneHandle(Z, Field::LookupSetterSymbol(field_name));
Function& super_setter = Function::ZoneHandle(Z);
if (!setter_name.IsNull()) {
- super_setter = Resolver::ResolveDynamicAnyArgs(super_class, setter_name);
+ super_setter = Resolver::ResolveDynamicAnyArgs(Z,
+ super_class, setter_name);
}
if (super_setter.IsNull()) {
// Check if this is an access to an implicit closure using 'super'.
@@ -2374,7 +2373,7 @@
// accessing it as a getter, at runtime we will handle this by
// creating an implicit closure of the function and returning it.
const Function& super_function = Function::ZoneHandle(Z,
- Resolver::ResolveDynamicAnyArgs(super_class, field_name));
+ Resolver::ResolveDynamicAnyArgs(Z, super_class, field_name));
if (!super_function.IsNull()) {
// In case CreateAssignmentNode is called later on this
// CreateImplicitClosureNode, it will be replaced by a StaticSetterNode.
@@ -2406,7 +2405,7 @@
return NULL;
}
String& super_ctor_name = String::Handle(Z, super_class.Name());
- super_ctor_name = Symbols::FromConcat(super_ctor_name, Symbols::Dot());
+ super_ctor_name = Symbols::FromDot(T, super_ctor_name);
ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
// Implicit 'this' parameter is the first argument.
@@ -2426,8 +2425,8 @@
// Generating a forwarding call to a named constructor 'C.n'.
// Add the constructor name 'n' to the super constructor.
const intptr_t kLen = class_name.Length() + 1;
- ctor_name = Symbols::New(ctor_name, kLen, ctor_name.Length() - kLen);
- super_ctor_name = Symbols::FromConcat(super_ctor_name, ctor_name);
+ ctor_name = Symbols::New(T, ctor_name, kLen, ctor_name.Length() - kLen);
+ super_ctor_name = Symbols::FromConcat(T, super_ctor_name, ctor_name);
}
}
@@ -2465,10 +2464,10 @@
const Class& super_class = Class::Handle(Z, cls.SuperClass());
ASSERT(!super_class.IsNull());
String& ctor_name = String::Handle(Z, super_class.Name());
- ctor_name = Symbols::FromConcat(ctor_name, Symbols::Dot());
+ ctor_name = Symbols::FromConcat(T, ctor_name, Symbols::Dot());
if (CurrentToken() == Token::kPERIOD) {
ConsumeToken();
- ctor_name = Symbols::FromConcat(
+ ctor_name = Symbols::FromConcat(T,
ctor_name, *ExpectIdentifier("constructor name expected"));
}
CheckToken(Token::kLPAREN, "parameter list expected");
@@ -2862,7 +2861,7 @@
ConsumeToken();
pieces.Add(*ExpectIdentifier("constructor name expected"));
}
- ctor_name = Symbols::FromConcatAll(pieces);
+ ctor_name = Symbols::FromConcatAll(T, pieces);
CheckToken(Token::kLPAREN, "parameter list expected");
ArgumentListNode* arguments = new ArgumentListNode(call_pos);
@@ -3622,7 +3621,7 @@
// Patch up name for unary operator - so it does not clash with the
// name for binary operator -.
method->operator_token = Token::kNEGATE;
- *method->name = Symbols::New(Token::Str(Token::kNEGATE));
+ *method->name = Symbols::Token(Token::kNEGATE).raw();
}
CheckOperatorArity(*method);
}
@@ -3639,7 +3638,7 @@
ASSERT(method->IsSetter());
expected_num_parameters = (method->has_static) ? 1 : 2;
method->dict_name = &String::ZoneHandle(Z,
- Symbols::FromConcat(*method->name, Symbols::Equals()));
+ Symbols::FromConcat(T, *method->name, Symbols::Equals()));
method->name = &String::ZoneHandle(Z, Field::SetterSymbol(*method->name));
}
if ((method->params.num_fixed_parameters != expected_num_parameters) ||
@@ -3724,7 +3723,7 @@
pieces.Add(*ExpectIdentifier("constructor name expected"));
}
String& redir_name =
- String::ZoneHandle(Z, Symbols::FromConcatAll(pieces));
+ String::ZoneHandle(Z, Symbols::FromConcatAll(T, pieces));
method->redirect_name = &redir_name;
CheckToken(Token::kLPAREN);
@@ -4255,7 +4254,7 @@
member.dict_name = ExpectIdentifier("identifier expected");
to_concat.Add(*member.dict_name);
}
- *member.name = Symbols::FromConcatAll(to_concat);
+ *member.name = Symbols::FromConcatAll(T, to_concat);
CheckToken(Token::kLPAREN);
} else if ((CurrentToken() == Token::kGET) && !member.has_var &&
(LookaheadToken(1) != Token::kLPAREN) &&
@@ -4298,8 +4297,8 @@
member.has_operator = true;
member.kind = RawFunction::kRegularFunction;
member.name_pos = this->TokenPos();
- member.name =
- &String::ZoneHandle(Z, Symbols::New(Token::Str(member.operator_token)));
+ member.name = &String::ZoneHandle(Z,
+ Symbols::Token(member.operator_token).raw());
ConsumeToken();
} else if (IsIdentifier()) {
member.name = CurrentLiteral();
@@ -4759,7 +4758,7 @@
if (enum_ident->CharAt(0) == '_') {
*enum_ident = String::ScrubName(*enum_ident);
}
- enum_value_name = Symbols::FromConcat(name_prefix, *enum_ident);
+ enum_value_name = Symbols::FromConcat(T, name_prefix, *enum_ident);
enum_names.Add(enum_value_name, Heap::kOld);
ConsumeToken(); // Enum value name.
@@ -4794,7 +4793,7 @@
// Create a static field that contains the list of enumeration names.
// Clone the _enum_names field from the helper class.
Field& names_field = Field::Handle(Z,
- helper_class.LookupStaticField(Symbols::_EnumNames()));
+ helper_class.LookupStaticFieldAllowPrivate(Symbols::_EnumNames()));
ASSERT(!names_field.IsNull());
names_field = names_field.Clone(cls);
enum_members.AddField(names_field);
@@ -4826,7 +4825,7 @@
void Parser::AddImplicitConstructor(const Class& cls) {
// The implicit constructor is unnamed, has no explicit parameter.
String& ctor_name = String::ZoneHandle(Z, cls.Name());
- ctor_name = Symbols::FromConcat(ctor_name, Symbols::Dot());
+ ctor_name = Symbols::FromDot(T, ctor_name);
// To indicate that this is an implicit constructor, we set the
// token position and end token position of the function
// to the token position of the class.
@@ -5778,7 +5777,7 @@
pieces.Add(Symbols::Dot());
pieces.Add(*ExpectIdentifier("malformed library name"));
}
- lib_name = Symbols::FromConcatAll(pieces);
+ lib_name = Symbols::FromConcatAll(T, pieces);
}
library_.SetName(lib_name);
ExpectSemicolon();
@@ -6588,8 +6587,7 @@
// Create the closure containing the body of this generator function.
String& generator_name = String::Handle(Z, innermost_function().name());
body_closure_name =
- Symbols::NewFormatted("<%s_sync_body>", generator_name.ToCString());
- body_closure_name = Symbols::New(body_closure_name);
+ Symbols::NewFormatted(T, "<%s_sync_body>", generator_name.ToCString());
body = Function::NewClosureFunction(body_closure_name,
innermost_function(),
func_pos);
@@ -6720,8 +6718,8 @@
// Create the closure containing the body of this async function.
const String& async_func_name =
String::Handle(Z, innermost_function().name());
- String& closure_name = String::Handle(Z,
- Symbols::NewFormatted("<%s_async_body>", async_func_name.ToCString()));
+ String& closure_name = String::Handle(Z, Symbols::NewFormatted(T,
+ "<%s_async_body>", async_func_name.ToCString()));
closure = Function::NewClosureFunction(
closure_name,
innermost_function(),
@@ -6853,13 +6851,11 @@
// Create the closure containing the body of this async generator function.
const String& async_generator_name =
String::Handle(Z, innermost_function().name());
- String& closure_name = String::Handle(Z,
- Symbols::NewFormatted("<%s_async_gen_body>",
- async_generator_name.ToCString()));
- closure = Function::NewClosureFunction(
- String::Handle(Z, Symbols::New(closure_name)),
- innermost_function(),
- async_func_pos);
+ const String& closure_name = String::Handle(Z, Symbols::NewFormatted(T,
+ "<%s_async_gen_body>", async_generator_name.ToCString()));
+ closure = Function::NewClosureFunction(closure_name,
+ innermost_function(),
+ async_func_pos);
closure.set_is_generated_body(true);
closure.set_result_type(Object::dynamic_type());
is_new_closure = true;
@@ -8161,10 +8157,10 @@
// Return true if the type class of the given value implements the
// == operator.
-static bool ImplementsEqualOperator(const Instance& value) {
+static bool ImplementsEqualOperator(Zone* zone, const Instance& value) {
Class& cls = Class::Handle(value.clazz());
- const Function& equal_op = Function::Handle(
- Resolver::ResolveDynamicAnyArgs(cls, Symbols::EqualOperator()));
+ const Function& equal_op = Function::Handle(zone,
+ Resolver::ResolveDynamicAnyArgs(zone, cls, Symbols::EqualOperator()));
ASSERT(!equal_op.IsNull());
cls = equal_op.Owner();
return !cls.IsObjectClass();
@@ -8211,7 +8207,7 @@
// Check that the type class does not override the == operator.
// Check this only in the first loop iteration since all values
// are of the same type, which we check above.
- if (ImplementsEqualOperator(val)) {
+ if (ImplementsEqualOperator(Z, val)) {
ReportError(val_pos,
"type class of case expression must not "
"implement operator ==");
@@ -8463,13 +8459,15 @@
}
-static LocalVariable* LookupAsyncSavedTryContextVar(LocalScope* scope,
+static LocalVariable* LookupAsyncSavedTryContextVar(Thread* thread,
+ LocalScope* scope,
uint16_t try_index) {
- const String& async_saved_try_ctx_name =
- String::ZoneHandle(Symbols::NewFormatted(
- "%s%d",
- Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
- try_index));
+ Zone* zone = thread->zone();
+ const String& async_saved_try_ctx_name = String::ZoneHandle(zone,
+ Symbols::NewFormatted(thread,
+ "%s%d",
+ Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
+ try_index));
LocalVariable* var = scope->LocalLookupVariable(async_saved_try_ctx_name);
ASSERT(var != NULL);
return var;
@@ -8507,8 +8505,8 @@
// The block declaring :saved_try_ctx_var variable is the parent of the
// pushed try block.
*saved_try_ctx = LookupSavedTryContextVar(scope->parent());
- *async_saved_try_ctx = LookupAsyncSavedTryContextVar(async_temp_scope_,
- try_index);
+ *async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
+ async_temp_scope_, try_index);
if ((try_stack_->outer_try() != NULL) && !try_stack_->inside_finally()) {
// Collecting the outer try scope is not necessary if we
// are in a finally block.
@@ -8516,8 +8514,8 @@
try_index = try_stack_->outer_try()->try_index();
if (scope->function_level() == current_function_level) {
*outer_saved_try_ctx = LookupSavedTryContextVar(scope->parent());
- *outer_async_saved_try_ctx =
- LookupAsyncSavedTryContextVar(async_temp_scope_, try_index);
+ *outer_async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
+ async_temp_scope_, try_index);
}
}
}
@@ -8542,7 +8540,7 @@
ASSERT(!print_fn.IsNull());
ArgumentListNode* one_arg =
new(Z) ArgumentListNode(TokenPosition::kNoSource);
- String& msg = String::ZoneHandle(Symbols::NewFormatted("%s", str));
+ String& msg = String::ZoneHandle(Symbols::NewFormatted(T, "%s", str));
one_arg->Add(new(Z) LiteralNode(TokenPosition::kNoSource, msg));
AstNode* print_call =
new(Z) StaticCallNode(TokenPosition::kNoSource, print_fn, one_arg);
@@ -9202,9 +9200,8 @@
if (scope->function_level() == current_block_->scope->function_level()) {
LocalVariable* saved_try_ctx =
LookupSavedTryContextVar(scope->parent());
- LocalVariable* async_saved_try_ctx =
- LookupAsyncSavedTryContextVar(async_temp_scope_,
- try_stack_->try_index());
+ LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
+ async_temp_scope_, try_stack_->try_index());
current_block_->statements->Add(
new (Z) StoreLocalNode(
TokenPosition::kNoSource,
@@ -9475,9 +9472,8 @@
if (scope->function_level() == current_block_->scope->function_level()) {
LocalVariable* saved_try_ctx =
LookupSavedTryContextVar(scope->parent());
- LocalVariable* async_saved_try_ctx =
- LookupAsyncSavedTryContextVar(async_temp_scope_,
- try_block->try_index());
+ LocalVariable* async_saved_try_ctx = LookupAsyncSavedTryContextVar(T,
+ async_temp_scope_, try_block->try_index());
async_code->Add(
new (Z) StoreLocalNode(
TokenPosition::kNoSource,
@@ -9505,9 +9501,10 @@
void Parser::SetupSavedTryContext(LocalVariable* saved_try_context) {
const String& async_saved_try_ctx_name = String::ZoneHandle(Z,
- Symbols::NewFormatted("%s%d",
- Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
- last_used_try_index_ - 1));
+ Symbols::NewFormatted(T,
+ "%s%d",
+ Symbols::AsyncSavedTryCtxVarPrefix().ToCString(),
+ last_used_try_index_ - 1));
LocalVariable* async_saved_try_ctx = new (Z) LocalVariable(
TokenPosition::kNoSource,
async_saved_try_ctx_name,
@@ -10345,7 +10342,7 @@
}
// String memberName.
arguments->Add(new(Z) LiteralNode(
- call_pos, String::ZoneHandle(Z, Symbols::New(function_name))));
+ call_pos, String::ZoneHandle(Z, Symbols::New(T, function_name))));
// Smi invocation_type.
if (cls.IsTopLevel()) {
ASSERT(im_call == InvocationMirror::kStatic ||
@@ -10513,7 +10510,7 @@
OS::SNPrint(name, 64, ":%s%" Pd "", s, token_pos.value());
LocalVariable* temp = new(Z) LocalVariable(
token_pos,
- String::ZoneHandle(Z, Symbols::New(name)),
+ String::ZoneHandle(Z, Symbols::New(T, name)),
Object::dynamic_type());
temp->set_is_final();
current_block_->scope->AddVariable(temp);
@@ -10725,7 +10722,7 @@
String& name = String::ZoneHandle(Z);
const Class* target_cls = ¤t_class();
if (original->IsTypeNode()) {
- name = Symbols::New(original->AsTypeNode()->TypeName());
+ name = Symbols::New(T, original->AsTypeNode()->TypeName());
} else if (original->IsLoadStaticFieldNode()) {
name = original->AsLoadStaticFieldNode()->field().name();
target_cls = &Class::Handle(Z,
@@ -11626,7 +11623,7 @@
is_setter_name = true;
}
} else if (Token::CanBeOverloaded(CurrentToken())) {
- extractor_name = Symbols::New(Token::Str(CurrentToken()));
+ extractor_name = Symbols::Token(CurrentToken()).raw();
ConsumeToken();
} else {
ReportError("identifier or operator expected");
@@ -11753,7 +11750,7 @@
pieces.Add(Symbols::SetterPrefix());
}
pieces.Add(extractor_name);
- extractor_name = Symbols::FromConcatAll(pieces);
+ extractor_name = Symbols::FromConcatAll(T, pieces);
return new(Z) InstanceGetterNode(property_pos, primary, extractor_name);
}
@@ -11980,6 +11977,8 @@
class ConstMapKeyEqualsTraits {
public:
+ static const char* Name() { return "ConstMapKeyEqualsTraits"; }
+
static bool IsMatch(const Object& a, const Object& b) {
const Array& key1 = Array::Cast(a);
const Array& key2 = Array::Cast(b);
@@ -12943,7 +12942,7 @@
if (!key_value.IsInteger() &&
!key_value.IsString() &&
(key_value.clazz() != I->object_store()->symbol_class()) &&
- ImplementsEqualOperator(key_value)) {
+ ImplementsEqualOperator(Z, key_value)) {
ReportError(key_pos, "key value must not implement operator ==");
}
}
@@ -13141,9 +13140,9 @@
ConsumeToken();
pieces.Add(*ExpectIdentifier("identifier expected"));
}
- symbol = Symbols::FromConcatAll(pieces);
+ symbol = Symbols::FromConcatAll(T, pieces);
} else if (Token::CanBeOverloaded(CurrentToken())) {
- symbol = Symbols::New(Token::Str(CurrentToken()));
+ symbol = Symbols::Token(CurrentToken()).raw();
ConsumeToken();
} else {
ReportError("illegal symbol literal");
@@ -13190,8 +13189,8 @@
}
String& closure_name = String::Handle(Z, ctr.name());
- closure_name = Symbols::FromConcat(Symbols::ConstructorClosurePrefix(),
- closure_name);
+ closure_name = Symbols::FromConcat(T,
+ Symbols::ConstructorClosurePrefix(), closure_name);
ParamList params;
params.AddFinalParameter(token_pos,
@@ -13223,17 +13222,19 @@
}
-static String& BuildConstructorName(const String& type_class_name,
+static String& BuildConstructorName(Thread* thread,
+ const String& type_class_name,
const String* named_constructor) {
// By convention, the static function implementing a named constructor 'C'
// for class 'A' is labeled 'A.C', and the static function implementing the
// unnamed constructor for class 'A' is labeled 'A.'.
// This convention prevents users from explicitly calling constructors.
- String& constructor_name =
- String::Handle(Symbols::FromConcat(type_class_name, Symbols::Dot()));
+ Zone* zone = thread->zone();
+ String& constructor_name = String::Handle(zone,
+ Symbols::FromDot(thread, type_class_name));
if (named_constructor != NULL) {
constructor_name =
- Symbols::FromConcat(constructor_name, *named_constructor);
+ Symbols::FromConcat(thread, constructor_name, *named_constructor);
}
return constructor_name;
}
@@ -13272,8 +13273,8 @@
Class& type_class = Class::Handle(Z, type.type_class());
String& type_class_name = String::Handle(Z, type_class.Name());
*type_arguments = type.arguments();
- String& constructor_name =
- BuildConstructorName(type_class_name, named_constructor);
+ String& constructor_name = BuildConstructorName(T,
+ type_class_name, named_constructor);
*constructor = type_class.LookupConstructor(constructor_name);
if (constructor->IsNull()) {
*constructor = type_class.LookupFactory(constructor_name);
@@ -13413,8 +13414,8 @@
AbstractType& type_bound = AbstractType::ZoneHandle(Z);
// Make sure that an appropriate constructor exists.
- String& constructor_name =
- BuildConstructorName(type_class_name, named_constructor);
+ String& constructor_name = BuildConstructorName(T,
+ type_class_name, named_constructor);
Function& constructor = Function::ZoneHandle(Z,
type_class.LookupConstructor(constructor_name));
if (constructor.IsNull()) {
@@ -13682,7 +13683,7 @@
}
String& concatenated = String::ZoneHandle(Z);
concatenated ^= result.raw();
- concatenated = Symbols::New(concatenated);
+ concatenated = Symbols::New(T, concatenated);
return concatenated;
}
@@ -13780,7 +13781,8 @@
ASSERT(part.IsString());
pieces.Add(String::Cast(part));
}
- const String& lit = String::ZoneHandle(Z, Symbols::FromConcatAll(pieces));
+ const String& lit = String::ZoneHandle(Z,
+ Symbols::FromConcatAll(T, pieces));
primary = new(Z) LiteralNode(literal_start, lit);
// Caching of constant not necessary because the symbol lookup will
// find the value next time.
@@ -13870,7 +13872,7 @@
pieces.Add(Symbols::Dot());
pieces.Add(ident);
const String& qualified_name = String::ZoneHandle(Z,
- Symbols::FromConcatAll(pieces));
+ Symbols::FromConcatAll(T, pieces));
InvocationMirror::Type call_type =
CurrentToken() == Token::kLPAREN ?
InvocationMirror::kMethod : InvocationMirror::kGetter;
@@ -13884,9 +13886,12 @@
}
} else if (FLAG_load_deferred_eagerly && prefix.is_deferred_load()) {
// primary != NULL.
- String& qualified_name = String::ZoneHandle(Z, prefix.name());
- qualified_name = String::Concat(qualified_name, Symbols::Dot());
- qualified_name = Symbols::FromConcat(qualified_name, ident);
+ GrowableHandlePtrArray<const String> pieces(Z, 3);
+ pieces.Add(String::Handle(Z, prefix.name()));
+ pieces.Add(Symbols::Dot());
+ pieces.Add(ident);
+ const String& qualified_name = String::ZoneHandle(Z,
+ Symbols::FromConcatAll(T, pieces));
InvocationMirror::Type call_type =
CurrentToken() == Token::kLPAREN ?
InvocationMirror::kMethod : InvocationMirror::kGetter;
diff --git a/runtime/vm/parser_test.cc b/runtime/vm/parser_test.cc
index 5889227..120e5ca 100644
--- a/runtime/vm/parser_test.cc
+++ b/runtime/vm/parser_test.cc
@@ -21,7 +21,8 @@
static void DumpFunction(const Library& lib,
const char* cname,
const char* fname) {
- const String& classname = String::Handle(Symbols::New(cname));
+ const String& classname = String::Handle(Symbols::New(Thread::Current(),
+ cname));
String& funcname = String::Handle(String::New(fname));
bool retval;
@@ -56,7 +57,8 @@
const char* field_name,
bool expect_static,
bool is_final) {
- const String& classname = String::Handle(Symbols::New(class_name));
+ const String& classname = String::Handle(Symbols::New(Thread::Current(),
+ class_name));
Class& cls = Class::Handle(lib.LookupClass(classname));
EXPECT(!cls.IsNull());
@@ -65,7 +67,7 @@
Function& function = Function::Handle();
Field& field = Field::Handle();
if (expect_static) {
- field ^= cls.LookupStaticField(fieldname);
+ field ^= cls.LookupStaticFieldAllowPrivate(fieldname);
functionname ^= Field::GetterName(fieldname);
function ^= cls.LookupStaticFunction(functionname);
EXPECT(function.IsNull());
@@ -73,7 +75,7 @@
function ^= cls.LookupStaticFunction(functionname);
EXPECT(function.IsNull());
} else {
- field ^= cls.LookupInstanceField(fieldname);
+ field ^= cls.LookupInstanceFieldAllowPrivate(fieldname);
functionname ^= Field::GetterName(fieldname);
function ^= cls.LookupDynamicFunction(functionname);
EXPECT(!function.IsNull());
@@ -91,7 +93,8 @@
const char* class_name,
const char* function_name,
bool expect_static) {
- const String& classname = String::Handle(Symbols::New(class_name));
+ const String& classname = String::Handle(Symbols::New(Thread::Current(),
+ class_name));
Class& cls = Class::Handle(lib.LookupClass(classname));
EXPECT(!cls.IsNull());
diff --git a/runtime/vm/precompiler.cc b/runtime/vm/precompiler.cc
index dcabc02..fc83b31 100644
--- a/runtime/vm/precompiler.cc
+++ b/runtime/vm/precompiler.cc
@@ -348,9 +348,9 @@
String& function_name = String::Handle(Z);
for (intptr_t i = 0; entry_points[i].library_uri != NULL; i++) {
- library_uri = Symbols::New(entry_points[i].library_uri);
- class_name = Symbols::New(entry_points[i].class_name);
- function_name = Symbols::New(entry_points[i].function_name);
+ library_uri = Symbols::New(thread(), entry_points[i].library_uri);
+ class_name = Symbols::New(thread(), entry_points[i].class_name);
+ function_name = Symbols::New(thread(), entry_points[i].function_name);
lib = Library::LookupLibrary(library_uri);
if (lib.IsNull()) {
@@ -382,7 +382,7 @@
ASSERT(!cls.IsNull());
func = cls.LookupFunctionAllowPrivate(function_name);
- field = cls.LookupField(function_name);
+ field = cls.LookupFieldAllowPrivate(function_name);
}
if (func.IsNull() && field.IsNull()) {
@@ -846,7 +846,7 @@
// Function fits the bill.
const char* kEvalConst = "eval_const";
const Function& func = Function::ZoneHandle(Function::New(
- String::Handle(Symbols::New(kEvalConst)),
+ String::Handle(Symbols::New(thread, kEvalConst)),
RawFunction::kRegularFunction,
true, // static function
false, // not const function
@@ -989,14 +989,14 @@
// Handle the implicit call type conversions.
if (Field::IsGetterName(selector)) {
selector2 = Field::NameFromGetter(selector);
- selector3 = Symbols::Lookup(selector2);
+ selector3 = Symbols::Lookup(thread(), selector2);
if (IsSent(selector2)) {
// Call-through-getter.
// Function is get:foo and somewhere foo is called.
AddFunction(function);
}
- selector3 = Symbols::LookupFromConcat(Symbols::ClosurizePrefix(),
- selector2);
+ selector3 = Symbols::LookupFromConcat(thread(),
+ Symbols::ClosurizePrefix(), selector2);
if (IsSent(selector3)) {
// Hash-closurization.
// Function is get:foo and somewhere get:#foo is called.
@@ -1010,8 +1010,8 @@
AddFunction(function2);
}
} else if (Field::IsSetterName(selector)) {
- selector2 = Symbols::LookupFromConcat(Symbols::ClosurizePrefix(),
- selector);
+ selector2 = Symbols::LookupFromConcat(thread(),
+ Symbols::ClosurizePrefix(), selector);
if (IsSent(selector2)) {
// Hash-closurization.
// Function is set:foo and somewhere get:#set:foo is called.
@@ -1036,8 +1036,8 @@
function2 = function.GetMethodExtractor(selector2);
AddFunction(function2);
}
- selector2 = Symbols::LookupFromConcat(Symbols::ClosurizePrefix(),
- selector);
+ selector2 = Symbols::LookupFromConcat(thread(),
+ Symbols::ClosurizePrefix(), selector);
if (IsSent(selector2)) {
// Hash-closurization.
// Function is foo and somewhere get:#foo is called.
@@ -1057,6 +1057,8 @@
class NameFunctionsTraits {
public:
+ static const char* Name() { return "NameFunctionsTraits"; }
+
static bool IsMatch(const Object& a, const Object& b) {
return a.IsString() && b.IsString() &&
String::Cast(a).Equals(String::Cast(b));
diff --git a/runtime/vm/precompiler.h b/runtime/vm/precompiler.h
index 319eb34..5799819 100644
--- a/runtime/vm/precompiler.h
+++ b/runtime/vm/precompiler.h
@@ -372,6 +372,8 @@
class FunctionsTraits {
public:
+ static const char* Name() { return "FunctionsTraits"; }
+
static bool IsMatch(const Object& a, const Object& b) {
Zone* zone = Thread::Current()->zone();
String& a_s = String::Handle(zone);
diff --git a/runtime/vm/profiler_test.cc b/runtime/vm/profiler_test.cc
index 6d63bc1..1ecac9f 100644
--- a/runtime/vm/profiler_test.cc
+++ b/runtime/vm/profiler_test.cc
@@ -180,15 +180,16 @@
static RawClass* GetClass(const Library& lib, const char* name) {
const Class& cls = Class::Handle(
- lib.LookupClassAllowPrivate(String::Handle(Symbols::New(name))));
+ lib.LookupClassAllowPrivate(String::Handle(Symbols::New(Thread::Current(),
+ name))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
return cls.raw();
}
static RawFunction* GetFunction(const Library& lib, const char* name) {
- const Function& func = Function::Handle(
- lib.LookupFunctionAllowPrivate(String::Handle(Symbols::New(name))));
+ const Function& func = Function::Handle(lib.LookupFunctionAllowPrivate(
+ String::Handle(Symbols::New(Thread::Current(), name))));
EXPECT(!func.IsNull()); // No ambiguity error expected.
return func.raw();
}
@@ -2365,6 +2366,8 @@
// Disable profiling for this thread.
DisableThreadInterruptsScope dtis(Thread::Current());
+ DisableBackgroundCompilationScope dbcs;
+
SampleBuffer* sample_buffer = Profiler::sample_buffer();
EXPECT(sample_buffer != NULL);
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 323fed4..6a5d626 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1021,7 +1021,7 @@
RawString* private_key_;
RawArray* dictionary_; // Top-level names in this library.
RawGrowableObjectArray* metadata_; // Metadata on classes, methods etc.
- RawClass* toplevel_class_; // Class containing top-level elements.
+ RawClass* toplevel_class_; // Class containing top-level elements.
RawGrowableObjectArray* patch_classes_;
RawArray* imports_; // List of Namespaces imported without prefix.
RawArray* exports_; // List of re-exported Namespaces.
@@ -1040,13 +1040,13 @@
Dart_NativeEntryResolver native_entry_resolver_; // Resolves natives.
Dart_NativeEntrySymbol native_entry_symbol_resolver_;
- classid_t index_; // Library id number.
- uint16_t num_imports_; // Number of entries in imports_.
- int8_t load_state_; // Of type LibraryState.
+ classid_t index_; // Library id number.
+ uint16_t num_imports_; // Number of entries in imports_.
+ int8_t load_state_; // Of type LibraryState.
bool corelib_imported_;
bool is_dart_scheme_;
- bool debuggable_; // True if debugger can stop in library.
- bool is_in_fullsnapshot_; // True if library is in a full snapshot.
+ bool debuggable_; // True if debugger can stop in library.
+ bool is_in_fullsnapshot_; // True if library is in a full snapshot.
friend class Class;
friend class Isolate;
@@ -1478,6 +1478,10 @@
int32_t deopt_id_; // Deoptimization id corresponding to this IC.
uint32_t state_bits_; // Number of arguments tested in IC, deopt reasons,
// range feedback.
+#if defined(TAG_IC_DATA)
+ intptr_t tag_; // Debugging, verifying that the icdata is assigned to the
+ // same instruction again. Store -1 or Instruction::Tag.
+#endif
};
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index e8fcf69..0ca54d8 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -1972,6 +1972,9 @@
result.set_deopt_id(reader->Read<int32_t>());
result.set_state_bits(reader->Read<uint32_t>());
+#if defined(TAG_IC_DATA)
+ result.set_tag(reader->Read<int16_t>());
+#endif
// Set all the object fields.
RawObject** toobj = reader->snapshot_code()
@@ -2004,6 +2007,9 @@
// Write out all the non object fields.
writer->Write<int32_t>(ptr()->deopt_id_);
writer->Write<uint32_t>(ptr()->state_bits_);
+#if defined(TAG_IC_DATA)
+ writer->Write<int16_t>(ptr()->tag_);
+#endif
// Write out all the object pointer fields.
// In precompiled snapshots, omit the owner field. The owner field may
@@ -2512,7 +2518,7 @@
for (intptr_t i = 0; i < len; i++) {
ptr[i] = reader->Read<CharacterType>();
}
- *str_obj ^= (*new_symbol)(ptr, len);
+ *str_obj ^= (*new_symbol)(reader->thread(), ptr, len);
} else {
// Set up the string object.
*str_obj = StringType::New(len, HEAP_SPACE(kind));
diff --git a/runtime/vm/regexp.cc b/runtime/vm/regexp.cc
index 62fab5a..f119a25 100644
--- a/runtime/vm/regexp.cc
+++ b/runtime/vm/regexp.cc
@@ -5244,7 +5244,7 @@
}
-static void CreateSpecializedFunction(Zone* zone,
+static void CreateSpecializedFunction(Thread* thread, Zone* zone,
const RegExp& regexp,
intptr_t specialization_cid,
const Object& owner) {
@@ -5252,7 +5252,7 @@
Function& fn = Function::Handle(zone, Function::New(
// Append the regexp pattern to the function name.
- String::Handle(zone, Symbols::New(
+ String::Handle(zone, Symbols::New(thread,
String::Handle(zone, String::Concat(
String::Handle(zone, String::Concat(
Symbols::ColonMatcher(),
@@ -5297,10 +5297,11 @@
}
-RawRegExp* RegExpEngine::CreateRegExp(Zone* zone,
- const String& pattern,
- bool multi_line,
- bool ignore_case) {
+RawRegExp* RegExpEngine::CreateRegExp(Thread* thread,
+ const String& pattern,
+ bool multi_line,
+ bool ignore_case) {
+ Zone* zone = thread->zone();
const RegExp& regexp = RegExp::Handle(RegExp::New());
regexp.set_pattern(pattern);
@@ -5319,13 +5320,15 @@
if (!FLAG_interpret_irregexp) {
const Library& lib = Library::Handle(zone, Library::CoreLibrary());
- const Class& owner = Class::Handle(
- zone, lib.LookupClass(Symbols::RegExp()));
+ const Class& owner = Class::Handle(zone,
+ lib.LookupClass(Symbols::RegExp()));
- CreateSpecializedFunction(zone, regexp, kOneByteStringCid, owner);
- CreateSpecializedFunction(zone, regexp, kTwoByteStringCid, owner);
- CreateSpecializedFunction(zone, regexp, kExternalOneByteStringCid, owner);
- CreateSpecializedFunction(zone, regexp, kExternalTwoByteStringCid, owner);
+ CreateSpecializedFunction(thread, zone, regexp, kOneByteStringCid, owner);
+ CreateSpecializedFunction(thread, zone, regexp, kTwoByteStringCid, owner);
+ CreateSpecializedFunction(thread, zone,
+ regexp, kExternalOneByteStringCid, owner);
+ CreateSpecializedFunction(thread, zone,
+ regexp, kExternalTwoByteStringCid, owner);
}
return regexp.raw();
diff --git a/runtime/vm/regexp.h b/runtime/vm/regexp.h
index 49aef37..bc8edd5 100644
--- a/runtime/vm/regexp.h
+++ b/runtime/vm/regexp.h
@@ -1425,7 +1425,7 @@
Zone* zone);
static RawRegExp* CreateRegExp(
- Zone* zone,
+ Thread* thread,
const String& pattern,
bool multi_line,
bool ignore_case);
diff --git a/runtime/vm/regexp_assembler_ir.cc b/runtime/vm/regexp_assembler_ir.cc
index 6f656db..aac090e 100644
--- a/runtime/vm/regexp_assembler_ir.cc
+++ b/runtime/vm/regexp_assembler_ir.cc
@@ -431,7 +431,7 @@
const Class& regexp_class = Class::Handle(Z,
lib.LookupClassAllowPrivate(Symbols::_RegExp()));
const Field& word_character_field = Field::ZoneHandle(Z,
- regexp_class.LookupStaticField(Symbols::_wordCharacterMap()));
+ regexp_class.LookupStaticFieldAllowPrivate(Symbols::_wordCharacterMap()));
ASSERT(!word_character_field.IsNull());
if (word_character_field.IsUninitialized()) {
diff --git a/runtime/vm/regexp_test.cc b/runtime/vm/regexp_test.cc
index e7c5ba8..3948f64 100644
--- a/runtime/vm/regexp_test.cc
+++ b/runtime/vm/regexp_test.cc
@@ -13,9 +13,10 @@
namespace dart {
static RawArray* Match(const String& pat, const String& str) {
- Zone* zone = Thread::Current()->zone();
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
const RegExp& regexp = RegExp::Handle(
- RegExpEngine::CreateRegExp(zone, pat, false, false));
+ RegExpEngine::CreateRegExp(thread, pat, false, false));
const Smi& idx = Smi::Handle(Smi::New(0));
return IRRegExpMacroAssembler::Execute(regexp, str, idx, zone);
}
diff --git a/runtime/vm/report.cc b/runtime/vm/report.cc
index 01b7a86..b53c494 100644
--- a/runtime/vm/report.cc
+++ b/runtime/vm/report.cc
@@ -43,7 +43,7 @@
// Only report the line position if we have the original source. We still
// need to get a valid column so that we can report the ^ mark below the
// snippet.
- // Allocate formatted strings in old sapce as they may be created during
+ // Allocate formatted strings in old space as they may be created during
// optimizing compilation. Those strings are created rarely and should not
// polute old space.
if (script.HasSource()) {
@@ -61,24 +61,23 @@
line);
}
// Append the formatted error or warning message.
- GrowableHandlePtrArray<const String> strs(Thread::Current()->zone(), 5);
- strs.Add(result);
- strs.Add(message);
+ const Array& strs = Array::Handle(
+ Array::New(6, Heap::kOld));
+ strs.SetAt(0, result);
+ strs.SetAt(1, message);
// Append the source line.
const String& script_line = String::Handle(
script.GetLine(line, Heap::kOld));
ASSERT(!script_line.IsNull());
- strs.Add(Symbols::NewLine());
- strs.Add(script_line);
- strs.Add(Symbols::NewLine());
+ strs.SetAt(2, Symbols::NewLine());
+ strs.SetAt(3, script_line);
+ strs.SetAt(4, Symbols::NewLine());
// Append the column marker.
const String& column_line = String::Handle(
String::NewFormatted(Heap::kOld,
"%*s\n", static_cast<int>(column), "^"));
- strs.Add(column_line);
- // TODO(srdjan): Use Strings::FromConcatAll in old space, once
- // implemented.
- result = Symbols::FromConcatAll(strs);
+ strs.SetAt(5, column_line);
+ result = String::ConcatAll(strs, Heap::kOld);
} else {
// Token position is unknown.
result = String::NewFormatted(Heap::kOld, "'%s': %s: ",
diff --git a/runtime/vm/resolver.cc b/runtime/vm/resolver.cc
index caaf556..95f8c62 100644
--- a/runtime/vm/resolver.cc
+++ b/runtime/vm/resolver.cc
@@ -36,9 +36,11 @@
const String& function_name,
const ArgumentsDescriptor& args_desc,
bool allow_add) {
+ Thread* thread = Thread::Current();
+ Zone* zone = thread->zone();
- Function& function = Function::Handle(
- ResolveDynamicAnyArgs(receiver_class, function_name, allow_add));
+ Function& function = Function::Handle(zone,
+ ResolveDynamicAnyArgs(zone, receiver_class, function_name, allow_add));
if (function.IsNull() ||
!function.AreValidArguments(args_desc, NULL)) {
@@ -46,7 +48,7 @@
// "noSuchMethod" function.
if (FLAG_trace_resolving) {
String& error_message =
- String::Handle(Symbols::New("function not found"));
+ String::Handle(zone, Symbols::New(thread, "function not found"));
if (!function.IsNull()) {
// Obtain more detailed error message.
function.AreValidArguments(args_desc, &error_message);
@@ -62,18 +64,19 @@
RawFunction* Resolver::ResolveDynamicAnyArgs(
+ Zone* zone,
const Class& receiver_class,
const String& function_name,
bool allow_add) {
- Class& cls = Class::Handle(receiver_class.raw());
+ Class& cls = Class::Handle(zone, receiver_class.raw());
if (FLAG_trace_resolving) {
THR_Print("ResolveDynamic '%s' for class %s\n",
function_name.ToCString(),
- String::Handle(cls.Name()).ToCString());
+ String::Handle(zone, cls.Name()).ToCString());
}
const bool is_getter = Field::IsGetterName(function_name);
- String& field_name = String::Handle();
+ String& field_name = String::Handle(zone);
if (is_getter) {
field_name ^= Field::NameFromGetter(function_name);
@@ -88,7 +91,7 @@
field_name = String::SubString(field_name, 1);
ASSERT(!Field::IsGetterName(field_name));
- String& property_getter_name = String::Handle();
+ String& property_getter_name = String::Handle(zone);
if (!Field::IsSetterName(field_name)) {
// If this is not a setter, we need to look for both the regular
// name and the getter name. (In the case of an operator, this
@@ -97,7 +100,7 @@
property_getter_name = Field::GetterName(field_name);
}
- Function& function = Function::Handle();
+ Function& function = Function::Handle(zone);
while (!cls.IsNull()) {
function = cls.LookupDynamicFunction(field_name);
if (!function.IsNull()) {
@@ -117,7 +120,7 @@
// Now look for an instance function whose name matches function_name
// in the class.
- Function& function = Function::Handle();
+ Function& function = Function::Handle(zone);
while (!cls.IsNull()) {
function ^= cls.LookupDynamicFunction(function_name);
if (!function.IsNull()) {
diff --git a/runtime/vm/resolver.h b/runtime/vm/resolver.h
index 32629aa..9a52ad3 100644
--- a/runtime/vm/resolver.h
+++ b/runtime/vm/resolver.h
@@ -37,6 +37,7 @@
// If 'allow_add' is true we may add a function to the class during lookup.
static RawFunction* ResolveDynamicAnyArgs(
+ Zone* zone,
const Class& receiver_class,
const String& function_name,
bool allow_add = true);
diff --git a/runtime/vm/resolver_test.cc b/runtime/vm/resolver_test.cc
index f06e42f..52aa4b6 100644
--- a/runtime/vm/resolver_test.cc
+++ b/runtime/vm/resolver_test.cc
@@ -158,7 +158,7 @@
const Library& lib = Library::Handle(Library::LookupLibrary(lib_name));
ASSERT(!lib.IsNull());
const Class& cls = Class::Handle(lib.LookupClass(
- String::Handle(Symbols::New(test_class_name))));
+ String::Handle(Symbols::New(thread, test_class_name))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
Instance& receiver = Instance::Handle(Instance::New(cls));
diff --git a/runtime/vm/runtime_entry.cc b/runtime/vm/runtime_entry.cc
index 101898f..b8d043b 100644
--- a/runtime/vm/runtime_entry.cc
+++ b/runtime/vm/runtime_entry.cc
@@ -14,12 +14,13 @@
// Add function to a class and that class to the class dictionary so that
// frame walking can be used.
const Function& RegisterFakeFunction(const char* name, const Code& code) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ Thread* thread = Thread::Current();
+ const String& class_name = String::Handle(Symbols::New(thread, "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class =
Class::Handle(Class::New(class_name, script,
TokenPosition::kNoSource));
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(Symbols::New(thread, name));
const Function& function = Function::ZoneHandle(
Function::New(function_name,
RawFunction::kRegularFunction,
diff --git a/runtime/vm/safepoint.cc b/runtime/vm/safepoint.cc
index fcf2872..6cbd0f7 100644
--- a/runtime/vm/safepoint.cc
+++ b/runtime/vm/safepoint.cc
@@ -96,8 +96,15 @@
// Now wait for all threads that are not already at a safepoint to check-in.
{
MonitorLocker sl(safepoint_lock_);
+ intptr_t num_attempts = 0;
while (number_threads_not_at_safepoint_ > 0) {
- sl.Wait();
+ Monitor::WaitResult retval = sl.Wait(1000);
+ if (retval == Monitor::kTimedOut) {
+ num_attempts += 1;
+ OS::Print("Attempt:%" Pd " waiting for %d threads to check in\n",
+ num_attempts,
+ number_threads_not_at_safepoint_);
+ }
}
}
}
diff --git a/runtime/vm/safepoint.h b/runtime/vm/safepoint.h
index 1c13a87..9477425 100644
--- a/runtime/vm/safepoint.h
+++ b/runtime/vm/safepoint.h
@@ -309,12 +309,6 @@
} else {
ASSERT(execution_state_ == Thread::kThreadInVM);
thread()->set_execution_state(Thread::kThreadInVM);
- // Fast check to see if a safepoint is requested or not.
- // We do the more expensive operation of blocking the thread
- // only if a safepoint is requested.
- if (thread()->IsSafepointRequested()) {
- handler()->BlockForSafepoint(thread());
- }
}
}
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index a040476..9cbe84a 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -18,8 +18,9 @@
DEFINE_FLAG(bool, print_tokens, false, "Print scanned tokens.");
-// Quick access to the locally defined zone() method.
+// Quick access to the locally defined zone() and thread() methods.
#define Z (zone())
+#define T (thread())
class ScanContext : public ZoneAllocated {
@@ -83,7 +84,8 @@
saved_context_(NULL),
private_key_(String::ZoneHandle(private_key.raw())),
char_at_func_(src.CharAtFunc()),
- zone_(Thread::Current()->zone()) {
+ thread_(Thread::Current()),
+ zone_(thread_->zone()) {
Reset();
}
@@ -93,7 +95,7 @@
void Scanner::ErrorMsg(const char* msg) {
current_token_.kind = Token::kERROR;
- current_token_.literal = &String::ZoneHandle(Z, Symbols::New(msg));
+ current_token_.literal = &String::ZoneHandle(Z, Symbols::New(T, msg));
current_token_.position = c0_pos_;
token_start_ = lookahead_pos_;
current_token_.offset = lookahead_pos_;
@@ -328,10 +330,10 @@
// We did not read a keyword.
current_token_.kind = Token::kIDENT;
String& literal =
- String::ZoneHandle(Z, Symbols::New(source_, ident_pos, ident_length));
+ String::ZoneHandle(Z, Symbols::New(T, source_, ident_pos, ident_length));
if (ident_char0 == Library::kPrivateIdentifierStart) {
// Private identifiers are mangled on a per library basis.
- literal = Symbols::FromConcat(literal, private_key_);
+ literal = Symbols::FromConcat(T, literal, private_key_);
}
current_token_.literal = &literal;
}
@@ -386,7 +388,7 @@
if (current_token_.kind != Token::kILLEGAL) {
intptr_t len = lookahead_pos_ - token_start_;
const String& str =
- String::ZoneHandle(Z, Symbols::New(source_, token_start_, len));
+ String::ZoneHandle(Z, Symbols::New(T, source_, token_start_, len));
current_token_.literal = &str;
}
}
@@ -540,7 +542,7 @@
ASSERT(string_chars.data() != NULL);
// Strings are canonicalized: Allocate a symbol.
current_token_.literal = &String::ZoneHandle(Z,
- Symbols::FromUTF32(string_chars.data(), string_chars.length()));
+ Symbols::FromUTF32(T, string_chars.data(), string_chars.length()));
// Preserve error tokens.
if (current_token_.kind != Token::kERROR) {
current_token_.kind = Token::kSTRING;
@@ -563,7 +565,8 @@
ASSERT(string_chars.data() != NULL);
// Strings are canonicalized: Allocate a symbol.
current_token_.literal = &String::ZoneHandle(Z,
- Symbols::FromUTF32(string_chars.data(), string_chars.length()));
+ Symbols::FromUTF32(T,
+ string_chars.data(), string_chars.length()));
}
EndStringLiteral();
return;
@@ -970,7 +973,7 @@
keywords_[i].kind = token;
keywords_[i].keyword_chars = Token::Str(token);
keywords_[i].keyword_len = strlen(Token::Str(token));
- keywords_[i].keyword_symbol = &Symbols::Keyword(token);
+ keywords_[i].keyword_symbol = &Symbols::Token(token);
int ch = keywords_[i].keyword_chars[0] - 'a';
if (keywords_char_offset_[ch] == Token::kNumKeywords) {
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 92ebcd6..8d5c6d5 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -180,6 +180,7 @@
CharAtFunc CallCharAt() const { return char_at_func_; }
+ Thread* thread() const { return thread_; }
Zone* zone() const { return zone_; }
static void PrintTokens(const GrowableTokenStream& ts);
@@ -209,6 +210,7 @@
const CharAtFunc char_at_func_;
+ Thread* thread_;
Zone* zone_;
static KeywordTable keywords_[Token::kNumKeywords];
diff --git a/runtime/vm/scopes_test.cc b/runtime/vm/scopes_test.cc
index 8dac606..807f9f9 100644
--- a/runtime/vm/scopes_test.cc
+++ b/runtime/vm/scopes_test.cc
@@ -12,18 +12,18 @@
TEST_CASE(LocalScope) {
// Allocate a couple of local variables first.
const Type& dynamic_type = Type::ZoneHandle(Type::DynamicType());
- const String& a = String::ZoneHandle(Symbols::New("a"));
+ const String& a = String::ZoneHandle(Symbols::New(thread, "a"));
LocalVariable* var_a =
new LocalVariable(TokenPosition::kNoSource, a, dynamic_type);
LocalVariable* inner_var_a =
new LocalVariable(TokenPosition::kNoSource, a, dynamic_type);
- const String& b = String::ZoneHandle(Symbols::New("b"));
+ const String& b = String::ZoneHandle(Symbols::New(thread, "b"));
LocalVariable* var_b =
new LocalVariable(TokenPosition::kNoSource, b, dynamic_type);
- const String& c = String::ZoneHandle(Symbols::New("c"));
+ const String& c = String::ZoneHandle(Symbols::New(thread, "c"));
LocalVariable* var_c =
new LocalVariable(TokenPosition::kNoSource, c, dynamic_type);
- const String& L = String::ZoneHandle(Symbols::New("L"));
+ const String& L = String::ZoneHandle(Symbols::New(thread, "L"));
SourceLabel* label_L =
new SourceLabel(TokenPosition::kNoSource, L, SourceLabel::kFor);
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index 62048e0..efed3c0 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -9,7 +9,6 @@
#include "platform/globals.h"
#include "vm/compiler.h"
-#include "vm/coverage.h"
#include "vm/cpu.h"
#include "vm/dart_api_impl.h"
#include "vm/dart_api_state.h"
@@ -2287,121 +2286,6 @@
}
-class LibraryCoverageFilter : public CoverageFilter {
- public:
- explicit LibraryCoverageFilter(const Library& lib) : lib_(lib) {}
- bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const {
- return lib.raw() == lib_.raw();
- }
- private:
- const Library& lib_;
-};
-
-
-class ScriptCoverageFilter : public CoverageFilter {
- public:
- explicit ScriptCoverageFilter(const Script& script)
- : script_(script) {}
- bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const {
- return script.raw() == script_.raw();
- }
- private:
- const Script& script_;
-};
-
-
-class ClassCoverageFilter : public CoverageFilter {
- public:
- explicit ClassCoverageFilter(const Class& cls) : cls_(cls) {}
- bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const {
- return cls.raw() == cls_.raw();
- }
- private:
- const Class& cls_;
-};
-
-
-class FunctionCoverageFilter : public CoverageFilter {
- public:
- explicit FunctionCoverageFilter(const Function& func) : func_(func) {}
- bool ShouldOutputCoverageFor(const Library& lib,
- const Script& script,
- const Class& cls,
- const Function& func) const {
- return func.raw() == func_.raw();
- }
- private:
- const Function& func_;
-};
-
-
-static bool GetHitsOrSites(Thread* thread, JSONStream* js, bool as_sites) {
- if (!thread->isolate()->compilation_allowed()) {
- js->PrintError(kFeatureDisabled,
- "Cannot get coverage data when running a precompiled program.");
- return true;
- }
- if (!js->HasParam("targetId")) {
- CodeCoverage::PrintJSON(thread, js, NULL, as_sites);
- return true;
- }
- const char* target_id = js->LookupParam("targetId");
- Object& obj = Object::Handle(LookupHeapObject(thread, target_id, NULL));
- if (obj.raw() == Object::sentinel().raw()) {
- PrintInvalidParamError(js, "targetId");
- return true;
- }
- if (obj.IsScript()) {
- ScriptCoverageFilter sf(Script::Cast(obj));
- CodeCoverage::PrintJSON(thread, js, &sf, as_sites);
- return true;
- }
- if (obj.IsLibrary()) {
- LibraryCoverageFilter lf(Library::Cast(obj));
- CodeCoverage::PrintJSON(thread, js, &lf, as_sites);
- return true;
- }
- if (obj.IsClass()) {
- ClassCoverageFilter cf(Class::Cast(obj));
- CodeCoverage::PrintJSON(thread, js, &cf, as_sites);
- return true;
- }
- if (obj.IsFunction()) {
- FunctionCoverageFilter ff(Function::Cast(obj));
- CodeCoverage::PrintJSON(thread, js, &ff, as_sites);
- return true;
- }
- js->PrintError(kInvalidParams,
- "%s: invalid 'targetId' parameter: "
- "id '%s' does not correspond to a "
- "script, library, class, or function",
- js->method(), target_id);
- return true;
-}
-
-
-static const MethodParameter* get_coverage_params[] = {
- RUNNABLE_ISOLATE_PARAMETER,
- new IdParameter("targetId", false),
- NULL,
-};
-
-
-static bool GetCoverage(Thread* thread, JSONStream* js) {
- // TODO(rmacnak): Remove this response; it is subsumed by GetCallSiteData.
- return GetHitsOrSites(thread, js, false);
-}
-
-
static const char* const report_enum_names[] = {
SourceReport::kCallSitesStr,
SourceReport::kCoverageStr,
@@ -2490,18 +2374,6 @@
}
-static const MethodParameter* get_call_site_data_params[] = {
- RUNNABLE_ISOLATE_PARAMETER,
- new IdParameter("targetId", false),
- NULL,
-};
-
-
-static bool GetCallSiteData(Thread* thread, JSONStream* js) {
- return GetHitsOrSites(thread, js, true);
-}
-
-
static bool AddBreakpointCommon(Thread* thread,
JSONStream* js,
const String& script_uri) {
@@ -3725,7 +3597,7 @@
JSONObject jsobj(js);
jsobj.AddProperty("type", "Version");
jsobj.AddProperty("major", static_cast<intptr_t>(3));
- jsobj.AddProperty("minor", static_cast<intptr_t>(3));
+ jsobj.AddProperty("minor", static_cast<intptr_t>(4));
jsobj.AddProperty("_privateMajor", static_cast<intptr_t>(0));
jsobj.AddProperty("_privateMinor", static_cast<intptr_t>(0));
return true;
@@ -4015,12 +3887,8 @@
get_allocation_profile_params },
{ "_getAllocationSamples", GetAllocationSamples,
get_allocation_samples_params },
- { "_getCallSiteData", GetCallSiteData,
- get_call_site_data_params },
{ "getClassList", GetClassList,
get_class_list_params },
- { "_getCoverage", GetCoverage,
- get_coverage_params },
{ "_getCpuProfile", GetCpuProfile,
get_cpu_profile_params },
{ "_getCpuProfileTimeline", GetCpuProfileTimeline,
diff --git a/runtime/vm/service/service.md b/runtime/vm/service/service.md
index 68d134f..ee6d8e9 100644
--- a/runtime/vm/service/service.md
+++ b/runtime/vm/service/service.md
@@ -2518,5 +2518,5 @@
3.1 | Add the getSourceReport RPC. The getObject RPC now accepts offset and count for string objects. String objects now contain length, offset, and count properties.
3.2 | Isolate objects now include the runnable bit and many debugger related RPCs will return an error if executed on an isolate before it is runnable.
3.3 | Pause event now indicates if the isolate is paused at an await, yield, or yield* suspension point via the 'atAsyncSuspension' field. Resume command now supports the step parameter 'OverAsyncSuspension'. A Breakpoint added synthetically by an 'OverAsyncSuspension' resume command identifies itself as such via the 'isSyntheticAsyncContinuation' field.
-3.4 | Add the superType and mixin fields to Class.
+3.4 | Add the superType and mixin fields to Class. Added new pause event 'None'.
[discuss-list]: https://groups.google.com/a/dartlang.org/forum/#!forum/observatory-discuss
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index b211fb7..5071bce 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -109,7 +109,7 @@
static RawClass* GetClass(const Library& lib, const char* name) {
const Class& cls = Class::Handle(
- lib.LookupClass(String::Handle(Symbols::New(name))));
+ lib.LookupClass(String::Handle(Symbols::New(Thread::Current(), name))));
EXPECT(!cls.IsNull()); // No ambiguity error expected.
return cls.raw();
}
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index f7a880d..c455d30 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -1917,11 +1917,13 @@
ScriptVisitor script_visitor(thread(), &scripts_);
heap()->IterateOldObjects(&script_visitor);
- // Stash the symbol table away for writing and reading into the vm isolate,
- // and reset the symbol table for the regular isolate so that we do not
- // write these symbols into the snapshot of a regular dart isolate.
- symbol_table_ = object_store->symbol_table();
- Symbols::SetupSymbolTable(isolate());
+ if (vm_isolate_snapshot_buffer != NULL) {
+ // Stash the symbol table away for writing and reading into the vm isolate,
+ // and reset the symbol table for the regular isolate so that we do not
+ // write these symbols into the snapshot of a regular dart isolate.
+ symbol_table_ = object_store->symbol_table();
+ Symbols::SetupSymbolTable(isolate());
+ }
forward_list_ = new ForwardList(thread(), SnapshotWriter::FirstObjectId());
ASSERT(forward_list_ != NULL);
@@ -1936,9 +1938,11 @@
FullSnapshotWriter::~FullSnapshotWriter() {
delete forward_list_;
- // We may run Dart code afterwards, restore the symbol table.
- isolate()->object_store()->set_symbol_table(symbol_table_);
- symbol_table_ = Array::null();
+ // We may run Dart code afterwards, restore the symbol table if needed.
+ if (!symbol_table_.IsNull()) {
+ isolate()->object_store()->set_symbol_table(symbol_table_);
+ symbol_table_ = Array::null();
+ }
scripts_ = Array::null();
}
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 26dccc8..573addf 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -943,7 +943,7 @@
Script& script = Script::Handle(Script::New(url,
source,
RawScript::kScriptTag));
- const String& lib_url = String::Handle(Symbols::New("TestLib"));
+ const String& lib_url = String::Handle(Symbols::New(thread, "TestLib"));
Library& lib = Library::Handle(Library::New(lib_url));
lib.Register();
EXPECT(CompilerTest::TestCompileScript(lib, script));
diff --git a/runtime/vm/stub_code_arm64_test.cc b/runtime/vm/stub_code_arm64_test.cc
index 7cc0b65..d3a3a46 100644
--- a/runtime/vm/stub_code_arm64_test.cc
+++ b/runtime/vm/stub_code_arm64_test.cc
@@ -20,13 +20,15 @@
namespace dart {
static Function* CreateFunction(const char* name) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
const Library& lib = Library::Handle(Library::New(class_name));
owner_class.set_library(lib);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
Function& function = Function::ZoneHandle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/stub_code_arm_test.cc b/runtime/vm/stub_code_arm_test.cc
index e7c5bb9..3f0fe4c 100644
--- a/runtime/vm/stub_code_arm_test.cc
+++ b/runtime/vm/stub_code_arm_test.cc
@@ -20,13 +20,15 @@
namespace dart {
static Function* CreateFunction(const char* name) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
const Library& lib = Library::Handle(Library::New(class_name));
owner_class.set_library(lib);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
Function& function = Function::ZoneHandle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/stub_code_ia32_test.cc b/runtime/vm/stub_code_ia32_test.cc
index a3c20ec..34e8ef3 100644
--- a/runtime/vm/stub_code_ia32_test.cc
+++ b/runtime/vm/stub_code_ia32_test.cc
@@ -20,13 +20,15 @@
namespace dart {
static Function* CreateFunction(const char* name) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
const Library& lib = Library::Handle(Library::New(class_name));
owner_class.set_library(lib);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
Function& function = Function::ZoneHandle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/stub_code_mips_test.cc b/runtime/vm/stub_code_mips_test.cc
index 7f6d177..c058dcd 100644
--- a/runtime/vm/stub_code_mips_test.cc
+++ b/runtime/vm/stub_code_mips_test.cc
@@ -20,13 +20,15 @@
namespace dart {
static Function* CreateFunction(const char* name) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
const Library& lib = Library::Handle(Library::New(class_name));
owner_class.set_library(lib);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
Function& function = Function::ZoneHandle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index b320f60..6b9b2af 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -20,13 +20,15 @@
namespace dart {
static Function* CreateFunction(const char* name) {
- const String& class_name = String::Handle(Symbols::New("ownerClass"));
+ const String& class_name = String::Handle(Symbols::New(Thread::Current(),
+ "ownerClass"));
const Script& script = Script::Handle();
const Class& owner_class = Class::Handle(
Class::New(class_name, script, TokenPosition::kNoSource));
const Library& lib = Library::Handle(Library::New(class_name));
owner_class.set_library(lib);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
Function& function = Function::ZoneHandle(
Function::New(function_name, RawFunction::kRegularFunction,
true, false, false, false, false, owner_class,
diff --git a/runtime/vm/symbols.cc b/runtime/vm/symbols.cc
index bad8f74..5fb54bc 100644
--- a/runtime/vm/symbols.cc
+++ b/runtime/vm/symbols.cc
@@ -28,12 +28,13 @@
PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_LITERAL)
#undef DEFINE_SYMBOL_LITERAL
- "", // matches kKwTableStart.
+ "", // matches kTokenTableStart.
-#define DEFINE_KEYWORD_SYMBOL_INDEX(t, s, p, a) \
+#define DEFINE_TOKEN_SYMBOL_INDEX(t, s, p, a) \
s,
- DART_KEYWORD_LIST(DEFINE_KEYWORD_SYMBOL_INDEX)
-#undef DEFINE_KEYWORD_SYMBOL_INDEX
+ DART_TOKEN_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
+ DART_KEYWORD_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
+#undef DEFINE_TOKEN_SYMBOL_INDEX
};
RawString* StringFrom(const uint8_t* data, intptr_t len, Heap::Space space) {
@@ -61,6 +62,10 @@
return result.raw();
}
bool Equals(const String& other) const {
+ ASSERT(other.HasHash());
+ if (other.Hash() != hash_) {
+ return false;
+ }
return other.Equals(data_, len_);
}
intptr_t Hash() const { return hash_; }
@@ -82,6 +87,10 @@
}
RawString* ToSymbol() const;
bool Equals(const String& other) const {
+ ASSERT(other.HasHash());
+ if (other.Hash() != hash_) {
+ return false;
+ }
return other.Equals(str_, begin_index_, len_);
}
intptr_t Hash() const { return hash_; }
@@ -114,6 +123,10 @@
: str1_(str1), str2_(str2), hash_(String::HashConcat(str1, str2)) {}
RawString* ToSymbol() const;
bool Equals(const String& other) const {
+ ASSERT(other.HasHash());
+ if (other.Hash() != hash_) {
+ return false;
+ }
return other.EqualsConcat(str1_, str2_);
}
intptr_t Hash() const { return hash_; }
@@ -134,8 +147,22 @@
class SymbolTraits {
public:
+ static const char* Name() { return "SymbolTraits"; }
+
static bool IsMatch(const Object& a, const Object& b) {
- return String::Cast(a).Equals(String::Cast(b));
+ const String& a_str = String::Cast(a);
+ const String& b_str = String::Cast(b);
+ ASSERT(a_str.HasHash());
+ ASSERT(b_str.HasHash());
+ if (a_str.Hash() != b_str.Hash()) {
+ return false;
+ }
+ intptr_t a_len = a_str.Length();
+ if (a_len != b_str.Length()) {
+ return false;
+ }
+ // Use a comparison which does not consider the state of the canonical bit.
+ return a_str.Equals(b_str, 0, a_len);
}
template<typename CharType>
static bool IsMatch(const CharArray<CharType>& array, const Object& obj) {
@@ -180,13 +207,13 @@
}
-const String& Symbols::Keyword(Token::Kind keyword) {
- const int kw_index = keyword - Token::kFirstKeyword;
- ASSERT((0 <= kw_index) && (kw_index < Token::kNumKeywords));
- // First keyword symbol is in symbol_handles_[kKwTableStart + 1].
- const intptr_t keyword_id = Symbols::kKwTableStart + 1 + kw_index;
- ASSERT(symbol_handles_[keyword_id] != NULL);
- return *symbol_handles_[keyword_id];
+const String& Symbols::Token(Token::Kind token) {
+ const int tok_index = token;
+ ASSERT((0 <= tok_index) && (tok_index < Token::kNumTokens));
+ // First keyword symbol is in symbol_handles_[kTokenTableStart + 1].
+ const intptr_t token_id = Symbols::kTokenTableStart + 1 + tok_index;
+ ASSERT(symbol_handles_[token_id] != NULL);
+ return *symbol_handles_[token_id];
}
@@ -212,9 +239,8 @@
String* str = String::ReadOnlyHandle();
*str = OneByteString::New(names[i], Heap::kOld);
str->Hash();
- str->SetCanonical();
- bool present = table.Insert(*str);
- ASSERT(!present);
+ *str ^= table.InsertOrGet(*str);
+ str->SetCanonical(); // Make canonical once entered.
symbol_handles_[i] = str;
}
@@ -227,9 +253,9 @@
String* str = String::ReadOnlyHandle();
*str = OneByteString::New(&ch, 1, Heap::kOld);
str->Hash();
- str->SetCanonical();
- bool present = table.Insert(*str);
- ASSERT(!present);
+ *str ^= table.InsertOrGet(*str);
+ ASSERT(predefined_[c] == NULL);
+ str->SetCanonical(); // Make canonical once entered.
predefined_[c] = str->raw();
symbol_handles_[idx] = str;
}
@@ -294,9 +320,8 @@
for (intptr_t i = 1; i < Symbols::kNullCharId; i++) {
str = OneByteString::New(names[i], Heap::kOld);
str.Hash();
- str.SetCanonical();
- bool present = table.Insert(str);
- ASSERT(!present);
+ str ^= table.InsertOrGet(str);
+ str.SetCanonical(); // Make canonical once entered.
}
// Add Latin1 characters as Symbols, so that Symbols::FromCharCode is fast.
@@ -307,9 +332,8 @@
uint8_t ch = static_cast<uint8_t>(c);
str = OneByteString::New(&ch, 1, Heap::kOld);
str.Hash();
- str.SetCanonical();
- bool present = table.Insert(str);
- ASSERT(!present);
+ str ^= table.InsertOrGet(str);
+ str.SetCanonical(); // Make canonical once entered.
}
isolate->object_store()->set_symbol_table(table.Release());
@@ -421,63 +445,88 @@
}
-RawString* Symbols::New(const char* cstr, intptr_t len) {
+RawString* Symbols::New(Thread* thread, const char* cstr, intptr_t len) {
ASSERT((cstr != NULL) && (len >= 0));
const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr);
- return Symbols::FromUTF8(utf8_array, len);
+ return Symbols::FromUTF8(thread, utf8_array, len);
}
-RawString* Symbols::FromUTF8(const uint8_t* utf8_array, intptr_t array_len) {
+RawString* Symbols::FromUTF8(Thread* thread,
+ const uint8_t* utf8_array,
+ intptr_t array_len) {
if (array_len == 0 || utf8_array == NULL) {
- return FromLatin1(reinterpret_cast<uint8_t*>(NULL), 0);
+ return FromLatin1(thread, reinterpret_cast<uint8_t*>(NULL), 0);
}
Utf8::Type type;
intptr_t len = Utf8::CodeUnitCount(utf8_array, array_len, &type);
ASSERT(len != 0);
- Zone* zone = Thread::Current()->zone();
+ Zone* zone = thread->zone();
if (type == Utf8::kLatin1) {
uint8_t* characters = zone->Alloc<uint8_t>(len);
Utf8::DecodeToLatin1(utf8_array, array_len, characters, len);
- return FromLatin1(characters, len);
+ return FromLatin1(thread, characters, len);
}
ASSERT((type == Utf8::kBMP) || (type == Utf8::kSupplementary));
uint16_t* characters = zone->Alloc<uint16_t>(len);
Utf8::DecodeToUTF16(utf8_array, array_len, characters, len);
- return FromUTF16(characters, len);
+ return FromUTF16(thread, characters, len);
}
-RawString* Symbols::FromLatin1(const uint8_t* latin1_array, intptr_t len) {
- return NewSymbol(Latin1Array(latin1_array, len));
+RawString* Symbols::FromLatin1(Thread* thread,
+ const uint8_t* latin1_array,
+ intptr_t len) {
+ return NewSymbol(thread, Latin1Array(latin1_array, len));
}
-RawString* Symbols::FromUTF16(const uint16_t* utf16_array, intptr_t len) {
- return NewSymbol(UTF16Array(utf16_array, len));
+RawString* Symbols::FromUTF16(Thread* thread,
+ const uint16_t* utf16_array,
+ intptr_t len) {
+ return NewSymbol(thread, UTF16Array(utf16_array, len));
}
-RawString* Symbols::FromUTF32(const int32_t* utf32_array, intptr_t len) {
- return NewSymbol(UTF32Array(utf32_array, len));
+RawString* Symbols::FromUTF32(Thread* thread,
+ const int32_t* utf32_array,
+ intptr_t len) {
+ return NewSymbol(thread, UTF32Array(utf32_array, len));
}
-RawString* Symbols::FromConcat(const String& str1, const String& str2) {
+RawString* Symbols::FromConcat(Thread* thread,
+ const String& str1,
+ const String& str2) {
if (str1.Length() == 0) {
- return New(str2);
+ return New(thread, str2);
} else if (str2.Length() == 0) {
- return New(str1);
+ return New(thread, str1);
} else {
- return NewSymbol(ConcatString(str1, str2));
+ return NewSymbol(thread, ConcatString(str1, str2));
}
}
+RawString* Symbols::FromGet(Thread* thread, const String& str) {
+ return FromConcat(thread, GetterPrefix(), str);
+}
+
+
+RawString* Symbols::FromSet(Thread* thread, const String& str) {
+ return FromConcat(thread, SetterPrefix(), str);
+}
+
+
+RawString* Symbols::FromDot(Thread* thread, const String& str) {
+ return FromConcat(thread, str, Dot());
+}
+
+
// TODO(srdjan): If this becomes performance critical code, consider looking
// up symbol from hash of pieces instead of concatenating them first into
// a string.
-RawString* Symbols::FromConcatAll(
+RawString* Symbols::FromConcatAll(Thread* thread,
const GrowableHandlePtrArray<const String>& strs) {
const intptr_t strs_length = strs.length();
GrowableArray<intptr_t> lengths(strs_length);
@@ -499,7 +548,7 @@
}
const bool is_one_byte_string = char_size == kOneByteChar;
- Zone* zone = Thread::Current()->zone();
+ Zone* zone = thread->zone();
if (is_one_byte_string) {
uint8_t* buffer = zone->Alloc<uint8_t>(len_sum);
const uint8_t* const orig_buffer = buffer;
@@ -517,7 +566,7 @@
}
}
ASSERT(len_sum == buffer - orig_buffer);
- return Symbols::FromLatin1(orig_buffer, len_sum);
+ return Symbols::FromLatin1(thread, orig_buffer, len_sum);
} else {
uint16_t* buffer = zone->Alloc<uint16_t>(len_sum);
const uint16_t* const orig_buffer = buffer;
@@ -544,16 +593,14 @@
}
}
ASSERT(len_sum == buffer - orig_buffer);
- return Symbols::FromUTF16(orig_buffer, len_sum);
+ return Symbols::FromUTF16(thread, orig_buffer, len_sum);
}
}
// StringType can be StringSlice, ConcatString, or {Latin1,UTF16,UTF32}Array.
template<typename StringType>
-RawString* Symbols::NewSymbol(const StringType& str) {
- Thread* thread = Thread::Current();
- Isolate* isolate = thread->isolate();
+RawString* Symbols::NewSymbol(Thread* thread, const StringType& str) {
Zone* zone = thread->zone();
String& symbol = String::Handle(zone);
{
@@ -563,6 +610,7 @@
table.Release();
}
if (symbol.IsNull()) {
+ Isolate* isolate = thread->isolate();
SafepointMutexLocker ml(isolate->symbols_mutex());
SymbolTable table(zone, isolate->object_store()->symbol_table());
symbol ^= table.InsertNewOrGet(str);
@@ -575,8 +623,7 @@
template<typename StringType>
-RawString* Symbols::Lookup(const StringType& str) {
- Thread* thread = Thread::Current();
+RawString* Symbols::Lookup(Thread* thread, const StringType& str) {
Isolate* isolate = thread->isolate();
Zone* zone = thread->zone();
String& symbol = String::Handle(zone);
@@ -599,42 +646,63 @@
}
-RawString* Symbols::LookupFromConcat(const String& str1, const String& str2) {
+RawString* Symbols::LookupFromConcat(
+ Thread* thread, const String& str1, const String& str2) {
if (str1.Length() == 0) {
- return Lookup(str2);
+ return Lookup(thread, str2);
} else if (str2.Length() == 0) {
- return Lookup(str1);
+ return Lookup(thread, str1);
} else {
- return Lookup(ConcatString(str1, str2));
+ return Lookup(thread, ConcatString(str1, str2));
}
}
-RawString* Symbols::New(const String& str) {
+RawString* Symbols::LookupFromGet(Thread* thread, const String& str) {
+ return LookupFromConcat(thread, GetterPrefix(), str);
+}
+
+
+RawString* Symbols::LookupFromSet(Thread* thread, const String& str) {
+ return LookupFromConcat(thread, SetterPrefix(), str);
+}
+
+
+RawString* Symbols::LookupFromDot(Thread* thread, const String& str) {
+ return LookupFromConcat(thread, str, Dot());
+}
+
+
+RawString* Symbols::New(Thread* thread, const String& str) {
if (str.IsSymbol()) {
return str.raw();
}
- return New(str, 0, str.Length());
+ return New(thread, str, 0, str.Length());
}
-RawString* Symbols::New(const String& str, intptr_t begin_index, intptr_t len) {
- return NewSymbol(StringSlice(str, begin_index, len));
+RawString* Symbols::New(Thread* thread,
+ const String& str,
+ intptr_t begin_index,
+ intptr_t len) {
+ return NewSymbol(thread, StringSlice(str, begin_index, len));
}
-RawString* Symbols::NewFormatted(const char* format, ...) {
+RawString* Symbols::NewFormatted(Thread* thread, const char* format, ...) {
va_list args;
va_start(args, format);
- RawString* result = NewFormattedV(format, args);
+ RawString* result = NewFormattedV(thread, format, args);
NoSafepointScope no_safepoint;
va_end(args);
return result;
}
-RawString* Symbols::NewFormattedV(const char* format, va_list args) {
+RawString* Symbols::NewFormattedV(Thread* thread,
+ const char* format,
+ va_list args) {
va_list args_copy;
va_copy(args_copy, args);
intptr_t len = OS::VSNPrint(NULL, 0, format, args_copy);
@@ -644,13 +712,13 @@
char* buffer = zone->Alloc<char>(len + 1);
OS::VSNPrint(buffer, (len + 1), format, args);
- return Symbols::New(buffer);
+ return Symbols::New(thread, buffer);
}
-RawString* Symbols::FromCharCode(int32_t char_code) {
+RawString* Symbols::FromCharCode(Thread* thread, int32_t char_code) {
if (char_code > kMaxOneCharCodeSymbol) {
- return FromUTF32(&char_code, 1);
+ return FromUTF32(thread, &char_code, 1);
}
return predefined_[char_code];
}
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index d5f3498..f20aa44 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -33,6 +33,7 @@
V(DefaultLabel, ":L") \
V(Other, "other") \
V(Call, "call") \
+ V(GetCall, "get:call") \
V(Current, "current") \
V(_current, "_current") \
V(MoveNext, "moveNext") \
@@ -55,6 +56,7 @@
V(Values, "values") \
V(_EnumNames, "_enum_names") \
V(ExprTemp, ":expr_temp") \
+ V(FinallyRetVal, ":finally_ret_val") \
V(AnonymousClosure, "<anonymous closure>") \
V(AnonymousSignature, "<anonymous signature>") \
V(ImplicitClosure, "<implicit closure>") \
@@ -406,12 +408,13 @@
PREDEFINED_SYMBOLS_LIST(DEFINE_SYMBOL_INDEX)
#undef DEFINE_SYMBOL_INDEX
- kKwTableStart, // First keyword at kKwTableStart + 1.
+ kTokenTableStart, // First token at kTokenTableStart + 1.
-#define DEFINE_KEYWORD_SYMBOL_INDEX(t, s, p, a) \
+#define DEFINE_TOKEN_SYMBOL_INDEX(t, s, p, a) \
t##Id,
- DART_KEYWORD_LIST(DEFINE_KEYWORD_SYMBOL_INDEX)
-#undef DEFINE_KEYWORD_SYMBOL_INDEX
+ DART_TOKEN_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
+ DART_KEYWORD_LIST(DEFINE_TOKEN_SYMBOL_INDEX)
+#undef DEFINE_TOKEN_SYMBOL_INDEX
kNullCharId, // One char code symbol starts here and takes up 256 entries.
kMaxPredefinedId = kNullCharId + kMaxOneCharCodeSymbol + 1,
@@ -524,7 +527,7 @@
return *(symbol_handles_[kNullCharId + '~']);
}
- static const String& Empty() { return *(symbol_handles_[kKwTableStart]); }
+ static const String& Empty() { return *(symbol_handles_[kTokenTableStart]); }
static const String& False() { return *(symbol_handles_[kFALSEId]); }
static const String& Library() { return *(symbol_handles_[kLIBRARYId]); }
static const String& Super() { return *(symbol_handles_[kSUPERId]); }
@@ -542,11 +545,12 @@
// Access methods for symbol handles stored in the vm isolate for keywords.
#define DEFINE_SYMBOL_HANDLE_ACCESSOR(t, s, p, a) \
static const String& t() { return *(symbol_handles_[t##Id]); }
+ DART_TOKEN_LIST(DEFINE_SYMBOL_HANDLE_ACCESSOR)
DART_KEYWORD_LIST(DEFINE_SYMBOL_HANDLE_ACCESSOR)
#undef DEFINE_SYMBOL_HANDLE_ACCESSOR
- // Get symbol for scanner keyword.
- static const String& Keyword(Token::Kind keyword);
+ // Get symbol for scanner token.
+ static const String& Token(Token::Kind token);
// Initialize frequently used symbols in the vm isolate.
static void InitOnce(Isolate* isolate);
@@ -569,41 +573,58 @@
// Creates a Symbol given a C string that is assumed to contain
// UTF-8 encoded characters and '\0' is considered a termination character.
// TODO(7123) - Rename this to FromCString(....).
- static RawString* New(const char* cstr) {
- return New(cstr, strlen(cstr));
+ static RawString* New(Thread* thread, const char* cstr) {
+ return New(thread, cstr, strlen(cstr));
}
- static RawString* New(const char* cstr, intptr_t length);
+ static RawString* New(Thread* thread, const char* cstr, intptr_t length);
// Creates a new Symbol from an array of UTF-8 encoded characters.
- static RawString* FromUTF8(const uint8_t* utf8_array, intptr_t len);
+ static RawString* FromUTF8(Thread* thread,
+ const uint8_t* utf8_array,
+ intptr_t len);
// Creates a new Symbol from an array of Latin-1 encoded characters.
- static RawString* FromLatin1(const uint8_t* latin1_array, intptr_t len);
+ static RawString* FromLatin1(Thread* thread,
+ const uint8_t* latin1_array,
+ intptr_t len);
// Creates a new Symbol from an array of UTF-16 encoded characters.
- static RawString* FromUTF16(const uint16_t* utf16_array, intptr_t len);
+ static RawString* FromUTF16(Thread* thread,
+ const uint16_t* utf16_array,
+ intptr_t len);
// Creates a new Symbol from an array of UTF-32 encoded characters.
- static RawString* FromUTF32(const int32_t* utf32_array, intptr_t len);
+ static RawString* FromUTF32(Thread* thread,
+ const int32_t* utf32_array,
+ intptr_t len);
- static RawString* New(const String& str);
- static RawString* New(const String& str,
+ static RawString* New(Thread* thread, const String& str);
+ static RawString* New(Thread* thread,
+ const String& str,
intptr_t begin_index,
intptr_t length);
- static RawString* NewFormatted(const char* format, ...)
- PRINTF_ATTRIBUTE(1, 2);
- static RawString* NewFormattedV(const char* format, va_list args);
+ static RawString* NewFormatted(Thread* thread, const char* format, ...)
+ PRINTF_ATTRIBUTE(2, 3);
+ static RawString* NewFormattedV(Thread* thread,
+ const char* format,
+ va_list args);
- static RawString* FromConcat(const String& str1, const String& str2);
+ static RawString* FromConcat(Thread* thread,
+ const String& str1,
+ const String& str2);
- static RawString* FromConcatAll(
+ static RawString* FromConcatAll(Thread* thread,
const GrowableHandlePtrArray<const String>& strs);
+ static RawString* FromGet(Thread* thread, const String& str);
+ static RawString* FromSet(Thread* thread, const String& str);
+ static RawString* FromDot(Thread* thread, const String& str);
+
// Returns char* of predefined symbol.
static const char* Name(SymbolId symbol);
- static RawString* FromCharCode(int32_t char_code);
+ static RawString* FromCharCode(Thread* thread, int32_t char_code);
static RawString** PredefinedAddress() {
return reinterpret_cast<RawString**>(&predefined_);
@@ -613,10 +634,16 @@
// Returns Symbol::Null if no symbol is found.
template<typename StringType>
- static RawString* Lookup(const StringType& str);
+ static RawString* Lookup(Thread* thread, const StringType& str);
// Returns Symbol::Null if no symbol is found.
- static RawString* LookupFromConcat(const String& str1, const String& str2);
+ static RawString* LookupFromConcat(Thread* thread,
+ const String& str1,
+ const String& str2);
+
+ static RawString* LookupFromGet(Thread* thread, const String& str);
+ static RawString* LookupFromSet(Thread* thread, const String& str);
+ static RawString* LookupFromDot(Thread* thread, const String& str);
private:
enum {
@@ -629,7 +656,7 @@
intptr_t* capacity);
template<typename StringType>
- static RawString* NewSymbol(const StringType& str);
+ static RawString* NewSymbol(Thread* thread, const StringType& str);
static intptr_t LookupVMSymbol(RawObject* obj);
static RawObject* GetVMSymbol(intptr_t object_id);
diff --git a/runtime/vm/unit_test.cc b/runtime/vm/unit_test.cc
index de0f09c..24064f0 100644
--- a/runtime/vm/unit_test.cc
+++ b/runtime/vm/unit_test.cc
@@ -208,7 +208,8 @@
void AssemblerTest::Assemble() {
- const String& function_name = String::ZoneHandle(Symbols::New(name_));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name_));
const Class& cls = Class::ZoneHandle(
Class::New(function_name,
Script::Handle(),
@@ -237,7 +238,8 @@
new LocalScope(NULL, 0, 0))),
default_parameter_values_(new ZoneGrowableArray<const Instance*> ()) {
ASSERT(name != NULL);
- const String& function_name = String::ZoneHandle(Symbols::New(name));
+ const String& function_name = String::ZoneHandle(
+ Symbols::New(Thread::Current(), name));
// Add function to a class and that class to the class dictionary so that
// frame walking can be used.
const Class& cls = Class::ZoneHandle(
diff --git a/runtime/vm/virtual_memory_android.cc b/runtime/vm/virtual_memory_android.cc
index 16aa834..f84e2ef 100644
--- a/runtime/vm/virtual_memory_android.cc
+++ b/runtime/vm/virtual_memory_android.cc
@@ -83,6 +83,7 @@
bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
ASSERT(Thread::Current()->IsMutatorThread() ||
+ !Isolate::Current()->HasMutatorThread() ||
Isolate::Current()->mutator_thread()->IsAtSafepoint());
uword start_address = reinterpret_cast<uword>(address);
uword end_address = start_address + size;
diff --git a/runtime/vm/virtual_memory_linux.cc b/runtime/vm/virtual_memory_linux.cc
index 0228f68..8973345 100644
--- a/runtime/vm/virtual_memory_linux.cc
+++ b/runtime/vm/virtual_memory_linux.cc
@@ -82,6 +82,7 @@
bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
ASSERT(Thread::Current()->IsMutatorThread() ||
+ !Isolate::Current()->HasMutatorThread() ||
Isolate::Current()->mutator_thread()->IsAtSafepoint());
uword start_address = reinterpret_cast<uword>(address);
uword end_address = start_address + size;
diff --git a/runtime/vm/virtual_memory_macos.cc b/runtime/vm/virtual_memory_macos.cc
index 484ad78..1d23ead 100644
--- a/runtime/vm/virtual_memory_macos.cc
+++ b/runtime/vm/virtual_memory_macos.cc
@@ -83,6 +83,7 @@
bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
ASSERT(Thread::Current()->IsMutatorThread() ||
+ !Isolate::Current()->HasMutatorThread() ||
Isolate::Current()->mutator_thread()->IsAtSafepoint());
uword start_address = reinterpret_cast<uword>(address);
uword end_address = start_address + size;
diff --git a/runtime/vm/virtual_memory_win.cc b/runtime/vm/virtual_memory_win.cc
index 2584613..8ea8fa5 100644
--- a/runtime/vm/virtual_memory_win.cc
+++ b/runtime/vm/virtual_memory_win.cc
@@ -66,6 +66,7 @@
bool VirtualMemory::Protect(void* address, intptr_t size, Protection mode) {
ASSERT(Thread::Current()->IsMutatorThread() ||
+ !Isolate::Current()->HasMutatorThread() ||
Isolate::Current()->mutator_thread()->IsAtSafepoint());
uword start_address = reinterpret_cast<uword>(address);
uword end_address = start_address + size;
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index ee08b98..f73d16d 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -107,9 +107,6 @@
'constants_ia32.h',
'constants_mips.h',
'constants_x64.h',
- 'coverage.cc',
- 'coverage.h',
- 'coverage_test.cc',
'cpu.h',
'cpu_arm.cc',
'cpu_arm64.cc',
diff --git a/runtime/vm/weak_code.cc b/runtime/vm/weak_code.cc
index d68cfff..1305443 100644
--- a/runtime/vm/weak_code.cc
+++ b/runtime/vm/weak_code.cc
@@ -113,6 +113,7 @@
function.SwitchToUnoptimizedCode();
} else if (function.unoptimized_code() == code.raw()) {
ReportSwitchingCode(code);
+ function.set_was_compiled(false);
function.ClearICDataArray();
// Remove the code object from the function. The next time the
// function is invoked, it will be compiled again.
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index 609fd88..479b231 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -23308,39 +23308,6 @@
static initializeCustomElement(element) native "Utils_initializeCustomElement";
}
-class Blink_DOMWindowCrossFrame {
- // FIXME: Return to using explicit cross frame entry points after roll to M35
- static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
-
- static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
-
- static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
-
- static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
-
- static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
-
- static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
-
- static close(_DOMWindowCrossFrame) native "Window_close_Callback";
-
- static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
-}
-
-class Blink_HistoryCrossFrame {
- // _HistoryCrossFrame native entry points
- static back(_HistoryCrossFrame) native "History_back_Callback";
-
- static forward(_HistoryCrossFrame) native "History_forward_Callback";
-
- static go(_HistoryCrossFrame, distance) native "History_go_Callback";
-}
-
-class Blink_LocationCrossFrame {
- // _LocationCrossFrame native entry points
- static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
-}
-
class Blink_DOMStringMap {
// _DOMStringMap native entry points
static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
diff --git a/sdk/lib/convert/ascii.dart b/sdk/lib/convert/ascii.dart
index c8b5903..6302333 100644
--- a/sdk/lib/convert/ascii.dart
+++ b/sdk/lib/convert/ascii.dart
@@ -69,7 +69,8 @@
// Superclass for [AsciiEncoder] and [Latin1Encoder].
// Generalizes common operations that only differ by a mask;
-class _UnicodeSubsetEncoder extends Converter<String, List<int>> {
+class _UnicodeSubsetEncoder extends
+ ChunkedConverter<String, List<int>, String, List<int>> {
final int _subsetMask;
const _UnicodeSubsetEncoder(this._subsetMask);
@@ -154,7 +155,8 @@
* This class converts Latin-1 bytes (lists of unsigned 8-bit integers)
* to a string.
*/
-abstract class _UnicodeSubsetDecoder extends Converter<List<int>, String> {
+abstract class _UnicodeSubsetDecoder extends
+ ChunkedConverter<List<int>, String, List<int>, String> {
final bool _allowInvalid;
final int _subsetMask;
diff --git a/sdk/lib/convert/base64.dart b/sdk/lib/convert/base64.dart
index eb7519a..ff3a439 100644
--- a/sdk/lib/convert/base64.dart
+++ b/sdk/lib/convert/base64.dart
@@ -5,13 +5,11 @@
part of dart.convert;
/**
- * An instance of [Base64Codec].
+ * A [base64](https://tools.ietf.org/html/rfc4648) encoder and decoder.
*
- * This instance provides a convenient access to
- * [base64](https://tools.ietf.org/html/rfc4648) encoding and decoding.
- *
- * It encodes and decodes using the default base64 alphabet, does not allow
- * any invalid characters when decoding, and requires padding.
+ * It encodes using the default base64 alphabet,
+ * decodes using both the base64 and base64url alphabets,
+ * does not allow invalid characters and requires padding.
*
* Examples:
*
@@ -21,6 +19,21 @@
*/
const Base64Codec BASE64 = const Base64Codec();
+/**
+ * A [base64url](https://tools.ietf.org/html/rfc4648) encoder and decoder.
+ *
+ * It encodes and decodes using the base64url alphabet,
+ * decodes using both the base64 and base64url alphabets,
+ * does not allow invalid characters and requires padding.
+ *
+ * Examples:
+ *
+ * var encoded = BASE64.encode([0x62, 0x6c, 0xc3, 0xa5, 0x62, 0xc3, 0xa6,
+ * 0x72, 0x67, 0x72, 0xc3, 0xb8, 0x64]);
+ * var decoded = BASE64.decode("YmzDpWLDpnJncsO4ZAo=");
+ */
+const Base64Codec BASE64URL = const Base64Codec.urlSafe();
+
// Constants used in more than one class.
const int _paddingChar = 0x3d; // '='.
@@ -30,15 +43,18 @@
* A [Base64Codec] allows base64 encoding bytes into ASCII strings and
* decoding valid encodings back to bytes.
*
- * This implementation only handles the simplest RFC 4648 base-64 encoding.
+ * This implementation only handles the simplest RFC 4648 base64 and base64url
+ * encodings.
* It does not allow invalid characters when decoding and it requires,
* and generates, padding so that the input is always a multiple of four
* characters.
*/
class Base64Codec extends Codec<List<int>, String> {
- const Base64Codec();
+ final Base64Encoder _encoder;
+ const Base64Codec() : _encoder = const Base64Encoder();
+ const Base64Codec.urlSafe() : _encoder = const Base64Encoder.urlSafe();
- Base64Encoder get encoder => const Base64Encoder();
+ Base64Encoder get encoder => _encoder;
Base64Decoder get decoder => const Base64Decoder();
}
@@ -48,44 +64,46 @@
// ------------------------------------------------------------------------
/**
- * Base-64 encoding converter.
+ * Base64 and base64url encoding converter.
*
- * Encodes lists of bytes using base64 encoding.
- * The result are ASCII strings using a restricted alphabet.
+ * Encodes lists of bytes using base64 or base64url encoding.
+ *
+ * The results are ASCII strings using a restricted alphabet.
*/
-class Base64Encoder extends Converter<List<int>, String> {
- const Base64Encoder();
+class Base64Encoder extends
+ ChunkedConverter<List<int>, String, List<int>, String> {
+ final bool _urlSafe;
+
+ const Base64Encoder() : _urlSafe = false;
+ const Base64Encoder.urlSafe() : _urlSafe = true;
String convert(List<int> input) {
if (input.isEmpty) return "";
- var encoder = new _Base64Encoder();
+ var encoder = new _Base64Encoder(_urlSafe);
Uint8List buffer = encoder.encode(input, 0, input.length, true);
return new String.fromCharCodes(buffer);
}
ByteConversionSink startChunkedConversion(Sink<String> sink) {
if (sink is StringConversionSink) {
- return new _Utf8Base64EncoderSink(sink.asUtf8Sink(false));
+ return new _Utf8Base64EncoderSink(sink.asUtf8Sink(false), _urlSafe);
}
- return new _AsciiBase64EncoderSink(sink);
- }
-
- Stream<String> bind(Stream<List<int>> stream) {
- return new Stream<String>.eventTransformed(
- stream,
- (EventSink sink) =>
- new _ConverterStreamEventSink<List<int>, String>(this, sink));
+ return new _AsciiBase64EncoderSink(sink, _urlSafe);
}
}
/**
- * Helper class for encoding bytes to BASE-64.
+ * Helper class for encoding bytes to base64.
*/
class _Base64Encoder {
/** The RFC 4648 base64 encoding alphabet. */
static const String _base64Alphabet =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+ /** The RFC 4648 base64url encoding alphabet. */
+ static const String _base64urlAlphabet =
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
+
/** Shift-count to extract the values stored in [_state]. */
static const int _valueShift = 2;
@@ -103,6 +121,12 @@
*/
int _state = 0;
+ /** Alphabet used for encoding. */
+ final String _alphabet;
+
+ _Base64Encoder(bool urlSafe)
+ : _alphabet = urlSafe ? _base64urlAlphabet : _base64Alphabet;
+
/** Encode count and bits into a value to be stored in [_state]. */
static int _encodeState(int count, int bits) {
assert(count <= _countMask);
@@ -148,15 +172,17 @@
bufferLength += 4; // Room for padding.
}
var output = createBuffer(bufferLength);
- _state = encodeChunk(bytes, start, end, isLast, output, 0, _state);
+ _state = encodeChunk(_alphabet, bytes, start, end, isLast,
+ output, 0, _state);
if (bufferLength > 0) return output;
// If the input plus the data in state is still less than three bytes,
// there may not be any output.
return null;
}
- static int encodeChunk(List<int> bytes, int start, int end, bool isLast,
- Uint8List output, int outputIndex, int state) {
+ static int encodeChunk(String alphabet,
+ List<int> bytes, int start, int end, bool isLast,
+ Uint8List output, int outputIndex, int state) {
int bits = _stateBits(state);
// Count number of missing bytes in three-byte chunk.
int expectedChars = 3 - _stateCount(state);
@@ -172,20 +198,20 @@
expectedChars--;
if (expectedChars == 0) {
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits >> 18) & _sixBitMask);
+ alphabet.codeUnitAt((bits >> 18) & _sixBitMask);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits >> 12) & _sixBitMask);
+ alphabet.codeUnitAt((bits >> 12) & _sixBitMask);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits >> 6) & _sixBitMask);
+ alphabet.codeUnitAt((bits >> 6) & _sixBitMask);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt(bits & _sixBitMask);
+ alphabet.codeUnitAt(bits & _sixBitMask);
expectedChars = 3;
bits = 0;
}
}
if (byteOr >= 0 && byteOr <= 255) {
if (isLast && expectedChars < 3) {
- writeFinalChunk(output, outputIndex, 3 - expectedChars, bits);
+ writeFinalChunk(alphabet, output, outputIndex, 3 - expectedChars, bits);
return 0;
}
return _encodeState(3 - expectedChars, bits);
@@ -208,24 +234,25 @@
* Only used when the [_state] contains a partial (1 or 2 byte)
* input.
*/
- static void writeFinalChunk(Uint8List output, int outputIndex,
+ static void writeFinalChunk(String alphabet,
+ Uint8List output, int outputIndex,
int count, int bits) {
assert(count > 0);
if (count == 1) {
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits >> 2) & _sixBitMask);
+ alphabet.codeUnitAt((bits >> 2) & _sixBitMask);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits << 4) & _sixBitMask);
+ alphabet.codeUnitAt((bits << 4) & _sixBitMask);
output[outputIndex++] = _paddingChar;
output[outputIndex++] = _paddingChar;
} else {
assert(count == 2);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits >> 10) & _sixBitMask);
+ alphabet.codeUnitAt((bits >> 10) & _sixBitMask);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits >> 4) & _sixBitMask);
+ alphabet.codeUnitAt((bits >> 4) & _sixBitMask);
output[outputIndex++] =
- _base64Alphabet.codeUnitAt((bits << 2) & _sixBitMask);
+ alphabet.codeUnitAt((bits << 2) & _sixBitMask);
output[outputIndex++] = _paddingChar;
}
}
@@ -240,6 +267,8 @@
*/
Uint8List bufferCache;
+ _BufferCachingBase64Encoder(bool urlSafe) : super(urlSafe);
+
Uint8List createBuffer(int bufferLength) {
if (bufferCache == null || bufferCache.length < bufferLength) {
bufferCache = new Uint8List(bufferLength);
@@ -268,11 +297,11 @@
}
class _AsciiBase64EncoderSink extends _Base64EncoderSink {
- final _Base64Encoder _encoder = new _BufferCachingBase64Encoder();
-
final Sink<String> _sink;
+ final _Base64Encoder _encoder;
- _AsciiBase64EncoderSink(this._sink);
+ _AsciiBase64EncoderSink(this._sink, bool urlSafe)
+ : _encoder = new _BufferCachingBase64Encoder(urlSafe);
void _add(List<int> source, int start, int end, bool isLast) {
Uint8List buffer = _encoder.encode(source, start, end, isLast);
@@ -288,9 +317,10 @@
class _Utf8Base64EncoderSink extends _Base64EncoderSink {
final ByteConversionSink _sink;
- final _Base64Encoder _encoder = new _Base64Encoder();
+ final _Base64Encoder _encoder;
- _Utf8Base64EncoderSink(this._sink);
+ _Utf8Base64EncoderSink(this._sink, bool urlSafe)
+ : _encoder = new _Base64Encoder(urlSafe);
void _add(List<int> source, int start, int end, bool isLast) {
Uint8List buffer = _encoder.encode(source, start, end, isLast);
@@ -304,7 +334,16 @@
// Decoder
// ------------------------------------------------------------------------
-class Base64Decoder extends Converter<String, List<int>> {
+/**
+ * Decoder for base64 encoded data.
+ *
+ * This decoder accepts both base64 and base64url ("url-safe") encodings.
+ *
+ * The encoding is required to be properly padded.
+ */
+class Base64Decoder extends
+ ChunkedConverter<String, List<int>, String, List<int>> {
+
const Base64Decoder();
List<int> convert(String input, [int start = 0, int end]) {
@@ -349,7 +388,7 @@
*
* Accepts the "URL-safe" alphabet as well (`-` and `_` are the
* 62nd and 63rd alphabet characters), and considers `%` a padding
- * character which mush be followed by `3D`, the percent-escape
+ * character, which mush then be followed by `3D`, the percent-escape
* for `=`.
*/
static final List<int> _inverseAlphabet = new Int8List.fromList([
@@ -371,7 +410,7 @@
/**
* Maintains the intermediate state of a partly-decoded input.
*
- * BASE-64 is decoded in chunks of four characters. If a chunk does not
+ * Base64 is decoded in chunks of four characters. If a chunk does not
* contain a full block, the decoded bits (six per character) of the
* available characters are stored in [_state] until the next call to
* [_decode] or [_close].
@@ -618,7 +657,7 @@
* Check that the remainder of the string is valid padding.
*
* Valid padding is a correct number (0, 1 or 2) of `=` characters
- * or `%3D` sequences depending on the number of preceding BASE-64 characters.
+ * or `%3D` sequences depending on the number of preceding base64 characters.
* The [state] parameter encodes which padding continuations are allowed
* as the number of expected characters. That number is the number of
* expected padding characters times 3 minus the number of padding characters
diff --git a/sdk/lib/convert/chunked_conversion.dart b/sdk/lib/convert/chunked_conversion.dart
index 4c962eb..d450c75 100644
--- a/sdk/lib/convert/chunked_conversion.dart
+++ b/sdk/lib/convert/chunked_conversion.dart
@@ -7,6 +7,57 @@
typedef void _ChunkedConversionCallback<T>(T accumulated);
/**
+ * A converter that supports chunked conversions.
+ *
+ * In addition to immediate conversions from [S] to [T], a chunked converter
+ * also supports longer-running conversions from [S2] to [T2].
+ *
+ * Frequently, the source and target types are the same, but this is not a
+ * requirement. In particular, converters that work with lists in the
+ * immediate conversion, could flatten the type for the chunked conversion.
+ *
+ * For example, the [LineSplitter] class returns a `List<String>` for the
+ * immediate conversion, but returns individual `String`s in the chunked
+ * conversion.
+ */
+abstract class ChunkedConverter<S, T, S2, T2> extends Converter<S, T> {
+
+ const ChunkedConverter();
+
+ /**
+ * Starts a chunked conversion.
+ *
+ * The returned sink serves as input for the long-running conversion. The
+ * given [sink] serves as output.
+ */
+ ChunkedConversionSink<S2> startChunkedConversion(Sink<T2> sink) {
+ throw new UnsupportedError(
+ "This converter does not support chunked conversions: $this");
+ }
+
+ Stream<T2> bind(Stream<S2> stream) {
+ return new Stream<T2>.eventTransformed(
+ stream,
+ (EventSink<T2> sink) =>
+ new _ConverterStreamEventSink<S2, T2>(this, sink));
+ }
+
+ /**
+ * Fuses this instance with the given [other] converter.
+ *
+ * If [other] is a ChunkedConverter (with matching generic types), returns a
+ * [ChunkedConverter].
+ */
+ Converter<S, dynamic> fuse(Converter<T, dynamic> other) {
+ if (other is ChunkedConverter<T, dynamic, T2, dynamic>) {
+ return new _FusedChunkedConverter<S, T, dynamic, S2, T2, dynamic>(
+ this, other);
+ }
+ return super.fuse(other);
+ }
+}
+
+/**
* A [ChunkedConversionSink] is used to transmit data more efficiently between
* two converters during chunked conversions.
*
@@ -55,7 +106,7 @@
}
/**
- * This class converts implements the logic for a chunked conversion as a
+ * This class implements the logic for a chunked conversion as a
* stream transformer.
*
* It is used as strategy in the [EventTransformStream].
@@ -71,9 +122,11 @@
* The input sink for new data. All data that is received with
* [handleData] is added into this sink.
*/
- ChunkedConversionSink _chunkedSink;
+ ChunkedConversionSink<S> _chunkedSink;
- _ConverterStreamEventSink(Converter converter, EventSink<T> sink)
+ _ConverterStreamEventSink(
+ Converter/*=ChunkedConverter<dynamic, dynamic, S, T>*/ converter,
+ EventSink<T> sink)
: this._eventSink = sink,
_chunkedSink = converter.startChunkedConversion(sink);
@@ -83,3 +136,20 @@
}
void close() => _chunkedSink.close();
}
+
+/**
+ * Fuses two chunked converters.
+ */
+class _FusedChunkedConverter<S, M, T, S2, M2, T2> extends
+ ChunkedConverter<S, T, S2, T2> {
+ final ChunkedConverter<S, M, S2, M2> _first;
+ final ChunkedConverter<M, T, M2, T2> _second;
+
+ _FusedChunkedConverter(this._first, this._second);
+
+ T convert(S input) => _second.convert(_first.convert(input));
+
+ ChunkedConversionSink<S2> startChunkedConversion(Sink<T2> sink) {
+ return _first.startChunkedConversion(_second.startChunkedConversion(sink));
+ }
+}
diff --git a/sdk/lib/convert/converter.dart b/sdk/lib/convert/converter.dart
index 627e417..d6d9a9b 100644
--- a/sdk/lib/convert/converter.dart
+++ b/sdk/lib/convert/converter.dart
@@ -29,14 +29,22 @@
}
/**
- * Starts a chunked conversion.
+ * Deprecated.
+ *
+ * Use the [ChunkedConverter] interface instead.
*/
+ @deprecated
ChunkedConversionSink startChunkedConversion(Sink sink) {
throw new UnsupportedError(
"This converter does not support chunked conversions: $this");
}
- // Subclasses are encouraged to provide better types.
+ /**
+ * Deprecated.
+ *
+ * Use the [ChunkedConverter] interface instead.
+ */
+ @deprecated
Stream bind(Stream stream) {
return new Stream.eventTransformed(
stream,
@@ -50,14 +58,10 @@
* For a non-chunked conversion converts the input in sequence.
*/
class _FusedConverter<S, M, T> extends Converter<S, T> {
- final Converter _first;
- final Converter _second;
+ final Converter<S, M> _first;
+ final Converter<M, T> _second;
_FusedConverter(this._first, this._second);
T convert(S input) => _second.convert(_first.convert(input));
-
- ChunkedConversionSink startChunkedConversion(Sink sink) {
- return _first.startChunkedConversion(_second.startChunkedConversion(sink));
- }
}
diff --git a/sdk/lib/convert/encoding.dart b/sdk/lib/convert/encoding.dart
index 696b5f0..fd6f91f 100644
--- a/sdk/lib/convert/encoding.dart
+++ b/sdk/lib/convert/encoding.dart
@@ -10,6 +10,9 @@
abstract class Encoding extends Codec<String, List<int>> {
const Encoding();
+ ChunkedConverter<String, List<int>, String, List<int>> get encoder;
+ ChunkedConverter<List<int>, String, List<int>, String> get decoder;
+
Future<String> decodeStream(Stream<List<int>> byteStream) {
return byteStream
.transform(decoder)
diff --git a/sdk/lib/convert/html_escape.dart b/sdk/lib/convert/html_escape.dart
index 6b0a3fa..2a0af75 100644
--- a/sdk/lib/convert/html_escape.dart
+++ b/sdk/lib/convert/html_escape.dart
@@ -152,7 +152,7 @@
* found to be easier to read if greater-than is also escaped whenever
* less-than is.
*/
-class HtmlEscape extends Converter<String, String> {
+class HtmlEscape extends ChunkedConverter<String, String, String, String> {
/** The [HtmlEscapeMode] used by the converter. */
final HtmlEscapeMode mode;
diff --git a/sdk/lib/convert/json.dart b/sdk/lib/convert/json.dart
index ace76c2..e80a986 100644
--- a/sdk/lib/convert/json.dart
+++ b/sdk/lib/convert/json.dart
@@ -9,10 +9,10 @@
*
* The [unsupportedObject] field holds that object that failed to be serialized.
*
- * If an object isn't directly serializable, the serializer calls the 'toJson'
+ * If an object isn't directly serializable, the serializer calls the `toJson`
* method on the object. If that call fails, the error will be stored in the
* [cause] field. If the call returns an object that isn't directly
- * serializable, the [cause] is be null.
+ * serializable, the [cause] is null.
*/
class JsonUnsupportedObjectError extends Error {
/** The object that could not be serialized. */
@@ -53,8 +53,8 @@
*
* Examples:
*
- * var encoded = JSON.encode([1, 2, { "a": null }]);
- * var decoded = JSON.decode('["foo", { "bar": 499 }]');
+ * var encoded = JSON.encode([1, 2, { "a": null }]);
+ * var decoded = JSON.decode('["foo", { "bar": 499 }]');
*/
const JsonCodec JSON = const JsonCodec();
@@ -68,8 +68,8 @@
*
* Examples:
*
- * var encoded = JSON.encode([1, 2, { "a": null }]);
- * var decoded = JSON.decode('["foo", { "bar": 499 }]');
+ * var encoded = JSON.encode([1, 2, { "a": null }]);
+ * var decoded = JSON.decode('["foo", { "bar": 499 }]');
*/
class JsonCodec extends Codec<Object, String> {
final _Reviver _reviver;
@@ -78,24 +78,22 @@
/**
* Creates a `JsonCodec` with the given reviver and encoding function.
*
- * The [reviver] function is called during decoding. It is invoked
- * once for each object or list property that has been parsed.
- * The `key` argument is either the
- * integer list index for a list property, the string map key for object
- * properties, or `null` for the final result.
+ * The [reviver] function is called during decoding. It is invoked once for
+ * each object or list property that has been parsed.
+ * The `key` argument is either the integer list index for a list property,
+ * the string map key for object properties, or `null` for the final result.
*
* If [reviver] is omitted, it defaults to returning the value argument.
*
* The [toEncodable] function is used during encoding. It is invoked for
- * values that are not directly encodable to a JSON1toE
- * string (a value that is not a number, boolean, string, null, list or a map
- * with string keys). The function must return an object that is directly
- * encodable. The elements of a returned list and values of a returned map
- * do not need be directly encodable, and if they aren't, `toEncodable` will
- * be used on them as well.
- * Please notice that it is possible to cause an infinite recursive
- * regress in this way, by effectively creating an infinite data structure
- * through repeated call to `toEncodable`.
+ * values that are not directly encodable to a string (a value that is not a
+ * number, boolean, string, null, list or a map with string keys). The
+ * function must return an object that is directly encodable. The elements of
+ * a returned list and values of a returned map do not need to be directly
+ * encodable, and if they aren't, `toEncodable` will be used on them as well.
+ * Please notice that it is possible to cause an infinite recursive regress
+ * in this way, by effectively creating an infinite data structure through
+ * repeated call to `toEncodable`.
*
* If [toEncodable] is omitted, it defaults to a function that returns the
* result of calling `.toJson()` on the unencodable object.
@@ -161,7 +159,7 @@
/**
* This class converts JSON objects to strings.
*/
-class JsonEncoder extends Converter<Object, String> {
+class JsonEncoder extends ChunkedConverter<Object, String, Object, String> {
/**
* The string used for indention.
*
@@ -220,14 +218,14 @@
* Converts [object] to a JSON [String].
*
* Directly serializable values are [num], [String], [bool], and [Null], as
- * well as some [List] and [Map] values.
- * For [List], the elements must all be serializable.
- * For [Map], the keys must be [String] and the values must be serializable.
+ * well as some [List] and [Map] values. For [List], the elements must all be
+ * serializable. For [Map], the keys must be [String] and the values must be
+ * serializable.
*
- * If a value is any other type is attempted serialized, the conversion
- * function provided in the constructor is invoked with the object as argument
- * and the result, which must be a directly serializable value,
- * is serialized instead of the original value.
+ * If a value of any other type is attempted to be serialized, the
+ * `toEncodable` function provided in the constructor is called with the value
+ * as argument. The result, which must be a directly serializable value, is
+ * serialized instead of the original value.
*
* If the conversion throws, or returns a value that is not directly
* serializable, a [JsonUnsupportedObjectError] exception is thrown.
@@ -267,7 +265,7 @@
return new _JsonEncoderSink(sink, _toEncodable, indent);
}
- // Override the base-classes bind, to provide a better type.
+ // Override the base class's bind, to provide a better type.
Stream<String> bind(Stream<Object> stream) => super.bind(stream);
Converter<Object, dynamic> fuse(Converter<String, dynamic> other) {
@@ -285,7 +283,8 @@
* a JSON string, and then UTF-8 encoding the string, but without
* creating an intermediate string.
*/
-class JsonUtf8Encoder extends Converter<Object, List<int>> {
+class JsonUtf8Encoder extends
+ ChunkedConverter<Object, List<int>, Object, List<int>> {
/** Default buffer size used by the JSON-to-UTF-8 encoder. */
static const int DEFAULT_BUFFER_SIZE = 256;
/** Indentation used in pretty-print mode, `null` if not pretty. */
@@ -304,20 +303,21 @@
* If `indent` contains characters that are not valid JSON whitespace
* characters, the result will not be valid JSON. JSON whitespace characters
* are space (U+0020), tab (U+0009), line feed (U+000a) and carriage return
- * (U+000d) (ECMA 404).
+ * (U+000d) ([ECMA
+ * 404](http://www.ecma-international.org/publications/standards/Ecma-404.htm)).
*
* The [bufferSize] is the size of the internal buffers used to collect
* UTF-8 code units.
* If using [startChunkedConversion], it will be the size of the chunks.
*
- * The JSON encoder handles numbers, strings, booleans, null, lists and
- * maps directly.
+ * The JSON encoder handles numbers, strings, booleans, null, lists and maps
+ * directly.
*
- * Any other object is attempted converted by [toEncodable] to an
- * object that is of one of the convertible types.
+ * Any other object is attempted converted by [toEncodable] to an object that
+ * is of one of the convertible types.
*
- * If [toEncodable] is omitted, it defaults to calling `.toJson()` on
- * the object.
+ * If [toEncodable] is omitted, it defaults to calling `.toJson()` on the
+ * object.
*/
JsonUtf8Encoder([String indent,
toEncodable(Object object),
@@ -391,7 +391,7 @@
_indent, _bufferSize);
}
- // Override the base-classes bind, to provide a better type.
+ // Override the base class's bind, to provide a better type.
Stream<List<int>> bind(Stream<Object> stream) {
return super.bind(stream);
}
@@ -474,7 +474,7 @@
/**
* This class parses JSON strings and builds the corresponding objects.
*/
-class JsonDecoder extends Converter<String, Object> {
+class JsonDecoder extends ChunkedConverter<String, Object, String, Object> {
final _Reviver _reviver;
/**
* Constructs a new JsonDecoder.
@@ -487,8 +487,8 @@
* Converts the given JSON-string [input] to its corresponding object.
*
* Parsed JSON values are of the types [num], [String], [bool], [Null],
- * [List]s of parsed JSON values or [Map]s from [String] to parsed
- * JSON values.
+ * [List]s of parsed JSON values or [Map]s from [String] to parsed JSON
+ * values.
*
* If `this` was initialized with a reviver, then the parsing operation
* invokes the reviver on every object or list property that has been parsed.
@@ -501,14 +501,13 @@
dynamic convert(String input) => _parseJson(input, _reviver);
/**
- * Starts a conversion from a chunked JSON string to its corresponding
- * object.
+ * Starts a conversion from a chunked JSON string to its corresponding object.
*
* The output [sink] receives exactly one decoded element through `add`.
*/
external StringConversionSink startChunkedConversion(Sink<Object> sink);
- // Override the base-classes bind, to provide a better type.
+ // Override the base class's bind, to provide a better type.
Stream<Object> bind(Stream<String> stream) => super.bind(stream);
}
@@ -618,9 +617,8 @@
/**
* Check if an encountered object is already being traversed.
*
- * Records the object if it isn't already seen.
- * Should have a matching call to [_removeSeen] when the object
- * is no longer being traversed.
+ * Records the object if it isn't already seen. Should have a matching call to
+ * [_removeSeen] when the object is no longer being traversed.
*/
void _checkCycle(object) {
for (int i = 0; i < _seen.length; i++) {
@@ -632,7 +630,7 @@
}
/**
- * Removes object from the list of currently traversed objects.
+ * Remove [object] from the list of currently traversed objects.
*
* Should be called in the opposite order of the matching [_checkCycle]
* calls.
@@ -644,10 +642,10 @@
}
/**
- * Writes an object.
+ * Write an object.
*
- * If the object isn't directly encodable, the [_toEncodable] function
- * gets one chance to return a replacement which is encodable.
+ * If [object] isn't directly encodable, the [_toEncodable] function gets one
+ * chance to return a replacement which is encodable.
*/
void writeObject(object) {
// Tries stringifying object directly. If it's not a simple value, List or
@@ -667,7 +665,7 @@
}
/**
- * Serializes a [num], [String], [bool], [Null], [List] or [Map] value.
+ * Serialize a [num], [String], [bool], [Null], [List] or [Map] value.
*
* Returns true if the value is one of these types, and false if not.
* If a value is both a [List] and a [Map], it's serialized as a [List].
@@ -707,7 +705,7 @@
}
}
- /** Serializes a [List]. */
+ /** Serialize a [List]. */
void writeList(List list) {
writeString('[');
if (list.length > 0) {
@@ -720,7 +718,7 @@
writeString(']');
}
- /** Serializes a [Map]. */
+ /** Serialize a [Map]. */
bool writeMap(Map<String, Object> map) {
if (map.isEmpty) {
writeString("{}");
@@ -912,11 +910,11 @@
*
* Calls [addChunk] with slices of UTF-8 code units.
* These will typically have size [bufferSize], but may be shorter.
- * The buffers are not reused, so the [addChunk] call may keep and reuse
- * the chunks.
+ * The buffers are not reused, so the [addChunk] call may keep and reuse the
+ * chunks.
*
- * If [indent] is non-`null`, the result will be "pretty-printed" with
- * extra newlines and indentation, using [indent] as the indentation.
+ * If [indent] is non-`null`, the result will be "pretty-printed" with extra
+ * newlines and indentation, using [indent] as the indentation.
*/
static void stringify(Object object,
List<int> indent,
diff --git a/sdk/lib/convert/latin1.dart b/sdk/lib/convert/latin1.dart
index 98d7ba5..1d8546d 100644
--- a/sdk/lib/convert/latin1.dart
+++ b/sdk/lib/convert/latin1.dart
@@ -59,9 +59,9 @@
}
}
- Converter<String, List<int>> get encoder => const Latin1Encoder();
+ Latin1Encoder get encoder => const Latin1Encoder();
- Converter<List<int>, String> get decoder =>
+ Latin1Decoder get decoder =>
_allowInvalid ? const Latin1Decoder(allowInvalid: true)
: const Latin1Decoder(allowInvalid: false);
}
diff --git a/sdk/lib/convert/line_splitter.dart b/sdk/lib/convert/line_splitter.dart
index b9023f4..a9c9448 100644
--- a/sdk/lib/convert/line_splitter.dart
+++ b/sdk/lib/convert/line_splitter.dart
@@ -17,7 +17,8 @@
*
* The returned lines do not contain the line terminators.
*/
-class LineSplitter extends Converter<String, List<String>> {
+class LineSplitter extends
+ ChunkedConverter<String, List<String>, String, String> {
const LineSplitter();
@@ -79,9 +80,6 @@
}
return new _LineSplitterSink(sink);
}
-
- // Override the base-class' bind, to provide a better type.
- Stream<String> bind(Stream<String> stream) => super.bind(stream);
}
// TODO(floitsch): deal with utf8.
diff --git a/sdk/lib/convert/utf.dart b/sdk/lib/convert/utf.dart
index 287d8ec..a93c9ae 100644
--- a/sdk/lib/convert/utf.dart
+++ b/sdk/lib/convert/utf.dart
@@ -76,7 +76,8 @@
* This class converts strings to their UTF-8 code units (a list of
* unsigned 8-bit integers).
*/
-class Utf8Encoder extends Converter<String, List<int>> {
+class Utf8Encoder extends
+ ChunkedConverter<String, List<int>, String, List<int>> {
const Utf8Encoder();
@@ -304,7 +305,8 @@
* This class converts UTF-8 code units (lists of unsigned 8-bit integers)
* to a string.
*/
-class Utf8Decoder extends Converter<List<int>, String> {
+class Utf8Decoder extends
+ ChunkedConverter<List<int>, String, List<int>, String> {
final bool _allowMalformed;
/**
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index b9db444..5ff3bb5 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -673,7 +673,40 @@
return null;
}
-// TODO(jacobr): it would be nice to place this in a consistent place for dart2js and dartium.
+// TODO(jacobr): it would be nice to place these conversion methods in a consistent place for dart2js and dartium.
+
+WindowBase _convertNativeToDart_Window(win) {
+ if (win == null) return null;
+ return _DOMWindowCrossFrame._createSafe(win);
+}
+
+EventTarget _convertNativeToDart_EventTarget(e) {
+ if (e == null) {
+ return null;
+ }
+ // Assume it's a Window if it contains the postMessage property. It may be
+ // from a different frame - without a patched prototype - so we cannot
+ // rely on Dart type checking.
+ try {
+ if (js.JsNative.hasProperty(e, "postMessage")) {
+ var window = _DOMWindowCrossFrame._createSafe(e);
+ // If it's a native window.
+ if (window is EventTarget) {
+ return window;
+ }
+ return null;
+ }
+ } catch (err) {
+ print("Error calling _convertNativeToDart_EventTarget... $err");
+ }
+ return e;
+}
+
+EventTarget _convertDartToNative_EventTarget(e) {
+ // _DOMWindowCrossFrame uses an interceptor so we don't need to do anything unlike Dart2Js.
+ return e;
+}
+
_convertNativeToDart_XHR_Response(o) {
if (o is Document) {
return o;
@@ -737,10 +770,6 @@
}
}
-// TODO(jacobr): we shouldn't be generating this call in the dart:html
-// bindings but we are.
-_convertDartToNative_EventTarget(target) => target;
-
@Deprecated("Internal Use Only")
Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
var result = new Map();
@@ -10193,7 +10222,7 @@
@DomName('Document.defaultView')
@DocsEditable()
- WindowBase get window => _blink.BlinkDocument.instance.defaultView_Getter_(this);
+ WindowBase get window => _convertNativeToDart_Window(_blink.BlinkDocument.instance.defaultView_Getter_(this));
@DomName('Document.documentElement')
@DocsEditable()
@@ -16699,7 +16728,7 @@
@DomName('Event.currentTarget')
@DocsEditable()
- EventTarget get currentTarget => _blink.BlinkEvent.instance.currentTarget_Getter_(this);
+ EventTarget get currentTarget => _convertNativeToDart_EventTarget(_blink.BlinkEvent.instance.currentTarget_Getter_(this));
@DomName('Event.defaultPrevented')
@DocsEditable()
@@ -16726,7 +16755,7 @@
@DomName('Event.target')
@DocsEditable()
- EventTarget get target => _blink.BlinkEvent.instance.target_Getter_(this);
+ EventTarget get target => _convertNativeToDart_EventTarget(_blink.BlinkEvent.instance.target_Getter_(this));
@DomName('Event.timeStamp')
@DocsEditable()
@@ -17943,7 +17972,7 @@
@DomName('FocusEvent.relatedTarget')
@DocsEditable()
- EventTarget get relatedTarget => _blink.BlinkFocusEvent.instance.relatedTarget_Getter_(this);
+ EventTarget get relatedTarget => _convertNativeToDart_EventTarget(_blink.BlinkFocusEvent.instance.relatedTarget_Getter_(this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -21948,7 +21977,7 @@
@DomName('HTMLIFrameElement.contentWindow')
@DocsEditable()
- WindowBase get contentWindow => _blink.BlinkHTMLIFrameElement.instance.contentWindow_Getter_(this);
+ WindowBase get contentWindow => _convertNativeToDart_Window(_blink.BlinkHTMLIFrameElement.instance.contentWindow_Getter_(this));
@DomName('HTMLIFrameElement.height')
@DocsEditable()
@@ -25926,7 +25955,7 @@
@DomName('MessageEvent.source')
@DocsEditable()
- EventTarget get source => _blink.BlinkMessageEvent.instance.source_Getter_(this);
+ EventTarget get source => _convertNativeToDart_EventTarget(_blink.BlinkMessageEvent.instance.source_Getter_(this));
@DomName('MessageEvent.initMessageEvent')
@DocsEditable()
@@ -26790,7 +26819,7 @@
@DomName('MouseEvent.relatedTarget')
@DocsEditable()
- EventTarget get relatedTarget => _blink.BlinkMouseEvent.instance.relatedTarget_Getter_(this);
+ EventTarget get relatedTarget => _convertNativeToDart_EventTarget(_blink.BlinkMouseEvent.instance.relatedTarget_Getter_(this));
@DomName('MouseEvent.screenX')
@DocsEditable()
@@ -31464,7 +31493,7 @@
@DomName('RelatedEvent.relatedTarget')
@DocsEditable()
@Experimental() // untriaged
- EventTarget get relatedTarget => _blink.BlinkRelatedEvent.instance.relatedTarget_Getter_(this);
+ EventTarget get relatedTarget => _convertNativeToDart_EventTarget(_blink.BlinkRelatedEvent.instance.relatedTarget_Getter_(this));
}
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
@@ -36997,7 +37026,7 @@
@DomName('Touch.target')
@DocsEditable()
- EventTarget get target => _blink.BlinkTouch.instance.target_Getter_(this);
+ EventTarget get target => _convertNativeToDart_EventTarget(_blink.BlinkTouch.instance.target_Getter_(this));
// As of Chrome 37, these all changed from long to double. This code
@@ -37617,7 +37646,7 @@
@DomName('UIEvent.view')
@DocsEditable()
- WindowBase get view => _blink.BlinkUIEvent.instance.view_Getter_(this);
+ WindowBase get view => _convertNativeToDart_Window(_blink.BlinkUIEvent.instance.view_Getter_(this));
@DomName('UIEvent.which')
@DocsEditable()
@@ -39724,7 +39753,7 @@
@DomName('Window.opener')
@DocsEditable()
- WindowBase get opener => _blink.BlinkWindow.instance.opener_Getter_(this);
+ WindowBase get opener => _convertNativeToDart_Window(_blink.BlinkWindow.instance.opener_Getter_(this));
@DomName('Window.opener')
@DocsEditable()
@@ -39795,7 +39824,7 @@
@DomName('Window.parent')
@DocsEditable()
- WindowBase get parent => _blink.BlinkWindow.instance.parent_Getter_(this);
+ WindowBase get parent => _convertNativeToDart_Window(_blink.BlinkWindow.instance.parent_Getter_(this));
/**
* Timing and navigation data for this window.
@@ -39907,7 +39936,7 @@
*/
@DomName('Window.self')
@DocsEditable()
- WindowBase get self => _blink.BlinkWindow.instance.self_Getter_(this);
+ WindowBase get self => _convertNativeToDart_Window(_blink.BlinkWindow.instance.self_Getter_(this));
/**
* Storage for this window that is cleared when this session ends.
@@ -39994,7 +40023,7 @@
@DomName('Window.top')
@DocsEditable()
- WindowBase get top => _blink.BlinkWindow.instance.top_Getter_(this);
+ WindowBase get top => _convertNativeToDart_Window(_blink.BlinkWindow.instance.top_Getter_(this));
/**
* The current window.
@@ -40006,7 +40035,7 @@
*/
@DomName('Window.window')
@DocsEditable()
- WindowBase get window => _blink.BlinkWindow.instance.window_Getter_(this);
+ WindowBase get window => _convertNativeToDart_Window(_blink.BlinkWindow.instance.window_Getter_(this));
WindowBase __getter__(index_OR_name) {
if ((index_OR_name is int)) {
@@ -40122,7 +40151,7 @@
@DomName('Window.open')
@DocsEditable()
- WindowBase open(String url, String target, [String features]) => _blink.BlinkWindow.instance.open_Callback_3_(this, url, target, features);
+ WindowBase open(String url, String target, [String features]) => _convertNativeToDart_Window(_blink.BlinkWindow.instance.open_Callback_3_(this, url, target, features));
SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) {
if (creationCallback != null) {
@@ -47898,12 +47927,12 @@
class _Property {
- _Property(this.name) :
- _hasValue = false,
- writable = false,
- isMethod = false,
- isOwn = true,
- wasThrown = false;
+ _Property(this.name)
+ : _hasValue = false,
+ writable = false,
+ isMethod = false,
+ isOwn = true,
+ wasThrown = false;
bool get hasValue => _hasValue;
get value => _value;
@@ -47923,6 +47952,203 @@
bool wasThrown;
}
+/**
+ * Manager for navigating between libraries from the devtools console.
+ */
+class _LibraryManager {
+ /**
+ * Current active library
+ */
+ static var _currentLibrary;
+ static var _validCache = false;
+
+ static List<Uri> _libraryUris;
+
+ // List of all maps to check to determine if there is an exact match.
+ static Map<String, List<Uri>> _fastPaths;
+
+ static void _addFastPath(String key, Uri uri) {
+ _fastPaths.putIfAbsent(key, () => <Uri>[]).add(uri);
+ }
+
+ static cache() {
+ if (_validCache) return;
+ _validCache = true;
+ _libraryUris = <Uri>[];
+ _fastPaths = new Map<String, List<Uri>>();
+ var system = currentMirrorSystem();
+ system.libraries.forEach((uri, library) {
+ _libraryUris.add(uri);
+ _addFastPath(uri.toString(), uri);
+ _addFastPath(MirrorSystem.getName(library.simpleName), uri);
+ });
+ }
+
+ static String get currentLibrary {
+ if (_currentLibrary == null) {
+ _currentLibrary =
+ currentMirrorSystem().isolate.rootLibrary.uri.toString();
+ }
+ return _currentLibrary;
+ }
+
+ /**
+ * Find libraries matching a given name.
+ *
+ * Uses heuristics to only return a single match when the user intent is
+ * generally unambiguous.
+ */
+ static List<Uri> findMatches(String name) {
+ cache();
+ var nameAsFile = name.endsWith('.dart') ? name : '${name}.dart';
+ // Perfect match first.
+ var fastPatchMatches = _fastPaths[name];
+ if (fastPatchMatches != null) {
+ return fastPatchMatches.toList();
+ }
+
+ // Exact match for file path.
+ var matches = new LinkedHashSet<Uri>();
+ for (var uri in _libraryUris) {
+ if (uri.path == name || uri.path == nameAsFile) matches.add(uri);
+ }
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Exact match for file name.
+ if (name != nameAsFile) {
+ for (var uri in _libraryUris) {
+ if (uri.pathSegments.isNotEmpty &&
+ (uri.pathSegments.last == nameAsFile)) {
+ matches.add(uri);
+ }
+ }
+ if (matches.isNotEmpty) return matches.toList();
+ }
+
+ for (var uri in _libraryUris) {
+ if (uri.pathSegments.isNotEmpty && (uri.pathSegments.last == name)) {
+ matches.add(uri);
+ }
+ }
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Partial match on path.
+ for (var uri in _libraryUris) {
+ if (uri.path.contains(name)) {
+ matches.add(uri);
+ }
+ }
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Partial match on entire uri.
+ for (var uri in _libraryUris) {
+ if (uri.toString().contains(name)) {
+ matches.add(uri);
+ }
+ }
+
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Partial match on entire uri ignoring case.
+ name = name.toLowerCase();
+ for (var uri in _libraryUris) {
+ if (uri.toString().toLowerCase().contains(name)) {
+ matches.add(uri);
+ }
+ }
+ return matches.toList();
+ }
+
+ static setLibrary([String name]) {
+ // Bust cache in case library list has changed. Ideally we would listen for
+ // when libraries are loaded and invalidate based on that.
+ _validCache = false;
+ cache();
+ if (name == null) {
+ window.console
+ ..group("Current library: $_currentLibrary")
+ ..groupCollapsed("All libraries:");
+ _listLibraries();
+ window.console..groupEnd()..groupEnd();
+ return;
+ }
+ var matches = findMatches(name);
+ if (matches.length != 1) {
+ if (matches.length > 1) {
+ window.console.warn("Ambiguous library name: $name");
+ }
+ showMatches(name, matches);
+ return;
+ }
+ _currentLibrary = matches.first.toString();
+ window.console.log("Set library to $_currentLibrary");
+ }
+
+ static getLibrary() {
+ return currentLibrary;
+ }
+
+ static List<Uri> _sortUris(Iterable<Uri> uris) {
+ return (uris.toList())
+ ..sort((Uri a, Uri b) {
+ if (a.scheme != b.scheme) {
+ if (a.scheme == 'dart') return -1;
+ if (b.scheme == 'dart') return 1;
+ return a.scheme.compareTo(b.scheme);
+ }
+ return a.toString().compareTo(b.toString());
+ });
+ }
+
+ static void listLibraries() {
+ _validCache = false;
+ cache();
+ _listLibraries();
+ }
+
+ static void _listLibraries() {
+ window.console.log(_sortUris(_libraryUris).join("\n"));
+ }
+
+ // Workaround to allow calling console.log with an arbitrary number of
+ // arguments.
+ static void _log(List<String> args) {
+ js.JsNative.callMethod(window.console, 'log', args);
+ }
+
+ static showMatches(String key, Iterable<Uri> uris) {
+ var boldPairs = [];
+ var sb = new StringBuffer();
+ if (uris.isEmpty) {
+ window.console.group("All libraries:");
+ _listLibraries();
+ window.console
+ ..groupEnd()
+ ..error("No library names or URIs match '$key'");
+ return;
+ }
+ sb.write("${uris.length} matches\n");
+ var lowerCaseKey = key.toLowerCase();
+ for (var uri in uris) {
+ var txt = uri.toString();
+ int index = txt.toLowerCase().indexOf(lowerCaseKey);
+ if (index != -1) {
+ // %c enables styling console log messages with css
+ // specified at the end of the console.
+ sb..write(txt.substring(0, index))..write('%c');
+ var matchEnd = index + key.length;
+ sb
+ ..write(txt.substring(index, matchEnd))
+ ..write('%c')
+ ..write(txt.substring(matchEnd))
+ ..write('\n');
+ boldPairs..add('font-weight: bold')..add('font-weight: normal');
+ }
+ }
+ _log([sb.toString()]..addAll(boldPairs));
+ }
+}
+
class _ConsoleVariables {
Map<String, Object> _data = new Map<String, Object>();
@@ -47968,15 +48194,15 @@
}
class _MethodTrampoline extends _Trampoline {
- _MethodTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
- Symbol selector) :
- super(receiver, methodMirror, selector);
+ _MethodTrampoline(
+ ObjectMirror receiver, MethodMirror methodMirror, Symbol selector)
+ : super(receiver, methodMirror, selector);
noSuchMethod(Invocation msg) {
if (msg.memberName != #call) return super.noSuchMethod(msg);
- return _receiver.invoke(_selector,
- msg.positionalArguments,
- msg.namedArguments).reflectee;
+ return _receiver
+ .invoke(_selector, msg.positionalArguments, msg.namedArguments)
+ .reflectee;
}
}
@@ -47984,9 +48210,9 @@
* Invocation trampoline class used to closurize getters.
*/
class _GetterTrampoline extends _Trampoline {
- _GetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
- Symbol selector) :
- super(receiver, methodMirror, selector);
+ _GetterTrampoline(
+ ObjectMirror receiver, MethodMirror methodMirror, Symbol selector)
+ : super(receiver, methodMirror, selector);
call() => _receiver.getField(_selector).reflectee;
}
@@ -47995,9 +48221,9 @@
* Invocation trampoline class used to closurize setters.
*/
class _SetterTrampoline extends _Trampoline {
- _SetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
- Symbol selector) :
- super(receiver, methodMirror, selector);
+ _SetterTrampoline(
+ ObjectMirror receiver, MethodMirror methodMirror, Symbol selector)
+ : super(receiver, methodMirror, selector);
call(value) {
_receiver.setField(_selector, value);
@@ -48010,7 +48236,7 @@
static DateTime doubleToDateTime(double dateTime) {
try {
return new DateTime.fromMillisecondsSinceEpoch(dateTime.toInt());
- } catch(_) {
+ } catch (_) {
// TODO(antonnm): treat exceptions properly in bindings and
// find out how to treat NaNs.
return null;
@@ -48055,7 +48281,10 @@
static Map createMap() => {};
- static parseJson(String jsonSource) => const JsonDecoder().convert(jsonSource);
+ static parseJson(String jsonSource) =>
+ const JsonDecoder().convert(jsonSource);
+
+ static String getLibraryUrl() => _LibraryManager.currentLibrary;
static makeUnimplementedError(String fileName, int lineNo) {
return new UnsupportedError('[info: $fileName:$lineNo]');
@@ -48080,7 +48309,8 @@
return element;
}
- static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
+ static forwardingPrint(String message) =>
+ _blink.Blink_Utils.forwardingPrint(message);
static void spawnDomHelper(Function f, int replyTo) =>
_blink.Blink_Utils.spawnDomHelper(f, replyTo);
@@ -48113,8 +48343,8 @@
*/
static Map<String, dynamic> createLocalVariablesMap(List localVariables) {
var map = {};
- for (int i = 0; i < localVariables.length; i+=2) {
- map[stripMemberName(localVariables[i])] = localVariables[i+1];
+ for (int i = 0; i < localVariables.length; i += 2) {
+ map[stripMemberName(localVariables[i])] = localVariables[i + 1];
}
return map;
}
@@ -48143,8 +48373,8 @@
* [_consoleTempVariables, 40, 2, someValue, someOtherValue]]
* </code>
*/
- static List wrapExpressionAsClosure(String expression, List locals,
- bool includeCommandLineAPI) {
+ static List wrapExpressionAsClosure(
+ String expression, List locals, bool includeCommandLineAPI) {
var args = {};
var sb = new StringBuffer("(");
addArg(arg, value) {
@@ -48179,26 +48409,24 @@
final _SET_VARIABLE = new RegExp("^(\\s*)(\\w+)(\\s*=)");
// Match trailing semicolons.
final _ENDING_SEMICOLONS = new RegExp("(;\\s*)*\$");
- expression = expression.replaceAllMapped(_VARIABLE_DECLARATION,
- (match) {
- var variableName = match[2];
- // Set the console variable if it isn't already set.
- if (!_consoleTempVariables._data.containsKey(variableName)) {
- _consoleTempVariables._data[variableName] = null;
- }
- return "${match[1]}\$consoleVariables.${variableName}";
- });
+ expression = expression.replaceAllMapped(_VARIABLE_DECLARATION, (match) {
+ var variableName = match[2];
+ // Set the console variable if it isn't already set.
+ if (!_consoleTempVariables._data.containsKey(variableName)) {
+ _consoleTempVariables._data[variableName] = null;
+ }
+ return "${match[1]}\$consoleVariables.${variableName}";
+ });
- expression = expression.replaceAllMapped(_SET_VARIABLE,
- (match) {
- var variableName = match[2];
- // Only rewrite if the name matches an existing console variable.
- if (_consoleTempVariables._data.containsKey(variableName)) {
- return "${match[1]}\$consoleVariables.${variableName}${match[3]}";
- } else {
- return match[0];
- }
- });
+ expression = expression.replaceAllMapped(_SET_VARIABLE, (match) {
+ var variableName = match[2];
+ // Only rewrite if the name matches an existing console variable.
+ if (_consoleTempVariables._data.containsKey(variableName)) {
+ return "${match[1]}\$consoleVariables.${variableName}${match[3]}";
+ } else {
+ return match[0];
+ }
+ });
// We only allow dart expressions not Dart statements. Silently remove
// trailing semicolons the user might have added by accident to reduce the
@@ -48207,8 +48435,8 @@
}
if (locals != null) {
- for (int i = 0; i < locals.length; i+= 2) {
- addArg(locals[i], locals[i+1]);
+ for (int i = 0; i < locals.length; i += 2) {
+ addArg(locals[i], locals[i + 1]);
}
}
// Inject all the already defined console variables.
@@ -48223,12 +48451,12 @@
return [sb.toString(), args.values.toList(growable: false)];
}
- static String _getShortSymbolName(Symbol symbol,
- DeclarationMirror declaration) {
+ static String _getShortSymbolName(
+ Symbol symbol, DeclarationMirror declaration) {
var name = MirrorSystem.getName(symbol);
if (declaration is MethodMirror) {
- if (declaration.isSetter && name[name.length-1] == "=") {
- return name.substring(0, name.length-1);
+ if (declaration.isSetter && name[name.length - 1] == "=") {
+ return name.substring(0, name.length - 1);
}
if (declaration.isConstructor) {
return name.substring(name.indexOf('.') + 1);
@@ -48238,6 +48466,38 @@
}
/**
+ * Handle special console commands such as $lib and $libs that should not be
+ * evaluated as Dart expressions and instead should be interpreted directly.
+ * Commands supported:
+ * library <-- shows the current library and lists all libraries.
+ * library "library_uri" <-- select a specific library
+ * library "library_uri_fragment"
+ */
+ static bool maybeHandleSpecialConsoleCommand(String expression) {
+ expression = expression.trim();
+ var setLibraryCommand = r'library ';
+ if (expression == r'library') {
+ _LibraryManager.setLibrary();
+ return true;
+ }
+ if (expression.startsWith(setLibraryCommand)) {
+ expression = expression.substring(setLibraryCommand.length);
+ if (expression.length >= 2) {
+ String start = expression[0];
+ String end = expression[expression.length - 1];
+ // TODO(jacobr): maybe we should require quotes.
+ if ((start == "'" && end == "'") || (start == '"' && end == '"')) {
+ expression = expression.substring(1, expression.length - 1);
+ }
+ }
+
+ _LibraryManager.setLibrary(expression);
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Returns a list of completions to use if the receiver is o.
*/
static List<String> getCompletions(o) {
@@ -48247,19 +48507,17 @@
map.forEach((symbol, mirror) {
if (mirror.isStatic == isStatic && !mirror.isPrivate) {
var name = MirrorSystem.getName(symbol);
- if (mirror is MethodMirror && mirror.isSetter)
- name = name.substring(0, name.length - 1);
+ if (mirror is MethodMirror && mirror.isSetter) name =
+ name.substring(0, name.length - 1);
completions.add(name);
}
});
}
addForClass(ClassMirror mirror, bool isStatic) {
- if (mirror == null)
- return;
+ if (mirror == null) return;
addAll(mirror.declarations, isStatic);
- if (mirror.superclass != null)
- addForClass(mirror.superclass, isStatic);
+ if (mirror.superclass != null) addForClass(mirror.superclass, isStatic);
for (var interface in mirror.superinterfaces) {
addForClass(interface, isStatic);
}
@@ -48277,8 +48535,8 @@
* Adds all candidate String completitions from [declarations] to [output]
* filtering based on [staticContext] and [includePrivate].
*/
- static void _getCompletionsHelper(ClassMirror classMirror,
- bool staticContext, LibraryMirror libraryMirror, Set<String> output) {
+ static void _getCompletionsHelper(ClassMirror classMirror, bool staticContext,
+ LibraryMirror libraryMirror, Set<String> output) {
bool includePrivate = libraryMirror == classMirror.owner;
classMirror.declarations.forEach((symbol, declaration) {
if (!includePrivate && declaration.isPrivate) return;
@@ -48301,12 +48559,11 @@
if (!staticContext) {
for (var interface in classMirror.superinterfaces) {
- _getCompletionsHelper(interface, staticContext,
- libraryMirror, output);
+ _getCompletionsHelper(interface, staticContext, libraryMirror, output);
}
if (classMirror.superclass != null) {
- _getCompletionsHelper(classMirror.superclass, staticContext,
- libraryMirror, output);
+ _getCompletionsHelper(
+ classMirror.superclass, staticContext, libraryMirror, output);
}
}
}
@@ -48373,13 +48630,13 @@
}
static final SIDE_EFFECT_FREE_LIBRARIES = new Set<String>()
- ..add('dart:html')
- ..add('dart:indexed_db')
- ..add('dart:svg')
- ..add('dart:typed_data')
- ..add('dart:web_audio')
- ..add('dart:web_gl')
- ..add('dart:web_sql');
+ ..add('dart:html')
+ ..add('dart:indexed_db')
+ ..add('dart:svg')
+ ..add('dart:typed_data')
+ ..add('dart:web_audio')
+ ..add('dart:web_gl')
+ ..add('dart:web_sql');
static LibraryMirror _getLibrary(MethodMirror methodMirror) {
var owner = methodMirror.owner;
@@ -48398,8 +48655,8 @@
* In the future we should consider adding an annotation to tag getters
* in user libraries as side effect free.
*/
- static bool _isSideEffectFreeGetter(MethodMirror methodMirror,
- LibraryMirror libraryMirror) {
+ static bool _isSideEffectFreeGetter(
+ MethodMirror methodMirror, LibraryMirror libraryMirror) {
// This matches JavaScript behavior. We should consider displaying
// getters for all dart platform libraries rather than just the DOM
// libraries.
@@ -48411,11 +48668,11 @@
* Whether we should treat a property as a field for the purposes of the
* debugger.
*/
- static bool treatPropertyAsField(MethodMirror methodMirror,
- LibraryMirror libraryMirror) {
+ static bool treatPropertyAsField(
+ MethodMirror methodMirror, LibraryMirror libraryMirror) {
return (methodMirror.isGetter || methodMirror.isSetter) &&
- (methodMirror.isSynthetic ||
- _isSideEffectFreeGetter(methodMirror,libraryMirror));
+ (methodMirror.isSynthetic ||
+ _isSideEffectFreeGetter(methodMirror, libraryMirror));
}
// TODO(jacobr): generate more concise function descriptions instead of
@@ -48432,27 +48689,36 @@
static List getInvocationTrampolineDetails(_Trampoline method) {
var loc = method._methodMirror.location;
- return [loc.line, loc.column, loc.sourceUri.toString(),
- MirrorSystem.getName(method._selector)];
+ return [
+ loc.line,
+ loc.column,
+ loc.sourceUri.toString(),
+ MirrorSystem.getName(method._selector)
+ ];
}
- static List getLibraryProperties(String libraryUrl, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getLibraryProperties(
+ String libraryUrl, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var libraryMirror = getLibraryMirror(libraryUrl);
- _addInstanceMirrors(libraryMirror, libraryMirror,
+ _addInstanceMirrors(
+ libraryMirror,
+ libraryMirror,
libraryMirror.declarations,
- ownProperties, accessorPropertiesOnly, false, false,
+ ownProperties,
+ accessorPropertiesOnly,
+ false,
+ false,
properties);
if (!accessorPropertiesOnly) {
// We need to add class properties for all classes in the library.
libraryMirror.declarations.forEach((symbol, declarationMirror) {
if (declarationMirror is ClassMirror) {
var name = MirrorSystem.getName(symbol);
- if (declarationMirror.hasReflectedType
- && !properties.containsKey(name)) {
+ if (declarationMirror.hasReflectedType &&
+ !properties.containsKey(name)) {
properties[name] = new _Property(name)
- ..value = declarationMirror.reflectedType;
+ ..value = declarationMirror.reflectedType;
}
}
});
@@ -48460,34 +48726,44 @@
return packageProperties(properties);
}
- static List getObjectProperties(o, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getObjectProperties(
+ o, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var names = new Set<String>();
var objectMirror = reflect(o);
var classMirror = objectMirror.type;
- _addInstanceMirrors(objectMirror, classMirror.owner,
+ _addInstanceMirrors(
+ objectMirror,
+ classMirror.owner,
classMirror.instanceMembers,
- ownProperties, accessorPropertiesOnly, false, true,
+ ownProperties,
+ accessorPropertiesOnly,
+ false,
+ true,
properties);
return packageProperties(properties);
}
- static List getObjectClassProperties(o, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getObjectClassProperties(
+ o, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var objectMirror = reflect(o);
var classMirror = objectMirror.type;
- _addInstanceMirrors(objectMirror, classMirror.owner,
+ _addInstanceMirrors(
+ objectMirror,
+ classMirror.owner,
classMirror.instanceMembers,
- ownProperties, accessorPropertiesOnly, true, false,
+ ownProperties,
+ accessorPropertiesOnly,
+ true,
+ false,
properties);
_addStatics(classMirror, properties, accessorPropertiesOnly);
return packageProperties(properties);
}
- static List getClassProperties(Type t, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getClassProperties(
+ Type t, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var classMirror = reflectClass(t);
_addStatics(classMirror, properties, accessorPropertiesOnly);
@@ -48495,8 +48771,7 @@
}
static void _addStatics(ClassMirror classMirror,
- Map<String, _Property> properties,
- bool accessorPropertiesOnly) {
+ Map<String, _Property> properties, bool accessorPropertiesOnly) {
var libraryMirror = classMirror.owner;
classMirror.declarations.forEach((symbol, declaration) {
var name = _getShortSymbolName(symbol, declaration);
@@ -48505,8 +48780,8 @@
if (accessorPropertiesOnly) return;
if (!declaration.isStatic) return;
properties.putIfAbsent(name, () => new _Property(name))
- ..value = classMirror.getField(symbol).reflectee
- ..writable = !declaration.isFinal && !declaration.isConst;
+ ..value = classMirror.getField(symbol).reflectee
+ ..writable = !declaration.isFinal && !declaration.isConst;
} else if (declaration is MethodMirror) {
MethodMirror methodMirror = declaration;
// FIXMEDART: should we display constructors?
@@ -48528,31 +48803,35 @@
});
}
- static void _fillMethodMirrorProperty(LibraryMirror libraryMirror,
- methodOwner, MethodMirror methodMirror, Symbol symbol,
- bool accessorPropertiesOnly, _Property property) {
+ static void _fillMethodMirrorProperty(
+ LibraryMirror libraryMirror,
+ methodOwner,
+ MethodMirror methodMirror,
+ Symbol symbol,
+ bool accessorPropertiesOnly,
+ _Property property) {
if (methodMirror.isRegularMethod) {
property
- ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol)
- ..isMethod = true;
+ ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol)
+ ..isMethod = true;
} else if (methodMirror.isGetter) {
if (treatPropertyAsField(methodMirror, libraryMirror)) {
try {
property.value = methodOwner.getField(symbol).reflectee;
} catch (e) {
property
- ..wasThrown = true
- ..value = e;
+ ..wasThrown = true
+ ..value = e;
}
} else if (accessorPropertiesOnly) {
- property.getter = new _GetterTrampoline(methodOwner,
- methodMirror, symbol);
+ property.getter =
+ new _GetterTrampoline(methodOwner, methodMirror, symbol);
}
} else if (methodMirror.isSetter) {
if (accessorPropertiesOnly &&
!treatPropertyAsField(methodMirror, libraryMirror)) {
- property.setter = new _SetterTrampoline(methodOwner,
- methodMirror, MirrorSystem.getSymbol(property.name, libraryMirror));
+ property.setter = new _SetterTrampoline(methodOwner, methodMirror,
+ MirrorSystem.getSymbol(property.name, libraryMirror));
}
property.writable = true;
}
@@ -48572,8 +48851,10 @@
ObjectMirror objectMirror,
LibraryMirror libraryMirror,
Map<Symbol, Mirror> declarations,
- bool ownProperties, bool accessorPropertiesOnly,
- bool hideFields, bool hideMethods,
+ bool ownProperties,
+ bool accessorPropertiesOnly,
+ bool hideFields,
+ bool hideMethods,
Map<String, _Property> properties) {
declarations.forEach((symbol, declaration) {
if (declaration is TypedefMirror || declaration is ClassMirror) return;
@@ -48584,7 +48865,8 @@
treatPropertyAsField(declaration, libraryMirror));
if ((isField && hideFields) || (hideMethods && !isField)) return;
if (accessorPropertiesOnly) {
- if (declaration is VariableMirror || declaration.isRegularMethod ||
+ if (declaration is VariableMirror ||
+ declaration.isRegularMethod ||
isField) {
return;
}
@@ -48596,8 +48878,8 @@
var property = properties.putIfAbsent(name, () => new _Property(name));
if (declaration is VariableMirror) {
property
- ..value = objectMirror.getField(symbol).reflectee
- ..writable = !declaration.isFinal && !declaration.isConst;
+ ..value = objectMirror.getField(symbol).reflectee
+ ..writable = !declaration.isFinal && !declaration.isConst;
return;
}
_fillMethodMirrorProperty(libraryMirror, objectMirror, declaration,
@@ -48612,15 +48894,17 @@
static List packageProperties(Map<String, _Property> properties) {
var ret = [];
for (var property in properties.values) {
- ret.addAll([property.name,
- property.setter,
- property.getter,
- property.value,
- property.hasValue,
- property.writable,
- property.isMethod,
- property.isOwn,
- property.wasThrown]);
+ ret.addAll([
+ property.name,
+ property.setter,
+ property.getter,
+ property.value,
+ property.hasValue,
+ property.writable,
+ property.isMethod,
+ property.isOwn,
+ property.wasThrown
+ ]);
}
return ret;
}
@@ -48639,9 +48923,10 @@
LibraryMirror library = classMirror.owner;
if (!attemptedLibraries.contains(library)) {
try {
- return objectMirror.getField(
- MirrorSystem.getSymbol(propertyName, library)).reflectee;
- } catch (e) { }
+ return objectMirror
+ .getField(MirrorSystem.getSymbol(propertyName, library))
+ .reflectee;
+ } catch (e) {}
attemptedLibraries.add(library);
}
classMirror = classMirror.superclass;
@@ -48649,8 +48934,9 @@
return null;
}
try {
- return objectMirror.getField(
- MirrorSystem.getSymbol(propertyName)).reflectee;
+ return objectMirror
+ .getField(MirrorSystem.getSymbol(propertyName))
+ .reflectee;
} catch (e) {
return null;
}
@@ -48662,25 +48948,25 @@
*/
static List consoleApi(host) {
return [
- "inspect",
- (o) {
- js.JsNative.callMethod(host, "_inspect", [o]);
- return o;
- },
- "dir",
- window.console.dir,
- "dirxml",
- window.console.dirxml
- // FIXME: add copy method.
- ];
+ "inspect",
+ (o) {
+ js.JsNative.callMethod(host, "_inspect", [o]);
+ return o;
+ },
+ "dir",
+ window.console.dir,
+ "dirxml",
+ window.console.dirxml
+ // FIXME: add copy method.
+ ];
}
static List getMapKeyList(Map map) => map.keys.toList();
static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
- static void register(Document document, String tag, Type type,
- String extendsTagName) {
+ static void register(
+ Document document, String tag, Type type, String extendsTagName) {
var nativeClass = _validateCustomType(type);
if (extendsTagName == null) {
@@ -48694,70 +48980,90 @@
}
static void _register(Document document, String tag, Type customType,
- String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
+ String extendsTagName) =>
+ _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
static Element createElement(Document document, String tagName) =>
_blink.Blink_Utils.createElement(document, tagName);
}
-// TODO(jacobr): this seems busted. I believe we are actually
-// giving users real windows for opener, parent, top, etc.
-// Or worse, we are probaly returning a raw JSObject.
-class _DOMWindowCrossFrame extends DartHtmlDomObject implements
- WindowBase {
-
+class _DOMWindowCrossFrame extends DartHtmlDomObject implements WindowBase {
_DOMWindowCrossFrame.internal();
-
- static _createSafe(win) => _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame);
+
+ static _createSafe(win) {
+ if (identical(win, window)) {
+ // The current Window object is the only window object that should not
+ // use _DOMWindowCrossFrame.
+ return window;
+ }
+ return win is _DOMWindowCrossFrame ? win : _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame);
+ }
// Fields.
- HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
- LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
- bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
- WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
- WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
- WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
+ HistoryBase get history {
+ var history = _blink.BlinkWindow.instance.history_Getter_(this);
+ return history is _HistoryCrossFrame ? history : _blink.Blink_Utils.setInstanceInterceptor(history, _HistoryCrossFrame);
+ }
+
+ LocationBase get location {
+ var location = _blink.BlinkWindow.instance.location_Getter_(this);
+ return location is _LocationCrossFrame ? location : _blink.Blink_Utils.setInstanceInterceptor(location, _LocationCrossFrame);
+ }
+
+ bool get closed => _blink.BlinkWindow.instance.closed_Getter_(this);
+ WindowBase get opener => _convertNativeToDart_Window(_blink.BlinkWindow.instance.opener_Getter_(this));
+ WindowBase get parent => _convertNativeToDart_Window(_blink.BlinkWindow.instance.parent_Getter_(this));
+ WindowBase get top => _convertNativeToDart_Window(_blink.BlinkWindow.instance.top_Getter_(this));
// Methods.
- void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
- void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
- _blink.Blink_DOMWindowCrossFrame.postMessage(this,
- convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
+ void close() => _blink.BlinkWindow.instance.close_Callback_0_(this);
+ void postMessage(Object message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(this, convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
// Implementation support.
String get typeName => "Window";
// TODO(efortuna): Remove this method. dartbug.com/16814
Events get on => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
- void _addEventListener([String type, EventListener listener, bool useCapture])
- => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ void _addEventListener(
+ [String type, EventListener listener, bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
- void addEventListener(String type, EventListener listener, [bool useCapture])
- => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ void addEventListener(String type, EventListener listener,
+ [bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
bool dispatchEvent(Event event) => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
- void _removeEventListener([String type, EventListener listener,
- bool useCapture]) => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ void _removeEventListener(
+ [String type, EventListener listener, bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
void removeEventListener(String type, EventListener listener,
- [bool useCapture]) => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ [bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
}
class _HistoryCrossFrame extends DartHtmlDomObject implements HistoryBase {
_HistoryCrossFrame.internal();
// Methods.
- void back() => _blink.Blink_HistoryCrossFrame.back(this);
- void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
- void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
+ void back() => _blink.BlinkHistory.instance.back_Callback_0_(this);
+ void forward() => _blink.BlinkHistory.instance.forward_Callback_0_(this);
+ void go([int delta]) {
+ if (delta != null) {
+ _blink.BlinkHistory.instance.go_Callback_1_(this, delta);
+ return;
+ }
+ _blink.BlinkHistory.instance.go_Callback_0_(this);
+ return;
+ }
// Implementation support.
String get typeName => "History";
@@ -48767,7 +49073,7 @@
_LocationCrossFrame.internal();
// Fields.
- set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
+ set href(String value) => _blink.BlinkLocation.instance.href_Setter_(this, value);
// Implementation support.
String get typeName => "Location";
@@ -48790,8 +49096,9 @@
return completer.future;
}
-Future<SendPort> _spawnDomHelper(Function f) =>
- _makeSendPortFuture((portId) { _Utils.spawnDomHelper(f, portId); });
+Future<SendPort> _spawnDomHelper(Function f) => _makeSendPortFuture((portId) {
+ _Utils.spawnDomHelper(f, portId);
+ });
final Future<SendPort> __HELPER_ISOLATE_PORT =
_spawnDomHelper(_helperIsolateMain);
@@ -48833,10 +49140,15 @@
if (cmd == _NEW_TIMER) {
final duration = new Duration(milliseconds: msg[1]);
bool periodic = msg[2];
- ping() { replyTo.send(_TIMER_PING); };
- _TIMER_REGISTRY[replyTo] = periodic ?
- new Timer.periodic(duration, (_) { ping(); }) :
- new Timer(duration, ping);
+ ping() {
+ replyTo.send(_TIMER_PING);
+ }
+ ;
+ _TIMER_REGISTRY[replyTo] = periodic
+ ? new Timer.periodic(duration, (_) {
+ ping();
+ })
+ : new Timer(duration, ping);
} else if (cmd == _CANCEL_TIMER) {
_TIMER_REGISTRY.remove(replyTo).cancel();
} else if (cmd == _PRINT) {
@@ -48849,7 +49161,7 @@
final _printClosure = (s) => window.console.log(s);
final _pureIsolatePrintClosure = (s) {
- _sendToHelperIsolate([_PRINT, s], null);
+ _sendToHelperIsolate([_PRINT, s], null);
};
final _forwardingPrintClosure = _Utils.forwardingPrint;
@@ -48858,7 +49170,7 @@
final _pureIsolateUriBaseClosure = () {
throw new UnimplementedError("Uri.base on a background isolate "
- "is not supported in the browser");
+ "is not supported in the browser");
};
class _Timer implements Timer {
@@ -48869,13 +49181,17 @@
_Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
if (repeating) {
_state = (window._setInterval(() {
- callback(this);
- }, milliSeconds) << 1) | _STATE_INTERVAL;
+ callback(this);
+ }, milliSeconds) <<
+ 1) |
+ _STATE_INTERVAL;
} else {
_state = (window._setTimeout(() {
- _state = null;
- callback(this);
- }, milliSeconds) << 1) | _STATE_TIMEOUT;
+ _state = null;
+ callback(this);
+ }, milliSeconds) <<
+ 1) |
+ _STATE_TIMEOUT;
}
}
@@ -48895,8 +49211,8 @@
get _timerFactoryClosure =>
(int milliSeconds, void callback(Timer timer), bool repeating) {
- return new _Timer(milliSeconds, callback, repeating);
-};
+ return new _Timer(milliSeconds, callback, repeating);
+ };
class _PureIsolateTimer implements Timer {
bool _isActive = true;
@@ -48936,7 +49252,7 @@
get _pureIsolateTimerFactoryClosure =>
((int milliSeconds, void callback(Timer time), bool repeating) =>
- new _PureIsolateTimer(milliSeconds, callback, repeating));
+ new _PureIsolateTimer(milliSeconds, callback, repeating));
class _ScheduleImmediateHelper {
MutationObserver _observer;
@@ -48975,13 +49291,12 @@
new _ScheduleImmediateHelper();
get _scheduleImmediateClosure => (void callback()) {
- _scheduleImmediateHelper._schedule(callback);
-};
+ _scheduleImmediateHelper._schedule(callback);
+ };
get _pureIsolateScheduleImmediateClosure => ((void callback()) =>
- throw new UnimplementedError("scheduleMicrotask in background isolates "
- "are not supported in the browser"));
+ throw new UnimplementedError("scheduleMicrotask in background isolates "
+ "are not supported in the browser"));
// Class for unsupported native browser 'DOM' objects.
-class _UnsupportedBrowserObject extends DartHtmlDomObject {
-}
+class _UnsupportedBrowserObject extends DartHtmlDomObject {}
diff --git a/sdk/lib/html/html_common/conversions_dartium.dart b/sdk/lib/html/html_common/conversions_dartium.dart
index ef02c00..ce45920 100644
--- a/sdk/lib/html/html_common/conversions_dartium.dart
+++ b/sdk/lib/html/html_common/conversions_dartium.dart
@@ -267,9 +267,15 @@
}
prototype = js.JsNative.getProperty(prototype, '__proto__');
}
- } catch (e, stacktrace) {
- if (e is DebugAssertException) print("${e.message}\n ${stacktrace}");
- else print("${stacktrace}");
+ } catch (e) {
+ // This case can happen for cross frame objects.
+ if (js.JsNative.hasProperty(e, "postMessage")) {
+ // assume this is a Window. To match Dart2JS, separate conversion code
+ // in dart:html will switch the wrapper to a cross frame window as
+ // required.
+ // TODO(jacobr): we could consider removing this code completely.
+ return Window.instanceRuntimeType;
+ }
}
return js.JSObject.instanceRuntimeType;
}
diff --git a/sdk/lib/io/data_transformer.dart b/sdk/lib/io/data_transformer.dart
index d3648e7..12d623a 100644
--- a/sdk/lib/io/data_transformer.dart
+++ b/sdk/lib/io/data_transformer.dart
@@ -147,7 +147,7 @@
/**
* Get a [ZLibEncoder] for encoding to `ZLib` compressed data.
*/
- Converter<List<int>, List<int>> get encoder =>
+ ZLibEncoder get encoder =>
new ZLibEncoder(gzip: false, level: level, windowBits: windowBits,
memLevel: memLevel, strategy: strategy,
dictionary: dictionary, raw: raw);
@@ -155,7 +155,7 @@
/**
* Get a [ZLibDecoder] for decoding `ZLib` compressed data.
*/
- Converter<List<int>, List<int>> get decoder =>
+ ZLibDecoder get decoder =>
new ZLibDecoder(windowBits: windowBits, dictionary: dictionary, raw: raw);
}
@@ -259,7 +259,7 @@
/**
* Get a [ZLibEncoder] for encoding to `GZip` compressed data.
*/
- Converter<List<int>, List<int>> get encoder =>
+ ZLibEncoder get encoder =>
new ZLibEncoder(gzip: true, level: level, windowBits: windowBits,
memLevel: memLevel, strategy: strategy,
dictionary: dictionary, raw: raw);
@@ -267,7 +267,7 @@
/**
* Get a [ZLibDecoder] for decoding `GZip` compressed data.
*/
- Converter<List<int>, List<int>> get decoder =>
+ ZLibDecoder get decoder =>
new ZLibDecoder(windowBits: windowBits, dictionary: dictionary, raw: raw);
}
@@ -275,7 +275,8 @@
* The [ZLibEncoder] encoder is used by [ZLibCodec] and [GZipCodec] to compress
* data.
*/
-class ZLibEncoder extends Converter<List<int>, List<int>> {
+class ZLibEncoder extends
+ ChunkedConverter<List<int>, List<int>, List<int>, List<int>> {
/**
* When true, `GZip` frames will be added to the compressed data.
*/
@@ -378,7 +379,8 @@
/**
* The [ZLibDecoder] is used by [ZLibCodec] and [GZipCodec] to decompress data.
*/
-class ZLibDecoder extends Converter<List<int>, List<int>> {
+class ZLibDecoder extends
+ ChunkedConverter<List<int>, List<int>, List<int>, List<int>> {
/**
* Base two logarithm of the window size (the size of the history buffer). It
* should be in the range `8..15`. Larger values result in better compression
diff --git a/sdk/lib/io/string_transformer.dart b/sdk/lib/io/string_transformer.dart
index 16e721b..b6f4524 100644
--- a/sdk/lib/io/string_transformer.dart
+++ b/sdk/lib/io/string_transformer.dart
@@ -25,7 +25,7 @@
List<int> encode(String input) => encoder.convert(input);
String decode(List<int> encoded) => decoder.convert(encoded);
- Converter<String, List<int>> get encoder {
+ ChunkedConverter<String, List<int>, String, List<int>> get encoder {
if (Platform.operatingSystem == "windows") {
return const _WindowsCodePageEncoder();
} else {
@@ -33,7 +33,7 @@
}
}
- Converter<List<int>, String> get decoder {
+ ChunkedConverter<List<int>, String, List<int>, String> get decoder {
if (Platform.operatingSystem == "windows") {
return const _WindowsCodePageDecoder();
} else {
@@ -42,7 +42,8 @@
}
}
-class _WindowsCodePageEncoder extends Converter<String, List<int>> {
+class _WindowsCodePageEncoder
+ extends ChunkedConverter<String, List<int>, String, List<int>> {
const _WindowsCodePageEncoder();
@@ -97,7 +98,8 @@
}
-class _WindowsCodePageDecoder extends Converter<List<int>, String> {
+class _WindowsCodePageDecoder
+ extends ChunkedConverter<List<int>, String, List<int>, String> {
const _WindowsCodePageDecoder();
diff --git a/sdk/lib/js/dartium/cached_patches.dart b/sdk/lib/js/dartium/cached_patches.dart
index 1c3e7ea..847abd5 100644
--- a/sdk/lib/js/dartium/cached_patches.dart
+++ b/sdk/lib/js/dartium/cached_patches.dart
@@ -15,546 +15,6 @@
*/
const _UNDEFINED_JS_CONST = const Object();
-patch class DivElement {
- static Type get instanceRuntimeType => DivElementImpl;
-
-}
-class DivElementImpl extends DivElement implements js_library.JSObjectInterfacesDom {
- DivElementImpl.internal_() : super.internal_();
- get runtimeType => DivElement;
- toString() => super.toString();
-}
-patch class ImageElement {
- static Type get instanceRuntimeType => ImageElementImpl;
-
-}
-class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
- ImageElementImpl.internal_() : super.internal_();
- get runtimeType => ImageElement;
- toString() => super.toString();
-}
-patch class TreeWalker {
- static Type get instanceRuntimeType => TreeWalkerImpl;
-
-}
-class TreeWalkerImpl extends TreeWalker implements js_library.JSObjectInterfacesDom {
- TreeWalkerImpl.internal_() : super.internal_();
- get runtimeType => TreeWalker;
- toString() => super.toString();
-}
-patch class TableSectionElement {
- static Type get instanceRuntimeType => TableSectionElementImpl;
-
-}
-class TableSectionElementImpl extends TableSectionElement implements js_library.JSObjectInterfacesDom {
- TableSectionElementImpl.internal_() : super.internal_();
- get runtimeType => TableSectionElement;
- toString() => super.toString();
-}
-patch class DetailsElement {
- static Type get instanceRuntimeType => DetailsElementImpl;
-
-}
-class DetailsElementImpl extends DetailsElement implements js_library.JSObjectInterfacesDom {
- DetailsElementImpl.internal_() : super.internal_();
- get runtimeType => DetailsElement;
- toString() => super.toString();
-}
-patch class XPathResult {
- static Type get instanceRuntimeType => XPathResultImpl;
-
-}
-class XPathResultImpl extends XPathResult implements js_library.JSObjectInterfacesDom {
- XPathResultImpl.internal_() : super.internal_();
- get runtimeType => XPathResult;
- toString() => super.toString();
-}
-patch class HttpRequest {
- static Type get instanceRuntimeType => HttpRequestImpl;
-
-}
-class HttpRequestImpl extends HttpRequest implements js_library.JSObjectInterfacesDom {
- HttpRequestImpl.internal_() : super.internal_();
- get runtimeType => HttpRequest;
- toString() => super.toString();
-}
-patch class SpeechSynthesisUtterance {
- static Type get instanceRuntimeType => SpeechSynthesisUtteranceImpl;
-
-}
-class SpeechSynthesisUtteranceImpl extends SpeechSynthesisUtterance implements js_library.JSObjectInterfacesDom {
- SpeechSynthesisUtteranceImpl.internal_() : super.internal_();
- get runtimeType => SpeechSynthesisUtterance;
- toString() => super.toString();
-}
-patch class CredentialsContainer {
- static Type get instanceRuntimeType => CredentialsContainerImpl;
-
-}
-class CredentialsContainerImpl extends CredentialsContainer implements js_library.JSObjectInterfacesDom {
- CredentialsContainerImpl.internal_() : super.internal_();
- get runtimeType => CredentialsContainer;
- toString() => super.toString();
-}
-patch class MessageChannel {
- static Type get instanceRuntimeType => MessageChannelImpl;
-
-}
-class MessageChannelImpl extends MessageChannel implements js_library.JSObjectInterfacesDom {
- MessageChannelImpl.internal_() : super.internal_();
- get runtimeType => MessageChannel;
- toString() => super.toString();
-}
-patch class CloseEvent {
- static Type get instanceRuntimeType => CloseEventImpl;
-
-}
-class CloseEventImpl extends CloseEvent implements js_library.JSObjectInterfacesDom {
- CloseEventImpl.internal_() : super.internal_();
- get runtimeType => CloseEvent;
- toString() => super.toString();
-}
-patch class ProgressEvent {
- static Type get instanceRuntimeType => ProgressEventImpl;
-
-}
-class ProgressEventImpl extends ProgressEvent implements js_library.JSObjectInterfacesDom {
- ProgressEventImpl.internal_() : super.internal_();
- get runtimeType => ProgressEvent;
- toString() => super.toString();
-}
-patch class MediaController {
- static Type get instanceRuntimeType => MediaControllerImpl;
-
-}
-class MediaControllerImpl extends MediaController implements js_library.JSObjectInterfacesDom {
- MediaControllerImpl.internal_() : super.internal_();
- get runtimeType => MediaController;
- toString() => super.toString();
-}
-patch class VRDevice {
- static Type get instanceRuntimeType => VRDeviceImpl;
-
-}
-class VRDeviceImpl extends VRDevice implements js_library.JSObjectInterfacesDom {
- VRDeviceImpl.internal_() : super.internal_();
- get runtimeType => VRDevice;
- toString() => super.toString();
-}
-patch class SpeechSynthesis {
- static Type get instanceRuntimeType => SpeechSynthesisImpl;
-
-}
-class SpeechSynthesisImpl extends SpeechSynthesis implements js_library.JSObjectInterfacesDom {
- SpeechSynthesisImpl.internal_() : super.internal_();
- get runtimeType => SpeechSynthesis;
- toString() => super.toString();
-}
-patch class HtmlCollection {
- static Type get instanceRuntimeType => HtmlCollectionImpl;
-
-}
-class HtmlCollectionImpl extends HtmlCollection implements js_library.JSObjectInterfacesDom {
- HtmlCollectionImpl.internal_() : super.internal_();
- get runtimeType => HtmlCollection;
- toString() => super.toString();
-}
-patch class Element {
- static Type get instanceRuntimeType => ElementImpl;
-
-}
-class ElementImpl extends Element implements js_library.JSObjectInterfacesDom {
- ElementImpl.internal_() : super.internal_();
- get runtimeType => Element;
- toString() => super.toString();
-}
-patch class Plugin {
- static Type get instanceRuntimeType => PluginImpl;
-
-}
-class PluginImpl extends Plugin implements js_library.JSObjectInterfacesDom {
- PluginImpl.internal_() : super.internal_();
- get runtimeType => Plugin;
- toString() => super.toString();
-}
-patch class CssFontFaceRule {
- static Type get instanceRuntimeType => CssFontFaceRuleImpl;
-
-}
-class CssFontFaceRuleImpl extends CssFontFaceRule implements js_library.JSObjectInterfacesDom {
- CssFontFaceRuleImpl.internal_() : super.internal_();
- get runtimeType => CssFontFaceRule;
- toString() => super.toString();
-}
-patch class File {
- static Type get instanceRuntimeType => FileImpl;
-
-}
-class FileImpl extends File implements js_library.JSObjectInterfacesDom {
- FileImpl.internal_() : super.internal_();
- get runtimeType => File;
- toString() => super.toString();
-}
-patch class MouseEvent {
- static Type get instanceRuntimeType => MouseEventImpl;
-
-}
-class MouseEventImpl extends MouseEvent implements js_library.JSObjectInterfacesDom {
- MouseEventImpl.internal_() : super.internal_();
- get runtimeType => MouseEvent;
- toString() => super.toString();
-}
-patch class MenuElement {
- static Type get instanceRuntimeType => MenuElementImpl;
-
-}
-class MenuElementImpl extends MenuElement implements js_library.JSObjectInterfacesDom {
- MenuElementImpl.internal_() : super.internal_();
- get runtimeType => MenuElement;
- toString() => super.toString();
-}
-patch class ReadableByteStreamReader {
- static Type get instanceRuntimeType => ReadableByteStreamReaderImpl;
-
-}
-class ReadableByteStreamReaderImpl extends ReadableByteStreamReader implements js_library.JSObjectInterfacesDom {
- ReadableByteStreamReaderImpl.internal_() : super.internal_();
- get runtimeType => ReadableByteStreamReader;
- toString() => super.toString();
-}
-patch class FetchEvent {
- static Type get instanceRuntimeType => FetchEventImpl;
-
-}
-class FetchEventImpl extends FetchEvent implements js_library.JSObjectInterfacesDom {
- FetchEventImpl.internal_() : super.internal_();
- get runtimeType => FetchEvent;
- toString() => super.toString();
-}
-patch class MediaStreamTrack {
- static Type get instanceRuntimeType => MediaStreamTrackImpl;
-
-}
-class MediaStreamTrackImpl extends MediaStreamTrack implements js_library.JSObjectInterfacesDom {
- MediaStreamTrackImpl.internal_() : super.internal_();
- get runtimeType => MediaStreamTrack;
- toString() => super.toString();
-}
-patch class ShadowRoot {
- static Type get instanceRuntimeType => ShadowRootImpl;
-
-}
-class ShadowRootImpl extends ShadowRoot implements js_library.JSObjectInterfacesDom {
- ShadowRootImpl.internal_() : super.internal_();
- get runtimeType => ShadowRoot;
- toString() => super.toString();
-}
-patch class SpeechSynthesisEvent {
- static Type get instanceRuntimeType => SpeechSynthesisEventImpl;
-
-}
-class SpeechSynthesisEventImpl extends SpeechSynthesisEvent implements js_library.JSObjectInterfacesDom {
- SpeechSynthesisEventImpl.internal_() : super.internal_();
- get runtimeType => SpeechSynthesisEvent;
- toString() => super.toString();
-}
-patch class VRPositionState {
- static Type get instanceRuntimeType => VRPositionStateImpl;
-
-}
-class VRPositionStateImpl extends VRPositionState implements js_library.JSObjectInterfacesDom {
- VRPositionStateImpl.internal_() : super.internal_();
- get runtimeType => VRPositionState;
- toString() => super.toString();
-}
-patch class Window {
- static Type get instanceRuntimeType => WindowImpl;
-
-}
-class WindowImpl extends Window implements js_library.JSObjectInterfacesDom {
- WindowImpl.internal_() : super.internal_();
- get runtimeType => Window;
- toString() => super.toString();
-}
-patch class SpeechRecognition {
- static Type get instanceRuntimeType => SpeechRecognitionImpl;
-
-}
-class SpeechRecognitionImpl extends SpeechRecognition implements js_library.JSObjectInterfacesDom {
- SpeechRecognitionImpl.internal_() : super.internal_();
- get runtimeType => SpeechRecognition;
- toString() => super.toString();
-}
-patch class Console {
- static Type get instanceRuntimeType => ConsoleImpl;
-
-}
-class ConsoleImpl extends Console implements js_library.JSObjectInterfacesDom {
- ConsoleImpl.internal_() : super.internal_();
- get runtimeType => Console;
- toString() => super.toString();
-}
-patch class AutocompleteErrorEvent {
- static Type get instanceRuntimeType => AutocompleteErrorEventImpl;
-
-}
-class AutocompleteErrorEventImpl extends AutocompleteErrorEvent implements js_library.JSObjectInterfacesDom {
- AutocompleteErrorEventImpl.internal_() : super.internal_();
- get runtimeType => AutocompleteErrorEvent;
- toString() => super.toString();
-}
-patch class CanvasGradient {
- static Type get instanceRuntimeType => CanvasGradientImpl;
-
-}
-class CanvasGradientImpl extends CanvasGradient implements js_library.JSObjectInterfacesDom {
- CanvasGradientImpl.internal_() : super.internal_();
- get runtimeType => CanvasGradient;
- toString() => super.toString();
-}
-patch class MediaStream {
- static Type get instanceRuntimeType => MediaStreamImpl;
-
-}
-class MediaStreamImpl extends MediaStream implements js_library.JSObjectInterfacesDom {
- MediaStreamImpl.internal_() : super.internal_();
- get runtimeType => MediaStream;
- toString() => super.toString();
-}
-patch class _ClientRectList {
- static Type get instanceRuntimeType => _ClientRectListImpl;
-
-}
-class _ClientRectListImpl extends _ClientRectList implements js_library.JSObjectInterfacesDom {
- _ClientRectListImpl.internal_() : super.internal_();
- get runtimeType => _ClientRectList;
- toString() => super.toString();
-}
-patch class Document {
- static Type get instanceRuntimeType => DocumentImpl;
-
-}
-class DocumentImpl extends Document implements js_library.JSObjectInterfacesDom {
- DocumentImpl.internal_() : super.internal_();
- get runtimeType => Document;
- toString() => super.toString();
-}
-patch class MessageEvent {
- static Type get instanceRuntimeType => MessageEventImpl;
-
-}
-class MessageEventImpl extends MessageEvent implements js_library.JSObjectInterfacesDom {
- MessageEventImpl.internal_() : super.internal_();
- get runtimeType => MessageEvent;
- toString() => super.toString();
-}
-patch class RtcDtmfSender {
- static Type get instanceRuntimeType => RtcDtmfSenderImpl;
-
-}
-class RtcDtmfSenderImpl extends RtcDtmfSender implements js_library.JSObjectInterfacesDom {
- RtcDtmfSenderImpl.internal_() : super.internal_();
- get runtimeType => RtcDtmfSender;
- toString() => super.toString();
-}
-patch class ParamElement {
- static Type get instanceRuntimeType => ParamElementImpl;
-
-}
-class ParamElementImpl extends ParamElement implements js_library.JSObjectInterfacesDom {
- ParamElementImpl.internal_() : super.internal_();
- get runtimeType => ParamElement;
- toString() => super.toString();
-}
-patch class TextTrack {
- static Type get instanceRuntimeType => TextTrackImpl;
-
-}
-class TextTrackImpl extends TextTrack implements js_library.JSObjectInterfacesDom {
- TextTrackImpl.internal_() : super.internal_();
- get runtimeType => TextTrack;
- toString() => super.toString();
-}
-patch class ModElement {
- static Type get instanceRuntimeType => ModElementImpl;
-
-}
-class ModElementImpl extends ModElement implements js_library.JSObjectInterfacesDom {
- ModElementImpl.internal_() : super.internal_();
- get runtimeType => ModElement;
- toString() => super.toString();
-}
-patch class ScriptElement {
- static Type get instanceRuntimeType => ScriptElementImpl;
-
-}
-class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
- ScriptElementImpl.internal_() : super.internal_();
- get runtimeType => ScriptElement;
- toString() => super.toString();
-}
-patch class VRFieldOfView {
- static Type get instanceRuntimeType => VRFieldOfViewImpl;
-
-}
-class VRFieldOfViewImpl extends VRFieldOfView implements js_library.JSObjectInterfacesDom {
- VRFieldOfViewImpl.internal_() : super.internal_();
- get runtimeType => VRFieldOfView;
- toString() => super.toString();
-}
-patch class SyncRegistration {
- static Type get instanceRuntimeType => SyncRegistrationImpl;
-
-}
-class SyncRegistrationImpl extends SyncRegistration implements js_library.JSObjectInterfacesDom {
- SyncRegistrationImpl.internal_() : super.internal_();
- get runtimeType => SyncRegistration;
- toString() => super.toString();
-}
-patch class Touch {
- static Type get instanceRuntimeType => TouchImpl;
-
-}
-class TouchImpl extends Touch implements js_library.JSObjectInterfacesDom {
- TouchImpl.internal_() : super.internal_();
- get runtimeType => Touch;
- toString() => super.toString();
-}
-patch class BarProp {
- static Type get instanceRuntimeType => BarPropImpl;
-
-}
-class BarPropImpl extends BarProp implements js_library.JSObjectInterfacesDom {
- BarPropImpl.internal_() : super.internal_();
- get runtimeType => BarProp;
- toString() => super.toString();
-}
-patch class DeviceLightEvent {
- static Type get instanceRuntimeType => DeviceLightEventImpl;
-
-}
-class DeviceLightEventImpl extends DeviceLightEvent implements js_library.JSObjectInterfacesDom {
- DeviceLightEventImpl.internal_() : super.internal_();
- get runtimeType => DeviceLightEvent;
- toString() => super.toString();
-}
-patch class MediaDevices {
- static Type get instanceRuntimeType => MediaDevicesImpl;
-
-}
-class MediaDevicesImpl extends MediaDevices implements js_library.JSObjectInterfacesDom {
- MediaDevicesImpl.internal_() : super.internal_();
- get runtimeType => MediaDevices;
- toString() => super.toString();
-}
-patch class Url {
- static Type get instanceRuntimeType => UrlImpl;
-
-}
-class UrlImpl extends Url implements js_library.JSObjectInterfacesDom {
- UrlImpl.internal_() : super.internal_();
- get runtimeType => Url;
- toString() => super.toString();
-}
-patch class EmbedElement {
- static Type get instanceRuntimeType => EmbedElementImpl;
-
-}
-class EmbedElementImpl extends EmbedElement implements js_library.JSObjectInterfacesDom {
- EmbedElementImpl.internal_() : super.internal_();
- get runtimeType => EmbedElement;
- toString() => super.toString();
-}
-patch class Metadata {
- static Type get instanceRuntimeType => MetadataImpl;
-
-}
-class MetadataImpl extends Metadata implements js_library.JSObjectInterfacesDom {
- MetadataImpl.internal_() : super.internal_();
- get runtimeType => Metadata;
- toString() => super.toString();
-}
-patch class _FileEntrySync {
- static Type get instanceRuntimeType => _FileEntrySyncImpl;
-
-}
-class _FileEntrySyncImpl extends _FileEntrySync implements js_library.JSObjectInterfacesDom {
- _FileEntrySyncImpl.internal_() : super.internal_();
- get runtimeType => _FileEntrySync;
- toString() => super.toString();
-}
-patch class BaseElement {
- static Type get instanceRuntimeType => BaseElementImpl;
-
-}
-class BaseElementImpl extends BaseElement implements js_library.JSObjectInterfacesDom {
- BaseElementImpl.internal_() : super.internal_();
- get runtimeType => BaseElement;
- toString() => super.toString();
-}
-patch class BRElement {
- static Type get instanceRuntimeType => BRElementImpl;
-
-}
-class BRElementImpl extends BRElement implements js_library.JSObjectInterfacesDom {
- BRElementImpl.internal_() : super.internal_();
- get runtimeType => BRElement;
- toString() => super.toString();
-}
-patch class Presentation {
- static Type get instanceRuntimeType => PresentationImpl;
-
-}
-class PresentationImpl extends Presentation implements js_library.JSObjectInterfacesDom {
- PresentationImpl.internal_() : super.internal_();
- get runtimeType => Presentation;
- toString() => super.toString();
-}
-patch class CircularGeofencingRegion {
- static Type get instanceRuntimeType => CircularGeofencingRegionImpl;
-
-}
-class CircularGeofencingRegionImpl extends CircularGeofencingRegion implements js_library.JSObjectInterfacesDom {
- CircularGeofencingRegionImpl.internal_() : super.internal_();
- get runtimeType => CircularGeofencingRegion;
- toString() => super.toString();
-}
-patch class PushManager {
- static Type get instanceRuntimeType => PushManagerImpl;
-
-}
-class PushManagerImpl extends PushManager implements js_library.JSObjectInterfacesDom {
- PushManagerImpl.internal_() : super.internal_();
- get runtimeType => PushManager;
- toString() => super.toString();
-}
-patch class PasswordCredential {
- static Type get instanceRuntimeType => PasswordCredentialImpl;
-
-}
-class PasswordCredentialImpl extends PasswordCredential implements js_library.JSObjectInterfacesDom {
- PasswordCredentialImpl.internal_() : super.internal_();
- get runtimeType => PasswordCredential;
- toString() => super.toString();
-}
-patch class ObjectElement {
- static Type get instanceRuntimeType => ObjectElementImpl;
-
-}
-class ObjectElementImpl extends ObjectElement implements js_library.JSObjectInterfacesDom {
- ObjectElementImpl.internal_() : super.internal_();
- get runtimeType => ObjectElement;
- toString() => super.toString();
-}
-patch class DomMatrix {
- static Type get instanceRuntimeType => DomMatrixImpl;
-
-}
-class DomMatrixImpl extends DomMatrix implements js_library.JSObjectInterfacesDom {
- DomMatrixImpl.internal_() : super.internal_();
- get runtimeType => DomMatrix;
- toString() => super.toString();
-}
patch class AbstractWorker {
static Type get instanceRuntimeType => AbstractWorkerImpl;
@@ -564,1752 +24,6 @@
get runtimeType => AbstractWorker;
toString() => super.toString();
}
-patch class ResourceProgressEvent {
- static Type get instanceRuntimeType => ResourceProgressEventImpl;
-
-}
-class ResourceProgressEventImpl extends ResourceProgressEvent implements js_library.JSObjectInterfacesDom {
- ResourceProgressEventImpl.internal_() : super.internal_();
- get runtimeType => ResourceProgressEvent;
- toString() => super.toString();
-}
-patch class ValidityState {
- static Type get instanceRuntimeType => ValidityStateImpl;
-
-}
-class ValidityStateImpl extends ValidityState implements js_library.JSObjectInterfacesDom {
- ValidityStateImpl.internal_() : super.internal_();
- get runtimeType => ValidityState;
- toString() => super.toString();
-}
-patch class HRElement {
- static Type get instanceRuntimeType => HRElementImpl;
-
-}
-class HRElementImpl extends HRElement implements js_library.JSObjectInterfacesDom {
- HRElementImpl.internal_() : super.internal_();
- get runtimeType => HRElement;
- toString() => super.toString();
-}
-patch class OptGroupElement {
- static Type get instanceRuntimeType => OptGroupElementImpl;
-
-}
-class OptGroupElementImpl extends OptGroupElement implements js_library.JSObjectInterfacesDom {
- OptGroupElementImpl.internal_() : super.internal_();
- get runtimeType => OptGroupElement;
- toString() => super.toString();
-}
-patch class Crypto {
- static Type get instanceRuntimeType => CryptoImpl;
-
-}
-class CryptoImpl extends Crypto implements js_library.JSObjectInterfacesDom {
- CryptoImpl.internal_() : super.internal_();
- get runtimeType => Crypto;
- toString() => super.toString();
-}
-patch class PerformanceTiming {
- static Type get instanceRuntimeType => PerformanceTimingImpl;
-
-}
-class PerformanceTimingImpl extends PerformanceTiming implements js_library.JSObjectInterfacesDom {
- PerformanceTimingImpl.internal_() : super.internal_();
- get runtimeType => PerformanceTiming;
- toString() => super.toString();
-}
-patch class RtcDataChannel {
- static Type get instanceRuntimeType => RtcDataChannelImpl;
-
-}
-class RtcDataChannelImpl extends RtcDataChannel implements js_library.JSObjectInterfacesDom {
- RtcDataChannelImpl.internal_() : super.internal_();
- get runtimeType => RtcDataChannel;
- toString() => super.toString();
-}
-patch class NavigatorOnLine {
- static Type get instanceRuntimeType => NavigatorOnLineImpl;
-
-}
-class NavigatorOnLineImpl extends NavigatorOnLine implements js_library.JSObjectInterfacesDom {
- NavigatorOnLineImpl.internal_() : super.internal_();
- get runtimeType => NavigatorOnLine;
- toString() => super.toString();
-}
-patch class _HTMLAppletElement {
- static Type get instanceRuntimeType => _HTMLAppletElementImpl;
-
-}
-class _HTMLAppletElementImpl extends _HTMLAppletElement implements js_library.JSObjectInterfacesDom {
- _HTMLAppletElementImpl.internal_() : super.internal_();
- get runtimeType => _HTMLAppletElement;
- toString() => super.toString();
-}
-patch class SpeechSynthesisVoice {
- static Type get instanceRuntimeType => SpeechSynthesisVoiceImpl;
-
-}
-class SpeechSynthesisVoiceImpl extends SpeechSynthesisVoice implements js_library.JSObjectInterfacesDom {
- SpeechSynthesisVoiceImpl.internal_() : super.internal_();
- get runtimeType => SpeechSynthesisVoice;
- toString() => super.toString();
-}
-patch class FontFaceSetLoadEvent {
- static Type get instanceRuntimeType => FontFaceSetLoadEventImpl;
-
-}
-class FontFaceSetLoadEventImpl extends FontFaceSetLoadEvent implements js_library.JSObjectInterfacesDom {
- FontFaceSetLoadEventImpl.internal_() : super.internal_();
- get runtimeType => FontFaceSetLoadEvent;
- toString() => super.toString();
-}
-patch class NavigatorStorageUtils {
- static Type get instanceRuntimeType => NavigatorStorageUtilsImpl;
-
-}
-class NavigatorStorageUtilsImpl extends NavigatorStorageUtils implements js_library.JSObjectInterfacesDom {
- NavigatorStorageUtilsImpl.internal_() : super.internal_();
- get runtimeType => NavigatorStorageUtils;
- toString() => super.toString();
-}
-patch class SourceElement {
- static Type get instanceRuntimeType => SourceElementImpl;
-
-}
-class SourceElementImpl extends SourceElement implements js_library.JSObjectInterfacesDom {
- SourceElementImpl.internal_() : super.internal_();
- get runtimeType => SourceElement;
- toString() => super.toString();
-}
-patch class InjectedScriptHost {
- static Type get instanceRuntimeType => InjectedScriptHostImpl;
-
-}
-class InjectedScriptHostImpl extends InjectedScriptHost implements js_library.JSObjectInterfacesDom {
- InjectedScriptHostImpl.internal_() : super.internal_();
- get runtimeType => InjectedScriptHost;
- toString() => super.toString();
-}
-patch class UIEvent {
- static Type get instanceRuntimeType => UIEventImpl;
-
-}
-class UIEventImpl extends UIEvent implements js_library.JSObjectInterfacesDom {
- UIEventImpl.internal_() : super.internal_();
- get runtimeType => UIEvent;
- toString() => super.toString();
-}
-patch class HtmlHtmlElement {
- static Type get instanceRuntimeType => HtmlHtmlElementImpl;
-
-}
-class HtmlHtmlElementImpl extends HtmlHtmlElement implements js_library.JSObjectInterfacesDom {
- HtmlHtmlElementImpl.internal_() : super.internal_();
- get runtimeType => HtmlHtmlElement;
- toString() => super.toString();
-}
-patch class ClipboardEvent {
- static Type get instanceRuntimeType => ClipboardEventImpl;
-
-}
-class ClipboardEventImpl extends ClipboardEvent implements js_library.JSObjectInterfacesDom {
- ClipboardEventImpl.internal_() : super.internal_();
- get runtimeType => ClipboardEvent;
- toString() => super.toString();
-}
-patch class OptionElement {
- static Type get instanceRuntimeType => OptionElementImpl;
-
-}
-class OptionElementImpl extends OptionElement implements js_library.JSObjectInterfacesDom {
- OptionElementImpl.internal_() : super.internal_();
- get runtimeType => OptionElement;
- toString() => super.toString();
-}
-patch class MediaSource {
- static Type get instanceRuntimeType => MediaSourceImpl;
-
-}
-class MediaSourceImpl extends MediaSource implements js_library.JSObjectInterfacesDom {
- MediaSourceImpl.internal_() : super.internal_();
- get runtimeType => MediaSource;
- toString() => super.toString();
-}
-patch class MediaKeyMessageEvent {
- static Type get instanceRuntimeType => MediaKeyMessageEventImpl;
-
-}
-class MediaKeyMessageEventImpl extends MediaKeyMessageEvent implements js_library.JSObjectInterfacesDom {
- MediaKeyMessageEventImpl.internal_() : super.internal_();
- get runtimeType => MediaKeyMessageEvent;
- toString() => super.toString();
-}
-patch class CustomEvent {
- static Type get instanceRuntimeType => CustomEventImpl;
-
-}
-class CustomEventImpl extends CustomEvent implements js_library.JSObjectInterfacesDom {
- CustomEventImpl.internal_() : super.internal_();
- get runtimeType => CustomEvent;
- toString() => super.toString();
-}
-patch class VttRegion {
- static Type get instanceRuntimeType => VttRegionImpl;
-
-}
-class VttRegionImpl extends VttRegion implements js_library.JSObjectInterfacesDom {
- VttRegionImpl.internal_() : super.internal_();
- get runtimeType => VttRegion;
- toString() => super.toString();
-}
-patch class HeadingElement {
- static Type get instanceRuntimeType => HeadingElementImpl;
-
-}
-class HeadingElementImpl extends HeadingElement implements js_library.JSObjectInterfacesDom {
- HeadingElementImpl.internal_() : super.internal_();
- get runtimeType => HeadingElement;
- toString() => super.toString();
-}
-patch class History {
- static Type get instanceRuntimeType => HistoryImpl;
-
-}
-class HistoryImpl extends History implements js_library.JSObjectInterfacesDom {
- HistoryImpl.internal_() : super.internal_();
- get runtimeType => History;
- toString() => super.toString();
-}
-patch class ServiceWorkerRegistration {
- static Type get instanceRuntimeType => ServiceWorkerRegistrationImpl;
-
-}
-class ServiceWorkerRegistrationImpl extends ServiceWorkerRegistration implements js_library.JSObjectInterfacesDom {
- ServiceWorkerRegistrationImpl.internal_() : super.internal_();
- get runtimeType => ServiceWorkerRegistration;
- toString() => super.toString();
-}
-patch class _WorkerNavigator {
- static Type get instanceRuntimeType => _WorkerNavigatorImpl;
-
-}
-class _WorkerNavigatorImpl extends _WorkerNavigator implements js_library.JSObjectInterfacesDom {
- _WorkerNavigatorImpl.internal_() : super.internal_();
- get runtimeType => _WorkerNavigator;
- toString() => super.toString();
-}
-patch class RtcStatsResponse {
- static Type get instanceRuntimeType => RtcStatsResponseImpl;
-
-}
-class RtcStatsResponseImpl extends RtcStatsResponse implements js_library.JSObjectInterfacesDom {
- RtcStatsResponseImpl.internal_() : super.internal_();
- get runtimeType => RtcStatsResponse;
- toString() => super.toString();
-}
-patch class DirectoryReader {
- static Type get instanceRuntimeType => DirectoryReaderImpl;
-
-}
-class DirectoryReaderImpl extends DirectoryReader implements js_library.JSObjectInterfacesDom {
- DirectoryReaderImpl.internal_() : super.internal_();
- get runtimeType => DirectoryReader;
- toString() => super.toString();
-}
-patch class Headers {
- static Type get instanceRuntimeType => HeadersImpl;
-
-}
-class HeadersImpl extends Headers implements js_library.JSObjectInterfacesDom {
- HeadersImpl.internal_() : super.internal_();
- get runtimeType => Headers;
- toString() => super.toString();
-}
-patch class DataListElement {
- static Type get instanceRuntimeType => DataListElementImpl;
-
-}
-class DataListElementImpl extends DataListElement implements js_library.JSObjectInterfacesDom {
- DataListElementImpl.internal_() : super.internal_();
- get runtimeType => DataListElement;
- toString() => super.toString();
-}
-patch class MediaList {
- static Type get instanceRuntimeType => MediaListImpl;
-
-}
-class MediaListImpl extends MediaList implements js_library.JSObjectInterfacesDom {
- MediaListImpl.internal_() : super.internal_();
- get runtimeType => MediaList;
- toString() => super.toString();
-}
-patch class ParentNode {
- static Type get instanceRuntimeType => ParentNodeImpl;
-
-}
-class ParentNodeImpl extends ParentNode implements js_library.JSObjectInterfacesDom {
- ParentNodeImpl.internal_() : super.internal_();
- get runtimeType => ParentNode;
- toString() => super.toString();
-}
-patch class _FileReaderSync {
- static Type get instanceRuntimeType => _FileReaderSyncImpl;
-
-}
-class _FileReaderSyncImpl extends _FileReaderSync implements js_library.JSObjectInterfacesDom {
- _FileReaderSyncImpl.internal_() : super.internal_();
- get runtimeType => _FileReaderSync;
- toString() => super.toString();
-}
-patch class DataTransferItemList {
- static Type get instanceRuntimeType => DataTransferItemListImpl;
-
-}
-class DataTransferItemListImpl extends DataTransferItemList implements js_library.JSObjectInterfacesDom {
- DataTransferItemListImpl.internal_() : super.internal_();
- get runtimeType => DataTransferItemList;
- toString() => super.toString();
-}
-patch class GlobalEventHandlers {
- static Type get instanceRuntimeType => GlobalEventHandlersImpl;
-
-}
-class GlobalEventHandlersImpl extends GlobalEventHandlers implements js_library.JSObjectInterfacesDom {
- GlobalEventHandlersImpl.internal_() : super.internal_();
- get runtimeType => GlobalEventHandlers;
- toString() => super.toString();
-}
-patch class DocumentFragment {
- static Type get instanceRuntimeType => DocumentFragmentImpl;
-
-}
-class DocumentFragmentImpl extends DocumentFragment implements js_library.JSObjectInterfacesDom {
- DocumentFragmentImpl.internal_() : super.internal_();
- get runtimeType => DocumentFragment;
- toString() => super.toString();
-}
-patch class DomImplementation {
- static Type get instanceRuntimeType => DomImplementationImpl;
-
-}
-class DomImplementationImpl extends DomImplementation implements js_library.JSObjectInterfacesDom {
- DomImplementationImpl.internal_() : super.internal_();
- get runtimeType => DomImplementation;
- toString() => super.toString();
-}
-patch class PeriodicSyncEvent {
- static Type get instanceRuntimeType => PeriodicSyncEventImpl;
-
-}
-class PeriodicSyncEventImpl extends PeriodicSyncEvent implements js_library.JSObjectInterfacesDom {
- PeriodicSyncEventImpl.internal_() : super.internal_();
- get runtimeType => PeriodicSyncEvent;
- toString() => super.toString();
-}
-patch class DialogElement {
- static Type get instanceRuntimeType => DialogElementImpl;
-
-}
-class DialogElementImpl extends DialogElement implements js_library.JSObjectInterfacesDom {
- DialogElementImpl.internal_() : super.internal_();
- get runtimeType => DialogElement;
- toString() => super.toString();
-}
-patch class PeriodicSyncRegistration {
- static Type get instanceRuntimeType => PeriodicSyncRegistrationImpl;
-
-}
-class PeriodicSyncRegistrationImpl extends PeriodicSyncRegistration implements js_library.JSObjectInterfacesDom {
- PeriodicSyncRegistrationImpl.internal_() : super.internal_();
- get runtimeType => PeriodicSyncRegistration;
- toString() => super.toString();
-}
-patch class MessagePort {
- static Type get instanceRuntimeType => MessagePortImpl;
-
-}
-class MessagePortImpl extends MessagePort implements js_library.JSObjectInterfacesDom {
- MessagePortImpl.internal_() : super.internal_();
- get runtimeType => MessagePort;
- toString() => super.toString();
-}
-patch class FileReader {
- static Type get instanceRuntimeType => FileReaderImpl;
-
-}
-class FileReaderImpl extends FileReader implements js_library.JSObjectInterfacesDom {
- FileReaderImpl.internal_() : super.internal_();
- get runtimeType => FileReader;
- toString() => super.toString();
-}
-patch class HtmlOptionsCollection {
- static Type get instanceRuntimeType => HtmlOptionsCollectionImpl;
-
-}
-class HtmlOptionsCollectionImpl extends HtmlOptionsCollection implements js_library.JSObjectInterfacesDom {
- HtmlOptionsCollectionImpl.internal_() : super.internal_();
- get runtimeType => HtmlOptionsCollection;
- toString() => super.toString();
-}
-patch class _HTMLFrameSetElement {
- static Type get instanceRuntimeType => _HTMLFrameSetElementImpl;
-
-}
-class _HTMLFrameSetElementImpl extends _HTMLFrameSetElement implements js_library.JSObjectInterfacesDom {
- _HTMLFrameSetElementImpl.internal_() : super.internal_();
- get runtimeType => _HTMLFrameSetElement;
- toString() => super.toString();
-}
-patch class PerformanceMeasure {
- static Type get instanceRuntimeType => PerformanceMeasureImpl;
-
-}
-class PerformanceMeasureImpl extends PerformanceMeasure implements js_library.JSObjectInterfacesDom {
- PerformanceMeasureImpl.internal_() : super.internal_();
- get runtimeType => PerformanceMeasure;
- toString() => super.toString();
-}
-patch class ServiceWorkerContainer {
- static Type get instanceRuntimeType => ServiceWorkerContainerImpl;
-
-}
-class ServiceWorkerContainerImpl extends ServiceWorkerContainer implements js_library.JSObjectInterfacesDom {
- ServiceWorkerContainerImpl.internal_() : super.internal_();
- get runtimeType => ServiceWorkerContainer;
- toString() => super.toString();
-}
-patch class TrackDefaultList {
- static Type get instanceRuntimeType => TrackDefaultListImpl;
-
-}
-class TrackDefaultListImpl extends TrackDefaultList implements js_library.JSObjectInterfacesDom {
- TrackDefaultListImpl.internal_() : super.internal_();
- get runtimeType => TrackDefaultList;
- toString() => super.toString();
-}
-patch class RelatedEvent {
- static Type get instanceRuntimeType => RelatedEventImpl;
-
-}
-class RelatedEventImpl extends RelatedEvent implements js_library.JSObjectInterfacesDom {
- RelatedEventImpl.internal_() : super.internal_();
- get runtimeType => RelatedEvent;
- toString() => super.toString();
-}
-patch class TableCaptionElement {
- static Type get instanceRuntimeType => TableCaptionElementImpl;
-
-}
-class TableCaptionElementImpl extends TableCaptionElement implements js_library.JSObjectInterfacesDom {
- TableCaptionElementImpl.internal_() : super.internal_();
- get runtimeType => TableCaptionElement;
- toString() => super.toString();
-}
-patch class ScrollState {
- static Type get instanceRuntimeType => ScrollStateImpl;
-
-}
-class ScrollStateImpl extends ScrollState implements js_library.JSObjectInterfacesDom {
- ScrollStateImpl.internal_() : super.internal_();
- get runtimeType => ScrollState;
- toString() => super.toString();
-}
-patch class MenuItemElement {
- static Type get instanceRuntimeType => MenuItemElementImpl;
-
-}
-class MenuItemElementImpl extends MenuItemElement implements js_library.JSObjectInterfacesDom {
- MenuItemElementImpl.internal_() : super.internal_();
- get runtimeType => MenuItemElement;
- toString() => super.toString();
-}
-patch class MediaKeyStatusMap {
- static Type get instanceRuntimeType => MediaKeyStatusMapImpl;
-
-}
-class MediaKeyStatusMapImpl extends MediaKeyStatusMap implements js_library.JSObjectInterfacesDom {
- MediaKeyStatusMapImpl.internal_() : super.internal_();
- get runtimeType => MediaKeyStatusMap;
- toString() => super.toString();
-}
-patch class RtcDataChannelEvent {
- static Type get instanceRuntimeType => RtcDataChannelEventImpl;
-
-}
-class RtcDataChannelEventImpl extends RtcDataChannelEvent implements js_library.JSObjectInterfacesDom {
- RtcDataChannelEventImpl.internal_() : super.internal_();
- get runtimeType => RtcDataChannelEvent;
- toString() => super.toString();
-}
-patch class MediaElement {
- static Type get instanceRuntimeType => MediaElementImpl;
-
-}
-class MediaElementImpl extends MediaElement implements js_library.JSObjectInterfacesDom {
- MediaElementImpl.internal_() : super.internal_();
- get runtimeType => MediaElement;
- toString() => super.toString();
-}
-patch class MediaDeviceInfo {
- static Type get instanceRuntimeType => MediaDeviceInfoImpl;
-
-}
-class MediaDeviceInfoImpl extends MediaDeviceInfo implements js_library.JSObjectInterfacesDom {
- MediaDeviceInfoImpl.internal_() : super.internal_();
- get runtimeType => MediaDeviceInfo;
- toString() => super.toString();
-}
-patch class StorageEvent {
- static Type get instanceRuntimeType => StorageEventImpl;
-
-}
-class StorageEventImpl extends StorageEvent implements js_library.JSObjectInterfacesDom {
- StorageEventImpl.internal_() : super.internal_();
- get runtimeType => StorageEvent;
- toString() => super.toString();
-}
-patch class FormData {
- static Type get instanceRuntimeType => FormDataImpl;
-
-}
-class FormDataImpl extends FormData implements js_library.JSObjectInterfacesDom {
- FormDataImpl.internal_() : super.internal_();
- get runtimeType => FormData;
- toString() => super.toString();
-}
-patch class PushEvent {
- static Type get instanceRuntimeType => PushEventImpl;
-
-}
-class PushEventImpl extends PushEvent implements js_library.JSObjectInterfacesDom {
- PushEventImpl.internal_() : super.internal_();
- get runtimeType => PushEvent;
- toString() => super.toString();
-}
-patch class CssPageRule {
- static Type get instanceRuntimeType => CssPageRuleImpl;
-
-}
-class CssPageRuleImpl extends CssPageRule implements js_library.JSObjectInterfacesDom {
- CssPageRuleImpl.internal_() : super.internal_();
- get runtimeType => CssPageRule;
- toString() => super.toString();
-}
-patch class PageTransitionEvent {
- static Type get instanceRuntimeType => PageTransitionEventImpl;
-
-}
-class PageTransitionEventImpl extends PageTransitionEvent implements js_library.JSObjectInterfacesDom {
- PageTransitionEventImpl.internal_() : super.internal_();
- get runtimeType => PageTransitionEvent;
- toString() => super.toString();
-}
-patch class MemoryInfo {
- static Type get instanceRuntimeType => MemoryInfoImpl;
-
-}
-class MemoryInfoImpl extends MemoryInfo implements js_library.JSObjectInterfacesDom {
- MemoryInfoImpl.internal_() : super.internal_();
- get runtimeType => MemoryInfo;
- toString() => super.toString();
-}
-patch class ChromiumValuebuffer {
- static Type get instanceRuntimeType => ChromiumValuebufferImpl;
-
-}
-class ChromiumValuebufferImpl extends ChromiumValuebuffer implements js_library.JSObjectInterfacesDom {
- ChromiumValuebufferImpl.internal_() : super.internal_();
- get runtimeType => ChromiumValuebuffer;
- toString() => super.toString();
-}
-patch class KeyframeEffect {
- static Type get instanceRuntimeType => KeyframeEffectImpl;
-
-}
-class KeyframeEffectImpl extends KeyframeEffect implements js_library.JSObjectInterfacesDom {
- KeyframeEffectImpl.internal_() : super.internal_();
- get runtimeType => KeyframeEffect;
- toString() => super.toString();
-}
-patch class XPathEvaluator {
- static Type get instanceRuntimeType => XPathEvaluatorImpl;
-
-}
-class XPathEvaluatorImpl extends XPathEvaluator implements js_library.JSObjectInterfacesDom {
- XPathEvaluatorImpl.internal_() : super.internal_();
- get runtimeType => XPathEvaluator;
- toString() => super.toString();
-}
-patch class ContentElement {
- static Type get instanceRuntimeType => ContentElementImpl;
-
-}
-class ContentElementImpl extends ContentElement implements js_library.JSObjectInterfacesDom {
- ContentElementImpl.internal_() : super.internal_();
- get runtimeType => ContentElement;
- toString() => super.toString();
-}
-patch class CompositionEvent {
- static Type get instanceRuntimeType => CompositionEventImpl;
-
-}
-class CompositionEventImpl extends CompositionEvent implements js_library.JSObjectInterfacesDom {
- CompositionEventImpl.internal_() : super.internal_();
- get runtimeType => CompositionEvent;
- toString() => super.toString();
-}
-patch class FileWriter {
- static Type get instanceRuntimeType => FileWriterImpl;
-
-}
-class FileWriterImpl extends FileWriter implements js_library.JSObjectInterfacesDom {
- FileWriterImpl.internal_() : super.internal_();
- get runtimeType => FileWriter;
- toString() => super.toString();
-}
-patch class SpanElement {
- static Type get instanceRuntimeType => SpanElementImpl;
-
-}
-class SpanElementImpl extends SpanElement implements js_library.JSObjectInterfacesDom {
- SpanElementImpl.internal_() : super.internal_();
- get runtimeType => SpanElement;
- toString() => super.toString();
-}
-patch class _WebKitCSSMatrix {
- static Type get instanceRuntimeType => _WebKitCSSMatrixImpl;
-
-}
-class _WebKitCSSMatrixImpl extends _WebKitCSSMatrix implements js_library.JSObjectInterfacesDom {
- _WebKitCSSMatrixImpl.internal_() : super.internal_();
- get runtimeType => _WebKitCSSMatrix;
- toString() => super.toString();
-}
-patch class WorkerPerformance {
- static Type get instanceRuntimeType => WorkerPerformanceImpl;
-
-}
-class WorkerPerformanceImpl extends WorkerPerformance implements js_library.JSObjectInterfacesDom {
- WorkerPerformanceImpl.internal_() : super.internal_();
- get runtimeType => WorkerPerformance;
- toString() => super.toString();
-}
-patch class TransitionEvent {
- static Type get instanceRuntimeType => TransitionEventImpl;
-
-}
-class TransitionEventImpl extends TransitionEvent implements js_library.JSObjectInterfacesDom {
- TransitionEventImpl.internal_() : super.internal_();
- get runtimeType => TransitionEvent;
- toString() => super.toString();
-}
-patch class GamepadEvent {
- static Type get instanceRuntimeType => GamepadEventImpl;
-
-}
-class GamepadEventImpl extends GamepadEvent implements js_library.JSObjectInterfacesDom {
- GamepadEventImpl.internal_() : super.internal_();
- get runtimeType => GamepadEvent;
- toString() => super.toString();
-}
-patch class _HTMLFontElement {
- static Type get instanceRuntimeType => _HTMLFontElementImpl;
-
-}
-class _HTMLFontElementImpl extends _HTMLFontElement implements js_library.JSObjectInterfacesDom {
- _HTMLFontElementImpl.internal_() : super.internal_();
- get runtimeType => _HTMLFontElement;
- toString() => super.toString();
-}
-patch class _Response {
- static Type get instanceRuntimeType => _ResponseImpl;
-
-}
-class _ResponseImpl extends _Response implements js_library.JSObjectInterfacesDom {
- _ResponseImpl.internal_() : super.internal_();
- get runtimeType => _Response;
- toString() => super.toString();
-}
-patch class _PagePopupController {
- static Type get instanceRuntimeType => _PagePopupControllerImpl;
-
-}
-class _PagePopupControllerImpl extends _PagePopupController implements js_library.JSObjectInterfacesDom {
- _PagePopupControllerImpl.internal_() : super.internal_();
- get runtimeType => _PagePopupController;
- toString() => super.toString();
-}
-patch class AnimationPlayerEvent {
- static Type get instanceRuntimeType => AnimationPlayerEventImpl;
-
-}
-class AnimationPlayerEventImpl extends AnimationPlayerEvent implements js_library.JSObjectInterfacesDom {
- AnimationPlayerEventImpl.internal_() : super.internal_();
- get runtimeType => AnimationPlayerEvent;
- toString() => super.toString();
-}
-patch class DomTokenList {
- static Type get instanceRuntimeType => DomTokenListImpl;
-
-}
-class DomTokenListImpl extends DomTokenList implements js_library.JSObjectInterfacesDom {
- DomTokenListImpl.internal_() : super.internal_();
- get runtimeType => DomTokenList;
- toString() => super.toString();
-}
-patch class _GamepadList {
- static Type get instanceRuntimeType => _GamepadListImpl;
-
-}
-class _GamepadListImpl extends _GamepadList implements js_library.JSObjectInterfacesDom {
- _GamepadListImpl.internal_() : super.internal_();
- get runtimeType => _GamepadList;
- toString() => super.toString();
-}
-patch class PluginArray {
- static Type get instanceRuntimeType => PluginArrayImpl;
-
-}
-class PluginArrayImpl extends PluginArray implements js_library.JSObjectInterfacesDom {
- PluginArrayImpl.internal_() : super.internal_();
- get runtimeType => PluginArray;
- toString() => super.toString();
-}
-patch class DomPoint {
- static Type get instanceRuntimeType => DomPointImpl;
-
-}
-class DomPointImpl extends DomPoint implements js_library.JSObjectInterfacesDom {
- DomPointImpl.internal_() : super.internal_();
- get runtimeType => DomPoint;
- toString() => super.toString();
-}
-patch class FileSystem {
- static Type get instanceRuntimeType => FileSystemImpl;
-
-}
-class FileSystemImpl extends FileSystem implements js_library.JSObjectInterfacesDom {
- FileSystemImpl.internal_() : super.internal_();
- get runtimeType => FileSystem;
- toString() => super.toString();
-}
-patch class NavigatorCpu {
- static Type get instanceRuntimeType => NavigatorCpuImpl;
-
-}
-class NavigatorCpuImpl extends NavigatorCpu implements js_library.JSObjectInterfacesDom {
- NavigatorCpuImpl.internal_() : super.internal_();
- get runtimeType => NavigatorCpu;
- toString() => super.toString();
-}
-patch class VideoTrack {
- static Type get instanceRuntimeType => VideoTrackImpl;
-
-}
-class VideoTrackImpl extends VideoTrack implements js_library.JSObjectInterfacesDom {
- VideoTrackImpl.internal_() : super.internal_();
- get runtimeType => VideoTrack;
- toString() => super.toString();
-}
-patch class QuoteElement {
- static Type get instanceRuntimeType => QuoteElementImpl;
-
-}
-class QuoteElementImpl extends QuoteElement implements js_library.JSObjectInterfacesDom {
- QuoteElementImpl.internal_() : super.internal_();
- get runtimeType => QuoteElement;
- toString() => super.toString();
-}
-patch class LabelElement {
- static Type get instanceRuntimeType => LabelElementImpl;
-
-}
-class LabelElementImpl extends LabelElement implements js_library.JSObjectInterfacesDom {
- LabelElementImpl.internal_() : super.internal_();
- get runtimeType => LabelElement;
- toString() => super.toString();
-}
-patch class TextAreaElement {
- static Type get instanceRuntimeType => TextAreaElementImpl;
-
-}
-class TextAreaElementImpl extends TextAreaElement implements js_library.JSObjectInterfacesDom {
- TextAreaElementImpl.internal_() : super.internal_();
- get runtimeType => TextAreaElement;
- toString() => super.toString();
-}
-patch class TextMetrics {
- static Type get instanceRuntimeType => TextMetricsImpl;
-
-}
-class TextMetricsImpl extends TextMetrics implements js_library.JSObjectInterfacesDom {
- TextMetricsImpl.internal_() : super.internal_();
- get runtimeType => TextMetrics;
- toString() => super.toString();
-}
-patch class Selection {
- static Type get instanceRuntimeType => SelectionImpl;
-
-}
-class SelectionImpl extends Selection implements js_library.JSObjectInterfacesDom {
- SelectionImpl.internal_() : super.internal_();
- get runtimeType => Selection;
- toString() => super.toString();
-}
-patch class NodeIterator {
- static Type get instanceRuntimeType => NodeIteratorImpl;
-
-}
-class NodeIteratorImpl extends NodeIterator implements js_library.JSObjectInterfacesDom {
- NodeIteratorImpl.internal_() : super.internal_();
- get runtimeType => NodeIterator;
- toString() => super.toString();
-}
-patch class _HTMLDirectoryElement {
- static Type get instanceRuntimeType => _HTMLDirectoryElementImpl;
-
-}
-class _HTMLDirectoryElementImpl extends _HTMLDirectoryElement implements js_library.JSObjectInterfacesDom {
- _HTMLDirectoryElementImpl.internal_() : super.internal_();
- get runtimeType => _HTMLDirectoryElement;
- toString() => super.toString();
-}
-patch class AreaElement {
- static Type get instanceRuntimeType => AreaElementImpl;
-
-}
-class AreaElementImpl extends AreaElement implements js_library.JSObjectInterfacesDom {
- AreaElementImpl.internal_() : super.internal_();
- get runtimeType => AreaElement;
- toString() => super.toString();
-}
-patch class Notification {
- static Type get instanceRuntimeType => NotificationImpl;
-
-}
-class NotificationImpl extends Notification implements js_library.JSObjectInterfacesDom {
- NotificationImpl.internal_() : super.internal_();
- get runtimeType => Notification;
- toString() => super.toString();
-}
-patch class TableCellElement {
- static Type get instanceRuntimeType => TableCellElementImpl;
-
-}
-class TableCellElementImpl extends TableCellElement implements js_library.JSObjectInterfacesDom {
- TableCellElementImpl.internal_() : super.internal_();
- get runtimeType => TableCellElement;
- toString() => super.toString();
-}
-patch class DomStringMap {
- static Type get instanceRuntimeType => DomStringMapImpl;
-
-}
-class DomStringMapImpl extends DomStringMap implements js_library.JSObjectInterfacesDom {
- DomStringMapImpl.internal_() : super.internal_();
- get runtimeType => DomStringMap;
- toString() => super.toString();
-}
-patch class Entry {
- static Type get instanceRuntimeType => EntryImpl;
-
-}
-class EntryImpl extends Entry implements js_library.JSObjectInterfacesDom {
- EntryImpl.internal_() : super.internal_();
- get runtimeType => Entry;
- toString() => super.toString();
-}
-patch class PeriodicSyncManager {
- static Type get instanceRuntimeType => PeriodicSyncManagerImpl;
-
-}
-class PeriodicSyncManagerImpl extends PeriodicSyncManager implements js_library.JSObjectInterfacesDom {
- PeriodicSyncManagerImpl.internal_() : super.internal_();
- get runtimeType => PeriodicSyncManager;
- toString() => super.toString();
-}
-patch class RtcIceCandidate {
- static Type get instanceRuntimeType => RtcIceCandidateImpl;
-
-}
-class RtcIceCandidateImpl extends RtcIceCandidate implements js_library.JSObjectInterfacesDom {
- RtcIceCandidateImpl.internal_() : super.internal_();
- get runtimeType => RtcIceCandidate;
- toString() => super.toString();
-}
-patch class SpeechRecognitionResult {
- static Type get instanceRuntimeType => SpeechRecognitionResultImpl;
-
-}
-class SpeechRecognitionResultImpl extends SpeechRecognitionResult implements js_library.JSObjectInterfacesDom {
- SpeechRecognitionResultImpl.internal_() : super.internal_();
- get runtimeType => SpeechRecognitionResult;
- toString() => super.toString();
-}
-patch class TextTrackList {
- static Type get instanceRuntimeType => TextTrackListImpl;
-
-}
-class TextTrackListImpl extends TextTrackList implements js_library.JSObjectInterfacesDom {
- TextTrackListImpl.internal_() : super.internal_();
- get runtimeType => TextTrackList;
- toString() => super.toString();
-}
-patch class _ServiceWorker {
- static Type get instanceRuntimeType => _ServiceWorkerImpl;
-
-}
-class _ServiceWorkerImpl extends _ServiceWorker implements js_library.JSObjectInterfacesDom {
- _ServiceWorkerImpl.internal_() : super.internal_();
- get runtimeType => _ServiceWorker;
- toString() => super.toString();
-}
-patch class SharedWorker {
- static Type get instanceRuntimeType => SharedWorkerImpl;
-
-}
-class SharedWorkerImpl extends SharedWorker implements js_library.JSObjectInterfacesDom {
- SharedWorkerImpl.internal_() : super.internal_();
- get runtimeType => SharedWorker;
- toString() => super.toString();
-}
-patch class EventTarget {
- static Type get instanceRuntimeType => EventTargetImpl;
-
-}
-class EventTargetImpl extends EventTarget implements js_library.JSObjectInterfacesDom {
- EventTargetImpl.internal_() : super.internal_();
- get runtimeType => EventTarget;
- toString() => super.toString();
-}
-patch class HtmlFormControlsCollection {
- static Type get instanceRuntimeType => HtmlFormControlsCollectionImpl;
-
-}
-class HtmlFormControlsCollectionImpl extends HtmlFormControlsCollection implements js_library.JSObjectInterfacesDom {
- HtmlFormControlsCollectionImpl.internal_() : super.internal_();
- get runtimeType => HtmlFormControlsCollection;
- toString() => super.toString();
-}
-patch class KeyboardEvent {
- static Type get instanceRuntimeType => KeyboardEventImpl;
-
-}
-class KeyboardEventImpl extends KeyboardEvent implements js_library.JSObjectInterfacesDom {
- KeyboardEventImpl.internal_() : super.internal_();
- get runtimeType => KeyboardEvent;
- toString() => super.toString();
-}
-patch class MidiMessageEvent {
- static Type get instanceRuntimeType => MidiMessageEventImpl;
-
-}
-class MidiMessageEventImpl extends MidiMessageEvent implements js_library.JSObjectInterfacesDom {
- MidiMessageEventImpl.internal_() : super.internal_();
- get runtimeType => MidiMessageEvent;
- toString() => super.toString();
-}
-patch class CacheStorage {
- static Type get instanceRuntimeType => CacheStorageImpl;
-
-}
-class CacheStorageImpl extends CacheStorage implements js_library.JSObjectInterfacesDom {
- CacheStorageImpl.internal_() : super.internal_();
- get runtimeType => CacheStorage;
- toString() => super.toString();
-}
-patch class CanvasElement {
- static Type get instanceRuntimeType => CanvasElementImpl;
-
-}
-class CanvasElementImpl extends CanvasElement implements js_library.JSObjectInterfacesDom {
- CanvasElementImpl.internal_() : super.internal_();
- get runtimeType => CanvasElement;
- toString() => super.toString();
-}
-patch class BatteryManager {
- static Type get instanceRuntimeType => BatteryManagerImpl;
-
-}
-class BatteryManagerImpl extends BatteryManager implements js_library.JSObjectInterfacesDom {
- BatteryManagerImpl.internal_() : super.internal_();
- get runtimeType => BatteryManager;
- toString() => super.toString();
-}
-patch class _StyleSheetList {
- static Type get instanceRuntimeType => _StyleSheetListImpl;
-
-}
-class _StyleSheetListImpl extends _StyleSheetList implements js_library.JSObjectInterfacesDom {
- _StyleSheetListImpl.internal_() : super.internal_();
- get runtimeType => _StyleSheetList;
- toString() => super.toString();
-}
-patch class Path2D {
- static Type get instanceRuntimeType => Path2DImpl;
-
-}
-class Path2DImpl extends Path2D implements js_library.JSObjectInterfacesDom {
- Path2DImpl.internal_() : super.internal_();
- get runtimeType => Path2D;
- toString() => super.toString();
-}
-patch class DeviceRotationRate {
- static Type get instanceRuntimeType => DeviceRotationRateImpl;
-
-}
-class DeviceRotationRateImpl extends DeviceRotationRate implements js_library.JSObjectInterfacesDom {
- DeviceRotationRateImpl.internal_() : super.internal_();
- get runtimeType => DeviceRotationRate;
- toString() => super.toString();
-}
-patch class Screen {
- static Type get instanceRuntimeType => ScreenImpl;
-
-}
-class ScreenImpl extends Screen implements js_library.JSObjectInterfacesDom {
- ScreenImpl.internal_() : super.internal_();
- get runtimeType => Screen;
- toString() => super.toString();
-}
-patch class StorageInfo {
- static Type get instanceRuntimeType => StorageInfoImpl;
-
-}
-class StorageInfoImpl extends StorageInfo implements js_library.JSObjectInterfacesDom {
- StorageInfoImpl.internal_() : super.internal_();
- get runtimeType => StorageInfo;
- toString() => super.toString();
-}
-patch class TableColElement {
- static Type get instanceRuntimeType => TableColElementImpl;
-
-}
-class TableColElementImpl extends TableColElement implements js_library.JSObjectInterfacesDom {
- TableColElementImpl.internal_() : super.internal_();
- get runtimeType => TableColElement;
- toString() => super.toString();
-}
-patch class CssStyleDeclaration {
- static Type get instanceRuntimeType => CssStyleDeclarationImpl;
-
-}
-class CssStyleDeclarationImpl extends CssStyleDeclaration implements js_library.JSObjectInterfacesDom {
- CssStyleDeclarationImpl.internal_() : super.internal_();
- get runtimeType => CssStyleDeclaration;
- toString() => super.toString();
-}
-patch class DomStringList {
- static Type get instanceRuntimeType => DomStringListImpl;
-
-}
-class DomStringListImpl extends DomStringList implements js_library.JSObjectInterfacesDom {
- DomStringListImpl.internal_() : super.internal_();
- get runtimeType => DomStringList;
- toString() => super.toString();
-}
-patch class StashedPortCollection {
- static Type get instanceRuntimeType => StashedPortCollectionImpl;
-
-}
-class StashedPortCollectionImpl extends StashedPortCollection implements js_library.JSObjectInterfacesDom {
- StashedPortCollectionImpl.internal_() : super.internal_();
- get runtimeType => StashedPortCollection;
- toString() => super.toString();
-}
-patch class SyncManager {
- static Type get instanceRuntimeType => SyncManagerImpl;
-
-}
-class SyncManagerImpl extends SyncManager implements js_library.JSObjectInterfacesDom {
- SyncManagerImpl.internal_() : super.internal_();
- get runtimeType => SyncManager;
- toString() => super.toString();
-}
-patch class HttpRequestUpload {
- static Type get instanceRuntimeType => HttpRequestUploadImpl;
-
-}
-class HttpRequestUploadImpl extends HttpRequestUpload implements js_library.JSObjectInterfacesDom {
- HttpRequestUploadImpl.internal_() : super.internal_();
- get runtimeType => HttpRequestUpload;
- toString() => super.toString();
-}
-patch class ReadableStreamReader {
- static Type get instanceRuntimeType => ReadableStreamReaderImpl;
-
-}
-class ReadableStreamReaderImpl extends ReadableStreamReader implements js_library.JSObjectInterfacesDom {
- ReadableStreamReaderImpl.internal_() : super.internal_();
- get runtimeType => ReadableStreamReader;
- toString() => super.toString();
-}
-patch class MediaKeySession {
- static Type get instanceRuntimeType => MediaKeySessionImpl;
-
-}
-class MediaKeySessionImpl extends MediaKeySession implements js_library.JSObjectInterfacesDom {
- MediaKeySessionImpl.internal_() : super.internal_();
- get runtimeType => MediaKeySession;
- toString() => super.toString();
-}
-patch class Gamepad {
- static Type get instanceRuntimeType => GamepadImpl;
-
-}
-class GamepadImpl extends Gamepad implements js_library.JSObjectInterfacesDom {
- GamepadImpl.internal_() : super.internal_();
- get runtimeType => Gamepad;
- toString() => super.toString();
-}
-patch class Worker {
- static Type get instanceRuntimeType => WorkerImpl;
-
-}
-class WorkerImpl extends Worker implements js_library.JSObjectInterfacesDom {
- WorkerImpl.internal_() : super.internal_();
- get runtimeType => Worker;
- toString() => super.toString();
-}
-patch class DefaultSessionStartEvent {
- static Type get instanceRuntimeType => DefaultSessionStartEventImpl;
-
-}
-class DefaultSessionStartEventImpl extends DefaultSessionStartEvent implements js_library.JSObjectInterfacesDom {
- DefaultSessionStartEventImpl.internal_() : super.internal_();
- get runtimeType => DefaultSessionStartEvent;
- toString() => super.toString();
-}
-patch class DListElement {
- static Type get instanceRuntimeType => DListElementImpl;
-
-}
-class DListElementImpl extends DListElement implements js_library.JSObjectInterfacesDom {
- DListElementImpl.internal_() : super.internal_();
- get runtimeType => DListElement;
- toString() => super.toString();
-}
-patch class FileError {
- static Type get instanceRuntimeType => FileErrorImpl;
-
-}
-class FileErrorImpl extends FileError implements js_library.JSObjectInterfacesDom {
- FileErrorImpl.internal_() : super.internal_();
- get runtimeType => FileError;
- toString() => super.toString();
-}
-patch class HeadElement {
- static Type get instanceRuntimeType => HeadElementImpl;
-
-}
-class HeadElementImpl extends HeadElement implements js_library.JSObjectInterfacesDom {
- HeadElementImpl.internal_() : super.internal_();
- get runtimeType => HeadElement;
- toString() => super.toString();
-}
-patch class BluetoothGattCharacteristic {
- static Type get instanceRuntimeType => BluetoothGattCharacteristicImpl;
-
-}
-class BluetoothGattCharacteristicImpl extends BluetoothGattCharacteristic implements js_library.JSObjectInterfacesDom {
- BluetoothGattCharacteristicImpl.internal_() : super.internal_();
- get runtimeType => BluetoothGattCharacteristic;
- toString() => super.toString();
-}
-patch class DomSettableTokenList {
- static Type get instanceRuntimeType => DomSettableTokenListImpl;
-
-}
-class DomSettableTokenListImpl extends DomSettableTokenList implements js_library.JSObjectInterfacesDom {
- DomSettableTokenListImpl.internal_() : super.internal_();
- get runtimeType => DomSettableTokenList;
- toString() => super.toString();
-}
-patch class _WorkerLocation {
- static Type get instanceRuntimeType => _WorkerLocationImpl;
-
-}
-class _WorkerLocationImpl extends _WorkerLocation implements js_library.JSObjectInterfacesDom {
- _WorkerLocationImpl.internal_() : super.internal_();
- get runtimeType => _WorkerLocation;
- toString() => super.toString();
-}
-patch class TouchList {
- static Type get instanceRuntimeType => TouchListImpl;
-
-}
-class TouchListImpl extends TouchList implements js_library.JSObjectInterfacesDom {
- TouchListImpl.internal_() : super.internal_();
- get runtimeType => TouchList;
- toString() => super.toString();
-}
-patch class MetaElement {
- static Type get instanceRuntimeType => MetaElementImpl;
-
-}
-class MetaElementImpl extends MetaElement implements js_library.JSObjectInterfacesDom {
- MetaElementImpl.internal_() : super.internal_();
- get runtimeType => MetaElement;
- toString() => super.toString();
-}
-patch class TrackElement {
- static Type get instanceRuntimeType => TrackElementImpl;
-
-}
-class TrackElementImpl extends TrackElement implements js_library.JSObjectInterfacesDom {
- TrackElementImpl.internal_() : super.internal_();
- get runtimeType => TrackElement;
- toString() => super.toString();
-}
-patch class WheelEvent {
- static Type get instanceRuntimeType => WheelEventImpl;
-
-}
-class WheelEventImpl extends WheelEvent implements js_library.JSObjectInterfacesDom {
- WheelEventImpl.internal_() : super.internal_();
- get runtimeType => WheelEvent;
- toString() => super.toString();
-}
-patch class DomMatrixReadOnly {
- static Type get instanceRuntimeType => DomMatrixReadOnlyImpl;
-
-}
-class DomMatrixReadOnlyImpl extends DomMatrixReadOnly implements js_library.JSObjectInterfacesDom {
- DomMatrixReadOnlyImpl.internal_() : super.internal_();
- get runtimeType => DomMatrixReadOnly;
- toString() => super.toString();
-}
-patch class FormElement {
- static Type get instanceRuntimeType => FormElementImpl;
-
-}
-class FormElementImpl extends FormElement implements js_library.JSObjectInterfacesDom {
- FormElementImpl.internal_() : super.internal_();
- get runtimeType => FormElement;
- toString() => super.toString();
-}
-patch class _SpeechRecognitionResultList {
- static Type get instanceRuntimeType => _SpeechRecognitionResultListImpl;
-
-}
-class _SpeechRecognitionResultListImpl extends _SpeechRecognitionResultList implements js_library.JSObjectInterfacesDom {
- _SpeechRecognitionResultListImpl.internal_() : super.internal_();
- get runtimeType => _SpeechRecognitionResultList;
- toString() => super.toString();
-}
-patch class CompositorWorkerGlobalScope {
- static Type get instanceRuntimeType => CompositorWorkerGlobalScopeImpl;
-
-}
-class CompositorWorkerGlobalScopeImpl extends CompositorWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
- CompositorWorkerGlobalScopeImpl.internal_() : super.internal_();
- get runtimeType => CompositorWorkerGlobalScope;
- toString() => super.toString();
-}
-patch class PresentationAvailability {
- static Type get instanceRuntimeType => PresentationAvailabilityImpl;
-
-}
-class PresentationAvailabilityImpl extends PresentationAvailability implements js_library.JSObjectInterfacesDom {
- PresentationAvailabilityImpl.internal_() : super.internal_();
- get runtimeType => PresentationAvailability;
- toString() => super.toString();
-}
-patch class FontFaceSet {
- static Type get instanceRuntimeType => FontFaceSetImpl;
-
-}
-class FontFaceSetImpl extends FontFaceSet implements js_library.JSObjectInterfacesDom {
- FontFaceSetImpl.internal_() : super.internal_();
- get runtimeType => FontFaceSet;
- toString() => super.toString();
-}
-patch class _SubtleCrypto {
- static Type get instanceRuntimeType => _SubtleCryptoImpl;
-
-}
-class _SubtleCryptoImpl extends _SubtleCrypto implements js_library.JSObjectInterfacesDom {
- _SubtleCryptoImpl.internal_() : super.internal_();
- get runtimeType => _SubtleCrypto;
- toString() => super.toString();
-}
-patch class ButtonElement {
- static Type get instanceRuntimeType => ButtonElementImpl;
-
-}
-class ButtonElementImpl extends ButtonElement implements js_library.JSObjectInterfacesDom {
- ButtonElementImpl.internal_() : super.internal_();
- get runtimeType => ButtonElement;
- toString() => super.toString();
-}
-patch class ProcessingInstruction {
- static Type get instanceRuntimeType => ProcessingInstructionImpl;
-
-}
-class ProcessingInstructionImpl extends ProcessingInstruction implements js_library.JSObjectInterfacesDom {
- ProcessingInstructionImpl.internal_() : super.internal_();
- get runtimeType => ProcessingInstruction;
- toString() => super.toString();
-}
-patch class StashedMessagePort {
- static Type get instanceRuntimeType => StashedMessagePortImpl;
-
-}
-class StashedMessagePortImpl extends StashedMessagePort implements js_library.JSObjectInterfacesDom {
- StashedMessagePortImpl.internal_() : super.internal_();
- get runtimeType => StashedMessagePort;
- toString() => super.toString();
-}
-patch class DeviceAcceleration {
- static Type get instanceRuntimeType => DeviceAccelerationImpl;
-
-}
-class DeviceAccelerationImpl extends DeviceAcceleration implements js_library.JSObjectInterfacesDom {
- DeviceAccelerationImpl.internal_() : super.internal_();
- get runtimeType => DeviceAcceleration;
- toString() => super.toString();
-}
-patch class MapElement {
- static Type get instanceRuntimeType => MapElementImpl;
-
-}
-class MapElementImpl extends MapElement implements js_library.JSObjectInterfacesDom {
- MapElementImpl.internal_() : super.internal_();
- get runtimeType => MapElement;
- toString() => super.toString();
-}
-patch class PresentationSession {
- static Type get instanceRuntimeType => PresentationSessionImpl;
-
-}
-class PresentationSessionImpl extends PresentationSession implements js_library.JSObjectInterfacesDom {
- PresentationSessionImpl.internal_() : super.internal_();
- get runtimeType => PresentationSession;
- toString() => super.toString();
-}
-patch class RtcDtmfToneChangeEvent {
- static Type get instanceRuntimeType => RtcDtmfToneChangeEventImpl;
-
-}
-class RtcDtmfToneChangeEventImpl extends RtcDtmfToneChangeEvent implements js_library.JSObjectInterfacesDom {
- RtcDtmfToneChangeEventImpl.internal_() : super.internal_();
- get runtimeType => RtcDtmfToneChangeEvent;
- toString() => super.toString();
-}
-patch class PerformanceCompositeTiming {
- static Type get instanceRuntimeType => PerformanceCompositeTimingImpl;
-
-}
-class PerformanceCompositeTimingImpl extends PerformanceCompositeTiming implements js_library.JSObjectInterfacesDom {
- PerformanceCompositeTimingImpl.internal_() : super.internal_();
- get runtimeType => PerformanceCompositeTiming;
- toString() => super.toString();
-}
-patch class NodeFilter {
- static Type get instanceRuntimeType => NodeFilterImpl;
-
-}
-class NodeFilterImpl extends NodeFilter implements js_library.JSObjectInterfacesDom {
- NodeFilterImpl.internal_() : super.internal_();
- get runtimeType => NodeFilter;
- toString() => super.toString();
-}
-patch class _DomRect {
- static Type get instanceRuntimeType => _DomRectImpl;
-
-}
-class _DomRectImpl extends _DomRect implements js_library.JSObjectInterfacesDom {
- _DomRectImpl.internal_() : super.internal_();
- get runtimeType => _DomRect;
- toString() => super.toString();
-}
-patch class PermissionStatus {
- static Type get instanceRuntimeType => PermissionStatusImpl;
-
-}
-class PermissionStatusImpl extends PermissionStatus implements js_library.JSObjectInterfacesDom {
- PermissionStatusImpl.internal_() : super.internal_();
- get runtimeType => PermissionStatus;
- toString() => super.toString();
-}
-patch class DeviceMotionEvent {
- static Type get instanceRuntimeType => DeviceMotionEventImpl;
-
-}
-class DeviceMotionEventImpl extends DeviceMotionEvent implements js_library.JSObjectInterfacesDom {
- DeviceMotionEventImpl.internal_() : super.internal_();
- get runtimeType => DeviceMotionEvent;
- toString() => super.toString();
-}
-patch class Comment {
- static Type get instanceRuntimeType => CommentImpl;
-
-}
-class CommentImpl extends Comment implements js_library.JSObjectInterfacesDom {
- CommentImpl.internal_() : super.internal_();
- get runtimeType => Comment;
- toString() => super.toString();
-}
-patch class CanvasPattern {
- static Type get instanceRuntimeType => CanvasPatternImpl;
-
-}
-class CanvasPatternImpl extends CanvasPattern implements js_library.JSObjectInterfacesDom {
- CanvasPatternImpl.internal_() : super.internal_();
- get runtimeType => CanvasPattern;
- toString() => super.toString();
-}
-patch class CompositorProxy {
- static Type get instanceRuntimeType => CompositorProxyImpl;
-
-}
-class CompositorProxyImpl extends CompositorProxy implements js_library.JSObjectInterfacesDom {
- CompositorProxyImpl.internal_() : super.internal_();
- get runtimeType => CompositorProxy;
- toString() => super.toString();
-}
-patch class MediaKeyError {
- static Type get instanceRuntimeType => MediaKeyErrorImpl;
-
-}
-class MediaKeyErrorImpl extends MediaKeyError implements js_library.JSObjectInterfacesDom {
- MediaKeyErrorImpl.internal_() : super.internal_();
- get runtimeType => MediaKeyError;
- toString() => super.toString();
-}
-patch class CssRule {
- static Type get instanceRuntimeType => CssRuleImpl;
-
-}
-class CssRuleImpl extends CssRule implements js_library.JSObjectInterfacesDom {
- CssRuleImpl.internal_() : super.internal_();
- get runtimeType => CssRule;
- toString() => super.toString();
-}
-patch class SpeechRecognitionAlternative {
- static Type get instanceRuntimeType => SpeechRecognitionAlternativeImpl;
-
-}
-class SpeechRecognitionAlternativeImpl extends SpeechRecognitionAlternative implements js_library.JSObjectInterfacesDom {
- SpeechRecognitionAlternativeImpl.internal_() : super.internal_();
- get runtimeType => SpeechRecognitionAlternative;
- toString() => super.toString();
-}
-patch class XPathExpression {
- static Type get instanceRuntimeType => XPathExpressionImpl;
-
-}
-class XPathExpressionImpl extends XPathExpression implements js_library.JSObjectInterfacesDom {
- XPathExpressionImpl.internal_() : super.internal_();
- get runtimeType => XPathExpression;
- toString() => super.toString();
-}
-patch class Permissions {
- static Type get instanceRuntimeType => PermissionsImpl;
-
-}
-class PermissionsImpl extends Permissions implements js_library.JSObjectInterfacesDom {
- PermissionsImpl.internal_() : super.internal_();
- get runtimeType => Permissions;
- toString() => super.toString();
-}
-patch class PerformanceNavigation {
- static Type get instanceRuntimeType => PerformanceNavigationImpl;
-
-}
-class PerformanceNavigationImpl extends PerformanceNavigation implements js_library.JSObjectInterfacesDom {
- PerformanceNavigationImpl.internal_() : super.internal_();
- get runtimeType => PerformanceNavigation;
- toString() => super.toString();
-}
-patch class SecurityPolicyViolationEvent {
- static Type get instanceRuntimeType => SecurityPolicyViolationEventImpl;
-
-}
-class SecurityPolicyViolationEventImpl extends SecurityPolicyViolationEvent implements js_library.JSObjectInterfacesDom {
- SecurityPolicyViolationEventImpl.internal_() : super.internal_();
- get runtimeType => SecurityPolicyViolationEvent;
- toString() => super.toString();
-}
-patch class TableElement {
- static Type get instanceRuntimeType => TableElementImpl;
-
-}
-class TableElementImpl extends TableElement implements js_library.JSObjectInterfacesDom {
- TableElementImpl.internal_() : super.internal_();
- get runtimeType => TableElement;
- toString() => super.toString();
-}
-patch class NavigatorID {
- static Type get instanceRuntimeType => NavigatorIDImpl;
-
-}
-class NavigatorIDImpl extends NavigatorID implements js_library.JSObjectInterfacesDom {
- NavigatorIDImpl.internal_() : super.internal_();
- get runtimeType => NavigatorID;
- toString() => super.toString();
-}
-patch class ServicePort {
- static Type get instanceRuntimeType => ServicePortImpl;
-
-}
-class ServicePortImpl extends ServicePort implements js_library.JSObjectInterfacesDom {
- ServicePortImpl.internal_() : super.internal_();
- get runtimeType => ServicePort;
- toString() => super.toString();
-}
-patch class TextTrackCue {
- static Type get instanceRuntimeType => TextTrackCueImpl;
-
-}
-class TextTrackCueImpl extends TextTrackCue implements js_library.JSObjectInterfacesDom {
- TextTrackCueImpl.internal_() : super.internal_();
- get runtimeType => TextTrackCue;
- toString() => super.toString();
-}
-patch class FileEntry {
- static Type get instanceRuntimeType => FileEntryImpl;
-
-}
-class FileEntryImpl extends FileEntry implements js_library.JSObjectInterfacesDom {
- FileEntryImpl.internal_() : super.internal_();
- get runtimeType => FileEntry;
- toString() => super.toString();
-}
-patch class _DOMFileSystemSync {
- static Type get instanceRuntimeType => _DOMFileSystemSyncImpl;
-
-}
-class _DOMFileSystemSyncImpl extends _DOMFileSystemSync implements js_library.JSObjectInterfacesDom {
- _DOMFileSystemSyncImpl.internal_() : super.internal_();
- get runtimeType => _DOMFileSystemSync;
- toString() => super.toString();
-}
-patch class Animation {
- static Type get instanceRuntimeType => AnimationImpl;
-
-}
-class AnimationImpl extends Animation implements js_library.JSObjectInterfacesDom {
- AnimationImpl.internal_() : super.internal_();
- get runtimeType => Animation;
- toString() => super.toString();
-}
-patch class Navigator {
- static Type get instanceRuntimeType => NavigatorImpl;
-
-}
-class NavigatorImpl extends Navigator implements js_library.JSObjectInterfacesDom {
- NavigatorImpl.internal_() : super.internal_();
- get runtimeType => Navigator;
- toString() => super.toString();
-}
-patch class MediaQueryList {
- static Type get instanceRuntimeType => MediaQueryListImpl;
-
-}
-class MediaQueryListImpl extends MediaQueryList implements js_library.JSObjectInterfacesDom {
- MediaQueryListImpl.internal_() : super.internal_();
- get runtimeType => MediaQueryList;
- toString() => super.toString();
-}
-patch class CssImportRule {
- static Type get instanceRuntimeType => CssImportRuleImpl;
-
-}
-class CssImportRuleImpl extends CssImportRule implements js_library.JSObjectInterfacesDom {
- CssImportRuleImpl.internal_() : super.internal_();
- get runtimeType => CssImportRule;
- toString() => super.toString();
-}
-patch class StorageQuota {
- static Type get instanceRuntimeType => StorageQuotaImpl;
-
-}
-class StorageQuotaImpl extends StorageQuota implements js_library.JSObjectInterfacesDom {
- StorageQuotaImpl.internal_() : super.internal_();
- get runtimeType => StorageQuota;
- toString() => super.toString();
-}
-patch class MediaQueryListEvent {
- static Type get instanceRuntimeType => MediaQueryListEventImpl;
-
-}
-class MediaQueryListEventImpl extends MediaQueryListEvent implements js_library.JSObjectInterfacesDom {
- MediaQueryListEventImpl.internal_() : super.internal_();
- get runtimeType => MediaQueryListEvent;
- toString() => super.toString();
-}
-patch class BluetoothGattRemoteServer {
- static Type get instanceRuntimeType => BluetoothGattRemoteServerImpl;
-
-}
-class BluetoothGattRemoteServerImpl extends BluetoothGattRemoteServer implements js_library.JSObjectInterfacesDom {
- BluetoothGattRemoteServerImpl.internal_() : super.internal_();
- get runtimeType => BluetoothGattRemoteServer;
- toString() => super.toString();
-}
-patch class FileList {
- static Type get instanceRuntimeType => FileListImpl;
-
-}
-class FileListImpl extends FileList implements js_library.JSObjectInterfacesDom {
- FileListImpl.internal_() : super.internal_();
- get runtimeType => FileList;
- toString() => super.toString();
-}
-patch class WindowClient {
- static Type get instanceRuntimeType => WindowClientImpl;
-
-}
-class WindowClientImpl extends WindowClient implements js_library.JSObjectInterfacesDom {
- WindowClientImpl.internal_() : super.internal_();
- get runtimeType => WindowClient;
- toString() => super.toString();
-}
-patch class ReadableStream {
- static Type get instanceRuntimeType => ReadableStreamImpl;
-
-}
-class ReadableStreamImpl extends ReadableStream implements js_library.JSObjectInterfacesDom {
- ReadableStreamImpl.internal_() : super.internal_();
- get runtimeType => ReadableStream;
- toString() => super.toString();
-}
-patch class Node {
- static Type get instanceRuntimeType => NodeImpl;
-
-}
-class NodeImpl extends Node implements js_library.JSObjectInterfacesDom {
- NodeImpl.internal_() : super.internal_();
- get runtimeType => Node;
- toString() => super.toString();
-}
-patch class DedicatedWorkerGlobalScope {
- static Type get instanceRuntimeType => DedicatedWorkerGlobalScopeImpl;
-
-}
-class DedicatedWorkerGlobalScopeImpl extends DedicatedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
- DedicatedWorkerGlobalScopeImpl.internal_() : super.internal_();
- get runtimeType => DedicatedWorkerGlobalScope;
- toString() => super.toString();
-}
-patch class AudioTrackList {
- static Type get instanceRuntimeType => AudioTrackListImpl;
-
-}
-class AudioTrackListImpl extends AudioTrackList implements js_library.JSObjectInterfacesDom {
- AudioTrackListImpl.internal_() : super.internal_();
- get runtimeType => AudioTrackList;
- toString() => super.toString();
-}
-patch class StyleMedia {
- static Type get instanceRuntimeType => StyleMediaImpl;
-
-}
-class StyleMediaImpl extends StyleMedia implements js_library.JSObjectInterfacesDom {
- StyleMediaImpl.internal_() : super.internal_();
- get runtimeType => StyleMedia;
- toString() => super.toString();
-}
-patch class WindowEventHandlers {
- static Type get instanceRuntimeType => WindowEventHandlersImpl;
-
-}
-class WindowEventHandlersImpl extends WindowEventHandlers implements js_library.JSObjectInterfacesDom {
- WindowEventHandlersImpl.internal_() : super.internal_();
- get runtimeType => WindowEventHandlers;
- toString() => super.toString();
-}
-patch class SourceInfo {
- static Type get instanceRuntimeType => SourceInfoImpl;
-
-}
-class SourceInfoImpl extends SourceInfo implements js_library.JSObjectInterfacesDom {
- SourceInfoImpl.internal_() : super.internal_();
- get runtimeType => SourceInfo;
- toString() => super.toString();
-}
-patch class _DirectoryEntrySync {
- static Type get instanceRuntimeType => _DirectoryEntrySyncImpl;
-
-}
-class _DirectoryEntrySyncImpl extends _DirectoryEntrySync implements js_library.JSObjectInterfacesDom {
- _DirectoryEntrySyncImpl.internal_() : super.internal_();
- get runtimeType => _DirectoryEntrySync;
- toString() => super.toString();
-}
-patch class AnimationEvent {
- static Type get instanceRuntimeType => AnimationEventImpl;
-
-}
-class AnimationEventImpl extends AnimationEvent implements js_library.JSObjectInterfacesDom {
- AnimationEventImpl.internal_() : super.internal_();
- get runtimeType => AnimationEvent;
- toString() => super.toString();
-}
-patch class PluginPlaceholderElement {
- static Type get instanceRuntimeType => PluginPlaceholderElementImpl;
-
-}
-class PluginPlaceholderElementImpl extends PluginPlaceholderElement implements js_library.JSObjectInterfacesDom {
- PluginPlaceholderElementImpl.internal_() : super.internal_();
- get runtimeType => PluginPlaceholderElement;
- toString() => super.toString();
-}
-patch class _MutationEvent {
- static Type get instanceRuntimeType => _MutationEventImpl;
-
-}
-class _MutationEventImpl extends _MutationEvent implements js_library.JSObjectInterfacesDom {
- _MutationEventImpl.internal_() : super.internal_();
- get runtimeType => _MutationEvent;
- toString() => super.toString();
-}
-patch class LinkElement {
- static Type get instanceRuntimeType => LinkElementImpl;
-
-}
-class LinkElementImpl extends LinkElement implements js_library.JSObjectInterfacesDom {
- LinkElementImpl.internal_() : super.internal_();
- get runtimeType => LinkElement;
- toString() => super.toString();
-}
-patch class TextTrackCueList {
- static Type get instanceRuntimeType => TextTrackCueListImpl;
-
-}
-class TextTrackCueListImpl extends TextTrackCueList implements js_library.JSObjectInterfacesDom {
- TextTrackCueListImpl.internal_() : super.internal_();
- get runtimeType => TextTrackCueList;
- toString() => super.toString();
-}
-patch class VideoPlaybackQuality {
- static Type get instanceRuntimeType => VideoPlaybackQualityImpl;
-
-}
-class VideoPlaybackQualityImpl extends VideoPlaybackQuality implements js_library.JSObjectInterfacesDom {
- VideoPlaybackQualityImpl.internal_() : super.internal_();
- get runtimeType => VideoPlaybackQuality;
- toString() => super.toString();
-}
-patch class IFrameElement {
- static Type get instanceRuntimeType => IFrameElementImpl;
-
-}
-class IFrameElementImpl extends IFrameElement implements js_library.JSObjectInterfacesDom {
- IFrameElementImpl.internal_() : super.internal_();
- get runtimeType => IFrameElement;
- toString() => super.toString();
-}
-patch class FontFace {
- static Type get instanceRuntimeType => FontFaceImpl;
-
-}
-class FontFaceImpl extends FontFace implements js_library.JSObjectInterfacesDom {
- FontFaceImpl.internal_() : super.internal_();
- get runtimeType => FontFace;
- toString() => super.toString();
-}
patch class AnchorElement {
static Type get instanceRuntimeType => AnchorElementImpl;
@@ -2319,283 +33,22 @@
get runtimeType => AnchorElement;
toString() => super.toString();
}
-patch class XsltProcessor {
- static Type get instanceRuntimeType => XsltProcessorImpl;
+patch class Animation {
+ static Type get instanceRuntimeType => AnimationImpl;
}
-class XsltProcessorImpl extends XsltProcessor implements js_library.JSObjectInterfacesDom {
- XsltProcessorImpl.internal_() : super.internal_();
- get runtimeType => XsltProcessor;
+class AnimationImpl extends Animation implements js_library.JSObjectInterfacesDom {
+ AnimationImpl.internal_() : super.internal_();
+ get runtimeType => Animation;
toString() => super.toString();
}
-patch class NavigatorLanguage {
- static Type get instanceRuntimeType => NavigatorLanguageImpl;
+patch class AnimationEffectReadOnly {
+ static Type get instanceRuntimeType => AnimationEffectReadOnlyImpl;
}
-class NavigatorLanguageImpl extends NavigatorLanguage implements js_library.JSObjectInterfacesDom {
- NavigatorLanguageImpl.internal_() : super.internal_();
- get runtimeType => NavigatorLanguage;
- toString() => super.toString();
-}
-patch class ParagraphElement {
- static Type get instanceRuntimeType => ParagraphElementImpl;
-
-}
-class ParagraphElementImpl extends ParagraphElement implements js_library.JSObjectInterfacesDom {
- ParagraphElementImpl.internal_() : super.internal_();
- get runtimeType => ParagraphElement;
- toString() => super.toString();
-}
-patch class HmdvrDevice {
- static Type get instanceRuntimeType => HmdvrDeviceImpl;
-
-}
-class HmdvrDeviceImpl extends HmdvrDevice implements js_library.JSObjectInterfacesDom {
- HmdvrDeviceImpl.internal_() : super.internal_();
- get runtimeType => HmdvrDevice;
- toString() => super.toString();
-}
-patch class SourceBuffer {
- static Type get instanceRuntimeType => SourceBufferImpl;
-
-}
-class SourceBufferImpl extends SourceBuffer implements js_library.JSObjectInterfacesDom {
- SourceBufferImpl.internal_() : super.internal_();
- get runtimeType => SourceBuffer;
- toString() => super.toString();
-}
-patch class CssCharsetRule {
- static Type get instanceRuntimeType => CssCharsetRuleImpl;
-
-}
-class CssCharsetRuleImpl extends CssCharsetRule implements js_library.JSObjectInterfacesDom {
- CssCharsetRuleImpl.internal_() : super.internal_();
- get runtimeType => CssCharsetRule;
- toString() => super.toString();
-}
-patch class DeprecatedStorageQuota {
- static Type get instanceRuntimeType => DeprecatedStorageQuotaImpl;
-
-}
-class DeprecatedStorageQuotaImpl extends DeprecatedStorageQuota implements js_library.JSObjectInterfacesDom {
- DeprecatedStorageQuotaImpl.internal_() : super.internal_();
- get runtimeType => DeprecatedStorageQuota;
- toString() => super.toString();
-}
-patch class DataTransfer {
- static Type get instanceRuntimeType => DataTransferImpl;
-
-}
-class DataTransferImpl extends DataTransfer implements js_library.JSObjectInterfacesDom {
- DataTransferImpl.internal_() : super.internal_();
- get runtimeType => DataTransfer;
- toString() => super.toString();
-}
-patch class MutationObserver {
- static Type get instanceRuntimeType => MutationObserverImpl;
-
-}
-class MutationObserverImpl extends MutationObserver implements js_library.JSObjectInterfacesDom {
- MutationObserverImpl.internal_() : super.internal_();
- get runtimeType => MutationObserver;
- toString() => super.toString();
-}
-patch class XmlSerializer {
- static Type get instanceRuntimeType => XmlSerializerImpl;
-
-}
-class XmlSerializerImpl extends XmlSerializer implements js_library.JSObjectInterfacesDom {
- XmlSerializerImpl.internal_() : super.internal_();
- get runtimeType => XmlSerializer;
- toString() => super.toString();
-}
-patch class PictureElement {
- static Type get instanceRuntimeType => PictureElementImpl;
-
-}
-class PictureElementImpl extends PictureElement implements js_library.JSObjectInterfacesDom {
- PictureElementImpl.internal_() : super.internal_();
- get runtimeType => PictureElement;
- toString() => super.toString();
-}
-patch class MediaEncryptedEvent {
- static Type get instanceRuntimeType => MediaEncryptedEventImpl;
-
-}
-class MediaEncryptedEventImpl extends MediaEncryptedEvent implements js_library.JSObjectInterfacesDom {
- MediaEncryptedEventImpl.internal_() : super.internal_();
- get runtimeType => MediaEncryptedEvent;
- toString() => super.toString();
-}
-patch class TouchEvent {
- static Type get instanceRuntimeType => TouchEventImpl;
-
-}
-class TouchEventImpl extends TouchEvent implements js_library.JSObjectInterfacesDom {
- TouchEventImpl.internal_() : super.internal_();
- get runtimeType => TouchEvent;
- toString() => super.toString();
-}
-patch class ServiceWorkerMessageEvent {
- static Type get instanceRuntimeType => ServiceWorkerMessageEventImpl;
-
-}
-class ServiceWorkerMessageEventImpl extends ServiceWorkerMessageEvent implements js_library.JSObjectInterfacesDom {
- ServiceWorkerMessageEventImpl.internal_() : super.internal_();
- get runtimeType => ServiceWorkerMessageEvent;
- toString() => super.toString();
-}
-patch class MeterElement {
- static Type get instanceRuntimeType => MeterElementImpl;
-
-}
-class MeterElementImpl extends MeterElement implements js_library.JSObjectInterfacesDom {
- MeterElementImpl.internal_() : super.internal_();
- get runtimeType => MeterElement;
- toString() => super.toString();
-}
-patch class CssGroupingRule {
- static Type get instanceRuntimeType => CssGroupingRuleImpl;
-
-}
-class CssGroupingRuleImpl extends CssGroupingRule implements js_library.JSObjectInterfacesDom {
- CssGroupingRuleImpl.internal_() : super.internal_();
- get runtimeType => CssGroupingRule;
- toString() => super.toString();
-}
-patch class UListElement {
- static Type get instanceRuntimeType => UListElementImpl;
-
-}
-class UListElementImpl extends UListElement implements js_library.JSObjectInterfacesDom {
- UListElementImpl.internal_() : super.internal_();
- get runtimeType => UListElement;
- toString() => super.toString();
-}
-patch class Storage {
- static Type get instanceRuntimeType => StorageImpl;
-
-}
-class StorageImpl extends Storage implements js_library.JSObjectInterfacesDom {
- StorageImpl.internal_() : super.internal_();
- get runtimeType => Storage;
- toString() => super.toString();
-}
-patch class _DocumentType {
- static Type get instanceRuntimeType => _DocumentTypeImpl;
-
-}
-class _DocumentTypeImpl extends _DocumentType implements js_library.JSObjectInterfacesDom {
- _DocumentTypeImpl.internal_() : super.internal_();
- get runtimeType => _DocumentType;
- toString() => super.toString();
-}
-patch class ErrorEvent {
- static Type get instanceRuntimeType => ErrorEventImpl;
-
-}
-class ErrorEventImpl extends ErrorEvent implements js_library.JSObjectInterfacesDom {
- ErrorEventImpl.internal_() : super.internal_();
- get runtimeType => ErrorEvent;
- toString() => super.toString();
-}
-patch class BodyElement {
- static Type get instanceRuntimeType => BodyElementImpl;
-
-}
-class BodyElementImpl extends BodyElement implements js_library.JSObjectInterfacesDom {
- BodyElementImpl.internal_() : super.internal_();
- get runtimeType => BodyElement;
- toString() => super.toString();
-}
-patch class DeprecatedStorageInfo {
- static Type get instanceRuntimeType => DeprecatedStorageInfoImpl;
-
-}
-class DeprecatedStorageInfoImpl extends DeprecatedStorageInfo implements js_library.JSObjectInterfacesDom {
- DeprecatedStorageInfoImpl.internal_() : super.internal_();
- get runtimeType => DeprecatedStorageInfo;
- toString() => super.toString();
-}
-patch class Geoposition {
- static Type get instanceRuntimeType => GeopositionImpl;
-
-}
-class GeopositionImpl extends Geoposition implements js_library.JSObjectInterfacesDom {
- GeopositionImpl.internal_() : super.internal_();
- get runtimeType => Geoposition;
- toString() => super.toString();
-}
-patch class ApplicationCacheErrorEvent {
- static Type get instanceRuntimeType => ApplicationCacheErrorEventImpl;
-
-}
-class ApplicationCacheErrorEventImpl extends ApplicationCacheErrorEvent implements js_library.JSObjectInterfacesDom {
- ApplicationCacheErrorEventImpl.internal_() : super.internal_();
- get runtimeType => ApplicationCacheErrorEvent;
- toString() => super.toString();
-}
-patch class MutationRecord {
- static Type get instanceRuntimeType => MutationRecordImpl;
-
-}
-class MutationRecordImpl extends MutationRecord implements js_library.JSObjectInterfacesDom {
- MutationRecordImpl.internal_() : super.internal_();
- get runtimeType => MutationRecord;
- toString() => super.toString();
-}
-patch class FieldSetElement {
- static Type get instanceRuntimeType => FieldSetElementImpl;
-
-}
-class FieldSetElementImpl extends FieldSetElement implements js_library.JSObjectInterfacesDom {
- FieldSetElementImpl.internal_() : super.internal_();
- get runtimeType => FieldSetElement;
- toString() => super.toString();
-}
-patch class NonDocumentTypeChildNode {
- static Type get instanceRuntimeType => NonDocumentTypeChildNodeImpl;
-
-}
-class NonDocumentTypeChildNodeImpl extends NonDocumentTypeChildNode implements js_library.JSObjectInterfacesDom {
- NonDocumentTypeChildNodeImpl.internal_() : super.internal_();
- get runtimeType => NonDocumentTypeChildNode;
- toString() => super.toString();
-}
-patch class _DirectoryReaderSync {
- static Type get instanceRuntimeType => _DirectoryReaderSyncImpl;
-
-}
-class _DirectoryReaderSyncImpl extends _DirectoryReaderSync implements js_library.JSObjectInterfacesDom {
- _DirectoryReaderSyncImpl.internal_() : super.internal_();
- get runtimeType => _DirectoryReaderSync;
- toString() => super.toString();
-}
-patch class RtcSessionDescription {
- static Type get instanceRuntimeType => RtcSessionDescriptionImpl;
-
-}
-class RtcSessionDescriptionImpl extends RtcSessionDescription implements js_library.JSObjectInterfacesDom {
- RtcSessionDescriptionImpl.internal_() : super.internal_();
- get runtimeType => RtcSessionDescription;
- toString() => super.toString();
-}
-patch class PositionSensorVRDevice {
- static Type get instanceRuntimeType => PositionSensorVRDeviceImpl;
-
-}
-class PositionSensorVRDeviceImpl extends PositionSensorVRDevice implements js_library.JSObjectInterfacesDom {
- PositionSensorVRDeviceImpl.internal_() : super.internal_();
- get runtimeType => PositionSensorVRDevice;
- toString() => super.toString();
-}
-patch class Text {
- static Type get instanceRuntimeType => TextImpl;
-
-}
-class TextImpl extends Text implements js_library.JSObjectInterfacesDom {
- TextImpl.internal_() : super.internal_();
- get runtimeType => Text;
+class AnimationEffectReadOnlyImpl extends AnimationEffectReadOnly implements js_library.JSObjectInterfacesDom {
+ AnimationEffectReadOnlyImpl.internal_() : super.internal_();
+ get runtimeType => AnimationEffectReadOnly;
toString() => super.toString();
}
patch class AnimationEffectTiming {
@@ -2607,121 +60,22 @@
get runtimeType => AnimationEffectTiming;
toString() => super.toString();
}
-patch class PositionError {
- static Type get instanceRuntimeType => PositionErrorImpl;
+patch class AnimationEvent {
+ static Type get instanceRuntimeType => AnimationEventImpl;
}
-class PositionErrorImpl extends PositionError implements js_library.JSObjectInterfacesDom {
- PositionErrorImpl.internal_() : super.internal_();
- get runtimeType => PositionError;
+class AnimationEventImpl extends AnimationEvent implements js_library.JSObjectInterfacesDom {
+ AnimationEventImpl.internal_() : super.internal_();
+ get runtimeType => AnimationEvent;
toString() => super.toString();
}
-patch class VideoTrackList {
- static Type get instanceRuntimeType => VideoTrackListImpl;
+patch class AnimationPlayerEvent {
+ static Type get instanceRuntimeType => AnimationPlayerEventImpl;
}
-class VideoTrackListImpl extends VideoTrackList implements js_library.JSObjectInterfacesDom {
- VideoTrackListImpl.internal_() : super.internal_();
- get runtimeType => VideoTrackList;
- toString() => super.toString();
-}
-patch class GamepadButton {
- static Type get instanceRuntimeType => GamepadButtonImpl;
-
-}
-class GamepadButtonImpl extends GamepadButton implements js_library.JSObjectInterfacesDom {
- GamepadButtonImpl.internal_() : super.internal_();
- get runtimeType => GamepadButton;
- toString() => super.toString();
-}
-patch class WorkerConsole {
- static Type get instanceRuntimeType => WorkerConsoleImpl;
-
-}
-class WorkerConsoleImpl extends WorkerConsole implements js_library.JSObjectInterfacesDom {
- WorkerConsoleImpl.internal_() : super.internal_();
- get runtimeType => WorkerConsole;
- toString() => super.toString();
-}
-patch class TrackDefault {
- static Type get instanceRuntimeType => TrackDefaultImpl;
-
-}
-class TrackDefaultImpl extends TrackDefault implements js_library.JSObjectInterfacesDom {
- TrackDefaultImpl.internal_() : super.internal_();
- get runtimeType => TrackDefault;
- toString() => super.toString();
-}
-patch class FileStream {
- static Type get instanceRuntimeType => FileStreamImpl;
-
-}
-class FileStreamImpl extends FileStream implements js_library.JSObjectInterfacesDom {
- FileStreamImpl.internal_() : super.internal_();
- get runtimeType => FileStream;
- toString() => super.toString();
-}
-patch class _ClientRect {
- static Type get instanceRuntimeType => _ClientRectImpl;
-
-}
-class _ClientRectImpl extends _ClientRect implements js_library.JSObjectInterfacesDom {
- _ClientRectImpl.internal_() : super.internal_();
- get runtimeType => _ClientRect;
- toString() => super.toString();
-}
-patch class TemplateElement {
- static Type get instanceRuntimeType => TemplateElementImpl;
-
-}
-class TemplateElementImpl extends TemplateElement implements js_library.JSObjectInterfacesDom {
- TemplateElementImpl.internal_() : super.internal_();
- get runtimeType => TemplateElement;
- toString() => super.toString();
-}
-patch class RtcStatsReport {
- static Type get instanceRuntimeType => RtcStatsReportImpl;
-
-}
-class RtcStatsReportImpl extends RtcStatsReport implements js_library.JSObjectInterfacesDom {
- RtcStatsReportImpl.internal_() : super.internal_();
- get runtimeType => RtcStatsReport;
- toString() => super.toString();
-}
-patch class TimeRanges {
- static Type get instanceRuntimeType => TimeRangesImpl;
-
-}
-class TimeRangesImpl extends TimeRanges implements js_library.JSObjectInterfacesDom {
- TimeRangesImpl.internal_() : super.internal_();
- get runtimeType => TimeRanges;
- toString() => super.toString();
-}
-patch class _Request {
- static Type get instanceRuntimeType => _RequestImpl;
-
-}
-class _RequestImpl extends _Request implements js_library.JSObjectInterfacesDom {
- _RequestImpl.internal_() : super.internal_();
- get runtimeType => _Request;
- toString() => super.toString();
-}
-patch class _WindowTimers {
- static Type get instanceRuntimeType => _WindowTimersImpl;
-
-}
-class _WindowTimersImpl extends _WindowTimers implements js_library.JSObjectInterfacesDom {
- _WindowTimersImpl.internal_() : super.internal_();
- get runtimeType => _WindowTimers;
- toString() => super.toString();
-}
-patch class VttRegionList {
- static Type get instanceRuntimeType => VttRegionListImpl;
-
-}
-class VttRegionListImpl extends VttRegionList implements js_library.JSObjectInterfacesDom {
- VttRegionListImpl.internal_() : super.internal_();
- get runtimeType => VttRegionList;
+class AnimationPlayerEventImpl extends AnimationPlayerEvent implements js_library.JSObjectInterfacesDom {
+ AnimationPlayerEventImpl.internal_() : super.internal_();
+ get runtimeType => AnimationPlayerEvent;
toString() => super.toString();
}
patch class AnimationTimeline {
@@ -2733,580 +87,13 @@
get runtimeType => AnimationTimeline;
toString() => super.toString();
}
-patch class Event {
- static Type get instanceRuntimeType => EventImpl;
+patch class AppBannerPromptResult {
+ static Type get instanceRuntimeType => AppBannerPromptResultImpl;
}
-class EventImpl extends Event implements js_library.JSObjectInterfacesDom {
- EventImpl.internal_() : super.internal_();
- get runtimeType => Event;
- toString() => super.toString();
-}
-patch class DomIterator {
- static Type get instanceRuntimeType => DomIteratorImpl;
-
-}
-class DomIteratorImpl extends DomIterator implements js_library.JSObjectInterfacesDom {
- DomIteratorImpl.internal_() : super.internal_();
- get runtimeType => DomIterator;
- toString() => super.toString();
-}
-patch class ImageData {
- static Type get instanceRuntimeType => ImageDataImpl;
-
-}
-class ImageDataImpl extends ImageData implements js_library.JSObjectInterfacesDom {
- ImageDataImpl.internal_() : super.internal_();
- get runtimeType => ImageData;
- toString() => super.toString();
-}
-patch class MediaStreamTrackEvent {
- static Type get instanceRuntimeType => MediaStreamTrackEventImpl;
-
-}
-class MediaStreamTrackEventImpl extends MediaStreamTrackEvent implements js_library.JSObjectInterfacesDom {
- MediaStreamTrackEventImpl.internal_() : super.internal_();
- get runtimeType => MediaStreamTrackEvent;
- toString() => super.toString();
-}
-patch class PromiseRejectionEvent {
- static Type get instanceRuntimeType => PromiseRejectionEventImpl;
-
-}
-class PromiseRejectionEventImpl extends PromiseRejectionEvent implements js_library.JSObjectInterfacesDom {
- PromiseRejectionEventImpl.internal_() : super.internal_();
- get runtimeType => PromiseRejectionEvent;
- toString() => super.toString();
-}
-patch class HtmlElement {
- static Type get instanceRuntimeType => HtmlElementImpl;
-
-}
-class HtmlElementImpl extends HtmlElement implements js_library.JSObjectInterfacesDom {
- HtmlElementImpl.internal_() : super.internal_();
- get runtimeType => HtmlElement;
- toString() => super.toString();
-}
-patch class HtmlDocument {
- static Type get instanceRuntimeType => HtmlDocumentImpl;
-
-}
-class HtmlDocumentImpl extends HtmlDocument implements js_library.JSObjectInterfacesDom {
- HtmlDocumentImpl.internal_() : super.internal_();
- get runtimeType => HtmlDocument;
- toString() => super.toString();
-}
-patch class MidiPort {
- static Type get instanceRuntimeType => MidiPortImpl;
-
-}
-class MidiPortImpl extends MidiPort implements js_library.JSObjectInterfacesDom {
- MidiPortImpl.internal_() : super.internal_();
- get runtimeType => MidiPort;
- toString() => super.toString();
-}
-patch class CssMediaRule {
- static Type get instanceRuntimeType => CssMediaRuleImpl;
-
-}
-class CssMediaRuleImpl extends CssMediaRule implements js_library.JSObjectInterfacesDom {
- CssMediaRuleImpl.internal_() : super.internal_();
- get runtimeType => CssMediaRule;
- toString() => super.toString();
-}
-patch class CssViewportRule {
- static Type get instanceRuntimeType => CssViewportRuleImpl;
-
-}
-class CssViewportRuleImpl extends CssViewportRule implements js_library.JSObjectInterfacesDom {
- CssViewportRuleImpl.internal_() : super.internal_();
- get runtimeType => CssViewportRule;
- toString() => super.toString();
-}
-patch class FederatedCredential {
- static Type get instanceRuntimeType => FederatedCredentialImpl;
-
-}
-class FederatedCredentialImpl extends FederatedCredential implements js_library.JSObjectInterfacesDom {
- FederatedCredentialImpl.internal_() : super.internal_();
- get runtimeType => FederatedCredential;
- toString() => super.toString();
-}
-patch class RtcIceCandidateEvent {
- static Type get instanceRuntimeType => RtcIceCandidateEventImpl;
-
-}
-class RtcIceCandidateEventImpl extends RtcIceCandidateEvent implements js_library.JSObjectInterfacesDom {
- RtcIceCandidateEventImpl.internal_() : super.internal_();
- get runtimeType => RtcIceCandidateEvent;
- toString() => super.toString();
-}
-patch class PerformanceMark {
- static Type get instanceRuntimeType => PerformanceMarkImpl;
-
-}
-class PerformanceMarkImpl extends PerformanceMark implements js_library.JSObjectInterfacesDom {
- PerformanceMarkImpl.internal_() : super.internal_();
- get runtimeType => PerformanceMark;
- toString() => super.toString();
-}
-patch class SharedWorkerGlobalScope {
- static Type get instanceRuntimeType => SharedWorkerGlobalScopeImpl;
-
-}
-class SharedWorkerGlobalScopeImpl extends SharedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
- SharedWorkerGlobalScopeImpl.internal_() : super.internal_();
- get runtimeType => SharedWorkerGlobalScope;
- toString() => super.toString();
-}
-patch class MimeTypeArray {
- static Type get instanceRuntimeType => MimeTypeArrayImpl;
-
-}
-class MimeTypeArrayImpl extends MimeTypeArray implements js_library.JSObjectInterfacesDom {
- MimeTypeArrayImpl.internal_() : super.internal_();
- get runtimeType => MimeTypeArray;
- toString() => super.toString();
-}
-patch class PerformanceRenderTiming {
- static Type get instanceRuntimeType => PerformanceRenderTimingImpl;
-
-}
-class PerformanceRenderTimingImpl extends PerformanceRenderTiming implements js_library.JSObjectInterfacesDom {
- PerformanceRenderTimingImpl.internal_() : super.internal_();
- get runtimeType => PerformanceRenderTiming;
- toString() => super.toString();
-}
-patch class EffectModel {
- static Type get instanceRuntimeType => EffectModelImpl;
-
-}
-class EffectModelImpl extends EffectModel implements js_library.JSObjectInterfacesDom {
- EffectModelImpl.internal_() : super.internal_();
- get runtimeType => EffectModel;
- toString() => super.toString();
-}
-patch class StyleSheet {
- static Type get instanceRuntimeType => StyleSheetImpl;
-
-}
-class StyleSheetImpl extends StyleSheet implements js_library.JSObjectInterfacesDom {
- StyleSheetImpl.internal_() : super.internal_();
- get runtimeType => StyleSheet;
- toString() => super.toString();
-}
-patch class TableRowElement {
- static Type get instanceRuntimeType => TableRowElementImpl;
-
-}
-class TableRowElementImpl extends TableRowElement implements js_library.JSObjectInterfacesDom {
- TableRowElementImpl.internal_() : super.internal_();
- get runtimeType => TableRowElement;
- toString() => super.toString();
-}
-patch class Geofencing {
- static Type get instanceRuntimeType => GeofencingImpl;
-
-}
-class GeofencingImpl extends Geofencing implements js_library.JSObjectInterfacesDom {
- GeofencingImpl.internal_() : super.internal_();
- get runtimeType => Geofencing;
- toString() => super.toString();
-}
-patch class NodeList {
- static Type get instanceRuntimeType => NodeListImpl;
-
-}
-class NodeListImpl extends NodeList implements js_library.JSObjectInterfacesDom {
- NodeListImpl.internal_() : super.internal_();
- get runtimeType => NodeList;
- toString() => super.toString();
-}
-patch class MidiAccess {
- static Type get instanceRuntimeType => MidiAccessImpl;
-
-}
-class MidiAccessImpl extends MidiAccess implements js_library.JSObjectInterfacesDom {
- MidiAccessImpl.internal_() : super.internal_();
- get runtimeType => MidiAccess;
- toString() => super.toString();
-}
-patch class CssStyleRule {
- static Type get instanceRuntimeType => CssStyleRuleImpl;
-
-}
-class CssStyleRuleImpl extends CssStyleRule implements js_library.JSObjectInterfacesDom {
- CssStyleRuleImpl.internal_() : super.internal_();
- get runtimeType => CssStyleRule;
- toString() => super.toString();
-}
-patch class DomError {
- static Type get instanceRuntimeType => DomErrorImpl;
-
-}
-class DomErrorImpl extends DomError implements js_library.JSObjectInterfacesDom {
- DomErrorImpl.internal_() : super.internal_();
- get runtimeType => DomError;
- toString() => super.toString();
-}
-patch class BluetoothUuid {
- static Type get instanceRuntimeType => BluetoothUuidImpl;
-
-}
-class BluetoothUuidImpl extends BluetoothUuid implements js_library.JSObjectInterfacesDom {
- BluetoothUuidImpl.internal_() : super.internal_();
- get runtimeType => BluetoothUuid;
- toString() => super.toString();
-}
-patch class HashChangeEvent {
- static Type get instanceRuntimeType => HashChangeEventImpl;
-
-}
-class HashChangeEventImpl extends HashChangeEvent implements js_library.JSObjectInterfacesDom {
- HashChangeEventImpl.internal_() : super.internal_();
- get runtimeType => HashChangeEvent;
- toString() => super.toString();
-}
-patch class InputElement {
- static Type get instanceRuntimeType => InputElementImpl;
-
-}
-class InputElementImpl extends InputElement implements js_library.JSObjectInterfacesDom {
- InputElementImpl.internal_() : super.internal_();
- get runtimeType => InputElement;
- toString() => super.toString();
-}
-patch class CDataSection {
- static Type get instanceRuntimeType => CDataSectionImpl;
-
-}
-class CDataSectionImpl extends CDataSection implements js_library.JSObjectInterfacesDom {
- CDataSectionImpl.internal_() : super.internal_();
- get runtimeType => CDataSection;
- toString() => super.toString();
-}
-patch class CssStyleSheet {
- static Type get instanceRuntimeType => CssStyleSheetImpl;
-
-}
-class CssStyleSheetImpl extends CssStyleSheet implements js_library.JSObjectInterfacesDom {
- CssStyleSheetImpl.internal_() : super.internal_();
- get runtimeType => CssStyleSheet;
- toString() => super.toString();
-}
-patch class DomRectReadOnly {
- static Type get instanceRuntimeType => DomRectReadOnlyImpl;
-
-}
-class DomRectReadOnlyImpl extends DomRectReadOnly implements js_library.JSObjectInterfacesDom {
- DomRectReadOnlyImpl.internal_() : super.internal_();
- get runtimeType => DomRectReadOnly;
- toString() => super.toString();
-}
-patch class SyncEvent {
- static Type get instanceRuntimeType => SyncEventImpl;
-
-}
-class SyncEventImpl extends SyncEvent implements js_library.JSObjectInterfacesDom {
- SyncEventImpl.internal_() : super.internal_();
- get runtimeType => SyncEvent;
- toString() => super.toString();
-}
-patch class CssSupportsRule {
- static Type get instanceRuntimeType => CssSupportsRuleImpl;
-
-}
-class CssSupportsRuleImpl extends CssSupportsRule implements js_library.JSObjectInterfacesDom {
- CssSupportsRuleImpl.internal_() : super.internal_();
- get runtimeType => CssSupportsRule;
- toString() => super.toString();
-}
-patch class DomParser {
- static Type get instanceRuntimeType => DomParserImpl;
-
-}
-class DomParserImpl extends DomParser implements js_library.JSObjectInterfacesDom {
- DomParserImpl.internal_() : super.internal_();
- get runtimeType => DomParser;
- toString() => super.toString();
-}
-patch class LIElement {
- static Type get instanceRuntimeType => LIElementImpl;
-
-}
-class LIElementImpl extends LIElement implements js_library.JSObjectInterfacesDom {
- LIElementImpl.internal_() : super.internal_();
- get runtimeType => LIElement;
- toString() => super.toString();
-}
-patch class CrossOriginServiceWorkerClient {
- static Type get instanceRuntimeType => CrossOriginServiceWorkerClientImpl;
-
-}
-class CrossOriginServiceWorkerClientImpl extends CrossOriginServiceWorkerClient implements js_library.JSObjectInterfacesDom {
- CrossOriginServiceWorkerClientImpl.internal_() : super.internal_();
- get runtimeType => CrossOriginServiceWorkerClient;
- toString() => super.toString();
-}
-patch class ServiceWorkerGlobalScope {
- static Type get instanceRuntimeType => ServiceWorkerGlobalScopeImpl;
-
-}
-class ServiceWorkerGlobalScopeImpl extends ServiceWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
- ServiceWorkerGlobalScopeImpl.internal_() : super.internal_();
- get runtimeType => ServiceWorkerGlobalScope;
- toString() => super.toString();
-}
-patch class InputDevice {
- static Type get instanceRuntimeType => InputDeviceImpl;
-
-}
-class InputDeviceImpl extends InputDevice implements js_library.JSObjectInterfacesDom {
- InputDeviceImpl.internal_() : super.internal_();
- get runtimeType => InputDevice;
- toString() => super.toString();
-}
-patch class MediaSession {
- static Type get instanceRuntimeType => MediaSessionImpl;
-
-}
-class MediaSessionImpl extends MediaSession implements js_library.JSObjectInterfacesDom {
- MediaSessionImpl.internal_() : super.internal_();
- get runtimeType => MediaSession;
- toString() => super.toString();
-}
-patch class PreElement {
- static Type get instanceRuntimeType => PreElementImpl;
-
-}
-class PreElementImpl extends PreElement implements js_library.JSObjectInterfacesDom {
- PreElementImpl.internal_() : super.internal_();
- get runtimeType => PreElement;
- toString() => super.toString();
-}
-patch class _NamedNodeMap {
- static Type get instanceRuntimeType => _NamedNodeMapImpl;
-
-}
-class _NamedNodeMapImpl extends _NamedNodeMap implements js_library.JSObjectInterfacesDom {
- _NamedNodeMapImpl.internal_() : super.internal_();
- get runtimeType => _NamedNodeMap;
- toString() => super.toString();
-}
-patch class StyleElement {
- static Type get instanceRuntimeType => StyleElementImpl;
-
-}
-class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
- StyleElementImpl.internal_() : super.internal_();
- get runtimeType => StyleElement;
- toString() => super.toString();
-}
-patch class TrackEvent {
- static Type get instanceRuntimeType => TrackEventImpl;
-
-}
-class TrackEventImpl extends TrackEvent implements js_library.JSObjectInterfacesDom {
- TrackEventImpl.internal_() : super.internal_();
- get runtimeType => TrackEvent;
- toString() => super.toString();
-}
-patch class Performance {
- static Type get instanceRuntimeType => PerformanceImpl;
-
-}
-class PerformanceImpl extends Performance implements js_library.JSObjectInterfacesDom {
- PerformanceImpl.internal_() : super.internal_();
- get runtimeType => Performance;
- toString() => super.toString();
-}
-patch class CssKeyframeRule {
- static Type get instanceRuntimeType => CssKeyframeRuleImpl;
-
-}
-class CssKeyframeRuleImpl extends CssKeyframeRule implements js_library.JSObjectInterfacesDom {
- CssKeyframeRuleImpl.internal_() : super.internal_();
- get runtimeType => CssKeyframeRule;
- toString() => super.toString();
-}
-patch class MidiInputMap {
- static Type get instanceRuntimeType => MidiInputMapImpl;
-
-}
-class MidiInputMapImpl extends MidiInputMap implements js_library.JSObjectInterfacesDom {
- MidiInputMapImpl.internal_() : super.internal_();
- get runtimeType => MidiInputMap;
- toString() => super.toString();
-}
-patch class XmlDocument {
- static Type get instanceRuntimeType => XmlDocumentImpl;
-
-}
-class XmlDocumentImpl extends XmlDocument implements js_library.JSObjectInterfacesDom {
- XmlDocumentImpl.internal_() : super.internal_();
- get runtimeType => XmlDocument;
- toString() => super.toString();
-}
-patch class VREyeParameters {
- static Type get instanceRuntimeType => VREyeParametersImpl;
-
-}
-class VREyeParametersImpl extends VREyeParameters implements js_library.JSObjectInterfacesDom {
- VREyeParametersImpl.internal_() : super.internal_();
- get runtimeType => VREyeParameters;
- toString() => super.toString();
-}
-patch class Credential {
- static Type get instanceRuntimeType => CredentialImpl;
-
-}
-class CredentialImpl extends Credential implements js_library.JSObjectInterfacesDom {
- CredentialImpl.internal_() : super.internal_();
- get runtimeType => Credential;
- toString() => super.toString();
-}
-patch class DomException {
- static Type get instanceRuntimeType => DomExceptionImpl;
-
-}
-class DomExceptionImpl extends DomException implements js_library.JSObjectInterfacesDom {
- DomExceptionImpl.internal_() : super.internal_();
- get runtimeType => DomException;
- toString() => super.toString();
-}
-patch class LegendElement {
- static Type get instanceRuntimeType => LegendElementImpl;
-
-}
-class LegendElementImpl extends LegendElement implements js_library.JSObjectInterfacesDom {
- LegendElementImpl.internal_() : super.internal_();
- get runtimeType => LegendElement;
- toString() => super.toString();
-}
-patch class HttpRequestEventTarget {
- static Type get instanceRuntimeType => HttpRequestEventTargetImpl;
-
-}
-class HttpRequestEventTargetImpl extends HttpRequestEventTarget implements js_library.JSObjectInterfacesDom {
- HttpRequestEventTargetImpl.internal_() : super.internal_();
- get runtimeType => HttpRequestEventTarget;
- toString() => super.toString();
-}
-patch class UnknownElement {
- static Type get instanceRuntimeType => UnknownElementImpl;
-
-}
-class UnknownElementImpl extends UnknownElement implements js_library.JSObjectInterfacesDom {
- UnknownElementImpl.internal_() : super.internal_();
- get runtimeType => UnknownElement;
- toString() => super.toString();
-}
-patch class _RadioNodeList {
- static Type get instanceRuntimeType => _RadioNodeListImpl;
-
-}
-class _RadioNodeListImpl extends _RadioNodeList implements js_library.JSObjectInterfacesDom {
- _RadioNodeListImpl.internal_() : super.internal_();
- get runtimeType => _RadioNodeList;
- toString() => super.toString();
-}
-patch class NavigatorUserMediaError {
- static Type get instanceRuntimeType => NavigatorUserMediaErrorImpl;
-
-}
-class NavigatorUserMediaErrorImpl extends NavigatorUserMediaError implements js_library.JSObjectInterfacesDom {
- NavigatorUserMediaErrorImpl.internal_() : super.internal_();
- get runtimeType => NavigatorUserMediaError;
- toString() => super.toString();
-}
-patch class ImageBitmap {
- static Type get instanceRuntimeType => ImageBitmapImpl;
-
-}
-class ImageBitmapImpl extends ImageBitmap implements js_library.JSObjectInterfacesDom {
- ImageBitmapImpl.internal_() : super.internal_();
- get runtimeType => ImageBitmap;
- toString() => super.toString();
-}
-patch class AudioTrack {
- static Type get instanceRuntimeType => AudioTrackImpl;
-
-}
-class AudioTrackImpl extends AudioTrack implements js_library.JSObjectInterfacesDom {
- AudioTrackImpl.internal_() : super.internal_();
- get runtimeType => AudioTrack;
- toString() => super.toString();
-}
-patch class ReadableByteStream {
- static Type get instanceRuntimeType => ReadableByteStreamImpl;
-
-}
-class ReadableByteStreamImpl extends ReadableByteStream implements js_library.JSObjectInterfacesDom {
- ReadableByteStreamImpl.internal_() : super.internal_();
- get runtimeType => ReadableByteStream;
- toString() => super.toString();
-}
-patch class _HTMLFrameElement {
- static Type get instanceRuntimeType => _HTMLFrameElementImpl;
-
-}
-class _HTMLFrameElementImpl extends _HTMLFrameElement implements js_library.JSObjectInterfacesDom {
- _HTMLFrameElementImpl.internal_() : super.internal_();
- get runtimeType => _HTMLFrameElement;
- toString() => super.toString();
-}
-patch class Body {
- static Type get instanceRuntimeType => BodyImpl;
-
-}
-class BodyImpl extends Body implements js_library.JSObjectInterfacesDom {
- BodyImpl.internal_() : super.internal_();
- get runtimeType => Body;
- toString() => super.toString();
-}
-patch class MediaKeySystemAccess {
- static Type get instanceRuntimeType => MediaKeySystemAccessImpl;
-
-}
-class MediaKeySystemAccessImpl extends MediaKeySystemAccess implements js_library.JSObjectInterfacesDom {
- MediaKeySystemAccessImpl.internal_() : super.internal_();
- get runtimeType => MediaKeySystemAccess;
- toString() => super.toString();
-}
-patch class BluetoothGattService {
- static Type get instanceRuntimeType => BluetoothGattServiceImpl;
-
-}
-class BluetoothGattServiceImpl extends BluetoothGattService implements js_library.JSObjectInterfacesDom {
- BluetoothGattServiceImpl.internal_() : super.internal_();
- get runtimeType => BluetoothGattService;
- toString() => super.toString();
-}
-patch class _Attr {
- static Type get instanceRuntimeType => _AttrImpl;
-
-}
-class _AttrImpl extends _Attr implements js_library.JSObjectInterfacesDom {
- _AttrImpl.internal_() : super.internal_();
- get runtimeType => _Attr;
- toString() => super.toString();
-}
-patch class CanvasRenderingContext2D {
- static Type get instanceRuntimeType => CanvasRenderingContext2DImpl;
-
-}
-class CanvasRenderingContext2DImpl extends CanvasRenderingContext2D implements js_library.JSObjectInterfacesDom {
- CanvasRenderingContext2DImpl.internal_() : super.internal_();
- get runtimeType => CanvasRenderingContext2D;
- toString() => super.toString();
-}
-patch class OListElement {
- static Type get instanceRuntimeType => OListElementImpl;
-
-}
-class OListElementImpl extends OListElement implements js_library.JSObjectInterfacesDom {
- OListElementImpl.internal_() : super.internal_();
- get runtimeType => OListElement;
+class AppBannerPromptResultImpl extends AppBannerPromptResult implements js_library.JSObjectInterfacesDom {
+ AppBannerPromptResultImpl.internal_() : super.internal_();
+ get runtimeType => AppBannerPromptResult;
toString() => super.toString();
}
patch class ApplicationCache {
@@ -3318,148 +105,94 @@
get runtimeType => ApplicationCache;
toString() => super.toString();
}
-patch class Clients {
- static Type get instanceRuntimeType => ClientsImpl;
+patch class ApplicationCacheErrorEvent {
+ static Type get instanceRuntimeType => ApplicationCacheErrorEventImpl;
}
-class ClientsImpl extends Clients implements js_library.JSObjectInterfacesDom {
- ClientsImpl.internal_() : super.internal_();
- get runtimeType => Clients;
+class ApplicationCacheErrorEventImpl extends ApplicationCacheErrorEvent implements js_library.JSObjectInterfacesDom {
+ ApplicationCacheErrorEventImpl.internal_() : super.internal_();
+ get runtimeType => ApplicationCacheErrorEvent;
toString() => super.toString();
}
-patch class RtcPeerConnection {
- static Type get instanceRuntimeType => RtcPeerConnectionImpl;
+patch class AreaElement {
+ static Type get instanceRuntimeType => AreaElementImpl;
}
-class RtcPeerConnectionImpl extends RtcPeerConnection implements js_library.JSObjectInterfacesDom {
- RtcPeerConnectionImpl.internal_() : super.internal_();
- get runtimeType => RtcPeerConnection;
+class AreaElementImpl extends AreaElement implements js_library.JSObjectInterfacesDom {
+ AreaElementImpl.internal_() : super.internal_();
+ get runtimeType => AreaElement;
toString() => super.toString();
}
-patch class VideoElement {
- static Type get instanceRuntimeType => VideoElementImpl;
+patch class AudioElement {
+ static Type get instanceRuntimeType => AudioElementImpl;
}
-class VideoElementImpl extends VideoElement implements js_library.JSObjectInterfacesDom {
- VideoElementImpl.internal_() : super.internal_();
- get runtimeType => VideoElement;
+class AudioElementImpl extends AudioElement implements js_library.JSObjectInterfacesDom {
+ AudioElementImpl.internal_() : super.internal_();
+ get runtimeType => AudioElement;
toString() => super.toString();
}
-patch class OutputElement {
- static Type get instanceRuntimeType => OutputElementImpl;
+patch class AudioTrack {
+ static Type get instanceRuntimeType => AudioTrackImpl;
}
-class OutputElementImpl extends OutputElement implements js_library.JSObjectInterfacesDom {
- OutputElementImpl.internal_() : super.internal_();
- get runtimeType => OutputElement;
+class AudioTrackImpl extends AudioTrack implements js_library.JSObjectInterfacesDom {
+ AudioTrackImpl.internal_() : super.internal_();
+ get runtimeType => AudioTrack;
toString() => super.toString();
}
-patch class Coordinates {
- static Type get instanceRuntimeType => CoordinatesImpl;
+patch class AudioTrackList {
+ static Type get instanceRuntimeType => AudioTrackListImpl;
}
-class CoordinatesImpl extends Coordinates implements js_library.JSObjectInterfacesDom {
- CoordinatesImpl.internal_() : super.internal_();
- get runtimeType => Coordinates;
+class AudioTrackListImpl extends AudioTrackList implements js_library.JSObjectInterfacesDom {
+ AudioTrackListImpl.internal_() : super.internal_();
+ get runtimeType => AudioTrackList;
toString() => super.toString();
}
-patch class NetworkInformation {
- static Type get instanceRuntimeType => NetworkInformationImpl;
+patch class AutocompleteErrorEvent {
+ static Type get instanceRuntimeType => AutocompleteErrorEventImpl;
}
-class NetworkInformationImpl extends NetworkInformation implements js_library.JSObjectInterfacesDom {
- NetworkInformationImpl.internal_() : super.internal_();
- get runtimeType => NetworkInformation;
+class AutocompleteErrorEventImpl extends AutocompleteErrorEvent implements js_library.JSObjectInterfacesDom {
+ AutocompleteErrorEventImpl.internal_() : super.internal_();
+ get runtimeType => AutocompleteErrorEvent;
toString() => super.toString();
}
-patch class FocusEvent {
- static Type get instanceRuntimeType => FocusEventImpl;
+patch class BRElement {
+ static Type get instanceRuntimeType => BRElementImpl;
}
-class FocusEventImpl extends FocusEvent implements js_library.JSObjectInterfacesDom {
- FocusEventImpl.internal_() : super.internal_();
- get runtimeType => FocusEvent;
+class BRElementImpl extends BRElement implements js_library.JSObjectInterfacesDom {
+ BRElementImpl.internal_() : super.internal_();
+ get runtimeType => BRElement;
toString() => super.toString();
}
-patch class SpeechGrammarList {
- static Type get instanceRuntimeType => SpeechGrammarListImpl;
+patch class BarProp {
+ static Type get instanceRuntimeType => BarPropImpl;
}
-class SpeechGrammarListImpl extends SpeechGrammarList implements js_library.JSObjectInterfacesDom {
- SpeechGrammarListImpl.internal_() : super.internal_();
- get runtimeType => SpeechGrammarList;
+class BarPropImpl extends BarProp implements js_library.JSObjectInterfacesDom {
+ BarPropImpl.internal_() : super.internal_();
+ get runtimeType => BarProp;
toString() => super.toString();
}
-patch class Range {
- static Type get instanceRuntimeType => RangeImpl;
+patch class BaseElement {
+ static Type get instanceRuntimeType => BaseElementImpl;
}
-class RangeImpl extends Range implements js_library.JSObjectInterfacesDom {
- RangeImpl.internal_() : super.internal_();
- get runtimeType => Range;
+class BaseElementImpl extends BaseElement implements js_library.JSObjectInterfacesDom {
+ BaseElementImpl.internal_() : super.internal_();
+ get runtimeType => BaseElement;
toString() => super.toString();
}
-patch class SpeechGrammar {
- static Type get instanceRuntimeType => SpeechGrammarImpl;
+patch class BatteryManager {
+ static Type get instanceRuntimeType => BatteryManagerImpl;
}
-class SpeechGrammarImpl extends SpeechGrammar implements js_library.JSObjectInterfacesDom {
- SpeechGrammarImpl.internal_() : super.internal_();
- get runtimeType => SpeechGrammar;
- toString() => super.toString();
-}
-patch class WorkerGlobalScope {
- static Type get instanceRuntimeType => WorkerGlobalScopeImpl;
-
-}
-class WorkerGlobalScopeImpl extends WorkerGlobalScope implements js_library.JSObjectInterfacesDom {
- WorkerGlobalScopeImpl.internal_() : super.internal_();
- get runtimeType => WorkerGlobalScope;
- toString() => super.toString();
-}
-patch class ScreenOrientation {
- static Type get instanceRuntimeType => ScreenOrientationImpl;
-
-}
-class ScreenOrientationImpl extends ScreenOrientation implements js_library.JSObjectInterfacesDom {
- ScreenOrientationImpl.internal_() : super.internal_();
- get runtimeType => ScreenOrientation;
- toString() => super.toString();
-}
-patch class NonElementParentNode {
- static Type get instanceRuntimeType => NonElementParentNodeImpl;
-
-}
-class NonElementParentNodeImpl extends NonElementParentNode implements js_library.JSObjectInterfacesDom {
- NonElementParentNodeImpl.internal_() : super.internal_();
- get runtimeType => NonElementParentNode;
- toString() => super.toString();
-}
-patch class TitleElement {
- static Type get instanceRuntimeType => TitleElementImpl;
-
-}
-class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
- TitleElementImpl.internal_() : super.internal_();
- get runtimeType => TitleElement;
- toString() => super.toString();
-}
-patch class MidiConnectionEvent {
- static Type get instanceRuntimeType => MidiConnectionEventImpl;
-
-}
-class MidiConnectionEventImpl extends MidiConnectionEvent implements js_library.JSObjectInterfacesDom {
- MidiConnectionEventImpl.internal_() : super.internal_();
- get runtimeType => MidiConnectionEvent;
- toString() => super.toString();
-}
-patch class NotificationEvent {
- static Type get instanceRuntimeType => NotificationEventImpl;
-
-}
-class NotificationEventImpl extends NotificationEvent implements js_library.JSObjectInterfacesDom {
- NotificationEventImpl.internal_() : super.internal_();
- get runtimeType => NotificationEvent;
+class BatteryManagerImpl extends BatteryManager implements js_library.JSObjectInterfacesDom {
+ BatteryManagerImpl.internal_() : super.internal_();
+ get runtimeType => BatteryManager;
toString() => super.toString();
}
patch class BeforeInstallPromptEvent {
@@ -3471,31 +204,22 @@
get runtimeType => BeforeInstallPromptEvent;
toString() => super.toString();
}
-patch class _CanvasPathMethods {
- static Type get instanceRuntimeType => _CanvasPathMethodsImpl;
+patch class BeforeUnloadEvent {
+ static Type get instanceRuntimeType => BeforeUnloadEventImpl;
}
-class _CanvasPathMethodsImpl extends _CanvasPathMethods implements js_library.JSObjectInterfacesDom {
- _CanvasPathMethodsImpl.internal_() : super.internal_();
- get runtimeType => _CanvasPathMethods;
+class BeforeUnloadEventImpl extends BeforeUnloadEvent implements js_library.JSObjectInterfacesDom {
+ BeforeUnloadEventImpl.internal_() : super.internal_();
+ get runtimeType => BeforeUnloadEvent;
toString() => super.toString();
}
-patch class UrlUtils {
- static Type get instanceRuntimeType => UrlUtilsImpl;
+patch class Blob {
+ static Type get instanceRuntimeType => BlobImpl;
}
-class UrlUtilsImpl extends UrlUtils implements js_library.JSObjectInterfacesDom {
- UrlUtilsImpl.internal_() : super.internal_();
- get runtimeType => UrlUtils;
- toString() => super.toString();
-}
-patch class SelectElement {
- static Type get instanceRuntimeType => SelectElementImpl;
-
-}
-class SelectElementImpl extends SelectElement implements js_library.JSObjectInterfacesDom {
- SelectElementImpl.internal_() : super.internal_();
- get runtimeType => SelectElement;
+class BlobImpl extends Blob implements js_library.JSObjectInterfacesDom {
+ BlobImpl.internal_() : super.internal_();
+ get runtimeType => Blob;
toString() => super.toString();
}
patch class Bluetooth {
@@ -3516,472 +240,121 @@
get runtimeType => BluetoothDevice;
toString() => super.toString();
}
-patch class ConsoleBase {
- static Type get instanceRuntimeType => ConsoleBaseImpl;
+patch class BluetoothGattCharacteristic {
+ static Type get instanceRuntimeType => BluetoothGattCharacteristicImpl;
}
-class ConsoleBaseImpl extends ConsoleBase implements js_library.JSObjectInterfacesDom {
- ConsoleBaseImpl.internal_() : super.internal_();
- get runtimeType => ConsoleBase;
+class BluetoothGattCharacteristicImpl extends BluetoothGattCharacteristic implements js_library.JSObjectInterfacesDom {
+ BluetoothGattCharacteristicImpl.internal_() : super.internal_();
+ get runtimeType => BluetoothGattCharacteristic;
toString() => super.toString();
}
-patch class AudioElement {
- static Type get instanceRuntimeType => AudioElementImpl;
+patch class BluetoothGattRemoteServer {
+ static Type get instanceRuntimeType => BluetoothGattRemoteServerImpl;
}
-class AudioElementImpl extends AudioElement implements js_library.JSObjectInterfacesDom {
- AudioElementImpl.internal_() : super.internal_();
- get runtimeType => AudioElement;
+class BluetoothGattRemoteServerImpl extends BluetoothGattRemoteServer implements js_library.JSObjectInterfacesDom {
+ BluetoothGattRemoteServerImpl.internal_() : super.internal_();
+ get runtimeType => BluetoothGattRemoteServer;
toString() => super.toString();
}
-patch class PushMessageData {
- static Type get instanceRuntimeType => PushMessageDataImpl;
+patch class BluetoothGattService {
+ static Type get instanceRuntimeType => BluetoothGattServiceImpl;
}
-class PushMessageDataImpl extends PushMessageData implements js_library.JSObjectInterfacesDom {
- PushMessageDataImpl.internal_() : super.internal_();
- get runtimeType => PushMessageData;
+class BluetoothGattServiceImpl extends BluetoothGattService implements js_library.JSObjectInterfacesDom {
+ BluetoothGattServiceImpl.internal_() : super.internal_();
+ get runtimeType => BluetoothGattService;
toString() => super.toString();
}
-patch class SpeechRecognitionEvent {
- static Type get instanceRuntimeType => SpeechRecognitionEventImpl;
+patch class BluetoothUuid {
+ static Type get instanceRuntimeType => BluetoothUuidImpl;
}
-class SpeechRecognitionEventImpl extends SpeechRecognitionEvent implements js_library.JSObjectInterfacesDom {
- SpeechRecognitionEventImpl.internal_() : super.internal_();
- get runtimeType => SpeechRecognitionEvent;
+class BluetoothUuidImpl extends BluetoothUuid implements js_library.JSObjectInterfacesDom {
+ BluetoothUuidImpl.internal_() : super.internal_();
+ get runtimeType => BluetoothUuid;
toString() => super.toString();
}
-patch class WebSocket {
- static Type get instanceRuntimeType => WebSocketImpl;
+patch class Body {
+ static Type get instanceRuntimeType => BodyImpl;
}
-class WebSocketImpl extends WebSocket implements js_library.JSObjectInterfacesDom {
- WebSocketImpl.internal_() : super.internal_();
- get runtimeType => WebSocket;
+class BodyImpl extends Body implements js_library.JSObjectInterfacesDom {
+ BodyImpl.internal_() : super.internal_();
+ get runtimeType => Body;
toString() => super.toString();
}
-patch class _XMLHttpRequestProgressEvent {
- static Type get instanceRuntimeType => _XMLHttpRequestProgressEventImpl;
+patch class BodyElement {
+ static Type get instanceRuntimeType => BodyElementImpl;
}
-class _XMLHttpRequestProgressEventImpl extends _XMLHttpRequestProgressEvent implements js_library.JSObjectInterfacesDom {
- _XMLHttpRequestProgressEventImpl.internal_() : super.internal_();
- get runtimeType => _XMLHttpRequestProgressEvent;
+class BodyElementImpl extends BodyElement implements js_library.JSObjectInterfacesDom {
+ BodyElementImpl.internal_() : super.internal_();
+ get runtimeType => BodyElement;
toString() => super.toString();
}
-patch class Location {
- static Type get instanceRuntimeType => LocationImpl;
+patch class ButtonElement {
+ static Type get instanceRuntimeType => ButtonElementImpl;
}
-class LocationImpl extends Location implements js_library.JSObjectInterfacesDom {
- LocationImpl.internal_() : super.internal_();
- get runtimeType => Location;
+class ButtonElementImpl extends ButtonElement implements js_library.JSObjectInterfacesDom {
+ ButtonElementImpl.internal_() : super.internal_();
+ get runtimeType => ButtonElement;
toString() => super.toString();
}
-patch class PerformanceEntry {
- static Type get instanceRuntimeType => PerformanceEntryImpl;
+patch class CDataSection {
+ static Type get instanceRuntimeType => CDataSectionImpl;
}
-class PerformanceEntryImpl extends PerformanceEntry implements js_library.JSObjectInterfacesDom {
- PerformanceEntryImpl.internal_() : super.internal_();
- get runtimeType => PerformanceEntry;
+class CDataSectionImpl extends CDataSection implements js_library.JSObjectInterfacesDom {
+ CDataSectionImpl.internal_() : super.internal_();
+ get runtimeType => CDataSection;
toString() => super.toString();
}
-patch class Client {
- static Type get instanceRuntimeType => ClientImpl;
+patch class CacheStorage {
+ static Type get instanceRuntimeType => CacheStorageImpl;
}
-class ClientImpl extends Client implements js_library.JSObjectInterfacesDom {
- ClientImpl.internal_() : super.internal_();
- get runtimeType => Client;
+class CacheStorageImpl extends CacheStorage implements js_library.JSObjectInterfacesDom {
+ CacheStorageImpl.internal_() : super.internal_();
+ get runtimeType => CacheStorage;
toString() => super.toString();
}
-patch class _Cache {
- static Type get instanceRuntimeType => _CacheImpl;
+patch class CanvasElement {
+ static Type get instanceRuntimeType => CanvasElementImpl;
}
-class _CacheImpl extends _Cache implements js_library.JSObjectInterfacesDom {
- _CacheImpl.internal_() : super.internal_();
- get runtimeType => _Cache;
+class CanvasElementImpl extends CanvasElement implements js_library.JSObjectInterfacesDom {
+ CanvasElementImpl.internal_() : super.internal_();
+ get runtimeType => CanvasElement;
toString() => super.toString();
}
-patch class MimeType {
- static Type get instanceRuntimeType => MimeTypeImpl;
+patch class CanvasGradient {
+ static Type get instanceRuntimeType => CanvasGradientImpl;
}
-class MimeTypeImpl extends MimeType implements js_library.JSObjectInterfacesDom {
- MimeTypeImpl.internal_() : super.internal_();
- get runtimeType => MimeType;
+class CanvasGradientImpl extends CanvasGradient implements js_library.JSObjectInterfacesDom {
+ CanvasGradientImpl.internal_() : super.internal_();
+ get runtimeType => CanvasGradient;
toString() => super.toString();
}
-patch class MidiOutputMap {
- static Type get instanceRuntimeType => MidiOutputMapImpl;
+patch class CanvasPattern {
+ static Type get instanceRuntimeType => CanvasPatternImpl;
}
-class MidiOutputMapImpl extends MidiOutputMap implements js_library.JSObjectInterfacesDom {
- MidiOutputMapImpl.internal_() : super.internal_();
- get runtimeType => MidiOutputMap;
+class CanvasPatternImpl extends CanvasPattern implements js_library.JSObjectInterfacesDom {
+ CanvasPatternImpl.internal_() : super.internal_();
+ get runtimeType => CanvasPattern;
toString() => super.toString();
}
-patch class PointerEvent {
- static Type get instanceRuntimeType => PointerEventImpl;
+patch class CanvasRenderingContext2D {
+ static Type get instanceRuntimeType => CanvasRenderingContext2DImpl;
}
-class PointerEventImpl extends PointerEvent implements js_library.JSObjectInterfacesDom {
- PointerEventImpl.internal_() : super.internal_();
- get runtimeType => PointerEvent;
- toString() => super.toString();
-}
-patch class ChildNode {
- static Type get instanceRuntimeType => ChildNodeImpl;
-
-}
-class ChildNodeImpl extends ChildNode implements js_library.JSObjectInterfacesDom {
- ChildNodeImpl.internal_() : super.internal_();
- get runtimeType => ChildNode;
- toString() => super.toString();
-}
-patch class Geolocation {
- static Type get instanceRuntimeType => GeolocationImpl;
-
-}
-class GeolocationImpl extends Geolocation implements js_library.JSObjectInterfacesDom {
- GeolocationImpl.internal_() : super.internal_();
- get runtimeType => Geolocation;
- toString() => super.toString();
-}
-patch class _CssRuleList {
- static Type get instanceRuntimeType => _CssRuleListImpl;
-
-}
-class _CssRuleListImpl extends _CssRuleList implements js_library.JSObjectInterfacesDom {
- _CssRuleListImpl.internal_() : super.internal_();
- get runtimeType => _CssRuleList;
- toString() => super.toString();
-}
-patch class MediaKeyEvent {
- static Type get instanceRuntimeType => MediaKeyEventImpl;
-
-}
-class MediaKeyEventImpl extends MediaKeyEvent implements js_library.JSObjectInterfacesDom {
- MediaKeyEventImpl.internal_() : super.internal_();
- get runtimeType => MediaKeyEvent;
- toString() => super.toString();
-}
-patch class CompositorWorker {
- static Type get instanceRuntimeType => CompositorWorkerImpl;
-
-}
-class CompositorWorkerImpl extends CompositorWorker implements js_library.JSObjectInterfacesDom {
- CompositorWorkerImpl.internal_() : super.internal_();
- get runtimeType => CompositorWorker;
- toString() => super.toString();
-}
-patch class ProgressElement {
- static Type get instanceRuntimeType => ProgressElementImpl;
-
-}
-class ProgressElementImpl extends ProgressElement implements js_library.JSObjectInterfacesDom {
- ProgressElementImpl.internal_() : super.internal_();
- get runtimeType => ProgressElement;
- toString() => super.toString();
-}
-patch class SharedArrayBuffer {
- static Type get instanceRuntimeType => SharedArrayBufferImpl;
-
-}
-class SharedArrayBufferImpl extends SharedArrayBuffer implements js_library.JSObjectInterfacesDom {
- SharedArrayBufferImpl.internal_() : super.internal_();
- get runtimeType => SharedArrayBuffer;
- toString() => super.toString();
-}
-patch class CrossOriginConnectEvent {
- static Type get instanceRuntimeType => CrossOriginConnectEventImpl;
-
-}
-class CrossOriginConnectEventImpl extends CrossOriginConnectEvent implements js_library.JSObjectInterfacesDom {
- CrossOriginConnectEventImpl.internal_() : super.internal_();
- get runtimeType => CrossOriginConnectEvent;
- toString() => super.toString();
-}
-patch class BeforeUnloadEvent {
- static Type get instanceRuntimeType => BeforeUnloadEventImpl;
-
-}
-class BeforeUnloadEventImpl extends BeforeUnloadEvent implements js_library.JSObjectInterfacesDom {
- BeforeUnloadEventImpl.internal_() : super.internal_();
- get runtimeType => BeforeUnloadEvent;
- toString() => super.toString();
-}
-patch class DataTransferItem {
- static Type get instanceRuntimeType => DataTransferItemImpl;
-
-}
-class DataTransferItemImpl extends DataTransferItem implements js_library.JSObjectInterfacesDom {
- DataTransferItemImpl.internal_() : super.internal_();
- get runtimeType => DataTransferItem;
- toString() => super.toString();
-}
-patch class _HTMLAllCollection {
- static Type get instanceRuntimeType => _HTMLAllCollectionImpl;
-
-}
-class _HTMLAllCollectionImpl extends _HTMLAllCollection implements js_library.JSObjectInterfacesDom {
- _HTMLAllCollectionImpl.internal_() : super.internal_();
- get runtimeType => _HTMLAllCollection;
- toString() => super.toString();
-}
-patch class ServicePortCollection {
- static Type get instanceRuntimeType => ServicePortCollectionImpl;
-
-}
-class ServicePortCollectionImpl extends ServicePortCollection implements js_library.JSObjectInterfacesDom {
- ServicePortCollectionImpl.internal_() : super.internal_();
- get runtimeType => ServicePortCollection;
- toString() => super.toString();
-}
-patch class KeygenElement {
- static Type get instanceRuntimeType => KeygenElementImpl;
-
-}
-class KeygenElementImpl extends KeygenElement implements js_library.JSObjectInterfacesDom {
- KeygenElementImpl.internal_() : super.internal_();
- get runtimeType => KeygenElement;
- toString() => super.toString();
-}
-patch class CryptoKey {
- static Type get instanceRuntimeType => CryptoKeyImpl;
-
-}
-class CryptoKeyImpl extends CryptoKey implements js_library.JSObjectInterfacesDom {
- CryptoKeyImpl.internal_() : super.internal_();
- get runtimeType => CryptoKey;
- toString() => super.toString();
-}
-patch class CssKeyframesRule {
- static Type get instanceRuntimeType => CssKeyframesRuleImpl;
-
-}
-class CssKeyframesRuleImpl extends CssKeyframesRule implements js_library.JSObjectInterfacesDom {
- CssKeyframesRuleImpl.internal_() : super.internal_();
- get runtimeType => CssKeyframesRule;
- toString() => super.toString();
-}
-patch class _HTMLMarqueeElement {
- static Type get instanceRuntimeType => _HTMLMarqueeElementImpl;
-
-}
-class _HTMLMarqueeElementImpl extends _HTMLMarqueeElement implements js_library.JSObjectInterfacesDom {
- _HTMLMarqueeElementImpl.internal_() : super.internal_();
- get runtimeType => _HTMLMarqueeElement;
- toString() => super.toString();
-}
-patch class TextEvent {
- static Type get instanceRuntimeType => TextEventImpl;
-
-}
-class TextEventImpl extends TextEvent implements js_library.JSObjectInterfacesDom {
- TextEventImpl.internal_() : super.internal_();
- get runtimeType => TextEvent;
- toString() => super.toString();
-}
-patch class _EntrySync {
- static Type get instanceRuntimeType => _EntrySyncImpl;
-
-}
-class _EntrySyncImpl extends _EntrySync implements js_library.JSObjectInterfacesDom {
- _EntrySyncImpl.internal_() : super.internal_();
- get runtimeType => _EntrySync;
- toString() => super.toString();
-}
-patch class GeofencingEvent {
- static Type get instanceRuntimeType => GeofencingEventImpl;
-
-}
-class GeofencingEventImpl extends GeofencingEvent implements js_library.JSObjectInterfacesDom {
- GeofencingEventImpl.internal_() : super.internal_();
- get runtimeType => GeofencingEvent;
- toString() => super.toString();
-}
-patch class MediaKeys {
- static Type get instanceRuntimeType => MediaKeysImpl;
-
-}
-class MediaKeysImpl extends MediaKeys implements js_library.JSObjectInterfacesDom {
- MediaKeysImpl.internal_() : super.internal_();
- get runtimeType => MediaKeys;
- toString() => super.toString();
-}
-patch class DomPointReadOnly {
- static Type get instanceRuntimeType => DomPointReadOnlyImpl;
-
-}
-class DomPointReadOnlyImpl extends DomPointReadOnly implements js_library.JSObjectInterfacesDom {
- DomPointReadOnlyImpl.internal_() : super.internal_();
- get runtimeType => DomPointReadOnly;
- toString() => super.toString();
-}
-patch class WindowBase64 {
- static Type get instanceRuntimeType => WindowBase64Impl;
-
-}
-class WindowBase64Impl extends WindowBase64 implements js_library.JSObjectInterfacesDom {
- WindowBase64Impl.internal_() : super.internal_();
- get runtimeType => WindowBase64;
- toString() => super.toString();
-}
-patch class SpeechRecognitionError {
- static Type get instanceRuntimeType => SpeechRecognitionErrorImpl;
-
-}
-class SpeechRecognitionErrorImpl extends SpeechRecognitionError implements js_library.JSObjectInterfacesDom {
- SpeechRecognitionErrorImpl.internal_() : super.internal_();
- get runtimeType => SpeechRecognitionError;
- toString() => super.toString();
-}
-patch class MidiOutput {
- static Type get instanceRuntimeType => MidiOutputImpl;
-
-}
-class MidiOutputImpl extends MidiOutput implements js_library.JSObjectInterfacesDom {
- MidiOutputImpl.internal_() : super.internal_();
- get runtimeType => MidiOutput;
- toString() => super.toString();
-}
-patch class EventSource {
- static Type get instanceRuntimeType => EventSourceImpl;
-
-}
-class EventSourceImpl extends EventSource implements js_library.JSObjectInterfacesDom {
- EventSourceImpl.internal_() : super.internal_();
- get runtimeType => EventSource;
- toString() => super.toString();
-}
-patch class DeviceOrientationEvent {
- static Type get instanceRuntimeType => DeviceOrientationEventImpl;
-
-}
-class DeviceOrientationEventImpl extends DeviceOrientationEvent implements js_library.JSObjectInterfacesDom {
- DeviceOrientationEventImpl.internal_() : super.internal_();
- get runtimeType => DeviceOrientationEvent;
- toString() => super.toString();
-}
-patch class DirectoryEntry {
- static Type get instanceRuntimeType => DirectoryEntryImpl;
-
-}
-class DirectoryEntryImpl extends DirectoryEntry implements js_library.JSObjectInterfacesDom {
- DirectoryEntryImpl.internal_() : super.internal_();
- get runtimeType => DirectoryEntry;
- toString() => super.toString();
-}
-patch class ShadowElement {
- static Type get instanceRuntimeType => ShadowElementImpl;
-
-}
-class ShadowElementImpl extends ShadowElement implements js_library.JSObjectInterfacesDom {
- ShadowElementImpl.internal_() : super.internal_();
- get runtimeType => ShadowElement;
- toString() => super.toString();
-}
-patch class AppBannerPromptResult {
- static Type get instanceRuntimeType => AppBannerPromptResultImpl;
-
-}
-class AppBannerPromptResultImpl extends AppBannerPromptResult implements js_library.JSObjectInterfacesDom {
- AppBannerPromptResultImpl.internal_() : super.internal_();
- get runtimeType => AppBannerPromptResult;
- toString() => super.toString();
-}
-patch class Blob {
- static Type get instanceRuntimeType => BlobImpl;
-
-}
-class BlobImpl extends Blob implements js_library.JSObjectInterfacesDom {
- BlobImpl.internal_() : super.internal_();
- get runtimeType => Blob;
- toString() => super.toString();
-}
-patch class VttCue {
- static Type get instanceRuntimeType => VttCueImpl;
-
-}
-class VttCueImpl extends VttCue implements js_library.JSObjectInterfacesDom {
- VttCueImpl.internal_() : super.internal_();
- get runtimeType => VttCue;
- toString() => super.toString();
-}
-patch class PopStateEvent {
- static Type get instanceRuntimeType => PopStateEventImpl;
-
-}
-class PopStateEventImpl extends PopStateEvent implements js_library.JSObjectInterfacesDom {
- PopStateEventImpl.internal_() : super.internal_();
- get runtimeType => PopStateEvent;
- toString() => super.toString();
-}
-patch class PushSubscription {
- static Type get instanceRuntimeType => PushSubscriptionImpl;
-
-}
-class PushSubscriptionImpl extends PushSubscription implements js_library.JSObjectInterfacesDom {
- PushSubscriptionImpl.internal_() : super.internal_();
- get runtimeType => PushSubscription;
- toString() => super.toString();
-}
-patch class UrlUtilsReadOnly {
- static Type get instanceRuntimeType => UrlUtilsReadOnlyImpl;
-
-}
-class UrlUtilsReadOnlyImpl extends UrlUtilsReadOnly implements js_library.JSObjectInterfacesDom {
- UrlUtilsReadOnlyImpl.internal_() : super.internal_();
- get runtimeType => UrlUtilsReadOnly;
- toString() => super.toString();
-}
-patch class MediaError {
- static Type get instanceRuntimeType => MediaErrorImpl;
-
-}
-class MediaErrorImpl extends MediaError implements js_library.JSObjectInterfacesDom {
- MediaErrorImpl.internal_() : super.internal_();
- get runtimeType => MediaError;
- toString() => super.toString();
-}
-patch class SourceBufferList {
- static Type get instanceRuntimeType => SourceBufferListImpl;
-
-}
-class SourceBufferListImpl extends SourceBufferList implements js_library.JSObjectInterfacesDom {
- SourceBufferListImpl.internal_() : super.internal_();
- get runtimeType => SourceBufferList;
- toString() => super.toString();
-}
-patch class AnimationEffectReadOnly {
- static Type get instanceRuntimeType => AnimationEffectReadOnlyImpl;
-
-}
-class AnimationEffectReadOnlyImpl extends AnimationEffectReadOnly implements js_library.JSObjectInterfacesDom {
- AnimationEffectReadOnlyImpl.internal_() : super.internal_();
- get runtimeType => AnimationEffectReadOnly;
- toString() => super.toString();
-}
-patch class PerformanceResourceTiming {
- static Type get instanceRuntimeType => PerformanceResourceTimingImpl;
-
-}
-class PerformanceResourceTimingImpl extends PerformanceResourceTiming implements js_library.JSObjectInterfacesDom {
- PerformanceResourceTimingImpl.internal_() : super.internal_();
- get runtimeType => PerformanceResourceTiming;
- toString() => super.toString();
-}
-patch class GeofencingRegion {
- static Type get instanceRuntimeType => GeofencingRegionImpl;
-
-}
-class GeofencingRegionImpl extends GeofencingRegion implements js_library.JSObjectInterfacesDom {
- GeofencingRegionImpl.internal_() : super.internal_();
- get runtimeType => GeofencingRegion;
+class CanvasRenderingContext2DImpl extends CanvasRenderingContext2D implements js_library.JSObjectInterfacesDom {
+ CanvasRenderingContext2DImpl.internal_() : super.internal_();
+ get runtimeType => CanvasRenderingContext2D;
toString() => super.toString();
}
patch class CharacterData {
@@ -3993,6 +366,204 @@
get runtimeType => CharacterData;
toString() => super.toString();
}
+patch class ChildNode {
+ static Type get instanceRuntimeType => ChildNodeImpl;
+
+}
+class ChildNodeImpl extends ChildNode implements js_library.JSObjectInterfacesDom {
+ ChildNodeImpl.internal_() : super.internal_();
+ get runtimeType => ChildNode;
+ toString() => super.toString();
+}
+patch class ChromiumValuebuffer {
+ static Type get instanceRuntimeType => ChromiumValuebufferImpl;
+
+}
+class ChromiumValuebufferImpl extends ChromiumValuebuffer implements js_library.JSObjectInterfacesDom {
+ ChromiumValuebufferImpl.internal_() : super.internal_();
+ get runtimeType => ChromiumValuebuffer;
+ toString() => super.toString();
+}
+patch class CircularGeofencingRegion {
+ static Type get instanceRuntimeType => CircularGeofencingRegionImpl;
+
+}
+class CircularGeofencingRegionImpl extends CircularGeofencingRegion implements js_library.JSObjectInterfacesDom {
+ CircularGeofencingRegionImpl.internal_() : super.internal_();
+ get runtimeType => CircularGeofencingRegion;
+ toString() => super.toString();
+}
+patch class Client {
+ static Type get instanceRuntimeType => ClientImpl;
+
+}
+class ClientImpl extends Client implements js_library.JSObjectInterfacesDom {
+ ClientImpl.internal_() : super.internal_();
+ get runtimeType => Client;
+ toString() => super.toString();
+}
+patch class Clients {
+ static Type get instanceRuntimeType => ClientsImpl;
+
+}
+class ClientsImpl extends Clients implements js_library.JSObjectInterfacesDom {
+ ClientsImpl.internal_() : super.internal_();
+ get runtimeType => Clients;
+ toString() => super.toString();
+}
+patch class ClipboardEvent {
+ static Type get instanceRuntimeType => ClipboardEventImpl;
+
+}
+class ClipboardEventImpl extends ClipboardEvent implements js_library.JSObjectInterfacesDom {
+ ClipboardEventImpl.internal_() : super.internal_();
+ get runtimeType => ClipboardEvent;
+ toString() => super.toString();
+}
+patch class CloseEvent {
+ static Type get instanceRuntimeType => CloseEventImpl;
+
+}
+class CloseEventImpl extends CloseEvent implements js_library.JSObjectInterfacesDom {
+ CloseEventImpl.internal_() : super.internal_();
+ get runtimeType => CloseEvent;
+ toString() => super.toString();
+}
+patch class Comment {
+ static Type get instanceRuntimeType => CommentImpl;
+
+}
+class CommentImpl extends Comment implements js_library.JSObjectInterfacesDom {
+ CommentImpl.internal_() : super.internal_();
+ get runtimeType => Comment;
+ toString() => super.toString();
+}
+patch class CompositionEvent {
+ static Type get instanceRuntimeType => CompositionEventImpl;
+
+}
+class CompositionEventImpl extends CompositionEvent implements js_library.JSObjectInterfacesDom {
+ CompositionEventImpl.internal_() : super.internal_();
+ get runtimeType => CompositionEvent;
+ toString() => super.toString();
+}
+patch class CompositorProxy {
+ static Type get instanceRuntimeType => CompositorProxyImpl;
+
+}
+class CompositorProxyImpl extends CompositorProxy implements js_library.JSObjectInterfacesDom {
+ CompositorProxyImpl.internal_() : super.internal_();
+ get runtimeType => CompositorProxy;
+ toString() => super.toString();
+}
+patch class CompositorWorker {
+ static Type get instanceRuntimeType => CompositorWorkerImpl;
+
+}
+class CompositorWorkerImpl extends CompositorWorker implements js_library.JSObjectInterfacesDom {
+ CompositorWorkerImpl.internal_() : super.internal_();
+ get runtimeType => CompositorWorker;
+ toString() => super.toString();
+}
+patch class CompositorWorkerGlobalScope {
+ static Type get instanceRuntimeType => CompositorWorkerGlobalScopeImpl;
+
+}
+class CompositorWorkerGlobalScopeImpl extends CompositorWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+ CompositorWorkerGlobalScopeImpl.internal_() : super.internal_();
+ get runtimeType => CompositorWorkerGlobalScope;
+ toString() => super.toString();
+}
+patch class Console {
+ static Type get instanceRuntimeType => ConsoleImpl;
+
+}
+class ConsoleImpl extends Console implements js_library.JSObjectInterfacesDom {
+ ConsoleImpl.internal_() : super.internal_();
+ get runtimeType => Console;
+ toString() => super.toString();
+}
+patch class ConsoleBase {
+ static Type get instanceRuntimeType => ConsoleBaseImpl;
+
+}
+class ConsoleBaseImpl extends ConsoleBase implements js_library.JSObjectInterfacesDom {
+ ConsoleBaseImpl.internal_() : super.internal_();
+ get runtimeType => ConsoleBase;
+ toString() => super.toString();
+}
+patch class ContentElement {
+ static Type get instanceRuntimeType => ContentElementImpl;
+
+}
+class ContentElementImpl extends ContentElement implements js_library.JSObjectInterfacesDom {
+ ContentElementImpl.internal_() : super.internal_();
+ get runtimeType => ContentElement;
+ toString() => super.toString();
+}
+patch class Coordinates {
+ static Type get instanceRuntimeType => CoordinatesImpl;
+
+}
+class CoordinatesImpl extends Coordinates implements js_library.JSObjectInterfacesDom {
+ CoordinatesImpl.internal_() : super.internal_();
+ get runtimeType => Coordinates;
+ toString() => super.toString();
+}
+patch class Credential {
+ static Type get instanceRuntimeType => CredentialImpl;
+
+}
+class CredentialImpl extends Credential implements js_library.JSObjectInterfacesDom {
+ CredentialImpl.internal_() : super.internal_();
+ get runtimeType => Credential;
+ toString() => super.toString();
+}
+patch class CredentialsContainer {
+ static Type get instanceRuntimeType => CredentialsContainerImpl;
+
+}
+class CredentialsContainerImpl extends CredentialsContainer implements js_library.JSObjectInterfacesDom {
+ CredentialsContainerImpl.internal_() : super.internal_();
+ get runtimeType => CredentialsContainer;
+ toString() => super.toString();
+}
+patch class CrossOriginConnectEvent {
+ static Type get instanceRuntimeType => CrossOriginConnectEventImpl;
+
+}
+class CrossOriginConnectEventImpl extends CrossOriginConnectEvent implements js_library.JSObjectInterfacesDom {
+ CrossOriginConnectEventImpl.internal_() : super.internal_();
+ get runtimeType => CrossOriginConnectEvent;
+ toString() => super.toString();
+}
+patch class CrossOriginServiceWorkerClient {
+ static Type get instanceRuntimeType => CrossOriginServiceWorkerClientImpl;
+
+}
+class CrossOriginServiceWorkerClientImpl extends CrossOriginServiceWorkerClient implements js_library.JSObjectInterfacesDom {
+ CrossOriginServiceWorkerClientImpl.internal_() : super.internal_();
+ get runtimeType => CrossOriginServiceWorkerClient;
+ toString() => super.toString();
+}
+patch class Crypto {
+ static Type get instanceRuntimeType => CryptoImpl;
+
+}
+class CryptoImpl extends Crypto implements js_library.JSObjectInterfacesDom {
+ CryptoImpl.internal_() : super.internal_();
+ get runtimeType => Crypto;
+ toString() => super.toString();
+}
+patch class CryptoKey {
+ static Type get instanceRuntimeType => CryptoKeyImpl;
+
+}
+class CryptoKeyImpl extends CryptoKey implements js_library.JSObjectInterfacesDom {
+ CryptoKeyImpl.internal_() : super.internal_();
+ get runtimeType => CryptoKey;
+ toString() => super.toString();
+}
patch class Css {
static Type get instanceRuntimeType => CssImpl;
@@ -4002,22 +573,526 @@
get runtimeType => Css;
toString() => super.toString();
}
-patch class MidiInput {
- static Type get instanceRuntimeType => MidiInputImpl;
+patch class CssCharsetRule {
+ static Type get instanceRuntimeType => CssCharsetRuleImpl;
}
-class MidiInputImpl extends MidiInput implements js_library.JSObjectInterfacesDom {
- MidiInputImpl.internal_() : super.internal_();
- get runtimeType => MidiInput;
+class CssCharsetRuleImpl extends CssCharsetRule implements js_library.JSObjectInterfacesDom {
+ CssCharsetRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssCharsetRule;
toString() => super.toString();
}
-patch class ServicePortConnectEvent {
- static Type get instanceRuntimeType => ServicePortConnectEventImpl;
+patch class CssFontFaceRule {
+ static Type get instanceRuntimeType => CssFontFaceRuleImpl;
}
-class ServicePortConnectEventImpl extends ServicePortConnectEvent implements js_library.JSObjectInterfacesDom {
- ServicePortConnectEventImpl.internal_() : super.internal_();
- get runtimeType => ServicePortConnectEvent;
+class CssFontFaceRuleImpl extends CssFontFaceRule implements js_library.JSObjectInterfacesDom {
+ CssFontFaceRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssFontFaceRule;
+ toString() => super.toString();
+}
+patch class CssGroupingRule {
+ static Type get instanceRuntimeType => CssGroupingRuleImpl;
+
+}
+class CssGroupingRuleImpl extends CssGroupingRule implements js_library.JSObjectInterfacesDom {
+ CssGroupingRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssGroupingRule;
+ toString() => super.toString();
+}
+patch class CssImportRule {
+ static Type get instanceRuntimeType => CssImportRuleImpl;
+
+}
+class CssImportRuleImpl extends CssImportRule implements js_library.JSObjectInterfacesDom {
+ CssImportRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssImportRule;
+ toString() => super.toString();
+}
+patch class CssKeyframeRule {
+ static Type get instanceRuntimeType => CssKeyframeRuleImpl;
+
+}
+class CssKeyframeRuleImpl extends CssKeyframeRule implements js_library.JSObjectInterfacesDom {
+ CssKeyframeRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssKeyframeRule;
+ toString() => super.toString();
+}
+patch class CssKeyframesRule {
+ static Type get instanceRuntimeType => CssKeyframesRuleImpl;
+
+}
+class CssKeyframesRuleImpl extends CssKeyframesRule implements js_library.JSObjectInterfacesDom {
+ CssKeyframesRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssKeyframesRule;
+ toString() => super.toString();
+}
+patch class CssMediaRule {
+ static Type get instanceRuntimeType => CssMediaRuleImpl;
+
+}
+class CssMediaRuleImpl extends CssMediaRule implements js_library.JSObjectInterfacesDom {
+ CssMediaRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssMediaRule;
+ toString() => super.toString();
+}
+patch class CssPageRule {
+ static Type get instanceRuntimeType => CssPageRuleImpl;
+
+}
+class CssPageRuleImpl extends CssPageRule implements js_library.JSObjectInterfacesDom {
+ CssPageRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssPageRule;
+ toString() => super.toString();
+}
+patch class CssRule {
+ static Type get instanceRuntimeType => CssRuleImpl;
+
+}
+class CssRuleImpl extends CssRule implements js_library.JSObjectInterfacesDom {
+ CssRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssRule;
+ toString() => super.toString();
+}
+patch class CssStyleDeclaration {
+ static Type get instanceRuntimeType => CssStyleDeclarationImpl;
+
+}
+class CssStyleDeclarationImpl extends CssStyleDeclaration implements js_library.JSObjectInterfacesDom {
+ CssStyleDeclarationImpl.internal_() : super.internal_();
+ get runtimeType => CssStyleDeclaration;
+ toString() => super.toString();
+}
+patch class CssStyleRule {
+ static Type get instanceRuntimeType => CssStyleRuleImpl;
+
+}
+class CssStyleRuleImpl extends CssStyleRule implements js_library.JSObjectInterfacesDom {
+ CssStyleRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssStyleRule;
+ toString() => super.toString();
+}
+patch class CssStyleSheet {
+ static Type get instanceRuntimeType => CssStyleSheetImpl;
+
+}
+class CssStyleSheetImpl extends CssStyleSheet implements js_library.JSObjectInterfacesDom {
+ CssStyleSheetImpl.internal_() : super.internal_();
+ get runtimeType => CssStyleSheet;
+ toString() => super.toString();
+}
+patch class CssSupportsRule {
+ static Type get instanceRuntimeType => CssSupportsRuleImpl;
+
+}
+class CssSupportsRuleImpl extends CssSupportsRule implements js_library.JSObjectInterfacesDom {
+ CssSupportsRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssSupportsRule;
+ toString() => super.toString();
+}
+patch class CssViewportRule {
+ static Type get instanceRuntimeType => CssViewportRuleImpl;
+
+}
+class CssViewportRuleImpl extends CssViewportRule implements js_library.JSObjectInterfacesDom {
+ CssViewportRuleImpl.internal_() : super.internal_();
+ get runtimeType => CssViewportRule;
+ toString() => super.toString();
+}
+patch class CustomEvent {
+ static Type get instanceRuntimeType => CustomEventImpl;
+
+}
+class CustomEventImpl extends CustomEvent implements js_library.JSObjectInterfacesDom {
+ CustomEventImpl.internal_() : super.internal_();
+ get runtimeType => CustomEvent;
+ toString() => super.toString();
+}
+patch class DListElement {
+ static Type get instanceRuntimeType => DListElementImpl;
+
+}
+class DListElementImpl extends DListElement implements js_library.JSObjectInterfacesDom {
+ DListElementImpl.internal_() : super.internal_();
+ get runtimeType => DListElement;
+ toString() => super.toString();
+}
+patch class DataListElement {
+ static Type get instanceRuntimeType => DataListElementImpl;
+
+}
+class DataListElementImpl extends DataListElement implements js_library.JSObjectInterfacesDom {
+ DataListElementImpl.internal_() : super.internal_();
+ get runtimeType => DataListElement;
+ toString() => super.toString();
+}
+patch class DataTransfer {
+ static Type get instanceRuntimeType => DataTransferImpl;
+
+}
+class DataTransferImpl extends DataTransfer implements js_library.JSObjectInterfacesDom {
+ DataTransferImpl.internal_() : super.internal_();
+ get runtimeType => DataTransfer;
+ toString() => super.toString();
+}
+patch class DataTransferItem {
+ static Type get instanceRuntimeType => DataTransferItemImpl;
+
+}
+class DataTransferItemImpl extends DataTransferItem implements js_library.JSObjectInterfacesDom {
+ DataTransferItemImpl.internal_() : super.internal_();
+ get runtimeType => DataTransferItem;
+ toString() => super.toString();
+}
+patch class DataTransferItemList {
+ static Type get instanceRuntimeType => DataTransferItemListImpl;
+
+}
+class DataTransferItemListImpl extends DataTransferItemList implements js_library.JSObjectInterfacesDom {
+ DataTransferItemListImpl.internal_() : super.internal_();
+ get runtimeType => DataTransferItemList;
+ toString() => super.toString();
+}
+patch class DedicatedWorkerGlobalScope {
+ static Type get instanceRuntimeType => DedicatedWorkerGlobalScopeImpl;
+
+}
+class DedicatedWorkerGlobalScopeImpl extends DedicatedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+ DedicatedWorkerGlobalScopeImpl.internal_() : super.internal_();
+ get runtimeType => DedicatedWorkerGlobalScope;
+ toString() => super.toString();
+}
+patch class DefaultSessionStartEvent {
+ static Type get instanceRuntimeType => DefaultSessionStartEventImpl;
+
+}
+class DefaultSessionStartEventImpl extends DefaultSessionStartEvent implements js_library.JSObjectInterfacesDom {
+ DefaultSessionStartEventImpl.internal_() : super.internal_();
+ get runtimeType => DefaultSessionStartEvent;
+ toString() => super.toString();
+}
+patch class DeprecatedStorageInfo {
+ static Type get instanceRuntimeType => DeprecatedStorageInfoImpl;
+
+}
+class DeprecatedStorageInfoImpl extends DeprecatedStorageInfo implements js_library.JSObjectInterfacesDom {
+ DeprecatedStorageInfoImpl.internal_() : super.internal_();
+ get runtimeType => DeprecatedStorageInfo;
+ toString() => super.toString();
+}
+patch class DeprecatedStorageQuota {
+ static Type get instanceRuntimeType => DeprecatedStorageQuotaImpl;
+
+}
+class DeprecatedStorageQuotaImpl extends DeprecatedStorageQuota implements js_library.JSObjectInterfacesDom {
+ DeprecatedStorageQuotaImpl.internal_() : super.internal_();
+ get runtimeType => DeprecatedStorageQuota;
+ toString() => super.toString();
+}
+patch class DetailsElement {
+ static Type get instanceRuntimeType => DetailsElementImpl;
+
+}
+class DetailsElementImpl extends DetailsElement implements js_library.JSObjectInterfacesDom {
+ DetailsElementImpl.internal_() : super.internal_();
+ get runtimeType => DetailsElement;
+ toString() => super.toString();
+}
+patch class DeviceAcceleration {
+ static Type get instanceRuntimeType => DeviceAccelerationImpl;
+
+}
+class DeviceAccelerationImpl extends DeviceAcceleration implements js_library.JSObjectInterfacesDom {
+ DeviceAccelerationImpl.internal_() : super.internal_();
+ get runtimeType => DeviceAcceleration;
+ toString() => super.toString();
+}
+patch class DeviceLightEvent {
+ static Type get instanceRuntimeType => DeviceLightEventImpl;
+
+}
+class DeviceLightEventImpl extends DeviceLightEvent implements js_library.JSObjectInterfacesDom {
+ DeviceLightEventImpl.internal_() : super.internal_();
+ get runtimeType => DeviceLightEvent;
+ toString() => super.toString();
+}
+patch class DeviceMotionEvent {
+ static Type get instanceRuntimeType => DeviceMotionEventImpl;
+
+}
+class DeviceMotionEventImpl extends DeviceMotionEvent implements js_library.JSObjectInterfacesDom {
+ DeviceMotionEventImpl.internal_() : super.internal_();
+ get runtimeType => DeviceMotionEvent;
+ toString() => super.toString();
+}
+patch class DeviceOrientationEvent {
+ static Type get instanceRuntimeType => DeviceOrientationEventImpl;
+
+}
+class DeviceOrientationEventImpl extends DeviceOrientationEvent implements js_library.JSObjectInterfacesDom {
+ DeviceOrientationEventImpl.internal_() : super.internal_();
+ get runtimeType => DeviceOrientationEvent;
+ toString() => super.toString();
+}
+patch class DeviceRotationRate {
+ static Type get instanceRuntimeType => DeviceRotationRateImpl;
+
+}
+class DeviceRotationRateImpl extends DeviceRotationRate implements js_library.JSObjectInterfacesDom {
+ DeviceRotationRateImpl.internal_() : super.internal_();
+ get runtimeType => DeviceRotationRate;
+ toString() => super.toString();
+}
+patch class DialogElement {
+ static Type get instanceRuntimeType => DialogElementImpl;
+
+}
+class DialogElementImpl extends DialogElement implements js_library.JSObjectInterfacesDom {
+ DialogElementImpl.internal_() : super.internal_();
+ get runtimeType => DialogElement;
+ toString() => super.toString();
+}
+patch class DirectoryEntry {
+ static Type get instanceRuntimeType => DirectoryEntryImpl;
+
+}
+class DirectoryEntryImpl extends DirectoryEntry implements js_library.JSObjectInterfacesDom {
+ DirectoryEntryImpl.internal_() : super.internal_();
+ get runtimeType => DirectoryEntry;
+ toString() => super.toString();
+}
+patch class DirectoryReader {
+ static Type get instanceRuntimeType => DirectoryReaderImpl;
+
+}
+class DirectoryReaderImpl extends DirectoryReader implements js_library.JSObjectInterfacesDom {
+ DirectoryReaderImpl.internal_() : super.internal_();
+ get runtimeType => DirectoryReader;
+ toString() => super.toString();
+}
+patch class DivElement {
+ static Type get instanceRuntimeType => DivElementImpl;
+
+}
+class DivElementImpl extends DivElement implements js_library.JSObjectInterfacesDom {
+ DivElementImpl.internal_() : super.internal_();
+ get runtimeType => DivElement;
+ toString() => super.toString();
+}
+patch class Document {
+ static Type get instanceRuntimeType => DocumentImpl;
+
+}
+class DocumentImpl extends Document implements js_library.JSObjectInterfacesDom {
+ DocumentImpl.internal_() : super.internal_();
+ get runtimeType => Document;
+ toString() => super.toString();
+}
+patch class DocumentFragment {
+ static Type get instanceRuntimeType => DocumentFragmentImpl;
+
+}
+class DocumentFragmentImpl extends DocumentFragment implements js_library.JSObjectInterfacesDom {
+ DocumentFragmentImpl.internal_() : super.internal_();
+ get runtimeType => DocumentFragment;
+ toString() => super.toString();
+}
+patch class DomError {
+ static Type get instanceRuntimeType => DomErrorImpl;
+
+}
+class DomErrorImpl extends DomError implements js_library.JSObjectInterfacesDom {
+ DomErrorImpl.internal_() : super.internal_();
+ get runtimeType => DomError;
+ toString() => super.toString();
+}
+patch class DomException {
+ static Type get instanceRuntimeType => DomExceptionImpl;
+
+}
+class DomExceptionImpl extends DomException implements js_library.JSObjectInterfacesDom {
+ DomExceptionImpl.internal_() : super.internal_();
+ get runtimeType => DomException;
+ toString() => super.toString();
+}
+patch class DomImplementation {
+ static Type get instanceRuntimeType => DomImplementationImpl;
+
+}
+class DomImplementationImpl extends DomImplementation implements js_library.JSObjectInterfacesDom {
+ DomImplementationImpl.internal_() : super.internal_();
+ get runtimeType => DomImplementation;
+ toString() => super.toString();
+}
+patch class DomIterator {
+ static Type get instanceRuntimeType => DomIteratorImpl;
+
+}
+class DomIteratorImpl extends DomIterator implements js_library.JSObjectInterfacesDom {
+ DomIteratorImpl.internal_() : super.internal_();
+ get runtimeType => DomIterator;
+ toString() => super.toString();
+}
+patch class DomMatrix {
+ static Type get instanceRuntimeType => DomMatrixImpl;
+
+}
+class DomMatrixImpl extends DomMatrix implements js_library.JSObjectInterfacesDom {
+ DomMatrixImpl.internal_() : super.internal_();
+ get runtimeType => DomMatrix;
+ toString() => super.toString();
+}
+patch class DomMatrixReadOnly {
+ static Type get instanceRuntimeType => DomMatrixReadOnlyImpl;
+
+}
+class DomMatrixReadOnlyImpl extends DomMatrixReadOnly implements js_library.JSObjectInterfacesDom {
+ DomMatrixReadOnlyImpl.internal_() : super.internal_();
+ get runtimeType => DomMatrixReadOnly;
+ toString() => super.toString();
+}
+patch class DomParser {
+ static Type get instanceRuntimeType => DomParserImpl;
+
+}
+class DomParserImpl extends DomParser implements js_library.JSObjectInterfacesDom {
+ DomParserImpl.internal_() : super.internal_();
+ get runtimeType => DomParser;
+ toString() => super.toString();
+}
+patch class DomPoint {
+ static Type get instanceRuntimeType => DomPointImpl;
+
+}
+class DomPointImpl extends DomPoint implements js_library.JSObjectInterfacesDom {
+ DomPointImpl.internal_() : super.internal_();
+ get runtimeType => DomPoint;
+ toString() => super.toString();
+}
+patch class DomPointReadOnly {
+ static Type get instanceRuntimeType => DomPointReadOnlyImpl;
+
+}
+class DomPointReadOnlyImpl extends DomPointReadOnly implements js_library.JSObjectInterfacesDom {
+ DomPointReadOnlyImpl.internal_() : super.internal_();
+ get runtimeType => DomPointReadOnly;
+ toString() => super.toString();
+}
+patch class DomRectReadOnly {
+ static Type get instanceRuntimeType => DomRectReadOnlyImpl;
+
+}
+class DomRectReadOnlyImpl extends DomRectReadOnly implements js_library.JSObjectInterfacesDom {
+ DomRectReadOnlyImpl.internal_() : super.internal_();
+ get runtimeType => DomRectReadOnly;
+ toString() => super.toString();
+}
+patch class DomSettableTokenList {
+ static Type get instanceRuntimeType => DomSettableTokenListImpl;
+
+}
+class DomSettableTokenListImpl extends DomSettableTokenList implements js_library.JSObjectInterfacesDom {
+ DomSettableTokenListImpl.internal_() : super.internal_();
+ get runtimeType => DomSettableTokenList;
+ toString() => super.toString();
+}
+patch class DomStringList {
+ static Type get instanceRuntimeType => DomStringListImpl;
+
+}
+class DomStringListImpl extends DomStringList implements js_library.JSObjectInterfacesDom {
+ DomStringListImpl.internal_() : super.internal_();
+ get runtimeType => DomStringList;
+ toString() => super.toString();
+}
+patch class DomStringMap {
+ static Type get instanceRuntimeType => DomStringMapImpl;
+
+}
+class DomStringMapImpl extends DomStringMap implements js_library.JSObjectInterfacesDom {
+ DomStringMapImpl.internal_() : super.internal_();
+ get runtimeType => DomStringMap;
+ toString() => super.toString();
+}
+patch class DomTokenList {
+ static Type get instanceRuntimeType => DomTokenListImpl;
+
+}
+class DomTokenListImpl extends DomTokenList implements js_library.JSObjectInterfacesDom {
+ DomTokenListImpl.internal_() : super.internal_();
+ get runtimeType => DomTokenList;
+ toString() => super.toString();
+}
+patch class EffectModel {
+ static Type get instanceRuntimeType => EffectModelImpl;
+
+}
+class EffectModelImpl extends EffectModel implements js_library.JSObjectInterfacesDom {
+ EffectModelImpl.internal_() : super.internal_();
+ get runtimeType => EffectModel;
+ toString() => super.toString();
+}
+patch class Element {
+ static Type get instanceRuntimeType => ElementImpl;
+
+}
+class ElementImpl extends Element implements js_library.JSObjectInterfacesDom {
+ ElementImpl.internal_() : super.internal_();
+ get runtimeType => Element;
+ toString() => super.toString();
+}
+patch class EmbedElement {
+ static Type get instanceRuntimeType => EmbedElementImpl;
+
+}
+class EmbedElementImpl extends EmbedElement implements js_library.JSObjectInterfacesDom {
+ EmbedElementImpl.internal_() : super.internal_();
+ get runtimeType => EmbedElement;
+ toString() => super.toString();
+}
+patch class Entry {
+ static Type get instanceRuntimeType => EntryImpl;
+
+}
+class EntryImpl extends Entry implements js_library.JSObjectInterfacesDom {
+ EntryImpl.internal_() : super.internal_();
+ get runtimeType => Entry;
+ toString() => super.toString();
+}
+patch class ErrorEvent {
+ static Type get instanceRuntimeType => ErrorEventImpl;
+
+}
+class ErrorEventImpl extends ErrorEvent implements js_library.JSObjectInterfacesDom {
+ ErrorEventImpl.internal_() : super.internal_();
+ get runtimeType => ErrorEvent;
+ toString() => super.toString();
+}
+patch class Event {
+ static Type get instanceRuntimeType => EventImpl;
+
+}
+class EventImpl extends Event implements js_library.JSObjectInterfacesDom {
+ EventImpl.internal_() : super.internal_();
+ get runtimeType => Event;
+ toString() => super.toString();
+}
+patch class EventSource {
+ static Type get instanceRuntimeType => EventSourceImpl;
+
+}
+class EventSourceImpl extends EventSource implements js_library.JSObjectInterfacesDom {
+ EventSourceImpl.internal_() : super.internal_();
+ get runtimeType => EventSource;
+ toString() => super.toString();
+}
+patch class EventTarget {
+ static Type get instanceRuntimeType => EventTargetImpl;
+
+}
+class EventTargetImpl extends EventTarget implements js_library.JSObjectInterfacesDom {
+ EventTargetImpl.internal_() : super.internal_();
+ get runtimeType => EventTarget;
toString() => super.toString();
}
patch class ExtendableEvent {
@@ -4029,6 +1104,699 @@
get runtimeType => ExtendableEvent;
toString() => super.toString();
}
+patch class FederatedCredential {
+ static Type get instanceRuntimeType => FederatedCredentialImpl;
+
+}
+class FederatedCredentialImpl extends FederatedCredential implements js_library.JSObjectInterfacesDom {
+ FederatedCredentialImpl.internal_() : super.internal_();
+ get runtimeType => FederatedCredential;
+ toString() => super.toString();
+}
+patch class FetchEvent {
+ static Type get instanceRuntimeType => FetchEventImpl;
+
+}
+class FetchEventImpl extends FetchEvent implements js_library.JSObjectInterfacesDom {
+ FetchEventImpl.internal_() : super.internal_();
+ get runtimeType => FetchEvent;
+ toString() => super.toString();
+}
+patch class FieldSetElement {
+ static Type get instanceRuntimeType => FieldSetElementImpl;
+
+}
+class FieldSetElementImpl extends FieldSetElement implements js_library.JSObjectInterfacesDom {
+ FieldSetElementImpl.internal_() : super.internal_();
+ get runtimeType => FieldSetElement;
+ toString() => super.toString();
+}
+patch class File {
+ static Type get instanceRuntimeType => FileImpl;
+
+}
+class FileImpl extends File implements js_library.JSObjectInterfacesDom {
+ FileImpl.internal_() : super.internal_();
+ get runtimeType => File;
+ toString() => super.toString();
+}
+patch class FileEntry {
+ static Type get instanceRuntimeType => FileEntryImpl;
+
+}
+class FileEntryImpl extends FileEntry implements js_library.JSObjectInterfacesDom {
+ FileEntryImpl.internal_() : super.internal_();
+ get runtimeType => FileEntry;
+ toString() => super.toString();
+}
+patch class FileError {
+ static Type get instanceRuntimeType => FileErrorImpl;
+
+}
+class FileErrorImpl extends FileError implements js_library.JSObjectInterfacesDom {
+ FileErrorImpl.internal_() : super.internal_();
+ get runtimeType => FileError;
+ toString() => super.toString();
+}
+patch class FileList {
+ static Type get instanceRuntimeType => FileListImpl;
+
+}
+class FileListImpl extends FileList implements js_library.JSObjectInterfacesDom {
+ FileListImpl.internal_() : super.internal_();
+ get runtimeType => FileList;
+ toString() => super.toString();
+}
+patch class FileReader {
+ static Type get instanceRuntimeType => FileReaderImpl;
+
+}
+class FileReaderImpl extends FileReader implements js_library.JSObjectInterfacesDom {
+ FileReaderImpl.internal_() : super.internal_();
+ get runtimeType => FileReader;
+ toString() => super.toString();
+}
+patch class FileStream {
+ static Type get instanceRuntimeType => FileStreamImpl;
+
+}
+class FileStreamImpl extends FileStream implements js_library.JSObjectInterfacesDom {
+ FileStreamImpl.internal_() : super.internal_();
+ get runtimeType => FileStream;
+ toString() => super.toString();
+}
+patch class FileSystem {
+ static Type get instanceRuntimeType => FileSystemImpl;
+
+}
+class FileSystemImpl extends FileSystem implements js_library.JSObjectInterfacesDom {
+ FileSystemImpl.internal_() : super.internal_();
+ get runtimeType => FileSystem;
+ toString() => super.toString();
+}
+patch class FileWriter {
+ static Type get instanceRuntimeType => FileWriterImpl;
+
+}
+class FileWriterImpl extends FileWriter implements js_library.JSObjectInterfacesDom {
+ FileWriterImpl.internal_() : super.internal_();
+ get runtimeType => FileWriter;
+ toString() => super.toString();
+}
+patch class FocusEvent {
+ static Type get instanceRuntimeType => FocusEventImpl;
+
+}
+class FocusEventImpl extends FocusEvent implements js_library.JSObjectInterfacesDom {
+ FocusEventImpl.internal_() : super.internal_();
+ get runtimeType => FocusEvent;
+ toString() => super.toString();
+}
+patch class FontFace {
+ static Type get instanceRuntimeType => FontFaceImpl;
+
+}
+class FontFaceImpl extends FontFace implements js_library.JSObjectInterfacesDom {
+ FontFaceImpl.internal_() : super.internal_();
+ get runtimeType => FontFace;
+ toString() => super.toString();
+}
+patch class FontFaceSet {
+ static Type get instanceRuntimeType => FontFaceSetImpl;
+
+}
+class FontFaceSetImpl extends FontFaceSet implements js_library.JSObjectInterfacesDom {
+ FontFaceSetImpl.internal_() : super.internal_();
+ get runtimeType => FontFaceSet;
+ toString() => super.toString();
+}
+patch class FontFaceSetLoadEvent {
+ static Type get instanceRuntimeType => FontFaceSetLoadEventImpl;
+
+}
+class FontFaceSetLoadEventImpl extends FontFaceSetLoadEvent implements js_library.JSObjectInterfacesDom {
+ FontFaceSetLoadEventImpl.internal_() : super.internal_();
+ get runtimeType => FontFaceSetLoadEvent;
+ toString() => super.toString();
+}
+patch class FormData {
+ static Type get instanceRuntimeType => FormDataImpl;
+
+}
+class FormDataImpl extends FormData implements js_library.JSObjectInterfacesDom {
+ FormDataImpl.internal_() : super.internal_();
+ get runtimeType => FormData;
+ toString() => super.toString();
+}
+patch class FormElement {
+ static Type get instanceRuntimeType => FormElementImpl;
+
+}
+class FormElementImpl extends FormElement implements js_library.JSObjectInterfacesDom {
+ FormElementImpl.internal_() : super.internal_();
+ get runtimeType => FormElement;
+ toString() => super.toString();
+}
+patch class Gamepad {
+ static Type get instanceRuntimeType => GamepadImpl;
+
+}
+class GamepadImpl extends Gamepad implements js_library.JSObjectInterfacesDom {
+ GamepadImpl.internal_() : super.internal_();
+ get runtimeType => Gamepad;
+ toString() => super.toString();
+}
+patch class GamepadButton {
+ static Type get instanceRuntimeType => GamepadButtonImpl;
+
+}
+class GamepadButtonImpl extends GamepadButton implements js_library.JSObjectInterfacesDom {
+ GamepadButtonImpl.internal_() : super.internal_();
+ get runtimeType => GamepadButton;
+ toString() => super.toString();
+}
+patch class GamepadEvent {
+ static Type get instanceRuntimeType => GamepadEventImpl;
+
+}
+class GamepadEventImpl extends GamepadEvent implements js_library.JSObjectInterfacesDom {
+ GamepadEventImpl.internal_() : super.internal_();
+ get runtimeType => GamepadEvent;
+ toString() => super.toString();
+}
+patch class Geofencing {
+ static Type get instanceRuntimeType => GeofencingImpl;
+
+}
+class GeofencingImpl extends Geofencing implements js_library.JSObjectInterfacesDom {
+ GeofencingImpl.internal_() : super.internal_();
+ get runtimeType => Geofencing;
+ toString() => super.toString();
+}
+patch class GeofencingEvent {
+ static Type get instanceRuntimeType => GeofencingEventImpl;
+
+}
+class GeofencingEventImpl extends GeofencingEvent implements js_library.JSObjectInterfacesDom {
+ GeofencingEventImpl.internal_() : super.internal_();
+ get runtimeType => GeofencingEvent;
+ toString() => super.toString();
+}
+patch class GeofencingRegion {
+ static Type get instanceRuntimeType => GeofencingRegionImpl;
+
+}
+class GeofencingRegionImpl extends GeofencingRegion implements js_library.JSObjectInterfacesDom {
+ GeofencingRegionImpl.internal_() : super.internal_();
+ get runtimeType => GeofencingRegion;
+ toString() => super.toString();
+}
+patch class Geolocation {
+ static Type get instanceRuntimeType => GeolocationImpl;
+
+}
+class GeolocationImpl extends Geolocation implements js_library.JSObjectInterfacesDom {
+ GeolocationImpl.internal_() : super.internal_();
+ get runtimeType => Geolocation;
+ toString() => super.toString();
+}
+patch class Geoposition {
+ static Type get instanceRuntimeType => GeopositionImpl;
+
+}
+class GeopositionImpl extends Geoposition implements js_library.JSObjectInterfacesDom {
+ GeopositionImpl.internal_() : super.internal_();
+ get runtimeType => Geoposition;
+ toString() => super.toString();
+}
+patch class GlobalEventHandlers {
+ static Type get instanceRuntimeType => GlobalEventHandlersImpl;
+
+}
+class GlobalEventHandlersImpl extends GlobalEventHandlers implements js_library.JSObjectInterfacesDom {
+ GlobalEventHandlersImpl.internal_() : super.internal_();
+ get runtimeType => GlobalEventHandlers;
+ toString() => super.toString();
+}
+patch class HRElement {
+ static Type get instanceRuntimeType => HRElementImpl;
+
+}
+class HRElementImpl extends HRElement implements js_library.JSObjectInterfacesDom {
+ HRElementImpl.internal_() : super.internal_();
+ get runtimeType => HRElement;
+ toString() => super.toString();
+}
+patch class HashChangeEvent {
+ static Type get instanceRuntimeType => HashChangeEventImpl;
+
+}
+class HashChangeEventImpl extends HashChangeEvent implements js_library.JSObjectInterfacesDom {
+ HashChangeEventImpl.internal_() : super.internal_();
+ get runtimeType => HashChangeEvent;
+ toString() => super.toString();
+}
+patch class HeadElement {
+ static Type get instanceRuntimeType => HeadElementImpl;
+
+}
+class HeadElementImpl extends HeadElement implements js_library.JSObjectInterfacesDom {
+ HeadElementImpl.internal_() : super.internal_();
+ get runtimeType => HeadElement;
+ toString() => super.toString();
+}
+patch class Headers {
+ static Type get instanceRuntimeType => HeadersImpl;
+
+}
+class HeadersImpl extends Headers implements js_library.JSObjectInterfacesDom {
+ HeadersImpl.internal_() : super.internal_();
+ get runtimeType => Headers;
+ toString() => super.toString();
+}
+patch class HeadingElement {
+ static Type get instanceRuntimeType => HeadingElementImpl;
+
+}
+class HeadingElementImpl extends HeadingElement implements js_library.JSObjectInterfacesDom {
+ HeadingElementImpl.internal_() : super.internal_();
+ get runtimeType => HeadingElement;
+ toString() => super.toString();
+}
+patch class History {
+ static Type get instanceRuntimeType => HistoryImpl;
+
+}
+class HistoryImpl extends History implements js_library.JSObjectInterfacesDom {
+ HistoryImpl.internal_() : super.internal_();
+ get runtimeType => History;
+ toString() => super.toString();
+}
+patch class HmdvrDevice {
+ static Type get instanceRuntimeType => HmdvrDeviceImpl;
+
+}
+class HmdvrDeviceImpl extends HmdvrDevice implements js_library.JSObjectInterfacesDom {
+ HmdvrDeviceImpl.internal_() : super.internal_();
+ get runtimeType => HmdvrDevice;
+ toString() => super.toString();
+}
+patch class HtmlCollection {
+ static Type get instanceRuntimeType => HtmlCollectionImpl;
+
+}
+class HtmlCollectionImpl extends HtmlCollection implements js_library.JSObjectInterfacesDom {
+ HtmlCollectionImpl.internal_() : super.internal_();
+ get runtimeType => HtmlCollection;
+ toString() => super.toString();
+}
+patch class HtmlDocument {
+ static Type get instanceRuntimeType => HtmlDocumentImpl;
+
+}
+class HtmlDocumentImpl extends HtmlDocument implements js_library.JSObjectInterfacesDom {
+ HtmlDocumentImpl.internal_() : super.internal_();
+ get runtimeType => HtmlDocument;
+ toString() => super.toString();
+}
+patch class HtmlElement {
+ static Type get instanceRuntimeType => HtmlElementImpl;
+
+}
+class HtmlElementImpl extends HtmlElement implements js_library.JSObjectInterfacesDom {
+ HtmlElementImpl.internal_() : super.internal_();
+ get runtimeType => HtmlElement;
+ toString() => super.toString();
+}
+patch class HtmlFormControlsCollection {
+ static Type get instanceRuntimeType => HtmlFormControlsCollectionImpl;
+
+}
+class HtmlFormControlsCollectionImpl extends HtmlFormControlsCollection implements js_library.JSObjectInterfacesDom {
+ HtmlFormControlsCollectionImpl.internal_() : super.internal_();
+ get runtimeType => HtmlFormControlsCollection;
+ toString() => super.toString();
+}
+patch class HtmlHtmlElement {
+ static Type get instanceRuntimeType => HtmlHtmlElementImpl;
+
+}
+class HtmlHtmlElementImpl extends HtmlHtmlElement implements js_library.JSObjectInterfacesDom {
+ HtmlHtmlElementImpl.internal_() : super.internal_();
+ get runtimeType => HtmlHtmlElement;
+ toString() => super.toString();
+}
+patch class HtmlOptionsCollection {
+ static Type get instanceRuntimeType => HtmlOptionsCollectionImpl;
+
+}
+class HtmlOptionsCollectionImpl extends HtmlOptionsCollection implements js_library.JSObjectInterfacesDom {
+ HtmlOptionsCollectionImpl.internal_() : super.internal_();
+ get runtimeType => HtmlOptionsCollection;
+ toString() => super.toString();
+}
+patch class HttpRequest {
+ static Type get instanceRuntimeType => HttpRequestImpl;
+
+}
+class HttpRequestImpl extends HttpRequest implements js_library.JSObjectInterfacesDom {
+ HttpRequestImpl.internal_() : super.internal_();
+ get runtimeType => HttpRequest;
+ toString() => super.toString();
+}
+patch class HttpRequestEventTarget {
+ static Type get instanceRuntimeType => HttpRequestEventTargetImpl;
+
+}
+class HttpRequestEventTargetImpl extends HttpRequestEventTarget implements js_library.JSObjectInterfacesDom {
+ HttpRequestEventTargetImpl.internal_() : super.internal_();
+ get runtimeType => HttpRequestEventTarget;
+ toString() => super.toString();
+}
+patch class HttpRequestUpload {
+ static Type get instanceRuntimeType => HttpRequestUploadImpl;
+
+}
+class HttpRequestUploadImpl extends HttpRequestUpload implements js_library.JSObjectInterfacesDom {
+ HttpRequestUploadImpl.internal_() : super.internal_();
+ get runtimeType => HttpRequestUpload;
+ toString() => super.toString();
+}
+patch class IFrameElement {
+ static Type get instanceRuntimeType => IFrameElementImpl;
+
+}
+class IFrameElementImpl extends IFrameElement implements js_library.JSObjectInterfacesDom {
+ IFrameElementImpl.internal_() : super.internal_();
+ get runtimeType => IFrameElement;
+ toString() => super.toString();
+}
+patch class ImageBitmap {
+ static Type get instanceRuntimeType => ImageBitmapImpl;
+
+}
+class ImageBitmapImpl extends ImageBitmap implements js_library.JSObjectInterfacesDom {
+ ImageBitmapImpl.internal_() : super.internal_();
+ get runtimeType => ImageBitmap;
+ toString() => super.toString();
+}
+patch class ImageData {
+ static Type get instanceRuntimeType => ImageDataImpl;
+
+}
+class ImageDataImpl extends ImageData implements js_library.JSObjectInterfacesDom {
+ ImageDataImpl.internal_() : super.internal_();
+ get runtimeType => ImageData;
+ toString() => super.toString();
+}
+patch class ImageElement {
+ static Type get instanceRuntimeType => ImageElementImpl;
+
+}
+class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
+ ImageElementImpl.internal_() : super.internal_();
+ get runtimeType => ImageElement;
+ toString() => super.toString();
+}
+patch class InjectedScriptHost {
+ static Type get instanceRuntimeType => InjectedScriptHostImpl;
+
+}
+class InjectedScriptHostImpl extends InjectedScriptHost implements js_library.JSObjectInterfacesDom {
+ InjectedScriptHostImpl.internal_() : super.internal_();
+ get runtimeType => InjectedScriptHost;
+ toString() => super.toString();
+}
+patch class InputDevice {
+ static Type get instanceRuntimeType => InputDeviceImpl;
+
+}
+class InputDeviceImpl extends InputDevice implements js_library.JSObjectInterfacesDom {
+ InputDeviceImpl.internal_() : super.internal_();
+ get runtimeType => InputDevice;
+ toString() => super.toString();
+}
+patch class InputElement {
+ static Type get instanceRuntimeType => InputElementImpl;
+
+}
+class InputElementImpl extends InputElement implements js_library.JSObjectInterfacesDom {
+ InputElementImpl.internal_() : super.internal_();
+ get runtimeType => InputElement;
+ toString() => super.toString();
+}
+patch class KeyboardEvent {
+ static Type get instanceRuntimeType => KeyboardEventImpl;
+
+}
+class KeyboardEventImpl extends KeyboardEvent implements js_library.JSObjectInterfacesDom {
+ KeyboardEventImpl.internal_() : super.internal_();
+ get runtimeType => KeyboardEvent;
+ toString() => super.toString();
+}
+patch class KeyframeEffect {
+ static Type get instanceRuntimeType => KeyframeEffectImpl;
+
+}
+class KeyframeEffectImpl extends KeyframeEffect implements js_library.JSObjectInterfacesDom {
+ KeyframeEffectImpl.internal_() : super.internal_();
+ get runtimeType => KeyframeEffect;
+ toString() => super.toString();
+}
+patch class KeygenElement {
+ static Type get instanceRuntimeType => KeygenElementImpl;
+
+}
+class KeygenElementImpl extends KeygenElement implements js_library.JSObjectInterfacesDom {
+ KeygenElementImpl.internal_() : super.internal_();
+ get runtimeType => KeygenElement;
+ toString() => super.toString();
+}
+patch class LIElement {
+ static Type get instanceRuntimeType => LIElementImpl;
+
+}
+class LIElementImpl extends LIElement implements js_library.JSObjectInterfacesDom {
+ LIElementImpl.internal_() : super.internal_();
+ get runtimeType => LIElement;
+ toString() => super.toString();
+}
+patch class LabelElement {
+ static Type get instanceRuntimeType => LabelElementImpl;
+
+}
+class LabelElementImpl extends LabelElement implements js_library.JSObjectInterfacesDom {
+ LabelElementImpl.internal_() : super.internal_();
+ get runtimeType => LabelElement;
+ toString() => super.toString();
+}
+patch class LegendElement {
+ static Type get instanceRuntimeType => LegendElementImpl;
+
+}
+class LegendElementImpl extends LegendElement implements js_library.JSObjectInterfacesDom {
+ LegendElementImpl.internal_() : super.internal_();
+ get runtimeType => LegendElement;
+ toString() => super.toString();
+}
+patch class LinkElement {
+ static Type get instanceRuntimeType => LinkElementImpl;
+
+}
+class LinkElementImpl extends LinkElement implements js_library.JSObjectInterfacesDom {
+ LinkElementImpl.internal_() : super.internal_();
+ get runtimeType => LinkElement;
+ toString() => super.toString();
+}
+patch class Location {
+ static Type get instanceRuntimeType => LocationImpl;
+
+}
+class LocationImpl extends Location implements js_library.JSObjectInterfacesDom {
+ LocationImpl.internal_() : super.internal_();
+ get runtimeType => Location;
+ toString() => super.toString();
+}
+patch class MapElement {
+ static Type get instanceRuntimeType => MapElementImpl;
+
+}
+class MapElementImpl extends MapElement implements js_library.JSObjectInterfacesDom {
+ MapElementImpl.internal_() : super.internal_();
+ get runtimeType => MapElement;
+ toString() => super.toString();
+}
+patch class MediaController {
+ static Type get instanceRuntimeType => MediaControllerImpl;
+
+}
+class MediaControllerImpl extends MediaController implements js_library.JSObjectInterfacesDom {
+ MediaControllerImpl.internal_() : super.internal_();
+ get runtimeType => MediaController;
+ toString() => super.toString();
+}
+patch class MediaDeviceInfo {
+ static Type get instanceRuntimeType => MediaDeviceInfoImpl;
+
+}
+class MediaDeviceInfoImpl extends MediaDeviceInfo implements js_library.JSObjectInterfacesDom {
+ MediaDeviceInfoImpl.internal_() : super.internal_();
+ get runtimeType => MediaDeviceInfo;
+ toString() => super.toString();
+}
+patch class MediaDevices {
+ static Type get instanceRuntimeType => MediaDevicesImpl;
+
+}
+class MediaDevicesImpl extends MediaDevices implements js_library.JSObjectInterfacesDom {
+ MediaDevicesImpl.internal_() : super.internal_();
+ get runtimeType => MediaDevices;
+ toString() => super.toString();
+}
+patch class MediaElement {
+ static Type get instanceRuntimeType => MediaElementImpl;
+
+}
+class MediaElementImpl extends MediaElement implements js_library.JSObjectInterfacesDom {
+ MediaElementImpl.internal_() : super.internal_();
+ get runtimeType => MediaElement;
+ toString() => super.toString();
+}
+patch class MediaEncryptedEvent {
+ static Type get instanceRuntimeType => MediaEncryptedEventImpl;
+
+}
+class MediaEncryptedEventImpl extends MediaEncryptedEvent implements js_library.JSObjectInterfacesDom {
+ MediaEncryptedEventImpl.internal_() : super.internal_();
+ get runtimeType => MediaEncryptedEvent;
+ toString() => super.toString();
+}
+patch class MediaError {
+ static Type get instanceRuntimeType => MediaErrorImpl;
+
+}
+class MediaErrorImpl extends MediaError implements js_library.JSObjectInterfacesDom {
+ MediaErrorImpl.internal_() : super.internal_();
+ get runtimeType => MediaError;
+ toString() => super.toString();
+}
+patch class MediaKeyError {
+ static Type get instanceRuntimeType => MediaKeyErrorImpl;
+
+}
+class MediaKeyErrorImpl extends MediaKeyError implements js_library.JSObjectInterfacesDom {
+ MediaKeyErrorImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeyError;
+ toString() => super.toString();
+}
+patch class MediaKeyEvent {
+ static Type get instanceRuntimeType => MediaKeyEventImpl;
+
+}
+class MediaKeyEventImpl extends MediaKeyEvent implements js_library.JSObjectInterfacesDom {
+ MediaKeyEventImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeyEvent;
+ toString() => super.toString();
+}
+patch class MediaKeyMessageEvent {
+ static Type get instanceRuntimeType => MediaKeyMessageEventImpl;
+
+}
+class MediaKeyMessageEventImpl extends MediaKeyMessageEvent implements js_library.JSObjectInterfacesDom {
+ MediaKeyMessageEventImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeyMessageEvent;
+ toString() => super.toString();
+}
+patch class MediaKeySession {
+ static Type get instanceRuntimeType => MediaKeySessionImpl;
+
+}
+class MediaKeySessionImpl extends MediaKeySession implements js_library.JSObjectInterfacesDom {
+ MediaKeySessionImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeySession;
+ toString() => super.toString();
+}
+patch class MediaKeyStatusMap {
+ static Type get instanceRuntimeType => MediaKeyStatusMapImpl;
+
+}
+class MediaKeyStatusMapImpl extends MediaKeyStatusMap implements js_library.JSObjectInterfacesDom {
+ MediaKeyStatusMapImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeyStatusMap;
+ toString() => super.toString();
+}
+patch class MediaKeySystemAccess {
+ static Type get instanceRuntimeType => MediaKeySystemAccessImpl;
+
+}
+class MediaKeySystemAccessImpl extends MediaKeySystemAccess implements js_library.JSObjectInterfacesDom {
+ MediaKeySystemAccessImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeySystemAccess;
+ toString() => super.toString();
+}
+patch class MediaKeys {
+ static Type get instanceRuntimeType => MediaKeysImpl;
+
+}
+class MediaKeysImpl extends MediaKeys implements js_library.JSObjectInterfacesDom {
+ MediaKeysImpl.internal_() : super.internal_();
+ get runtimeType => MediaKeys;
+ toString() => super.toString();
+}
+patch class MediaList {
+ static Type get instanceRuntimeType => MediaListImpl;
+
+}
+class MediaListImpl extends MediaList implements js_library.JSObjectInterfacesDom {
+ MediaListImpl.internal_() : super.internal_();
+ get runtimeType => MediaList;
+ toString() => super.toString();
+}
+patch class MediaQueryList {
+ static Type get instanceRuntimeType => MediaQueryListImpl;
+
+}
+class MediaQueryListImpl extends MediaQueryList implements js_library.JSObjectInterfacesDom {
+ MediaQueryListImpl.internal_() : super.internal_();
+ get runtimeType => MediaQueryList;
+ toString() => super.toString();
+}
+patch class MediaQueryListEvent {
+ static Type get instanceRuntimeType => MediaQueryListEventImpl;
+
+}
+class MediaQueryListEventImpl extends MediaQueryListEvent implements js_library.JSObjectInterfacesDom {
+ MediaQueryListEventImpl.internal_() : super.internal_();
+ get runtimeType => MediaQueryListEvent;
+ toString() => super.toString();
+}
+patch class MediaSession {
+ static Type get instanceRuntimeType => MediaSessionImpl;
+
+}
+class MediaSessionImpl extends MediaSession implements js_library.JSObjectInterfacesDom {
+ MediaSessionImpl.internal_() : super.internal_();
+ get runtimeType => MediaSession;
+ toString() => super.toString();
+}
+patch class MediaSource {
+ static Type get instanceRuntimeType => MediaSourceImpl;
+
+}
+class MediaSourceImpl extends MediaSource implements js_library.JSObjectInterfacesDom {
+ MediaSourceImpl.internal_() : super.internal_();
+ get runtimeType => MediaSource;
+ toString() => super.toString();
+}
+patch class MediaStream {
+ static Type get instanceRuntimeType => MediaStreamImpl;
+
+}
+class MediaStreamImpl extends MediaStream implements js_library.JSObjectInterfacesDom {
+ MediaStreamImpl.internal_() : super.internal_();
+ get runtimeType => MediaStream;
+ toString() => super.toString();
+}
patch class MediaStreamEvent {
static Type get instanceRuntimeType => MediaStreamEventImpl;
@@ -4038,6 +1806,1869 @@
get runtimeType => MediaStreamEvent;
toString() => super.toString();
}
+patch class MediaStreamTrack {
+ static Type get instanceRuntimeType => MediaStreamTrackImpl;
+
+}
+class MediaStreamTrackImpl extends MediaStreamTrack implements js_library.JSObjectInterfacesDom {
+ MediaStreamTrackImpl.internal_() : super.internal_();
+ get runtimeType => MediaStreamTrack;
+ toString() => super.toString();
+}
+patch class MediaStreamTrackEvent {
+ static Type get instanceRuntimeType => MediaStreamTrackEventImpl;
+
+}
+class MediaStreamTrackEventImpl extends MediaStreamTrackEvent implements js_library.JSObjectInterfacesDom {
+ MediaStreamTrackEventImpl.internal_() : super.internal_();
+ get runtimeType => MediaStreamTrackEvent;
+ toString() => super.toString();
+}
+patch class MemoryInfo {
+ static Type get instanceRuntimeType => MemoryInfoImpl;
+
+}
+class MemoryInfoImpl extends MemoryInfo implements js_library.JSObjectInterfacesDom {
+ MemoryInfoImpl.internal_() : super.internal_();
+ get runtimeType => MemoryInfo;
+ toString() => super.toString();
+}
+patch class MenuElement {
+ static Type get instanceRuntimeType => MenuElementImpl;
+
+}
+class MenuElementImpl extends MenuElement implements js_library.JSObjectInterfacesDom {
+ MenuElementImpl.internal_() : super.internal_();
+ get runtimeType => MenuElement;
+ toString() => super.toString();
+}
+patch class MenuItemElement {
+ static Type get instanceRuntimeType => MenuItemElementImpl;
+
+}
+class MenuItemElementImpl extends MenuItemElement implements js_library.JSObjectInterfacesDom {
+ MenuItemElementImpl.internal_() : super.internal_();
+ get runtimeType => MenuItemElement;
+ toString() => super.toString();
+}
+patch class MessageChannel {
+ static Type get instanceRuntimeType => MessageChannelImpl;
+
+}
+class MessageChannelImpl extends MessageChannel implements js_library.JSObjectInterfacesDom {
+ MessageChannelImpl.internal_() : super.internal_();
+ get runtimeType => MessageChannel;
+ toString() => super.toString();
+}
+patch class MessageEvent {
+ static Type get instanceRuntimeType => MessageEventImpl;
+
+}
+class MessageEventImpl extends MessageEvent implements js_library.JSObjectInterfacesDom {
+ MessageEventImpl.internal_() : super.internal_();
+ get runtimeType => MessageEvent;
+ toString() => super.toString();
+}
+patch class MessagePort {
+ static Type get instanceRuntimeType => MessagePortImpl;
+
+}
+class MessagePortImpl extends MessagePort implements js_library.JSObjectInterfacesDom {
+ MessagePortImpl.internal_() : super.internal_();
+ get runtimeType => MessagePort;
+ toString() => super.toString();
+}
+patch class MetaElement {
+ static Type get instanceRuntimeType => MetaElementImpl;
+
+}
+class MetaElementImpl extends MetaElement implements js_library.JSObjectInterfacesDom {
+ MetaElementImpl.internal_() : super.internal_();
+ get runtimeType => MetaElement;
+ toString() => super.toString();
+}
+patch class Metadata {
+ static Type get instanceRuntimeType => MetadataImpl;
+
+}
+class MetadataImpl extends Metadata implements js_library.JSObjectInterfacesDom {
+ MetadataImpl.internal_() : super.internal_();
+ get runtimeType => Metadata;
+ toString() => super.toString();
+}
+patch class MeterElement {
+ static Type get instanceRuntimeType => MeterElementImpl;
+
+}
+class MeterElementImpl extends MeterElement implements js_library.JSObjectInterfacesDom {
+ MeterElementImpl.internal_() : super.internal_();
+ get runtimeType => MeterElement;
+ toString() => super.toString();
+}
+patch class MidiAccess {
+ static Type get instanceRuntimeType => MidiAccessImpl;
+
+}
+class MidiAccessImpl extends MidiAccess implements js_library.JSObjectInterfacesDom {
+ MidiAccessImpl.internal_() : super.internal_();
+ get runtimeType => MidiAccess;
+ toString() => super.toString();
+}
+patch class MidiConnectionEvent {
+ static Type get instanceRuntimeType => MidiConnectionEventImpl;
+
+}
+class MidiConnectionEventImpl extends MidiConnectionEvent implements js_library.JSObjectInterfacesDom {
+ MidiConnectionEventImpl.internal_() : super.internal_();
+ get runtimeType => MidiConnectionEvent;
+ toString() => super.toString();
+}
+patch class MidiInput {
+ static Type get instanceRuntimeType => MidiInputImpl;
+
+}
+class MidiInputImpl extends MidiInput implements js_library.JSObjectInterfacesDom {
+ MidiInputImpl.internal_() : super.internal_();
+ get runtimeType => MidiInput;
+ toString() => super.toString();
+}
+patch class MidiInputMap {
+ static Type get instanceRuntimeType => MidiInputMapImpl;
+
+}
+class MidiInputMapImpl extends MidiInputMap implements js_library.JSObjectInterfacesDom {
+ MidiInputMapImpl.internal_() : super.internal_();
+ get runtimeType => MidiInputMap;
+ toString() => super.toString();
+}
+patch class MidiMessageEvent {
+ static Type get instanceRuntimeType => MidiMessageEventImpl;
+
+}
+class MidiMessageEventImpl extends MidiMessageEvent implements js_library.JSObjectInterfacesDom {
+ MidiMessageEventImpl.internal_() : super.internal_();
+ get runtimeType => MidiMessageEvent;
+ toString() => super.toString();
+}
+patch class MidiOutput {
+ static Type get instanceRuntimeType => MidiOutputImpl;
+
+}
+class MidiOutputImpl extends MidiOutput implements js_library.JSObjectInterfacesDom {
+ MidiOutputImpl.internal_() : super.internal_();
+ get runtimeType => MidiOutput;
+ toString() => super.toString();
+}
+patch class MidiOutputMap {
+ static Type get instanceRuntimeType => MidiOutputMapImpl;
+
+}
+class MidiOutputMapImpl extends MidiOutputMap implements js_library.JSObjectInterfacesDom {
+ MidiOutputMapImpl.internal_() : super.internal_();
+ get runtimeType => MidiOutputMap;
+ toString() => super.toString();
+}
+patch class MidiPort {
+ static Type get instanceRuntimeType => MidiPortImpl;
+
+}
+class MidiPortImpl extends MidiPort implements js_library.JSObjectInterfacesDom {
+ MidiPortImpl.internal_() : super.internal_();
+ get runtimeType => MidiPort;
+ toString() => super.toString();
+}
+patch class MimeType {
+ static Type get instanceRuntimeType => MimeTypeImpl;
+
+}
+class MimeTypeImpl extends MimeType implements js_library.JSObjectInterfacesDom {
+ MimeTypeImpl.internal_() : super.internal_();
+ get runtimeType => MimeType;
+ toString() => super.toString();
+}
+patch class MimeTypeArray {
+ static Type get instanceRuntimeType => MimeTypeArrayImpl;
+
+}
+class MimeTypeArrayImpl extends MimeTypeArray implements js_library.JSObjectInterfacesDom {
+ MimeTypeArrayImpl.internal_() : super.internal_();
+ get runtimeType => MimeTypeArray;
+ toString() => super.toString();
+}
+patch class ModElement {
+ static Type get instanceRuntimeType => ModElementImpl;
+
+}
+class ModElementImpl extends ModElement implements js_library.JSObjectInterfacesDom {
+ ModElementImpl.internal_() : super.internal_();
+ get runtimeType => ModElement;
+ toString() => super.toString();
+}
+patch class MouseEvent {
+ static Type get instanceRuntimeType => MouseEventImpl;
+
+}
+class MouseEventImpl extends MouseEvent implements js_library.JSObjectInterfacesDom {
+ MouseEventImpl.internal_() : super.internal_();
+ get runtimeType => MouseEvent;
+ toString() => super.toString();
+}
+patch class MutationObserver {
+ static Type get instanceRuntimeType => MutationObserverImpl;
+
+}
+class MutationObserverImpl extends MutationObserver implements js_library.JSObjectInterfacesDom {
+ MutationObserverImpl.internal_() : super.internal_();
+ get runtimeType => MutationObserver;
+ toString() => super.toString();
+}
+patch class MutationRecord {
+ static Type get instanceRuntimeType => MutationRecordImpl;
+
+}
+class MutationRecordImpl extends MutationRecord implements js_library.JSObjectInterfacesDom {
+ MutationRecordImpl.internal_() : super.internal_();
+ get runtimeType => MutationRecord;
+ toString() => super.toString();
+}
+patch class Navigator {
+ static Type get instanceRuntimeType => NavigatorImpl;
+
+}
+class NavigatorImpl extends Navigator implements js_library.JSObjectInterfacesDom {
+ NavigatorImpl.internal_() : super.internal_();
+ get runtimeType => Navigator;
+ toString() => super.toString();
+}
+patch class NavigatorCpu {
+ static Type get instanceRuntimeType => NavigatorCpuImpl;
+
+}
+class NavigatorCpuImpl extends NavigatorCpu implements js_library.JSObjectInterfacesDom {
+ NavigatorCpuImpl.internal_() : super.internal_();
+ get runtimeType => NavigatorCpu;
+ toString() => super.toString();
+}
+patch class NavigatorID {
+ static Type get instanceRuntimeType => NavigatorIDImpl;
+
+}
+class NavigatorIDImpl extends NavigatorID implements js_library.JSObjectInterfacesDom {
+ NavigatorIDImpl.internal_() : super.internal_();
+ get runtimeType => NavigatorID;
+ toString() => super.toString();
+}
+patch class NavigatorLanguage {
+ static Type get instanceRuntimeType => NavigatorLanguageImpl;
+
+}
+class NavigatorLanguageImpl extends NavigatorLanguage implements js_library.JSObjectInterfacesDom {
+ NavigatorLanguageImpl.internal_() : super.internal_();
+ get runtimeType => NavigatorLanguage;
+ toString() => super.toString();
+}
+patch class NavigatorOnLine {
+ static Type get instanceRuntimeType => NavigatorOnLineImpl;
+
+}
+class NavigatorOnLineImpl extends NavigatorOnLine implements js_library.JSObjectInterfacesDom {
+ NavigatorOnLineImpl.internal_() : super.internal_();
+ get runtimeType => NavigatorOnLine;
+ toString() => super.toString();
+}
+patch class NavigatorStorageUtils {
+ static Type get instanceRuntimeType => NavigatorStorageUtilsImpl;
+
+}
+class NavigatorStorageUtilsImpl extends NavigatorStorageUtils implements js_library.JSObjectInterfacesDom {
+ NavigatorStorageUtilsImpl.internal_() : super.internal_();
+ get runtimeType => NavigatorStorageUtils;
+ toString() => super.toString();
+}
+patch class NavigatorUserMediaError {
+ static Type get instanceRuntimeType => NavigatorUserMediaErrorImpl;
+
+}
+class NavigatorUserMediaErrorImpl extends NavigatorUserMediaError implements js_library.JSObjectInterfacesDom {
+ NavigatorUserMediaErrorImpl.internal_() : super.internal_();
+ get runtimeType => NavigatorUserMediaError;
+ toString() => super.toString();
+}
+patch class NetworkInformation {
+ static Type get instanceRuntimeType => NetworkInformationImpl;
+
+}
+class NetworkInformationImpl extends NetworkInformation implements js_library.JSObjectInterfacesDom {
+ NetworkInformationImpl.internal_() : super.internal_();
+ get runtimeType => NetworkInformation;
+ toString() => super.toString();
+}
+patch class Node {
+ static Type get instanceRuntimeType => NodeImpl;
+
+}
+class NodeImpl extends Node implements js_library.JSObjectInterfacesDom {
+ NodeImpl.internal_() : super.internal_();
+ get runtimeType => Node;
+ toString() => super.toString();
+}
+patch class NodeFilter {
+ static Type get instanceRuntimeType => NodeFilterImpl;
+
+}
+class NodeFilterImpl extends NodeFilter implements js_library.JSObjectInterfacesDom {
+ NodeFilterImpl.internal_() : super.internal_();
+ get runtimeType => NodeFilter;
+ toString() => super.toString();
+}
+patch class NodeIterator {
+ static Type get instanceRuntimeType => NodeIteratorImpl;
+
+}
+class NodeIteratorImpl extends NodeIterator implements js_library.JSObjectInterfacesDom {
+ NodeIteratorImpl.internal_() : super.internal_();
+ get runtimeType => NodeIterator;
+ toString() => super.toString();
+}
+patch class NodeList {
+ static Type get instanceRuntimeType => NodeListImpl;
+
+}
+class NodeListImpl extends NodeList implements js_library.JSObjectInterfacesDom {
+ NodeListImpl.internal_() : super.internal_();
+ get runtimeType => NodeList;
+ toString() => super.toString();
+}
+patch class NonDocumentTypeChildNode {
+ static Type get instanceRuntimeType => NonDocumentTypeChildNodeImpl;
+
+}
+class NonDocumentTypeChildNodeImpl extends NonDocumentTypeChildNode implements js_library.JSObjectInterfacesDom {
+ NonDocumentTypeChildNodeImpl.internal_() : super.internal_();
+ get runtimeType => NonDocumentTypeChildNode;
+ toString() => super.toString();
+}
+patch class NonElementParentNode {
+ static Type get instanceRuntimeType => NonElementParentNodeImpl;
+
+}
+class NonElementParentNodeImpl extends NonElementParentNode implements js_library.JSObjectInterfacesDom {
+ NonElementParentNodeImpl.internal_() : super.internal_();
+ get runtimeType => NonElementParentNode;
+ toString() => super.toString();
+}
+patch class Notification {
+ static Type get instanceRuntimeType => NotificationImpl;
+
+}
+class NotificationImpl extends Notification implements js_library.JSObjectInterfacesDom {
+ NotificationImpl.internal_() : super.internal_();
+ get runtimeType => Notification;
+ toString() => super.toString();
+}
+patch class NotificationEvent {
+ static Type get instanceRuntimeType => NotificationEventImpl;
+
+}
+class NotificationEventImpl extends NotificationEvent implements js_library.JSObjectInterfacesDom {
+ NotificationEventImpl.internal_() : super.internal_();
+ get runtimeType => NotificationEvent;
+ toString() => super.toString();
+}
+patch class OListElement {
+ static Type get instanceRuntimeType => OListElementImpl;
+
+}
+class OListElementImpl extends OListElement implements js_library.JSObjectInterfacesDom {
+ OListElementImpl.internal_() : super.internal_();
+ get runtimeType => OListElement;
+ toString() => super.toString();
+}
+patch class ObjectElement {
+ static Type get instanceRuntimeType => ObjectElementImpl;
+
+}
+class ObjectElementImpl extends ObjectElement implements js_library.JSObjectInterfacesDom {
+ ObjectElementImpl.internal_() : super.internal_();
+ get runtimeType => ObjectElement;
+ toString() => super.toString();
+}
+patch class OptGroupElement {
+ static Type get instanceRuntimeType => OptGroupElementImpl;
+
+}
+class OptGroupElementImpl extends OptGroupElement implements js_library.JSObjectInterfacesDom {
+ OptGroupElementImpl.internal_() : super.internal_();
+ get runtimeType => OptGroupElement;
+ toString() => super.toString();
+}
+patch class OptionElement {
+ static Type get instanceRuntimeType => OptionElementImpl;
+
+}
+class OptionElementImpl extends OptionElement implements js_library.JSObjectInterfacesDom {
+ OptionElementImpl.internal_() : super.internal_();
+ get runtimeType => OptionElement;
+ toString() => super.toString();
+}
+patch class OutputElement {
+ static Type get instanceRuntimeType => OutputElementImpl;
+
+}
+class OutputElementImpl extends OutputElement implements js_library.JSObjectInterfacesDom {
+ OutputElementImpl.internal_() : super.internal_();
+ get runtimeType => OutputElement;
+ toString() => super.toString();
+}
+patch class PageTransitionEvent {
+ static Type get instanceRuntimeType => PageTransitionEventImpl;
+
+}
+class PageTransitionEventImpl extends PageTransitionEvent implements js_library.JSObjectInterfacesDom {
+ PageTransitionEventImpl.internal_() : super.internal_();
+ get runtimeType => PageTransitionEvent;
+ toString() => super.toString();
+}
+patch class ParagraphElement {
+ static Type get instanceRuntimeType => ParagraphElementImpl;
+
+}
+class ParagraphElementImpl extends ParagraphElement implements js_library.JSObjectInterfacesDom {
+ ParagraphElementImpl.internal_() : super.internal_();
+ get runtimeType => ParagraphElement;
+ toString() => super.toString();
+}
+patch class ParamElement {
+ static Type get instanceRuntimeType => ParamElementImpl;
+
+}
+class ParamElementImpl extends ParamElement implements js_library.JSObjectInterfacesDom {
+ ParamElementImpl.internal_() : super.internal_();
+ get runtimeType => ParamElement;
+ toString() => super.toString();
+}
+patch class ParentNode {
+ static Type get instanceRuntimeType => ParentNodeImpl;
+
+}
+class ParentNodeImpl extends ParentNode implements js_library.JSObjectInterfacesDom {
+ ParentNodeImpl.internal_() : super.internal_();
+ get runtimeType => ParentNode;
+ toString() => super.toString();
+}
+patch class PasswordCredential {
+ static Type get instanceRuntimeType => PasswordCredentialImpl;
+
+}
+class PasswordCredentialImpl extends PasswordCredential implements js_library.JSObjectInterfacesDom {
+ PasswordCredentialImpl.internal_() : super.internal_();
+ get runtimeType => PasswordCredential;
+ toString() => super.toString();
+}
+patch class Path2D {
+ static Type get instanceRuntimeType => Path2DImpl;
+
+}
+class Path2DImpl extends Path2D implements js_library.JSObjectInterfacesDom {
+ Path2DImpl.internal_() : super.internal_();
+ get runtimeType => Path2D;
+ toString() => super.toString();
+}
+patch class Performance {
+ static Type get instanceRuntimeType => PerformanceImpl;
+
+}
+class PerformanceImpl extends Performance implements js_library.JSObjectInterfacesDom {
+ PerformanceImpl.internal_() : super.internal_();
+ get runtimeType => Performance;
+ toString() => super.toString();
+}
+patch class PerformanceCompositeTiming {
+ static Type get instanceRuntimeType => PerformanceCompositeTimingImpl;
+
+}
+class PerformanceCompositeTimingImpl extends PerformanceCompositeTiming implements js_library.JSObjectInterfacesDom {
+ PerformanceCompositeTimingImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceCompositeTiming;
+ toString() => super.toString();
+}
+patch class PerformanceEntry {
+ static Type get instanceRuntimeType => PerformanceEntryImpl;
+
+}
+class PerformanceEntryImpl extends PerformanceEntry implements js_library.JSObjectInterfacesDom {
+ PerformanceEntryImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceEntry;
+ toString() => super.toString();
+}
+patch class PerformanceMark {
+ static Type get instanceRuntimeType => PerformanceMarkImpl;
+
+}
+class PerformanceMarkImpl extends PerformanceMark implements js_library.JSObjectInterfacesDom {
+ PerformanceMarkImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceMark;
+ toString() => super.toString();
+}
+patch class PerformanceMeasure {
+ static Type get instanceRuntimeType => PerformanceMeasureImpl;
+
+}
+class PerformanceMeasureImpl extends PerformanceMeasure implements js_library.JSObjectInterfacesDom {
+ PerformanceMeasureImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceMeasure;
+ toString() => super.toString();
+}
+patch class PerformanceNavigation {
+ static Type get instanceRuntimeType => PerformanceNavigationImpl;
+
+}
+class PerformanceNavigationImpl extends PerformanceNavigation implements js_library.JSObjectInterfacesDom {
+ PerformanceNavigationImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceNavigation;
+ toString() => super.toString();
+}
+patch class PerformanceRenderTiming {
+ static Type get instanceRuntimeType => PerformanceRenderTimingImpl;
+
+}
+class PerformanceRenderTimingImpl extends PerformanceRenderTiming implements js_library.JSObjectInterfacesDom {
+ PerformanceRenderTimingImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceRenderTiming;
+ toString() => super.toString();
+}
+patch class PerformanceResourceTiming {
+ static Type get instanceRuntimeType => PerformanceResourceTimingImpl;
+
+}
+class PerformanceResourceTimingImpl extends PerformanceResourceTiming implements js_library.JSObjectInterfacesDom {
+ PerformanceResourceTimingImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceResourceTiming;
+ toString() => super.toString();
+}
+patch class PerformanceTiming {
+ static Type get instanceRuntimeType => PerformanceTimingImpl;
+
+}
+class PerformanceTimingImpl extends PerformanceTiming implements js_library.JSObjectInterfacesDom {
+ PerformanceTimingImpl.internal_() : super.internal_();
+ get runtimeType => PerformanceTiming;
+ toString() => super.toString();
+}
+patch class PeriodicSyncEvent {
+ static Type get instanceRuntimeType => PeriodicSyncEventImpl;
+
+}
+class PeriodicSyncEventImpl extends PeriodicSyncEvent implements js_library.JSObjectInterfacesDom {
+ PeriodicSyncEventImpl.internal_() : super.internal_();
+ get runtimeType => PeriodicSyncEvent;
+ toString() => super.toString();
+}
+patch class PeriodicSyncManager {
+ static Type get instanceRuntimeType => PeriodicSyncManagerImpl;
+
+}
+class PeriodicSyncManagerImpl extends PeriodicSyncManager implements js_library.JSObjectInterfacesDom {
+ PeriodicSyncManagerImpl.internal_() : super.internal_();
+ get runtimeType => PeriodicSyncManager;
+ toString() => super.toString();
+}
+patch class PeriodicSyncRegistration {
+ static Type get instanceRuntimeType => PeriodicSyncRegistrationImpl;
+
+}
+class PeriodicSyncRegistrationImpl extends PeriodicSyncRegistration implements js_library.JSObjectInterfacesDom {
+ PeriodicSyncRegistrationImpl.internal_() : super.internal_();
+ get runtimeType => PeriodicSyncRegistration;
+ toString() => super.toString();
+}
+patch class PermissionStatus {
+ static Type get instanceRuntimeType => PermissionStatusImpl;
+
+}
+class PermissionStatusImpl extends PermissionStatus implements js_library.JSObjectInterfacesDom {
+ PermissionStatusImpl.internal_() : super.internal_();
+ get runtimeType => PermissionStatus;
+ toString() => super.toString();
+}
+patch class Permissions {
+ static Type get instanceRuntimeType => PermissionsImpl;
+
+}
+class PermissionsImpl extends Permissions implements js_library.JSObjectInterfacesDom {
+ PermissionsImpl.internal_() : super.internal_();
+ get runtimeType => Permissions;
+ toString() => super.toString();
+}
+patch class PictureElement {
+ static Type get instanceRuntimeType => PictureElementImpl;
+
+}
+class PictureElementImpl extends PictureElement implements js_library.JSObjectInterfacesDom {
+ PictureElementImpl.internal_() : super.internal_();
+ get runtimeType => PictureElement;
+ toString() => super.toString();
+}
+patch class Plugin {
+ static Type get instanceRuntimeType => PluginImpl;
+
+}
+class PluginImpl extends Plugin implements js_library.JSObjectInterfacesDom {
+ PluginImpl.internal_() : super.internal_();
+ get runtimeType => Plugin;
+ toString() => super.toString();
+}
+patch class PluginArray {
+ static Type get instanceRuntimeType => PluginArrayImpl;
+
+}
+class PluginArrayImpl extends PluginArray implements js_library.JSObjectInterfacesDom {
+ PluginArrayImpl.internal_() : super.internal_();
+ get runtimeType => PluginArray;
+ toString() => super.toString();
+}
+patch class PluginPlaceholderElement {
+ static Type get instanceRuntimeType => PluginPlaceholderElementImpl;
+
+}
+class PluginPlaceholderElementImpl extends PluginPlaceholderElement implements js_library.JSObjectInterfacesDom {
+ PluginPlaceholderElementImpl.internal_() : super.internal_();
+ get runtimeType => PluginPlaceholderElement;
+ toString() => super.toString();
+}
+patch class PointerEvent {
+ static Type get instanceRuntimeType => PointerEventImpl;
+
+}
+class PointerEventImpl extends PointerEvent implements js_library.JSObjectInterfacesDom {
+ PointerEventImpl.internal_() : super.internal_();
+ get runtimeType => PointerEvent;
+ toString() => super.toString();
+}
+patch class PopStateEvent {
+ static Type get instanceRuntimeType => PopStateEventImpl;
+
+}
+class PopStateEventImpl extends PopStateEvent implements js_library.JSObjectInterfacesDom {
+ PopStateEventImpl.internal_() : super.internal_();
+ get runtimeType => PopStateEvent;
+ toString() => super.toString();
+}
+patch class PositionError {
+ static Type get instanceRuntimeType => PositionErrorImpl;
+
+}
+class PositionErrorImpl extends PositionError implements js_library.JSObjectInterfacesDom {
+ PositionErrorImpl.internal_() : super.internal_();
+ get runtimeType => PositionError;
+ toString() => super.toString();
+}
+patch class PositionSensorVRDevice {
+ static Type get instanceRuntimeType => PositionSensorVRDeviceImpl;
+
+}
+class PositionSensorVRDeviceImpl extends PositionSensorVRDevice implements js_library.JSObjectInterfacesDom {
+ PositionSensorVRDeviceImpl.internal_() : super.internal_();
+ get runtimeType => PositionSensorVRDevice;
+ toString() => super.toString();
+}
+patch class PreElement {
+ static Type get instanceRuntimeType => PreElementImpl;
+
+}
+class PreElementImpl extends PreElement implements js_library.JSObjectInterfacesDom {
+ PreElementImpl.internal_() : super.internal_();
+ get runtimeType => PreElement;
+ toString() => super.toString();
+}
+patch class Presentation {
+ static Type get instanceRuntimeType => PresentationImpl;
+
+}
+class PresentationImpl extends Presentation implements js_library.JSObjectInterfacesDom {
+ PresentationImpl.internal_() : super.internal_();
+ get runtimeType => Presentation;
+ toString() => super.toString();
+}
+patch class PresentationAvailability {
+ static Type get instanceRuntimeType => PresentationAvailabilityImpl;
+
+}
+class PresentationAvailabilityImpl extends PresentationAvailability implements js_library.JSObjectInterfacesDom {
+ PresentationAvailabilityImpl.internal_() : super.internal_();
+ get runtimeType => PresentationAvailability;
+ toString() => super.toString();
+}
+patch class PresentationSession {
+ static Type get instanceRuntimeType => PresentationSessionImpl;
+
+}
+class PresentationSessionImpl extends PresentationSession implements js_library.JSObjectInterfacesDom {
+ PresentationSessionImpl.internal_() : super.internal_();
+ get runtimeType => PresentationSession;
+ toString() => super.toString();
+}
+patch class ProcessingInstruction {
+ static Type get instanceRuntimeType => ProcessingInstructionImpl;
+
+}
+class ProcessingInstructionImpl extends ProcessingInstruction implements js_library.JSObjectInterfacesDom {
+ ProcessingInstructionImpl.internal_() : super.internal_();
+ get runtimeType => ProcessingInstruction;
+ toString() => super.toString();
+}
+patch class ProgressElement {
+ static Type get instanceRuntimeType => ProgressElementImpl;
+
+}
+class ProgressElementImpl extends ProgressElement implements js_library.JSObjectInterfacesDom {
+ ProgressElementImpl.internal_() : super.internal_();
+ get runtimeType => ProgressElement;
+ toString() => super.toString();
+}
+patch class ProgressEvent {
+ static Type get instanceRuntimeType => ProgressEventImpl;
+
+}
+class ProgressEventImpl extends ProgressEvent implements js_library.JSObjectInterfacesDom {
+ ProgressEventImpl.internal_() : super.internal_();
+ get runtimeType => ProgressEvent;
+ toString() => super.toString();
+}
+patch class PromiseRejectionEvent {
+ static Type get instanceRuntimeType => PromiseRejectionEventImpl;
+
+}
+class PromiseRejectionEventImpl extends PromiseRejectionEvent implements js_library.JSObjectInterfacesDom {
+ PromiseRejectionEventImpl.internal_() : super.internal_();
+ get runtimeType => PromiseRejectionEvent;
+ toString() => super.toString();
+}
+patch class PushEvent {
+ static Type get instanceRuntimeType => PushEventImpl;
+
+}
+class PushEventImpl extends PushEvent implements js_library.JSObjectInterfacesDom {
+ PushEventImpl.internal_() : super.internal_();
+ get runtimeType => PushEvent;
+ toString() => super.toString();
+}
+patch class PushManager {
+ static Type get instanceRuntimeType => PushManagerImpl;
+
+}
+class PushManagerImpl extends PushManager implements js_library.JSObjectInterfacesDom {
+ PushManagerImpl.internal_() : super.internal_();
+ get runtimeType => PushManager;
+ toString() => super.toString();
+}
+patch class PushMessageData {
+ static Type get instanceRuntimeType => PushMessageDataImpl;
+
+}
+class PushMessageDataImpl extends PushMessageData implements js_library.JSObjectInterfacesDom {
+ PushMessageDataImpl.internal_() : super.internal_();
+ get runtimeType => PushMessageData;
+ toString() => super.toString();
+}
+patch class PushSubscription {
+ static Type get instanceRuntimeType => PushSubscriptionImpl;
+
+}
+class PushSubscriptionImpl extends PushSubscription implements js_library.JSObjectInterfacesDom {
+ PushSubscriptionImpl.internal_() : super.internal_();
+ get runtimeType => PushSubscription;
+ toString() => super.toString();
+}
+patch class QuoteElement {
+ static Type get instanceRuntimeType => QuoteElementImpl;
+
+}
+class QuoteElementImpl extends QuoteElement implements js_library.JSObjectInterfacesDom {
+ QuoteElementImpl.internal_() : super.internal_();
+ get runtimeType => QuoteElement;
+ toString() => super.toString();
+}
+patch class Range {
+ static Type get instanceRuntimeType => RangeImpl;
+
+}
+class RangeImpl extends Range implements js_library.JSObjectInterfacesDom {
+ RangeImpl.internal_() : super.internal_();
+ get runtimeType => Range;
+ toString() => super.toString();
+}
+patch class ReadableByteStream {
+ static Type get instanceRuntimeType => ReadableByteStreamImpl;
+
+}
+class ReadableByteStreamImpl extends ReadableByteStream implements js_library.JSObjectInterfacesDom {
+ ReadableByteStreamImpl.internal_() : super.internal_();
+ get runtimeType => ReadableByteStream;
+ toString() => super.toString();
+}
+patch class ReadableByteStreamReader {
+ static Type get instanceRuntimeType => ReadableByteStreamReaderImpl;
+
+}
+class ReadableByteStreamReaderImpl extends ReadableByteStreamReader implements js_library.JSObjectInterfacesDom {
+ ReadableByteStreamReaderImpl.internal_() : super.internal_();
+ get runtimeType => ReadableByteStreamReader;
+ toString() => super.toString();
+}
+patch class ReadableStream {
+ static Type get instanceRuntimeType => ReadableStreamImpl;
+
+}
+class ReadableStreamImpl extends ReadableStream implements js_library.JSObjectInterfacesDom {
+ ReadableStreamImpl.internal_() : super.internal_();
+ get runtimeType => ReadableStream;
+ toString() => super.toString();
+}
+patch class ReadableStreamReader {
+ static Type get instanceRuntimeType => ReadableStreamReaderImpl;
+
+}
+class ReadableStreamReaderImpl extends ReadableStreamReader implements js_library.JSObjectInterfacesDom {
+ ReadableStreamReaderImpl.internal_() : super.internal_();
+ get runtimeType => ReadableStreamReader;
+ toString() => super.toString();
+}
+patch class RelatedEvent {
+ static Type get instanceRuntimeType => RelatedEventImpl;
+
+}
+class RelatedEventImpl extends RelatedEvent implements js_library.JSObjectInterfacesDom {
+ RelatedEventImpl.internal_() : super.internal_();
+ get runtimeType => RelatedEvent;
+ toString() => super.toString();
+}
+patch class ResourceProgressEvent {
+ static Type get instanceRuntimeType => ResourceProgressEventImpl;
+
+}
+class ResourceProgressEventImpl extends ResourceProgressEvent implements js_library.JSObjectInterfacesDom {
+ ResourceProgressEventImpl.internal_() : super.internal_();
+ get runtimeType => ResourceProgressEvent;
+ toString() => super.toString();
+}
+patch class RtcDataChannel {
+ static Type get instanceRuntimeType => RtcDataChannelImpl;
+
+}
+class RtcDataChannelImpl extends RtcDataChannel implements js_library.JSObjectInterfacesDom {
+ RtcDataChannelImpl.internal_() : super.internal_();
+ get runtimeType => RtcDataChannel;
+ toString() => super.toString();
+}
+patch class RtcDataChannelEvent {
+ static Type get instanceRuntimeType => RtcDataChannelEventImpl;
+
+}
+class RtcDataChannelEventImpl extends RtcDataChannelEvent implements js_library.JSObjectInterfacesDom {
+ RtcDataChannelEventImpl.internal_() : super.internal_();
+ get runtimeType => RtcDataChannelEvent;
+ toString() => super.toString();
+}
+patch class RtcDtmfSender {
+ static Type get instanceRuntimeType => RtcDtmfSenderImpl;
+
+}
+class RtcDtmfSenderImpl extends RtcDtmfSender implements js_library.JSObjectInterfacesDom {
+ RtcDtmfSenderImpl.internal_() : super.internal_();
+ get runtimeType => RtcDtmfSender;
+ toString() => super.toString();
+}
+patch class RtcDtmfToneChangeEvent {
+ static Type get instanceRuntimeType => RtcDtmfToneChangeEventImpl;
+
+}
+class RtcDtmfToneChangeEventImpl extends RtcDtmfToneChangeEvent implements js_library.JSObjectInterfacesDom {
+ RtcDtmfToneChangeEventImpl.internal_() : super.internal_();
+ get runtimeType => RtcDtmfToneChangeEvent;
+ toString() => super.toString();
+}
+patch class RtcIceCandidate {
+ static Type get instanceRuntimeType => RtcIceCandidateImpl;
+
+}
+class RtcIceCandidateImpl extends RtcIceCandidate implements js_library.JSObjectInterfacesDom {
+ RtcIceCandidateImpl.internal_() : super.internal_();
+ get runtimeType => RtcIceCandidate;
+ toString() => super.toString();
+}
+patch class RtcIceCandidateEvent {
+ static Type get instanceRuntimeType => RtcIceCandidateEventImpl;
+
+}
+class RtcIceCandidateEventImpl extends RtcIceCandidateEvent implements js_library.JSObjectInterfacesDom {
+ RtcIceCandidateEventImpl.internal_() : super.internal_();
+ get runtimeType => RtcIceCandidateEvent;
+ toString() => super.toString();
+}
+patch class RtcPeerConnection {
+ static Type get instanceRuntimeType => RtcPeerConnectionImpl;
+
+}
+class RtcPeerConnectionImpl extends RtcPeerConnection implements js_library.JSObjectInterfacesDom {
+ RtcPeerConnectionImpl.internal_() : super.internal_();
+ get runtimeType => RtcPeerConnection;
+ toString() => super.toString();
+}
+patch class RtcSessionDescription {
+ static Type get instanceRuntimeType => RtcSessionDescriptionImpl;
+
+}
+class RtcSessionDescriptionImpl extends RtcSessionDescription implements js_library.JSObjectInterfacesDom {
+ RtcSessionDescriptionImpl.internal_() : super.internal_();
+ get runtimeType => RtcSessionDescription;
+ toString() => super.toString();
+}
+patch class RtcStatsReport {
+ static Type get instanceRuntimeType => RtcStatsReportImpl;
+
+}
+class RtcStatsReportImpl extends RtcStatsReport implements js_library.JSObjectInterfacesDom {
+ RtcStatsReportImpl.internal_() : super.internal_();
+ get runtimeType => RtcStatsReport;
+ toString() => super.toString();
+}
+patch class RtcStatsResponse {
+ static Type get instanceRuntimeType => RtcStatsResponseImpl;
+
+}
+class RtcStatsResponseImpl extends RtcStatsResponse implements js_library.JSObjectInterfacesDom {
+ RtcStatsResponseImpl.internal_() : super.internal_();
+ get runtimeType => RtcStatsResponse;
+ toString() => super.toString();
+}
+patch class Screen {
+ static Type get instanceRuntimeType => ScreenImpl;
+
+}
+class ScreenImpl extends Screen implements js_library.JSObjectInterfacesDom {
+ ScreenImpl.internal_() : super.internal_();
+ get runtimeType => Screen;
+ toString() => super.toString();
+}
+patch class ScreenOrientation {
+ static Type get instanceRuntimeType => ScreenOrientationImpl;
+
+}
+class ScreenOrientationImpl extends ScreenOrientation implements js_library.JSObjectInterfacesDom {
+ ScreenOrientationImpl.internal_() : super.internal_();
+ get runtimeType => ScreenOrientation;
+ toString() => super.toString();
+}
+patch class ScriptElement {
+ static Type get instanceRuntimeType => ScriptElementImpl;
+
+}
+class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
+ ScriptElementImpl.internal_() : super.internal_();
+ get runtimeType => ScriptElement;
+ toString() => super.toString();
+}
+patch class ScrollState {
+ static Type get instanceRuntimeType => ScrollStateImpl;
+
+}
+class ScrollStateImpl extends ScrollState implements js_library.JSObjectInterfacesDom {
+ ScrollStateImpl.internal_() : super.internal_();
+ get runtimeType => ScrollState;
+ toString() => super.toString();
+}
+patch class SecurityPolicyViolationEvent {
+ static Type get instanceRuntimeType => SecurityPolicyViolationEventImpl;
+
+}
+class SecurityPolicyViolationEventImpl extends SecurityPolicyViolationEvent implements js_library.JSObjectInterfacesDom {
+ SecurityPolicyViolationEventImpl.internal_() : super.internal_();
+ get runtimeType => SecurityPolicyViolationEvent;
+ toString() => super.toString();
+}
+patch class SelectElement {
+ static Type get instanceRuntimeType => SelectElementImpl;
+
+}
+class SelectElementImpl extends SelectElement implements js_library.JSObjectInterfacesDom {
+ SelectElementImpl.internal_() : super.internal_();
+ get runtimeType => SelectElement;
+ toString() => super.toString();
+}
+patch class Selection {
+ static Type get instanceRuntimeType => SelectionImpl;
+
+}
+class SelectionImpl extends Selection implements js_library.JSObjectInterfacesDom {
+ SelectionImpl.internal_() : super.internal_();
+ get runtimeType => Selection;
+ toString() => super.toString();
+}
+patch class ServicePort {
+ static Type get instanceRuntimeType => ServicePortImpl;
+
+}
+class ServicePortImpl extends ServicePort implements js_library.JSObjectInterfacesDom {
+ ServicePortImpl.internal_() : super.internal_();
+ get runtimeType => ServicePort;
+ toString() => super.toString();
+}
+patch class ServicePortCollection {
+ static Type get instanceRuntimeType => ServicePortCollectionImpl;
+
+}
+class ServicePortCollectionImpl extends ServicePortCollection implements js_library.JSObjectInterfacesDom {
+ ServicePortCollectionImpl.internal_() : super.internal_();
+ get runtimeType => ServicePortCollection;
+ toString() => super.toString();
+}
+patch class ServicePortConnectEvent {
+ static Type get instanceRuntimeType => ServicePortConnectEventImpl;
+
+}
+class ServicePortConnectEventImpl extends ServicePortConnectEvent implements js_library.JSObjectInterfacesDom {
+ ServicePortConnectEventImpl.internal_() : super.internal_();
+ get runtimeType => ServicePortConnectEvent;
+ toString() => super.toString();
+}
+patch class ServiceWorkerContainer {
+ static Type get instanceRuntimeType => ServiceWorkerContainerImpl;
+
+}
+class ServiceWorkerContainerImpl extends ServiceWorkerContainer implements js_library.JSObjectInterfacesDom {
+ ServiceWorkerContainerImpl.internal_() : super.internal_();
+ get runtimeType => ServiceWorkerContainer;
+ toString() => super.toString();
+}
+patch class ServiceWorkerGlobalScope {
+ static Type get instanceRuntimeType => ServiceWorkerGlobalScopeImpl;
+
+}
+class ServiceWorkerGlobalScopeImpl extends ServiceWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+ ServiceWorkerGlobalScopeImpl.internal_() : super.internal_();
+ get runtimeType => ServiceWorkerGlobalScope;
+ toString() => super.toString();
+}
+patch class ServiceWorkerMessageEvent {
+ static Type get instanceRuntimeType => ServiceWorkerMessageEventImpl;
+
+}
+class ServiceWorkerMessageEventImpl extends ServiceWorkerMessageEvent implements js_library.JSObjectInterfacesDom {
+ ServiceWorkerMessageEventImpl.internal_() : super.internal_();
+ get runtimeType => ServiceWorkerMessageEvent;
+ toString() => super.toString();
+}
+patch class ServiceWorkerRegistration {
+ static Type get instanceRuntimeType => ServiceWorkerRegistrationImpl;
+
+}
+class ServiceWorkerRegistrationImpl extends ServiceWorkerRegistration implements js_library.JSObjectInterfacesDom {
+ ServiceWorkerRegistrationImpl.internal_() : super.internal_();
+ get runtimeType => ServiceWorkerRegistration;
+ toString() => super.toString();
+}
+patch class ShadowElement {
+ static Type get instanceRuntimeType => ShadowElementImpl;
+
+}
+class ShadowElementImpl extends ShadowElement implements js_library.JSObjectInterfacesDom {
+ ShadowElementImpl.internal_() : super.internal_();
+ get runtimeType => ShadowElement;
+ toString() => super.toString();
+}
+patch class ShadowRoot {
+ static Type get instanceRuntimeType => ShadowRootImpl;
+
+}
+class ShadowRootImpl extends ShadowRoot implements js_library.JSObjectInterfacesDom {
+ ShadowRootImpl.internal_() : super.internal_();
+ get runtimeType => ShadowRoot;
+ toString() => super.toString();
+}
+patch class SharedArrayBuffer {
+ static Type get instanceRuntimeType => SharedArrayBufferImpl;
+
+}
+class SharedArrayBufferImpl extends SharedArrayBuffer implements js_library.JSObjectInterfacesDom {
+ SharedArrayBufferImpl.internal_() : super.internal_();
+ get runtimeType => SharedArrayBuffer;
+ toString() => super.toString();
+}
+patch class SharedWorker {
+ static Type get instanceRuntimeType => SharedWorkerImpl;
+
+}
+class SharedWorkerImpl extends SharedWorker implements js_library.JSObjectInterfacesDom {
+ SharedWorkerImpl.internal_() : super.internal_();
+ get runtimeType => SharedWorker;
+ toString() => super.toString();
+}
+patch class SharedWorkerGlobalScope {
+ static Type get instanceRuntimeType => SharedWorkerGlobalScopeImpl;
+
+}
+class SharedWorkerGlobalScopeImpl extends SharedWorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+ SharedWorkerGlobalScopeImpl.internal_() : super.internal_();
+ get runtimeType => SharedWorkerGlobalScope;
+ toString() => super.toString();
+}
+patch class SourceBuffer {
+ static Type get instanceRuntimeType => SourceBufferImpl;
+
+}
+class SourceBufferImpl extends SourceBuffer implements js_library.JSObjectInterfacesDom {
+ SourceBufferImpl.internal_() : super.internal_();
+ get runtimeType => SourceBuffer;
+ toString() => super.toString();
+}
+patch class SourceBufferList {
+ static Type get instanceRuntimeType => SourceBufferListImpl;
+
+}
+class SourceBufferListImpl extends SourceBufferList implements js_library.JSObjectInterfacesDom {
+ SourceBufferListImpl.internal_() : super.internal_();
+ get runtimeType => SourceBufferList;
+ toString() => super.toString();
+}
+patch class SourceElement {
+ static Type get instanceRuntimeType => SourceElementImpl;
+
+}
+class SourceElementImpl extends SourceElement implements js_library.JSObjectInterfacesDom {
+ SourceElementImpl.internal_() : super.internal_();
+ get runtimeType => SourceElement;
+ toString() => super.toString();
+}
+patch class SourceInfo {
+ static Type get instanceRuntimeType => SourceInfoImpl;
+
+}
+class SourceInfoImpl extends SourceInfo implements js_library.JSObjectInterfacesDom {
+ SourceInfoImpl.internal_() : super.internal_();
+ get runtimeType => SourceInfo;
+ toString() => super.toString();
+}
+patch class SpanElement {
+ static Type get instanceRuntimeType => SpanElementImpl;
+
+}
+class SpanElementImpl extends SpanElement implements js_library.JSObjectInterfacesDom {
+ SpanElementImpl.internal_() : super.internal_();
+ get runtimeType => SpanElement;
+ toString() => super.toString();
+}
+patch class SpeechGrammar {
+ static Type get instanceRuntimeType => SpeechGrammarImpl;
+
+}
+class SpeechGrammarImpl extends SpeechGrammar implements js_library.JSObjectInterfacesDom {
+ SpeechGrammarImpl.internal_() : super.internal_();
+ get runtimeType => SpeechGrammar;
+ toString() => super.toString();
+}
+patch class SpeechGrammarList {
+ static Type get instanceRuntimeType => SpeechGrammarListImpl;
+
+}
+class SpeechGrammarListImpl extends SpeechGrammarList implements js_library.JSObjectInterfacesDom {
+ SpeechGrammarListImpl.internal_() : super.internal_();
+ get runtimeType => SpeechGrammarList;
+ toString() => super.toString();
+}
+patch class SpeechRecognition {
+ static Type get instanceRuntimeType => SpeechRecognitionImpl;
+
+}
+class SpeechRecognitionImpl extends SpeechRecognition implements js_library.JSObjectInterfacesDom {
+ SpeechRecognitionImpl.internal_() : super.internal_();
+ get runtimeType => SpeechRecognition;
+ toString() => super.toString();
+}
+patch class SpeechRecognitionAlternative {
+ static Type get instanceRuntimeType => SpeechRecognitionAlternativeImpl;
+
+}
+class SpeechRecognitionAlternativeImpl extends SpeechRecognitionAlternative implements js_library.JSObjectInterfacesDom {
+ SpeechRecognitionAlternativeImpl.internal_() : super.internal_();
+ get runtimeType => SpeechRecognitionAlternative;
+ toString() => super.toString();
+}
+patch class SpeechRecognitionError {
+ static Type get instanceRuntimeType => SpeechRecognitionErrorImpl;
+
+}
+class SpeechRecognitionErrorImpl extends SpeechRecognitionError implements js_library.JSObjectInterfacesDom {
+ SpeechRecognitionErrorImpl.internal_() : super.internal_();
+ get runtimeType => SpeechRecognitionError;
+ toString() => super.toString();
+}
+patch class SpeechRecognitionEvent {
+ static Type get instanceRuntimeType => SpeechRecognitionEventImpl;
+
+}
+class SpeechRecognitionEventImpl extends SpeechRecognitionEvent implements js_library.JSObjectInterfacesDom {
+ SpeechRecognitionEventImpl.internal_() : super.internal_();
+ get runtimeType => SpeechRecognitionEvent;
+ toString() => super.toString();
+}
+patch class SpeechRecognitionResult {
+ static Type get instanceRuntimeType => SpeechRecognitionResultImpl;
+
+}
+class SpeechRecognitionResultImpl extends SpeechRecognitionResult implements js_library.JSObjectInterfacesDom {
+ SpeechRecognitionResultImpl.internal_() : super.internal_();
+ get runtimeType => SpeechRecognitionResult;
+ toString() => super.toString();
+}
+patch class SpeechSynthesis {
+ static Type get instanceRuntimeType => SpeechSynthesisImpl;
+
+}
+class SpeechSynthesisImpl extends SpeechSynthesis implements js_library.JSObjectInterfacesDom {
+ SpeechSynthesisImpl.internal_() : super.internal_();
+ get runtimeType => SpeechSynthesis;
+ toString() => super.toString();
+}
+patch class SpeechSynthesisEvent {
+ static Type get instanceRuntimeType => SpeechSynthesisEventImpl;
+
+}
+class SpeechSynthesisEventImpl extends SpeechSynthesisEvent implements js_library.JSObjectInterfacesDom {
+ SpeechSynthesisEventImpl.internal_() : super.internal_();
+ get runtimeType => SpeechSynthesisEvent;
+ toString() => super.toString();
+}
+patch class SpeechSynthesisUtterance {
+ static Type get instanceRuntimeType => SpeechSynthesisUtteranceImpl;
+
+}
+class SpeechSynthesisUtteranceImpl extends SpeechSynthesisUtterance implements js_library.JSObjectInterfacesDom {
+ SpeechSynthesisUtteranceImpl.internal_() : super.internal_();
+ get runtimeType => SpeechSynthesisUtterance;
+ toString() => super.toString();
+}
+patch class SpeechSynthesisVoice {
+ static Type get instanceRuntimeType => SpeechSynthesisVoiceImpl;
+
+}
+class SpeechSynthesisVoiceImpl extends SpeechSynthesisVoice implements js_library.JSObjectInterfacesDom {
+ SpeechSynthesisVoiceImpl.internal_() : super.internal_();
+ get runtimeType => SpeechSynthesisVoice;
+ toString() => super.toString();
+}
+patch class StashedMessagePort {
+ static Type get instanceRuntimeType => StashedMessagePortImpl;
+
+}
+class StashedMessagePortImpl extends StashedMessagePort implements js_library.JSObjectInterfacesDom {
+ StashedMessagePortImpl.internal_() : super.internal_();
+ get runtimeType => StashedMessagePort;
+ toString() => super.toString();
+}
+patch class StashedPortCollection {
+ static Type get instanceRuntimeType => StashedPortCollectionImpl;
+
+}
+class StashedPortCollectionImpl extends StashedPortCollection implements js_library.JSObjectInterfacesDom {
+ StashedPortCollectionImpl.internal_() : super.internal_();
+ get runtimeType => StashedPortCollection;
+ toString() => super.toString();
+}
+patch class Storage {
+ static Type get instanceRuntimeType => StorageImpl;
+
+}
+class StorageImpl extends Storage implements js_library.JSObjectInterfacesDom {
+ StorageImpl.internal_() : super.internal_();
+ get runtimeType => Storage;
+ toString() => super.toString();
+}
+patch class StorageEvent {
+ static Type get instanceRuntimeType => StorageEventImpl;
+
+}
+class StorageEventImpl extends StorageEvent implements js_library.JSObjectInterfacesDom {
+ StorageEventImpl.internal_() : super.internal_();
+ get runtimeType => StorageEvent;
+ toString() => super.toString();
+}
+patch class StorageInfo {
+ static Type get instanceRuntimeType => StorageInfoImpl;
+
+}
+class StorageInfoImpl extends StorageInfo implements js_library.JSObjectInterfacesDom {
+ StorageInfoImpl.internal_() : super.internal_();
+ get runtimeType => StorageInfo;
+ toString() => super.toString();
+}
+patch class StorageQuota {
+ static Type get instanceRuntimeType => StorageQuotaImpl;
+
+}
+class StorageQuotaImpl extends StorageQuota implements js_library.JSObjectInterfacesDom {
+ StorageQuotaImpl.internal_() : super.internal_();
+ get runtimeType => StorageQuota;
+ toString() => super.toString();
+}
+patch class StyleElement {
+ static Type get instanceRuntimeType => StyleElementImpl;
+
+}
+class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
+ StyleElementImpl.internal_() : super.internal_();
+ get runtimeType => StyleElement;
+ toString() => super.toString();
+}
+patch class StyleMedia {
+ static Type get instanceRuntimeType => StyleMediaImpl;
+
+}
+class StyleMediaImpl extends StyleMedia implements js_library.JSObjectInterfacesDom {
+ StyleMediaImpl.internal_() : super.internal_();
+ get runtimeType => StyleMedia;
+ toString() => super.toString();
+}
+patch class StyleSheet {
+ static Type get instanceRuntimeType => StyleSheetImpl;
+
+}
+class StyleSheetImpl extends StyleSheet implements js_library.JSObjectInterfacesDom {
+ StyleSheetImpl.internal_() : super.internal_();
+ get runtimeType => StyleSheet;
+ toString() => super.toString();
+}
+patch class SyncEvent {
+ static Type get instanceRuntimeType => SyncEventImpl;
+
+}
+class SyncEventImpl extends SyncEvent implements js_library.JSObjectInterfacesDom {
+ SyncEventImpl.internal_() : super.internal_();
+ get runtimeType => SyncEvent;
+ toString() => super.toString();
+}
+patch class SyncManager {
+ static Type get instanceRuntimeType => SyncManagerImpl;
+
+}
+class SyncManagerImpl extends SyncManager implements js_library.JSObjectInterfacesDom {
+ SyncManagerImpl.internal_() : super.internal_();
+ get runtimeType => SyncManager;
+ toString() => super.toString();
+}
+patch class SyncRegistration {
+ static Type get instanceRuntimeType => SyncRegistrationImpl;
+
+}
+class SyncRegistrationImpl extends SyncRegistration implements js_library.JSObjectInterfacesDom {
+ SyncRegistrationImpl.internal_() : super.internal_();
+ get runtimeType => SyncRegistration;
+ toString() => super.toString();
+}
+patch class TableCaptionElement {
+ static Type get instanceRuntimeType => TableCaptionElementImpl;
+
+}
+class TableCaptionElementImpl extends TableCaptionElement implements js_library.JSObjectInterfacesDom {
+ TableCaptionElementImpl.internal_() : super.internal_();
+ get runtimeType => TableCaptionElement;
+ toString() => super.toString();
+}
+patch class TableCellElement {
+ static Type get instanceRuntimeType => TableCellElementImpl;
+
+}
+class TableCellElementImpl extends TableCellElement implements js_library.JSObjectInterfacesDom {
+ TableCellElementImpl.internal_() : super.internal_();
+ get runtimeType => TableCellElement;
+ toString() => super.toString();
+}
+patch class TableColElement {
+ static Type get instanceRuntimeType => TableColElementImpl;
+
+}
+class TableColElementImpl extends TableColElement implements js_library.JSObjectInterfacesDom {
+ TableColElementImpl.internal_() : super.internal_();
+ get runtimeType => TableColElement;
+ toString() => super.toString();
+}
+patch class TableElement {
+ static Type get instanceRuntimeType => TableElementImpl;
+
+}
+class TableElementImpl extends TableElement implements js_library.JSObjectInterfacesDom {
+ TableElementImpl.internal_() : super.internal_();
+ get runtimeType => TableElement;
+ toString() => super.toString();
+}
+patch class TableRowElement {
+ static Type get instanceRuntimeType => TableRowElementImpl;
+
+}
+class TableRowElementImpl extends TableRowElement implements js_library.JSObjectInterfacesDom {
+ TableRowElementImpl.internal_() : super.internal_();
+ get runtimeType => TableRowElement;
+ toString() => super.toString();
+}
+patch class TableSectionElement {
+ static Type get instanceRuntimeType => TableSectionElementImpl;
+
+}
+class TableSectionElementImpl extends TableSectionElement implements js_library.JSObjectInterfacesDom {
+ TableSectionElementImpl.internal_() : super.internal_();
+ get runtimeType => TableSectionElement;
+ toString() => super.toString();
+}
+patch class TemplateElement {
+ static Type get instanceRuntimeType => TemplateElementImpl;
+
+}
+class TemplateElementImpl extends TemplateElement implements js_library.JSObjectInterfacesDom {
+ TemplateElementImpl.internal_() : super.internal_();
+ get runtimeType => TemplateElement;
+ toString() => super.toString();
+}
+patch class Text {
+ static Type get instanceRuntimeType => TextImpl;
+
+}
+class TextImpl extends Text implements js_library.JSObjectInterfacesDom {
+ TextImpl.internal_() : super.internal_();
+ get runtimeType => Text;
+ toString() => super.toString();
+}
+patch class TextAreaElement {
+ static Type get instanceRuntimeType => TextAreaElementImpl;
+
+}
+class TextAreaElementImpl extends TextAreaElement implements js_library.JSObjectInterfacesDom {
+ TextAreaElementImpl.internal_() : super.internal_();
+ get runtimeType => TextAreaElement;
+ toString() => super.toString();
+}
+patch class TextEvent {
+ static Type get instanceRuntimeType => TextEventImpl;
+
+}
+class TextEventImpl extends TextEvent implements js_library.JSObjectInterfacesDom {
+ TextEventImpl.internal_() : super.internal_();
+ get runtimeType => TextEvent;
+ toString() => super.toString();
+}
+patch class TextMetrics {
+ static Type get instanceRuntimeType => TextMetricsImpl;
+
+}
+class TextMetricsImpl extends TextMetrics implements js_library.JSObjectInterfacesDom {
+ TextMetricsImpl.internal_() : super.internal_();
+ get runtimeType => TextMetrics;
+ toString() => super.toString();
+}
+patch class TextTrack {
+ static Type get instanceRuntimeType => TextTrackImpl;
+
+}
+class TextTrackImpl extends TextTrack implements js_library.JSObjectInterfacesDom {
+ TextTrackImpl.internal_() : super.internal_();
+ get runtimeType => TextTrack;
+ toString() => super.toString();
+}
+patch class TextTrackCue {
+ static Type get instanceRuntimeType => TextTrackCueImpl;
+
+}
+class TextTrackCueImpl extends TextTrackCue implements js_library.JSObjectInterfacesDom {
+ TextTrackCueImpl.internal_() : super.internal_();
+ get runtimeType => TextTrackCue;
+ toString() => super.toString();
+}
+patch class TextTrackCueList {
+ static Type get instanceRuntimeType => TextTrackCueListImpl;
+
+}
+class TextTrackCueListImpl extends TextTrackCueList implements js_library.JSObjectInterfacesDom {
+ TextTrackCueListImpl.internal_() : super.internal_();
+ get runtimeType => TextTrackCueList;
+ toString() => super.toString();
+}
+patch class TextTrackList {
+ static Type get instanceRuntimeType => TextTrackListImpl;
+
+}
+class TextTrackListImpl extends TextTrackList implements js_library.JSObjectInterfacesDom {
+ TextTrackListImpl.internal_() : super.internal_();
+ get runtimeType => TextTrackList;
+ toString() => super.toString();
+}
+patch class TimeRanges {
+ static Type get instanceRuntimeType => TimeRangesImpl;
+
+}
+class TimeRangesImpl extends TimeRanges implements js_library.JSObjectInterfacesDom {
+ TimeRangesImpl.internal_() : super.internal_();
+ get runtimeType => TimeRanges;
+ toString() => super.toString();
+}
+patch class TitleElement {
+ static Type get instanceRuntimeType => TitleElementImpl;
+
+}
+class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
+ TitleElementImpl.internal_() : super.internal_();
+ get runtimeType => TitleElement;
+ toString() => super.toString();
+}
+patch class Touch {
+ static Type get instanceRuntimeType => TouchImpl;
+
+}
+class TouchImpl extends Touch implements js_library.JSObjectInterfacesDom {
+ TouchImpl.internal_() : super.internal_();
+ get runtimeType => Touch;
+ toString() => super.toString();
+}
+patch class TouchEvent {
+ static Type get instanceRuntimeType => TouchEventImpl;
+
+}
+class TouchEventImpl extends TouchEvent implements js_library.JSObjectInterfacesDom {
+ TouchEventImpl.internal_() : super.internal_();
+ get runtimeType => TouchEvent;
+ toString() => super.toString();
+}
+patch class TouchList {
+ static Type get instanceRuntimeType => TouchListImpl;
+
+}
+class TouchListImpl extends TouchList implements js_library.JSObjectInterfacesDom {
+ TouchListImpl.internal_() : super.internal_();
+ get runtimeType => TouchList;
+ toString() => super.toString();
+}
+patch class TrackDefault {
+ static Type get instanceRuntimeType => TrackDefaultImpl;
+
+}
+class TrackDefaultImpl extends TrackDefault implements js_library.JSObjectInterfacesDom {
+ TrackDefaultImpl.internal_() : super.internal_();
+ get runtimeType => TrackDefault;
+ toString() => super.toString();
+}
+patch class TrackDefaultList {
+ static Type get instanceRuntimeType => TrackDefaultListImpl;
+
+}
+class TrackDefaultListImpl extends TrackDefaultList implements js_library.JSObjectInterfacesDom {
+ TrackDefaultListImpl.internal_() : super.internal_();
+ get runtimeType => TrackDefaultList;
+ toString() => super.toString();
+}
+patch class TrackElement {
+ static Type get instanceRuntimeType => TrackElementImpl;
+
+}
+class TrackElementImpl extends TrackElement implements js_library.JSObjectInterfacesDom {
+ TrackElementImpl.internal_() : super.internal_();
+ get runtimeType => TrackElement;
+ toString() => super.toString();
+}
+patch class TrackEvent {
+ static Type get instanceRuntimeType => TrackEventImpl;
+
+}
+class TrackEventImpl extends TrackEvent implements js_library.JSObjectInterfacesDom {
+ TrackEventImpl.internal_() : super.internal_();
+ get runtimeType => TrackEvent;
+ toString() => super.toString();
+}
+patch class TransitionEvent {
+ static Type get instanceRuntimeType => TransitionEventImpl;
+
+}
+class TransitionEventImpl extends TransitionEvent implements js_library.JSObjectInterfacesDom {
+ TransitionEventImpl.internal_() : super.internal_();
+ get runtimeType => TransitionEvent;
+ toString() => super.toString();
+}
+patch class TreeWalker {
+ static Type get instanceRuntimeType => TreeWalkerImpl;
+
+}
+class TreeWalkerImpl extends TreeWalker implements js_library.JSObjectInterfacesDom {
+ TreeWalkerImpl.internal_() : super.internal_();
+ get runtimeType => TreeWalker;
+ toString() => super.toString();
+}
+patch class UIEvent {
+ static Type get instanceRuntimeType => UIEventImpl;
+
+}
+class UIEventImpl extends UIEvent implements js_library.JSObjectInterfacesDom {
+ UIEventImpl.internal_() : super.internal_();
+ get runtimeType => UIEvent;
+ toString() => super.toString();
+}
+patch class UListElement {
+ static Type get instanceRuntimeType => UListElementImpl;
+
+}
+class UListElementImpl extends UListElement implements js_library.JSObjectInterfacesDom {
+ UListElementImpl.internal_() : super.internal_();
+ get runtimeType => UListElement;
+ toString() => super.toString();
+}
+patch class UnknownElement {
+ static Type get instanceRuntimeType => UnknownElementImpl;
+
+}
+class UnknownElementImpl extends UnknownElement implements js_library.JSObjectInterfacesDom {
+ UnknownElementImpl.internal_() : super.internal_();
+ get runtimeType => UnknownElement;
+ toString() => super.toString();
+}
+patch class Url {
+ static Type get instanceRuntimeType => UrlImpl;
+
+}
+class UrlImpl extends Url implements js_library.JSObjectInterfacesDom {
+ UrlImpl.internal_() : super.internal_();
+ get runtimeType => Url;
+ toString() => super.toString();
+}
+patch class UrlUtils {
+ static Type get instanceRuntimeType => UrlUtilsImpl;
+
+}
+class UrlUtilsImpl extends UrlUtils implements js_library.JSObjectInterfacesDom {
+ UrlUtilsImpl.internal_() : super.internal_();
+ get runtimeType => UrlUtils;
+ toString() => super.toString();
+}
+patch class UrlUtilsReadOnly {
+ static Type get instanceRuntimeType => UrlUtilsReadOnlyImpl;
+
+}
+class UrlUtilsReadOnlyImpl extends UrlUtilsReadOnly implements js_library.JSObjectInterfacesDom {
+ UrlUtilsReadOnlyImpl.internal_() : super.internal_();
+ get runtimeType => UrlUtilsReadOnly;
+ toString() => super.toString();
+}
+patch class VRDevice {
+ static Type get instanceRuntimeType => VRDeviceImpl;
+
+}
+class VRDeviceImpl extends VRDevice implements js_library.JSObjectInterfacesDom {
+ VRDeviceImpl.internal_() : super.internal_();
+ get runtimeType => VRDevice;
+ toString() => super.toString();
+}
+patch class VREyeParameters {
+ static Type get instanceRuntimeType => VREyeParametersImpl;
+
+}
+class VREyeParametersImpl extends VREyeParameters implements js_library.JSObjectInterfacesDom {
+ VREyeParametersImpl.internal_() : super.internal_();
+ get runtimeType => VREyeParameters;
+ toString() => super.toString();
+}
+patch class VRFieldOfView {
+ static Type get instanceRuntimeType => VRFieldOfViewImpl;
+
+}
+class VRFieldOfViewImpl extends VRFieldOfView implements js_library.JSObjectInterfacesDom {
+ VRFieldOfViewImpl.internal_() : super.internal_();
+ get runtimeType => VRFieldOfView;
+ toString() => super.toString();
+}
+patch class VRPositionState {
+ static Type get instanceRuntimeType => VRPositionStateImpl;
+
+}
+class VRPositionStateImpl extends VRPositionState implements js_library.JSObjectInterfacesDom {
+ VRPositionStateImpl.internal_() : super.internal_();
+ get runtimeType => VRPositionState;
+ toString() => super.toString();
+}
+patch class ValidityState {
+ static Type get instanceRuntimeType => ValidityStateImpl;
+
+}
+class ValidityStateImpl extends ValidityState implements js_library.JSObjectInterfacesDom {
+ ValidityStateImpl.internal_() : super.internal_();
+ get runtimeType => ValidityState;
+ toString() => super.toString();
+}
+patch class VideoElement {
+ static Type get instanceRuntimeType => VideoElementImpl;
+
+}
+class VideoElementImpl extends VideoElement implements js_library.JSObjectInterfacesDom {
+ VideoElementImpl.internal_() : super.internal_();
+ get runtimeType => VideoElement;
+ toString() => super.toString();
+}
+patch class VideoPlaybackQuality {
+ static Type get instanceRuntimeType => VideoPlaybackQualityImpl;
+
+}
+class VideoPlaybackQualityImpl extends VideoPlaybackQuality implements js_library.JSObjectInterfacesDom {
+ VideoPlaybackQualityImpl.internal_() : super.internal_();
+ get runtimeType => VideoPlaybackQuality;
+ toString() => super.toString();
+}
+patch class VideoTrack {
+ static Type get instanceRuntimeType => VideoTrackImpl;
+
+}
+class VideoTrackImpl extends VideoTrack implements js_library.JSObjectInterfacesDom {
+ VideoTrackImpl.internal_() : super.internal_();
+ get runtimeType => VideoTrack;
+ toString() => super.toString();
+}
+patch class VideoTrackList {
+ static Type get instanceRuntimeType => VideoTrackListImpl;
+
+}
+class VideoTrackListImpl extends VideoTrackList implements js_library.JSObjectInterfacesDom {
+ VideoTrackListImpl.internal_() : super.internal_();
+ get runtimeType => VideoTrackList;
+ toString() => super.toString();
+}
+patch class VttCue {
+ static Type get instanceRuntimeType => VttCueImpl;
+
+}
+class VttCueImpl extends VttCue implements js_library.JSObjectInterfacesDom {
+ VttCueImpl.internal_() : super.internal_();
+ get runtimeType => VttCue;
+ toString() => super.toString();
+}
+patch class VttRegion {
+ static Type get instanceRuntimeType => VttRegionImpl;
+
+}
+class VttRegionImpl extends VttRegion implements js_library.JSObjectInterfacesDom {
+ VttRegionImpl.internal_() : super.internal_();
+ get runtimeType => VttRegion;
+ toString() => super.toString();
+}
+patch class VttRegionList {
+ static Type get instanceRuntimeType => VttRegionListImpl;
+
+}
+class VttRegionListImpl extends VttRegionList implements js_library.JSObjectInterfacesDom {
+ VttRegionListImpl.internal_() : super.internal_();
+ get runtimeType => VttRegionList;
+ toString() => super.toString();
+}
+patch class WebSocket {
+ static Type get instanceRuntimeType => WebSocketImpl;
+
+}
+class WebSocketImpl extends WebSocket implements js_library.JSObjectInterfacesDom {
+ WebSocketImpl.internal_() : super.internal_();
+ get runtimeType => WebSocket;
+ toString() => super.toString();
+}
+patch class WheelEvent {
+ static Type get instanceRuntimeType => WheelEventImpl;
+
+}
+class WheelEventImpl extends WheelEvent implements js_library.JSObjectInterfacesDom {
+ WheelEventImpl.internal_() : super.internal_();
+ get runtimeType => WheelEvent;
+ toString() => super.toString();
+}
+patch class Window {
+ static Type get instanceRuntimeType => WindowImpl;
+
+}
+class WindowImpl extends Window implements js_library.JSObjectInterfacesDom {
+ WindowImpl.internal_() : super.internal_();
+ get runtimeType => Window;
+ toString() => super.toString();
+}
+patch class WindowBase64 {
+ static Type get instanceRuntimeType => WindowBase64Impl;
+
+}
+class WindowBase64Impl extends WindowBase64 implements js_library.JSObjectInterfacesDom {
+ WindowBase64Impl.internal_() : super.internal_();
+ get runtimeType => WindowBase64;
+ toString() => super.toString();
+}
+patch class WindowClient {
+ static Type get instanceRuntimeType => WindowClientImpl;
+
+}
+class WindowClientImpl extends WindowClient implements js_library.JSObjectInterfacesDom {
+ WindowClientImpl.internal_() : super.internal_();
+ get runtimeType => WindowClient;
+ toString() => super.toString();
+}
+patch class WindowEventHandlers {
+ static Type get instanceRuntimeType => WindowEventHandlersImpl;
+
+}
+class WindowEventHandlersImpl extends WindowEventHandlers implements js_library.JSObjectInterfacesDom {
+ WindowEventHandlersImpl.internal_() : super.internal_();
+ get runtimeType => WindowEventHandlers;
+ toString() => super.toString();
+}
+patch class Worker {
+ static Type get instanceRuntimeType => WorkerImpl;
+
+}
+class WorkerImpl extends Worker implements js_library.JSObjectInterfacesDom {
+ WorkerImpl.internal_() : super.internal_();
+ get runtimeType => Worker;
+ toString() => super.toString();
+}
+patch class WorkerConsole {
+ static Type get instanceRuntimeType => WorkerConsoleImpl;
+
+}
+class WorkerConsoleImpl extends WorkerConsole implements js_library.JSObjectInterfacesDom {
+ WorkerConsoleImpl.internal_() : super.internal_();
+ get runtimeType => WorkerConsole;
+ toString() => super.toString();
+}
+patch class WorkerGlobalScope {
+ static Type get instanceRuntimeType => WorkerGlobalScopeImpl;
+
+}
+class WorkerGlobalScopeImpl extends WorkerGlobalScope implements js_library.JSObjectInterfacesDom {
+ WorkerGlobalScopeImpl.internal_() : super.internal_();
+ get runtimeType => WorkerGlobalScope;
+ toString() => super.toString();
+}
+patch class WorkerPerformance {
+ static Type get instanceRuntimeType => WorkerPerformanceImpl;
+
+}
+class WorkerPerformanceImpl extends WorkerPerformance implements js_library.JSObjectInterfacesDom {
+ WorkerPerformanceImpl.internal_() : super.internal_();
+ get runtimeType => WorkerPerformance;
+ toString() => super.toString();
+}
+patch class XPathEvaluator {
+ static Type get instanceRuntimeType => XPathEvaluatorImpl;
+
+}
+class XPathEvaluatorImpl extends XPathEvaluator implements js_library.JSObjectInterfacesDom {
+ XPathEvaluatorImpl.internal_() : super.internal_();
+ get runtimeType => XPathEvaluator;
+ toString() => super.toString();
+}
+patch class XPathExpression {
+ static Type get instanceRuntimeType => XPathExpressionImpl;
+
+}
+class XPathExpressionImpl extends XPathExpression implements js_library.JSObjectInterfacesDom {
+ XPathExpressionImpl.internal_() : super.internal_();
+ get runtimeType => XPathExpression;
+ toString() => super.toString();
+}
patch class XPathNSResolver {
static Type get instanceRuntimeType => XPathNSResolverImpl;
@@ -4047,6 +3678,168 @@
get runtimeType => XPathNSResolver;
toString() => super.toString();
}
+patch class XPathResult {
+ static Type get instanceRuntimeType => XPathResultImpl;
+
+}
+class XPathResultImpl extends XPathResult implements js_library.JSObjectInterfacesDom {
+ XPathResultImpl.internal_() : super.internal_();
+ get runtimeType => XPathResult;
+ toString() => super.toString();
+}
+patch class XmlDocument {
+ static Type get instanceRuntimeType => XmlDocumentImpl;
+
+}
+class XmlDocumentImpl extends XmlDocument implements js_library.JSObjectInterfacesDom {
+ XmlDocumentImpl.internal_() : super.internal_();
+ get runtimeType => XmlDocument;
+ toString() => super.toString();
+}
+patch class XmlSerializer {
+ static Type get instanceRuntimeType => XmlSerializerImpl;
+
+}
+class XmlSerializerImpl extends XmlSerializer implements js_library.JSObjectInterfacesDom {
+ XmlSerializerImpl.internal_() : super.internal_();
+ get runtimeType => XmlSerializer;
+ toString() => super.toString();
+}
+patch class XsltProcessor {
+ static Type get instanceRuntimeType => XsltProcessorImpl;
+
+}
+class XsltProcessorImpl extends XsltProcessor implements js_library.JSObjectInterfacesDom {
+ XsltProcessorImpl.internal_() : super.internal_();
+ get runtimeType => XsltProcessor;
+ toString() => super.toString();
+}
+patch class _Attr {
+ static Type get instanceRuntimeType => _AttrImpl;
+
+}
+class _AttrImpl extends _Attr implements js_library.JSObjectInterfacesDom {
+ _AttrImpl.internal_() : super.internal_();
+ get runtimeType => _Attr;
+ toString() => super.toString();
+}
+patch class _Cache {
+ static Type get instanceRuntimeType => _CacheImpl;
+
+}
+class _CacheImpl extends _Cache implements js_library.JSObjectInterfacesDom {
+ _CacheImpl.internal_() : super.internal_();
+ get runtimeType => _Cache;
+ toString() => super.toString();
+}
+patch class _CanvasPathMethods {
+ static Type get instanceRuntimeType => _CanvasPathMethodsImpl;
+
+}
+class _CanvasPathMethodsImpl extends _CanvasPathMethods implements js_library.JSObjectInterfacesDom {
+ _CanvasPathMethodsImpl.internal_() : super.internal_();
+ get runtimeType => _CanvasPathMethods;
+ toString() => super.toString();
+}
+patch class _ClientRect {
+ static Type get instanceRuntimeType => _ClientRectImpl;
+
+}
+class _ClientRectImpl extends _ClientRect implements js_library.JSObjectInterfacesDom {
+ _ClientRectImpl.internal_() : super.internal_();
+ get runtimeType => _ClientRect;
+ toString() => super.toString();
+}
+patch class _ClientRectList {
+ static Type get instanceRuntimeType => _ClientRectListImpl;
+
+}
+class _ClientRectListImpl extends _ClientRectList implements js_library.JSObjectInterfacesDom {
+ _ClientRectListImpl.internal_() : super.internal_();
+ get runtimeType => _ClientRectList;
+ toString() => super.toString();
+}
+patch class _CssRuleList {
+ static Type get instanceRuntimeType => _CssRuleListImpl;
+
+}
+class _CssRuleListImpl extends _CssRuleList implements js_library.JSObjectInterfacesDom {
+ _CssRuleListImpl.internal_() : super.internal_();
+ get runtimeType => _CssRuleList;
+ toString() => super.toString();
+}
+patch class _DOMFileSystemSync {
+ static Type get instanceRuntimeType => _DOMFileSystemSyncImpl;
+
+}
+class _DOMFileSystemSyncImpl extends _DOMFileSystemSync implements js_library.JSObjectInterfacesDom {
+ _DOMFileSystemSyncImpl.internal_() : super.internal_();
+ get runtimeType => _DOMFileSystemSync;
+ toString() => super.toString();
+}
+patch class _DirectoryEntrySync {
+ static Type get instanceRuntimeType => _DirectoryEntrySyncImpl;
+
+}
+class _DirectoryEntrySyncImpl extends _DirectoryEntrySync implements js_library.JSObjectInterfacesDom {
+ _DirectoryEntrySyncImpl.internal_() : super.internal_();
+ get runtimeType => _DirectoryEntrySync;
+ toString() => super.toString();
+}
+patch class _DirectoryReaderSync {
+ static Type get instanceRuntimeType => _DirectoryReaderSyncImpl;
+
+}
+class _DirectoryReaderSyncImpl extends _DirectoryReaderSync implements js_library.JSObjectInterfacesDom {
+ _DirectoryReaderSyncImpl.internal_() : super.internal_();
+ get runtimeType => _DirectoryReaderSync;
+ toString() => super.toString();
+}
+patch class _DocumentType {
+ static Type get instanceRuntimeType => _DocumentTypeImpl;
+
+}
+class _DocumentTypeImpl extends _DocumentType implements js_library.JSObjectInterfacesDom {
+ _DocumentTypeImpl.internal_() : super.internal_();
+ get runtimeType => _DocumentType;
+ toString() => super.toString();
+}
+patch class _DomRect {
+ static Type get instanceRuntimeType => _DomRectImpl;
+
+}
+class _DomRectImpl extends _DomRect implements js_library.JSObjectInterfacesDom {
+ _DomRectImpl.internal_() : super.internal_();
+ get runtimeType => _DomRect;
+ toString() => super.toString();
+}
+patch class _EntrySync {
+ static Type get instanceRuntimeType => _EntrySyncImpl;
+
+}
+class _EntrySyncImpl extends _EntrySync implements js_library.JSObjectInterfacesDom {
+ _EntrySyncImpl.internal_() : super.internal_();
+ get runtimeType => _EntrySync;
+ toString() => super.toString();
+}
+patch class _FileEntrySync {
+ static Type get instanceRuntimeType => _FileEntrySyncImpl;
+
+}
+class _FileEntrySyncImpl extends _FileEntrySync implements js_library.JSObjectInterfacesDom {
+ _FileEntrySyncImpl.internal_() : super.internal_();
+ get runtimeType => _FileEntrySync;
+ toString() => super.toString();
+}
+patch class _FileReaderSync {
+ static Type get instanceRuntimeType => _FileReaderSyncImpl;
+
+}
+class _FileReaderSyncImpl extends _FileReaderSync implements js_library.JSObjectInterfacesDom {
+ _FileReaderSyncImpl.internal_() : super.internal_();
+ get runtimeType => _FileReaderSync;
+ toString() => super.toString();
+}
patch class _FileWriterSync {
static Type get instanceRuntimeType => _FileWriterSyncImpl;
@@ -4056,6 +3849,213 @@
get runtimeType => _FileWriterSync;
toString() => super.toString();
}
+patch class _GamepadList {
+ static Type get instanceRuntimeType => _GamepadListImpl;
+
+}
+class _GamepadListImpl extends _GamepadList implements js_library.JSObjectInterfacesDom {
+ _GamepadListImpl.internal_() : super.internal_();
+ get runtimeType => _GamepadList;
+ toString() => super.toString();
+}
+patch class _HTMLAllCollection {
+ static Type get instanceRuntimeType => _HTMLAllCollectionImpl;
+
+}
+class _HTMLAllCollectionImpl extends _HTMLAllCollection implements js_library.JSObjectInterfacesDom {
+ _HTMLAllCollectionImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLAllCollection;
+ toString() => super.toString();
+}
+patch class _HTMLAppletElement {
+ static Type get instanceRuntimeType => _HTMLAppletElementImpl;
+
+}
+class _HTMLAppletElementImpl extends _HTMLAppletElement implements js_library.JSObjectInterfacesDom {
+ _HTMLAppletElementImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLAppletElement;
+ toString() => super.toString();
+}
+patch class _HTMLDirectoryElement {
+ static Type get instanceRuntimeType => _HTMLDirectoryElementImpl;
+
+}
+class _HTMLDirectoryElementImpl extends _HTMLDirectoryElement implements js_library.JSObjectInterfacesDom {
+ _HTMLDirectoryElementImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLDirectoryElement;
+ toString() => super.toString();
+}
+patch class _HTMLFontElement {
+ static Type get instanceRuntimeType => _HTMLFontElementImpl;
+
+}
+class _HTMLFontElementImpl extends _HTMLFontElement implements js_library.JSObjectInterfacesDom {
+ _HTMLFontElementImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLFontElement;
+ toString() => super.toString();
+}
+patch class _HTMLFrameElement {
+ static Type get instanceRuntimeType => _HTMLFrameElementImpl;
+
+}
+class _HTMLFrameElementImpl extends _HTMLFrameElement implements js_library.JSObjectInterfacesDom {
+ _HTMLFrameElementImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLFrameElement;
+ toString() => super.toString();
+}
+patch class _HTMLFrameSetElement {
+ static Type get instanceRuntimeType => _HTMLFrameSetElementImpl;
+
+}
+class _HTMLFrameSetElementImpl extends _HTMLFrameSetElement implements js_library.JSObjectInterfacesDom {
+ _HTMLFrameSetElementImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLFrameSetElement;
+ toString() => super.toString();
+}
+patch class _HTMLMarqueeElement {
+ static Type get instanceRuntimeType => _HTMLMarqueeElementImpl;
+
+}
+class _HTMLMarqueeElementImpl extends _HTMLMarqueeElement implements js_library.JSObjectInterfacesDom {
+ _HTMLMarqueeElementImpl.internal_() : super.internal_();
+ get runtimeType => _HTMLMarqueeElement;
+ toString() => super.toString();
+}
+patch class _MutationEvent {
+ static Type get instanceRuntimeType => _MutationEventImpl;
+
+}
+class _MutationEventImpl extends _MutationEvent implements js_library.JSObjectInterfacesDom {
+ _MutationEventImpl.internal_() : super.internal_();
+ get runtimeType => _MutationEvent;
+ toString() => super.toString();
+}
+patch class _NamedNodeMap {
+ static Type get instanceRuntimeType => _NamedNodeMapImpl;
+
+}
+class _NamedNodeMapImpl extends _NamedNodeMap implements js_library.JSObjectInterfacesDom {
+ _NamedNodeMapImpl.internal_() : super.internal_();
+ get runtimeType => _NamedNodeMap;
+ toString() => super.toString();
+}
+patch class _PagePopupController {
+ static Type get instanceRuntimeType => _PagePopupControllerImpl;
+
+}
+class _PagePopupControllerImpl extends _PagePopupController implements js_library.JSObjectInterfacesDom {
+ _PagePopupControllerImpl.internal_() : super.internal_();
+ get runtimeType => _PagePopupController;
+ toString() => super.toString();
+}
+patch class _RadioNodeList {
+ static Type get instanceRuntimeType => _RadioNodeListImpl;
+
+}
+class _RadioNodeListImpl extends _RadioNodeList implements js_library.JSObjectInterfacesDom {
+ _RadioNodeListImpl.internal_() : super.internal_();
+ get runtimeType => _RadioNodeList;
+ toString() => super.toString();
+}
+patch class _Request {
+ static Type get instanceRuntimeType => _RequestImpl;
+
+}
+class _RequestImpl extends _Request implements js_library.JSObjectInterfacesDom {
+ _RequestImpl.internal_() : super.internal_();
+ get runtimeType => _Request;
+ toString() => super.toString();
+}
+patch class _Response {
+ static Type get instanceRuntimeType => _ResponseImpl;
+
+}
+class _ResponseImpl extends _Response implements js_library.JSObjectInterfacesDom {
+ _ResponseImpl.internal_() : super.internal_();
+ get runtimeType => _Response;
+ toString() => super.toString();
+}
+patch class _ServiceWorker {
+ static Type get instanceRuntimeType => _ServiceWorkerImpl;
+
+}
+class _ServiceWorkerImpl extends _ServiceWorker implements js_library.JSObjectInterfacesDom {
+ _ServiceWorkerImpl.internal_() : super.internal_();
+ get runtimeType => _ServiceWorker;
+ toString() => super.toString();
+}
+patch class _SpeechRecognitionResultList {
+ static Type get instanceRuntimeType => _SpeechRecognitionResultListImpl;
+
+}
+class _SpeechRecognitionResultListImpl extends _SpeechRecognitionResultList implements js_library.JSObjectInterfacesDom {
+ _SpeechRecognitionResultListImpl.internal_() : super.internal_();
+ get runtimeType => _SpeechRecognitionResultList;
+ toString() => super.toString();
+}
+patch class _StyleSheetList {
+ static Type get instanceRuntimeType => _StyleSheetListImpl;
+
+}
+class _StyleSheetListImpl extends _StyleSheetList implements js_library.JSObjectInterfacesDom {
+ _StyleSheetListImpl.internal_() : super.internal_();
+ get runtimeType => _StyleSheetList;
+ toString() => super.toString();
+}
+patch class _SubtleCrypto {
+ static Type get instanceRuntimeType => _SubtleCryptoImpl;
+
+}
+class _SubtleCryptoImpl extends _SubtleCrypto implements js_library.JSObjectInterfacesDom {
+ _SubtleCryptoImpl.internal_() : super.internal_();
+ get runtimeType => _SubtleCrypto;
+ toString() => super.toString();
+}
+patch class _WebKitCSSMatrix {
+ static Type get instanceRuntimeType => _WebKitCSSMatrixImpl;
+
+}
+class _WebKitCSSMatrixImpl extends _WebKitCSSMatrix implements js_library.JSObjectInterfacesDom {
+ _WebKitCSSMatrixImpl.internal_() : super.internal_();
+ get runtimeType => _WebKitCSSMatrix;
+ toString() => super.toString();
+}
+patch class _WindowTimers {
+ static Type get instanceRuntimeType => _WindowTimersImpl;
+
+}
+class _WindowTimersImpl extends _WindowTimers implements js_library.JSObjectInterfacesDom {
+ _WindowTimersImpl.internal_() : super.internal_();
+ get runtimeType => _WindowTimers;
+ toString() => super.toString();
+}
+patch class _WorkerLocation {
+ static Type get instanceRuntimeType => _WorkerLocationImpl;
+
+}
+class _WorkerLocationImpl extends _WorkerLocation implements js_library.JSObjectInterfacesDom {
+ _WorkerLocationImpl.internal_() : super.internal_();
+ get runtimeType => _WorkerLocation;
+ toString() => super.toString();
+}
+patch class _WorkerNavigator {
+ static Type get instanceRuntimeType => _WorkerNavigatorImpl;
+
+}
+class _WorkerNavigatorImpl extends _WorkerNavigator implements js_library.JSObjectInterfacesDom {
+ _WorkerNavigatorImpl.internal_() : super.internal_();
+ get runtimeType => _WorkerNavigator;
+ toString() => super.toString();
+}
+patch class _XMLHttpRequestProgressEvent {
+ static Type get instanceRuntimeType => _XMLHttpRequestProgressEventImpl;
+
+}
+class _XMLHttpRequestProgressEventImpl extends _XMLHttpRequestProgressEvent implements js_library.JSObjectInterfacesDom {
+ _XMLHttpRequestProgressEventImpl.internal_() : super.internal_();
+ get runtimeType => _XMLHttpRequestProgressEvent;
+ toString() => super.toString();
+}
"""],"dart:indexed_db": ["dart:indexed_db", "dart:indexed_db_js_interop_patch.dart", """import 'dart:js' as js_library;
@@ -4065,15 +4065,6 @@
*/
const _UNDEFINED_JS_CONST = const Object();
-patch class IdbFactory {
- static Type get instanceRuntimeType => IdbFactoryImpl;
-
-}
-class IdbFactoryImpl extends IdbFactory implements js_library.JSObjectInterfacesDom {
- IdbFactoryImpl.internal_() : super.internal_();
- get runtimeType => IdbFactory;
- toString() => super.toString();
-}
patch class Cursor {
static Type get instanceRuntimeType => CursorImpl;
@@ -4083,78 +4074,6 @@
get runtimeType => Cursor;
toString() => super.toString();
}
-patch class Transaction {
- static Type get instanceRuntimeType => TransactionImpl;
-
-}
-class TransactionImpl extends Transaction implements js_library.JSObjectInterfacesDom {
- TransactionImpl.internal_() : super.internal_();
- get runtimeType => Transaction;
- toString() => super.toString();
-}
-patch class KeyRange {
- static Type get instanceRuntimeType => KeyRangeImpl;
-
-}
-class KeyRangeImpl extends KeyRange implements js_library.JSObjectInterfacesDom {
- KeyRangeImpl.internal_() : super.internal_();
- get runtimeType => KeyRange;
- toString() => super.toString();
-}
-patch class Request {
- static Type get instanceRuntimeType => RequestImpl;
-
-}
-class RequestImpl extends Request implements js_library.JSObjectInterfacesDom {
- RequestImpl.internal_() : super.internal_();
- get runtimeType => Request;
- toString() => super.toString();
-}
-patch class OpenDBRequest {
- static Type get instanceRuntimeType => OpenDBRequestImpl;
-
-}
-class OpenDBRequestImpl extends OpenDBRequest implements js_library.JSObjectInterfacesDom {
- OpenDBRequestImpl.internal_() : super.internal_();
- get runtimeType => OpenDBRequest;
- toString() => super.toString();
-}
-patch class Database {
- static Type get instanceRuntimeType => DatabaseImpl;
-
-}
-class DatabaseImpl extends Database implements js_library.JSObjectInterfacesDom {
- DatabaseImpl.internal_() : super.internal_();
- get runtimeType => Database;
- toString() => super.toString();
-}
-patch class Index {
- static Type get instanceRuntimeType => IndexImpl;
-
-}
-class IndexImpl extends Index implements js_library.JSObjectInterfacesDom {
- IndexImpl.internal_() : super.internal_();
- get runtimeType => Index;
- toString() => super.toString();
-}
-patch class ObjectStore {
- static Type get instanceRuntimeType => ObjectStoreImpl;
-
-}
-class ObjectStoreImpl extends ObjectStore implements js_library.JSObjectInterfacesDom {
- ObjectStoreImpl.internal_() : super.internal_();
- get runtimeType => ObjectStore;
- toString() => super.toString();
-}
-patch class VersionChangeEvent {
- static Type get instanceRuntimeType => VersionChangeEventImpl;
-
-}
-class VersionChangeEventImpl extends VersionChangeEvent implements js_library.JSObjectInterfacesDom {
- VersionChangeEventImpl.internal_() : super.internal_();
- get runtimeType => VersionChangeEvent;
- toString() => super.toString();
-}
patch class CursorWithValue {
static Type get instanceRuntimeType => CursorWithValueImpl;
@@ -4164,6 +4083,87 @@
get runtimeType => CursorWithValue;
toString() => super.toString();
}
+patch class Database {
+ static Type get instanceRuntimeType => DatabaseImpl;
+
+}
+class DatabaseImpl extends Database implements js_library.JSObjectInterfacesDom {
+ DatabaseImpl.internal_() : super.internal_();
+ get runtimeType => Database;
+ toString() => super.toString();
+}
+patch class IdbFactory {
+ static Type get instanceRuntimeType => IdbFactoryImpl;
+
+}
+class IdbFactoryImpl extends IdbFactory implements js_library.JSObjectInterfacesDom {
+ IdbFactoryImpl.internal_() : super.internal_();
+ get runtimeType => IdbFactory;
+ toString() => super.toString();
+}
+patch class Index {
+ static Type get instanceRuntimeType => IndexImpl;
+
+}
+class IndexImpl extends Index implements js_library.JSObjectInterfacesDom {
+ IndexImpl.internal_() : super.internal_();
+ get runtimeType => Index;
+ toString() => super.toString();
+}
+patch class KeyRange {
+ static Type get instanceRuntimeType => KeyRangeImpl;
+
+}
+class KeyRangeImpl extends KeyRange implements js_library.JSObjectInterfacesDom {
+ KeyRangeImpl.internal_() : super.internal_();
+ get runtimeType => KeyRange;
+ toString() => super.toString();
+}
+patch class ObjectStore {
+ static Type get instanceRuntimeType => ObjectStoreImpl;
+
+}
+class ObjectStoreImpl extends ObjectStore implements js_library.JSObjectInterfacesDom {
+ ObjectStoreImpl.internal_() : super.internal_();
+ get runtimeType => ObjectStore;
+ toString() => super.toString();
+}
+patch class OpenDBRequest {
+ static Type get instanceRuntimeType => OpenDBRequestImpl;
+
+}
+class OpenDBRequestImpl extends OpenDBRequest implements js_library.JSObjectInterfacesDom {
+ OpenDBRequestImpl.internal_() : super.internal_();
+ get runtimeType => OpenDBRequest;
+ toString() => super.toString();
+}
+patch class Request {
+ static Type get instanceRuntimeType => RequestImpl;
+
+}
+class RequestImpl extends Request implements js_library.JSObjectInterfacesDom {
+ RequestImpl.internal_() : super.internal_();
+ get runtimeType => Request;
+ toString() => super.toString();
+}
+patch class Transaction {
+ static Type get instanceRuntimeType => TransactionImpl;
+
+}
+class TransactionImpl extends Transaction implements js_library.JSObjectInterfacesDom {
+ TransactionImpl.internal_() : super.internal_();
+ get runtimeType => Transaction;
+ toString() => super.toString();
+}
+patch class VersionChangeEvent {
+ static Type get instanceRuntimeType => VersionChangeEventImpl;
+
+}
+class VersionChangeEventImpl extends VersionChangeEvent implements js_library.JSObjectInterfacesDom {
+ VersionChangeEventImpl.internal_() : super.internal_();
+ get runtimeType => VersionChangeEvent;
+ toString() => super.toString();
+}
"""],"dart:web_gl": ["dart:web_gl", "dart:web_gl_js_interop_patch.dart", """import 'dart:js' as js_library;
@@ -4173,204 +4173,6 @@
*/
const _UNDEFINED_JS_CONST = const Object();
-patch class Buffer {
- static Type get instanceRuntimeType => BufferImpl;
-
-}
-class BufferImpl extends Buffer implements js_library.JSObjectInterfacesDom {
- BufferImpl.internal_() : super.internal_();
- get runtimeType => Buffer;
- toString() => super.toString();
-}
-patch class Texture {
- static Type get instanceRuntimeType => TextureImpl;
-
-}
-class TextureImpl extends Texture implements js_library.JSObjectInterfacesDom {
- TextureImpl.internal_() : super.internal_();
- get runtimeType => Texture;
- toString() => super.toString();
-}
-patch class VertexArrayObjectOes {
- static Type get instanceRuntimeType => VertexArrayObjectOesImpl;
-
-}
-class VertexArrayObjectOesImpl extends VertexArrayObjectOes implements js_library.JSObjectInterfacesDom {
- VertexArrayObjectOesImpl.internal_() : super.internal_();
- get runtimeType => VertexArrayObjectOes;
- toString() => super.toString();
-}
-patch class DepthTexture {
- static Type get instanceRuntimeType => DepthTextureImpl;
-
-}
-class DepthTextureImpl extends DepthTexture implements js_library.JSObjectInterfacesDom {
- DepthTextureImpl.internal_() : super.internal_();
- get runtimeType => DepthTexture;
- toString() => super.toString();
-}
-patch class OesTextureHalfFloatLinear {
- static Type get instanceRuntimeType => OesTextureHalfFloatLinearImpl;
-
-}
-class OesTextureHalfFloatLinearImpl extends OesTextureHalfFloatLinear implements js_library.JSObjectInterfacesDom {
- OesTextureHalfFloatLinearImpl.internal_() : super.internal_();
- get runtimeType => OesTextureHalfFloatLinear;
- toString() => super.toString();
-}
-patch class Sampler {
- static Type get instanceRuntimeType => SamplerImpl;
-
-}
-class SamplerImpl extends Sampler implements js_library.JSObjectInterfacesDom {
- SamplerImpl.internal_() : super.internal_();
- get runtimeType => Sampler;
- toString() => super.toString();
-}
-patch class Sync {
- static Type get instanceRuntimeType => SyncImpl;
-
-}
-class SyncImpl extends Sync implements js_library.JSObjectInterfacesDom {
- SyncImpl.internal_() : super.internal_();
- get runtimeType => Sync;
- toString() => super.toString();
-}
-patch class OesVertexArrayObject {
- static Type get instanceRuntimeType => OesVertexArrayObjectImpl;
-
-}
-class OesVertexArrayObjectImpl extends OesVertexArrayObject implements js_library.JSObjectInterfacesDom {
- OesVertexArrayObjectImpl.internal_() : super.internal_();
- get runtimeType => OesVertexArrayObject;
- toString() => super.toString();
-}
-patch class CompressedTextureS3TC {
- static Type get instanceRuntimeType => CompressedTextureS3TCImpl;
-
-}
-class CompressedTextureS3TCImpl extends CompressedTextureS3TC implements js_library.JSObjectInterfacesDom {
- CompressedTextureS3TCImpl.internal_() : super.internal_();
- get runtimeType => CompressedTextureS3TC;
- toString() => super.toString();
-}
-patch class ExtFragDepth {
- static Type get instanceRuntimeType => ExtFragDepthImpl;
-
-}
-class ExtFragDepthImpl extends ExtFragDepth implements js_library.JSObjectInterfacesDom {
- ExtFragDepthImpl.internal_() : super.internal_();
- get runtimeType => ExtFragDepth;
- toString() => super.toString();
-}
-patch class Shader {
- static Type get instanceRuntimeType => ShaderImpl;
-
-}
-class ShaderImpl extends Shader implements js_library.JSObjectInterfacesDom {
- ShaderImpl.internal_() : super.internal_();
- get runtimeType => Shader;
- toString() => super.toString();
-}
-patch class _WebGL2RenderingContextBase {
- static Type get instanceRuntimeType => _WebGL2RenderingContextBaseImpl;
-
-}
-class _WebGL2RenderingContextBaseImpl extends _WebGL2RenderingContextBase implements js_library.JSObjectInterfacesDom {
- _WebGL2RenderingContextBaseImpl.internal_() : super.internal_();
- get runtimeType => _WebGL2RenderingContextBase;
- toString() => super.toString();
-}
-patch class Query {
- static Type get instanceRuntimeType => QueryImpl;
-
-}
-class QueryImpl extends Query implements js_library.JSObjectInterfacesDom {
- QueryImpl.internal_() : super.internal_();
- get runtimeType => Query;
- toString() => super.toString();
-}
-patch class RenderingContext {
- static Type get instanceRuntimeType => RenderingContextImpl;
-
-}
-class RenderingContextImpl extends RenderingContext implements js_library.JSObjectInterfacesDom {
- RenderingContextImpl.internal_() : super.internal_();
- get runtimeType => RenderingContext;
- toString() => super.toString();
-}
-patch class ShaderPrecisionFormat {
- static Type get instanceRuntimeType => ShaderPrecisionFormatImpl;
-
-}
-class ShaderPrecisionFormatImpl extends ShaderPrecisionFormat implements js_library.JSObjectInterfacesDom {
- ShaderPrecisionFormatImpl.internal_() : super.internal_();
- get runtimeType => ShaderPrecisionFormat;
- toString() => super.toString();
-}
-patch class OesTextureHalfFloat {
- static Type get instanceRuntimeType => OesTextureHalfFloatImpl;
-
-}
-class OesTextureHalfFloatImpl extends OesTextureHalfFloat implements js_library.JSObjectInterfacesDom {
- OesTextureHalfFloatImpl.internal_() : super.internal_();
- get runtimeType => OesTextureHalfFloat;
- toString() => super.toString();
-}
-patch class ExtTextureFilterAnisotropic {
- static Type get instanceRuntimeType => ExtTextureFilterAnisotropicImpl;
-
-}
-class ExtTextureFilterAnisotropicImpl extends ExtTextureFilterAnisotropic implements js_library.JSObjectInterfacesDom {
- ExtTextureFilterAnisotropicImpl.internal_() : super.internal_();
- get runtimeType => ExtTextureFilterAnisotropic;
- toString() => super.toString();
-}
-patch class OesTextureFloat {
- static Type get instanceRuntimeType => OesTextureFloatImpl;
-
-}
-class OesTextureFloatImpl extends OesTextureFloat implements js_library.JSObjectInterfacesDom {
- OesTextureFloatImpl.internal_() : super.internal_();
- get runtimeType => OesTextureFloat;
- toString() => super.toString();
-}
-patch class VertexArrayObject {
- static Type get instanceRuntimeType => VertexArrayObjectImpl;
-
-}
-class VertexArrayObjectImpl extends VertexArrayObject implements js_library.JSObjectInterfacesDom {
- VertexArrayObjectImpl.internal_() : super.internal_();
- get runtimeType => VertexArrayObject;
- toString() => super.toString();
-}
-patch class CompressedTexturePvrtc {
- static Type get instanceRuntimeType => CompressedTexturePvrtcImpl;
-
-}
-class CompressedTexturePvrtcImpl extends CompressedTexturePvrtc implements js_library.JSObjectInterfacesDom {
- CompressedTexturePvrtcImpl.internal_() : super.internal_();
- get runtimeType => CompressedTexturePvrtc;
- toString() => super.toString();
-}
-patch class ChromiumSubscribeUniform {
- static Type get instanceRuntimeType => ChromiumSubscribeUniformImpl;
-
-}
-class ChromiumSubscribeUniformImpl extends ChromiumSubscribeUniform implements js_library.JSObjectInterfacesDom {
- ChromiumSubscribeUniformImpl.internal_() : super.internal_();
- get runtimeType => ChromiumSubscribeUniform;
- toString() => super.toString();
-}
-patch class _WebGLRenderingContextBase {
- static Type get instanceRuntimeType => _WebGLRenderingContextBaseImpl;
-
-}
-class _WebGLRenderingContextBaseImpl extends _WebGLRenderingContextBase implements js_library.JSObjectInterfacesDom {
- _WebGLRenderingContextBaseImpl.internal_() : super.internal_();
- get runtimeType => _WebGLRenderingContextBase;
- toString() => super.toString();
-}
patch class ActiveInfo {
static Type get instanceRuntimeType => ActiveInfoImpl;
@@ -4380,105 +4182,6 @@
get runtimeType => ActiveInfo;
toString() => super.toString();
}
-patch class TransformFeedback {
- static Type get instanceRuntimeType => TransformFeedbackImpl;
-
-}
-class TransformFeedbackImpl extends TransformFeedback implements js_library.JSObjectInterfacesDom {
- TransformFeedbackImpl.internal_() : super.internal_();
- get runtimeType => TransformFeedback;
- toString() => super.toString();
-}
-patch class ExtShaderTextureLod {
- static Type get instanceRuntimeType => ExtShaderTextureLodImpl;
-
-}
-class ExtShaderTextureLodImpl extends ExtShaderTextureLod implements js_library.JSObjectInterfacesDom {
- ExtShaderTextureLodImpl.internal_() : super.internal_();
- get runtimeType => ExtShaderTextureLod;
- toString() => super.toString();
-}
-patch class UniformLocation {
- static Type get instanceRuntimeType => UniformLocationImpl;
-
-}
-class UniformLocationImpl extends UniformLocation implements js_library.JSObjectInterfacesDom {
- UniformLocationImpl.internal_() : super.internal_();
- get runtimeType => UniformLocation;
- toString() => super.toString();
-}
-patch class ExtBlendMinMax {
- static Type get instanceRuntimeType => ExtBlendMinMaxImpl;
-
-}
-class ExtBlendMinMaxImpl extends ExtBlendMinMax implements js_library.JSObjectInterfacesDom {
- ExtBlendMinMaxImpl.internal_() : super.internal_();
- get runtimeType => ExtBlendMinMax;
- toString() => super.toString();
-}
-patch class Framebuffer {
- static Type get instanceRuntimeType => FramebufferImpl;
-
-}
-class FramebufferImpl extends Framebuffer implements js_library.JSObjectInterfacesDom {
- FramebufferImpl.internal_() : super.internal_();
- get runtimeType => Framebuffer;
- toString() => super.toString();
-}
-patch class OesStandardDerivatives {
- static Type get instanceRuntimeType => OesStandardDerivativesImpl;
-
-}
-class OesStandardDerivativesImpl extends OesStandardDerivatives implements js_library.JSObjectInterfacesDom {
- OesStandardDerivativesImpl.internal_() : super.internal_();
- get runtimeType => OesStandardDerivatives;
- toString() => super.toString();
-}
-patch class DrawBuffers {
- static Type get instanceRuntimeType => DrawBuffersImpl;
-
-}
-class DrawBuffersImpl extends DrawBuffers implements js_library.JSObjectInterfacesDom {
- DrawBuffersImpl.internal_() : super.internal_();
- get runtimeType => DrawBuffers;
- toString() => super.toString();
-}
-patch class OesTextureFloatLinear {
- static Type get instanceRuntimeType => OesTextureFloatLinearImpl;
-
-}
-class OesTextureFloatLinearImpl extends OesTextureFloatLinear implements js_library.JSObjectInterfacesDom {
- OesTextureFloatLinearImpl.internal_() : super.internal_();
- get runtimeType => OesTextureFloatLinear;
- toString() => super.toString();
-}
-patch class DebugShaders {
- static Type get instanceRuntimeType => DebugShadersImpl;
-
-}
-class DebugShadersImpl extends DebugShaders implements js_library.JSObjectInterfacesDom {
- DebugShadersImpl.internal_() : super.internal_();
- get runtimeType => DebugShaders;
- toString() => super.toString();
-}
-patch class Program {
- static Type get instanceRuntimeType => ProgramImpl;
-
-}
-class ProgramImpl extends Program implements js_library.JSObjectInterfacesDom {
- ProgramImpl.internal_() : super.internal_();
- get runtimeType => Program;
- toString() => super.toString();
-}
-patch class ContextEvent {
- static Type get instanceRuntimeType => ContextEventImpl;
-
-}
-class ContextEventImpl extends ContextEvent implements js_library.JSObjectInterfacesDom {
- ContextEventImpl.internal_() : super.internal_();
- get runtimeType => ContextEvent;
- toString() => super.toString();
-}
patch class AngleInstancedArrays {
static Type get instanceRuntimeType => AngleInstancedArraysImpl;
@@ -4488,13 +4191,22 @@
get runtimeType => AngleInstancedArrays;
toString() => super.toString();
}
-patch class DebugRendererInfo {
- static Type get instanceRuntimeType => DebugRendererInfoImpl;
+patch class Buffer {
+ static Type get instanceRuntimeType => BufferImpl;
}
-class DebugRendererInfoImpl extends DebugRendererInfo implements js_library.JSObjectInterfacesDom {
- DebugRendererInfoImpl.internal_() : super.internal_();
- get runtimeType => DebugRendererInfo;
+class BufferImpl extends Buffer implements js_library.JSObjectInterfacesDom {
+ BufferImpl.internal_() : super.internal_();
+ get runtimeType => Buffer;
+ toString() => super.toString();
+}
+patch class ChromiumSubscribeUniform {
+ static Type get instanceRuntimeType => ChromiumSubscribeUniformImpl;
+
+}
+class ChromiumSubscribeUniformImpl extends ChromiumSubscribeUniform implements js_library.JSObjectInterfacesDom {
+ ChromiumSubscribeUniformImpl.internal_() : super.internal_();
+ get runtimeType => ChromiumSubscribeUniform;
toString() => super.toString();
}
patch class CompressedTextureAtc {
@@ -4506,15 +4218,6 @@
get runtimeType => CompressedTextureAtc;
toString() => super.toString();
}
-patch class OesElementIndexUint {
- static Type get instanceRuntimeType => OesElementIndexUintImpl;
-
-}
-class OesElementIndexUintImpl extends OesElementIndexUint implements js_library.JSObjectInterfacesDom {
- OesElementIndexUintImpl.internal_() : super.internal_();
- get runtimeType => OesElementIndexUint;
- toString() => super.toString();
-}
patch class CompressedTextureETC1 {
static Type get instanceRuntimeType => CompressedTextureETC1Impl;
@@ -4524,31 +4227,67 @@
get runtimeType => CompressedTextureETC1;
toString() => super.toString();
}
-patch class LoseContext {
- static Type get instanceRuntimeType => LoseContextImpl;
+patch class CompressedTexturePvrtc {
+ static Type get instanceRuntimeType => CompressedTexturePvrtcImpl;
}
-class LoseContextImpl extends LoseContext implements js_library.JSObjectInterfacesDom {
- LoseContextImpl.internal_() : super.internal_();
- get runtimeType => LoseContext;
+class CompressedTexturePvrtcImpl extends CompressedTexturePvrtc implements js_library.JSObjectInterfacesDom {
+ CompressedTexturePvrtcImpl.internal_() : super.internal_();
+ get runtimeType => CompressedTexturePvrtc;
toString() => super.toString();
}
-patch class Renderbuffer {
- static Type get instanceRuntimeType => RenderbufferImpl;
+patch class CompressedTextureS3TC {
+ static Type get instanceRuntimeType => CompressedTextureS3TCImpl;
}
-class RenderbufferImpl extends Renderbuffer implements js_library.JSObjectInterfacesDom {
- RenderbufferImpl.internal_() : super.internal_();
- get runtimeType => Renderbuffer;
+class CompressedTextureS3TCImpl extends CompressedTextureS3TC implements js_library.JSObjectInterfacesDom {
+ CompressedTextureS3TCImpl.internal_() : super.internal_();
+ get runtimeType => CompressedTextureS3TC;
toString() => super.toString();
}
-patch class RenderingContext2 {
- static Type get instanceRuntimeType => RenderingContext2Impl;
+patch class ContextEvent {
+ static Type get instanceRuntimeType => ContextEventImpl;
}
-class RenderingContext2Impl extends RenderingContext2 implements js_library.JSObjectInterfacesDom {
- RenderingContext2Impl.internal_() : super.internal_();
- get runtimeType => RenderingContext2;
+class ContextEventImpl extends ContextEvent implements js_library.JSObjectInterfacesDom {
+ ContextEventImpl.internal_() : super.internal_();
+ get runtimeType => ContextEvent;
+ toString() => super.toString();
+}
+patch class DebugRendererInfo {
+ static Type get instanceRuntimeType => DebugRendererInfoImpl;
+
+}
+class DebugRendererInfoImpl extends DebugRendererInfo implements js_library.JSObjectInterfacesDom {
+ DebugRendererInfoImpl.internal_() : super.internal_();
+ get runtimeType => DebugRendererInfo;
+ toString() => super.toString();
+}
+patch class DebugShaders {
+ static Type get instanceRuntimeType => DebugShadersImpl;
+
+}
+class DebugShadersImpl extends DebugShaders implements js_library.JSObjectInterfacesDom {
+ DebugShadersImpl.internal_() : super.internal_();
+ get runtimeType => DebugShaders;
+ toString() => super.toString();
+}
+patch class DepthTexture {
+ static Type get instanceRuntimeType => DepthTextureImpl;
+
+}
+class DepthTextureImpl extends DepthTexture implements js_library.JSObjectInterfacesDom {
+ DepthTextureImpl.internal_() : super.internal_();
+ get runtimeType => DepthTexture;
+ toString() => super.toString();
+}
+patch class DrawBuffers {
+ static Type get instanceRuntimeType => DrawBuffersImpl;
+
+}
+class DrawBuffersImpl extends DrawBuffers implements js_library.JSObjectInterfacesDom {
+ DrawBuffersImpl.internal_() : super.internal_();
+ get runtimeType => DrawBuffers;
toString() => super.toString();
}
patch class EXTsRgb {
@@ -4560,6 +4299,267 @@
get runtimeType => EXTsRgb;
toString() => super.toString();
}
+patch class ExtBlendMinMax {
+ static Type get instanceRuntimeType => ExtBlendMinMaxImpl;
+
+}
+class ExtBlendMinMaxImpl extends ExtBlendMinMax implements js_library.JSObjectInterfacesDom {
+ ExtBlendMinMaxImpl.internal_() : super.internal_();
+ get runtimeType => ExtBlendMinMax;
+ toString() => super.toString();
+}
+patch class ExtFragDepth {
+ static Type get instanceRuntimeType => ExtFragDepthImpl;
+
+}
+class ExtFragDepthImpl extends ExtFragDepth implements js_library.JSObjectInterfacesDom {
+ ExtFragDepthImpl.internal_() : super.internal_();
+ get runtimeType => ExtFragDepth;
+ toString() => super.toString();
+}
+patch class ExtShaderTextureLod {
+ static Type get instanceRuntimeType => ExtShaderTextureLodImpl;
+
+}
+class ExtShaderTextureLodImpl extends ExtShaderTextureLod implements js_library.JSObjectInterfacesDom {
+ ExtShaderTextureLodImpl.internal_() : super.internal_();
+ get runtimeType => ExtShaderTextureLod;
+ toString() => super.toString();
+}
+patch class ExtTextureFilterAnisotropic {
+ static Type get instanceRuntimeType => ExtTextureFilterAnisotropicImpl;
+
+}
+class ExtTextureFilterAnisotropicImpl extends ExtTextureFilterAnisotropic implements js_library.JSObjectInterfacesDom {
+ ExtTextureFilterAnisotropicImpl.internal_() : super.internal_();
+ get runtimeType => ExtTextureFilterAnisotropic;
+ toString() => super.toString();
+}
+patch class Framebuffer {
+ static Type get instanceRuntimeType => FramebufferImpl;
+
+}
+class FramebufferImpl extends Framebuffer implements js_library.JSObjectInterfacesDom {
+ FramebufferImpl.internal_() : super.internal_();
+ get runtimeType => Framebuffer;
+ toString() => super.toString();
+}
+patch class LoseContext {
+ static Type get instanceRuntimeType => LoseContextImpl;
+
+}
+class LoseContextImpl extends LoseContext implements js_library.JSObjectInterfacesDom {
+ LoseContextImpl.internal_() : super.internal_();
+ get runtimeType => LoseContext;
+ toString() => super.toString();
+}
+patch class OesElementIndexUint {
+ static Type get instanceRuntimeType => OesElementIndexUintImpl;
+
+}
+class OesElementIndexUintImpl extends OesElementIndexUint implements js_library.JSObjectInterfacesDom {
+ OesElementIndexUintImpl.internal_() : super.internal_();
+ get runtimeType => OesElementIndexUint;
+ toString() => super.toString();
+}
+patch class OesStandardDerivatives {
+ static Type get instanceRuntimeType => OesStandardDerivativesImpl;
+
+}
+class OesStandardDerivativesImpl extends OesStandardDerivatives implements js_library.JSObjectInterfacesDom {
+ OesStandardDerivativesImpl.internal_() : super.internal_();
+ get runtimeType => OesStandardDerivatives;
+ toString() => super.toString();
+}
+patch class OesTextureFloat {
+ static Type get instanceRuntimeType => OesTextureFloatImpl;
+
+}
+class OesTextureFloatImpl extends OesTextureFloat implements js_library.JSObjectInterfacesDom {
+ OesTextureFloatImpl.internal_() : super.internal_();
+ get runtimeType => OesTextureFloat;
+ toString() => super.toString();
+}
+patch class OesTextureFloatLinear {
+ static Type get instanceRuntimeType => OesTextureFloatLinearImpl;
+
+}
+class OesTextureFloatLinearImpl extends OesTextureFloatLinear implements js_library.JSObjectInterfacesDom {
+ OesTextureFloatLinearImpl.internal_() : super.internal_();
+ get runtimeType => OesTextureFloatLinear;
+ toString() => super.toString();
+}
+patch class OesTextureHalfFloat {
+ static Type get instanceRuntimeType => OesTextureHalfFloatImpl;
+
+}
+class OesTextureHalfFloatImpl extends OesTextureHalfFloat implements js_library.JSObjectInterfacesDom {
+ OesTextureHalfFloatImpl.internal_() : super.internal_();
+ get runtimeType => OesTextureHalfFloat;
+ toString() => super.toString();
+}
+patch class OesTextureHalfFloatLinear {
+ static Type get instanceRuntimeType => OesTextureHalfFloatLinearImpl;
+
+}
+class OesTextureHalfFloatLinearImpl extends OesTextureHalfFloatLinear implements js_library.JSObjectInterfacesDom {
+ OesTextureHalfFloatLinearImpl.internal_() : super.internal_();
+ get runtimeType => OesTextureHalfFloatLinear;
+ toString() => super.toString();
+}
+patch class OesVertexArrayObject {
+ static Type get instanceRuntimeType => OesVertexArrayObjectImpl;
+
+}
+class OesVertexArrayObjectImpl extends OesVertexArrayObject implements js_library.JSObjectInterfacesDom {
+ OesVertexArrayObjectImpl.internal_() : super.internal_();
+ get runtimeType => OesVertexArrayObject;
+ toString() => super.toString();
+}
+patch class Program {
+ static Type get instanceRuntimeType => ProgramImpl;
+
+}
+class ProgramImpl extends Program implements js_library.JSObjectInterfacesDom {
+ ProgramImpl.internal_() : super.internal_();
+ get runtimeType => Program;
+ toString() => super.toString();
+}
+patch class Query {
+ static Type get instanceRuntimeType => QueryImpl;
+
+}
+class QueryImpl extends Query implements js_library.JSObjectInterfacesDom {
+ QueryImpl.internal_() : super.internal_();
+ get runtimeType => Query;
+ toString() => super.toString();
+}
+patch class Renderbuffer {
+ static Type get instanceRuntimeType => RenderbufferImpl;
+
+}
+class RenderbufferImpl extends Renderbuffer implements js_library.JSObjectInterfacesDom {
+ RenderbufferImpl.internal_() : super.internal_();
+ get runtimeType => Renderbuffer;
+ toString() => super.toString();
+}
+patch class RenderingContext {
+ static Type get instanceRuntimeType => RenderingContextImpl;
+
+}
+class RenderingContextImpl extends RenderingContext implements js_library.JSObjectInterfacesDom {
+ RenderingContextImpl.internal_() : super.internal_();
+ get runtimeType => RenderingContext;
+ toString() => super.toString();
+}
+patch class RenderingContext2 {
+ static Type get instanceRuntimeType => RenderingContext2Impl;
+
+}
+class RenderingContext2Impl extends RenderingContext2 implements js_library.JSObjectInterfacesDom {
+ RenderingContext2Impl.internal_() : super.internal_();
+ get runtimeType => RenderingContext2;
+ toString() => super.toString();
+}
+patch class Sampler {
+ static Type get instanceRuntimeType => SamplerImpl;
+
+}
+class SamplerImpl extends Sampler implements js_library.JSObjectInterfacesDom {
+ SamplerImpl.internal_() : super.internal_();
+ get runtimeType => Sampler;
+ toString() => super.toString();
+}
+patch class Shader {
+ static Type get instanceRuntimeType => ShaderImpl;
+
+}
+class ShaderImpl extends Shader implements js_library.JSObjectInterfacesDom {
+ ShaderImpl.internal_() : super.internal_();
+ get runtimeType => Shader;
+ toString() => super.toString();
+}
+patch class ShaderPrecisionFormat {
+ static Type get instanceRuntimeType => ShaderPrecisionFormatImpl;
+
+}
+class ShaderPrecisionFormatImpl extends ShaderPrecisionFormat implements js_library.JSObjectInterfacesDom {
+ ShaderPrecisionFormatImpl.internal_() : super.internal_();
+ get runtimeType => ShaderPrecisionFormat;
+ toString() => super.toString();
+}
+patch class Sync {
+ static Type get instanceRuntimeType => SyncImpl;
+
+}
+class SyncImpl extends Sync implements js_library.JSObjectInterfacesDom {
+ SyncImpl.internal_() : super.internal_();
+ get runtimeType => Sync;
+ toString() => super.toString();
+}
+patch class Texture {
+ static Type get instanceRuntimeType => TextureImpl;
+
+}
+class TextureImpl extends Texture implements js_library.JSObjectInterfacesDom {
+ TextureImpl.internal_() : super.internal_();
+ get runtimeType => Texture;
+ toString() => super.toString();
+}
+patch class TransformFeedback {
+ static Type get instanceRuntimeType => TransformFeedbackImpl;
+
+}
+class TransformFeedbackImpl extends TransformFeedback implements js_library.JSObjectInterfacesDom {
+ TransformFeedbackImpl.internal_() : super.internal_();
+ get runtimeType => TransformFeedback;
+ toString() => super.toString();
+}
+patch class UniformLocation {
+ static Type get instanceRuntimeType => UniformLocationImpl;
+
+}
+class UniformLocationImpl extends UniformLocation implements js_library.JSObjectInterfacesDom {
+ UniformLocationImpl.internal_() : super.internal_();
+ get runtimeType => UniformLocation;
+ toString() => super.toString();
+}
+patch class VertexArrayObject {
+ static Type get instanceRuntimeType => VertexArrayObjectImpl;
+
+}
+class VertexArrayObjectImpl extends VertexArrayObject implements js_library.JSObjectInterfacesDom {
+ VertexArrayObjectImpl.internal_() : super.internal_();
+ get runtimeType => VertexArrayObject;
+ toString() => super.toString();
+}
+patch class VertexArrayObjectOes {
+ static Type get instanceRuntimeType => VertexArrayObjectOesImpl;
+
+}
+class VertexArrayObjectOesImpl extends VertexArrayObjectOes implements js_library.JSObjectInterfacesDom {
+ VertexArrayObjectOesImpl.internal_() : super.internal_();
+ get runtimeType => VertexArrayObjectOes;
+ toString() => super.toString();
+}
+patch class _WebGL2RenderingContextBase {
+ static Type get instanceRuntimeType => _WebGL2RenderingContextBaseImpl;
+
+}
+class _WebGL2RenderingContextBaseImpl extends _WebGL2RenderingContextBase implements js_library.JSObjectInterfacesDom {
+ _WebGL2RenderingContextBaseImpl.internal_() : super.internal_();
+ get runtimeType => _WebGL2RenderingContextBase;
+ toString() => super.toString();
+}
+patch class _WebGLRenderingContextBase {
+ static Type get instanceRuntimeType => _WebGLRenderingContextBaseImpl;
+
+}
+class _WebGLRenderingContextBaseImpl extends _WebGLRenderingContextBase implements js_library.JSObjectInterfacesDom {
+ _WebGLRenderingContextBaseImpl.internal_() : super.internal_();
+ get runtimeType => _WebGLRenderingContextBase;
+ toString() => super.toString();
+}
"""],"dart:web_sql": ["dart:web_sql", "dart:web_sql_js_interop_patch.dart", """import 'dart:js' as js_library;
@@ -4569,6 +4569,15 @@
*/
const _UNDEFINED_JS_CONST = const Object();
+patch class SqlDatabase {
+ static Type get instanceRuntimeType => SqlDatabaseImpl;
+
+}
+class SqlDatabaseImpl extends SqlDatabase implements js_library.JSObjectInterfacesDom {
+ SqlDatabaseImpl.internal_() : super.internal_();
+ get runtimeType => SqlDatabase;
+ toString() => super.toString();
+}
patch class SqlError {
static Type get instanceRuntimeType => SqlErrorImpl;
@@ -4596,15 +4605,6 @@
get runtimeType => SqlResultSetRowList;
toString() => super.toString();
}
-patch class SqlDatabase {
- static Type get instanceRuntimeType => SqlDatabaseImpl;
-
-}
-class SqlDatabaseImpl extends SqlDatabase implements js_library.JSObjectInterfacesDom {
- SqlDatabaseImpl.internal_() : super.internal_();
- get runtimeType => SqlDatabase;
- toString() => super.toString();
-}
patch class SqlTransaction {
static Type get instanceRuntimeType => SqlTransactionImpl;
@@ -4623,427 +4623,13 @@
*/
const _UNDEFINED_JS_CONST = const Object();
-patch class AnimatedString {
- static Type get instanceRuntimeType => AnimatedStringImpl;
+patch class AElement {
+ static Type get instanceRuntimeType => AElementImpl;
}
-class AnimatedStringImpl extends AnimatedString implements js_library.JSObjectInterfacesDom {
- AnimatedStringImpl.internal_() : super.internal_();
- get runtimeType => AnimatedString;
- toString() => super.toString();
-}
-patch class FilterElement {
- static Type get instanceRuntimeType => FilterElementImpl;
-
-}
-class FilterElementImpl extends FilterElement implements js_library.JSObjectInterfacesDom {
- FilterElementImpl.internal_() : super.internal_();
- get runtimeType => FilterElement;
- toString() => super.toString();
-}
-patch class FilterPrimitiveStandardAttributes {
- static Type get instanceRuntimeType => FilterPrimitiveStandardAttributesImpl;
-
-}
-class FilterPrimitiveStandardAttributesImpl extends FilterPrimitiveStandardAttributes implements js_library.JSObjectInterfacesDom {
- FilterPrimitiveStandardAttributesImpl.internal_() : super.internal_();
- get runtimeType => FilterPrimitiveStandardAttributes;
- toString() => super.toString();
-}
-patch class PathSegLinetoRel {
- static Type get instanceRuntimeType => PathSegLinetoRelImpl;
-
-}
-class PathSegLinetoRelImpl extends PathSegLinetoRel implements js_library.JSObjectInterfacesDom {
- PathSegLinetoRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegLinetoRel;
- toString() => super.toString();
-}
-patch class UriReference {
- static Type get instanceRuntimeType => UriReferenceImpl;
-
-}
-class UriReferenceImpl extends UriReference implements js_library.JSObjectInterfacesDom {
- UriReferenceImpl.internal_() : super.internal_();
- get runtimeType => UriReference;
- toString() => super.toString();
-}
-patch class ImageElement {
- static Type get instanceRuntimeType => ImageElementImpl;
-
-}
-class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
- ImageElementImpl.internal_() : super.internal_();
- get runtimeType => ImageElement;
- toString() => super.toString();
-}
-patch class StyleElement {
- static Type get instanceRuntimeType => StyleElementImpl;
-
-}
-class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
- StyleElementImpl.internal_() : super.internal_();
- get runtimeType => StyleElement;
- toString() => super.toString();
-}
-patch class AnimatedPreserveAspectRatio {
- static Type get instanceRuntimeType => AnimatedPreserveAspectRatioImpl;
-
-}
-class AnimatedPreserveAspectRatioImpl extends AnimatedPreserveAspectRatio implements js_library.JSObjectInterfacesDom {
- AnimatedPreserveAspectRatioImpl.internal_() : super.internal_();
- get runtimeType => AnimatedPreserveAspectRatio;
- toString() => super.toString();
-}
-patch class TextElement {
- static Type get instanceRuntimeType => TextElementImpl;
-
-}
-class TextElementImpl extends TextElement implements js_library.JSObjectInterfacesDom {
- TextElementImpl.internal_() : super.internal_();
- get runtimeType => TextElement;
- toString() => super.toString();
-}
-patch class DefsElement {
- static Type get instanceRuntimeType => DefsElementImpl;
-
-}
-class DefsElementImpl extends DefsElement implements js_library.JSObjectInterfacesDom {
- DefsElementImpl.internal_() : super.internal_();
- get runtimeType => DefsElement;
- toString() => super.toString();
-}
-patch class FEDiffuseLightingElement {
- static Type get instanceRuntimeType => FEDiffuseLightingElementImpl;
-
-}
-class FEDiffuseLightingElementImpl extends FEDiffuseLightingElement implements js_library.JSObjectInterfacesDom {
- FEDiffuseLightingElementImpl.internal_() : super.internal_();
- get runtimeType => FEDiffuseLightingElement;
- toString() => super.toString();
-}
-patch class FETileElement {
- static Type get instanceRuntimeType => FETileElementImpl;
-
-}
-class FETileElementImpl extends FETileElement implements js_library.JSObjectInterfacesDom {
- FETileElementImpl.internal_() : super.internal_();
- get runtimeType => FETileElement;
- toString() => super.toString();
-}
-patch class PathSegLinetoHorizontalAbs {
- static Type get instanceRuntimeType => PathSegLinetoHorizontalAbsImpl;
-
-}
-class PathSegLinetoHorizontalAbsImpl extends PathSegLinetoHorizontalAbs implements js_library.JSObjectInterfacesDom {
- PathSegLinetoHorizontalAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegLinetoHorizontalAbs;
- toString() => super.toString();
-}
-patch class PathSegMovetoRel {
- static Type get instanceRuntimeType => PathSegMovetoRelImpl;
-
-}
-class PathSegMovetoRelImpl extends PathSegMovetoRel implements js_library.JSObjectInterfacesDom {
- PathSegMovetoRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegMovetoRel;
- toString() => super.toString();
-}
-patch class _SVGFEDropShadowElement {
- static Type get instanceRuntimeType => _SVGFEDropShadowElementImpl;
-
-}
-class _SVGFEDropShadowElementImpl extends _SVGFEDropShadowElement implements js_library.JSObjectInterfacesDom {
- _SVGFEDropShadowElementImpl.internal_() : super.internal_();
- get runtimeType => _SVGFEDropShadowElement;
- toString() => super.toString();
-}
-patch class Transform {
- static Type get instanceRuntimeType => TransformImpl;
-
-}
-class TransformImpl extends Transform implements js_library.JSObjectInterfacesDom {
- TransformImpl.internal_() : super.internal_();
- get runtimeType => Transform;
- toString() => super.toString();
-}
-patch class PathSegArcRel {
- static Type get instanceRuntimeType => PathSegArcRelImpl;
-
-}
-class PathSegArcRelImpl extends PathSegArcRel implements js_library.JSObjectInterfacesDom {
- PathSegArcRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegArcRel;
- toString() => super.toString();
-}
-patch class AnimateElement {
- static Type get instanceRuntimeType => AnimateElementImpl;
-
-}
-class AnimateElementImpl extends AnimateElement implements js_library.JSObjectInterfacesDom {
- AnimateElementImpl.internal_() : super.internal_();
- get runtimeType => AnimateElement;
- toString() => super.toString();
-}
-patch class PolylineElement {
- static Type get instanceRuntimeType => PolylineElementImpl;
-
-}
-class PolylineElementImpl extends PolylineElement implements js_library.JSObjectInterfacesDom {
- PolylineElementImpl.internal_() : super.internal_();
- get runtimeType => PolylineElement;
- toString() => super.toString();
-}
-patch class AnimatedRect {
- static Type get instanceRuntimeType => AnimatedRectImpl;
-
-}
-class AnimatedRectImpl extends AnimatedRect implements js_library.JSObjectInterfacesDom {
- AnimatedRectImpl.internal_() : super.internal_();
- get runtimeType => AnimatedRect;
- toString() => super.toString();
-}
-patch class GraphicsElement {
- static Type get instanceRuntimeType => GraphicsElementImpl;
-
-}
-class GraphicsElementImpl extends GraphicsElement implements js_library.JSObjectInterfacesDom {
- GraphicsElementImpl.internal_() : super.internal_();
- get runtimeType => GraphicsElement;
- toString() => super.toString();
-}
-patch class TransformList {
- static Type get instanceRuntimeType => TransformListImpl;
-
-}
-class TransformListImpl extends TransformList implements js_library.JSObjectInterfacesDom {
- TransformListImpl.internal_() : super.internal_();
- get runtimeType => TransformList;
- toString() => super.toString();
-}
-patch class EllipseElement {
- static Type get instanceRuntimeType => EllipseElementImpl;
-
-}
-class EllipseElementImpl extends EllipseElement implements js_library.JSObjectInterfacesDom {
- EllipseElementImpl.internal_() : super.internal_();
- get runtimeType => EllipseElement;
- toString() => super.toString();
-}
-patch class FEFuncGElement {
- static Type get instanceRuntimeType => FEFuncGElementImpl;
-
-}
-class FEFuncGElementImpl extends FEFuncGElement implements js_library.JSObjectInterfacesDom {
- FEFuncGElementImpl.internal_() : super.internal_();
- get runtimeType => FEFuncGElement;
- toString() => super.toString();
-}
-patch class PointList {
- static Type get instanceRuntimeType => PointListImpl;
-
-}
-class PointListImpl extends PointList implements js_library.JSObjectInterfacesDom {
- PointListImpl.internal_() : super.internal_();
- get runtimeType => PointList;
- toString() => super.toString();
-}
-patch class FEMergeElement {
- static Type get instanceRuntimeType => FEMergeElementImpl;
-
-}
-class FEMergeElementImpl extends FEMergeElement implements js_library.JSObjectInterfacesDom {
- FEMergeElementImpl.internal_() : super.internal_();
- get runtimeType => FEMergeElement;
- toString() => super.toString();
-}
-patch class CircleElement {
- static Type get instanceRuntimeType => CircleElementImpl;
-
-}
-class CircleElementImpl extends CircleElement implements js_library.JSObjectInterfacesDom {
- CircleElementImpl.internal_() : super.internal_();
- get runtimeType => CircleElement;
- toString() => super.toString();
-}
-patch class AnimatedNumberList {
- static Type get instanceRuntimeType => AnimatedNumberListImpl;
-
-}
-class AnimatedNumberListImpl extends AnimatedNumberList implements js_library.JSObjectInterfacesDom {
- AnimatedNumberListImpl.internal_() : super.internal_();
- get runtimeType => AnimatedNumberList;
- toString() => super.toString();
-}
-patch class SwitchElement {
- static Type get instanceRuntimeType => SwitchElementImpl;
-
-}
-class SwitchElementImpl extends SwitchElement implements js_library.JSObjectInterfacesDom {
- SwitchElementImpl.internal_() : super.internal_();
- get runtimeType => SwitchElement;
- toString() => super.toString();
-}
-patch class RadialGradientElement {
- static Type get instanceRuntimeType => RadialGradientElementImpl;
-
-}
-class RadialGradientElementImpl extends RadialGradientElement implements js_library.JSObjectInterfacesDom {
- RadialGradientElementImpl.internal_() : super.internal_();
- get runtimeType => RadialGradientElement;
- toString() => super.toString();
-}
-patch class FEDistantLightElement {
- static Type get instanceRuntimeType => FEDistantLightElementImpl;
-
-}
-class FEDistantLightElementImpl extends FEDistantLightElement implements js_library.JSObjectInterfacesDom {
- FEDistantLightElementImpl.internal_() : super.internal_();
- get runtimeType => FEDistantLightElement;
- toString() => super.toString();
-}
-patch class LinearGradientElement {
- static Type get instanceRuntimeType => LinearGradientElementImpl;
-
-}
-class LinearGradientElementImpl extends LinearGradientElement implements js_library.JSObjectInterfacesDom {
- LinearGradientElementImpl.internal_() : super.internal_();
- get runtimeType => LinearGradientElement;
- toString() => super.toString();
-}
-patch class TextPositioningElement {
- static Type get instanceRuntimeType => TextPositioningElementImpl;
-
-}
-class TextPositioningElementImpl extends TextPositioningElement implements js_library.JSObjectInterfacesDom {
- TextPositioningElementImpl.internal_() : super.internal_();
- get runtimeType => TextPositioningElement;
- toString() => super.toString();
-}
-patch class PathSegCurvetoQuadraticRel {
- static Type get instanceRuntimeType => PathSegCurvetoQuadraticRelImpl;
-
-}
-class PathSegCurvetoQuadraticRelImpl extends PathSegCurvetoQuadraticRel implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoQuadraticRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoQuadraticRel;
- toString() => super.toString();
-}
-patch class PathSegLinetoHorizontalRel {
- static Type get instanceRuntimeType => PathSegLinetoHorizontalRelImpl;
-
-}
-class PathSegLinetoHorizontalRelImpl extends PathSegLinetoHorizontalRel implements js_library.JSObjectInterfacesDom {
- PathSegLinetoHorizontalRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegLinetoHorizontalRel;
- toString() => super.toString();
-}
-patch class StringList {
- static Type get instanceRuntimeType => StringListImpl;
-
-}
-class StringListImpl extends StringList implements js_library.JSObjectInterfacesDom {
- StringListImpl.internal_() : super.internal_();
- get runtimeType => StringList;
- toString() => super.toString();
-}
-patch class TextContentElement {
- static Type get instanceRuntimeType => TextContentElementImpl;
-
-}
-class TextContentElementImpl extends TextContentElement implements js_library.JSObjectInterfacesDom {
- TextContentElementImpl.internal_() : super.internal_();
- get runtimeType => TextContentElement;
- toString() => super.toString();
-}
-patch class FEConvolveMatrixElement {
- static Type get instanceRuntimeType => FEConvolveMatrixElementImpl;
-
-}
-class FEConvolveMatrixElementImpl extends FEConvolveMatrixElement implements js_library.JSObjectInterfacesDom {
- FEConvolveMatrixElementImpl.internal_() : super.internal_();
- get runtimeType => FEConvolveMatrixElement;
- toString() => super.toString();
-}
-patch class PathSegLinetoAbs {
- static Type get instanceRuntimeType => PathSegLinetoAbsImpl;
-
-}
-class PathSegLinetoAbsImpl extends PathSegLinetoAbs implements js_library.JSObjectInterfacesDom {
- PathSegLinetoAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegLinetoAbs;
- toString() => super.toString();
-}
-patch class FESpecularLightingElement {
- static Type get instanceRuntimeType => FESpecularLightingElementImpl;
-
-}
-class FESpecularLightingElementImpl extends FESpecularLightingElement implements js_library.JSObjectInterfacesDom {
- FESpecularLightingElementImpl.internal_() : super.internal_();
- get runtimeType => FESpecularLightingElement;
- toString() => super.toString();
-}
-patch class AnimatedTransformList {
- static Type get instanceRuntimeType => AnimatedTransformListImpl;
-
-}
-class AnimatedTransformListImpl extends AnimatedTransformList implements js_library.JSObjectInterfacesDom {
- AnimatedTransformListImpl.internal_() : super.internal_();
- get runtimeType => AnimatedTransformList;
- toString() => super.toString();
-}
-patch class FEGaussianBlurElement {
- static Type get instanceRuntimeType => FEGaussianBlurElementImpl;
-
-}
-class FEGaussianBlurElementImpl extends FEGaussianBlurElement implements js_library.JSObjectInterfacesDom {
- FEGaussianBlurElementImpl.internal_() : super.internal_();
- get runtimeType => FEGaussianBlurElement;
- toString() => super.toString();
-}
-patch class Number {
- static Type get instanceRuntimeType => NumberImpl;
-
-}
-class NumberImpl extends Number implements js_library.JSObjectInterfacesDom {
- NumberImpl.internal_() : super.internal_();
- get runtimeType => Number;
- toString() => super.toString();
-}
-patch class ZoomEvent {
- static Type get instanceRuntimeType => ZoomEventImpl;
-
-}
-class ZoomEventImpl extends ZoomEvent implements js_library.JSObjectInterfacesDom {
- ZoomEventImpl.internal_() : super.internal_();
- get runtimeType => ZoomEvent;
- toString() => super.toString();
-}
-patch class PathSegCurvetoCubicSmoothAbs {
- static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothAbsImpl;
-
-}
-class PathSegCurvetoCubicSmoothAbsImpl extends PathSegCurvetoCubicSmoothAbs implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoCubicSmoothAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoCubicSmoothAbs;
- toString() => super.toString();
-}
-patch class AnimatedNumber {
- static Type get instanceRuntimeType => AnimatedNumberImpl;
-
-}
-class AnimatedNumberImpl extends AnimatedNumber implements js_library.JSObjectInterfacesDom {
- AnimatedNumberImpl.internal_() : super.internal_();
- get runtimeType => AnimatedNumber;
- toString() => super.toString();
-}
-patch class MaskElement {
- static Type get instanceRuntimeType => MaskElementImpl;
-
-}
-class MaskElementImpl extends MaskElement implements js_library.JSObjectInterfacesDom {
- MaskElementImpl.internal_() : super.internal_();
- get runtimeType => MaskElement;
+class AElementImpl extends AElement implements js_library.JSObjectInterfacesDom {
+ AElementImpl.internal_() : super.internal_();
+ get runtimeType => AElement;
toString() => super.toString();
}
patch class Angle {
@@ -5055,373 +4641,13 @@
get runtimeType => Angle;
toString() => super.toString();
}
-patch class SymbolElement {
- static Type get instanceRuntimeType => SymbolElementImpl;
+patch class AnimateElement {
+ static Type get instanceRuntimeType => AnimateElementImpl;
}
-class SymbolElementImpl extends SymbolElement implements js_library.JSObjectInterfacesDom {
- SymbolElementImpl.internal_() : super.internal_();
- get runtimeType => SymbolElement;
- toString() => super.toString();
-}
-patch class PathSegArcAbs {
- static Type get instanceRuntimeType => PathSegArcAbsImpl;
-
-}
-class PathSegArcAbsImpl extends PathSegArcAbs implements js_library.JSObjectInterfacesDom {
- PathSegArcAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegArcAbs;
- toString() => super.toString();
-}
-patch class RectElement {
- static Type get instanceRuntimeType => RectElementImpl;
-
-}
-class RectElementImpl extends RectElement implements js_library.JSObjectInterfacesDom {
- RectElementImpl.internal_() : super.internal_();
- get runtimeType => RectElement;
- toString() => super.toString();
-}
-patch class FEFloodElement {
- static Type get instanceRuntimeType => FEFloodElementImpl;
-
-}
-class FEFloodElementImpl extends FEFloodElement implements js_library.JSObjectInterfacesDom {
- FEFloodElementImpl.internal_() : super.internal_();
- get runtimeType => FEFloodElement;
- toString() => super.toString();
-}
-patch class PathSegCurvetoQuadraticAbs {
- static Type get instanceRuntimeType => PathSegCurvetoQuadraticAbsImpl;
-
-}
-class PathSegCurvetoQuadraticAbsImpl extends PathSegCurvetoQuadraticAbs implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoQuadraticAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoQuadraticAbs;
- toString() => super.toString();
-}
-patch class ScriptElement {
- static Type get instanceRuntimeType => ScriptElementImpl;
-
-}
-class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
- ScriptElementImpl.internal_() : super.internal_();
- get runtimeType => ScriptElement;
- toString() => super.toString();
-}
-patch class AnimatedInteger {
- static Type get instanceRuntimeType => AnimatedIntegerImpl;
-
-}
-class AnimatedIntegerImpl extends AnimatedInteger implements js_library.JSObjectInterfacesDom {
- AnimatedIntegerImpl.internal_() : super.internal_();
- get runtimeType => AnimatedInteger;
- toString() => super.toString();
-}
-patch class Tests {
- static Type get instanceRuntimeType => TestsImpl;
-
-}
-class TestsImpl extends Tests implements js_library.JSObjectInterfacesDom {
- TestsImpl.internal_() : super.internal_();
- get runtimeType => Tests;
- toString() => super.toString();
-}
-patch class PathSegCurvetoCubicSmoothRel {
- static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothRelImpl;
-
-}
-class PathSegCurvetoCubicSmoothRelImpl extends PathSegCurvetoCubicSmoothRel implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoCubicSmoothRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoCubicSmoothRel;
- toString() => super.toString();
-}
-patch class PathSeg {
- static Type get instanceRuntimeType => PathSegImpl;
-
-}
-class PathSegImpl extends PathSeg implements js_library.JSObjectInterfacesDom {
- PathSegImpl.internal_() : super.internal_();
- get runtimeType => PathSeg;
- toString() => super.toString();
-}
-patch class GElement {
- static Type get instanceRuntimeType => GElementImpl;
-
-}
-class GElementImpl extends GElement implements js_library.JSObjectInterfacesDom {
- GElementImpl.internal_() : super.internal_();
- get runtimeType => GElement;
- toString() => super.toString();
-}
-patch class PathSegMovetoAbs {
- static Type get instanceRuntimeType => PathSegMovetoAbsImpl;
-
-}
-class PathSegMovetoAbsImpl extends PathSegMovetoAbs implements js_library.JSObjectInterfacesDom {
- PathSegMovetoAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegMovetoAbs;
- toString() => super.toString();
-}
-patch class PathSegCurvetoCubicAbs {
- static Type get instanceRuntimeType => PathSegCurvetoCubicAbsImpl;
-
-}
-class PathSegCurvetoCubicAbsImpl extends PathSegCurvetoCubicAbs implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoCubicAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoCubicAbs;
- toString() => super.toString();
-}
-patch class AnimatedEnumeration {
- static Type get instanceRuntimeType => AnimatedEnumerationImpl;
-
-}
-class AnimatedEnumerationImpl extends AnimatedEnumeration implements js_library.JSObjectInterfacesDom {
- AnimatedEnumerationImpl.internal_() : super.internal_();
- get runtimeType => AnimatedEnumeration;
- toString() => super.toString();
-}
-patch class TitleElement {
- static Type get instanceRuntimeType => TitleElementImpl;
-
-}
-class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
- TitleElementImpl.internal_() : super.internal_();
- get runtimeType => TitleElement;
- toString() => super.toString();
-}
-patch class MetadataElement {
- static Type get instanceRuntimeType => MetadataElementImpl;
-
-}
-class MetadataElementImpl extends MetadataElement implements js_library.JSObjectInterfacesDom {
- MetadataElementImpl.internal_() : super.internal_();
- get runtimeType => MetadataElement;
- toString() => super.toString();
-}
-patch class AElement {
- static Type get instanceRuntimeType => AElementImpl;
-
-}
-class AElementImpl extends AElement implements js_library.JSObjectInterfacesDom {
- AElementImpl.internal_() : super.internal_();
- get runtimeType => AElement;
- toString() => super.toString();
-}
-patch class _GradientElement {
- static Type get instanceRuntimeType => _GradientElementImpl;
-
-}
-class _GradientElementImpl extends _GradientElement implements js_library.JSObjectInterfacesDom {
- _GradientElementImpl.internal_() : super.internal_();
- get runtimeType => _GradientElement;
- toString() => super.toString();
-}
-patch class FEImageElement {
- static Type get instanceRuntimeType => FEImageElementImpl;
-
-}
-class FEImageElementImpl extends FEImageElement implements js_library.JSObjectInterfacesDom {
- FEImageElementImpl.internal_() : super.internal_();
- get runtimeType => FEImageElement;
- toString() => super.toString();
-}
-patch class _SVGComponentTransferFunctionElement {
- static Type get instanceRuntimeType => _SVGComponentTransferFunctionElementImpl;
-
-}
-class _SVGComponentTransferFunctionElementImpl extends _SVGComponentTransferFunctionElement implements js_library.JSObjectInterfacesDom {
- _SVGComponentTransferFunctionElementImpl.internal_() : super.internal_();
- get runtimeType => _SVGComponentTransferFunctionElement;
- toString() => super.toString();
-}
-patch class PathSegLinetoVerticalRel {
- static Type get instanceRuntimeType => PathSegLinetoVerticalRelImpl;
-
-}
-class PathSegLinetoVerticalRelImpl extends PathSegLinetoVerticalRel implements js_library.JSObjectInterfacesDom {
- PathSegLinetoVerticalRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegLinetoVerticalRel;
- toString() => super.toString();
-}
-patch class AnimatedLengthList {
- static Type get instanceRuntimeType => AnimatedLengthListImpl;
-
-}
-class AnimatedLengthListImpl extends AnimatedLengthList implements js_library.JSObjectInterfacesDom {
- AnimatedLengthListImpl.internal_() : super.internal_();
- get runtimeType => AnimatedLengthList;
- toString() => super.toString();
-}
-patch class FEMorphologyElement {
- static Type get instanceRuntimeType => FEMorphologyElementImpl;
-
-}
-class FEMorphologyElementImpl extends FEMorphologyElement implements js_library.JSObjectInterfacesDom {
- FEMorphologyElementImpl.internal_() : super.internal_();
- get runtimeType => FEMorphologyElement;
- toString() => super.toString();
-}
-patch class PolygonElement {
- static Type get instanceRuntimeType => PolygonElementImpl;
-
-}
-class PolygonElementImpl extends PolygonElement implements js_library.JSObjectInterfacesDom {
- PolygonElementImpl.internal_() : super.internal_();
- get runtimeType => PolygonElement;
- toString() => super.toString();
-}
-patch class UseElement {
- static Type get instanceRuntimeType => UseElementImpl;
-
-}
-class UseElementImpl extends UseElement implements js_library.JSObjectInterfacesDom {
- UseElementImpl.internal_() : super.internal_();
- get runtimeType => UseElement;
- toString() => super.toString();
-}
-patch class Point {
- static Type get instanceRuntimeType => PointImpl;
-
-}
-class PointImpl extends Point implements js_library.JSObjectInterfacesDom {
- PointImpl.internal_() : super.internal_();
- get runtimeType => Point;
- toString() => super.toString();
-}
-patch class Rect {
- static Type get instanceRuntimeType => RectImpl;
-
-}
-class RectImpl extends Rect implements js_library.JSObjectInterfacesDom {
- RectImpl.internal_() : super.internal_();
- get runtimeType => Rect;
- toString() => super.toString();
-}
-patch class AnimatedBoolean {
- static Type get instanceRuntimeType => AnimatedBooleanImpl;
-
-}
-class AnimatedBooleanImpl extends AnimatedBoolean implements js_library.JSObjectInterfacesDom {
- AnimatedBooleanImpl.internal_() : super.internal_();
- get runtimeType => AnimatedBoolean;
- toString() => super.toString();
-}
-patch class FETurbulenceElement {
- static Type get instanceRuntimeType => FETurbulenceElementImpl;
-
-}
-class FETurbulenceElementImpl extends FETurbulenceElement implements js_library.JSObjectInterfacesDom {
- FETurbulenceElementImpl.internal_() : super.internal_();
- get runtimeType => FETurbulenceElement;
- toString() => super.toString();
-}
-patch class NumberList {
- static Type get instanceRuntimeType => NumberListImpl;
-
-}
-class NumberListImpl extends NumberList implements js_library.JSObjectInterfacesDom {
- NumberListImpl.internal_() : super.internal_();
- get runtimeType => NumberList;
- toString() => super.toString();
-}
-patch class AnimationElement {
- static Type get instanceRuntimeType => AnimationElementImpl;
-
-}
-class AnimationElementImpl extends AnimationElement implements js_library.JSObjectInterfacesDom {
- AnimationElementImpl.internal_() : super.internal_();
- get runtimeType => AnimationElement;
- toString() => super.toString();
-}
-patch class MarkerElement {
- static Type get instanceRuntimeType => MarkerElementImpl;
-
-}
-class MarkerElementImpl extends MarkerElement implements js_library.JSObjectInterfacesDom {
- MarkerElementImpl.internal_() : super.internal_();
- get runtimeType => MarkerElement;
- toString() => super.toString();
-}
-patch class FECompositeElement {
- static Type get instanceRuntimeType => FECompositeElementImpl;
-
-}
-class FECompositeElementImpl extends FECompositeElement implements js_library.JSObjectInterfacesDom {
- FECompositeElementImpl.internal_() : super.internal_();
- get runtimeType => FECompositeElement;
- toString() => super.toString();
-}
-patch class PathSegList {
- static Type get instanceRuntimeType => PathSegListImpl;
-
-}
-class PathSegListImpl extends PathSegList implements js_library.JSObjectInterfacesDom {
- PathSegListImpl.internal_() : super.internal_();
- get runtimeType => PathSegList;
- toString() => super.toString();
-}
-patch class PathSegCurvetoQuadraticSmoothRel {
- static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothRelImpl;
-
-}
-class PathSegCurvetoQuadraticSmoothRelImpl extends PathSegCurvetoQuadraticSmoothRel implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoQuadraticSmoothRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoQuadraticSmoothRel;
- toString() => super.toString();
-}
-patch class FEFuncRElement {
- static Type get instanceRuntimeType => FEFuncRElementImpl;
-
-}
-class FEFuncRElementImpl extends FEFuncRElement implements js_library.JSObjectInterfacesDom {
- FEFuncRElementImpl.internal_() : super.internal_();
- get runtimeType => FEFuncRElement;
- toString() => super.toString();
-}
-patch class FEFuncBElement {
- static Type get instanceRuntimeType => FEFuncBElementImpl;
-
-}
-class FEFuncBElementImpl extends FEFuncBElement implements js_library.JSObjectInterfacesDom {
- FEFuncBElementImpl.internal_() : super.internal_();
- get runtimeType => FEFuncBElement;
- toString() => super.toString();
-}
-patch class FEBlendElement {
- static Type get instanceRuntimeType => FEBlendElementImpl;
-
-}
-class FEBlendElementImpl extends FEBlendElement implements js_library.JSObjectInterfacesDom {
- FEBlendElementImpl.internal_() : super.internal_();
- get runtimeType => FEBlendElement;
- toString() => super.toString();
-}
-patch class AnimatedAngle {
- static Type get instanceRuntimeType => AnimatedAngleImpl;
-
-}
-class AnimatedAngleImpl extends AnimatedAngle implements js_library.JSObjectInterfacesDom {
- AnimatedAngleImpl.internal_() : super.internal_();
- get runtimeType => AnimatedAngle;
- toString() => super.toString();
-}
-patch class TSpanElement {
- static Type get instanceRuntimeType => TSpanElementImpl;
-
-}
-class TSpanElementImpl extends TSpanElement implements js_library.JSObjectInterfacesDom {
- TSpanElementImpl.internal_() : super.internal_();
- get runtimeType => TSpanElement;
- toString() => super.toString();
-}
-patch class PathSegCurvetoCubicRel {
- static Type get instanceRuntimeType => PathSegCurvetoCubicRelImpl;
-
-}
-class PathSegCurvetoCubicRelImpl extends PathSegCurvetoCubicRel implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoCubicRelImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoCubicRel;
+class AnimateElementImpl extends AnimateElement implements js_library.JSObjectInterfacesDom {
+ AnimateElementImpl.internal_() : super.internal_();
+ get runtimeType => AnimateElement;
toString() => super.toString();
}
patch class AnimateMotionElement {
@@ -5433,15 +4659,6 @@
get runtimeType => AnimateMotionElement;
toString() => super.toString();
}
-patch class GeometryElement {
- static Type get instanceRuntimeType => GeometryElementImpl;
-
-}
-class GeometryElementImpl extends GeometryElement implements js_library.JSObjectInterfacesDom {
- GeometryElementImpl.internal_() : super.internal_();
- get runtimeType => GeometryElement;
- toString() => super.toString();
-}
patch class AnimateTransformElement {
static Type get instanceRuntimeType => AnimateTransformElementImpl;
@@ -5451,130 +4668,40 @@
get runtimeType => AnimateTransformElement;
toString() => super.toString();
}
-patch class PreserveAspectRatio {
- static Type get instanceRuntimeType => PreserveAspectRatioImpl;
+patch class AnimatedAngle {
+ static Type get instanceRuntimeType => AnimatedAngleImpl;
}
-class PreserveAspectRatioImpl extends PreserveAspectRatio implements js_library.JSObjectInterfacesDom {
- PreserveAspectRatioImpl.internal_() : super.internal_();
- get runtimeType => PreserveAspectRatio;
+class AnimatedAngleImpl extends AnimatedAngle implements js_library.JSObjectInterfacesDom {
+ AnimatedAngleImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedAngle;
toString() => super.toString();
}
-patch class PathElement {
- static Type get instanceRuntimeType => PathElementImpl;
+patch class AnimatedBoolean {
+ static Type get instanceRuntimeType => AnimatedBooleanImpl;
}
-class PathElementImpl extends PathElement implements js_library.JSObjectInterfacesDom {
- PathElementImpl.internal_() : super.internal_();
- get runtimeType => PathElement;
+class AnimatedBooleanImpl extends AnimatedBoolean implements js_library.JSObjectInterfacesDom {
+ AnimatedBooleanImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedBoolean;
toString() => super.toString();
}
-patch class FEColorMatrixElement {
- static Type get instanceRuntimeType => FEColorMatrixElementImpl;
+patch class AnimatedEnumeration {
+ static Type get instanceRuntimeType => AnimatedEnumerationImpl;
}
-class FEColorMatrixElementImpl extends FEColorMatrixElement implements js_library.JSObjectInterfacesDom {
- FEColorMatrixElementImpl.internal_() : super.internal_();
- get runtimeType => FEColorMatrixElement;
+class AnimatedEnumerationImpl extends AnimatedEnumeration implements js_library.JSObjectInterfacesDom {
+ AnimatedEnumerationImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedEnumeration;
toString() => super.toString();
}
-patch class PatternElement {
- static Type get instanceRuntimeType => PatternElementImpl;
+patch class AnimatedInteger {
+ static Type get instanceRuntimeType => AnimatedIntegerImpl;
}
-class PatternElementImpl extends PatternElement implements js_library.JSObjectInterfacesDom {
- PatternElementImpl.internal_() : super.internal_();
- get runtimeType => PatternElement;
- toString() => super.toString();
-}
-patch class Length {
- static Type get instanceRuntimeType => LengthImpl;
-
-}
-class LengthImpl extends Length implements js_library.JSObjectInterfacesDom {
- LengthImpl.internal_() : super.internal_();
- get runtimeType => Length;
- toString() => super.toString();
-}
-patch class FESpotLightElement {
- static Type get instanceRuntimeType => FESpotLightElementImpl;
-
-}
-class FESpotLightElementImpl extends FESpotLightElement implements js_library.JSObjectInterfacesDom {
- FESpotLightElementImpl.internal_() : super.internal_();
- get runtimeType => FESpotLightElement;
- toString() => super.toString();
-}
-patch class LineElement {
- static Type get instanceRuntimeType => LineElementImpl;
-
-}
-class LineElementImpl extends LineElement implements js_library.JSObjectInterfacesDom {
- LineElementImpl.internal_() : super.internal_();
- get runtimeType => LineElement;
- toString() => super.toString();
-}
-patch class Matrix {
- static Type get instanceRuntimeType => MatrixImpl;
-
-}
-class MatrixImpl extends Matrix implements js_library.JSObjectInterfacesDom {
- MatrixImpl.internal_() : super.internal_();
- get runtimeType => Matrix;
- toString() => super.toString();
-}
-patch class SvgSvgElement {
- static Type get instanceRuntimeType => SvgSvgElementImpl;
-
-}
-class SvgSvgElementImpl extends SvgSvgElement implements js_library.JSObjectInterfacesDom {
- SvgSvgElementImpl.internal_() : super.internal_();
- get runtimeType => SvgSvgElement;
- toString() => super.toString();
-}
-patch class FitToViewBox {
- static Type get instanceRuntimeType => FitToViewBoxImpl;
-
-}
-class FitToViewBoxImpl extends FitToViewBox implements js_library.JSObjectInterfacesDom {
- FitToViewBoxImpl.internal_() : super.internal_();
- get runtimeType => FitToViewBox;
- toString() => super.toString();
-}
-patch class _SVGMPathElement {
- static Type get instanceRuntimeType => _SVGMPathElementImpl;
-
-}
-class _SVGMPathElementImpl extends _SVGMPathElement implements js_library.JSObjectInterfacesDom {
- _SVGMPathElementImpl.internal_() : super.internal_();
- get runtimeType => _SVGMPathElement;
- toString() => super.toString();
-}
-patch class FEDisplacementMapElement {
- static Type get instanceRuntimeType => FEDisplacementMapElementImpl;
-
-}
-class FEDisplacementMapElementImpl extends FEDisplacementMapElement implements js_library.JSObjectInterfacesDom {
- FEDisplacementMapElementImpl.internal_() : super.internal_();
- get runtimeType => FEDisplacementMapElement;
- toString() => super.toString();
-}
-patch class PathSegCurvetoQuadraticSmoothAbs {
- static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothAbsImpl;
-
-}
-class PathSegCurvetoQuadraticSmoothAbsImpl extends PathSegCurvetoQuadraticSmoothAbs implements js_library.JSObjectInterfacesDom {
- PathSegCurvetoQuadraticSmoothAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegCurvetoQuadraticSmoothAbs;
- toString() => super.toString();
-}
-patch class PathSegClosePath {
- static Type get instanceRuntimeType => PathSegClosePathImpl;
-
-}
-class PathSegClosePathImpl extends PathSegClosePath implements js_library.JSObjectInterfacesDom {
- PathSegClosePathImpl.internal_() : super.internal_();
- get runtimeType => PathSegClosePath;
+class AnimatedIntegerImpl extends AnimatedInteger implements js_library.JSObjectInterfacesDom {
+ AnimatedIntegerImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedInteger;
toString() => super.toString();
}
patch class AnimatedLength {
@@ -5586,6 +4713,87 @@
get runtimeType => AnimatedLength;
toString() => super.toString();
}
+patch class AnimatedLengthList {
+ static Type get instanceRuntimeType => AnimatedLengthListImpl;
+
+}
+class AnimatedLengthListImpl extends AnimatedLengthList implements js_library.JSObjectInterfacesDom {
+ AnimatedLengthListImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedLengthList;
+ toString() => super.toString();
+}
+patch class AnimatedNumber {
+ static Type get instanceRuntimeType => AnimatedNumberImpl;
+
+}
+class AnimatedNumberImpl extends AnimatedNumber implements js_library.JSObjectInterfacesDom {
+ AnimatedNumberImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedNumber;
+ toString() => super.toString();
+}
+patch class AnimatedNumberList {
+ static Type get instanceRuntimeType => AnimatedNumberListImpl;
+
+}
+class AnimatedNumberListImpl extends AnimatedNumberList implements js_library.JSObjectInterfacesDom {
+ AnimatedNumberListImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedNumberList;
+ toString() => super.toString();
+}
+patch class AnimatedPreserveAspectRatio {
+ static Type get instanceRuntimeType => AnimatedPreserveAspectRatioImpl;
+
+}
+class AnimatedPreserveAspectRatioImpl extends AnimatedPreserveAspectRatio implements js_library.JSObjectInterfacesDom {
+ AnimatedPreserveAspectRatioImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedPreserveAspectRatio;
+ toString() => super.toString();
+}
+patch class AnimatedRect {
+ static Type get instanceRuntimeType => AnimatedRectImpl;
+
+}
+class AnimatedRectImpl extends AnimatedRect implements js_library.JSObjectInterfacesDom {
+ AnimatedRectImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedRect;
+ toString() => super.toString();
+}
+patch class AnimatedString {
+ static Type get instanceRuntimeType => AnimatedStringImpl;
+
+}
+class AnimatedStringImpl extends AnimatedString implements js_library.JSObjectInterfacesDom {
+ AnimatedStringImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedString;
+ toString() => super.toString();
+}
+patch class AnimatedTransformList {
+ static Type get instanceRuntimeType => AnimatedTransformListImpl;
+
+}
+class AnimatedTransformListImpl extends AnimatedTransformList implements js_library.JSObjectInterfacesDom {
+ AnimatedTransformListImpl.internal_() : super.internal_();
+ get runtimeType => AnimatedTransformList;
+ toString() => super.toString();
+}
+patch class AnimationElement {
+ static Type get instanceRuntimeType => AnimationElementImpl;
+
+}
+class AnimationElementImpl extends AnimationElement implements js_library.JSObjectInterfacesDom {
+ AnimationElementImpl.internal_() : super.internal_();
+ get runtimeType => AnimationElement;
+ toString() => super.toString();
+}
+patch class CircleElement {
+ static Type get instanceRuntimeType => CircleElementImpl;
+
+}
+class CircleElementImpl extends CircleElement implements js_library.JSObjectInterfacesDom {
+ CircleElementImpl.internal_() : super.internal_();
+ get runtimeType => CircleElement;
+ toString() => super.toString();
+}
patch class ClipPathElement {
static Type get instanceRuntimeType => ClipPathElementImpl;
@@ -5595,94 +4803,13 @@
get runtimeType => ClipPathElement;
toString() => super.toString();
}
-patch class StopElement {
- static Type get instanceRuntimeType => StopElementImpl;
+patch class DefsElement {
+ static Type get instanceRuntimeType => DefsElementImpl;
}
-class StopElementImpl extends StopElement implements js_library.JSObjectInterfacesDom {
- StopElementImpl.internal_() : super.internal_();
- get runtimeType => StopElement;
- toString() => super.toString();
-}
-patch class ViewSpec {
- static Type get instanceRuntimeType => ViewSpecImpl;
-
-}
-class ViewSpecImpl extends ViewSpec implements js_library.JSObjectInterfacesDom {
- ViewSpecImpl.internal_() : super.internal_();
- get runtimeType => ViewSpec;
- toString() => super.toString();
-}
-patch class LengthList {
- static Type get instanceRuntimeType => LengthListImpl;
-
-}
-class LengthListImpl extends LengthList implements js_library.JSObjectInterfacesDom {
- LengthListImpl.internal_() : super.internal_();
- get runtimeType => LengthList;
- toString() => super.toString();
-}
-patch class _SVGCursorElement {
- static Type get instanceRuntimeType => _SVGCursorElementImpl;
-
-}
-class _SVGCursorElementImpl extends _SVGCursorElement implements js_library.JSObjectInterfacesDom {
- _SVGCursorElementImpl.internal_() : super.internal_();
- get runtimeType => _SVGCursorElement;
- toString() => super.toString();
-}
-patch class ForeignObjectElement {
- static Type get instanceRuntimeType => ForeignObjectElementImpl;
-
-}
-class ForeignObjectElementImpl extends ForeignObjectElement implements js_library.JSObjectInterfacesDom {
- ForeignObjectElementImpl.internal_() : super.internal_();
- get runtimeType => ForeignObjectElement;
- toString() => super.toString();
-}
-patch class SetElement {
- static Type get instanceRuntimeType => SetElementImpl;
-
-}
-class SetElementImpl extends SetElement implements js_library.JSObjectInterfacesDom {
- SetElementImpl.internal_() : super.internal_();
- get runtimeType => SetElement;
- toString() => super.toString();
-}
-patch class SvgElement {
- static Type get instanceRuntimeType => SvgElementImpl;
-
-}
-class SvgElementImpl extends SvgElement implements js_library.JSObjectInterfacesDom {
- SvgElementImpl.internal_() : super.internal_();
- get runtimeType => SvgElement;
- toString() => super.toString();
-}
-patch class UnitTypes {
- static Type get instanceRuntimeType => UnitTypesImpl;
-
-}
-class UnitTypesImpl extends UnitTypes implements js_library.JSObjectInterfacesDom {
- UnitTypesImpl.internal_() : super.internal_();
- get runtimeType => UnitTypes;
- toString() => super.toString();
-}
-patch class FEComponentTransferElement {
- static Type get instanceRuntimeType => FEComponentTransferElementImpl;
-
-}
-class FEComponentTransferElementImpl extends FEComponentTransferElement implements js_library.JSObjectInterfacesDom {
- FEComponentTransferElementImpl.internal_() : super.internal_();
- get runtimeType => FEComponentTransferElement;
- toString() => super.toString();
-}
-patch class PathSegLinetoVerticalAbs {
- static Type get instanceRuntimeType => PathSegLinetoVerticalAbsImpl;
-
-}
-class PathSegLinetoVerticalAbsImpl extends PathSegLinetoVerticalAbs implements js_library.JSObjectInterfacesDom {
- PathSegLinetoVerticalAbsImpl.internal_() : super.internal_();
- get runtimeType => PathSegLinetoVerticalAbs;
+class DefsElementImpl extends DefsElement implements js_library.JSObjectInterfacesDom {
+ DefsElementImpl.internal_() : super.internal_();
+ get runtimeType => DefsElement;
toString() => super.toString();
}
patch class DescElement {
@@ -5703,58 +4830,94 @@
get runtimeType => DiscardElement;
toString() => super.toString();
}
-patch class FEMergeNodeElement {
- static Type get instanceRuntimeType => FEMergeNodeElementImpl;
+patch class EllipseElement {
+ static Type get instanceRuntimeType => EllipseElementImpl;
}
-class FEMergeNodeElementImpl extends FEMergeNodeElement implements js_library.JSObjectInterfacesDom {
- FEMergeNodeElementImpl.internal_() : super.internal_();
- get runtimeType => FEMergeNodeElement;
+class EllipseElementImpl extends EllipseElement implements js_library.JSObjectInterfacesDom {
+ EllipseElementImpl.internal_() : super.internal_();
+ get runtimeType => EllipseElement;
toString() => super.toString();
}
-patch class TextPathElement {
- static Type get instanceRuntimeType => TextPathElementImpl;
+patch class FEBlendElement {
+ static Type get instanceRuntimeType => FEBlendElementImpl;
}
-class TextPathElementImpl extends TextPathElement implements js_library.JSObjectInterfacesDom {
- TextPathElementImpl.internal_() : super.internal_();
- get runtimeType => TextPathElement;
+class FEBlendElementImpl extends FEBlendElement implements js_library.JSObjectInterfacesDom {
+ FEBlendElementImpl.internal_() : super.internal_();
+ get runtimeType => FEBlendElement;
toString() => super.toString();
}
-patch class FEOffsetElement {
- static Type get instanceRuntimeType => FEOffsetElementImpl;
+patch class FEColorMatrixElement {
+ static Type get instanceRuntimeType => FEColorMatrixElementImpl;
}
-class FEOffsetElementImpl extends FEOffsetElement implements js_library.JSObjectInterfacesDom {
- FEOffsetElementImpl.internal_() : super.internal_();
- get runtimeType => FEOffsetElement;
+class FEColorMatrixElementImpl extends FEColorMatrixElement implements js_library.JSObjectInterfacesDom {
+ FEColorMatrixElementImpl.internal_() : super.internal_();
+ get runtimeType => FEColorMatrixElement;
toString() => super.toString();
}
-patch class ZoomAndPan {
- static Type get instanceRuntimeType => ZoomAndPanImpl;
+patch class FEComponentTransferElement {
+ static Type get instanceRuntimeType => FEComponentTransferElementImpl;
}
-class ZoomAndPanImpl extends ZoomAndPan implements js_library.JSObjectInterfacesDom {
- ZoomAndPanImpl.internal_() : super.internal_();
- get runtimeType => ZoomAndPan;
+class FEComponentTransferElementImpl extends FEComponentTransferElement implements js_library.JSObjectInterfacesDom {
+ FEComponentTransferElementImpl.internal_() : super.internal_();
+ get runtimeType => FEComponentTransferElement;
toString() => super.toString();
}
-patch class ViewElement {
- static Type get instanceRuntimeType => ViewElementImpl;
+patch class FECompositeElement {
+ static Type get instanceRuntimeType => FECompositeElementImpl;
}
-class ViewElementImpl extends ViewElement implements js_library.JSObjectInterfacesDom {
- ViewElementImpl.internal_() : super.internal_();
- get runtimeType => ViewElement;
+class FECompositeElementImpl extends FECompositeElement implements js_library.JSObjectInterfacesDom {
+ FECompositeElementImpl.internal_() : super.internal_();
+ get runtimeType => FECompositeElement;
toString() => super.toString();
}
-patch class FEPointLightElement {
- static Type get instanceRuntimeType => FEPointLightElementImpl;
+patch class FEConvolveMatrixElement {
+ static Type get instanceRuntimeType => FEConvolveMatrixElementImpl;
}
-class FEPointLightElementImpl extends FEPointLightElement implements js_library.JSObjectInterfacesDom {
- FEPointLightElementImpl.internal_() : super.internal_();
- get runtimeType => FEPointLightElement;
+class FEConvolveMatrixElementImpl extends FEConvolveMatrixElement implements js_library.JSObjectInterfacesDom {
+ FEConvolveMatrixElementImpl.internal_() : super.internal_();
+ get runtimeType => FEConvolveMatrixElement;
+ toString() => super.toString();
+}
+patch class FEDiffuseLightingElement {
+ static Type get instanceRuntimeType => FEDiffuseLightingElementImpl;
+
+}
+class FEDiffuseLightingElementImpl extends FEDiffuseLightingElement implements js_library.JSObjectInterfacesDom {
+ FEDiffuseLightingElementImpl.internal_() : super.internal_();
+ get runtimeType => FEDiffuseLightingElement;
+ toString() => super.toString();
+}
+patch class FEDisplacementMapElement {
+ static Type get instanceRuntimeType => FEDisplacementMapElementImpl;
+
+}
+class FEDisplacementMapElementImpl extends FEDisplacementMapElement implements js_library.JSObjectInterfacesDom {
+ FEDisplacementMapElementImpl.internal_() : super.internal_();
+ get runtimeType => FEDisplacementMapElement;
+ toString() => super.toString();
+}
+patch class FEDistantLightElement {
+ static Type get instanceRuntimeType => FEDistantLightElementImpl;
+
+}
+class FEDistantLightElementImpl extends FEDistantLightElement implements js_library.JSObjectInterfacesDom {
+ FEDistantLightElementImpl.internal_() : super.internal_();
+ get runtimeType => FEDistantLightElement;
+ toString() => super.toString();
+}
+patch class FEFloodElement {
+ static Type get instanceRuntimeType => FEFloodElementImpl;
+
+}
+class FEFloodElementImpl extends FEFloodElement implements js_library.JSObjectInterfacesDom {
+ FEFloodElementImpl.internal_() : super.internal_();
+ get runtimeType => FEFloodElement;
toString() => super.toString();
}
patch class FEFuncAElement {
@@ -5766,6 +4929,843 @@
get runtimeType => FEFuncAElement;
toString() => super.toString();
}
+patch class FEFuncBElement {
+ static Type get instanceRuntimeType => FEFuncBElementImpl;
+
+}
+class FEFuncBElementImpl extends FEFuncBElement implements js_library.JSObjectInterfacesDom {
+ FEFuncBElementImpl.internal_() : super.internal_();
+ get runtimeType => FEFuncBElement;
+ toString() => super.toString();
+}
+patch class FEFuncGElement {
+ static Type get instanceRuntimeType => FEFuncGElementImpl;
+
+}
+class FEFuncGElementImpl extends FEFuncGElement implements js_library.JSObjectInterfacesDom {
+ FEFuncGElementImpl.internal_() : super.internal_();
+ get runtimeType => FEFuncGElement;
+ toString() => super.toString();
+}
+patch class FEFuncRElement {
+ static Type get instanceRuntimeType => FEFuncRElementImpl;
+
+}
+class FEFuncRElementImpl extends FEFuncRElement implements js_library.JSObjectInterfacesDom {
+ FEFuncRElementImpl.internal_() : super.internal_();
+ get runtimeType => FEFuncRElement;
+ toString() => super.toString();
+}
+patch class FEGaussianBlurElement {
+ static Type get instanceRuntimeType => FEGaussianBlurElementImpl;
+
+}
+class FEGaussianBlurElementImpl extends FEGaussianBlurElement implements js_library.JSObjectInterfacesDom {
+ FEGaussianBlurElementImpl.internal_() : super.internal_();
+ get runtimeType => FEGaussianBlurElement;
+ toString() => super.toString();
+}
+patch class FEImageElement {
+ static Type get instanceRuntimeType => FEImageElementImpl;
+
+}
+class FEImageElementImpl extends FEImageElement implements js_library.JSObjectInterfacesDom {
+ FEImageElementImpl.internal_() : super.internal_();
+ get runtimeType => FEImageElement;
+ toString() => super.toString();
+}
+patch class FEMergeElement {
+ static Type get instanceRuntimeType => FEMergeElementImpl;
+
+}
+class FEMergeElementImpl extends FEMergeElement implements js_library.JSObjectInterfacesDom {
+ FEMergeElementImpl.internal_() : super.internal_();
+ get runtimeType => FEMergeElement;
+ toString() => super.toString();
+}
+patch class FEMergeNodeElement {
+ static Type get instanceRuntimeType => FEMergeNodeElementImpl;
+
+}
+class FEMergeNodeElementImpl extends FEMergeNodeElement implements js_library.JSObjectInterfacesDom {
+ FEMergeNodeElementImpl.internal_() : super.internal_();
+ get runtimeType => FEMergeNodeElement;
+ toString() => super.toString();
+}
+patch class FEMorphologyElement {
+ static Type get instanceRuntimeType => FEMorphologyElementImpl;
+
+}
+class FEMorphologyElementImpl extends FEMorphologyElement implements js_library.JSObjectInterfacesDom {
+ FEMorphologyElementImpl.internal_() : super.internal_();
+ get runtimeType => FEMorphologyElement;
+ toString() => super.toString();
+}
+patch class FEOffsetElement {
+ static Type get instanceRuntimeType => FEOffsetElementImpl;
+
+}
+class FEOffsetElementImpl extends FEOffsetElement implements js_library.JSObjectInterfacesDom {
+ FEOffsetElementImpl.internal_() : super.internal_();
+ get runtimeType => FEOffsetElement;
+ toString() => super.toString();
+}
+patch class FEPointLightElement {
+ static Type get instanceRuntimeType => FEPointLightElementImpl;
+
+}
+class FEPointLightElementImpl extends FEPointLightElement implements js_library.JSObjectInterfacesDom {
+ FEPointLightElementImpl.internal_() : super.internal_();
+ get runtimeType => FEPointLightElement;
+ toString() => super.toString();
+}
+patch class FESpecularLightingElement {
+ static Type get instanceRuntimeType => FESpecularLightingElementImpl;
+
+}
+class FESpecularLightingElementImpl extends FESpecularLightingElement implements js_library.JSObjectInterfacesDom {
+ FESpecularLightingElementImpl.internal_() : super.internal_();
+ get runtimeType => FESpecularLightingElement;
+ toString() => super.toString();
+}
+patch class FESpotLightElement {
+ static Type get instanceRuntimeType => FESpotLightElementImpl;
+
+}
+class FESpotLightElementImpl extends FESpotLightElement implements js_library.JSObjectInterfacesDom {
+ FESpotLightElementImpl.internal_() : super.internal_();
+ get runtimeType => FESpotLightElement;
+ toString() => super.toString();
+}
+patch class FETileElement {
+ static Type get instanceRuntimeType => FETileElementImpl;
+
+}
+class FETileElementImpl extends FETileElement implements js_library.JSObjectInterfacesDom {
+ FETileElementImpl.internal_() : super.internal_();
+ get runtimeType => FETileElement;
+ toString() => super.toString();
+}
+patch class FETurbulenceElement {
+ static Type get instanceRuntimeType => FETurbulenceElementImpl;
+
+}
+class FETurbulenceElementImpl extends FETurbulenceElement implements js_library.JSObjectInterfacesDom {
+ FETurbulenceElementImpl.internal_() : super.internal_();
+ get runtimeType => FETurbulenceElement;
+ toString() => super.toString();
+}
+patch class FilterElement {
+ static Type get instanceRuntimeType => FilterElementImpl;
+
+}
+class FilterElementImpl extends FilterElement implements js_library.JSObjectInterfacesDom {
+ FilterElementImpl.internal_() : super.internal_();
+ get runtimeType => FilterElement;
+ toString() => super.toString();
+}
+patch class FilterPrimitiveStandardAttributes {
+ static Type get instanceRuntimeType => FilterPrimitiveStandardAttributesImpl;
+
+}
+class FilterPrimitiveStandardAttributesImpl extends FilterPrimitiveStandardAttributes implements js_library.JSObjectInterfacesDom {
+ FilterPrimitiveStandardAttributesImpl.internal_() : super.internal_();
+ get runtimeType => FilterPrimitiveStandardAttributes;
+ toString() => super.toString();
+}
+patch class FitToViewBox {
+ static Type get instanceRuntimeType => FitToViewBoxImpl;
+
+}
+class FitToViewBoxImpl extends FitToViewBox implements js_library.JSObjectInterfacesDom {
+ FitToViewBoxImpl.internal_() : super.internal_();
+ get runtimeType => FitToViewBox;
+ toString() => super.toString();
+}
+patch class ForeignObjectElement {
+ static Type get instanceRuntimeType => ForeignObjectElementImpl;
+
+}
+class ForeignObjectElementImpl extends ForeignObjectElement implements js_library.JSObjectInterfacesDom {
+ ForeignObjectElementImpl.internal_() : super.internal_();
+ get runtimeType => ForeignObjectElement;
+ toString() => super.toString();
+}
+patch class GElement {
+ static Type get instanceRuntimeType => GElementImpl;
+
+}
+class GElementImpl extends GElement implements js_library.JSObjectInterfacesDom {
+ GElementImpl.internal_() : super.internal_();
+ get runtimeType => GElement;
+ toString() => super.toString();
+}
+patch class GeometryElement {
+ static Type get instanceRuntimeType => GeometryElementImpl;
+
+}
+class GeometryElementImpl extends GeometryElement implements js_library.JSObjectInterfacesDom {
+ GeometryElementImpl.internal_() : super.internal_();
+ get runtimeType => GeometryElement;
+ toString() => super.toString();
+}
+patch class GraphicsElement {
+ static Type get instanceRuntimeType => GraphicsElementImpl;
+
+}
+class GraphicsElementImpl extends GraphicsElement implements js_library.JSObjectInterfacesDom {
+ GraphicsElementImpl.internal_() : super.internal_();
+ get runtimeType => GraphicsElement;
+ toString() => super.toString();
+}
+patch class ImageElement {
+ static Type get instanceRuntimeType => ImageElementImpl;
+
+}
+class ImageElementImpl extends ImageElement implements js_library.JSObjectInterfacesDom {
+ ImageElementImpl.internal_() : super.internal_();
+ get runtimeType => ImageElement;
+ toString() => super.toString();
+}
+patch class Length {
+ static Type get instanceRuntimeType => LengthImpl;
+
+}
+class LengthImpl extends Length implements js_library.JSObjectInterfacesDom {
+ LengthImpl.internal_() : super.internal_();
+ get runtimeType => Length;
+ toString() => super.toString();
+}
+patch class LengthList {
+ static Type get instanceRuntimeType => LengthListImpl;
+
+}
+class LengthListImpl extends LengthList implements js_library.JSObjectInterfacesDom {
+ LengthListImpl.internal_() : super.internal_();
+ get runtimeType => LengthList;
+ toString() => super.toString();
+}
+patch class LineElement {
+ static Type get instanceRuntimeType => LineElementImpl;
+
+}
+class LineElementImpl extends LineElement implements js_library.JSObjectInterfacesDom {
+ LineElementImpl.internal_() : super.internal_();
+ get runtimeType => LineElement;
+ toString() => super.toString();
+}
+patch class LinearGradientElement {
+ static Type get instanceRuntimeType => LinearGradientElementImpl;
+
+}
+class LinearGradientElementImpl extends LinearGradientElement implements js_library.JSObjectInterfacesDom {
+ LinearGradientElementImpl.internal_() : super.internal_();
+ get runtimeType => LinearGradientElement;
+ toString() => super.toString();
+}
+patch class MarkerElement {
+ static Type get instanceRuntimeType => MarkerElementImpl;
+
+}
+class MarkerElementImpl extends MarkerElement implements js_library.JSObjectInterfacesDom {
+ MarkerElementImpl.internal_() : super.internal_();
+ get runtimeType => MarkerElement;
+ toString() => super.toString();
+}
+patch class MaskElement {
+ static Type get instanceRuntimeType => MaskElementImpl;
+
+}
+class MaskElementImpl extends MaskElement implements js_library.JSObjectInterfacesDom {
+ MaskElementImpl.internal_() : super.internal_();
+ get runtimeType => MaskElement;
+ toString() => super.toString();
+}
+patch class Matrix {
+ static Type get instanceRuntimeType => MatrixImpl;
+
+}
+class MatrixImpl extends Matrix implements js_library.JSObjectInterfacesDom {
+ MatrixImpl.internal_() : super.internal_();
+ get runtimeType => Matrix;
+ toString() => super.toString();
+}
+patch class MetadataElement {
+ static Type get instanceRuntimeType => MetadataElementImpl;
+
+}
+class MetadataElementImpl extends MetadataElement implements js_library.JSObjectInterfacesDom {
+ MetadataElementImpl.internal_() : super.internal_();
+ get runtimeType => MetadataElement;
+ toString() => super.toString();
+}
+patch class Number {
+ static Type get instanceRuntimeType => NumberImpl;
+
+}
+class NumberImpl extends Number implements js_library.JSObjectInterfacesDom {
+ NumberImpl.internal_() : super.internal_();
+ get runtimeType => Number;
+ toString() => super.toString();
+}
+patch class NumberList {
+ static Type get instanceRuntimeType => NumberListImpl;
+
+}
+class NumberListImpl extends NumberList implements js_library.JSObjectInterfacesDom {
+ NumberListImpl.internal_() : super.internal_();
+ get runtimeType => NumberList;
+ toString() => super.toString();
+}
+patch class PathElement {
+ static Type get instanceRuntimeType => PathElementImpl;
+
+}
+class PathElementImpl extends PathElement implements js_library.JSObjectInterfacesDom {
+ PathElementImpl.internal_() : super.internal_();
+ get runtimeType => PathElement;
+ toString() => super.toString();
+}
+patch class PathSeg {
+ static Type get instanceRuntimeType => PathSegImpl;
+
+}
+class PathSegImpl extends PathSeg implements js_library.JSObjectInterfacesDom {
+ PathSegImpl.internal_() : super.internal_();
+ get runtimeType => PathSeg;
+ toString() => super.toString();
+}
+patch class PathSegArcAbs {
+ static Type get instanceRuntimeType => PathSegArcAbsImpl;
+
+}
+class PathSegArcAbsImpl extends PathSegArcAbs implements js_library.JSObjectInterfacesDom {
+ PathSegArcAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegArcAbs;
+ toString() => super.toString();
+}
+patch class PathSegArcRel {
+ static Type get instanceRuntimeType => PathSegArcRelImpl;
+
+}
+class PathSegArcRelImpl extends PathSegArcRel implements js_library.JSObjectInterfacesDom {
+ PathSegArcRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegArcRel;
+ toString() => super.toString();
+}
+patch class PathSegClosePath {
+ static Type get instanceRuntimeType => PathSegClosePathImpl;
+
+}
+class PathSegClosePathImpl extends PathSegClosePath implements js_library.JSObjectInterfacesDom {
+ PathSegClosePathImpl.internal_() : super.internal_();
+ get runtimeType => PathSegClosePath;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoCubicAbs {
+ static Type get instanceRuntimeType => PathSegCurvetoCubicAbsImpl;
+
+}
+class PathSegCurvetoCubicAbsImpl extends PathSegCurvetoCubicAbs implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoCubicAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoCubicAbs;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoCubicRel {
+ static Type get instanceRuntimeType => PathSegCurvetoCubicRelImpl;
+
+}
+class PathSegCurvetoCubicRelImpl extends PathSegCurvetoCubicRel implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoCubicRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoCubicRel;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoCubicSmoothAbs {
+ static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothAbsImpl;
+
+}
+class PathSegCurvetoCubicSmoothAbsImpl extends PathSegCurvetoCubicSmoothAbs implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoCubicSmoothAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoCubicSmoothAbs;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoCubicSmoothRel {
+ static Type get instanceRuntimeType => PathSegCurvetoCubicSmoothRelImpl;
+
+}
+class PathSegCurvetoCubicSmoothRelImpl extends PathSegCurvetoCubicSmoothRel implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoCubicSmoothRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoCubicSmoothRel;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticAbs {
+ static Type get instanceRuntimeType => PathSegCurvetoQuadraticAbsImpl;
+
+}
+class PathSegCurvetoQuadraticAbsImpl extends PathSegCurvetoQuadraticAbs implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoQuadraticAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoQuadraticAbs;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticRel {
+ static Type get instanceRuntimeType => PathSegCurvetoQuadraticRelImpl;
+
+}
+class PathSegCurvetoQuadraticRelImpl extends PathSegCurvetoQuadraticRel implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoQuadraticRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoQuadraticRel;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticSmoothAbs {
+ static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothAbsImpl;
+
+}
+class PathSegCurvetoQuadraticSmoothAbsImpl extends PathSegCurvetoQuadraticSmoothAbs implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoQuadraticSmoothAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoQuadraticSmoothAbs;
+ toString() => super.toString();
+}
+patch class PathSegCurvetoQuadraticSmoothRel {
+ static Type get instanceRuntimeType => PathSegCurvetoQuadraticSmoothRelImpl;
+
+}
+class PathSegCurvetoQuadraticSmoothRelImpl extends PathSegCurvetoQuadraticSmoothRel implements js_library.JSObjectInterfacesDom {
+ PathSegCurvetoQuadraticSmoothRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegCurvetoQuadraticSmoothRel;
+ toString() => super.toString();
+}
+patch class PathSegLinetoAbs {
+ static Type get instanceRuntimeType => PathSegLinetoAbsImpl;
+
+}
+class PathSegLinetoAbsImpl extends PathSegLinetoAbs implements js_library.JSObjectInterfacesDom {
+ PathSegLinetoAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegLinetoAbs;
+ toString() => super.toString();
+}
+patch class PathSegLinetoHorizontalAbs {
+ static Type get instanceRuntimeType => PathSegLinetoHorizontalAbsImpl;
+
+}
+class PathSegLinetoHorizontalAbsImpl extends PathSegLinetoHorizontalAbs implements js_library.JSObjectInterfacesDom {
+ PathSegLinetoHorizontalAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegLinetoHorizontalAbs;
+ toString() => super.toString();
+}
+patch class PathSegLinetoHorizontalRel {
+ static Type get instanceRuntimeType => PathSegLinetoHorizontalRelImpl;
+
+}
+class PathSegLinetoHorizontalRelImpl extends PathSegLinetoHorizontalRel implements js_library.JSObjectInterfacesDom {
+ PathSegLinetoHorizontalRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegLinetoHorizontalRel;
+ toString() => super.toString();
+}
+patch class PathSegLinetoRel {
+ static Type get instanceRuntimeType => PathSegLinetoRelImpl;
+
+}
+class PathSegLinetoRelImpl extends PathSegLinetoRel implements js_library.JSObjectInterfacesDom {
+ PathSegLinetoRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegLinetoRel;
+ toString() => super.toString();
+}
+patch class PathSegLinetoVerticalAbs {
+ static Type get instanceRuntimeType => PathSegLinetoVerticalAbsImpl;
+
+}
+class PathSegLinetoVerticalAbsImpl extends PathSegLinetoVerticalAbs implements js_library.JSObjectInterfacesDom {
+ PathSegLinetoVerticalAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegLinetoVerticalAbs;
+ toString() => super.toString();
+}
+patch class PathSegLinetoVerticalRel {
+ static Type get instanceRuntimeType => PathSegLinetoVerticalRelImpl;
+
+}
+class PathSegLinetoVerticalRelImpl extends PathSegLinetoVerticalRel implements js_library.JSObjectInterfacesDom {
+ PathSegLinetoVerticalRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegLinetoVerticalRel;
+ toString() => super.toString();
+}
+patch class PathSegList {
+ static Type get instanceRuntimeType => PathSegListImpl;
+
+}
+class PathSegListImpl extends PathSegList implements js_library.JSObjectInterfacesDom {
+ PathSegListImpl.internal_() : super.internal_();
+ get runtimeType => PathSegList;
+ toString() => super.toString();
+}
+patch class PathSegMovetoAbs {
+ static Type get instanceRuntimeType => PathSegMovetoAbsImpl;
+
+}
+class PathSegMovetoAbsImpl extends PathSegMovetoAbs implements js_library.JSObjectInterfacesDom {
+ PathSegMovetoAbsImpl.internal_() : super.internal_();
+ get runtimeType => PathSegMovetoAbs;
+ toString() => super.toString();
+}
+patch class PathSegMovetoRel {
+ static Type get instanceRuntimeType => PathSegMovetoRelImpl;
+
+}
+class PathSegMovetoRelImpl extends PathSegMovetoRel implements js_library.JSObjectInterfacesDom {
+ PathSegMovetoRelImpl.internal_() : super.internal_();
+ get runtimeType => PathSegMovetoRel;
+ toString() => super.toString();
+}
+patch class PatternElement {
+ static Type get instanceRuntimeType => PatternElementImpl;
+
+}
+class PatternElementImpl extends PatternElement implements js_library.JSObjectInterfacesDom {
+ PatternElementImpl.internal_() : super.internal_();
+ get runtimeType => PatternElement;
+ toString() => super.toString();
+}
+patch class Point {
+ static Type get instanceRuntimeType => PointImpl;
+
+}
+class PointImpl extends Point implements js_library.JSObjectInterfacesDom {
+ PointImpl.internal_() : super.internal_();
+ get runtimeType => Point;
+ toString() => super.toString();
+}
+patch class PointList {
+ static Type get instanceRuntimeType => PointListImpl;
+
+}
+class PointListImpl extends PointList implements js_library.JSObjectInterfacesDom {
+ PointListImpl.internal_() : super.internal_();
+ get runtimeType => PointList;
+ toString() => super.toString();
+}
+patch class PolygonElement {
+ static Type get instanceRuntimeType => PolygonElementImpl;
+
+}
+class PolygonElementImpl extends PolygonElement implements js_library.JSObjectInterfacesDom {
+ PolygonElementImpl.internal_() : super.internal_();
+ get runtimeType => PolygonElement;
+ toString() => super.toString();
+}
+patch class PolylineElement {
+ static Type get instanceRuntimeType => PolylineElementImpl;
+
+}
+class PolylineElementImpl extends PolylineElement implements js_library.JSObjectInterfacesDom {
+ PolylineElementImpl.internal_() : super.internal_();
+ get runtimeType => PolylineElement;
+ toString() => super.toString();
+}
+patch class PreserveAspectRatio {
+ static Type get instanceRuntimeType => PreserveAspectRatioImpl;
+
+}
+class PreserveAspectRatioImpl extends PreserveAspectRatio implements js_library.JSObjectInterfacesDom {
+ PreserveAspectRatioImpl.internal_() : super.internal_();
+ get runtimeType => PreserveAspectRatio;
+ toString() => super.toString();
+}
+patch class RadialGradientElement {
+ static Type get instanceRuntimeType => RadialGradientElementImpl;
+
+}
+class RadialGradientElementImpl extends RadialGradientElement implements js_library.JSObjectInterfacesDom {
+ RadialGradientElementImpl.internal_() : super.internal_();
+ get runtimeType => RadialGradientElement;
+ toString() => super.toString();
+}
+patch class Rect {
+ static Type get instanceRuntimeType => RectImpl;
+
+}
+class RectImpl extends Rect implements js_library.JSObjectInterfacesDom {
+ RectImpl.internal_() : super.internal_();
+ get runtimeType => Rect;
+ toString() => super.toString();
+}
+patch class RectElement {
+ static Type get instanceRuntimeType => RectElementImpl;
+
+}
+class RectElementImpl extends RectElement implements js_library.JSObjectInterfacesDom {
+ RectElementImpl.internal_() : super.internal_();
+ get runtimeType => RectElement;
+ toString() => super.toString();
+}
+patch class ScriptElement {
+ static Type get instanceRuntimeType => ScriptElementImpl;
+
+}
+class ScriptElementImpl extends ScriptElement implements js_library.JSObjectInterfacesDom {
+ ScriptElementImpl.internal_() : super.internal_();
+ get runtimeType => ScriptElement;
+ toString() => super.toString();
+}
+patch class SetElement {
+ static Type get instanceRuntimeType => SetElementImpl;
+
+}
+class SetElementImpl extends SetElement implements js_library.JSObjectInterfacesDom {
+ SetElementImpl.internal_() : super.internal_();
+ get runtimeType => SetElement;
+ toString() => super.toString();
+}
+patch class StopElement {
+ static Type get instanceRuntimeType => StopElementImpl;
+
+}
+class StopElementImpl extends StopElement implements js_library.JSObjectInterfacesDom {
+ StopElementImpl.internal_() : super.internal_();
+ get runtimeType => StopElement;
+ toString() => super.toString();
+}
+patch class StringList {
+ static Type get instanceRuntimeType => StringListImpl;
+
+}
+class StringListImpl extends StringList implements js_library.JSObjectInterfacesDom {
+ StringListImpl.internal_() : super.internal_();
+ get runtimeType => StringList;
+ toString() => super.toString();
+}
+patch class StyleElement {
+ static Type get instanceRuntimeType => StyleElementImpl;
+
+}
+class StyleElementImpl extends StyleElement implements js_library.JSObjectInterfacesDom {
+ StyleElementImpl.internal_() : super.internal_();
+ get runtimeType => StyleElement;
+ toString() => super.toString();
+}
+patch class SvgElement {
+ static Type get instanceRuntimeType => SvgElementImpl;
+
+}
+class SvgElementImpl extends SvgElement implements js_library.JSObjectInterfacesDom {
+ SvgElementImpl.internal_() : super.internal_();
+ get runtimeType => SvgElement;
+ toString() => super.toString();
+}
+patch class SvgSvgElement {
+ static Type get instanceRuntimeType => SvgSvgElementImpl;
+
+}
+class SvgSvgElementImpl extends SvgSvgElement implements js_library.JSObjectInterfacesDom {
+ SvgSvgElementImpl.internal_() : super.internal_();
+ get runtimeType => SvgSvgElement;
+ toString() => super.toString();
+}
+patch class SwitchElement {
+ static Type get instanceRuntimeType => SwitchElementImpl;
+
+}
+class SwitchElementImpl extends SwitchElement implements js_library.JSObjectInterfacesDom {
+ SwitchElementImpl.internal_() : super.internal_();
+ get runtimeType => SwitchElement;
+ toString() => super.toString();
+}
+patch class SymbolElement {
+ static Type get instanceRuntimeType => SymbolElementImpl;
+
+}
+class SymbolElementImpl extends SymbolElement implements js_library.JSObjectInterfacesDom {
+ SymbolElementImpl.internal_() : super.internal_();
+ get runtimeType => SymbolElement;
+ toString() => super.toString();
+}
+patch class TSpanElement {
+ static Type get instanceRuntimeType => TSpanElementImpl;
+
+}
+class TSpanElementImpl extends TSpanElement implements js_library.JSObjectInterfacesDom {
+ TSpanElementImpl.internal_() : super.internal_();
+ get runtimeType => TSpanElement;
+ toString() => super.toString();
+}
+patch class Tests {
+ static Type get instanceRuntimeType => TestsImpl;
+
+}
+class TestsImpl extends Tests implements js_library.JSObjectInterfacesDom {
+ TestsImpl.internal_() : super.internal_();
+ get runtimeType => Tests;
+ toString() => super.toString();
+}
+patch class TextContentElement {
+ static Type get instanceRuntimeType => TextContentElementImpl;
+
+}
+class TextContentElementImpl extends TextContentElement implements js_library.JSObjectInterfacesDom {
+ TextContentElementImpl.internal_() : super.internal_();
+ get runtimeType => TextContentElement;
+ toString() => super.toString();
+}
+patch class TextElement {
+ static Type get instanceRuntimeType => TextElementImpl;
+
+}
+class TextElementImpl extends TextElement implements js_library.JSObjectInterfacesDom {
+ TextElementImpl.internal_() : super.internal_();
+ get runtimeType => TextElement;
+ toString() => super.toString();
+}
+patch class TextPathElement {
+ static Type get instanceRuntimeType => TextPathElementImpl;
+
+}
+class TextPathElementImpl extends TextPathElement implements js_library.JSObjectInterfacesDom {
+ TextPathElementImpl.internal_() : super.internal_();
+ get runtimeType => TextPathElement;
+ toString() => super.toString();
+}
+patch class TextPositioningElement {
+ static Type get instanceRuntimeType => TextPositioningElementImpl;
+
+}
+class TextPositioningElementImpl extends TextPositioningElement implements js_library.JSObjectInterfacesDom {
+ TextPositioningElementImpl.internal_() : super.internal_();
+ get runtimeType => TextPositioningElement;
+ toString() => super.toString();
+}
+patch class TitleElement {
+ static Type get instanceRuntimeType => TitleElementImpl;
+
+}
+class TitleElementImpl extends TitleElement implements js_library.JSObjectInterfacesDom {
+ TitleElementImpl.internal_() : super.internal_();
+ get runtimeType => TitleElement;
+ toString() => super.toString();
+}
+patch class Transform {
+ static Type get instanceRuntimeType => TransformImpl;
+
+}
+class TransformImpl extends Transform implements js_library.JSObjectInterfacesDom {
+ TransformImpl.internal_() : super.internal_();
+ get runtimeType => Transform;
+ toString() => super.toString();
+}
+patch class TransformList {
+ static Type get instanceRuntimeType => TransformListImpl;
+
+}
+class TransformListImpl extends TransformList implements js_library.JSObjectInterfacesDom {
+ TransformListImpl.internal_() : super.internal_();
+ get runtimeType => TransformList;
+ toString() => super.toString();
+}
+patch class UnitTypes {
+ static Type get instanceRuntimeType => UnitTypesImpl;
+
+}
+class UnitTypesImpl extends UnitTypes implements js_library.JSObjectInterfacesDom {
+ UnitTypesImpl.internal_() : super.internal_();
+ get runtimeType => UnitTypes;
+ toString() => super.toString();
+}
+patch class UriReference {
+ static Type get instanceRuntimeType => UriReferenceImpl;
+
+}
+class UriReferenceImpl extends UriReference implements js_library.JSObjectInterfacesDom {
+ UriReferenceImpl.internal_() : super.internal_();
+ get runtimeType => UriReference;
+ toString() => super.toString();
+}
+patch class UseElement {
+ static Type get instanceRuntimeType => UseElementImpl;
+
+}
+class UseElementImpl extends UseElement implements js_library.JSObjectInterfacesDom {
+ UseElementImpl.internal_() : super.internal_();
+ get runtimeType => UseElement;
+ toString() => super.toString();
+}
+patch class ViewElement {
+ static Type get instanceRuntimeType => ViewElementImpl;
+
+}
+class ViewElementImpl extends ViewElement implements js_library.JSObjectInterfacesDom {
+ ViewElementImpl.internal_() : super.internal_();
+ get runtimeType => ViewElement;
+ toString() => super.toString();
+}
+patch class ViewSpec {
+ static Type get instanceRuntimeType => ViewSpecImpl;
+
+}
+class ViewSpecImpl extends ViewSpec implements js_library.JSObjectInterfacesDom {
+ ViewSpecImpl.internal_() : super.internal_();
+ get runtimeType => ViewSpec;
+ toString() => super.toString();
+}
+patch class ZoomAndPan {
+ static Type get instanceRuntimeType => ZoomAndPanImpl;
+
+}
+class ZoomAndPanImpl extends ZoomAndPan implements js_library.JSObjectInterfacesDom {
+ ZoomAndPanImpl.internal_() : super.internal_();
+ get runtimeType => ZoomAndPan;
+ toString() => super.toString();
+}
+patch class ZoomEvent {
+ static Type get instanceRuntimeType => ZoomEventImpl;
+
+}
+class ZoomEventImpl extends ZoomEvent implements js_library.JSObjectInterfacesDom {
+ ZoomEventImpl.internal_() : super.internal_();
+ get runtimeType => ZoomEvent;
+ toString() => super.toString();
+}
+patch class _GradientElement {
+ static Type get instanceRuntimeType => _GradientElementImpl;
+
+}
+class _GradientElementImpl extends _GradientElement implements js_library.JSObjectInterfacesDom {
+ _GradientElementImpl.internal_() : super.internal_();
+ get runtimeType => _GradientElement;
+ toString() => super.toString();
+}
+patch class _SVGComponentTransferFunctionElement {
+ static Type get instanceRuntimeType => _SVGComponentTransferFunctionElementImpl;
+
+}
+class _SVGComponentTransferFunctionElementImpl extends _SVGComponentTransferFunctionElement implements js_library.JSObjectInterfacesDom {
+ _SVGComponentTransferFunctionElementImpl.internal_() : super.internal_();
+ get runtimeType => _SVGComponentTransferFunctionElement;
+ toString() => super.toString();
+}
+patch class _SVGCursorElement {
+ static Type get instanceRuntimeType => _SVGCursorElementImpl;
+
+}
+class _SVGCursorElementImpl extends _SVGCursorElement implements js_library.JSObjectInterfacesDom {
+ _SVGCursorElementImpl.internal_() : super.internal_();
+ get runtimeType => _SVGCursorElement;
+ toString() => super.toString();
+}
+patch class _SVGFEDropShadowElement {
+ static Type get instanceRuntimeType => _SVGFEDropShadowElementImpl;
+
+}
+class _SVGFEDropShadowElementImpl extends _SVGFEDropShadowElement implements js_library.JSObjectInterfacesDom {
+ _SVGFEDropShadowElementImpl.internal_() : super.internal_();
+ get runtimeType => _SVGFEDropShadowElement;
+ toString() => super.toString();
+}
+patch class _SVGMPathElement {
+ static Type get instanceRuntimeType => _SVGMPathElementImpl;
+
+}
+class _SVGMPathElementImpl extends _SVGMPathElement implements js_library.JSObjectInterfacesDom {
+ _SVGMPathElementImpl.internal_() : super.internal_();
+ get runtimeType => _SVGMPathElement;
+ toString() => super.toString();
+}
"""],"dart:web_audio": ["dart:web_audio", "dart:web_audio_js_interop_patch.dart", """import 'dart:js' as js_library;
@@ -5775,96 +5775,6 @@
*/
const _UNDEFINED_JS_CONST = const Object();
-patch class GainNode {
- static Type get instanceRuntimeType => GainNodeImpl;
-
-}
-class GainNodeImpl extends GainNode implements js_library.JSObjectInterfacesDom {
- GainNodeImpl.internal_() : super.internal_();
- get runtimeType => GainNode;
- toString() => super.toString();
-}
-patch class MediaStreamAudioDestinationNode {
- static Type get instanceRuntimeType => MediaStreamAudioDestinationNodeImpl;
-
-}
-class MediaStreamAudioDestinationNodeImpl extends MediaStreamAudioDestinationNode implements js_library.JSObjectInterfacesDom {
- MediaStreamAudioDestinationNodeImpl.internal_() : super.internal_();
- get runtimeType => MediaStreamAudioDestinationNode;
- toString() => super.toString();
-}
-patch class AudioProcessingEvent {
- static Type get instanceRuntimeType => AudioProcessingEventImpl;
-
-}
-class AudioProcessingEventImpl extends AudioProcessingEvent implements js_library.JSObjectInterfacesDom {
- AudioProcessingEventImpl.internal_() : super.internal_();
- get runtimeType => AudioProcessingEvent;
- toString() => super.toString();
-}
-patch class StereoPannerNode {
- static Type get instanceRuntimeType => StereoPannerNodeImpl;
-
-}
-class StereoPannerNodeImpl extends StereoPannerNode implements js_library.JSObjectInterfacesDom {
- StereoPannerNodeImpl.internal_() : super.internal_();
- get runtimeType => StereoPannerNode;
- toString() => super.toString();
-}
-patch class DynamicsCompressorNode {
- static Type get instanceRuntimeType => DynamicsCompressorNodeImpl;
-
-}
-class DynamicsCompressorNodeImpl extends DynamicsCompressorNode implements js_library.JSObjectInterfacesDom {
- DynamicsCompressorNodeImpl.internal_() : super.internal_();
- get runtimeType => DynamicsCompressorNode;
- toString() => super.toString();
-}
-patch class PeriodicWave {
- static Type get instanceRuntimeType => PeriodicWaveImpl;
-
-}
-class PeriodicWaveImpl extends PeriodicWave implements js_library.JSObjectInterfacesDom {
- PeriodicWaveImpl.internal_() : super.internal_();
- get runtimeType => PeriodicWave;
- toString() => super.toString();
-}
-patch class MediaStreamAudioSourceNode {
- static Type get instanceRuntimeType => MediaStreamAudioSourceNodeImpl;
-
-}
-class MediaStreamAudioSourceNodeImpl extends MediaStreamAudioSourceNode implements js_library.JSObjectInterfacesDom {
- MediaStreamAudioSourceNodeImpl.internal_() : super.internal_();
- get runtimeType => MediaStreamAudioSourceNode;
- toString() => super.toString();
-}
-patch class PannerNode {
- static Type get instanceRuntimeType => PannerNodeImpl;
-
-}
-class PannerNodeImpl extends PannerNode implements js_library.JSObjectInterfacesDom {
- PannerNodeImpl.internal_() : super.internal_();
- get runtimeType => PannerNode;
- toString() => super.toString();
-}
-patch class OfflineAudioContext {
- static Type get instanceRuntimeType => OfflineAudioContextImpl;
-
-}
-class OfflineAudioContextImpl extends OfflineAudioContext implements js_library.JSObjectInterfacesDom {
- OfflineAudioContextImpl.internal_() : super.internal_();
- get runtimeType => OfflineAudioContext;
- toString() => super.toString();
-}
-patch class AudioParam {
- static Type get instanceRuntimeType => AudioParamImpl;
-
-}
-class AudioParamImpl extends AudioParam implements js_library.JSObjectInterfacesDom {
- AudioParamImpl.internal_() : super.internal_();
- get runtimeType => AudioParam;
- toString() => super.toString();
-}
patch class AnalyserNode {
static Type get instanceRuntimeType => AnalyserNodeImpl;
@@ -5874,58 +5784,13 @@
get runtimeType => AnalyserNode;
toString() => super.toString();
}
-patch class ConvolverNode {
- static Type get instanceRuntimeType => ConvolverNodeImpl;
+patch class AudioBuffer {
+ static Type get instanceRuntimeType => AudioBufferImpl;
}
-class ConvolverNodeImpl extends ConvolverNode implements js_library.JSObjectInterfacesDom {
- ConvolverNodeImpl.internal_() : super.internal_();
- get runtimeType => ConvolverNode;
- toString() => super.toString();
-}
-patch class AudioNode {
- static Type get instanceRuntimeType => AudioNodeImpl;
-
-}
-class AudioNodeImpl extends AudioNode implements js_library.JSObjectInterfacesDom {
- AudioNodeImpl.internal_() : super.internal_();
- get runtimeType => AudioNode;
- toString() => super.toString();
-}
-patch class AudioDestinationNode {
- static Type get instanceRuntimeType => AudioDestinationNodeImpl;
-
-}
-class AudioDestinationNodeImpl extends AudioDestinationNode implements js_library.JSObjectInterfacesDom {
- AudioDestinationNodeImpl.internal_() : super.internal_();
- get runtimeType => AudioDestinationNode;
- toString() => super.toString();
-}
-patch class WaveShaperNode {
- static Type get instanceRuntimeType => WaveShaperNodeImpl;
-
-}
-class WaveShaperNodeImpl extends WaveShaperNode implements js_library.JSObjectInterfacesDom {
- WaveShaperNodeImpl.internal_() : super.internal_();
- get runtimeType => WaveShaperNode;
- toString() => super.toString();
-}
-patch class ScriptProcessorNode {
- static Type get instanceRuntimeType => ScriptProcessorNodeImpl;
-
-}
-class ScriptProcessorNodeImpl extends ScriptProcessorNode implements js_library.JSObjectInterfacesDom {
- ScriptProcessorNodeImpl.internal_() : super.internal_();
- get runtimeType => ScriptProcessorNode;
- toString() => super.toString();
-}
-patch class MediaElementAudioSourceNode {
- static Type get instanceRuntimeType => MediaElementAudioSourceNodeImpl;
-
-}
-class MediaElementAudioSourceNodeImpl extends MediaElementAudioSourceNode implements js_library.JSObjectInterfacesDom {
- MediaElementAudioSourceNodeImpl.internal_() : super.internal_();
- get runtimeType => MediaElementAudioSourceNode;
+class AudioBufferImpl extends AudioBuffer implements js_library.JSObjectInterfacesDom {
+ AudioBufferImpl.internal_() : super.internal_();
+ get runtimeType => AudioBuffer;
toString() => super.toString();
}
patch class AudioBufferSourceNode {
@@ -5946,67 +5811,49 @@
get runtimeType => AudioContext;
toString() => super.toString();
}
-patch class ChannelSplitterNode {
- static Type get instanceRuntimeType => ChannelSplitterNodeImpl;
+patch class AudioDestinationNode {
+ static Type get instanceRuntimeType => AudioDestinationNodeImpl;
}
-class ChannelSplitterNodeImpl extends ChannelSplitterNode implements js_library.JSObjectInterfacesDom {
- ChannelSplitterNodeImpl.internal_() : super.internal_();
- get runtimeType => ChannelSplitterNode;
+class AudioDestinationNodeImpl extends AudioDestinationNode implements js_library.JSObjectInterfacesDom {
+ AudioDestinationNodeImpl.internal_() : super.internal_();
+ get runtimeType => AudioDestinationNode;
toString() => super.toString();
}
-patch class DelayNode {
- static Type get instanceRuntimeType => DelayNodeImpl;
+patch class AudioListener {
+ static Type get instanceRuntimeType => AudioListenerImpl;
}
-class DelayNodeImpl extends DelayNode implements js_library.JSObjectInterfacesDom {
- DelayNodeImpl.internal_() : super.internal_();
- get runtimeType => DelayNode;
+class AudioListenerImpl extends AudioListener implements js_library.JSObjectInterfacesDom {
+ AudioListenerImpl.internal_() : super.internal_();
+ get runtimeType => AudioListener;
toString() => super.toString();
}
-patch class OfflineAudioCompletionEvent {
- static Type get instanceRuntimeType => OfflineAudioCompletionEventImpl;
+patch class AudioNode {
+ static Type get instanceRuntimeType => AudioNodeImpl;
}
-class OfflineAudioCompletionEventImpl extends OfflineAudioCompletionEvent implements js_library.JSObjectInterfacesDom {
- OfflineAudioCompletionEventImpl.internal_() : super.internal_();
- get runtimeType => OfflineAudioCompletionEvent;
+class AudioNodeImpl extends AudioNode implements js_library.JSObjectInterfacesDom {
+ AudioNodeImpl.internal_() : super.internal_();
+ get runtimeType => AudioNode;
toString() => super.toString();
}
-patch class OscillatorNode {
- static Type get instanceRuntimeType => OscillatorNodeImpl;
+patch class AudioParam {
+ static Type get instanceRuntimeType => AudioParamImpl;
}
-class OscillatorNodeImpl extends OscillatorNode implements js_library.JSObjectInterfacesDom {
- OscillatorNodeImpl.internal_() : super.internal_();
- get runtimeType => OscillatorNode;
+class AudioParamImpl extends AudioParam implements js_library.JSObjectInterfacesDom {
+ AudioParamImpl.internal_() : super.internal_();
+ get runtimeType => AudioParam;
toString() => super.toString();
}
-patch class BiquadFilterNode {
- static Type get instanceRuntimeType => BiquadFilterNodeImpl;
+patch class AudioProcessingEvent {
+ static Type get instanceRuntimeType => AudioProcessingEventImpl;
}
-class BiquadFilterNodeImpl extends BiquadFilterNode implements js_library.JSObjectInterfacesDom {
- BiquadFilterNodeImpl.internal_() : super.internal_();
- get runtimeType => BiquadFilterNode;
- toString() => super.toString();
-}
-patch class AudioBuffer {
- static Type get instanceRuntimeType => AudioBufferImpl;
-
-}
-class AudioBufferImpl extends AudioBuffer implements js_library.JSObjectInterfacesDom {
- AudioBufferImpl.internal_() : super.internal_();
- get runtimeType => AudioBuffer;
- toString() => super.toString();
-}
-patch class ChannelMergerNode {
- static Type get instanceRuntimeType => ChannelMergerNodeImpl;
-
-}
-class ChannelMergerNodeImpl extends ChannelMergerNode implements js_library.JSObjectInterfacesDom {
- ChannelMergerNodeImpl.internal_() : super.internal_();
- get runtimeType => ChannelMergerNode;
+class AudioProcessingEventImpl extends AudioProcessingEvent implements js_library.JSObjectInterfacesDom {
+ AudioProcessingEventImpl.internal_() : super.internal_();
+ get runtimeType => AudioProcessingEvent;
toString() => super.toString();
}
patch class AudioSourceNode {
@@ -6018,13 +5865,166 @@
get runtimeType => AudioSourceNode;
toString() => super.toString();
}
-patch class AudioListener {
- static Type get instanceRuntimeType => AudioListenerImpl;
+patch class BiquadFilterNode {
+ static Type get instanceRuntimeType => BiquadFilterNodeImpl;
}
-class AudioListenerImpl extends AudioListener implements js_library.JSObjectInterfacesDom {
- AudioListenerImpl.internal_() : super.internal_();
- get runtimeType => AudioListener;
+class BiquadFilterNodeImpl extends BiquadFilterNode implements js_library.JSObjectInterfacesDom {
+ BiquadFilterNodeImpl.internal_() : super.internal_();
+ get runtimeType => BiquadFilterNode;
+ toString() => super.toString();
+}
+patch class ChannelMergerNode {
+ static Type get instanceRuntimeType => ChannelMergerNodeImpl;
+
+}
+class ChannelMergerNodeImpl extends ChannelMergerNode implements js_library.JSObjectInterfacesDom {
+ ChannelMergerNodeImpl.internal_() : super.internal_();
+ get runtimeType => ChannelMergerNode;
+ toString() => super.toString();
+}
+patch class ChannelSplitterNode {
+ static Type get instanceRuntimeType => ChannelSplitterNodeImpl;
+
+}
+class ChannelSplitterNodeImpl extends ChannelSplitterNode implements js_library.JSObjectInterfacesDom {
+ ChannelSplitterNodeImpl.internal_() : super.internal_();
+ get runtimeType => ChannelSplitterNode;
+ toString() => super.toString();
+}
+patch class ConvolverNode {
+ static Type get instanceRuntimeType => ConvolverNodeImpl;
+
+}
+class ConvolverNodeImpl extends ConvolverNode implements js_library.JSObjectInterfacesDom {
+ ConvolverNodeImpl.internal_() : super.internal_();
+ get runtimeType => ConvolverNode;
+ toString() => super.toString();
+}
+patch class DelayNode {
+ static Type get instanceRuntimeType => DelayNodeImpl;
+
+}
+class DelayNodeImpl extends DelayNode implements js_library.JSObjectInterfacesDom {
+ DelayNodeImpl.internal_() : super.internal_();
+ get runtimeType => DelayNode;
+ toString() => super.toString();
+}
+patch class DynamicsCompressorNode {
+ static Type get instanceRuntimeType => DynamicsCompressorNodeImpl;
+
+}
+class DynamicsCompressorNodeImpl extends DynamicsCompressorNode implements js_library.JSObjectInterfacesDom {
+ DynamicsCompressorNodeImpl.internal_() : super.internal_();
+ get runtimeType => DynamicsCompressorNode;
+ toString() => super.toString();
+}
+patch class GainNode {
+ static Type get instanceRuntimeType => GainNodeImpl;
+
+}
+class GainNodeImpl extends GainNode implements js_library.JSObjectInterfacesDom {
+ GainNodeImpl.internal_() : super.internal_();
+ get runtimeType => GainNode;
+ toString() => super.toString();
+}
+patch class MediaElementAudioSourceNode {
+ static Type get instanceRuntimeType => MediaElementAudioSourceNodeImpl;
+
+}
+class MediaElementAudioSourceNodeImpl extends MediaElementAudioSourceNode implements js_library.JSObjectInterfacesDom {
+ MediaElementAudioSourceNodeImpl.internal_() : super.internal_();
+ get runtimeType => MediaElementAudioSourceNode;
+ toString() => super.toString();
+}
+patch class MediaStreamAudioDestinationNode {
+ static Type get instanceRuntimeType => MediaStreamAudioDestinationNodeImpl;
+
+}
+class MediaStreamAudioDestinationNodeImpl extends MediaStreamAudioDestinationNode implements js_library.JSObjectInterfacesDom {
+ MediaStreamAudioDestinationNodeImpl.internal_() : super.internal_();
+ get runtimeType => MediaStreamAudioDestinationNode;
+ toString() => super.toString();
+}
+patch class MediaStreamAudioSourceNode {
+ static Type get instanceRuntimeType => MediaStreamAudioSourceNodeImpl;
+
+}
+class MediaStreamAudioSourceNodeImpl extends MediaStreamAudioSourceNode implements js_library.JSObjectInterfacesDom {
+ MediaStreamAudioSourceNodeImpl.internal_() : super.internal_();
+ get runtimeType => MediaStreamAudioSourceNode;
+ toString() => super.toString();
+}
+patch class OfflineAudioCompletionEvent {
+ static Type get instanceRuntimeType => OfflineAudioCompletionEventImpl;
+
+}
+class OfflineAudioCompletionEventImpl extends OfflineAudioCompletionEvent implements js_library.JSObjectInterfacesDom {
+ OfflineAudioCompletionEventImpl.internal_() : super.internal_();
+ get runtimeType => OfflineAudioCompletionEvent;
+ toString() => super.toString();
+}
+patch class OfflineAudioContext {
+ static Type get instanceRuntimeType => OfflineAudioContextImpl;
+
+}
+class OfflineAudioContextImpl extends OfflineAudioContext implements js_library.JSObjectInterfacesDom {
+ OfflineAudioContextImpl.internal_() : super.internal_();
+ get runtimeType => OfflineAudioContext;
+ toString() => super.toString();
+}
+patch class OscillatorNode {
+ static Type get instanceRuntimeType => OscillatorNodeImpl;
+
+}
+class OscillatorNodeImpl extends OscillatorNode implements js_library.JSObjectInterfacesDom {
+ OscillatorNodeImpl.internal_() : super.internal_();
+ get runtimeType => OscillatorNode;
+ toString() => super.toString();
+}
+patch class PannerNode {
+ static Type get instanceRuntimeType => PannerNodeImpl;
+
+}
+class PannerNodeImpl extends PannerNode implements js_library.JSObjectInterfacesDom {
+ PannerNodeImpl.internal_() : super.internal_();
+ get runtimeType => PannerNode;
+ toString() => super.toString();
+}
+patch class PeriodicWave {
+ static Type get instanceRuntimeType => PeriodicWaveImpl;
+
+}
+class PeriodicWaveImpl extends PeriodicWave implements js_library.JSObjectInterfacesDom {
+ PeriodicWaveImpl.internal_() : super.internal_();
+ get runtimeType => PeriodicWave;
+ toString() => super.toString();
+}
+patch class ScriptProcessorNode {
+ static Type get instanceRuntimeType => ScriptProcessorNodeImpl;
+
+}
+class ScriptProcessorNodeImpl extends ScriptProcessorNode implements js_library.JSObjectInterfacesDom {
+ ScriptProcessorNodeImpl.internal_() : super.internal_();
+ get runtimeType => ScriptProcessorNode;
+ toString() => super.toString();
+}
+patch class StereoPannerNode {
+ static Type get instanceRuntimeType => StereoPannerNodeImpl;
+
+}
+class StereoPannerNodeImpl extends StereoPannerNode implements js_library.JSObjectInterfacesDom {
+ StereoPannerNodeImpl.internal_() : super.internal_();
+ get runtimeType => StereoPannerNode;
+ toString() => super.toString();
+}
+patch class WaveShaperNode {
+ static Type get instanceRuntimeType => WaveShaperNodeImpl;
+
+}
+class WaveShaperNodeImpl extends WaveShaperNode implements js_library.JSObjectInterfacesDom {
+ WaveShaperNodeImpl.internal_() : super.internal_();
+ get runtimeType => WaveShaperNode;
toString() => super.toString();
}
diff --git a/sdk/lib/js/dartium/js_dartium.dart b/sdk/lib/js/dartium/js_dartium.dart
index 610ec22..0d96425 100644
--- a/sdk/lib/js/dartium/js_dartium.dart
+++ b/sdk/lib/js/dartium/js_dartium.dart
@@ -506,9 +506,11 @@
mirrors.currentMirrorSystem().libraries.forEach((uri, library) {
var library_name = "${uri.scheme}:${uri.path}";
if (cached_patches.containsKey(library_name)) {
+ // Use the pre-generated patch files for DOM dart:nnnn libraries.
var patch = cached_patches[library_name];
staticCodegen.addAll(patch);
- } else {
+ } else if (_hasJsName(library)) {
+ // Library marked with @JS
_generateLibraryCodegen(uri, library, staticCodegen);
}
}); // End of library foreach
@@ -532,7 +534,13 @@
var sb = new StringBuffer();
String jsLibraryName = _getJsName(library);
- library.declarations.forEach((name, declaration) {
+
+ // Sort by patch file by its declaration name.
+ var sortedDeclKeys = library.declarations.keys.toList();
+ sortedDeclKeys.sort((a, b) => mirrors.MirrorSystem.getName(a).compareTo(mirrors.MirrorSystem.getName(b)));
+
+ sortedDeclKeys.forEach((name) {
+ var declaration = library.declarations[name];
if (declaration is mirrors.MethodMirror) {
if ((_hasJsName(declaration) || jsLibraryName != null) &&
_isExternal(declaration)) {
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 3fe27f7..8144d86 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -999,6 +999,7 @@
LibTest/html/IFrameElement/blur_A01_t01: Skip # co19-roll r706. Please triage this failure.
LibTest/html/IFrameElement/borderEdge_A01_t01: RuntimeError # co19-roll r706. Issue 16574
LibTest/html/IFrameElement/clone_A01_t02: RuntimeError # co19-roll r706. Please triage this failure.
+LibTest/html/IFrameElement/contentWindow_A01_t01: RuntimeError # Also fails in dart2js as this test should not pass given current Dart semantics for cross frame windows.
LibTest/html/IFrameElement/createFragment_A01_t01: RuntimeError # co19-roll r706. Please triage this failure.
LibTest/html/IFrameElement/createFragment_A01_t02: RuntimeError # co19-roll r706. Please triage this failure.
LibTest/html/IFrameElement/createFragment_A01_t03: RuntimeError # co19-roll r706. Please triage this failure.
@@ -1025,9 +1026,11 @@
LibTest/html/Window/find_A01_t01: RuntimeError # co19-roll r706. Please triage this failure.
LibTest/html/Window/find_A03_t01: RuntimeError # co19-roll r706. Please triage this failure.
LibTest/html/Window/find_A06_t01: RuntimeError # co19-roll r706. Please triage this failure.
+LibTest/html/Window/moveBy_A01_t01: RuntimeError # Also fails in dart2js as this test should not pass given current Dart semantics for cross frame windows.
LibTest/html/Window/moveTo_A01_t01: RuntimeError, Pass # co19-roll r706. Please triage this failure.
LibTest/html/Window/moveTo_A02_t01: RuntimeError # co19-roll r706. Please triage this failure.
LibTest/html/Window/postMessage_A01_t01: RuntimeError # co19-roll r706. Please triage this failure.
+LibTest/html/Window/postMessage_A01_t02: RuntimeError # Also fails in dart2js.
LibTest/html/Window/requestFileSystem_A01_t02: RuntimeError,Pass # co19-roll r722: Please triage this failure.
LibTest/html/Window/requestFileSystem_A02_t01: Skip # Issue 24585.
LibTest/html/Window/resizeBy_A01_t01: RuntimeError # co19-roll r706. Please triage this failure.
diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/analyze_helper.dart
index 61b52be..fb06d78 100644
--- a/tests/compiler/dart2js/analyze_helper.dart
+++ b/tests/compiler/dart2js/analyze_helper.dart
@@ -17,6 +17,7 @@
CompilerOptions;
import 'package:compiler/src/source_file_provider.dart';
import 'package:compiler/src/util/uri_extras.dart';
+import 'diagnostic_helper.dart';
/// Option for hiding whitelisted messages.
const String HIDE_WHITELISTED = '--hide-whitelisted';
@@ -43,6 +44,7 @@
Map<String, Map<dynamic/*String|MessageKind*/, int>> whiteListMap
= new Map<String, Map<dynamic/*String|MessageKind*/, int>>();
List<MessageKind> skipList;
+ List<CollectedMessage> collectedMessages = <CollectedMessage>[];
CollectingDiagnosticHandler(
Map<String, List/*<String|MessageKind>*/> whiteList,
@@ -61,6 +63,7 @@
bool checkResults() {
bool validWhiteListUse = checkWhiteListUse();
reportWhiteListUse();
+ reportCollectedMessages();
return !hasWarnings && !hasHint && !hasErrors && validWhiteListUse;
}
@@ -78,6 +81,19 @@
return allUsed;
}
+ void reportCollectedMessages() {
+ if (collectedMessages.isNotEmpty) {
+ print('----------------------------------------------------------------');
+ print('Unexpected messages:');
+ print('----------------------------------------------------------------');
+ for (CollectedMessage message in collectedMessages) {
+ super.report(message.message, message.uri, message.begin,
+ message.end, message.text, message.kind);
+ }
+ print('----------------------------------------------------------------');
+ }
+ }
+
void reportWhiteListUse() {
for (String file in whiteListMap.keys) {
for (var messagePart in whiteListMap[file].keys) {
@@ -156,6 +172,10 @@
return;
}
lastWasWhitelisted = false;
+ if (kind != api.Diagnostic.VERBOSE_INFO) {
+ collectedMessages.add(new CollectedMessage(
+ message, uri, begin, end, text, kind));
+ }
super.report(message, uri, begin, end, text, kind);
}
}
diff --git a/tests/compiler/dart2js/analyze_test_test.dart b/tests/compiler/dart2js/analyze_test_test.dart
index 4a2321b..5da181c 100644
--- a/tests/compiler/dart2js/analyze_test_test.dart
+++ b/tests/compiler/dart2js/analyze_test_test.dart
@@ -58,8 +58,12 @@
main(List<String> arguments) {
List<String> options = <String>[];
- if (arguments.contains('-v') || arguments.contains(Flags.verbose)) {
- options.add(Flags.verbose);
+ for (String argument in arguments) {
+ if (argument == '-v') {
+ options.add(Flags.verbose);
+ } else if (argument.startsWith('-')) {
+ options.add(argument);
+ }
}
List<Uri> uriList = <Uri>[];
for (String arg in arguments) {
diff --git a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
index e3c52bc..4d331b3 100644
--- a/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
+++ b/tests/compiler/dart2js/backend_dart/dart_printer_test.dart
@@ -233,6 +233,7 @@
}
endSend(t) {
List<Argument> arguments = pop();
+ pop(); // typeArguments
if (arguments == null)
return; // not a function call
Expression selector = pop();
diff --git a/tests/compiler/dart2js/dart2js.status b/tests/compiler/dart2js/dart2js.status
index 69b7f3d..6c26bdb 100644
--- a/tests/compiler/dart2js/dart2js.status
+++ b/tests/compiler/dart2js/dart2js.status
@@ -68,6 +68,7 @@
interop_anonymous_unreachable_test: Pass, Slow
mirror_final_field_inferrer2_test: Pass, Slow
source_map_pub_build_validity_test: Pass, Slow
+serialization*: Slow, Pass
uri_retention_test: Pass, Slow
value_range_test: Pass, Slow
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 2bbde2b..715d4d6 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -151,7 +151,8 @@
}
class TestScanner extends ScannerTask {
- TestScanner(TestCompiler compiler) : super(compiler);
+ TestScanner(TestCompiler compiler)
+ : super(compiler, compiler.dietParser);
TestCompiler get compiler => super.compiler;
diff --git a/tests/compiler/dart2js/options_helper.dart b/tests/compiler/dart2js/options_helper.dart
index b071832..ecf9d3d5 100644
--- a/tests/compiler/dart2js/options_helper.dart
+++ b/tests/compiler/dart2js/options_helper.dart
@@ -21,4 +21,5 @@
class MockParserOptions implements ParserOptions {
bool get enableConditionalDirectives => true;
+ bool get enableGenericMethodSyntax => true;
}
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index d6e1953..028fa06 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -7,6 +7,7 @@
import "package:expect/expect.dart";
import "package:compiler/src/elements/elements.dart";
+import 'package:compiler/src/id_generator.dart';
import "package:compiler/src/tree/tree.dart";
import "package:compiler/src/parser/element_listener.dart";
import "package:compiler/src/parser/node_listener.dart";
@@ -150,11 +151,10 @@
}
var script = new Script(uri, uri, new MockFile(text));
var unit = new CompilationUnitElementX(script, library);
- int id = 0;
DiagnosticReporter reporter = compiler.reporter;
ElementListener listener = new ElementListener(
compiler.parsing.getScannerOptionsFor(library),
- reporter, unit, () => id++);
+ reporter, unit, new IdGenerator());
PartialParser parser = new PartialParser(listener, new MockParserOptions());
reporter.withCurrentElement(unit, () => parser.parseUnit(tokens));
return unit.localMembers;
diff --git a/tests/compiler/dart2js/serialization_analysis_test.dart b/tests/compiler/dart2js/serialization_analysis_test.dart
index 373fb89..39c46de 100644
--- a/tests/compiler/dart2js/serialization_analysis_test.dart
+++ b/tests/compiler/dart2js/serialization_analysis_test.dart
@@ -14,192 +14,7 @@
import 'package:compiler/src/filenames.dart';
import 'memory_compiler.dart';
import 'serialization_helper.dart';
-
-const List<Test> TESTS = const <Test>[
- const Test(const {
- 'main.dart': 'main() {}'
- }),
-
- const Test(const {
- 'main.dart': 'main() => print("Hello World");'
- }),
-
- const Test(const {
- 'main.dart': 'main() => print("Hello World", 0);'
- },
- expectedWarningCount: 1,
- expectedInfoCount: 1),
-
- const Test(const {
- 'main.dart': r'''
-main() {
- String text = "Hello World";
- print('$text');
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-main() {
- String text = "Hello World";
- print('$text', text);
-}'''
- },
- expectedWarningCount: 1,
- expectedInfoCount: 1),
-
- const Test(const {
- 'main.dart': r'''
-main(List<String> arguments) {
- print(arguments);
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-main(List<String> arguments) {
- for (int i = 0; i < arguments.length; i++) {
- print(arguments[i]);
- }
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-main(List<String> arguments) {
- for (String argument in arguments) {
- print(argument);
- }
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-class Class {}
-main() {
- print(new Class());
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-class Class implements Function {}
-main() {
- print(new Class());
-}'''
- },
- expectedWarningCount: 1),
-
- const Test(const {
- 'main.dart': r'''
-class Class implements Function {
- call() {}
-}
-main() {
- print(new Class()());
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-class Class implements Comparable<Class> {
- int compareTo(Class other) => 0;
-}
-main() {
- print(new Class());
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-class Class implements Comparable<Class, Class> {
- int compareTo(other) => 0;
-}
-main() {
- print(new Class());
-}'''
- },
- expectedWarningCount: 1),
-
- const Test(const {
- 'main.dart': r'''
-class Class implements Comparable<Class> {
- int compareTo(String other) => 0;
-}
-main() {
- print(new Class().compareTo(null));
-}'''
- },
- expectedWarningCount: 1,
- expectedInfoCount: 1),
-
- const Test(const {
- 'main.dart': r'''
-class Class implements Comparable {
- bool compareTo(a, b) => true;
-}
-main() {
- print(new Class().compareTo(null, null));
-}'''
- },
- expectedWarningCount: 1,
- expectedInfoCount: 1),
-
- const Test(const {
- 'main.dart': r'''
-import 'dart:math';
-
-class MyRandom implements Random {
- int nextInt(int max) {
- return max.length;
- }
- bool nextBool() => true;
- double nextDouble() => 0.0;
-}
-main() {
- new MyRandom().nextInt(0);
-}'''
- },
- expectedWarningCount: 1,
- expectedInfoCount: 0),
-
- const Test(const {
- 'main.dart': r'''
-import 'dart:math';
-
-class MyRandom implements Random {
- int nextInt(int max) {
- return max.length;
- }
- bool nextBool() => true;
- double nextDouble() => 0.0;
-}
-main() {
- new MyRandom();
-}'''
- }),
-
- const Test(const {
- 'main.dart': r'''
-import 'dart:math';
-
-class MyRandom implements Random {
- int nextInt(int max) {
- return max.length;
- }
- bool nextBool() => true;
- double nextDouble() => 0.0;
-}
-main() {
- // Invocation of `MyRandom.nextInt` is only detected knowing the actual
- // implementation class for `List` and the world impact of its `shuffle`
- // method.
- [].shuffle(new MyRandom());
-}'''
- },
- expectedWarningCount: 1,
- expectedInfoCount: 0),
-];
+import 'serialization_test_data.dart';
main(List<String> arguments) {
asyncTest(() async {
@@ -217,20 +32,6 @@
});
}
-class Test {
- final Map sourceFiles;
- final int expectedErrorCount;
- final int expectedWarningCount;
- final int expectedHintCount;
- final int expectedInfoCount;
-
- const Test(this.sourceFiles, {
- this.expectedErrorCount: 0,
- this.expectedWarningCount: 0,
- this.expectedHintCount: 0,
- this.expectedInfoCount: 0});
-}
-
Future analyze(String serializedData, Uri entryPoint, Test test) async {
DiagnosticCollector diagnosticCollector = new DiagnosticCollector();
await runCompiler(
diff --git a/tests/compiler/dart2js/serialization_helper.dart b/tests/compiler/dart2js/serialization_helper.dart
index a8f95a6..c863265 100644
--- a/tests/compiler/dart2js/serialization_helper.dart
+++ b/tests/compiler/dart2js/serialization_helper.dart
@@ -7,6 +7,7 @@
import 'dart:async';
import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';
+import 'package:compiler/compiler_new.dart';
import 'package:compiler/src/commandline_options.dart';
import 'package:compiler/src/common/backend_api.dart';
import 'package:compiler/src/common/names.dart';
@@ -14,30 +15,46 @@
import 'package:compiler/src/compiler.dart';
import 'package:compiler/src/elements/elements.dart';
import 'package:compiler/src/filenames.dart';
+import 'package:compiler/src/io/source_file.dart';
+import 'package:compiler/src/scanner/scanner.dart';
import 'package:compiler/src/serialization/element_serialization.dart';
import 'package:compiler/src/serialization/impact_serialization.dart';
import 'package:compiler/src/serialization/json_serializer.dart';
+import 'package:compiler/src/serialization/resolved_ast_serialization.dart';
import 'package:compiler/src/serialization/serialization.dart';
+import 'package:compiler/src/serialization/modelz.dart';
import 'package:compiler/src/serialization/task.dart';
+import 'package:compiler/src/tokens/token.dart';
+import 'package:compiler/src/script.dart';
import 'package:compiler/src/universe/world_impact.dart';
import 'memory_compiler.dart';
-Future<String> serializeDartCore() async {
+Future<String> serializeDartCore({bool serializeResolvedAst: false}) async {
Compiler compiler = compilerFor(
options: [Flags.analyzeAll]);
compiler.serialization.supportSerialization = true;
await compiler.run(Uris.dart_core);
- return serialize(compiler, compiler.libraryLoader.libraries)
- .toText(const JsonSerializationEncoder());
+ return serialize(
+ compiler,
+ compiler.libraryLoader.libraries,
+ serializeResolvedAst: serializeResolvedAst)
+ .toText(const JsonSerializationEncoder());
}
-Serializer serialize(Compiler compiler, Iterable<LibraryElement> libraries) {
+Serializer serialize(
+ Compiler compiler,
+ Iterable<LibraryElement> libraries,
+ {bool serializeResolvedAst: false}) {
assert(compiler.serialization.supportSerialization);
Serializer serializer = new Serializer();
serializer.plugins.add(compiler.backend.serialization.serializer);
serializer.plugins.add(new ResolutionImpactSerializer(compiler.resolution));
+ if (serializeResolvedAst) {
+ serializer.plugins.add(
+ new ResolvedAstSerializerPlugin(compiler.resolution));
+ }
for (LibraryElement library in libraries) {
serializer.serialize(library);
@@ -45,7 +62,9 @@
return serializer;
}
-void deserialize(Compiler compiler, String serializedData) {
+void deserialize(Compiler compiler,
+ String serializedData,
+ {bool deserializeResolvedAst: false}) {
Deserializer deserializer = new Deserializer.fromText(
new DeserializationContext(),
serializedData,
@@ -53,8 +72,10 @@
deserializer.plugins.add(compiler.backend.serialization.deserializer);
compiler.serialization.deserializer =
new _DeserializerSystem(
+ compiler,
deserializer,
- compiler.backend.impactTransformer);
+ compiler.backend.impactTransformer,
+ deserializeResolvedAst: deserializeResolvedAst);
}
@@ -88,24 +109,59 @@
}
class _DeserializerSystem extends DeserializerSystem {
+ final Compiler _compiler;
final Deserializer _deserializer;
final List<LibraryElement> deserializedLibraries = <LibraryElement>[];
final ResolutionImpactDeserializer _resolutionImpactDeserializer =
new ResolutionImpactDeserializer();
+ final ResolvedAstDeserializerPlugin _resolvedAstDeserializer;
final ImpactTransformer _impactTransformer;
+ final bool _deserializeResolvedAst;
- _DeserializerSystem(this._deserializer, this._impactTransformer) {
+ _DeserializerSystem(
+ Compiler compiler,
+ this._deserializer,
+ this._impactTransformer,
+ {bool deserializeResolvedAst: false})
+ : this._compiler = compiler,
+ this._deserializeResolvedAst = deserializeResolvedAst,
+ this._resolvedAstDeserializer = deserializeResolvedAst
+ ? new ResolvedAstDeserializerPlugin(compiler.parsing) : null {
_deserializer.plugins.add(_resolutionImpactDeserializer);
+ if (_deserializeResolvedAst) {
+ _deserializer.plugins.add(_resolvedAstDeserializer);
+ }
}
- LibraryElement readLibrary(Uri resolvedUri) {
+ @override
+ Future<LibraryElement> readLibrary(Uri resolvedUri) {
LibraryElement library = _deserializer.lookupLibrary(resolvedUri);
if (library != null) {
deserializedLibraries.add(library);
+ if (_deserializeResolvedAst) {
+ return Future.forEach(library.compilationUnits,
+ (CompilationUnitElement compilationUnit) {
+ Script script = compilationUnit.script;
+ return _compiler.readScript(script.readableUri)
+ .then((Script newScript) {
+ _resolvedAstDeserializer.sourceFiles[script.resourceUri] =
+ newScript.file;
+ });
+ }).then((_) => library);
+ }
}
- return library;
+ return new Future<LibraryElement>.value(library);
}
+ @override
+ ResolvedAst getResolvedAst(Element element) {
+ if (_resolvedAstDeserializer != null) {
+ return _resolvedAstDeserializer.getResolvedAst(element);
+ }
+ return null;
+ }
+
+ @override
ResolutionImpact getResolutionImpact(Element element) {
return _resolutionImpactDeserializer.impactMap[element];
}
@@ -126,3 +182,66 @@
return deserializedLibraries.contains(element.library);
}
}
+
+const String RESOLVED_AST_TAG = 'resolvedAst';
+
+class ResolvedAstSerializerPlugin extends SerializerPlugin {
+ final Resolution resolution;
+
+ ResolvedAstSerializerPlugin(this.resolution);
+
+ @override
+ void onElement(Element element, ObjectEncoder createEncoder(String tag)) {
+ if (element is MemberElement && resolution.hasResolvedAst(element)) {
+ ResolvedAst resolvedAst = resolution.getResolvedAst(element);
+ ObjectEncoder objectEncoder = createEncoder(RESOLVED_AST_TAG);
+ new ResolvedAstSerializer(objectEncoder, resolvedAst).serialize();
+ }
+ }
+}
+
+class ResolvedAstDeserializerPlugin extends DeserializerPlugin {
+ final Parsing parsing;
+ final Map<Uri, SourceFile> sourceFiles = <Uri, SourceFile>{};
+
+ Map<Element, ResolvedAst> _resolvedAstMap = <Element, ResolvedAst>{};
+ Map<Element, ObjectDecoder> _decoderMap = <Element, ObjectDecoder>{};
+ Map<Uri, Token> beginTokenMap = <Uri, Token>{};
+
+ ResolvedAstDeserializerPlugin(this.parsing);
+
+ ResolvedAst getResolvedAst(Element element) {
+ ResolvedAst resolvedAst = _resolvedAstMap[element];
+ if (resolvedAst == null) {
+ ObjectDecoder decoder = _decoderMap[element];
+ if (decoder != null) {
+ resolvedAst = _resolvedAstMap[element] =
+ ResolvedAstDeserializer.deserialize(
+ element, decoder, parsing, findToken);
+ _decoderMap.remove(element);
+ }
+ }
+ return resolvedAst;
+ }
+
+ Token findToken(Uri uri, int offset) {
+ Token beginToken = beginTokenMap.putIfAbsent(uri, () {
+ SourceFile sourceFile = sourceFiles[uri];
+ if (sourceFile == null) {
+ throw 'No source file found for $uri in:\n '
+ '${sourceFiles.keys.join('\n ')}';
+ }
+ return new Scanner(sourceFile).tokenize();
+ });
+ return ResolvedAstDeserializer.findTokenInStream(beginToken, offset);
+ }
+
+ @override
+ void onElement(Element element, ObjectDecoder getDecoder(String tag)) {
+ ObjectDecoder decoder = getDecoder(RESOLVED_AST_TAG);
+ if (decoder != null) {
+ _decoderMap[element] = decoder;
+ }
+ }
+}
+
diff --git a/tests/compiler/dart2js/serialization_impact_test.dart b/tests/compiler/dart2js/serialization_impact_test.dart
index 2fbd212..05d91d6 100644
--- a/tests/compiler/dart2js/serialization_impact_test.dart
+++ b/tests/compiler/dart2js/serialization_impact_test.dart
@@ -14,7 +14,7 @@
import 'package:compiler/src/serialization/equivalence.dart';
import 'memory_compiler.dart';
import 'serialization_helper.dart';
-import 'serialization_test.dart';
+import 'serialization_test_helper.dart';
main(List<String> arguments) {
asyncTest(() async {
@@ -47,65 +47,5 @@
deserialize(compilerDeserialized, serializedData);
await compilerDeserialized.run(entryPoint);
- checkResolutionImpacts(compilerNormal, compilerDeserialized, verbose: true);
+ checkAllImpacts(compilerNormal, compilerDeserialized, verbose: true);
}
-
-/// Check equivalence of [impact1] and [impact2].
-void checkImpacts(Element element1, Element element2,
- ResolutionImpact impact1, ResolutionImpact impact2,
- {bool verbose: false}) {
- if (impact1 == null || impact2 == null) return;
-
- if (verbose) {
- print('Checking impacts for $element1 vs $element2');
- }
-
- testResolutionImpactEquivalence(impact1, impact2, const CheckStrategy());
-}
-
-
-/// Check equivalence between all resolution impacts common to [compiler1] and
-/// [compiler2].
-void checkResolutionImpacts(
- Compiler compiler1,
- Compiler compiler2,
- {bool verbose: false}) {
-
- void checkMembers(Element member1, Element member2) {
- if (member1.isClass && member2.isClass) {
- ClassElement class1 = member1;
- ClassElement class2 = member2;
- class1.forEachLocalMember((m1) {
- checkMembers(m1, class2.lookupLocalMember(m1.name));
- });
- return;
- }
-
- if (!compiler1.resolution.hasResolutionImpact(member1)) {
- return;
- }
-
- if (member2 == null) {
- return;
- }
-
- if (areElementsEquivalent(member1, member2)) {
- checkImpacts(
- member1, member2,
- compiler1.resolution.getResolutionImpact(member1),
- compiler2.serialization.deserializer.getResolutionImpact(member2),
- verbose: verbose);
- }
- }
-
- for (LibraryElement library1 in compiler1.libraryLoader.libraries) {
- LibraryElement library2 =
- compiler2.libraryLoader.lookupLibrary(library1.canonicalUri);
- if (library2 != null) {
- library1.forEachLocalMember((Element member1) {
- checkMembers(member1, library2.localLookup(member1.name));
- });
-
- }
- }
-}
\ No newline at end of file
diff --git a/tests/compiler/dart2js/serialization_model_test.dart b/tests/compiler/dart2js/serialization_model_test.dart
index b8cef25..0e5363f 100644
--- a/tests/compiler/dart2js/serialization_model_test.dart
+++ b/tests/compiler/dart2js/serialization_model_test.dart
@@ -27,9 +27,8 @@
import 'package:compiler/src/universe/use.dart';
import 'memory_compiler.dart';
import 'serialization_helper.dart';
-import 'serialization_analysis_test.dart';
-import 'serialization_impact_test.dart';
-import 'serialization_test.dart';
+import 'serialization_test_data.dart';
+import 'serialization_test_helper.dart';
main(List<String> arguments) {
String filename;
@@ -109,7 +108,7 @@
await compilerDeserialized.run(entryPoint);
compilerDeserialized.world.populate();
- checkResolutionImpacts(
+ checkAllImpacts(
compilerNormal, compilerDeserialized,
verbose: verbose);
diff --git a/tests/compiler/dart2js/serialization_resolved_ast_test.dart b/tests/compiler/dart2js/serialization_resolved_ast_test.dart
new file mode 100644
index 0000000..af5d8a3
--- /dev/null
+++ b/tests/compiler/dart2js/serialization_resolved_ast_test.dart
@@ -0,0 +1,92 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization_resolved_ast_test;
+
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/common/backend_api.dart';
+import 'package:compiler/src/common/names.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/filenames.dart';
+import 'package:compiler/src/serialization/equivalence.dart';
+import 'memory_compiler.dart';
+import 'serialization_helper.dart';
+import 'serialization_test_data.dart';
+import 'serialization_test_helper.dart';
+
+
+main(List<String> arguments) {
+ asyncTest(() async {
+ String serializedData = await serializeDartCore(serializeResolvedAst: true);
+ if (arguments.isNotEmpty) {
+ Uri entryPoint = Uri.base.resolve(nativeToUriPath(arguments.last));
+ await check(serializedData, entryPoint);
+ } else {
+ Uri entryPoint = Uri.parse('memory:main.dart');
+ // TODO(johnniwinther): Change to test all serialized resolved ast instead
+ // only those used in the test.
+ Test test = TESTS.last;
+ await check(serializedData, entryPoint, test.sourceFiles);
+ }
+ });
+}
+
+Future check(
+ String serializedData,
+ Uri entryPoint,
+ [Map<String, String> sourceFiles = const <String, String>{}]) async {
+
+ Compiler compilerNormal = compilerFor(
+ memorySourceFiles: sourceFiles,
+ options: [Flags.analyzeOnly]);
+ compilerNormal.resolution.retainCachesForTesting = true;
+ await compilerNormal.run(entryPoint);
+
+ Compiler compilerDeserialized = compilerFor(
+ memorySourceFiles: sourceFiles,
+ options: [Flags.analyzeOnly]);
+ compilerDeserialized.resolution.retainCachesForTesting = true;
+ deserialize(
+ compilerDeserialized, serializedData, deserializeResolvedAst: true);
+ await compilerDeserialized.run(entryPoint);
+
+ checkAllResolvedAsts(compilerNormal, compilerDeserialized, verbose: true);
+}
+
+void checkAllResolvedAsts(
+ Compiler compiler1,
+ Compiler compiler2,
+ {bool verbose: false}) {
+ checkLoadedLibraryMembers(
+ compiler1,
+ compiler2,
+ (Element member1) {
+ return compiler1.resolution.hasResolvedAst(member1);
+ },
+ checkResolvedAsts,
+ verbose: true);
+}
+
+
+/// Check equivalence of [impact1] and [impact2].
+void checkResolvedAsts(Compiler compiler1, Element member1,
+ Compiler compiler2, Element member2,
+ {bool verbose: false}) {
+ ResolvedAst resolvedAst1 = compiler1.resolution.getResolvedAst(member1);
+ ResolvedAst resolvedAst2 =
+ compiler2.serialization.deserializer.getResolvedAst(member2);
+
+ if (resolvedAst1 == null || resolvedAst2 == null) return;
+
+ if (verbose) {
+ print('Checking resolved asts for $member1 vs $member2');
+ }
+
+ testResolvedAstEquivalence(
+ resolvedAst1, resolvedAst2, const CheckStrategy());
+}
diff --git a/tests/compiler/dart2js/serialization_test.dart b/tests/compiler/dart2js/serialization_test.dart
index c19fb61..fd6ae58 100644
--- a/tests/compiler/dart2js/serialization_test.dart
+++ b/tests/compiler/dart2js/serialization_test.dart
@@ -20,6 +20,7 @@
import 'package:compiler/src/serialization/equivalence.dart';
import 'package:compiler/src/serialization/json_serializer.dart';
import 'package:compiler/src/serialization/serialization.dart';
+import 'serialization_test_helper.dart';
main(List<String> arguments) {
// Ensure that we can print out constant expressions.
@@ -132,262 +133,6 @@
const ElementPropertyEquivalence().visit(element1, element2);
}
-/// Check the equivalence of the two lists of elements, [list1] and [list2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-checkElementLists(Object object1, Object object2, String property,
- Iterable<Element> list1, Iterable<Element> list2) {
- checkListEquivalence(object1, object2, property,
- list1, list2, checkElementProperties);
-}
-
-/// Check equivalence of the two lists, [list1] and [list2], using
-/// [checkEquivalence] to check the pair-wise equivalence.
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkListEquivalence(
- Object object1, Object object2, String property,
- Iterable list1, Iterable list2,
- void checkEquivalence(o1, o2, property, a, b)) {
- for (int i = 0; i < list1.length && i < list2.length; i++) {
- checkEquivalence(
- object1, object2, property,
- list1.elementAt(i), list2.elementAt(i));
- }
- for (int i = list1.length; i < list2.length; i++) {
- throw
- 'Missing equivalent for element '
- '#$i ${list2.elementAt(i)} in `${property}` on $object2.\n'
- '`${property}` on $object1:\n ${list1.join('\n ')}\n'
- '`${property}` on $object2:\n ${list2.join('\n ')}';
- }
- for (int i = list2.length; i < list1.length; i++) {
- throw
- 'Missing equivalent for element '
- '#$i ${list1.elementAt(i)} in `${property}` on $object1.\n'
- '`${property}` on $object1:\n ${list1.join('\n ')}\n'
- '`${property}` on $object2:\n ${list2.join('\n ')}';
- }
- return true;
-}
-
-/// Computes the set difference between [set1] and [set2] using
-/// [elementEquivalence] to determine element equivalence.
-///
-/// Elements both in [set1] and [set2] are added to [common], elements in [set1]
-/// but not in [set2] are added to [unfound], and the set of elements in [set2]
-/// but not in [set1] are returned.
-Set computeSetDifference(
- Iterable set1,
- Iterable set2,
- List common,
- List unfound,
- [bool sameElement(a, b) = equality]) {
- // TODO(johnniwinther): Avoid the quadratic cost here. Some ideas:
- // - convert each set to a list and sort it first, then compare by walking
- // both lists in parallel
- // - map each element to a canonical object, create a map containing those
- // mappings, use the mapped sets to compare (then operations like
- // set.difference would work)
- Set remaining = set2.toSet();
- for (var element1 in set1) {
- bool found = false;
- for (var element2 in remaining) {
- if (sameElement(element1, element2)) {
- found = true;
- remaining.remove(element2);
- break;
- }
- }
- if (found) {
- common.add(element1);
- } else {
- unfound.add(element1);
- }
- }
- return remaining;
-}
-
-/// Check equivalence of the two iterables, [set1] and [set1], as sets using
-/// [elementEquivalence] to compute the pair-wise equivalence.
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkSetEquivalence(
- var object1,
- var object2,
- String property,
- Iterable set1,
- Iterable set2,
- bool sameElement(a, b)) {
- List common = [];
- List unfound = [];
- Set remaining =
- computeSetDifference(set1, set2, common, unfound, sameElement);
- if (unfound.isNotEmpty || remaining.isNotEmpty) {
- String message =
- "Set mismatch for `$property` on $object1 vs $object2: \n"
- "Common:\n ${common.join('\n ')}\n"
- "Unfound:\n ${unfound.join('\n ')}\n"
- "Extra: \n ${remaining.join('\n ')}";
- throw message;
- }
- return true;
-}
-
-/// Checks the equivalence of the identity (but not properties) of [element1]
-/// and [element2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkElementIdentities(
- Object object1, Object object2, String property,
- Element element1, Element element2) {
- if (identical(element1, element2)) return true;
- if (element1 == null || element2 == null) {
- return check(object1, object2, property, element1, element2);
- } else {
- return const ElementIdentityEquivalence(const CheckStrategy())
- .visit(element1, element2);
- }
-}
-
-/// Checks the pair-wise equivalence of the identity (but not properties) of the
-/// elements in [list] and [list2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkElementListIdentities(
- Object object1, Object object2, String property,
- Iterable<Element> list1, Iterable<Element> list2) {
- return checkListEquivalence(
- object1, object2, property,
- list1, list2, checkElementIdentities);
-}
-
-/// Checks the equivalence of [type1] and [type2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkTypes(
- Object object1, Object object2, String property,
- DartType type1, DartType type2) {
- if (identical(type1, type2)) return true;
- if (type1 == null || type2 == null) {
- return check(object1, object2, property, type1, type2);
- } else {
- return const TypeEquivalence(const CheckStrategy()).visit(type1, type2);
- }
-}
-
-/// Checks the pair-wise equivalence of the types in [list1] and [list2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkTypeLists(
- Object object1, Object object2, String property,
- List<DartType> list1, List<DartType> list2) {
- return checkListEquivalence(
- object1, object2, property, list1, list2, checkTypes);
-}
-
-/// Checks the equivalence of [exp1] and [exp2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkConstants(
- Object object1, Object object2, String property,
- ConstantExpression exp1, ConstantExpression exp2) {
- if (identical(exp1, exp2)) return true;
- if (exp1 == null || exp2 == null) {
- return check(object1, object2, property, exp1, exp2);
- } else {
- return const ConstantEquivalence(const CheckStrategy()).visit(exp1, exp2);
- }
-}
-
-/// Checks the pair-wise equivalence of the contants in [list1] and [list2].
-///
-/// Uses [object1], [object2] and [property] to provide context for failures.
-bool checkConstantLists(
- Object object1, Object object2, String property,
- List<ConstantExpression> list1,
- List<ConstantExpression> list2) {
- return checkListEquivalence(
- object1, object2, property,
- list1, list2, checkConstants);
-}
-
-
-/// Strategy for checking equivalence.
-///
-/// Use this strategy to fail early with contextual information in the event of
-/// inequivalence.
-class CheckStrategy implements TestStrategy {
- const CheckStrategy();
-
- @override
- bool test(var object1, var object2, String property, var value1, var value2) {
- return check(object1, object2, property, value1, value2);
- }
-
- @override
- bool testLists(
- Object object1, Object object2, String property,
- List list1, List list2,
- [bool elementEquivalence(a, b) = equality]) {
- return checkListEquivalence(
- object1, object2, property, list1, list2,
- (o1, o2, p, v1, v2) {
- if (!elementEquivalence(v1, v2)) {
- throw "$o1.$p = '${v1}' <> "
- "$o2.$p = '${v2}'";
- }
- return true;
- });
- }
-
- @override
- bool testSets(
- var object1, var object2, String property,
- Iterable set1, Iterable set2,
- [bool elementEquivalence(a, b) = equality]) {
- return checkSetEquivalence(
- object1, object2,property, set1, set2, elementEquivalence);
- }
-
- @override
- bool testElements(
- Object object1, Object object2, String property,
- Element element1, Element element2) {
- return checkElementIdentities(
- object1, object2, property, element1, element2);
- }
-
- @override
- bool testTypes(
- Object object1, Object object2, String property,
- DartType type1, DartType type2) {
- return checkTypes(object1, object2, property, type1, type2);
- }
-
- @override
- bool testConstants(
- Object object1, Object object2, String property,
- ConstantExpression exp1, ConstantExpression exp2) {
- return checkConstants(object1, object2, property, exp1, exp2);
- }
-
- @override
- bool testTypeLists(
- Object object1, Object object2, String property,
- List<DartType> list1, List<DartType> list2) {
- return checkTypeLists(object1, object2, property, list1, list2);
- }
-
- @override
- bool testConstantLists(
- Object object1, Object object2, String property,
- List<ConstantExpression> list1,
- List<ConstantExpression> list2) {
- return checkConstantLists(object1, object2, property, list1, list2);
- }
-}
-
/// Checks the equivalence of [constructor1] and [constructor2].
void constantConstructorEquivalence(ConstantConstructor constructor1,
ConstantConstructor constructor2) {
@@ -477,14 +222,13 @@
}
}
-/// Check that the values [property] of [object1] and [object2], [value1] and
-/// [value2] respectively, are equal and throw otherwise.
-bool check(var object1, var object2, String property, var value1, value2) {
- if (value1 != value2) {
- throw "$object1.$property = '${value1}' <> "
- "$object2.$property = '${value2}'";
- }
- return true;
+/// Check the equivalence of the two lists of elements, [list1] and [list2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+checkElementLists(Object object1, Object object2, String property,
+ Iterable<Element> list1, Iterable<Element> list2) {
+ checkListEquivalence(object1, object2, property,
+ list1, list2, checkElementProperties);
}
/// Visitor that checks for equivalence of [Element] properties.
diff --git a/tests/compiler/dart2js/serialization_test_data.dart b/tests/compiler/dart2js/serialization_test_data.dart
new file mode 100644
index 0000000..67d400c
--- /dev/null
+++ b/tests/compiler/dart2js/serialization_test_data.dart
@@ -0,0 +1,205 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization_test_data;
+
+const List<Test> TESTS = const <Test>[
+ const Test(const {
+ 'main.dart': 'main() {}'
+ }),
+
+ const Test(const {
+ 'main.dart': 'main() => print("Hello World");'
+ }),
+
+ const Test(const {
+ 'main.dart': 'main() => print("Hello World", 0);'
+ },
+ expectedWarningCount: 1,
+ expectedInfoCount: 1),
+
+ const Test(const {
+ 'main.dart': r'''
+main() {
+ String text = "Hello World";
+ print('$text');
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+main() {
+ String text = "Hello World";
+ print('$text', text);
+}'''
+ },
+ expectedWarningCount: 1,
+ expectedInfoCount: 1),
+
+ const Test(const {
+ 'main.dart': r'''
+main(List<String> arguments) {
+ print(arguments);
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+main(List<String> arguments) {
+ for (int i = 0; i < arguments.length; i++) {
+ print(arguments[i]);
+ }
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+main(List<String> arguments) {
+ for (String argument in arguments) {
+ print(argument);
+ }
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class {}
+main() {
+ print(new Class());
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class implements Function {}
+main() {
+ print(new Class());
+}'''
+ },
+ expectedWarningCount: 1),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class implements Function {
+ call() {}
+}
+main() {
+ print(new Class()());
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class implements Comparable<Class> {
+ int compareTo(Class other) => 0;
+}
+main() {
+ print(new Class());
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class implements Comparable<Class, Class> {
+ int compareTo(other) => 0;
+}
+main() {
+ print(new Class());
+}'''
+ },
+ expectedWarningCount: 1),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class implements Comparable<Class> {
+ int compareTo(String other) => 0;
+}
+main() {
+ print(new Class().compareTo(null));
+}'''
+ },
+ expectedWarningCount: 1,
+ expectedInfoCount: 1),
+
+ const Test(const {
+ 'main.dart': r'''
+class Class implements Comparable {
+ bool compareTo(a, b) => true;
+}
+main() {
+ print(new Class().compareTo(null, null));
+}'''
+ },
+ expectedWarningCount: 1,
+ expectedInfoCount: 1),
+
+ const Test(const {
+ 'main.dart': r'''
+import 'dart:math';
+
+class MyRandom implements Random {
+ int nextInt(int max) {
+ return max.length;
+ }
+ bool nextBool() => true;
+ double nextDouble() => 0.0;
+}
+main() {
+ new MyRandom().nextInt(0);
+}'''
+ },
+ expectedWarningCount: 1,
+ expectedInfoCount: 0),
+
+ const Test(const {
+ 'main.dart': r'''
+import 'dart:math';
+
+class MyRandom implements Random {
+ int nextInt(int max) {
+ return max.length;
+ }
+ bool nextBool() => true;
+ double nextDouble() => 0.0;
+}
+main() {
+ new MyRandom();
+}'''
+ }),
+
+ const Test(const {
+ 'main.dart': r'''
+import 'dart:math';
+
+class MyRandom implements Random {
+ int nextInt(int max) {
+ return max.length;
+ }
+ bool nextBool() => true;
+ double nextDouble() => 0.0;
+}
+main() {
+ // Invocation of `MyRandom.nextInt` is only detected knowing the actual
+ // implementation class for `List` and the world impact of its `shuffle`
+ // method.
+ [].shuffle(new MyRandom());
+}'''
+ },
+ expectedWarningCount: 1,
+ expectedInfoCount: 0),
+];
+
+class Test {
+ final Map sourceFiles;
+ final int expectedErrorCount;
+ final int expectedWarningCount;
+ final int expectedHintCount;
+ final int expectedInfoCount;
+
+ const Test(this.sourceFiles, {
+ this.expectedErrorCount: 0,
+ this.expectedWarningCount: 0,
+ this.expectedHintCount: 0,
+ this.expectedInfoCount: 0});
+}
diff --git a/tests/compiler/dart2js/serialization_test_helper.dart b/tests/compiler/dart2js/serialization_test_helper.dart
new file mode 100644
index 0000000..97d5134
--- /dev/null
+++ b/tests/compiler/dart2js/serialization_test_helper.dart
@@ -0,0 +1,365 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js.serialization_test_helper;
+
+import 'dart:io';
+import 'memory_compiler.dart';
+import 'package:async_helper/async_helper.dart';
+import 'package:compiler/src/common/resolution.dart';
+import 'package:compiler/src/commandline_options.dart';
+import 'package:compiler/src/constants/constructors.dart';
+import 'package:compiler/src/constants/expressions.dart';
+import 'package:compiler/src/dart_types.dart';
+import 'package:compiler/src/compiler.dart';
+import 'package:compiler/src/diagnostics/invariant.dart';
+import 'package:compiler/src/elements/elements.dart';
+import 'package:compiler/src/elements/visitor.dart';
+import 'package:compiler/src/ordered_typeset.dart';
+import 'package:compiler/src/serialization/element_serialization.dart';
+import 'package:compiler/src/serialization/equivalence.dart';
+import 'package:compiler/src/serialization/json_serializer.dart';
+import 'package:compiler/src/serialization/serialization.dart';
+
+
+/// Strategy for checking equivalence.
+///
+/// Use this strategy to fail early with contextual information in the event of
+/// inequivalence.
+class CheckStrategy implements TestStrategy {
+ const CheckStrategy();
+
+ @override
+ bool test(var object1, var object2, String property, var value1, var value2,
+ [bool equivalence(a, b) = equality]) {
+ return check(object1, object2, property, value1, value2, equivalence);
+ }
+
+ @override
+ bool testLists(
+ Object object1, Object object2, String property,
+ List list1, List list2,
+ [bool elementEquivalence(a, b) = equality]) {
+ return checkListEquivalence(
+ object1, object2, property, list1, list2,
+ (o1, o2, p, v1, v2) {
+ if (!elementEquivalence(v1, v2)) {
+ throw "$o1.$p = '${v1}' <> "
+ "$o2.$p = '${v2}'";
+ }
+ return true;
+ });
+ }
+
+ @override
+ bool testSets(
+ var object1, var object2, String property,
+ Iterable set1, Iterable set2,
+ [bool elementEquivalence(a, b) = equality]) {
+ return checkSetEquivalence(
+ object1, object2,property, set1, set2, elementEquivalence);
+ }
+
+ @override
+ bool testElements(
+ Object object1, Object object2, String property,
+ Element element1, Element element2) {
+ return checkElementIdentities(
+ object1, object2, property, element1, element2);
+ }
+
+ @override
+ bool testTypes(
+ Object object1, Object object2, String property,
+ DartType type1, DartType type2) {
+ return checkTypes(object1, object2, property, type1, type2);
+ }
+
+ @override
+ bool testConstants(
+ Object object1, Object object2, String property,
+ ConstantExpression exp1, ConstantExpression exp2) {
+ return checkConstants(object1, object2, property, exp1, exp2);
+ }
+
+ @override
+ bool testTypeLists(
+ Object object1, Object object2, String property,
+ List<DartType> list1, List<DartType> list2) {
+ return checkTypeLists(object1, object2, property, list1, list2);
+ }
+
+ @override
+ bool testConstantLists(
+ Object object1, Object object2, String property,
+ List<ConstantExpression> list1,
+ List<ConstantExpression> list2) {
+ return checkConstantLists(object1, object2, property, list1, list2);
+ }
+}
+
+/// Check that the values [property] of [object1] and [object2], [value1] and
+/// [value2] respectively, are equal and throw otherwise.
+bool check(var object1, var object2, String property, var value1, var value2,
+ [bool equivalence(a, b) = equality]) {
+ if (!equivalence(value1, value2)) {
+ throw "property='$property' "
+ "object1=$object1 (${object1.runtimeType}), value='${value1}' <> "
+ "object2=$object2 (${object2.runtimeType}), value='${value2}'";
+ }
+ return true;
+}
+
+/// Check equivalence of the two lists, [list1] and [list2], using
+/// [checkEquivalence] to check the pair-wise equivalence.
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkListEquivalence(
+ Object object1, Object object2, String property,
+ Iterable list1, Iterable list2,
+ void checkEquivalence(o1, o2, property, a, b)) {
+ for (int i = 0; i < list1.length && i < list2.length; i++) {
+ checkEquivalence(
+ object1, object2, property,
+ list1.elementAt(i), list2.elementAt(i));
+ }
+ for (int i = list1.length; i < list2.length; i++) {
+ throw
+ 'Missing equivalent for element '
+ '#$i ${list2.elementAt(i)} in `${property}` on $object2.\n'
+ '`${property}` on $object1:\n ${list1.join('\n ')}\n'
+ '`${property}` on $object2:\n ${list2.join('\n ')}';
+ }
+ for (int i = list2.length; i < list1.length; i++) {
+ throw
+ 'Missing equivalent for element '
+ '#$i ${list1.elementAt(i)} in `${property}` on $object1.\n'
+ '`${property}` on $object1:\n ${list1.join('\n ')}\n'
+ '`${property}` on $object2:\n ${list2.join('\n ')}';
+ }
+ return true;
+}
+
+/// Computes the set difference between [set1] and [set2] using
+/// [elementEquivalence] to determine element equivalence.
+///
+/// Elements both in [set1] and [set2] are added to [common], elements in [set1]
+/// but not in [set2] are added to [unfound], and the set of elements in [set2]
+/// but not in [set1] are returned.
+Set computeSetDifference(
+ Iterable set1,
+ Iterable set2,
+ List common,
+ List unfound,
+ [bool sameElement(a, b) = equality]) {
+ // TODO(johnniwinther): Avoid the quadratic cost here. Some ideas:
+ // - convert each set to a list and sort it first, then compare by walking
+ // both lists in parallel
+ // - map each element to a canonical object, create a map containing those
+ // mappings, use the mapped sets to compare (then operations like
+ // set.difference would work)
+ Set remaining = set2.toSet();
+ for (var element1 in set1) {
+ bool found = false;
+ for (var element2 in remaining) {
+ if (sameElement(element1, element2)) {
+ found = true;
+ remaining.remove(element2);
+ break;
+ }
+ }
+ if (found) {
+ common.add(element1);
+ } else {
+ unfound.add(element1);
+ }
+ }
+ return remaining;
+}
+
+/// Check equivalence of the two iterables, [set1] and [set1], as sets using
+/// [elementEquivalence] to compute the pair-wise equivalence.
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkSetEquivalence(
+ var object1,
+ var object2,
+ String property,
+ Iterable set1,
+ Iterable set2,
+ bool sameElement(a, b)) {
+ List common = [];
+ List unfound = [];
+ Set remaining =
+ computeSetDifference(set1, set2, common, unfound, sameElement);
+ if (unfound.isNotEmpty || remaining.isNotEmpty) {
+ String message =
+ "Set mismatch for `$property` on $object1 vs $object2: \n"
+ "Common:\n ${common.join('\n ')}\n"
+ "Unfound:\n ${unfound.join('\n ')}\n"
+ "Extra: \n ${remaining.join('\n ')}";
+ throw message;
+ }
+ return true;
+}
+
+/// Checks the equivalence of the identity (but not properties) of [element1]
+/// and [element2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkElementIdentities(
+ Object object1, Object object2, String property,
+ Element element1, Element element2) {
+ if (identical(element1, element2)) return true;
+ if (element1 == null || element2 == null) {
+ return check(object1, object2, property, element1, element2);
+ } else {
+ return const ElementIdentityEquivalence(const CheckStrategy())
+ .visit(element1, element2);
+ }
+}
+
+/// Checks the pair-wise equivalence of the identity (but not properties) of the
+/// elements in [list] and [list2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkElementListIdentities(
+ Object object1, Object object2, String property,
+ Iterable<Element> list1, Iterable<Element> list2) {
+ return checkListEquivalence(
+ object1, object2, property,
+ list1, list2, checkElementIdentities);
+}
+
+/// Checks the equivalence of [type1] and [type2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkTypes(
+ Object object1, Object object2, String property,
+ DartType type1, DartType type2) {
+ if (identical(type1, type2)) return true;
+ if (type1 == null || type2 == null) {
+ return check(object1, object2, property, type1, type2);
+ } else {
+ return const TypeEquivalence(const CheckStrategy()).visit(type1, type2);
+ }
+}
+
+/// Checks the pair-wise equivalence of the types in [list1] and [list2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkTypeLists(
+ Object object1, Object object2, String property,
+ List<DartType> list1, List<DartType> list2) {
+ return checkListEquivalence(
+ object1, object2, property, list1, list2, checkTypes);
+}
+
+/// Checks the equivalence of [exp1] and [exp2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkConstants(
+ Object object1, Object object2, String property,
+ ConstantExpression exp1, ConstantExpression exp2) {
+ if (identical(exp1, exp2)) return true;
+ if (exp1 == null || exp2 == null) {
+ return check(object1, object2, property, exp1, exp2);
+ } else {
+ return const ConstantEquivalence(const CheckStrategy()).visit(exp1, exp2);
+ }
+}
+
+/// Checks the pair-wise equivalence of the contants in [list1] and [list2].
+///
+/// Uses [object1], [object2] and [property] to provide context for failures.
+bool checkConstantLists(
+ Object object1, Object object2, String property,
+ List<ConstantExpression> list1,
+ List<ConstantExpression> list2) {
+ return checkListEquivalence(
+ object1, object2, property,
+ list1, list2, checkConstants);
+}
+
+
+/// Check member property equivalence between all members common to [compiler1]
+/// and [compiler2].
+void checkLoadedLibraryMembers(
+ Compiler compiler1,
+ Compiler compiler2,
+ bool hasProperty(Element member1),
+ void checkMemberProperties(Compiler compiler1, Element member1,
+ Compiler compiler2, Element member2,
+ {bool verbose}),
+ {bool verbose: false}) {
+
+ void checkMembers(Element member1, Element member2) {
+ if (member1.isClass && member2.isClass) {
+ ClassElement class1 = member1;
+ ClassElement class2 = member2;
+ class1.forEachLocalMember((m1) {
+ checkMembers(m1, class2.lookupLocalMember(m1.name));
+ });
+ return;
+ }
+
+ if (!hasProperty(member1)) {
+ return;
+ }
+
+ if (member2 == null) {
+ return;
+ }
+
+ if (areElementsEquivalent(member1, member2)) {
+ checkMemberProperties(
+ compiler1, member1,
+ compiler2, member2,
+ verbose: verbose);
+ }
+ }
+
+ for (LibraryElement library1 in compiler1.libraryLoader.libraries) {
+ LibraryElement library2 =
+ compiler2.libraryLoader.lookupLibrary(library1.canonicalUri);
+ if (library2 != null) {
+ library1.forEachLocalMember((Element member1) {
+ checkMembers(member1, library2.localLookup(member1.name));
+ });
+
+ }
+ }
+}
+
+/// Check equivalence of all resolution impacts.
+void checkAllImpacts(
+ Compiler compiler1,
+ Compiler compiler2,
+ {bool verbose: false}) {
+ checkLoadedLibraryMembers(
+ compiler1,
+ compiler2,
+ (Element member1) {
+ return compiler1.resolution.hasResolutionImpact(member1);
+ },
+ checkImpacts,
+ verbose: true);
+}
+
+/// Check equivalence of resolution impact for [member1] and [member2].
+void checkImpacts(Compiler compiler1, Element member1,
+ Compiler compiler2, Element member2,
+ {bool verbose: false}) {
+ ResolutionImpact impact1 = compiler1.resolution.getResolutionImpact(member1);
+ ResolutionImpact impact2 =
+ compiler2.serialization.deserializer.getResolutionImpact(member2);
+
+ if (impact1 == null || impact2 == null) return;
+
+ if (verbose) {
+ print('Checking impacts for $member1 vs $member2');
+ }
+
+ testResolutionImpactEquivalence(impact1, impact2, const CheckStrategy());
+}
diff --git a/tests/html/html.status b/tests/html/html.status
index 6862539..4beb9f4 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -25,6 +25,8 @@
input_element_test/attributes: Fail # Issue 21555
wrapping_collections_test: SkipByDesign # Testing an issue that is only relevant to Dartium
js_typed_interop_default_arg_test/default_value: MissingCompileTimeError # Issue #25759
+mirrors_js_typed_interop_test: Pass, Slow
+
[ $compiler == dart2js && $checked ]
js_function_getter_trust_types_test: Skip # --trust-type-annotations incompatible with --checked
diff --git a/tests/html/js_typed_interop_anonymous2_exp_test.dart b/tests/html/js_typed_interop_anonymous2_exp_test.dart
index baebd03..d1db741 100644
--- a/tests/html/js_typed_interop_anonymous2_exp_test.dart
+++ b/tests/html/js_typed_interop_anonymous2_exp_test.dart
@@ -6,6 +6,7 @@
// Same test as js_typed_interop_anonymous2, but using the
// --experimental-trust-js-interop-type-annotations flag.
+@JS()
library js_typed_interop_anonymous2_exp_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_anonymous2_test.dart b/tests/html/js_typed_interop_anonymous2_test.dart
index ed0e732..449269e 100644
--- a/tests/html/js_typed_interop_anonymous2_test.dart
+++ b/tests/html/js_typed_interop_anonymous2_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+@JS()
library js_typed_interop_anonymous2_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_anonymous_exp_test.dart b/tests/html/js_typed_interop_anonymous_exp_test.dart
index 40a04aa..8fdd50f 100644
--- a/tests/html/js_typed_interop_anonymous_exp_test.dart
+++ b/tests/html/js_typed_interop_anonymous_exp_test.dart
@@ -6,6 +6,7 @@
// Same test as js_typed_interop_anonymous, but using the
// --experimental-trust-js-interop-type-annotations flag.
+@JS()
library js_typed_interop_anonymous_exp_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_anonymous_test.dart b/tests/html/js_typed_interop_anonymous_test.dart
index b2d1593..c4836c8 100644
--- a/tests/html/js_typed_interop_anonymous_test.dart
+++ b/tests/html/js_typed_interop_anonymous_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+@JS()
library js_typed_interop_anonymous_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_anonymous_unreachable_exp_test.dart b/tests/html/js_typed_interop_anonymous_unreachable_exp_test.dart
index a4e2c96..7754012 100644
--- a/tests/html/js_typed_interop_anonymous_unreachable_exp_test.dart
+++ b/tests/html/js_typed_interop_anonymous_unreachable_exp_test.dart
@@ -6,6 +6,7 @@
// Same test as js_typed_interop_anonymous_unreachable, but using the
// --experimental-trust-js-interop-type-annotations flag.
+@JS()
library js_typed_interop_anonymous_unreachable_exp_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_anonymous_unreachable_test.dart b/tests/html/js_typed_interop_anonymous_unreachable_test.dart
index ba8758e..bbd97f0 100644
--- a/tests/html/js_typed_interop_anonymous_unreachable_test.dart
+++ b/tests/html/js_typed_interop_anonymous_unreachable_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+@JS()
library js_typed_interop_anonymous_unreachable_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_side_cast_exp_test.dart b/tests/html/js_typed_interop_side_cast_exp_test.dart
index 6fd929a..8b67c7b 100644
--- a/tests/html/js_typed_interop_side_cast_exp_test.dart
+++ b/tests/html/js_typed_interop_side_cast_exp_test.dart
@@ -7,6 +7,7 @@
// Similar test to js_typed_interop_side_cast, but because we are using the
// --experimental-trust-js-interop-type-annotations flag, we test a slighly
// different behavior.
+@JS()
library js_typed_interop_side_cast_exp_test;
import 'dart:html';
diff --git a/tests/html/js_typed_interop_side_cast_test.dart b/tests/html/js_typed_interop_side_cast_test.dart
index d50e1ac..cf5ee5a 100644
--- a/tests/html/js_typed_interop_side_cast_test.dart
+++ b/tests/html/js_typed_interop_side_cast_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+@JS()
library js_typed_interop_anonymous2_test;
import 'dart:html';
diff --git a/tests/html/mirrors_js_typed_interop_test.dart b/tests/html/mirrors_js_typed_interop_test.dart
index a34bf1b..f4b30a6 100644
--- a/tests/html/mirrors_js_typed_interop_test.dart
+++ b/tests/html/mirrors_js_typed_interop_test.dart
@@ -2,6 +2,7 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+@JS()
library tests.html.mirrors_js_typed_interop_test;
import 'dart:mirrors';
diff --git a/tests/language/async_await_test.dart b/tests/language/async_await_test.dart
index 8844777..62ebe28 100644
--- a/tests/language/async_await_test.dart
+++ b/tests/language/async_await_test.dart
@@ -4,6 +4,8 @@
library async_await_test;
+// Use of package:unittest and package:test is deprecated in sdk/tests.
+// Do not add any more uses of this package.
import "package:unittest/unittest.dart";
import "dart:async";
@@ -1728,37 +1730,37 @@
if (!checkedMode) return;
- test("inside assert, true", () { /// 03: ok
- f() async { /// 03: continued
- assert(await new Future.microtask(() => true)); /// 03: continued
- return 42; /// 03: continued
- } /// 03: continued
- return expect42(f()); /// 03: continued
- }); /// 03: continued
+ test("inside assert, true", () {
+ f() async {
+ assert(await new Future.microtask(() => true));
+ return 42;
+ }
+ return expect42(f());
+ });
- test("inside assert, false", () { /// 03: continued
- f() async { /// 03: continued
- assert(await new Future.microtask(() => false)); /// 03: continued
- return 42; /// 03: continued
- } /// 03: continued
- return f().then((_) { /// 03: continued
- fail("assert didn't throw"); /// 03: continued
- }, onError: (e, s) { /// 03: continued
- expect(e is AssertionError, isTrue); /// 03: continued
- }); /// 03: continued
- }); /// 03: continued
+ test("inside assert, false", () {
+ f() async {
+ assert(await new Future.microtask(() => false));
+ return 42;
+ }
+ return f().then((_) {
+ fail("assert didn't throw");
+ }, onError: (e, s) {
+ expect(e is AssertionError, isTrue);
+ });
+ });
- test("inside assert, function -> false", () { /// 03: continued
- f() async { /// 03: continued
- assert(await new Future.microtask(() => false)); /// 03: continued
- return 42; /// 03: continued
- } /// 03: continued
- return f().then((_) { /// 03: continued
- fail("assert didn't throw"); /// 03: continued
- }, onError: (e, s) { /// 03: continued
- expect(e is AssertionError, isTrue); /// 03: continued
- }); /// 03: continued
- }); /// 03: continued
+ test("inside assert, function -> false", () {
+ f() async {
+ assert(await new Future.microtask(() => false));
+ return 42;
+ }
+ return f().then((_) {
+ fail("assert didn't throw");
+ }, onError: (e, s) {
+ expect(e is AssertionError, isTrue);
+ });
+ });
});
@@ -1769,11 +1771,11 @@
expect(async, equals(42));
});
- test("await as variable", () { /// 02: ok
- // Valid identifiers outside of async function. /// 02: continued
- var await = 42; /// 02: continued
- expect(await, equals(42)); /// 02: continued
- }); /// 02: continued
+ test("await as variable", () {
+ // Valid identifiers outside of async function.
+ var await = 42;
+ expect(await, equals(42));
+ });
test("yield as variable", () {
// Valid identifiers outside of async function.
diff --git a/tests/language/async_star_await_pauses_test.dart b/tests/language/async_star_await_pauses_test.dart
deleted file mode 100644
index c16fbdd..0000000
--- a/tests/language/async_star_await_pauses_test.dart
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
-
-main() {
- var sc;
- var i = 0;
- void send() {
- if (i == 5) {
- sc.close();
- } else {
- sc.add(i++);
- }
- }
- sc = new StreamController(onListen: send, onResume: send);
-
- f(s) async {
- var r = 0;
- await for (var i in s) {
- r += await new Future.delayed(new Duration(milliseconds: 10), () => i);
- }
- return r;
- }
-
- asyncStart();
- f(sc.stream).then((v) {
- Expect.equals(10, v);
- asyncEnd();
- });
-}
diff --git a/tests/language/language.status b/tests/language/language.status
index 766408b..044e7a5 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -43,7 +43,6 @@
async_star_regression_2238_test: CompileTimeError, RuntimeError # drt only runtime-errs.
async_star_cancel_while_paused_test: RuntimeError
-async_star_await_pauses_test: Skip # Times out. Issue 23996
# Experimental feature: Syntactic support for generic methods.
generic_methods_test: CompiletimeError # Issue 25869
@@ -95,7 +94,10 @@
generic_sends_test: RuntimeError # Issue 25869
[ $compiler == none && $runtime == dartium && $system == linux && $arch != x64 ]
-issue_22780_test/01 : Pass, Timeout # Issue 24473
+issue_22780_test/01: Pass, Timeout # Issue 24473
+
+[ $compiler == none && $runtime == dartium && $system == linux && $arch == x64 ]
+async_await_test: Skip # Issue 26198
[ $compiler == none && $runtime == drt ]
disassemble_test: Pass, Fail # Issue 18122
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index b151186..f10bd63 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -7,7 +7,6 @@
method_name_test: Fail # issue 25574
async_star_cancel_while_paused_test: RuntimeError # Issue 22853
-async_star_await_pauses_test: Fail, Timeout # Issue 22853
tearoff_basic_test: Skip # Tear-off not supported
tearoff_constructor_basic_test: Skip # Tear-off not supported
@@ -44,6 +43,7 @@
[ $compiler == dart2js && $runtime == jsshell ]
await_for_test: Skip # Jsshell does not provide periodic timers, Issue 7728
async_star_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
+regress_23996_test: RuntimeError # Jsshell does not provide non-zero timers, Issue 7728
async_star_no_cancel_test: RuntimeError # Need triage
async_star_no_cancel2_test: RuntimeError # Need triage
@@ -208,12 +208,6 @@
[ $compiler == dart2js && $runtime == none ]
*: Fail, Pass # TODO(ahe): Triage these tests.
-[ $compiler == dart2js && $runtime == chrome && $system == macos ]
-await_future_test: Pass, Timeout # Issue 22695.
-async_await_test/none: Pass, Timeout # Issue 22695.
-async_await_test/02: Pass, Timeout # Issue 22695.
-async_await_test/03: Pass, Timeout # Issue 22695.
-
[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim)]
round_test: Fail, OK # Common JavaScript engine Math.round bug.
diff --git a/tests/language/regress_23996_test.dart b/tests/language/regress_23996_test.dart
new file mode 100644
index 0000000..4401a46
--- /dev/null
+++ b/tests/language/regress_23996_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:async";
+import "package:async_helper/async_helper.dart";
+
+/// This test verifies that an await for loop sends the correct
+/// signals to the stream it iterates over:
+/// 1) A listen event.
+/// 2) A pause event when the loop body is awaiting something,
+/// and more elements arrive on the stream. See issue
+/// https://github.com/dart-lang/sdk/issues/23996 .
+/// 3) A resume event, when the loop is again ready to iterate.
+main() {
+ Completer listenEventReceived = new Completer();
+ Completer pauseEventReceived = new Completer();
+ Completer resumeEventReceived = new Completer();
+ StreamController controller = new StreamController(
+ onListen: () => listenEventReceived.complete(),
+ onPause: () => pauseEventReceived.complete(),
+ onResume: () => resumeEventReceived.complete());
+
+ Completer forLoopEntered = new Completer();
+
+ /// The send function puts items on the stream. It waits for a
+ /// listener, puts "first" on the stream, waits for the for loop
+ /// to start (and eventually block), puts "second" on the stream
+ /// multiple times, letting the event loop run, until the for loop
+ /// pauses the stream because it it blocked.
+ /// The for loop unblocks after the pause message is received, and
+ /// reads the stream items, sending a stream resume message when it
+ /// is ready for more.
+ /// Then the send function puts a final "third" on the stream, and
+ /// closes the stream.
+ send() async {
+ await listenEventReceived.future;
+ controller.add('first');
+ await forLoopEntered.future;
+ var timer = new Timer.periodic(new Duration(milliseconds: 10), (timer) {
+ controller.add('second');
+ });
+ await pauseEventReceived.future;
+ // pauseEventReceived.future completes when controller.stream is
+ // paused by the await-for loop below. What's specified is that
+ // await-for must pause immediately on an "await", but instead
+ // the implementations agree on not pausing until receiving the
+ // next event. For this reason, [timer] will call its callback at
+ // least once before we cancel it again.
+ timer.cancel();
+ await resumeEventReceived.future;
+ controller.add('third');
+ controller.close();
+ }
+
+ receive() async {
+ bool thirdReceived = false;
+ await for (var entry in controller.stream) {
+ if (entry == 'first') {
+ forLoopEntered.complete();
+ await pauseEventReceived.future;
+ } else if (entry == 'third') {
+ thirdReceived = true;
+ }
+ }
+ if (!thirdReceived) {
+ throw "Error in await-for loop: 'third' not received";
+ }
+ }
+
+ asyncTest(() async {
+ // We need to start both functions in parallel, and wait on them both.
+ var f = send();
+ await receive();
+ await f;
+ });
+}
diff --git a/tests/language/regress_26175_test.dart b/tests/language/regress_26175_test.dart
new file mode 100644
index 0000000..e4af4bb
--- /dev/null
+++ b/tests/language/regress_26175_test.dart
@@ -0,0 +1,74 @@
+// Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:async';
+
+import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
+
+// Test that local variable reads and writes are sequenced correctly with
+// respect to reads and writes in an awaited Future. See issue 26175.
+
+// Reads are sequenced correctly with respect to writes in a Future.
+Future test1() async {
+ var x = 'a';
+ f() async => x = 'b';
+ Expect.equals('abb', '${x}${await f()}${x}');
+}
+
+// Writes are sequenced correctly with respect to writes in a Future.
+Future test2(ignore) async {
+ var x;
+ f() async => x = 'b';
+ Expect.equals('abb', '${x = 'a'}${await f()}${x}');
+}
+
+// Writes are sequenced correctly with respect to reads in a Future.
+Future test3(ignore) async {
+ var x = 'a';
+ f() async => x;
+ Expect.equals('bbb', '${x = 'b'}${await f()}${x}');
+}
+
+// Repeat the same tests for static variables.
+var cell = 'a';
+
+asyncReadCell() async => cell;
+asyncWriteCell(value) async => cell = value;
+
+Future test4(ignore) async {
+ // This test assumes that it can read the initial value of cell.
+ Expect.equals('abb', '${cell}${await asyncWriteCell('b')}${cell}');
+}
+
+Future test5(ignore) async {
+ Expect.equals('abb', '${cell = 'a'}${await asyncWriteCell('b')}${cell}');
+}
+
+Future test6(ignore) async {
+ Expect.equals('bbb', '${cell = 'b'}${await asyncReadCell()}${cell}');
+}
+
+// Test that throwing is sequenced correctly with respect to other effects.
+Future test7(ignore) async {
+ cell = 'a';
+ try {
+ Expect.equals('unreachable',
+ '${throw 0}${await asyncWriteCell('b')}${cell}');
+ } catch (_) {
+ Expect.equals('a', cell);
+ }
+}
+
+main() {
+ asyncStart();
+ test1()
+ .then(test2)
+ .then(test3)
+ .then(test4)
+ .then(test5)
+ .then(test6)
+ .then(test7)
+ .then((_) => asyncEnd());
+}
diff --git a/tests/lib/convert/base64_test.dart b/tests/lib/convert/base64_test.dart
index 457e330..4a2c1ab 100644
--- a/tests/lib/convert/base64_test.dart
+++ b/tests/lib/convert/base64_test.dart
@@ -31,16 +31,23 @@
// Direct.
String encodedNormal = BASE64.encode(list);
String encodedPercent = encodedNormal.replaceAll("=", "%3D");
- String uriEncoded = encodedNormal.replaceAll("+", "-").replaceAll("/", "_");
+ String uriEncoded = BASE64URL.encode(list);
+ String expectedUriEncoded =
+ encodedNormal.replaceAll("+", "-").replaceAll("/", "_");
+ Expect.equals(expectedUriEncoded, uriEncoded);
+
List result = BASE64.decode(encodedNormal);
Expect.listEquals(list, result, name);
result = BASE64.decode(encodedPercent);
Expect.listEquals(list, result, name);
+ result = BASE64.decode(uriEncoded);
+ Expect.listEquals(list, result, name);
int increment = list.length ~/ 7 + 1;
// Chunked.
for (int i = 0; i < list.length; i += increment) {
for (int j = i; j < list.length; j += increment) {
+ // Normal
{
// Using add/close
var results;
@@ -64,6 +71,30 @@
var name = "0-$i-$j-${list.length}: $list";
Expect.equals(encodedNormal, results.join(""), name);
}
+ // URI
+ {
+ // Using add/close
+ var results;
+ var sink = new ChunkedConversionSink.withCallback((v) { results = v; });
+ var encoder = BASE64URL.encoder.startChunkedConversion(sink);
+ encoder.add(list.sublist(0, i));
+ encoder.add(list.sublist(i, j));
+ encoder.add(list.sublist(j, list.length));
+ encoder.close();
+ var name = "0-$i-$j-${list.length}: list";
+ Expect.equals(uriEncoded, results.join(""), name);
+ }
+ {
+ // Using addSlice
+ var results;
+ var sink = new ChunkedConversionSink.withCallback((v) { results = v; });
+ var encoder = BASE64URL.encoder.startChunkedConversion(sink);
+ encoder.addSlice(list, 0, i, false);
+ encoder.addSlice(list, i, j, false);
+ encoder.addSlice(list, j, list.length, true);
+ var name = "0-$i-$j-${list.length}: $list";
+ Expect.equals(uriEncoded, results.join(""), name);
+ }
}
}
@@ -119,6 +150,7 @@
}
void badDecode(String string) {
Expect.throws(() => BASE64.decode(string), isFormatException, string);
+ Expect.throws(() => BASE64URL.decode(string), isFormatException, string);
badChunkDecode([string]);
badChunkDecode(["", string]);
badChunkDecode([string, ""]);
diff --git a/tests/lib/convert/chunked_conversion1_test.dart b/tests/lib/convert/chunked_conversion1_test.dart
index 0bbe44b..3c84b3e 100644
--- a/tests/lib/convert/chunked_conversion1_test.dart
+++ b/tests/lib/convert/chunked_conversion1_test.dart
@@ -54,7 +54,8 @@
specialB(o) => add(o);
}
-class IntBoolConverter1 extends Converter<List<int>, List<bool>> {
+class IntBoolConverter1 extends
+ ChunkedConverter<List<int>, List<bool>, int, bool> {
List<bool> convert(List<int> input) => input.map((x) => x > 0).toList();
startChunkedConversion(sink) {
@@ -63,7 +64,8 @@
}
}
-class BoolIntConverter1 extends Converter<List<bool>, List<int>> {
+class BoolIntConverter1 extends
+ ChunkedConverter<List<bool>, List<int>, bool, int> {
List<int> convert(List<bool> input) => input.map((x) => x ? 1 : 0).toList();
startChunkedConversion(sink) {
@@ -104,7 +106,7 @@
close() => outSink.close();
}
-class IdentityConverter extends Converter {
+class IdentityConverter extends ChunkedConverter {
convert(x) => x;
startChunkedConversion(sink) {
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index b44b584c..8b9fb54 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -78,6 +78,7 @@
mirrors/other_declarations_location_test: CompileTimeError # Issue 10905
mirrors/parameter_test/none: RuntimeError # Issue 6490
mirrors/parameter_of_mixin_app_constructor_test: RuntimeError # Issue 6490
+mirrors/private_class_field_test: CompileTimeError
mirrors/private_symbol_test: CompileTimeError # Issue 13597
mirrors/private_types_test: RuntimeError # Issue 6490
mirrors/redirecting_factory_test/none: RuntimeError # Issue 6490
@@ -321,9 +322,6 @@
[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $mode == debug && $arch == x64 && $system == windows ]
convert/streamed_conversion_json_utf8_decode_test: Pass, Slow
-[ ($runtime == vm || $runtime == dart_precompiled || $runtime == dart_product) && $mode == release && $arch == ia32 && $system == windows ]
-convert/json_test: RuntimeError # Issue 24908
-
[ $mode == debug && $arch != ia32 && $arch != x64 && $arch != simarm && $arch != simarmv6 && $arch != simarmv5te ]
convert/streamed_conversion_json_utf8_decode_test: Skip # Verification not yet implemented.
diff --git a/tests/lib/mirrors/private_class_field_other.dart b/tests/lib/mirrors/private_class_field_other.dart
new file mode 100644
index 0000000..85238b6
--- /dev/null
+++ b/tests/lib/mirrors/private_class_field_other.dart
@@ -0,0 +1,9 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class C {
+ static var _privateField = 42;
+}
+
+get privateFieldSymbolInOther => #_privateField;
\ No newline at end of file
diff --git a/tests/lib/mirrors/private_class_field_test.dart b/tests/lib/mirrors/private_class_field_test.dart
new file mode 100644
index 0000000..cedf903
--- /dev/null
+++ b/tests/lib/mirrors/private_class_field_test.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Test a private field name doesn't match the equivalent private name from
+// another library.
+
+import 'dart:mirrors';
+import 'package:expect/expect.dart';
+
+import 'private_class_field_other.dart';
+
+void main() {
+ var classMirror = reflectClass(C);
+ // The symbol is private w/r/t the wrong library.
+ Expect.throws(() => classMirror.getField(#_privateField),
+ (e) => e is NoSuchMethodError);
+
+ Expect.equals(42, classMirror.getField(privateFieldSymbolInOther).reflectee);
+}
diff --git a/tests/standalone/full_coverage_test.dart b/tests/standalone/full_coverage_test.dart
deleted file mode 100644
index e719d42..0000000
--- a/tests/standalone/full_coverage_test.dart
+++ /dev/null
@@ -1,247 +0,0 @@
-// Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// These tests fork a second VM process that runs the script
-// ``tools/full-coverage.dart'' and verifies that the tool
-// produces the expeced output.
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:path/path.dart' as path;
-import 'package:unittest/unittest.dart';
-
-final String coverageScript =
- Platform.script.resolve('../../tools/full-coverage.dart').toFilePath();
-final String packageRoot = Platform.packageRoot;
-final List dartBaseArgs = ['--package-root=${packageRoot}', '--checked',];
-final Stopwatch sw = new Stopwatch();
-
-int elapsed() => sw.elapsedMilliseconds;
-
-// With line numbers starting at 0, the list of hits can be understood as
-// follows:
-// * -1: No coverage data on this line.
-// * 0: No hits on this line.
-// * 1: ``Some'' hits on this line.
-final coverageTests = [
- {
- 'name': 'faculty',
- 'program': '''
-dummy () {
- for (int i = 0; i < 100; i++) {
- print(i);
- }
-}
-
-int fac(int n) {
- int f = 1;
- for (int i = 1; i <= n; i++) {
- f *= i;
- }
- return f;
-}
-
-main() {
- if (false) {
- dummy(11);
- } else {
- fac(10);
- }
-}
-''',
- 'expectedHits': [-1, 0, 0, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, -1,
- -1, 0, -1, 1, -1, -1]
- },{
- 'name': 'closures',
- 'program': '''
-main() {
- foo(bar) {
- bar();
- }
-
- foo(() {
- print("in closure");
- });
-}
-''',
- 'expectedHits': [-1, -1, 1, -1, -1, 1, 1, -1, -1]
- }
-];
-
-
-String prepareEnv() {
- Directory testDir = Directory.systemTemp.createTempSync("coverage-");
- for (var coverageProg in coverageTests) {
- var coverageProgDir = new Directory(
- path.join(testDir.path, coverageProg["name"]))
- ..createSync();
- var f = new File(path.join(coverageProgDir.path,
- "${coverageProg['name']}.dart"));
- f.writeAsStringSync(coverageProg["program"], mode: FileMode.WRITE);
- }
- return testDir.path;
-}
-
-
-destroyEnv(base) => new Directory(base).deleteSync(recursive: true);
-
-
-generateCoverage(String workingDirectory) {
- for (var coverageProg in coverageTests) {
- print('[+${elapsed()}ms] Generating data for ${coverageProg["name"]}');
- var progPath = path.join(workingDirectory, coverageProg['name']);
- var script = path.join(progPath, "${coverageProg['name']}.dart");
- var dartArgs = new List.from(dartBaseArgs)
- ..addAll(['--coverage-dir=${progPath}', '${script}']);
- var result = Process.runSync(Platform.executable, dartArgs);
- if (result.exitCode != 0) {
- print("[+${elapsed()}ms] Got exitCode: ${result.exitCode}.");
- print("stderr:\n${result.stderr}\n");
- expect(result.exitCode, 0);
- }
- }
-}
-
-
-Future<Process> convertCoverage(String programDir, String format) {
- var dartArgs = new List.from(dartBaseArgs)
- ..addAll([
- coverageScript,
- '--package-root=${packageRoot}',
- '--in=${programDir}',
- format
- ]);
- return Process.start(Platform.executable, dartArgs);
-}
-
-
-class PrettyPrintDescriptor {
- var _programPath;
- var _validFormat = new RegExp(r"^\s*\d*\|.*$", multiLine: true);
- var _pattern = new RegExp(r"^\s*(\d+)\|", multiLine: true);
-
- PrettyPrintDescriptor(this._programPath);
-
- get sectionStart => _programPath;
- get sectionEnd => '/';
- get coverageParameter => '--pretty-print';
-
- hitData(line) {
- expect(_validFormat.hasMatch(line), isTrue);
- var match = _pattern.firstMatch(line);
- var result = -1;
- if (match != null) {
- result = (int.parse(match.group(1)) != 0) ? 1 : 0;
- }
- return [result];
- }
-}
-
-
-class LcovDescriptor {
- var _pattern = new RegExp(r"^DA:(\d+),(\d+)$", multiLine: true);
- var _programPath;
- var _line_nr = 0;
-
- LcovDescriptor(this._programPath);
-
- get sectionStart => 'SF:${_programPath}';
- get sectionEnd => 'end_of_record';
- get coverageParameter => '--lcov';
-
- hitData(line) {
- expect(_pattern.hasMatch(line), isTrue);
- var match = _pattern.firstMatch(line);
- // Lcov data starts at line 1, we start at 0.
- var out_line = int.parse(match[1]) - 1;
- var hitCount = int.parse(match[2]);
- var result = [];
- for ( ; _line_nr < out_line; _line_nr++) {
- result.add(-1);
- }
- result.add((hitCount != 0) ? 1 : 0);
- _line_nr++;
- return result;
- }
-}
-
-
-Stream filterHitData(input, descriptor) {
- bool in_program_section = false;
- return input.where((line) {
- if (in_program_section) {
- if (line.startsWith(descriptor.sectionEnd)) {
- in_program_section = false;
- return false;
- }
- return true;
- }
- if (line.startsWith(descriptor.sectionStart)) {
- in_program_section = true;
- }
- return false;
- }).map((line) {
- return descriptor.hitData(line);
- });
-}
-
-
-testCoverage(String programDir, String programPath, descriptor,
- List expectedHitMap) {
- var p = convertCoverage(programDir, descriptor.coverageParameter);
- expect(p.then((process) {
- var hitStream = filterHitData(
- process.stdout.transform(UTF8.decoder)
- .transform(const LineSplitter()),
- descriptor);
- var hitMap = [];
- var subscription = hitStream.listen((data) {
- // Flatten results.
- data.forEach((e) => hitMap.add(e));
- });
- expect(subscription.asFuture().then((_) {
- hitMap.forEach((e) {
- expect(e, expectedHitMap.removeAt(0));
- });
- // Make sure that there are only lines left that do not contain coverage
- // data.
- expectedHitMap.forEach((e) => expect(e, -1));
- }), completes);
- }), completes);
-}
-
-
-main() {
- String testingDirectory;
- sw.start();
-
- setUp(() {
- testingDirectory = prepareEnv();
- });
-
- tearDown(() => destroyEnv(testingDirectory));
-
- test('CoverageTests', () {
- print('[+${elapsed()}ms] Generating coverage data...');
- generateCoverage(testingDirectory);
- print('[+${elapsed()}ms] Done Generating coverage data.');
-
- print('[+${elapsed()}ms] Running tests...');
- coverageTests.forEach((cTest) {
- String programDir = path.join(testingDirectory, cTest['name']);
- String programPath = path.join(programDir, "${cTest['name']}.dart");
- print('[+${elapsed()}ms] Testing lcov for ${cTest["name"]}');
- testCoverage(programDir, programPath,
- new LcovDescriptor(programPath),
- new List.from(cTest['expectedHits']));
- print('[+${elapsed()}ms] Testing pretty print for ${cTest["name"]}');
- testCoverage(programDir, programPath,
- new PrettyPrintDescriptor(programPath),
- new List.from(cTest['expectedHits']));
- });
- print('[+${elapsed()}ms] Done.');
- });
-}
diff --git a/tools/VERSION b/tools/VERSION
index 2ca4386..933c4c2 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 1
MINOR 16
PATCH 0
-PRERELEASE 4
+PRERELEASE 5
PRERELEASE_PATCH 0
diff --git a/tools/deps/dartium.deps/DEPS b/tools/deps/dartium.deps/DEPS
index ee710f8..362e8a3 100644
--- a/tools/deps/dartium.deps/DEPS
+++ b/tools/deps/dartium.deps/DEPS
@@ -8,8 +8,8 @@
# Now we need to override some settings and add some new ones.
vars.update({
- "dartium_chromium_commit": "f41b46133f75612579588ba14265a7e241406b0e",
- "dartium_webkit_commit": "d4cfc86d765d59fd7048c7272b924a1a9e9ce5fe",
+ "dartium_chromium_commit": "d70bedf071e56a6bb1d8ad0df8ece98745e0401a",
+ "dartium_webkit_commit": "b4483b1ace5b28b4678cf132087db9cd9e18deb6",
"chromium_base_revision": "338390",
# We use mirrors of all github repos to guarantee reproducibility and
diff --git a/tools/dom/scripts/generate_blink_file.py b/tools/dom/scripts/generate_blink_file.py
index cdac697..8cea946 100644
--- a/tools/dom/scripts/generate_blink_file.py
+++ b/tools/dom/scripts/generate_blink_file.py
@@ -138,39 +138,6 @@
static initializeCustomElement(element) native "Utils_initializeCustomElement";
}
-class Blink_DOMWindowCrossFrame {
- // FIXME: Return to using explicit cross frame entry points after roll to M35
- static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
-
- static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
-
- static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
-
- static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
-
- static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
-
- static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
-
- static close(_DOMWindowCrossFrame) native "Window_close_Callback";
-
- static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
-}
-
-class Blink_HistoryCrossFrame {
- // _HistoryCrossFrame native entry points
- static back(_HistoryCrossFrame) native "History_back_Callback";
-
- static forward(_HistoryCrossFrame) native "History_forward_Callback";
-
- static go(_HistoryCrossFrame, distance) native "History_go_Callback";
-}
-
-class Blink_LocationCrossFrame {
- // _LocationCrossFrame native entry points
- static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
-}
-
class Blink_DOMStringMap {
// _DOMStringMap native entry points
static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index 6d0c94d..1f5a030 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -116,7 +116,7 @@
if idl_type == 'Promise':
return _promise_to_future
if conversion:
- if conversion.function_name in ('_convertNativeToDart_Window', '_convertNativeToDart_EventTarget', 'convertNativeToDart_DateTime', 'convertNativeToDart_ImageData'):
+ if conversion.function_name in ('convertNativeToDart_DateTime', 'convertNativeToDart_ImageData'):
return None
return conversion
diff --git a/tools/dom/src/native_DOMImplementation.dart b/tools/dom/src/native_DOMImplementation.dart
index 97487bf..faa1ec0 100644
--- a/tools/dom/src/native_DOMImplementation.dart
+++ b/tools/dom/src/native_DOMImplementation.dart
@@ -5,12 +5,12 @@
part of html;
class _Property {
- _Property(this.name) :
- _hasValue = false,
- writable = false,
- isMethod = false,
- isOwn = true,
- wasThrown = false;
+ _Property(this.name)
+ : _hasValue = false,
+ writable = false,
+ isMethod = false,
+ isOwn = true,
+ wasThrown = false;
bool get hasValue => _hasValue;
get value => _value;
@@ -30,6 +30,203 @@
bool wasThrown;
}
+/**
+ * Manager for navigating between libraries from the devtools console.
+ */
+class _LibraryManager {
+ /**
+ * Current active library
+ */
+ static var _currentLibrary;
+ static var _validCache = false;
+
+ static List<Uri> _libraryUris;
+
+ // List of all maps to check to determine if there is an exact match.
+ static Map<String, List<Uri>> _fastPaths;
+
+ static void _addFastPath(String key, Uri uri) {
+ _fastPaths.putIfAbsent(key, () => <Uri>[]).add(uri);
+ }
+
+ static cache() {
+ if (_validCache) return;
+ _validCache = true;
+ _libraryUris = <Uri>[];
+ _fastPaths = new Map<String, List<Uri>>();
+ var system = currentMirrorSystem();
+ system.libraries.forEach((uri, library) {
+ _libraryUris.add(uri);
+ _addFastPath(uri.toString(), uri);
+ _addFastPath(MirrorSystem.getName(library.simpleName), uri);
+ });
+ }
+
+ static String get currentLibrary {
+ if (_currentLibrary == null) {
+ _currentLibrary =
+ currentMirrorSystem().isolate.rootLibrary.uri.toString();
+ }
+ return _currentLibrary;
+ }
+
+ /**
+ * Find libraries matching a given name.
+ *
+ * Uses heuristics to only return a single match when the user intent is
+ * generally unambiguous.
+ */
+ static List<Uri> findMatches(String name) {
+ cache();
+ var nameAsFile = name.endsWith('.dart') ? name : '${name}.dart';
+ // Perfect match first.
+ var fastPatchMatches = _fastPaths[name];
+ if (fastPatchMatches != null) {
+ return fastPatchMatches.toList();
+ }
+
+ // Exact match for file path.
+ var matches = new LinkedHashSet<Uri>();
+ for (var uri in _libraryUris) {
+ if (uri.path == name || uri.path == nameAsFile) matches.add(uri);
+ }
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Exact match for file name.
+ if (name != nameAsFile) {
+ for (var uri in _libraryUris) {
+ if (uri.pathSegments.isNotEmpty &&
+ (uri.pathSegments.last == nameAsFile)) {
+ matches.add(uri);
+ }
+ }
+ if (matches.isNotEmpty) return matches.toList();
+ }
+
+ for (var uri in _libraryUris) {
+ if (uri.pathSegments.isNotEmpty && (uri.pathSegments.last == name)) {
+ matches.add(uri);
+ }
+ }
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Partial match on path.
+ for (var uri in _libraryUris) {
+ if (uri.path.contains(name)) {
+ matches.add(uri);
+ }
+ }
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Partial match on entire uri.
+ for (var uri in _libraryUris) {
+ if (uri.toString().contains(name)) {
+ matches.add(uri);
+ }
+ }
+
+ if (matches.isNotEmpty) return matches.toList();
+
+ // Partial match on entire uri ignoring case.
+ name = name.toLowerCase();
+ for (var uri in _libraryUris) {
+ if (uri.toString().toLowerCase().contains(name)) {
+ matches.add(uri);
+ }
+ }
+ return matches.toList();
+ }
+
+ static setLibrary([String name]) {
+ // Bust cache in case library list has changed. Ideally we would listen for
+ // when libraries are loaded and invalidate based on that.
+ _validCache = false;
+ cache();
+ if (name == null) {
+ window.console
+ ..group("Current library: $_currentLibrary")
+ ..groupCollapsed("All libraries:");
+ _listLibraries();
+ window.console..groupEnd()..groupEnd();
+ return;
+ }
+ var matches = findMatches(name);
+ if (matches.length != 1) {
+ if (matches.length > 1) {
+ window.console.warn("Ambiguous library name: $name");
+ }
+ showMatches(name, matches);
+ return;
+ }
+ _currentLibrary = matches.first.toString();
+ window.console.log("Set library to $_currentLibrary");
+ }
+
+ static getLibrary() {
+ return currentLibrary;
+ }
+
+ static List<Uri> _sortUris(Iterable<Uri> uris) {
+ return (uris.toList())
+ ..sort((Uri a, Uri b) {
+ if (a.scheme != b.scheme) {
+ if (a.scheme == 'dart') return -1;
+ if (b.scheme == 'dart') return 1;
+ return a.scheme.compareTo(b.scheme);
+ }
+ return a.toString().compareTo(b.toString());
+ });
+ }
+
+ static void listLibraries() {
+ _validCache = false;
+ cache();
+ _listLibraries();
+ }
+
+ static void _listLibraries() {
+ window.console.log(_sortUris(_libraryUris).join("\n"));
+ }
+
+ // Workaround to allow calling console.log with an arbitrary number of
+ // arguments.
+ static void _log(List<String> args) {
+ js.JsNative.callMethod(window.console, 'log', args);
+ }
+
+ static showMatches(String key, Iterable<Uri> uris) {
+ var boldPairs = [];
+ var sb = new StringBuffer();
+ if (uris.isEmpty) {
+ window.console.group("All libraries:");
+ _listLibraries();
+ window.console
+ ..groupEnd()
+ ..error("No library names or URIs match '$key'");
+ return;
+ }
+ sb.write("${uris.length} matches\n");
+ var lowerCaseKey = key.toLowerCase();
+ for (var uri in uris) {
+ var txt = uri.toString();
+ int index = txt.toLowerCase().indexOf(lowerCaseKey);
+ if (index != -1) {
+ // %c enables styling console log messages with css
+ // specified at the end of the console.
+ sb..write(txt.substring(0, index))..write('%c');
+ var matchEnd = index + key.length;
+ sb
+ ..write(txt.substring(index, matchEnd))
+ ..write('%c')
+ ..write(txt.substring(matchEnd))
+ ..write('\n');
+ boldPairs..add('font-weight: bold')..add('font-weight: normal');
+ }
+ }
+ _log([sb.toString()]..addAll(boldPairs));
+ }
+}
+
class _ConsoleVariables {
Map<String, Object> _data = new Map<String, Object>();
@@ -75,15 +272,15 @@
}
class _MethodTrampoline extends _Trampoline {
- _MethodTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
- Symbol selector) :
- super(receiver, methodMirror, selector);
+ _MethodTrampoline(
+ ObjectMirror receiver, MethodMirror methodMirror, Symbol selector)
+ : super(receiver, methodMirror, selector);
noSuchMethod(Invocation msg) {
if (msg.memberName != #call) return super.noSuchMethod(msg);
- return _receiver.invoke(_selector,
- msg.positionalArguments,
- msg.namedArguments).reflectee;
+ return _receiver
+ .invoke(_selector, msg.positionalArguments, msg.namedArguments)
+ .reflectee;
}
}
@@ -91,9 +288,9 @@
* Invocation trampoline class used to closurize getters.
*/
class _GetterTrampoline extends _Trampoline {
- _GetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
- Symbol selector) :
- super(receiver, methodMirror, selector);
+ _GetterTrampoline(
+ ObjectMirror receiver, MethodMirror methodMirror, Symbol selector)
+ : super(receiver, methodMirror, selector);
call() => _receiver.getField(_selector).reflectee;
}
@@ -102,9 +299,9 @@
* Invocation trampoline class used to closurize setters.
*/
class _SetterTrampoline extends _Trampoline {
- _SetterTrampoline(ObjectMirror receiver, MethodMirror methodMirror,
- Symbol selector) :
- super(receiver, methodMirror, selector);
+ _SetterTrampoline(
+ ObjectMirror receiver, MethodMirror methodMirror, Symbol selector)
+ : super(receiver, methodMirror, selector);
call(value) {
_receiver.setField(_selector, value);
@@ -117,7 +314,7 @@
static DateTime doubleToDateTime(double dateTime) {
try {
return new DateTime.fromMillisecondsSinceEpoch(dateTime.toInt());
- } catch(_) {
+ } catch (_) {
// TODO(antonnm): treat exceptions properly in bindings and
// find out how to treat NaNs.
return null;
@@ -162,7 +359,10 @@
static Map createMap() => {};
- static parseJson(String jsonSource) => const JsonDecoder().convert(jsonSource);
+ static parseJson(String jsonSource) =>
+ const JsonDecoder().convert(jsonSource);
+
+ static String getLibraryUrl() => _LibraryManager.currentLibrary;
static makeUnimplementedError(String fileName, int lineNo) {
return new UnsupportedError('[info: $fileName:$lineNo]');
@@ -187,7 +387,8 @@
return element;
}
- static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
+ static forwardingPrint(String message) =>
+ _blink.Blink_Utils.forwardingPrint(message);
static void spawnDomHelper(Function f, int replyTo) =>
_blink.Blink_Utils.spawnDomHelper(f, replyTo);
@@ -220,8 +421,8 @@
*/
static Map<String, dynamic> createLocalVariablesMap(List localVariables) {
var map = {};
- for (int i = 0; i < localVariables.length; i+=2) {
- map[stripMemberName(localVariables[i])] = localVariables[i+1];
+ for (int i = 0; i < localVariables.length; i += 2) {
+ map[stripMemberName(localVariables[i])] = localVariables[i + 1];
}
return map;
}
@@ -250,8 +451,8 @@
* [_consoleTempVariables, 40, 2, someValue, someOtherValue]]
* </code>
*/
- static List wrapExpressionAsClosure(String expression, List locals,
- bool includeCommandLineAPI) {
+ static List wrapExpressionAsClosure(
+ String expression, List locals, bool includeCommandLineAPI) {
var args = {};
var sb = new StringBuffer("(");
addArg(arg, value) {
@@ -286,26 +487,24 @@
final _SET_VARIABLE = new RegExp("^(\\s*)(\\w+)(\\s*=)");
// Match trailing semicolons.
final _ENDING_SEMICOLONS = new RegExp("(;\\s*)*\$");
- expression = expression.replaceAllMapped(_VARIABLE_DECLARATION,
- (match) {
- var variableName = match[2];
- // Set the console variable if it isn't already set.
- if (!_consoleTempVariables._data.containsKey(variableName)) {
- _consoleTempVariables._data[variableName] = null;
- }
- return "${match[1]}\$consoleVariables.${variableName}";
- });
+ expression = expression.replaceAllMapped(_VARIABLE_DECLARATION, (match) {
+ var variableName = match[2];
+ // Set the console variable if it isn't already set.
+ if (!_consoleTempVariables._data.containsKey(variableName)) {
+ _consoleTempVariables._data[variableName] = null;
+ }
+ return "${match[1]}\$consoleVariables.${variableName}";
+ });
- expression = expression.replaceAllMapped(_SET_VARIABLE,
- (match) {
- var variableName = match[2];
- // Only rewrite if the name matches an existing console variable.
- if (_consoleTempVariables._data.containsKey(variableName)) {
- return "${match[1]}\$consoleVariables.${variableName}${match[3]}";
- } else {
- return match[0];
- }
- });
+ expression = expression.replaceAllMapped(_SET_VARIABLE, (match) {
+ var variableName = match[2];
+ // Only rewrite if the name matches an existing console variable.
+ if (_consoleTempVariables._data.containsKey(variableName)) {
+ return "${match[1]}\$consoleVariables.${variableName}${match[3]}";
+ } else {
+ return match[0];
+ }
+ });
// We only allow dart expressions not Dart statements. Silently remove
// trailing semicolons the user might have added by accident to reduce the
@@ -314,8 +513,8 @@
}
if (locals != null) {
- for (int i = 0; i < locals.length; i+= 2) {
- addArg(locals[i], locals[i+1]);
+ for (int i = 0; i < locals.length; i += 2) {
+ addArg(locals[i], locals[i + 1]);
}
}
// Inject all the already defined console variables.
@@ -330,12 +529,12 @@
return [sb.toString(), args.values.toList(growable: false)];
}
- static String _getShortSymbolName(Symbol symbol,
- DeclarationMirror declaration) {
+ static String _getShortSymbolName(
+ Symbol symbol, DeclarationMirror declaration) {
var name = MirrorSystem.getName(symbol);
if (declaration is MethodMirror) {
- if (declaration.isSetter && name[name.length-1] == "=") {
- return name.substring(0, name.length-1);
+ if (declaration.isSetter && name[name.length - 1] == "=") {
+ return name.substring(0, name.length - 1);
}
if (declaration.isConstructor) {
return name.substring(name.indexOf('.') + 1);
@@ -345,6 +544,38 @@
}
/**
+ * Handle special console commands such as $lib and $libs that should not be
+ * evaluated as Dart expressions and instead should be interpreted directly.
+ * Commands supported:
+ * library <-- shows the current library and lists all libraries.
+ * library "library_uri" <-- select a specific library
+ * library "library_uri_fragment"
+ */
+ static bool maybeHandleSpecialConsoleCommand(String expression) {
+ expression = expression.trim();
+ var setLibraryCommand = r'library ';
+ if (expression == r'library') {
+ _LibraryManager.setLibrary();
+ return true;
+ }
+ if (expression.startsWith(setLibraryCommand)) {
+ expression = expression.substring(setLibraryCommand.length);
+ if (expression.length >= 2) {
+ String start = expression[0];
+ String end = expression[expression.length - 1];
+ // TODO(jacobr): maybe we should require quotes.
+ if ((start == "'" && end == "'") || (start == '"' && end == '"')) {
+ expression = expression.substring(1, expression.length - 1);
+ }
+ }
+
+ _LibraryManager.setLibrary(expression);
+ return true;
+ }
+ return false;
+ }
+
+ /**
* Returns a list of completions to use if the receiver is o.
*/
static List<String> getCompletions(o) {
@@ -354,19 +585,17 @@
map.forEach((symbol, mirror) {
if (mirror.isStatic == isStatic && !mirror.isPrivate) {
var name = MirrorSystem.getName(symbol);
- if (mirror is MethodMirror && mirror.isSetter)
- name = name.substring(0, name.length - 1);
+ if (mirror is MethodMirror && mirror.isSetter) name =
+ name.substring(0, name.length - 1);
completions.add(name);
}
});
}
addForClass(ClassMirror mirror, bool isStatic) {
- if (mirror == null)
- return;
+ if (mirror == null) return;
addAll(mirror.declarations, isStatic);
- if (mirror.superclass != null)
- addForClass(mirror.superclass, isStatic);
+ if (mirror.superclass != null) addForClass(mirror.superclass, isStatic);
for (var interface in mirror.superinterfaces) {
addForClass(interface, isStatic);
}
@@ -384,8 +613,8 @@
* Adds all candidate String completitions from [declarations] to [output]
* filtering based on [staticContext] and [includePrivate].
*/
- static void _getCompletionsHelper(ClassMirror classMirror,
- bool staticContext, LibraryMirror libraryMirror, Set<String> output) {
+ static void _getCompletionsHelper(ClassMirror classMirror, bool staticContext,
+ LibraryMirror libraryMirror, Set<String> output) {
bool includePrivate = libraryMirror == classMirror.owner;
classMirror.declarations.forEach((symbol, declaration) {
if (!includePrivate && declaration.isPrivate) return;
@@ -408,12 +637,11 @@
if (!staticContext) {
for (var interface in classMirror.superinterfaces) {
- _getCompletionsHelper(interface, staticContext,
- libraryMirror, output);
+ _getCompletionsHelper(interface, staticContext, libraryMirror, output);
}
if (classMirror.superclass != null) {
- _getCompletionsHelper(classMirror.superclass, staticContext,
- libraryMirror, output);
+ _getCompletionsHelper(
+ classMirror.superclass, staticContext, libraryMirror, output);
}
}
}
@@ -480,13 +708,13 @@
}
static final SIDE_EFFECT_FREE_LIBRARIES = new Set<String>()
- ..add('dart:html')
- ..add('dart:indexed_db')
- ..add('dart:svg')
- ..add('dart:typed_data')
- ..add('dart:web_audio')
- ..add('dart:web_gl')
- ..add('dart:web_sql');
+ ..add('dart:html')
+ ..add('dart:indexed_db')
+ ..add('dart:svg')
+ ..add('dart:typed_data')
+ ..add('dart:web_audio')
+ ..add('dart:web_gl')
+ ..add('dart:web_sql');
static LibraryMirror _getLibrary(MethodMirror methodMirror) {
var owner = methodMirror.owner;
@@ -505,8 +733,8 @@
* In the future we should consider adding an annotation to tag getters
* in user libraries as side effect free.
*/
- static bool _isSideEffectFreeGetter(MethodMirror methodMirror,
- LibraryMirror libraryMirror) {
+ static bool _isSideEffectFreeGetter(
+ MethodMirror methodMirror, LibraryMirror libraryMirror) {
// This matches JavaScript behavior. We should consider displaying
// getters for all dart platform libraries rather than just the DOM
// libraries.
@@ -518,11 +746,11 @@
* Whether we should treat a property as a field for the purposes of the
* debugger.
*/
- static bool treatPropertyAsField(MethodMirror methodMirror,
- LibraryMirror libraryMirror) {
+ static bool treatPropertyAsField(
+ MethodMirror methodMirror, LibraryMirror libraryMirror) {
return (methodMirror.isGetter || methodMirror.isSetter) &&
- (methodMirror.isSynthetic ||
- _isSideEffectFreeGetter(methodMirror,libraryMirror));
+ (methodMirror.isSynthetic ||
+ _isSideEffectFreeGetter(methodMirror, libraryMirror));
}
// TODO(jacobr): generate more concise function descriptions instead of
@@ -539,27 +767,36 @@
static List getInvocationTrampolineDetails(_Trampoline method) {
var loc = method._methodMirror.location;
- return [loc.line, loc.column, loc.sourceUri.toString(),
- MirrorSystem.getName(method._selector)];
+ return [
+ loc.line,
+ loc.column,
+ loc.sourceUri.toString(),
+ MirrorSystem.getName(method._selector)
+ ];
}
- static List getLibraryProperties(String libraryUrl, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getLibraryProperties(
+ String libraryUrl, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var libraryMirror = getLibraryMirror(libraryUrl);
- _addInstanceMirrors(libraryMirror, libraryMirror,
+ _addInstanceMirrors(
+ libraryMirror,
+ libraryMirror,
libraryMirror.declarations,
- ownProperties, accessorPropertiesOnly, false, false,
+ ownProperties,
+ accessorPropertiesOnly,
+ false,
+ false,
properties);
if (!accessorPropertiesOnly) {
// We need to add class properties for all classes in the library.
libraryMirror.declarations.forEach((symbol, declarationMirror) {
if (declarationMirror is ClassMirror) {
var name = MirrorSystem.getName(symbol);
- if (declarationMirror.hasReflectedType
- && !properties.containsKey(name)) {
+ if (declarationMirror.hasReflectedType &&
+ !properties.containsKey(name)) {
properties[name] = new _Property(name)
- ..value = declarationMirror.reflectedType;
+ ..value = declarationMirror.reflectedType;
}
}
});
@@ -567,34 +804,44 @@
return packageProperties(properties);
}
- static List getObjectProperties(o, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getObjectProperties(
+ o, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var names = new Set<String>();
var objectMirror = reflect(o);
var classMirror = objectMirror.type;
- _addInstanceMirrors(objectMirror, classMirror.owner,
+ _addInstanceMirrors(
+ objectMirror,
+ classMirror.owner,
classMirror.instanceMembers,
- ownProperties, accessorPropertiesOnly, false, true,
+ ownProperties,
+ accessorPropertiesOnly,
+ false,
+ true,
properties);
return packageProperties(properties);
}
- static List getObjectClassProperties(o, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getObjectClassProperties(
+ o, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var objectMirror = reflect(o);
var classMirror = objectMirror.type;
- _addInstanceMirrors(objectMirror, classMirror.owner,
+ _addInstanceMirrors(
+ objectMirror,
+ classMirror.owner,
classMirror.instanceMembers,
- ownProperties, accessorPropertiesOnly, true, false,
+ ownProperties,
+ accessorPropertiesOnly,
+ true,
+ false,
properties);
_addStatics(classMirror, properties, accessorPropertiesOnly);
return packageProperties(properties);
}
- static List getClassProperties(Type t, bool ownProperties,
- bool accessorPropertiesOnly) {
+ static List getClassProperties(
+ Type t, bool ownProperties, bool accessorPropertiesOnly) {
var properties = new Map<String, _Property>();
var classMirror = reflectClass(t);
_addStatics(classMirror, properties, accessorPropertiesOnly);
@@ -602,8 +849,7 @@
}
static void _addStatics(ClassMirror classMirror,
- Map<String, _Property> properties,
- bool accessorPropertiesOnly) {
+ Map<String, _Property> properties, bool accessorPropertiesOnly) {
var libraryMirror = classMirror.owner;
classMirror.declarations.forEach((symbol, declaration) {
var name = _getShortSymbolName(symbol, declaration);
@@ -612,8 +858,8 @@
if (accessorPropertiesOnly) return;
if (!declaration.isStatic) return;
properties.putIfAbsent(name, () => new _Property(name))
- ..value = classMirror.getField(symbol).reflectee
- ..writable = !declaration.isFinal && !declaration.isConst;
+ ..value = classMirror.getField(symbol).reflectee
+ ..writable = !declaration.isFinal && !declaration.isConst;
} else if (declaration is MethodMirror) {
MethodMirror methodMirror = declaration;
// FIXMEDART: should we display constructors?
@@ -635,31 +881,35 @@
});
}
- static void _fillMethodMirrorProperty(LibraryMirror libraryMirror,
- methodOwner, MethodMirror methodMirror, Symbol symbol,
- bool accessorPropertiesOnly, _Property property) {
+ static void _fillMethodMirrorProperty(
+ LibraryMirror libraryMirror,
+ methodOwner,
+ MethodMirror methodMirror,
+ Symbol symbol,
+ bool accessorPropertiesOnly,
+ _Property property) {
if (methodMirror.isRegularMethod) {
property
- ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol)
- ..isMethod = true;
+ ..value = new _MethodTrampoline(methodOwner, methodMirror, symbol)
+ ..isMethod = true;
} else if (methodMirror.isGetter) {
if (treatPropertyAsField(methodMirror, libraryMirror)) {
try {
property.value = methodOwner.getField(symbol).reflectee;
} catch (e) {
property
- ..wasThrown = true
- ..value = e;
+ ..wasThrown = true
+ ..value = e;
}
} else if (accessorPropertiesOnly) {
- property.getter = new _GetterTrampoline(methodOwner,
- methodMirror, symbol);
+ property.getter =
+ new _GetterTrampoline(methodOwner, methodMirror, symbol);
}
} else if (methodMirror.isSetter) {
if (accessorPropertiesOnly &&
!treatPropertyAsField(methodMirror, libraryMirror)) {
- property.setter = new _SetterTrampoline(methodOwner,
- methodMirror, MirrorSystem.getSymbol(property.name, libraryMirror));
+ property.setter = new _SetterTrampoline(methodOwner, methodMirror,
+ MirrorSystem.getSymbol(property.name, libraryMirror));
}
property.writable = true;
}
@@ -679,8 +929,10 @@
ObjectMirror objectMirror,
LibraryMirror libraryMirror,
Map<Symbol, Mirror> declarations,
- bool ownProperties, bool accessorPropertiesOnly,
- bool hideFields, bool hideMethods,
+ bool ownProperties,
+ bool accessorPropertiesOnly,
+ bool hideFields,
+ bool hideMethods,
Map<String, _Property> properties) {
declarations.forEach((symbol, declaration) {
if (declaration is TypedefMirror || declaration is ClassMirror) return;
@@ -691,7 +943,8 @@
treatPropertyAsField(declaration, libraryMirror));
if ((isField && hideFields) || (hideMethods && !isField)) return;
if (accessorPropertiesOnly) {
- if (declaration is VariableMirror || declaration.isRegularMethod ||
+ if (declaration is VariableMirror ||
+ declaration.isRegularMethod ||
isField) {
return;
}
@@ -703,8 +956,8 @@
var property = properties.putIfAbsent(name, () => new _Property(name));
if (declaration is VariableMirror) {
property
- ..value = objectMirror.getField(symbol).reflectee
- ..writable = !declaration.isFinal && !declaration.isConst;
+ ..value = objectMirror.getField(symbol).reflectee
+ ..writable = !declaration.isFinal && !declaration.isConst;
return;
}
_fillMethodMirrorProperty(libraryMirror, objectMirror, declaration,
@@ -719,15 +972,17 @@
static List packageProperties(Map<String, _Property> properties) {
var ret = [];
for (var property in properties.values) {
- ret.addAll([property.name,
- property.setter,
- property.getter,
- property.value,
- property.hasValue,
- property.writable,
- property.isMethod,
- property.isOwn,
- property.wasThrown]);
+ ret.addAll([
+ property.name,
+ property.setter,
+ property.getter,
+ property.value,
+ property.hasValue,
+ property.writable,
+ property.isMethod,
+ property.isOwn,
+ property.wasThrown
+ ]);
}
return ret;
}
@@ -746,9 +1001,10 @@
LibraryMirror library = classMirror.owner;
if (!attemptedLibraries.contains(library)) {
try {
- return objectMirror.getField(
- MirrorSystem.getSymbol(propertyName, library)).reflectee;
- } catch (e) { }
+ return objectMirror
+ .getField(MirrorSystem.getSymbol(propertyName, library))
+ .reflectee;
+ } catch (e) {}
attemptedLibraries.add(library);
}
classMirror = classMirror.superclass;
@@ -756,8 +1012,9 @@
return null;
}
try {
- return objectMirror.getField(
- MirrorSystem.getSymbol(propertyName)).reflectee;
+ return objectMirror
+ .getField(MirrorSystem.getSymbol(propertyName))
+ .reflectee;
} catch (e) {
return null;
}
@@ -769,25 +1026,25 @@
*/
static List consoleApi(host) {
return [
- "inspect",
- (o) {
- js.JsNative.callMethod(host, "_inspect", [o]);
- return o;
- },
- "dir",
- window.console.dir,
- "dirxml",
- window.console.dirxml
- // FIXME: add copy method.
- ];
+ "inspect",
+ (o) {
+ js.JsNative.callMethod(host, "_inspect", [o]);
+ return o;
+ },
+ "dir",
+ window.console.dir,
+ "dirxml",
+ window.console.dirxml
+ // FIXME: add copy method.
+ ];
}
static List getMapKeyList(Map map) => map.keys.toList();
static bool isNoSuchMethodError(obj) => obj is NoSuchMethodError;
- static void register(Document document, String tag, Type type,
- String extendsTagName) {
+ static void register(
+ Document document, String tag, Type type, String extendsTagName) {
var nativeClass = _validateCustomType(type);
if (extendsTagName == null) {
@@ -801,70 +1058,90 @@
}
static void _register(Document document, String tag, Type customType,
- String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
+ String extendsTagName) =>
+ _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
static Element createElement(Document document, String tagName) =>
_blink.Blink_Utils.createElement(document, tagName);
}
-// TODO(jacobr): this seems busted. I believe we are actually
-// giving users real windows for opener, parent, top, etc.
-// Or worse, we are probaly returning a raw JSObject.
-class _DOMWindowCrossFrame extends DartHtmlDomObject implements
- WindowBase {
-
+class _DOMWindowCrossFrame extends DartHtmlDomObject implements WindowBase {
_DOMWindowCrossFrame.internal();
-
- static _createSafe(win) => _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame);
+
+ static _createSafe(win) {
+ if (identical(win, window)) {
+ // The current Window object is the only window object that should not
+ // use _DOMWindowCrossFrame.
+ return window;
+ }
+ return win is _DOMWindowCrossFrame ? win : _blink.Blink_Utils.setInstanceInterceptor(win, _DOMWindowCrossFrame);
+ }
// Fields.
- HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
- LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
- bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
- WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
- WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
- WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
+ HistoryBase get history {
+ var history = _blink.BlinkWindow.instance.history_Getter_(this);
+ return history is _HistoryCrossFrame ? history : _blink.Blink_Utils.setInstanceInterceptor(history, _HistoryCrossFrame);
+ }
+
+ LocationBase get location {
+ var location = _blink.BlinkWindow.instance.location_Getter_(this);
+ return location is _LocationCrossFrame ? location : _blink.Blink_Utils.setInstanceInterceptor(location, _LocationCrossFrame);
+ }
+
+ bool get closed => _blink.BlinkWindow.instance.closed_Getter_(this);
+ WindowBase get opener => _convertNativeToDart_Window(_blink.BlinkWindow.instance.opener_Getter_(this));
+ WindowBase get parent => _convertNativeToDart_Window(_blink.BlinkWindow.instance.parent_Getter_(this));
+ WindowBase get top => _convertNativeToDart_Window(_blink.BlinkWindow.instance.top_Getter_(this));
// Methods.
- void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
- void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
- _blink.Blink_DOMWindowCrossFrame.postMessage(this,
- convertDartToNative_SerializedScriptValue(message), targetOrigin, messagePorts);
+ void close() => _blink.BlinkWindow.instance.close_Callback_0_(this);
+ void postMessage(Object message, String targetOrigin, [List<MessagePort> transfer]) => _blink.BlinkWindow.instance.postMessage_Callback_3_(this, convertDartToNative_SerializedScriptValue(message), targetOrigin, transfer);
// Implementation support.
String get typeName => "Window";
// TODO(efortuna): Remove this method. dartbug.com/16814
Events get on => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
- void _addEventListener([String type, EventListener listener, bool useCapture])
- => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ void _addEventListener(
+ [String type, EventListener listener, bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
- void addEventListener(String type, EventListener listener, [bool useCapture])
- => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ void addEventListener(String type, EventListener listener,
+ [bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
bool dispatchEvent(Event event) => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
- void _removeEventListener([String type, EventListener listener,
- bool useCapture]) => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ void _removeEventListener(
+ [String type, EventListener listener, bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
// TODO(efortuna): Remove this method. dartbug.com/16814
void removeEventListener(String type, EventListener listener,
- [bool useCapture]) => throw new UnsupportedError(
- 'You can only attach EventListeners to your own window.');
+ [bool useCapture]) =>
+ throw new UnsupportedError(
+ 'You can only attach EventListeners to your own window.');
}
class _HistoryCrossFrame extends DartHtmlDomObject implements HistoryBase {
_HistoryCrossFrame.internal();
// Methods.
- void back() => _blink.Blink_HistoryCrossFrame.back(this);
- void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
- void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
+ void back() => _blink.BlinkHistory.instance.back_Callback_0_(this);
+ void forward() => _blink.BlinkHistory.instance.forward_Callback_0_(this);
+ void go([int delta]) {
+ if (delta != null) {
+ _blink.BlinkHistory.instance.go_Callback_1_(this, delta);
+ return;
+ }
+ _blink.BlinkHistory.instance.go_Callback_0_(this);
+ return;
+ }
// Implementation support.
String get typeName => "History";
@@ -874,7 +1151,7 @@
_LocationCrossFrame.internal();
// Fields.
- set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
+ set href(String value) => _blink.BlinkLocation.instance.href_Setter_(this, value);
// Implementation support.
String get typeName => "Location";
@@ -897,8 +1174,9 @@
return completer.future;
}
-Future<SendPort> _spawnDomHelper(Function f) =>
- _makeSendPortFuture((portId) { _Utils.spawnDomHelper(f, portId); });
+Future<SendPort> _spawnDomHelper(Function f) => _makeSendPortFuture((portId) {
+ _Utils.spawnDomHelper(f, portId);
+ });
final Future<SendPort> __HELPER_ISOLATE_PORT =
_spawnDomHelper(_helperIsolateMain);
@@ -940,10 +1218,15 @@
if (cmd == _NEW_TIMER) {
final duration = new Duration(milliseconds: msg[1]);
bool periodic = msg[2];
- ping() { replyTo.send(_TIMER_PING); };
- _TIMER_REGISTRY[replyTo] = periodic ?
- new Timer.periodic(duration, (_) { ping(); }) :
- new Timer(duration, ping);
+ ping() {
+ replyTo.send(_TIMER_PING);
+ }
+ ;
+ _TIMER_REGISTRY[replyTo] = periodic
+ ? new Timer.periodic(duration, (_) {
+ ping();
+ })
+ : new Timer(duration, ping);
} else if (cmd == _CANCEL_TIMER) {
_TIMER_REGISTRY.remove(replyTo).cancel();
} else if (cmd == _PRINT) {
@@ -956,7 +1239,7 @@
final _printClosure = (s) => window.console.log(s);
final _pureIsolatePrintClosure = (s) {
- _sendToHelperIsolate([_PRINT, s], null);
+ _sendToHelperIsolate([_PRINT, s], null);
};
final _forwardingPrintClosure = _Utils.forwardingPrint;
@@ -965,7 +1248,7 @@
final _pureIsolateUriBaseClosure = () {
throw new UnimplementedError("Uri.base on a background isolate "
- "is not supported in the browser");
+ "is not supported in the browser");
};
class _Timer implements Timer {
@@ -976,13 +1259,17 @@
_Timer(int milliSeconds, void callback(Timer timer), bool repeating) {
if (repeating) {
_state = (window._setInterval(() {
- callback(this);
- }, milliSeconds) << 1) | _STATE_INTERVAL;
+ callback(this);
+ }, milliSeconds) <<
+ 1) |
+ _STATE_INTERVAL;
} else {
_state = (window._setTimeout(() {
- _state = null;
- callback(this);
- }, milliSeconds) << 1) | _STATE_TIMEOUT;
+ _state = null;
+ callback(this);
+ }, milliSeconds) <<
+ 1) |
+ _STATE_TIMEOUT;
}
}
@@ -1002,8 +1289,8 @@
get _timerFactoryClosure =>
(int milliSeconds, void callback(Timer timer), bool repeating) {
- return new _Timer(milliSeconds, callback, repeating);
-};
+ return new _Timer(milliSeconds, callback, repeating);
+ };
class _PureIsolateTimer implements Timer {
bool _isActive = true;
@@ -1043,7 +1330,7 @@
get _pureIsolateTimerFactoryClosure =>
((int milliSeconds, void callback(Timer time), bool repeating) =>
- new _PureIsolateTimer(milliSeconds, callback, repeating));
+ new _PureIsolateTimer(milliSeconds, callback, repeating));
class _ScheduleImmediateHelper {
MutationObserver _observer;
@@ -1082,13 +1369,12 @@
new _ScheduleImmediateHelper();
get _scheduleImmediateClosure => (void callback()) {
- _scheduleImmediateHelper._schedule(callback);
-};
+ _scheduleImmediateHelper._schedule(callback);
+ };
get _pureIsolateScheduleImmediateClosure => ((void callback()) =>
- throw new UnimplementedError("scheduleMicrotask in background isolates "
- "are not supported in the browser"));
+ throw new UnimplementedError("scheduleMicrotask in background isolates "
+ "are not supported in the browser"));
// Class for unsupported native browser 'DOM' objects.
-class _UnsupportedBrowserObject extends DartHtmlDomObject {
-}
+class _UnsupportedBrowserObject extends DartHtmlDomObject {}
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index c92c27e..e8a6a31 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -256,7 +256,40 @@
return null;
}
-// TODO(jacobr): it would be nice to place this in a consistent place for dart2js and dartium.
+// TODO(jacobr): it would be nice to place these conversion methods in a consistent place for dart2js and dartium.
+
+WindowBase _convertNativeToDart_Window(win) {
+ if (win == null) return null;
+ return _DOMWindowCrossFrame._createSafe(win);
+}
+
+EventTarget _convertNativeToDart_EventTarget(e) {
+ if (e == null) {
+ return null;
+ }
+ // Assume it's a Window if it contains the postMessage property. It may be
+ // from a different frame - without a patched prototype - so we cannot
+ // rely on Dart type checking.
+ try {
+ if (js.JsNative.hasProperty(e, "postMessage")) {
+ var window = _DOMWindowCrossFrame._createSafe(e);
+ // If it's a native window.
+ if (window is EventTarget) {
+ return window;
+ }
+ return null;
+ }
+ } catch (err) {
+ print("Error calling _convertNativeToDart_EventTarget... $err");
+ }
+ return e;
+}
+
+EventTarget _convertDartToNative_EventTarget(e) {
+ // _DOMWindowCrossFrame uses an interceptor so we don't need to do anything unlike Dart2Js.
+ return e;
+}
+
_convertNativeToDart_XHR_Response(o) {
if (o is Document) {
return o;
@@ -321,10 +354,6 @@
}
}
-// TODO(jacobr): we shouldn't be generating this call in the dart:html
-// bindings but we are.
-_convertDartToNative_EventTarget(target) => target;
-
@Deprecated("Internal Use Only")
Map<String, dynamic> convertNativeObjectToDartMap(js.JsObject jsObject) {
var result = new Map();
diff --git a/tools/full-coverage.dart b/tools/full-coverage.dart
deleted file mode 100644
index d7ff76f..0000000
--- a/tools/full-coverage.dart
+++ /dev/null
@@ -1,507 +0,0 @@
-// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "dart:convert";
-import "dart:io";
-import "dart:isolate";
-
-import "package:args/args.dart";
-import "package:path/path.dart";
-
-/// [Environment] stores gathered arguments information.
-class Environment {
- String sdkRoot;
- String pkgRoot;
- var input;
- var output;
- int workers;
- bool prettyPrint = false;
- bool lcov = false;
- bool expectMarkers;
- bool verbose;
-}
-
-/// [Resolver] resolves imports with respect to a given environment.
-class Resolver {
- static const DART_PREFIX = "dart:";
- static const PACKAGE_PREFIX = "package:";
- static const FILE_PREFIX = "file://";
- static const HTTP_PREFIX = "http://";
-
- Map _env;
- List failed = [];
-
- Resolver(this._env);
-
- /// Returns the absolute path wrt. to the given environment or null, if the
- /// import could not be resolved.
- resolve(String import) {
- if (import.startsWith(DART_PREFIX)) {
- if (_env["sdkRoot"] == null) {
- // No sdk-root given, do not resolve dart: URIs.
- return null;
- }
- var slashPos = import.indexOf("/");
- var filePath;
- if (slashPos != -1) {
- var path = import.substring(DART_PREFIX.length, slashPos);
- // Drop patch files, since we don't have their source in the compiled
- // SDK.
- if (path.endsWith("-patch")) {
- failed.add(import);
- return null;
- }
- // Canonicalize path. For instance: _collection-dev => _collection_dev.
- path = path.replaceAll("-", "_");
- filePath = "${_env["sdkRoot"]}"
- "/${path}${import.substring(slashPos, import.length)}";
- } else {
- // Resolve 'dart:something' to be something/something.dart in the SDK.
- var lib = import.substring(DART_PREFIX.length, import.length);
- filePath = "${_env["sdkRoot"]}/${lib}/${lib}.dart";
- }
- return filePath;
- }
- if (import.startsWith(PACKAGE_PREFIX)) {
- if (_env["pkgRoot"] == null) {
- // No package-root given, do not resolve package: URIs.
- return null;
- }
- var filePath =
- "${_env["pkgRoot"]}"
- "/${import.substring(PACKAGE_PREFIX.length, import.length)}";
- return filePath;
- }
- if (import.startsWith(FILE_PREFIX)) {
- var filePath = fromUri(Uri.parse(import));
- return filePath;
- }
- if (import.startsWith(HTTP_PREFIX)) {
- return import;
- }
- // We cannot deal with anything else.
- failed.add(import);
- return null;
- }
-}
-
-/// Converts the given hitmap to lcov format and appends the result to
-/// env.output.
-///
-/// Returns a [Future] that completes as soon as all map entries have been
-/// emitted.
-Future lcov(Map hitmap) {
- var emitOne = (key) {
- var v = hitmap[key];
- StringBuffer entry = new StringBuffer();
- entry.write("SF:${key}\n");
- v.keys.toList()
- ..sort()
- ..forEach((k) {
- entry.write("DA:${k},${v[k]}\n");
- });
- entry.write("end_of_record\n");
- env.output.write(entry.toString());
- return new Future.value(null);
- };
-
- return Future.forEach(hitmap.keys, emitOne);
-}
-
-/// Converts the given hitmap to a pretty-print format and appends the result
-/// to env.output.
-///
-/// Returns a [Future] that completes as soon as all map entries have been
-/// emitted.
-Future prettyPrint(Map hitMap, List failedLoads) {
- var emitOne = (key) {
- var v = hitMap[key];
- var c = new Completer();
- loadResource(key).then((lines) {
- if (lines == null) {
- failedLoads.add(key);
- c.complete();
- return;
- }
- env.output.write("${key}\n");
- for (var line = 1; line <= lines.length; line++) {
- String prefix = " ";
- if (v.containsKey(line)) {
- prefix = v[line].toString();
- StringBuffer b = new StringBuffer();
- for (int i = prefix.length; i < 7; i++) {
- b.write(" ");
- }
- b.write(prefix);
- prefix = b.toString();
- }
- env.output.write("${prefix}|${lines[line-1]}\n");
- }
- c.complete();
- });
- return c.future;
- };
-
- return Future.forEach(hitMap.keys, emitOne);
-}
-
-/// Load an import resource and return a [Future] with a [List] of its lines.
-/// Returns [null] instead of a list if the resource could not be loaded.
-Future<List> loadResource(String import) {
- if (import.startsWith("http")) {
- Completer c = new Completer();
- HttpClient client = new HttpClient();
- client.getUrl(Uri.parse(import))
- .then((HttpClientRequest request) {
- return request.close();
- })
- .then((HttpClientResponse response) {
- response.transform(new StringDecoder()).toList().then((data) {
- c.complete(data);
- httpClient.close();
- });
- })
- .catchError((e) {
- c.complete(null);
- });
- return c.future;
- } else {
- File f = new File(import);
- return f.readAsLines()
- .catchError((e) {
- return new Future.value(null);
- });
- }
-}
-
-/// Creates a single hitmap from a raw json object. Throws away all entries that
-/// are not resolvable.
-Map createHitmap(String rawJson, Resolver resolver) {
- Map<String, Map<int,int>> hitMap = {};
-
- addToMap(source, line, count) {
- if (!hitMap[source].containsKey(line)) {
- hitMap[source][line] = 0;
- }
- hitMap[source][line] += count;
- }
-
- JSON.decode(rawJson)['coverage'].forEach((Map e) {
- String source = resolver.resolve(e["source"]);
- if (source == null) {
- // Couldnt resolve import, so skip this entry.
- return;
- }
- if (!hitMap.containsKey(source)) {
- hitMap[source] = {};
- }
- var hits = e["hits"];
- // hits is a flat array of the following format:
- // [ <line|linerange>, <hitcount>,...]
- // line: number.
- // linerange: "<line>-<line>".
- for (var i = 0; i < hits.length; i += 2) {
- var k = hits[i];
- if (k is num) {
- // Single line.
- addToMap(source, k, hits[i+1]);
- }
- if (k is String) {
- // Linerange. We expand line ranges to actual lines at this point.
- var splitPos = k.indexOf("-");
- int start = int.parse(k.substring(0, splitPos));
- int end = int.parse(k.substring(splitPos + 1, k.length));
- for (var j = start; j <= end; j++) {
- addToMap(source, j, hits[i+1]);
- }
- }
- }
- });
- return hitMap;
-}
-
-/// Merges [newMap] into [result].
-mergeHitmaps(Map newMap, Map result) {
- newMap.forEach((String file, Map v) {
- if (result.containsKey(file)) {
- v.forEach((int line, int cnt) {
- if (result[file][line] == null) {
- result[file][line] = cnt;
- } else {
- result[file][line] += cnt;
- }
- });
- } else {
- result[file] = v;
- }
- });
-}
-
-/// Given an absolute path absPath, this function returns a [List] of files
-/// are contained by it if it is a directory, or a [List] containing the file if
-/// it is a file.
-List filesToProcess(String absPath) {
- var filePattern = new RegExp(r"^dart-cov-\d+-\d+.json$");
- if (FileSystemEntity.isDirectorySync(absPath)) {
- return new Directory(absPath).listSync(recursive: true)
- .where((entity) => entity is File &&
- filePattern.hasMatch(basename(entity.path)))
- .toList();
- }
-
- return [new File(absPath)];
-}
-
-worker(WorkMessage msg) {
- final start = new DateTime.now().millisecondsSinceEpoch;
-
- var env = msg.environment;
- List files = msg.files;
- Resolver resolver = new Resolver(env);
- var workerHitmap = {};
- files.forEach((File fileEntry) {
- // Read file sync, as it only contains 1 object.
- String contents = fileEntry.readAsStringSync();
- if (contents.length > 0) {
- mergeHitmaps(createHitmap(contents, resolver), workerHitmap);
- }
- });
-
- if (env["verbose"]) {
- final end = new DateTime.now().millisecondsSinceEpoch;
- print("${msg.workerName}: Finished processing ${files.length} files. "
- "Took ${end - start} ms.");
- }
-
- msg.replyPort.send(new ResultMessage(workerHitmap, resolver.failed));
-}
-
-class WorkMessage {
- final String workerName;
- final Map environment;
- final List files;
- final SendPort replyPort;
- WorkMessage(this.workerName, this.environment, this.files, this.replyPort);
-}
-
-class ResultMessage {
- final hitmap;
- final failedResolves;
- ResultMessage(this.hitmap, this.failedResolves);
-}
-
-final env = new Environment();
-
-List<List> split(List list, int nBuckets) {
- var buckets = new List(nBuckets);
- var bucketSize = list.length ~/ nBuckets;
- var leftover = list.length % nBuckets;
- var taken = 0;
- var start = 0;
- for (int i = 0; i < nBuckets; i++) {
- var end = (i < leftover) ? (start + bucketSize + 1) : (start + bucketSize);
- buckets[i] = list.sublist(start, end);
- taken += buckets[i].length;
- start = end;
- }
- if (taken != list.length) throw "Error splitting";
- return buckets;
-}
-
-Future<ResultMessage> spawnWorker(name, environment, files) {
- RawReceivePort port = new RawReceivePort();
- var completer = new Completer();
- port.handler = ((ResultMessage msg) {
- completer.complete(msg);
- port.close();
- });
- var msg = new WorkMessage(name, environment, files, port.sendPort);
- Isolate.spawn(worker, msg);
- return completer.future;
-}
-
-main(List<String> arguments) {
- parseArgs(arguments);
-
- List files = filesToProcess(env.input);
-
- List failedResolves = [];
- List failedLoads = [];
- Map globalHitmap = {};
- int start = new DateTime.now().millisecondsSinceEpoch;
-
- if (env.verbose) {
- print("Environment:");
- print(" # files: ${files.length}");
- print(" # workers: ${env.workers}");
- print(" sdk-root: ${env.sdkRoot}");
- print(" package-root: ${env.pkgRoot}");
- }
-
- Map sharedEnv = {
- "sdkRoot": env.sdkRoot,
- "pkgRoot": env.pkgRoot,
- "verbose": env.verbose,
- };
-
- // Create workers.
- int workerId = 0;
- var results = split(files, env.workers).map((workerFiles) {
- var result = spawnWorker("Worker ${workerId++}", sharedEnv, workerFiles);
- return result.then((ResultMessage message) {
- mergeHitmaps(message.hitmap, globalHitmap);
- failedResolves.addAll(message.failedResolves);
- });
- });
-
- Future.wait(results).then((ignore) {
- // All workers are done. Process the data.
- if (env.verbose) {
- final end = new DateTime.now().millisecondsSinceEpoch;
- print("Done creating a global hitmap. Took ${end - start} ms.");
- }
-
- Future out;
- if (env.prettyPrint) {
- out = prettyPrint(globalHitmap, failedLoads);
- }
- if (env.lcov) {
- out = lcov(globalHitmap);
- }
-
- out.then((_) {
- env.output.close().then((_) {
- if (env.verbose) {
- final end = new DateTime.now().millisecondsSinceEpoch;
- print("Done flushing output. Took ${end - start} ms.");
- }
- });
-
- if (env.verbose) {
- if (failedResolves.length > 0) {
- print("Failed to resolve:");
- failedResolves.toSet().forEach((e) {
- print(" ${e}");
- });
- }
- if (failedLoads.length > 0) {
- print("Failed to load:");
- failedLoads.toSet().forEach((e) {
- print(" ${e}");
- });
- }
- }
- });
- });
-}
-
-/// Checks the validity of the provided arguments. Does not initialize actual
-/// processing.
-parseArgs(List<String> arguments) {
- var parser = new ArgParser();
-
- parser.addOption("sdk-root", abbr: "s",
- help: "path to the SDK root");
- parser.addOption("package-root", abbr: "p",
- help: "override path to the package root "
- "(default: inherited from dart)");
- parser.addOption("in", abbr: "i",
- help: "input(s): may be file or directory");
- parser.addOption("out", abbr: "o",
- help: "output: may be file or stdout",
- defaultsTo: "stdout");
- parser.addOption("workers", abbr: "j",
- help: "number of workers",
- defaultsTo: "1");
- parser.addFlag("pretty-print", abbr: "r",
- help: "convert coverage data to pretty print format",
- negatable: false);
- parser.addFlag("lcov", abbr :"l",
- help: "convert coverage data to lcov format",
- negatable: false);
- parser.addFlag("verbose", abbr :"v",
- help: "verbose output",
- negatable: false);
- parser.addFlag("help", abbr: "h",
- help: "show this help",
- negatable: false);
-
- var args = parser.parse(arguments);
-
- printUsage() {
- print("Usage: dart full-coverage.dart [OPTION...]\n");
- print(parser.getUsage());
- }
-
- fail(String msg) {
- print("\n$msg\n");
- printUsage();
- exit(1);
- }
-
- if (args["help"]) {
- printUsage();
- exit(0);
- }
-
- env.sdkRoot = args["sdk-root"];
- if (env.sdkRoot == null) {
- if (Platform.environment.containsKey("SDK_ROOT")) {
- env.sdkRoot =
- join(absolute(normalize(Platform.environment["SDK_ROOT"])), "lib");
- }
- } else {
- env.sdkRoot = join(absolute(normalize(env.sdkRoot)), "lib");
- }
- if ((env.sdkRoot != null) && !FileSystemEntity.isDirectorySync(env.sdkRoot)) {
- fail("Provided SDK root '${args["sdk-root"]}' is not a valid SDK "
- "top-level directory");
- }
-
- env.pkgRoot = args["package-root"];
- if (env.pkgRoot != null) {
- var pkgRootUri = Uri.parse(env.pkgRoot);
- if (pkgRootUri.scheme == "file") {
- if (!FileSystemEntity.isDirectorySync(pkgRootUri.toFilePath())) {
- fail("Provided package root '${args["package-root"]}' is not directory.");
- }
- }
- } else {
- env.pkgRoot = Platform.packageRoot;
- }
-
- if (args["in"] == null) {
- fail("No input files given.");
- } else {
- env.input = absolute(normalize(args["in"]));
- if (!FileSystemEntity.isDirectorySync(env.input) &&
- !FileSystemEntity.isFileSync(env.input)) {
- fail("Provided input '${args["in"]}' is neither a directory, nor a file.");
- }
- }
-
- if (args["out"] == "stdout") {
- env.output = stdout;
- } else {
- env.output = absolute(normalize(args["out"]));
- env.output = new File(env.output).openWrite();
- }
-
- env.lcov = args["lcov"];
- if (args["pretty-print"] && env.lcov) {
- fail("Choose one of pretty-print or lcov output");
- } else if (!env.lcov) {
- // Use pretty-print either explicitly or by default.
- env.prettyPrint = true;
- }
-
- try {
- env.workers = int.parse("${args["workers"]}");
- } catch (e) {
- fail("Invalid worker count: $e");
- }
-
- env.verbose = args["verbose"];
-}
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 6e37549..2776569 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -1092,6 +1092,9 @@
if (status.currentTest.lastKnownMessage.length > 0) {
lastKnownMessage = status.currentTest.lastKnownMessage;
}
+ if (status.lastTest != null) {
+ lastKnownMessage += '\nPrevious test was ${status.lastTest.url}';
+ }
// Wait until the browser is closed before reporting the test as timeout.
// This will enable us to capture stdout/stderr from the browser
// (which might provide us with information about what went wrong).
diff --git a/tools/testing/dart/compiler_configuration.dart b/tools/testing/dart/compiler_configuration.dart
index 7b1e5f6..147cd99 100644
--- a/tools/testing/dart/compiler_configuration.dart
+++ b/tools/testing/dart/compiler_configuration.dart
@@ -52,8 +52,6 @@
bool useSdk = configuration['use_sdk'];
bool isCsp = configuration['csp'];
bool useCps = configuration['cps_ir'];
- // TODO(26060): Remove the browser multiplier when issue resolved.
- bool isBrowser = configuration['browser'];
switch (compiler) {
case 'dart2analyzer':
@@ -70,7 +68,6 @@
useCps: useCps,
useSdk: useSdk,
isCsp: isCsp,
- isBrowser: isBrowser,
extraDart2jsOptions:
TestUtils.getExtraOptions(configuration, 'dart2js_options'));
case 'dart2app':
@@ -241,7 +238,6 @@
class Dart2jsCompilerConfiguration extends Dart2xCompilerConfiguration {
final bool isCsp;
final bool useCps;
- final bool isBrowser;
final List<String> extraDart2jsOptions;
// We cache the extended environment to save memory.
static Map<String, String> cpsFlagCache;
@@ -254,7 +250,6 @@
bool useSdk,
bool this.useCps,
bool this.isCsp,
- bool this.isBrowser,
this.extraDart2jsOptions})
: super('dart2js',
isDebug: isDebug,
@@ -267,7 +262,6 @@
if (isDebug) multiplier *= 4;
if (isChecked) multiplier *= 2;
if (isHostChecked) multiplier *= 16;
- if (isBrowser) multiplier *= 2; // TODO(26060): Remove when issue fixed.
return multiplier;
}